From 9f26b7a5eeb2cdd769b1cee2d00d1ebff34cb457 Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Tue, 26 Oct 2021 10:36:48 +0200 Subject: [PATCH] Juan, Quentin 26/10/2021 bugfix RESTART reproductibility : use real(kind=4) for computation of LB and LS fields + DRYMASS sources bugfix --- src/LIB/SURCOUCHE/src/mode_field.f90 | 29 +++++++ src/LIB/SURCOUCHE/src/mode_mppdb.f90 | 120 +++++++++++++++++++-------- src/MNH/boundaries.f90 | 36 ++++++++ src/MNH/budget.f90 | 24 +++++- src/MNH/ini_modeln.f90 | 38 +++++---- src/MNH/mesonh.f90 | 1 + src/MNH/modeln.f90 | 21 ++++- src/MNH/num_diff.f90 | 80 +++++++++--------- src/MNH/one_wayn.f90 | 20 +---- src/MNH/rad_bound.f90 | 37 ++++++++- src/MNH/read_field.f90 | 11 ++- src/MNH/relaxation.f90 | 16 ++-- src/MNH/write_lfin.f90 | 5 ++ 13 files changed, 311 insertions(+), 127 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 97466a414..ce06ed50b 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -2002,6 +2002,20 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL)) IDX = IDX+1 ! IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() +TFIELDLIST(IDX)%CMNHNAME = 'DRYMASSS' +TFIELDLIST(IDX)%CSTDNAME = '' +TFIELDLIST(IDX)%CLONGNAME = 'DRYMASSS' +TFIELDLIST(IDX)%CUNITS = 'kg' +TFIELDLIST(IDX)%CDIR = '--' +TFIELDLIST(IDX)%CCOMMENT = 'Total Dry Mass Source' +TFIELDLIST(IDX)%NGRID = 0 +TFIELDLIST(IDX)%NTYPE = TYPEREAL +TFIELDLIST(IDX)%NDIMS = 0 +TFIELDLIST(IDX)%LTIMEDEP = .TRUE. +ALLOCATE(TFIELDLIST(IDX)%TFIELD_X0D(IMODEL)) +IDX = IDX+1 +! +IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST() TFIELDLIST(IDX)%CMNHNAME = 'BL_DEPTH' TFIELDLIST(IDX)%CSTDNAME = '' TFIELDLIST(IDX)%CLONGNAME = 'BL_DEPTH' @@ -3740,6 +3754,13 @@ IF (.NOT.ASSOCIATED(XDRYMASST)) THEN TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XDRYMASST END IF ! +IF (.NOT.ASSOCIATED(XDRYMASSS)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' XDRYMASSS was not associated') + ALLOCATE(XDRYMASSS) + CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASSS',IID,IRESP) + TFIELDLIST(IID)%TFIELD_X0D(1)%DATA=>XDRYMASSS +END IF +! IF (.NOT.ASSOCIATED(NRIMX)) THEN CALL PRINT_MSG(NVERB_DEBUG,'GEN','INI_FIELD_SCALARS',' NRIMX was not associated') ALLOCATE(NRIMX) @@ -4341,6 +4362,14 @@ IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN END IF XDRYMASST => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA ! +CALL FIND_FIELD_ID_FROM_MNHNAME('DRYMASSS',IID,IRESP) +IF (.NOT.ASSOCIATED(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'GEN','FIELDLIST_GOTO_MODEL',& + 'TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA was not associated for '//TFIELDLIST(IID)%CMNHNAME) + ALLOCATE(TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA) +END IF +XDRYMASSS => TFIELDLIST(IID)%TFIELD_X0D(KTO)%DATA +! ! MODD_DYN_n variables ! CALL FIND_FIELD_ID_FROM_MNHNAME('RIMX',IID,IRESP) diff --git a/src/LIB/SURCOUCHE/src/mode_mppdb.f90 b/src/LIB/SURCOUCHE/src/mode_mppdb.f90 index cc3b67c97..e696435f6 100644 --- a/src/LIB/SURCOUCHE/src/mode_mppdb.f90 +++ b/src/LIB/SURCOUCHE/src/mode_mppdb.f90 @@ -49,6 +49,7 @@ MODULE MODE_MPPDB REAL :: PRECISION = 1e-8 * 0.0 LOGICAL :: MPPDB_CHECK_LB = .FALSE. + LOGICAL :: MPPDB_ACTIVED = .FALSE. CONTAINS @@ -92,6 +93,7 @@ CONTAINS IF (MPPDB_INITIALIZED) RETURN ! MPPDB_INITIALIZED = .TRUE. + MPPDB_ACTIVED = .TRUE. ! ! Init MPI ! @@ -251,8 +253,28 @@ CONTAINS END SUBROUTINE MPPDB_INIT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + SUBROUTINE MPPDB_START_DEBUG() + IMPLICIT NONE + MPPDB_ACTIVED = .TRUE. + END SUBROUTINE MPPDB_START_DEBUG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - + SUBROUTINE MPPDB_STOP_DEBUG() + IMPLICIT NONE + MPPDB_ACTIVED = .FALSE. + END SUBROUTINE MPPDB_STOP_DEBUG +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + SUBROUTINE MPPDB_GET_ACTIVED(OACTIVE) + IMPLICIT NONE + LOGICAL , INTENT(OUT) :: OACTIVE + OACTIVE = MPPDB_ACTIVED + END SUBROUTINE MPPDB_GET_ACTIVED +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + SUBROUTINE MPPDB_SET_ACTIVED(OACTIVE) + IMPLICIT NONE + LOGICAL , INTENT(IN) :: OACTIVE + MPPDB_ACTIVED = OACTIVE + END SUBROUTINE MPPDB_SET_ACTIVED +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! SUBROUTINE MPPDB_BARRIER() #ifdef MNH_SP4 !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ... @@ -263,7 +285,7 @@ CONTAINS ! ! synchronize all father & sons ! - IF ( .NOT. MPPDB_INITIALIZED ) RETURN + IF (( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED )) RETURN ! CALL MPI_BARRIER(MPPDB_INTRA_COMM,IERR) ! @@ -279,6 +301,7 @@ CONTAINS use modd_precision, only: MNHINT_MPI, MNHREAL_MPI USE MODD_MPIF , ONLY : MPI_STATUS_IGNORE, MPI_SUM USE MODE_GATHER_ll + USE MODE_MODELN_HANDLER, ONLY : GET_CURRENT_MODEL_INDEX IMPLICIT NONE @@ -310,12 +333,13 @@ CONTAINS INTEGER :: IIU_SON_ll,IJU_SON_ll,IKU_SON_ll INTEGER :: IIB_SON_ll,IIE_SON_ll,IJB_SON_ll,IJE_SON_ll INTEGER :: IHEXT_SON_ll , IDIFF_HEXT + INTEGER :: IMI #ifdef MNH_SP4 !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ... RETURN #else - IF ( ( .NOT. MPPDB_INITIALIZED ) ) RETURN + IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN !get the global size of PTAB CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll) IF ( IGLBSIZEPTAB == 0 ) RETURN @@ -386,10 +410,13 @@ CONTAINS MAX_DIFF=MAXVAL(TAB_ll(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT,1:IKU_ll)/MAX_VAL) TAB_INTERIOR_ll=> TAB_ll(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT,1:IKU_ll) ! + IMI = GET_CURRENT_MODEL_INDEX() IF (MAX_DIFF > PRECISION ) THEN - write(6, '(" MPPDB_CHECK3D :: PB MPPDB_CHECK3D =",A40," ERROR=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF , MAX_VAL + write(6, '(" MPPDB_CHECK3D :: PB MPPDB_CHECK3D =",A40," ERROR=",e15.8," MAXVAL=",e15.8," IMI=",I3.3)' ) & + MESSAGE,MAX_DIFF , MAX_VAL, IMI ELSE - write(6, '(" MPPDB_CHECK3D :: OK MPPDB_CHECK3D =",A40," ERROR=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF , MAX_VAL + write(6, '(" MPPDB_CHECK3D :: OK MPPDB_CHECK3D =",A40," ERROR=",e15.8," MAXVAL=",e15.8," IMI=",I3.3)' ) & + MESSAGE,MAX_DIFF , MAX_VAL, IMI END IF flush(unit=OUTPUT_UNIT) ! @@ -475,7 +502,8 @@ CONTAINS USE MODD_MPIF , ONLY : MPI_STATUS_IGNORE, MPI_SUM use modd_precision, only: MNHINT_MPI, MNHREAL_MPI - USE MODD_VAR_ll , ONLY : NMNH_COMM_WORLD + USE MODD_VAR_ll , ONLY : NMNH_COMM_WORLD + USE MODE_MODELN_HANDLER, ONLY : GET_CURRENT_MODEL_INDEX IMPLICIT NONE @@ -504,12 +532,13 @@ CONTAINS INTEGER :: IIU_SON_ll,IJU_SON_ll INTEGER :: IIB_SON_ll,IIE_SON_ll,IJB_SON_ll,IJE_SON_ll INTEGER :: IHEXT_SON_ll , IDIFF_HEXT + INTEGER :: IMI #ifdef MNH_SP4 !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ... RETURN #else - IF ( ( .NOT. MPPDB_INITIALIZED ) ) RETURN + IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTRA_COMM, IINFO_ll) IF ( IGLBSIZEPTAB == 0 ) RETURN @@ -573,10 +602,14 @@ CONTAINS IF ( MAX_VAL .EQ. 0.0 ) MAX_VAL = 1.0 MAX_DIFF = MAXVAL( TAB_ll(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IIB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT) / MAX_VAL ) TAB_INTERIOR_ll => TAB_ll(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IIB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT) + ! + IMI = GET_CURRENT_MODEL_INDEX() IF (MAX_DIFF > PRECISION ) THEN - write(6, '(" MPPDB_CHECK2D :: PB MPPDB_CHECK2D =",A40," ERROR=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF , MAX_VAL + write(6, '(" MPPDB_CHECK2D :: PB MPPDB_CHECK2D =",A40," ERROR=",e15.8," MAXVAL=",e15.8," IMI=",I3.3)' ) & + MESSAGE,MAX_DIFF , MAX_VAL , IMI ELSE - write(6, '(" MPPDB_CHECK2D :: OK MPPDB_CHECK2D =",A40," ERROR=",e15.8," MAXVAL=",e15.8)' ) MESSAGE,MAX_DIFF , MAX_VAL + write(6, '(" MPPDB_CHECK2D :: OK MPPDB_CHECK2D =",A40," ERROR=",e15.8," MAXVAL=",e15.8," IMI=",I3.3)' ) & + MESSAGE,MAX_DIFF , MAX_VAL , IMI END IF flush(unit=OUTPUT_UNIT) ! @@ -619,14 +652,16 @@ CONTAINS SUBROUTINE MPPDB_CHECKLB(PLB,MESSAGE,PRECISION,HLBTYPE,KRIM) - USE MODD_IO, ONLY: GSMONOPROC, ISP, ISNPROC, L2D, LPACK - USE MODD_MPIF, ONLY: MPI_STATUS_IGNORE - USE MODD_PARAMETERS_ll, ONLY: JPHEXT - USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD - use modd_precision, only: MNHINT_MPI, MNHREAL_MPI + USE MODD_PARAMETERS_ll, ONLY : JPHEXT + USE MODD_VAR_ll , ONLY : NMNH_COMM_WORLD + USE MODD_IO , ONLY : ISP,ISNPROC,GSMONOPROC,LPACK,L2D + USE MODD_MPIF , ONLY : MPI_STATUS_IGNORE, MPI_SUM USE MODE_DISTRIB_LB - + USE MODE_TOOLS_ll, ONLY : GET_GLOBALDIMS_ll + USE MODE_MODELN_HANDLER, ONLY : GET_CURRENT_MODEL_INDEX + use modd_precision, only: MNHINT_MPI, MNHREAL_MPI + IMPLICIT NONE REAL, DIMENSION(:,:,:) , TARGET :: PLB @@ -657,14 +692,18 @@ CONTAINS INTEGER :: IIU_SON_ll,IJU_SON_ll,IKU_SON_ll INTEGER :: IIB_SON_ll,IIE_SON_ll,IJB_SON_ll,IJE_SON_ll INTEGER :: IHEXT_SON_ll , IDIFF_HEXT , IRIM_ll , IRIM_SON_ll + INTEGER :: IMI , IGLBSIZEPTAB #ifdef MNH_SP4 !pas de mpi_spawn sur IBM-SP ni MPI_ARGV_NULL etc ... RETURN #else - IF ( .NOT. MPPDB_INITIALIZED ) RETURN + IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN + !get the global size of PLB + CALL MPI_ALLREDUCE(SIZE(PLB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTER_COMM, IINFO_ll) + IF ( IGLBSIZEPTAB == 0 ) RETURN ! - CALL MPPDB_BARRIER() + CALL MPPDB_BARRIER() ! IF(MPPDB_FATHER_WORLD) THEN ! @@ -674,26 +713,30 @@ CONTAINS IIU_ll = IIMAX_ll+2*JPHEXT IJU_ll = IJMAX_ll+2*JPHEXT IKU_ll = SIZE(PLB,3) - IRIM_ll = (KRIM+JPHEXT)*2 - - IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN - IIU_ll = IRIM_ll - ELSE - IJU_ll = IRIM_ll + IRIM_ll = MAX(1,KRIM) + + IF (HLBTYPE == 'LBX' ) THEN + IIU_ll = JPHEXT*2 + ELSE IF ( HLBTYPE == 'LBXU') THEN + IIU_ll = (IRIM_ll+JPHEXT)*2 + ELSE IF ( HLBTYPE == 'LBY') THEN + IJU_ll = JPHEXT*2 + ELSE IF ( HLBTYPE == 'LBYV') THEN + IJU_ll = (IRIM_ll+JPHEXT)*2 END IF IF (MPPDB_IRANK_WORLD.EQ.0) THEN ! I/O proc case ALLOCATE(Z3D(IIU_ll,IJU_ll,SIZE(PLB,3))) DO JI = 1,ISNPROC - CALL GET_DISTRIB_LB(HLBTYPE,JI,'FM','WRITE',KRIM,IIB,IIE,IJB,IJE) + CALL GET_DISTRIB_LB(HLBTYPE,JI,'FM','WRITE',IRIM_ll,IIB,IIE,IJB,IJE) IF (IIB /= 0) THEN TX3DP=>Z3D(IIB:IIE,IJB:IJE,:) IF (ISP /= JI) THEN CALL MPI_RECV(TX3DP,SIZE(TX3DP),MNHREAL_MPI,JI-1 & ,99,NMNH_COMM_WORLD,MPI_STATUS_IGNORE,IINFO_ll) ELSE - CALL GET_DISTRIB_LB(HLBTYPE,JI,'LOC','WRITE',KRIM,IIB,IIE,IJB,IJE) + CALL GET_DISTRIB_LB(HLBTYPE,JI,'LOC','WRITE',IRIM_ll,IIB,IIE,IJB,IJE) TX3DP = PLB(IIB:IIE,IJB:IJE,:) END IF END IF @@ -703,7 +746,7 @@ CONTAINS ELSE ! Other processors - CALL GET_DISTRIB_LB(HLBTYPE,ISP,'LOC','WRITE',KRIM,IIB,IIE,IJB,IJE) + CALL GET_DISTRIB_LB(HLBTYPE,ISP,'LOC','WRITE',IRIM_ll,IIB,IIE,IJB,IJE) IF (IIB /= 0) THEN TX3DP=>PLB(IIB:IIE,IJB:IJE,:) CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MNHREAL_MPI,0,99,NMNH_COMM_WORLD,IINFO_ll) @@ -727,12 +770,16 @@ CONTAINS IIU_SON_ll = IIMAX_ll+2*IHEXT_SON_ll IJU_SON_ll = IJMAX_ll+2*IHEXT_SON_ll IKU_SON_ll = SIZE(PLB,3) - IRIM_SON_ll = (KRIM+IHEXT_SON_ll)*2 + IRIM_SON_ll = MAX(1,KRIM) ! - IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN - IIU_SON_ll = IRIM_SON_ll - ELSE - IJU_SON_ll = IRIM_SON_ll + IF (HLBTYPE == 'LBX' ) THEN + IIU_SON_ll = IHEXT_SON_ll*2 + ELSE IF ( HLBTYPE == 'LBXU') THEN + IIU_SON_ll = (IRIM_SON_ll+IHEXT_SON_ll)*2 + ELSE IF ( HLBTYPE == 'LBY') THEN + IJU_SON_ll = IHEXT_SON_ll*2 + ELSE IF ( HLBTYPE == 'LBYV') THEN + IJU_SON_ll = (IRIM_SON_ll+IHEXT_SON_ll)*2 END IF ! ALLOCATE(TAB_SON_ll(IIU_SON_ll,IJU_SON_ll,IKU_SON_ll)) @@ -765,13 +812,16 @@ CONTAINS IJB_SON_ll-IDIFF_HEXT:IJE_SON_ll+IDIFF_HEXT,1:IKU_SON_ll) ) ) IF ( MAX_VAL .EQ. 0.0 ) MAX_VAL = 1.0 ! + IMI = GET_CURRENT_MODEL_INDEX() MAX_DIFF=MAXVAL(Z3D(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT,1:IKU_ll)/MAX_VAL) TAB_INTERIOR_ll=> Z3D(IIB_ll-IDIFF_HEXT:IIE_ll+IDIFF_HEXT,IJB_ll-IDIFF_HEXT:IJE_ll+IDIFF_HEXT,1:IKU_ll) ! IF (MAX_DIFF > PRECISION ) THEN - print*," MPPDB_CHECKLB :: PB MPPDB_CHECKLB =", MESSAGE ," ERROR=",MAX_DIFF , MAX_VAL + write(6, '(" MPPDB_CHECKLB :: PB MPPDB_CHECKLB =",A40," ERROR=",e15.8," MAXVAL=",e15.8," IMI=",I3.3)' ) & + MESSAGE ,MAX_DIFF , MAX_VAL , IMI ELSE - print*," MPPDB_CHECKLB :: OK MPPDB_CHECKLB =", MESSAGE ," ERROR=",MAX_DIFF , MAX_VAL + write(6, '(" MPPDB_CHECKLB :: OK MPPDB_CHECKLB =",A40," ERROR=",e15.8," MAXVAL=",e15.8," IMI=",I3.3)' ) & + MESSAGE ,MAX_DIFF , MAX_VAL , IMI END IF flush(unit=OUTPUT_UNIT) ! @@ -831,7 +881,7 @@ CONTAINS INTEGER :: KSIZE INTEGER :: KSIZE_FULL ! - IF ( ( .NOT. MPPDB_INITIALIZED ) ) RETURN + IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN ! ! IF ( SIZE(PTAB) == 0 ) THEN ! ALLOCATE(ZFIELD2D(0,0)) @@ -935,7 +985,7 @@ CONTAINS INTEGER :: IINFO_ll INTEGER :: IKSIZE_ll ! - IF ( ( .NOT. MPPDB_INITIALIZED ) ) RETURN + IF ( ( .NOT. MPPDB_INITIALIZED ) .OR. ( .NOT. MPPDB_ACTIVED ) ) RETURN CALL MPI_ALLREDUCE(SIZE(PTAB), IGLBSIZEPTAB, 1,MNHINT_MPI, MPI_SUM, MPPDB_INTRA_COMM, IINFO_ll) IF ( IGLBSIZEPTAB == 0 ) RETURN CALL MPI_ALLREDUCE(SIZE(PTAB,2),IKSIZE_ll, 1, MNHINT_MPI, MPI_MAX, MPPDB_INTRA_COMM, IINFO_ll) diff --git a/src/MNH/boundaries.f90 b/src/MNH/boundaries.f90 index 046a28af3..4aa484090 100644 --- a/src/MNH/boundaries.f90 +++ b/src/MNH/boundaries.f90 @@ -420,6 +420,24 @@ ELSE ! END IF ! +! ============================================================ +! +! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result +! +ZLBXVT(:,:,:) = real(ZLBXVT(:,:,:),kind=4) +ZLBXWT(:,:,:) = real(ZLBXWT(:,:,:),kind=4) +ZLBXTHT(:,:,:) = real(ZLBXTHT(:,:,:),kind=4) +IF ( SIZE(PTKET,1) /= 0 ) THEN + ZLBXTKET(:,:,:) = real(ZLBXTKET(:,:,:),kind=4) +END IF +IF ( KRR > 0) THEN + ZLBXRT(:,:,:,:) = real(ZLBXRT(:,:,:,:),kind=4) +END IF +IF ( KSV > 0) THEN + ZLBXSVT(:,:,:,:) = real(ZLBXSVT(:,:,:,:),kind=4) +END IF +! ============================================================ +! IF ( SIZE(PLBYTHS,1) /= 0 .AND. & ( HLBCY(1)=='OPEN' .OR. HLBCY(2)=='OPEN' )) THEN ZLBYUT(:,:,:) = PLBYUM(:,:,:) + ZTSTEP * PLBYUS(:,:,:) @@ -453,6 +471,24 @@ ELSE END IF ! ! +! ============================================================ +! +! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result +! +ZLBYUT(:,:,:) = real(ZLBYUT(:,:,:),kind=4) +ZLBYWT(:,:,:) = real(ZLBYWT(:,:,:),kind=4) +ZLBYTHT(:,:,:) = real(ZLBYTHT(:,:,:),kind=4) +IF ( SIZE(PTKET,1) /= 0 ) THEN + ZLBYTKET(:,:,:) = real(ZLBYTKET(:,:,:),kind=4) +END IF +IF ( KRR > 0) THEN + ZLBYRT(:,:,:,:) = real(ZLBYRT(:,:,:,:),kind=4) +END IF +IF ( KSV > 0) THEN + ZLBYSVT(:,:,:,:) = real(ZLBYSVT(:,:,:,:),kind=4) +END IF +! ============================================================ +! !------------------------------------------------------------------------------- ! PONDERATION COEFF for Non-Normal velocities and pot temperature ! diff --git a/src/MNH/budget.f90 b/src/MNH/budget.f90 index 13c746c43..5e7dd0809 100644 --- a/src/MNH/budget.f90 +++ b/src/MNH/budget.f90 @@ -7,6 +7,7 @@ ! P. Wautelet 28/01/2020: new subroutines: Budget_store_init, Budget_store_end and Budget_source_id_find in new module mode_budget ! P. Wautelet 17/08/2020: treat LES budgets correctly ! P. Wautelet 05/03/2021: measure cpu_time for budgets +! J.Escobar : 06/10/2021 :for bit reproductiblity use MPPDB_CHECK if LCHECK=T !----------------------------------------------------------------- !################# @@ -36,6 +37,8 @@ contains subroutine Budget_store_init( tpbudget, hsource, pvars ) use modd_les, only: lles_call + USE MODE_MPPDB + USE MODD_CONF, ONLY : LCHECK type(tbudgetdata), intent(inout) :: tpbudget ! Budget datastructure character(len=*), intent(in) :: hsource ! Name of the source term @@ -43,7 +46,15 @@ subroutine Budget_store_init( tpbudget, hsource, pvars ) integer :: iid ! Reference number of the current source term - call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_store_init', trim( tpbudget%cname )//':'//trim( hsource ) ) + character(len=:),allocatable :: hbudget + + hbudget = trim( tpbudget%cname )//':'//trim( hsource ) + + IF (LCHECK) THEN + CALL MPPDB_CHECK3D(PVARS,'BUD_INI::'//hbudget,PRECISION) + END IF + + call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_store_init', hbudget ) if ( lles_call ) then call Second_mnh( ztime1 ) @@ -112,6 +123,8 @@ subroutine Budget_store_init( tpbudget, hsource, pvars ) subroutine Budget_store_end( tpbudget, hsource, pvars ) use modd_les, only: lles_call + USE MODE_MPPDB + USE MODD_CONF, ONLY : LCHECK use modi_les_budget, only: Les_budget @@ -123,7 +136,14 @@ subroutine Budget_store_end( tpbudget, hsource, pvars ) integer :: igroup ! Number of the group where to store the source term real, dimension(:,:,:), allocatable :: zvars_add - call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_store_end', trim( tpbudget%cname )//':'//trim( hsource ) ) + character(len=:),allocatable :: hbudget + + hbudget = trim( tpbudget%cname )//':'//trim( hsource ) + + IF (LCHECK) THEN + CALL MPPDB_CHECK3D(PVARS,'BUD_END::'//hbudget,PRECISION) + END IF + call Print_msg( NVERB_DEBUG, 'BUD', 'Budget_store_end', hbudget ) if ( lles_call ) then if ( hsource /= tpbudget%clessource ) & diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 48b3a7348..718f11ce6 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -1798,7 +1798,7 @@ gles = lles_mean .or. lles_resolved .or. lles_subgrid .or. lles_updraft & .or. lles_downdraft .or. lles_spectra !Called if budgets are enabled via NAM_BUDGET !or if LES budgets are enabled via NAM_LES (condition on kmi==1 to call it max once) -if ( ( cbutype /= "NONE" .and. nbumod == kmi ) .or. ( gles .and. kmi == 1 ) ) THEN +if ( ( cbutype /= "NONE" .and. nbumod == kmi ) .or. ( gles .and. kmi == 1 ) .or. LCHECK ) THEN call Budget_preallocate() end if @@ -1913,7 +1913,7 @@ CALL READ_FIELD(KMI,TPINIFILE,IIU,IJU,IKU, & NSIZELBXR_ll,NSIZELBYR_ll,NSIZELBXSV_ll,NSIZELBYSV_ll, & XUM,XVM,XWM,XDUM,XDVM,XDWM, & XUT,XVT,XWT,XTHT,XPABST,XTKET,XRTKEMS, & - XRT,XSVT,XZWS,XCIT,XDRYMASST, & + XRT,XSVT,XZWS,XCIT,XDRYMASST,XDRYMASSS, & XSIGS,XSRCT,XCLDFR,XBL_DEPTH,XSBL_DEPTH,XWTHVMF,XPHC,XPHR, & XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,XLSZWSM, & XLBXUM,XLBXVM,XLBXWM,XLBXTHM,XLBXTKEM, & @@ -1968,8 +1968,8 @@ CALL INI_LES_n !* 11. INITIALIZE THE SOURCE OF TOTAL DRY MASS Md ! ------------------------------------------ ! -IF((KMI==1).AND.LSTEADYLS) THEN - XDRYMASSS = 0. +IF((KMI==1).AND.LSTEADYLS .AND. (CCONF=='START') ) THEN + XDRYMASSS = 0. END IF ! !------------------------------------------------------------------------------- @@ -2163,20 +2163,22 @@ IF ( KMI > 1) THEN DPTR_XLBYRM=>XLBYRM DPTR_XLBXSVM=>XLBXSVM DPTR_XLBYSVM=>XLBYSVM - CALL INI_ONE_WAY_n(NDAD(KMI),KMI, & - DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & - DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & - NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & - DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY, & - DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & - DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & - DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & - DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM, & - CCLOUD, LUSECHAQ, LUSECHIC, & - DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM, & - DPTR_XLBXTHM,DPTR_XLBYTHM, & - DPTR_XLBXTKEM,DPTR_XLBYTKEM, & - DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM ) + IF (CCONF=='START') THEN + CALL INI_ONE_WAY_n(NDAD(KMI),KMI, & + DPTR_XBMX1,DPTR_XBMX2,DPTR_XBMX3,DPTR_XBMX4,DPTR_XBMY1,DPTR_XBMY2,DPTR_XBMY3,DPTR_XBMY4, & + DPTR_XBFX1,DPTR_XBFX2,DPTR_XBFX3,DPTR_XBFX4,DPTR_XBFY1,DPTR_XBFY2,DPTR_XBFY3,DPTR_XBFY4, & + NDXRATIO_ALL(KMI),NDYRATIO_ALL(KMI), & + DPTR_CLBCX,DPTR_CLBCY,NRIMX,NRIMY, & + DPTR_NKLIN_LBXU,DPTR_XCOEFLIN_LBXU,DPTR_NKLIN_LBYU,DPTR_XCOEFLIN_LBYU, & + DPTR_NKLIN_LBXV,DPTR_XCOEFLIN_LBXV,DPTR_NKLIN_LBYV,DPTR_XCOEFLIN_LBYV, & + DPTR_NKLIN_LBXW,DPTR_XCOEFLIN_LBXW,DPTR_NKLIN_LBYW,DPTR_XCOEFLIN_LBYW, & + DPTR_NKLIN_LBXM,DPTR_XCOEFLIN_LBXM,DPTR_NKLIN_LBYM,DPTR_XCOEFLIN_LBYM, & + CCLOUD, LUSECHAQ, LUSECHIC, & + DPTR_XLBXUM,DPTR_XLBYUM,DPTR_XLBXVM,DPTR_XLBYVM,DPTR_XLBXWM,DPTR_XLBYWM, & + DPTR_XLBXTHM,DPTR_XLBYTHM, & + DPTR_XLBXTKEM,DPTR_XLBYTKEM, & + DPTR_XLBXRM,DPTR_XLBYRM,DPTR_XLBXSVM,DPTR_XLBYSVM ) + ENDIF END IF ! ! diff --git a/src/MNH/mesonh.f90 b/src/MNH/mesonh.f90 index 84017a6b9..ac5f3cdef 100644 --- a/src/MNH/mesonh.f90 +++ b/src/MNH/mesonh.f90 @@ -134,6 +134,7 @@ INTEGER :: IINFO_ll ! return code of // routines ! Switch to model 1 variables #ifndef CPLOASIS CALL MPPDB_INIT() +CALL MPPDB_STOP_DEBUG() #endif ! CALL GOTO_MODEL(1,ONOFIELDLIST=.TRUE.) diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index c3002495d..6ba8d8398 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -944,6 +944,14 @@ CALL SECOND_MNH2(ZTIME2) ! XT_BOUND = XT_BOUND + ZTIME2 - ZTIME1 ! +! +! For START/RESTART MPPDB_CHECK use +!IF ( (IMI==1) .AND. (CCONF == "START") .AND. (KTCOUNT == 2) ) THEN +! CALL MPPDB_START_DEBUG() +!ENDIF +!IF ( (IMI==1) .AND. (CCONF == "RESTA") .AND. (KTCOUNT == 1) ) THEN +! CALL MPPDB_START_DEBUG() +!ENDIF !------------------------------------------------------------------------------- !* initializes surface number IF (CSURF=='EXTE') CALL GOTO_SURFEX(IMI) @@ -1711,14 +1719,20 @@ CALL MPPDB_CHECK3DM("before RAD_BOUND :XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) ZRUS=XRUS ZRVS=XRVS ZRWS=XRWS - +! if ( .not. l1d ) then if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'PRES', xrus(:, :, :) ) if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'PRES', xrvs(:, :, :) ) if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'PRES', xrws(:, :, :) ) end if - -CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX, & +! +CALL MPPDB_CHECK3DM("before RAD_BOUND : other var",PRECISION,XUT,XVT,XRHODJ,XTKET) +CALL MPPDB_CHECKLB(XLBXUM,"modeln XLBXUM",PRECISION,'LBXU',NRIMX) +CALL MPPDB_CHECKLB(XLBYVM,"modeln XLBYVM",PRECISION,'LBYV',NRIMY) +CALL MPPDB_CHECKLB(XLBXUS,"modeln XLBXUS",PRECISION,'LBXU',NRIMX) +CALL MPPDB_CHECKLB(XLBYVS,"modeln XLBYVS",PRECISION,'LBYV',NRIMY) +! + CALL RAD_BOUND (CLBCX,CLBCY,CTURB,XCARPKMAX, & XTSTEP, & XDXHAT, XDYHAT, XZHAT, & XUT, XVT, & @@ -1764,6 +1778,7 @@ CALL MPPDB_CHECK3DM("before pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) XRUS_PRES = XRUS - XRUS_PRES + ZRUS XRVS_PRES = XRVS - XRVS_PRES + ZRVS XRWS_PRES = XRWS - XRWS_PRES + ZRWS + CALL MPPDB_CHECK3DM("after pressurez:XRU/V/WS",PRECISION,XRUS,XRVS,XRWS) ! END IF ! diff --git a/src/MNH/num_diff.f90 b/src/MNH/num_diff.f90 index 65c221c73..5e3f8d260 100644 --- a/src/MNH/num_diff.f90 +++ b/src/MNH/num_diff.f90 @@ -1120,18 +1120,18 @@ CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) TPHALO2%WEST(:,:) + PFIELDM(IW+1,:,:) & -4.*( PFIELDM(IW-2,:,:) + PFIELDM(IW,:,:) ) & +6.* PFIELDM(IW-1,:,:) & - - TPHALO2LS%WEST(:,:) - PLSFIELD(IW+1,:,:) & - +4.*( PLSFIELD(IW-2,:,:) + PLSFIELD(IW,:,:) ) & - -6.* PLSFIELD(IW-1,:,:) ) + - real(TPHALO2LS%WEST(:,:),kind=4) - real(PLSFIELD(IW+1,:,:),kind=4) & + +4.*( real(PLSFIELD(IW-2,:,:),kind=4) + real(PLSFIELD(IW,:,:),kind=4) ) & + -6.* real(PLSFIELD(IW-1,:,:),kind=4) ) ! PRFIELDS(IE+1,:,:) = PRFIELDS(IE+1,:,:) - PRHODJ(IE+1,:,:) * & PDK4*( & PFIELDM(IE-1,:,:) + TPHALO2%EAST(:,:) & -4.*( PFIELDM(IE,:,:) + PFIELDM(IE+2,:,:) ) & +6.* PFIELDM(IE+1,:,:) & - - PLSFIELD(IE-1,:,:) - TPHALO2LS%EAST(:,:) & - +4.*( PLSFIELD(IE,:,:) + PLSFIELD(IE+2,:,:) ) & - -6.* PLSFIELD(IE+1,:,:) ) + - real(PLSFIELD(IE-1,:,:),kind=4) - real(TPHALO2LS%EAST(:,:),kind=4) & + +4.*( real(PLSFIELD(IE,:,:),kind=4) + real(PLSFIELD(IE+2,:,:),kind=4) ) & + -6.* real(PLSFIELD(IE+1,:,:),kind=4) ) ! !!$ ENDIF ! @@ -1143,9 +1143,9 @@ CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) PFIELDM(IW-2:IE-2,:,:) + PFIELDM(IW+2:IE+2,:,:) & -4.*( PFIELDM(IW-1:IE-1,:,:) + PFIELDM(IW+1:IE+1,:,:) ) & +6.* PFIELDM(IW:IE,:,:) & - - PLSFIELD(IW-2:IE-2,:,:) - PLSFIELD(IW+2:IE+2,:,:) & - +4.*( PLSFIELD(IW-1:IE-1,:,:) + PLSFIELD(IW+1:IE+1,:,:) ) & - -6.* PLSFIELD(IW:IE,:,:)) + - real(PLSFIELD(IW-2:IE-2,:,:),kind=4) - real(PLSFIELD(IW+2:IE+2,:,:),kind=4) & + +4.*( real(PLSFIELD(IW-1:IE-1,:,:),kind=4) + real(PLSFIELD(IW+1:IE+1,:,:),kind=4) ) & + -6.* real(PLSFIELD(IW:IE,:,:),kind=4) ) ! ELSE ! @@ -1215,7 +1215,7 @@ CASE ('OPEN','WALL','NEST') PRFIELDS(IW-1,:,:) = PRFIELDS(IW-1,:,:) + PRHODJ(IW-1,:,:) * & PDK2*( & PFIELDM(IW-2,:,:) -2.*PFIELDM(IW-1,:,:) + PFIELDM(IW,:,:) & - -PLSFIELD(IW-2,:,:) +2.*PLSFIELD(IW-1,:,:) - PLSFIELD(IW,:,:) ) + -real(PLSFIELD(IW-2,:,:),kind=4) +2.*real(PLSFIELD(IW-1,:,:),kind=4) - real(PLSFIELD(IW,:,:),kind=4) ) ! !!$ ELSEIF (NHALO == 1) THEN ELSE @@ -1225,9 +1225,9 @@ CASE ('OPEN','WALL','NEST') TPHALO2%WEST(:,:) + PFIELDM(IW+1,:,:) & -4.*( PFIELDM(IW-2,:,:) + PFIELDM(IW,:,:) ) & +6.* PFIELDM(IW-1,:,:) & - - TPHALO2LS%WEST(:,:) - PLSFIELD(IW+1,:,:) & - +4.*( PLSFIELD(IW-2,:,:) + PLSFIELD(IW,:,:) ) & - -6.* PLSFIELD(IW-1,:,:) ) + - real(TPHALO2LS%WEST(:,:),kind=4) - real(PLSFIELD(IW+1,:,:),kind=4) & + +4.*( real(PLSFIELD(IW-2,:,:),kind=4) + real(PLSFIELD(IW,:,:),kind=4) ) & + -6.* real(PLSFIELD(IW-1,:,:),kind=4) ) ! ENDIF ! @@ -1236,7 +1236,7 @@ CASE ('OPEN','WALL','NEST') PRFIELDS(IE+1,:,:) = PRFIELDS(IE+1,:,:) + PRHODJ(IE+1,:,:) * & PDK2*( & PFIELDM(IE,:,:) -2.*PFIELDM(IE+1,:,:) + PFIELDM(IE+2,:,:) & - - PLSFIELD(IE,:,:) +2.*PLSFIELD(IE+1,:,:) - PLSFIELD(IE+2,:,:) ) + - real(PLSFIELD(IE,:,:),kind=4) +2.*real(PLSFIELD(IE+1,:,:),kind=4) - real(PLSFIELD(IE+2,:,:),kind=4) ) ! !!$ ELSEIF (NHALO == 1) THEN ELSE @@ -1246,9 +1246,9 @@ CASE ('OPEN','WALL','NEST') PFIELDM(IE-1,:,:) + TPHALO2%EAST(:,:) & -4.*( PFIELDM(IE ,:,:) + PFIELDM(IE+2,:,:) ) & +6.* PFIELDM(IE+1,:,:) & - - PLSFIELD(IE-1,:,:) - TPHALO2LS%EAST(:,:) & - +4.*( PLSFIELD(IE ,:,:) + PLSFIELD(IE+2,:,:)) & - -6.* PLSFIELD(IE+1,:,:)) + - real(PLSFIELD(IE-1,:,:),kind=4) - real(TPHALO2LS%EAST(:,:),kind=4) & + +4.*( real(PLSFIELD(IE ,:,:),kind=4) + real(PLSFIELD(IE+2,:,:),kind=4) ) & + -6.* real(PLSFIELD(IE+1,:,:),kind=4) ) ! ENDIF @@ -1262,9 +1262,9 @@ CASE ('OPEN','WALL','NEST') PFIELDM(IW-2:IE-2,:,:) + PFIELDM(IW+2:IE+2,:,:) & -4.*( PFIELDM(IW-1:IE-1,:,:) + PFIELDM(IW+1:IE+1,:,:) ) & +6.* PFIELDM(IW:IE,:,:) & - - PLSFIELD(IW-2:IE-2,:,:) - PLSFIELD(IW+2:IE+2,:,:) & - +4.*( PLSFIELD(IW-1:IE-1,:,:) + PLSFIELD(IW+1:IE+1,:,:) ) & - -6.* PLSFIELD(IW:IE,:,:)) + - real(PLSFIELD(IW-2:IE-2,:,:),kind=4) - real(PLSFIELD(IW+2:IE+2,:,:),kind=4) & + +4.*( real(PLSFIELD(IW-1:IE-1,:,:),kind=4) + real(PLSFIELD(IW+1:IE+1,:,:),kind=4) ) & + -6.* real(PLSFIELD(IW:IE,:,:),kind=4) ) ! ELSE ! @@ -1353,18 +1353,18 @@ IF ( .NOT. L2D ) THEN TPHALO2%SOUTH(:,:) + PFIELDM(:,IS+1,:) & -4.*( PFIELDM(:,IS-2,:) + PFIELDM(:,IS,:) ) & +6.* PFIELDM(:,IS-1,:) & - - TPHALO2LS%SOUTH(:,:) - PLSFIELD(:,IS+1,:) & - +4.*( PLSFIELD(:,IS-2,:) + PLSFIELD(:,IS,:) ) & - -6.* PLSFIELD(:,IS-1,:) ) + - real(TPHALO2LS%SOUTH(:,:),kind=4) - real(PLSFIELD(:,IS+1,:),kind=4) & + +4.*( real(PLSFIELD(:,IS-2,:),kind=4) + real(PLSFIELD(:,IS,:),kind=4) ) & + -6.* real(PLSFIELD(:,IS-1,:),kind=4) ) ! PRFIELDS(:,IN+1,:) = PRFIELDS(:,IN+1,:) - PRHODJ(:,IN+1,:) * & PDK4*( & PFIELDM(:,IN-1,:) + TPHALO2%NORTH(:,:) & -4.*( PFIELDM(:,IN,:) + PFIELDM(:,IN+2,:) ) & +6.* PFIELDM(:,IN+1,:) & - - PLSFIELD(:,IN-1,:) - TPHALO2LS%NORTH(:,:) & - +4.*( PLSFIELD(:,IN,:) + PLSFIELD(:,IN+2,:) ) & - -6.* PLSFIELD(:,IN+1,:) ) + - real(PLSFIELD(:,IN-1,:),kind=4) - real(TPHALO2LS%NORTH(:,:),kind=4) & + +4.*( real(PLSFIELD(:,IN,:),kind=4) + real(PLSFIELD(:,IN+2,:),kind=4) ) & + -6.* real(PLSFIELD(:,IN+1,:),kind=4) ) ! !!$ ENDIF ! @@ -1376,9 +1376,9 @@ IF ( .NOT. L2D ) THEN PFIELDM(:,IS-2:IN-2,:) + PFIELDM(:,IS+2:IN+2,:) & -4.*( PFIELDM(:,IS-1:IN-1,:) + PFIELDM(:,IS+1:IN+1,:) ) & +6.* PFIELDM(:,IS:IN,:) & - - PLSFIELD(:,IS-2:IN-2,:) - PLSFIELD(:,IS+2:IN+2,:) & - +4.*( PLSFIELD(:,IS-1:IN-1,:) + PLSFIELD(:,IS+1:IN+1,:) ) & - -6.* PLSFIELD(:,IS:IN,:) ) + - real(PLSFIELD(:,IS-2:IN-2,:),kind=4) - real(PLSFIELD(:,IS+2:IN+2,:),kind=4) & + +4.*( real(PLSFIELD(:,IS-1:IN-1,:),kind=4) + real(PLSFIELD(:,IS+1:IN+1,:),kind=4) ) & + -6.* real(PLSFIELD(:,IS:IN,:),kind=4) ) ! ELSE ! @@ -1449,7 +1449,7 @@ IF ( .NOT. L2D ) THEN PRFIELDS(:,IS-1,:) = PRFIELDS(:,IS-1,:) + PRHODJ(:,IS-1,:) * & PDK2*( & PFIELDM(:,IS-2,:) -2.*PFIELDM(:,IS-1,:) + PFIELDM(:,IS,:) & - -PLSFIELD(:,IS-2,:) +2.*PLSFIELD(:,IS-1,:) - PLSFIELD(:,IS,:) ) + -real(PLSFIELD(:,IS-2,:),kind=4) +2.*real(PLSFIELD(:,IS-1,:),kind=4) - real(PLSFIELD(:,IS,:),kind=4) ) ! !!$ ELSEIF (NHALO == 1) THEN ELSE @@ -1459,9 +1459,9 @@ IF ( .NOT. L2D ) THEN TPHALO2%SOUTH(:,:) + PFIELDM(:,IS+1,:) & -4.*( PFIELDM(:,IS-2,:) + PFIELDM(:,IS,:) ) & +6.* PFIELDM(:,IS-1,:) & - - TPHALO2LS%SOUTH(:,:) - PLSFIELD(:,IS+1,:) & - +4.*( PLSFIELD(:,IS-2,:) + PLSFIELD(:,IS,:) ) & - -6.* PLSFIELD(:,IS-1,:) ) + - real(TPHALO2LS%SOUTH(:,:),kind=4) - real(PLSFIELD(:,IS+1,:),kind=4) & + +4.*( real(PLSFIELD(:,IS-2,:),kind=4) + real(PLSFIELD(:,IS,:),kind=4) ) & + -6.* real(PLSFIELD(:,IS-1,:),kind=4) ) ! ENDIF ! @@ -1470,7 +1470,7 @@ IF ( .NOT. L2D ) THEN PRFIELDS(:,IN+1,:) = PRFIELDS(:,IN+1,:) + PRHODJ(:,IN+1,:) * & PDK2*( & PFIELDM(:,IN,:) -2.*PFIELDM(:,IN+1,:) + PFIELDM(:,IN+2,:) & - -PLSFIELD(:,IN,:) +2.*PLSFIELD(:,IN+1,:) - PLSFIELD(:,IN+2,:) ) + -real(PLSFIELD(:,IN,:),kind=4) +2.*real(PLSFIELD(:,IN+1,:),kind=4) - real(PLSFIELD(:,IN+2,:),kind=4) ) ! !!$ ELSEIF (NHALO == 1) THEN ELSE @@ -1480,9 +1480,9 @@ IF ( .NOT. L2D ) THEN PFIELDM(:,IN-1,:) + TPHALO2%NORTH(:,:) & -4.*( PFIELDM(:,IN,:) + PFIELDM(:,IN+2,:) ) & +6.* PFIELDM(:,IN+1,:) & - - PLSFIELD(:,IN-1,:) - TPHALO2LS%NORTH(:,:) & - +4.*( PLSFIELD(:,IN,:) + PLSFIELD(:,IN+2,:) ) & - -6.* PLSFIELD(:,IN+1,:) ) + - real(PLSFIELD(:,IN-1,:),kind=4) - real(TPHALO2LS%NORTH(:,:),kind=4) & + +4.*( real(PLSFIELD(:,IN,:),kind=4) + real(PLSFIELD(:,IN+2,:),kind=4) ) & + -6.* real(PLSFIELD(:,IN+1,:),kind=4) ) ! ENDIF ! @@ -1496,9 +1496,9 @@ IF ( .NOT. L2D ) THEN PFIELDM(:,IS-2:IN-2,:) + PFIELDM(:,IS+2:IN+2,:) & -4.*( PFIELDM(:,IS-1:IN-1,:) + PFIELDM(:,IS+1:IN+1,:) ) & +6.* PFIELDM(:,IS:IN,:) & - - PLSFIELD(:,IS-2:IN-2,:) - PLSFIELD(:,IS+2:IN+2,:) & - +4.*( PLSFIELD(:,IS-1:IN-1,:) + PLSFIELD(:,IS+1:IN+1,:) ) & - -6.* PLSFIELD(:,IS:IN,:) ) + - real(PLSFIELD(:,IS-2:IN-2,:),kind=4) - real(PLSFIELD(:,IS+2:IN+2,:),kind=4) & + +4.*( real(PLSFIELD(:,IS-1:IN-1,:),kind=4) + real(PLSFIELD(:,IS+1:IN+1,:),kind=4) ) & + -6.* real(PLSFIELD(:,IS:IN,:),kind=4) ) ! ELSE diff --git a/src/MNH/one_wayn.f90 b/src/MNH/one_wayn.f90 index 035f94986..eac7238d6 100644 --- a/src/MNH/one_wayn.f90 +++ b/src/MNH/one_wayn.f90 @@ -126,7 +126,7 @@ SUBROUTINE ONE_WAY_n(KDAD,PTSTEP,KMI,KTCOUNT, & !* 0. DECLARATIONS ! ------------ USE MODD_CH_MNHC_n, only: LUSECHAQ, LUSECHIC -USE MODD_CONF, only: CEQNSYS +USE MODD_CONF, only: CEQNSYS,CCONF USE MODD_CST, only: XCPD, XP00, XRD, XRV, XTH00 USE MODD_DYN_n, ONLY: LOCEAN USE MODD_FIELD_n, only: XPABST, XRT, XSVT, XUT, XVT, XWT, XTHT, XTKET @@ -683,22 +683,8 @@ IF(.NOT. OSTEADY_DMASS) THEN ! !* 4.5 segment beginning (we have first to recover the dry mass at T-DT) ! - IF(SIZE(XRT,4) == 0) THEN - ! dry air case -! ------------ - ZRHOD(:,:,:) = XPABST(:,:,:)/(XPABST(:,:,:)/XP00)**ZRD_O_CPD/(XRD*XTHT(:,:,:)) - ELSE ! moist air case -! -------------- - ZRHOD(:,:,:) = XPABST(:,:,:)/(XPABST(:,:,:)/XP00)**ZRD_O_CPD/(XRD*XTHT(:,:,:) & - *(1.+ZRV_O_RD*XRT(:,:,:,1))) - ENDIF -! -! - ZDRYMASSM = SUM3D_ll (ZJ(:,:,:)*ZRHOD(:,:,:),IINFO_ll,NXOR_ALL(KMI)+JPHEXT,NYOR_ALL(KMI)+JPHEXT, & - 1+JPVEXT,NXEND_ALL(KMI)-JPHEXT,NYEND_ALL(KMI)-JPHEXT,SIZE(XRHODJ,3)-JPVEXT) -! - PDRYMASST = ZDRYMASST - PDRYMASSS = (PDRYMASST - ZDRYMASSM) / (PTSTEP*KDTRATIO) + PDRYMASST = ZDRYMASST + IF ( CCONF /= 'RESTA' ) PDRYMASSS = 0. ENDIF ! END IF diff --git a/src/MNH/rad_bound.f90 b/src/MNH/rad_bound.f90 index 296d476b4..e023abde4 100644 --- a/src/MNH/rad_bound.f90 +++ b/src/MNH/rad_bound.f90 @@ -317,6 +317,14 @@ SELECT CASE ( HLBCX(1) ) ! + ZKTSTEP*( ZLBXU(:,:) ) ) & ! ) * ZINVTSTEP / (1.+ ZCPHASX(:,:) +ZKTSTEP) ! +! ============================================================ +! +! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result +! + ZLBEU = real(ZLBEU,kind=4) + ZLBGU = real(ZLBGU,kind=4) + ZLBXU = real(ZLBXU,kind=4) +! ============================================================ PRUS (IIB,:,:) =(PRHODJ(IIB-1,:,:) + PRHODJ(IIB,:,:)) * 0.5 * & ZINVTSTEP / (1.+ ZKTSTEP * ZALPHA2 ) * & ( (1. - ZCPHASX(:,:) - ZKTSTEP * (1. - ZALPHA2)) * PUT(IIB,:,:) & @@ -374,7 +382,7 @@ SELECT CASE ( HLBCX(2) ) ZLBXU(:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) END IF ELSE - ZLBEU (:,:) = PLBXUS(ILBX-JPHEXT+1,:,:) + ZLBEU (:,:) = PLBXUS(ILBX-JPHEXT+1,:,:) ZLBGU (:,:) = PLBXUM(ILBX-JPHEXT+1,:,:) - PLBXUM(ILBX-JPHEXT,:,:) + & PTSTEP * (PLBXUS(ILBX-JPHEXT+1,:,:) - PLBXUS(ILBX-JPHEXT,:,:)) IF ( LRECYCL ) THEN @@ -393,7 +401,15 @@ SELECT CASE ( HLBCX(2) ) ! + ZLBGU (:,:) * ZCPHASX(:,:) & ! + ZKTSTEP*ZLBXU(:,:) ) & ! ) * ZINVTSTEP / (1.+ZCPHASX(:,:) +ZKTSTEP) -! +! +! ============================================================ +! +! Reproductibility for RSTART -> truncate ZLB to real(knd=4) +! + ZLBEU = real(ZLBEU,kind=4) + ZLBGU = real(ZLBGU,kind=4) + ZLBXU = real(ZLBXU,kind=4) +! ============================================================ PRUS (IIE+1,:,:) =(PRHODJ(IIE+1,:,:) + PRHODJ(IIE,:,:)) * 0.5 * & ZINVTSTEP / (1.+ ZKTSTEP * ZALPHA2 ) * & ( (1. - ZCPHASX(:,:) - ZKTSTEP * (1. - ZALPHA2) ) * PUT(IIE+1,:,:) & @@ -469,6 +485,15 @@ SELECT CASE ( HLBCY(1) ) ! - ZLBGV (:,:) * ZCPHASY(:,:) & ! + ZKTSTEP*ZLBYV(:,:) ) & ! ) * ZINVTSTEP / (1.+ ZCPHASY(:,:) +ZKTSTEP) +! +! ============================================================ +! +! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result +! + ZLBEV = real(ZLBEV,kind=4) + ZLBGV = real(ZLBGV,kind=4) + ZLBYV = real(ZLBYV,kind=4) +! ============================================================ PRVS (:,IJB,:) =(PRHODJ(:,IJB-1,:) + PRHODJ(:,IJB,:)) * 0.5 * & ZINVTSTEP / (1.+ ZKTSTEP * ZALPHA2 ) * & ( (1. - ZCPHASY(:,:) - ZKTSTEP * (1. - ZALPHA2) ) * PVT(:,IJB,:)& @@ -546,6 +571,14 @@ SELECT CASE ( HLBCY(2) ) ! + ZKTSTEP* ZLBYV(:,:) ) & ! ) * ZINVTSTEP / (1.+ ZCPHASY(:,:) +ZKTSTEP) ! +! ============================================================ +! +! Reproductibility for RSTART -> truncate ZLB to real(knd=4) to have reproductible result +! + ZLBEV = real(ZLBEV,kind=4) + ZLBGV = real(ZLBGV,kind=4) + ZLBYV = real(ZLBYV,kind=4) +! ============================================================ PRVS (:,IJE+1,:) =(PRHODJ(:,IJE+1,:) + PRHODJ(:,IJE,:)) * 0.5 * & ZINVTSTEP / (1.+ ZKTSTEP * ZALPHA2 ) * & ( (1. - ZCPHASY(:,:) - ZKTSTEP * (1. - ZALPHA2) ) * PVT(:,IJE+1,:)& diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90 index 1f8d4b3ca..f7ccb114e 100644 --- a/src/MNH/read_field.f90 +++ b/src/MNH/read_field.f90 @@ -18,7 +18,7 @@ INTERFACE KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & PUM,PVM,PWM,PDUM,PDVM,PDWM, & PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & - PRT,PSVT,PZWS,PCIT,PDRYMASST, & + PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS, & PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM, PLSZWSM, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & @@ -81,6 +81,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCT ! turbulent flux ! <s'Rc'> at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCIT ! ice conc. at t REAL, INTENT(OUT) :: PDRYMASST ! Md(t) +REAL, INTENT(OUT) :: PDRYMASSS ! d Md(t) / dt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! =sqrt(<s's'>) for the ! Subgrid Condensation REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! cloud fraction @@ -141,7 +142,7 @@ END MODULE MODI_READ_FIELD KSIZELBXR_ll,KSIZELBYR_ll,KSIZELBXSV_ll,KSIZELBYSV_ll, & PUM,PVM,PWM,PDUM,PDVM,PDWM, & PUT,PVT,PWT,PTHT,PPABST,PTKET,PRTKEMS, & - PRT,PSVT,PZWS,PCIT,PDRYMASST, & + PRT,PSVT,PZWS,PCIT,PDRYMASST,PDRYMASSS, & PSIGS,PSRCT,PCLDFR,PBL_DEPTH,PSBL_DEPTH,PWTHVMF,PPHC,PPHR, & PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,PLSZWSM, & PLBXUM,PLBXVM,PLBXWM,PLBXTHM,PLBXTKEM,PLBXRM,PLBXSVM, & @@ -361,6 +362,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSRCT ! turbulent flux ! <s'Rc'> at t REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCIT ! ice conc. at t REAL, INTENT(OUT) :: PDRYMASST ! Md(t) +REAL, INTENT(OUT) :: PDRYMASSS ! d Md(t) / dt REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSIGS ! =sqrt(<s's'>) for the ! Subgrid Condensation REAL, DIMENSION(:,:,:), INTENT(OUT) :: PCLDFR ! cloud fraction @@ -1464,6 +1466,11 @@ CALL INI_LB(TPINIFILE,GLSOURCE,ISV, & !* 2.3 Some special variables: ! CALL IO_Field_read(TPINIFILE,'DRYMASST',PDRYMASST) ! dry mass +IF (CCONF=='RESTA') THEN + CALL IO_Field_read(TPINIFILE,'DRYMASSS',PDRYMASSS) ! dry mass tendency +ELSE + PDRYMASSS=XUNDEF ! should not be used +END IF ! SELECT CASE(HGETSRCT) ! turbulent flux SRC at time t CASE('READ') diff --git a/src/MNH/relaxation.f90 b/src/MNH/relaxation.f90 index 7202c8ea1..0af96bf75 100644 --- a/src/MNH/relaxation.f90 +++ b/src/MNH/relaxation.f90 @@ -517,16 +517,16 @@ IF(OVE_RELAX) THEN ! DO JK = KALBOT, IKE+1 ! - PRUS(:,:,JK) = PRUS(:,:,JK) - ZKV(JK) *(PUT(:,:,JK) -PLSUM(:,:,JK) )& + PRUS(:,:,JK) = PRUS(:,:,JK) - ZKV(JK) *(PUT(:,:,JK) -real(PLSUM(:,:,JK),kind=4) )& * ZRHODJU(:,:,JK) ! - PRVS(:,:,JK) = PRVS(:,:,JK) - ZKV(JK) *(PVT(:,:,JK) -PLSVM(:,:,JK) )& + PRVS(:,:,JK) = PRVS(:,:,JK) - ZKV(JK) *(PVT(:,:,JK) -real(PLSVM(:,:,JK),kind=4) )& * ZRHODJV(:,:,JK) ! - PRWS(:,:,JK) = PRWS(:,:,JK) - ZKVW(JK) *(PWT(:,:,JK) -PLSWM(:,:,JK) )& + PRWS(:,:,JK) = PRWS(:,:,JK) - ZKVW(JK) *(PWT(:,:,JK) -real(PLSWM(:,:,JK),kind=4) )& * ZRHODJW(:,:,JK) ! - PRTHS(:,:,JK) = PRTHS(:,:,JK) - ZKV(JK) *(PTHT(:,:,JK) -PLSTHM(:,:,JK) )& + PRTHS(:,:,JK) = PRTHS(:,:,JK) - ZKV(JK) *(PTHT(:,:,JK) -real(PLSTHM(:,:,JK),kind=4) )& * PRHODJ(:,:,JK) ! END DO @@ -554,16 +554,16 @@ IF(OVE_RELAX_GRD) THEN ! DO JK = 1,KALBAS ! - PRUS(:,:,JK) = PRUS(:,:,JK) - ZKVBAS(JK) *(PUT(:,:,JK) -PLSUM(:,:,JK) )& + PRUS(:,:,JK) = PRUS(:,:,JK) - ZKVBAS(JK) *(PUT(:,:,JK) -real(PLSUM(:,:,JK),kind=4) )& * ZRHODJU(:,:,JK) ! - PRVS(:,:,JK) = PRVS(:,:,JK) - ZKVBAS(JK) *(PVT(:,:,JK) -PLSVM(:,:,JK) )& + PRVS(:,:,JK) = PRVS(:,:,JK) - ZKVBAS(JK) *(PVT(:,:,JK) -real(PLSVM(:,:,JK),kind=4) )& * ZRHODJV(:,:,JK) ! - PRWS(:,:,JK) = PRWS(:,:,JK) - ZKVWBAS(JK) *(PWT(:,:,JK) -PLSWM(:,:,JK) )& + PRWS(:,:,JK) = PRWS(:,:,JK) - ZKVWBAS(JK) *(PWT(:,:,JK) -real(PLSWM(:,:,JK),kind=4) )& * ZRHODJW(:,:,JK) ! - PRTHS(:,:,JK) = PRTHS(:,:,JK) - ZKVBAS(JK) *(PTHT(:,:,JK) -PLSTHM(:,:,JK) )& + PRTHS(:,:,JK) = PRTHS(:,:,JK) - ZKVBAS(JK) *(PTHT(:,:,JK) -real(PLSTHM(:,:,JK),kind=4) )& * PRHODJ(:,:,JK) ! END DO diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90 index ea08bd41d..e9bab27c0 100644 --- a/src/MNH/write_lfin.f90 +++ b/src/MNH/write_lfin.f90 @@ -1552,6 +1552,11 @@ CALL WRITE_LB_n(TPFILE) ! ! CALL IO_Field_write(TPFILE,'DRYMASST',XDRYMASST) +IF (CPROGRAM == 'MESONH') THEN + CALL IO_Field_write(TPFILE,'DRYMASSS',XDRYMASSS) +ELSE + CALL IO_Field_write(TPFILE,'DRYMASSS',0.) +END IF ! IF( CTURB /= 'NONE' .AND. CTOM=='TM06') THEN CALL IO_Field_write(TPFILE,'BL_DEPTH',XBL_DEPTH) -- GitLab