Ignore:
Timestamp:
Nov 21, 2019, 4:43:45 PM (5 years ago)
Author:
lguez
Message:

Merge revisions 3427:3600 of trunk into branch Ocean_skin

Location:
LMDZ6/branches/Ocean_skin
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/Ocean_skin

  • LMDZ6/branches/Ocean_skin/libf/phylmd/rrtm/aeropt_6bands_rrtm.F90

    r3288 r3605  
    66     tau_allaer, piz_allaer, &
    77     cg_allaer, m_allaer_pi, &
    8      flag_aerosol, flag_bc_internal_mixture, zrho )
     8     flag_aerosol, flag_bc_internal_mixture, zrho, ok_volcan )
    99
    1010  USE dimphy
     
    3232  LOGICAL,                        INTENT(IN)  :: flag_bc_internal_mixture
    3333  REAL, DIMENSION(klon,klev),     INTENT(IN)  :: zrho
     34  LOGICAL,                        INTENT(IN)  :: ok_volcan ! volcanic diags
    3435  !
    3536  ! Output arguments:
     
    794795         cg_allaer(i,k,2,inu)=MIN(MAX(cg_allaer(i,k,2,inu),0.0),1.0)
    795796
    796 !--natural aerosol
    797 !--ASBCM aerosols take _pi value because of internal mixture option
    798          tau_allaer(i,k,1,inu)=tau_ae_pi(i,k,id_ASSO4M_phy,inu)+tau_ae_pi(i,k,id_CSSO4M_phy,inu)+ &
    799                                tau_ae_pi(i,k,id_ASBCM_phy,inu)+tau_ae_pi(i,k,id_AIBCM_phy,inu)+   &
    800                                tau_ae_pi(i,k,id_ASPOMM_phy,inu)+tau_ae_pi(i,k,id_AIPOMM_phy,inu)+ &
    801                                tau_ae_pi(i,k,id_ASSSM_phy,inu)+tau_ae_pi(i,k,id_CSSSM_phy,inu)+   &
    802                                tau_ae_pi(i,k,id_SSSSM_phy,inu)+ tau_ae_pi(i,k,id_CIDUSTM_phy,inu)
    803          tau_allaer(i,k,1,inu)=MAX(tau_allaer(i,k,1,inu),tau_min)
    804 
    805          piz_allaer(i,k,1,inu)=(tau_ae_pi(i,k,id_ASSO4M_phy,inu)*piz_ae(i,k,id_ASSO4M_phy,inu)+   &
    806                                 tau_ae_pi(i,k,id_CSSO4M_phy,inu)*piz_ae(i,k,id_CSSO4M_phy,inu)+   &
    807                                 tau_ae_pi(i,k,id_ASBCM_phy,inu)*piz_ae_pi(i,k,id_ASBCM_phy,inu)+  &
    808                                 tau_ae_pi(i,k,id_AIBCM_phy,inu)*piz_ae(i,k,id_AIBCM_phy,inu)+     &
    809                                 tau_ae_pi(i,k,id_ASPOMM_phy,inu)*piz_ae(i,k,id_ASPOMM_phy,inu)+   &
    810                                 tau_ae_pi(i,k,id_AIPOMM_phy,inu)*piz_ae(i,k,id_AIPOMM_phy,inu)+   &
    811                                 tau_ae_pi(i,k,id_ASSSM_phy,inu)*piz_ae(i,k,id_ASSSM_phy,inu)+     &
    812                                 tau_ae_pi(i,k,id_CSSSM_phy,inu)*piz_ae(i,k,id_CSSSM_phy,inu)+     &
    813                                 tau_ae_pi(i,k,id_SSSSM_phy,inu)*piz_ae(i,k,id_SSSSM_phy,inu)+     &
    814                                 tau_ae_pi(i,k,id_CIDUSTM_phy,inu)*piz_ae(i,k,id_CIDUSTM_phy,inu)) &
    815                                 /tau_allaer(i,k,1,inu)
    816          piz_allaer(i,k,1,inu)=MIN(MAX(piz_allaer(i,k,1,inu),0.01),1.0)
    817          IF (tau_allaer(i,k,1,inu).LE.tau_min) piz_allaer(i,k,1,inu)=1.0
    818 
    819          cg_allaer(i,k,1,inu)=(tau_ae_pi(i,k,id_ASSO4M_phy,inu)*piz_ae(i,k,id_ASSO4M_phy,inu)*cg_ae(i,k,id_ASSO4M_phy,inu)+    &
    820                                tau_ae_pi(i,k,id_CSSO4M_phy,inu)*piz_ae(i,k,id_CSSO4M_phy,inu)*cg_ae(i,k,id_CSSO4M_phy,inu)+    &
    821                                tau_ae_pi(i,k,id_ASBCM_phy,inu)*piz_ae_pi(i,k,id_ASBCM_phy,inu)*cg_ae_pi(i,k,id_ASBCM_phy,inu)+ &
    822                                tau_ae_pi(i,k,id_AIBCM_phy,inu)*piz_ae(i,k,id_AIBCM_phy,inu)*cg_ae(i,k,id_AIBCM_phy,inu)+       &
    823                                tau_ae_pi(i,k,id_ASPOMM_phy,inu)*piz_ae(i,k,id_ASPOMM_phy,inu)*cg_ae(i,k,id_ASPOMM_phy,inu)+    &
    824                                tau_ae_pi(i,k,id_AIPOMM_phy,inu)*piz_ae(i,k,id_AIPOMM_phy,inu)*cg_ae(i,k,id_AIPOMM_phy,inu)+    &
    825                                tau_ae_pi(i,k,id_ASSSM_phy,inu)*piz_ae(i,k,id_ASSSM_phy,inu)*cg_ae(i,k,id_ASSSM_phy,inu)+       &
    826                                tau_ae_pi(i,k,id_CSSSM_phy,inu)*piz_ae(i,k,id_CSSSM_phy,inu)*cg_ae(i,k,id_CSSSM_phy,inu)+       &
    827                                tau_ae_pi(i,k,id_SSSSM_phy,inu)*piz_ae(i,k,id_SSSSM_phy,inu)*cg_ae(i,k,id_SSSSM_phy,inu)+       &
    828                                tau_ae_pi(i,k,id_CIDUSTM_phy,inu)*piz_ae(i,k,id_CIDUSTM_phy,inu)*cg_ae(i,k,id_CIDUSTM_phy,inu))/ &
    829                                (tau_allaer(i,k,1,inu)*piz_allaer(i,k,1,inu))
    830          cg_allaer(i,k,1,inu)=MIN(MAX(cg_allaer(i,k,1,inu),0.0),1.0)
    831 
     797         IF (.NOT. ok_volcan) THEN
     798!
     799!--this is the default case
     800!--in this case, index 1 of tau_allaer contains natural aerosols only
     801!--because the objective is to perform the double radiation call with and without anthropogenic aerosols
     802!
     803           tau_allaer(i,k,1,inu)=tau_ae_pi(i,k,id_ASSO4M_phy,inu)+tau_ae_pi(i,k,id_CSSO4M_phy,inu)+ &
     804                                 tau_ae_pi(i,k,id_ASBCM_phy,inu)+tau_ae_pi(i,k,id_AIBCM_phy,inu)+   &
     805                                 tau_ae_pi(i,k,id_ASPOMM_phy,inu)+tau_ae_pi(i,k,id_AIPOMM_phy,inu)+ &
     806                                 tau_ae_pi(i,k,id_ASSSM_phy,inu)+tau_ae_pi(i,k,id_CSSSM_phy,inu)+   &
     807                                 tau_ae_pi(i,k,id_SSSSM_phy,inu)+ tau_ae_pi(i,k,id_CIDUSTM_phy,inu)
     808           tau_allaer(i,k,1,inu)=MAX(tau_allaer(i,k,1,inu),tau_min)
     809         
     810           piz_allaer(i,k,1,inu)=(tau_ae_pi(i,k,id_ASSO4M_phy,inu)*piz_ae(i,k,id_ASSO4M_phy,inu)+   &
     811                                  tau_ae_pi(i,k,id_CSSO4M_phy,inu)*piz_ae(i,k,id_CSSO4M_phy,inu)+   &
     812                                  tau_ae_pi(i,k,id_ASBCM_phy,inu)*piz_ae_pi(i,k,id_ASBCM_phy,inu)+  &
     813                                  tau_ae_pi(i,k,id_AIBCM_phy,inu)*piz_ae(i,k,id_AIBCM_phy,inu)+     &
     814                                  tau_ae_pi(i,k,id_ASPOMM_phy,inu)*piz_ae(i,k,id_ASPOMM_phy,inu)+   &
     815                                  tau_ae_pi(i,k,id_AIPOMM_phy,inu)*piz_ae(i,k,id_AIPOMM_phy,inu)+   &
     816                                  tau_ae_pi(i,k,id_ASSSM_phy,inu)*piz_ae(i,k,id_ASSSM_phy,inu)+     &
     817                                  tau_ae_pi(i,k,id_CSSSM_phy,inu)*piz_ae(i,k,id_CSSSM_phy,inu)+     &
     818                                  tau_ae_pi(i,k,id_SSSSM_phy,inu)*piz_ae(i,k,id_SSSSM_phy,inu)+     &
     819                                  tau_ae_pi(i,k,id_CIDUSTM_phy,inu)*piz_ae(i,k,id_CIDUSTM_phy,inu)) &
     820                                  /tau_allaer(i,k,1,inu)
     821           piz_allaer(i,k,1,inu)=MIN(MAX(piz_allaer(i,k,1,inu),0.01),1.0)
     822           IF (tau_allaer(i,k,1,inu).LE.tau_min) piz_allaer(i,k,1,inu)=1.0
     823         
     824           cg_allaer(i,k,1,inu)=(tau_ae_pi(i,k,id_ASSO4M_phy,inu)*piz_ae(i,k,id_ASSO4M_phy,inu)*cg_ae(i,k,id_ASSO4M_phy,inu)+    &
     825                                 tau_ae_pi(i,k,id_CSSO4M_phy,inu)*piz_ae(i,k,id_CSSO4M_phy,inu)*cg_ae(i,k,id_CSSO4M_phy,inu)+    &
     826                                 tau_ae_pi(i,k,id_ASBCM_phy,inu)*piz_ae_pi(i,k,id_ASBCM_phy,inu)*cg_ae_pi(i,k,id_ASBCM_phy,inu)+ &
     827                                 tau_ae_pi(i,k,id_AIBCM_phy,inu)*piz_ae(i,k,id_AIBCM_phy,inu)*cg_ae(i,k,id_AIBCM_phy,inu)+       &
     828                                 tau_ae_pi(i,k,id_ASPOMM_phy,inu)*piz_ae(i,k,id_ASPOMM_phy,inu)*cg_ae(i,k,id_ASPOMM_phy,inu)+    &
     829                                 tau_ae_pi(i,k,id_AIPOMM_phy,inu)*piz_ae(i,k,id_AIPOMM_phy,inu)*cg_ae(i,k,id_AIPOMM_phy,inu)+    &
     830                                 tau_ae_pi(i,k,id_ASSSM_phy,inu)*piz_ae(i,k,id_ASSSM_phy,inu)*cg_ae(i,k,id_ASSSM_phy,inu)+       &
     831                                 tau_ae_pi(i,k,id_CSSSM_phy,inu)*piz_ae(i,k,id_CSSSM_phy,inu)*cg_ae(i,k,id_CSSSM_phy,inu)+       &
     832                                 tau_ae_pi(i,k,id_SSSSM_phy,inu)*piz_ae(i,k,id_SSSSM_phy,inu)*cg_ae(i,k,id_SSSSM_phy,inu)+       &
     833                                 tau_ae_pi(i,k,id_CIDUSTM_phy,inu)*piz_ae(i,k,id_CIDUSTM_phy,inu)*cg_ae(i,k,id_CIDUSTM_phy,inu))/ &
     834                                 (tau_allaer(i,k,1,inu)*piz_allaer(i,k,1,inu))
     835           cg_allaer(i,k,1,inu)=MIN(MAX(cg_allaer(i,k,1,inu),0.0),1.0)
     836!
     837         ELSE
     838!
     839!--this is the case for VOLMIP
     840!--in this case index 1 of tau_allaer contains all (natural+anthropogenic) aerosols (same as index 2 above)
     841!--but stratospheric aerosols will not be added in rrtm/readaerosolstrato2 as
     842!--the objective is to have the double radiation call with and without stratospheric aerosols
     843!
     844           tau_allaer(i,k,1,inu)=tau_allaer(i,k,2,inu)
     845           
     846           piz_allaer(i,k,1,inu)=piz_allaer(i,k,2,inu)
     847           
     848           cg_allaer(i,k,1,inu) =cg_allaer(i,k,2,inu)
     849!
     850         ENDIF
    832851        ENDDO
    833852      ENDDO
  • LMDZ6/branches/Ocean_skin/libf/phylmd/rrtm/radlsw.F90

    r2192 r3605  
    502502    ELSEIF (NRADLP == 3) THEN 
    503503! one uses the cloud droplet radius from newmicro
    504 ! IKL or JK ?? - I think IKL but needs to be verified
     504! IKL or JK ?? - I think IKL but needs to be verified > ref_liq_i
     505! (inverted) is used in the call of RECMWF_AERO in radlwsw_m.F90,
     506! so everything is fine - JBM 6/2019
    505507        ZRADLP(JL)=PREF_LIQ(JL,IKL)
    506508    ENDIF 
  • LMDZ6/branches/Ocean_skin/libf/phylmd/rrtm/readaerosol_optic_rrtm.F90

    r3333 r3605  
    11! $Id$
    22!
    3 SUBROUTINE readaerosol_optic_rrtm(debut, aerosol_couple, ok_alw, &
     3SUBROUTINE readaerosol_optic_rrtm(debut, aerosol_couple, ok_alw, ok_volcan, &
    44     new_aod, flag_aerosol, flag_bc_internal_mixture, itap, rjourvrai, &
    55     pdtphys, pplay, paprs, t_seri, rhcl, presnivs, &
     
    3232  LOGICAL, INTENT(IN)                      :: aerosol_couple
    3333  LOGICAL, INTENT(IN)                      :: ok_alw
     34  LOGICAL, INTENT(IN)                      :: ok_volcan
    3435  LOGICAL, INTENT(IN)                      :: new_aod
    3536  INTEGER, INTENT(IN)                      :: flag_aerosol
     
    313314       tau_aero, piz_aero, cg_aero, &
    314315       m_allaer_pi, flag_aerosol,   &
    315        flag_bc_internal_mixture, zrho )
     316       flag_bc_internal_mixture, zrho, ok_volcan )
    316317
    317318  ! aeropt_5wv only for validation and diagnostics
  • LMDZ6/branches/Ocean_skin/libf/phylmd/rrtm/readaerosolstrato1_rrtm.F90

    r2744 r3605  
    22! $Id: readaerosolstrato1_rrtm.F90 2526 2016-05-26 22:13:40Z oboucher $
    33!
     4
    45SUBROUTINE readaerosolstrato1_rrtm(debut)
    56
     
    910
    1011    USE phys_cal_mod, ONLY : mth_cur
    11     USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, klon_glo, grid2dTo1d_glo
    12     USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
    13     USE mod_phys_lmdz_omp_data, ONLY :  is_omp_root
     12    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, klon_glo, grid2dTo1d_glo, grid_type, unstructured
    1413    USE mod_phys_lmdz_para
    1514    USE phys_state_var_mod
     
    1918    USE YOERAD, ONLY : NLW
    2019    USE YOMCST
     20#ifdef CPP_XIOS
     21    USE xios
     22#endif
    2123
    2224    IMPLICIT NONE
     
    4547    REAL, ALLOCATABLE:: tauaerstrat_mois(:, :, :)
    4648    REAL, ALLOCATABLE:: tauaerstrat_mois_glo(:, :)
     49    REAL, ALLOCATABLE:: tauaerstrat_mpi(:, :)
    4750
    4851! For NetCDF:
     
    102105    n_lat = size(latitude)
    103106    print *, 'LAT aerosol strato=', n_lat, latitude
    104     IF (n_lat.NE.nbp_lat) THEN
    105        print *,'Le nombre de lat n est pas egal a nbp_lat'
    106        STOP
    107     ENDIF
    108 
     107
     108    IF (grid_type/=unstructured) THEN
     109      IF (n_lat.NE.nbp_lat) THEN
     110         print *,'Le nombre de lat n est pas egal a nbp_lat'
     111         STOP
     112      ENDIF
     113    ENDIF
     114   
    109115    CALL nf95_inq_varid(ncid_in, "LON", varid)
    110116    CALL nf95_gw_var(ncid_in, varid, longitude)
    111117    n_lon = size(longitude)
    112118    print *, 'LON aerosol strato=', n_lon, longitude
    113     IF (n_lon.NE.nbp_lon) THEN
    114        print *,'Le nombre de lon n est pas egal a nbp_lon'
    115        STOP
    116     ENDIF
    117 
     119
     120    IF (grid_type/=unstructured) THEN
     121      IF (n_lon.NE.nbp_lon) THEN
     122         print *,'Le nombre de lon n est pas egal a nbp_lon'
     123         STOP
     124      ENDIF
     125    ENDIF
     126   
     127   
    118128    CALL nf95_inq_varid(ncid_in, "TIME", varid)
    119129    CALL nf95_gw_var(ncid_in, varid, time)
     
    144154!---reduce to a klon_glo grid
    145155    CALL grid2dTo1d_glo(tauaerstrat_mois,tauaerstrat_mois_glo)
    146 
     156   
     157    ELSE
     158      ALLOCATE(tauaerstrat_mois(0,0,0))
    147159    ENDIF !--is_mpi_root and is_omp_root
    148160
     
    153165
    154166!--scatter on all proc
    155     CALL scatter(tauaerstrat_mois_glo,tau_aer_strat)
    156 
     167   
     168    IF (grid_type==unstructured) THEN
     169#ifdef CPP_XIOS
     170      IF (is_omp_master) THEN
     171        ALLOCATE(tauaerstrat_mpi(klon_mpi,klev))
     172        CALL xios_send_field("taustrat_in",tauaerstrat_mois)
     173        CALL xios_recv_field("taustrat_out",tauaerstrat_mpi)
     174      ELSE
     175        ALLOCATE(tauaerstrat_mpi(0,0))
     176      ENDIF
     177      CALL scatter_omp(tauaerstrat_mpi,tau_aer_strat)
     178#endif
     179    ELSE 
     180      CALL scatter(tauaerstrat_mois_glo,tau_aer_strat)
     181    ENDIF
     182   
    157183    IF (is_mpi_root.AND.is_omp_root) THEN
    158184!
  • LMDZ6/branches/Ocean_skin/libf/phylmd/rrtm/readaerosolstrato2_rrtm.F90

    r2744 r3605  
    22! $Id: readaerosolstrato2_rrtm.F90 2526 2016-05-26 22:13:40Z oboucher $
    33!
    4 SUBROUTINE readaerosolstrato2_rrtm(debut)
     4SUBROUTINE readaerosolstrato2_rrtm(debut, ok_volcan)
    55
    66    USE netcdf95, ONLY: nf95_close, nf95_gw_var, nf95_inq_dimid, &
     
    99
    1010    USE phys_cal_mod, ONLY : mth_cur
    11     USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, klon_glo, grid2dTo1d_glo
    12     USE mod_phys_lmdz_mpi_data, ONLY :  is_mpi_root
    13     USE mod_phys_lmdz_omp_data, ONLY :  is_omp_root
     11    USE mod_grid_phy_lmdz, ONLY: nbp_lon, nbp_lat, klon_glo, grid2dTo1d_glo, grid_type, unstructured
     12    USE mod_phys_lmdz_mpi_data
     13    USE mod_phys_lmdz_omp_data
    1414    USE mod_phys_lmdz_para
    1515    USE phys_state_var_mod
     
    1919    USE YOERAD, ONLY : NLW
    2020    USE YOMCST
     21#ifdef CPP_XIOS
     22    USE xios
     23#endif
    2124
    2225    IMPLICIT NONE
     
    2932! Variable input
    3033    LOGICAL, INTENT(IN) ::  debut
     34    LOGICAL, INTENT(IN) ::  ok_volcan !activate volcanic diags
    3135
    3236! Variables locales
     
    6569    REAL, ALLOCATABLE:: cgaerstrat_mois_glo(:, :, :)
    6670    REAL, ALLOCATABLE:: taulwaerstrat_mois_glo(:, :, :)
     71    REAL, ALLOCATABLE:: tauaerstrat_mpi(:, :, :)
     72    REAL, ALLOCATABLE:: pizaerstrat_mpi(:, :, :)
     73    REAL, ALLOCATABLE:: cgaerstrat_mpi(:, :, :)
     74    REAL, ALLOCATABLE:: taulwaerstrat_mpi(:, :, :)
    6775
    6876! For NetCDF:
     
    107115        CALL nf95_gw_var(ncid_in, varid, latitude)
    108116        n_lat = size(latitude)
    109         IF (n_lat.NE.nbp_lat) THEN
    110            print *, 'latitude=', n_lat, nbp_lat
    111            abort_message='Le nombre de lat n est pas egal a nbp_lat'
    112            CALL abort_physic(modname,abort_message,1)
     117
     118        IF (grid_type/=unstructured) THEN
     119           IF (n_lat.NE.nbp_lat) THEN
     120             print *, 'latitude=', n_lat, nbp_lat
     121             abort_message='Le nombre de lat n est pas egal a nbp_lat'
     122             CALL abort_physic(modname,abort_message,1)
     123           ENDIF
    113124        ENDIF
    114125
     
    134145        ALLOCATE(cgaerstrat(n_lat, n_lev, n_wav, n_month))
    135146
    136         ALLOCATE(tauaerstrat_mois(n_lon, n_lat, n_lev, n_wav))
    137         ALLOCATE(pizaerstrat_mois(n_lon, n_lat, n_lev, n_wav))
    138         ALLOCATE(cgaerstrat_mois(n_lon, n_lat, n_lev, n_wav))
    139 
    140         ALLOCATE(tauaerstrat_mois_glo(klon_glo, n_lev, n_wav))
    141         ALLOCATE(pizaerstrat_mois_glo(klon_glo, n_lev, n_wav))
    142         ALLOCATE(cgaerstrat_mois_glo(klon_glo, n_lev, n_wav))
    143 
    144147!--reading stratospheric aerosol tau per layer
    145148        CALL nf95_inq_varid(ncid_in, "TAU_SUN", varid)
     
    159162        CALL nf95_close(ncid_in)
    160163
     164       
     165        IF (grid_type/=unstructured) THEN
     166          ALLOCATE(tauaerstrat_mois(n_lon, n_lat, n_lev, n_wav))
     167          ALLOCATE(pizaerstrat_mois(n_lon, n_lat, n_lev, n_wav))
     168          ALLOCATE(cgaerstrat_mois(n_lon, n_lat, n_lev, n_wav))
     169
     170          ALLOCATE(tauaerstrat_mois_glo(klon_glo, n_lev, n_wav))
     171          ALLOCATE(pizaerstrat_mois_glo(klon_glo, n_lev, n_wav))
     172          ALLOCATE(cgaerstrat_mois_glo(klon_glo, n_lev, n_wav))
    161173!--select the correct month
    162174!--and copy into 1st longitude
    163         tauaerstrat_mois(1,:,:,:) = tauaerstrat(:,:,:,mth_cur)
    164         pizaerstrat_mois(1,:,:,:) = pizaerstrat(:,:,:,mth_cur)
    165         cgaerstrat_mois(1,:,:,:)  = cgaerstrat(:,:,:,mth_cur)
     175          tauaerstrat_mois(1,:,:,:) = tauaerstrat(:,:,:,mth_cur)
     176          pizaerstrat_mois(1,:,:,:) = pizaerstrat(:,:,:,mth_cur)
     177          cgaerstrat_mois(1,:,:,:)  = cgaerstrat(:,:,:,mth_cur)
    166178
    167179!--copy longitudes
    168         DO i=2, n_lon
    169          tauaerstrat_mois(i,:,:,:) = tauaerstrat_mois(1,:,:,:)
    170          pizaerstrat_mois(i,:,:,:) = pizaerstrat_mois(1,:,:,:)
    171          cgaerstrat_mois(i,:,:,:)  = cgaerstrat_mois(1,:,:,:)
    172         ENDDO
     180          DO i=2, n_lon
     181           tauaerstrat_mois(i,:,:,:) = tauaerstrat_mois(1,:,:,:)
     182           pizaerstrat_mois(i,:,:,:) = pizaerstrat_mois(1,:,:,:)
     183           cgaerstrat_mois(i,:,:,:)  = cgaerstrat_mois(1,:,:,:)
     184          ENDDO
    173185
    174186!---reduce to a klon_glo grid
    175         DO band=1, NSW
    176           CALL grid2dTo1d_glo(tauaerstrat_mois(:,:,:,band),tauaerstrat_mois_glo(:,:,band))
    177           CALL grid2dTo1d_glo(pizaerstrat_mois(:,:,:,band),pizaerstrat_mois_glo(:,:,band))
    178           CALL grid2dTo1d_glo(cgaerstrat_mois(:,:,:,band),cgaerstrat_mois_glo(:,:,band))
    179         ENDDO
    180 
     187          DO band=1, NSW
     188            CALL grid2dTo1d_glo(tauaerstrat_mois(:,:,:,band),tauaerstrat_mois_glo(:,:,band))
     189            CALL grid2dTo1d_glo(pizaerstrat_mois(:,:,:,band),pizaerstrat_mois_glo(:,:,band))
     190            CALL grid2dTo1d_glo(cgaerstrat_mois(:,:,:,band),cgaerstrat_mois_glo(:,:,band))
     191          ENDDO
     192        ENDIF
    181193!--Now LW optical properties
    182194!
     195
    183196        CALL nf95_open("taulwstrat.2D.nc", nf90_nowrite, ncid_in)
    184197
     
    194207        CALL nf95_gw_var(ncid_in, varid, latitude)
    195208        n_lat = size(latitude)
    196         IF (n_lat.NE.nbp_lat) THEN
    197            abort_message='Le nombre de lat n est pas egal a nbp_lat'
    198            CALL abort_physic(modname,abort_message,1)
    199         ENDIF
    200 
     209
     210        IF (grid_type/=unstructured) THEN
     211          IF (n_lat.NE.nbp_lat) THEN
     212             abort_message='Le nombre de lat n est pas egal a nbp_lat'
     213             CALL abort_physic(modname,abort_message,1)
     214          ENDIF
     215        ENDIF
     216       
    201217        CALL nf95_inq_varid(ncid_in, "TIME", varid)
    202218        CALL nf95_gw_var(ncid_in, varid, time)
     
    217233
    218234        ALLOCATE(taulwaerstrat(n_lat, n_lev, n_wav, n_month))
    219         ALLOCATE(taulwaerstrat_mois(n_lon, n_lat, n_lev, n_wav))
    220         ALLOCATE(taulwaerstrat_mois_glo(klon_glo, n_lev, n_wav))
    221235
    222236!--reading stratospheric aerosol lw tau per layer
     
    227241        CALL nf95_close(ncid_in)
    228242
     243        IF (grid_type/=unstructured) THEN
     244
     245          ALLOCATE(taulwaerstrat_mois(n_lon, n_lat, n_lev, n_wav))
     246          ALLOCATE(taulwaerstrat_mois_glo(klon_glo, n_lev, n_wav))
     247
    229248!--select the correct month
    230249!--and copy into 1st longitude
    231         taulwaerstrat_mois(1,:,:,:) = taulwaerstrat(:,:,:,mth_cur)
     250          taulwaerstrat_mois(1,:,:,:) = taulwaerstrat(:,:,:,mth_cur)
    232251!--copy longitudes
    233         DO i=2, n_lon
    234           taulwaerstrat_mois(i,:,:,:) = taulwaerstrat_mois(1,:,:,:)
    235         ENDDO
     252          DO i=2, n_lon
     253            taulwaerstrat_mois(i,:,:,:) = taulwaerstrat_mois(1,:,:,:)
     254          ENDDO
    236255
    237256!---reduce to a klon_glo grid
    238         DO band=1, NLW
    239           CALL grid2dTo1d_glo(taulwaerstrat_mois(:,:,:,band),taulwaerstrat_mois_glo(:,:,band))
    240         ENDDO
    241 
     257          DO band=1, NLW
     258            CALL grid2dTo1d_glo(taulwaerstrat_mois(:,:,:,band),taulwaerstrat_mois_glo(:,:,band))
     259          ENDDO
     260        ENDIF
     261     
    242262      ELSE !--proc other than mpi_root and omp_root
    243263           !--dummy allocation needed for debug mode
     
    248268        ALLOCATE(taulwaerstrat_mois_glo(1,1,1))
    249269
     270        ALLOCATE(tauaerstrat(0,0,0,12))
     271        ALLOCATE(pizaerstrat(0,0,0,12))
     272        ALLOCATE(cgaerstrat(0,0,0,12))
     273        ALLOCATE(taulwaerstrat(0,0,0,12))
     274
     275
    250276      ENDIF !--is_mpi_root and is_omp_root
    251277
     
    255281      mth_pre=mth_cur
    256282
     283      IF (grid_type==unstructured) THEN
     284
     285#ifdef CPP_XIOS
     286
     287        IF (is_omp_master) THEN
     288          ALLOCATE(tauaerstrat_mpi(klon_mpi, klev, NSW))
     289          ALLOCATE(pizaerstrat_mpi(klon_mpi, klev, NSW))
     290          ALLOCATE(cgaerstrat_mpi(klon_mpi, klev, NSW))       
     291          ALLOCATE(taulwaerstrat_mpi(klon_mpi, klev, NLW))
     292         
     293          CALL xios_send_field("tauaerstrat_in",SPREAD(tauaerstrat(:,:,:,mth_cur),1,8))
     294          CALL xios_recv_field("tauaerstrat_out",tauaerstrat_mpi)
     295          CALL xios_send_field("pizaerstrat_in",SPREAD(pizaerstrat(:,:,:,mth_cur),1,8))
     296          CALL xios_recv_field("pizaerstrat_out",pizaerstrat_mpi)
     297          CALL xios_send_field("cgaerstrat_in",SPREAD(cgaerstrat(:,:,:,mth_cur),1,8))
     298          CALL xios_recv_field("cgaerstrat_out",cgaerstrat_mpi)
     299          CALL xios_send_field("taulwaerstrat_in",SPREAD(taulwaerstrat(:,:,:,mth_cur),1,8))
     300          CALL xios_recv_field("taulwaerstrat_out",taulwaerstrat_mpi)
     301        ELSE
     302          ALLOCATE(tauaerstrat_mpi(0, 0, 0))
     303          ALLOCATE(pizaerstrat_mpi(0, 0, 0))
     304          ALLOCATE(cgaerstrat_mpi(0, 0, 0))       
     305          ALLOCATE(taulwaerstrat_mpi(0, 0, 0))
     306        ENDIF 
     307       
     308        CALL scatter_omp(tauaerstrat_mpi,tau_aer_strat)
     309        CALL scatter_omp(pizaerstrat_mpi,piz_aer_strat)
     310        CALL scatter_omp(cgaerstrat_mpi,cg_aer_strat)
     311        CALL scatter_omp(taulwaerstrat_mpi,taulw_aer_strat)
     312#endif
     313      ELSE 
     314       
    257315!--scatter on all proc
    258       CALL scatter(tauaerstrat_mois_glo,tau_aer_strat)
    259       CALL scatter(pizaerstrat_mois_glo,piz_aer_strat)
    260       CALL scatter(cgaerstrat_mois_glo,cg_aer_strat)
    261       CALL scatter(taulwaerstrat_mois_glo,taulw_aer_strat)
     316        CALL scatter(tauaerstrat_mois_glo,tau_aer_strat)
     317        CALL scatter(pizaerstrat_mois_glo,piz_aer_strat)
     318        CALL scatter(cgaerstrat_mois_glo,cg_aer_strat)
     319        CALL scatter(taulwaerstrat_mois_glo,taulw_aer_strat)
     320        IF (is_mpi_root.AND.is_omp_root)  DEALLOCATE(tauaerstrat_mois, pizaerstrat_mois, cgaerstrat_mois, taulwaerstrat_mois)
     321
     322      ENDIF
    262323
    263324      IF (is_mpi_root.AND.is_omp_root) THEN
    264 !
    265         DEALLOCATE(tauaerstrat, pizaerstrat, cgaerstrat)
    266         DEALLOCATE(tauaerstrat_mois, pizaerstrat_mois, cgaerstrat_mois)
    267         DEALLOCATE(taulwaerstrat,taulwaerstrat_mois)
    268 !
    269       ENDIF !--is_mpi_root and is_omp_root
    270 
    271       DEALLOCATE(tauaerstrat_mois_glo,pizaerstrat_mois_glo,cgaerstrat_mois_glo)
    272       DEALLOCATE(taulwaerstrat_mois_glo)
     325        DEALLOCATE(tauaerstrat, pizaerstrat, cgaerstrat,taulwaerstrat)
     326      ENDIF
     327     
    273328
    274329!$OMP BARRIER
     
    290345    ENDDO
    291346
     347    IF (.NOT. ok_volcan) THEN
     348!
     349!--this is the default case
     350!--stratospheric aerosols are added to both index 2 and 1 for double radiation calls
    292351!--weighted average for cg, piz and tau, adding strat aerosols on top of tropospheric ones
    293352    DO band=1, NSW
    294353      WHERE (stratomask.GT.0.999999)
    295 !--anthropogenic aerosols bands 1 to NSW
     354!--strat aerosols are added to index 2 : natural and anthropogenic aerosols for bands 1 to NSW
    296355        cg_aero_sw_rrtm(:,:,2,band)  = ( cg_aero_sw_rrtm(:,:,2,band)*piz_aero_sw_rrtm(:,:,2,band)*tau_aero_sw_rrtm(:,:,2,band) + &
    297356                                         cg_aer_strat(:,:,band)*piz_aer_strat(:,:,band)*tau_aer_strat(:,:,band) ) /              &
     
    302361                                    MAX( tau_aero_sw_rrtm(:,:,2,band) + tau_aer_strat(:,:,band), 1.e-15 )
    303362        tau_aero_sw_rrtm(:,:,2,band)  = tau_aero_sw_rrtm(:,:,2,band) + tau_aer_strat(:,:,band)
    304 !--natural aerosols bands 1 to NSW
     363!--strat aerosols are added to index 1 : natural aerosols only for bands 1 to NSW
    305364        cg_aero_sw_rrtm(:,:,1,band)  = ( cg_aero_sw_rrtm(:,:,1,band)*piz_aero_sw_rrtm(:,:,1,band)*tau_aero_sw_rrtm(:,:,1,band) + &
     365                cg_aer_strat(:,:,band)*piz_aer_strat(:,:,band)*tau_aer_strat(:,:,band) ) /              &
     366                MAX( piz_aero_sw_rrtm(:,:,1,band)*tau_aero_sw_rrtm(:,:,1,band) +                             &
     367                piz_aer_strat(:,:,band)*tau_aer_strat(:,:,band), 1.e-15 )
     368        piz_aero_sw_rrtm(:,:,1,band) = ( piz_aero_sw_rrtm(:,:,1,band)*tau_aero_sw_rrtm(:,:,1,band) +                             &
     369                piz_aer_strat(:,:,band)*tau_aer_strat(:,:,band) ) /                                     &
     370                MAX( tau_aero_sw_rrtm(:,:,1,band) + tau_aer_strat(:,:,band), 1.e-15 )
     371        tau_aero_sw_rrtm(:,:,1,band)  = tau_aero_sw_rrtm(:,:,1,band) + tau_aer_strat(:,:,band)
     372    ENDWHERE
     373    ENDDO
     374!
     375    ELSE
     376!
     377!--this is the VOLMIP case
     378!--stratospheric aerosols are only added to index 2 in this case
     379!--weighted average for cg, piz and tau, adding strat aerosols on top of tropospheric ones
     380    DO band=1, NSW
     381      WHERE (stratomask.GT.0.999999)
     382!--strat aerosols are added to index 2 : natural and anthropogenic aerosols for bands 1 to NSW
     383        cg_aero_sw_rrtm(:,:,2,band)  = ( cg_aero_sw_rrtm(:,:,2,band)*piz_aero_sw_rrtm(:,:,2,band)*tau_aero_sw_rrtm(:,:,2,band) + &
    306384                                         cg_aer_strat(:,:,band)*piz_aer_strat(:,:,band)*tau_aer_strat(:,:,band) ) /              &
    307                                     MAX( piz_aero_sw_rrtm(:,:,1,band)*tau_aero_sw_rrtm(:,:,1,band) +                             &
     385                                    MAX( piz_aero_sw_rrtm(:,:,2,band)*tau_aero_sw_rrtm(:,:,2,band) +                             &
    308386                                         piz_aer_strat(:,:,band)*tau_aer_strat(:,:,band), 1.e-15 )
    309         piz_aero_sw_rrtm(:,:,1,band) = ( piz_aero_sw_rrtm(:,:,1,band)*tau_aero_sw_rrtm(:,:,1,band) +                             &
     387        piz_aero_sw_rrtm(:,:,2,band) = ( piz_aero_sw_rrtm(:,:,2,band)*tau_aero_sw_rrtm(:,:,2,band) +                             &
    310388                                         piz_aer_strat(:,:,band)*tau_aer_strat(:,:,band) ) /                                     &
    311                                     MAX( tau_aero_sw_rrtm(:,:,1,band) + tau_aer_strat(:,:,band), 1.e-15 )
    312         tau_aero_sw_rrtm(:,:,1,band)  = tau_aero_sw_rrtm(:,:,1,band) + tau_aer_strat(:,:,band)
    313 !--no stratospheric aerosol in index 1 for these tests
    314 !        cg_aero_sw_rrtm(:,:,1,band)  =  cg_aero_sw_rrtm(:,:,1,band)
    315 !        piz_aero_sw_rrtm(:,:,1,band)  = piz_aero_sw_rrtm(:,:,1,band)
    316 !        tau_aero_sw_rrtm(:,:,1,band)  = tau_aero_sw_rrtm(:,:,1,band)
    317     ENDWHERE
    318     ENDDO
     389                                    MAX( tau_aero_sw_rrtm(:,:,2,band) + tau_aer_strat(:,:,band), 1.e-15 )
     390        tau_aero_sw_rrtm(:,:,2,band)  = tau_aero_sw_rrtm(:,:,2,band) + tau_aer_strat(:,:,band)
     391     ENDWHERE
     392  ENDDO
     393  ENDIF
    319394
    320395!--total vertical aod at 10 um
     
    331406    ENDDO
    332407
     408    IF (.NOT. ok_volcan) THEN
     409!--this is the default case
     410!--stratospheric aerosols are added to both index 2 and 1
    333411    DO band=1, NLW
    334412      WHERE (stratomask.GT.0.999999)
    335413        tau_aero_lw_rrtm(:,:,2,band)  = tau_aero_lw_rrtm(:,:,2,band) + taulw_aer_strat(:,:,band)
    336414        tau_aero_lw_rrtm(:,:,1,band)  = tau_aero_lw_rrtm(:,:,1,band) + taulw_aer_strat(:,:,band)
    337 !--no stratospheric aerosols in index 1 for these tests
    338 !    tau_aero_lw_rrtm(:,:,1,band)  = tau_aero_lw_rrtm(:,:,1,band)
    339415      ENDWHERE
    340416    ENDDO
     417!
     418    ELSE
     419!
     420!--this is the VOLMIP case
     421    DO band=1, NLW
     422!--stratospheric aerosols are not added to index 1
     423!--and we copy index 2 in index 1 because we want the same dust aerosol LW properties as above
     424      tau_aero_lw_rrtm(:,:,1,band)  = tau_aero_lw_rrtm(:,:,2,band)
     425!
     426      WHERE (stratomask.GT.0.999999)
     427!--stratospheric aerosols are only added to index 2
     428        tau_aero_lw_rrtm(:,:,2,band)  = tau_aero_lw_rrtm(:,:,2,band) + taulw_aer_strat(:,:,band)
     429      ENDWHERE
     430    ENDDO
     431    ENDIF
    341432
    342433!--default SSA value if there is no aerosol
  • LMDZ6/branches/Ocean_skin/libf/phylmd/rrtm/recmwf_aero.F90

    r3412 r3605  
    3030 & PTOPSWAIAERO,PSOLSWAIAERO,&
    3131 & PTOPSWCFAERO,PSOLSWCFAERO,&
     32 & PSWADAERO,& !--NL
    3233!--LW diagnostics CK
    3334 & PTOPLWADAERO,PSOLLWADAERO,&
    3435 & PTOPLWAD0AERO,PSOLLWAD0AERO,&
    3536 & PTOPLWAIAERO,PSOLLWAIAERO,&
     37 & PLWADAERO,& !--NL
    3638!..end
    37  & ok_ade, ok_aie, flag_aerosol,flag_aerosol_strat,flag_aer_feedback)
     39 & ok_ade, ok_aie, ok_volcan, flag_aerosol,flag_aerosol_strat,&
     40 & flag_aer_feedback)
    3841!--fin
    3942
     
    8285! ok_ade---input-L- apply the Aerosol Direct Effect or not?
    8386! ok_aie---input-L- apply the Aerosol Indirect Effect or not?
     87! ok_volcan-input-L- activate volcanic diags (SW heat & LW cool rate, SW & LW flux)
    8488! flag_aerosol-input-I- aerosol flag from 0 to 7
    8589! flag_aerosol_strat-input-I- use stratospheric aerosols flag (T/F)
     
    213217REAL(KIND=JPRB)   ,INTENT(IN)    :: PREF_ICE_PI(KPROMA,KLEV)
    214218LOGICAL, INTENT(in)  :: ok_ade, ok_aie         ! switches whether to use aerosol direct (indirect) effects or not
     219LOGICAL, INTENT(in)  :: ok_volcan              ! produce volcanic diags (SW/LW heat flux and rate)
    215220INTEGER, INTENT(in)  :: flag_aerosol           ! takes value 0 (no aerosol) or 1 to 6 (aerosols)
    216221LOGICAL, INTENT(in)  :: flag_aerosol_strat     ! use stratospheric aerosols
     
    221226REAL(KIND=JPRB)   ,INTENT(OUT)   :: PTOPSWCFAERO(KPROMA,3), PSOLSWCFAERO(KPROMA,3) !--do we keep this ?
    222227!--fin
     228!--NL
     229REAL(KIND=JPRB)   ,INTENT(OUT)   :: PSWADAERO(KPROMA, KLEV+1)                        ! SW Aerosol direct forcing
     230REAL(KIND=JPRB)   ,INTENT(OUT)   :: PLWADAERO(KPROMA, KLEV+1)                        ! LW Aerosol direct forcing
    223231!--CK
    224232REAL(KIND=JPRB)   ,INTENT(out)   :: PTOPLWADAERO(KPROMA), PSOLLWADAERO(KPROMA)       ! LW Aerosol direct forcing at TOA + surface
     
    811819     PSOLSWAD0AERO(:) = (ZFSDN0_AERO(:,1,4)     -ZFSUP0_AERO(:,1,4))     -(ZFSDN0_AERO(:,1,2)     -ZFSUP0_AERO(:,1,2))
    812820     PTOPSWAD0AERO(:) = (ZFSDN0_AERO(:,KLEV+1,4)-ZFSUP0_AERO(:,KLEV+1,4))-(ZFSDN0_AERO(:,KLEV+1,2)-ZFSUP0_AERO(:,KLEV+1,2))
     821     IF(ok_volcan) THEN
     822        PSWADAERO(:,:)  = (ZFSDN_AERO(:,:,4) -ZFSUP_AERO(:,:,4)) -(ZFSDN_AERO(:,:,2) -ZFSUP_AERO(:,:,2)) !--NL
     823     ENDIF
    813824
    814825! indirect anthropogenic forcing
     
    831842     PSOLLWAD0AERO(:) = (-LWDN0_AERO(:,1,4)     -LWUP0_AERO(:,1,4))     -(-LWDN0_AERO(:,1,2)     -LWUP0_AERO(:,1,2))
    832843     PTOPLWAD0AERO(:) = (-LWDN0_AERO(:,KLEV+1,4)-LWUP0_AERO(:,KLEV+1,4))-(-LWDN0_AERO(:,KLEV+1,2)-LWUP0_AERO(:,KLEV+1,2))
     844     IF(ok_volcan) THEN
     845        PLWADAERO(:,:)  = (-LWDN_AERO(:,:,4) -LWUP_AERO(:,:,4)) -(-LWDN_AERO(:,:,2) -LWUP_AERO(:,:,2)) !--NL
     846     ENDIF
    833847
    834848! LW indirect anthropogenic forcing
     
    845859     PSOLSWAD0AERO(:) = (ZFSDN0_AERO(:,1,3)     -ZFSUP0_AERO(:,1,3))     -(ZFSDN0_AERO(:,1,1)     -ZFSUP0_AERO(:,1,1))
    846860     PTOPSWAD0AERO(:) = (ZFSDN0_AERO(:,KLEV+1,3)-ZFSUP0_AERO(:,KLEV+1,3))-(ZFSDN0_AERO(:,KLEV+1,1)-ZFSUP0_AERO(:,KLEV+1,1))
     861     IF(ok_volcan) THEN
     862        PSWADAERO(:,:)  = (ZFSDN_AERO(:,:,3) -ZFSUP_AERO(:,:,3)) -(ZFSDN_AERO(:,:,1) -ZFSUP_AERO(:,:,1)) !--NL
     863     ENDIF
    847864
    848865! indirect anthropogenic forcing
     
    865882     PSOLLWAD0AERO(:) = (-LWDN0_AERO(:,1,3)     -LWUP0_AERO(:,1,3))     -(-LWDN0_AERO(:,1,1)     -LWUP0_AERO(:,1,1))
    866883     PTOPLWAD0AERO(:) = (-LWDN0_AERO(:,KLEV+1,3)-LWUP0_AERO(:,KLEV+1,3))-(-LWDN0_AERO(:,KLEV+1,1)-LWUP0_AERO(:,KLEV+1,1))
    867 
     884     IF(ok_volcan) THEN
     885        PLWADAERO(:,:)  = (-LWDN_AERO(:,:,3) -LWUP_AERO(:,:,3)) -(-LWDN_AERO(:,:,1) -LWUP_AERO(:,:,1)) !--NL
     886     ENDIF
     887     
    868888! LW indirect anthropogenic forcing
    869889     PSOLLWAIAERO(:) = 0.0
     
    879899     PSOLSWAD0AERO(:) = 0.0
    880900     PTOPSWAD0AERO(:) = 0.0
    881 
     901     IF(ok_volcan) THEN
     902        PSWADAERO(:,:)  = 0.0 !--NL
     903     ENDIF
     904     
    882905! indirect anthropogenic forcing
    883906     PSOLSWAIAERO(:) = (ZFSDN_AERO(:,1,2)     -ZFSUP_AERO(:,1,2))     -(ZFSDN_AERO(:,1,1)     -ZFSUP_AERO(:,1,1))
     
    899922     PSOLLWAD0AERO(:) = 0.0
    900923     PTOPLWAD0AERO(:) = 0.0
    901 
     924     IF(ok_volcan) THEN
     925        PLWADAERO(:,:)  = 0.0 !--NL
     926     ENDIF
     927     
    902928! LW indirect anthropogenic forcing
    903929     PSOLLWAIAERO(:) = (-LWDN_AERO(:,1,2)     -LWUP_AERO(:,1,2))     -(-LWDN_AERO(:,1,1)     -LWUP_AERO(:,1,1))
     
    913939     PSOLSWAD0AERO(:) = 0.0
    914940     PTOPSWAD0AERO(:) = 0.0
    915 
     941     IF(ok_volcan) THEN
     942        PSWADAERO(:,:)  = 0.0 !--NL
     943     ENDIF
     944     
    916945! indirect anthropogenic forcing
    917946     PSOLSWAIAERO(:) = 0.0
     
    933962     PSOLLWAD0AERO(:) = 0.0
    934963     PTOPLWAD0AERO(:) = 0.0
    935 
     964     IF(ok_volcan) THEN
     965        PLWADAERO(:,:)  = 0.0 !--NL
     966     ENDIF
     967     
    936968! LW indirect anthropogenic forcing
    937969     PSOLLWAIAERO(:) = 0.0
  • LMDZ6/branches/Ocean_skin/libf/phylmd/rrtm/suinit.F90

    r1990 r3605  
    126126ALLOCATE(VDELA  (MAX(JPMXLE,NFLEVG)))
    127127ALLOCATE(VDELB  (MAX(JPMXLE,NFLEVG)))
     128VDELB = 0  !ym missing init
    128129ALLOCATE( VC      (NFLEVG) )
     130VC = 0    !ym missing init
    129131ALLOCATE( NLOEN   (NPROMA) )
    130132ALLOCATE( NLOENG   (NPROMA) )
Note: See TracChangeset for help on using the changeset viewer.