Ignore:
Timestamp:
Jul 1, 2023, 12:07:30 AM (11 months ago)
Author:
dcugnet
Message:

StratAer? commit, N. Lebas

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/StratAer/interp_sulf_input.F90

    r3677 r4601  
    1212  USE mod_phys_lmdz_omp_data, ONLY :  is_omp_root
    1313  USE phys_local_var_mod, ONLY : budg_3D_backgr_ocs, budg_3D_backgr_so2
    14   USE phys_local_var_mod, ONLY : OCS_lifetime, SO2_lifetime
     14  USE phys_local_var_mod, ONLY : OCS_lifetime, SO2_lifetime, H2SO4_lifetime, O3_clim
    1515  USE mod_phys_lmdz_para
    1616  USE dimphy
     
    1919  USE aerophys
    2020  USE YOMCST
     21  USE strataer_local_var_mod, ONLY : flag_newclim_file,flag_verbose_strataer
    2122
    2223  IMPLICIT NONE
     
    6263  REAL OCS_clim_glo(klon_glo,klev)
    6364  REAL SO2_clim_glo(klon_glo,klev)
     65 
     66  REAL, ALLOCATABLE :: O3_clim_in(:, :, :, :)
     67  REAL, ALLOCATABLE :: O3_clim_mth(:, :, :)
     68  REAL, ALLOCATABLE :: O3_clim_tmp(:, :)
     69  REAL O3_clim_glo(klon_glo,klev)
     70 
     71  ! fixed climatos
    6472  REAL, ALLOCATABLE :: OCS_lifetime_in(:, :, :, :)
    6573  REAL, ALLOCATABLE :: SO2_lifetime_in(:, :, :, :)
     
    7078  REAL OCS_lifetime_glo(klon_glo,klev)
    7179  REAL SO2_lifetime_glo(klon_glo,klev)
     80 
     81  REAL, ALLOCATABLE :: H2SO4_lifetime_in(:, :, :, :)
     82  REAL, ALLOCATABLE :: H2SO4_lifetime_mth(:, :, :)
     83  REAL, ALLOCATABLE :: H2SO4_lifetime_tmp(:, :)
     84
     85  REAL H2SO4_lifetime_glo(klon_glo,klev)
    7286!
    7387  REAL, ALLOCATABLE, SAVE :: OCS_clim(:,:)
     
    7993
    8094! For NetCDF:
    81   INTEGER ncid_in  ! IDs for input files
    82   INTEGER varid, ncerr
     95  INTEGER             :: ncid_in  ! IDs for input files
     96  INTEGER             :: varid, ncerr
     97  CHARACTER (LEN=3)   :: nc_lat, nc_lon
     98  CHARACTER (LEN=256) :: nc_fname
    8399   
    84100  INTEGER, PARAMETER :: lev_input=17
     
    103119  IF (is_mpi_root.AND.is_omp_root) THEN
    104120
    105 !--reading emission files
    106     CALL nf95_open("ocs_so2_annual_lmdz.nc", nf90_nowrite, ncid_in)
    107 
     121    !--init ncdf variables
     122    IF(flag_newclim_file) THEN
     123      nc_fname = "ocs_so2_h2so4_annual_lmdz.nc"
     124      nc_lat   = "LAT"
     125      nc_lon   = "LON"
     126    ELSE
     127      ! old file for retro compatibility
     128      nc_fname = "ocs_so2_annual_lmdz.nc"
     129      nc_lat   = "lat"
     130      nc_lon   = "lon"
     131    ENDIF
     132
     133    !--reading emission files
     134    CALL nf95_open(nc_fname, nf90_nowrite, ncid_in)
     135    IF(flag_verbose_strataer) print *, "Open file ", nc_fname
     136   
    108137    CALL nf95_inq_varid(ncid_in, "LEV", varid)
    109138    CALL nf95_gw_var(ncid_in, varid, lev)
    110139    n_lev = size(lev)
    111 
    112     CALL nf95_inq_varid(ncid_in, "lat", varid)
     140   
     141    CALL nf95_inq_varid(ncid_in, nc_lat, varid)
    113142    CALL nf95_gw_var(ncid_in, varid, latitude)
    114143    n_lat = size(latitude)
    115 
    116     CALL nf95_inq_varid(ncid_in, "lon", varid)
     144   
     145    CALL nf95_inq_varid(ncid_in, nc_lon, varid)
    117146    CALL nf95_gw_var(ncid_in, varid, longitude)
    118147    n_lon = size(longitude)
    119 
     148   
    120149    CALL nf95_inq_varid(ncid_in, "TIME", varid)
    121150    CALL nf95_gw_var(ncid_in, varid, time)
    122151    n_mth = size(time)
    123 
     152   
    124153    IF (.NOT.ALLOCATED(OCS_clim_in))     ALLOCATE(OCS_clim_in(n_lon, n_lat, n_lev, n_mth))
    125154    IF (.NOT.ALLOCATED(SO2_clim_in))     ALLOCATE(SO2_clim_in(n_lon, n_lat, n_lev, n_mth))
     155    IF (.NOT.ALLOCATED(O3_clim_in))      ALLOCATE(O3_clim_in(n_lon, n_lat, n_lev, n_mth))
     156   
    126157    IF (.NOT.ALLOCATED(OCS_lifetime_in)) ALLOCATE(OCS_lifetime_in(n_lon, n_lat, n_lev, n_mth))
    127158    IF (.NOT.ALLOCATED(SO2_lifetime_in)) ALLOCATE(SO2_lifetime_in(n_lon, n_lat, n_lev, n_mth))
    128 
     159    IF (.NOT.ALLOCATED(H2SO4_lifetime_in)) ALLOCATE(H2SO4_lifetime_in(n_lon, n_lat, n_lev, n_mth))
     160   
    129161    CALL nf95_inq_varid(ncid_in, "OCS", varid)
    130162    ncerr = nf90_get_var(ncid_in, varid, OCS_clim_in)
    131     print *,'code erreur OCS=', ncerr, varid
     163    IF(flag_verbose_strataer) print *,'code erreur OCS=', ncerr, varid
    132164
    133165    CALL nf95_inq_varid(ncid_in, "SO2", varid)
    134166    ncerr = nf90_get_var(ncid_in, varid, SO2_clim_in)
    135     print *,'code erreur SO2=', ncerr, varid
     167    IF(flag_verbose_strataer) print *,'code erreur SO2=', ncerr, varid
    136168
    137169    CALL nf95_inq_varid(ncid_in, "OCS_LIFET", varid)
    138170    ncerr = nf90_get_var(ncid_in, varid, OCS_lifetime_in)
    139     print *,'code erreur OCS_lifetime_in=', ncerr, varid
     171    IF(flag_verbose_strataer) print *,'code erreur OCS_lifetime_in=', ncerr, varid
    140172
    141173    CALL nf95_inq_varid(ncid_in, "SO2_LIFET", varid)
    142174    ncerr = nf90_get_var(ncid_in, varid, SO2_lifetime_in)
    143     print *,'code erreur SO2_lifetime_in=', ncerr, varid
    144 
     175    IF(flag_verbose_strataer) print *,'code erreur SO2_lifetime_in=', ncerr, varid
     176   
     177    IF(flag_newclim_file) THEN
     178       CALL nf95_inq_varid(ncid_in, "O3", varid)
     179       ncerr = nf90_get_var(ncid_in, varid, O3_clim_in)
     180       IF(flag_verbose_strataer) print *,'code erreur O3=', ncerr, varid
     181       
     182       CALL nf95_inq_varid(ncid_in, "H2SO4_LIFET", varid)
     183       ncerr = nf90_get_var(ncid_in, varid, H2SO4_lifetime_in)
     184       IF(flag_verbose_strataer) print *,'code erreur H2SO4_lifetime_in=', ncerr, varid
     185    ENDIF
     186   
    145187    CALL nf95_close(ncid_in)
    146188
     
    149191    IF (.NOT.ALLOCATED(OCS_clim_tmp)) ALLOCATE(OCS_clim_tmp(klon_glo, n_lev))
    150192    IF (.NOT.ALLOCATED(SO2_clim_tmp)) ALLOCATE(SO2_clim_tmp(klon_glo, n_lev))
     193    IF (.NOT.ALLOCATED(O3_clim_mth))  ALLOCATE(O3_clim_mth(n_lon, n_lat, n_lev))
     194    IF (.NOT.ALLOCATED(O3_clim_tmp))  ALLOCATE(O3_clim_tmp(klon_glo, n_lev))
     195   
    151196    IF (.NOT.ALLOCATED(OCS_lifetime_mth)) ALLOCATE(OCS_lifetime_mth(n_lon, n_lat, n_lev))
    152197    IF (.NOT.ALLOCATED(SO2_lifetime_mth)) ALLOCATE(SO2_lifetime_mth(n_lon, n_lat, n_lev))
    153198    IF (.NOT.ALLOCATED(OCS_lifetime_tmp)) ALLOCATE(OCS_lifetime_tmp(klon_glo, n_lev))
    154199    IF (.NOT.ALLOCATED(SO2_lifetime_tmp)) ALLOCATE(SO2_lifetime_tmp(klon_glo, n_lev))
    155 
     200    IF (.NOT.ALLOCATED(H2SO4_lifetime_mth)) ALLOCATE(H2SO4_lifetime_mth(n_lon, n_lat, n_lev))
     201    IF (.NOT.ALLOCATED(H2SO4_lifetime_tmp)) ALLOCATE(H2SO4_lifetime_tmp(klon_glo, n_lev))
     202   
    156203!---select the correct month, undo multiplication with 1.e12 (precision reasons)
    157204!---correct latitudinal order and convert input from volume mixing ratio to mass mixing ratio
     
    161208      SO2_lifetime_mth(:,j,:) = SO2_lifetime_in(:,n_lat+1-j,:,mth_cur)
    162209      OCS_lifetime_mth(:,j,:) = OCS_lifetime_in(:,n_lat+1-j,:,mth_cur)
     210     
     211      ! O3 from 2d model is not tracer, in VMR
     212      IF(flag_newclim_file) THEN
     213         H2SO4_lifetime_mth(:,j,:) = H2SO4_lifetime_in(:,n_lat+1-j,:,mth_cur)
     214         ! new input files
     215         O3_clim_mth(:,j,:) = 1.e-6*O3_clim_in(:,n_lat+1-j,:,mth_cur)
     216      ELSE
     217         H2SO4_lifetime_mth(:,j,:) = 1.e-6
     218         O3_clim_mth(:,j,:) = 1.e-6
     219      ENDIF
    163220    ENDDO
    164221
     
    166223    CALL grid2dTo1d_glo(OCS_clim_mth,OCS_clim_tmp)
    167224    CALL grid2dTo1d_glo(SO2_clim_mth,SO2_clim_tmp)
     225    CALL grid2dTo1d_glo(O3_clim_mth,O3_clim_tmp)
     226   
    168227    CALL grid2dTo1d_glo(OCS_lifetime_mth,OCS_lifetime_tmp)
    169228    CALL grid2dTo1d_glo(SO2_lifetime_mth,SO2_lifetime_tmp)
     229    CALL grid2dTo1d_glo(H2SO4_lifetime_mth,H2SO4_lifetime_tmp)
    170230
    171231!--set lifetime to very high value in uninsolated areas
    172232    DO i=1, klon_glo
    173233      DO kk=1, n_lev
     234!--added tests on VMR of species for realism
     235        IF (OCS_clim_tmp(i,kk).LT.1.e-20) THEN
     236          OCS_clim_tmp(i,kk)=1.0e-20
     237        ENDIF
     238        IF (SO2_clim_tmp(i,kk).LT.1.e-20) THEN
     239          SO2_clim_tmp(i,kk)=1.0e-20
     240        ENDIF
     241        !       50 ppbv min for O3
     242        IF (O3_clim_tmp(i,kk).LT.50.0e-9) THEN
     243           O3_clim_tmp(i,kk)=50.0e-9
     244        ENDIF
     245       
    174246        IF (OCS_lifetime_tmp(i,kk)==0.0) THEN
    175247          OCS_lifetime_tmp(i,kk)=1.0e12
     
    178250          SO2_lifetime_tmp(i,kk)=1.0e12
    179251        ENDIF
     252       IF (H2SO4_lifetime_tmp(i,kk)==0.0) THEN
     253          H2SO4_lifetime_tmp(i,kk)=1.0e12
     254       ENDIF
    180255      ENDDO
    181256    ENDDO
     
    186261     OCS_lifetime_glo(i,k)=0.0
    187262     SO2_lifetime_glo(i,k)=0.0
     263     O3_clim_glo(i,k)=0.0
     264     
    188265     OCS_clim_glo(i,k)=0.0
    189266     SO2_clim_glo(i,k)=0.0
     267     H2SO4_lifetime_glo(i,k)=0.0
     268     
    190269     DO kk=1, n_lev
    191270      OCS_lifetime_glo(i,k)=OCS_lifetime_glo(i,k)+ &
     
    195274           MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk))-MAX(paprs_glo(i,k+1),paprs_input(kk+1))) &
    196275           *SO2_lifetime_tmp(i,kk)/(paprs_glo(i,k)-paprs_glo(i,k+1))
     276      IF(flag_newclim_file) THEN
     277         H2SO4_lifetime_glo(i,k)=H2SO4_lifetime_glo(i,k)+ &
     278              MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk)) &
     279              -MAX(paprs_glo(i,k+1),paprs_input(kk+1))) &
     280              *H2SO4_lifetime_tmp(i,kk)/(paprs_glo(i,k)-paprs_glo(i,k+1))
     281      ENDIF
     282     
    197283      OCS_clim_glo(i,k)=OCS_clim_glo(i,k)+ &
    198284           MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk))-MAX(paprs_glo(i,k+1),paprs_input(kk+1))) &
     
    201287           MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk))-MAX(paprs_glo(i,k+1),paprs_input(kk+1))) &
    202288           *SO2_clim_tmp(i,kk)/(paprs_glo(i,k)-paprs_glo(i,k+1))
     289      IF(flag_newclim_file) THEN
     290         O3_clim_glo(i,k)=O3_clim_glo(i,k)+ &
     291              MAX(0.0,MIN(paprs_glo(i,k),paprs_input(kk)) &
     292              -MAX(paprs_glo(i,k+1),paprs_input(kk+1))) &
     293              *O3_clim_tmp(i,kk)/(paprs_glo(i,k)-paprs_glo(i,k+1))
     294      ENDIF
    203295      ENDDO
    204296    ENDDO
     
    213305  CALL scatter(OCS_clim_glo, OCS_clim)
    214306  CALL scatter(SO2_clim_glo, SO2_clim)
     307  CALL scatter(O3_clim_glo, O3_clim)
    215308  CALL scatter(OCS_lifetime_glo, OCS_lifetime)
    216309  CALL scatter(SO2_lifetime_glo, SO2_lifetime)
    217 
     310  CALL scatter(H2SO4_lifetime_glo, H2SO4_lifetime)
     311 
    218312  IF (is_mpi_root.AND.is_omp_root) THEN
    219313!
    220     DEALLOCATE(OCS_clim_in,SO2_clim_in)
    221     DEALLOCATE(OCS_clim_mth,SO2_clim_mth)
    222     DEALLOCATE(OCS_clim_tmp,SO2_clim_tmp)
    223     DEALLOCATE(OCS_lifetime_in,SO2_lifetime_in)
    224     DEALLOCATE(OCS_lifetime_mth,SO2_lifetime_mth)
    225     DEALLOCATE(OCS_lifetime_tmp,SO2_lifetime_tmp)
     314    DEALLOCATE(OCS_clim_in,SO2_clim_in,O3_clim_in)
     315    DEALLOCATE(OCS_clim_mth,SO2_clim_mth,O3_clim_mth)
     316    DEALLOCATE(OCS_clim_tmp,SO2_clim_tmp,O3_clim_tmp)
     317    DEALLOCATE(OCS_lifetime_in, SO2_lifetime_in, H2SO4_lifetime_in)
     318    DEALLOCATE(OCS_lifetime_mth, SO2_lifetime_mth, H2SO4_lifetime_mth)
     319    DEALLOCATE(OCS_lifetime_tmp, SO2_lifetime_tmp, H2SO4_lifetime_tmp)
    226320!
    227321  ENDIF !--is_mpi_root and is_omp_root
Note: See TracChangeset for help on using the changeset viewer.