diff --git a/build/includes/file_access_actor/file_access_actor.hpp b/build/includes/file_access_actor/file_access_actor.hpp index 5deecd1cc1decca43641456ba31f443eaeddf968..200532b38bf07e7a32dba414bec76648f0d489d9 100644 --- a/build/includes/file_access_actor/file_access_actor.hpp +++ b/build/includes/file_access_actor/file_access_actor.hpp @@ -40,7 +40,10 @@ struct file_access_state { std::vector<std::vector<double>> dpar_arrays_for_hrus; int dpar_array_size; int bpar_array_size; + int type_array_size; bool param_file_exists; + int num_var_in_param_file; + int param_ncid; // Timing Variables diff --git a/build/includes/file_access_actor/file_access_actor_subroutine_wrappers.hpp b/build/includes/file_access_actor/file_access_actor_subroutine_wrappers.hpp index 1df3e82af33a01c8b55981b7330db3a912d8f832..134f00dfb86cf899f5f951cb6d5ed7d15992546b 100644 --- a/build/includes/file_access_actor/file_access_actor_subroutine_wrappers.hpp +++ b/build/includes/file_access_actor/file_access_actor_subroutine_wrappers.hpp @@ -72,7 +72,7 @@ extern "C" { void openParamFile(int* param_ncid, bool* param_file_exists, int* err); void getNumVarParam(int* param_ncid, int* num_var_param, int* err); void closeParamFile(int* param_ncid, int* err); - void getParamSizes(int* dpar_array_size, int* bpar_array_size); + void getParamSizes(int* dpar_array_size, int* bpar_array_size, int* type_array_size); void overwriteParam(int* index_gru, int* index_hru, int* num_var_attr, void* type_array, void* dpar_array, void* handle_mpar_struct, void* bpar_array, 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 e8bfca78606759ee43e0de893f2fd90350a913a4..5f56b7d5d347f42826a7c456ee4eee7f6d6ef8a3 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 @@ -133,9 +133,17 @@ behavior file_access_actor(stateful_actor<file_access_state>* self, int start_gr std::vector<double> attr_array_to_send = self->state.attr_arrays_for_hrus[ref_gru-1]; std::vector<int> type_array_to_send = self->state.type_arrays_for_hrus[ref_gru-1]; std::vector<long int> id_array_to_send = self->state.id_arrays_for_hrus[ref_gru-1]; + std::vector<double> bpar_array_to_send = self->state.bpar_arrays_for_hrus[ref_gru-1]; + std::vector<double> dpar_array_to_send = self->state.dpar_arrays_for_hrus[ref_gru-1]; + + void* handle_mpar_struct = self->state.mpar_structs_for_hrus[ref_gru-1]; + + std::vector<std::vector<double>> mpar_array_to_send = get_var_dlength(handle_mpar_struct); + self->send(actor_to_respond, get_attributes_v, attr_array_to_send, - type_array_to_send, id_array_to_send); + type_array_to_send, id_array_to_send, bpar_array_to_send, + dpar_array_to_send, mpar_array_to_send); }, @@ -220,8 +228,7 @@ behavior file_access_actor(stateful_actor<file_access_state>* self, int start_gr &err); self->state.file_access_timing.updateEndPoint("write_duration"); - - + }, [=](write_output, int indxGRU, int indxHRU, int numStepsToWrite, @@ -332,36 +339,10 @@ void initalizeFileAccessActor(stateful_actor<file_access_state>* self) { return; } - // Initalize the output Structure - aout(self) << "Initalizing Output Structure" << std::endl; - Init_OutputStruct(self->state.handle_forcing_file_info, &self->state.outputStrucSize, - &self->state.num_gru, &self->state.err); - - // Read in the attribute information for the HRUs to request + // Read in the attribute and parameter information for the HRUs to request readAttributes(self); - readParameters(self); - // Noah-MP table information - // overwriteParam(&self->state.num_gru, &err); - // if (err != 0) { - // aout(self) << "ERROR: FILE_ACCESS_ACTOR overwriteParam() \n"; - // std::string function = "overwriteParam"; - // self->send(self->state.parent, file_access_actor_err_v, function); - // self->quit(); - // return; - // } - - // Read in all of the parmeters for the number of GRUs in the run Domain - // readParamFileAccessActor(&self->state.start_gru, &self->state.num_gru, &err); - // if (err != 0) { - // aout(self) << "ERROR: FILE_ACCESS_ACTOR readParamFileAccessActor() \n"; - // std::string function = "readParamFileAccessActor"; - // self->send(self->state.parent, file_access_actor_err_v, function); - // self->quit(); - // return; - // } - // Initalize the output manager self->state.output_manager = new OutputManager(self->state.num_vectors_in_output_manager, self->state.num_gru); @@ -434,8 +415,21 @@ void readAttributes(stateful_actor<file_access_state>* self) { void readParameters(stateful_actor<file_access_state>* self) { int err = 0; int index_hru = 1; - getParamSizes(&self->state.dpar_array_size, &self->state.bpar_array_size); - // openParamFile(); + + openParamFile(&self->state.param_ncid, &self->state.param_file_exists, + &err); + + getParamSizes(&self->state.dpar_array_size, &self->state.bpar_array_size, + &self->state.type_array_size); + + + if (self->state.param_file_exists) { + getNumVarParam(&self->state.param_ncid, &self->state.num_var_in_param_file, + &err); + } else { + self->state.num_var_in_param_file = self->state.type_array_size; + } + for (int index_gru = 1; index_gru < self->state.num_gru + 1; index_gru++) { std::vector<double> dpar_array(self->state.dpar_array_size); @@ -443,18 +437,22 @@ void readParameters(stateful_actor<file_access_state>* self) { std::vector<double> bpar_array(self->state.dpar_array_size); - overwriteParam(&index_gru, &index_hru, &self->state.num_var_in_attributes_file, + overwriteParam(&index_gru, &index_hru, &self->state.num_var_in_param_file, &self->state.attr_arrays_for_hrus[index_gru-1][0], &dpar_array[0], handle_mpar_struct, &bpar_array[0], &err); - - // readParamFromNetCDF(); + if (self->state.param_file_exists) { + readParamFromNetCDF(&self->state.param_ncid, &index_gru, &index_hru, + &self->state.start_gru, &self->state.num_var_in_param_file, + &self->state.bpar_array_size, handle_mpar_struct, &bpar_array[0], + &err); + } self->state.dpar_arrays_for_hrus.push_back(dpar_array); self->state.mpar_structs_for_hrus.push_back(handle_mpar_struct); self->state.bpar_arrays_for_hrus.push_back(bpar_array); } - // closeParamFile(); + closeParamFile(&self->state.param_ncid, &err); } diff --git a/build/source/actors/file_access_actor/fortran_code/read_param.f90 b/build/source/actors/file_access_actor/fortran_code/read_param.f90 index a56efe304aefd3e63ab12285baf67cd192370c47..eaaca2603c231112f83ab4207481ee63a834f83a 100644 --- a/build/source/actors/file_access_actor/fortran_code/read_param.f90 +++ b/build/source/actors/file_access_actor/fortran_code/read_param.f90 @@ -94,17 +94,20 @@ subroutine closeParamFile(param_ncid, err) bind(C, name="closeParamFile") end subroutine closeParamFile ! get the sizes of the arrays for dpar_array bpar_array -subroutine getParamSizes(dpar_array_size, bpar_array_size) bind(C, name="getParamSizes") +subroutine getParamSizes(dpar_array_size, bpar_array_size, type_array_size) bind(C, name="getParamSizes") USE var_lookup,only:maxvarMpar ! model parameters: maximum number variables USE var_lookup,only:maxvarBpar ! model parameters: maximum number variables + USE var_lookup,only:maxvarType implicit none integer(c_int),intent(out) :: dpar_array_size integer(c_int),intent(out) :: bpar_array_size + integer(c_int),intent(out) :: type_array_size dpar_array_size = maxvarMpar bpar_array_size = maxvarBpar + type_array_size = maxvarType end subroutine getParamSizes diff --git a/build/source/actors/hru_actor/hru_actor.cpp b/build/source/actors/hru_actor/hru_actor.cpp index 879daf5b1990a83981bfd6b8ed37359ca185f40f..e8a4fa0d35f73537c579ac310dad8f0f3d062c08 100644 --- a/build/source/actors/hru_actor/hru_actor.cpp +++ b/build/source/actors/hru_actor/hru_actor.cpp @@ -77,7 +77,8 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, return { // Starts the HRU and tells it to ask for data from the file_access_actor [=](get_attributes, std::vector<double> attr_array, std::vector<int> type_array, - std::vector<long int> id_array) { + std::vector<long int> id_array, std::vector<double> bpar_array, + std::vector<double> dpar_array, std::vector<std::vector<double>> mpar_array) { aout(self) << "Received Attribute Information \n";