Changeset 2823 for LMDZ5/trunk/libf


Ignore:
Timestamp:
Mar 14, 2017, 11:10:55 PM (7 years ago)
Author:
oboucher
Message:

Climatological ASNO3M, CSNO3M, CINO3M aerosol fields can be read and fed
through the aerosol routines for optical properties. The get_aero_fromfile
routine needed some change so that it doesn't stop if a particular field
is not there.

Location:
LMDZ5/trunk/libf/phylmd
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/aero_mod.F90

    r2550 r2823  
    4646! 2/ Total number of aerosols for which an aerosol mass is provided
    4747
    48   INTEGER, PARAMETER :: naero_spc = 10
     48  INTEGER, PARAMETER :: naero_spc = 13
    4949
    5050! Corresponding names for the aerosols
     
    5959       "CIDUSTM", &
    6060       "AIBCM  ", &
    61        "AIPOMM " /)
     61       "AIPOMM " ,&
     62       "ASNO3M ", &
     63       "CSNO3M ", &
     64       "CINO3M " /)
    6265
    6366! 3/ Number of aerosol groups
  • LMDZ5/trunk/libf/phylmd/phys_local_var_mod.F90

    r2806 r2823  
    209209      REAL, SAVE, ALLOCATABLE :: loaddust(:)
    210210      !$OMP THREADPRIVATE(loaddust)
     211      REAL, SAVE, ALLOCATABLE :: loadno3(:)
     212      !$OMP THREADPRIVATE(loadno3)
    211213      REAL, SAVE, ALLOCATABLE :: load_tmp1(:)
    212214      !$OMP THREADPRIVATE(load_tmp1)
     
    215217      REAL, SAVE, ALLOCATABLE :: load_tmp3(:)
    216218      !$OMP THREADPRIVATE(load_tmp3)
    217       REAL, SAVE, ALLOCATABLE :: load_tmp4(:)
    218       !$OMP THREADPRIVATE(load_tmp4)
    219       REAL, SAVE, ALLOCATABLE :: load_tmp5(:)
    220       !$OMP THREADPRIVATE(load_tmp5)
    221       REAL, SAVE, ALLOCATABLE :: load_tmp6(:)
    222       !$OMP THREADPRIVATE(load_tmp6)
    223       REAL, SAVE, ALLOCATABLE :: load_tmp7(:)
    224       !$OMP THREADPRIVATE(load_tmp7)
    225219
    226220!IM ajout variables CFMIP2/CMIP5
     
    605599      allocate(loadss(klon))
    606600      allocate(loaddust(klon))
     601      allocate(loadno3(klon))
    607602      allocate(load_tmp1(klon))
    608603      allocate(load_tmp2(klon))
    609604      allocate(load_tmp3(klon))
    610       allocate(load_tmp4(klon))
    611       allocate(load_tmp5(klon))
    612       allocate(load_tmp6(klon))
    613       allocate(load_tmp7(klon))
    614605
    615606!IM ajout variables CFMIP2/CMIP5
     
    866857      deallocate(loadss)
    867858      deallocate(loaddust)
     859      deallocate(loadno3)
    868860      deallocate(load_tmp1)
    869861      deallocate(load_tmp2)
    870862      deallocate(load_tmp3)
    871       deallocate(load_tmp4)
    872       deallocate(load_tmp5)
    873       deallocate(load_tmp6)
    874       deallocate(load_tmp7)
    875863      deallocate(du_gwd_hines,dv_gwd_hines,d_t_hin)
    876864      deallocate(d_q_ch4)
  • LMDZ5/trunk/libf/phylmd/phys_output_ctrlout_mod.F90

    r2806 r2823  
    11361136  TYPE(ctrl_out), SAVE :: o_loaddust = ctrl_out((/ 2, 6, 10, 10, 10, 10, 11, 11, 11, 11/), &
    11371137    'loaddust', 'Column Load of Dust ', 'kg/m2', (/ ('', i=1, 10) /))
     1138  TYPE(ctrl_out), SAVE :: o_loadno3 = ctrl_out((/ 2, 6, 10, 10, 10, 10, 11, 11, 11, 11/), &
     1139    'loadno3', 'Column Load of Nitrate ', 'kg/m2', (/ ('', i=1, 10) /))
    11381140  TYPE(ctrl_out), SAVE :: o_swtoaas_nat = ctrl_out((/ 4, 6, 10, 10, 10, 10, 11, 11, 11, 11/), &
    11391141    'swtoaas_nat', 'Natural aerosol radiative forcing all-sky at TOA', 'W/m2', (/ ('', i=1, 10) /))
  • LMDZ5/trunk/libf/phylmd/phys_output_mod.F90

    r2752 r2823  
    55  USE indice_sol_mod
    66  USE phys_output_var_mod
    7   USE aero_mod, only : naero_spc,name_aero
    87  USE phys_output_write_mod, ONLY : phys_output_write
    98  REAL, DIMENSION(nfiles),SAVE :: ecrit_files
     
    4039    USE phys_cal_mod, only : hour, calend
    4140    USE mod_phys_lmdz_para
    42     USE aero_mod, only : naero_spc,name_aero
    4341    !Martin
    4442    USE surface_data, ONLY : ok_snow
  • LMDZ5/trunk/libf/phylmd/phys_output_write_mod.F90

    r2816 r2823  
    105105         o_concoa, o_concbc, o_concss, o_concdust, &
    106106         o_loadso4, o_loadoa, o_loadbc, o_loadss, &
    107          o_loaddust, o_tausumaero, o_tausumaero_lw, &
     107         o_loaddust, o_loadno3, o_tausumaero, o_tausumaero_lw, &
    108108         o_topswad, o_topswad0, o_solswad, o_solswad0, &
    109109         o_toplwad, o_toplwad0, o_sollwad, o_sollwad0, &
     
    256256         sconcoa, sconcbc, sconcss, sconcdust, concso4, concno3, &
    257257         concoa, concbc, concss, concdust, loadso4, &
    258          loadoa, loadbc, loadss, loaddust, tausum_aero, &
     258         loadoa, loadbc, loadss, loaddust, loadno3, tausum_aero, &
    259259         topswad_aero, topswad0_aero, solswad_aero, &
    260260         solswad0_aero, topsw_aero, solsw_aero, &
     
    325325    USE geometry_mod, ONLY: cell_area
    326326    USE surface_data, ONLY: type_ocean, version_ocean, ok_veget, ok_snow
    327 !    USE aero_mod, ONLY: naero_spc
    328327    USE aero_mod, ONLY: naero_tot, id_STRAT_phy
    329328    USE ioipsl, ONLY: histend, histsync
     
    11921191             CALL histwrite_phy(o_loadss, loadss)
    11931192             CALL histwrite_phy(o_loaddust, loaddust)
     1193             CALL histwrite_phy(o_loadno3, loadno3)
    11941194             !--STRAT AER
    11951195          ENDIF
  • LMDZ5/trunk/libf/phylmd/readaerosol.F90

    r2346 r2823  
    222222    REAL, ALLOCATABLE, DIMENSION(:)       :: varktmp
    223223
    224     REAL, DIMENSION(nbp_lon,nbp_lat,12)         :: psurf_glo2D   ! Surface pression for 12 months on dynamics global grid
     224    REAL, DIMENSION(nbp_lon,nbp_lat,12)   :: psurf_glo2D   ! Surface pression for 12 months on dynamics global grid
    225225    REAL, DIMENSION(klon_glo,12)          :: psurf_glo1D   ! -"- on physical global grid
    226     REAL, DIMENSION(nbp_lon,nbp_lat,12)         :: load_glo2D    ! Load for 12 months on dynamics global grid
     226    REAL, DIMENSION(nbp_lon,nbp_lat,12)   :: load_glo2D    ! Load for 12 months on dynamics global grid
    227227    REAL, DIMENSION(klon_glo,12)          :: load_glo1D    ! -"- on physical global grid
    228     REAL, DIMENSION(nbp_lon,nbp_lat)            :: vartmp
    229     REAL, DIMENSION(nbp_lon)                  :: lon_src              ! longitudes in file
    230     REAL, DIMENSION(nbp_lat)                :: lat_src, lat_src_inv ! latitudes in file
     228    REAL, DIMENSION(nbp_lon,nbp_lat)      :: vartmp
     229    REAL, DIMENSION(nbp_lon)              :: lon_src              ! longitudes in file
     230    REAL, DIMENSION(nbp_lat)              :: lat_src, lat_src_inv ! latitudes in file
    231231    LOGICAL                               :: new_file             ! true if new file format detected
    232232    LOGICAL                               :: invert_lat           ! true if the field has to be inverted for latitudes
     
    245245 
    246246       WRITE(lunout,*) 'reading variable ',TRIM(varname),' in file ', TRIM(fname)
    247        CALL check_err( nf90_open(TRIM(fname), NF90_NOWRITE, ncid), "pb open "//trim(varname) )
     247       CALL check_err( nf90_open(TRIM(fname), NF90_NOWRITE, ncid), "pb open "//trim(fname) )
    248248
    249249! Test for equal longitudes and latitudes in file and model
     
    338338!****************************************************************************************
    339339          ! Get variable id
    340           CALL check_err( nf90_inq_varid(ncid, TRIM(varname), varid),"pb inq var "//TRIM(varname) )
    341          
    342           ! Get the variable
    343           CALL check_err( nf90_get_var(ncid, varid, varyear(:,:,:,:)),"pb get var "//TRIM(varname) )
     340          !CALL check_err( nf90_inq_varid(ncid, TRIM(varname), varid),"pb inq var "//TRIM(varname) )
     341          print *,'readaerosol ', TRIM(varname)
     342          IF ( nf90_inq_varid(ncid, TRIM(varname), varid) /= NF90_NOERR ) THEN
     343            ! Variable is not there
     344            WRITE(lunout,*) 'Attention '//TRIM(varname)//' is not in aerosol input file'
     345            varyear(:,:,:,:)=0.0
     346          ELSE
     347            ! Get the variable
     348            CALL check_err( nf90_get_var(ncid, varid, varyear(:,:,:,:)),"pb get var "//TRIM(varname) )
     349          ENDIF
    344350         
    345351! ++) Read surface pression, 12 month in one variable
     
    353359!****************************************************************************************
    354360          ! Get variable id
    355           CALL check_err( nf90_inq_varid(ncid, "load_"//TRIM(varname), varid) ,"pb inq var load_"//TRIM(varname))
    356           ! Get the variable
    357           CALL check_err( nf90_get_var(ncid, varid, load_glo2D),"pb get var load_"//TRIM(varname) )
     361          !CALL check_err( nf90_inq_varid(ncid, "load_"//TRIM(varname), varid) ,"pb inq var load_"//TRIM(varname))
     362          IF ( nf90_inq_varid(ncid, "load_"//TRIM(varname), varid) /= NF90_NOERR ) THEN
     363            WRITE(lunout,*) 'Attention load_'//TRIM(varname)//' is not in aerosol input file'
     364            load_glo2D(:,:,:)=0.0
     365          ELSE
     366            ! Get the variable
     367            CALL check_err( nf90_get_var(ncid, varid, load_glo2D),"pb get var load_"//TRIM(varname) )
     368          ENDIF
    358369         
    359370! ++) Read ap
  • LMDZ5/trunk/libf/phylmd/readaerosol_optic.F90

    r2642 r2823  
    1616  USE phys_local_var_mod, only: sconcso4,sconcno3,sconcoa,sconcbc,sconcss,sconcdust, &
    1717      concso4,concno3,concoa,concbc,concss,concdust,loadso4,loadoa,loadbc,loadss,loaddust, &
    18       load_tmp1,load_tmp2,load_tmp3,load_tmp4,load_tmp5,load_tmp6,load_tmp7
     18      load_tmp1,load_tmp2,load_tmp3
    1919  IMPLICIT NONE
    2020
     
    9393
    9494     ! Get bc aerosol distribution
    95      CALL readaerosol_interp(id_ASBCM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcsol, bcsol_pi, load_tmp1 )
    96      CALL readaerosol_interp(id_AIBCM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcins, bcins_pi, load_tmp2 )
     95     CALL readaerosol_interp(id_ASBCM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcsol, bcsol_pi, load_tmp1)
     96     CALL readaerosol_interp(id_AIBCM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, bcins, bcins_pi, load_tmp2)
    9797     loadbc(:)=load_tmp1(:)+load_tmp2(:)
    9898  ELSE
     
    107107       flag_aerosol .EQ. 6 ) THEN
    108108
    109      CALL readaerosol_interp(id_ASPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomsol, pomsol_pi, load_tmp3)
    110      CALL readaerosol_interp(id_AIPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomins, pomins_pi, load_tmp4)
    111      loadoa(:)=load_tmp3(:)+load_tmp4(:)
     109     CALL readaerosol_interp(id_ASPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomsol, pomsol_pi, load_tmp1)
     110     CALL readaerosol_interp(id_AIPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomins, pomins_pi, load_tmp2)
     111     loadoa(:)=load_tmp1(:)+load_tmp2(:)
    112112  ELSE
    113113     pomsol(:,:) = 0. ; pomsol_pi(:,:) = 0.
     
    121121      flag_aerosol .EQ. 6 ) THEN
    122122
    123       CALL readaerosol_interp(id_SSSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sssupco, sssupco_pi, load_tmp5)
    124       CALL readaerosol_interp(id_CSSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sscoarse,sscoarse_pi, load_tmp6)
    125       CALL readaerosol_interp(id_ASSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, ssacu, ssacu_pi, load_tmp7)
    126      loadss(:)=load_tmp5(:)+load_tmp6(:)+load_tmp7(:)
    127   ELSE
    128      sscoarse(:,:) = 0. ; sscoarse_pi(:,:) = 0.
    129      ssacu(:,:)    = 0. ; ssacu_pi(:,:) = 0.
    130      sssupco(:,:)  = 0. ; sssupco_pi = 0.
    131      loadss=0.
     123      CALL readaerosol_interp(id_SSSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sssupco, sssupco_pi,  load_tmp1)
     124      CALL readaerosol_interp(id_CSSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, sscoarse,sscoarse_pi, load_tmp2)
     125      CALL readaerosol_interp(id_ASSSM_phy ,itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, ssacu,   ssacu_pi,    load_tmp3)
     126      loadss(:)=load_tmp1(:)+load_tmp2(:)+load_tmp3(:)
     127  ELSE
     128      sscoarse(:,:) = 0. ; sscoarse_pi(:,:) = 0.
     129      ssacu(:,:)    = 0. ; ssacu_pi(:,:) = 0.
     130      sssupco(:,:)  = 0. ; sssupco_pi = 0.
     131      loadss=0.
    132132  ENDIF
    133133
     
    137137
    138138      CALL readaerosol_interp(id_CIDUSTM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, cidust, cidust_pi, loaddust)
    139 
    140139  ELSE
    141140      cidust(:,:) = 0. ; cidust_pi(:,:) = 0.
     
    174173  m_allaer_pi(:,:,id_CSNO3M_phy) = 0.0
    175174  m_allaer_pi(:,:,id_CINO3M_phy) = 0.0
    176 
    177175!
    178176! Calculate the total mass of all soluble aersosols
     
    214212     
    215213  END IF
    216 
    217214
    218215! Diagnostics calculation for CMIP5 protocol
     
    230227  concdust(:,:)=m_allaer(:,:,id_CIDUSTM_phy)*1.e-9
    231228
    232 
    233229END SUBROUTINE readaerosol_optic
  • LMDZ5/trunk/libf/phylmd/rrtm/readaerosol_optic_rrtm.F90

    r2738 r2823  
    1717  USE phys_local_var_mod, only: sconcso4,sconcno3,sconcoa,sconcbc,sconcss,sconcdust, &
    1818       concso4,concno3,concoa,concbc,concss,concdust,loadso4,loadoa,loadbc,loadss,loaddust, &
    19        load_tmp1,load_tmp2,load_tmp3,load_tmp4,load_tmp5,load_tmp6,load_tmp7
     19       loadno3, load_tmp1,load_tmp2,load_tmp3
    2020
    2121  USE infotrac_phy
     
    195195     IF ( flag_aerosol .EQ. 3 .OR. flag_aerosol .EQ. 6 ) THEN
    196196
    197         CALL readaerosol_interp(id_ASPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomsol, pomsol_pi, load_tmp3)
    198         CALL readaerosol_interp(id_AIPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomins, pomins_pi, load_tmp4)
    199         loadoa(:)=load_tmp3(:)+load_tmp4(:)
     197        CALL readaerosol_interp(id_ASPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomsol, pomsol_pi, load_tmp1)
     198        CALL readaerosol_interp(id_AIPOMM_phy, itap, pdtphys, rjourvrai, debut, pplay, paprs, t_seri, pomins, pomins_pi, load_tmp2)
     199        loadoa(:)=load_tmp1(:)+load_tmp2(:)
    200200     ELSE
    201201        pomsol(:,:) = 0. ; pomsol_pi(:,:) = 0.
     
    208208
    209209        CALL readaerosol_interp(id_SSSSM_phy ,itap, pdtphys,rjourvrai, &
    210         debut, pplay, paprs, t_seri, sssupco, sssupco_pi, load_tmp5)
     210        debut, pplay, paprs, t_seri, sssupco, sssupco_pi, load_tmp1)
    211211        CALL readaerosol_interp(id_CSSSM_phy ,itap, pdtphys,rjourvrai, &
    212         debut, pplay, paprs, t_seri, sscoarse,sscoarse_pi, load_tmp6)
    213         CALL readaerosol_interp(id_ASSSM_phy ,itap, pdtphys, rjourvrai, &
    214         debut, pplay, paprs, t_seri, ssacu, ssacu_pi, load_tmp7)
    215         loadss(:)=load_tmp5(:)+load_tmp6(:)+load_tmp7(:)
     212        debut, pplay, paprs, t_seri, sscoarse,sscoarse_pi, load_tmp2)
     213        CALL readaerosol_interp(id_ASSSM_phy ,itap, pdtphys,rjourvrai, &
     214        debut, pplay, paprs, t_seri, ssacu, ssacu_pi, load_tmp3)
     215        loadss(:)=load_tmp1(:)+load_tmp2(:)+load_tmp3(:)
    216216     ELSE
    217217        sscoarse(:,:) = 0. ; sscoarse_pi(:,:) = 0.
     
    231231     ENDIF
    232232     !
     233     ! Read and interpolate cidustm
     234     IF (flag_aerosol .EQ. 6) THEN
     235
     236        CALL readaerosol_interp(id_ASNO3M_phy, itap, pdtphys, rjourvrai, &
     237        debut, pplay, paprs, t_seri, nitracc, nitracc_pi, load_tmp1)
     238        CALL readaerosol_interp(id_CSNO3M_phy, itap, pdtphys, rjourvrai, &
     239        debut, pplay, paprs, t_seri, nitrcoarse, nitrcoarse_pi, load_tmp2)
     240        CALL readaerosol_interp(id_CINO3M_phy, itap, pdtphys, rjourvrai, &
     241        debut, pplay, paprs, t_seri, nitrinscoarse, nitrinscoarse_pi, load_tmp3)
     242        loadss(:)=load_tmp1(:)+load_tmp2(:)+load_tmp3(:)
     243
     244     ELSE
     245        nitracc(:,:)         =   0.0 ; nitracc_pi(:,:)      =   0.0
     246        nitrcoarse(:,:)      =   0.0 ; nitrcoarse_pi(:,:)   =   0.0
     247        nitrinscoarse(:,:)   =   0.0 ; nitrinscoarse_pi(:,:)=   0.0
     248        loadno3(:)=0.0
     249     ENDIF
     250     !
     251     ! CSSO4M is set to 0 as not reliable
    233252     sulfcoarse(:,:)      =   0.0 ! CSSO4M (=SO4) + CSMSAM (=MSA)
    234253     sulfcoarse_pi(:,:)   =   0.0 ! CSSO4M (=SO4) + CSMSAM (=MSA) pre-ind
    235      !
    236      !--placeholder for offline nitrate   
    237      !
    238      nitracc(:,:)         =   0.0
    239      nitracc_pi(:,:)      =   0.0
    240      nitrcoarse(:,:)      =   0.0
    241      nitrcoarse_pi(:,:)   =   0.0
    242      nitrinscoarse(:,:)   =   0.0
    243      nitrinscoarse_pi(:,:)=   0.0
    244254
    245255  ENDIF !--not aerosol_couple
Note: See TracChangeset for help on using the changeset viewer.