diff --git a/src/SURFEX/hydro.F90 b/src/SURFEX/hydro.F90 index fca65affef22d0f38e8db74af90ea1597370ac63..c77c31f80850e56167b215401219ca5851c2b5d3 100644 --- a/src/SURFEX/hydro.F90 +++ b/src/SURFEX/hydro.F90 @@ -202,9 +202,10 @@ REAL, DIMENSION(SIZE(PVEG)) :: ZWGI_EXCESS, ZF2 REAL, DIMENSION(SIZE(PEK%XWG,1),SIZE(PEK%XWG,2)) :: ZQSAT, ZQSATI, ZTI, ZPS ! For specific humidity at saturation computation (ISBA-DIF) ! -REAL, DIMENSION(SIZE(PEK%XWG,1),SIZE(PEK%XWG,2)) :: ZWGI0 +REAL, DIMENSION(SIZE(PEK%XWG,1),SIZE(PEK%XWG,2)) :: ZWGI0, ZPHASE ! ZWGI0 = initial soil ice content (m3 m-3) before update -! for budget diagnostics +! for budget diagnostics +! ZPHASE= phase change (freeze-thaw) energy (W/m2) by layer ! !* 0.3 declarations of local parameters ! @@ -253,7 +254,8 @@ PDELPHASEG(:) = 0.0 PDELPHASEG_SFC(:)= 0.0 ZWGI0(:,:) = 0.0 ! -ZF2(:) = MAX(XDENOM_MIN,PF2(:)) +ZF2(:) = MAX(XDENOM_MIN,PF2(:)) +ZPHASE(:,:) = 0.0 ! ! Initialize evaporation components: variable definitions ! depend on snow or explicit canopy scheme: @@ -490,25 +492,24 @@ IF (IO%CISBA=='DIF') THEN PF2WGHT, PPS, ZQSAT, ZQSATI, ZDRAIN, ZHORTON, INL, ZQSB ) ! - CALL ICE_SOILDIF(KK, PK, PEK, ZTSTEP, ZKSFC_IVEG, ZLEGI, PSOILHCAPZ, ZWGI_EXCESS ) + CALL ICE_SOILDIF(KK, PK, PEK, ZTSTEP, ZKSFC_IVEG, ZLEGI, PSOILHCAPZ, ZWGI_EXCESS, ZPHASE ) ! DEK%XDRAIN(:) = DEK%XDRAIN(:) + (ZDRAIN(:)+ZQSB(:)+ZWGI_EXCESS(:))/REAL(INDT) DEK%XQSB (:) = DEK%XQSB (:) + ZQSB (:)/REAL(INDT) DEK%XHORT (:) = DEK%XHORT (:) + ZHORTON(:)/REAL(INDT) -! -! Output diagnostics: -! Compute latent heating from phase change only in surface layer and total soil column, -! then adjust surface and total soil heat content to maintain balance. -! - PDELPHASEG_SFC(:) = (PEK%XWGI(:,1)-ZWGI0(:,1))*(XLMTT*XRHOLW/PTSTEP)*PK%XDZG(:,1) + & - ZLEGI(:)*(XRHOLW*XLSTT) - PDELPHASEG(:) = PDELPHASEG_SFC(:) - DO JL=2,INL - DO JJ=1,INJ - PDELPHASEG(JJ) = PDELPHASEG(JJ) + (PEK%XWGI(JJ,JL)-ZWGI0(JJ,JL))*& - (XLMTT*XRHOLW/PTSTEP)*PK%XDZG(JJ,JL) + +! Compute latent heating from phase change only in surface layer and total soil column + + PDELPHASEG_SFC(:) = PDELPHASEG_SFC(:) + ZPHASE(:,1)/REAL(INDT) + DO JL=1,INL + DO JJ=1,INJ + PDELPHASEG(JJ) = PDELPHASEG(JJ) + ZPHASE(JJ,JL)/REAL(INDT) ENDDO ENDDO + +! Output diagnostics: +! Adjust surface and total soil heat content to maintain balance. + PDELHEATG_SFC(:) = PDELHEATG_SFC(:) + PDELPHASEG_SFC(:) PDELHEATG(:) = PDELHEATG(:) + PDELPHASEG(:) diff --git a/src/SURFEX/ice_soildif.F90 b/src/SURFEX/ice_soildif.F90 index 2d3e2bdef90fcc10cce204ed085926cda6800c3c..9e6e29b445cbc0c12bd32da03549a57e8e007bfd 100644 --- a/src/SURFEX/ice_soildif.F90 +++ b/src/SURFEX/ice_soildif.F90 @@ -3,7 +3,7 @@ !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### - SUBROUTINE ICE_SOILDIF(KK, PK, PEK, PTSTEP, PKSFC_IVEG, PLEGI, PSOILHCAPZ, PWGI_EXCESS) + SUBROUTINE ICE_SOILDIF(KK, PK, PEK, PTSTEP, PKSFC_IVEG, PLEGI, PSOILHCAPZ, PWGI_EXCESS, PPHASE) ! ########################################################################## ! !!**** *ICE_SOILDIF* @@ -103,6 +103,9 @@ REAL, DIMENSION(:,:), INTENT(IN) :: PSOILHCAPZ REAL, DIMENSION(:), INTENT(OUT) :: PWGI_EXCESS ! PWGI_EXCESS = Soil ice excess water content ! +REAL, DIMENSION(:,:), INTENT(OUT) :: PPHASE +! PPHASE = total phase change energy (just a diagnostic) (J/m3) +! !* 0.2 declarations of local variables ! INTEGER :: JJ, JL ! loop control @@ -116,7 +119,7 @@ REAL, DIMENSION(SIZE(PEK%XTG,1),SIZE(PEK%XTG,2)) :: ZK, ZEXCESSFC REAL, DIMENSION(SIZE(PEK%XTG,1)) :: ZEXCESS ! REAL :: ZWGMAX, ZPSIMAX, ZPSI, ZDELTAT, & - ZPHASE, ZTGM, ZWGM, ZWGIM, ZLOG, & + ZTGM, ZWGM, ZWGIM, ZLOG, & ZEFFIC, ZPHASEM, ZPHASEF, ZWORK, & ZAPPHEATCAP ! @@ -146,6 +149,7 @@ ZK(:,1) = PKSFC_IVEG(:) ! 2. Soil ice evolution computation: ! ------------------------------- ! +PPHASE(:,:) = 0. DO JL=1,INL DO JJ=1,INI IDEPTH=PK%NWG_LAYER(JJ) @@ -200,12 +204,14 @@ DO JL=1,INL PEK%XTG(JJ,JL) = ZTGM + (ZPHASEF - ZPHASEM)/(PSOILHCAPZ(JJ,JL)+ZAPPHEATCAP) ! ! Get estimate of actual total phase change (J/m3) for equivalent soil water changes: - ZPHASE = (PSOILHCAPZ(JJ,JL)+ZAPPHEATCAP)*(PEK%XTG(JJ,JL)-ZTGM) + PPHASE(JJ,JL) = (PSOILHCAPZ(JJ,JL)+ZAPPHEATCAP)*(PEK%XTG(JJ,JL)-ZTGM) ! ! Adjust ice and liquid water conents (m3/m3) accordingly : - PEK%XWGI(JJ,JL) = ZWGIM + ZPHASE/(XLMTT*XRHOLW) - PEK%XWG(JJ,JL) = ZWGM - ZPHASE/(XLMTT*XRHOLW) + PEK%XWGI(JJ,JL) = ZWGIM + PPHASE(JJ,JL)/(XLMTT*XRHOLW) + PEK%XWG(JJ,JL) = ZWGM - PPHASE(JJ,JL)/(XLMTT*XRHOLW) ! +! Final unit conversion (W m-2): + PPHASE(JJ,JL) = PPHASE(JJ,JL)*PK%XDZG(JJ,JL)/PTSTEP ENDIF ENDDO ENDDO @@ -257,15 +263,17 @@ ENDDO ! and conserve energy: ! DO JL=1,INL - DO JJ=1,INI - IDEPTH=PK%NWG_LAYER(JJ) - IF(JL<=IDEPTH.AND.PEK%XWGI(JJ,JL)>0.0.AND.PEK%XWGI(JJ,JL)<1.0E-6)THEN - PEK%XWG (JJ,JL) = PEK%XWG(JJ,JL) + PEK%XWGI(JJ,JL) - ZEXCESSFC(JJ,JL) = ZEXCESSFC(JJ,JL) + PEK%XWGI(JJ,JL) - PEK%XWGI(JJ,JL) = 0.0 - ENDIF - PEK%XTG(JJ,JL) = PEK%XTG(JJ,JL) - ZEXCESSFC(JJ,JL)*XLMTT*XRHOLW/PSOILHCAPZ(JJ,JL) - ENDDO + DO JJ=1,INI + IDEPTH=PK%NWG_LAYER(JJ) + IF(JL<=IDEPTH.AND.PEK%XWGI(JJ,JL)>0.0.AND.PEK%XWGI(JJ,JL)<1.0E-6)THEN + ZWGIM = PEK%XWGI(JJ,JL) + PEK%XWG(JJ,JL) = PEK%XWG(JJ,JL) + ZWGIM + PEK%XWGI(JJ,JL) = 0.0 + ZPHASEM = ZWGIM*XLMTT*XRHOLW ! J m-3 + PEK%XTG(JJ,JL) = PEK%XTG(JJ,JL) - ZPHASEM/PSOILHCAPZ(JJ,JL) ! K + PPHASE(JJ,JL) = PPHASE(JJ,JL) - ZPHASEM*PK%XDZG(JJ,JL)/PTSTEP ! W m-2 + ENDIF + ENDDO ENDDO ! ! diff --git a/src/SURFEX/mode_read_surf_cov.F90 b/src/SURFEX/mode_read_surf_cov.F90 index 1a745624a059d80653d6c67a443f2f8b17c5be26..4948ea7564ae42b60dcb31d421eab1145cec2c02 100644 --- a/src/SURFEX/mode_read_surf_cov.F90 +++ b/src/SURFEX/mode_read_surf_cov.F90 @@ -258,7 +258,7 @@ ELSE !$OMP PARALLEL PRIVATE(ZHOOK_HANDLE_OMP) IF (LHOOK) CALL DR_HOOK('READ_SURF_COV_4',0,ZHOOK_HANDLE_OMP) #ifdef SFX_MPI -!$OMP DO SCHEDULE(DYNAMIC,1) PRIVATE(JPROC,IDX,ISTATUS,INFOMPI) FIRSTPRIVATE(ZWORKR) +!$OMP DO SCHEDULE(DYNAMIC,1) PRIVATE(JPROC,IDX,ZWORKR,IVAL,ISTATUS,INFOMPI) #endif DO JPROC=0,NPROC-1 ! diff --git a/src/SURFEX/mode_read_surf_layers.F90 b/src/SURFEX/mode_read_surf_layers.F90 index c1f6d78d65faf81cb1136a7f9a8c6ae6a428b121..cd5f5afc45f8a4bbe18f06f56d9ac136a8a04d70 100644 --- a/src/SURFEX/mode_read_surf_layers.F90 +++ b/src/SURFEX/mode_read_surf_layers.F90 @@ -248,7 +248,7 @@ ELSE !$OMP PARALLEL PRIVATE(ZHOOK_HANDLE_OMP) IF (LHOOK) CALL DR_HOOK('READ_SURF_LAYERS_4',0,ZHOOK_HANDLE_OMP) #ifdef SFX_MPI -!$OMP DO SCHEDULE(DYNAMIC,1) PRIVATE(JPROC,IDX,ISTATUS,INFOMPI) +!$OMP DO SCHEDULE(DYNAMIC,1) PRIVATE(JPROC,IDX,ZWORKR,IVAL,ISTATUS,INFOMPI) #endif DO JPROC=0,NPROC-1 ! diff --git a/src/SURFEX/prep_hor_ocean_field.F90 b/src/SURFEX/prep_hor_ocean_field.F90 index 7f654d671bfc21b431b64356b4d959db5725768a..9bb9915bdcd0024ff43f0c185d13793cab996479 100644 --- a/src/SURFEX/prep_hor_ocean_field.F90 +++ b/src/SURFEX/prep_hor_ocean_field.F90 @@ -84,7 +84,7 @@ REAL, POINTER, DIMENSION(:,:,:) ::ZFIELDIN=>NULL()!field to interpolate horiz REAL, POINTER, DIMENSION(:,:) ::ZFIELD=>NULL() !field to interpolate horizontally REAL, ALLOCATABLE, DIMENSION(:,:,:)::ZFIELDOUT!field interpolated horizontally ! -INTEGER :: JLEV ! loop on oceanic vertical level +INTEGER :: JLEV, JLEV2 ! loop on oceanic vertical level INTEGER :: IK1 REAL(KIND=JPRB) :: ZHOOK_HANDLE !---------------------------------------------------------------------------- @@ -114,10 +114,11 @@ END IF ALLOCATE(ZFIELDOUT (KLAT,SIZE(ZFIELDIN,2),SIZE(ZFIELDIN,3)) ) ALLOCATE(ZFIELD(SIZE(ZFIELDIN,1),SIZE(ZFIELDIN,3))) ! -DO JLEV=1,SIZE(ZFIELDIN,2) +DO JLEV=NOCKMIN,NOCKMAX + JLEV2 = JLEV - NOCKMIN + 1 WHERE (PSEABATHY(:)-XZHOC(JLEV)>0.) LINTERP(:) = .FALSE. - ZFIELD(:,:)=ZFIELDIN(:,JLEV,:) - CALL HOR_INTERPOL(DTCO, U, GCP, KLUOUT,ZFIELD,ZFIELDOUT(:,JLEV,:)) + ZFIELD(:,:)=ZFIELDIN(:,JLEV2,:) + CALL HOR_INTERPOL(DTCO, U, GCP, KLUOUT,ZFIELD,ZFIELDOUT(:,JLEV2,:)) LINTERP(:) = .TRUE. ENDDO ! diff --git a/src/SURFEX/snow3L_isba.F90 b/src/SURFEX/snow3L_isba.F90 index 0f5173bed70874fc2ce4d610fbe78e93e595ab0c..de2ff87a39f01fd278480e89f07d8257dd2804ea 100644 --- a/src/SURFEX/snow3L_isba.F90 +++ b/src/SURFEX/snow3L_isba.F90 @@ -514,8 +514,6 @@ IF (PEK%TSNOW%SCHEME=='3-L' .OR. IO%CISBA == 'DIF' .OR. PEK%TSNOW%SCHEME == 'CRO - DMK%XSNOWHMASS(:)/PTSTEP ZGRNDFLUXN(:) = (ZSNOWH(:)+DMK%XSNOWHMASS(:))/PTSTEP + DMK%XGFLUXSNOW(:) ZWORK(:) = PTSTEP * ZPSN(:) * (ZGRNDFLUXN(:) - PGRNDFLUX(:) - PFLSN_COR(:)) - PTG(:,1) = PTG(:,1) + ZWORK(:)*(1.-ZWGHT(:))*PCT(:) - PTG(:,2) = PTG(:,2) + ZWORK(:)* ZWGHT(:) *ZC2(:) ZWORK(:) = ZWORK(:) / PTSTEP PDELHEATG(:) = PDELHEATG(:) + ZWORK(:) PDELHEATG_SFC(:) = PDELHEATG_SFC(:) + ZWORK(:)