diff --git a/src/EnergyPlus/Data/CommonIncludes.hh b/src/EnergyPlus/Data/CommonIncludes.hh index 83d7f7d076f..87e6be89b55 100644 --- a/src/EnergyPlus/Data/CommonIncludes.hh +++ b/src/EnergyPlus/Data/CommonIncludes.hh @@ -79,6 +79,7 @@ #include #include #include +#include #include #include #include diff --git a/src/EnergyPlus/Data/EnergyPlusData.cc b/src/EnergyPlus/Data/EnergyPlusData.cc index 47dc07af9ad..2538314d1c2 100644 --- a/src/EnergyPlus/Data/EnergyPlusData.cc +++ b/src/EnergyPlus/Data/EnergyPlusData.cc @@ -96,6 +96,7 @@ namespace EnergyPlus { this->dataThermalChimneys = std::unique_ptr(new ThermalChimneysData); this->dataThermalComforts = std::unique_ptr(new ThermalComfortsData); this->dataTranspiredCollector = std::unique_ptr(new TranspiredCollectorData); + this->dataTimingsData = std::unique_ptr(new DataTimingsData); this->dataUFADManager = std::unique_ptr(new UFADManagerData); this->dataUnitarySystems = std::unique_ptr(new UnitarySystemsData); this->dataUnitHeaters = std::unique_ptr(new UnitHeatersData); @@ -161,6 +162,7 @@ namespace EnergyPlus { this->dataSurfaceGroundHeatExchangers->clear_state(); this->dataSwimmingPools->clear_state(); this->dataSystemAvailabilityManager->clear_state(); + this->dataTimingsData->clear_state(); this->dataThermalChimneys->clear_state(); this->dataThermalComforts->clear_state(); this->dataTranspiredCollector->clear_state(); diff --git a/src/EnergyPlus/Data/EnergyPlusData.hh b/src/EnergyPlus/Data/EnergyPlusData.hh index 491e5f49324..84760114b7d 100644 --- a/src/EnergyPlus/Data/EnergyPlusData.hh +++ b/src/EnergyPlus/Data/EnergyPlusData.hh @@ -89,6 +89,7 @@ struct CTElectricGeneratorData; struct CurveManagerData; struct DataAirLoopData; struct DataGlobal; +struct DataTimingsData; struct DataWaterData; struct ExteriorEnergyUseData; struct FansData; @@ -178,6 +179,7 @@ struct EnergyPlusData : BaseGlobalStruct { std::unique_ptr dataThermalChimneys; std::unique_ptr dataThermalComforts; std::unique_ptr dataTranspiredCollector; + std::unique_ptr dataTimingsData; std::unique_ptr dataUFADManager; std::unique_ptr dataUnitarySystems; std::unique_ptr dataUnitHeaters; diff --git a/src/EnergyPlus/DataSystemVariables.hh b/src/EnergyPlus/DataSystemVariables.hh index a4c7cc2c863..8dbedc38320 100644 --- a/src/EnergyPlus/DataSystemVariables.hh +++ b/src/EnergyPlus/DataSystemVariables.hh @@ -69,7 +69,6 @@ namespace DataSystemVariables { extern int const iASCII_CR; // endline value when just CR instead of CR/LF extern int const iUnicode_end; // endline value when Unicode file extern char const tabchar; - extern int const MaxTimingStringLength; // string length for timing string array extern std::string const DDOnlyEnvVar; // Only run design days extern std::string const ReverseDDEnvVar; // Reverse DD during run diff --git a/src/EnergyPlus/DataTimings.cc b/src/EnergyPlus/DataTimings.cc index 04abc2220d9..84eea8520aa 100644 --- a/src/EnergyPlus/DataTimings.cc +++ b/src/EnergyPlus/DataTimings.cc @@ -50,11 +50,9 @@ // EnergyPlus Headers #include +#include #include -#include #include -#include -#include #include namespace EnergyPlus { @@ -74,47 +72,6 @@ namespace DataTimings { // PURPOSE OF THIS MODULE: // This data-only module is a repository for data and routines for timing within EnergyPlus. - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // OTHER NOTES: - // na - - // Using/Aliasing - using DataSystemVariables::DeveloperFlag; - using DataSystemVariables::tabchar; - - // Data - // -only module should be available to other modules and routines. - // Thus, all variables in this module must be PUBLIC. - - // MODULE PARAMETER DEFINITIONS: - int const MaxTimingStringLength(250); // string length for timing string array - - // DERIVED TYPE DEFINITIONS - - // INTERFACE BLOCK SPECIFICATIONS - // na - - // MODULE VARIABLE DECLARATIONS: - int NumTimingElements(0); - int MaxTimingElements(0); - Real64 dailyWeatherTime; - Real64 dailyExteriorEnergyUseTime; - Real64 dailyHeatBalanceTime; - Real64 hbdailyInit; - Real64 hbdailyOutSurf; - Real64 hbdailyInSurf; - Real64 hbdailyHVAC; - Real64 hbdailyRep; - Real64 clockrate; - bool lprocessingInputTiming(false); - bool lmanageSimulationTiming(false); - bool lcloseoutReportingTiming(false); - // Following for calls to routines #ifdef EP_Count_Calls int NumShadow_Calls(0); @@ -135,9 +92,6 @@ namespace DataTimings { int NumCalcScriptF_Calls(0); #endif - // Object Data - Array1D Timing; - // Functions void epStartTime( @@ -163,25 +117,6 @@ namespace DataTimings { // METHODOLOGY EMPLOYED: // structure similar to recurring error structure. - // REFERENCES: - // na - - // USE STATEMENTS: - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - // Object Data Array1D tempTiming; // used for reallocate. @@ -191,29 +126,29 @@ namespace DataTimings { #ifdef EP_Timings int loop; // testing if already in structure int found; // indicator for element - if (NumTimingElements == 0) { - MaxTimingElements = 250; - Timing.allocate(MaxTimingElements); - } else if (NumTimingElements == MaxTimingElements) { - tempTiming.allocate(MaxTimingElements + 250); - tempTiming({1, MaxTimingElements}) = Timing({1, MaxTimingElements}); + if (state.dataTimingsData->NumTimingElements == 0) { + state.dataTimingsData->MaxTimingElements = 250; + Timing.allocate(state.dataTimingsData->MaxTimingElements); + } else if (state.dataTimingsData->NumTimingElements == state.dataTimingsData->MaxTimingElements) { + tempTiming.allocate(state.dataTimingsData->MaxTimingElements + 250); + tempTiming({1, state.dataTimingsData->MaxTimingElements}) = Timing({1, state.dataTimingsData->MaxTimingElements}); Timing.deallocate(); - MaxTimingElements += 250; - Timing.allocate(MaxTimingElements); - Timing({1, MaxTimingElements}) = tempTiming({1, MaxTimingElements}); + state.dataTimingsData->MaxTimingElements += 250; + Timing.allocate(state.dataTimingsData->MaxTimingElements); + Timing({1, state.dataTimingsData->MaxTimingElements}) = tempTiming({1, state.dataTimingsData->MaxTimingElements}); tempTiming.deallocate(); } found = 0; - for (loop = 1; loop <= NumTimingElements; ++loop) { + for (loop = 1; loop <= state.dataTimingsData->NumTimingElements; ++loop) { if (Timing(loop).Element != ctimingElementstring) continue; found = loop; } if (found == 0) { - ++NumTimingElements; - Timing(NumTimingElements).Element = ctimingElementstring; - found = NumTimingElements; + ++state.dataTimingsData->NumTimingElements; + Timing(state.dataTimingsData->NumTimingElements).Element = ctimingElementstring; + found = state.dataTimingsData->NumTimingElements; } TSTART(Timing(found).rstartTime); @@ -248,25 +183,6 @@ namespace DataTimings { // METHODOLOGY EMPLOYED: // structure similar to recurring error structure. - // REFERENCES: - // na - - // USE STATEMENTS: - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - #ifdef EP_NO_Timings return; #endif @@ -275,7 +191,7 @@ namespace DataTimings { int found; // indicator for element Real64 stoptime; found = 0; - for (loop = 1; loop <= NumTimingElements; ++loop) { + for (loop = 1; loop <= state.dataTimingsData->NumTimingElements; ++loop) { if (Timing(loop).Element != ctimingElementstring) continue; found = loop; } @@ -350,25 +266,6 @@ namespace DataTimings { // METHODOLOGY EMPLOYED: // structure similar to recurring error structure. - // REFERENCES: - // na - - // Using/Aliasing - using General::RoundSigDigits; - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - #ifdef EP_NO_Timings return; #endif @@ -378,7 +275,7 @@ namespace DataTimings { print(auditFile, "Timing Element{}# calls{}Time {{s}}{}Time {{s}} (per call)\n", tabchar, tabchar, tabchar); - for (loop = 1; loop <= NumTimingElements; ++loop) { + for (loop = 1; loop <= state.dataTimingsData->NumTimingElements; ++loop) { if (Timing(loop).calls > 0) { print(auditFile, "{}{}{}{}{:.3R}{}{:.3R}\n", Timing(loop).Element, tabchar, Timing(loop).calls, tabchar, Timing(loop).currentTimeSum, tabchar, Timing(loop).currentTimeSum / double(Timing(loop).calls)); @@ -391,7 +288,7 @@ namespace DataTimings { #endif } - Real64 epGetTimeUsed(std::string const &ctimingElementstring) + Real64 epGetTimeUsed(EnergyPlusData &state, std::string const &ctimingElementstring) { // FUNCTION INFORMATION: @@ -403,37 +300,19 @@ namespace DataTimings { // PURPOSE OF THIS FUNCTION: // Provides outside function to getting time used on a particular element - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - // Using/Aliasing using DataErrorTracking::AbortProcessing; // Return value Real64 totalTimeUsed; - // Locals - // FUNCTION ARGUMENT DEFINITIONS: - - // FUNCTION PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - // FUNCTION LOCAL VARIABLE DECLARATIONS: int loop; // testing if already in structure int found; // indicator for element found = 0; - for (loop = 1; loop <= NumTimingElements; ++loop) { - if (Timing(loop).Element != ctimingElementstring) continue; + for (loop = 1; loop <= state.dataTimingsData->NumTimingElements; ++loop) { + if (state.dataTimingsData->Timing(loop).Element != ctimingElementstring) continue; found = loop; } @@ -443,12 +322,12 @@ namespace DataTimings { ShowSevereError("epGetTimeUsed: No element=" + ctimingElementstring); } - totalTimeUsed = Timing(found).currentTimeSum; + totalTimeUsed = state.dataTimingsData->Timing(found).currentTimeSum; return totalTimeUsed; } - Real64 epGetTimeUsedperCall(std::string const &ctimingElementstring) + Real64 epGetTimeUsedperCall(EnergyPlusData &state, std::string const &ctimingElementstring) { // FUNCTION INFORMATION: @@ -461,37 +340,19 @@ namespace DataTimings { // Provides outside function to getting time used on a particular element // per Call. - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - // Using/Aliasing using DataErrorTracking::AbortProcessing; // Return value Real64 averageTimeUsed; - // Locals - // FUNCTION ARGUMENT DEFINITIONS: - - // FUNCTION PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - // FUNCTION LOCAL VARIABLE DECLARATIONS: int loop; // testing if already in structure int found; // indicator for element found = 0; - for (loop = 1; loop <= NumTimingElements; ++loop) { - if (Timing(loop).Element != ctimingElementstring) continue; + for (loop = 1; loop <= state.dataTimingsData->NumTimingElements; ++loop) { + if (state.dataTimingsData->Timing(loop).Element != ctimingElementstring) continue; found = loop; } @@ -501,8 +362,8 @@ namespace DataTimings { ShowSevereError("epGetTimeUsedperCall: No element=" + ctimingElementstring); } - if (Timing(found).calls > 0) { - averageTimeUsed = Timing(found).currentTimeSum / double(Timing(found).calls); + if (state.dataTimingsData->Timing(found).calls > 0) { + averageTimeUsed = state.dataTimingsData->Timing(found).currentTimeSum / double(state.dataTimingsData->Timing(found).calls); } else { averageTimeUsed = -999.0; } @@ -510,7 +371,7 @@ namespace DataTimings { return averageTimeUsed; } - Real64 eptime() + Real64 eptime(EnergyPlusData &state) { // FUNCTION INFORMATION: @@ -525,36 +386,15 @@ namespace DataTimings { // According to Intel documentation, the "count_rate" may differ depending on // the size of the integer to receive the output. - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // USE STATEMENTS: - // na - // Return value Real64 calctime; // calculated time based on "count" and "count_rate" - // Locals - // FUNCTION ARGUMENT DEFINITIONS: - - // FUNCTION PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - // FUNCTION LOCAL VARIABLE DECLARATIONS: Int32 icount; SYSTEM_CLOCK(icount); - calctime = double(icount) / clockrate; // clockrate is set by main program. + calctime = double(icount) / state.dataTimingsData->clockrate; // clockrate is set by main program. return calctime; } @@ -572,30 +412,9 @@ namespace DataTimings { // An alternative method for timing elapsed times is to call the standard // Date_And_Time routine and set the "time". - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // USE STATEMENTS: - // na - // Return value Real64 calctime; // calculated time based on hrs, minutes, seconds, milliseconds - // Locals - // FUNCTION ARGUMENT DEFINITIONS: - - // FUNCTION PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - // FUNCTION LOCAL VARIABLE DECLARATIONS: Array1D clockvalues(8); // value(1) Current year diff --git a/src/EnergyPlus/DataTimings.hh b/src/EnergyPlus/DataTimings.hh index 66f6a3797c7..1ded98d0af8 100644 --- a/src/EnergyPlus/DataTimings.hh +++ b/src/EnergyPlus/DataTimings.hh @@ -54,9 +54,13 @@ // EnergyPlus Headers #include +#include namespace EnergyPlus { +// Forward declarations +struct EnergyPlusData; + #ifdef EP_NO_Timings #undef EP_Timings #endif @@ -68,28 +72,7 @@ namespace DataTimings { // Thus, all variables in this module must be PUBLIC. // MODULE PARAMETER DEFINITIONS: - extern int const MaxTimingStringLength; // string length for timing string array - - // DERIVED TYPE DEFINITIONS - - // INTERFACE BLOCK SPECIFICATIONS - // na - - // MODULE VARIABLE DECLARATIONS: - extern int NumTimingElements; - extern int MaxTimingElements; - extern Real64 dailyWeatherTime; - extern Real64 dailyExteriorEnergyUseTime; - extern Real64 dailyHeatBalanceTime; - extern Real64 hbdailyInit; - extern Real64 hbdailyOutSurf; - extern Real64 hbdailyInSurf; - extern Real64 hbdailyHVAC; - extern Real64 hbdailyRep; - extern Real64 clockrate; - extern bool lprocessingInputTiming; - extern bool lmanageSimulationTiming; - extern bool lcloseoutReportingTiming; + int constexpr MaxTimingStringLength () { return 250 ;} // string length for timing string array // Following for calls to routines #ifdef EP_Count_Calls @@ -127,9 +110,6 @@ namespace DataTimings { } }; - // Object Data - extern Array1D Timing; - // Functions void epStartTime(std::string const &ctimingElementstring); @@ -141,16 +121,53 @@ namespace DataTimings { void epSummaryTimes(Real64 &TimeUsed_CPUTime); - Real64 epGetTimeUsed(std::string const &ctimingElementstring); + Real64 epGetTimeUsed(EnergyPlusData &state, std::string const &ctimingElementstring); - Real64 epGetTimeUsedperCall(std::string const &ctimingElementstring); + Real64 epGetTimeUsedperCall(EnergyPlusData &state, std::string const &ctimingElementstring); - Real64 eptime(); + Real64 eptime(EnergyPlusData &state); Real64 epElapsedTime(); } // namespace DataTimings +struct DataTimingsData : BaseGlobalStruct { + + int NumTimingElements = 0; + int MaxTimingElements = 0; + Real64 dailyWeatherTime = 0.0; + Real64 dailyExteriorEnergyUseTime = 0.0; + Real64 dailyHeatBalanceTime = 0.0; + Real64 hbdailyInit = 0.0; + Real64 hbdailyOutSurf = 0.0; + Real64 hbdailyInSurf = 0.0; + Real64 hbdailyHVAC = 0.0; + Real64 hbdailyRep = 0.0; + Real64 clockrate = 0.0; + bool lprocessingInputTiming = false; + bool lmanageSimulationTiming = false; + bool lcloseoutReportingTiming = false; + Array1D Timing; + + void clear_state() override { + this->NumTimingElements = 0; + this->MaxTimingElements = 0; + this->dailyWeatherTime = 0.0; + this->dailyExteriorEnergyUseTime = 0.0; + this->dailyHeatBalanceTime = 0.0; + this->hbdailyInit = 0.0; + this->hbdailyOutSurf = 0.0; + this->hbdailyInSurf = 0.0; + this->hbdailyHVAC = 0.0; + this->hbdailyRep = 0.0; + this->clockrate = 0.0; + this->lprocessingInputTiming = false; + this->lmanageSimulationTiming = false; + this->lcloseoutReportingTiming = false; + this->Timing.deallocate(); + } +}; + } // namespace EnergyPlus #endif