Changeset 1667 for LMDZ5/trunk


Ignore:
Timestamp:
Oct 11, 2012, 12:42:12 PM (12 years ago)
Author:
idelkadi
Message:

Reorganisation des differents cas d'utilisation des aerosols avec les flag ok_ade, ok_aie, flag_aerosol

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

Legend:

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

    r1638 r1667  
    287287!Config Help = Used in physiq.F
    288288!
     289! - flag_aerosol=0 => no aerosol
    289290! - flag_aerosol=1 => so4 only (defaut)
    290291! - flag_aerosol=2 => bc  only
     
    17661767! il n'est utilisable que lors du couplage avec le SO4 seul
    17671768    IF (ok_ade .OR. ok_aie) THEN
     1769       IF ( flag_aerosol .EQ. 0 ) THEN
     1770          CALL abort_gcm('conf_phys','flag_aerosol=0 not compatible avec ok_ade ou ok_aie=.TRUE.',1)
     1771       END IF
    17681772       IF ( .NOT. new_aod .AND.  flag_aerosol .NE. 1) THEN
    17691773          CALL abort_gcm('conf_phys','new_aod=.FALSE. not compatible avec flag_aerosol=1',1)
  • LMDZ5/trunk/libf/phylmd/physiq.F

    r1641 r1667  
    12471247      LOGICAL, SAVE :: mskocean_beta
    12481248c$OMP THREADPRIVATE(mskocean_beta)
    1249       REAL, dimension(klon, klev) :: beta       ! facteur sur cldtaurad et cldemirad pour evaluer les retros liees aux CRF
    1250       REAL, dimension(klon, klev) :: cldtaurad  ! epaisseur optique pour radlwsw,COSP
    1251       REAL, dimension(klon, klev) :: cldemirad  ! emissivite pour radlwsw,COSP
     1249      REAL, dimension(klon, klev) :: beta         ! facteur sur cldtaurad et cldemirad pour evaluer les retros liees aux CRF
     1250      REAL, dimension(klon, klev) :: cldtaurad    ! epaisseur optique pour radlwsw,COSP
     1251      REAL, dimension(klon, klev) :: cldtaupirad  ! epaisseur optique pour radlwsw,COSP cas pre-industrial
     1252      REAL, dimension(klon, klev) :: cldemirad    ! emissivite pour radlwsw,COSP
    12521253      INTEGER :: nbtr_tmp ! Number of tracer inside concvl
    12531254      REAL, dimension(klon,klev) :: sh_in ! Specific humidity entering in phytrac
     
    30993100cjq - introduce the aerosol direct and first indirect radiative forcings
    31003101cjq - Johannes Quaas, 27/11/2003 (quaas@lmd.jussieu.fr)
    3101       IF (ok_ade.OR.ok_aie) THEN
     3102      IF (flag_aerosol .gt. 0) THEN
    31023103         IF (.NOT. aerosol_couple)
    31033104     &        CALL readaerosol_optic(
     
    33843385cIM betaCRF
    33853386c
    3386       cldtaurad = cldtau
    3387       cldemirad = cldemi
     3387      cldtaurad   = cldtau
     3388      cldtaupirad = cldtaupi
     3389      cldemirad   = cldemi
    33883390c
    33893391      if(lon1_beta.EQ.-180..AND.lon2_beta.EQ.180..AND.
     
    34023404         beta(i,k) = beta(i,k) * pctsrf(i,is_oce)
    34033405        endif
    3404         cldtaurad(i,k) = cldtau(i,k) * beta(i,k)
    3405         cldemirad(i,k) = cldemi(i,k) * beta(i,k)
     3406        cldtaurad(i,k)   = cldtau(i,k) * beta(i,k)
     3407        cldtaupirad(i,k) = cldtaupi(i,k) * beta(i,k)
     3408        cldemirad(i,k)   = cldemi(i,k) * beta(i,k)
    34063409       ENDDO
    34073410       ENDDO
     
    34243427          beta(i,k) = beta(i,k) * pctsrf(i,is_oce)
    34253428         endif
    3426         cldtaurad(i,k) = cldtau(i,k) * beta(i,k)
    3427         cldemirad(i,k) = cldemi(i,k) * beta(i,k)
     3429        cldtaurad(i,k)   = cldtau(i,k) * beta(i,k)
     3430        cldtaupirad(i,k) = cldtaupi(i,k) * beta(i,k)
     3431        cldemirad(i,k)   = cldemi(i,k) * beta(i,k)
    34283432        endif
    34293433c
     
    34743478     s        topsw_aero, topsw0_aero,
    34753479     s        solsw_aero, solsw0_aero,
    3476      e        cldtaupi,
     3480     e        cldtaupirad,
    34773481     s        topswai_aero, solswai_aero)
    34783482           
     
    34973501     e        t_seri,q_seri,wo,
    34983502     e        cldfra, cldemirad, cldtaurad,
    3499      e        ok_ade, ok_aie,
     3503     e        ok_ade, ok_aie, flag_aerosol,
    35003504     e        tau_aero, piz_aero, cg_aero,
    3501      e        cldtaupi,new_aod,
     3505     e        cldtaupirad,new_aod,
    35023506     e        zqsat, flwc, fiwc,
    35033507     s        heat,heat0,cool,cool0,radsol,albpla,
     
    35383542     e        t_seri,q_seri,wo,
    35393543     e        cldfra, cldemi, cldtau,
    3540      e        ok_ade, ok_aie,
     3544     e        ok_ade, ok_aie, flag_aerosol,
    35413545     e        tau_aero, piz_aero, cg_aero,
    35423546     e        cldtaupi,new_aod,
  • LMDZ5/trunk/libf/phylmd/radlwsw.F90

    r1565 r1667  
    1010   t,q,wo,&
    1111   cldfra, cldemi, cldtaupd,&
    12    ok_ade, ok_aie,&
     12   ok_ade, ok_aie, flag_aerosol,&
    1313   tau_aero, piz_aero, cg_aero,&
    1414   cldtaupi, new_aod, &
     
    5656  ! ok_ade---input-L- apply the Aerosol Direct Effect or not?
    5757  ! ok_aie---input-L- apply the Aerosol Indirect Effect or not?
     58  ! flag_aerosol-input-I- aerosol flag from 0 to 6
    5859  ! tau_ae, piz_ae, cg_ae-input-R- aerosol optical properties (calculated in aeropt.F)
    5960  ! cldtaupi-input-R- epaisseur optique des nuages dans le visible
     
    119120
    120121  LOGICAL, INTENT(in)  :: ok_ade, ok_aie                                 ! switches whether to use aerosol direct (indirect) effects or not
     122  INTEGER, INTENT(in)  :: flag_aerosol                                   ! takes value 0 (no aerosol) or 1 to 6 (aerosols)
    121123  REAL,    INTENT(in)  :: cldfra(KLON,KLEV), cldemi(KLON,KLEV), cldtaupd(KLON,KLEV)
    122124  REAL,    INTENT(in)  :: tau_aero(KLON,KLEV,9,2)                        ! aerosol optical properties (see aeropt.F)
     
    354356               zalbpla,ztopsw,zsolsw,ztopsw0,zsolsw0,&
    355357               ZFSUP,ZFSDN,ZFSUP0,ZFSDN0,&
    356                tau_aero(:,:,5,:), piz_aero(:,:,5,:), cg_aero(:,:,5,:),&
     358               tauaero(:,:,5,:), pizaero(:,:,5,:), cgaero(:,:,5,:),&
    357359               PTAUA, POMEGAA,&
    358360               ztopswadaero,zsolswadaero,&
    359361               ztopswaiaero,zsolswaiaero,&
    360                ok_ade, ok_aie)
     362               ok_ade, ok_aie, flag_aerosol)
    361363         
    362364       ELSE ! new_aod=T         
     
    377379               zsolsw_aero,zsolsw0_aero,&
    378380               ztopswcf_aero,zsolswcf_aero, &
    379                ok_ade, ok_aie)
    380          
     381               ok_ade, ok_aie, flag_aerosol)
    381382       ENDIF
    382383
  • LMDZ5/trunk/libf/phylmd/sw_aeroAR4.F90

    r1655 r1667  
    1818     PSOLSWAERO,PSOLSW0AERO,&
    1919     PTOPSWCFAERO,PSOLSWCFAERO,&
    20      ok_ade, ok_aie )
     20     ok_ade, ok_aie, flag_aerosol )
    2121
    2222  USE dimphy
     
    5656  !     --------------
    5757  !        ORIGINAL : 89-07-14
    58   !        95-01-01   J.-J. MORCRETTE  Direct/Diffuse Albedo
    59   !        03-11-27   J. QUAAS Introduce aerosol forcings (based on BOUCHER)
    60   !        09-04      A. COZIC - C.DEANDREIS Indroduce NAT/BC/POM/DUST/SS aerosol forcing
     58  !        1995-01-01  J.-J. MORCRETTE  Direct/Diffuse Albedo
     59  !        2003-11-27  J. QUAAS Introduce aerosol forcings (based on BOUCHER)
     60  !        2009-04     A. COZIC - C.DEANDREIS Indroduce NAT/BC/POM/DUST/SS aerosol forcing
     61  !        2012-09     O. BOUCHER - reorganise aerosol cases with ok_ade, ok_aie, flag_aerosol
    6162  !     ------------------------------------------------------------------
    6263  !
     
    8283
    8384  REAL(KIND=8) PCLDSW(KDLON,KFLEV)    ! CLOUD FRACTION
    84   REAL(KIND=8) PTAU(KDLON,2,KFLEV)    ! CLOUD OPTICAL THICKNESS
     85  REAL(KIND=8) PTAU(KDLON,2,KFLEV)    ! CLOUD OPTICAL THICKNESS (pre-industrial value)
    8586  REAL(KIND=8) PCG(KDLON,2,KFLEV)     ! ASYMETRY FACTOR
    8687  REAL(KIND=8) POMEGA(KDLON,2,KFLEV)  ! SINGLE SCATTERING ALBEDO
     
    132133  !$OMP THREADPRIVATE(initialized)
    133134
    134   !jq-Introduced for aerosol forcings
     135  !jq-local flag introduced for aerosol forcings
    135136  REAL(KIND=8), SAVE :: flag_aer
    136137  !$OMP THREADPRIVATE(flag_aer)
    137138
    138139  LOGICAL ok_ade, ok_aie    ! use aerosol forcings or not?
     140  INTEGER flag_aerosol      ! global flag for aerosol 0 (no aerosol) or 1-5 (aerosols)
    139141  REAL(KIND=8) tauaero(kdlon,kflev,9,2)  ! aerosol optical properties
    140142  REAL(KIND=8) pizaero(kdlon,kflev,9,2)  ! (see aeropt.F)
    141143  REAL(KIND=8) cgaero(kdlon,kflev,9,2)   ! -"-
    142   REAL(KIND=8) PTAUA(KDLON,2,KFLEV)    ! CLOUD OPTICAL THICKNESS (pre-industrial value)
     144  REAL(KIND=8) PTAUA(KDLON,2,KFLEV)    ! CLOUD OPTICAL THICKNESS (present-day value)
    143145  REAL(KIND=8) POMEGAA(KDLON,2,KFLEV)  ! SINGLE SCATTERING ALBEDO
    144146  REAL(KIND=8) PTOPSWADAERO(KDLON)     ! SHORTWAVE FLUX AT T.O.A.(+AEROSOL DIR)
    145147  REAL(KIND=8) PSOLSWADAERO(KDLON)     ! SHORTWAVE FLUX AT SURFACE(+AEROSOL DIR)
    146   REAL(KIND=8) PTOPSWAD0AERO(KDLON)     ! SHORTWAVE FLUX AT T.O.A.(+AEROSOL DIR)
    147   REAL(KIND=8) PSOLSWAD0AERO(KDLON)     ! SHORTWAVE FLUX AT SURFACE(+AEROSOL DIR)
     148  REAL(KIND=8) PTOPSWAD0AERO(KDLON)    ! SHORTWAVE FLUX AT T.O.A.(+AEROSOL DIR)
     149  REAL(KIND=8) PSOLSWAD0AERO(KDLON)    ! SHORTWAVE FLUX AT SURFACE(+AEROSOL DIR)
    148150  REAL(KIND=8) PTOPSWAIAERO(KDLON)     ! SHORTWAVE FLUX AT T.O.A.(+AEROSOL IND)
    149151  REAL(KIND=8) PSOLSWAIAERO(KDLON)     ! SHORTWAVE FLUX AT SURFACE(+AEROSOL IND)
    150   REAL(KIND=8) PTOPSWAERO(KDLON,9)      ! SW TOA AS DRF nat & ant
    151   REAL(KIND=8) PTOPSW0AERO(KDLON,9)      ! SW SRF AS DRF nat & ant
    152   REAL(KIND=8) PSOLSWAERO(KDLON,9)      ! SW TOA CS DRF nat & ant
    153   REAL(KIND=8) PSOLSW0AERO(KDLON,9)      ! SW SRF CS DRF nat & ant
     152  REAL(KIND=8) PTOPSWAERO(KDLON,9)    ! SW TOA AS DRF nat & ant
     153  REAL(KIND=8) PTOPSW0AERO(KDLON,9)    ! SW SRF AS DRF nat & ant
     154  REAL(KIND=8) PSOLSWAERO(KDLON,9)    ! SW TOA CS DRF nat & ant
     155  REAL(KIND=8) PSOLSW0AERO(KDLON,9)    ! SW SRF CS DRF nat & ant
    154156  REAL(KIND=8) PTOPSWCFAERO(KDLON,3)   !  SW TOA AS cloudRF nat & ant
    155157  REAL(KIND=8) PSOLSWCFAERO(KDLON,3)   !  SW SRF AS cloudRF nat & ant
     
    179181
    180182! Key to define the aerosol effect acting on climate
    181 ! 0: aerosol feedback active according to ok_ade, ok_aie  DEFAULT
    182 ! 1: no feedback , zero aerosol fluxes are used for climate, diagnostics according to ok_ade_ok_aie
    183 ! 2: feedback according to total aerosol direct effect used for climate, diagnostics according to ok_ade, ok_aie
    184 ! 3: feedback according to natural aerosol direct effect used for climate, diagnostics according to ok_ade_ok_aie
    185 
    186   INTEGER,SAVE :: AEROSOLFEEDBACK_ACTIVE = 0
     183! OB: AEROSOLFEEDBACK_ACTIVE is now a LOGICAL
     184! TRUE: fluxes use natural and/or anthropogenic aerosols according to ok_ade and ok_aie, DEFAULT
     185! FALSE: fluxes use no aerosols (case 1)
     186
     187  LOGICAL,SAVE :: AEROSOLFEEDBACK_ACTIVE = .TRUE.
    187188!$OMP THREADPRIVATE(AEROSOLFEEDBACK_ACTIVE) 
    188189
    189190      CHARACTER (LEN=20) :: modname='sw_aeroAR4'
    190191      CHARACTER (LEN=80) :: abort_message
    191 
    192   IF ((.not. ok_ade) .and. (AEROSOLFEEDBACK_ACTIVE .ge. 2)) THEN
    193      abort_message ='Error: direct effect is not activated but assumed to be active - see sw_aeroAR4.F90'
    194      CALL abort_gcm (modname,abort_message,1)
    195   ENDIF
    196   AEROSOLFEEDBACK_ACTIVE=MIN(MAX(AEROSOLFEEDBACK_ACTIVE,0),3)
    197   IF  (AEROSOLFEEDBACK_ACTIVE .gt. 3) THEN
    198      abort_message ='Error: AEROSOLFEEDBACK_ACTIVE options go only until 3'
    199      CALL abort_gcm (modname,abort_message,1)
    200   ENDIF
    201192
    202193  IF(.NOT.initialized) THEN
     
    209200     ALLOCATE(ZFSUPAI_AERO(KDLON,KFLEV+1))
    210201     ALLOCATE(ZFSDNAI_AERO(KDLON,KFLEV+1))
    211      ALLOCATE(ZFSUP_AERO (KDLON,KFLEV+1,9))
    212      ALLOCATE(ZFSDN_AERO (KDLON,KFLEV+1,9))
    213      ALLOCATE(ZFSUP0_AERO(KDLON,KFLEV+1,9))
    214      ALLOCATE(ZFSDN0_AERO(KDLON,KFLEV+1,9))
     202!-OB decrease size of these arrays to what is needed
     203!                | direct effect
     204!ind effect      | no aerosol   natural  total
     205!natural (PTAU)  |   1            3       2     --ZFSUP/ZFSDN
     206!total (PTAUA)   |                5       4     --ZFSUP/ZFSDN
     207!no cloud        |   1            3       2     --ZFSUP0/ZFSDN0
     208! so we need which case when ?
     209! ok_ade and ok_aie = 4-5, 4-2 and 2
     210! ok_ade and not ok_aie = 2-3 and 2
     211! not ok_ade and ok_aie = 5-3 and 5
     212! not ok_ade and not ok_aie = 3
     213! therefore the cases have the folliwng switches
     214! 3 = not ok_ade or not ok_aie
     215! 4 = ok_ade and ok_aie
     216! 2 = ok_ade
     217! 5 = ok_aie
     218     ALLOCATE(ZFSUP_AERO (KDLON,KFLEV+1,5))
     219     ALLOCATE(ZFSDN_AERO (KDLON,KFLEV+1,5))
     220     ALLOCATE(ZFSUP0_AERO(KDLON,KFLEV+1,3))
     221     ALLOCATE(ZFSDN0_AERO(KDLON,KFLEV+1,3))
     222! end OB modif
    215223     ZFSUPAD_AERO(:,:)=0.
    216224     ZFSDNAD_AERO(:,:)=0.
     
    226234
    227235  IF (appel1er) THEN
    228      WRITE(lunout,*) 'SW calling frequency : ', swpas
     236     WRITE(lunout,*)'SW calling frequency : ', swpas
    229237     WRITE(lunout,*) "   In general, it should be 1"
    230238     appel1er = .FALSE.
     
    241249     ENDDO
    242250
    243 ! clear sky is either computed IF no direct effect is asked for, or for extended diag)
    244      IF (swaero_diag .or. .not. ok_ade ) THEN   
     251! clear sky with no aerosols at all is computed IF ACTIVEFEEDBACK_ACTIVE is false or for extended diag
     252     IF ( swaero_diag .or. .not. AEROSOLFEEDBACK_ACTIVE .OR. flag_aerosol .EQ. 0 ) THEN   
    245253
    246254     ! clear-sky: zero aerosol effect
     
    268276        ENDDO
    269277     ENDDO
    270      ENDIF
    271 
    272 ! cloudy sky is either computed IF no indirect effect is asked for, or for extended diag)
    273      IF (swaero_diag .or. .not. ok_aie ) THEN   
     278     ENDIF ! swaero_diag .or. .not. AEROSOLFEEDBACK_ACTIVE
     279
     280! cloudy sky with no aerosols at all is either computed IF no indirect effect is asked for, or for extended diag
     281     IF ( swaero_diag .or. .not. AEROSOLFEEDBACK_ACTIVE .OR. flag_aerosol .EQ. 0 ) THEN   
    274282     ! cloudy-sky: zero aerosol effect
    275283     flag_aer=0.0
     
    297305        ENDDO
    298306     ENDDO
    299      ENDIF
    300 
     307     ENDIF ! swaero_diag .or. .not. AEROSOLFEEDBACK_ACTIVE
     308
     309     IF (flag_aerosol .GT. 0 ) THEN
     310
     311     IF (ok_ade.and.swaero_diag .or. .not. ok_ade) THEN
     312
     313        ! clear sky direct effect natural aerosol
     314        ! CAS AER (3)
     315        flag_aer=1.0
     316        CALL SWU_LMDAR4(PSCT,ZCLDSW0,PPMB,PPSOL,&
     317             PRMU0,PFRAC,PTAVE,PWV,&
     318             ZAKI,ZCLD,ZCLEAR,ZDSIG,ZFACT,ZRMU,ZSEC,ZUD)
     319        INU = 1
     320        CALL SW1S_LMDAR4(INU, PAER, flag_aer,&
     321             tauaero(:,:,3,:), pizaero(:,:,3,:), cgaero(:,:,3,:),&
     322             PALBD, PALBP, PCG, ZCLD, ZCLEAR, PCLDSW,&
     323             ZDSIG, POMEGA, ZOZ, ZRMU, ZSEC, PTAU, ZUD,&
     324             ZFD, ZFU)
     325        INU = 2
     326        CALL SW2S_LMDAR4(INU, PAER, flag_aer,&
     327             tauaero(:,:,3,:), pizaero(:,:,3,:), cgaero(:,:,3,:),&
     328             ZAKI, PALBD, PALBP, PCG, ZCLD, ZCLEAR, PCLDSW,&
     329             ZDSIG, POMEGA, ZOZ, ZRMU, ZSEC, PTAU, ZUD,&
     330             PWV, PQS,&
     331             ZFDOWN, ZFUP)
     332
     333        DO JK = 1 , KFLEV+1
     334           DO JL = 1, KDLON
     335              ZFSUP0_AERO(JL,JK,3) = (ZFUP(JL,JK)   + ZFU(JL,JK)) * ZFACT(JL)
     336              ZFSDN0_AERO(JL,JK,3) = (ZFDOWN(JL,JK) + ZFD(JL,JK)) * ZFACT(JL)
     337           ENDDO
     338        ENDDO
     339     ENDIF !--end not swaero_diag or not ok_ade
    301340
    302341     IF (ok_ade) THEN
    303342
    304         ! clear sky (Anne Cozic 03/07/2007) direct effect of total aerosol
     343        ! clear sky direct effect of total aerosol
    305344        ! CAS AER (2)
    306345        flag_aer=1.0
     
    329368        ENDDO
    330369
    331 ! cloudy sky is either computed IF no indirect effect is asked for, or for extended diag)
    332         IF (swaero_diag .or. .not. ok_aie) THEN 
    333         ! cloudy-sky aerosol direct effect of total aerosol
     370        ! cloudy-sky with natural aerosols for indirect effect
     371        ! but total aerosols for direct effect
     372        ! PTAU
     373        ! CAS AER (2)
    334374        flag_aer=1.0
    335375        CALL SWU_LMDAR4(PSCT,PCLDSW,PPMB,PPSOL,&
     
    356396           ENDDO
    357397        ENDDO
    358         ENDIF
    359 
    360 ! natural aeroosl clear sky is  computed  for extended diag)
    361         IF ( swaero_diag ) THEN           
    362         ! clear sky direct effect natural aerosol
    363         flag_aer=1.0
    364         CALL SWU_LMDAR4(PSCT,ZCLDSW0,PPMB,PPSOL,&
    365              PRMU0,PFRAC,PTAVE,PWV,&
    366              ZAKI,ZCLD,ZCLEAR,ZDSIG,ZFACT,ZRMU,ZSEC,ZUD)
    367         INU = 1
    368         CALL SW1S_LMDAR4(INU, PAER, flag_aer,&
    369              tauaero(:,:,3,:), pizaero(:,:,3,:), cgaero(:,:,3,:),&
    370              PALBD, PALBP, PCG, ZCLD, ZCLEAR, PCLDSW,&
    371              ZDSIG, POMEGA, ZOZ, ZRMU, ZSEC, PTAU, ZUD,&
    372              ZFD, ZFU)
    373         INU = 2
    374         CALL SW2S_LMDAR4(INU, PAER, flag_aer,&
    375              tauaero(:,:,3,:), pizaero(:,:,3,:), cgaero(:,:,3,:),&
    376              ZAKI, PALBD, PALBP, PCG, ZCLD, ZCLEAR, PCLDSW,&
    377              ZDSIG, POMEGA, ZOZ, ZRMU, ZSEC, PTAU, ZUD,&
    378              PWV, PQS,&
    379              ZFDOWN, ZFUP)
    380 
    381         DO JK = 1 , KFLEV+1
    382            DO JL = 1, KDLON
    383               ZFSUP0_AERO(JL,JK,3) = (ZFUP(JL,JK)   + ZFU(JL,JK)) * ZFACT(JL)
    384               ZFSDN0_AERO(JL,JK,3) = (ZFDOWN(JL,JK) + ZFD(JL,JK)) * ZFACT(JL)
    385            ENDDO
    386         ENDDO
    387         ENDIF
    388 
    389 ! cloud sky natural is for extended diagnostics
    390         IF ( swaero_diag ) THEN
     398
     399     ENDIF !-end ok_ade
     400
     401     IF ( .not. ok_ade .or. .not. ok_aie ) THEN
     402
     403        ! cloudy-sky with natural aerosols for indirect effect
     404        ! and natural aerosols for direct effect
     405        ! PTAU
     406        ! CAS AER (3)
    391407        ! cloudy-sky direct effect natural aerosol
    392408        flag_aer=1.0
     
    414430           ENDDO
    415431        ENDDO
    416         ENDIF
    417 
    418      ENDIF ! ok_ade
    419 
    420 ! cloudy sky needs to be computed in all cases IF ok_aie is activated
    421      IF (ok_aie) THEN
    422         !jq   cloudy-sky + aerosol direct + aerosol indirect of total aerosol
     432
     433     ENDIF  !--true/false or false/true
     434
     435     IF (ok_ade .and. ok_aie) THEN
     436
     437        ! cloudy-sky with total aerosols for indirect effect
     438        ! and total aerosols for direct effect
     439        ! PTAUA
     440        ! CAS AER (2)
    423441        flag_aer=1.0
    424442        CALL SWU_LMDAR4(PSCT,PCLDSW,PPMB,PPSOL,&
     
    438456             PWV, PQS,&
    439457             ZFDOWN, ZFUP)
     458
    440459        DO JK = 1 , KFLEV+1
    441460           DO JL = 1, KDLON
     
    444463           ENDDO
    445464        ENDDO
     465 
     466      ENDIF ! ok_ade .and. ok_aie
     467
     468     IF (ok_aie) THEN
     469        ! cloudy-sky with total aerosols for indirect effect
     470        ! and natural aerosols for direct effect
     471        ! PTAUA
     472        ! CAS AER (3)
     473        flag_aer=1.0
     474        CALL SWU_LMDAR4(PSCT,PCLDSW,PPMB,PPSOL,&
     475             PRMU0,PFRAC,PTAVE,PWV,&
     476             ZAKI,ZCLD,ZCLEAR,ZDSIG,ZFACT,ZRMU,ZSEC,ZUD)
     477        INU = 1
     478        CALL SW1S_LMDAR4(INU, PAER, flag_aer,&
     479             tauaero(:,:,3,:), pizaero(:,:,3,:), cgaero(:,:,3,:),&
     480             PALBD, PALBP, PCG, ZCLD, ZCLEAR, PCLDSW,&
     481             ZDSIG, POMEGAA, ZOZ, ZRMU, ZSEC, PTAUA, ZUD,&
     482             ZFD, ZFU)
     483        INU = 2
     484        CALL SW2S_LMDAR4(INU, PAER, flag_aer,&
     485             tauaero(:,:,3,:), pizaero(:,:,3,:), cgaero(:,:,3,:),&
     486             ZAKI, PALBD, PALBP, PCG, ZCLD, ZCLEAR, PCLDSW,&
     487             ZDSIG, POMEGAA, ZOZ, ZRMU, ZSEC, PTAUA, ZUD,&
     488             PWV, PQS,&
     489             ZFDOWN, ZFUP)
     490 
     491        DO JK = 1 , KFLEV+1
     492           DO JL = 1, KDLON
     493              ZFSUP_AERO(JL,JK,5) = (ZFUP(JL,JK)   + ZFU(JL,JK)) * ZFACT(JL)
     494              ZFSDN_AERO(JL,JK,5) = (ZFDOWN(JL,JK) + ZFD(JL,JK)) * ZFACT(JL)
     495           ENDDO
     496        ENDDO
     497
    446498     ENDIF ! ok_aie     
    447499
     500     ENDIF !--if flag_aerosol GT 0
     501
    448502     itapsw = 0
    449503  ENDIF
    450504  itapsw = itapsw + 1
    451505
    452   IF  ( AEROSOLFEEDBACK_ACTIVE .eq. 0) THEN
     506  IF  ( AEROSOLFEEDBACK_ACTIVE .AND. flag_aerosol .GT. 0 ) THEN
    453507  IF ( ok_ade .and. ok_aie  ) THEN
    454508    ZFSUP(:,:) =    ZFSUP_AERO(:,:,4)
     
    457511    ZFSDN0(:,:) =   ZFSDN0_AERO(:,:,2)
    458512  ENDIF
     513
    459514  IF ( ok_ade .and. (.not. ok_aie) )  THEN
    460515    ZFSUP(:,:) =    ZFSUP_AERO(:,:,2)
     
    465520
    466521  IF ( (.not. ok_ade) .and. ok_aie  )  THEN
    467     print*,'Warning: indirect effect in cloudy regions includes direct aerosol effect'
    468     ZFSUP(:,:) =    ZFSUP_AERO(:,:,4)
    469     ZFSDN(:,:) =    ZFSDN_AERO(:,:,4)
    470     ZFSUP0(:,:) =   ZFSUP0_AERO(:,:,1)
    471     ZFSDN0(:,:) =   ZFSDN0_AERO(:,:,1)
    472   ENDIF
     522    ZFSUP(:,:) =    ZFSUP_AERO(:,:,5)
     523    ZFSDN(:,:) =    ZFSDN_AERO(:,:,5)
     524    ZFSUP0(:,:) =   ZFSUP0_AERO(:,:,3)
     525    ZFSDN0(:,:) =   ZFSDN0_AERO(:,:,3)
     526  ENDIF
     527
    473528  IF ((.not. ok_ade) .and. (.not. ok_aie)) THEN
     529    ZFSUP(:,:) =    ZFSUP_AERO(:,:,3)
     530    ZFSDN(:,:) =    ZFSDN_AERO(:,:,3)
     531    ZFSUP0(:,:) =   ZFSUP0_AERO(:,:,3)
     532    ZFSDN0(:,:) =   ZFSDN0_AERO(:,:,3)
     533  ENDIF
     534
     535! MS the following allows to compute the forcing diagostics without
     536! letting the aerosol forcing act on the meteorology
     537! SEE logic above
     538  ELSE
    474539    ZFSUP(:,:) =    ZFSUP_AERO(:,:,1)
    475540    ZFSDN(:,:) =    ZFSDN_AERO(:,:,1)
     
    478543  ENDIF
    479544
    480 ! MS the following allows to compute the forcing diagostics without
    481 ! letting the aerosol forcing act on the meteorology
    482 ! SEE logic above
    483   ELSEIF  ( AEROSOLFEEDBACK_ACTIVE .gt. 0) THEN
    484     ZFSUP(:,:) =    ZFSUP_AERO(:,:,AEROSOLFEEDBACK_ACTIVE)
    485     ZFSDN(:,:) =    ZFSDN_AERO(:,:,AEROSOLFEEDBACK_ACTIVE)
    486     ZFSUP0(:,:) =   ZFSUP0_AERO(:,:,AEROSOLFEEDBACK_ACTIVE)
    487     ZFSDN0(:,:) =   ZFSDN0_AERO(:,:,AEROSOLFEEDBACK_ACTIVE)
    488   ENDIF
    489  
    490 
     545! Now computes heating rates
    491546  DO k = 1, KFLEV
    492547     kpl1 = k+1
     
    511566     PTOPSW(i) = ZFSDN(i,KFLEV+1) - ZFSUP(i,KFLEV+1)
    512567
    513 
    514568! net anthropogenic forcing direct and 1st indirect effect diagnostics
    515569! requires a natural aerosol field read and used
    516570! Difference of net fluxes from double call to radiation
    517571
    518 
    519572IF (ok_ade) THEN
    520573
    521574! indices 1: natural; 2 anthropogenic
     575
    522576! TOA/SRF all sky natural forcing
    523577     PSOLSWAERO(i,1) = (ZFSDN_AERO(i,1,3) - ZFSUP_AERO(i,1,3))-(ZFSDN_AERO(i,1,1) - ZFSUP_AERO(i,1,1))
    524578     PTOPSWAERO(i,1) = (ZFSDN_AERO(i,KFLEV+1,3) - ZFSUP_AERO(i,KFLEV+1,3))- (ZFSDN_AERO(i,KFLEV+1,1) - ZFSUP_AERO(i,KFLEV+1,1))
    525579
     580! TOA/SRF clear sky natural forcing
     581     PSOLSW0AERO(i,1) = (ZFSDN0_AERO(i,1,3) - ZFSUP0_AERO(i,1,3))-(ZFSDN0_AERO(i,1,1) - ZFSUP0_AERO(i,1,1))
     582     PTOPSW0AERO(i,1) = (ZFSDN0_AERO(i,KFLEV+1,3) - ZFSUP0_AERO(i,KFLEV+1,3))-(ZFSDN0_AERO(i,KFLEV+1,1) - ZFSUP0_AERO(i,KFLEV+1,1))
     583
     584   IF (ok_aie) THEN
     585
     586! TOA/SRF all sky anthropogenic forcing
     587     PSOLSWAERO(i,2) = (ZFSDN_AERO(i,1,4) - ZFSUP_AERO(i,1,4))-(ZFSDN_AERO(i,1,5) - ZFSUP_AERO(i,1,5))
     588     PTOPSWAERO(i,2) = (ZFSDN_AERO(i,KFLEV+1,4) - ZFSUP_AERO(i,KFLEV+1,4))- (ZFSDN_AERO(i,KFLEV+1,5) - ZFSUP_AERO(i,KFLEV+1,5))
     589
     590   ELSE
     591
    526592! TOA/SRF all sky anthropogenic forcing
    527593     PSOLSWAERO(i,2) = (ZFSDN_AERO(i,1,2) - ZFSUP_AERO(i,1,2))-(ZFSDN_AERO(i,1,3) - ZFSUP_AERO(i,1,3))
    528594     PTOPSWAERO(i,2) = (ZFSDN_AERO(i,KFLEV+1,2) - ZFSUP_AERO(i,KFLEV+1,2))- (ZFSDN_AERO(i,KFLEV+1,3) - ZFSUP_AERO(i,KFLEV+1,3))
    529595
    530 ! TOA/SRF clear sky natural forcing
    531      PSOLSW0AERO(i,1) = (ZFSDN0_AERO(i,1,3) - ZFSUP0_AERO(i,1,3))-(ZFSDN0_AERO(i,1,1) - ZFSUP0_AERO(i,1,1))
    532      PTOPSW0AERO(i,1) = (ZFSDN0_AERO(i,KFLEV+1,3) - ZFSUP0_AERO(i,KFLEV+1,3))-(ZFSDN0_AERO(i,KFLEV+1,1) - ZFSUP0_AERO(i,KFLEV+1,1))
     596   ENDIF
    533597
    534598! TOA/SRF clear sky anthropogenic forcing
     
    536600     PTOPSW0AERO(i,2) = (ZFSDN0_AERO(i,KFLEV+1,2) - ZFSUP0_AERO(i,KFLEV+1,2))-(ZFSDN0_AERO(i,KFLEV+1,3) - ZFSUP0_AERO(i,KFLEV+1,3))
    537601
     602! direct anthropogenic forcing , as in old LMDzT, however differences of net fluxes
     603     PSOLSWADAERO(i) = PSOLSWAERO(i,2)
     604     PTOPSWADAERO(i) = PTOPSWAERO(i,2)
     605     PSOLSWAD0AERO(i) = PSOLSW0AERO(i,2)
     606     PTOPSWAD0AERO(i) = PTOPSW0AERO(i,2)
     607
     608! OB: these diagnostics may not always work but who need them
    538609! Cloud forcing indices 1: natural; 2 anthropogenic; 3: zero aerosol direct effect
    539610! Instantaneously computed cloudy sky direct aerosol effect, cloud forcing due to aerosols above clouds
     
    552623     PTOPSWCFAERO(i,3) = (ZFSDN_AERO(i,KFLEV+1,1) - ZFSUP_AERO(i,KFLEV+1,1))- (ZFSDN0_AERO(i,KFLEV+1,1) - ZFSUP0_AERO(i,KFLEV+1,1))
    553624
    554 ! direct anthropogenic forcing , as in old LMDzT, however differences of net fluxes
    555      PSOLSWADAERO(i) = PSOLSWAERO(i,2)
    556      PTOPSWADAERO(i) = PTOPSWAERO(i,2)
    557      PSOLSWAD0AERO(i) = PSOLSW0AERO(i,2)
    558      PTOPSWAD0AERO(i) = PTOPSW0AERO(i,2)
    559 
    560625ENDIF
    561626
    562 
    563627IF (ok_aie) THEN
     628   IF (ok_ade) THEN
    564629     PSOLSWAIAERO(i) = (ZFSDN_AERO(i,1,4) - ZFSUP_AERO(i,1,4))-(ZFSDN_AERO(i,1,2) - ZFSUP_AERO(i,1,2))
    565630     PTOPSWAIAERO(i) = (ZFSDN_AERO(i,KFLEV+1,4) - ZFSUP_AERO(i,KFLEV+1,4))-(ZFSDN_AERO(i,KFLEV+1,2) - ZFSUP_AERO(i,KFLEV+1,2))
     631   ELSE
     632     PSOLSWAIAERO(i) = (ZFSDN_AERO(i,1,5) - ZFSUP_AERO(i,1,5))-(ZFSDN_AERO(i,1,3) - ZFSUP_AERO(i,1,3))
     633     PTOPSWAIAERO(i) = (ZFSDN_AERO(i,KFLEV+1,5) - ZFSUP_AERO(i,KFLEV+1,5))-(ZFSDN_AERO(i,KFLEV+1,3) - ZFSUP_AERO(i,KFLEV+1,3))
     634   ENDIF
    566635ENDIF
    567636
    568   ENDDO
     637ENDDO
     638
    569639END SUBROUTINE SW_AEROAR4
Note: See TracChangeset for help on using the changeset viewer.