diff --git a/src/common/turb/mode_bl89.F90 b/src/common/turb/mode_bl89.F90 index 4c79d274ad2fefc1be1ccfc43fc75b61c8de5d40..3ebc2670a6c191673bca009c308c4aac7e96da34 100644 --- a/src/common/turb/mode_bl89.F90 +++ b/src/common/turb/mode_bl89.F90 @@ -71,15 +71,15 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(CST_t), INTENT(IN) :: CST TYPE(CSTURB_t), INTENT(IN) :: CSTURB -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN),TARGET :: PZZ -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN),TARGET :: PDZZ -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN),TARGET :: PTHVREF -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN),TARGET :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN),TARGET :: PZZ +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN),TARGET :: PDZZ +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN),TARGET :: PTHVREF +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN),TARGET :: PTHLM ! conservative pot. temp. INTEGER, INTENT(IN) :: KRR -REAL, DIMENSION(D%NIT,D%NJT,D%NKT,KRR), INTENT(IN),TARGET :: PRM ! water var. -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN),TARGET :: PTKEM ! TKE -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN),TARGET :: PSHEAR -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(OUT),TARGET :: PLM ! Mixing length +REAL, DIMENSION(D%NIT*D%NJT,D%NKT,KRR), INTENT(IN),TARGET :: PRM ! water var. +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN),TARGET :: PTKEM ! TKE +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(IN),TARGET :: PSHEAR +REAL, DIMENSION(D%NIT*D%NJT,D%NKT), INTENT(OUT),TARGET :: PLM ! Mixing length LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! CPROGRAM is the program currently running (modd_conf) ! thermodynamical variables PTHLM=Theta at the begining @@ -99,16 +99,12 @@ REAL, DIMENSION(D%NIT*D%NJT) :: ZLWORK,ZINTE ! ! downwards then upwards vertical displacement, ! ! residual internal energy, ! ! residual potential energy -REAL, POINTER, DIMENSION(:,:) :: ZZZ,ZDZZ, & - ZTHM,ZTKEM,ZLM, & - ZSHEAR,ZTHVREF ! ! input and output arrays packed according one horizontal coord. -REAL, POINTER, DIMENSION(:,:,:) :: ZRM ! ! input array packed according one horizontal coord. REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: ZSUM ! to replace SUM function REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: ZG_O_THVREF REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: ZSQRT_TKE -REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: ZLMDN +REAL, DIMENSION(D%NIT*D%NJT,D%NKT) :: PLMDN ! INTEGER :: IIU,IJU,IPROMA INTEGER :: J1D ! horizontal loop counter @@ -134,14 +130,6 @@ IPROMA = D%NIT*D%NJT ! ! Pointer remapping instead of RESHAPE (contiguous memory) ! 2D array => 3D array -ZZZ(1:IPROMA,1:D%NKT) => PZZ -ZDZZ(1:IPROMA,1:D%NKT) => PDZZ -ZTHM(1:IPROMA,1:D%NKT) => PTHLM -ZSHEAR(1:IPROMA,1:D%NKT) => PSHEAR -ZTKEM(1:IPROMA,1:D%NKT) => PTKEM -ZTHVREF(1:IPROMA,1:D%NKT) => PTHVREF -ZRM(1:IPROMA,1:D%NKT,1:KRR) =>PRM -ZLM(1:IPROMA,1:D%NKT) =>PLM ! IF (OOCEAN) THEN DO JK=1,D%NKT @@ -152,13 +140,13 @@ IF (OOCEAN) THEN ELSE !Atmosphere case DO JK=1,D%NKT DO J1D=1,IPROMA - ZG_O_THVREF(J1D,JK) = CST%XG / ZTHVREF(J1D,JK) + ZG_O_THVREF(J1D,JK) = CST%XG / PTHVREF(J1D,JK) END DO END DO END IF ! !$mnh_expand_array(J1D=1:IPROMA,JK=1:D%NKT) -ZSQRT_TKE(:,:) = SQRT(ZTKEM(:,:)) +ZSQRT_TKE(:,:) = SQRT(PTKEM(:,:)) !$mnh_end_expand_array(J1D=1:IPROMA,JK=1:D%NKT) ! !ZBL89EXP is defined here because (and not in ini_cturb) because CSTURB%XCED is defined in read_exseg (depending on BL89/RM17) @@ -173,15 +161,15 @@ IF(KRR /= 0) THEN ZSUM(:,:) = 0. DO JRR=1,KRR !$mnh_expand_array(J1D=1:IPROMA,JK=1:D%NKT) - ZSUM(:,:) = ZSUM(:,:)+ZRM(:,:,JRR) + ZSUM(:,:) = ZSUM(:,:)+PRM(:,:,JRR) !$mnh_end_expand_array(J1D=1:IPROMA,JK=1:D%NKT) ENDDO !$mnh_expand_array(J1D=1:IPROMA,JK=1:D%NKT) - ZVPT(:,:)=ZTHM(:,:) * ( 1. + ZRVORD*ZRM(:,:,1) ) & + ZVPT(:,:)=PTHLM(:,:) * ( 1. + ZRVORD*PRM(:,:,1) ) & / ( 1. + ZSUM(:,:) ) !$mnh_end_expand_array(J1D=1:IPROMA,JK=1:D%NKT) ELSE - ZVPT(:,:)=ZTHM(:,:) + ZVPT(:,:)=PTHLM(:,:) END IF ! !!!!!!!!!!!! @@ -228,7 +216,7 @@ DO JK=D%NKTB,D%NKTE ! !* 4. mixing length for a downwards displacement ! ------------------------------------------ - ZINTE(:)=ZTKEM(:,JK) + ZINTE(:)=PTKEM(:,JK) ZLWORK=0. ZTESTM=1. DO JKK=JK,D%NKB,-D%NKL @@ -239,25 +227,25 @@ DO JK=D%NKTB,D%NKTE !--------- SHEAR + STABILITY ----------- ZPOTE = ZTEST0* & (-ZG_O_THVREF(J1D,JK)*(ZHLVPT(J1D,JKK)-ZVPT(J1D,JK)) & - + CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & - )*ZDZZ(J1D,JKK) + + CSTURB%XRM17*PSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + )*PDZZ(J1D,JKK) ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE) ZTESTM=ZTESTM+ZTEST0 - ZLWORK1=ZDZZ(J1D,JKK) + ZLWORK1=PDZZ(J1D,JKK) !--------- SHEAR + STABILITY ----------- ZLWORK2 = (ZG_O_THVREF(J1D,JK) *(ZVPT(J1D,JKK) - ZVPT(J1D,JK)) & - -CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & - + sqrt(abs( (CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + -CSTURB%XRM17*PSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + + sqrt(abs( (CSTURB%XRM17*PSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + ( -ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK) - ZVPT(J1D,JK)) ))**2.0 + & 2. * ZINTE(J1D) * & #ifdef REPRO48 - ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK)/ ZDZZ(J1D,JKK)))) / & + ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK)/ PDZZ(J1D,JKK)))) / & #else - (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK)/ ZDZZ(J1D,JKK))))) / & + (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK)/ PDZZ(J1D,JKK))))) / & #endif - (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK)) + (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / PDZZ(J1D,JKK)) ZLWORK(J1D)=ZLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1+(1-ZTEST)*ZLWORK2) ZINTE(J1D) = ZINTE(J1D) - ZPOTE END DO @@ -269,7 +257,7 @@ DO JK=D%NKTB,D%NKTE ! ----------------------------------------------- ! DO J1D=1,IPROMA - ZLMDN(J1D,JK)=MIN(ZLWORK(J1D),0.5*(ZZZ(J1D,JK)+ZZZ(J1D,JK+D%NKL))-ZZZ(J1D,D%NKB)) + PLMDN(J1D,JK)=MIN(ZLWORK(J1D),0.5*(PZZ(J1D,JK)+PZZ(J1D,JK+D%NKL))-PZZ(J1D,D%NKB)) END DO ! !------------------------------------------------------------------------------- @@ -277,7 +265,7 @@ DO JK=D%NKTB,D%NKTE !* 6. mixing length for an upwards displacement ! ----------------------------------------- ! - ZINTE(:)=ZTKEM(:,JK) + ZINTE(:)=PTKEM(:,JK) ZLWORK(:)=0. ZTESTM=1. ! @@ -289,24 +277,24 @@ DO JK=D%NKTB,D%NKTE !--------- SHEAR + STABILITY ----------- ZPOTE = ZTEST0* & (ZG_O_THVREF(J1D,JK)*(ZHLVPT(J1D,JKK)-ZVPT(J1D,JK)) & - +CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & - )*ZDZZ(J1D,JKK) + +CSTURB%XRM17*PSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + )*PDZZ(J1D,JKK) ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE) ZTESTM=ZTESTM+ZTEST0 - ZLWORK1=ZDZZ(J1D,JKK) + ZLWORK1=PDZZ(J1D,JKK) !--------- SHEAR + STABILITY ----------- ZLWORK2= ( - ZG_O_THVREF(J1D,JK) *(ZVPT(J1D,JKK-D%NKL) - ZVPT(J1D,JK) ) & - - CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + - CSTURB%XRM17*PSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + SQRT (ABS( & - (CSTURB%XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + (CSTURB%XRM17*PSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + ( ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK-D%NKL) - ZVPT(J1D,JK))) )**2 & + 2. * ZINTE(J1D) * & #ifdef REPRO48 - ZG_O_THVREF(J1D,JK)* ZDELTVPT(J1D,JKK)/ZDZZ(J1D,JKK)))) / & + ZG_O_THVREF(J1D,JK)* ZDELTVPT(J1D,JKK)/PDZZ(J1D,JKK)))) / & #else - (ZG_O_THVREF(J1D,JK)* ZDELTVPT(J1D,JKK)/ZDZZ(J1D,JKK))))) / & + (ZG_O_THVREF(J1D,JK)* ZDELTVPT(J1D,JKK)/PDZZ(J1D,JKK))))) / & #endif - (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK)) + (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / PDZZ(J1D,JKK)) ZLWORK(J1D)=ZLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1+(1-ZTEST)*ZLWORK2) ZINTE(J1D) = ZINTE(J1D) - ZPOTE END DO @@ -318,17 +306,17 @@ DO JK=D%NKTB,D%NKTE !* 7. final mixing length ! DO J1D=1,IPROMA - ZLWORK1=MAX(ZLMDN(J1D,JK),1.E-10_MNHREAL) + ZLWORK1=MAX(PLMDN(J1D,JK),1.E-10_MNHREAL) ZLWORK2=MAX(ZLWORK(J1D),1.E-10_MNHREAL) ZPOTE = ZLWORK1 / ZLWORK2 #ifdef REPRO48 ZLWORK2=1.d0 + ZPOTE**(2./3.) - ZLM(J1D,JK) = Z2SQRT2*ZLWORK1/(ZLWORK2*SQRT(ZLWORK2)) + PLM(J1D,JK) = Z2SQRT2*ZLWORK1/(ZLWORK2*SQRT(ZLWORK2)) #else ZLWORK2=1.d0 + ZPOTE**ZBL89EXP - ZLM(J1D,JK) = ZLWORK1*(2./ZLWORK2)**ZUSRBL89 + PLM(J1D,JK) = ZLWORK1*(2./ZLWORK2)**ZUSRBL89 #endif - ZLM(J1D,JK)=MAX(ZLM(J1D,JK),CSTURB%XLINI) + PLM(J1D,JK)=MAX(PLM(J1D,JK),CSTURB%XLINI) END DO @@ -343,16 +331,16 @@ END DO !* 9. boundaries ! ---------- ! -ZLM(:,D%NKA)=ZLM(:,D%NKB) -ZLM(:,D%NKE)=ZLM(:,D%NKE-D%NKL) -ZLM(:,D%NKU)=ZLM(:,D%NKE-D%NKL) +PLM(:,D%NKA)=PLM(:,D%NKB) +PLM(:,D%NKE)=PLM(:,D%NKE-D%NKL) +PLM(:,D%NKU)=PLM(:,D%NKE-D%NKL) ! !------------------------------------------------------------------------------- ! !* 10. retrieve output array in model coordinates ! ------------------------------------------ ! Not needed anymore because of the use of Pointer remapping (see 1.) -! PLM (3D array) is the target of ZLM (2D array) in a contiguous way +! PLM (3D array) is the target of PLM (2D array) in a contiguous way ! IF (LHOOK) CALL DR_HOOK('BL89',1,ZHOOK_HANDLE) END SUBROUTINE BL89