diff --git a/build/includes/job_actor/GRU.hpp b/build/includes/job_actor/GRU.hpp index 69dc87275da50f368443772996922c4d086c8485..6ada68925e4904351c0ec7b1c3f8115fdbe491b8 100644 --- a/build/includes/job_actor/GRU.hpp +++ b/build/includes/job_actor/GRU.hpp @@ -11,6 +11,8 @@ class GRU { int index_job_; // The index of the GRU within this job caf::actor actor_ref_; // The actor for the GRU + int num_hrus_; // The number of HRUs in the GRU + // Modifyable Parameters int dt_init_factor_; // The initial dt for the GRU double rel_tol_; // The relative tolerance for the GRU diff --git a/build/includes/job_actor/gru_struc.hpp b/build/includes/job_actor/gru_struc.hpp index 347050c6d016403afbbc0bb14164dc5dd9cd86b9..1966ec02b8089453ef1bbc0776b59f29c842f3e2 100644 --- a/build/includes/job_actor/gru_struc.hpp +++ b/build/includes/job_actor/gru_struc.hpp @@ -9,6 +9,8 @@ extern "C" { void read_icond_nlayers_fortran(int& num_gru, int& err, void* message); + void get_num_hru_per_gru_fortran(int& arr_size, int& num_hru_per_gru_array); + void deallocate_gru_struc_fortran(); } @@ -50,6 +52,9 @@ class GruStruc { return -1; } + void getNumHrusPerGru(); + inline int getNumHruPerGru(int index) { return num_hru_per_gru_[index]; } + private: // Inital Information about the GRUs int start_gru_; @@ -60,6 +65,7 @@ class GruStruc { // GRU specific Information std::vector<std::unique_ptr<GRU>> gru_info_; + std::vector<int> num_hru_per_gru_; // Runtime status of the GRUs int num_gru_done_ = 0; diff --git a/build/source/job_actor/gru_struc.cpp b/build/source/job_actor/gru_struc.cpp index 78ef42eddf4e2a1ccf52627db6b7f55ffc15e335..ec5a7a76bd1c5854ecbf5f12fa2ee12445cb004c 100644 --- a/build/source/job_actor/gru_struc.cpp +++ b/build/source/job_actor/gru_struc.cpp @@ -10,6 +10,7 @@ GruStruc::GruStruc(int start_gru, int num_gru, int num_retry_attempts) { } int GruStruc::ReadDimension() { + // gru_struc is set up in fortran here int err = 0; int num_hru, file_gru, file_hru; std::unique_ptr<char[]> err_msg(new char[256]); read_dimension_fortran(start_gru_, num_gru_, num_hru, file_gru, file_hru, @@ -33,5 +34,9 @@ int GruStruc::ReadIcondNlayers() { return 0; } +void GruStruc::getNumHrusPerGru() { + num_hru_per_gru_.resize(num_gru_, 0); + get_num_hru_per_gru_fortran(num_gru_, num_hru_per_gru_[0]); +} diff --git a/build/source/job_actor/gru_struc.f90 b/build/source/job_actor/gru_struc.f90 index 884373935390b2af3c0106f0b20e06c32779c139..c7eb55452d9a0915bc31fc9f89a10e92466490da 100644 --- a/build/source/job_actor/gru_struc.f90 +++ b/build/source/job_actor/gru_struc.f90 @@ -5,6 +5,7 @@ module gru_struc_module public::read_dimension_fortran public::read_icond_nlayers_fortran + public::get_num_hru_per_gru_fortran public::deallocate_gru_struc_fortran contains @@ -87,6 +88,22 @@ subroutine read_icond_nlayers_fortran(num_gru, err, message_r)& end subroutine read_icond_nlayers_fortran +subroutine get_num_hru_per_gru_fortran(num_gru, num_hru_per_gru_array) & + bind(C, name="get_num_hru_per_gru_fortran") + USE globalData,only:gru_struc ! gru->hru mapping structure + implicit none + ! Dummy Variables + integer(c_int), intent(in) :: num_gru + integer(c_int), intent(out) :: num_hru_per_gru_array(num_gru) + ! Local Variables + integer :: iGRU + + do iGRU = 1, num_gru + num_hru_per_gru_array(iGRU) = gru_struc(iGRU)%hruCount + end do + +end subroutine + subroutine deallocate_gru_struc_fortran() bind(C, name="deallocate_gru_struc_fortran") USE globalData,only:gru_struc ! gru->hru mapping structure USE globalData,only:index_map diff --git a/build/source/job_actor/job_actor.cpp b/build/source/job_actor/job_actor.cpp index 58a143335856703fb70b87e8055f309a4682bd5d..cf9ab3d25191f727f06a850d7c089ad555c28140 100644 --- a/build/source/job_actor/job_actor.cpp +++ b/build/source/job_actor/job_actor.cpp @@ -55,6 +55,7 @@ behavior job_actor(stateful_actor<job_state>* self, int start_gru, int num_gru, aout(self) << "ERROR: Job_Actor - ReadIcondNlayers\n"; return {}; } + gru_struc->getNumHrusPerGru(); self->state.summa_init_struc = std::make_unique<SummaInitStruc>(); if (self->state.summa_init_struc->allocate(self->state.num_gru) != 0) { @@ -78,9 +79,10 @@ behavior job_actor(stateful_actor<job_state>* self, int start_gru, int num_gru, gru_struc->get_file_gru(), false); - self->state.file_access_actor = self->spawn( - file_access_actor, self->state.num_gru_info, - self->state.file_access_actor_settings, self); + self->state.file_access_actor = self->spawn(file_access_actor, + self->state.num_gru_info, + self->state.file_access_actor_settings, + self); self->request(self->state.file_access_actor, caf::infinite, init_file_access_actor_v, gru_struc->get_file_gru(), gru_struc->getNumHrus()) @@ -93,7 +95,6 @@ behavior job_actor(stateful_actor<job_state>* self, int start_gru, int num_gru, return; } - aout(self) << "Job_Actor: File Access Actor Ready\n"; self->state.job_timing.updateEndPoint("init_duration"); aout(self) << "Job Actor Initialized \n"; diff --git a/build/source/job_actor/job_utils.cpp b/build/source/job_actor/job_utils.cpp index 042c76ed9843b98040322da3df943d8376c7660f..24fe4af6565c345a31482360808124197b8c03f3 100644 --- a/build/source/job_actor/job_utils.cpp +++ b/build/source/job_actor/job_utils.cpp @@ -7,20 +7,20 @@ void spawnHRUActors(stateful_actor<job_state>* self) { for (int i = 0; i < gru_struc->getNumGrus(); i++) { auto netcdf_index = gru_struc->getStartGru() + i; auto job_index = i + 1; + caf::actor gru; + if (gru_struc->getNumHruPerGru(i) > 1) { + gru = self->spawn(gru_actor, netcdf_index, job_index, + self->state.num_steps, + self->state.hru_actor_settings, + self->state.file_access_actor, self); + } else { + gru = self->spawn(hru_actor, netcdf_index, job_index, + self->state.hru_actor_settings, + self->state.file_access_actor, self); + self->send(gru, init_hru_v); + self->send(gru, update_hru_async_v); + } - auto gru = self->spawn(gru_actor, netcdf_index, job_index, - self->state.num_steps, - self->state.hru_actor_settings, - self->state.file_access_actor, self); - - // Start GRU - // auto gru = self->spawn(hru_actor, netcdf_index, job_index, - // self->state.hru_actor_settings, - // self->state.file_access_actor, self); - // self->send(gru, init_hru_v); - // self->send(gru, update_hru_async_v); - - // Save information about the GRU std::unique_ptr<GRU> gru_obj = std::make_unique<GRU>( netcdf_index, job_index, gru, self->state.dt_init_start_factor, diff --git a/build/source/main.cpp b/build/source/main.cpp index d3a52e163b8007f5355646a43fe5db79db753a09..16a2092eaecbc7d707878a7bc15ac2cede6496fb 100644 --- a/build/source/main.cpp +++ b/build/source/main.cpp @@ -114,6 +114,8 @@ void caf_main(actor_system& sys, const config& cfg) { if (!std::filesystem::exists((std::filesystem::path) cfg.config_file)) { aout(self) << "\n\n**** Config (-c) or Master File (-m) " << "Does Not Exist or Not Specified!! ****\n\n" + << "Config File: " << cfg.config_file << "\n" + << "Master File: " << cfg.master_file << "\n\n" << command_line_help << std::endl; return; }