diff --git a/src/MNH/blowsnow.f90 b/src/MNH/blowsnow.f90 index 2c004373072b2eb15f474d07ed56620ebe8bf12b..1bb69443c080ed425a3e753a5e243c8660f00940 100644 --- a/src/MNH/blowsnow.f90 +++ b/src/MNH/blowsnow.f90 @@ -88,9 +88,12 @@ END MODULE MODI_BLOWSNOW !* 0. DECLARATIONS ! USE MODD_BLOWSNOW_n, only: LSNOWSUBL +use modd_budget, only: lbudget_sv, NBUDGET_SV1, tbudgets USE MODD_NSV, only: NSV_SNWBEG, NSV_SNWEND USE MODD_PARAMETERS, only: JPHEXT, JPVEXT +use mode_budget, only: Budget_store_init, Budget_store_end + USE MODI_BLOWSNOW_VELGRAV USE MODI_SEDIM_BLOWSNOW USE MODI_SUBL_BLOWSNOW @@ -213,6 +216,13 @@ END IF !* 5. Sedimentation ! ------------------------ ! +!Remark: budgets not done in SEDIM_BLOWSNOW because arrays are not complete in it +if ( lbudget_sv ) then + do jsv = nsv_snwbeg, nsv_snwend + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'SNSED', psvs(:, :, :, jsv) * prhodj(:, :, :) ) + end do +end if + CALL SEDIM_BLOWSNOW(PTHT(IIB:IIE,IJB:IJE,IKB:IKE), PTSTEP,& PRHODREF(IIB:IIE,IJB:IJE,IKB:IKE), & PZZ(IIB:IIE,IJB:IJE,IKB:IKE+1), & @@ -236,5 +246,10 @@ DO JSV = NSV_SNWBEG, NSV_SNWEND PSVS(:,:,:,JSV) = PSVS(:,:,:,JSV) * PRHODJ(:,:,:) END DO +if ( lbudget_sv ) then + do jsv = nsv_snwbeg, nsv_snwend + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'SNSED', psvs(:, :, :, jsv) ) + end do +end if END SUBROUTINE BLOWSNOW diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90 index b282ed84b6f7814f43cf466e150ae94f1ad01d64..d0be92f6b18304f6a5ecffe856bcbce179c4488f 100644 --- a/src/MNH/ini_budget.f90 +++ b/src/MNH/ini_budget.f90 @@ -205,12 +205,15 @@ end subroutine Budget_preallocate ! P. Wautelet 03/02/2021: budgets: add new source if LIMA splitting: CORR2 ! P. Wautelet 10/02/2021: budgets: add missing sources for NSV_C2R2BEG+3 budget ! P. Wautelet 11/02/2021: budgets: add missing term SCAV for NSV_LIMA_SCAVMASS budget +! P. Wautelet 02/03/2021: budgets: add terms for blowing snow !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS ! ------------ ! use modd_2d_frc, only: l2d_adv_frc, l2d_rel_frc +use modd_blowsnow, only: lblowsnow +use modd_blowsnow_n, only: lsnowsubl use modd_budget use modd_ch_aerosol, only: lorilam use modd_conf, only: l1d, lcartesian, lforcing, lthinshell, nmodel @@ -891,7 +894,7 @@ if ( lbu_rth ) then !Allocate all basic source terms (used or not) !The size should be large enough (bigger than necessary is OK) - isourcesmax = 52 + isourcesmax = 53 tbudgets(NBUDGET_TH)%nsourcesmax = isourcesmax allocate( tbudgets(NBUDGET_TH)%tsources(isourcesmax) ) @@ -1002,6 +1005,11 @@ if ( lbu_rth ) then tzsource%clongname = 'mass flux' call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nmaflth ) + gcond = lblowsnow .and. lsnowsubl + tzsource%cmnhname = 'SNSUB' + tzsource%clongname = 'blowing snow sublimation' + call Budget_source_add( tbudgets(NBUDGET_TH), tzsource, gcond, nsnsubth ) + gcond = lvisc .and. lvisc_th tzsource%cmnhname = 'VISC' tzsource%clongname = 'viscosity' @@ -1281,7 +1289,7 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then !Allocate all basic source terms (used or not) !The size should be large enough (bigger than necessary is OK) - isourcesmax = 33 + isourcesmax = 34 tbudgets(NBUDGET_RV)%nsourcesmax = isourcesmax allocate( tbudgets(NBUDGET_RV)%tsources(isourcesmax) ) @@ -1377,6 +1385,11 @@ if ( tbudgets(NBUDGET_RV)%lenabled ) then tzsource%clongname = 'mass flux' call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nmaflrv ) + gcond = lblowsnow .and. lsnowsubl + tzsource%cmnhname = 'SNSUB' + tzsource%clongname = 'blowing snow sublimation' + call Budget_source_add( tbudgets(NBUDGET_RV), tzsource, gcond, nsnsubrv ) + gcond = lvisc .and. lvisc_r tzsource%cmnhname = 'VISC' tzsource%clongname = 'viscosity' @@ -3886,6 +3899,16 @@ SV_BUDGETS: do jsv = 1, ksv else if ( jsv >= nsv_snwbeg .and. jsv <= nsv_snwend ) then SV_VAR !Snow + gcond = lblowsnow .and. lsnowsubl + tzsource%cmnhname = 'SNSUB' + tzsource%clongname = 'blowing snow sublimation' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nsnsubsv ) + + gcond = lblowsnow + tzsource%cmnhname = 'SNSED' + tzsource%clongname = 'blowing snow sedimentation' + call Budget_source_add( tbudgets(ibudget), tzsource, gcond, nsnsedsv ) + else if ( jsv >= nsv_lnoxbeg .and. jsv <= nsv_lnoxend ) then SV_VAR !LiNOX passive tracer diff --git a/src/MNH/modd_budget.f90 b/src/MNH/modd_budget.f90 index 6b883941bf2b80a7e408fdf59d692806277fe993..0b2179f5982711a9f720470973da0bae20eb90a1 100644 --- a/src/MNH/modd_budget.f90 +++ b/src/MNH/modd_budget.f90 @@ -60,6 +60,7 @@ ! P. Wautelet 11/01/2021: remove nbuwrnb (replaced by nbusubwrite) ! P. Wautelet 14/01/2021: change xbusurf type to integer (+ rename it to nbusurf) ! P. Wautelet 03/02/2021: budgets: add new source if LIMA splitting: CORR2 +! P. Wautelet 02/03/2021: budgets: add terms for blowing snow !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -296,6 +297,7 @@ INTEGER, SAVE :: NRELTH = 0 ! relaxation INTEGER, SAVE :: NRADTH = 0 ! RADiation INTEGER, SAVE :: NDCONVTH = 0 ! KAFR CONVection INTEGER, SAVE :: NMAFLTH = 0 ! Mass flux +INTEGER, SAVE :: NSNSUBTH = 0 ! Blowing snow sublimation INTEGER, SAVE :: NHTURBTH = 0 ! horizontal turbulence INTEGER, SAVE :: NVTURBTH = 0 ! vertical turbulence INTEGER, SAVE :: NDISSHTH = 0 ! dissipative heating @@ -368,6 +370,7 @@ INTEGER, SAVE :: NDIFRV = 0 ! numerical diffusion INTEGER, SAVE :: NRELRV = 0 ! relaxation INTEGER, SAVE :: NDCONVRV = 0 ! KAFR CONVection INTEGER, SAVE :: NMAFLRV = 0 ! Mass flux +INTEGER, SAVE :: NSNSUBRV = 0 ! Blowing snow sublimation INTEGER, SAVE :: NHTURBRV = 0 ! horizontal turbulence INTEGER, SAVE :: NVTURBRV = 0 ! vertical turbulence INTEGER, SAVE :: NNEGARV = 0 ! negative correction @@ -631,6 +634,8 @@ INTEGER, SAVE :: NHTURBSV = 0 ! horizontal turbulence INTEGER, SAVE :: NVTURBSV = 0 ! vertical turbulence INTEGER, SAVE :: NCHEMSV = 0 ! chemistry activity INTEGER, SAVE :: NVISCSV = 0 ! viscosity +INTEGER, SAVE :: NSNSUBSV = 0 ! Blowing snow sublimation +INTEGER, SAVE :: NSNSEDSV = 0 ! Blowing snow sedimentation ! INTEGER, SAVE :: NNEGASV = 0 ! negative correction INTEGER, SAVE :: NNETURSV = 0 ! negative correction diff --git a/src/MNH/modn_budget.f90 b/src/MNH/modn_budget.f90 index d433f3809d4d3fed32ff5ce6cc34ba7054eebdd3..5a9b0fe6162fa91b87e73afd6af7c33aca24299b 100644 --- a/src/MNH/modn_budget.f90 +++ b/src/MNH/modn_budget.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1995-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1995-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. @@ -228,6 +228,7 @@ ! B. Vie 03/02/2020: LIMA negativity checks after turbulence, advection and microphysics budgets ! P. Wautelet 09/03/2020: add missing budgets for electricity ! P. Wautelet 30/06/2020: add NNETURSV, NNEADVSV and NNECONSV variables +! P. Wautelet 02/03/2021: budgets: add terms for blowing snow !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -254,7 +255,7 @@ NAMELIST/NAM_BU_RTH/LBU_RTH, NASSETH, NNESTTH, NADVTH, NFRCTH, & NVTURBTH, NDISSHTH, NNEGATH, NREVATH, NCONDTH, NHENUTH, NHONTH, & NSFRTH, NDEPSTH, NDEPGTH,NRIMTH, NACCTH, NCFRZTH, NWETGTH, & NDRYGTH, NGMLTTH, NIMLTTH, NBERFITH, NCDEPITH, NWETHTH, NHMLTTH, & - NMAFLTH, NNETURTH, NNEADVTH,NNECONTH, NDRYHTH, NADJUTH, NCORRTH, & + NMAFLTH, NSNSUBTH, NNETURTH, NNEADVTH,NNECONTH, NDRYHTH, NADJUTH, NCORRTH, & NHINDTH, NHINCTH, NHONHTH, NHONCTH, NHONRTH, NCEDSTH, NSEDITH, NVISCTH ! NAMELIST/NAM_BU_RTKE/LBU_RTKE, NASSETKE, NADVTKE, & @@ -263,7 +264,7 @@ NAMELIST/NAM_BU_RTKE/LBU_RTKE, NASSETKE, NADVTKE, & ! NAMELIST/NAM_BU_RRV/LBU_RRV, NASSERV, NNESTRV, NADVRV, NFRCRV, & NNUDRV, NDIFRV, NRELRV, NDCONVRV, NHTURBRV, NVTURBRV, NNEGARV, & - NREVARV, NCONDRV, NHENURV, NDEPSRV, NDEPGRV, NCDEPIRV, NMAFLRV, & + NREVARV, NCONDRV, NHENURV, NDEPSRV, NDEPGRV, NCDEPIRV, NMAFLRV, NSNSUBRV, & NNETURRV, NNEADVRV,NNECONRV, NADJURV, NCORRRV, NHINDRV, NHONHRV, NCEDSRV, NVISCRV ! NAMELIST/NAM_BU_RRC/LBU_RRC, NASSERC, NNESTRC, NADVRC, NFRCRC, & @@ -305,22 +306,22 @@ NAMELIST/NAM_BU_RRH/LBU_RRH, NASSERH, NNESTRH, NADVRH, NFRCRH, & NCORRRH, NHGCVRH, NGHCVRH, NCOHGRH, NHMLTRH, & NNETURRH, NNEADVRH, NNECONRH, NVISCRH ! -NAMELIST/NAM_BU_RSV/ LBU_RSV, NASSESV, NNESTSV, NADVSV, NFRCSV, & - NDIFSV, NRELSV, NDCONVSV, NVTURBSV, NHTURBSV, NCHEMSV, NMAFLSV, & - NVISCSV, NNEGASV, NNETURSV, NNEADVSV, NNECONSV, NNEGA2SV, & - NDRIFTQV, NCORAYQV, NDEPSQV, NDEPGQV, NREVAQV, NCDEPIQV, NNEUTQV, & - NHONQC, NAUTOQC, NACCRQC, NRIMQC, NWETGQC, NDRYGQC, NINCGQC, NWETHQC, & - NIMLTQC, NBERFIQC, NSEDIQC, NCDEPIQC, NNEUTQC, & - NSFRQR, NAUTOQR, NACCRQR, NREVAQR, NACCQR, NCFRZQR, NWETGQR, NDRYGQR, & - NGMLTQR, NWETHQR, NHMLTQR, NSEDIQR, NNEUTQR, & - NHONQI, NAGGSQI, NAUTSQI, NCFRZQI, NWETGQI, NDRYGQI, NWETHQI, & - NIMLTQI, NBERFIQI, NNIISQI, NSEDIQI, NCDEPIQI, NNEUTQI, & - NDEPSQS, NAGGSQS, NAUTSQS, NRIMQS, NACCQS, NCMELQS, NWETGQS, & - NDRYGQS, NNIISQS, NWETHQS, NSEDIQS, NNEUTQS, & - NSFRQG, NDEPGQG, NRIMQG, NACCQG, NCMELQG, NCFRZQG, NWETGQG, NDRYGQG, & - NINCGQG, NGMLTQG, NWETHQG, NSEDIQG, NNEUTQG, & - NWETGQH, NWETHQH, NHMLTQH, NSEDIQH, NNEUTQH, & - NDRIFTNI, NCORAYNI, NDEPSNI, NDEPGNI, NREVANI, NCDEPINI, NNEUTNI, & +NAMELIST/NAM_BU_RSV/ LBU_RSV, NASSESV, NNESTSV, NADVSV, NFRCSV, & + NDIFSV, NRELSV, NDCONVSV, NVTURBSV, NHTURBSV, NCHEMSV, NMAFLSV, & + NVISCSV, NSNSUBSV, NSNSEDSV, NNEGASV, NNETURSV, NNEADVSV, NNECONSV, NNEGA2SV, & + NDRIFTQV, NCORAYQV, NDEPSQV, NDEPGQV, NREVAQV, NCDEPIQV, NNEUTQV, & + NHONQC, NAUTOQC, NACCRQC, NRIMQC, NWETGQC, NDRYGQC, NINCGQC, NWETHQC, & + NIMLTQC, NBERFIQC, NSEDIQC, NCDEPIQC, NNEUTQC, & + NSFRQR, NAUTOQR, NACCRQR, NREVAQR, NACCQR, NCFRZQR, NWETGQR, NDRYGQR, & + NGMLTQR, NWETHQR, NHMLTQR, NSEDIQR, NNEUTQR, & + NHONQI, NAGGSQI, NAUTSQI, NCFRZQI, NWETGQI, NDRYGQI, NWETHQI, & + NIMLTQI, NBERFIQI, NNIISQI, NSEDIQI, NCDEPIQI, NNEUTQI, & + NDEPSQS, NAGGSQS, NAUTSQS, NRIMQS, NACCQS, NCMELQS, NWETGQS, & + NDRYGQS, NNIISQS, NWETHQS, NSEDIQS, NNEUTQS, & + NSFRQG, NDEPGQG, NRIMQG, NACCQG, NCMELQG, NCFRZQG, NWETGQG, NDRYGQG, & + NINCGQG, NGMLTQG, NWETHQG, NSEDIQG, NNEUTQG, & + NWETGQH, NWETHQH, NHMLTQH, NSEDIQH, NNEUTQH, & + NDRIFTNI, NCORAYNI, NDEPSNI, NDEPGNI, NREVANI, NCDEPINI, NNEUTNI, & NDEPOTRSV ! END MODULE MODN_BUDGET diff --git a/src/MNH/subl_blowsnow.f90 b/src/MNH/subl_blowsnow.f90 index 5e7e79326f71fa191ab6a0a2cf7ade5890432898..ad0cf278fa86b1eeedaf7c0a2da1344d8d86024a 100644 --- a/src/MNH/subl_blowsnow.f90 +++ b/src/MNH/subl_blowsnow.f90 @@ -51,11 +51,16 @@ END MODULE MODI_SUBL_BLOWSNOW PTHS, PRVS, PSVS,PSNWSUBL3D,PVGK) USE MODD_BLOWSNOW +use modd_budget, only: lbudget_th, lbudget_rv, lbudget_sv, & + NBUDGET_TH, NBUDGET_RV, NBUDGET_SV1, & + tbudgets USE MODD_CST USE MODD_CSTS_BLOWSNOW +use modd_nsv, only: nsv_snwbeg, nsv_snwend USE MODD_PARAMETERS USE MODE_BLOWSNOW_PSD +use mode_budget, only: Budget_store_init, Budget_store_end use mode_tools, only: Countjv USE MODI_GAMMA @@ -223,6 +228,14 @@ GSUBL(IIB:IIE,IJB:IJE,IKB:IKE) = & IMICRO = COUNTJV( GSUBL(:,:,:),I1(:),I2(:),I3(:)) IF( IMICRO >= 0 ) THEN + if ( lbudget_th ) call Budget_store_init( tbudgets(NBUDGET_TH), 'SNSUB', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_init( tbudgets(NBUDGET_RV), 'SNSUB', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + do jsv = nsv_snwbeg, nsv_snwend + call Budget_store_init( tbudgets(NBUDGET_SV1 - 1 + jsv), 'SNSUB', psvs(:, :, :, jsv - nsv_snwbeg + 1) * prhodj(:, :, :) ) + end do + end if + ALLOCATE(ZRVT(IMICRO)) ALLOCATE(ZRCT(IMICRO)) ALLOCATE(ZRRT(IMICRO)) @@ -295,6 +308,14 @@ IF( IMICRO >= 0 ) THEN ! PSVS(:,:,:,3) = UNPACK( ZSVS(:,3),MASK=GSUBL(:,:,:),FIELD=PSVS(:,:,:,3) ) PSNWSUBL3D(:,:,:) = UNPACK( ZSNWSUBL(:),MASK=GSUBL(:,:,:),FIELD=PSNWSUBL3D(:,:,:) ) + if ( lbudget_th ) call Budget_store_end( tbudgets(NBUDGET_TH), 'SNSUB', pths(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_rv ) call Budget_store_end( tbudgets(NBUDGET_RV), 'SNSUB', prvs(:, :, :) * prhodj(:, :, :) ) + if ( lbudget_sv ) then + do jsv = nsv_snwbeg, nsv_snwend + call Budget_store_end( tbudgets(NBUDGET_SV1 - 1 + jsv), 'SNSUB', psvs(:, :, :, jsv - nsv_snwbeg + 1) * prhodj(:, :, :) ) + end do + end if + DEALLOCATE(ZRVT) DEALLOCATE(ZRCT) DEALLOCATE(ZRRT)