Changeset 6018 for LMDZ6


Ignore:
Timestamp:
Jan 12, 2026, 4:40:41 PM (9 days ago)
Author:
yann meurdesoif
Message:

Reorder loop indices for improved perf + bug fix for ecrad

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/radlwsw_m.F90

    r5939 r6018  
    301301    REAL(KIND=8) ZFLDNC0(KDLON,KFLEV+1)
    302302    REAL(KIND=8) zx_alpha1, zx_alpha2
    303     INTEGER k, kk, i, j, iof, nb_gr,jb !FC
     303    INTEGER k, kk, i, j, l, iof, nb_gr,jb !FC
    304304    INTEGER ist,iend,ktdia,kmode
    305305    REAL(KIND=8) PSCT
     
    490490    CHARACTER (LEN=80) :: modname='radlwsw_m'
    491491
    492     REAL zdir, zdif
     492    REAL zdir(klon), zdif(klon)
     493    INTEGER :: dimoz
     494
     495    dimoz=size(wo,3)
    493496
    494497    ! =========  INITIALISATIONS ==============================================
     
    592595          zfract(i) = fract(iof+i)
    593596          zrmu0(i) = rmu0(iof+i)
    594 
    595 
    596           IF (iflag_rrtm==0) THEN
     597       ENDDO
     598
     599
     600       IF (iflag_rrtm==0) THEN
     601         DO i = 1, kdlon
     602
    597603             !     Albedo
    598604             PALBD(i,1)=alb_dif(iof+i,1)
     
    601607             PALBP(i,2)=alb_dir(iof+i,2)
    602608             ! AI 02.2021 cas iflag_rrtm=1 et 2
    603           ELSEIF (iflag_rrtm==1.OR.iflag_rrtm==2) THEN
    604              DO kk=1,NSW
     609          ENDDO
     610
     611        ELSEIF (iflag_rrtm==1.OR.iflag_rrtm==2) THEN
     612            DO kk=1,NSW
     613               DO i = 1, kdlon
     614
    605615                PALBD_NEW(i,kk)=alb_dif(iof+i,kk)
    606616                PALBP_NEW(i,kk)=alb_dir(iof+i,kk)
    607              ENDDO
     617               ENDDO
     618            ENDDO
     619
    608620             !
    609           ENDIF
     621        ENDIF
    610622          !albedo SB <<<
    611 
     623       DO i = 1, kdlon
    612624          PEMIS(i) = 1.0    ! A REVOIR (MPL)
    613625          PVIEW(i) = 1.66
     
    619631          PDT0(i) = tsol(iof+i) - PTL(i,1)
    620632       ENDDO
     633
    621634       DO k = 2, kflev
    622635          DO i = 1, kdlon
     
    624637          ENDDO
    625638       ENDDO
     639
     640       !       Confert from  column density of ozone in a cell, in kDU, to a mass fraction
     641       DO l=1, dimoz
     642         DO k = 1, kflev
     643            DO i = 1, kdlon
     644               POZON(i,k, l) = wo(iof+i, k, l) * RG * dobson_u * 1e3 &
     645                      / (paprs(iof+i, k) - paprs(iof+i, k+1))
     646        !       A activer pour CCMVAL on prend l'ozone impose (MPL 07042010)
     647        !       POZON(i,k,:) = wo(i,k,:) 
     648        !       print *,'RADLWSW: POZON',k, POZON(i,k,1)
     649            ENDDO
     650         ENDDO
     651       ENDDO
     652
    626653       DO k = 1, kflev
    627654          DO i = 1, kdlon
     
    630657             PWV(i,k) = MAX (q(iof+i,k), 1.0e-12)
    631658             PQS(i,k) = PWV(i,k)
    632              !       Confert from  column density of ozone in a cell, in kDU, to a mass fraction
    633              POZON(i,k, :) = wo(iof+i, k, :) * RG * dobson_u * 1e3 &
    634                   / (paprs(iof+i, k) - paprs(iof+i, k+1))
    635              !       A activer pour CCMVAL on prend l'ozone impose (MPL 07042010)
    636              !       POZON(i,k,:) = wo(i,k,:) 
    637              !       print *,'RADLWSW: POZON',k, POZON(i,k,1)
    638659             PCLDLD(i,k) = cldfra(iof+i,k)*cldemi(iof+i,k)
    639660             PCLDLU(i,k) = cldfra(iof+i,k)*cldemi(iof+i,k)
     
    679700          ENDDO
    680701       ENDDO
     702   
     703 
     704     DO l=1,naero_grp
    681705       DO k = 1, kflev
    682706          DO i = 1, kdlon
    683              tauaero(i,k,:,1)=tau_aero(iof+i,k,:,1)
    684              pizaero(i,k,:,1)=piz_aero(iof+i,k,:,1)
    685              cgaero(i,k,:,1) =cg_aero(iof+i,k,:,1)
    686              tauaero(i,k,:,2)=tau_aero(iof+i,k,:,2)
    687              pizaero(i,k,:,2)=piz_aero(iof+i,k,:,2)
    688              cgaero(i,k,:,2) =cg_aero(iof+i,k,:,2)
     707             tauaero(i,k,l,1)=tau_aero(iof+i,k,l,1)
     708             pizaero(i,k,l,1)=piz_aero(iof+i,k,l,1)
     709             cgaero(i,k,l,1) =cg_aero(iof+i,k,l,1)
     710             tauaero(i,k,l,2)=tau_aero(iof+i,k,l,2)
     711             pizaero(i,k,l,2)=piz_aero(iof+i,k,l,2)
     712             cgaero(i,k,l,2) =cg_aero(iof+i,k,l,2)
    689713          ENDDO
    690714       ENDDO
     715    ENDDO
    691716       !
    692717       !===== iflag_rrtm ================================================
     
    847872          !--aerosol NAT  - natural only          - index 1
    848873          !
    849           DO i = 1, kdlon
    850              DO k = 1, kflev
    851                 DO kk=1, NSW
     874        DO kk=1, NSW
     875          DO k = 1, kflev
     876            DO i = 1, kdlon
    852877                   !
    853878                   PTAU_TOT(i,kflev+1-k,kk)=tau_aero_sw_rrtm(i,k,2,kk)
     
    868893          !--aerosol NAT  - natural only          - index 1
    869894          !
    870           DO i = 1, kdlon
    871              DO k = 1, kflev
    872                 DO kk=1, NLW
     895          DO kk=1, NLW
     896            DO k = 1, kflev
     897              DO i = 1, kdlon
    873898                   !
    874899                   PTAU_LW_TOT(i,kflev+1-k,kk)=tau_aero_lw_rrtm(i,k,2,kk)
     
    892917             PFSDNN(i)=0.
    893918             PFSDNV(i)=0.
    894              DO kk = 1, NSW
     919          ENDDO
     920
     921          DO kk = 1, NSW
     922            DO i = 1, kdlon
    895923                PSFSWDIR(i,kk)=0.
    896924                PSFSWDIF(i,kk)=0.
     
    902930          paprs_i(:,1)=paprs(:,klev+1)
    903931          DO k=1,klev
    904              paprs_i(1:klon,k+1) =paprs(1:klon,klev+1-k)
    905              pplay_i(1:klon,k)   =pplay(1:klon,klev+1-k)
    906              cldfra_i(1:klon,k)  =cldfra(1:klon,klev+1-k)
    907              PDP_i(1:klon,k)     =PDP(1:klon,klev+1-k)
    908              t_i(1:klon,k)       =t(1:klon,klev+1-k)
    909              q_i(1:klon,k)       =q(1:klon,klev+1-k)
    910              qsat_i(1:klon,k)    =qsat(1:klon,klev+1-k)
    911              flwc_i(1:klon,k)    =flwc(1:klon,klev+1-k)
    912              fiwc_i(1:klon,k)    =fiwc(1:klon,klev+1-k)
    913              ref_liq_i(1:klon,k) =ref_liq(1:klon,klev+1-k)
    914              ref_ice_i(1:klon,k) =ref_ice(1:klon,klev+1-k)
     932            DO i = 1, klon
     933             paprs_i(i,k+1) =paprs(i,klev+1-k)
     934             pplay_i(i,k)   =pplay(i,klev+1-k)
     935             cldfra_i(i,k)  =cldfra(i,klev+1-k)
     936             PDP_i(i,k)     =PDP(i,klev+1-k)
     937             t_i(i,k)       =t(i,klev+1-k)
     938             q_i(i,k)       =q(i,klev+1-k)
     939             qsat_i(i,k)    =qsat(i,klev+1-k)
     940             flwc_i(i,k)    =flwc(i,klev+1-k)
     941             fiwc_i(i,k)    =fiwc(i,klev+1-k)
     942             ref_liq_i(i,k) =ref_liq(i,klev+1-k)
     943             ref_ice_i(i,k) =ref_ice(i,klev+1-k)
    915944             !-OB
    916              ref_liq_pi_i(1:klon,k) =ref_liq_pi(1:klon,klev+1-k)
    917              ref_ice_pi_i(1:klon,k) =ref_ice_pi(1:klon,klev+1-k)
    918           ENDDO
    919           DO k=1,kflev
    920              POZON_i(1:klon,k,:)=POZON(1:klon,kflev+1-k,:)
     945             ref_liq_pi_ii,k) =ref_liq_pi(i,klev+1-k)
     946             ref_ice_pi_i(i,k) =ref_ice_pi(i,klev+1-k)
     947            ENDDO
     948          ENDDO
     949         
     950          DO l=1,dimoz
     951            DO k=1,kflev
     952               POZON_i(1:klon,k,l)=POZON(1:klon,kflev+1-k,l)
    921953             !            POZON_i(1:klon,k)=POZON(1:klon,k)         ! on laisse 1=sol et klev=top
    922954             !          print *,'Juste avant RECMWFL: k tsol temp',k,tsol,t(1,k)
    923955             ! Modif MPL 6.01.09 avec RRTM, on passe de 5 a 6     
    924              DO i=1,6
    925                 PAER_i(1:klon,k,i)=PAER(1:klon,kflev+1-k,i)
    926              ENDDO
    927           ENDDO
     956            ENDDO
     957          ENDDO
     958
     959            DO l=1,6
     960               DO k=1,kflev
     961                 PAER_i(1:klon,k,l)=PAER(1:klon,kflev+1-k,l)
     962               ENDDO
     963            ENDDO
    928964
    929965          !       print *,'RADLWSW: avant RECMWFL, RI0,rmu0=',solaire,rmu0
     
    11071143
    11081144          !--fraction of diffuse radiation in surface SW downward radiation
    1109           DO i = 1, kdlon
    1110              IF (fract(i).GT.0.0) THEN
    1111                 zdir=SUM(PSFSWDIR(i,:))
    1112                 zdif=SUM(PSFSWDIF(i,:))
    1113                 zsolswfdiff(i) = zdif/(zdir+zdif)
    1114              ELSE  !--night
    1115                 zsolswfdiff(i) = 1.0
    1116              ENDIF
     1145          zdir(:)=0.
     1146          zdif(:)=0.
     1147          DO k=1,NSW
     1148            DO i = 1, kdlon
     1149              zdir(i)=zdir(i) + PSFSWDIR(i,k)
     1150              zdif(i)=zdif(i) + PSFSWDIF(i,k)
     1151            ENDDO
     1152          ENDDO
     1153         
     1154          DO i = 1, kdlon
     1155              IF (fract(i).GT.0.0) THEN 
     1156                zsolswfdiff(i) = zdif(i)/(zdir(i)+zdif(i))
     1157              ELSE  !--night
     1158                 zsolswfdiff(i) = 1.0
     1159              ENDIF
    11171160          ENDDO
    11181161          !
     
    11781221          ENDDO
    11791222                    !FC
    1180           DO i=1,kdlon
    11811223          DO jb = 1, nbands_lw_rrtm !FC
    1182           lwtoab(i,jb) = ZTOAB_i(i,jb)
    1183           lwtoa0b(i,jb) = ZTOACB_i(i,jb)
    1184           ENDDO
     1224            DO i=1,kdlon
     1225              lwtoab(i,jb) = ZTOAB_i(i,jb)
     1226              lwtoa0b(i,jb) = ZTOACB_i(i,jb)
     1227            ENDDO
    11851228          ENDDO
    11861229
     
    12191262          !
    12201263          ! AI ATTENTION Aerosols A REVOIR
    1221           DO i = 1, kdlon
     1264          DO kk= 1, naero_spc
    12221265             DO k = 1, kflev
    1223                 DO kk= 1, naero_spc
     1266                DO i = 1, kdlon
    12241267                   !      DO kk=1, NSW
    12251268                   !
     
    12631306             PFSDNN(i)=0.
    12641307             PFSDNV(i)=0.
    1265              DO kk = 1, NSW
     1308           ENDDO
     1309
     1310          DO kk = 1, NSW
     1311            DO i = 1, kdlon
    12661312                PSFSWDIR(i,kk)=0.
    12671313                PSFSWDIF(i,kk)=0.
     
    12741320          paprs_i(:,1)=paprs(:,klev+1)
    12751321          DO k=1,klev
    1276              paprs_i(1:klon,k+1) =paprs(1:klon,klev+1-k)
    1277              pplay_i(1:klon,k)   =pplay(1:klon,klev+1-k)
    1278              cldfra_i(1:klon,k)  =cldfra(1:klon,klev+1-k)
    1279              PDP_i(1:klon,k)     =PDP(1:klon,klev+1-k)
    1280              t_i(1:klon,k)       =t(1:klon,klev+1-k)
    1281              q_i(1:klon,k)       =q(1:klon,klev+1-k)
    1282              qsat_i(1:klon,k)    =qsat(1:klon,klev+1-k)
    1283              flwc_i(1:klon,k)    =flwc(1:klon,klev+1-k)
    1284              fiwc_i(1:klon,k)    =fiwc(1:klon,klev+1-k)
    1285              ref_liq_i(1:klon,k) =ref_liq(1:klon,klev+1-k)*1.0e-6
    1286              ref_ice_i(1:klon,k) =ref_ice(1:klon,klev+1-k)*1.0e-6
     1322            DO i=1,klon
     1323             paprs_i(i,k+1) =paprs(i,klev+1-k)
     1324             pplay_i(i,k)   =pplay(i,klev+1-k)
     1325             cldfra_i(i,k)  =cldfra(i,klev+1-k)
     1326             PDP_i(i,k)     =PDP(i,klev+1-k)
     1327             t_i(i,k)       =t(i,klev+1-k)
     1328             q_i(i,k)       =q(i,klev+1-k)
     1329             qsat_i(i,k)    =qsat(i,klev+1-k)
     1330             flwc_i(i,k)    =flwc(i,klev+1-k)
     1331             fiwc_i(i,k)    =fiwc(i,klev+1-k)
     1332             ref_liq_i(i,k) =ref_liq(i,klev+1-k)*1.0e-6
     1333             ref_ice_i(i,k) =ref_ice(i,klev+1-k)*1.0e-6
    12871334             !-OB
    1288              ref_liq_pi_i(1:klon,k) =ref_liq_pi(1:klon,klev+1-k)
    1289              ref_ice_pi_i(1:klon,k) =ref_ice_pi(1:klon,klev+1-k)
    1290           ENDDO
    1291           DO k=1,kflev
    1292              POZON_i(1:klon,k,:)=POZON(1:klon,kflev+1-k,:)
     1335             ref_liq_pi_i(i,k) =ref_liq_pi(i,klev+1-k)
     1336             ref_ice_pi_i(i,k) =ref_ice_pi(i,klev+1-k)
     1337            ENDDO
     1338          ENDDO
     1339
     1340         DO l=1,dimoz
     1341           DO k=1,kflev
     1342             POZON_i(1:klon,k,l)=POZON(1:klon,kflev+1-k,l)
    12931343             !            ZO3_DP_i(1:klon,k)=ZO3_DP(1:klon,kflev+1-k)
    12941344             !            DO i=1,6
    1295              PAER_i(1:klon,k,:)=PAER(1:klon,kflev+1-k,:)
     1345             PAER_i(1:klon,k,l)=PAER(1:klon,kflev+1-k,l)
    12961346             !            ENDDO
     1347           ENDDO
    12971348          ENDDO
    12981349
     
    15261577                ! Direct flux
    15271578                ZFLUX_DIR(i,k+1) = ZFLUX_DIR_i(i,klev+1-k)
    1528                 ZFLUX_DIR_CLEAR  = ZFLUX_DIR_CLEAR_i(i,klev+1-k)
     1579                ZFLUX_DIR_CLEAR(i,k+1)  = ZFLUX_DIR_CLEAR_i(i,klev+1-k)
    15291580                IF (ok_volcan) THEN
    15301581                   ZSWADAERO(i,k+1)=ZSWADAERO(i,klev+1-k)*fract(i) !--NL
     
    15621613
    15631614          !--fraction of diffuse radiation in surface SW downward radiation
    1564           DO i = 1, kdlon
    1565              zdir=SUM(PSFSWDIR(i,:))
    1566              zdif=SUM(PSFSWDIF(i,:))
    1567              IF (fract(i).GT.0.0.and.(zdir+zdif).gt.seuilmach) THEN
    1568                 zsolswfdiff(i) = zdif/(zdir+zdif)
     1615
     1616          zdir(:)=0.
     1617          zdif(:)=0.
     1618          DO k=1,klev
     1619            DO i = 1, kdlon
     1620             zdir(i)=zdir(i)+PSFSWDIR(i,k)
     1621             zdif(i)=zdif(i)+PSFSWDIF(i,k)
     1622            ENDDO
     1623          ENDDO
     1624
     1625          DO i = 1, kdlon
     1626            IF (fract(i).GT.0.0.and.(zdir(i)+zdif(i)).gt.seuilmach) THEN
     1627                zsolswfdiff(i) = zdif(i)/(zdir(i)+zdif(i))
    15691628             ELSE  !--night
    15701629                zsolswfdiff(i) = 1.0
     
    16111670          sollw(iof+i) = zsollw(i)
    16121671          sollwdown(iof+i) = zsollwdown(i)
    1613           DO k = 1, kflev+1
     1672      ENDDO
     1673
     1674      DO k = 1, kflev+1
     1675         DO i = 1, kdlon
    16141676             lwdn0 ( iof+i,k)   = ZFLDN0 ( i,k)
    16151677             lwdn  ( iof+i,k)   = ZFLDN  ( i,k)
     
    16171679             lwup  ( iof+i,k)   = ZFLUP  ( i,k)
    16181680          ENDDO
     1681      ENDDO
     1682
     1683       DO i = 1, kdlon
    16191684          topsw0(iof+i) = ztopsw0(i)
    16201685          toplw0(iof+i) = ztoplw0(i)
     
    16221687          sollw0(iof+i) = zsollw0(i)
    16231688          albpla(iof+i) = zalbpla(i)
    1624 
    1625           DO k = 1, kflev+1
     1689        ENDDO
     1690
     1691        DO k = 1, kflev+1
     1692          DO i = 1, kdlon
    16261693             swdnc0( iof+i,k)   = ZFSDNC0( i,k)
    16271694             swdn0 ( iof+i,k)   = ZFSDN0 ( i,k)
     
    16421709             solswad_aero(iof+i) = zsolswadaero(i)
    16431710             solswad0_aero(iof+i) = zsolswad0aero(i)
    1644              topsw_aero(iof+i,:) = ztopsw_aero(i,:)
    1645              topsw0_aero(iof+i,:) = ztopsw0_aero(i,:)
    1646              solsw_aero(iof+i,:) = zsolsw_aero(i,:)
    1647              solsw0_aero(iof+i,:) = zsolsw0_aero(i,:)
    1648              topswcf_aero(iof+i,:) = ztopswcf_aero(i,:)
    1649              solswcf_aero(iof+i,:) = zsolswcf_aero(i,:)   
     1711          ENDDO
     1712         
     1713             topsw_aero(:,:) = ztopsw_aero(:,:)
     1714             topsw0_aero(:,:) = ztopsw0_aero(:,:)
     1715             solsw_aero(:,:) = zsolsw_aero(:,:)
     1716             solsw0_aero(:,:) = zsolsw0_aero(:,:)
     1717             topswcf_aero(:,:) = ztopswcf_aero(:,:)
     1718             solswcf_aero(:,:) = zsolswcf_aero(:,:)   
    16501719             !-LW
     1720          DO i = 1, kdlon
    16511721             toplwad_aero(iof+i) = ztoplwadaero(i)
    16521722             toplwad0_aero(iof+i) = ztoplwad0aero(i)
     
    16601730             topswad0_aero(iof+i) = 0.0
    16611731             solswad0_aero(iof+i) = 0.0
    1662              topsw_aero(iof+i,:) = 0.
    1663              topsw0_aero(iof+i,:) =0.
    1664              solsw_aero(iof+i,:) = 0.
    1665              solsw0_aero(iof+i,:) = 0.
     1732          ENDDO
     1733             topsw_aero(:,:) = 0.
     1734             topsw0_aero(:,:) =0.
     1735             solsw_aero(:,:) = 0.
     1736             solsw0_aero(:,:) = 0.
    16661737             !-LW
     1738          DO i = 1, kdlon
    16671739             toplwad_aero(iof+i) = 0.0
    16681740             sollwad_aero(iof+i) = 0.0
Note: See TracChangeset for help on using the changeset viewer.