From 7390fe431b35d706a9ccd0c70875529b76642b00 Mon Sep 17 00:00:00 2001 From: "Prof. Martyn Clark" Date: Wed, 6 Jul 2022 14:47:54 -0600 Subject: [PATCH] add depth dimension to soil variables --- build/source/dshare/popMetadat.f90 | 6 +++--- build/source/engine/paramCheck.f90 | 6 +++--- build/source/engine/soilLiqFlx.f90 | 6 +++--- build/source/engine/vegNrgFlux.f90 | 10 +++++----- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/build/source/dshare/popMetadat.f90 b/build/source/dshare/popMetadat.f90 index 0a0eff43e..7d741d292 100755 --- a/build/source/dshare/popMetadat.f90 +++ b/build/source/dshare/popMetadat.f90 @@ -204,8 +204,8 @@ subroutine popMetadat(err,message) mpar_meta(iLookPARAM%rootDistExp) = var_info('rootDistExp' , 'exponent for the vertical distribution of root density' , '-' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%plantWiltPsi) = var_info('plantWiltPsi' , 'matric head at wilting point' , 'm' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%soilStressParam) = var_info('soilStressParam' , 'parameter in the exponential soil stress function' , '-' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) - mpar_meta(iLookPARAM%critSoilWilting) = var_info('critSoilWilting' , 'critical vol. liq. water content when plants are wilting' , '-' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) - mpar_meta(iLookPARAM%critSoilTranspire) = var_info('critSoilTranspire' , 'critical vol. liq. water content when transpiration is limited' , '-' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) + mpar_meta(iLookPARAM%critSoilWilting) = var_info('critSoilWilting' , 'critical vol. liq. water content when plants are wilting' , '-' , get_ixVarType('parSoil'), iMissVec, iMissVec, .false.) + mpar_meta(iLookPARAM%critSoilTranspire) = var_info('critSoilTranspire' , 'critical vol. liq. water content when transpiration is limited' , '-' , get_ixVarType('parSoil'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%critAquiferTranspire) = var_info('critAquiferTranspire' , 'critical aquifer storage value when transpiration is limited' , 'm' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%minStomatalResistance) = var_info('minStomatalResistance' , 'minimum stomatal resistance' , 's m-1' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%leafDimension) = var_info('leafDimension' , 'characteristic leaf dimension' , 'm' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) @@ -241,7 +241,7 @@ subroutine popMetadat(err,message) ! scalar soil properties mpar_meta(iLookPARAM%fieldCapacity) = var_info('fieldCapacity' , 'soil field capacity (vol liq water content when baseflow begins)' , '-' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%wettingFrontSuction) = var_info('wettingFrontSuction' , 'Green-Ampt wetting front suction' , 'm' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) - mpar_meta(iLookPARAM%theta_mp) = var_info('theta_mp' , 'volumetric liquid water content when macropore flow begins' , '-' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) + mpar_meta(iLookPARAM%theta_mp) = var_info('theta_mp' , 'volumetric liquid water content when macropore flow begins' , '-' , get_ixVarType('parSoil'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%mpExp) = var_info('mpExp' , 'empirical exponent in macropore flow equation' , '-' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%kAnisotropic) = var_info('kAnisotropic' , 'anisotropy factor for lateral hydraulic conductivity' , '-' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) mpar_meta(iLookPARAM%zScale_TOPMODEL) = var_info('zScale_TOPMODEL' , 'TOPMODEL scaling factor used in lower boundary condition for soil', 'm' , get_ixVarType('scalarv'), iMissVec, iMissVec, .false.) diff --git a/build/source/engine/paramCheck.f90 b/build/source/engine/paramCheck.f90 index 0be4f5aca..0cf3742ab 100755 --- a/build/source/engine/paramCheck.f90 +++ b/build/source/engine/paramCheck.f90 @@ -116,8 +116,8 @@ subroutine paramCheck(mpar_data,err,message) heightCanopyTop => mpar_data%var(iLookPARAM%heightCanopyTop)%dat(1), & ! intent(in): [dp] height at the top of the vegetation canopy (m) heightCanopyBottom => mpar_data%var(iLookPARAM%heightCanopyBottom)%dat(1),& ! intent(in): [dp] height at the bottom of the vegetation canopy (m) ! transpiration - critSoilWilting => mpar_data%var(iLookPARAM%critSoilWilting)%dat(1), & ! intent(in): [dp] critical vol. liq. water content when plants are wilting (-) - critSoilTranspire => mpar_data%var(iLookPARAM%critSoilTranspire)%dat(1), & ! intent(in): [dp] critical vol. liq. water content when transpiration is limited (-) + critSoilWilting => mpar_data%var(iLookPARAM%critSoilWilting)%dat, & ! intent(in): [dp] critical vol. liq. water content when plants are wilting (-) + critSoilTranspire => mpar_data%var(iLookPARAM%critSoilTranspire)%dat, & ! intent(in): [dp] critical vol. liq. water content when transpiration is limited (-) ! soil properties fieldCapacity => mpar_data%var(iLookPARAM%fieldCapacity)%dat(1), & ! intent(in): [dp] field capacity (-) theta_sat => mpar_data%var(iLookPARAM%theta_sat)%dat, & ! intent(in): [dp(:)] soil porosity (-) @@ -161,7 +161,7 @@ subroutine paramCheck(mpar_data,err,message) end if ! check transpiration - if(critSoilTranspire < critSoilWilting)then + if( any(critSoilTranspire < critSoilWilting) )then write(message,'(a,i0,a)') trim(message)//'critical point for transpiration is less than the wilting point' err=20; return endif diff --git a/build/source/engine/soilLiqFlx.f90 b/build/source/engine/soilLiqFlx.f90 index 30a5cda2b..b7b5970b0 100755 --- a/build/source/engine/soilLiqFlx.f90 +++ b/build/source/engine/soilLiqFlx.f90 @@ -282,7 +282,7 @@ subroutine soilLiqFlx(& f_impede => mpar_data%var(iLookPARAM%f_impede)%dat(1), & ! intent(in): ice impedence factor (-) soilIceScale => mpar_data%var(iLookPARAM%soilIceScale)%dat(1), & ! intent(in): scaling factor for depth of soil ice, used to get frozen fraction (m) soilIceCV => mpar_data%var(iLookPARAM%soilIceCV)%dat(1), & ! intent(in): CV of depth of soil ice, used to get frozen fraction (-) - theta_mp => mpar_data%var(iLookPARAM%theta_mp)%dat(1), & ! intent(in): volumetric liquid water content when macropore flow begins (-) + theta_mp => mpar_data%var(iLookPARAM%theta_mp)%dat, & ! intent(in): volumetric liquid water content when macropore flow begins (-) mpExp => mpar_data%var(iLookPARAM%mpExp)%dat(1), & ! intent(in): empirical exponent in macropore flow equation (-) ! input: saturated hydraulic conductivity mLayerSatHydCondMP => flux_data%var(iLookFLUX%mLayerSatHydCondMP)%dat, & ! intent(in): saturated hydraulic conductivity of macropores at the mid-point of each layer (m s-1) @@ -404,7 +404,7 @@ subroutine soilLiqFlx(& mpExp, & ! intent(in): empirical exponent in macropore flow equation (-) theta_sat(iSoil), & ! intent(in): soil porosity (-) theta_res(iSoil), & ! intent(in): soil residual volumetric water content (-) - theta_mp, & ! intent(in): volumetric liquid water content when macropore flow begins (-) + theta_mp(iSoil), & ! intent(in): volumetric liquid water content when macropore flow begins (-) f_impede, & ! intent(in): ice impedence factor (-) ! input: saturated hydraulic conductivity mLayerSatHydCond(iSoil), & ! intent(in): saturated hydraulic conductivity at the mid-point of each layer (m s-1) @@ -615,7 +615,7 @@ subroutine soilLiqFlx(& case(mixdform) scalarVolFracLiqTrial = volFracLiq(vectorMatricHeadTrial(ixPerturb),vGn_alpha(ixPerturb),theta_res(ixPerturb),theta_sat(ixPerturb),vGn_n(ixPerturb),vGn_m(ixPerturb)) scalarHydCondMicro = hydCond_psi(vectorMatricHeadTrial(ixPerturb),mLayerSatHydCond(ixOriginal),vGn_alpha(ixPerturb),vGn_n(ixPerturb),vGn_m(ixPerturb)) * iceImpedeFac(ixOriginal) - scalarHydCondMacro = hydCondMP_liq(scalarVolFracLiqTrial,theta_sat(ixPerturb),theta_mp,mpExp,mLayerSatHydCondMP(ixOriginal),mLayerSatHydCond(ixOriginal)) + scalarHydCondMacro = hydCondMP_liq(scalarVolFracLiqTrial,theta_sat(ixPerturb),theta_mp(ixPerturb),mpExp,mLayerSatHydCondMP(ixOriginal),mLayerSatHydCond(ixOriginal)) vectorHydCondTrial(ixPerturb) = scalarHydCondMicro + scalarHydCondMacro case default; err=10; message=trim(message)//"unknown form of Richards' equation"; return end select ! (form of Richards' equation) diff --git a/build/source/engine/vegNrgFlux.f90 b/build/source/engine/vegNrgFlux.f90 index 905732644..dc8dea90c 100755 --- a/build/source/engine/vegNrgFlux.f90 +++ b/build/source/engine/vegNrgFlux.f90 @@ -483,8 +483,8 @@ subroutine vegNrgFlux(& theta_res => mpar_data%var(iLookPARAM%theta_res)%dat(1), & ! intent(in): [dp] residual volumetric liquid water content (-) plantWiltPsi => mpar_data%var(iLookPARAM%plantWiltPsi)%dat(1), & ! intent(in): [dp] matric head at wilting point (m) soilStressParam => mpar_data%var(iLookPARAM%soilStressParam)%dat(1), & ! intent(in): [dp] parameter in the exponential soil stress function (-) - critSoilWilting => mpar_data%var(iLookPARAM%critSoilWilting)%dat(1), & ! intent(in): [dp] critical vol. liq. water content when plants are wilting (-) - critSoilTranspire => mpar_data%var(iLookPARAM%critSoilTranspire)%dat(1), & ! intent(in): [dp] critical vol. liq. water content when transpiration is limited (-) + critSoilWilting => mpar_data%var(iLookPARAM%critSoilWilting)%dat, & ! intent(in): [dp] critical vol. liq. water content when plants are wilting (-) + critSoilTranspire => mpar_data%var(iLookPARAM%critSoilTranspire)%dat, & ! intent(in): [dp] critical vol. liq. water content when transpiration is limited (-) critAquiferTranspire => mpar_data%var(iLookPARAM%critAquiferTranspire)%dat(1), & ! intent(in): [dp] critical aquifer storage value when transpiration is limited (m) minStomatalResistance => mpar_data%var(iLookPARAM%minStomatalResistance)%dat(1), & ! intent(in): [dp] mimimum stomatal resistance (s m-1) @@ -2465,8 +2465,8 @@ subroutine soilResist(& ! input (parameters) real(rkind),intent(in) :: plantWiltPsi ! matric head at wilting point (m) real(rkind),intent(in) :: soilStressParam ! parameter in the exponential soil stress function (-) - real(rkind),intent(in) :: critSoilWilting ! critical vol. liq. water content when plants are wilting (-) - real(rkind),intent(in) :: critSoilTranspire ! critical vol. liq. water content when transpiration is limited (-) + real(rkind),intent(in) :: critSoilWilting(:) ! critical vol. liq. water content when plants are wilting (-) + real(rkind),intent(in) :: critSoilTranspire(:) ! critical vol. liq. water content when transpiration is limited (-) real(rkind),intent(in) :: critAquiferTranspire ! critical aquifer storage value when transpiration is limited (m) ! output real(rkind),intent(out) :: wAvgTranspireLimitFac ! intent(out): weighted average of the transpiration limiting factor (-) @@ -2487,7 +2487,7 @@ subroutine soilResist(& ! compute the soil stress function select case(ixSoilResist) case(NoahType) ! thresholded linear function of volumetric liquid water content - gx = (mLayerVolFracLiq(iLayer) - critSoilWilting) / (critSoilTranspire - critSoilWilting) + gx = (mLayerVolFracLiq(iLayer) - critSoilWilting(iLayer)) / (critSoilTranspire(iLayer) - critSoilWilting(iLayer)) case(CLM_Type) ! thresholded linear function of matric head if(mLayerMatricHead(iLayer) > plantWiltPsi)then gx = 1._rkind - mLayerMatricHead(iLayer)/plantWiltPsi