From 2f0d55850276b8bb2deebcdb0cc325f7bf6c3288 Mon Sep 17 00:00:00 2001 From: Kyle Klenk <kyle.c.klenk@gmail.com> Date: Tue, 26 Mar 2024 22:40:18 +0000 Subject: [PATCH] Addressed some memory leaks and can exit program properly without the use of exit() --- build/includes/global/auxilary.hpp | 8 ++++- build/includes/global/fortran_data_types.hpp | 6 ++++ build/includes/global/message_atoms.hpp | 13 +++++++- build/source/global/auxiliary.cpp | 12 +++++++ build/source/global/cppwrap_datatypes.f90 | 35 ++++++++++++++++++++ build/source/hru_actor/hru_actor.cpp | 11 ++++++ build/source/hru_actor/hru_batch_actor.cpp | 7 ---- build/source/job_actor/job_actor.cpp | 6 ++-- build/source/summa_actor/summa_actor.cpp | 3 +- 9 files changed, 89 insertions(+), 12 deletions(-) diff --git a/build/includes/global/auxilary.hpp b/build/includes/global/auxilary.hpp index 148e544..9c29e84 100644 --- a/build/includes/global/auxilary.hpp +++ b/build/includes/global/auxilary.hpp @@ -41,6 +41,9 @@ std::vector<double> get_var_d_by_indx(void* handle, int struct_indx); std::vector<long int> get_var_i8_by_indx(void* handle, int struct_indx); std::vector<int> get_flagVec_by_indx(void* handle, int struct_indx); +void get_scalar_data(void* handle, double fracJulDay, + double tmZoneOffsetFracDay, int year_length, int computeVegFlux); + // Setters by index void set_var_dlength_by_indx(void* handle, std::vector<std::vector<double>>& summa_struct, int struct_indx); @@ -57,4 +60,7 @@ void set_var_d_by_indx(void* handle, std::vector<double>& summa_struct, int struct_indx); void set_flagVec_by_indx(void* handle, std::vector<int>& summa_struct, - int struct_indx); \ No newline at end of file + int struct_indx); + +void set_scalar_data(void* handle, double fracJulDay, + double tmZoneOffsetFracDay, int year_length, int computeVegFlux); \ No newline at end of file diff --git a/build/includes/global/fortran_data_types.hpp b/build/includes/global/fortran_data_types.hpp index e8e3204..2eb562e 100644 --- a/build/includes/global/fortran_data_types.hpp +++ b/build/includes/global/fortran_data_types.hpp @@ -158,4 +158,10 @@ extern "C" { void get_data_flagVec_by_indx(void* handle, int* struct_indx, int* dat); void set_data_flagVec_by_indx(void* handle, int* struct_indx, int* num_var, int* summa_struct); + + // scalar types + void get_scalar_data_fortran(void* handle, double* fracJulDay, + double* tmZoneOffsetFracDay, int* year_length, int* computeVegFlux); + void set_scalar_data_fortran(void* handle, double* fracJulDay, + double* tmZoneOffsetFracDay, int* year_length, int* computeVegFlux); } \ No newline at end of file diff --git a/build/includes/global/message_atoms.hpp b/build/includes/global/message_atoms.hpp index 66eec98..d4e3235 100644 --- a/build/includes/global/message_atoms.hpp +++ b/build/includes/global/message_atoms.hpp @@ -63,6 +63,12 @@ struct hru { std::vector<int> output_timestep; std::vector<int> reset_stats; std::vector<int> finalize_stats; + + // scalar data + double frac_jul_day; + double tm_zone_offset_frac_day; + int year_length; + int compute_veg_flux; }; template <class Inspector> @@ -108,7 +114,12 @@ bool inspect(Inspector& inspector, hru& hru_data) { inspector.field("stat_counter", hru_data.stat_counter), inspector.field("output_timestep", hru_data.output_timestep), inspector.field("reset_stats", hru_data.reset_stats), - inspector.field("finalize_stats", hru_data.finalize_stats)); + inspector.field("finalize_stats", hru_data.finalize_stats), + inspector.field("frac_jul_day", hru_data.frac_jul_day), + inspector.field("tm_zone_offset_frac_day", + hru_data.tm_zone_offset_frac_day), + inspector.field("year_length", hru_data.year_length), + inspector.field("compute_veg_flux", hru_data.compute_veg_flux)); } diff --git a/build/source/global/auxiliary.cpp b/build/source/global/auxiliary.cpp index 4669b48..aad469d 100644 --- a/build/source/global/auxiliary.cpp +++ b/build/source/global/auxiliary.cpp @@ -521,6 +521,18 @@ std::vector<std::vector<std::vector<double>>> get_lookup_struct(void *handle) { return lookup_struct; } +void get_scalar_data(void* handle, double fracJulDay, + double tmZoneOffsetFracDay, int year_length, int computeVegFlux) { + get_scalar_data_fortran(handle, &fracJulDay, &tmZoneOffsetFracDay, + &year_length, &computeVegFlux); +} + +void set_scalar_data(void* handle, double fracJulDay, + double tmZoneOffsetFracDay, int year_length, int computeVegFlux) { + set_scalar_data_fortran(handle, &fracJulDay, &tmZoneOffsetFracDay, + &year_length, &computeVegFlux); +} + // HRU Data Serialization // struct_indx maps to the following: diff --git a/build/source/global/cppwrap_datatypes.f90 b/build/source/global/cppwrap_datatypes.f90 index 75e8457..a97be87 100644 --- a/build/source/global/cppwrap_datatypes.f90 +++ b/build/source/global/cppwrap_datatypes.f90 @@ -2493,6 +2493,41 @@ subroutine set_data_flagVec_by_indx(handle, struct_indx, num_var, summa_struct)& end subroutine ! ****************************** flag_vec **************************** +subroutine get_scalar_data_fortran(handle, fracJulDay, tmZoneOffsetFracDay, & + year_length, computeVegFlux) bind(C, name='get_scalar_data_fortran') + type(c_ptr), intent(in), value :: handle + real(c_double), intent(out) :: fracJulDay + real(c_double), intent(out) :: tmZoneOffsetFracDay + integer(c_int), intent(out) :: year_length + integer(c_int), intent(out) :: computeVegFlux + type(hru_type), pointer :: hru_data + + call c_f_pointer(handle, hru_data) + + fracJulDay = hru_data%fracJulDay + tmZoneOffsetFracDay = hru_data%tmZoneOffsetFracDay + year_length = hru_data%yearLength + computeVegFlux = hru_data%computeVegFlux + +end subroutine get_scalar_data_fortran + +subroutine set_scalar_data_fortran(handle, fracJulDay, tmZoneOffsetFracDay, & + year_length, computeVegFlux) bind(C, name='set_scalar_data_fortran') + type(c_ptr), intent(in), value :: handle + real(c_double), intent(in) :: fracJulDay + real(c_double), intent(in) :: tmZoneOffsetFracDay + integer(c_int), intent(in) :: year_length + integer(c_int), intent(in) :: computeVegFlux + type(hru_type), pointer :: hru_data + + call c_f_pointer(handle, hru_data) + + hru_data%fracJulDay = fracJulDay + hru_data%tmZoneOffsetFracDay = tmZoneOffsetFracDay + hru_data%yearLength = year_length + hru_data%computeVegFlux = computeVegFlux + +end subroutine set_scalar_data_fortran ! ****************************** hru type **************************** diff --git a/build/source/hru_actor/hru_actor.cpp b/build/source/hru_actor/hru_actor.cpp index 4b1e351..9b34d0e 100644 --- a/build/source/hru_actor/hru_actor.cpp +++ b/build/source/hru_actor/hru_actor.cpp @@ -232,6 +232,12 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, self->state.hru_data_serialized.finalize_stats = get_flagVec_by_indx(self->state.hru_data, 2); + get_scalar_data(self->state.hru_data, + self->state.hru_data_serialized.frac_jul_day, + self->state.hru_data_serialized.tm_zone_offset_frac_day, + self->state.hru_data_serialized.year_length, + self->state.hru_data_serialized.compute_veg_flux); + aout(self) << "Done Serializing HRU Data\n"; self->send(self->state.parent, serialize_hru_v, @@ -295,6 +301,11 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, set_flagVec_by_indx(self->state.hru_data, hru_data.reset_stats, 1); set_flagVec_by_indx(self->state.hru_data, hru_data.finalize_stats, 2); + // scalar data + set_scalar_data(self->state.hru_data, hru_data.frac_jul_day, + hru_data.tm_zone_offset_frac_day, hru_data.year_length, + hru_data.compute_veg_flux); + self->send(self->state.parent, reinit_hru_v); }, diff --git a/build/source/hru_actor/hru_batch_actor.cpp b/build/source/hru_actor/hru_batch_actor.cpp index dd6bf4c..6e186a4 100644 --- a/build/source/hru_actor/hru_batch_actor.cpp +++ b/build/source/hru_actor/hru_batch_actor.cpp @@ -69,13 +69,6 @@ behavior hru_batch_actor(stateful_actor<hru_batch_state>* self, [=](reinit_hru) { aout(self) << "HRU_Batch_Actor: HRU Re-Initialized\n"; self->send(self->state.parent, reinit_hru_v); - }, - - [=](exit_msg) { - for(auto& hru_actor : self->state.hru_actors) { - self->send_exit(hru_actor, exit_reason::user_shutdown); - } - self->quit(); } }; diff --git a/build/source/job_actor/job_actor.cpp b/build/source/job_actor/job_actor.cpp index 4b41290..20458c0 100644 --- a/build/source/job_actor/job_actor.cpp +++ b/build/source/job_actor/job_actor.cpp @@ -164,9 +164,11 @@ behavior job_actor(stateful_actor<job_state>* self, // Check if we are done the simulation if (self->state.timestep > self->state.num_steps) { - for (auto GRU : self->state.gru_container.gru_list) - GRU->setSuccess(); aout(self) << "Job_Actor: Done Job\n"; + for (auto GRU : self->state.gru_container.gru_list) { + self->send_exit(GRU->getGRUActor(), exit_reason::user_shutdown); + GRU->setSuccess(); + } self->send(self, finalize_v); } else if (self->state.forcingStep > self->state.stepsInCurrentFFile) { // Check if we need another forcing file diff --git a/build/source/summa_actor/summa_actor.cpp b/build/source/summa_actor/summa_actor.cpp index fae8f31..365a302 100644 --- a/build/source/summa_actor/summa_actor.cpp +++ b/build/source/summa_actor/summa_actor.cpp @@ -117,7 +117,8 @@ behavior summa_actor(stateful_actor<summa_actor_state>* self, self->send(self->state.parent, done_batch_v, total_dur_sec, read_dur_sec, write_dur_sec); - exit(0); + self->quit(); + // exit(0); } }, -- GitLab