diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 86d747fd26daaeb03a728220df398ed9df5f8bd7..6de53ff2e1fcbf19e8786244efaf76ad28646917 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -198,7 +198,8 @@ set(INTERFACE ${ACTORS_DIR}/global/cppwrap_auxiliary.f90 ${ACTORS_DIR}/global/cppwrap_datatypes.f90 ${ACTORS_DIR}/global/cppwrap_metadata.f90 - ${ACTORS_DIR}/global/c_interface_module.f90) + ${ACTORS_DIR}/global/c_interface_module.f90 + ${ACTORS_DIR}/global/gru_struc.f90) set(SUMMA_ACTOR_INTERFACE ${SUMMA_ACTOR_DIR}/batch_distributer_actor.f90) set(FILE_ACCESS_INTERFACE @@ -219,6 +220,7 @@ set(ACTORS_GLOBAL ${ACTORS_DIR}/global/auxiliary.cpp ${ACTORS_DIR}/global/global.cpp ${ACTORS_DIR}/global/fileManager.cpp + ${ACTORS_DIR}/global/gru_struc.cpp ${ACTORS_DIR}/global/message_atoms.cpp ${ACTORS_DIR}/global/settings_functions.cpp ${ACTORS_DIR}/global/timing_info.cpp) @@ -233,7 +235,7 @@ set(SUMMA_ACTOR ${ACTORS_DIR}/summa_actor/summa_client.cpp ${ACTORS_DIR}/summa_actor/summa_server.cpp) set(FILE_ACCESS_ACTOR - ${ACTORS_DIR}/file_access_actor/file_access_utils.cpp + # ${ACTORS_DIR}/file_access_actor/file_access_utils.cpp ${ACTORS_DIR}/file_access_actor/file_access_actor.cpp ${ACTORS_DIR}/file_access_actor/file_access_init.cpp ${ACTORS_DIR}/file_access_actor/forcing_file_info.cpp diff --git a/build/includes/file_access_actor/file_access_actor.hpp b/build/includes/file_access_actor/file_access_actor.hpp index fa718a97e9581f406cef40e3ad5510815a4321e3..ae8e3604721a8fc83a28ebcd9a1e42c4192299fe 100644 --- a/build/includes/file_access_actor/file_access_actor.hpp +++ b/build/includes/file_access_actor/file_access_actor.hpp @@ -22,12 +22,12 @@ extern "C" { int* num_timesteps_output_buffer, void* handle_output_ncid, int* startGRU, int* numGRU, int* numHRU, int* err); - void getNumForcingFiles_fortran(int* num_files); + // void getNumForcingFiles_fortran(int* num_files); - void getFileInfoSizes_fortran(int& iFile, int& var_ix_size, int& data_id_size, - int& varName_size); + // void getFileInfoSizes_fortran(int& iFile, int& var_ix_size, int& data_id_size, + // int& varName_size); - void getFileInfoCopy_fortran(int& iFile, char* &name); + // void getFileInfoCopy_fortran(int& iFile, void* name); void defOutputFortran(void* handle_ncid, int* start_gru, int* num_gru, diff --git a/build/includes/file_access_actor/forcing_file_info.hpp b/build/includes/file_access_actor/forcing_file_info.hpp index a84aba88026be481375d86b3903f219f5869fafd..9be83f1c73a2f7baaa7c0f09e45c87ff50e82cf4 100644 --- a/build/includes/file_access_actor/forcing_file_info.hpp +++ b/build/includes/file_access_actor/forcing_file_info.hpp @@ -4,6 +4,15 @@ #include <vector> #include <iostream> +extern "C" { + void getNumForcingFiles_fortran(int* num_files); + void getFileInfoSizes_fortran(int& iFile, int& var_ix_size, int& data_id_size, + int& varName_size); + void getFileInfoCopy_fortran(int& iFile, void* file_name, int* var_name_size, + void* var_name_arr); + +} + /** * Same file_info from data_types.f90 * This is a C++ Representation of the file_info data type @@ -15,37 +24,45 @@ class fileInfo { int nTimeSteps; // number of time steps in file std::vector<int> var_ix; // index of each forcing data variable in the data structure std::vector<int> data_id; // netcdf variable id for each forcing data variable - std::vector<int> varName; // netcdf variable name for each forcing data variable + std::vector<std::string> varName; // netcdf variable name for each forcing data variable double firstJulDay; // first julian day in forcing file double convTime2Days; // conversion factor to convert time units to days - fileInfo(void *handle_forcing_file_info); + fileInfo(); +}; + +class forcingFileContainer { + public: + std::vector<fileInfo> forcing_files_; + + forcingFileContainer(); + ~forcingFileContainer(){}; }; class Forcing_File_Info { - private: - int file_ID; - int num_steps; - bool is_loaded; - - public: - Forcing_File_Info(int file_ID); + private: + int file_ID; + int num_steps; + bool is_loaded; + + public: + Forcing_File_Info(int file_ID); - int getNumSteps(); + int getNumSteps(); - bool isFileLoaded(); + bool isFileLoaded(); - void updateIsLoaded(); + void updateIsLoaded(); - void updateNumSteps(int num_steps); + void updateNumSteps(int num_steps); }; struct Forcing_Info { - int num_vars; - int num_timesteps; - std::vector<int> index_forc_var; - std::vector<int> ncid_var; + int num_vars; + int num_timesteps; + std::vector<int> index_forc_var; + std::vector<int> ncid_var; }; \ No newline at end of file diff --git a/build/includes/global/gru_struc.hpp b/build/includes/global/gru_struc.hpp new file mode 100644 index 0000000000000000000000000000000000000000..2d8765ae79eff42956ef2114fd666eb17800f924 --- /dev/null +++ b/build/includes/global/gru_struc.hpp @@ -0,0 +1,16 @@ +#include <string> + +extern "C" { + void init_gru_struc(int* num_gru, int* file_hru, int* hru_ix); + void pop_gru_struc(int* iGRU, long int* gru_id, long int* hru_id, long int* hru2gru_id, + int* hru_ix, int* file_gru, int* file_hru, int* num_gru, + int* start_gru); +} + +class gruStruc { + + public: + gruStruc(const std::string &settingsPath, + const std::string &attributeFile, int num_gru, int start_gru); + ~gruStruc() {}; +}; \ No newline at end of file diff --git a/build/includes/summa_actor/summa_actor.hpp b/build/includes/summa_actor/summa_actor.hpp index cf24b71bf455bd0a579a93b1095e8f6af0ad613b..2249d054d339620b5d7463375dee20bb68585623 100644 --- a/build/includes/summa_actor/summa_actor.hpp +++ b/build/includes/summa_actor/summa_actor.hpp @@ -6,6 +6,7 @@ #include "settings_functions.hpp" #include "batch_container.hpp" #include "fileManager.hpp" +#include "gru_struc.hpp" #include <chrono> #include <string> #include <vector> diff --git a/build/source/file_access_actor/file_access_actor.cpp b/build/source/file_access_actor/file_access_actor.cpp index ce44e35356c46eff3f7f7fb28423a46128830244..1e539adcc586e3c73e00cacde8401dd9e2890c2d 100644 --- a/build/source/file_access_actor/file_access_actor.cpp +++ b/build/source/file_access_actor/file_access_actor.cpp @@ -41,8 +41,6 @@ behavior file_access_actor( aout(self) << "File Access Actor: Intializing\n"; fileAccessActor_init_fortran( - // self->state.handle_forcing_file_info, - // &self->state.numFiles, &self->state.num_steps, &fa_settings.num_timesteps_in_output_buffer, self->state.handle_ncid, @@ -55,32 +53,27 @@ behavior file_access_actor( self->state.output_lifetime = std::make_unique<outputStructureLifetime>( self->state.handle_forcing_file_info, self->state.handle_ncid); - getNumForcingFiles_fortran(&self->state.numFiles); - - std::vector<fileInfo> forcFileInfo; - forcFileInfo.reserve(self->state.numFiles); - for (int i = 1; i <= self->state.numFiles; i++) { - int var_ix_size = 0; - int data_id_size = 0; - int varName_size = 0; - getFileInfoSizes_fortran(i, var_ix_size, data_id_size, varName_size); - aout(self) << "File: " << i << " Var_ix_size: " << var_ix_size - << " Data_id_size: " << data_id_size - << " VarName_size: " << varName_size << std::endl; - char* test_string = new char[257]; - getFileInfoCopy_fortran(i, test_string); - - aout(self) << "test_string: " << test_string << std::endl; - // getFileInfoCopy_fortran(self->state.handle_forcing_file_info, i, - // var_ix_size, data_id_size, varName_size, - // &forcFileInfo[i - 1].nVars, - // &forcFileInfo[i - 1].nTimeSteps, - // forcFileInfo[i - 1].var_ix, - // forcFileInfo[i - 1].data_id, - // forcFileInfo[i - 1].varName, - // &forcFileInfo[i - 1].firstJulDay, - // &forcFileInfo[i - 1].convTime2Days); - } + // Forcing File Info + // getNumForcingFiles_fortran(&self->state.numFiles); + auto forcing_container = new forcingFileContainer(); + return -2; + // std::vector<fileInfo> forcFileInfo; + // forcFileInfo.reserve(self->state.numFiles); + // for (int i = 1; i <= self->state.numFiles; i++) { + // int var_ix_size = 0; + // int data_id_size = 0; + // int varName_size = 0; + // getFileInfoSizes_fortran(i, var_ix_size, data_id_size, varName_size); + // aout(self) << "File: " << i << " Var_ix_size: " << var_ix_size + // << " Data_id_size: " << data_id_size + // << " VarName_size: " << varName_size << std::endl; + + + // std::unique_ptr<char[]> file_name(new char[256]); + // // getFileInfoCopy_fortran(i, &file_name); + // std::string file_name_str(file_name.get()); + // aout(self) << "File Name: " << file_name_str << std::endl; + // } // // Serialize forcing_file_info // auto forcing_file_info = diff --git a/build/source/file_access_actor/file_access_actor.f90 b/build/source/file_access_actor/file_access_actor.f90 index dba5bb2cc7abc4d4882e9603f82c68fdbf12bc56..85828220e282bc8b862d3bc090df966e4def54b1 100644 --- a/build/source/file_access_actor/file_access_actor.f90 +++ b/build/source/file_access_actor/file_access_actor.f90 @@ -403,14 +403,28 @@ subroutine getFileInfoSizes_fortran(iFile, var_ix_size, data_id_size, & end subroutine -subroutine getFileInfoCopy_fortran(iFile, filenmData) bind(C, name="getFileInfoCopy_fortran") +subroutine getFileInfoCopy_fortran(iFile, filenmData, varName_size, & + var_name_arr) bind(C, name="getFileInfoCopy_fortran") USE globalData,only:forcFileInfo USE C_interface_module implicit none - integer(c_int),intent(in) :: iFile - type(c_ptr),intent(out) :: filenmData + ! dummy variables + integer(c_int),intent(in) :: iFile + type(c_ptr),intent(out) :: filenmData + integer(c_int),intent(in) :: varName_size + type(c_ptr),intent(out) :: var_name_arr(varName_size) + ! local variables + integer(i4b) :: i + ! Get File Name call f_c_string_ptr(trim(forcFileInfo(iFile)%filenmData), filenmData) + + do i=1, varName_size + call f_c_string_ptr(trim(forcFileInfo(iFile)%varName(i)), var_name_arr(i)) + end do + + + end subroutine getFileInfoCopy_fortran subroutine defOutputFortran(handle_output_ncid, start_gru, num_gru, num_hru, & diff --git a/build/source/file_access_actor/file_access_utils.cpp b/build/source/file_access_actor/file_access_utils.cpp index 066a98a36e92498730626c6dceedcb5d8c6cdadc..b0b019049852e78fa51c0cd940773e6de0b63167 100644 --- a/build/source/file_access_actor/file_access_utils.cpp +++ b/build/source/file_access_actor/file_access_utils.cpp @@ -16,6 +16,6 @@ // double convTime2Days; // conversion factor to convert time units to days // }; -fileInfo::fileInfo(void *handle_forcing_file_info) { - std::cout << "hello from forcFileInfo constructor\n"; -} \ No newline at end of file +// fileInfo::fileInfo(void *handle_forcing_file_info) { +// std::cout << "hello from forcFileInfo constructor\n"; +// } \ No newline at end of file diff --git a/build/source/file_access_actor/forcing_file_info.cpp b/build/source/file_access_actor/forcing_file_info.cpp index 13f1ec0934d301e6aa4fe6e9e5b391b88e6c29b6..2294e3f558f7af9f6d1263e6f2fb80aab5ac70e1 100644 --- a/build/source/file_access_actor/forcing_file_info.cpp +++ b/build/source/file_access_actor/forcing_file_info.cpp @@ -1,27 +1,74 @@ #include "forcing_file_info.hpp" +#include <memory> + +fileInfo::fileInfo() { + filenmData = ""; + nVars = 0; + nTimeSteps = 0; + var_ix = std::vector<int>(); + data_id = std::vector<int>(); + varName = std::vector<std::string>(); + firstJulDay = 0.0; + convTime2Days = 0.0; +} + + +forcingFileContainer::forcingFileContainer() { + forcing_files_ = std::vector<fileInfo>(); + + int num_files; + getNumForcingFiles_fortran(&num_files); + forcing_files_.resize(num_files); + for (int i = 1; i < num_files+1; i++) { + int var_ix_size = 0; + int data_id_size = 0; + int varName_size = 0; + getFileInfoSizes_fortran(i, var_ix_size, data_id_size, varName_size); + forcing_files_[i-1].var_ix.resize(var_ix_size); + forcing_files_[i-1].data_id.resize(data_id_size); + forcing_files_[i-1].varName.resize(varName_size); + + std::unique_ptr<char[]> file_name(new char[256]); + std::vector<std::unique_ptr<char[]>> var_name_arr; + for (int j = 0; j < varName_size; j++) { + var_name_arr.push_back(std::unique_ptr<char[]>(new char[256])); + } + getFileInfoCopy_fortran(i, &file_name, &varName_size, var_name_arr.data()); + forcing_files_[i-1].filenmData = std::string(file_name.get()); + forcing_files_[i-1].nVars = varName_size; + for (int j = 0; j < varName_size; j++) { + forcing_files_[i-1].varName[j] = std::string(var_name_arr[j].get()); + } + + + } +} + + + + Forcing_File_Info::Forcing_File_Info(int file_ID) { - this->file_ID = file_ID; - this->num_steps = 0; - this->is_loaded = false; + this->file_ID = file_ID; + this->num_steps = 0; + this->is_loaded = false; } int Forcing_File_Info::getNumSteps() { - return this->num_steps; + return this->num_steps; } bool Forcing_File_Info::isFileLoaded() { - return this->is_loaded; + return this->is_loaded; } void Forcing_File_Info::updateIsLoaded() { - this->is_loaded = true; + this->is_loaded = true; } - void Forcing_File_Info::updateNumSteps(int num_steps) { - this->num_steps = num_steps; - this->is_loaded = true; + this->num_steps = num_steps; + this->is_loaded = true; } diff --git a/build/source/global/gru_struc.cpp b/build/source/global/gru_struc.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ecbe633a846816c001e4968017610efd652a0451 --- /dev/null +++ b/build/source/global/gru_struc.cpp @@ -0,0 +1,57 @@ +#include "gru_struc.hpp" +#include <iostream> +#include <netcdf.h> +#include <vector> +#include <future> + +gruStruc::gruStruc(const std::string &settingsPath, + const std::string &attributeFile, int num_gru, int start_gru) { + std::cout << "Creating GRU Structure\n"; + + size_t fileGRU, fileHRU; + int ncid, gru_dim_id, hru_dim_id, var_id; + + + std::string attributes_path = settingsPath + attributeFile; + // Read and set dimensions of whole file + nc_open(attributes_path.c_str(), NC_NOWRITE, &ncid); + nc_inq_dimid(ncid, "gru", &gru_dim_id); + nc_inq_dimid(ncid, "hru", &hru_dim_id); + nc_inq_dimlen(ncid, gru_dim_id, &fileGRU); + nc_inq_dimlen(ncid, hru_dim_id, &fileHRU); + + std::vector<long int> gru_id(fileGRU); + std::vector<int> hru_ix(fileHRU); + std::vector<long int> hru_id(fileHRU); + std::vector<long int> hru2gru_id(fileHRU); + + size_t start[1] = {0}; + size_t count[1] = {fileGRU}; + nc_inq_varid(ncid, "gruId", &var_id); + nc_get_vara_long(ncid, var_id, start, count, gru_id.data()); + + count[0] = fileHRU; + nc_inq_varid(ncid, "hruId", &var_id); + nc_get_vara_long(ncid, var_id, start, count, hru_id.data()); + + nc_inq_varid(ncid, "hru2gruId", &var_id); + nc_get_vara_long(ncid, var_id, start, count, hru2gru_id.data()); + + std::cout << "DONE READING\n"; + nc_close(ncid); + + int file_hru = fileHRU; + int file_gru = fileGRU; + init_gru_struc(&num_gru, &file_hru, hru_ix.data()); + + std::vector<std::future<void>> futures; + + for (int i = 1; i < num_gru; i++) { + futures.push_back(std::async(std::launch::async, pop_gru_struc, &i, + gru_id.data(), hru_id.data(), hru2gru_id.data(), hru_ix.data(), + &file_gru, &file_hru, &num_gru, &start_gru)); + // pop_gru_struc(&i, gru_id.data(), hru_id.data(), hru2gru_id.data(), + // hru_ix.data(), &file_gru, &file_hru, &num_gru, &start_gru); + } + +} \ No newline at end of file diff --git a/build/source/global/gru_struc.f90 b/build/source/global/gru_struc.f90 new file mode 100644 index 0000000000000000000000000000000000000000..37c0aa6599331bf2004bc33e6cba0cd92b828635 --- /dev/null +++ b/build/source/global/gru_struc.f90 @@ -0,0 +1,55 @@ +module gru_struc_module + USE, intrinsic :: iso_c_binding + implicit none + + public::init_gru_struc + public::pop_gru_struc + contains +subroutine init_gru_struc(num_gru, file_hru, hru_ix) bind(C, name="init_gru_struc") + USE globalData,only:gru_struc ! gru->hru mapping structure + USE globalData,only:index_map ! hru->gru mapping structure + USE nr_utility_module,only:arth + implicit none + integer(c_int), intent(in) :: num_gru + integer(c_int), intent(in) :: file_hru + integer(c_int), intent(out) :: hru_ix(file_hru) + + if (allocated(gru_struc)) deallocate(gru_struc) + allocate(gru_struc(num_gru)) + + hru_ix = arth(1,1,file_hru) + +end subroutine init_gru_struc + +subroutine pop_gru_struc(iGRU, gru_id, hru_id, hru2gru_id, hru_ix, file_gru, & + file_hru, num_gru, start_gru) bind(C, name="pop_gru_struc") + USE globalData,only:gru_struc ! gru->hru mapping structure + USE globalData,only:index_map ! hru->gru mapping structure + USE nr_utility_module,only:arth + implicit none + integer(c_int), intent(in) :: iGRU + integer(c_int), intent(in) :: file_gru + integer(c_int), intent(in) :: file_hru + integer(c_int), intent(in) :: num_gru + integer(c_int), intent(in) :: start_gru + integer(c_long), intent(in) :: gru_id(file_gru) + integer(c_long), intent(in) :: hru_id(file_hru) + integer(c_long), intent(in) :: hru2gru_id(file_hru) + integer(c_int), intent(in) :: hru_ix(file_hru) + integer :: iHRU + + iHRU = 1 + gru_struc(iGRU)%hruCount = count(hru2gru_Id == gru_id(iGRU+start_gru-1)) ! number of HRUs in each GRU + gru_struc(iGRU)%gru_id = gru_id(iGRU+start_gru-1) ! set gru id + gru_struc(iGRU)%gru_nc = iGRU+start_gru-1 ! set gru index in the netcdf file + + allocate(gru_struc(iGRU)%hruInfo(gru_struc(iGRU)%hruCount)) ! allocate second level of gru to hru map + gru_struc(iGRU)%hruInfo(:)%hru_nc = pack(hru_ix,hru2gru_id == gru_struc(iGRU)%gru_id) ! set hru id in attributes netcdf file + gru_struc(iGRU)%hruInfo(:)%hru_ix = arth(iHRU,1,gru_struc(iGRU)%hruCount) ! set index of hru in run domain + gru_struc(iGRU)%hruInfo(:)%hru_id = hru_id(gru_struc(iGRU)%hruInfo(:)%hru_nc) ! set id of hru + iHRU = iHRU + gru_struc(iGRU)%hruCount + + +end subroutine pop_gru_struc + +end module gru_struc_module \ No newline at end of file diff --git a/build/source/summa_actor/fortran_global_state_actor.cpp b/build/source/summa_actor/fortran_global_state_actor.cpp index 8e5ae8f261745183d8cf942aa57b1af3ad4013ab..0ad5b36869b4e8fc7a73276c9ed25f1a329911a0 100644 --- a/build/source/summa_actor/fortran_global_state_actor.cpp +++ b/build/source/summa_actor/fortran_global_state_actor.cpp @@ -16,7 +16,6 @@ behavior fortran_global_state_actor(event_based_actor* self) { aout(self) << "\n\nERROR: deallocateGlobalData_fortran() - " << err_msg.get() << "\n\n"; } - aout(self) << "HERE\n"; }); @@ -31,7 +30,12 @@ behavior fortran_global_state_actor(event_based_actor* self) { } - return {}; + return { + // Needs a handler to persist, otherwise it gets cleaned up immediately + [=](int i) { + aout(self) << "Still Awake\n"; + } + }; } diff --git a/build/source/summa_actor/summa_actor.cpp b/build/source/summa_actor/summa_actor.cpp index ebf8773aecdccb0839f991a9f025900ce55bbe39..62d2f83499057cf26953577b887f2c2d2ff04ee7 100644 --- a/build/source/summa_actor/summa_actor.cpp +++ b/build/source/summa_actor/summa_actor.cpp @@ -50,26 +50,12 @@ behavior summa_actor(stateful_actor<summa_actor_state>* self, self->state.fortran_state = self->spawn(fortran_global_state_actor); - self->state.fileGRU = getNumGRUInFile(file_manager->settings_path_, file_manager->local_attributes_); - // Double check the number of GRUs in the file if (self->state.fileGRU == -1) aout(self) << "***WARNING***: UNABLE TO VERIFY NUMBER OF GRUS" - << " - Job Actor MAY CRASH\n"; - aout(self) << "Number of GRUs in File: " << self->state.fileGRU << "\n"; - return {}; - - - - - - - - - - - + << " - Job Actor MAY CRASH\n" + << "Number of GRUs in File: " << self->state.fileGRU << "\n"; if (self->state.fileGRU > 0) { // Fix the number of GRUs if it exceeds the number of GRUs in the file