From bd4dfbfe31fc69682c66f6f982e8429369d72f8f Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Wed, 17 Nov 2021 12:56:43 +0100 Subject: [PATCH] Philippe 17/11/2021: ZSOLVER: port of last development to 5.5.0 version --- src/ZSOLVER/advection_metsv.f90 | 245 +++++------ src/ZSOLVER/advection_uvw_cen.f90 | 51 +-- src/ZSOLVER/gdiv.f90 | 1 - src/ZSOLVER/pressure.f90 | 689 ------------------------------ src/ZSOLVER/viscosity.f90 | 83 ++-- 5 files changed, 202 insertions(+), 867 deletions(-) delete mode 100644 src/ZSOLVER/pressure.f90 diff --git a/src/ZSOLVER/advection_metsv.f90 b/src/ZSOLVER/advection_metsv.f90 index f148ad521..481586dd4 100644 --- a/src/ZSOLVER/advection_metsv.f90 +++ b/src/ZSOLVER/advection_metsv.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -8,7 +8,7 @@ ! ########################### ! INTERFACE - SUBROUTINE ADVECTION_METSV (TPFILE, OCLOSE_OUT,HUVW_ADV_SCHEME, & + SUBROUTINE ADVECTION_METSV (TPFILE, HUVW_ADV_SCHEME, & HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, KSPLIT, & OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT, & HLBCX, HLBCY, KRR, KSV, TPDTCUR, PTSTEP, & @@ -17,11 +17,9 @@ INTERFACE PRTHS, PRRS, PRTKES, PRSVS, & PRTHS_CLD, PRRS_CLD, PRSVS_CLD, PRTKES_ADV ) ! -USE MODD_IO, ONLY: TFILEDATA +USE MODD_IO, ONLY: TFILEDATA USE MODD_TYPE_DATE, ONLY: DATE_TIME ! -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for syncronous - ! file opening TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file CHARACTER(LEN=6), INTENT(IN) :: HMET_ADV_SCHEME, & ! Control of the HSV_ADV_SCHEME, & ! scheme applied @@ -65,7 +63,7 @@ END INTERFACE ! END MODULE MODI_ADVECTION_METSV ! ########################################################################## - SUBROUTINE ADVECTION_METSV (TPFILE, OCLOSE_OUT,HUVW_ADV_SCHEME, & + SUBROUTINE ADVECTION_METSV (TPFILE, HUVW_ADV_SCHEME, & HMET_ADV_SCHEME,HSV_ADV_SCHEME, HCLOUD, KSPLIT, & OSPLIT_CFL, PSPLIT_CFL, OCFL_WRIT, & HLBCX, HLBCY, KRR, KSV, TPDTCUR, PTSTEP, & @@ -134,10 +132,14 @@ END MODULE MODI_ADVECTION_METSV !! 04/2016 (C.Lac) : correction of negativity for KHKO !! 10/2016 (C.Lac) Correction on the flag for Strang splitting !! to insure reproducibility between START and RESTA -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -!! 07/2017 (V. Vionnet) : add advection of 2D variables at -!! the surface for the blowing snow scheme +! V. Vionnet 07/2017: add advection of 2D variables at the surface for the blowing snow scheme +! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! B. Vie 03/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 11/06/2020: bugfix: correct PRSVS array indices +! P. Wautelet + Benoît Vié 06/2020: improve removal of negative scalar variables + adapt the corresponding budgets +! P. Wautelet 30/06/2020: move removal of negative scalar variables to Sources_neg_correct !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -148,55 +150,60 @@ USE MODD_MPIF use modd_precision, only: MNHREAL_MPI USE MODD_VAR_ll, ONLY: NMNH_COMM_WORLD #endif -USE MODD_BUDGET -USE MODD_CST -USE MODD_CTURB, ONLY: XTKEMIN +USE MODD_BLOWSNOW +USE MODD_BLOWSNOW_n +use modd_budget, only: lbudget_th, lbudget_tke, lbudget_rv, lbudget_rc, & + lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_TH, NBUDGET_TKE, NBUDGET_RV, NBUDGET_RC, & + NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + tbudgets USE MODD_CONF, ONLY: LNEUTRAL,NHALO,L1D, L2D +USE MODD_CST +USE MODD_CTURB, ONLY: XTKEMIN +use modd_field, only: tfielddata, TYPEREAL +USE MODD_IBM_PARAM_n, ONLY: LIBM,XIBM_LS,XIBM_EPSI USE MODD_IO, ONLY: TFILEDATA USE MODD_LUNIT_n, ONLY: TLUOUT +USE MODD_NSV +USE MODD_PARAMETERS +USE MODD_PARAM_LIMA USE MODD_PARAM_n +USE MODD_REF_n, ONLY: XRHODJ,XRHODREF USE MODD_TYPE_DATE, ONLY: DATE_TIME -USE MODD_BLOWSNOW -USE MODD_BLOWSNOW_n -USE MODD_PARAMETERS ! use mode_argslist_ll, only: ADD3DFIELD_ll, ADD4DFIELD_ll, CLEANLIST_ll, LIST_ll +use mode_budget, only: Budget_store_init, Budget_store_end +#ifdef MNH_OPENACC +USE MODE_DEVICE +USE MODE_MNH_ZWORK, ONLY: MNH_ALLOCATE_ZT3D, MNH_ALLOCATE_ZT4D, MNH_CHECK_IN_ZT3D, MNH_CHECK_OUT_ZT3D, & + MNH_GET_ZT3D, MNH_REL_ZT3D, MNH_REL_ZT4D, ZT3D +#endif use mode_exchange_ll, only: UPDATE_HALO_ll -USE MODE_FIELD, ONLY: TFIELDDATA, TYPEREAL USE MODE_IO_FIELD_WRITE, only: IO_Field_write use mode_mppdb USE MODE_MSG +use mode_sources_neg_correct, only: Sources_neg_correct +#ifndef MNH_OPENACC use mode_sum_ll, only: MAX_ll +#endif use mode_tools_ll, only: GET_INDICE_ll, lnorth_ll, lsouth_ll, least_ll, lwest_ll ! USE MODI_ADV_BOUNDARIES -USE MODI_BUDGET +#ifdef MNH_BITREP +USE MODI_BITREP +#endif USE MODI_CONTRAV USE MODI_GET_HALO USE MODI_PPM_RHODJ USE MODI_PPM_MET USE MODI_PPM_SCALAR ! -#ifdef MNH_OPENACC -USE MODE_DEVICE -USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D -USE MODE_MNH_ZWORK, ONLY : MNH_ALLOCATE_ZT3D , MNH_REL_ZT3D, MNH_ALLOCATE_ZT3DP , MNH_ALLOCATE_ZT2D, & - MNH_ALLOCATE_ZT4D , MNH_REL_ZT4D, & - MNH_CHECK_IN_ZT3D,MNH_CHECK_OUT_ZT3D -USE MODI_GET_HALO -#endif -#ifdef MNH_BITREP -USE MODI_BITREP -#endif -! !------------------------------------------------------------------------------- ! IMPLICIT NONE ! !* 0.1 Declarations of dummy arguments : ! -LOGICAL, INTENT(IN) :: OCLOSE_OUT ! switch for synchronous - ! file opening TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! Output file CHARACTER(LEN=6), INTENT(IN) :: HMET_ADV_SCHEME, & ! Control of the HSV_ADV_SCHEME, & ! scheme applied @@ -250,7 +257,9 @@ REAL, DIMENSION(:,:,:),pointer , contiguous :: ZCFLW ! ! CFL numbers on each direction REAL, DIMENSION(:,:,:),pointer , contiguous :: ZCFL ! ! CFL number +#ifdef MNH_OPENACC INTEGER :: IZRUCPPM,IZRVCPPM,IZRWCPPM,IZCFLU,IZCFLV,IZCFLW,IZCFL +#endif ! REAL :: ZCFLU_MAX, ZCFLV_MAX, ZCFLW_MAX, ZCFL_MAX ! maximum CFL numbers ! @@ -260,30 +269,40 @@ REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRTHS_OTHER REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRTKES_OTHER REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRTHS_PPM REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRTKES_PPM +#ifdef MNH_OPENACC INTEGER :: IZTH,IZTKE,IZRTHS_OTHER,IZRTKES_OTHER,IZRTHS_PPM,IZRTKES_PPM +#endif REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZR REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZSV REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZSNWC REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZSNWC_INIT REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSNWCS +#ifdef MNH_OPENACC INTEGER :: IZR,IZSV,IZSNWC,IZSNWC_INIT,IZRSNWCS +#endif ! Guess at the sub time step REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRRS_OTHER REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSVS_OTHER REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSNWCS_OTHER +#ifdef MNH_OPENACC INTEGER :: IZRRS_OTHER,IZRSVS_OTHER,IZRSNWCS_OTHER +#endif ! Tendencies since the beginning of the time step REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRRS_PPM REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSVS_PPM REAL, DIMENSION(:,:,:,:),pointer , contiguous :: ZRSNWCS_PPM +#ifdef MNH_OPENACC INTEGER :: IZRRS_PPM,IZRSVS_PPM,IZRSNWCS_PPM +#endif ! Guess at the end of the sub time step REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRHOX1,ZRHOX2 REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRHOY1,ZRHOY2 REAL, DIMENSION(:,:,:),pointer , contiguous :: ZRHOZ1,ZRHOZ2 REAL, DIMENSION(:,:,:),pointer , contiguous :: ZT,ZEXN,ZLV,ZLS,ZCPH +#ifdef MNH_OPENACC INTEGER :: IZRHOX1,IZRHOX2,IZRHOY1,IZRHOY2,IZRHOZ1,IZRHOZ2 & ,IZT,IZEXN,IZLV,IZLS,IZCPH +#endif ! Temporary advected rhodj for PPM routines ! @@ -301,6 +320,7 @@ INTEGER :: ILUOUT ! logical unit INTEGER :: ISPLIT_PPM ! temporal time splitting INTEGER :: IIB, IIE, IJB, IJE,IKB,IKE #ifdef MNH_OPENACC +CHARACTER(LEN=3) :: YNUM INTEGER :: IZ1, IZ2 #endif TYPE(TFIELDDATA) :: TZFIELD @@ -427,16 +447,30 @@ IZCPH = MNH_ALLOCATE_ZT3D( ZCPH , JIU,JJU,JKU ) ! !* 0. INITIALIZATION ! -------------- -! + +GTKE=(SIZE(PTKET)/=0) + +if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH ), 'ADV', prths (:, :, :) ) +if ( lbudget_tke ) call Budget_store_init( tbudgets(NBUDGET_TKE), 'ADV', prtkes(:, :, :) ) +if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV ), 'ADV', prrs (:, :, :, 1) ) +if ( lbudget_rc ) call Budget_store_init( tbudgets(NBUDGET_RC ), 'ADV', prrs (:, :, :, 2) ) +if ( lbudget_rr ) call Budget_store_init( tbudgets(NBUDGET_RR ), 'ADV', prrs (:, :, :, 3) ) +if ( lbudget_ri ) call Budget_store_init( tbudgets(NBUDGET_RI ), 'ADV', prrs (:, :, :, 4) ) +if ( lbudget_rs ) call Budget_store_init( tbudgets(NBUDGET_RS ), 'ADV', prrs (:, :, :, 5) ) +if ( lbudget_rg ) call Budget_store_init( tbudgets(NBUDGET_RG ), 'ADV', prrs (:, :, :, 6) ) +if ( lbudget_rh ) call Budget_store_init( tbudgets(NBUDGET_RH ), 'ADV', prrs (:, :, :, 7) ) +if ( lbudget_sv) then + do jsv = 1, ksv + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv ), 'ADV', prsvs(:, :, :, jsv) ) + end do +end if + ILUOUT = TLUOUT%NLU ! CALL GET_INDICE_ll(IIB,IJB,IIE,IJE) IKB=1+JPVEXT IKE=SIZE(PSVT,3) - JPVEXT -! -GTKE=(SIZE(PTKET)/=0) -! #ifdef MNH_OPENACC CALL INIT_ON_HOST_AND_DEVICE(PRTKES_ADV,PVALUE=-1e99,HNAME='ADVECTION_METSV::PRTKES_ADV') CALL INIT_ON_HOST_AND_DEVICE(ZRUCPPM,PVALUE=-1e90,HNAME='ADVECTION_METSV::ZRUCPPM') @@ -516,6 +550,26 @@ IF (.NOT. L1D) THEN ZCFLU(IIB:IIE,IJB:IJE,:) = ABS(ZRUCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP) ZCFLV(IIB:IIE,IJB:IJE,:) = ABS(ZRVCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP) ZCFLW(IIB:IIE,IJB:IJE,:) = ABS(ZRWCPPM(IIB:IIE,IJB:IJE,:) * PTSTEP) + IF (LIBM) THEN +#ifndef MNH_BITREP + ZCFLU(IIB:IIE,IJB:IJE,:) = ZCFLU(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,2)/& + (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.)) + ZCFLV(IIB:IIE,IJB:IJE,:) = ZCFLV(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,3)/& + (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.)) + ZCFLW(IIB:IIE,IJB:IJE,:) = ZCFLW(IIB:IIE,IJB:IJE,:)*(1.-exp(-(XIBM_LS(IIB:IIE,IJB:IJE,:,4)/& + (XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:))**(1./3.))**2.)) +#else + ZCFLU(IIB:IIE,IJB:IJE,:) = ZCFLU(IIB:IIE,IJB:IJE,:)*(1.-Br_exp(-Br_pow(XIBM_LS(IIB:IIE,IJB:IJE,:,2)/& + Br_pow(XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:),1./3.),2.))) + ZCFLV(IIB:IIE,IJB:IJE,:) = ZCFLV(IIB:IIE,IJB:IJE,:)*(1.-Br_exp(-Br_pow(XIBM_LS(IIB:IIE,IJB:IJE,:,3)/& + Br_pow(XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:),1./3.),2.))) + ZCFLW(IIB:IIE,IJB:IJE,:) = ZCFLW(IIB:IIE,IJB:IJE,:)*(1.-Br_exp(-Br_pow(XIBM_LS(IIB:IIE,IJB:IJE,:,4)/& + Br_pow(XRHODJ(IIB:IIE,IJB:IJE,:)/XRHODREF(IIB:IIE,IJB:IJE,:),1./3.),2.))) +#endif + WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,2).GT.(-XIBM_EPSI)) ZCFLU(IIB:IIE,IJB:IJE,:)=0. + WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,3).GT.(-XIBM_EPSI)) ZCFLV(IIB:IIE,IJB:IJE,:)=0. + WHERE (XIBM_LS(IIB:IIE,IJB:IJE,:,4).GT.(-XIBM_EPSI)) ZCFLW(IIB:IIE,IJB:IJE,:)=0. + ENDIF !$acc end kernels #ifndef MNH_BITREP IF (.NOT. L2D) THEN @@ -562,7 +616,7 @@ END IF ! !* prints in the file the 3D Courant numbers (one should flag this) ! -IF (OCLOSE_OUT .AND. OCFL_WRIT .AND. (.NOT. L1D)) THEN +IF ( tpfile%lopened .AND. OCFL_WRIT .AND. (.NOT. L1D) ) THEN !$acc update host(ZCFLU,ZCFLV,ZCFLW,ZCFL) TZFIELD%CMNHNAME = 'CFLU' TZFIELD%CSTDNAME = '' @@ -695,7 +749,7 @@ END IF ZTSTEP_PPM = PTSTEP / REAL(KSPLIT) ! ! -!* 2.4 normalized contravariant components for splitted PPM time-step +!* 2.4 normalized contravariant components for split PPM time-step ! !$acc kernels ZRUCPPM(:,:,:) = ZRUCPPM(:,:,:)*ZTSTEP_PPM @@ -773,14 +827,19 @@ NULLIFY(TZFIELDS0_ll) CALL GET_HALO_D(ZRTHS_OTHER, HNAME='ADVECTION_METSV::ZRTHS_OTHER') IF (GTKE) CALL GET_HALO_D(ZRTKES_OTHER,HNAME='ADVECTION_METSV::ZRTKES_OTHER') DO JR=1,KRR - CALL GET_HALO_D(ZRRS_OTHER(:,:,:,JR),HNAME='ADVECTION_METSV::ZRRS_OTHER') + WRITE(YNUM, '( I3.3 )' ) JR + CALL GET_HALO_D(ZRRS_OTHER(:,:,:,JR),HNAME='ADVECTION_METSV::ZRRS_OTHER:'//YNUM) END DO DO JSV = 1, KSV - CALL GET_HALO_D(ZRSVS_OTHER(:,:,:,JSV),HNAME='ADVECTION_METSV::ZRSVS_OTHER') - END DO - DO JSV = 1,NBLOWSNOW_2D - CALL GET_HALO_D(ZRSNWCS_OTHER(:,:,:,JSV),HNAME='ADVECTION_METSV::ZRSNWCS_OTHER') + WRITE(YNUM, '( I3.3 )' ) JSV + CALL GET_HALO_D(ZRSVS_OTHER(:,:,:,JSV),HNAME='ADVECTION_METSV::ZRSVS_OTHER:'//YNUM) END DO + IF ( LBLOWSNOW ) THEN + DO JSV = 1,NBLOWSNOW_2D + WRITE(YNUM, '( I3.3 )' ) JSV + CALL GET_HALO_D(ZRSNWCS_OTHER(:,:,:,JSV),HNAME='ADVECTION_METSV::ZRSNWCS_OTHER:'//YNUM) + END DO + END IF !PW: TODO: update only what is needed... ! acc update device(ZRTHS_OTHER,ZRTKES_OTHER,ZRRS_OTHER,ZRSVS_OTHER) #endif @@ -886,9 +945,6 @@ DO JSPL=1,KSPLIT !$acc end kernels END IF ! acc end kernels - -!PW: bug PGI 18.10: not necessary for PRRS,PRSVS but error with decriptor not present -!$acc update self(PRRS,PRSVS) ! ! Top and bottom Boundaries and LBC for the guesses ! @@ -958,9 +1014,11 @@ DO JSPL=1,KSPLIT DO JSV = 1, KSV CALL GET_HALO_D(ZSV(:,:,:,JSV),HNAME='ADVECTION_METSV::ZSV') END DO - DO JSV = 1,NBLOWSNOW_2D - CALL GET_HALO_D(ZSNWC(:,:,:,JSV),HNAME='ADVECTION_METSV::ZSNWC') - END DO + IF ( LBLOWSNOW ) THEN + DO JSV = 1,NBLOWSNOW_2D + CALL GET_HALO_D(ZSNWC(:,:,:,JSV),HNAME='ADVECTION_METSV::ZSNWC') + END DO + END IF #endif END IF @@ -1005,84 +1063,27 @@ END IF !* 5. BUDGETS ! ------- ! -IF (LBUDGET_TH) THEN -!$acc update self(PRTHS) - CALL BUDGET (PRTHS,4,'ADV_BU_RTH') -END IF -IF (LBUDGET_TKE) THEN -!$acc update self(PRTKES) - CALL BUDGET (PRTKES,5,'ADV_BU_RTKE') -END IF -IF (KRR>=1.AND.LBUDGET_RV) THEN -!$acc update self(PRRS(:,:,:,1)) - CALL BUDGET (PRRS(:,:,:,1),6,'ADV_BU_RRV') -END IF -IF (KRR>=2.AND.LBUDGET_RC) THEN -!$acc update self(PRRS(:,:,:,2)) - CALL BUDGET (PRRS(:,:,:,2),7,'ADV_BU_RRC') -END IF -IF (KRR>=3.AND.LBUDGET_RR) THEN -!$acc update self(PRRS(:,:,:,3)) - CALL BUDGET (PRRS(:,:,:,3),8,'ADV_BU_RRR') -END IF -IF (KRR>=4.AND.LBUDGET_RI) THEN -!$acc update self(PRRS(:,:,:,4)) - CALL BUDGET (PRRS(:,:,:,4),9,'ADV_BU_RRI') -END IF -IF (KRR>=5.AND.LBUDGET_RS) THEN -!$acc update self(PRRS(:,:,:,5)) - CALL BUDGET (PRRS(:,:,:,5),10,'ADV_BU_RRS') -END IF -IF (KRR>=6.AND.LBUDGET_RG) THEN -!$acc update self(PRRS(:,:,:,6)) - CALL BUDGET (PRRS(:,:,:,6),11,'ADV_BU_RRG') -END IF -IF (KRR>=7.AND.LBUDGET_RH) THEN -!$acc update self(PRRS(:,:,:,7)) - CALL BUDGET (PRRS(:,:,:,7),12,'ADV_BU_RRH') -END IF -IF (LBUDGET_SV) THEN -!$acc update self(PRSVS) - DO JSV=1,KSV - CALL BUDGET (PRSVS(:,:,:,JSV),JSV+12,'ADV_BU_RSV') - END DO -END IF -! -IF ((HCLOUD == 'KHKO') .OR. (HCLOUD == 'C2R2')) THEN -#ifdef MNH_OPENACC - call Print_msg( NVERB_ERROR, 'GEN', 'ADVECTION_METSV', 'OpenACC: HCLOUD=''KHKO'' OR ''C2R2'' not yet implemented' ) -#endif - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZLS(:,:,:)=XLSTT +(XCPV-XCI) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) -! CALL GET_HALO(PRRS(:,:,:,2)) -! CALL GET_HALO(PRSVS(:,:,:,2)) -! CALL GET_HALO(PRSVS(:,:,:,3)) - WHERE (PRRS(:,:,:,2) < 0. .OR. PRSVS(:,:,:,2) < 0.) - PRSVS(:,:,:,1) = 0.0 - END WHERE - DO JSV = 2, 3 - WHERE (PRRS(:,:,:,JSV) < 0. .OR. PRSVS(:,:,:,JSV) < 0.) - PRRS(:,:,:,1) = PRRS(:,:,:,1) + PRRS(:,:,:,JSV) - PRTHS(:,:,:) = PRTHS(:,:,:) - PRRS(:,:,:,JSV) * ZLV(:,:,:) / & - ZCPH(:,:,:) / ZEXN(:,:,:) - PRRS(:,:,:,JSV) = 0.0 - PRSVS(:,:,:,JSV) = 0.0 - END WHERE - END DO -! - IF (LBUDGET_TH) CALL BUDGET (PRTHS(:,:,:) , 4,'NEADV_BU_RTH') - IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1), 6,'NEADV_BU_RRV') - IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2), 7,'NEADV_BU_RRC') +if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH ), 'ADV', prths (:, :, :) ) +if ( lbudget_tke ) call Budget_store_end( tbudgets(NBUDGET_TKE), 'ADV', prtkes(:, :, :) ) +if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV ), 'ADV', prrs (:, :, :, 1) ) +if ( lbudget_rc ) call Budget_store_end( tbudgets(NBUDGET_RC ), 'ADV', prrs (:, :, :, 2) ) +if ( lbudget_rr ) call Budget_store_end( tbudgets(NBUDGET_RR ), 'ADV', prrs (:, :, :, 3) ) +if ( lbudget_ri ) call Budget_store_end( tbudgets(NBUDGET_RI ), 'ADV', prrs (:, :, :, 4) ) +if ( lbudget_rs ) call Budget_store_end( tbudgets(NBUDGET_RS ), 'ADV', prrs (:, :, :, 5) ) +if ( lbudget_rg ) call Budget_store_end( tbudgets(NBUDGET_RG ), 'ADV', prrs (:, :, :, 6) ) +if ( lbudget_rh ) call Budget_store_end( tbudgets(NBUDGET_RH ), 'ADV', prrs (:, :, :, 7) ) +if ( lbudget_sv) then + do jsv = 1, ksv + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv ), 'ADV', prsvs(:, :, :, jsv) ) + end do +end if + +! Remove non-physical negative values (unnecessary in a perfect world) + corresponding budgets +call Sources_neg_correct( hcloud, 'NEADV', krr, ptstep, ppabst, ptht, prt, prths, prrs, prsvs ) -END IF -! #ifdef MNH_OPENACC CALL MNH_REL_ZT3D(IZ1, IZ2) #endif -!------------------------------------------------------------------------------- IF (MPPDB_INITIALIZED) THEN !Check all INOUT arrays diff --git a/src/ZSOLVER/advection_uvw_cen.f90 b/src/ZSOLVER/advection_uvw_cen.f90 index 534b5ac01..fd980ac36 100644 --- a/src/ZSOLVER/advection_uvw_cen.f90 +++ b/src/ZSOLVER/advection_uvw_cen.f90 @@ -89,38 +89,35 @@ END MODULE MODI_ADVECTION_UVW_CEN !! Original 01/2013 (from ADVECTION routine) !! Modif !! J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! +! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! -USE MODE_ll -use mode_mppdb USE MODD_ARGSLIST_ll, ONLY : LIST_ll, HALO2LIST_ll USE MODD_CONF -USE MODD_PARAMETERS +use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, NBUDGET_U, NBUDGET_V, NBUDGET_W, tbudgets USE MODD_GRID_n -! -#ifndef MNH_OPENACC -USE MODI_SHUMAN -#else -USE MODI_SHUMAN_DEVICE -#endif -USE MODI_CONTRAV -USE MODI_ADVECUVW_2ND -USE MODI_ADVECUVW_4TH -! -USE MODD_BUDGET -USE MODI_BUDGET -! + +use mode_budget, only: Budget_store_init, Budget_store_end +USE MODE_ll #ifdef MNH_OPENACC USE MODE_DEVICE USE MODE_MNH_ZWORK, ONLY : ZT3D, MNH_GET_ZT3D , MNH_REL_ZT3D use mode_msg #endif -! +use mode_mppdb + +USE MODI_ADVECUVW_2ND +USE MODI_ADVECUVW_4TH +USE MODI_CONTRAV +#ifndef MNH_OPENACC +USE MODI_SHUMAN +#else +USE MODI_SHUMAN_DEVICE +#endif !------------------------------------------------------------------------------- ! IMPLICIT NONE @@ -212,6 +209,10 @@ IF (MPPDB_INITIALIZED) THEN CALL MPPDB_CHECK(PRWS,"ADVECTION_UVW_CEN beg:PRWS") END IF +if ( lbudget_u ) call Budget_store_init( tbudgets(NBUDGET_U), 'ADV', prus(:, :, :) ) +if ( lbudget_v ) call Budget_store_init( tbudgets(NBUDGET_V), 'ADV', prvs(:, :, :) ) +if ( lbudget_w ) call Budget_store_init( tbudgets(NBUDGET_W), 'ADV', prws(:, :, :) ) + allocate( zus ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) allocate( zvs ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) allocate( zws ( size( put, 1 ), size( put, 2 ), size( put, 3 ) ) ) @@ -250,7 +251,7 @@ CALL INIT_ON_HOST_AND_DEVICE(ZMZM_RHODJ,-3e97,'ADVECTION_UVW_CEN::ZMZM_RHODJ') ! CALL MNH_GET_ZT3D(IZ1, IZ2) #endif -! + #ifndef MNH_OPENACC ZMXM_RHODJ = MXM(PRHODJ) ZMYM_RHODJ = MYM(PRHODJ) @@ -345,11 +346,11 @@ PDUM(:,:,:) = ZUS(:,:,:) - PUM(:,:,:) PDVM(:,:,:) = ZVS(:,:,:) - PVM(:,:,:) PDWM(:,:,:) = ZWS(:,:,:) - PWM(:,:,:) !$acc end kernels -! -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'ADV_BU_RU') -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'ADV_BU_RV') -IF (LBUDGET_W) CALL BUDGET (PRWS,3,'ADV_BU_RW') -! + +if ( lbudget_u ) call Budget_store_end( tbudgets(NBUDGET_U), 'ADV', prus(:, :, :) ) +if ( lbudget_v ) call Budget_store_end( tbudgets(NBUDGET_V), 'ADV', prvs(:, :, :) ) +if ( lbudget_w ) call Budget_store_end( tbudgets(NBUDGET_W), 'ADV', prws(:, :, :) ) + #ifdef MNH_OPENACC CALL MNH_REL_ZT3D(IZ1, IZ2) #endif diff --git a/src/ZSOLVER/gdiv.f90 b/src/ZSOLVER/gdiv.f90 index c78da2ed6..b24671946 100644 --- a/src/ZSOLVER/gdiv.f90 +++ b/src/ZSOLVER/gdiv.f90 @@ -151,7 +151,6 @@ INTEGER :: IKE ! indice K for the last inner mass point along z INTEGER :: JI,JJ,JK ! loop indexes ! INTEGER :: IIU,IJU,IKU -#ifdef MNH_OPENACC ! #ifdef MNH_OPENACC REAL, DIMENSION(:,:,:) , POINTER , CONTIGUOUS :: ZTMP1,ZTMP2 diff --git a/src/ZSOLVER/pressure.f90 b/src/ZSOLVER/pressure.f90 deleted file mode 100644 index 7c11f6593..000000000 --- a/src/ZSOLVER/pressure.f90 +++ /dev/null @@ -1,689 +0,0 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!################### -MODULE MODI_PRESSURE -!################### -! -INTERFACE -! - SUBROUTINE PRESSURE( & - HLBCX,HLBCY,HPRESOPT,KITR,OITRADJ,KTCOUNT,PRELAX,KMI, & - PRHODJ,PDXX,PDYY,PDZZ,PDZX,PDZY,PDXHATM,PDYHATM,PRHOM, & - PAF,PBF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,PPABSM, & - KRR,KRRL,KRRI,PDRYMASST,PREFMASS,PMASS_O_PHI0, & - PTHT,PRT,PRHODREF,PTHVREF,PRVREF,PEXNREF,PLINMASS, & - PRUS,PRVS,PRWS,PPABST,PRESIDUAL) -! -IMPLICIT NONE -! -CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX ! x-direction LBC type -CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCY ! y-direction LBC type -! -CHARACTER (LEN=5), INTENT(IN) :: HPRESOPT ! choice of the pressure solver -! -INTEGER, INTENT(INOUT) :: KITR ! number of iterations for the - ! pressure solver -LOGICAL, INTENT(IN) :: OITRADJ ! switch to adjust or not KITR -INTEGER, INTENT(IN) :: KTCOUNT ! counter value of the - ! model temporal loop -INTEGER, INTENT(IN) :: KMI ! Model index -REAL, INTENT(IN) :: PRELAX ! relaxation coefficient for - ! the Richardson's method -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference state - ! * J -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients -! -REAL, INTENT(IN) :: PDXHATM ! mean grid increment in the x - ! direction -REAL, INTENT(IN) :: PDYHATM ! mean grid increment in the y - ! direction -! -REAL, DIMENSION (:), INTENT(IN) :: PRHOM ! mean of XRHODJ on the plane x y - ! localized at a mass level -! -REAL, DIMENSION(:), INTENT(IN) :: PAF,PCF ! vectors giving the nonvanishing -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBF ! elements of the tri-diag. - ! matrix in the pressure eq. -! - ! arrays of sin or cos values - ! for the FFT : -REAL, DIMENSION(:), INTENT(IN) :: PTRIGSX ! - along x -REAL, DIMENSION(:), INTENT(IN) :: PTRIGSY ! - along y -! - ! decomposition in prime - ! numbers for the FFT: -INTEGER, DIMENSION(19), INTENT(IN) :: KIFAXX ! - along x -INTEGER, DIMENSION(19), INTENT(IN) :: KIFAXY ! - along y -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! pressure (t-dt) -! -INTEGER, INTENT(IN) :: KRR ! Total number of water var. -INTEGER, INTENT(IN) :: KRRL ! Number of liquid water var. -INTEGER, INTENT(IN) :: KRRI ! Number of ice water var. -! -REAL, INTENT(IN) :: PDRYMASST ! Mass of dry air and of -REAL, INTENT(IN) :: PREFMASS ! the ref. atmosphere -REAL, INTENT(IN) :: PMASS_O_PHI0 ! Mass / Phi0 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Temperature and water -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! variables at time t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry Density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Temperature - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVREF ! mixing ratio of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Exner function - ! of the reference state -REAL, INTENT(IN) :: PLINMASS ! lineic mass through - ! open boundaries -! -REAL, INTENT(INOUT) :: PRUS(:,:,:) ! source term along x -REAL, INTENT(INOUT) :: PRVS(:,:,:) ! source term along y -REAL, INTENT(INOUT) :: PRWS(:,:,:) ! source term along z -! -REAL, INTENT(INOUT) :: PPABST(:,:,:) ! pressure(t) -!JUAN -REAL, OPTIONAL :: PRESIDUAL -!JUAN -! -END SUBROUTINE PRESSURE -! -END INTERFACE -! -END MODULE MODI_PRESSURE -! ###################################################################### - SUBROUTINE PRESSURE( & - HLBCX,HLBCY,HPRESOPT,KITR,OITRADJ,KTCOUNT,PRELAX,KMI, & - PRHODJ,PDXX,PDYY,PDZZ,PDZX,PDZY,PDXHATM,PDYHATM,PRHOM, & - PAF,PBF,PCF,PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,PPABSM, & - KRR,KRRL,KRRI,PDRYMASST,PREFMASS,PMASS_O_PHI0, & - PTHT,PRT,PRHODREF,PTHVREF,PRVREF,PEXNREF,PLINMASS, & - PRUS,PRVS,PRWS,PPABST,PRESIDUAL) -! ###################################################################### -! -!!**** *PRESSURE * - solve the pressure equation and add the pressure term -!! to the sources -!! -!! PURPOSE -!! ------- -! The purpose of this routine is to solve the pressure equation: -! with either the conjugate gradient method or the Richardson's method. -! The pressure gradient is added to the sources in order -! to nullify the divergence of the momentum* Thetavref*(1+Rvref) -! at the time t+dt. -! -!!** METHOD -!! ------ -!! The divergence of the sources ( RHS of the pressure equation ) is -!! computed. The pressure equation is then solved by either CG method, -!! either Richardson's method, or an exact method. Finally, the pressure -!! gradient is added to the sources RUS, RVS, RWS. -!! Finally, the absolute pressure is diagnozed from the total mass -!! included in the simulation domain. -!! -!! EXTERNAL -!! -------- -!! Subroutine MASS_LEAK : assures global non-divergence condition in the -!! case of open boundaries -!! Subroutine FLAT_INV : solve the pressure equation for the case -!! without orography -!! Subroutine RICHARDSON: solve the pressure equation with the -!! Richardson's method -!! Subroutine CONJGRAD : solve the pressure equation with the Conjugate -!! Gradient algorithm -!! Function GX_M_U : compute the gradient along x -!! Function GY_M_V : compute the gradient along y -!! Function GZ_M_W : compute the gradient along z -!! Subroutine GDIV : compute J times the divergence of 1/J times a vector -!! Function MXM: compute an average in the x direction for a variable -!! at a mass localization -!! Function MYM: compute an average in the y direction for a variable -!! at a mass localization -!! Function MZM: compute an average in the z direction for a variable -!! at a mass localization -!! Subroutine P_ABS : compute the constant for PABS and therefore, the -!! absolute pressure function -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! Module MODD_CONF: model configuration -!! LFLAT: logical switch for zero orography -!! L2D : logical switch for two-dimensional configuration -!! LCARTESIAN : logical switch for cartesian geometry -!! Module MODD_PARAMETERS: declaration of parameter variables -!! JPHEXT, JPVEXT: define the number of marginal points out of the -!! physical domain along horizontal and vertical directions respectively -!! Module MODD_CST: physical constants -!! XCPD -!! -!! REFERENCE -!! --------- -!! Book2 of documentation (subroutine PRESSURE) + Book1 ( ) -!! -!! AUTHOR -!! ------ -!! P. Hereil and J. Stein * Meteo France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 05/07/94 -!! Modification 03/01/95 (Lafore) To add the absolute pressure diagnosis -!! Modification 31/01/95 (Stein) Copy of the pressure function in the -!! 2D case in the two outermost planes -!! Modification 16/02/95 (Mallet) Add the call to MASS_LEAK -!! Modification 16/03/95 (Stein) change the argument list of the -!! gradient and remove R from the historical var. -!! Modification 30/06/95 (Stein) Add a test not to compute the absolute -!! pressure in the Boussinesq case -!! 16/10/95 (J. Stein) change the budget calls -!! 29/01/96 (J. Stein) call iterative resolution for -!! non-cartessian geometry -!! 19/12/96 (J.-P. Pinty) update the budget calls -!! 14/01/97 (Stein,Lafore) New anelastic equations -!! 17/12/97 ( Stein )include the case of non-vanishing -!! orography at the lbc -!! 26/03/98 (Stein,Jabouille) fix the value of the corner point -!! 15/06/98 (D.Lugato, R.Guivarch) Parallelisation -!! 25/08/99 (J.-P. Pinty) add CRESI option to CPRESOPT -!! 06/11/02 (V. Masson) update the budget calls -!! 24/08/2005 (J. escobar) BUG : remove IIE+1, IJE+1 out of bound -!! references in parallel run -!! 08/2010 (V.Masson, C.Lac) Add UPDATE_HALO -!! 11/2010 (V.Masson, C.Lac) PPABST, must not be cyclic => add temp array -!! to save it before UPDATE_HALO -!! 06/2011 (J.escobar ) Bypass Bug with ifort11/12 on HLBCX,HLBCY -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O -! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine -! -!------------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_PARAMETERS -USE MODD_BUDGET -USE MODD_CONF -USE MODD_CST -USE MODD_LUNIT_n, ONLY: TLUOUT -USE MODI_MASS_LEAK -USE MODI_GDIV -USE MODI_FLAT_INV -USE MODI_RICHARDSON -USE MODI_CONJGRAD -USE MODI_CONRESOL -USE MODI_GRADIENT_M -USE MODI_SHUMAN -USE MODI_P_ABS -USE MODI_BUDGET -! -USE MODD_ARGSLIST_ll, ONLY : LIST_ll -USE MODE_ll -! -IMPLICIT NONE -! -!* 0.1 declarations of arguments -! - CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCX ! x-direction LBC type - CHARACTER (LEN=*), DIMENSION(:), INTENT(IN) :: HLBCY ! y-direction LBC type -! -CHARACTER (LEN=5), INTENT(IN) :: HPRESOPT ! choice of the pressure solver -! -INTEGER, INTENT(INOUT) :: KITR ! number of iterations for the - ! pressure solver -LOGICAL, INTENT(IN) :: OITRADJ ! switch to adjust or not KITR -INTEGER, INTENT(IN) :: KTCOUNT ! counter value of the - ! model temporal loop -INTEGER, INTENT(IN) :: KMI ! Model index -REAL, INTENT(IN) :: PRELAX ! relaxation coefficient for - ! the Richardson's method -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! density of reference state - ! * J -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX,PDYY,PDZZ -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PDZX,PDZY ! metric coefficients -! -REAL, INTENT(IN) :: PDXHATM ! mean grid increment in the x - ! direction -REAL, INTENT(IN) :: PDYHATM ! mean grid increment in the y - ! direction -! -REAL, DIMENSION (:), INTENT(IN) :: PRHOM ! mean of XRHODJ on the plane x y - ! localized at a mass level -! -REAL, DIMENSION(:), INTENT(IN) :: PAF,PCF ! vectors giving the nonvanishing -REAL, DIMENSION(:,:,:), INTENT(IN) :: PBF ! elements of the tri-diag. - ! matrix in the pressure eq. -! - ! arrays of sin or cos values - ! for the FFT : -REAL, DIMENSION(:), INTENT(IN) :: PTRIGSX ! - along x -REAL, DIMENSION(:), INTENT(IN) :: PTRIGSY ! - along y -! - ! decomposition in prime - ! numbers for the FFT: -INTEGER, DIMENSION(19), INTENT(IN) :: KIFAXX ! - along x -INTEGER, DIMENSION(19), INTENT(IN) :: KIFAXY ! - along y -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABSM ! pressure (t-dt) -! -INTEGER, INTENT(IN) :: KRR ! Total number of water var. -INTEGER, INTENT(IN) :: KRRL ! Number of liquid water var. -INTEGER, INTENT(IN) :: KRRI ! Number of ice water var. -! -REAL, INTENT(IN) :: PDRYMASST ! Mass of dry air and of -REAL, INTENT(IN) :: PREFMASS ! the ref. atmosphere -REAL, INTENT(IN) :: PMASS_O_PHI0 ! Mass / Phi0 -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! Temperature and water -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! variables at time t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODREF ! dry Density -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHVREF ! Virtual Temperature - ! of the reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRVREF ! mixing ratio of the - ! reference state -REAL, DIMENSION(:,:,:), INTENT(IN) :: PEXNREF ! Exner function - ! of the reference state -REAL, INTENT(IN) :: PLINMASS ! lineic mass through - ! open boundaries -! -REAL, INTENT(INOUT) :: PRUS(:,:,:) ! source term along x -REAL, INTENT(INOUT) :: PRVS(:,:,:) ! source term along y -REAL, INTENT(INOUT) :: PRWS(:,:,:) ! source term along z -! -REAL, INTENT(INOUT) :: PPABST(:,:,:) ! pressure(t) -!JUAN -REAL, OPTIONAL :: PRESIDUAL -!JUAN -! -! -!* 0.2 declarations of local variables -! -! Metric coefficients: -! -REAL, DIMENSION(SIZE(PPABSM,1),SIZE(PPABSM,2),SIZE(PPABSM,3)) :: ZDV_SOURCE -! ! divergence of the sources -! -INTEGER :: IIB ! indice I for the first inner mass point along x -INTEGER :: IIE ! indice I for the last inner mass point along x -INTEGER :: IJB ! indice J for the first inner mass point along y -INTEGER :: IJE ! indice J for the last inner mass point along y -INTEGER :: IKB ! indice K for the first inner mass point along z -INTEGER :: IKE ! indice K for the last inner mass point along z -INTEGER :: ILUOUT ! Logical unit of output listing -! -REAL, DIMENSION(SIZE(PPABSM,1),SIZE(PPABSM,2),SIZE(PPABSM,3)) :: ZTHETAV, & - ! virtual potential temperature - ZPHIT - ! MAE + DUR => Exner function perturbation - ! LHE => Exner function perturbation * CPD * THVREF -! -REAL :: ZRV_OV_RD ! XRV / XRD -REAL :: ZMAXVAL, ZMAXRES ! for print -INTEGER, DIMENSION(3) :: IMAXLOC ! purpose -INTEGER :: JWATER ! loop index on water species -INTEGER :: IIU,IJU,IKU ! array sizes in I,J,K -INTEGER :: JK ! loop index on the vertical levels -INTEGER :: JI,JJ -! -REAL, DIMENSION(SIZE(PDXX,1),SIZE(PDXX,3)) :: ZPABS_S ! local pressure on southern side -REAL, DIMENSION(SIZE(PDXX,1),SIZE(PDXX,3)) :: ZPABS_N ! local pressure on northern side -REAL, DIMENSION(SIZE(PDYY,2),SIZE(PDXX,3)) :: ZPABS_E ! local pressure on eastern side -REAL, DIMENSION(SIZE(PDYY,2),SIZE(PDXX,3)) :: ZPABS_W ! local pressure on western side -INTEGER :: IINFO_ll -TYPE(LIST_ll), POINTER :: TZFIELDS_ll ! list of fields to exchange -TYPE(LIST_ll), POINTER :: TZFIELDS_2_ll ! list of fields to exchange -! -! -!------------------------------------------------------------------------------ -!------------------------------------------------------------------------------- -NULLIFY(TZFIELDS_ll) -NULLIFY(TZFIELDS_2_ll) -! -!* 1. PRELIMINARIES -! ------------- -! -ILUOUT = TLUOUT%NLU -! -CALL GET_PHYSICAL_ll(IIB,IJB,IIE,IJE) -CALL GET_DIM_EXT_ll('B',IIU,IJU) -! -IKB= 1+JPVEXT -IKU= SIZE(PPABSM,3) -IKE= IKU - JPVEXT -! -ZPABS_S(:,:) = 0. -ZPABS_N(:,:) = 0. -ZPABS_E(:,:) = 0. -ZPABS_W(:,:) = 0. -! -! -!------------------------------------------------------------------------------- -! -!* 3. COMPUTE THE LINEIC MASS -! ----------------------- -! -IF ( ANY(HLBCX(:)=='OPEN') .OR. ANY(HLBCY(:)=='OPEN') ) THEN - CALL MASS_LEAK(PDXX,PDYY,HLBCX,HLBCY,PLINMASS,PRHODJ,PRUS,PRVS) -END IF -! -!------------------------------------------------------------------------------- -! -!* 4. COMPUTE THE FORCING TERM FOR THE PRESSURE EQUATION -! -------------------------------------------------- -! -! -CALL ADD3DFIELD_ll( TZFIELDS_ll, PRUS, 'PRESSURE::PRUS' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, PRVS, 'PRESSURE::PRVS' ) -CALL ADD3DFIELD_ll( TZFIELDS_ll, PRWS, 'PRESSURE::PRWS' ) -CALL UPDATE_HALO_ll(TZFIELDS_ll,IINFO_ll) -CALL CLEANLIST_ll(TZFIELDS_ll) -! -CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRUS,PRVS,PRWS,ZDV_SOURCE) -! -! The non-homogenous Neuman problem is transformed in an homogenous Neuman -! problem in the non-periodic cases -IF (HLBCX(1) /= 'CYCL') THEN - IF (LWEST_ll()) ZDV_SOURCE(IIB-1,:,:) = 0. - IF (LEAST_ll()) ZDV_SOURCE(IIE+1,:,:) = 0. -ENDIF -! -IF (.NOT. L2D .AND. HLBCY(1) /= 'CYCL') THEN - IF (LSOUTH_ll()) ZDV_SOURCE(:,IJB-1,:) = 0. - IF (LNORTH_ll()) ZDV_SOURCE(:,IJE+1,:) = 0. -ENDIF -! -!------------------------------------------------------------------------------- -! -!* 5. SOLVE THE PRESSURE EQUATION -! --------------------------- -! -! -!* 5.1 Compute the virtual theta and the pressure perturbation -! ------------------------------------------------------- -! -IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - IF(KRR > 0) THEN - ! - ! compute the ratio : 1 + total water mass / dry air mass - ZRV_OV_RD = XRV / XRD - ZTHETAV(:,:,:) = 1. + PRT(:,:,:,1) - DO JWATER = 2 , 1+KRRL+KRRI - ZTHETAV(:,:,:) = ZTHETAV(:,:,:) + PRT(:,:,:,JWATER) - END DO - ! compute the virtual potential temperature when water is present in any - ! form - ZTHETAV(:,:,:) = PTHT(:,:,:) * (1. + PRT(:,:,:,1) * ZRV_OV_RD) / ZTHETAV(:,:,:) - ELSE - ! compute the virtual potential temperature when water is absent - ZTHETAV(:,:,:) = PTHT(:,:,:) - END IF - ! - ZPHIT(:,:,:)=(PPABSM(:,:,:)/XP00)**(XRD/XCPD)-PEXNREF(:,:,:) - ! -ELSEIF(CEQNSYS=='LHE') THEN - ZPHIT(:,:,:)= ((PPABSM(:,:,:)/XP00)**(XRD/XCPD)-PEXNREF(:,:,:)) & - * XCPD * PTHVREF(:,:,:) - ! -END IF -! -IF(CEQNSYS=='LHE'.AND. LFLAT .AND. LCARTESIAN) THEN - ! flat cartesian LHE case -> exact solution - ! - CALL FLAT_INV(HLBCX,HLBCY,PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF, & - PTRIGSX,PTRIGSY,KIFAXX,KIFAXY,ZDV_SOURCE,ZPHIT) -ELSE - SELECT CASE(HPRESOPT) - CASE('RICHA') ! Richardson's method -! - CALL RICHARDSON(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTHETAV, & - PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY, & - KIFAXX,KIFAXY,KITR,KTCOUNT,PRELAX,ZDV_SOURCE,ZPHIT) -! - CASE('CGRAD') ! Conjugate Gradient method - CALL CONJGRAD(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTHETAV, & - PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY, & - KIFAXX,KIFAXY,KITR,ZDV_SOURCE,ZPHIT) -! - CASE('CRESI') ! Conjugate Residual method - CALL CONRESOL(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRHODJ,ZTHETAV, & - PDXHATM,PDYHATM,PRHOM,PAF,PBF,PCF,PTRIGSX,PTRIGSY, & - KIFAXX,KIFAXY,KITR,ZDV_SOURCE,ZPHIT) - END SELECT -END IF -! -!------------------------------------------------------------------------------- -! -!* 6. ADD THE PRESSURE GRADIENT TO THE SOURCES -! ---------------------------------------- -! -IF ( HLBCX(1) /= 'CYCL' ) THEN - IF(LWEST_ll()) ZPHIT(IIB-1,:,IKB-1) = ZPHIT(IIB,:,IKB-1) - IF(LEAST_ll()) ZPHIT(IIE+1,:,IKB-1) = ZPHIT(IIE,:,IKB-1) -ENDIF -IF ( HLBCY(1) /= 'CYCL' ) THEN - IF (LSOUTH_ll()) ZPHIT(:,IJB-1,IKB-1) = ZPHIT(:,IJB,IKB-1) - IF (LNORTH_ll()) ZPHIT(:,IJE+1,IKB-1) = ZPHIT(:,IJE,IKB-1) -ENDIF -! -IF ( L2D ) THEN - IF (LSOUTH_ll()) ZPHIT(:,IJB-1,:) = ZPHIT(:,IJB,:) - IF (LNORTH_ll()) ZPHIT(:,IJE+1,:) = ZPHIT(:,IJB,:) -END IF -! -ZDV_SOURCE = GX_M_U(1,IKU,1,ZPHIT,PDXX,PDZZ,PDZX) -! -IF ( HLBCX(1) /= 'CYCL' ) THEN - IF(LWEST_ll()) THEN -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! - DO JK=2,IKU-1 - ZDV_SOURCE(2,:,JK)= & - (ZPHIT(2,:,JK) - ZPHIT(1,:,JK) - 0.5 * ( & - PDZX(2,:,JK) * (ZPHIT(2,:,JK)-ZPHIT(2,:,JK-1)) / PDZZ(2,:,JK) & - +PDZX(2,:,JK+1) * (ZPHIT(2,:,JK+1)-ZPHIT(2,:,JK)) / PDZZ(2,:,JK+1) & - ) & - ) / PDXX(2,:,JK) - END DO - ENDIF - ! - IF(LEAST_ll()) THEN - DO JK=2,IKU-1 - ZDV_SOURCE(IIU,:,JK)= & - (ZPHIT(IIU,:,JK) - ZPHIT(IIU-1,:,JK) - 0.5 * ( & - PDZX(IIU,:,JK) * (ZPHIT(IIU-1,:,JK)-ZPHIT(IIU-1,:,JK-1)) & - / PDZZ(IIU-1,:,JK) & - +PDZX(IIU,:,JK+1) * (ZPHIT(IIU-1,:,JK+1)-ZPHIT(IIU-1,:,JK)) & - / PDZZ(IIU-1,:,JK+1) & - ) & - ) / PDXX(IIU,:,JK) - END DO - END IF -END IF -! -IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PRUS = PRUS - MXM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE - PRWS = PRWS - MZM(PRHODJ * XCPD * ZTHETAV) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) -ELSEIF(CEQNSYS=='LHE') THEN - PRUS = PRUS - MXM(PRHODJ) * ZDV_SOURCE - PRWS = PRWS - MZM(PRHODJ) * GZ_M_W(1,IKU,1,ZPHIT,PDZZ) -END IF -! -IF(.NOT. L2D) THEN -! - ZDV_SOURCE = GY_M_V(1,IKU,1,ZPHIT,PDYY,PDZZ,PDZY) -! - IF ( HLBCY(1) /= 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! -!!!!!!!!!!!!!!!! FUJI compiler directive !!!!!!!!!! - DO JK=2,IKU-1 - ZDV_SOURCE(:,2,JK)= & - (ZPHIT(:,2,JK) - ZPHIT(:,1,JK) - 0.5 * ( & - PDZY(:,2,JK) * (ZPHIT(:,2,JK)-ZPHIT(:,2,JK-1)) / PDZZ(:,2,JK) & - +PDZY(:,2,JK+1) * (ZPHIT(:,2,JK+1)-ZPHIT(:,2,JK)) / PDZZ(:,2,JK+1) & - ) & - ) / PDYY(:,2,JK) - END DO - END IF - ! - IF (LNORTH_ll()) THEN - DO JK=2,IKU-1 - ZDV_SOURCE(:,IJU,JK)= & - (ZPHIT(:,IJU,JK) - ZPHIT(:,IJU-1,JK) - 0.5 * ( & - PDZY(:,IJU,JK) * (ZPHIT(:,IJU-1,JK)-ZPHIT(:,IJU-1,JK-1)) & - / PDZZ(:,IJU-1,JK) & - +PDZY(:,IJU,JK+1) * (ZPHIT(:,IJU-1,JK+1)-ZPHIT(:,IJU-1,JK)) & - / PDZZ(:,IJU-1,JK+1) & - ) & - ) / PDYY(:,IJU,JK) - END DO - END IF - END IF -! - IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PRVS = PRVS - MYM(PRHODJ * XCPD * ZTHETAV) * ZDV_SOURCE - ELSEIF(CEQNSYS=='LHE') THEN - PRVS = PRVS - MYM(PRHODJ) * ZDV_SOURCE - END IF -END IF -! -!! same boundary conditions as in gdiv ... !! (provisory coding) -!! (necessary when NVERB=1) -DO JJ = IJB,IJE ! copy the horizontal components under - DO JI = IIB,IIE - PRUS(JI,JJ,IKB-1)=PRUS(JI,JJ,IKB) - PRUS(JI,JJ,IKE+1)=PRUS(JI,JJ,IKE) - END DO -END DO -! -DO JJ = IJB,IJE - DO JI = IIB,IIE ! the ground and above the top - PRVS(JI,JJ,IKB-1)=PRVS(JI,JJ,IKB) - PRVS(JI,JJ,IKE+1)=PRVS(JI,JJ,IKE) - END DO -END DO -!! -! -! compute the residual divergence -CALL GDIV(HLBCX,HLBCY,PDXX,PDYY,PDZX,PDZY,PDZZ,PRUS,PRVS,PRWS,ZDV_SOURCE) -! -IF ( CEQNSYS=='DUR' ) THEN - IF ( SIZE(PRVREF,1) == 0 ) THEN - ZDV_SOURCE=ZDV_SOURCE/PRHODJ/XTH00*PRHODREF*PTHVREF - ELSE - ZDV_SOURCE=ZDV_SOURCE/PRHODJ/XTH00*PRHODREF*PTHVREF*(1.+PRVREF) - END IF -ELSEIF( CEQNSYS=='MAE' .OR. CEQNSYS=='LHE' ) THEN - ZDV_SOURCE=ZDV_SOURCE/PRHODJ*PRHODREF -END IF -! -ZMAXVAL=MAX_ll(ABS(ZDV_SOURCE),IINFO_ll) -IF (PRESENT(PRESIDUAL)) PRESIDUAL = ZMAXVAL -IMAXLOC=MAXLOC( ABS(ZDV_SOURCE(IIB:IIE,IJB:IJE,IKB:IKE))) !provisory coding one one processor only -! -WRITE(ILUOUT,*) 'residual divergence / 2 DT', ZMAXVAL, & - ' located at ', IMAXLOC -! number of iterations adjusted -IF (LFLAT .AND. LCARTESIAN) THEN - ZMAXRES = 1.E-12 -ELSE - ZMAXRES = 1.E-9 -END IF -! -IF (OITRADJ) THEN - IF (ZMAXVAL>10.*ZMAXRES) THEN - KITR=KITR+2 - WRITE(ILUOUT,*) 'NITR adjusted to ', KITR - ELSE IF (ZMAXVAL<ZMAXRES) THEN - KITR=MAX(KITR-1,1) - WRITE(ILUOUT,*) 'NITR adjusted to ', KITR - ENDIF -ENDIF -! -!* 7. STORAGE OF THE FIELDS IN BUDGET ARRAYS -! -------------------------------------- -! -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'PRES_BU_RU') -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'PRES_BU_RV') -IF (LBUDGET_W) CALL BUDGET (PRWS,3,'PRES_BU_RW') -! -!------------------------------------------------------------------------------- -! -!* 8. ABSOLUTE PRESSURE COMPUTATION -! ----------------------------- -! -!IF ( ABS(PRHODREF(IIB,IJB,IKB)-PRHODREF(IIB,IJB,IKE)) > 1.E-16 & -IF ( ABS(PRHODREF(IIB,IJB,IKB)-PRHODREF(IIB,IJB,IKE)) > 1.E-12 & - .AND. KTCOUNT >0 ) THEN - CALL P_ABS ( KRR, KRRL, KRRI, PDRYMASST, PREFMASS, PMASS_O_PHI0, & - PTHT, PRT, PRHODJ, PRHODREF, ZTHETAV, PTHVREF, & - PRVREF, PEXNREF, ZPHIT ) -! - IF(CEQNSYS=='MAE' .OR. CEQNSYS=='DUR') THEN - PPABST(:,:,:)=XP00*(ZPHIT+PEXNREF)**(XCPD/XRD) - ELSEIF(CEQNSYS=='LHE') THEN - PPABST(:,:,:)=XP00*(ZPHIT/(XCPD*PTHVREF)+PEXNREF)**(XCPD/XRD) - ENDIF -! - IF( HLBCX(1) == 'CYCL' ) THEN - IF (LWEST_ll()) THEN - ZPABS_W(:,:)= PPABST(IIB,:,:) - END IF -! - IF (LEAST_ll()) THEN - ZPABS_E(:,:)= PPABST(IIE+1,:,:) - END IF -! - END IF -! - IF( HLBCY(1) == 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN - ZPABS_S(:,:)= PPABST(:,IJB,:) - END IF -! - IF (LNORTH_ll()) THEN - ZPABS_N(:,:)= PPABST(:,IJE+1,:) - END IF -! - END IF -! - CALL ADD3DFIELD_ll( TZFIELDS_2_ll, PPABST, 'PRESSURE::PPABST' ) - CALL UPDATE_HALO_ll(TZFIELDS_2_ll,IINFO_ll) - CALL CLEANLIST_ll(TZFIELDS_2_ll) -! - IF( HLBCX(1) == 'CYCL' ) THEN - IF (LWEST_ll()) THEN - PPABST(IIB,:,:) = ZPABS_W(:,:) - END IF -! - IF (LEAST_ll()) THEN - PPABST(IIE+1,:,:) = ZPABS_E(:,:) - END IF -! - END IF -! - IF( HLBCY(1) == 'CYCL' ) THEN - IF (LSOUTH_ll()) THEN - PPABST(:,IJB,:) = ZPABS_S(:,:) - END IF -! - IF (LNORTH_ll()) THEN - PPABST(:,IJE+1,:) = ZPABS_N(:,:) - END IF -! - END IF -! -END IF -! -!------------------------------------------------------------------------------- -! -END SUBROUTINE PRESSURE diff --git a/src/ZSOLVER/viscosity.f90 b/src/ZSOLVER/viscosity.f90 index a450ca9d7..e202cf20e 100644 --- a/src/ZSOLVER/viscosity.f90 +++ b/src/ZSOLVER/viscosity.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -91,21 +91,29 @@ SUBROUTINE VISCOSITY(HLBCX, HLBCY, KRR, KSV, PNU, PPRANDTL, & !! 01/18 (C.Lac) Add budgets ! P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine ! P. Wautelet 08/11/2019: corrected wrong budget name VISC_BU_RU -> VISC_BU_RTH +! P. Wautelet 02/2020: use the new data structures and subroutines for budgets +! T. Nagel 02/2021: add adhesion condition in case of an IBM-obstacle at the domain top boundary !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! - USE MODI_LAP_M - USE MODI_SHUMAN - USE MODD_PARAMETERS + USE MODD_ARGSLIST_ll, ONLY: LIST_ll + use modd_budget, only: lbudget_u, lbudget_v, lbudget_w, lbudget_th, lbudget_rv, lbudget_rc, & + lbudget_rr, lbudget_ri, lbudget_rs, lbudget_rg, lbudget_rh, lbudget_sv, & + NBUDGET_U, NBUDGET_V, NBUDGET_W, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & + NBUDGET_RR, NBUDGET_RI, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH, NBUDGET_SV1, & + tbudgets USE MODD_CONF - USE MODD_VISCOSITY USE MODD_DRAG_n - USE MODD_BUDGET + USE MODD_PARAMETERS + USE MODD_VISCOSITY + + use mode_budget, only: Budget_store_init, Budget_store_end USE MODE_ll - USE MODD_ARGSLIST_ll, ONLY : LIST_ll - USE MODI_BUDGET + + USE MODI_SHUMAN + USE MODI_LAP_M ! !------------------------------------------------------------------------------- ! @@ -180,6 +188,23 @@ IIU=SIZE(PWT,1) IJU=SIZE(PWT,2) IKU=SIZE(PWT,3) +if ( lbudget_u .and. ovisc_uvw ) call Budget_store_init( tbudgets(NBUDGET_U ), 'VISC', prus (:, :, :) ) +if ( lbudget_v .and. ovisc_uvw ) call Budget_store_init( tbudgets(NBUDGET_V ), 'VISC', prvs (:, :, :) ) +if ( lbudget_w .and. ovisc_uvw ) call Budget_store_init( tbudgets(NBUDGET_W ), 'VISC', prws (:, :, :) ) +if ( lbudget_th .and. ovisc_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'VISC', prths(:, :, :) ) +if ( lbudget_rv .and. ovisc_r ) call Budget_store_init( tbudgets(NBUDGET_RV), 'VISC', prrs (:, :, :, 1) ) +if ( lbudget_rc .and. ovisc_r ) call Budget_store_init( tbudgets(NBUDGET_RC), 'VISC', prrs (:, :, :, 2) ) +if ( lbudget_rr .and. ovisc_r ) call Budget_store_init( tbudgets(NBUDGET_RR), 'VISC', prrs (:, :, :, 3) ) +if ( lbudget_ri .and. ovisc_r ) call Budget_store_init( tbudgets(NBUDGET_RI), 'VISC', prrs (:, :, :, 4) ) +if ( lbudget_rs .and. ovisc_r ) call Budget_store_init( tbudgets(NBUDGET_RS), 'VISC', prrs (:, :, :, 5) ) +if ( lbudget_rg .and. ovisc_r ) call Budget_store_init( tbudgets(NBUDGET_RG), 'VISC', prrs (:, :, :, 6) ) +if ( lbudget_rh .and. ovisc_r ) call Budget_store_init( tbudgets(NBUDGET_RH), 'VISC', prrs (:, :, :, 7) ) +if ( lbudget_sv .and. ovisc_sv ) then + do ik = 1, ksv + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + ik), 'VISC', prsvs(:, :, :, ik) ) + end do +end if + !* 1. Viscous forcing for potential temperature ! ----------------------------------------- ! @@ -193,8 +218,6 @@ IF (OVISC_TH) THEN ! END IF ! -IF (LBUDGET_TH) CALL BUDGET (PRTHS,4,'VISC_BU_RTH') -! !------------------------------------------------------------------------------- ! !* 2. Viscous forcing for moisture @@ -211,14 +234,6 @@ IF (OVISC_R .AND. (SIZE(PRT,1) > 0)) THEN ! END IF ! -IF (LBUDGET_RV) CALL BUDGET (PRRS(:,:,:,1),6,'VISC_BU_RRV') -IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7,'VISC_BU_RRC') -IF (LBUDGET_RR) CALL BUDGET (PRRS(:,:,:,3),8,'VISC_BU_RRR') -IF (LBUDGET_RI) CALL BUDGET (PRRS(:,:,:,4),9,'VISC_BU_RRI') -IF (LBUDGET_RS) CALL BUDGET (PRRS(:,:,:,5),10,'VISC_BU_RRS') -IF (LBUDGET_RG) CALL BUDGET (PRRS(:,:,:,6),11,'VISC_BU_RRG') -IF (LBUDGET_RH) CALL BUDGET (PRRS(:,:,:,7),12,'VISC_BU_RRH') -! !------------------------------------------------------------------------------- ! !* 3. Viscous forcing for passive scalars @@ -234,13 +249,6 @@ IF (OVISC_SV .AND. (SIZE(PSVT,1) > 0)) THEN ! END IF ! -IF (LBUDGET_SV) THEN - DO IK = 1, KSV - CALL BUDGET (PRSVS(:,:,:,IK), 12+IK, 'VISC_BU_RSV') - END DO -END IF -! - !------------------------------------------------------------------------------- ! !* 4. Viscous forcing for momentum @@ -254,6 +262,8 @@ IF (OVISC_UVW) THEN ZY1 = MXF(PUT) IF (ODRAG) THEN ZY1(:,:,1) = PDRAG * ZY1(:,:,2) +!!Add adhesion condition in case of an IBM-obstacle at the domain top boundary +! ZY1(:,:,IKU) = PDRAG * ZY1(:,:,IKE) ENDIF ! ! @@ -333,9 +343,22 @@ ENDIF ENDIF ENDIF END IF -! -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'VISC_BU_RU') -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'VISC_BU_RV') -IF (LBUDGET_W) CALL BUDGET (PRWS,2,'VISC_BU_RW') -! + +if ( lbudget_u .and. ovisc_uvw ) call Budget_store_end( tbudgets(NBUDGET_U ), 'VISC', prus (:, :, :) ) +if ( lbudget_v .and. ovisc_uvw ) call Budget_store_end( tbudgets(NBUDGET_V ), 'VISC', prvs (:, :, :) ) +if ( lbudget_w .and. ovisc_uvw ) call Budget_store_end( tbudgets(NBUDGET_W ), 'VISC', prws (:, :, :) ) +if ( lbudget_th .and. ovisc_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'VISC', prths(:, :, :) ) +if ( lbudget_rv .and. ovisc_r ) call Budget_store_end( tbudgets(NBUDGET_RV), 'VISC', prrs (:, :, :, 1) ) +if ( lbudget_rc .and. ovisc_r ) call Budget_store_end( tbudgets(NBUDGET_RC), 'VISC', prrs (:, :, :, 2) ) +if ( lbudget_rr .and. ovisc_r ) call Budget_store_end( tbudgets(NBUDGET_RR), 'VISC', prrs (:, :, :, 3) ) +if ( lbudget_ri .and. ovisc_r ) call Budget_store_end( tbudgets(NBUDGET_RI), 'VISC', prrs (:, :, :, 4) ) +if ( lbudget_rs .and. ovisc_r ) call Budget_store_end( tbudgets(NBUDGET_RS), 'VISC', prrs (:, :, :, 5) ) +if ( lbudget_rg .and. ovisc_r ) call Budget_store_end( tbudgets(NBUDGET_RG), 'VISC', prrs (:, :, :, 6) ) +if ( lbudget_rh .and. ovisc_r ) call Budget_store_end( tbudgets(NBUDGET_RH), 'VISC', prrs (:, :, :, 7) ) +if ( lbudget_sv .and. ovisc_sv ) then + do ik = 1, ksv + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + ik), 'VISC', prsvs(:, :, :, ik) ) + end do +end if + END SUBROUTINE VISCOSITY -- GitLab