diff --git a/build/includes/hru_actor/hru_actor_subroutine_wrappers.hpp b/build/includes/hru_actor/hru_actor_subroutine_wrappers.hpp index cee5ba4cc3810f0a373421db1a163dbdf9fb0288..b5ce7cefe9447ffa13e000ee478a496d2c54bc14 100644 --- a/build/includes/hru_actor/hru_actor_subroutine_wrappers.hpp +++ b/build/includes/hru_actor/hru_actor_subroutine_wrappers.hpp @@ -7,11 +7,13 @@ extern "C" { // Statistics Structures void* forcStat, void* progStat, void* diagStat, void* fluxStat, void* indxStat, void* bvarStat, // Primary Data Structures (scalars) - void* timeStruct, void* forcStruct, + void* timeStruct, void* forcStruct, void* attrStruct, void* typeStruct, void* idStruct, // primary data structures (variable length vectors) - void* indxStruct, void* progStruct, void* diagStruct, void* fluxStruct, + void* indxStruct, void* mparStruct, void* progStruct, void* diagStruct, void* fluxStruct, // basin-average structures - void* bvarStruct, + void* bvarStruct, void* bparStruct, + // ancillary data structures + void* dparStruct, // local HRU data void* startTime, void* finshTime, void* refTime, void* oldTime, int* err); diff --git a/build/source/actors/file_access_actor/cpp_code/file_access_actor.cpp b/build/source/actors/file_access_actor/cpp_code/file_access_actor.cpp index 2284a8a48459beb114324b136eee2757f191fe3b..aa9da25fd1e5cf011b6a6c6efad324e056633b22 100644 --- a/build/source/actors/file_access_actor/cpp_code/file_access_actor.cpp +++ b/build/source/actors/file_access_actor/cpp_code/file_access_actor.cpp @@ -45,8 +45,8 @@ behavior file_access_actor(stateful_actor<file_access_state>* self, int start_gr aout(self) << "Simluations Steps: " << self->state.num_steps << "\n"; // Read in the attribute and parameter information for the HRUs to request - readAttributes(self); - readParameters(self); + // readAttributes(self); + // readParameters(self); // read in the inital conditions for the grus/hrus readInitConditions(self); diff --git a/build/source/actors/file_access_actor/fortran_code/cppwrap_fileAccess.f90 b/build/source/actors/file_access_actor/fortran_code/cppwrap_fileAccess.f90 index ac0b842092de90aa9c27f75f1b8dd433a96413d0..d3707ab2575e9c3fff80ec26c255fdd25d905d07 100644 --- a/build/source/actors/file_access_actor/fortran_code/cppwrap_fileAccess.f90 +++ b/build/source/actors/file_access_actor/fortran_code/cppwrap_fileAccess.f90 @@ -6,6 +6,9 @@ module cppwrap_fileAccess USE nrtype USE data_types USE globalData + USE globalData,only:integerMissing ! missing integer value + USE globalData,only:realMissing ! missing double precision value + USE var_lookup,only:maxvarFreq ! maximum number of output files @@ -36,17 +39,29 @@ subroutine fileAccessActor_init_fortran(& ! Variables for forcing USE def_output_actors_module,only:def_output ! module to define output variables USE output_structure_module,only:initOutputStructure ! module to initialize output structure USE output_structure_module,only:initOutputTimeStep ! module to initialize output timestep structure (tracks GRUs timestep for output) - + USE read_attrb_module,only:read_attrb ! module to read local attributes + USE read_param_module,only:read_param ! module to read model parameter sets + USE pOverwrite_module,only:pOverwrite ! module to overwrite default parameter values with info from the Noah tables + + USE mDecisions_module,only:& + sameRulesAllLayers, & ! SNTHERM option: same combination/sub-dividion rules applied to all layers + rulesDependLayerIndex ! CLM option: combination/sub-dividion rules depend on layer index USE globalData,only:localParFallback ! local column default parameters USE globalData,only:basinParFallback ! basin-average default parameters USE summaFileManager,only:LOCALPARAM_INFO,BASINPARAM_INFO ! files defining the default values and constraints for model parameters USE globalData,only:mpar_meta,bpar_meta ! parameter metadata structures USE summaFileManager,only:SETTINGS_PATH ! define path to settings files (e.g., parameters, soil and veg. tables) + USE summaFileManager,only:LOCAL_ATTRIBUTES ! name of model initial attributes file USE summaFileManager,only:GENPARM,VEGPARM,SOILPARM,MPTABLE ! files defining the noah tables USE globalData,only:model_decisions ! model decision structure USE var_lookup,only:iLookDECISIONS ! look-up values for model decisions - + USE var_lookup,only:iLookTYPE ! look-up values for model types + USE output_structure_module,only:outputStructure ! output structure USE globalData,only:failedHRUs ! Flag for file access actor to know which GRUs have failed + + USE globalData,only:iRunModeFull,iRunModeGRU,iRunModeHRU + USE globalData,only:iRunMode ! define the current running mode + USE globalData,only:checkHRU ! index of the HRU for a single HRU run USE globalData,only:numtim ! number of time steps in the simulation @@ -67,9 +82,14 @@ subroutine fileAccessActor_init_fortran(& ! Variables for forcing ! local Variables type(file_info_array),pointer :: forcFileInfo - type(var_i),pointer :: output_ncid ! id of output file + type(var_i),pointer :: output_ncid ! id of output file + integer(i4b) :: iGRU ! counter for GRUs + integer(i4b) :: iHRU ! counter for HRUs + integer(i4b) :: ivar ! counter for variables + character(len=256) :: attrFile ! attributes file name integer(i4b) :: indxGRU=1 - character(len=256) :: message ! error message for downwind routine + character(len=256) :: message ! error message for downwind routine + err=0; message="fileAccessActor_init_fortran/" @@ -85,6 +105,16 @@ subroutine fileAccessActor_init_fortran(& ! Variables for forcing if(err/=0)then; print*,trim(message); return; endif num_timesteps = numtim + ! get the maximum number of snow layers + select case(model_decisions(iLookDECISIONS%snowLayers)%iDecision) + case(sameRulesAllLayers); maxSnowLayers = 100 + case(rulesDependLayerIndex); maxSnowLayers = 5 + case default; err=20; message=trim(message)//'unable to identify option to combine/sub-divide snow layers';print*,message;return + end select ! (option to combine/sub-divide snow layers) + + + maxLayers = gru_struc(1)%hruInfo(1)%nSoil + maxSnowLayers + ! ***************************************************************************** ! *** read default model parameters ! ***************************************************************************** @@ -96,20 +126,37 @@ subroutine fileAccessActor_init_fortran(& ! Variables for forcing call read_pinit(BASINPARAM_INFO,.FALSE.,bpar_meta,basinParFallback,err,message) if(err/=0)then; print*,trim(message); return; endif + + ! ***************************************************************************** + ! *** read Noah vegetation and soil tables + ! ***************************************************************************** - ! read Noah soil and vegetation tables + greenVegFrac_monthly = (/0.01_dp, 0.02_dp, 0.03_dp, 0.07_dp, 0.50_dp, 0.90_dp, 0.95_dp, 0.96_dp, 0.65_dp, 0.24_dp, 0.11_dp, 0.02_dp/) + + + ! read Noah soil and vegetation tables call soil_veg_gen_parm(trim(SETTINGS_PATH)//trim(VEGPARM), & ! filename for vegetation table - trim(SETTINGS_PATH)//trim(SOILPARM), & ! filename for soils table - trim(SETTINGS_PATH)//trim(GENPARM), & ! filename for general table - trim(model_decisions(iLookDECISIONS%vegeParTbl)%cDecision), & ! classification system used for vegetation - trim(model_decisions(iLookDECISIONS%soilCatTbl)%cDecision)) ! classification system used for soils + trim(SETTINGS_PATH)//trim(SOILPARM), & ! filename for soils table + trim(SETTINGS_PATH)//trim(GENPARM), & ! filename for general table + trim(model_decisions(iLookDECISIONS%vegeParTbl)%cDecision), & ! classification system used for vegetation + trim(model_decisions(iLookDECISIONS%soilCatTbl)%cDecision)) ! classification system used for soils if(err/=0)then; print*,trim(message); return; endif ! read Noah-MP vegetation tables call read_mp_veg_parameters(trim(SETTINGS_PATH)//trim(MPTABLE), & ! filename for Noah-MP table - trim(model_decisions(iLookDECISIONS%vegeParTbl)%cDecision)) ! classification system used for vegetation + trim(model_decisions(iLookDECISIONS%vegeParTbl)%cDecision)) ! classification system used for vegetation if(err/=0)then; print*,trim(message); return; endif + ! define urban vegetation category + select case(trim(model_decisions(iLookDECISIONS%vegeParTbl)%cDecision)) + case('USGS'); urbanVegCategory = 1 + case('MODIFIED_IGBP_MODIS_NOAH'); urbanVegCategory = 13 + case('plumberCABLE'); urbanVegCategory = -999 + case('plumberCHTESSEL'); urbanVegCategory = -999 + case('plumberSUMMA'); urbanVegCategory = -999 + case default; message=trim(message)//'unable to identify vegetation category';print*,message;return + end select + ! ***************************************************************************** ! *** Initalize failed HRU tracker ! ***************************************************************************** @@ -136,6 +183,54 @@ subroutine fileAccessActor_init_fortran(& ! Variables for forcing call initOutputTimeStep(num_gru, err) if(err/=0)then; print*,trim(message); return; endif + + ! ***************************************************************************** + ! *** Read Attributes + ! ***************************************************************************** + + attrFile = trim(SETTINGS_PATH)//trim(LOCAL_ATTRIBUTES) + call read_attrb(trim(attrFile),num_gru,outputStructure(1)%attrStruct(1),& + outputStructure(1)%typeStruct(1),outputStructure(1)%idStruct(1),err,message) + if(err/=0)then; print*,trim(message); return; endif + + + ! set default model parameters + do iGRU=1, num_gru + do iHRU=1, gru_struc(iGRU)%hruCount + ! set parmameters to their default value + outputStructure(1)%dparStruct(1)%gru(iGRU)%hru(iHRU)%var(:) = localParFallback(:)%default_val ! x%hru(:)%var(:) + + ! overwrite default model parameters with information from the Noah-MP tables + call pOverwrite(outputStructure(1)%typeStruct(1)%gru(iGRU)%hru(iHRU)%var(iLookTYPE%vegTypeIndex), & ! vegetation category + outputStructure(1)%typeStruct(1)%gru(iGRU)%hru(iHRU)%var(iLookTYPE%soilTypeIndex), & ! soil category + outputStructure(1)%dparStruct(1)%gru(iGRU)%hru(iHRU)%var, & ! default model parameters + err,message) ! error control + if(err/=0)then; print*, trim(message); return; endif + + + ! copy over to the parameter structure + ! NOTE: constant for the dat(:) dimension (normally depth) + do ivar=1,size(localParFallback) + outputStructure(1)%mparStruct(1)%gru(iGRU)%hru(iHRU)%var(ivar)%dat(:) = outputStructure(1)%dparStruct(1)%gru(iGRU)%hru(iHRU)%var(ivar) + end do ! looping through variables + + end do ! looping through HRUs + + ! set default for basin-average parameters + outputStructure(1)%bparStruct(1)%gru(iGRU)%var(:) = basinParFallback(:)%default_val + + end do ! looping through GRUs + + + ! ***************************************************************************** + ! *** Read Parameters + ! ***************************************************************************** + irunMode = iRunModeFull; checkHRU = integerMissing + call read_param(iRunMode,checkHRU,start_gru,num_hru,num_gru,outputStructure(1)%idStruct(1),& + outputStructure(1)%mparStruct(1),outputStructure(1)%bparStruct(1),err,message) + if(err/=0)then; print*,trim(message); return; endif + + end subroutine fileAccessActor_init_fortran diff --git a/build/source/actors/file_access_actor/fortran_code/output_structure.f90 b/build/source/actors/file_access_actor/fortran_code/output_structure.f90 index b497bb59717ae80a6e3f542c11c72b41eced4af4..60a28ca3899cfa2bdcc9138ae73f3b3c10f6febf 100644 --- a/build/source/actors/file_access_actor/fortran_code/output_structure.f90 +++ b/build/source/actors/file_access_actor/fortran_code/output_structure.f90 @@ -71,7 +71,7 @@ module output_structure_module type(gru_hru_time_int),allocatable :: timeStruct(:) ! x%gru(:)%hru(:)%var(:)%tim(:) -- model time data type(gru_hru_time_double),allocatable :: forcStruct(:) ! x%gru(:)%hru(:)%var(:)%tim(:) -- model forcing data type(gru_hru_double),allocatable :: attrStruct(:) ! x%gru(:)%hru(:)%var(:) -- local attributes for each HRU, DOES NOT CHANGE OVER TIMESTEPS - type(gru_hru_int),allocatable :: typeStruct(:) ! x%gru(:)%hru(:)%var(:)%tim(:) -- local classification of soil veg etc. for each HRU, DOES NOT CHANGE OVER TIMESTEPS + type(gru_hru_int),allocatable :: typeStruct(:) ! x%gru(:)%hru(:)%var(:) -- local classification of soil veg etc. for each HRU, DOES NOT CHANGE OVER TIMESTEPS type(gru_hru_int8),allocatable :: idStruct(:) ! x%gru(:)%hru(:)%var(:) ! define the primary data structures (variable length vectors) @@ -95,7 +95,7 @@ module output_structure_module end type summa_output_type - type(summa_output_type),allocatable,save,public :: outputStructure(:) ! summa_OutputStructure(iFile)%struc%var(:)%dat(nTimeSteps) + type(summa_output_type),allocatable,save,public :: outputStructure(:) ! summa_OutputStructure(1)%struc%var(:)%dat(nTimeSteps) contains @@ -132,9 +132,11 @@ subroutine initOutputStructure(forcFileInfo, maxSteps, num_gru, err) USE globalData,only:statBvar_meta ! child metadata for stats USE globalData,only:gru_struc USE globalData,only:structInfo ! information on the data structures - USE multiconst,only:secprday ! number of seconds in a day + USE multiconst,only:secprday ! number of seconds in a day USE data_types,only:file_info_array - USE var_lookup,only:maxvarFreq ! maximum number of output files + USE var_lookup,only:maxvarFreq ! maximum number of output files + + USE allocspace_module,only:allocGlobal ! module to allocate space for global data structures implicit none type(file_info_array),intent(in) :: forcFileInfo @@ -273,20 +275,14 @@ subroutine initOutputStructure(forcFileInfo, maxSteps, num_gru, err) call alloc_outputStruc(statForc_meta(:)%var_info,outputStructure(1)%forcStat(1)%gru(iGRU)%hru(iHRU), & nSteps=maxSteps,nSnow=nSnow,nSoil=nSoil,err=err,message=message); ! model forcing data case('attr') - call alloc_outputStruc(attr_meta,outputStructure(1)%attrStruct(1)%gru(iGRU)%hru(iHRU), & - nSteps=maxSteps,nSnow=nSnow,nSoil=nSoil,err=err,message=message); ! local attributes for each HRU + call allocGlobal(attr_meta, outputStructure(1)%attrStruct(1)%gru(iGRU)%hru(iHRU), err, message) case('type') - call alloc_outputStruc(type_meta,outputStructure(1)%typeStruct(1)%gru(iGRU)%hru(iHRU), & - nSteps=maxSteps,nSnow=nSnow,nSoil=nSoil,err=err,message=message); ! classification of soil veg etc. + call allocGlobal(type_meta, outputStructure(1)%typeStruct(1), err, message) case('id' ) - call alloc_outputStruc(id_meta,outputStructure(1)%idStruct(1)%gru(iGRU)%hru(iHRU), & - nSteps=maxSteps,nSnow=nSnow,nSoil=nSoil,err=err,message=message); ! local values of hru gru IDs + call allocGlobal(id_meta, outputStructure(1)%idStruct(1), err, message) case('mpar') ! model parameters - call alloc_outputStruc(mpar_meta,outputStructure(1)%mparStruct(1)%gru(iGRU)%hru(iHRU), & - nSteps=maxSteps,nSnow=nSnow,nSoil=nSoil,err=err,message=message); - - call alloc_outputStruc(mpar_meta, outputStructure(1)%dparStruct(1)%gru(iGRU)%hru(iHRU), & - nSteps=maxSteps,err=err,message=message) + call allocGlobal(mpar_meta,outputStructure(1)%mparStruct(1),err,message); + call allocGlobal(mpar_meta,outputStructure(1)%dparStruct(1),err,message); case('indx') ! Structure call alloc_outputStruc(indx_meta,outputStructure(1)%indxStruct(1)%gru(iGRU)%hru(iHRU), & @@ -316,8 +312,7 @@ subroutine initOutputStructure(forcFileInfo, maxSteps, num_gru, err) call alloc_outputStruc(statFlux_meta(:)%var_info,outputStructure(1)%fluxStat(1)%gru(iGRU)%hru(iHRU), & nSteps=maxSteps,nSnow=nSnow,nSoil=nSoil,err=err,message=message); ! model fluxes case('bpar') - call alloc_outputStruc(bpar_meta,outputStructure(1)%bparStruct(1)%gru(iGRU), & - nSteps=maxSteps,nSnow=0,nSoil=0,err=err,message=message); ! basin-average params + call allocGlobal(bpar_meta,outputStructure(1)%bparStruct(1),err,message); ! basin-average params case('bvar') ! Structure call alloc_outputStruc(bvar_meta,outputStructure(1)%bvarStruct(1)%gru(iGRU)%hru(iHRU), & diff --git a/build/source/actors/hru_actor/cpp_code/hru_actor.cpp b/build/source/actors/hru_actor/cpp_code/hru_actor.cpp index 171f994f2e0a00805d6b2b1004b2f6ab063f24f0..757586beb5bb1470aacf93dc3dba4257ea91a923 100644 --- a/build/source/actors/hru_actor/cpp_code/hru_actor.cpp +++ b/build/source/actors/hru_actor/cpp_code/hru_actor.cpp @@ -41,12 +41,18 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, self->state.handle_indxStat, self->state.handle_bvarStat, self->state.handle_timeStruct, - self->state.handle_forcStruct, + self->state.handle_forcStruct, + self->state.handle_attrStruct, + self->state.handle_typeStruct, + self->state.handle_idStruct, self->state.handle_indxStruct, + self->state.handle_mparStruct, self->state.handle_progStruct, self->state.handle_diagStruct, self->state.handle_fluxStruct, + self->state.handle_bparStruct, self->state.handle_bvarStruct, + self->state.handle_dparStruct, self->state.handle_startTime, self->state.handle_finshTime, self->state.handle_refTime, @@ -76,30 +82,34 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, .await([=](int num_steps){ self->state.num_steps_until_write = num_steps; self->state.output_structure_step_index = 1; + Initialize_HRU(self); + self->send(self, start_hru_v); }); - // Get the attributes and parameters for the HRU - self->request(self->state.file_access_actor, - caf::infinite, - get_attributes_params_v, - self->state.indxGRU) - .await([=](std::tuple<std::vector<double>, - std::vector<int>, - std::vector<long int>, - std::vector<double>, - std::vector<double>, - std::vector<std::vector<double>>> attr_and_params) { - int err = 0; - set_var_d(std::get<0>(attr_and_params), self->state.handle_attrStruct); - set_var_i(std::get<1>(attr_and_params), self->state.handle_typeStruct); - set_var_i8(std::get<2>(attr_and_params), self->state.handle_idStruct); - set_var_d(std::get<3>(attr_and_params), self->state.handle_bparStruct); - set_var_d(std::get<4>(attr_and_params), self->state.handle_dparStruct); - set_var_dlength(std::get<5>(attr_and_params), self->state.handle_mparStruct); - - Initialize_HRU(self); - - self->send(self, start_hru_v); }); + + + // // Get the attributes and parameters for the HRU + // self->request(self->state.file_access_actor, + // caf::infinite, + // get_attributes_params_v, + // self->state.indxGRU) + // .await([=](std::tuple<std::vector<double>, + // std::vector<int>, + // std::vector<long int>, + // std::vector<double>, + // std::vector<double>, + // std::vector<std::vector<double>>> attr_and_params) { + // int err = 0; + // set_var_d(std::get<0>(attr_and_params), self->state.handle_attrStruct); + // set_var_i(std::get<1>(attr_and_params), self->state.handle_typeStruct); + // set_var_i8(std::get<2>(attr_and_params), self->state.handle_idStruct); + // set_var_d(std::get<3>(attr_and_params), self->state.handle_bparStruct); + // set_var_d(std::get<4>(attr_and_params), self->state.handle_dparStruct); + // set_var_dlength(std::get<5>(attr_and_params), self->state.handle_mparStruct); + + // Initialize_HRU(self); + + // self->send(self, start_hru_v); }); return { @@ -242,8 +252,8 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, void Initialize_HRU(stateful_actor<hru_state>* self) { - setupHRUParam(&self->state.indxHRU, - &self->state.indxGRU, + setupHRUParam(&self->state.indxGRU, + &self->state.indxHRU, self->state.handle_attrStruct, self->state.handle_typeStruct, self->state.handle_idStruct, diff --git a/build/source/actors/hru_actor/fortran_code/hru_init.f90 b/build/source/actors/hru_actor/fortran_code/hru_init.f90 index 09a63f8e1788f85c25dce3632a954cbe44276333..f8ac820e1d66f229bd2b2ecd5d3ccad8e4a2f00e 100755 --- a/build/source/actors/hru_actor/fortran_code/hru_init.f90 +++ b/build/source/actors/hru_actor/fortran_code/hru_init.f90 @@ -55,13 +55,20 @@ contains ! primary data structures (scalars) handle_timeStruct, & ! model time data handle_forcStruct, & ! model forcing data + handle_attrStruct, & ! model attribute data + handle_typeStruct, & ! model type data + handle_idStruct, & ! model id data ! primary data structures (variable length vectors) handle_indxStruct, & ! model indices + handle_mparStruct, & ! model parameters handle_progStruct, & ! model prognostic (state) variables handle_diagStruct, & ! model diagnostic variables handle_fluxStruct, & ! model fluxes ! basin-average structures + handle_bparStruct, & ! basin-average variables handle_bvarStruct, & ! basin-average variables + ! ancillary data structures + handle_dparStruct, & ! default model parameters ! local HRU data structures handle_startTime, & ! start time for the model simulation handle_finshTime, & ! end time for the model simulation @@ -108,14 +115,20 @@ contains ! primary data structures (scalars) type(c_ptr), intent(in), value :: handle_timeStruct ! model time data type(c_ptr), intent(in), value :: handle_forcStruct ! model forcing data + type(c_ptr), intent(in), value :: handle_attrStruct ! model attribute data + type(c_ptr), intent(in), value :: handle_typeStruct ! model type data + type(c_ptr), intent(in), value :: handle_idStruct ! model id data ! primary data structures (variable length vectors) type(c_ptr), intent(in), value :: handle_indxStruct ! model indices + type(c_ptr), intent(in), value :: handle_mparStruct ! model parameters type(c_ptr), intent(in), value :: handle_progStruct ! model prognostic (state) variables type(c_ptr), intent(in), value :: handle_diagStruct ! model diagnostic variables type(c_ptr), intent(in), value :: handle_fluxStruct ! model fluxes ! basin-average structures + type(c_ptr), intent(in), value :: handle_bparStruct ! basin-average variables type(c_ptr), intent(in), value :: handle_bvarStruct ! basin-average variables ! ancillary data structures + type(c_ptr), intent(in), value :: handle_dparStruct ! ancillary data structures ! local hru data structures type(c_ptr), intent(in), value :: handle_startTime ! start time for the model simulation type(c_ptr), intent(in), value :: handle_finshTime ! end time for the model simulation @@ -125,23 +138,29 @@ contains ! --------------------------------------------------------------------------------------- ! * Fortran Variables For Conversion ! --------------------------------------------------------------------------------------- - type(zLookup),pointer :: lookupStruct ! z(:)%var(:)%lookup(:) -- lookup tables - type(var_dlength),pointer :: forcStat ! model forcing data - type(var_dlength),pointer :: progStat ! model prognostic (state) variables - type(var_dlength),pointer :: diagStat ! model diagnostic variables - type(var_dlength),pointer :: fluxStat ! model fluxes - type(var_dlength),pointer :: indxStat ! model indices - type(var_dlength),pointer :: bvarStat ! basin-average variabl + type(zLookup),pointer :: lookupStruct ! z(:)%var(:)%lookup(:) -- lookup tables + type(var_dlength),pointer :: forcStat ! model forcing data + type(var_dlength),pointer :: progStat ! model prognostic (state) variables + type(var_dlength),pointer :: diagStat ! model diagnostic variables + type(var_dlength),pointer :: fluxStat ! model fluxes + type(var_dlength),pointer :: indxStat ! model indices + type(var_dlength),pointer :: bvarStat ! basin-average variabl ! primary data structures (scalars) - type(var_i),pointer :: timeStruct ! model time data - type(var_d),pointer :: forcStruct ! model forcing data + type(var_i),pointer :: timeStruct ! model time data + type(var_d),pointer :: forcStruct ! model forcing data + type(var_d),pointer :: attrStruct ! model attribute data + type(var_i),pointer :: typeStruct ! model type data + type(var_i8),pointer :: idStruct ! model id data ! primary data structures (variable length vectors) - type(var_ilength),pointer :: indxStruct ! model indices - type(var_dlength),pointer :: progStruct ! model prognostic (state) variables - type(var_dlength),pointer :: diagStruct ! model diagnostic variables - type(var_dlength),pointer :: fluxStruct ! model fluxes + type(var_ilength),pointer :: indxStruct ! model indices + type(var_dlength),pointer :: mparStruct ! model parameters + type(var_dlength),pointer :: progStruct ! model prognostic (state) variables + type(var_dlength),pointer :: diagStruct ! model diagnostic variables + type(var_dlength),pointer :: fluxStruct ! model fluxes ! basin-average structures - type(var_dlength),pointer :: bvarStruct ! basin-average variables + type(var_d),pointer :: bparStruct ! basin-average variables + type(var_dlength),pointer :: bvarStruct ! basin-average variables + type(var_d),pointer :: dparStruct ! default model parameters ! local HRU data structures type(var_i),pointer :: startTime_hru ! start time for the model simulation type(var_i),pointer :: finishTime_hru ! end time for the model simulation @@ -165,11 +184,17 @@ contains call c_f_pointer(handle_bvarStat, bvarStat) call c_f_pointer(handle_timeStruct, timeStruct) call c_f_pointer(handle_forcStruct, forcStruct) + call c_f_pointer(handle_attrStruct, attrStruct) + call c_f_pointer(handle_typeStruct, typeStruct) + call c_f_pointer(handle_idStruct, idStruct) call c_f_pointer(handle_indxStruct, indxStruct) + call c_f_pointer(handle_mparStruct, mparStruct) call c_f_pointer(handle_progStruct, progStruct) call c_f_pointer(handle_diagStruct, diagStruct) call c_f_pointer(handle_fluxStruct, fluxStruct) + call c_f_pointer(handle_bparStruct, bparStruct) call c_f_pointer(handle_bvarStruct, bvarStruct) + call c_f_pointer(handle_dparStruct, dparStruct) call c_f_pointer(handle_startTime, startTime_hru) call c_f_pointer(handle_finshTime, finishTime_hru) call c_f_pointer(handle_refTime, refTime_hru) @@ -221,17 +246,17 @@ contains do iStruct=1,size(structInfo) ! allocate space select case(trim(structInfo(iStruct)%structName)) - case('time'); call allocLocal(time_meta,timeStruct,err=err,message=cmessage) ! model forcing data + case('time'); call allocLocal(time_meta,timeStruct,err=err,message=cmessage) ! model time data case('forc'); call allocLocal(forc_meta,forcStruct,nSnow,nSoil,err,cmessage); ! model forcing data - case('attr'); cycle ! set by file_access_actor - case('type'); cycle ! set by file_access_actor - case('id' ); cycle ! set by file_access_actor - case('mpar'); cycle ! set by file_access_actor + case('attr'); call allocLocal(attr_meta,attrStruct,nSnow,nSoil,err,cmessage); ! model attribute data + case('type'); call allocLocal(type_meta,typeStruct,nSnow,nSoil,err,cmessage); ! model type data + case('id' ); call allocLocal(id_meta,idStruct,nSnow,nSoil,err,cmessage); ! model id data + case('mpar'); call allocLocal(mpar_meta,mparStruct,nSnow,nSoil,err,cmessage); ! model parameters case('indx'); call allocLocal(indx_meta,indxStruct,nSnow,nSoil,err,cmessage); ! model variables case('prog'); call allocLocal(prog_meta,progStruct,nSnow,nSoil,err,cmessage); ! model prognostic (state) variables case('diag'); call allocLocal(diag_meta,diagStruct,nSnow,nSoil,err,cmessage); ! model diagnostic variables case('flux'); call allocLocal(flux_meta,fluxStruct,nSnow,nSoil,err,cmessage); ! model fluxes - case('bpar'); cycle ! set by file_access_actor + case('bpar'); call allocLocal(bpar_meta,bparStruct,nSnow=0,nSoil=0,err=err,message=cmessage); ! basin-average variables case('bvar'); call allocLocal(bvar_meta,bvarStruct,nSnow=0,nSoil=0,err=err,message=cmessage); ! basin-average variables case('lookup'); cycle ! allocated in t2enthalpy.f90 case('deriv'); cycle @@ -245,6 +270,12 @@ contains endif end do ! looping through data structures + ! allocate space for default model parameters + ! NOTE: This is done here, rather than in the loop above, because dpar is not one of the "standard" data structures + call allocLocal(mpar_meta,dparStruct,nSnow,nSoil,err,cmessage); ! default model parameters + if(err/=0)then; message=trim(message)//trim(cmessage)//' [problem allocating dparStruct]'; print*,message;return;endif + + ! ***************************************************************************** ! *** allocate space for output statistics data structures diff --git a/build/source/actors/hru_actor/fortran_code/hru_setup.f90 b/build/source/actors/hru_actor/fortran_code/hru_setup.f90 index 323c4991b1ce6ef9ad6897fcc853e579a401dc96..efa37585bb610591c8a3afca2a57fee45e2acb96 100644 --- a/build/source/actors/hru_actor/fortran_code/hru_setup.f90 +++ b/build/source/actors/hru_actor/fortran_code/hru_setup.f90 @@ -49,9 +49,7 @@ USE globalData,only:urbanVegCategory ! vegetation categor USE globalData,only:mpar_meta,bpar_meta ! parameter metadata structures ! named variables to define the decisions for snow layers -USE mDecisions_module,only:& - sameRulesAllLayers, & ! SNTHERM option: same combination/sub-dividion rules applied to all layers - rulesDependLayerIndex ! CLM option: combination/sub-dividion rules depend on layer index + ! named variables to define LAI decisions USE mDecisions_module,only:& @@ -89,10 +87,10 @@ subroutine setupHRUParam(& ! * desired modules ! --------------------------------------------------------------------------------------- USE nrtype ! variable types, etc. + USE output_structure_module,only:outputStructure ! subroutines and functions use time_utils_module,only:elapsedSec ! calculate the elapsed time USE mDecisions_module,only:mDecisions ! module to read model decisions - ! USE read_attrb_module,only:read_attrb ! module to read local attributes USE paramCheck_module,only:paramCheck ! module to check consistency of model parameters USE pOverwrite_module,only:pOverwrite ! module to overwrite default parameter values with info from the Noah tables USE ConvE2Temp_module,only:E2T_lookup ! module to calculate a look-up table for the temperature-enthalpy conversion @@ -169,34 +167,21 @@ subroutine setupHRUParam(& oldTime%var(:) = startTime%var(:) - ! get the maximum number of snow layers - select case(model_decisions(iLookDECISIONS%snowLayers)%iDecision) - case(sameRulesAllLayers); maxSnowLayers = 100 - case(rulesDependLayerIndex); maxSnowLayers = 5 - case default; err=20; - message=trim(message)//'unable to identify option to combine/sub-divide snow layers' - print*, message - return - end select ! (option to combine/sub-divide snow layers) - - ! get the maximum number of layers - maxLayers = gru_struc(1)%hruInfo(1)%nSoil + maxSnowLayers - - ! define monthly fraction of green vegetation - greenVegFrac_monthly = (/0.01_dp, 0.02_dp, 0.03_dp, 0.07_dp, 0.50_dp, 0.90_dp, 0.95_dp, 0.96_dp, 0.65_dp, 0.24_dp, 0.11_dp, 0.02_dp/) - - ! define urban vegetation category - select case(trim(model_decisions(iLookDECISIONS%vegeParTbl)%cDecision)) - case('USGS'); urbanVegCategory = 1 - case('MODIFIED_IGBP_MODIS_NOAH'); urbanVegCategory = 13 - case('plumberCABLE'); urbanVegCategory = -999 - case('plumberCHTESSEL'); urbanVegCategory = -999 - case('plumberSUMMA'); urbanVegCategory = -999 - case default - message=trim(message)//'unable to identify vegetation category' - print*, message - return - end select + ! Copy the attrStruct + attrStruct%var(:) = outputStructure(1)%attrStruct(1)%gru(indxGRU)%hru(indxHRU)%var(:) + ! Copy the typeStruct + typeStruct%var(:) = outputStructure(1)%typeStruct(1)%gru(indxGRU)%hru(indxHRU)%var(:) + ! Copy the idStruct + idStruct%var(:) = outputStructure(1)%idStruct(1)%gru(indxGRU)%hru(indxHRU)%var(:) + + ! Copy the mparStruct + mparStruct%var(:) = outputStructure(1)%mparStruct(1)%gru(indxGRU)%hru(indxHRU)%var(:) + ! Copy the bparStruct + bparStruct%var(:) = outputStructure(1)%bparStruct(1)%gru(indxGRU)%var(:) + ! Copy the dparStruct + dparStruct%var(:) = outputStructure(1)%dparStruct(1)%gru(indxGRU)%hru(indxHRU)%var(:) + + ! ***************************************************************************** ! *** compute derived model variables that are pretty much constant for the basin as a whole