--- trunk/libf/phylmd/Radlwsw/sw.f90 2012/07/26 14:37:37 62 +++ trunk/phylmd/Radlwsw/sw.f 2014/12/18 17:30:24 118 @@ -10,30 +10,29 @@ ZFSDN0, tauae, pizae, cgae, PTAUA, POMEGAA, PTOPSWAD, PSOLSWAD, & PTOPSWAI, PSOLSWAI, ok_ade, ok_aie) - ! PURPOSE. - ! THIS ROUTINE COMPUTES THE SHORTWAVE RADIATION FLUXES IN TWO - ! SPECTRAL INTERVALS FOLLOWING FOUQUART AND BONNEL (1980). - - ! METHOD. - ! 1. COMPUTES ABSORBER AMOUNTS (SWU) - ! 2. COMPUTES FLUXES IN 1ST SPECTRAL INTERVAL (SW1S) - ! 3. COMPUTES FLUXES IN 2ND SPECTRAL INTERVAL (SW2S) - - ! REFERENCE. - ! SEE RADIATION PART OF THE ECMWF RESEARCH DEPARTMENT - ! DOCUMENTATION, AND FOUQUART AND BONNEL (1980) - - ! AUTHOR. - ! JEAN-JACQUES MORCRETTE *ECMWF* - - ! MODIFICATIONS. - ! ORIGINAL: 89-07-14 - ! 95-01-01 J.-J. MORCRETTE Direct/Diffuse Albedo - ! 03-11-27 J. QUAAS Introduce aerosol forcings (based on BOUCHER) + ! Purpose. + ! This routine computes the shortwave radiation fluxes in two + ! spectral intervals following Fouquart and Bonnel (1980). + + ! Method. + ! 1. Computes absorber amounts (swu) + ! 2. Computes fluxes in 1st spectral interval (SW1S) + ! 3. Computes fluxes in 2nd spectral interval (SW2S) + + ! Reference. + ! See radiation part of the ECMWF research department + ! documentation, and Fouquart and Bonnel (1980) + + ! Author. + ! Jean-Jacques Morcrette *ecmwf* + + ! Modifications. + ! Original: 89-07-14 + ! 95-01-01 J.-J. Morcrette direct/diffuse albedo + ! 03-11-27 J. Quaas Introduce aerosol forcings (based on Boucher) - USE clesphys, ONLY: bug_ozone - USE suphec_m, ONLY: rcpd, rday, rg, rmd, rmo3 USE raddim, ONLY: kdlon, kflev + USE suphec_m, ONLY: rcpd, rday, rg ! ARGUMENTS: @@ -92,15 +91,12 @@ INTEGER inu, jl, jk, i, k, kpl1 - INTEGER swpas ! Every swpas steps, sw is calculated - PARAMETER(swpas=1) + INTEGER, PARAMETER:: swpas = 1 ! Every swpas steps, sw is calculated - INTEGER itapsw - LOGICAL appel1er - DATA itapsw /0/ - DATA appel1er /.TRUE./ + INTEGER:: itapsw = 0 + LOGICAL:: appel1er = .TRUE. !jq-Introduced for aerosol forcings - double precision flag_aer + double precision, save:: flag_aer logical, intent(in):: ok_ade, ok_aie ! use aerosol forcings or not? double precision tauae(kdlon, kflev, 2) ! aerosol optical properties double precision pizae(kdlon, kflev, 2) @@ -124,21 +120,23 @@ ! (diagnosed aerosol forcing)SHORTWAVE FLUX AT SURFACE(+AEROSOL IND) !jq - Fluxes including aerosol effects - DOUBLE PRECISION ZFSUPAD(KDLON, KFLEV+1) - DOUBLE PRECISION ZFSDNAD(KDLON, KFLEV+1) - DOUBLE PRECISION ZFSUPAI(KDLON, KFLEV+1) - DOUBLE PRECISION ZFSDNAI(KDLON, KFLEV+1) - logical initialized - SAVE ZFSUPAD, ZFSDNAD, ZFSUPAI, ZFSDNAI ! aerosol fluxes - !rv - save flag_aer - data initialized/.false./ + DOUBLE PRECISION, save:: ZFSUPAD(KDLON, KFLEV+1) + DOUBLE PRECISION, save:: ZFSDNAD(KDLON, KFLEV+1) + DOUBLE PRECISION, save:: ZFSUPAI(KDLON, KFLEV+1) + DOUBLE PRECISION, save:: ZFSDNAI(KDLON, KFLEV+1) + + logical:: initialized = .false. + REAL, PARAMETER :: dobson_u = 2.1415E-05 ! Dobson unit, in kg m-2 !------------------------------------------------------------------- if(.not.initialized) then flag_aer=0. initialized=.TRUE. + ZFSUPAD = 0. + ZFSDNAD = 0. + ZFSUPAI = 0. + ZFSDNAI = 0. endif !rv @@ -152,13 +150,7 @@ DO JK = 1 , KFLEV DO JL = 1, KDLON ZCLDSW0(JL, JK) = 0.0 - IF (bug_ozone) then - ZOZ(JL, JK) = POZON(JL, JK)*46.6968/RG & - *PDP(JL, JK)*(101325.0/PPSOL(JL)) - ELSE - ! Correction MPL 100505 - ZOZ(JL, JK) = POZON(JL, JK)*RMD/RMO3*46.6968/RG*PDP(JL, JK) - ENDIF + ZOZ(JL, JK) = POZON(JL, JK) / (dobson_u * 1E3 * rg) * PDP(JL, JK) ENDDO ENDDO