diff --git a/build/includes/hru_actor/hru_actor.hpp b/build/includes/hru_actor/hru_actor.hpp index 394304613cf16e57a594154542f1caa3708bd571..2f4c8d9b6bd3f01cb23826997be4750ffc2d82cb 100644 --- a/build/includes/hru_actor/hru_actor.hpp +++ b/build/includes/hru_actor/hru_actor.hpp @@ -82,22 +82,6 @@ struct hru_state { int yearLength; int err = 0; // error conotrol - std::chrono::time_point<std::chrono::system_clock> start; - std::chrono::time_point<std::chrono::system_clock> end; - double duration = 0.0; - std::chrono::time_point<std::chrono::system_clock> initStart; - std::chrono::time_point<std::chrono::system_clock> initEnd; - double initDuration = 0.0; - std::chrono::time_point<std::chrono::system_clock> forcingStart; - std::chrono::time_point<std::chrono::system_clock> forcingEnd; - double forcingDuration = 0.0; - std::chrono::time_point<std::chrono::system_clock> runPhysicsStart; - std::chrono::time_point<std::chrono::system_clock> runPhysicsEnd; - double runPhysicsDuration = 0.0; - std::chrono::time_point<std::chrono::system_clock> writeOutputStart; - std::chrono::time_point<std::chrono::system_clock> writeOutputEnd; - double writeOutputDuration = 0.0; - TimingInfo hru_timing; }; diff --git a/build/includes/job_actor/job_actor.hpp b/build/includes/job_actor/job_actor.hpp index c4095cb592b15bd69399c88f90e95585be4ce0c7..f4f8ef5fe1c1985e5ffe28637e4f00749e5334d3 100644 --- a/build/includes/job_actor/job_actor.hpp +++ b/build/includes/job_actor/job_actor.hpp @@ -2,6 +2,7 @@ #include "caf/all.hpp" #include "caf/io/all.hpp" #include "GRUinfo.hpp" +#include "timing_info.hpp" namespace caf { struct job_state { @@ -27,9 +28,8 @@ struct job_state { int outputStrucSize; // Timing Variables - std::chrono::time_point<std::chrono::system_clock> start; - std::chrono::time_point<std::chrono::system_clock> end; - double duration; + TimingInfo job_timing; + // Output File Names for Timings bool outputCSV; diff --git a/build/source/actors/hru_actor/hru_actor.cpp b/build/source/actors/hru_actor/hru_actor.cpp index da50ed0f2117cc1578aaf9305ea3d884babc9e5e..6a2ed14801c4a3fec802d7df1638cbb53c65d81f 100644 --- a/build/source/actors/hru_actor/hru_actor.cpp +++ b/build/source/actors/hru_actor/hru_actor.cpp @@ -20,12 +20,6 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, self->state.hru_timing.addTimePoint("run_physics_duration"); self->state.hru_timing.addTimePoint("write_output_duration"); - - - self->state.start = std::chrono::high_resolution_clock::now(); - self->state.duration = 0.0; - self->state.initDuration = 0.0; - // Actor References self->state.file_access_actor = file_access_actor; self->state.parent = parent; @@ -61,18 +55,12 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, Initialize_HRU(self); - - self->state.end = std::chrono::high_resolution_clock::now(); - self->state.duration += calculateTime(self->state.start, self->state.end); - self->state.hru_timing.updateEndPoint("total_duration"); - self->send(self->state.parent, done_init_hru_v); return { // Starts the HRU and tells it to ask for data from the file_access_actor [=](start_hru) { - self->state.start = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateStartPoint("total_duration"); @@ -90,47 +78,33 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, self->send(self->state.file_access_actor, access_forcing_v, self->state.iFile, self); - self->state.end = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("total_duration"); - - self->state.duration += calculateTime(self->state.start, self->state.end); }, [=](done_write) { - self->state.start = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateStartPoint("total_duration"); // We receive a done_write message so we ensure that // stepsInCurrentFFile remains unchanged if (self->state.timestep >= self->state.num_steps) { - - self->state.end = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("total_duration"); - self->state.duration += calculateTime(self->state.start, self->state.end); // Tell our parent we are done, convert all timings to seconds - - self->state.duration = self->state.duration / 1000; // Convert to milliseconds - self->state.initDuration = self->state.initDuration / 1000; // Convert to milliseconds - self->state.forcingDuration = self->state.forcingDuration / 1000; // Convert to milliseconds - self->state.runPhysicsDuration = self->state.runPhysicsDuration / 1000; // Convert to milliseconds - self->state.writeOutputDuration = self->state.writeOutputDuration / 1000; // Convert to milliseconds aout(self) << "\n________________PRINTING HRU TIMING INFO RESULTS________________\n"; - aout(self) << "Total Duration = " << self->state.hru_timing.getDuration("total_duration").value_or(-1.0) << "\n"; - aout(self) << "Init Duration = " << self->state.hru_timing.getDuration("init_duration").value_or(-1.0) << "\n"; - aout(self) << "Forcing Duration = " << self->state.hru_timing.getDuration("forcing_duration").value_or(-1.0) << "\n"; - aout(self) << "Run Physics Duration = " << self->state.hru_timing.getDuration("run_physics_duration").value_or(-1.0) << "\n"; - aout(self) << "Write Output Duration = " << self->state.hru_timing.getDuration("write_output_duration").value_or(-1.0) << "\n"; - + aout(self) << "Total Duration = " << self->state.hru_timing.getDuration("total_duration").value_or(-1.0) << " Seconds\n"; + aout(self) << "Init Duration = " << self->state.hru_timing.getDuration("init_duration").value_or(-1.0) << " Seconds\n"; + aout(self) << "Forcing Duration = " << self->state.hru_timing.getDuration("forcing_duration").value_or(-1.0) << " Seconds\n"; + aout(self) << "Run Physics Duration = " << self->state.hru_timing.getDuration("run_physics_duration").value_or(-1.0) << " Seconds\n"; + aout(self) << "Write Output Duration = " << self->state.hru_timing.getDuration("write_output_duration").value_or(-1.0) << " Seconds\n\n"; self->send(self->state.parent, done_hru_v, self->state.indxGRU, - self->state.duration / 1000, - self->state.initDuration / 1000, - self->state.forcingDuration / 1000, - self->state.runPhysicsDuration / 1000, - self->state.writeOutputDuration / 1000); + self->state.hru_timing.getDuration("total_duration").value_or(-1.0), + self->state.hru_timing.getDuration("init_duration").value_or(-1.0), + self->state.hru_timing.getDuration("forcing_duration").value_or(-1.0), + self->state.hru_timing.getDuration("run_physics_duration").value_or(-1.0), + self->state.hru_timing.getDuration("write_output_duration").value_or(-1.0)); deallocateHRUStructures(self); @@ -138,16 +112,11 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, return; } - self->state.end = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("total_duration"); - - self->state.duration += calculateTime(self->state.start, self->state.end); - self->send(self, run_hru_v, self->state.stepsInCurrentFFile); }, [=](run_hru, int stepsInCurrentFFile) { - self->state.start = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateStartPoint("total_duration"); bool keepRunning = true; @@ -163,19 +132,12 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, self->state.outputStep += 1; self->state.forcingStep += 1; - // if (self->state.timestep == 450 && self->state.indxGRU == 5) { - // err = 20; - // } - keepRunning = check_HRU(self, err); // check if we are done, need to write } - self->state.end = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("total_duration"); - self->state.duration += calculateTime(self->state.start, self->state.end); - }, [=](dt_init_factor, int dt_init_factor) { @@ -189,7 +151,6 @@ behavior hru_actor(stateful_actor<hru_state>* self, int refGRU, int indxGRU, } void Initialize_HRU(stateful_actor<hru_state>* self) { - self->state.initStart = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateStartPoint("init_duration"); // aout(self) << "Initalizing HRU" << std::endl; @@ -266,18 +227,13 @@ void Initialize_HRU(stateful_actor<hru_state>* self) { return; } - // aout(self) << self->state.refGRU << " - Done Init" << std::endl; - self->state.initEnd = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("init_duration"); - - self->state.initDuration = calculateTime(self->state.initStart, self->state.initEnd); } int Run_HRU(stateful_actor<hru_state>* self) { /********************************************************************** ** READ FORCING **********************************************************************/ - self->state.forcingStart = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateStartPoint("forcing_duration"); Forcing(&self->state.indxGRU, @@ -297,12 +253,8 @@ int Run_HRU(stateful_actor<hru_state>* self) { return 10; } - self->state.forcingEnd = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("forcing_duration"); - self->state.forcingDuration += calculateTime(self->state.forcingStart, self->state.forcingEnd); - - if (self->state.printOutput && self->state.timestep % self->state.outputFrequency == 0) { printOutput(self); @@ -312,7 +264,6 @@ int Run_HRU(stateful_actor<hru_state>* self) { /********************************************************************** ** RUN_PHYSICS **********************************************************************/ - self->state.runPhysicsStart = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateStartPoint("run_physics_duration"); self->state.err = 0; @@ -341,14 +292,11 @@ int Run_HRU(stateful_actor<hru_state>* self) { " - Timestep = " << self->state.timestep << std::endl; return 20; } - self->state.runPhysicsEnd = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("run_physics_duration"); - self->state.runPhysicsDuration += calculateTime(self->state.runPhysicsStart, self->state.runPhysicsEnd); /********************************************************************** ** WRITE_OUTPUT **********************************************************************/ - self->state.writeOutputStart = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateStartPoint("write_output_duration"); WriteOutput(&self->state.indxHRU, &self->state.indxGRU, @@ -384,9 +332,7 @@ int Run_HRU(stateful_actor<hru_state>* self) { " - Timestep = " << self->state.timestep << std::endl; return 30; } - self->state.writeOutputEnd = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("write_output_duration"); - self->state.writeOutputDuration += calculateTime(self->state.writeOutputStart, self->state.writeOutputEnd); return 0; } @@ -414,11 +360,8 @@ bool check_HRU(stateful_actor<hru_state>* self, int err) { self->send(self->state.file_access_actor, write_output_v, self->state.indxGRU, self->state.indxHRU, self->state.outputStep, self); - self->state.end = std::chrono::high_resolution_clock::now(); self->state.hru_timing.updateEndPoint("total_duration"); - self->state.duration += calculateTime(self->state.start, self->state.end); - return false; } else if (self->state.outputStep > self->state.outputStrucSize && @@ -512,8 +455,6 @@ void deallocateHRUStructures(stateful_actor<hru_state>* self) { void printOutput(stateful_actor<hru_state>* self) { aout(self) << self->state.refGRU << " - Timestep = " << self->state.timestep << std::endl; - aout(self) << self->state.refGRU << ":Accumulated Run Physics Time = " << - self->state.runPhysicsDuration << std::endl; } } \ No newline at end of file diff --git a/build/source/actors/job_actor/job_actor.cpp b/build/source/actors/job_actor/job_actor.cpp index a33240cde3b0fc707379e86148e7cb7585fb3ac1..f74baabc489ff9a9fa34ae4b0c3dc51ec9e857fb 100644 --- a/build/source/actors/job_actor/job_actor.cpp +++ b/build/source/actors/job_actor/job_actor.cpp @@ -20,7 +20,12 @@ namespace caf { */ behavior job_actor(stateful_actor<job_state>* self, int startGRU, int numGRU, std::string configPath, int outputStrucSize, caf::actor parent) { - self->state.start = std::chrono::high_resolution_clock::now(); + // Timinig Information + self->state.job_timing = TimingInfo(); + self->state.job_timing.addTimePoint("total_duration"); + self->state.job_timing.updateStartPoint("total_duration"); + + // Set Job Variables self->state.startGRU = startGRU; self->state.numGRU = numGRU; @@ -28,6 +33,7 @@ behavior job_actor(stateful_actor<job_state>* self, int startGRU, int numGRU, self->state.parent = parent; self->state.outputStrucSize = outputStrucSize; + // Get All Settings self->state.fileManager = getSettings(self->state.configPath, "JobActor", "FileManagerPath", self->state.fileManager).value_or(""); self->state.outputCSV = getSettings(self->state.configPath, "JobActor", "outputCSV", @@ -79,16 +85,16 @@ behavior job_actor(stateful_actor<job_state>* self, int startGRU, int numGRU, } }, - [=](done_hru, int indxGRU, double totalDuration, double initDuration, - double forcingDuration, double runPhysicsDuration, double writeOutputDuration) { - aout(self) << "GRU:" << self->state.GRUList[indxGRU - 1]->getRefGRU() - << "indxGRU = " << indxGRU << "Done \n"; + [=](done_hru, int indx_gru, double total_duration, double init_duration, + double forcing_duration, double run_physics_duration, double write_output_duration) { + aout(self) << "\nGRU:" << self->state.GRUList[indx_gru - 1]->getRefGRU() + << " - IndexInJob = " << indx_gru << " Done\n"; - self->state.GRUList[indxGRU - 1]->doneRun(totalDuration, initDuration, forcingDuration, - runPhysicsDuration, writeOutputDuration); + self->state.GRUList[indx_gru - 1]->doneRun(total_duration, init_duration, forcing_duration, + run_physics_duration, write_output_duration); if (self->state.outputCSV) { - self->state.GRUList[indxGRU - 1]->writeSuccess(self->state.successOutputFile); + self->state.GRUList[indx_gru - 1]->writeSuccess(self->state.successOutputFile); } self->state.numGRUDone++; @@ -146,15 +152,14 @@ behavior job_actor(stateful_actor<job_state>* self, int startGRU, int numGRU, self->state.GRUList.clear(); - self->state.end = std::chrono::high_resolution_clock::now(); - self->state.duration = calculateTime(self->state.start, self->state.end); + self->state.job_timing.updateEndPoint("total_duration"); - self->state.duration = self->state.duration / 1000; // Convert to milliseconds + aout(self) << "\n________________PRINTING JOB_ACTOR TIMING INFO RESULTS________________\n"; + aout(self) << "Total Duration = " << self->state.job_timing.getDuration("total_duration").value_or(-1.0) << " Seconds\n"; + aout(self) << "Total Duration = " << self->state.job_timing.getDuration("total_duration").value_or(-1.0) / 60 << " Minutes\n"; + aout(self) << "Total Duration = " << (self->state.job_timing.getDuration("total_duration").value_or(-1.0) / 60) / 60 << " Hours\n\n"; + - aout(self) << "\nTotal Job Duration:\n"; - aout(self) << " " << self->state.duration / 1000 << " Seconds\n"; - aout(self) << " " << (self->state.duration / 1000) / 60 << " Minutes\n"; - aout(self) << " " << ((self->state.duration / 1000) / 60) / 60 << " Hours\n"; aout(self) << "\nReading Duration:\n"; aout(self) << " " << read_duration << " Seconds\n"; aout(self) << "\nWriting Duration:\n"; @@ -162,8 +167,11 @@ behavior job_actor(stateful_actor<job_state>* self, int startGRU, int numGRU, cleanUpJobActor(&err); // Tell Parent we are done - self->send(self->state.parent, done_job_v, self->state.numGRUFailed, self->state.duration, - read_duration, write_duration); + self->send(self->state.parent, + done_job_v, + self->state.numGRUFailed, + self->state.job_timing.getDuration("total_duration").value_or(-1.0), + read_duration, write_duration); self->quit(); },