From 018b6f647bd04eedc9311bf6b4651ec7d0fd27b9 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 13 Dec 2023 09:41:23 -0700 Subject: [PATCH 01/25] Initial method. --- src/HPWH.cc | 197 ++++++++++++++++++++++++++++++++++++++++++- src/HPWH.hh | 3 + src/HPWHschedules.cc | 134 +++++++++++++++++++++++++++++ 3 files changed, 333 insertions(+), 1 deletion(-) create mode 100644 src/HPWHschedules.cc diff --git a/src/HPWH.cc b/src/HPWH.cc index fa0ca123..9b577d99 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -3934,4 +3934,199 @@ int HPWH::HPWHinit_file(string configFile) { simHasFailed = false; return 0; } -#endif \ No newline at end of file +#endif + +// this function reads the named schedule into the provided array +int readSchedule(HPWH::schedule &scheduleArray, string scheduleFileName, long minutesOfTest) { + int minuteHrTmp; + bool hourInput; + string line, snippet, s, minORhr; + double valTmp; + std::ifstream inputFile(scheduleFileName.c_str()); + //open the schedule file provided + cout << "Opening " << scheduleFileName << '\n'; + + if(!inputFile.is_open()) { + return 1; + } + + inputFile >> snippet >> valTmp; + // cout << "snippet " << snippet << " valTmp"<< valTmp<<'\n'; + + if(snippet != "default") { + cout << "First line of " << scheduleFileName << " must specify default\n"; + return 1; + } + // cout << valTmp << " minutes = " << minutesOfTest << "\n"; + + // Fill with the default value + scheduleArray.assign(minutesOfTest, valTmp); + + // Burn the first two lines + std::getline(inputFile, line); + std::getline(inputFile, line); + + std::stringstream ss(line); // Will parse with a stringstream + // Grab the first token, which is the minute or hour marker + ss >> minORhr; + if (minORhr.empty() ) { // If nothing left in the file + return 0; + } + hourInput = tolower(minORhr.at(0)) == 'h'; + char c; // to eat the commas nom nom + // Read all the exceptions to the default value + while (inputFile >> minuteHrTmp >> c >> valTmp) { + + if (minuteHrTmp >= (int)scheduleArray.size()) { + cout << "In " << scheduleFileName << " the input file has more minutes than the test was defined with\n"; + return 1; + } + // Update the value + if (!hourInput) { + scheduleArray[minuteHrTmp] = valTmp; + } + else if (hourInput) { + for (int j = minuteHrTmp * 60; j < (minuteHrTmp+1) * 60; j++) { + scheduleArray[j] = valTmp; + //cout << "minute " << j-(minuteHrTmp) * 60 << " of hour" << (minuteHrTmp)<<"\n"; + } + } + } + + inputFile.close(); + return 0; +} + +bool HPWH::readSchedules(const std::string &testDirectory, std::vector &allSchedules) +{ + std::ifstream controlFile; + std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; + // Read the test control file + controlFile.open(fileToOpen.c_str()); + if(!controlFile.is_open()) { + cout << "Could not open control file " << fileToOpen << "\n"; + return false; + } + double outputCode = 0; + double minutesToRun = 0; + double newSetpoint = 0.; + double initialTankT_C = 0.; + double doCondu = 1; + double doInvMix = 1; + double inletH = 0.; + double newTankSize = 0.; + double tot_limit = 0.; + bool useSoC = false; + bool hasInitialTankTemp = false; + //cout << "Running: " << input2 << ", " << input1 << ", " << input3 << endl; + + std::string var1; + double testVal; + while(controlFile >> var1 >> testVal) { + if(var1 == "setpoint") { // If a setpoint was specified then override the default + newSetpoint = testVal; + } + else if(var1 == "length_of_test") { + minutesToRun = (int) testVal; + } + else if(var1 == "doInversionMixing") { + doInvMix = (testVal > 0.0) ? 1 : 0; + } + else if(var1 == "doConduction") { + doCondu = (testVal > 0.0) ? 1 : 0; + } + else if(var1 == "inletH") { + inletH = testVal; + } + else if(var1 == "tanksize") { + newTankSize = testVal; + } + else if(var1 == "tot_limit") { + tot_limit = testVal; + } + else if(var1 == "useSoC") { + useSoC = (bool)testVal; + } + if(var1 == "initialTankT_C") { // Initialize at this temperature instead of setpoint + initialTankT_C = testVal; + hasInitialTankTemp = true; + } + else { + cout << var1 << " in testInfo.txt is an unrecogized key.\n"; + } + } + + if(minutesToRun == 0) { + cout << "Error, must record length_of_test in testInfo.txt file\n"; + exit(1); + } + + // ------------------------------------- Read Schedules--------------------------------------- // + std::vector scheduleNames; + scheduleNames.push_back("inletT"); + scheduleNames.push_back("draw"); + scheduleNames.push_back("ambientT"); + scheduleNames.push_back("evaporatorT"); + scheduleNames.push_back("DR"); + scheduleNames.push_back("setpoint"); + scheduleNames.push_back("SoC"); + + for(auto i = 0; (unsigned)i < scheduleNames.size(); i++) { + fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; + outputCode = readSchedule(allSchedules[i], fileToOpen, minutesToRun); + if(outputCode != 0) { + if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { + cout << "readSchedule returns an error on " << scheduleNames[i] << " schedule!\n"; + return false; + } + else { + outputCode = 0; + } + } + } + + if (doInvMix == 0) { + outputCode += setDoInversionMixing(false); + } + + if (doCondu == 0) { + outputCode += setDoConduction(false); + } + if (newSetpoint > 0) { + if (!allSchedules[5].empty()) { + setSetpoint(allSchedules[5][0]); //expect this to fail sometimes + if (hasInitialTankTemp) + setTankToTemperature(initialTankT_C); + else + resetTankToSetpoint(); + } + else { + setSetpoint(newSetpoint); + if (hasInitialTankTemp) + setTankToTemperature(initialTankT_C); + else + resetTankToSetpoint(); + } + } + if (inletH > 0) { + outputCode += setInletByFraction(inletH); + } + if (newTankSize > 0) { + setTankSize(newTankSize, HPWH::UNITS_GAL); + } + if (tot_limit > 0) { + outputCode += setTimerLimitTOT(tot_limit); + } + if (useSoC) { + if (allSchedules[6].empty()) { + cout << "If useSoC is true need an SoCschedule.csv file \n"; + } + outputCode += switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); + } + + if (outputCode != 0) { + cout << "Control file testInfo.txt has unsettable specifics in it. \n"; + return false; + } + return true; +} \ No newline at end of file diff --git a/src/HPWH.hh b/src/HPWH.hh index a7f773e8..0d0942c4 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -820,6 +820,9 @@ public: /// Addition of extra heat handled separately from normal heat sources void addExtraHeatAboveNode(double qAdd_kJ,const int nodeNum); + typedef std::vector schedule; + bool readSchedules(const std::string &testDirectory, std::vector &allSchedules); + private: class HeatSource; diff --git a/src/HPWHschedules.cc b/src/HPWHschedules.cc new file mode 100644 index 00000000..1edd0fe7 --- /dev/null +++ b/src/HPWHschedules.cc @@ -0,0 +1,134 @@ + + typedef std::vector schedule; + + bool readTestSchedules(const std::string &testDirectory, std::vector &allSchedules) + { + + // Read the test control file + fileToOpen = testDirectory + "/" + "testInfo.txt"; + controlFile.open(fileToOpen.c_str()); + if(!controlFile.is_open()) { + cout << "Could not open control file " << fileToOpen << "\n"; + exit(1); + } + outputCode = 0; + minutesToRun = 0; + newSetpoint = 0.; + initialTankT_C = 0.; + doCondu = 1; + doInvMix = 1; + inletH = 0.; + newTankSize = 0.; + tot_limit = 0.; + useSoC = false; + bool hasInitialTankTemp = false; + cout << "Running: " << input2 << ", " << input1 << ", " << input3 << endl; + + while(controlFile >> var1 >> testVal) { + if(var1 == "setpoint") { // If a setpoint was specified then override the default + newSetpoint = testVal; + } + else if(var1 == "length_of_test") { + minutesToRun = (int) testVal; + } + else if(var1 == "doInversionMixing") { + doInvMix = (testVal > 0.0) ? 1 : 0; + } + else if(var1 == "doConduction") { + doCondu = (testVal > 0.0) ? 1 : 0; + } + else if(var1 == "inletH") { + inletH = testVal; + } + else if(var1 == "tanksize") { + newTankSize = testVal; + } + else if(var1 == "tot_limit") { + tot_limit = testVal; + } + else if(var1 == "useSoC") { + useSoC = (bool)testVal; + } + if(var1 == "initialTankT_C") { // Initialize at this temperature instead of setpoint + initialTankT_C = testVal; + hasInitialTankTemp = true; + } + else { + cout << var1 << " in testInfo.txt is an unrecogized key.\n"; + } + } + + if(minutesToRun == 0) { + cout << "Error, must record length_of_test in testInfo.txt file\n"; + exit(1); + } + + // ------------------------------------- Read Schedules--------------------------------------- // + scheduleNames.push_back("inletT"); + scheduleNames.push_back("draw"); + scheduleNames.push_back("ambientT"); + scheduleNames.push_back("evaporatorT"); + scheduleNames.push_back("DR"); + scheduleNames.push_back("setpoint"); + scheduleNames.push_back("SoC"); + + for(i = 0; (unsigned)i < scheduleNames.size(); i++) { + fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; + outputCode = readSchedule(allSchedules[i], fileToOpen, minutesToRun); + if(outputCode != 0) { + if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { + cout << "readSchedule returns an error on " << scheduleNames[i] << " schedule!\n"; + exit(1); + } + else { + outputCode = 0; + } + } + } + + + if (doInvMix == 0) { + outputCode += hpwh.setDoInversionMixing(false); + } + + if (doCondu == 0) { + outputCode += hpwh.setDoConduction(false); + } + if (newSetpoint > 0) { + if (!allSchedules[5].empty()) { + hpwh.setSetpoint(allSchedules[5][0]); //expect this to fail sometimes + if (hasInitialTankTemp) + hpwh.setTankToTemperature(initialTankT_C); + else + hpwh.resetTankToSetpoint(); + } + else { + hpwh.setSetpoint(newSetpoint); + if (hasInitialTankTemp) + hpwh.setTankToTemperature(initialTankT_C); + else + hpwh.resetTankToSetpoint(); + } + } + if (inletH > 0) { + outputCode += hpwh.setInletByFraction(inletH); + } + if (newTankSize > 0) { + hpwh.setTankSize(newTankSize, HPWH::UNITS_GAL); + } + if (tot_limit > 0) { + outputCode += hpwh.setTimerLimitTOT(tot_limit); + } + if (useSoC) { + if (allSchedules[6].empty()) { + cout << "If useSoC is true need an SoCschedule.csv file \n"; + } + outputCode += hpwh.switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); + } + + if (outputCode != 0) { + cout << "Control file testInfo.txt has unsettable specifics in it. \n"; + return false; + } + return true; +} \ No newline at end of file From d0ffafd4691028dcf5df167950a17cfda4636ac2 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 13 Dec 2023 11:47:40 -0700 Subject: [PATCH 02/25] Moved readSchedules to HPWH. --- src/HPWH.cc | 109 ++++---- src/HPWH.hh | 23 +- test/main.cc | 688 ++++++++++++++++++--------------------------------- 3 files changed, 317 insertions(+), 503 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 9b577d99..17cd1a39 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -1362,12 +1362,12 @@ int HPWH::setTankSize(double HPWH_size,UNITS units /*=UNITS_L*/,bool forceChange return 0; } -int HPWH::setDoInversionMixing(bool doInvMix) { - this->doInversionMixing = doInvMix; +int HPWH::setDoInversionMixing(bool doInversionMixing_in) { + doInversionMixing = doInversionMixing_in; return 0; } -int HPWH::setDoConduction(bool doCondu) { - this->doConduction = doCondu; +int HPWH::setDoConduction(bool doConduction_in) { + doConduction = doConduction_in; return 0; } @@ -3936,8 +3936,8 @@ int HPWH::HPWHinit_file(string configFile) { } #endif -// this function reads the named schedule into the provided array -int readSchedule(HPWH::schedule &scheduleArray, string scheduleFileName, long minutesOfTest) { +// reads the named schedule into the provided array +int readSchedule(HPWH::Schedule &scheduleArray, string scheduleFileName, long minutesOfTest) { int minuteHrTmp; bool hourInput; string line, snippet, s, minORhr; @@ -3997,7 +3997,7 @@ int readSchedule(HPWH::schedule &scheduleArray, string scheduleFileName, long mi return 0; } -bool HPWH::readSchedules(const std::string &testDirectory, std::vector &allSchedules) +bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo &controlInfo) { std::ifstream controlFile; std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; @@ -4007,61 +4007,66 @@ bool HPWH::readSchedules(const std::string &testDirectory, std::vector> var1 >> testVal) { if(var1 == "setpoint") { // If a setpoint was specified then override the default - newSetpoint = testVal; + controlInfo.newSetpoint = testVal; } else if(var1 == "length_of_test") { - minutesToRun = (int) testVal; + controlInfo.minutesToRun = (int) testVal; } else if(var1 == "doInversionMixing") { - doInvMix = (testVal > 0.0) ? 1 : 0; + controlInfo.doInvMix = (testVal > 0.0) ? 1 : 0; } else if(var1 == "doConduction") { - doCondu = (testVal > 0.0) ? 1 : 0; + controlInfo.doCondu = (testVal > 0.0) ? 1 : 0; } else if(var1 == "inletH") { - inletH = testVal; + controlInfo.inletH = testVal; } else if(var1 == "tanksize") { - newTankSize = testVal; + controlInfo.newTankSize = testVal; } else if(var1 == "tot_limit") { - tot_limit = testVal; + controlInfo.tot_limit = testVal; } else if(var1 == "useSoC") { - useSoC = (bool)testVal; + controlInfo.useSoC = (bool)testVal; } if(var1 == "initialTankT_C") { // Initialize at this temperature instead of setpoint - initialTankT_C = testVal; - hasInitialTankTemp = true; + controlInfo.initialTankT_C = testVal; + controlInfo.hasInitialTankTemp = true; } else { cout << var1 << " in testInfo.txt is an unrecogized key.\n"; } } - if(minutesToRun == 0) { + if(controlInfo.minutesToRun == 0) { cout << "Error, must record length_of_test in testInfo.txt file\n"; - exit(1); + return false; } - // ------------------------------------- Read Schedules--------------------------------------- // + return true; +} + +bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlInfo &controlInfo, std::vector &allSchedules) +{ std::vector scheduleNames; scheduleNames.push_back("inletT"); scheduleNames.push_back("draw"); @@ -4071,9 +4076,12 @@ bool HPWH::readSchedules(const std::string &testDirectory, std::vector 0) { + if (controlInfo.newSetpoint > 0) { if (!allSchedules[5].empty()) { setSetpoint(allSchedules[5][0]); //expect this to fail sometimes - if (hasInitialTankTemp) - setTankToTemperature(initialTankT_C); + if (controlInfo.hasInitialTankTemp) + setTankToTemperature(controlInfo.initialTankT_C); else resetTankToSetpoint(); } else { - setSetpoint(newSetpoint); - if (hasInitialTankTemp) - setTankToTemperature(initialTankT_C); + setSetpoint(controlInfo.newSetpoint); + if (controlInfo.hasInitialTankTemp) + setTankToTemperature(controlInfo.initialTankT_C); else resetTankToSetpoint(); } } - if (inletH > 0) { - outputCode += setInletByFraction(inletH); + if (controlInfo.inletH > 0) { + outputCode += setInletByFraction(controlInfo.inletH); } - if (newTankSize > 0) { - setTankSize(newTankSize, HPWH::UNITS_GAL); + if (controlInfo.newTankSize > 0) { + setTankSize(controlInfo.newTankSize, HPWH::UNITS_GAL); } - if (tot_limit > 0) { - outputCode += setTimerLimitTOT(tot_limit); + if (controlInfo.tot_limit > 0) { + outputCode += setTimerLimitTOT(controlInfo.tot_limit); } - if (useSoC) { + if (controlInfo.useSoC) { if (allSchedules[6].empty()) { cout << "If useSoC is true need an SoCschedule.csv file \n"; } + const double soCMinTUse_C = F_TO_C(110.); + const double soCMains_C = F_TO_C(65.); outputCode += switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); } diff --git a/src/HPWH.hh b/src/HPWH.hh index 0d0942c4..1a8d0009 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -576,10 +576,10 @@ public: double getTankSize(UNITS units = UNITS_L) const; /**< returns the tank volume in L or GAL */ - int setDoInversionMixing(bool doInvMix); + int setDoInversionMixing(bool doInversionMixing_in); /**< This is a simple setter for the logical for running the inversion mixing method, default is true */ - int setDoConduction(bool doCondu); + int setDoConduction(bool doConduction_in); /**< This is a simple setter for doing internal conduction and nodal heatloss, default is true*/ int setUA(double UA,UNITS units = UNITS_kJperHrC); @@ -820,8 +820,23 @@ public: /// Addition of extra heat handled separately from normal heat sources void addExtraHeatAboveNode(double qAdd_kJ,const int nodeNum); - typedef std::vector schedule; - bool readSchedules(const std::string &testDirectory, std::vector &allSchedules); + struct ControlInfo{ + double outputCode = 0; + long minutesToRun = 0; + double newSetpoint = 0.; + double initialTankT_C = 0.; + double doCondu = 1; + double doInvMix = 1; + double inletH = 0.; + double newTankSize = 0.; + double tot_limit = 0.; + bool useSoC = false; + bool hasInitialTankTemp = false; + }; + bool readControlInfo(const std::string &testDirectory, ControlInfo &controlInfo); + + typedef std::vector Schedule; + bool readSchedules(const std::string &testDirectory, const ControlInfo &controlInfo, std::vector &allSchedules); private: class HeatSource; diff --git a/test/main.cc b/test/main.cc index 76c1bebe..08016a37 100644 --- a/test/main.cc +++ b/test/main.cc @@ -22,479 +22,267 @@ using std::cout; using std::endl; using std::string; using std::ifstream; -//using std::ofstream; - -typedef std::vector schedule; - -int readSchedule(schedule &scheduleArray, string scheduleFileName, long minutesOfTest); - -int main(int argc, char *argv[]) -{ - HPWH hpwh; - - HPWH::DRMODES drStatus = HPWH::DR_ALLOW; - HPWH::MODELS model; - //HPWH::CSVOPTIONS IP = HPWH::CSVOPT_IPUNITS; // CSVOPT_NONE or CSVOPT_IPUNITS - // HPWH::UNITS units = HPWH::UNITS_F; - - const double EBALTHRESHOLD = 0.005; - - const int nTestTCouples = 6; - - const double soCMinTUse_C = F_TO_C(110.); - const double soCMains_C = F_TO_C(65.); - - // Schedule stuff - std::vector scheduleNames; - std::vector allSchedules(7); - - string testDirectory, fileToOpen, fileToOpen2, scheduleName, var1, input1, input2, input3, inputFile, outputDirectory; - string inputVariableName, firstCol; - double testVal, newSetpoint, airTemp, airTemp2, tempDepressThresh, inletH, newTankSize, tot_limit, initialTankT_C; - bool useSoC; - int i, outputCode; - long minutesToRun; - - double cumHeatIn[3] = { 0,0,0 }; - double cumHeatOut[3] = { 0,0,0 }; - - bool HPWH_doTempDepress; - int doInvMix, doCondu; - - FILE * outputFile = NULL; - FILE * yearOutFile = NULL; - ifstream controlFile; - - string strPreamble; - string strHead = "minutes,Ta,Tsetpoint,inletT,draw,"; - string strHeadMP = "condenserInletT,condenserOutletT,externalVolGPM,"; - string strHeadSoC = "targetSoCFract,soCFract,"; -#if defined _DEBUG - hpwh.setVerbosity(HPWH::VRB_reluctant); -#endif - - //....................................... - //process command line arguments - //....................................... - - cout << "Testing HPWHsim version " << HPWH::getVersion() << endl; - - //Obvious wrong number of command line arguments - if ((argc > 6)) { - cout << "Invalid input. This program takes FOUR arguments: model specification type (ie. Preset or File), model specification (ie. Sanden80), test name (ie. test50) and output directory\n"; - exit(1); - } - //Help message - if(argc > 1) { - input1 = argv[1]; - input2 = argv[2]; - input3 = argv[3]; - outputDirectory = argv[4]; - } else { - input1 = "asdf"; // Makes the next conditional not crash... a little clumsy but whatever - input2 = "def"; - input3 = "ghi"; - outputDirectory = "."; - } - if (argc < 5 || (argc > 6) || (input1 == "?") || (input1 == "help")) { - cout << "Standard usage: \"hpwhTestTool.x [model spec type Preset/File] [model spec Name] [testName] [airtemp override F (optional)]\"\n"; - cout << "All input files should be located in the test directory, with these names:\n"; - cout << "drawschedule.csv DRschedule.csv ambientTschedule.csv evaporatorTschedule.csv inletTschedule.csv hpwhProperties.csv\n"; - cout << "An output file, `modelname'Output.csv, will be written in the test directory\n"; - exit(1); - } - - if(argc == 6) { - airTemp = std::stoi(argv[5]); - HPWH_doTempDepress = true; - } else { - airTemp = 0; - HPWH_doTempDepress = false; - } - - //Only input file specified -- don't suffix with .csv - testDirectory = input3; - - // Parse the model - newSetpoint = 0; - if(input1 == "Preset") { - inputFile = ""; - - if (getHPWHObject(hpwh, input2) == HPWH::HPWH_ABORT) { - cout << "Error, preset model did not initialize.\n"; + +int main(int argc, char *argv[]){ + HPWH hpwh; + + HPWH::DRMODES drStatus = HPWH::DR_ALLOW; + HPWH::MODELS model; + + const int nTestTCouples = 6; + + string var1, inputFile; + string inputVariableName, firstCol; + + double cumHeatIn[3] = { 0,0,0 }; + double cumHeatOut[3] = { 0,0,0 }; + + FILE * outputFile = NULL; + FILE * yearOutFile = NULL; + ifstream controlFile; + + string strPreamble; + string strHead = "minutes,Ta,Tsetpoint,inletT,draw,"; + string strHeadMP = "condenserInletT,condenserOutletT,externalVolGPM,"; + string strHeadSoC = "targetSoCFract,soCFract,"; + + // process command line arguments + cout << "Testing HPWHsim version " << HPWH::getVersion() << endl; + + // Obvious wrong number of command line arguments + if ((argc > 6)) { + cout << "Invalid input. This program takes FOUR arguments: model specification type (ie. Preset or File), model specification (ie. Sanden80), test name (ie. test50) and output directory\n"; exit(1); } - - model = static_cast (hpwh.getHPWHModel()); - - if(model == HPWH::MODELS_Sanden80 || model == HPWH::MODELS_Sanden40) { - newSetpoint = (149 - 32) / 1.8; - } - } else if (input1 == "File") { - inputFile = input2 + ".txt"; - if (hpwh.HPWHinit_file(inputFile) != 0) exit(1); - } - else { - cout << "Invalid argument, received '"<< input1 << "', expected 'Preset' or 'File'.\n"; - exit(1); - } - -// hpwh.HPWHinit_resSwingTank(80., .95, 0., 10000., F_TO_C(125.)); - - // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C to better - // try and trigger the lockout and hysteresis conditions - tempDepressThresh = 4; - hpwh.setMaxTempDepression(tempDepressThresh); - hpwh.setDoTempDepression(HPWH_doTempDepress); - - // Read the test control file - fileToOpen = testDirectory + "/" + "testInfo.txt"; - controlFile.open(fileToOpen.c_str()); - if(!controlFile.is_open()) { - cout << "Could not open control file " << fileToOpen << "\n"; - exit(1); - } - outputCode = 0; - minutesToRun = 0; - newSetpoint = 0.; - initialTankT_C = 0.; - doCondu = 1; - doInvMix = 1; - inletH = 0.; - newTankSize = 0.; - tot_limit = 0.; - useSoC = false; - bool hasInitialTankTemp = false; - cout << "Running: " << input2 << ", " << input1 << ", " << input3 << endl; - - while(controlFile >> var1 >> testVal) { - if(var1 == "setpoint") { // If a setpoint was specified then override the default - newSetpoint = testVal; - } - else if(var1 == "length_of_test") { - minutesToRun = (int) testVal; - } - else if(var1 == "doInversionMixing") { - doInvMix = (testVal > 0.0) ? 1 : 0; + // Help message + std::string input1, input2, input3; + std::string outputDirectory; + if(argc > 1) { + input1 = argv[1]; + input2 = argv[2]; + input3 = argv[3]; + outputDirectory = argv[4]; + } else { + input1 = "asdf"; // Makes the next conditional not crash... a little clumsy but whatever + input2 = "def"; + input3 = "ghi"; + outputDirectory = "."; } - else if(var1 == "doConduction") { - doCondu = (testVal > 0.0) ? 1 : 0; + if (argc < 5 || (argc > 6) || (input1 == "?") || (input1 == "help")) { + cout << "Standard usage: \"hpwhTestTool.x [model spec type Preset/File] [model spec Name] [testName] [airtemp override F (optional)]\"\n"; + cout << "All input files should be located in the test directory, with these names:\n"; + cout << "drawschedule.csv DRschedule.csv ambientTschedule.csv evaporatorTschedule.csv inletTschedule.csv hpwhProperties.csv\n"; + cout << "An output file, `modelname'Output.csv, will be written in the test directory\n"; + exit(1); } - else if(var1 == "inletH") { - inletH = testVal; + + double airTemp; + bool HPWH_doTempDepress; + if(argc == 6) { + airTemp = std::stoi(argv[5]); + HPWH_doTempDepress = true; + } else { + airTemp = 0; + HPWH_doTempDepress = false; } - else if(var1 == "tanksize") { - newTankSize = testVal; + + // Only input file specified -- don't suffix with .csv + std::string testDirectory = input3; + + // Parse the model + HPWH::ControlInfo controlInfo; + controlInfo.newSetpoint = 0.; + if(input1 == "Preset") { + inputFile = ""; + if (getHPWHObject(hpwh, input2) == HPWH::HPWH_ABORT) { + cout << "Error, preset model did not initialize.\n"; + exit(1); + } + + model = static_cast (hpwh.getHPWHModel()); + if(model == HPWH::MODELS_Sanden80 || model == HPWH::MODELS_Sanden40) { + controlInfo.newSetpoint = F_TO_C(149.); + } + } else if (input1 == "File") { + inputFile = input2 + ".txt"; + if (hpwh.HPWHinit_file(inputFile) != 0) exit(1); } - else if(var1 == "tot_limit") { - tot_limit = testVal; + else { + cout << "Invalid argument, received '"<< input1 << "', expected 'Preset' or 'File'.\n"; + exit(1); } - else if(var1 == "useSoC") { - useSoC = (bool)testVal; + + // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C to better + // try and trigger the lockout and hysteresis conditions + double tempDepressThresh = 4.; + hpwh.setMaxTempDepression(tempDepressThresh); + hpwh.setDoTempDepression(HPWH_doTempDepress); + + if(!hpwh.readControlInfo(testDirectory,controlInfo)){ + cout << "Control file testInfo.txt has unsettable specifics in it. \n"; + exit(1); } - if(var1 == "initialTankT_C") { // Initialize at this temperature instead of setpoint - initialTankT_C = testVal; - hasInitialTankTemp = true; - } - else { - cout << var1 << " in testInfo.txt is an unrecogized key.\n"; + + std::vector allSchedules; + if (!(hpwh.readSchedules(testDirectory,controlInfo,allSchedules))) { + exit(1); } - } - - if(minutesToRun == 0) { - cout << "Error, must record length_of_test in testInfo.txt file\n"; - exit(1); - } - - // ------------------------------------- Read Schedules--------------------------------------- // - scheduleNames.push_back("inletT"); - scheduleNames.push_back("draw"); - scheduleNames.push_back("ambientT"); - scheduleNames.push_back("evaporatorT"); - scheduleNames.push_back("DR"); - scheduleNames.push_back("setpoint"); - scheduleNames.push_back("SoC"); - - for(i = 0; (unsigned)i < scheduleNames.size(); i++) { - fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; - outputCode = readSchedule(allSchedules[i], fileToOpen, minutesToRun); - if(outputCode != 0) { - if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { - cout << "readSchedule returns an error on " << scheduleNames[i] << " schedule!\n"; + + // ----------------------Open the Output Files and Print the Header---------------------------- // + if (controlInfo.minutesToRun > 500000.) { + std::string fileToOpen = outputDirectory + "/DHW_YRLY.csv"; + + if (fopen_s(&yearOutFile, fileToOpen.c_str(), "a+") != 0) { + cout << "Could not open output file " << fileToOpen << "\n"; exit(1); } - else { - outputCode = 0; + } + else { + std::string fileToOpen = outputDirectory + "/" + input3 + "_" + input1 + "_" + input2 + ".csv"; + + if (fopen_s(&outputFile, fileToOpen.c_str(), "w+") != 0) { + cout << "Could not open output file " << fileToOpen << "\n"; + exit(1); } - } - } - - - if (doInvMix == 0) { - outputCode += hpwh.setDoInversionMixing(false); - } - - if (doCondu == 0) { - outputCode += hpwh.setDoConduction(false); - } - if (newSetpoint > 0) { - if (!allSchedules[5].empty()) { - hpwh.setSetpoint(allSchedules[5][0]); //expect this to fail sometimes - if (hasInitialTankTemp) - hpwh.setTankToTemperature(initialTankT_C); - else - hpwh.resetTankToSetpoint(); - } - else { - hpwh.setSetpoint(newSetpoint); - if (hasInitialTankTemp) - hpwh.setTankToTemperature(initialTankT_C); - else - hpwh.resetTankToSetpoint(); - } - } - if (inletH > 0) { - outputCode += hpwh.setInletByFraction(inletH); - } - if (newTankSize > 0) { - hpwh.setTankSize(newTankSize, HPWH::UNITS_GAL); - } - if (tot_limit > 0) { - outputCode += hpwh.setTimerLimitTOT(tot_limit); - } - if (useSoC) { - if (allSchedules[6].empty()) { - cout << "If useSoC is true need an SoCschedule.csv file \n"; - } - outputCode += hpwh.switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); - } - - if (outputCode != 0) { - cout << "Control file testInfo.txt has unsettable specifics in it. \n"; - exit(1); - } - - // ----------------------Open the Output Files and Print the Header---------------------------- // - - if (minutesToRun > 500000.) { - fileToOpen = outputDirectory + "/DHW_YRLY.csv"; - - if (fopen_s(&yearOutFile, fileToOpen.c_str(), "a+") != 0) { - cout << "Could not open output file " << fileToOpen << "\n"; - exit(1); - } - } - else { - fileToOpen = outputDirectory + "/" + input3 + "_" + input1 + "_" + input2 + ".csv"; - - if (fopen_s(&outputFile, fileToOpen.c_str(), "w+") != 0) { - cout << "Could not open output file " << fileToOpen << "\n"; - exit(1); - } - string header = strHead; - if (hpwh.isCompressoExternalMultipass()) { - header += strHeadMP; - } - if(useSoC){ - header += strHeadSoC; - } - int csvOptions = HPWH::CSVOPT_NONE; - hpwh.WriteCSVHeading(outputFile, header.c_str(), nTestTCouples, csvOptions); - } - - // ------------------------------------- Simulate --------------------------------------- // - cout << "Now Simulating " << minutesToRun << " Minutes of the Test\n"; - - std::vector nodeExtraHeat_W; - std::vector* vectptr = NULL; - // Loop over the minutes in the test - for (i = 0; i < minutesToRun; i++) { - -#if defined _DEBUG && 0 - cout << "Now on minute: " << i << "\n"; -#endif - - if (HPWH_doTempDepress) { - airTemp2 = F_TO_C(airTemp); - } - else { - airTemp2 = allSchedules[2][i]; - } - - double tankHCStart = hpwh.getTankHeatContent_kJ(); - - // Process the dr status - drStatus = static_cast(int(allSchedules[4][i])); - - // Change setpoint if there is a setpoint schedule. - if (!allSchedules[5].empty() && !hpwh.isSetpointFixed()) { - hpwh.setSetpoint(allSchedules[5][i]); //expect this to fail sometimes - } - - // Change SoC schedule - if (useSoC) { - if (hpwh.setTargetSoCFraction(allSchedules[6][i]) != 0) { - cout << "ERROR: Can not set the target state of charge fraction. \n"; - exit(1); - } - } - - // Mix down for yearly tests with large compressors - if (hpwh.getHPWHModel() >= 210 && minutesToRun > 500000.) { - //Do a simple mix down of the draw for the cold water temperature - if (hpwh.getSetpoint() <= 125.) { - allSchedules[1][i] *= (125. - allSchedules[0][i]) / (hpwh.getTankNodeTemp(hpwh.getNumNodes() - 1, HPWH::UNITS_F) - allSchedules[0][i]); - } - } - - // Run the step - hpwh.runOneStep(allSchedules[0][i], // Inlet water temperature (C) - GAL_TO_L(allSchedules[1][i]), // Flow in gallons - airTemp2, // Ambient Temp (C) - allSchedules[3][i], // External Temp (C) - drStatus, // DDR Status (now an enum. Fixed for now as allow) - 1. * GAL_TO_L(allSchedules[1][i]), allSchedules[0][i], - vectptr); - - if (!hpwh.isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,EBALTHRESHOLD)) { - cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; - } - - // Check timing - for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) { - if (hpwh.getNthHeatSourceRunTime(iHS) > 1) { - cout << "ERROR: On minute " << i << " heat source " << iHS << " ran for " << hpwh.getNthHeatSourceRunTime(iHS) << "minutes" << "\n"; - exit(1); - } - } - // Check flow for external MP - if (hpwh.isCompressoExternalMultipass()) { - double volumeHeated_Gal = hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL); - double mpFlowVolume_Gal = hpwh.getExternalMPFlowRate(HPWH::UNITS_GPM)*hpwh.getNthHeatSourceRunTime(hpwh.getCompressorIndex()); - if (fabs(volumeHeated_Gal - mpFlowVolume_Gal) > 0.000001) { - cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [Gal]: " << volumeHeated_Gal << ", mpFlowRate in 1 minute [Gal]: " - << mpFlowVolume_Gal << "\n"; - exit(1); - } - } - // Recording - if (minutesToRun < 500000.) { - // Copy current status into the output file - if (HPWH_doTempDepress) { - airTemp2 = hpwh.getLocationTemp_C(); - } - strPreamble = std::to_string(i) + ", " + std::to_string(airTemp2) + ", " + std::to_string(hpwh.getSetpoint()) + ", " + - std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; - // Add some more outputs for mp tests - if (hpwh.isCompressoExternalMultipass()) { - strPreamble += std::to_string(hpwh.getCondenserWaterInletTemp()) + ", " + std::to_string(hpwh.getCondenserWaterOutletTemp()) + ", " + - std::to_string(hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; - } - if (useSoC) { - strPreamble += std::to_string(allSchedules[6][i]) + ", " + std::to_string(hpwh.getSoCFraction()) + ", "; - } - int csvOptions = HPWH::CSVOPT_NONE; - if (allSchedules[1][i] > 0.) { - csvOptions |= HPWH::CSVOPT_IS_DRAWING; - } - hpwh.WriteCSVRow(outputFile, strPreamble.c_str(), nTestTCouples, csvOptions); - } - else { - for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) { - cumHeatIn[iHS] += hpwh.getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KWH)*1000.; - cumHeatOut[iHS] += hpwh.getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH)*1000.; - } - } - } - - if (minutesToRun > 500000.) { - firstCol = input3 + "," + input1 + "," + input2; - fprintf(yearOutFile, "%s", firstCol.c_str()); - double totalIn = 0, totalOut = 0; - for (int iHS = 0; iHS < 3; iHS++) { - fprintf(yearOutFile, ",%0.0f,%0.0f", cumHeatIn[iHS], cumHeatOut[iHS]); - totalIn += cumHeatIn[iHS]; - totalOut += cumHeatOut[iHS]; - } - fprintf(yearOutFile, ",%0.0f,%0.0f", totalIn, totalOut); - for (int iHS = 0; iHS < 3; iHS++) { - fprintf(yearOutFile, ",%0.2f", cumHeatOut[iHS] /cumHeatIn[iHS]); + string header = strHead; + if (hpwh.isCompressoExternalMultipass()) { + header += strHeadMP; + } + if(controlInfo.useSoC){ + header += strHeadSoC; + } + int csvOptions = HPWH::CSVOPT_NONE; + hpwh.WriteCSVHeading(outputFile, header.c_str(), nTestTCouples, csvOptions); } - fprintf(yearOutFile, ",%0.2f", totalOut/totalIn); - fprintf(yearOutFile, "\n"); - fclose(yearOutFile); - } - else { - fclose(outputFile); - } - controlFile.close(); - return 0; + // ------------------------------------- Simulate --------------------------------------- // + cout << "Now Simulating " << controlInfo.minutesToRun << " Minutes of the Test\n"; -} + // Loop over the minutes in the test + for (int i = 0; i < controlInfo.minutesToRun; i++) { + double airTemp2; + if (HPWH_doTempDepress) { + airTemp2 = F_TO_C(airTemp); + } + else { + airTemp2 = allSchedules[2][i]; + } + // Process the dr status + drStatus = static_cast(int(allSchedules[4][i])); -// this function reads the named schedule into the provided array -int readSchedule(schedule &scheduleArray, string scheduleFileName, long minutesOfTest) { - int minuteHrTmp; - bool hourInput; - string line, snippet, s, minORhr; - double valTmp; - ifstream inputFile(scheduleFileName.c_str()); - //open the schedule file provided - cout << "Opening " << scheduleFileName << '\n'; - - if(!inputFile.is_open()) { - return 1; - } - - inputFile >> snippet >> valTmp; - // cout << "snippet " << snippet << " valTmp"<< valTmp<<'\n'; - - if(snippet != "default") { - cout << "First line of " << scheduleFileName << " must specify default\n"; - return 1; - } - // cout << valTmp << " minutes = " << minutesOfTest << "\n"; - - // Fill with the default value - scheduleArray.assign(minutesOfTest, valTmp); - - // Burn the first two lines - std::getline(inputFile, line); - std::getline(inputFile, line); - - std::stringstream ss(line); // Will parse with a stringstream - // Grab the first token, which is the minute or hour marker - ss >> minORhr; - if (minORhr.empty() ) { // If nothing left in the file - return 0; - } - hourInput = tolower(minORhr.at(0)) == 'h'; - char c; // to eat the commas nom nom - // Read all the exceptions to the default value - while (inputFile >> minuteHrTmp >> c >> valTmp) { - - if (minuteHrTmp >= (int)scheduleArray.size()) { - cout << "In " << scheduleFileName << " the input file has more minutes than the test was defined with\n"; - return 1; + // Change setpoint if there is a setpoint schedule. + bool doSetSetpoint = (!allSchedules[5].empty()) && (!hpwh.isSetpointFixed()); + if (doSetSetpoint) { + hpwh.setSetpoint(allSchedules[5][i]); //expect this to fail sometimes } - // Update the value - if (!hourInput) { - scheduleArray[minuteHrTmp] = valTmp; + + // Change SoC schedule + if (controlInfo.useSoC) { + if (hpwh.setTargetSoCFraction(allSchedules[6][i]) != 0) { + cout << "ERROR: Can not set the target state of charge fraction. \n"; + exit(1); + } } - else if (hourInput) { - for (int j = minuteHrTmp * 60; j < (minuteHrTmp+1) * 60; j++) { - scheduleArray[j] = valTmp; - //cout << "minute " << j-(minuteHrTmp) * 60 << " of hour" << (minuteHrTmp)<<"\n"; + + // Mix down for yearly tests with large compressors + if (hpwh.getHPWHModel() >= 210 && controlInfo.minutesToRun > 500000.) { + //Do a simple mix down of the draw for the cold water temperature + if (hpwh.getSetpoint() <= 125.) { + allSchedules[1][i] *= (125. - allSchedules[0][i]) / (hpwh.getTankNodeTemp(hpwh.getNumNodes() - 1, HPWH::UNITS_F) - allSchedules[0][i]); } } - } - inputFile.close(); + double tankHCStart = hpwh.getTankHeatContent_kJ(); + + // Run the step + hpwh.runOneStep( + allSchedules[0][i], // inlet water temperature (C) + GAL_TO_L(allSchedules[1][i]), // draw (gallons) + airTemp2, // ambient Temp (C) + allSchedules[3][i], // external Temp (C) + drStatus, // DDR Status (now an enum. Fixed for now as allow) + GAL_TO_L(allSchedules[1][i]), // inlet volume 2 (gallons) + allSchedules[0][i], // inlet Temp 2 (C) + NULL); // no extra heat + + const double EBALTHRESHOLD = 0.005; + if (!hpwh.isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,EBALTHRESHOLD)) { + cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; + } - return 0; + // Check timing + for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) { + if (hpwh.getNthHeatSourceRunTime(iHS) > 1) { + cout << "ERROR: On minute " << i << " heat source " << iHS << " ran for " << hpwh.getNthHeatSourceRunTime(iHS) << "minutes" << "\n"; + exit(1); + } + } + + // Check flow for external MP + if (hpwh.isCompressoExternalMultipass()) { + double volumeHeated_Gal = hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL); + double mpFlowVolume_Gal = hpwh.getExternalMPFlowRate(HPWH::UNITS_GPM)*hpwh.getNthHeatSourceRunTime(hpwh.getCompressorIndex()); + if (fabs(volumeHeated_Gal - mpFlowVolume_Gal) > 0.000001) { + cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [Gal]: " << volumeHeated_Gal << ", mpFlowRate in 1 minute [Gal]: " + << mpFlowVolume_Gal << "\n"; + exit(1); + } + } + + // Recording + if (controlInfo.minutesToRun < 500000.) { + // Copy current status into the output file + if (HPWH_doTempDepress) { + airTemp2 = hpwh.getLocationTemp_C(); + } + strPreamble = std::to_string(i) + ", " + std::to_string(airTemp2) + ", " + std::to_string(hpwh.getSetpoint()) + ", " + + std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; + // Add some more outputs for mp tests + if (hpwh.isCompressoExternalMultipass()) { + strPreamble += std::to_string(hpwh.getCondenserWaterInletTemp()) + ", " + std::to_string(hpwh.getCondenserWaterOutletTemp()) + ", " + + std::to_string(hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; + } + if (controlInfo.useSoC) { + strPreamble += std::to_string(allSchedules[6][i]) + ", " + std::to_string(hpwh.getSoCFraction()) + ", "; + } + int csvOptions = HPWH::CSVOPT_NONE; + if (allSchedules[1][i] > 0.) { + csvOptions |= HPWH::CSVOPT_IS_DRAWING; + } + hpwh.WriteCSVRow(outputFile, strPreamble.c_str(), nTestTCouples, csvOptions); + } + else { + for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) { + cumHeatIn[iHS] += hpwh.getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KWH)*1000.; + cumHeatOut[iHS] += hpwh.getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH)*1000.; + } + } + } -} \ No newline at end of file + if (controlInfo.minutesToRun > 500000.) { + firstCol = input3 + "," + input1 + "," + input2; + fprintf(yearOutFile, "%s", firstCol.c_str()); + double totalIn = 0, totalOut = 0; + for (int iHS = 0; iHS < 3; iHS++) { + fprintf(yearOutFile, ",%0.0f,%0.0f", cumHeatIn[iHS], cumHeatOut[iHS]); + totalIn += cumHeatIn[iHS]; + totalOut += cumHeatOut[iHS]; + } + fprintf(yearOutFile, ",%0.0f,%0.0f", totalIn, totalOut); + for (int iHS = 0; iHS < 3; iHS++) { + fprintf(yearOutFile, ",%0.2f", cumHeatOut[iHS] /cumHeatIn[iHS]); + } + fprintf(yearOutFile, ",%0.2f", totalOut/totalIn); + fprintf(yearOutFile, "\n"); + fclose(yearOutFile); + } + else { + fclose(outputFile); + } + controlFile.close(); + + return 0; +} From fee30c8531d359feaa87f23e3f45883497172146 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 13 Dec 2023 12:44:09 -0700 Subject: [PATCH 03/25] Clean up. --- src/HPWH.cc | 26 +++++++++++++------------- src/HPWH.hh | 6 +++--- test/main.cc | 49 ++++++++++++++++++++++++------------------------- 3 files changed, 40 insertions(+), 41 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 17cd1a39..4cf4167b 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4007,13 +4007,13 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & cout << "Could not open control file " << fileToOpen << "\n"; return false; } - controlInfo.minutesToRun = 0; - controlInfo.newSetpoint = 0.; + controlInfo.timeToRun_min = 0; + controlInfo.setpointT_C = 0.; controlInfo.initialTankT_C = 0.; controlInfo.doCondu = 1; controlInfo.doInvMix = 1; controlInfo.inletH = 0.; - controlInfo.newTankSize = 0.; + controlInfo.tankSize_gal = 0.; controlInfo.tot_limit = 0.; controlInfo.useSoC = false; controlInfo.hasInitialTankTemp = false; @@ -4025,10 +4025,10 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & double testVal; while(controlFile >> var1 >> testVal) { if(var1 == "setpoint") { // If a setpoint was specified then override the default - controlInfo.newSetpoint = testVal; + controlInfo.setpointT_C = testVal; } else if(var1 == "length_of_test") { - controlInfo.minutesToRun = (int) testVal; + controlInfo.timeToRun_min = (int) testVal; } else if(var1 == "doInversionMixing") { controlInfo.doInvMix = (testVal > 0.0) ? 1 : 0; @@ -4040,7 +4040,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & controlInfo.inletH = testVal; } else if(var1 == "tanksize") { - controlInfo.newTankSize = testVal; + controlInfo.tankSize_gal = testVal; } else if(var1 == "tot_limit") { controlInfo.tot_limit = testVal; @@ -4057,7 +4057,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & } } - if(controlInfo.minutesToRun == 0) { + if(controlInfo.timeToRun_min == 0) { cout << "Error, must record length_of_test in testInfo.txt file\n"; return false; } @@ -4077,11 +4077,11 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn scheduleNames.push_back("SoC"); allSchedules.reserve(scheduleNames.size()); - int outputCode; + int outputCode = 0; for(auto i = 0; (unsigned)i < scheduleNames.size(); i++) { std::string fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; Schedule schedule; - outputCode = readSchedule(schedule, fileToOpen, controlInfo.minutesToRun); + outputCode = readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min); if(outputCode != 0) { if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { cout << "readSchedule returns an error on " << scheduleNames[i] << " schedule!\n"; @@ -4101,7 +4101,7 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn if (controlInfo.doCondu == 0) { outputCode += setDoConduction(false); } - if (controlInfo.newSetpoint > 0) { + if (controlInfo.setpointT_C > 0) { if (!allSchedules[5].empty()) { setSetpoint(allSchedules[5][0]); //expect this to fail sometimes if (controlInfo.hasInitialTankTemp) @@ -4110,7 +4110,7 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn resetTankToSetpoint(); } else { - setSetpoint(controlInfo.newSetpoint); + setSetpoint(controlInfo.setpointT_C); if (controlInfo.hasInitialTankTemp) setTankToTemperature(controlInfo.initialTankT_C); else @@ -4120,8 +4120,8 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn if (controlInfo.inletH > 0) { outputCode += setInletByFraction(controlInfo.inletH); } - if (controlInfo.newTankSize > 0) { - setTankSize(controlInfo.newTankSize, HPWH::UNITS_GAL); + if (controlInfo.tankSize_gal > 0) { + setTankSize(controlInfo.tankSize_gal, HPWH::UNITS_GAL); } if (controlInfo.tot_limit > 0) { outputCode += setTimerLimitTOT(controlInfo.tot_limit); diff --git a/src/HPWH.hh b/src/HPWH.hh index 1a8d0009..bf9efc2a 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -822,13 +822,13 @@ public: struct ControlInfo{ double outputCode = 0; - long minutesToRun = 0; - double newSetpoint = 0.; + long timeToRun_min = 0; + double setpointT_C = 0.; double initialTankT_C = 0.; double doCondu = 1; double doInvMix = 1; double inletH = 0.; - double newTankSize = 0.; + double tankSize_gal = 0.; double tot_limit = 0.; bool useSoC = false; bool hasInitialTankTemp = false; diff --git a/test/main.cc b/test/main.cc index 08016a37..31f51eb8 100644 --- a/test/main.cc +++ b/test/main.cc @@ -26,17 +26,14 @@ using std::ifstream; int main(int argc, char *argv[]){ HPWH hpwh; - HPWH::DRMODES drStatus = HPWH::DR_ALLOW; HPWH::MODELS model; + const double energyBalThreshold = 0.005; // 0.5 % const int nTestTCouples = 6; string var1, inputFile; string inputVariableName, firstCol; - double cumHeatIn[3] = { 0,0,0 }; - double cumHeatOut[3] = { 0,0,0 }; - FILE * outputFile = NULL; FILE * yearOutFile = NULL; ifstream controlFile; @@ -77,13 +74,13 @@ int main(int argc, char *argv[]){ } double airTemp; - bool HPWH_doTempDepress; + bool doTempDepress; if(argc == 6) { airTemp = std::stoi(argv[5]); - HPWH_doTempDepress = true; + doTempDepress = true; } else { airTemp = 0; - HPWH_doTempDepress = false; + doTempDepress = false; } // Only input file specified -- don't suffix with .csv @@ -91,7 +88,7 @@ int main(int argc, char *argv[]){ // Parse the model HPWH::ControlInfo controlInfo; - controlInfo.newSetpoint = 0.; + controlInfo.setpointT_C = 0.; if(input1 == "Preset") { inputFile = ""; if (getHPWHObject(hpwh, input2) == HPWH::HPWH_ABORT) { @@ -101,7 +98,7 @@ int main(int argc, char *argv[]){ model = static_cast (hpwh.getHPWHModel()); if(model == HPWH::MODELS_Sanden80 || model == HPWH::MODELS_Sanden40) { - controlInfo.newSetpoint = F_TO_C(149.); + controlInfo.setpointT_C = F_TO_C(149.); } } else if (input1 == "File") { inputFile = input2 + ".txt"; @@ -116,7 +113,7 @@ int main(int argc, char *argv[]){ // try and trigger the lockout and hysteresis conditions double tempDepressThresh = 4.; hpwh.setMaxTempDepression(tempDepressThresh); - hpwh.setDoTempDepression(HPWH_doTempDepress); + hpwh.setDoTempDepression(doTempDepress); if(!hpwh.readControlInfo(testDirectory,controlInfo)){ cout << "Control file testInfo.txt has unsettable specifics in it. \n"; @@ -129,7 +126,7 @@ int main(int argc, char *argv[]){ } // ----------------------Open the Output Files and Print the Header---------------------------- // - if (controlInfo.minutesToRun > 500000.) { + if (controlInfo.timeToRun_min > 500000.) { std::string fileToOpen = outputDirectory + "/DHW_YRLY.csv"; if (fopen_s(&yearOutFile, fileToOpen.c_str(), "a+") != 0) { @@ -157,13 +154,16 @@ int main(int argc, char *argv[]){ } // ------------------------------------- Simulate --------------------------------------- // - cout << "Now Simulating " << controlInfo.minutesToRun << " Minutes of the Test\n"; + cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; + + double cumHeatIn[3] = { 0,0,0 }; + double cumHeatOut[3] = { 0,0,0 }; // Loop over the minutes in the test - for (int i = 0; i < controlInfo.minutesToRun; i++) { + for (int i = 0; i < controlInfo.timeToRun_min; i++) { double airTemp2; - if (HPWH_doTempDepress) { + if (doTempDepress) { airTemp2 = F_TO_C(airTemp); } else { @@ -171,7 +171,7 @@ int main(int argc, char *argv[]){ } // Process the dr status - drStatus = static_cast(int(allSchedules[4][i])); + HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); // Change setpoint if there is a setpoint schedule. bool doSetSetpoint = (!allSchedules[5].empty()) && (!hpwh.isSetpointFixed()); @@ -188,7 +188,7 @@ int main(int argc, char *argv[]){ } // Mix down for yearly tests with large compressors - if (hpwh.getHPWHModel() >= 210 && controlInfo.minutesToRun > 500000.) { + if (hpwh.getHPWHModel() >= 210 && controlInfo.timeToRun_min > 500000.) { //Do a simple mix down of the draw for the cold water temperature if (hpwh.getSetpoint() <= 125.) { allSchedules[1][i] *= (125. - allSchedules[0][i]) / (hpwh.getTankNodeTemp(hpwh.getNumNodes() - 1, HPWH::UNITS_F) - allSchedules[0][i]); @@ -204,18 +204,17 @@ int main(int argc, char *argv[]){ airTemp2, // ambient Temp (C) allSchedules[3][i], // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) - GAL_TO_L(allSchedules[1][i]), // inlet volume 2 (gallons) - allSchedules[0][i], // inlet Temp 2 (C) + GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) + allSchedules[0][i], // inlet-2 Temp (C) NULL); // no extra heat - const double EBALTHRESHOLD = 0.005; - if (!hpwh.isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,EBALTHRESHOLD)) { + if (!hpwh.isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,energyBalThreshold)) { cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; } // Check timing for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) { - if (hpwh.getNthHeatSourceRunTime(iHS) > 1) { + if (hpwh.getNthHeatSourceRunTime(iHS) > 1.) { cout << "ERROR: On minute " << i << " heat source " << iHS << " ran for " << hpwh.getNthHeatSourceRunTime(iHS) << "minutes" << "\n"; exit(1); } @@ -233,9 +232,9 @@ int main(int argc, char *argv[]){ } // Recording - if (controlInfo.minutesToRun < 500000.) { + if (controlInfo.timeToRun_min < 500000.) { // Copy current status into the output file - if (HPWH_doTempDepress) { + if (doTempDepress) { airTemp2 = hpwh.getLocationTemp_C(); } strPreamble = std::to_string(i) + ", " + std::to_string(airTemp2) + ", " + std::to_string(hpwh.getSetpoint()) + ", " + @@ -250,7 +249,7 @@ int main(int argc, char *argv[]){ } int csvOptions = HPWH::CSVOPT_NONE; if (allSchedules[1][i] > 0.) { - csvOptions |= HPWH::CSVOPT_IS_DRAWING; + csvOptions |= HPWH::CSVOPT_IS_DRAWING; } hpwh.WriteCSVRow(outputFile, strPreamble.c_str(), nTestTCouples, csvOptions); } @@ -262,7 +261,7 @@ int main(int argc, char *argv[]){ } } - if (controlInfo.minutesToRun > 500000.) { + if (controlInfo.timeToRun_min > 500000.) { firstCol = input3 + "," + input1 + "," + input2; fprintf(yearOutFile, "%s", firstCol.c_str()); double totalIn = 0, totalOut = 0; From 5f44ea6f3923e06e6c15122aa4c01263279138f5 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 13 Dec 2023 13:44:49 -0700 Subject: [PATCH 04/25] Clean up. --- src/HPWH.cc | 6 ++-- test/main.cc | 83 +++++++++++++++++++++++----------------------------- 2 files changed, 40 insertions(+), 49 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 4cf4167b..52a9cb53 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -1545,9 +1545,9 @@ int HPWH::getInletHeight(int whichInlet) const { int HPWH::setMaxTempDepression(double maxDepression,UNITS units /*=UNITS_C*/) { if(units == UNITS_C) { - this->maxDepression_C = maxDepression; + maxDepression_C = maxDepression; } else if(units == UNITS_F) { - this->maxDepression_C = F_TO_C(maxDepression); + maxDepression_C = F_TO_C(maxDepression); } else { if(hpwhVerbosity >= VRB_reluctant) { msg("Incorrect unit specification for max Temp Depression. \n"); @@ -4101,7 +4101,7 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn if (controlInfo.doCondu == 0) { outputCode += setDoConduction(false); } - if (controlInfo.setpointT_C > 0) { + if (controlInfo.setpointT_C > 0.) { if (!allSchedules[5].empty()) { setSetpoint(allSchedules[5][0]); //expect this to fail sometimes if (controlInfo.hasInitialTankTemp) diff --git a/test/main.cc b/test/main.cc index 31f51eb8..530a4241 100644 --- a/test/main.cc +++ b/test/main.cc @@ -26,12 +26,10 @@ using std::ifstream; int main(int argc, char *argv[]){ HPWH hpwh; - HPWH::MODELS model; - + const long maximumDurationNormalTest_min = 500000; const double energyBalThreshold = 0.005; // 0.5 % const int nTestTCouples = 6; - string var1, inputFile; string inputVariableName, firstCol; FILE * outputFile = NULL; @@ -52,18 +50,17 @@ int main(int argc, char *argv[]){ exit(1); } // Help message - std::string input1, input2, input3; - std::string outputDirectory; + std::string input1, input2, input3, input4; if(argc > 1) { input1 = argv[1]; input2 = argv[2]; input3 = argv[3]; - outputDirectory = argv[4]; + input4 = argv[4]; } else { input1 = "asdf"; // Makes the next conditional not crash... a little clumsy but whatever input2 = "def"; input3 = "ghi"; - outputDirectory = "."; + input4 = "."; } if (argc < 5 || (argc > 6) || (input1 == "?") || (input1 == "help")) { cout << "Standard usage: \"hpwhTestTool.x [model spec type Preset/File] [model spec Name] [testName] [airtemp override F (optional)]\"\n"; @@ -73,46 +70,43 @@ int main(int argc, char *argv[]){ exit(1); } - double airTemp; - bool doTempDepress; - if(argc == 6) { - airTemp = std::stoi(argv[5]); + std::string presetOrFile = input1; + std::string modelName = input2; + std::string testDirectory = input3; + std::string outputDirectory = input4; + + double airT_C = 0.; + bool doTempDepress = false;; + if(argc == 6) { // air temperature specified on command line + airT_C = F_TO_C(std::stoi(argv[5])); doTempDepress = true; - } else { - airTemp = 0; - doTempDepress = false; } - // Only input file specified -- don't suffix with .csv - std::string testDirectory = input3; - // Parse the model HPWH::ControlInfo controlInfo; controlInfo.setpointT_C = 0.; - if(input1 == "Preset") { - inputFile = ""; - if (getHPWHObject(hpwh, input2) == HPWH::HPWH_ABORT) { + if(presetOrFile == "Preset") { + if (getHPWHObject(hpwh, modelName) == HPWH::HPWH_ABORT) { cout << "Error, preset model did not initialize.\n"; exit(1); } - model = static_cast (hpwh.getHPWHModel()); + HPWH::MODELS model = static_cast (hpwh.getHPWHModel()); if(model == HPWH::MODELS_Sanden80 || model == HPWH::MODELS_Sanden40) { controlInfo.setpointT_C = F_TO_C(149.); } - } else if (input1 == "File") { - inputFile = input2 + ".txt"; + } else if (presetOrFile == "File") { + std::string inputFile = modelName + ".txt"; if (hpwh.HPWHinit_file(inputFile) != 0) exit(1); } else { - cout << "Invalid argument, received '"<< input1 << "', expected 'Preset' or 'File'.\n"; + cout << "Invalid argument, received '"<< presetOrFile << "', expected 'Preset' or 'File'.\n"; exit(1); } // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C to better // try and trigger the lockout and hysteresis conditions - double tempDepressThresh = 4.; - hpwh.setMaxTempDepression(tempDepressThresh); + hpwh.setMaxTempDepression(4.); hpwh.setDoTempDepression(doTempDepress); if(!hpwh.readControlInfo(testDirectory,controlInfo)){ @@ -126,7 +120,7 @@ int main(int argc, char *argv[]){ } // ----------------------Open the Output Files and Print the Header---------------------------- // - if (controlInfo.timeToRun_min > 500000.) { + if (controlInfo.timeToRun_min > maximumDurationNormalTest_min) { std::string fileToOpen = outputDirectory + "/DHW_YRLY.csv"; if (fopen_s(&yearOutFile, fileToOpen.c_str(), "a+") != 0) { @@ -159,23 +153,20 @@ int main(int argc, char *argv[]){ double cumHeatIn[3] = { 0,0,0 }; double cumHeatOut[3] = { 0,0,0 }; + bool doChangeSetpoint = (!allSchedules[5].empty()) && (!hpwh.isSetpointFixed()); + // Loop over the minutes in the test for (int i = 0; i < controlInfo.timeToRun_min; i++) { - double airTemp2; - if (doTempDepress) { - airTemp2 = F_TO_C(airTemp); - } - else { - airTemp2 = allSchedules[2][i]; + if (!doTempDepress) { + airT_C = allSchedules[2][i]; } // Process the dr status HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); // Change setpoint if there is a setpoint schedule. - bool doSetSetpoint = (!allSchedules[5].empty()) && (!hpwh.isSetpointFixed()); - if (doSetSetpoint) { + if (doChangeSetpoint) { hpwh.setSetpoint(allSchedules[5][i]); //expect this to fail sometimes } @@ -188,7 +179,7 @@ int main(int argc, char *argv[]){ } // Mix down for yearly tests with large compressors - if (hpwh.getHPWHModel() >= 210 && controlInfo.timeToRun_min > 500000.) { + if ((hpwh.getHPWHModel() >= 210) && (controlInfo.timeToRun_min > maximumDurationNormalTest_min)) { //Do a simple mix down of the draw for the cold water temperature if (hpwh.getSetpoint() <= 125.) { allSchedules[1][i] *= (125. - allSchedules[0][i]) / (hpwh.getTankNodeTemp(hpwh.getNumNodes() - 1, HPWH::UNITS_F) - allSchedules[0][i]); @@ -201,7 +192,7 @@ int main(int argc, char *argv[]){ hpwh.runOneStep( allSchedules[0][i], // inlet water temperature (C) GAL_TO_L(allSchedules[1][i]), // draw (gallons) - airTemp2, // ambient Temp (C) + airT_C, // ambient Temp (C) allSchedules[3][i], // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) @@ -222,22 +213,22 @@ int main(int argc, char *argv[]){ // Check flow for external MP if (hpwh.isCompressoExternalMultipass()) { - double volumeHeated_Gal = hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL); - double mpFlowVolume_Gal = hpwh.getExternalMPFlowRate(HPWH::UNITS_GPM)*hpwh.getNthHeatSourceRunTime(hpwh.getCompressorIndex()); - if (fabs(volumeHeated_Gal - mpFlowVolume_Gal) > 0.000001) { - cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [Gal]: " << volumeHeated_Gal << ", mpFlowRate in 1 minute [Gal]: " - << mpFlowVolume_Gal << "\n"; + double volumeHeated_gal = hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL); + double mpFlowVolume_gal = hpwh.getExternalMPFlowRate(HPWH::UNITS_GPM)*hpwh.getNthHeatSourceRunTime(hpwh.getCompressorIndex()); + if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) { + cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " << volumeHeated_gal << ", mpFlowRate in 1 minute [gal]: " + << mpFlowVolume_gal << "\n"; exit(1); } } // Recording - if (controlInfo.timeToRun_min < 500000.) { + if (controlInfo.timeToRun_min < maximumDurationNormalTest_min) { // Copy current status into the output file if (doTempDepress) { - airTemp2 = hpwh.getLocationTemp_C(); + airT_C = hpwh.getLocationTemp_C(); } - strPreamble = std::to_string(i) + ", " + std::to_string(airTemp2) + ", " + std::to_string(hpwh.getSetpoint()) + ", " + + strPreamble = std::to_string(i) + ", " + std::to_string(airT_C) + ", " + std::to_string(hpwh.getSetpoint()) + ", " + std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; // Add some more outputs for mp tests if (hpwh.isCompressoExternalMultipass()) { @@ -261,7 +252,7 @@ int main(int argc, char *argv[]){ } } - if (controlInfo.timeToRun_min > 500000.) { + if (controlInfo.timeToRun_min > maximumDurationNormalTest_min) { firstCol = input3 + "," + input1 + "," + input2; fprintf(yearOutFile, "%s", firstCol.c_str()); double totalIn = 0, totalOut = 0; From d2697002cfc28c2679570d32aba979bd28fac4ee Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 13 Dec 2023 15:37:33 -0700 Subject: [PATCH 05/25] Need to fix temp depression. --- src/HPWH.cc | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/HPWH.hh | 22 +++++ test/main.cc | 208 +++++-------------------------------------- 3 files changed, 287 insertions(+), 186 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 52a9cb53..700e9b30 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4007,6 +4007,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & cout << "Could not open control file " << fileToOpen << "\n"; return false; } + controlInfo.timeToRun_min = 0; controlInfo.setpointT_C = 0.; controlInfo.initialTankT_C = 0.; @@ -4056,6 +4057,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & cout << var1 << " in testInfo.txt is an unrecogized key.\n"; } } + controlFile.close(); if(controlInfo.timeToRun_min == 0) { cout << "Error, must record length_of_test in testInfo.txt file\n"; @@ -4139,5 +4141,246 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn cout << "Control file testInfo.txt has unsettable specifics in it. \n"; return false; } + return true; +} + +bool HPWH::runSimulation( + const TestDesc &testDesc, + const std::string &outputDirectory, + const HPWH::ControlInfo &controlInfo, + std::vector &allSchedules, + double airT_C, + const bool doTempDepress +) +{ + const double energyBalThreshold = 0.005; // 0.5 % + const int nTestTCouples = 6; + + const std::string sHead = "minutes,Ta,Tsetpoint,inletT,draw,"; + const std::string sHeadMP = "condenserInletT,condenserOutletT,externalVolGPM,"; + const std::string sHeadSoC = "targetSoCFract,soCFract,"; + + FILE * outputFile = NULL; + std::string sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; + if (fopen_s(&outputFile, sOutputFilename.c_str(), "w+") != 0) { + cout << "Could not open output file " << sOutputFilename << "\n"; + return false; + } + + string sHeader = sHead; + if (isCompressoExternalMultipass()) { + sHeader += sHeadMP; + } + if(controlInfo.useSoC){ + sHeader += sHeadSoC; + } + int csvOptions = HPWH::CSVOPT_NONE; + WriteCSVHeading(outputFile, sHeader.c_str(), nTestTCouples, csvOptions); + + // ------------------------------------- Simulate --------------------------------------- // + cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; + + bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); + + // Loop over the minutes in the test + for (int i = 0; i < controlInfo.timeToRun_min; i++) { + + if (!doTempDepress) { + airT_C = allSchedules[2][i]; + } + + // Process the dr status + HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); + + // Change setpoint if there is a setpoint schedule. + if (doChangeSetpoint) { + setSetpoint(allSchedules[5][i]); //expect this to fail sometimes + } + + // Change SoC schedule + if (controlInfo.useSoC) { + if (setTargetSoCFraction(allSchedules[6][i]) != 0) { + cout << "ERROR: Can not set the target state of charge fraction. \n"; + return false; + } + } + + double tankHCStart = getTankHeatContent_kJ(); + + // Run the step + runOneStep( + allSchedules[0][i], // inlet water temperature (C) + GAL_TO_L(allSchedules[1][i]), // draw (gallons) + airT_C, // ambient Temp (C) + allSchedules[3][i], // external Temp (C) + drStatus, // DDR Status (now an enum. Fixed for now as allow) + GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) + allSchedules[0][i], // inlet-2 Temp (C) + NULL); // no extra heat + + if (!isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,energyBalThreshold)) { + cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; + } + + // Check timing + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { + if (getNthHeatSourceRunTime(iHS) > 1.) { + cout << "ERROR: On minute " << i << " heat source " << iHS << " ran for " << getNthHeatSourceRunTime(iHS) << " min" << "\n"; + return false; + } + } + + // Check flow for external MP + if (isCompressoExternalMultipass()) { + double volumeHeated_gal = getExternalVolumeHeated(HPWH::UNITS_GAL); + double mpFlowVolume_gal = getExternalMPFlowRate(HPWH::UNITS_GPM)*getNthHeatSourceRunTime(getCompressorIndex()); + if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) { + cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " << volumeHeated_gal << ", mpFlowRate in 1 min [gal]: " + << mpFlowVolume_gal << "\n"; + return false; + } + } + + // Recording + if (doTempDepress) { + airT_C = getLocationTemp_C(); + } + std::string sPreamble = std::to_string(i) + ", " + std::to_string(airT_C) + ", " + std::to_string(getSetpoint()) + ", " + + std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; + // Add some more outputs for mp tests + if (isCompressoExternalMultipass()) { + sPreamble += std::to_string(getCondenserWaterInletTemp()) + ", " + std::to_string(getCondenserWaterOutletTemp()) + ", " + + std::to_string(getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; + } + if (controlInfo.useSoC) { + sPreamble += std::to_string(allSchedules[6][i]) + ", " + std::to_string(getSoCFraction()) + ", "; + } + csvOptions = HPWH::CSVOPT_NONE; + if (allSchedules[1][i] > 0.) { + csvOptions |= HPWH::CSVOPT_IS_DRAWING; + } + WriteCSVRow(outputFile, sPreamble.c_str(), nTestTCouples, csvOptions); + } + + fclose(outputFile); + return true; +} + +bool HPWH::runYearlySimulation( + const TestDesc &testDesc, + const std::string &outputDirectory, + const HPWH::ControlInfo &controlInfo, + std::vector &allSchedules, + double airT_C, + const bool doTempDepress) +{ + const double energyBalThreshold = 0.005; // 0.5 % + + std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; + + FILE * outputFile = NULL; + if (fopen_s(&outputFile, sOutputFilename.c_str(), "a+") != 0) { + cout << "Could not open output file " << sOutputFilename << "\n"; + return false; + } + + cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; + + double cumHeatIn[3] = { 0,0,0 }; + double cumHeatOut[3] = { 0,0,0 }; + + bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); + + // Loop over the minutes in the test + for (int i = 0; i < controlInfo.timeToRun_min; i++) { + + if (!doTempDepress) { + airT_C = allSchedules[2][i]; + } + + // Process the dr status + HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); + + // Change setpoint if there is a setpoint schedule. + if (doChangeSetpoint) { + setSetpoint(allSchedules[5][i]); //expect this to fail sometimes + } + + // Change SoC schedule + if (controlInfo.useSoC) { + if (setTargetSoCFraction(allSchedules[6][i]) != 0) { + cout << "ERROR: Can not set the target state of charge fraction. \n"; + return false; + } + } + + // Mix down for yearly tests with large compressors + if (getHPWHModel() >= 210) { + //Do a simple mix down of the draw for the cold water temperature + if (getSetpoint() <= 125.) { + allSchedules[1][i] *= (125. - allSchedules[0][i]) / (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_F) - allSchedules[0][i]); + } + } + + double tankHCStart = getTankHeatContent_kJ(); + + // Run the step + runOneStep( + allSchedules[0][i], // inlet water temperature (C) + GAL_TO_L(allSchedules[1][i]), // draw (gallons) + airT_C, // ambient Temp (C) + allSchedules[3][i], // external Temp (C) + drStatus, // DDR Status (now an enum. Fixed for now as allow) + GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) + allSchedules[0][i], // inlet-2 Temp (C) + NULL); // no extra heat + + if (!isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,energyBalThreshold)) { + cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; + } + + // Check timing + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { + if (getNthHeatSourceRunTime(iHS) > 1.) { + cout << "ERROR: On minute " << i << " heat source " << iHS << " ran for " << getNthHeatSourceRunTime(iHS) << " min" << "\n"; + exit(1); + } + } + + // Check flow for external MP + if (isCompressoExternalMultipass()) { + double volumeHeated_gal = getExternalVolumeHeated(HPWH::UNITS_GAL); + double mpFlowVolume_gal = getExternalMPFlowRate(HPWH::UNITS_GPM)*getNthHeatSourceRunTime(getCompressorIndex()); + if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) { + cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " << volumeHeated_gal << ", mpFlowRate in 1 min [gal]: " + << mpFlowVolume_gal << "\n"; + return false; + } + } + + // Recording + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { + cumHeatIn[iHS] += getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KWH)*1000.; + cumHeatOut[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH)*1000.; + } + + } + + std::string firstCol = testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; + fprintf(outputFile, "%s", firstCol.c_str()); + double totalIn = 0, totalOut = 0; + for (int iHS = 0; iHS < 3; iHS++) { + fprintf(outputFile, ",%0.0f,%0.0f", cumHeatIn[iHS], cumHeatOut[iHS]); + totalIn += cumHeatIn[iHS]; + totalOut += cumHeatOut[iHS]; + } + fprintf(outputFile, ",%0.0f,%0.0f", totalIn, totalOut); + for (int iHS = 0; iHS < 3; iHS++) { + fprintf(outputFile, ",%0.2f", cumHeatOut[iHS] /cumHeatIn[iHS]); + } + fprintf(outputFile, ",%0.2f", totalOut/totalIn); + fprintf(outputFile, "\n"); + fclose(outputFile); + return true; } \ No newline at end of file diff --git a/src/HPWH.hh b/src/HPWH.hh index bf9efc2a..11ba8cbf 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -838,6 +838,28 @@ public: typedef std::vector Schedule; bool readSchedules(const std::string &testDirectory, const ControlInfo &controlInfo, std::vector &allSchedules); + struct TestDesc{ + std::string presetOrFile; + std::string modelName; + std::string testName; + }; + + bool runSimulation( + const TestDesc &testDesc, + const std::string &outputDirectory, + const HPWH::ControlInfo &controlInfo, + std::vector &allSchedules, + double airT_C, + const bool doTempDepress); + + bool runYearlySimulation( + const TestDesc &testDesc, + const std::string &outputDirectory, + const HPWH::ControlInfo &controlInfo, + std::vector &allSchedules, + double airT_C, + const bool doTempDepress); + private: class HeatSource; diff --git a/test/main.cc b/test/main.cc index 530a4241..4faeb68a 100644 --- a/test/main.cc +++ b/test/main.cc @@ -27,19 +27,6 @@ int main(int argc, char *argv[]){ HPWH hpwh; const long maximumDurationNormalTest_min = 500000; - const double energyBalThreshold = 0.005; // 0.5 % - const int nTestTCouples = 6; - - string inputVariableName, firstCol; - - FILE * outputFile = NULL; - FILE * yearOutFile = NULL; - ifstream controlFile; - - string strPreamble; - string strHead = "minutes,Ta,Tsetpoint,inletT,draw,"; - string strHeadMP = "condenserInletT,condenserOutletT,externalVolGPM,"; - string strHeadSoC = "targetSoCFract,soCFract,"; // process command line arguments cout << "Testing HPWHsim version " << HPWH::getVersion() << endl; @@ -70,209 +57,58 @@ int main(int argc, char *argv[]){ exit(1); } - std::string presetOrFile = input1; - std::string modelName = input2; - std::string testDirectory = input3; - std::string outputDirectory = input4; + HPWH::TestDesc testDesc; - double airT_C = 0.; - bool doTempDepress = false;; - if(argc == 6) { // air temperature specified on command line - airT_C = F_TO_C(std::stoi(argv[5])); - doTempDepress = true; - } + testDesc.presetOrFile = input1; + testDesc.modelName = input2; + testDesc.testName = input3; + std::string outputDirectory = input4; // Parse the model - HPWH::ControlInfo controlInfo; - controlInfo.setpointT_C = 0.; - if(presetOrFile == "Preset") { - if (getHPWHObject(hpwh, modelName) == HPWH::HPWH_ABORT) { + if(testDesc.presetOrFile == "Preset") { + if (getHPWHObject(hpwh, testDesc.modelName) == HPWH::HPWH_ABORT) { cout << "Error, preset model did not initialize.\n"; exit(1); } - - HPWH::MODELS model = static_cast (hpwh.getHPWHModel()); - if(model == HPWH::MODELS_Sanden80 || model == HPWH::MODELS_Sanden40) { - controlInfo.setpointT_C = F_TO_C(149.); - } - } else if (presetOrFile == "File") { - std::string inputFile = modelName + ".txt"; + } else if (testDesc.presetOrFile == "File") { + std::string inputFile = testDesc.modelName + ".txt"; if (hpwh.HPWHinit_file(inputFile) != 0) exit(1); } else { - cout << "Invalid argument, received '"<< presetOrFile << "', expected 'Preset' or 'File'.\n"; + cout << "Invalid argument, received '"<< testDesc.presetOrFile << "', expected 'Preset' or 'File'.\n"; exit(1); } + double airT_C = 0.; + bool doTempDepress = false; + if(argc == 6) { // air temperature specified on command line + airT_C = F_TO_C(std::stoi(argv[5])); + doTempDepress = true; + } + // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C to better // try and trigger the lockout and hysteresis conditions hpwh.setMaxTempDepression(4.); hpwh.setDoTempDepression(doTempDepress); - if(!hpwh.readControlInfo(testDirectory,controlInfo)){ + HPWH::ControlInfo controlInfo; + if(!hpwh.readControlInfo(testDesc.testName,controlInfo)){ cout << "Control file testInfo.txt has unsettable specifics in it. \n"; exit(1); } std::vector allSchedules; - if (!(hpwh.readSchedules(testDirectory,controlInfo,allSchedules))) { + if (!(hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules))) { exit(1); } - // ----------------------Open the Output Files and Print the Header---------------------------- // if (controlInfo.timeToRun_min > maximumDurationNormalTest_min) { - std::string fileToOpen = outputDirectory + "/DHW_YRLY.csv"; - - if (fopen_s(&yearOutFile, fileToOpen.c_str(), "a+") != 0) { - cout << "Could not open output file " << fileToOpen << "\n"; - exit(1); - } + hpwh.runYearlySimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress); } else { - std::string fileToOpen = outputDirectory + "/" + input3 + "_" + input1 + "_" + input2 + ".csv"; - - if (fopen_s(&outputFile, fileToOpen.c_str(), "w+") != 0) { - cout << "Could not open output file " << fileToOpen << "\n"; - exit(1); - } - - string header = strHead; - if (hpwh.isCompressoExternalMultipass()) { - header += strHeadMP; - } - if(controlInfo.useSoC){ - header += strHeadSoC; - } - int csvOptions = HPWH::CSVOPT_NONE; - hpwh.WriteCSVHeading(outputFile, header.c_str(), nTestTCouples, csvOptions); - } - - // ------------------------------------- Simulate --------------------------------------- // - cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; - - double cumHeatIn[3] = { 0,0,0 }; - double cumHeatOut[3] = { 0,0,0 }; - - bool doChangeSetpoint = (!allSchedules[5].empty()) && (!hpwh.isSetpointFixed()); - - // Loop over the minutes in the test - for (int i = 0; i < controlInfo.timeToRun_min; i++) { - - if (!doTempDepress) { - airT_C = allSchedules[2][i]; - } - - // Process the dr status - HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); - - // Change setpoint if there is a setpoint schedule. - if (doChangeSetpoint) { - hpwh.setSetpoint(allSchedules[5][i]); //expect this to fail sometimes - } - - // Change SoC schedule - if (controlInfo.useSoC) { - if (hpwh.setTargetSoCFraction(allSchedules[6][i]) != 0) { - cout << "ERROR: Can not set the target state of charge fraction. \n"; - exit(1); - } - } - - // Mix down for yearly tests with large compressors - if ((hpwh.getHPWHModel() >= 210) && (controlInfo.timeToRun_min > maximumDurationNormalTest_min)) { - //Do a simple mix down of the draw for the cold water temperature - if (hpwh.getSetpoint() <= 125.) { - allSchedules[1][i] *= (125. - allSchedules[0][i]) / (hpwh.getTankNodeTemp(hpwh.getNumNodes() - 1, HPWH::UNITS_F) - allSchedules[0][i]); - } - } - - double tankHCStart = hpwh.getTankHeatContent_kJ(); - - // Run the step - hpwh.runOneStep( - allSchedules[0][i], // inlet water temperature (C) - GAL_TO_L(allSchedules[1][i]), // draw (gallons) - airT_C, // ambient Temp (C) - allSchedules[3][i], // external Temp (C) - drStatus, // DDR Status (now an enum. Fixed for now as allow) - GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) - allSchedules[0][i], // inlet-2 Temp (C) - NULL); // no extra heat - - if (!hpwh.isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,energyBalThreshold)) { - cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; - } - - // Check timing - for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) { - if (hpwh.getNthHeatSourceRunTime(iHS) > 1.) { - cout << "ERROR: On minute " << i << " heat source " << iHS << " ran for " << hpwh.getNthHeatSourceRunTime(iHS) << "minutes" << "\n"; - exit(1); - } - } - - // Check flow for external MP - if (hpwh.isCompressoExternalMultipass()) { - double volumeHeated_gal = hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL); - double mpFlowVolume_gal = hpwh.getExternalMPFlowRate(HPWH::UNITS_GPM)*hpwh.getNthHeatSourceRunTime(hpwh.getCompressorIndex()); - if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) { - cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " << volumeHeated_gal << ", mpFlowRate in 1 minute [gal]: " - << mpFlowVolume_gal << "\n"; - exit(1); - } - } - - // Recording - if (controlInfo.timeToRun_min < maximumDurationNormalTest_min) { - // Copy current status into the output file - if (doTempDepress) { - airT_C = hpwh.getLocationTemp_C(); - } - strPreamble = std::to_string(i) + ", " + std::to_string(airT_C) + ", " + std::to_string(hpwh.getSetpoint()) + ", " + - std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; - // Add some more outputs for mp tests - if (hpwh.isCompressoExternalMultipass()) { - strPreamble += std::to_string(hpwh.getCondenserWaterInletTemp()) + ", " + std::to_string(hpwh.getCondenserWaterOutletTemp()) + ", " + - std::to_string(hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; - } - if (controlInfo.useSoC) { - strPreamble += std::to_string(allSchedules[6][i]) + ", " + std::to_string(hpwh.getSoCFraction()) + ", "; - } - int csvOptions = HPWH::CSVOPT_NONE; - if (allSchedules[1][i] > 0.) { - csvOptions |= HPWH::CSVOPT_IS_DRAWING; - } - hpwh.WriteCSVRow(outputFile, strPreamble.c_str(), nTestTCouples, csvOptions); - } - else { - for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) { - cumHeatIn[iHS] += hpwh.getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KWH)*1000.; - cumHeatOut[iHS] += hpwh.getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH)*1000.; - } - } + hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress); } - if (controlInfo.timeToRun_min > maximumDurationNormalTest_min) { - firstCol = input3 + "," + input1 + "," + input2; - fprintf(yearOutFile, "%s", firstCol.c_str()); - double totalIn = 0, totalOut = 0; - for (int iHS = 0; iHS < 3; iHS++) { - fprintf(yearOutFile, ",%0.0f,%0.0f", cumHeatIn[iHS], cumHeatOut[iHS]); - totalIn += cumHeatIn[iHS]; - totalOut += cumHeatOut[iHS]; - } - fprintf(yearOutFile, ",%0.0f,%0.0f", totalIn, totalOut); - for (int iHS = 0; iHS < 3; iHS++) { - fprintf(yearOutFile, ",%0.2f", cumHeatOut[iHS] /cumHeatIn[iHS]); - } - fprintf(yearOutFile, ",%0.2f", totalOut/totalIn); - fprintf(yearOutFile, "\n"); - fclose(yearOutFile); - } - else { - fclose(outputFile); - } - controlFile.close(); return 0; } From 4a26814336dc5e40d59c1130a0821d07c8c68015 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Thu, 14 Dec 2023 11:31:30 -0700 Subject: [PATCH 06/25] Fix ambientT. --- src/HPWH.cc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 700e9b30..d5a46670 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4049,7 +4049,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & else if(var1 == "useSoC") { controlInfo.useSoC = (bool)testVal; } - if(var1 == "initialTankT_C") { // Initialize at this temperature instead of setpoint + else if(var1 == "initialTankT_C") { // Initialize at this temperature instead of setpoint controlInfo.initialTankT_C = testVal; controlInfo.hasInitialTankTemp = true; } @@ -4185,9 +4185,7 @@ bool HPWH::runSimulation( // Loop over the minutes in the test for (int i = 0; i < controlInfo.timeToRun_min; i++) { - if (!doTempDepress) { - airT_C = allSchedules[2][i]; - } + double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; // Process the dr status HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); @@ -4211,7 +4209,7 @@ bool HPWH::runSimulation( runOneStep( allSchedules[0][i], // inlet water temperature (C) GAL_TO_L(allSchedules[1][i]), // draw (gallons) - airT_C, // ambient Temp (C) + ambientT_C, // ambient Temp (C) allSchedules[3][i], // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) @@ -4243,9 +4241,9 @@ bool HPWH::runSimulation( // Recording if (doTempDepress) { - airT_C = getLocationTemp_C(); + ambientT_C = getLocationTemp_C(); } - std::string sPreamble = std::to_string(i) + ", " + std::to_string(airT_C) + ", " + std::to_string(getSetpoint()) + ", " + + std::string sPreamble = std::to_string(i) + ", " + std::to_string(ambientT_C) + ", " + std::to_string(getSetpoint()) + ", " + std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; // Add some more outputs for mp tests if (isCompressoExternalMultipass()) { From a50893acd9173f4a8db179f8d1d0778296b8c726 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Thu, 14 Dec 2023 12:07:15 -0700 Subject: [PATCH 07/25] Start adding calcUEF. --- test/24hr67_high/DRschedule.csv | 2 + test/24hr67_high/ambientTschedule.csv | 3 + test/24hr67_high/drawschedule.csv | 58 +++++++++++++++ test/24hr67_high/evaporatorTschedule.csv | 3 + test/24hr67_high/inletTschedule.csv | 3 + test/24hr67_high/testInfo.txt | 2 + test/24hr67_low/DRschedule.csv | 2 + test/24hr67_low/ambientTschedule.csv | 3 + test/24hr67_low/drawschedule.csv | 47 ++++++++++++ test/24hr67_low/evaporatorTschedule.csv | 3 + test/24hr67_low/inletTschedule.csv | 3 + test/24hr67_low/testInfo.txt | 2 + test/24hr67_medium/DRschedule.csv | 2 + test/24hr67_medium/ambientTschedule.csv | 3 + test/24hr67_medium/drawschedule.csv | 59 +++++++++++++++ test/24hr67_medium/evaporatorTschedule.csv | 3 + test/24hr67_medium/inletTschedule.csv | 3 + test/24hr67_medium/testInfo.txt | 2 + test/24hr67_vsmall/DRschedule.csv | 2 + test/24hr67_vsmall/ambientTschedule.csv | 3 + test/24hr67_vsmall/drawschedule.csv | 14 ++++ test/24hr67_vsmall/evaporatorTschedule.csv | 3 + test/24hr67_vsmall/inletTschedule.csv | 3 + test/24hr67_vsmall/testInfo.txt | 2 + test/CMakeLists.txt | 2 + test/main.cc | 1 - test/testCalcUEF.cc | 84 ++++++++++++++++++++++ 27 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 test/24hr67_high/DRschedule.csv create mode 100644 test/24hr67_high/ambientTschedule.csv create mode 100644 test/24hr67_high/drawschedule.csv create mode 100644 test/24hr67_high/evaporatorTschedule.csv create mode 100644 test/24hr67_high/inletTschedule.csv create mode 100644 test/24hr67_high/testInfo.txt create mode 100644 test/24hr67_low/DRschedule.csv create mode 100644 test/24hr67_low/ambientTschedule.csv create mode 100644 test/24hr67_low/drawschedule.csv create mode 100644 test/24hr67_low/evaporatorTschedule.csv create mode 100644 test/24hr67_low/inletTschedule.csv create mode 100644 test/24hr67_low/testInfo.txt create mode 100644 test/24hr67_medium/DRschedule.csv create mode 100644 test/24hr67_medium/ambientTschedule.csv create mode 100644 test/24hr67_medium/drawschedule.csv create mode 100644 test/24hr67_medium/evaporatorTschedule.csv create mode 100644 test/24hr67_medium/inletTschedule.csv create mode 100644 test/24hr67_medium/testInfo.txt create mode 100644 test/24hr67_vsmall/DRschedule.csv create mode 100644 test/24hr67_vsmall/ambientTschedule.csv create mode 100644 test/24hr67_vsmall/drawschedule.csv create mode 100644 test/24hr67_vsmall/evaporatorTschedule.csv create mode 100644 test/24hr67_vsmall/inletTschedule.csv create mode 100644 test/24hr67_vsmall/testInfo.txt create mode 100644 test/testCalcUEF.cc diff --git a/test/24hr67_high/DRschedule.csv b/test/24hr67_high/DRschedule.csv new file mode 100644 index 00000000..0fae0f27 --- /dev/null +++ b/test/24hr67_high/DRschedule.csv @@ -0,0 +1,2 @@ +default 1 +minutes,OnOff diff --git a/test/24hr67_high/ambientTschedule.csv b/test/24hr67_high/ambientTschedule.csv new file mode 100644 index 00000000..1e6b51c2 --- /dev/null +++ b/test/24hr67_high/ambientTschedule.csv @@ -0,0 +1,3 @@ +default 67.5, +minutes,temperature +1,67.5 diff --git a/test/24hr67_high/drawschedule.csv b/test/24hr67_high/drawschedule.csv new file mode 100644 index 00000000..5d00073c --- /dev/null +++ b/test/24hr67_high/drawschedule.csv @@ -0,0 +1,58 @@ +default 0, +minutes,flow +1,3 +2,3 +3,3 +4,3 +5,3 +6,3 +7,3 +8,3 +9,3 +10,0 +31,1 +32,1 +33,0 +41,1 +42,0 +101,1.7 +102,1.7 +103,1.7 +104,1.7 +105,1.7 +106,0.5 +107,0 +631,3 +632,3 +633,3 +634,3 +635,3 +636,0 +691,1.7 +692,1.7 +693,1.6 +694,0 +721,1 +722,0 +766,1 +767,0 +771,1 +772,0 +961,1 +962,1 +963,0 +976,1 +977,1 +978,0 +991,1.7 +992,0.3 +993,0 +1006,1.7 +1007,0.3 +1008,0 +1021,3 +1022,3 +1023,3 +1024,3 +1025,2 +1026,0 diff --git a/test/24hr67_high/evaporatorTschedule.csv b/test/24hr67_high/evaporatorTschedule.csv new file mode 100644 index 00000000..1e6b51c2 --- /dev/null +++ b/test/24hr67_high/evaporatorTschedule.csv @@ -0,0 +1,3 @@ +default 67.5, +minutes,temperature +1,67.5 diff --git a/test/24hr67_high/inletTschedule.csv b/test/24hr67_high/inletTschedule.csv new file mode 100644 index 00000000..0bf6a3ca --- /dev/null +++ b/test/24hr67_high/inletTschedule.csv @@ -0,0 +1,3 @@ +default 58, +minutes,temperature +1,58 diff --git a/test/24hr67_high/testInfo.txt b/test/24hr67_high/testInfo.txt new file mode 100644 index 00000000..4e0f3b2d --- /dev/null +++ b/test/24hr67_high/testInfo.txt @@ -0,0 +1,2 @@ +setpoint 125 +length_of_test 1440 diff --git a/test/24hr67_low/DRschedule.csv b/test/24hr67_low/DRschedule.csv new file mode 100644 index 00000000..0fae0f27 --- /dev/null +++ b/test/24hr67_low/DRschedule.csv @@ -0,0 +1,2 @@ +default 1 +minutes,OnOff diff --git a/test/24hr67_low/ambientTschedule.csv b/test/24hr67_low/ambientTschedule.csv new file mode 100644 index 00000000..1e6b51c2 --- /dev/null +++ b/test/24hr67_low/ambientTschedule.csv @@ -0,0 +1,3 @@ +default 67.5, +minutes,temperature +1,67.5 diff --git a/test/24hr67_low/drawschedule.csv b/test/24hr67_low/drawschedule.csv new file mode 100644 index 00000000..c80c0ebe --- /dev/null +++ b/test/24hr67_low/drawschedule.csv @@ -0,0 +1,47 @@ +default 0, +minutes,flow +1,1.7 +2,1.7 +3,1.7 +4,1.7 +5,1.7 +6,1.7 +7,1.7 +8,1.7 +9,1.4 +10,0 +31,1 +32,1 +33,0 +61,1 +62,0 +631,1.7 +632,1.7 +633,1.7 +634,0.9 +635,0 +691,1.7 +692,1.7 +693,0.6 +694,0 +721,1 +722,0 +766,1 +767,0 +771,1 +772,0 +976,1 +977,1 +978,0 +991,0 +992,0 +993,0 +1006,1.7 +1007,0.3 +1008,0 +1021,1.7 +1022,1.3 +1023,0 +1024,0 +1025,0 +1026,0 diff --git a/test/24hr67_low/evaporatorTschedule.csv b/test/24hr67_low/evaporatorTschedule.csv new file mode 100644 index 00000000..1e6b51c2 --- /dev/null +++ b/test/24hr67_low/evaporatorTschedule.csv @@ -0,0 +1,3 @@ +default 67.5, +minutes,temperature +1,67.5 diff --git a/test/24hr67_low/inletTschedule.csv b/test/24hr67_low/inletTschedule.csv new file mode 100644 index 00000000..0bf6a3ca --- /dev/null +++ b/test/24hr67_low/inletTschedule.csv @@ -0,0 +1,3 @@ +default 58, +minutes,temperature +1,58 diff --git a/test/24hr67_low/testInfo.txt b/test/24hr67_low/testInfo.txt new file mode 100644 index 00000000..4e0f3b2d --- /dev/null +++ b/test/24hr67_low/testInfo.txt @@ -0,0 +1,2 @@ +setpoint 125 +length_of_test 1440 diff --git a/test/24hr67_medium/DRschedule.csv b/test/24hr67_medium/DRschedule.csv new file mode 100644 index 00000000..0fae0f27 --- /dev/null +++ b/test/24hr67_medium/DRschedule.csv @@ -0,0 +1,2 @@ +default 1 +minutes,OnOff diff --git a/test/24hr67_medium/ambientTschedule.csv b/test/24hr67_medium/ambientTschedule.csv new file mode 100644 index 00000000..1e6b51c2 --- /dev/null +++ b/test/24hr67_medium/ambientTschedule.csv @@ -0,0 +1,3 @@ +default 67.5, +minutes,temperature +1,67.5 diff --git a/test/24hr67_medium/drawschedule.csv b/test/24hr67_medium/drawschedule.csv new file mode 100644 index 00000000..cfe871d1 --- /dev/null +++ b/test/24hr67_medium/drawschedule.csv @@ -0,0 +1,59 @@ +default 0, +minutes,flow +1,1.7 +2,1.7 +3,1.7 +4,1.7 +5,1.7 +6,1.7 +7,1.7 +8,1.7 +9,1.4 +10,0 +31,1 +32,1 +33,0 +41,0 +42,0 +101,1.7 +102,1.7 +103,1.7 +104,1.7 +105,1.7 +106,0.5 +107,0 +631,1.7 +632,1.7 +633,1.7 +634,1.7 +635,1.7 +636,0.5 +637,0 +691,1.7 +692,1.7 +693,1.6 +694,0 +721,1 +722,0 +766,1 +767,0 +771,1 +772,0 +961,1 +962,0 +963,0 +976,1 +977,1 +978,0 +991,0 +992,0 +993,0 +1006,1.7 +1007,0.3 +1008,0 +1021,1.7 +1022,1.7 +1023,1.7 +1024,1.7 +1025,0.2 +1026,0 diff --git a/test/24hr67_medium/evaporatorTschedule.csv b/test/24hr67_medium/evaporatorTschedule.csv new file mode 100644 index 00000000..1e6b51c2 --- /dev/null +++ b/test/24hr67_medium/evaporatorTschedule.csv @@ -0,0 +1,3 @@ +default 67.5, +minutes,temperature +1,67.5 diff --git a/test/24hr67_medium/inletTschedule.csv b/test/24hr67_medium/inletTschedule.csv new file mode 100644 index 00000000..0bf6a3ca --- /dev/null +++ b/test/24hr67_medium/inletTschedule.csv @@ -0,0 +1,3 @@ +default 58, +minutes,temperature +1,58 diff --git a/test/24hr67_medium/testInfo.txt b/test/24hr67_medium/testInfo.txt new file mode 100644 index 00000000..4e0f3b2d --- /dev/null +++ b/test/24hr67_medium/testInfo.txt @@ -0,0 +1,2 @@ +setpoint 125 +length_of_test 1440 diff --git a/test/24hr67_vsmall/DRschedule.csv b/test/24hr67_vsmall/DRschedule.csv new file mode 100644 index 00000000..0fae0f27 --- /dev/null +++ b/test/24hr67_vsmall/DRschedule.csv @@ -0,0 +1,2 @@ +default 1 +minutes,OnOff diff --git a/test/24hr67_vsmall/ambientTschedule.csv b/test/24hr67_vsmall/ambientTschedule.csv new file mode 100644 index 00000000..1e6b51c2 --- /dev/null +++ b/test/24hr67_vsmall/ambientTschedule.csv @@ -0,0 +1,3 @@ +default 67.5, +minutes,temperature +1,67.5 diff --git a/test/24hr67_vsmall/drawschedule.csv b/test/24hr67_vsmall/drawschedule.csv new file mode 100644 index 00000000..a6472594 --- /dev/null +++ b/test/24hr67_vsmall/drawschedule.csv @@ -0,0 +1,14 @@ +default 0, +minutes,flow +1,1 +2,1 +61,1 +66,0.5 +71,0.5 +76,0.5 +481,1 +496,1 +497,1 +541,1 +542,0.5 +556,1 diff --git a/test/24hr67_vsmall/evaporatorTschedule.csv b/test/24hr67_vsmall/evaporatorTschedule.csv new file mode 100644 index 00000000..1e6b51c2 --- /dev/null +++ b/test/24hr67_vsmall/evaporatorTschedule.csv @@ -0,0 +1,3 @@ +default 67.5, +minutes,temperature +1,67.5 diff --git a/test/24hr67_vsmall/inletTschedule.csv b/test/24hr67_vsmall/inletTschedule.csv new file mode 100644 index 00000000..0bf6a3ca --- /dev/null +++ b/test/24hr67_vsmall/inletTschedule.csv @@ -0,0 +1,3 @@ +default 58, +minutes,temperature +1,58 diff --git a/test/24hr67_vsmall/testInfo.txt b/test/24hr67_vsmall/testInfo.txt new file mode 100644 index 00000000..4e0f3b2d --- /dev/null +++ b/test/24hr67_vsmall/testInfo.txt @@ -0,0 +1,2 @@ +setpoint 125 +length_of_test 1440 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9062cd59..8edf076b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -12,6 +12,7 @@ add_executable(testPerformanceMaps testPerformanceMaps.cc) add_executable(testStateOfChargeFcts testStateOfChargeFcts.cc) add_executable(testHeatingLogics testHeatingLogics.cc) add_executable(testEnergyBalance testEnergyBalance.cc) +add_executable(testCalcUEF testCalcUEF.cc) set(libs libHPWHsim @@ -28,6 +29,7 @@ target_link_libraries(testPerformanceMaps ${libs}) target_link_libraries(testStateOfChargeFcts ${libs}) target_link_libraries(testHeatingLogics ${libs}) target_link_libraries(testEnergyBalance ${libs}) +target_link_libraries(testCalcUEF ${libs}) # Add output directory for test results add_custom_target(results_directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/output") diff --git a/test/main.cc b/test/main.cc index 4faeb68a..9988f2ce 100644 --- a/test/main.cc +++ b/test/main.cc @@ -58,7 +58,6 @@ int main(int argc, char *argv[]){ } HPWH::TestDesc testDesc; - testDesc.presetOrFile = input1; testDesc.modelName = input2; testDesc.testName = input3; diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc new file mode 100644 index 00000000..135e583e --- /dev/null +++ b/test/testCalcUEF.cc @@ -0,0 +1,84 @@ +/* + * unit test for energy balancing + */ +#include "HPWH.hh" +#include "testUtilityFcts.cc" + +#include +#include + +const std::vector profileNames({ "24hr67_vsmall", + "24hr67_low", + "24hr67_medium", + "24hr67_high" }); + + + +void testEnergyBalanceAOSmithHPTS50() { + + HPWH hpwh; + getHPWHObject(hpwh, "AOSmithHPTS50"); + + double maxDrawVol_L = 1.; + const double ambientT_C = 20.; + const double externalT_C = 20.; + + // + hpwh.setTankToTemperature(20.); + hpwh.setInletT(5.); + + const double Pi = 4. * atan(1.); + double testDuration_min = 60.; + for(int i_min = 0; i_min < testDuration_min; ++i_min) + { + double t_min = static_cast(i_min); + + double flowFac = sin(Pi * t_min / testDuration_min) - 0.5; + flowFac += fabs(flowFac); // semi-sinusoidal flow profile + double drawVol_L = flowFac * maxDrawVol_L; + + double prevHeatContent_kJ = hpwh.getTankHeatContent_kJ(); + hpwh.runOneStep(drawVol_L, ambientT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(hpwh.isEnergyBalanced(drawVol_L,prevHeatContent_kJ,1.e-6)); + } +} + +/* Test energy balance for storage tank with extra heat (solar)*/ +void testEnergyBalanceSolar() { + + HPWH hpwh; + getHPWHObject(hpwh, "StorageTank"); + + double maxDrawVol_L = 1.; + const double ambientT_C = 20.; + const double externalT_C = 20.; + + std::vector nodePowerExtra_W = {1000.}; + // + hpwh.setUA(0.); + hpwh.setTankToTemperature(20.); + hpwh.setInletT(5.); + + const double Pi = 4. * atan(1.); + double testDuration_min = 60.; + for(int i_min = 0; i_min < testDuration_min; ++i_min) + { + double t_min = static_cast(i_min); + + double flowFac = sin(Pi * t_min / testDuration_min) - 0.5; + flowFac += fabs(flowFac); // semi-sinusoidal flow profile + double drawVol_L = flowFac * maxDrawVol_L; + + double prevHeatContent_kJ = hpwh.getTankHeatContent_kJ(); + hpwh.runOneStep(drawVol_L, ambientT_C, externalT_C, HPWH::DR_ALLOW,0.,0.,&nodePowerExtra_W); + ASSERTTRUE(hpwh.isEnergyBalanced(drawVol_L,prevHeatContent_kJ,1.e-6)); + } +} + +int main(int, char*) +{ + testEnergyBalanceAOSmithHPTS50(); + testEnergyBalanceSolar(); + + return 0; +} From f1cac4e316071e2e04873d196ba415b36c4d9274 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Thu, 14 Dec 2023 14:38:56 -0700 Subject: [PATCH 08/25] Basic test struct. --- src/HPWH.cc | 5 ++ src/HPWH.hh | 1 + test/24hr67_vsmall/testInfo.txt | 1 + test/testCalcUEF.cc | 107 ++++++++++++++++---------------- 4 files changed, 61 insertions(+), 53 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index d5a46670..c55be29d 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4018,6 +4018,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & controlInfo.tot_limit = 0.; controlInfo.useSoC = false; controlInfo.hasInitialTankTemp = false; + controlInfo.temperature_units = "C"; //const double soCMinTUse_C = F_TO_C(110.); //const double soCMains_C = F_TO_C(65.); @@ -4053,6 +4054,10 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & controlInfo.initialTankT_C = testVal; controlInfo.hasInitialTankTemp = true; } + else if(var1 == "temperature_units") { // Initialize at this temperature instead of setpoint + controlInfo.initialTankT_C = testVal; + controlInfo.hasInitialTankTemp = true; + } else { cout << var1 << " in testInfo.txt is an unrecogized key.\n"; } diff --git a/src/HPWH.hh b/src/HPWH.hh index 11ba8cbf..b3e29ad2 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -832,6 +832,7 @@ public: double tot_limit = 0.; bool useSoC = false; bool hasInitialTankTemp = false; + std::string temperature_units = "C"; }; bool readControlInfo(const std::string &testDirectory, ControlInfo &controlInfo); diff --git a/test/24hr67_vsmall/testInfo.txt b/test/24hr67_vsmall/testInfo.txt index 4e0f3b2d..6905b702 100644 --- a/test/24hr67_vsmall/testInfo.txt +++ b/test/24hr67_vsmall/testInfo.txt @@ -1,2 +1,3 @@ setpoint 125 length_of_test 1440 +temperature_units F diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc index 135e583e..33864f03 100644 --- a/test/testCalcUEF.cc +++ b/test/testCalcUEF.cc @@ -7,78 +7,79 @@ #include #include -const std::vector profileNames({ "24hr67_vsmall", +const std::vector sProfileNames({ "24hr67_vsmall", "24hr67_low", "24hr67_medium", "24hr67_high" }); - - -void testEnergyBalanceAOSmithHPTS50() { +void runTest(const HPWH::TestDesc testDesc,double airT_C = 0.,bool doTempDepress = false) { HPWH hpwh; - getHPWHObject(hpwh, "AOSmithHPTS50"); - double maxDrawVol_L = 1.; - const double ambientT_C = 20.; - const double externalT_C = 20.; + getHPWHObject(hpwh, testDesc.modelName); - // - hpwh.setTankToTemperature(20.); - hpwh.setInletT(5.); + std::string sOutputDirectory =" ../build/test/output"; - const double Pi = 4. * atan(1.); - double testDuration_min = 60.; - for(int i_min = 0; i_min < testDuration_min; ++i_min) - { - double t_min = static_cast(i_min); + // Parse the model + if(testDesc.presetOrFile == "Preset") { + if (getHPWHObject(hpwh, testDesc.modelName) == HPWH::HPWH_ABORT) { + cout << "Error, preset model did not initialize.\n"; + exit(1); + } + } else if (testDesc.presetOrFile == "File") { + std::string inputFile = testDesc.modelName + ".txt"; + if (hpwh.HPWHinit_file(inputFile) != 0) exit(1); + } + else { + cout << "Invalid argument, received '"<< testDesc.presetOrFile << "', expected 'Preset' or 'File'.\n"; + exit(1); + } - double flowFac = sin(Pi * t_min / testDuration_min) - 0.5; - flowFac += fabs(flowFac); // semi-sinusoidal flow profile - double drawVol_L = flowFac * maxDrawVol_L; + // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C to better + // try and trigger the lockout and hysteresis conditions + hpwh.setMaxTempDepression(4.); + hpwh.setDoTempDepression(doTempDepress); - double prevHeatContent_kJ = hpwh.getTankHeatContent_kJ(); - hpwh.runOneStep(drawVol_L, ambientT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(hpwh.isEnergyBalanced(drawVol_L,prevHeatContent_kJ,1.e-6)); + HPWH::ControlInfo controlInfo; + if(!hpwh.readControlInfo(testDesc.testName,controlInfo)){ + cout << "Control file testInfo.txt has unsettable specifics in it. \n"; + exit(1); } + + std::vector allSchedules; + if (!(hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules))) { + exit(1); + } + + hpwh.runSimulation(testDesc,sOutputDirectory,controlInfo,allSchedules,airT_C,doTempDepress); + } /* Test energy balance for storage tank with extra heat (solar)*/ -void testEnergyBalanceSolar() { +void runTestSuite(const std::string &sModelName,const std::string &sPresetOrFile) { - HPWH hpwh; - getHPWHObject(hpwh, "StorageTank"); - - double maxDrawVol_L = 1.; - const double ambientT_C = 20.; - const double externalT_C = 20.; - - std::vector nodePowerExtra_W = {1000.}; - // - hpwh.setUA(0.); - hpwh.setTankToTemperature(20.); - hpwh.setInletT(5.); - - const double Pi = 4. * atan(1.); - double testDuration_min = 60.; - for(int i_min = 0; i_min < testDuration_min; ++i_min) - { - double t_min = static_cast(i_min); - - double flowFac = sin(Pi * t_min / testDuration_min) - 0.5; - flowFac += fabs(flowFac); // semi-sinusoidal flow profile - double drawVol_L = flowFac * maxDrawVol_L; - - double prevHeatContent_kJ = hpwh.getTankHeatContent_kJ(); - hpwh.runOneStep(drawVol_L, ambientT_C, externalT_C, HPWH::DR_ALLOW,0.,0.,&nodePowerExtra_W); - ASSERTTRUE(hpwh.isEnergyBalanced(drawVol_L,prevHeatContent_kJ,1.e-6)); + HPWH::TestDesc testDesc; + testDesc.modelName = sModelName; + testDesc.presetOrFile = sPresetOrFile; + + for (auto &sProfileName: sProfileNames) { + testDesc.testName = sProfileName; + runTest(testDesc); } } -int main(int, char*) +int main(int argc, char *argv[]) { - testEnergyBalanceAOSmithHPTS50(); - testEnergyBalanceSolar(); - + // process command line arguments + if ((argc != 3)) { + cout << "Invalid input. This program takes TWO arguments: model type (i.e., Preset or File), model name (i.e., Sanden80)\n"; + exit(1); + } + + std::string sPresetOrFile = argv[1]; + std::string sModelName = argv[2]; + + runTestSuite(sModelName,sPresetOrFile); + return 0; } From 1fe8e6ccab8c5c603c767280219764c3fc0d10dd Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Thu, 14 Dec 2023 16:08:31 -0700 Subject: [PATCH 09/25] Allow select T units. --- src/HPWH.cc | 70 +++++++++++++++++++++------------ test/24hr67_high/testInfo.txt | 1 + test/24hr67_low/testInfo.txt | 1 + test/24hr67_medium/testInfo.txt | 1 + test/testCalcUEF.cc | 2 +- 5 files changed, 48 insertions(+), 27 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index c55be29d..95569311 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4023,47 +4023,51 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & //const double soCMinTUse_C = F_TO_C(110.); //const double soCMains_C = F_TO_C(65.); - std::string var1; - double testVal; - while(controlFile >> var1 >> testVal) { - if(var1 == "setpoint") { // If a setpoint was specified then override the default - controlInfo.setpointT_C = testVal; + std::string token; + std::string sValue; + while(controlFile >> token >> sValue) { + if(token == "setpoint") { // If a setpoint was specified then override the default + controlInfo.setpointT_C = std::stod(sValue); } - else if(var1 == "length_of_test") { - controlInfo.timeToRun_min = (int) testVal; + else if(token == "length_of_test") { + controlInfo.timeToRun_min = std::stoi(sValue); } - else if(var1 == "doInversionMixing") { - controlInfo.doInvMix = (testVal > 0.0) ? 1 : 0; + else if(token == "doInversionMixing") { + controlInfo.doInvMix = (std::stod(sValue) > 0.0) ? 1 : 0; } - else if(var1 == "doConduction") { - controlInfo.doCondu = (testVal > 0.0) ? 1 : 0; + else if(token == "doConduction") { + controlInfo.doCondu = (std::stod(sValue) > 0.0) ? 1 : 0; } - else if(var1 == "inletH") { - controlInfo.inletH = testVal; + else if(token == "inletH") { + controlInfo.inletH = std::stod(sValue); } - else if(var1 == "tanksize") { - controlInfo.tankSize_gal = testVal; + else if(token == "tanksize") { + controlInfo.tankSize_gal = std::stod(sValue); } - else if(var1 == "tot_limit") { - controlInfo.tot_limit = testVal; + else if(token == "tot_limit") { + controlInfo.tot_limit = std::stod(sValue); } - else if(var1 == "useSoC") { - controlInfo.useSoC = (bool)testVal; + else if(token == "useSoC") { + controlInfo.useSoC = static_cast(std::stoi(sValue)); } - else if(var1 == "initialTankT_C") { // Initialize at this temperature instead of setpoint - controlInfo.initialTankT_C = testVal; + else if(token == "initialTankT_C") { // Initialize at this temperature instead of setpoint + controlInfo.initialTankT_C = std::stod(sValue); controlInfo.hasInitialTankTemp = true; } - else if(var1 == "temperature_units") { // Initialize at this temperature instead of setpoint - controlInfo.initialTankT_C = testVal; - controlInfo.hasInitialTankTemp = true; + else if(token == "temperature_units") { // Initialize at this temperature instead of setpoint + controlInfo.temperature_units = sValue; } else { - cout << var1 << " in testInfo.txt is an unrecogized key.\n"; + cout << token << " in testInfo.txt is an unrecogized key.\n"; } } controlFile.close(); + if(controlInfo.temperature_units == "F") { + controlInfo.setpointT_C = F_TO_C(controlInfo.setpointT_C); + controlInfo.initialTankT_C = F_TO_C(controlInfo.initialTankT_C); + } + if(controlInfo.timeToRun_min == 0) { cout << "Error, must record length_of_test in testInfo.txt file\n"; return false; @@ -4100,7 +4104,21 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn } allSchedules.push_back(schedule); } - + + if(controlInfo.temperature_units == "F") { + for(auto &T: allSchedules[0]) { + T = F_TO_C(T); + } + for(auto &T: allSchedules[2]) { + T = F_TO_C(T); + } + for(auto &T: allSchedules[3]) { + T = F_TO_C(T); + } + for(auto &T: allSchedules[5]) { + T = F_TO_C(T); + } + } if (controlInfo.doInvMix == 0) { outputCode += setDoInversionMixing(false); } diff --git a/test/24hr67_high/testInfo.txt b/test/24hr67_high/testInfo.txt index 4e0f3b2d..6905b702 100644 --- a/test/24hr67_high/testInfo.txt +++ b/test/24hr67_high/testInfo.txt @@ -1,2 +1,3 @@ setpoint 125 length_of_test 1440 +temperature_units F diff --git a/test/24hr67_low/testInfo.txt b/test/24hr67_low/testInfo.txt index 4e0f3b2d..6905b702 100644 --- a/test/24hr67_low/testInfo.txt +++ b/test/24hr67_low/testInfo.txt @@ -1,2 +1,3 @@ setpoint 125 length_of_test 1440 +temperature_units F diff --git a/test/24hr67_medium/testInfo.txt b/test/24hr67_medium/testInfo.txt index 4e0f3b2d..6905b702 100644 --- a/test/24hr67_medium/testInfo.txt +++ b/test/24hr67_medium/testInfo.txt @@ -1,2 +1,3 @@ setpoint 125 length_of_test 1440 +temperature_units F diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc index 33864f03..1d5310ed 100644 --- a/test/testCalcUEF.cc +++ b/test/testCalcUEF.cc @@ -18,7 +18,7 @@ void runTest(const HPWH::TestDesc testDesc,double airT_C = 0.,bool doTempDepress getHPWHObject(hpwh, testDesc.modelName); - std::string sOutputDirectory =" ../build/test/output"; + std::string sOutputDirectory =".";// ../build/test/output // Parse the model if(testDesc.presetOrFile == "Preset") { From 11f9b6c5228485913e365c57faf551d28debb25c Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Mon, 18 Dec 2023 08:53:03 -0700 Subject: [PATCH 10/25] Select temp units. --- src/HPWH.cc | 124 +- src/HPWH.hh | 23 +- test/24hr67_high_Preset_Rheem2020Build40.csv | 1441 +++++++++++++++++ test/24hr67_low_Preset_Rheem2020Build40.csv | 1441 +++++++++++++++++ .../24hr67_medium_Preset_Rheem2020Build40.csv | 1441 +++++++++++++++++ .../24hr67_vsmall_Preset_Rheem2020Build40.csv | 1441 +++++++++++++++++ test/main.cc | 1 - 7 files changed, 5838 insertions(+), 74 deletions(-) create mode 100644 test/24hr67_high_Preset_Rheem2020Build40.csv create mode 100644 test/24hr67_low_Preset_Rheem2020Build40.csv create mode 100644 test/24hr67_medium_Preset_Rheem2020Build40.csv create mode 100644 test/24hr67_vsmall_Preset_Rheem2020Build40.csv diff --git a/src/HPWH.cc b/src/HPWH.cc index 95569311..06f8bdfc 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -3937,30 +3937,35 @@ int HPWH::HPWHinit_file(string configFile) { #endif // reads the named schedule into the provided array -int readSchedule(HPWH::Schedule &scheduleArray, string scheduleFileName, long minutesOfTest) { +//----------------------------------------------------------------------------- +/// @brief Reads a schedule into the schedule array. +/// @param[out] scheduleArray std::vector of test schedules +/// @param[in] scheduleName name of schedule to read +/// @param[in] minutesOfTest Upper (right) bounding fraction (0 to 1) +/// @return Resampled value; 0 if undefined. +//----------------------------------------------------------------------------- +bool readSchedule(HPWH::Schedule &scheduleArray, std::string scheduleName, long testLength_min) { int minuteHrTmp; bool hourInput; string line, snippet, s, minORhr; double valTmp; - std::ifstream inputFile(scheduleFileName.c_str()); - //open the schedule file provided - cout << "Opening " << scheduleFileName << '\n'; + std::ifstream inputFile(scheduleName.c_str()); + //open the schedule file provided + cout << "Opening " << scheduleName << '\n'; if(!inputFile.is_open()) { - return 1; + return false; } inputFile >> snippet >> valTmp; - // cout << "snippet " << snippet << " valTmp"<< valTmp<<'\n'; if(snippet != "default") { - cout << "First line of " << scheduleFileName << " must specify default\n"; - return 1; + cout << "First line of " << scheduleName << " must specify default\n"; + return false; } - // cout << valTmp << " minutes = " << minutesOfTest << "\n"; // Fill with the default value - scheduleArray.assign(minutesOfTest, valTmp); + scheduleArray.assign(testLength_min, valTmp); // Burn the first two lines std::getline(inputFile, line); @@ -3970,7 +3975,7 @@ int readSchedule(HPWH::Schedule &scheduleArray, string scheduleFileName, long mi // Grab the first token, which is the minute or hour marker ss >> minORhr; if (minORhr.empty() ) { // If nothing left in the file - return 0; + return true; } hourInput = tolower(minORhr.at(0)) == 'h'; char c; // to eat the commas nom nom @@ -3978,8 +3983,8 @@ int readSchedule(HPWH::Schedule &scheduleArray, string scheduleFileName, long mi while (inputFile >> minuteHrTmp >> c >> valTmp) { if (minuteHrTmp >= (int)scheduleArray.size()) { - cout << "In " << scheduleFileName << " the input file has more minutes than the test was defined with\n"; - return 1; + cout << "In " << scheduleName << " the input file has more minutes than the test was defined with\n"; + return false; } // Update the value if (!hourInput) { @@ -3994,7 +3999,13 @@ int readSchedule(HPWH::Schedule &scheduleArray, string scheduleFileName, long mi } inputFile.close(); - return 0; + return true; +} + +inline bool getBool(const std::string sValue){ + if((sValue == "F") || (sValue == "false") || (sValue == "False") || (stod(sValue) == 0.)) + return false; + return true; } bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo &controlInfo) @@ -4008,20 +4019,17 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & return false; } + controlInfo.outputCode = 0; controlInfo.timeToRun_min = 0; controlInfo.setpointT_C = 0.; - controlInfo.initialTankT_C = 0.; - controlInfo.doCondu = 1; - controlInfo.doInvMix = 1; - controlInfo.inletH = 0.; - controlInfo.tankSize_gal = 0.; - controlInfo.tot_limit = 0.; + controlInfo.initialTankT_C = nullptr; + controlInfo.doConduction = true; + controlInfo.doInversionMixing = true; + controlInfo.inletH = nullptr; + controlInfo.tankSize_gal = nullptr; + controlInfo.tot_limit = nullptr; controlInfo.useSoC = false; - controlInfo.hasInitialTankTemp = false; - controlInfo.temperature_units = "C"; - - //const double soCMinTUse_C = F_TO_C(110.); - //const double soCMains_C = F_TO_C(65.); + controlInfo.temperatureUnits = "C"; std::string token; std::string sValue; @@ -4033,29 +4041,28 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & controlInfo.timeToRun_min = std::stoi(sValue); } else if(token == "doInversionMixing") { - controlInfo.doInvMix = (std::stod(sValue) > 0.0) ? 1 : 0; + controlInfo.doInversionMixing = getBool(sValue); } else if(token == "doConduction") { - controlInfo.doCondu = (std::stod(sValue) > 0.0) ? 1 : 0; + controlInfo.doConduction = getBool(sValue); } else if(token == "inletH") { - controlInfo.inletH = std::stod(sValue); + controlInfo.inletH = std::unique_ptr(new double(std::stod(sValue))); } else if(token == "tanksize") { - controlInfo.tankSize_gal = std::stod(sValue); + controlInfo.tankSize_gal = std::unique_ptr(new double(std::stod(sValue))); } else if(token == "tot_limit") { - controlInfo.tot_limit = std::stod(sValue); + controlInfo.tot_limit = std::unique_ptr(new double(std::stod(sValue))); } else if(token == "useSoC") { - controlInfo.useSoC = static_cast(std::stoi(sValue)); + controlInfo.useSoC = getBool(sValue); } else if(token == "initialTankT_C") { // Initialize at this temperature instead of setpoint - controlInfo.initialTankT_C = std::stod(sValue); - controlInfo.hasInitialTankTemp = true; + controlInfo.initialTankT_C = std::unique_ptr(new double(std::stod(sValue))); } else if(token == "temperature_units") { // Initialize at this temperature instead of setpoint - controlInfo.temperature_units = sValue; + controlInfo.temperatureUnits = sValue; } else { cout << token << " in testInfo.txt is an unrecogized key.\n"; @@ -4063,9 +4070,10 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & } controlFile.close(); - if(controlInfo.temperature_units == "F") { + if(controlInfo.temperatureUnits == "F") { controlInfo.setpointT_C = F_TO_C(controlInfo.setpointT_C); - controlInfo.initialTankT_C = F_TO_C(controlInfo.initialTankT_C); + if (controlInfo.initialTankT_C !=nullptr) + *controlInfo.initialTankT_C=F_TO_C(*controlInfo.initialTankT_C); } if(controlInfo.timeToRun_min == 0) { @@ -4087,25 +4095,21 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn scheduleNames.push_back("setpoint"); scheduleNames.push_back("SoC"); + long outputCode = controlInfo.outputCode; allSchedules.reserve(scheduleNames.size()); - int outputCode = 0; - for(auto i = 0; (unsigned)i < scheduleNames.size(); i++) { + for(auto i = 0; i < scheduleNames.size(); i++) { std::string fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; Schedule schedule; - outputCode = readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min); - if(outputCode != 0) { + if(!readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min)) { if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { - cout << "readSchedule returns an error on " << scheduleNames[i] << " schedule!\n"; + std::cout << "readSchedule returns an error on " << scheduleNames[i] << " schedule!\n"; return false; } - else { - outputCode = 0; - } } allSchedules.push_back(schedule); } - if(controlInfo.temperature_units == "F") { + if(controlInfo.temperatureUnits == "F") { for(auto &T: allSchedules[0]) { T = F_TO_C(T); } @@ -4119,37 +4123,35 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn T = F_TO_C(T); } } - if (controlInfo.doInvMix == 0) { - outputCode += setDoInversionMixing(false); - } - if (controlInfo.doCondu == 0) { - outputCode += setDoConduction(false); - } + setDoInversionMixing(controlInfo.doInversionMixing); + setDoConduction(controlInfo.doConduction); + if (controlInfo.setpointT_C > 0.) { if (!allSchedules[5].empty()) { setSetpoint(allSchedules[5][0]); //expect this to fail sometimes - if (controlInfo.hasInitialTankTemp) - setTankToTemperature(controlInfo.initialTankT_C); + if (controlInfo.initialTankT_C != nullptr) + setTankToTemperature(*controlInfo.initialTankT_C); else resetTankToSetpoint(); } else { setSetpoint(controlInfo.setpointT_C); - if (controlInfo.hasInitialTankTemp) - setTankToTemperature(controlInfo.initialTankT_C); + if (controlInfo.initialTankT_C != nullptr) + setTankToTemperature(*controlInfo.initialTankT_C); else resetTankToSetpoint(); } } - if (controlInfo.inletH > 0) { - outputCode += setInletByFraction(controlInfo.inletH); + + if (controlInfo.inletH != nullptr) { + outputCode += setInletByFraction(*controlInfo.inletH); } - if (controlInfo.tankSize_gal > 0) { - setTankSize(controlInfo.tankSize_gal, HPWH::UNITS_GAL); + if (controlInfo.tankSize_gal != nullptr) { + outputCode += setTankSize(*controlInfo.tankSize_gal, HPWH::UNITS_GAL); } - if (controlInfo.tot_limit > 0) { - outputCode += setTimerLimitTOT(controlInfo.tot_limit); + if (controlInfo.tot_limit != nullptr) { + outputCode += setTimerLimitTOT(*controlInfo.tot_limit); } if (controlInfo.useSoC) { if (allSchedules[6].empty()) { diff --git a/src/HPWH.hh b/src/HPWH.hh index b3e29ad2..3ffde725 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -821,18 +821,17 @@ public: void addExtraHeatAboveNode(double qAdd_kJ,const int nodeNum); struct ControlInfo{ - double outputCode = 0; - long timeToRun_min = 0; - double setpointT_C = 0.; - double initialTankT_C = 0.; - double doCondu = 1; - double doInvMix = 1; - double inletH = 0.; - double tankSize_gal = 0.; - double tot_limit = 0.; - bool useSoC = false; - bool hasInitialTankTemp = false; - std::string temperature_units = "C"; + long outputCode; + long timeToRun_min; + double setpointT_C; + std::unique_ptr initialTankT_C; + bool doConduction; + bool doInversionMixing; + std::unique_ptr inletH; + std::unique_ptr tankSize_gal; + std::unique_ptr tot_limit; + bool useSoC; + std::string temperatureUnits; }; bool readControlInfo(const std::string &testDirectory, ControlInfo &controlInfo); diff --git a/test/24hr67_high_Preset_Rheem2020Build40.csv b/test/24hr67_high_Preset_Rheem2020Build40.csv new file mode 100644 index 00000000..9bb39d5a --- /dev/null +++ b/test/24hr67_high_Preset_Rheem2020Build40.csv @@ -0,0 +1,1441 @@ +minutes,Ta,Tsetpoint,inletT,draw,DRstatus,h_src1In (Wh),h_src1Out (Wh),h_src2In (Wh),h_src2Out (Wh),h_src3In (Wh),h_src3Out (Wh),tcouple1 (C),tcouple2 (C),tcouple3 (C),tcouple4 (C),tcouple5 (C),tcouple6 (C), toutlet (C) +0, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.19,48.56,51.65,51.65,51.65,51.65,51.66 +2, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.97,43.62,50.10,51.64,51.64,51.64,51.65 +3, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,25.90,32.97,46.12,51.62,51.63,51.63,51.64 +4, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.74,26.07,41.02,50.08,51.62,51.62,51.63 +5, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.73,24.04,32.33,46.12,51.60,51.61,51.62 +6, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.17,22.40,25.48,41.02,50.06,51.60,51.61 +7, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,21.67,21.67,23.61,32.38,46.13,51.57,51.60 +8, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,21.29,21.29,22.16,25.54,41.02,50.04,51.58 +9, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,21.01,21.01,21.49,23.62,32.44,46.12,51.53 +10, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.12,22.12,22.12,23.62,32.44,46.10, +11, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.01,23.01,23.01,23.80,32.44,46.09, +12, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.83,23.83,23.83,24.20,32.44,46.07, +13, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.63,24.63,24.63,24.63,32.44,46.05, +14, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,25.34,25.34,25.34,25.34,32.44,46.03, +15, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.06,26.06,26.06,26.06,32.45,46.02, +16, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.76,26.76,26.76,26.76,32.47,46.00, +17, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,27.40,27.40,27.40,27.40,32.78,45.98, +18, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.03,28.03,28.03,28.03,33.09,45.97, +19, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.67,28.67,28.67,28.67,33.39,45.95, +20, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.30,29.30,29.30,29.30,33.70,45.93, +21, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.93,29.93,29.93,29.93,34.01,45.91, +22, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.57,30.57,30.57,30.57,34.33,45.90, +23, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.20,31.20,31.20,31.20,34.64,45.88, +24, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.83,31.83,31.83,31.83,34.95,45.86, +25, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.46,32.46,32.46,32.46,35.26,45.84, +26, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.09,33.09,33.09,33.09,35.58,45.83, +27, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.73,33.73,33.73,33.73,35.89,45.81, +28, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.36,34.36,34.36,34.36,36.21,45.79, +29, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.99,34.99,34.99,34.99,36.52,45.77, +30, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.62,35.62,35.62,35.62,36.84,45.76, +31, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.28,35.28,35.61,35.61,36.43,44.10,47.96 +32, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.97,34.97,35.55,35.61,36.16,42.55,46.47 +33, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.94,35.94,35.94,35.94,36.33,42.54, +34, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.57,36.57,36.57,36.57,36.64,42.52, +35, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.15,37.15,37.15,37.15,37.15,42.51, +36, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.72,37.72,37.72,37.72,37.72,42.50, +37, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.29,38.29,38.29,38.29,38.29,42.48, +38, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.85,38.85,38.85,38.85,38.85,42.47, +39, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.42,39.42,39.42,39.42,39.42,42.46, +40, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.98,39.98,39.98,39.98,39.98,42.45, +41, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.28,39.28,39.98,39.98,39.98,41.66,44.67 +42, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.25,40.25,40.25,40.25,40.25,41.70, +43, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.77,40.77,40.77,40.77,40.77,41.95, +44, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.28,41.28,41.28,41.28,41.28,42.20, +45, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.79,41.79,41.79,41.79,41.79,42.45, +46, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.31,42.31,42.31,42.31,42.31,42.70, +47, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.82,42.82,42.82,42.82,42.82,42.94, +48, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.31,43.31,43.31,43.31,43.31,43.31, +49, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.78,43.78,43.78,43.78,43.78,43.78, +50, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.25,44.25,44.25,44.25,44.25,44.25, +51, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.71,44.71,44.71,44.71,44.71,44.71, +52, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.18,45.18,45.18,45.18,45.18,45.18, +53, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.65,45.65,45.65,45.65,45.65,45.65, +54, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.12,46.12,46.12,46.12,46.12,46.12, +55, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.59,46.59,46.59,46.59,46.59,46.59, +56, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.05,47.05,47.05,47.05,47.05,47.05, +57, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.52,47.52,47.52,47.52,47.52,47.52, +58, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.99,47.99,47.99,47.99,47.99,47.99, +59, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.46,48.46,48.46,48.46,48.46,48.46, +60, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.92,48.92,48.92,48.92,48.92,48.92, +61, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.39,49.39,49.39,49.39,49.39,49.39, +62, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.86,49.86,49.86,49.86,49.86,49.86, +63, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.32,50.32,50.32,50.32,50.32,50.32, +64, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.79,50.79,50.79,50.79,50.79,50.79, +65, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.26,51.26,51.26,51.26,51.26,51.26, +66, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,66.26,66.26,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +67, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +68, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +69, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +70, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +71, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +72, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +73, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +74, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +75, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +76, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +77, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +78, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +79, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +80, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +81, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +82, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +83, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +84, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +85, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +86, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +87, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +88, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +89, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +90, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +91, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +92, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +93, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +94, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +95, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +96, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +97, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +98, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +99, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +101, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.57,49.62,51.38,51.38,51.38,51.38,51.39 +102, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,46.75,50.87,51.37,51.37,51.37,51.38 +103, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.76,42.34,49.56,51.36,51.36,51.36,51.37 +104, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.25,37.53,47.45,51.19,51.35,51.35,51.36 +105, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.06,33.65,44.49,50.63,51.34,51.34,51.35 +106, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.10,32.75,43.47,50.28,51.32,51.33,51.34 +107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.85,33.85,43.46,50.27,51.31,51.32, +108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.28,35.28,43.45,50.26,51.30,51.31, +109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.70,36.70,43.45,50.25,51.29,51.30, +110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.12,38.12,43.44,50.24,51.28,51.29, +111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.55,39.55,43.44,50.23,51.27,51.28, +112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.90,40.90,43.55,50.22,51.26,51.27, +113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.04,42.04,44.12,50.21,51.25,51.26, +114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.18,43.18,44.68,50.20,51.24,51.25, +115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.31,44.31,45.25,50.19,51.24,51.24, +116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.45,45.45,45.81,50.18,51.23,51.23, +117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.51,46.51,46.51,50.16,51.22,51.22, +118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.46,47.46,47.46,50.15,51.21,51.21, +119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.40,48.40,48.40,50.15,51.20,51.20, +120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.34,49.34,49.34,50.14,51.19,51.19, +121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.16,50.16,50.16,50.49,51.18,51.18, +122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.95,50.95,50.95,50.95,51.17,51.17, +123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.49,51.49,51.49,51.49,51.49,51.49, +124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,29.41,29.41,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, +160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, +161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, +162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, +163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, +164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, +165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, +166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, +167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, +168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, +169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, +170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, +171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, +172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, +173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, +174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, +175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, +176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, +177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, +178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, +179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, +180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, +181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, +182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, +183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, +184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, +185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, +186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, +187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, +188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, +189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, +190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, +191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, +192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, +193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, +194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, +195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, +196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, +197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, +198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, +199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, +200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, +201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, +202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, +203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, +204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, +205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, +206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, +207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, +208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, +209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, +210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, +211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, +212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, +213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, +214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, +215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, +216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, +217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, +218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, +219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, +220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, +221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, +222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, +223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, +224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, +225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, +226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, +227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, +228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, +229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, +230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, +231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, +232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, +233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, +234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, +235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, +236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, +237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, +238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, +239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, +240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, +241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, +242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, +243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, +244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, +245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, +246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, +247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, +248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, +249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, +250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, +251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, +252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, +253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, +254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, +255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, +256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, +257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, +258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, +259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, +260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, +261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, +262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, +263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, +264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, +265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, +266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, +267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, +268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, +269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, +270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, +271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, +272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, +273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, +274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, +275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, +276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, +277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, +278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, +279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, +280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, +281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, +282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, +283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, +284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, +285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, +286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, +287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, +288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, +289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, +290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, +291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, +292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, +293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, +294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, +295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, +296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, +297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, +298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, +299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, +300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, +301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, +302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, +303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, +304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, +305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, +306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, +307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, +308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, +309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, +310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, +311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, +312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, +313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, +314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, +315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, +316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, +317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, +318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, +319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, +320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, +321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, +322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, +323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, +324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, +325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, +326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, +327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, +328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, +329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, +330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, +331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, +332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, +333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, +334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, +335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, +336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, +337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, +338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, +339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, +340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, +341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, +342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, +343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, +344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, +345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, +346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, +347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, +348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, +349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, +350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, +351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, +352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, +353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, +354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, +355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, +356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, +357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, +358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, +359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, +360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, +361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, +362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, +363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, +364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, +365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, +366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, +367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, +368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, +369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, +370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, +371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, +372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, +373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, +374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, +375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, +376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, +377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, +378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, +379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, +380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, +381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, +382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, +383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, +384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, +385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, +386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, +387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, +388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, +389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, +390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, +391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, +392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, +393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, +394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, +395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, +396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, +397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, +398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, +399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, +400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, +401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, +402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, +403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, +404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, +405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, +406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, +407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, +408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, +409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, +410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, +411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, +412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, +413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, +414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, +415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, +416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, +417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, +418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, +419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, +420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, +421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, +422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, +423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, +424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, +425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, +426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, +427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, +428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, +429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, +430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, +431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, +432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, +433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, +434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, +435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, +436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, +437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, +438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, +439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, +440, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, +441, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, +442, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, +443, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, +444, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, +445, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, +446, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, +447, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, +448, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, +449, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, +450, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, +451, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, +452, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, +453, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, +454, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, +455, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, +456, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, +457, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, +458, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, +459, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, +460, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, +461, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, +462, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, +463, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, +464, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, +465, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, +466, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, +467, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, +468, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, +469, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, +470, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, +471, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, +472, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, +473, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, +474, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, +475, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, +476, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, +477, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, +478, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, +479, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, +480, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, +481, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, +482, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, +483, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, +484, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, +485, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, +486, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, +487, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, +488, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, +489, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, +490, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, +491, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, +492, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, +493, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, +494, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, +495, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, +496, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, +497, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, +498, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, +499, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, +500, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, +501, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, +502, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, +503, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, +504, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, +505, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, +506, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, +507, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.48,48.63,48.63,48.63,48.63,48.63, +508, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.47,48.62,48.63,48.63,48.63,48.63, +509, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.46,48.62,48.62,48.62,48.62,48.62, +510, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.45,48.61,48.61,48.61,48.61,48.61, +511, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.44,48.60,48.60,48.60,48.60,48.60, +512, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.43,48.59,48.60,48.60,48.60,48.60, +513, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.42,48.59,48.59,48.59,48.59,48.59, +514, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.41,48.58,48.58,48.58,48.58,48.58, +515, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.40,48.57,48.57,48.57,48.57,48.57, +516, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.39,48.56,48.57,48.57,48.57,48.57, +517, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.38,48.56,48.56,48.56,48.56,48.56, +518, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.37,48.55,48.55,48.55,48.55,48.55, +519, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.36,48.54,48.54,48.54,48.54,48.54, +520, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.35,48.53,48.54,48.54,48.54,48.54, +521, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.34,48.52,48.53,48.53,48.53,48.53, +522, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.52,48.52,48.52,48.52,48.52, +523, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.51,48.51,48.51,48.51,48.51, +524, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.32,48.50,48.51,48.51,48.51,48.51, +525, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.31,48.49,48.50,48.50,48.50,48.50, +526, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.30,48.49,48.49,48.49,48.49,48.49, +527, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.29,48.48,48.48,48.48,48.48,48.48, +528, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.28,48.47,48.47,48.47,48.47,48.47, +529, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.27,48.46,48.47,48.47,48.47,48.47, +530, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.26,48.46,48.46,48.46,48.46,48.46, +531, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.25,48.45,48.45,48.45,48.45,48.45, +532, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.24,48.44,48.44,48.44,48.44,48.44, +533, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.23,48.43,48.44,48.44,48.44,48.44, +534, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.22,48.42,48.43,48.43,48.43,48.43, +535, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.21,48.42,48.42,48.42,48.42,48.42, +536, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.20,48.41,48.41,48.41,48.41,48.41, +537, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.19,48.40,48.41,48.41,48.41,48.41, +538, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.18,48.39,48.40,48.40,48.40,48.40, +539, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.17,48.39,48.39,48.39,48.39,48.39, +540, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.16,48.38,48.38,48.38,48.38,48.38, +541, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.15,48.37,48.38,48.38,48.38,48.38, +542, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.14,48.36,48.37,48.37,48.37,48.37, +543, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.13,48.36,48.36,48.36,48.36,48.36, +544, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.12,48.35,48.35,48.35,48.35,48.35, +545, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.11,48.34,48.35,48.35,48.35,48.35, +546, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.10,48.33,48.34,48.34,48.34,48.34, +547, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.09,48.32,48.33,48.33,48.33,48.33, +548, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.09,48.32,48.32,48.32,48.32,48.32, +549, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.08,48.31,48.32,48.32,48.32,48.32, +550, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.07,48.30,48.31,48.31,48.31,48.31, +551, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.06,48.29,48.30,48.30,48.30,48.30, +552, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.05,48.29,48.29,48.29,48.29,48.29, +553, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.04,48.28,48.29,48.29,48.29,48.29, +554, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.03,48.27,48.28,48.28,48.28,48.28, +555, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.02,48.26,48.27,48.27,48.27,48.27, +556, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.01,48.26,48.26,48.26,48.26,48.26, +557, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.00,48.25,48.26,48.26,48.26,48.26, +558, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.99,48.24,48.25,48.25,48.25,48.25, +559, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.98,48.23,48.24,48.24,48.24,48.24, +560, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.97,48.23,48.23,48.23,48.23,48.23, +561, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.96,48.22,48.23,48.23,48.23,48.23, +562, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.95,48.21,48.22,48.22,48.22,48.22, +563, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.94,48.20,48.21,48.21,48.21,48.21, +564, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.93,48.19,48.20,48.20,48.20,48.20, +565, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.92,48.19,48.20,48.20,48.20,48.20, +566, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.91,48.18,48.19,48.19,48.19,48.19, +567, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.91,48.17,48.18,48.18,48.18,48.18, +568, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.90,48.16,48.17,48.17,48.17,48.17, +569, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.89,48.16,48.17,48.17,48.17,48.17, +570, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.88,48.15,48.16,48.16,48.16,48.16, +571, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.87,48.14,48.15,48.15,48.15,48.15, +572, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.86,48.13,48.14,48.14,48.14,48.14, +573, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.85,48.13,48.14,48.14,48.14,48.14, +574, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.84,48.12,48.13,48.13,48.13,48.13, +575, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.83,48.11,48.12,48.12,48.12,48.12, +576, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.82,48.10,48.11,48.11,48.11,48.11, +577, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.81,48.10,48.11,48.11,48.11,48.11, +578, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.80,48.09,48.10,48.10,48.10,48.10, +579, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.79,48.08,48.09,48.09,48.09,48.09, +580, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.78,48.07,48.08,48.08,48.08,48.08, +581, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.77,48.06,48.08,48.08,48.08,48.08, +582, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.76,48.06,48.07,48.07,48.07,48.07, +583, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.75,48.05,48.06,48.06,48.06,48.06, +584, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.75,48.04,48.06,48.06,48.06,48.06, +585, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.74,48.03,48.05,48.05,48.05,48.05, +586, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.73,48.03,48.04,48.04,48.04,48.04, +587, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.72,48.02,48.03,48.03,48.03,48.03, +588, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.71,48.01,48.03,48.03,48.03,48.03, +589, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.70,48.00,48.02,48.02,48.02,48.02, +590, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.69,48.00,48.01,48.01,48.01,48.01, +591, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.68,47.99,48.00,48.00,48.00,48.00, +592, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.67,47.98,48.00,48.00,48.00,48.00, +593, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.66,47.97,47.99,47.99,47.99,47.99, +594, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.65,47.97,47.98,47.98,47.98,47.98, +595, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.64,47.96,47.97,47.97,47.97,47.97, +596, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.63,47.95,47.97,47.97,47.97,47.97, +597, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.62,47.94,47.96,47.96,47.96,47.96, +598, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.61,47.94,47.95,47.95,47.95,47.95, +599, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.61,47.93,47.94,47.94,47.94,47.94, +600, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.60,47.92,47.94,47.94,47.94,47.94, +601, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.59,47.91,47.93,47.93,47.93,47.93, +602, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.58,47.90,47.92,47.92,47.92,47.92, +603, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.57,47.90,47.91,47.91,47.91,47.91, +604, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.56,47.89,47.91,47.91,47.91,47.91, +605, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.55,47.88,47.90,47.90,47.90,47.90, +606, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.54,47.87,47.89,47.89,47.89,47.89, +607, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.53,47.87,47.88,47.88,47.88,47.88, +608, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.52,47.86,47.88,47.88,47.88,47.88, +609, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.51,47.85,47.87,47.87,47.87,47.87, +610, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.50,47.84,47.86,47.86,47.86,47.86, +611, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,47.84,47.85,47.85,47.85,47.85, +612, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,47.83,47.85,47.85,47.85,47.85, +613, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.48,47.82,47.84,47.84,47.84,47.84, +614, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.47,47.81,47.83,47.83,47.83,47.83, +615, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.46,47.81,47.83,47.83,47.83,47.83, +616, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.45,47.80,47.82,47.82,47.82,47.82, +617, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.44,47.79,47.81,47.81,47.81,47.81, +618, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.43,47.78,47.80,47.80,47.80,47.80, +619, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.42,47.78,47.80,47.80,47.80,47.80, +620, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.41,47.77,47.79,47.79,47.79,47.79, +621, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.40,47.76,47.78,47.78,47.78,47.78, +622, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.39,47.75,47.77,47.77,47.77,47.77, +623, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.38,47.74,47.77,47.77,47.77,47.77, +624, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.38,47.74,47.76,47.76,47.76,47.76, +625, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.37,47.73,47.75,47.75,47.75,47.75, +626, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.36,47.72,47.74,47.74,47.74,47.74, +627, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.35,47.71,47.74,47.74,47.74,47.74, +628, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.34,47.71,47.73,47.73,47.73,47.73, +629, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.33,47.70,47.72,47.72,47.72,47.72, +630, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.32,47.69,47.71,47.71,47.71,47.71, +631, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.93,44.49,47.70,47.71,47.71,47.71,47.71 +632, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,25.65,39.54,46.18,47.70,47.70,47.70,47.71 +633, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.97,30.37,42.31,47.68,47.69,47.69,47.70 +634, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.25,24.79,37.39,46.17,47.68,47.68,47.69 +635, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.45,23.26,29.86,42.31,47.66,47.67,47.68 +636, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.28,24.28,29.86,42.30,47.65,47.66, +637, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,25.55,25.55,30.18,42.30,47.64,47.66, +638, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.69,26.69,30.74,42.29,47.62,47.65, +639, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,27.83,27.83,31.31,42.28,47.61,47.64, +640, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.97,28.97,31.87,42.27,47.60,47.63, +641, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.11,30.11,32.44,42.26,47.59,47.62, +642, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.25,31.25,33.01,42.26,47.58,47.61, +643, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.39,32.39,33.58,42.25,47.57,47.60, +644, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.53,33.53,34.15,42.24,47.55,47.59, +645, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.67,34.67,34.72,42.23,47.54,47.58, +646, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.63,35.63,35.63,42.22,47.53,47.57, +647, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.58,36.58,36.58,42.22,47.52,47.56, +648, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.53,37.53,37.53,42.21,47.51,47.55, +649, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.47,38.47,38.47,42.21,47.50,47.55, +650, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.42,39.42,39.42,42.20,47.49,47.54, +651, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.30,40.30,40.30,42.40,47.47,47.53, +652, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.11,41.11,41.11,42.80,47.46,47.52, +653, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.92,41.92,41.92,43.21,47.45,47.51, +654, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.73,42.73,42.73,43.61,47.44,47.50, +655, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.53,43.53,43.53,44.01,47.43,47.49, +656, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.34,44.34,44.34,44.42,47.42,47.48, +657, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.07,45.07,45.07,45.07,47.41,47.47, +658, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.77,45.77,45.77,45.77,47.40,47.46, +659, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.48,46.48,46.48,46.48,47.39,47.45, +660, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.19,47.19,47.19,47.19,47.38,47.44, +661, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.73,47.73,47.73,47.73,47.73,47.73, +662, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.20,48.20,48.20,48.20,48.20,48.20, +663, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.66,48.66,48.66,48.66,48.66,48.66, +664, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.13,49.13,49.13,49.13,49.13,49.13, +665, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.60,49.60,49.60,49.60,49.60,49.60, +666, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.06,50.06,50.06,50.06,50.06,50.06, +667, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.53,50.53,50.53,50.53,50.53,50.53, +668, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.00,51.00,51.00,51.00,51.00,51.00, +669, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.46,51.46,51.46,51.46,51.46,51.46, +670, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,33.58,33.58,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +671, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +672, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +673, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +674, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +675, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +676, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +677, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +678, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +679, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +680, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +681, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +682, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +683, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +684, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +685, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +686, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +687, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +688, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +689, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +690, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +691, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.70,49.74,51.49,51.49,51.49,51.49,51.50 +692, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,46.88,50.99,51.49,51.49,51.49,51.49 +693, 19.722222, 51.666667, 14.444444, 1.600000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.22,42.61,49.76,51.48,51.48,51.48,51.49 +694, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.22,42.60,49.74,51.47,51.47,51.47, +695, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.59,49.73,51.46,51.46,51.46, +696, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.59,49.72,51.45,51.45,51.45, +697, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.58,49.71,51.44,51.44,51.44, +698, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.57,49.69,51.43,51.43,51.43, +699, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.57,49.68,51.42,51.42,51.42, +700, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.56,49.67,51.41,51.41,51.41, +701, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.55,49.65,51.40,51.40,51.40, +702, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.55,49.64,51.39,51.39,51.39, +703, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.54,49.63,51.39,51.39,51.39, +704, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.53,49.62,51.38,51.38,51.38, +705, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.27,42.53,49.60,51.37,51.37,51.37, +706, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.27,42.52,49.59,51.36,51.36,51.36, +707, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.28,42.52,49.58,51.35,51.35,51.35, +708, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.28,42.51,49.57,51.34,51.34,51.34, +709, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.28,42.50,49.56,51.33,51.33,51.33, +710, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.29,42.50,49.54,51.32,51.32,51.32, +711, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.29,42.49,49.53,51.31,51.31,51.31, +712, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.29,42.48,49.52,51.30,51.30,51.30, +713, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.30,42.48,49.51,51.29,51.29,51.29, +714, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.30,42.47,49.49,51.29,51.29,51.29, +715, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.31,42.46,49.48,51.28,51.28,51.28, +716, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.31,42.46,49.47,51.27,51.27,51.27, +717, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.31,42.45,49.46,51.26,51.26,51.26, +718, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.32,42.44,49.45,51.25,51.25,51.25, +719, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.32,42.44,49.43,51.24,51.24,51.24, +720, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.33,42.43,49.42,51.23,51.23,51.23, +721, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.89,38.87,48.24,51.12,51.22,51.22,51.23 +722, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.74,38.87,48.23,51.11,51.21,51.21, +723, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.29,39.17,48.21,51.10,51.20,51.20, +724, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.15,40.15,48.20,51.09,51.19,51.19, +725, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.58,41.58,48.19,51.08,51.19,51.19, +726, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.00,43.00,48.17,51.07,51.18,51.18, +727, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.42,44.42,48.16,51.06,51.17,51.17, +728, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.84,45.84,48.16,51.05,51.16,51.16, +729, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.12,47.12,48.42,51.04,51.15,51.15, +730, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.25,48.25,48.98,51.03,51.14,51.14, +731, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.39,49.39,49.54,51.03,51.13,51.13, +732, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.38,50.38,50.38,51.02,51.12,51.12, +733, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.20,51.20,51.20,51.20,51.20,51.20, +734, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +735, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,1.43,1.43,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +736, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +737, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +738, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +739, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +740, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +741, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +742, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +743, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +744, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +745, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +746, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +747, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +748, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +749, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +750, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +751, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +752, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +753, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +754, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +755, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +756, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +757, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +758, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +759, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +760, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +761, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +762, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +763, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +764, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +765, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +766, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.19,50.37,51.41,51.41,51.41,51.41,51.42 +767, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.18,50.37,51.40,51.40,51.40,51.40, +768, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.17,50.36,51.39,51.40,51.40,51.40, +769, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.16,50.35,51.38,51.39,51.39,51.39, +770, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.15,50.35,51.37,51.38,51.38,51.38, +771, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.63,51.19,51.37,51.37,51.37,51.38 +772, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.62,51.18,51.36,51.36,51.36, +773, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.62,51.17,51.35,51.35,51.35, +774, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.61,51.16,51.34,51.34,51.34, +775, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.87,48.60,51.15,51.33,51.33,51.33, +776, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.87,48.60,51.14,51.33,51.33,51.33, +777, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.86,48.59,51.13,51.32,51.32,51.32, +778, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.86,48.59,51.12,51.31,51.31,51.31, +779, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.85,48.58,51.11,51.30,51.30,51.30, +780, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.85,48.57,51.10,51.29,51.29,51.29, +781, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.84,48.57,51.09,51.28,51.28,51.28, +782, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.84,48.56,51.08,51.27,51.27,51.27, +783, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.83,48.55,51.07,51.26,51.26,51.26, +784, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.83,48.55,51.06,51.26,51.26,51.26, +785, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.82,48.54,51.05,51.25,51.25,51.25, +786, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.82,48.54,51.04,51.24,51.24,51.24, +787, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.81,48.53,51.03,51.23,51.23,51.23, +788, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.81,48.52,51.02,51.22,51.22,51.22, +789, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.80,48.52,51.01,51.21,51.21,51.21, +790, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.80,48.51,51.00,51.20,51.20,51.20, +791, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.79,48.50,50.99,51.19,51.19,51.19, +792, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.79,48.50,50.98,51.19,51.19,51.19, +793, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.78,48.49,50.97,51.18,51.18,51.18, +794, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.78,48.48,50.96,51.17,51.17,51.17, +795, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.77,48.48,50.95,51.16,51.16,51.16, +796, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.77,48.47,50.94,51.15,51.15,51.15, +797, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.76,48.46,50.93,51.14,51.14,51.14, +798, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.76,48.46,50.92,51.13,51.13,51.13, +799, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.75,48.45,50.91,51.12,51.12,51.12, +800, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.75,48.44,50.90,51.12,51.12,51.12, +801, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.74,48.44,50.89,51.11,51.11,51.11, +802, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.74,48.43,50.88,51.10,51.10,51.10, +803, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.42,50.87,51.09,51.09,51.09, +804, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.41,50.86,51.08,51.08,51.08, +805, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.41,50.85,51.07,51.07,51.07, +806, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.72,48.40,50.84,51.06,51.06,51.06, +807, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.72,48.39,50.83,51.06,51.06,51.06, +808, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.71,48.39,50.82,51.05,51.05,51.05, +809, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.71,48.38,50.81,51.04,51.04,51.04, +810, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.70,48.37,50.80,51.03,51.03,51.03, +811, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.70,48.37,50.79,51.02,51.02,51.02, +812, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.69,48.36,50.78,51.01,51.01,51.01, +813, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.69,48.35,50.77,51.00,51.00,51.00, +814, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.34,50.76,50.99,50.99,50.99, +815, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.34,50.75,50.99,50.99,50.99, +816, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.33,50.74,50.98,50.98,50.98, +817, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.67,48.32,50.73,50.97,50.97,50.97, +818, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.67,48.31,50.72,50.96,50.96,50.96, +819, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.66,48.31,50.71,50.95,50.95,50.95, +820, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.66,48.30,50.70,50.94,50.94,50.94, +821, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.65,48.29,50.69,50.93,50.93,50.93, +822, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.65,48.29,50.68,50.93,50.93,50.93, +823, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.64,48.28,50.67,50.92,50.92,50.92, +824, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.64,48.27,50.66,50.91,50.91,50.91, +825, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.26,50.65,50.90,50.90,50.90, +826, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.26,50.64,50.89,50.89,50.89, +827, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.25,50.63,50.88,50.88,50.88, +828, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.62,48.24,50.62,50.87,50.87,50.87, +829, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.62,48.23,50.61,50.86,50.86,50.86, +830, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.61,48.23,50.60,50.86,50.86,50.86, +831, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.61,48.22,50.59,50.85,50.85,50.85, +832, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.21,50.58,50.84,50.84,50.84, +833, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.20,50.57,50.83,50.83,50.83, +834, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.20,50.56,50.82,50.82,50.82, +835, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.59,48.19,50.55,50.81,50.81,50.81, +836, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.59,48.18,50.55,50.80,50.80,50.80, +837, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.58,48.17,50.54,50.80,50.80,50.80, +838, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.58,48.17,50.53,50.79,50.79,50.79, +839, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.16,50.52,50.78,50.78,50.78, +840, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.15,50.51,50.77,50.77,50.77, +841, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.14,50.50,50.76,50.76,50.76, +842, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.56,48.14,50.49,50.75,50.75,50.75, +843, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.56,48.13,50.48,50.74,50.74,50.74, +844, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.55,48.12,50.47,50.74,50.74,50.74, +845, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.55,48.11,50.46,50.73,50.73,50.73, +846, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.10,50.45,50.72,50.72,50.72, +847, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.10,50.44,50.71,50.71,50.71, +848, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.09,50.43,50.70,50.70,50.70, +849, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.53,48.08,50.42,50.69,50.69,50.69, +850, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.53,48.07,50.41,50.68,50.68,50.68, +851, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.52,48.07,50.40,50.67,50.67,50.67, +852, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.52,48.06,50.39,50.67,50.67,50.67, +853, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.05,50.39,50.66,50.66,50.66, +854, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.04,50.38,50.65,50.65,50.65, +855, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.03,50.37,50.64,50.64,50.64, +856, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.50,48.03,50.36,50.63,50.63,50.63, +857, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.50,48.02,50.35,50.62,50.62,50.62, +858, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.01,50.34,50.61,50.61,50.61, +859, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.00,50.33,50.61,50.61,50.61, +860, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.00,50.32,50.60,50.60,50.60, +861, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.48,47.99,50.31,50.59,50.59,50.59, +862, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.48,47.98,50.30,50.58,50.58,50.58, +863, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.47,47.97,50.29,50.57,50.57,50.57, +864, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.47,47.96,50.28,50.56,50.56,50.56, +865, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.96,50.28,50.55,50.55,50.55, +866, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.95,50.27,50.55,50.55,50.55, +867, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.94,50.26,50.54,50.54,50.54, +868, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.45,47.93,50.25,50.53,50.53,50.53, +869, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.45,47.92,50.24,50.52,50.52,50.52, +870, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.92,50.23,50.51,50.51,50.51, +871, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.91,50.22,50.50,50.50,50.50, +872, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.90,50.21,50.49,50.49,50.49, +873, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.43,47.89,50.20,50.49,50.49,50.49, +874, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.43,47.88,50.19,50.48,50.48,50.48, +875, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.88,50.18,50.47,50.47,50.47, +876, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.87,50.17,50.46,50.46,50.46, +877, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.86,50.17,50.45,50.45,50.45, +878, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.41,47.85,50.16,50.44,50.44,50.44, +879, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.41,47.84,50.15,50.43,50.43,50.43, +880, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.84,50.14,50.43,50.43,50.43, +881, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.83,50.13,50.42,50.42,50.42, +882, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.82,50.12,50.41,50.41,50.41, +883, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.39,47.81,50.11,50.40,50.40,50.40, +884, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.39,47.80,50.10,50.39,50.39,50.39, +885, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.79,50.09,50.38,50.38,50.38, +886, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.79,50.08,50.37,50.37,50.37, +887, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.78,50.08,50.37,50.37,50.37, +888, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.37,47.77,50.07,50.36,50.36,50.36, +889, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.37,47.76,50.06,50.35,50.35,50.35, +890, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.75,50.05,50.34,50.34,50.34, +891, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.75,50.04,50.33,50.33,50.33, +892, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.74,50.03,50.32,50.32,50.32, +893, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.35,47.73,50.02,50.31,50.31,50.31, +894, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.35,47.72,50.01,50.31,50.31,50.31, +895, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.71,50.00,50.30,50.30,50.30, +896, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.70,50.00,50.29,50.29,50.29, +897, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.70,49.99,50.28,50.28,50.28, +898, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.33,47.69,49.98,50.27,50.27,50.27, +899, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.33,47.68,49.97,50.26,50.26,50.26, +900, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.67,49.96,50.26,50.26,50.26, +901, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.66,49.95,50.25,50.25,50.25, +902, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.65,49.94,50.24,50.24,50.24, +903, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.31,47.65,49.93,50.23,50.23,50.23, +904, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.31,47.64,49.92,50.22,50.22,50.22, +905, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.63,49.92,50.21,50.21,50.21, +906, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.62,49.91,50.20,50.20,50.20, +907, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.61,49.90,50.20,50.20,50.20, +908, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.29,47.60,49.89,50.19,50.19,50.19, +909, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.29,47.60,49.88,50.18,50.18,50.18, +910, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.59,49.87,50.17,50.17,50.17, +911, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.58,49.86,50.16,50.16,50.16, +912, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.57,49.85,50.15,50.15,50.15, +913, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.27,47.56,49.85,50.14,50.14,50.14, +914, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.27,47.56,49.84,50.14,50.14,50.14, +915, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.55,49.83,50.13,50.13,50.13, +916, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.54,49.82,50.12,50.12,50.12, +917, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.53,49.81,50.11,50.11,50.11, +918, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.52,49.80,50.10,50.10,50.10, +919, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.51,49.79,50.09,50.09,50.09, +920, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.50,49.78,50.09,50.09,50.09, +921, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.24,47.50,49.78,50.08,50.08,50.08, +922, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.24,47.49,49.77,50.07,50.07,50.07, +923, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.48,49.76,50.06,50.06,50.06, +924, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.47,49.75,50.05,50.05,50.05, +925, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.46,49.74,50.04,50.04,50.04, +926, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.22,47.45,49.73,50.03,50.03,50.03, +927, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.22,47.45,49.72,50.03,50.03,50.03, +928, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.44,49.71,50.02,50.02,50.02, +929, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.43,49.71,50.01,50.01,50.01, +930, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.42,49.70,50.00,50.00,50.00, +931, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.20,47.41,49.69,49.99,49.99,49.99, +932, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.20,47.40,49.68,49.98,49.98,49.98, +933, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.40,49.67,49.98,49.98,49.98, +934, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.39,49.66,49.97,49.97,49.97, +935, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.38,49.65,49.96,49.96,49.96, +936, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.37,49.65,49.95,49.95,49.95, +937, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.36,49.64,49.94,49.94,49.94, +938, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.35,49.63,49.93,49.93,49.93, +939, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.17,47.35,49.62,49.93,49.93,49.93, +940, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.17,47.34,49.61,49.92,49.92,49.92, +941, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.33,49.60,49.91,49.91,49.91, +942, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.32,49.59,49.90,49.90,49.90, +943, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.31,49.58,49.89,49.89,49.89, +944, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.15,47.30,49.58,49.88,49.88,49.88, +945, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.15,47.29,49.57,49.87,49.87,49.87, +946, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.29,49.56,49.87,49.87,49.87, +947, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.28,49.55,49.86,49.86,49.86, +948, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.27,49.54,49.85,49.85,49.85, +949, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.26,49.53,49.84,49.84,49.84, +950, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.25,49.52,49.83,49.83,49.83, +951, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.24,49.52,49.82,49.82,49.82, +952, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.12,47.24,49.51,49.82,49.82,49.82, +953, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.12,47.23,49.50,49.81,49.81,49.81, +954, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.22,49.49,49.80,49.80,49.80, +955, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.21,49.48,49.79,49.79,49.79, +956, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.20,49.47,49.78,49.78,49.78, +957, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.19,49.46,49.77,49.77,49.77, +958, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.18,49.46,49.77,49.77,49.77, +959, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.18,49.45,49.76,49.76,49.76, +960, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.09,47.17,49.44,49.75,49.75,49.75, +961, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.95,44.75,49.11,49.74,49.74,49.74,49.75 +962, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.35,48.41,49.70,49.73,49.73,49.74 +963, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.35,48.40,49.69,49.72,49.72, +964, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.34,48.39,49.68,49.71,49.71, +965, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.34,48.37,49.67,49.71,49.71, +966, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.34,48.36,49.66,49.70,49.70, +967, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.34,48.35,49.66,49.69,49.69, +968, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.33,48.34,49.65,49.68,49.68, +969, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.33,48.33,49.64,49.67,49.67, +970, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.33,48.31,49.63,49.66,49.66, +971, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.32,48.30,49.62,49.65,49.65, +972, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.32,48.29,49.61,49.64,49.64, +973, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.32,48.28,49.61,49.64,49.64, +974, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,42.32,48.27,49.60,49.63,49.63, +975, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,42.31,48.25,49.59,49.62,49.62, +976, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.88,39.88,47.22,49.50,49.61,49.61,49.62 +977, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.74,37.54,45.87,49.31,49.60,49.60,49.61 +978, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.59,37.54,45.86,49.30,49.59,49.59, +979, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.49,38.49,45.84,49.30,49.58,49.58, +980, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.91,39.91,45.83,49.29,49.57,49.57, +981, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.33,41.33,45.82,49.28,49.56,49.56, +982, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.75,42.75,45.82,49.27,49.55,49.55, +983, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.15,44.15,45.86,49.26,49.54,49.54, +984, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.28,45.28,46.42,49.25,49.54,49.54, +985, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.42,46.42,46.99,49.24,49.53,49.53, +986, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.55,47.55,47.55,49.24,49.52,49.52, +987, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.49,48.49,48.49,49.23,49.51,49.51, +988, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.37,49.37,49.37,49.40,49.50,49.50, +989, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.89,49.89,49.89,49.89,49.89,49.89, +990, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.35,50.35,50.35,50.35,50.35,50.35, +991, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.74,48.66,50.34,50.35,50.35,50.35,50.35 +992, 19.722222, 51.666667, 14.444444, 0.300000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.82,47.72,50.25,50.34,50.34,50.34,50.35 +993, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.68,48.68,50.24,50.33,50.33,50.33, +994, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.10,50.10,50.23,50.32,50.32,50.32, +995, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.70,50.70,50.70,50.70,50.70,50.70, +996, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.16,51.16,51.16,51.16,51.16,51.16, +997, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.63,51.63,51.63,51.63,51.63,51.63, +998, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,6.99,6.99,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +999, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1000, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +1001, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +1002, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +1003, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +1004, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +1005, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +1006, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.83,49.85,51.60,51.60,51.60,51.60,51.61 +1007, 19.722222, 51.666667, 14.444444, 0.300000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.52,48.38,51.50,51.59,51.59,51.59,51.60 +1008, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.51,48.37,51.49,51.58,51.58,51.58, +1009, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.51,48.37,51.48,51.57,51.57,51.57, +1010, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.50,48.37,51.47,51.57,51.57,51.57, +1011, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.50,48.36,51.45,51.56,51.56,51.56, +1012, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.49,48.36,51.44,51.55,51.55,51.55, +1013, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.48,48.35,51.43,51.54,51.54,51.54, +1014, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.48,48.35,51.42,51.53,51.53,51.53, +1015, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.47,48.35,51.41,51.52,51.52,51.52, +1016, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.46,48.34,51.40,51.51,51.51,51.51, +1017, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.46,48.34,51.38,51.50,51.50,51.50, +1018, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.45,48.33,51.37,51.50,51.50,51.50, +1019, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.44,48.33,51.36,51.49,51.49,51.49, +1020, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.44,48.32,51.35,51.48,51.48,51.48, +1021, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,29.77,44.06,49.80,51.47,51.47,51.47,51.48 +1022, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.85,36.86,46.44,51.33,51.46,51.46,51.47 +1023, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.21,28.16,41.69,49.79,51.45,51.45,51.46 +1024, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.86,23.88,35.20,46.43,51.30,51.44,51.45 +1025, 19.722222, 51.666667, 14.444444, 2.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.22,23.22,30.22,43.27,50.28,51.43,51.44 +1026, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.65,24.65,30.22,43.26,50.27,51.42, +1027, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.07,26.07,30.22,43.25,50.26,51.40, +1028, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,27.30,27.30,30.63,43.25,50.25,51.39, +1029, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.44,28.44,31.20,43.24,50.23,51.38, +1030, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.58,29.58,31.77,43.23,50.22,51.37, +1031, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.72,30.72,32.34,43.22,50.21,51.35, +1032, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.86,31.86,32.91,43.21,50.20,51.34, +1033, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.00,33.00,33.48,43.20,50.19,51.33, +1034, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.11,34.11,34.11,43.19,50.18,51.32, +1035, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.06,35.06,35.06,43.18,50.17,51.31, +1036, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.01,36.01,36.01,43.17,50.15,51.29, +1037, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.95,36.95,36.95,43.16,50.14,51.28, +1038, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.90,37.90,37.90,43.16,50.13,51.27, +1039, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.85,38.85,38.85,43.15,50.12,51.26, +1040, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.79,39.79,39.79,43.15,50.11,51.25, +1041, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.73,40.73,40.73,43.18,50.10,51.23, +1042, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.54,41.54,41.54,43.58,50.09,51.22, +1043, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.35,42.35,42.35,43.98,50.08,51.21, +1044, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.16,43.16,43.16,44.38,50.06,51.20, +1045, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.97,43.97,43.97,44.78,50.05,51.19, +1046, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.78,44.78,44.78,45.19,50.04,51.17, +1047, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.58,45.58,45.58,45.59,50.03,51.16, +1048, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.29,46.29,46.29,46.29,50.02,51.15, +1049, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.00,47.00,47.00,47.00,50.01,51.14, +1050, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.70,47.70,47.70,47.70,50.00,51.13, +1051, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.41,48.41,48.41,48.41,49.99,51.11, +1052, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.11,49.11,49.11,49.11,50.02,51.10, +1053, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.73,49.73,49.73,49.73,50.33,51.09, +1054, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.36,50.36,50.36,50.36,50.63,51.08, +1055, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.98,50.98,50.98,50.98,50.98,51.07, +1056, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.46,51.46,51.46,51.46,51.46,51.46, +1057, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,34.53,34.53,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +1058, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1059, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +1060, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +1061, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +1062, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +1063, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +1064, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +1065, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +1066, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +1067, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +1068, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +1069, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +1070, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +1071, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +1072, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +1073, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +1074, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +1075, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +1076, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +1077, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +1078, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +1079, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +1080, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +1081, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +1082, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +1083, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +1084, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +1085, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +1086, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +1087, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +1088, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +1089, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +1090, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +1091, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +1092, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, +1093, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, +1094, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, +1095, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, +1096, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, +1097, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, +1098, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, +1099, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, +1100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, +1101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, +1102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, +1103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, +1104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, +1105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, +1106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, +1107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, +1108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, +1109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, +1110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, +1111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, +1112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, +1113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, +1114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, +1115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, +1116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, +1117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, +1118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, +1119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, +1120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, +1121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, +1122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, +1123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, +1124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, +1125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, +1126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, +1127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, +1128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, +1129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, +1130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, +1131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, +1132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, +1133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, +1134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, +1135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, +1136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, +1137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, +1138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, +1139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, +1140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, +1141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, +1142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, +1143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, +1144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, +1145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, +1146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, +1147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, +1148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, +1149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, +1150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, +1151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, +1152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, +1153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, +1154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, +1155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, +1156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, +1157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, +1158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, +1159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, +1160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, +1161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, +1162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, +1163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, +1164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, +1165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, +1166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, +1167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, +1168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, +1169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, +1170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, +1171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, +1172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, +1173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, +1174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, +1175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, +1176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, +1177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, +1178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, +1179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, +1180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, +1181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, +1182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, +1183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, +1184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, +1185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, +1186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, +1187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, +1188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, +1189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, +1190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, +1191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, +1192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, +1193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, +1194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, +1195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, +1196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, +1197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, +1198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, +1199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, +1200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, +1201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, +1202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, +1203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, +1204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, +1205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, +1206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, +1207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, +1208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, +1209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, +1210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, +1211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, +1212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, +1213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, +1214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, +1215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, +1216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, +1217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, +1218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, +1219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, +1220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, +1221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, +1222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, +1223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, +1224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, +1225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, +1226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, +1227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, +1228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, +1229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, +1230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, +1231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, +1232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, +1233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, +1234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, +1235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, +1236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, +1237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, +1238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, +1239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, +1240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, +1241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, +1242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, +1243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, +1244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, +1245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, +1246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, +1247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, +1248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, +1249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, +1250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, +1251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, +1252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, +1253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, +1254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, +1255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, +1256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, +1257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, +1258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, +1259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, +1260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, +1261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, +1262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, +1263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, +1264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, +1265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, +1266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, +1267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, +1268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, +1269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, +1270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, +1271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, +1272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, +1273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, +1274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, +1275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, +1276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, +1277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, +1278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, +1279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, +1280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, +1281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, +1282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, +1283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, +1284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, +1285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, +1286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, +1287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, +1288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, +1289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, +1290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, +1291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, +1292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, +1293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, +1294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, +1295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, +1296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, +1297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, +1298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, +1299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, +1300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, +1301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, +1302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, +1303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, +1304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, +1305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, +1306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, +1307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, +1308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, +1309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, +1310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, +1311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, +1312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, +1313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, +1314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, +1315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, +1316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, +1317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, +1318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, +1319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, +1320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, +1321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, +1322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, +1323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, +1324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, +1325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, +1326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, +1327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, +1328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, +1329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, +1330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, +1331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, +1332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, +1333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, +1334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, +1335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, +1336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, +1337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, +1338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, +1339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, +1340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, +1341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, +1342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, +1343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, +1344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, +1345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, +1346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, +1347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, +1348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, +1349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, +1350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, +1351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, +1352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, +1353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, +1354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, +1355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, +1356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, +1357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, +1358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, +1359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, +1360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, +1361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, +1362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, +1363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, +1364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, +1365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, +1366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, +1367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, +1368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, +1369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, +1370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, +1371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, +1372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, +1373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, +1374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, +1375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, +1376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, +1377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, +1378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, +1379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, +1380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, +1381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, +1382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, +1383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, +1384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, +1385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, +1386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, +1387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, +1388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, +1389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, +1390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, +1391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, +1392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, +1393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, +1394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, +1395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, +1396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, +1397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, +1398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, +1399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, +1400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, +1401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, +1402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, +1403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, +1404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, +1405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, +1406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, +1407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, +1408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, +1409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, +1410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, +1411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, +1412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, +1413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, +1414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, +1415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, +1416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, +1417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, +1418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, +1419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, +1420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, +1421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, +1422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, +1423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, +1424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, +1425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, +1426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, +1427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, +1428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, +1429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, +1430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, +1431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, +1432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, +1433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, +1434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, +1435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, +1436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, +1437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, +1438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, +1439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, diff --git a/test/24hr67_low_Preset_Rheem2020Build40.csv b/test/24hr67_low_Preset_Rheem2020Build40.csv new file mode 100644 index 00000000..eb44bbb0 --- /dev/null +++ b/test/24hr67_low_Preset_Rheem2020Build40.csv @@ -0,0 +1,1441 @@ +minutes,Ta,Tsetpoint,inletT,draw,DRstatus,h_src1In (Wh),h_src1Out (Wh),h_src2In (Wh),h_src2Out (Wh),h_src3In (Wh),h_src3Out (Wh),tcouple1 (C),tcouple2 (C),tcouple3 (C),tcouple4 (C),tcouple5 (C),tcouple6 (C), toutlet (C) +0, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.88,49.90,51.65,51.65,51.65,51.65,51.66 +2, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,47.04,51.14,51.64,51.64,51.64,51.65 +3, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.93,42.61,49.84,51.63,51.63,51.63,51.64 +4, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.38,37.77,47.72,51.46,51.62,51.62,51.63 +5, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.16,33.84,44.76,50.90,51.61,51.61,51.62 +6, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.64,31.34,41.30,49.76,51.55,51.60,51.61 +7, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.06,29.78,37.83,47.94,51.32,51.59,51.60 +8, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.53,28.71,34.80,45.46,50.77,51.56,51.59 +9, 19.722222, 51.666667, 14.444444, 1.400000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.37,28.37,32.81,43.06,49.92,51.48,51.57 +10, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.79,29.79,32.82,43.06,49.91,51.47, +11, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.10,31.10,33.04,43.05,49.90,51.46, +12, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.24,32.24,33.61,43.04,49.89,51.44, +13, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.38,33.38,34.18,43.03,49.88,51.43, +14, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.52,34.52,34.75,43.02,49.87,51.42, +15, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.54,35.54,35.54,43.01,49.86,51.41, +16, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.49,36.49,36.49,43.01,49.85,51.39, +17, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.44,37.44,37.44,43.00,49.84,51.38, +18, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.38,38.38,38.38,43.00,49.83,51.37, +19, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.33,39.33,39.33,42.99,49.82,51.35, +20, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.28,40.28,40.28,42.99,49.81,51.34, +21, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.12,41.12,41.12,43.30,49.80,51.33, +22, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.93,41.93,41.93,43.70,49.79,51.32, +23, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.74,42.74,42.74,44.10,49.78,51.30, +24, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.55,43.55,43.55,44.51,49.77,51.29, +25, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.35,44.35,44.35,44.91,49.75,51.28, +26, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.16,45.16,45.16,45.31,49.74,51.27, +27, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.91,45.91,45.91,45.91,49.73,51.25, +28, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.61,46.61,46.61,46.61,49.72,51.24, +29, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.32,47.32,47.32,47.32,49.71,51.23, +30, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.03,48.03,48.03,48.03,49.71,51.22, +31, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.22,47.09,48.02,48.02,49.28,51.10,51.22 +32, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.69,46.03,47.85,48.01,48.94,50.88,51.20 +33, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.78,46.78,47.85,48.01,48.94,50.87, +34, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.06,48.06,48.06,48.06,48.93,50.86, +35, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.72,48.72,48.72,48.72,49.10,50.84, +36, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.34,49.34,49.34,49.34,49.41,50.83, +37, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.92,49.92,49.92,49.92,49.92,50.82, +38, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.48,50.48,50.48,50.48,50.48,50.80, +39, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.00,51.00,51.00,51.00,51.00,51.00, +40, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.47,51.47,51.47,51.47,51.47,51.47, +41, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,32.50,32.50,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +42, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +43, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +44, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +45, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +46, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +47, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +48, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +49, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +50, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +51, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +52, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +53, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +54, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +55, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +56, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +57, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +58, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +59, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +60, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +61, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.30,50.47,51.50,51.50,51.50,51.50,51.51 +62, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.29,50.46,51.49,51.49,51.49,51.49, +63, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.28,50.45,51.48,51.49,51.49,51.49, +64, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.28,50.45,51.47,51.48,51.48,51.48, +65, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.27,50.44,51.46,51.47,51.47,51.47, +66, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.26,50.44,51.46,51.46,51.46,51.46, +67, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.25,50.43,51.45,51.45,51.45,51.45, +68, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.24,50.42,51.44,51.44,51.44,51.44, +69, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.23,50.42,51.43,51.43,51.43,51.43, +70, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.22,50.41,51.42,51.42,51.42,51.42, +71, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.21,50.41,51.41,51.42,51.42,51.42, +72, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.20,50.40,51.40,51.41,51.41,51.41, +73, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.19,50.39,51.39,51.40,51.40,51.40, +74, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.18,50.39,51.38,51.39,51.39,51.39, +75, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.18,50.38,51.37,51.38,51.38,51.38, +76, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.17,50.38,51.36,51.37,51.37,51.37, +77, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.16,50.37,51.35,51.36,51.36,51.36, +78, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.15,50.36,51.34,51.36,51.36,51.36, +79, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.14,50.36,51.34,51.35,51.35,51.35, +80, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.13,50.35,51.33,51.34,51.34,51.34, +81, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.12,50.34,51.32,51.33,51.33,51.33, +82, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.11,50.34,51.31,51.32,51.32,51.32, +83, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.10,50.33,51.30,51.31,51.31,51.31, +84, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.10,50.32,51.29,51.30,51.30,51.30, +85, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.09,50.32,51.28,51.30,51.30,51.30, +86, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.08,50.31,51.27,51.29,51.29,51.29, +87, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.07,50.30,51.26,51.28,51.28,51.28, +88, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.06,50.30,51.25,51.27,51.27,51.27, +89, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.05,50.29,51.24,51.26,51.26,51.26, +90, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.04,50.28,51.24,51.25,51.25,51.25, +91, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.04,50.28,51.23,51.24,51.24,51.24, +92, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.03,50.27,51.22,51.24,51.24,51.24, +93, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.02,50.26,51.21,51.23,51.23,51.23, +94, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.01,50.26,51.20,51.22,51.22,51.22, +95, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.00,50.25,51.19,51.21,51.21,51.21, +96, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.99,50.24,51.18,51.20,51.20,51.20, +97, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.98,50.24,51.17,51.19,51.19,51.19, +98, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.98,50.23,51.16,51.18,51.18,51.18, +99, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.97,50.22,51.15,51.18,51.18,51.18, +100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.96,50.22,51.15,51.17,51.17,51.17, +101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.95,50.21,51.14,51.16,51.16,51.16, +102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.94,50.20,51.13,51.15,51.15,51.15, +103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.93,50.20,51.12,51.14,51.14,51.14, +104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.93,50.19,51.11,51.13,51.13,51.13, +105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.92,50.18,51.10,51.12,51.12,51.12, +106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.91,50.18,51.09,51.12,51.12,51.12, +107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.90,50.17,51.08,51.11,51.11,51.11, +108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.89,50.16,51.07,51.10,51.10,51.10, +109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.88,50.15,51.07,51.09,51.09,51.09, +110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.88,50.15,51.06,51.08,51.08,51.08, +111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.87,50.14,51.05,51.07,51.07,51.07, +112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.86,50.13,51.04,51.06,51.06,51.06, +113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.85,50.13,51.03,51.06,51.06,51.06, +114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.84,50.12,51.02,51.05,51.05,51.05, +115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.83,50.11,51.01,51.04,51.04,51.04, +116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.83,50.10,51.00,51.03,51.03,51.03, +117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.82,50.10,50.99,51.02,51.02,51.02, +118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.81,50.09,50.99,51.01,51.01,51.01, +119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.80,50.08,50.98,51.00,51.00,51.00, +120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.79,50.08,50.97,51.00,51.00,51.00, +121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.79,50.07,50.96,50.99,50.99,50.99, +122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.78,50.06,50.95,50.98,50.98,50.98, +123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.77,50.05,50.94,50.97,50.97,50.97, +124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.76,50.05,50.93,50.96,50.96,50.96, +125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.75,50.04,50.92,50.95,50.95,50.95, +126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.75,50.03,50.92,50.95,50.95,50.95, +127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.74,50.02,50.91,50.94,50.94,50.94, +128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.73,50.02,50.90,50.93,50.93,50.93, +129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.72,50.01,50.89,50.92,50.92,50.92, +130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.72,50.00,50.88,50.91,50.91,50.91, +131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.71,49.99,50.87,50.90,50.90,50.90, +132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.70,49.99,50.86,50.89,50.89,50.89, +133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.69,49.98,50.86,50.89,50.89,50.89, +134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.68,49.97,50.85,50.88,50.88,50.88, +135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.68,49.96,50.84,50.87,50.87,50.87, +136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.67,49.96,50.83,50.86,50.86,50.86, +137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.66,49.95,50.82,50.85,50.85,50.85, +138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.65,49.94,50.81,50.84,50.84,50.84, +139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.64,49.93,50.80,50.83,50.83,50.83, +140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.64,49.93,50.79,50.83,50.83,50.83, +141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.63,49.92,50.79,50.82,50.82,50.82, +142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.62,49.91,50.78,50.81,50.81,50.81, +143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.61,49.90,50.77,50.80,50.80,50.80, +144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.61,49.90,50.76,50.79,50.79,50.79, +145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.60,49.89,50.75,50.78,50.78,50.78, +146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.59,49.88,50.74,50.78,50.78,50.78, +147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.58,49.87,50.73,50.77,50.77,50.77, +148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.58,49.87,50.73,50.76,50.76,50.76, +149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.57,49.86,50.72,50.75,50.75,50.75, +150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.56,49.85,50.71,50.74,50.74,50.74, +151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.55,49.84,50.70,50.73,50.73,50.73, +152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.55,49.83,50.69,50.72,50.72,50.72, +153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.54,49.83,50.68,50.72,50.72,50.72, +154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.53,49.82,50.67,50.71,50.71,50.71, +155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.52,49.81,50.67,50.70,50.70,50.70, +156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.52,49.80,50.66,50.69,50.69,50.69, +157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.51,49.80,50.65,50.68,50.68,50.68, +158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.50,49.79,50.64,50.67,50.67,50.67, +159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.49,49.78,50.63,50.67,50.67,50.67, +160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.49,49.77,50.62,50.66,50.66,50.66, +161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.48,49.76,50.61,50.65,50.65,50.65, +162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.47,49.76,50.61,50.64,50.64,50.64, +163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.46,49.75,50.60,50.63,50.63,50.63, +164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.46,49.74,50.59,50.62,50.62,50.62, +165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.45,49.73,50.58,50.62,50.62,50.62, +166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.44,49.72,50.57,50.61,50.61,50.61, +167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.43,49.72,50.56,50.60,50.60,50.60, +168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.43,49.71,50.55,50.59,50.59,50.59, +169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.42,49.70,50.55,50.58,50.58,50.58, +170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.41,49.69,50.54,50.57,50.57,50.57, +171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.40,49.68,50.53,50.56,50.56,50.56, +172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.40,49.68,50.52,50.56,50.56,50.56, +173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.39,49.67,50.51,50.55,50.55,50.55, +174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.38,49.66,50.50,50.54,50.54,50.54, +175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.37,49.65,50.50,50.53,50.53,50.53, +176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.37,49.64,50.49,50.52,50.52,50.52, +177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.36,49.64,50.48,50.51,50.51,50.51, +178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.35,49.63,50.47,50.51,50.51,50.51, +179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.35,49.62,50.46,50.50,50.50,50.50, +180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.34,49.61,50.45,50.49,50.49,50.49, +181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.33,49.60,50.44,50.48,50.48,50.48, +182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.32,49.60,50.44,50.47,50.47,50.47, +183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.32,49.59,50.43,50.46,50.46,50.46, +184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.31,49.58,50.42,50.46,50.46,50.46, +185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.30,49.57,50.41,50.45,50.45,50.45, +186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.29,49.56,50.40,50.44,50.44,50.44, +187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.29,49.56,50.39,50.43,50.43,50.43, +188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.28,49.55,50.39,50.42,50.42,50.42, +189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.27,49.54,50.38,50.41,50.41,50.41, +190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.27,49.53,50.37,50.41,50.41,50.41, +191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.26,49.52,50.36,50.40,50.40,50.40, +192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.25,49.51,50.35,50.39,50.39,50.39, +193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.24,49.51,50.34,50.38,50.38,50.38, +194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.24,49.50,50.34,50.37,50.37,50.37, +195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.23,49.49,50.33,50.36,50.36,50.36, +196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.22,49.48,50.32,50.36,50.36,50.36, +197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.22,49.47,50.31,50.35,50.35,50.35, +198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.21,49.47,50.30,50.34,50.34,50.34, +199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.20,49.46,50.29,50.33,50.33,50.33, +200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.19,49.45,50.29,50.32,50.32,50.32, +201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.19,49.44,50.28,50.31,50.31,50.31, +202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.18,49.43,50.27,50.31,50.31,50.31, +203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.17,49.42,50.26,50.30,50.30,50.30, +204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.17,49.42,50.25,50.29,50.29,50.29, +205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.16,49.41,50.24,50.28,50.28,50.28, +206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.15,49.40,50.24,50.27,50.27,50.27, +207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.14,49.39,50.23,50.26,50.26,50.26, +208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.14,49.38,50.22,50.26,50.26,50.26, +209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.13,49.37,50.21,50.25,50.25,50.25, +210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.12,49.37,50.20,50.24,50.24,50.24, +211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.12,49.36,50.19,50.23,50.23,50.23, +212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.11,49.35,50.19,50.22,50.22,50.22, +213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.10,49.34,50.18,50.21,50.21,50.21, +214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.10,49.33,50.17,50.21,50.21,50.21, +215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.09,49.32,50.16,50.20,50.20,50.20, +216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.08,49.32,50.15,50.19,50.19,50.19, +217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.07,49.31,50.14,50.18,50.18,50.18, +218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.07,49.30,50.14,50.17,50.17,50.17, +219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.06,49.29,50.13,50.16,50.16,50.16, +220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.05,49.28,50.12,50.16,50.16,50.16, +221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.05,49.27,50.11,50.15,50.15,50.15, +222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.04,49.27,50.10,50.14,50.14,50.14, +223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.03,49.26,50.10,50.13,50.13,50.13, +224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.03,49.25,50.09,50.12,50.12,50.12, +225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.02,49.24,50.08,50.11,50.11,50.11, +226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.01,49.23,50.07,50.11,50.11,50.11, +227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.01,49.22,50.06,50.10,50.10,50.10, +228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.00,49.22,50.05,50.09,50.09,50.09, +229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.99,49.21,50.05,50.08,50.08,50.08, +230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.98,49.20,50.04,50.07,50.07,50.07, +231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.98,49.19,50.03,50.06,50.06,50.06, +232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.97,49.18,50.02,50.06,50.06,50.06, +233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.96,49.17,50.01,50.05,50.05,50.05, +234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.96,49.17,50.00,50.04,50.04,50.04, +235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.95,49.16,50.00,50.03,50.03,50.03, +236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.94,49.15,49.99,50.02,50.02,50.02, +237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.94,49.14,49.98,50.01,50.01,50.01, +238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.93,49.13,49.97,50.01,50.01,50.01, +239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.92,49.12,49.96,50.00,50.00,50.00, +240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.92,49.12,49.96,49.99,49.99,49.99, +241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.91,49.11,49.95,49.98,49.98,49.98, +242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.90,49.10,49.94,49.97,49.97,49.97, +243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.90,49.09,49.93,49.97,49.97,49.97, +244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.89,49.08,49.92,49.96,49.96,49.96, +245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.88,49.07,49.92,49.95,49.95,49.95, +246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.88,49.07,49.91,49.94,49.94,49.94, +247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.87,49.06,49.90,49.93,49.93,49.93, +248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.86,49.05,49.89,49.92,49.92,49.92, +249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.85,49.04,49.88,49.92,49.92,49.92, +250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.85,49.03,49.87,49.91,49.91,49.91, +251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.84,49.02,49.87,49.90,49.90,49.90, +252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.83,49.01,49.86,49.89,49.89,49.89, +253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.83,49.01,49.85,49.88,49.88,49.88, +254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.82,49.00,49.84,49.87,49.87,49.87, +255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.81,48.99,49.83,49.87,49.87,49.87, +256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.81,48.98,49.83,49.86,49.86,49.86, +257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.80,48.97,49.82,49.85,49.85,49.85, +258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.79,48.96,49.81,49.84,49.84,49.84, +259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.79,48.96,49.80,49.83,49.83,49.83, +260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.78,48.95,49.79,49.83,49.83,49.83, +261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.77,48.94,49.78,49.82,49.82,49.82, +262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.77,48.93,49.78,49.81,49.81,49.81, +263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.76,48.92,49.77,49.80,49.80,49.80, +264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.75,48.91,49.76,49.79,49.79,49.79, +265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.75,48.90,49.75,49.78,49.78,49.78, +266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.74,48.90,49.74,49.78,49.78,49.78, +267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.73,48.89,49.74,49.77,49.77,49.77, +268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.73,48.88,49.73,49.76,49.76,49.76, +269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.72,48.87,49.72,49.75,49.75,49.75, +270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.71,48.86,49.71,49.74,49.74,49.74, +271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.71,48.85,49.70,49.74,49.74,49.74, +272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.70,48.84,49.70,49.73,49.73,49.73, +273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.69,48.84,49.69,49.72,49.72,49.72, +274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.69,48.83,49.68,49.71,49.71,49.71, +275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.68,48.82,49.67,49.70,49.70,49.70, +276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.67,48.81,49.66,49.69,49.69,49.69, +277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.67,48.80,49.66,49.69,49.69,49.69, +278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.66,48.79,49.65,49.68,49.68,49.68, +279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.65,48.79,49.64,49.67,49.67,49.67, +280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.65,48.78,49.63,49.66,49.66,49.66, +281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.64,48.77,49.62,49.65,49.65,49.65, +282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.63,48.76,49.62,49.65,49.65,49.65, +283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.63,48.75,49.61,49.64,49.64,49.64, +284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.62,48.74,49.60,49.63,49.63,49.63, +285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.61,48.73,49.59,49.62,49.62,49.62, +286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.61,48.73,49.58,49.61,49.61,49.61, +287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.60,48.72,49.57,49.60,49.60,49.60, +288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.59,48.71,49.57,49.60,49.60,49.60, +289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.59,48.70,49.56,49.59,49.59,49.59, +290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.58,48.69,49.55,49.58,49.58,49.58, +291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.57,48.68,49.54,49.57,49.57,49.57, +292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.57,48.67,49.53,49.56,49.56,49.56, +293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.56,48.67,49.53,49.56,49.56,49.56, +294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.55,48.66,49.52,49.55,49.55,49.55, +295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.55,48.65,49.51,49.54,49.54,49.54, +296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.54,48.64,49.50,49.53,49.53,49.53, +297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.53,48.63,49.49,49.52,49.52,49.52, +298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.53,48.62,49.49,49.52,49.52,49.52, +299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.52,48.62,49.48,49.51,49.51,49.51, +300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.51,48.61,49.47,49.50,49.50,49.50, +301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.51,48.60,49.46,49.49,49.49,49.49, +302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.50,48.59,49.45,49.48,49.48,49.48, +303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.50,48.58,49.45,49.47,49.47,49.47, +304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.49,48.57,49.44,49.47,49.47,49.47, +305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.48,48.56,49.43,49.46,49.46,49.46, +306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.48,48.56,49.42,49.45,49.45,49.45, +307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.47,48.55,49.41,49.44,49.44,49.44, +308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.46,48.54,49.41,49.43,49.43,49.43, +309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.46,48.53,49.40,49.43,49.43,49.43, +310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.45,48.52,49.39,49.42,49.42,49.42, +311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.44,48.51,49.38,49.41,49.41,49.41, +312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.44,48.50,49.37,49.40,49.40,49.40, +313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.43,48.50,49.37,49.39,49.39,49.39, +314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.42,48.49,49.36,49.39,49.39,49.39, +315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.42,48.48,49.35,49.38,49.38,49.38, +316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.41,48.47,49.34,49.37,49.37,49.37, +317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.40,48.46,49.33,49.36,49.36,49.36, +318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.40,48.45,49.33,49.35,49.35,49.35, +319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.39,48.44,49.32,49.35,49.35,49.35, +320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.38,48.44,49.31,49.34,49.34,49.34, +321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.38,48.43,49.30,49.33,49.33,49.33, +322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.37,48.42,49.29,49.32,49.32,49.32, +323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.36,48.41,49.29,49.31,49.31,49.31, +324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.36,48.40,49.28,49.31,49.31,49.31, +325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.35,48.39,49.27,49.30,49.30,49.30, +326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.34,48.39,49.26,49.29,49.29,49.29, +327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.34,48.38,49.26,49.28,49.28,49.28, +328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.33,48.37,49.25,49.27,49.27,49.27, +329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.33,48.36,49.24,49.26,49.26,49.26, +330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.32,48.35,49.23,49.26,49.26,49.26, +331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.31,48.34,49.22,49.25,49.25,49.25, +332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.31,48.33,49.22,49.24,49.24,49.24, +333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.30,48.33,49.21,49.23,49.23,49.23, +334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.29,48.32,49.20,49.22,49.22,49.22, +335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.29,48.31,49.19,49.22,49.22,49.22, +336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.28,48.30,49.18,49.21,49.21,49.21, +337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.27,48.29,49.18,49.20,49.20,49.20, +338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.27,48.28,49.17,49.19,49.19,49.19, +339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.26,48.27,49.16,49.18,49.18,49.18, +340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.25,48.27,49.15,49.18,49.18,49.18, +341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.25,48.26,49.14,49.17,49.17,49.17, +342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.24,48.25,49.14,49.16,49.16,49.16, +343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.23,48.24,49.13,49.15,49.15,49.15, +344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.23,48.23,49.12,49.14,49.14,49.14, +345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.22,48.22,49.11,49.14,49.14,49.14, +346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.22,48.22,49.10,49.13,49.13,49.13, +347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.21,48.21,49.10,49.12,49.12,49.12, +348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.20,48.20,49.09,49.11,49.11,49.11, +349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.20,48.19,49.08,49.10,49.10,49.10, +350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.19,48.18,49.07,49.10,49.10,49.10, +351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.18,48.17,49.06,49.09,49.09,49.09, +352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.18,48.16,49.06,49.08,49.08,49.08, +353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.17,48.16,49.05,49.07,49.07,49.07, +354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.16,48.15,49.04,49.06,49.06,49.06, +355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.16,48.14,49.03,49.06,49.06,49.06, +356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.15,48.13,49.03,49.05,49.05,49.05, +357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.14,48.12,49.02,49.04,49.04,49.04, +358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.14,48.11,49.01,49.03,49.03,49.03, +359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.13,48.11,49.00,49.02,49.02,49.02, +360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.13,48.10,48.99,49.02,49.02,49.02, +361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.12,48.09,48.99,49.01,49.01,49.01, +362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.11,48.08,48.98,49.00,49.00,49.00, +363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.11,48.07,48.97,48.99,48.99,48.99, +364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.10,48.06,48.96,48.98,48.98,48.98, +365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.09,48.05,48.95,48.98,48.98,48.98, +366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.09,48.05,48.95,48.97,48.97,48.97, +367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.08,48.04,48.94,48.96,48.96,48.96, +368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.07,48.03,48.93,48.95,48.95,48.95, +369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.07,48.02,48.92,48.94,48.94,48.94, +370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.06,48.01,48.92,48.94,48.94,48.94, +371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.06,48.00,48.91,48.93,48.93,48.93, +372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.05,48.00,48.90,48.92,48.92,48.92, +373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.04,47.99,48.89,48.91,48.91,48.91, +374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.04,47.98,48.88,48.91,48.91,48.91, +375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.03,47.97,48.88,48.90,48.90,48.90, +376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.02,47.96,48.87,48.89,48.89,48.89, +377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.02,47.95,48.86,48.88,48.88,48.88, +378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.01,47.94,48.85,48.87,48.87,48.87, +379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.00,47.94,48.84,48.87,48.87,48.87, +380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.00,47.93,48.84,48.86,48.86,48.86, +381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.99,47.92,48.83,48.85,48.85,48.85, +382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.99,47.91,48.82,48.84,48.84,48.84, +383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.98,47.90,48.81,48.83,48.83,48.83, +384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.97,47.89,48.81,48.83,48.83,48.83, +385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.97,47.89,48.80,48.82,48.82,48.82, +386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.96,47.88,48.79,48.81,48.81,48.81, +387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.95,47.87,48.78,48.80,48.80,48.80, +388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.95,47.86,48.77,48.79,48.79,48.79, +389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.94,47.85,48.77,48.79,48.79,48.79, +390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.93,47.84,48.76,48.78,48.78,48.78, +391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.93,47.84,48.75,48.77,48.77,48.77, +392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.92,47.83,48.74,48.76,48.76,48.76, +393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.92,47.82,48.73,48.75,48.75,48.75, +394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.91,47.81,48.73,48.75,48.75,48.75, +395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.90,47.80,48.72,48.74,48.74,48.74, +396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.90,47.79,48.71,48.73,48.73,48.73, +397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.89,47.78,48.70,48.72,48.72,48.72, +398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.88,47.78,48.70,48.72,48.72,48.72, +399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.88,47.77,48.69,48.71,48.71,48.71, +400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.87,47.76,48.68,48.70,48.70,48.70, +401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.86,47.75,48.67,48.69,48.69,48.69, +402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.86,47.74,48.66,48.68,48.68,48.68, +403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.85,47.73,48.66,48.68,48.68,48.68, +404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.85,47.73,48.65,48.67,48.67,48.67, +405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.84,47.72,48.64,48.66,48.66,48.66, +406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.83,47.71,48.63,48.65,48.65,48.65, +407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.83,47.70,48.63,48.64,48.64,48.64, +408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.82,47.69,48.62,48.64,48.64,48.64, +409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.81,47.68,48.61,48.63,48.63,48.63, +410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.81,47.68,48.60,48.62,48.62,48.62, +411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.80,47.67,48.59,48.61,48.61,48.61, +412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.80,47.66,48.59,48.60,48.60,48.60, +413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.79,47.65,48.58,48.60,48.60,48.60, +414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.78,47.64,48.57,48.59,48.59,48.59, +415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.78,47.63,48.56,48.58,48.58,48.58, +416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.77,47.63,48.56,48.57,48.57,48.57, +417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.76,47.62,48.55,48.57,48.57,48.57, +418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.76,47.61,48.54,48.56,48.56,48.56, +419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.75,47.60,48.53,48.55,48.55,48.55, +420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.74,47.59,48.52,48.54,48.54,48.54, +421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.74,47.58,48.52,48.53,48.53,48.53, +422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.73,47.58,48.51,48.53,48.53,48.53, +423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.73,47.57,48.50,48.52,48.52,48.52, +424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.72,47.56,48.49,48.51,48.51,48.51, +425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.71,47.55,48.49,48.50,48.50,48.50, +426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.71,47.54,48.48,48.49,48.49,48.49, +427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.70,47.53,48.47,48.49,48.49,48.49, +428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.69,47.53,48.46,48.48,48.48,48.48, +429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.69,47.52,48.45,48.47,48.47,48.47, +430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.68,47.51,48.45,48.46,48.46,48.46, +431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.68,47.50,48.44,48.46,48.46,48.46, +432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.67,47.49,48.43,48.45,48.45,48.45, +433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.66,47.48,48.42,48.44,48.44,48.44, +434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.66,47.48,48.42,48.43,48.43,48.43, +435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.65,47.47,48.41,48.42,48.42,48.42, +436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.64,47.46,48.40,48.42,48.42,48.42, +437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.64,47.45,48.39,48.41,48.41,48.41, +438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.63,47.44,48.38,48.40,48.40,48.40, +439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.63,47.43,48.38,48.39,48.39,48.39, +440, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.62,47.43,48.37,48.39,48.39,48.39, +441, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.61,47.42,48.36,48.38,48.38,48.38, +442, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.61,47.41,48.35,48.37,48.37,48.37, +443, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.60,47.40,48.35,48.36,48.36,48.36, +444, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.59,47.39,48.34,48.35,48.35,48.35, +445, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.59,47.38,48.33,48.35,48.35,48.35, +446, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.58,47.38,48.32,48.34,48.34,48.34, +447, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.57,47.37,48.32,48.33,48.33,48.33, +448, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.57,47.36,48.31,48.32,48.32,48.32, +449, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.56,47.35,48.30,48.32,48.32,48.32, +450, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.56,47.34,48.29,48.31,48.31,48.31, +451, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.55,47.34,48.28,48.30,48.30,48.30, +452, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.54,47.33,48.28,48.29,48.29,48.29, +453, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.54,47.32,48.27,48.28,48.28,48.28, +454, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.53,47.31,48.26,48.28,48.28,48.28, +455, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.52,47.30,48.25,48.27,48.27,48.27, +456, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.52,47.29,48.25,48.26,48.26,48.26, +457, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.51,47.29,48.24,48.25,48.25,48.25, +458, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.51,47.28,48.23,48.25,48.25,48.25, +459, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.50,47.27,48.22,48.24,48.24,48.24, +460, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.49,47.26,48.21,48.23,48.23,48.23, +461, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.49,47.25,48.21,48.22,48.22,48.22, +462, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.48,47.24,48.20,48.21,48.21,48.21, +463, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.47,47.24,48.19,48.21,48.21,48.21, +464, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.47,47.23,48.18,48.20,48.20,48.20, +465, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.46,47.22,48.18,48.19,48.19,48.19, +466, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.46,47.21,48.17,48.18,48.18,48.18, +467, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.45,47.20,48.16,48.18,48.18,48.18, +468, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.44,47.20,48.15,48.17,48.17,48.17, +469, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.44,47.19,48.15,48.16,48.16,48.16, +470, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.43,47.18,48.14,48.15,48.15,48.15, +471, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.42,47.17,48.13,48.14,48.14,48.14, +472, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.42,47.16,48.12,48.14,48.14,48.14, +473, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.41,47.15,48.11,48.13,48.13,48.13, +474, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.41,47.15,48.11,48.12,48.12,48.12, +475, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.40,47.14,48.10,48.11,48.11,48.11, +476, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.39,47.13,48.09,48.11,48.11,48.11, +477, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.39,47.12,48.08,48.10,48.10,48.10, +478, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.38,47.11,48.08,48.09,48.09,48.09, +479, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.38,47.11,48.07,48.08,48.08,48.08, +480, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.37,47.10,48.06,48.08,48.08,48.08, +481, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.36,47.09,48.05,48.07,48.07,48.07, +482, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.36,47.08,48.05,48.06,48.06,48.06, +483, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.35,47.07,48.04,48.05,48.05,48.05, +484, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.34,47.06,48.03,48.04,48.04,48.04, +485, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.34,47.06,48.02,48.04,48.04,48.04, +486, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.33,47.05,48.01,48.03,48.03,48.03, +487, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.33,47.04,48.01,48.02,48.02,48.02, +488, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.32,47.03,48.00,48.01,48.01,48.01, +489, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.31,47.02,47.99,48.01,48.01,48.01, +490, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.31,47.02,47.98,48.00,48.00,48.00, +491, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.30,47.01,47.98,47.99,47.99,47.99, +492, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.29,47.00,47.97,47.98,47.98,47.98, +493, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.29,46.99,47.96,47.98,47.98,47.98, +494, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.28,46.98,47.95,47.97,47.97,47.97, +495, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.28,46.97,47.95,47.96,47.96,47.96, +496, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.27,46.97,47.94,47.95,47.95,47.95, +497, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.26,46.96,47.93,47.94,47.94,47.94, +498, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.26,46.95,47.92,47.94,47.94,47.94, +499, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.25,46.94,47.92,47.93,47.93,47.93, +500, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.24,46.93,47.91,47.92,47.92,47.92, +501, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.24,46.93,47.90,47.91,47.91,47.91, +502, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.23,46.92,47.89,47.91,47.91,47.91, +503, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.23,46.91,47.88,47.90,47.90,47.90, +504, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.22,46.90,47.88,47.89,47.89,47.89, +505, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.21,46.89,47.87,47.88,47.88,47.88, +506, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.21,46.89,47.86,47.88,47.88,47.88, +507, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.20,46.88,47.85,47.87,47.87,47.87, +508, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.20,46.87,47.85,47.86,47.86,47.86, +509, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.19,46.86,47.84,47.85,47.85,47.85, +510, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.18,46.85,47.83,47.84,47.84,47.84, +511, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.18,46.85,47.82,47.84,47.84,47.84, +512, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.17,46.84,47.82,47.83,47.83,47.83, +513, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.16,46.83,47.81,47.82,47.82,47.82, +514, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.16,46.82,47.80,47.81,47.81,47.81, +515, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.15,46.81,47.79,47.81,47.81,47.81, +516, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.15,46.81,47.79,47.80,47.80,47.80, +517, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.14,46.80,47.78,47.79,47.79,47.79, +518, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.13,46.79,47.77,47.78,47.78,47.78, +519, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.13,46.78,47.76,47.78,47.78,47.78, +520, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.12,46.77,47.76,47.77,47.77,47.77, +521, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.11,46.76,47.75,47.76,47.76,47.76, +522, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.11,46.76,47.74,47.75,47.75,47.75, +523, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.10,46.75,47.73,47.75,47.75,47.75, +524, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.10,46.74,47.72,47.74,47.74,47.74, +525, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.09,46.73,47.72,47.73,47.73,47.73, +526, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.08,46.72,47.71,47.72,47.72,47.72, +527, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.08,46.72,47.70,47.72,47.72,47.72, +528, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.07,46.71,47.69,47.71,47.71,47.71, +529, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.07,46.70,47.69,47.70,47.70,47.70, +530, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.06,46.69,47.68,47.69,47.69,47.69, +531, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.05,46.68,47.67,47.68,47.68,47.68, +532, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.05,46.68,47.66,47.68,47.68,47.68, +533, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.04,46.67,47.66,47.67,47.67,47.67, +534, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.03,46.66,47.65,47.66,47.66,47.66, +535, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.03,46.65,47.64,47.65,47.65,47.65, +536, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.02,46.64,47.63,47.65,47.65,47.65, +537, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.02,46.64,47.63,47.64,47.64,47.64, +538, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.01,46.63,47.62,47.63,47.63,47.63, +539, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.00,46.62,47.61,47.62,47.62,47.62, +540, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.00,46.61,47.60,47.62,47.62,47.62, +541, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.99,46.60,47.60,47.61,47.61,47.61, +542, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.99,46.60,47.59,47.60,47.60,47.60, +543, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.98,46.59,47.58,47.59,47.59,47.59, +544, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.97,46.58,47.57,47.59,47.59,47.59, +545, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.97,46.57,47.57,47.58,47.58,47.58, +546, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.96,46.56,47.56,47.57,47.57,47.57, +547, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.95,46.56,47.55,47.56,47.56,47.56, +548, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.95,46.55,47.54,47.56,47.56,47.56, +549, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.94,46.54,47.54,47.55,47.55,47.55, +550, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.94,46.53,47.53,47.54,47.54,47.54, +551, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.93,46.52,47.52,47.53,47.53,47.53, +552, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.92,46.52,47.51,47.53,47.53,47.53, +553, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.92,46.51,47.51,47.52,47.52,47.52, +554, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.91,46.50,47.50,47.51,47.51,47.51, +555, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.91,46.49,47.49,47.50,47.50,47.50, +556, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.90,46.49,47.48,47.50,47.50,47.50, +557, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.89,46.48,47.47,47.49,47.49,47.49, +558, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.89,46.47,47.47,47.48,47.48,47.48, +559, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.88,46.46,47.46,47.47,47.47,47.47, +560, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.87,46.45,47.45,47.46,47.46,47.46, +561, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.87,46.45,47.44,47.46,47.46,47.46, +562, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.86,46.44,47.44,47.45,47.45,47.45, +563, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.86,46.43,47.43,47.44,47.44,47.44, +564, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.85,46.42,47.42,47.43,47.43,47.43, +565, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.84,46.41,47.41,47.43,47.43,47.43, +566, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.84,46.41,47.41,47.42,47.42,47.42, +567, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.83,46.40,47.40,47.41,47.41,47.41, +568, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.83,46.39,47.39,47.40,47.40,47.40, +569, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.82,46.38,47.38,47.40,47.40,47.40, +570, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.81,46.37,47.38,47.39,47.39,47.39, +571, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.81,46.37,47.37,47.38,47.38,47.38, +572, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.80,46.36,47.36,47.37,47.37,47.37, +573, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.80,46.35,47.35,47.37,47.37,47.37, +574, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.79,46.34,47.35,47.36,47.36,47.36, +575, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.78,46.34,47.34,47.35,47.35,47.35, +576, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.78,46.33,47.33,47.34,47.34,47.34, +577, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.77,46.32,47.32,47.34,47.34,47.34, +578, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.76,46.31,47.32,47.33,47.33,47.33, +579, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.76,46.30,47.31,47.32,47.32,47.32, +580, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.75,46.30,47.30,47.31,47.31,47.31, +581, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.75,46.29,47.29,47.31,47.31,47.31, +582, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.74,46.28,47.29,47.30,47.30,47.30, +583, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.73,46.27,47.28,47.29,47.29,47.29, +584, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.73,46.26,47.27,47.28,47.28,47.28, +585, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.72,46.26,47.26,47.28,47.28,47.28, +586, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.72,46.25,47.26,47.27,47.27,47.27, +587, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.71,46.24,47.25,47.26,47.26,47.26, +588, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.70,46.23,47.24,47.25,47.25,47.25, +589, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.70,46.23,47.23,47.25,47.25,47.25, +590, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.69,46.22,47.23,47.24,47.24,47.24, +591, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.69,46.21,47.22,47.23,47.23,47.23, +592, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.68,46.20,47.21,47.22,47.22,47.22, +593, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.67,46.19,47.20,47.22,47.22,47.22, +594, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.67,46.19,47.20,47.21,47.21,47.21, +595, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.66,46.18,47.19,47.20,47.20,47.20, +596, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.65,46.17,47.18,47.19,47.19,47.19, +597, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.65,46.16,47.17,47.19,47.19,47.19, +598, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.64,46.15,47.17,47.18,47.18,47.18, +599, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.64,46.15,47.16,47.17,47.17,47.17, +600, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.63,46.14,47.15,47.16,47.16,47.16, +601, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.62,46.13,47.14,47.16,47.16,47.16, +602, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.62,46.12,47.14,47.15,47.15,47.15, +603, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.61,46.12,47.13,47.14,47.14,47.14, +604, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.61,46.11,47.12,47.13,47.13,47.13, +605, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.60,46.10,47.11,47.13,47.13,47.13, +606, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.59,46.09,47.11,47.12,47.12,47.12, +607, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.59,46.08,47.10,47.11,47.11,47.11, +608, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.58,46.08,47.09,47.10,47.10,47.10, +609, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.58,46.07,47.08,47.10,47.10,47.10, +610, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.57,46.06,47.08,47.09,47.09,47.09, +611, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.56,46.05,47.07,47.08,47.08,47.08, +612, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.56,46.05,47.06,47.08,47.08,47.08, +613, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.55,46.04,47.05,47.07,47.07,47.07, +614, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.55,46.03,47.05,47.06,47.06,47.06, +615, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.54,46.02,47.04,47.05,47.05,47.05, +616, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.53,46.01,47.03,47.05,47.05,47.05, +617, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.53,46.01,47.02,47.04,47.04,47.04, +618, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.52,46.00,47.02,47.03,47.03,47.03, +619, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.51,45.99,47.01,47.02,47.02,47.02, +620, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.51,45.98,47.00,47.02,47.02,47.02, +621, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.50,45.98,47.00,47.01,47.01,47.01, +622, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.50,45.97,46.99,47.00,47.00,47.00, +623, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.49,45.96,46.98,46.99,46.99,46.99, +624, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.48,45.95,46.97,46.99,46.99,46.99, +625, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.48,45.95,46.97,46.98,46.98,46.98, +626, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.47,45.94,46.96,46.97,46.97,46.97, +627, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.47,45.93,46.95,46.96,46.96,46.96, +628, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.46,45.92,46.94,46.96,46.96,46.96, +629, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.45,45.91,46.94,46.95,46.95,46.95, +630, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.45,45.91,46.93,46.94,46.94,46.94, +631, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.02,43.29,46.77,46.93,46.93,46.93,46.94 +632, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.78,40.24,45.87,46.92,46.93,46.93,46.93 +633, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.03,36.43,44.14,46.86,46.92,46.92,46.93 +634, 19.722222, 51.666667, 14.444444, 0.900000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.76,34.13,42.88,46.68,46.91,46.91,46.92 +635, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.13,34.60,42.87,46.67,46.90,46.90, +636, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.79,35.79,42.86,46.66,46.89,46.89, +637, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.21,37.21,42.85,46.66,46.88,46.88, +638, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.64,38.64,42.84,46.65,46.88,46.88, +639, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.06,40.06,42.84,46.64,46.87,46.87, +640, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.37,41.37,43.04,46.63,46.86,46.86, +641, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.51,42.51,43.60,46.62,46.85,46.85, +642, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.64,43.64,44.17,46.61,46.84,46.84, +643, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.76,44.76,44.76,46.61,46.84,46.84, +644, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.71,45.71,45.71,46.60,46.83,46.83, +645, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.61,46.61,46.61,46.70,46.82,46.82, +646, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.16,47.16,47.16,47.16,47.16,47.16, +647, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.63,47.63,47.63,47.63,47.63,47.63, +648, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.10,48.10,48.10,48.10,48.10,48.10, +649, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.57,48.57,48.57,48.57,48.57,48.57, +650, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.03,49.03,49.03,49.03,49.03,49.03, +651, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.50,49.50,49.50,49.50,49.50,49.50, +652, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.97,49.97,49.97,49.97,49.97,49.97, +653, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.43,50.43,50.43,50.43,50.43,50.43, +654, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.90,50.90,50.90,50.90,50.90,50.90, +655, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.37,51.37,51.37,51.37,51.37,51.37, +656, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,48.90,48.90,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +657, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +658, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +659, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +660, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +661, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +662, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +663, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +664, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +665, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +666, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +667, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +668, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +669, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +670, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +671, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +672, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +673, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +674, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +675, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +676, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +677, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +678, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +679, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +680, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +681, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +682, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +683, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +684, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +685, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +686, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +687, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +688, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +689, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +690, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +691, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.57,49.62,51.38,51.38,51.38,51.38,51.39 +692, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,46.75,50.87,51.37,51.37,51.37,51.38 +693, 19.722222, 51.666667, 14.444444, 0.600000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,43.98,50.40,51.36,51.36,51.36,51.37 +694, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,43.98,50.39,51.35,51.35,51.35, +695, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.97,50.37,51.34,51.34,51.34, +696, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.97,50.36,51.33,51.33,51.33, +697, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.96,50.35,51.33,51.33,51.33, +698, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.96,50.33,51.32,51.32,51.32, +699, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.95,50.32,51.31,51.31,51.31, +700, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.95,50.30,51.30,51.30,51.30, +701, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.94,50.29,51.29,51.29,51.29, +702, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.94,50.28,51.28,51.28,51.28, +703, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.94,50.26,51.27,51.27,51.27, +704, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.93,50.25,51.26,51.26,51.26, +705, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.93,50.24,51.25,51.25,51.25, +706, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.92,50.22,51.25,51.25,51.25, +707, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.92,50.21,51.24,51.24,51.24, +708, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.91,50.20,51.23,51.23,51.23, +709, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.91,50.19,51.22,51.22,51.22, +710, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.90,50.17,51.21,51.21,51.21, +711, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.90,50.16,51.20,51.20,51.20, +712, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.89,50.15,51.19,51.19,51.19, +713, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.89,50.13,51.18,51.18,51.18, +714, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.88,50.12,51.18,51.18,51.18, +715, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.88,50.11,51.17,51.17,51.17, +716, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.87,50.09,51.16,51.16,51.16, +717, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.87,50.08,51.15,51.15,51.15, +718, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.86,50.07,51.14,51.14,51.14, +719, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.86,50.05,51.13,51.13,51.13, +720, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.85,50.04,51.12,51.12,51.12, +721, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.97,51.07,51.11,51.11,51.12 +722, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.95,51.06,51.10,51.10, +723, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.94,51.05,51.09,51.09, +724, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.93,51.04,51.09,51.09, +725, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.91,51.03,51.08,51.08, +726, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.90,51.03,51.07,51.07, +727, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.89,51.02,51.06,51.06, +728, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.87,51.01,51.05,51.05, +729, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.86,51.00,51.04,51.04, +730, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.85,50.99,51.03,51.03, +731, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.90,48.83,50.98,51.02,51.02, +732, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.90,48.82,50.97,51.01,51.01, +733, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.90,48.81,50.96,51.00,51.00, +734, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.90,48.79,50.95,50.99,50.99, +735, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.90,48.78,50.94,50.99,50.99, +736, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.89,48.77,50.94,50.98,50.98, +737, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.89,48.76,50.93,50.97,50.97, +738, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.89,48.74,50.92,50.96,50.96, +739, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.89,48.73,50.91,50.95,50.95, +740, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.88,48.72,50.90,50.94,50.94, +741, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.88,48.70,50.89,50.93,50.93, +742, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.88,48.69,50.88,50.92,50.92, +743, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.88,48.68,50.87,50.91,50.91, +744, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.87,48.67,50.86,50.90,50.90, +745, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.87,48.65,50.85,50.90,50.90, +746, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.87,48.64,50.85,50.89,50.89, +747, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.87,48.63,50.84,50.88,50.88, +748, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.86,48.61,50.83,50.87,50.87, +749, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.86,48.60,50.82,50.86,50.86, +750, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.86,48.59,50.81,50.85,50.85, +751, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.86,48.58,50.80,50.84,50.84, +752, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.85,48.56,50.79,50.83,50.83, +753, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.85,48.55,50.78,50.82,50.82, +754, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.85,48.54,50.77,50.81,50.81, +755, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.84,48.53,50.76,50.81,50.81, +756, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.84,48.51,50.76,50.80,50.80, +757, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.84,48.50,50.75,50.79,50.79, +758, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.84,48.49,50.74,50.78,50.78, +759, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.83,48.48,50.73,50.77,50.77, +760, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.83,48.46,50.72,50.76,50.76, +761, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.83,48.45,50.71,50.75,50.75, +762, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.82,48.44,50.70,50.74,50.74, +763, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.82,48.43,50.69,50.73,50.73, +764, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.82,48.42,50.68,50.72,50.72, +765, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.82,48.40,50.67,50.72,50.72, +766, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.00,38.10,47.08,50.51,50.71,50.71,50.72 +767, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.85,38.10,47.07,50.50,50.70,50.70, +768, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.86,38.94,47.06,50.49,50.69,50.69, +769, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.32,40.32,47.04,50.48,50.68,50.68, +770, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.74,41.74,47.03,50.47,50.67,50.67, +771, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.81,40.99,45.85,50.16,50.66,50.66,50.67 +772, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.32,42.32,45.84,50.15,50.65,50.65, +773, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.74,43.74,45.84,50.14,50.64,50.64, +774, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.94,44.94,46.26,50.13,50.63,50.63, +775, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.07,46.07,46.83,50.12,50.62,50.62, +776, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.21,47.21,47.39,50.11,50.61,50.61, +777, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.21,48.21,48.21,50.10,50.60,50.60, +778, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.16,49.16,49.16,50.09,50.59,50.59, +779, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.04,50.04,50.04,50.25,50.58,50.58, +780, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.72,50.72,50.72,50.72,50.72,50.72, +781, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.19,51.19,51.19,51.19,51.19,51.19, +782, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.66,51.66,51.66,51.66,51.66,51.66, +783, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,3.16,3.16,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +784, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +785, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +786, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +787, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +788, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +789, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +790, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +791, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +792, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +793, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +794, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +795, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +796, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +797, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +798, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +799, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +800, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +801, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +802, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +803, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +804, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +805, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +806, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +807, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +808, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +809, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +810, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +811, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +812, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +813, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +814, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +815, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +816, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +817, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +818, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, +819, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, +820, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, +821, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, +822, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, +823, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, +824, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, +825, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, +826, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, +827, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, +828, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, +829, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, +830, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, +831, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, +832, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, +833, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, +834, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, +835, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, +836, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, +837, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, +838, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, +839, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, +840, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, +841, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, +842, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, +843, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, +844, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, +845, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, +846, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, +847, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, +848, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, +849, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, +850, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, +851, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, +852, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, +853, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, +854, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, +855, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, +856, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, +857, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, +858, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, +859, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, +860, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, +861, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, +862, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, +863, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, +864, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, +865, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, +866, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, +867, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, +868, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, +869, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, +870, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, +871, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, +872, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, +873, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, +874, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, +875, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, +876, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, +877, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, +878, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, +879, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, +880, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, +881, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, +882, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, +883, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, +884, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, +885, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, +886, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, +887, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, +888, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, +889, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, +890, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, +891, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, +892, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, +893, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, +894, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, +895, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, +896, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, +897, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, +898, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, +899, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, +900, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, +901, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, +902, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, +903, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, +904, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, +905, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, +906, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, +907, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, +908, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, +909, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, +910, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, +911, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, +912, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, +913, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, +914, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, +915, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, +916, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, +917, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, +918, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, +919, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, +920, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, +921, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, +922, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, +923, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, +924, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, +925, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, +926, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, +927, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, +928, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, +929, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, +930, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, +931, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, +932, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, +933, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, +934, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, +935, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, +936, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, +937, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, +938, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, +939, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, +940, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, +941, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, +942, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, +943, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, +944, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, +945, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, +946, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, +947, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, +948, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, +949, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, +950, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, +951, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, +952, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, +953, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, +954, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, +955, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, +956, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, +957, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, +958, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, +959, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, +960, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, +961, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, +962, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, +963, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, +964, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, +965, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, +966, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, +967, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, +968, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, +969, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, +970, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, +971, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, +972, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, +973, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, +974, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, +975, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, +976, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.63,49.00,50.11,50.11,50.11,50.11,50.12 +977, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.60,47.27,49.91,50.10,50.10,50.10,50.11 +978, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.60,47.26,49.90,50.09,50.09,50.09, +979, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.59,47.26,49.89,50.08,50.08,50.08, +980, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.59,47.25,49.88,50.07,50.07,50.07, +981, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.58,47.24,49.87,50.07,50.07,50.07, +982, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.58,47.24,49.86,50.06,50.06,50.06, +983, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.58,47.23,49.85,50.05,50.05,50.05, +984, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.57,47.23,49.84,50.04,50.04,50.04, +985, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.57,47.22,49.83,50.03,50.03,50.03, +986, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.56,47.21,49.82,50.02,50.02,50.02, +987, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.56,47.21,49.81,50.01,50.01,50.01, +988, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.55,47.20,49.80,50.01,50.01,50.01, +989, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.55,47.20,49.79,50.00,50.00,50.00, +990, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.54,47.19,49.78,49.99,49.99,49.99, +991, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.54,47.18,49.77,49.98,49.98,49.98, +992, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.54,47.18,49.76,49.97,49.97,49.97, +993, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.53,47.17,49.75,49.96,49.96,49.96, +994, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.53,47.17,49.74,49.96,49.96,49.96, +995, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.52,47.16,49.73,49.95,49.95,49.95, +996, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.52,47.15,49.72,49.94,49.94,49.94, +997, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.51,47.15,49.71,49.93,49.93,49.93, +998, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.51,47.14,49.70,49.92,49.92,49.92, +999, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.50,47.13,49.69,49.91,49.91,49.91, +1000, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.50,47.13,49.68,49.91,49.91,49.91, +1001, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.50,47.12,49.67,49.90,49.90,49.90, +1002, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.49,47.11,49.66,49.89,49.89,49.89, +1003, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.49,47.11,49.65,49.88,49.88,49.88, +1004, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.10,49.64,49.87,49.87,49.87, +1005, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.10,49.63,49.86,49.86,49.86, +1006, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.35,43.94,48.89,49.86,49.86,49.86,49.86 +1007, 19.722222, 51.666667, 14.444444, 0.300000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.93,48.62,49.83,49.85,49.85,49.86 +1008, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.93,48.61,49.83,49.84,49.84, +1009, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.93,48.60,49.82,49.83,49.83, +1010, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.93,48.58,49.81,49.82,49.82, +1011, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.92,48.57,49.80,49.81,49.81, +1012, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.92,48.56,49.79,49.80,49.80, +1013, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.92,48.54,49.78,49.79,49.79, +1014, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.92,48.53,49.78,49.79,49.79, +1015, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.92,48.52,49.77,49.78,49.78, +1016, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.91,48.50,49.76,49.77,49.77, +1017, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.91,48.49,49.75,49.76,49.76, +1018, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.91,48.48,49.74,49.75,49.75, +1019, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.91,48.47,49.74,49.74,49.74, +1020, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.84,41.90,48.45,49.73,49.73,49.73, +1021, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.06,38.63,46.50,49.60,49.73,49.73,49.73 +1022, 19.722222, 51.666667, 14.444444, 1.300000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.07,36.09,44.55,49.29,49.72,49.72,49.73 +1023, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.71,36.29,44.54,49.28,49.71,49.71, +1024, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.42,37.42,44.53,49.27,49.70,49.70, +1025, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.85,38.85,44.53,49.26,49.69,49.69, +1026, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.27,40.27,44.52,49.25,49.68,49.68, +1027, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.69,41.69,44.51,49.24,49.67,49.67, +1028, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.96,42.96,44.81,49.23,49.66,49.66, +1029, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.09,44.09,45.37,49.22,49.65,49.65, +1030, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.23,45.23,45.94,49.21,49.64,49.64, +1031, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.36,46.36,46.50,49.20,49.63,49.63, +1032, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.35,47.35,47.35,49.19,49.62,49.62, +1033, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.29,48.29,48.29,49.18,49.61,49.61, +1034, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.18,49.18,49.18,49.34,49.61,49.61, +1035, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.82,49.82,49.82,49.82,49.82,49.82, +1036, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.28,50.28,50.28,50.28,50.28,50.28, +1037, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.75,50.75,50.75,50.75,50.75,50.75, +1038, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.22,51.22,51.22,51.22,51.22,51.22, +1039, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,72.48,72.48,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +1040, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1041, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +1042, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +1043, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +1044, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +1045, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +1046, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +1047, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +1048, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +1049, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +1050, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +1051, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +1052, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +1053, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +1054, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +1055, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +1056, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +1057, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +1058, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +1059, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +1060, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +1061, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +1062, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +1063, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +1064, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +1065, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +1066, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +1067, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +1068, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +1069, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +1070, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +1071, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +1072, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +1073, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +1074, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, +1075, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, +1076, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, +1077, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, +1078, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, +1079, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, +1080, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, +1081, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, +1082, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, +1083, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, +1084, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, +1085, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, +1086, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, +1087, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, +1088, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, +1089, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, +1090, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, +1091, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, +1092, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, +1093, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, +1094, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, +1095, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, +1096, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, +1097, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, +1098, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, +1099, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, +1100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, +1101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, +1102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, +1103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, +1104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, +1105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, +1106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, +1107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, +1108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, +1109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, +1110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, +1111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, +1112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, +1113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, +1114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, +1115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, +1116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, +1117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, +1118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, +1119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, +1120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, +1121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, +1122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, +1123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, +1124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, +1125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, +1126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, +1127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, +1128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, +1129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, +1130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, +1131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, +1132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, +1133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, +1134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, +1135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, +1136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, +1137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, +1138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, +1139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, +1140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, +1141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, +1142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, +1143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, +1144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, +1145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, +1146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, +1147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, +1148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, +1149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, +1150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, +1151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, +1152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, +1153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, +1154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, +1155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, +1156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, +1157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, +1158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, +1159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, +1160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, +1161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, +1162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, +1163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, +1164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, +1165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, +1166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, +1167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, +1168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, +1169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, +1170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, +1171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, +1172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, +1173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, +1174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, +1175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, +1176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, +1177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, +1178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, +1179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, +1180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, +1181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, +1182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, +1183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, +1184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, +1185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, +1186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, +1187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, +1188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, +1189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, +1190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, +1191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, +1192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, +1193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, +1194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, +1195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, +1196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, +1197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, +1198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, +1199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, +1200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, +1201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, +1202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, +1203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, +1204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, +1205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, +1206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, +1207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, +1208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, +1209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, +1210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, +1211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, +1212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, +1213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, +1214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, +1215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, +1216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, +1217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, +1218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, +1219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, +1220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, +1221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, +1222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, +1223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, +1224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, +1225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, +1226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, +1227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, +1228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, +1229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, +1230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, +1231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, +1232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, +1233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, +1234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, +1235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, +1236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, +1237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, +1238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, +1239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, +1240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, +1241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, +1242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, +1243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, +1244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, +1245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, +1246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, +1247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, +1248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, +1249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, +1250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, +1251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, +1252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, +1253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, +1254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, +1255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, +1256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, +1257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, +1258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, +1259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, +1260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, +1261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, +1262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, +1263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, +1264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, +1265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, +1266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, +1267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, +1268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, +1269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, +1270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, +1271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, +1272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, +1273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, +1274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, +1275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, +1276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, +1277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, +1278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, +1279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, +1280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, +1281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, +1282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, +1283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, +1284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, +1285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, +1286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, +1287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, +1288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, +1289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, +1290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, +1291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, +1292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, +1293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, +1294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, +1295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, +1296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, +1297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, +1298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, +1299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, +1300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, +1301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, +1302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, +1303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, +1304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, +1305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, +1306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, +1307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, +1308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, +1309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, +1310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, +1311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, +1312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, +1313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, +1314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, +1315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, +1316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, +1317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, +1318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, +1319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, +1320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, +1321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, +1322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, +1323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, +1324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, +1325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, +1326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, +1327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, +1328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, +1329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, +1330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, +1331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, +1332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, +1333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, +1334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, +1335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, +1336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, +1337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, +1338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, +1339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, +1340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, +1341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, +1342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, +1343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, +1344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, +1345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, +1346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, +1347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, +1348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, +1349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, +1350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, +1351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, +1352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, +1353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, +1354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, +1355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, +1356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, +1357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, +1358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, +1359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, +1360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, +1361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, +1362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, +1363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, +1364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, +1365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, +1366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, +1367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, +1368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, +1369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, +1370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, +1371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, +1372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, +1373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, +1374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, +1375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, +1376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, +1377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, +1378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, +1379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, +1380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, +1381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, +1382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, +1383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, +1384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, +1385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, +1386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, +1387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, +1388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, +1389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, +1390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, +1391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, +1392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, +1393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, +1394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, +1395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, +1396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, +1397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, +1398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, +1399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, +1400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, +1401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, +1402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, +1403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, +1404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, +1405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, +1406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, +1407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, +1408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, +1409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, +1410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, +1411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, +1412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, +1413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, +1414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, +1415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, +1416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, +1417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, +1418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, +1419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, +1420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, +1421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, +1422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.48,48.63,48.63,48.63,48.63,48.63, +1423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.47,48.62,48.63,48.63,48.63,48.63, +1424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.46,48.62,48.62,48.62,48.62,48.62, +1425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.45,48.61,48.61,48.61,48.61,48.61, +1426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.44,48.60,48.60,48.60,48.60,48.60, +1427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.43,48.59,48.60,48.60,48.60,48.60, +1428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.42,48.59,48.59,48.59,48.59,48.59, +1429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.41,48.58,48.58,48.58,48.58,48.58, +1430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.40,48.57,48.57,48.57,48.57,48.57, +1431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.39,48.56,48.57,48.57,48.57,48.57, +1432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.38,48.56,48.56,48.56,48.56,48.56, +1433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.37,48.55,48.55,48.55,48.55,48.55, +1434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.36,48.54,48.54,48.54,48.54,48.54, +1435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.35,48.53,48.54,48.54,48.54,48.54, +1436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.34,48.52,48.53,48.53,48.53,48.53, +1437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.52,48.52,48.52,48.52,48.52, +1438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.51,48.51,48.51,48.51,48.51, +1439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.32,48.50,48.51,48.51,48.51,48.51, diff --git a/test/24hr67_medium_Preset_Rheem2020Build40.csv b/test/24hr67_medium_Preset_Rheem2020Build40.csv new file mode 100644 index 00000000..386fb6f0 --- /dev/null +++ b/test/24hr67_medium_Preset_Rheem2020Build40.csv @@ -0,0 +1,1441 @@ +minutes,Ta,Tsetpoint,inletT,draw,DRstatus,h_src1In (Wh),h_src1Out (Wh),h_src2In (Wh),h_src2Out (Wh),h_src3In (Wh),h_src3Out (Wh),tcouple1 (C),tcouple2 (C),tcouple3 (C),tcouple4 (C),tcouple5 (C),tcouple6 (C), toutlet (C) +0, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.88,49.90,51.65,51.65,51.65,51.65,51.66 +2, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,47.04,51.14,51.64,51.64,51.64,51.65 +3, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.93,42.61,49.84,51.63,51.63,51.63,51.64 +4, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.38,37.77,47.72,51.46,51.62,51.62,51.63 +5, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.16,33.84,44.76,50.90,51.61,51.61,51.62 +6, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.64,31.34,41.30,49.76,51.55,51.60,51.61 +7, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.06,29.78,37.83,47.94,51.32,51.59,51.60 +8, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.53,28.71,34.80,45.46,50.77,51.56,51.59 +9, 19.722222, 51.666667, 14.444444, 1.400000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.37,28.37,32.81,43.06,49.92,51.48,51.57 +10, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.79,29.79,32.82,43.06,49.91,51.47, +11, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.10,31.10,33.04,43.05,49.90,51.46, +12, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.24,32.24,33.61,43.04,49.89,51.44, +13, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.38,33.38,34.18,43.03,49.88,51.43, +14, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.52,34.52,34.75,43.02,49.87,51.42, +15, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.54,35.54,35.54,43.01,49.86,51.41, +16, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.49,36.49,36.49,43.01,49.85,51.39, +17, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.44,37.44,37.44,43.00,49.84,51.38, +18, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.38,38.38,38.38,43.00,49.83,51.37, +19, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.33,39.33,39.33,42.99,49.82,51.35, +20, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.28,40.28,40.28,42.99,49.81,51.34, +21, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.12,41.12,41.12,43.30,49.80,51.33, +22, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.93,41.93,41.93,43.70,49.79,51.32, +23, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.74,42.74,42.74,44.10,49.78,51.30, +24, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.55,43.55,43.55,44.51,49.77,51.29, +25, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.35,44.35,44.35,44.91,49.75,51.28, +26, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.16,45.16,45.16,45.31,49.74,51.27, +27, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.91,45.91,45.91,45.91,49.73,51.25, +28, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.61,46.61,46.61,46.61,49.72,51.24, +29, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.32,47.32,47.32,47.32,49.71,51.23, +30, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.03,48.03,48.03,48.03,49.71,51.22, +31, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.22,47.09,48.02,48.02,49.28,51.10,51.22 +32, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.69,46.03,47.85,48.01,48.94,50.88,51.20 +33, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.78,46.78,47.85,48.01,48.94,50.87, +34, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.06,48.06,48.06,48.06,48.93,50.86, +35, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.72,48.72,48.72,48.72,49.10,50.84, +36, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.34,49.34,49.34,49.34,49.41,50.83, +37, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.92,49.92,49.92,49.92,49.92,50.82, +38, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.48,50.48,50.48,50.48,50.48,50.80, +39, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.00,51.00,51.00,51.00,51.00,51.00, +40, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.47,51.47,51.47,51.47,51.47,51.47, +41, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,32.50,32.50,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +42, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +43, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +44, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +45, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +46, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +47, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +48, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +49, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +50, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +51, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +52, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +53, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +54, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +55, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +56, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +57, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +58, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +59, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +60, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +61, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +62, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +63, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +64, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +65, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +66, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +67, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +68, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +69, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +70, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +71, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +72, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +73, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +74, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +75, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +76, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, +77, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, +78, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, +79, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, +80, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, +81, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, +82, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, +83, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, +84, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, +85, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, +86, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, +87, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, +88, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, +89, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, +90, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, +91, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, +92, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, +93, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, +94, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, +95, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, +96, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, +97, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, +98, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, +99, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, +100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, +101, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.34,49.41,51.17,51.18,51.18,51.18,51.18 +102, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,46.54,50.66,51.17,51.17,51.17,51.18 +103, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.63,42.14,49.36,51.16,51.16,51.16,51.17 +104, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.15,37.36,47.25,50.99,51.15,51.15,51.16 +105, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.98,33.51,44.30,50.42,51.14,51.14,51.15 +106, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.01,32.64,43.28,50.08,51.11,51.13,51.14 +107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.75,33.75,43.27,50.07,51.10,51.12, +108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.17,35.17,43.26,50.06,51.10,51.11, +109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.60,36.60,43.25,50.05,51.09,51.10, +110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.02,38.02,43.25,50.04,51.08,51.09, +111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.44,39.44,43.24,50.03,51.07,51.08, +112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.79,40.79,43.40,50.01,51.06,51.07, +113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.92,41.92,43.96,50.00,51.05,51.06, +114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.06,43.06,44.52,49.99,51.04,51.05, +115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.19,44.19,45.09,49.98,51.03,51.04, +116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.33,45.33,45.65,49.97,51.02,51.03, +117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.38,46.38,46.38,49.96,51.01,51.02, +118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.32,47.32,47.32,49.95,51.00,51.00, +119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.27,48.27,48.27,49.94,50.99,50.99, +120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.21,49.21,49.21,49.93,50.98,50.98, +121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.02,50.02,50.02,50.32,50.98,50.98, +122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.80,50.80,50.80,50.80,50.97,50.97, +123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.32,51.32,51.32,51.32,51.32,51.32, +124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,55.84,55.84,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, +160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, +161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, +162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, +163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, +164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, +165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, +166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, +167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, +168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, +169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, +170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, +171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, +172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, +173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, +174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, +175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, +176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, +177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, +178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, +179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, +180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, +181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, +182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, +183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, +184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, +185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, +186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, +187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, +188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, +189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, +190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, +191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, +192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, +193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, +194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, +195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, +196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, +197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, +198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, +199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, +200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, +201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, +202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, +203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, +204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, +205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, +206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, +207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, +208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, +209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, +210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, +211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, +212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, +213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, +214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, +215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, +216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, +217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, +218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, +219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, +220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, +221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, +222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, +223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, +224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, +225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, +226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, +227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, +228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, +229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, +230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, +231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, +232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, +233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, +234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, +235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, +236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, +237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, +238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, +239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, +240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, +241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, +242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, +243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, +244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, +245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, +246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, +247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, +248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, +249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, +250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, +251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, +252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, +253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, +254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, +255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, +256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, +257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, +258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, +259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, +260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, +261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, +262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, +263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, +264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, +265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, +266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, +267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, +268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, +269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, +270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, +271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, +272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, +273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, +274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, +275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, +276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, +277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, +278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, +279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, +280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, +281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, +282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, +283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, +284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, +285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, +286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, +287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, +288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, +289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, +290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, +291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, +292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, +293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, +294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, +295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, +296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, +297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, +298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, +299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, +300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, +301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, +302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, +303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, +304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, +305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, +306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, +307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, +308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, +309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, +310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, +311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, +312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, +313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, +314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, +315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, +316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, +317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, +318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, +319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, +320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, +321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, +322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, +323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, +324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, +325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, +326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, +327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, +328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, +329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, +330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, +331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, +332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, +333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, +334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, +335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, +336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, +337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, +338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, +339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, +340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, +341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, +342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, +343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, +344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, +345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, +346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, +347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, +348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, +349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, +350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, +351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, +352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, +353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, +354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, +355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, +356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, +357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, +358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, +359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, +360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, +361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, +362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, +363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, +364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, +365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, +366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, +367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, +368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, +369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, +370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, +371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, +372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, +373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, +374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, +375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, +376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, +377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, +378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, +379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, +380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, +381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, +382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, +383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, +384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, +385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, +386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, +387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, +388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, +389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, +390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, +391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, +392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, +393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, +394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, +395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, +396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, +397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, +398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, +399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, +400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, +401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, +402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, +403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, +404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, +405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, +406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, +407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, +408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, +409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, +410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, +411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, +412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, +413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, +414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, +415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, +416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, +417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, +418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, +419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, +420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, +421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, +422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, +423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, +424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, +425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, +426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, +427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, +428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, +429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, +430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, +431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, +432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, +433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, +434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, +435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, +436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, +437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, +438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, +439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, +440, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, +441, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, +442, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, +443, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, +444, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, +445, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, +446, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, +447, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, +448, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, +449, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, +450, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, +451, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, +452, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, +453, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, +454, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, +455, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, +456, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, +457, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, +458, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, +459, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, +460, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, +461, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, +462, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, +463, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, +464, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, +465, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, +466, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, +467, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, +468, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, +469, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, +470, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, +471, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, +472, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, +473, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, +474, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, +475, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, +476, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, +477, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, +478, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, +479, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, +480, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, +481, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, +482, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, +483, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, +484, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, +485, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, +486, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, +487, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, +488, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, +489, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, +490, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, +491, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, +492, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, +493, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, +494, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, +495, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, +496, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, +497, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, +498, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, +499, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, +500, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, +501, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, +502, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, +503, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, +504, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, +505, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, +506, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, +507, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.48,48.63,48.63,48.63,48.63,48.63, +508, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.47,48.62,48.63,48.63,48.63,48.63, +509, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.46,48.62,48.62,48.62,48.62,48.62, +510, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.45,48.61,48.61,48.61,48.61,48.61, +511, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.44,48.60,48.60,48.60,48.60,48.60, +512, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.43,48.59,48.60,48.60,48.60,48.60, +513, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.42,48.59,48.59,48.59,48.59,48.59, +514, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.41,48.58,48.58,48.58,48.58,48.58, +515, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.40,48.57,48.57,48.57,48.57,48.57, +516, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.39,48.56,48.57,48.57,48.57,48.57, +517, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.38,48.56,48.56,48.56,48.56,48.56, +518, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.37,48.55,48.55,48.55,48.55,48.55, +519, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.36,48.54,48.54,48.54,48.54,48.54, +520, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.35,48.53,48.54,48.54,48.54,48.54, +521, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.34,48.52,48.53,48.53,48.53,48.53, +522, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.52,48.52,48.52,48.52,48.52, +523, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.51,48.51,48.51,48.51,48.51, +524, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.32,48.50,48.51,48.51,48.51,48.51, +525, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.31,48.49,48.50,48.50,48.50,48.50, +526, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.30,48.49,48.49,48.49,48.49,48.49, +527, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.29,48.48,48.48,48.48,48.48,48.48, +528, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.28,48.47,48.47,48.47,48.47,48.47, +529, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.27,48.46,48.47,48.47,48.47,48.47, +530, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.26,48.46,48.46,48.46,48.46,48.46, +531, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.25,48.45,48.45,48.45,48.45,48.45, +532, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.24,48.44,48.44,48.44,48.44,48.44, +533, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.23,48.43,48.44,48.44,48.44,48.44, +534, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.22,48.42,48.43,48.43,48.43,48.43, +535, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.21,48.42,48.42,48.42,48.42,48.42, +536, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.20,48.41,48.41,48.41,48.41,48.41, +537, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.19,48.40,48.41,48.41,48.41,48.41, +538, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.18,48.39,48.40,48.40,48.40,48.40, +539, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.17,48.39,48.39,48.39,48.39,48.39, +540, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.16,48.38,48.38,48.38,48.38,48.38, +541, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.15,48.37,48.38,48.38,48.38,48.38, +542, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.14,48.36,48.37,48.37,48.37,48.37, +543, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.13,48.36,48.36,48.36,48.36,48.36, +544, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.12,48.35,48.35,48.35,48.35,48.35, +545, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.11,48.34,48.35,48.35,48.35,48.35, +546, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.10,48.33,48.34,48.34,48.34,48.34, +547, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.09,48.32,48.33,48.33,48.33,48.33, +548, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.09,48.32,48.32,48.32,48.32,48.32, +549, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.08,48.31,48.32,48.32,48.32,48.32, +550, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.07,48.30,48.31,48.31,48.31,48.31, +551, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.06,48.29,48.30,48.30,48.30,48.30, +552, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.05,48.29,48.29,48.29,48.29,48.29, +553, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.04,48.28,48.29,48.29,48.29,48.29, +554, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.03,48.27,48.28,48.28,48.28,48.28, +555, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.02,48.26,48.27,48.27,48.27,48.27, +556, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.01,48.26,48.26,48.26,48.26,48.26, +557, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.00,48.25,48.26,48.26,48.26,48.26, +558, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.99,48.24,48.25,48.25,48.25,48.25, +559, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.98,48.23,48.24,48.24,48.24,48.24, +560, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.97,48.23,48.23,48.23,48.23,48.23, +561, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.96,48.22,48.23,48.23,48.23,48.23, +562, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.95,48.21,48.22,48.22,48.22,48.22, +563, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.94,48.20,48.21,48.21,48.21,48.21, +564, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.93,48.19,48.20,48.20,48.20,48.20, +565, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.92,48.19,48.20,48.20,48.20,48.20, +566, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.91,48.18,48.19,48.19,48.19,48.19, +567, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.91,48.17,48.18,48.18,48.18,48.18, +568, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.90,48.16,48.17,48.17,48.17,48.17, +569, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.89,48.16,48.17,48.17,48.17,48.17, +570, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.88,48.15,48.16,48.16,48.16,48.16, +571, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.87,48.14,48.15,48.15,48.15,48.15, +572, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.86,48.13,48.14,48.14,48.14,48.14, +573, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.85,48.13,48.14,48.14,48.14,48.14, +574, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.84,48.12,48.13,48.13,48.13,48.13, +575, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.83,48.11,48.12,48.12,48.12,48.12, +576, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.82,48.10,48.11,48.11,48.11,48.11, +577, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.81,48.10,48.11,48.11,48.11,48.11, +578, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.80,48.09,48.10,48.10,48.10,48.10, +579, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.79,48.08,48.09,48.09,48.09,48.09, +580, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.78,48.07,48.08,48.08,48.08,48.08, +581, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.77,48.06,48.08,48.08,48.08,48.08, +582, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.76,48.06,48.07,48.07,48.07,48.07, +583, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.75,48.05,48.06,48.06,48.06,48.06, +584, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.75,48.04,48.06,48.06,48.06,48.06, +585, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.74,48.03,48.05,48.05,48.05,48.05, +586, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.73,48.03,48.04,48.04,48.04,48.04, +587, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.72,48.02,48.03,48.03,48.03,48.03, +588, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.71,48.01,48.03,48.03,48.03,48.03, +589, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.70,48.00,48.02,48.02,48.02,48.02, +590, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.69,48.00,48.01,48.01,48.01,48.01, +591, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.68,47.99,48.00,48.00,48.00,48.00, +592, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.67,47.98,48.00,48.00,48.00,48.00, +593, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.66,47.97,47.99,47.99,47.99,47.99, +594, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.65,47.97,47.98,47.98,47.98,47.98, +595, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.64,47.96,47.97,47.97,47.97,47.97, +596, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.63,47.95,47.97,47.97,47.97,47.97, +597, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.62,47.94,47.96,47.96,47.96,47.96, +598, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.61,47.94,47.95,47.95,47.95,47.95, +599, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.61,47.93,47.94,47.94,47.94,47.94, +600, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.60,47.92,47.94,47.94,47.94,47.94, +601, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.59,47.91,47.93,47.93,47.93,47.93, +602, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.58,47.90,47.92,47.92,47.92,47.92, +603, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.57,47.90,47.91,47.91,47.91,47.91, +604, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.56,47.89,47.91,47.91,47.91,47.91, +605, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.55,47.88,47.90,47.90,47.90,47.90, +606, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.54,47.87,47.89,47.89,47.89,47.89, +607, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.53,47.87,47.88,47.88,47.88,47.88, +608, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.52,47.86,47.88,47.88,47.88,47.88, +609, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.51,47.85,47.87,47.87,47.87,47.87, +610, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.50,47.84,47.86,47.86,47.86,47.86, +611, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,47.84,47.85,47.85,47.85,47.85, +612, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,47.83,47.85,47.85,47.85,47.85, +613, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.48,47.82,47.84,47.84,47.84,47.84, +614, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.47,47.81,47.83,47.83,47.83,47.83, +615, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.46,47.81,47.83,47.83,47.83,47.83, +616, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.45,47.80,47.82,47.82,47.82,47.82, +617, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.44,47.79,47.81,47.81,47.81,47.81, +618, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.43,47.78,47.80,47.80,47.80,47.80, +619, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.42,47.78,47.80,47.80,47.80,47.80, +620, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.41,47.77,47.79,47.79,47.79,47.79, +621, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.40,47.76,47.78,47.78,47.78,47.78, +622, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.39,47.75,47.77,47.77,47.77,47.77, +623, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.38,47.74,47.77,47.77,47.77,47.77, +624, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.38,47.74,47.76,47.76,47.76,47.76, +625, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.37,47.73,47.75,47.75,47.75,47.75, +626, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.36,47.72,47.74,47.74,47.74,47.74, +627, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.35,47.71,47.74,47.74,47.74,47.74, +628, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.34,47.71,47.73,47.73,47.73,47.73, +629, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.33,47.70,47.72,47.72,47.72,47.72, +630, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.32,47.69,47.71,47.71,47.71,47.71, +631, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.83,45.77,47.71,47.71,47.71,47.71,47.71 +632, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.77,42.94,47.18,47.70,47.70,47.70,47.71 +633, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.54,38.91,45.88,47.69,47.69,47.69,47.70 +634, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.99,35.13,43.83,47.52,47.68,47.68,47.69 +635, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.29,32.48,41.19,46.95,47.67,47.67,47.68 +636, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.96,32.09,40.33,46.61,47.65,47.67,47.67 +637, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.45,33.45,40.32,46.60,47.64,47.66, +638, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.87,34.87,40.32,46.59,47.63,47.65, +639, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.30,36.30,40.31,46.58,47.63,47.64, +640, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.72,37.72,40.31,46.57,47.62,47.63, +641, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.89,38.89,40.81,46.56,47.61,47.62, +642, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.03,40.03,41.37,46.55,47.60,47.61, +643, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.16,41.16,41.94,46.54,47.59,47.60, +644, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.30,42.30,42.50,46.53,47.58,47.59, +645, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.31,43.31,43.31,46.52,47.58,47.58, +646, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.26,44.26,44.26,46.52,47.57,47.57, +647, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.20,45.20,45.20,46.51,47.56,47.56, +648, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.10,46.10,46.10,46.64,47.55,47.56, +649, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.90,46.90,46.90,47.04,47.54,47.55, +650, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.61,47.61,47.61,47.61,47.61,47.61, +651, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.07,48.07,48.07,48.07,48.07,48.07, +652, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.54,48.54,48.54,48.54,48.54,48.54, +653, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.01,49.01,49.01,49.01,49.01,49.01, +654, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.48,49.48,49.48,49.48,49.48,49.48, +655, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.94,49.94,49.94,49.94,49.94,49.94, +656, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.41,50.41,50.41,50.41,50.41,50.41, +657, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.88,50.88,50.88,50.88,50.88,50.88, +658, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.34,51.34,51.34,51.34,51.34,51.34, +659, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,52.62,52.62,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +660, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +661, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +662, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +663, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +664, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +665, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +666, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +667, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +668, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +669, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +670, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +671, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +672, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +673, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +674, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +675, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +676, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +677, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +678, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +679, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +680, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +681, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +682, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +683, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +684, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +685, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +686, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +687, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +688, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +689, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +690, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +691, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.60,49.65,51.40,51.40,51.40,51.40,51.41 +692, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,46.78,50.89,51.40,51.40,51.40,51.40 +693, 19.722222, 51.666667, 14.444444, 1.600000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.16,42.52,49.67,51.39,51.39,51.39,51.40 +694, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.17,42.51,49.65,51.38,51.38,51.38, +695, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.17,42.50,49.64,51.37,51.37,51.37, +696, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.17,42.50,49.63,51.36,51.36,51.36, +697, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.18,42.49,49.61,51.35,51.35,51.35, +698, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.18,42.48,49.60,51.34,51.34,51.34, +699, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.19,42.48,49.59,51.33,51.33,51.33, +700, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.19,42.47,49.58,51.32,51.32,51.32, +701, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.19,42.47,49.56,51.31,51.31,51.31, +702, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.20,42.46,49.55,51.30,51.30,51.30, +703, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.20,42.45,49.54,51.30,51.30,51.30, +704, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.21,42.45,49.53,51.29,51.29,51.29, +705, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.21,42.44,49.51,51.28,51.28,51.28, +706, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.21,42.43,49.50,51.27,51.27,51.27, +707, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.22,42.43,49.49,51.26,51.26,51.26, +708, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.22,42.42,49.48,51.25,51.25,51.25, +709, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.41,49.46,51.24,51.24,51.24, +710, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.41,49.45,51.23,51.23,51.23, +711, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.40,49.44,51.22,51.22,51.22, +712, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.39,49.43,51.21,51.21,51.21, +713, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.39,49.42,51.21,51.21,51.21, +714, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.38,49.40,51.20,51.20,51.20, +715, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.37,49.39,51.19,51.19,51.19, +716, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.37,49.38,51.18,51.18,51.18, +717, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.36,49.37,51.17,51.17,51.17, +718, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.35,49.35,51.16,51.16,51.16, +719, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.35,49.34,51.15,51.15,51.15, +720, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.27,42.34,49.33,51.14,51.14,51.14, +721, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.84,38.79,48.15,51.03,51.13,51.13,51.14 +722, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.69,38.79,48.14,51.02,51.12,51.12, +723, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.23,39.10,48.12,51.01,51.11,51.11, +724, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.09,40.09,48.11,51.00,51.11,51.11, +725, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.51,41.51,48.10,50.99,51.10,51.10, +726, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.93,42.93,48.08,50.98,51.09,51.09, +727, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.35,44.35,48.07,50.97,51.08,51.08, +728, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.77,45.77,48.07,50.96,51.07,51.07, +729, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.05,47.05,48.34,50.96,51.06,51.06, +730, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.18,48.18,48.90,50.95,51.05,51.05, +731, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.32,49.32,49.46,50.94,51.04,51.04, +732, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.31,50.31,50.31,50.93,51.03,51.03, +733, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.12,51.12,51.12,51.12,51.12,51.12, +734, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.59,51.59,51.59,51.59,51.59,51.59, +735, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,14.25,14.25,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +736, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +737, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +738, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +739, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +740, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +741, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +742, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +743, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +744, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +745, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +746, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +747, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +748, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +749, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +750, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +751, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +752, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +753, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +754, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +755, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +756, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +757, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +758, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +759, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +760, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +761, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +762, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +763, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +764, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +765, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +766, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.19,50.37,51.41,51.41,51.41,51.41,51.42 +767, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.18,50.37,51.40,51.40,51.40,51.40, +768, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.17,50.36,51.39,51.40,51.40,51.40, +769, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.16,50.35,51.38,51.39,51.39,51.39, +770, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.15,50.35,51.37,51.38,51.38,51.38, +771, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.63,51.19,51.37,51.37,51.37,51.38 +772, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.62,51.18,51.36,51.36,51.36, +773, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.62,51.17,51.35,51.35,51.35, +774, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.61,51.16,51.34,51.34,51.34, +775, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.87,48.60,51.15,51.33,51.33,51.33, +776, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.87,48.60,51.14,51.33,51.33,51.33, +777, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.86,48.59,51.13,51.32,51.32,51.32, +778, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.86,48.59,51.12,51.31,51.31,51.31, +779, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.85,48.58,51.11,51.30,51.30,51.30, +780, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.85,48.57,51.10,51.29,51.29,51.29, +781, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.84,48.57,51.09,51.28,51.28,51.28, +782, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.84,48.56,51.08,51.27,51.27,51.27, +783, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.83,48.55,51.07,51.26,51.26,51.26, +784, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.83,48.55,51.06,51.26,51.26,51.26, +785, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.82,48.54,51.05,51.25,51.25,51.25, +786, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.82,48.54,51.04,51.24,51.24,51.24, +787, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.81,48.53,51.03,51.23,51.23,51.23, +788, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.81,48.52,51.02,51.22,51.22,51.22, +789, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.80,48.52,51.01,51.21,51.21,51.21, +790, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.80,48.51,51.00,51.20,51.20,51.20, +791, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.79,48.50,50.99,51.19,51.19,51.19, +792, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.79,48.50,50.98,51.19,51.19,51.19, +793, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.78,48.49,50.97,51.18,51.18,51.18, +794, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.78,48.48,50.96,51.17,51.17,51.17, +795, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.77,48.48,50.95,51.16,51.16,51.16, +796, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.77,48.47,50.94,51.15,51.15,51.15, +797, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.76,48.46,50.93,51.14,51.14,51.14, +798, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.76,48.46,50.92,51.13,51.13,51.13, +799, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.75,48.45,50.91,51.12,51.12,51.12, +800, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.75,48.44,50.90,51.12,51.12,51.12, +801, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.74,48.44,50.89,51.11,51.11,51.11, +802, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.74,48.43,50.88,51.10,51.10,51.10, +803, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.42,50.87,51.09,51.09,51.09, +804, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.41,50.86,51.08,51.08,51.08, +805, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.41,50.85,51.07,51.07,51.07, +806, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.72,48.40,50.84,51.06,51.06,51.06, +807, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.72,48.39,50.83,51.06,51.06,51.06, +808, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.71,48.39,50.82,51.05,51.05,51.05, +809, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.71,48.38,50.81,51.04,51.04,51.04, +810, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.70,48.37,50.80,51.03,51.03,51.03, +811, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.70,48.37,50.79,51.02,51.02,51.02, +812, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.69,48.36,50.78,51.01,51.01,51.01, +813, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.69,48.35,50.77,51.00,51.00,51.00, +814, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.34,50.76,50.99,50.99,50.99, +815, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.34,50.75,50.99,50.99,50.99, +816, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.33,50.74,50.98,50.98,50.98, +817, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.67,48.32,50.73,50.97,50.97,50.97, +818, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.67,48.31,50.72,50.96,50.96,50.96, +819, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.66,48.31,50.71,50.95,50.95,50.95, +820, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.66,48.30,50.70,50.94,50.94,50.94, +821, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.65,48.29,50.69,50.93,50.93,50.93, +822, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.65,48.29,50.68,50.93,50.93,50.93, +823, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.64,48.28,50.67,50.92,50.92,50.92, +824, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.64,48.27,50.66,50.91,50.91,50.91, +825, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.26,50.65,50.90,50.90,50.90, +826, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.26,50.64,50.89,50.89,50.89, +827, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.25,50.63,50.88,50.88,50.88, +828, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.62,48.24,50.62,50.87,50.87,50.87, +829, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.62,48.23,50.61,50.86,50.86,50.86, +830, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.61,48.23,50.60,50.86,50.86,50.86, +831, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.61,48.22,50.59,50.85,50.85,50.85, +832, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.21,50.58,50.84,50.84,50.84, +833, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.20,50.57,50.83,50.83,50.83, +834, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.20,50.56,50.82,50.82,50.82, +835, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.59,48.19,50.55,50.81,50.81,50.81, +836, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.59,48.18,50.55,50.80,50.80,50.80, +837, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.58,48.17,50.54,50.80,50.80,50.80, +838, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.58,48.17,50.53,50.79,50.79,50.79, +839, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.16,50.52,50.78,50.78,50.78, +840, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.15,50.51,50.77,50.77,50.77, +841, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.14,50.50,50.76,50.76,50.76, +842, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.56,48.14,50.49,50.75,50.75,50.75, +843, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.56,48.13,50.48,50.74,50.74,50.74, +844, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.55,48.12,50.47,50.74,50.74,50.74, +845, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.55,48.11,50.46,50.73,50.73,50.73, +846, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.10,50.45,50.72,50.72,50.72, +847, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.10,50.44,50.71,50.71,50.71, +848, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.09,50.43,50.70,50.70,50.70, +849, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.53,48.08,50.42,50.69,50.69,50.69, +850, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.53,48.07,50.41,50.68,50.68,50.68, +851, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.52,48.07,50.40,50.67,50.67,50.67, +852, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.52,48.06,50.39,50.67,50.67,50.67, +853, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.05,50.39,50.66,50.66,50.66, +854, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.04,50.38,50.65,50.65,50.65, +855, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.03,50.37,50.64,50.64,50.64, +856, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.50,48.03,50.36,50.63,50.63,50.63, +857, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.50,48.02,50.35,50.62,50.62,50.62, +858, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.01,50.34,50.61,50.61,50.61, +859, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.00,50.33,50.61,50.61,50.61, +860, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.00,50.32,50.60,50.60,50.60, +861, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.48,47.99,50.31,50.59,50.59,50.59, +862, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.48,47.98,50.30,50.58,50.58,50.58, +863, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.47,47.97,50.29,50.57,50.57,50.57, +864, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.47,47.96,50.28,50.56,50.56,50.56, +865, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.96,50.28,50.55,50.55,50.55, +866, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.95,50.27,50.55,50.55,50.55, +867, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.94,50.26,50.54,50.54,50.54, +868, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.45,47.93,50.25,50.53,50.53,50.53, +869, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.45,47.92,50.24,50.52,50.52,50.52, +870, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.92,50.23,50.51,50.51,50.51, +871, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.91,50.22,50.50,50.50,50.50, +872, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.90,50.21,50.49,50.49,50.49, +873, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.43,47.89,50.20,50.49,50.49,50.49, +874, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.43,47.88,50.19,50.48,50.48,50.48, +875, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.88,50.18,50.47,50.47,50.47, +876, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.87,50.17,50.46,50.46,50.46, +877, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.86,50.17,50.45,50.45,50.45, +878, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.41,47.85,50.16,50.44,50.44,50.44, +879, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.41,47.84,50.15,50.43,50.43,50.43, +880, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.84,50.14,50.43,50.43,50.43, +881, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.83,50.13,50.42,50.42,50.42, +882, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.82,50.12,50.41,50.41,50.41, +883, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.39,47.81,50.11,50.40,50.40,50.40, +884, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.39,47.80,50.10,50.39,50.39,50.39, +885, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.79,50.09,50.38,50.38,50.38, +886, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.79,50.08,50.37,50.37,50.37, +887, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.78,50.08,50.37,50.37,50.37, +888, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.37,47.77,50.07,50.36,50.36,50.36, +889, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.37,47.76,50.06,50.35,50.35,50.35, +890, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.75,50.05,50.34,50.34,50.34, +891, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.75,50.04,50.33,50.33,50.33, +892, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.74,50.03,50.32,50.32,50.32, +893, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.35,47.73,50.02,50.31,50.31,50.31, +894, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.35,47.72,50.01,50.31,50.31,50.31, +895, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.71,50.00,50.30,50.30,50.30, +896, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.70,50.00,50.29,50.29,50.29, +897, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.70,49.99,50.28,50.28,50.28, +898, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.33,47.69,49.98,50.27,50.27,50.27, +899, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.33,47.68,49.97,50.26,50.26,50.26, +900, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.67,49.96,50.26,50.26,50.26, +901, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.66,49.95,50.25,50.25,50.25, +902, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.65,49.94,50.24,50.24,50.24, +903, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.31,47.65,49.93,50.23,50.23,50.23, +904, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.31,47.64,49.92,50.22,50.22,50.22, +905, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.63,49.92,50.21,50.21,50.21, +906, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.62,49.91,50.20,50.20,50.20, +907, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.61,49.90,50.20,50.20,50.20, +908, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.29,47.60,49.89,50.19,50.19,50.19, +909, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.29,47.60,49.88,50.18,50.18,50.18, +910, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.59,49.87,50.17,50.17,50.17, +911, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.58,49.86,50.16,50.16,50.16, +912, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.57,49.85,50.15,50.15,50.15, +913, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.27,47.56,49.85,50.14,50.14,50.14, +914, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.27,47.56,49.84,50.14,50.14,50.14, +915, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.55,49.83,50.13,50.13,50.13, +916, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.54,49.82,50.12,50.12,50.12, +917, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.53,49.81,50.11,50.11,50.11, +918, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.52,49.80,50.10,50.10,50.10, +919, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.51,49.79,50.09,50.09,50.09, +920, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.50,49.78,50.09,50.09,50.09, +921, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.24,47.50,49.78,50.08,50.08,50.08, +922, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.24,47.49,49.77,50.07,50.07,50.07, +923, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.48,49.76,50.06,50.06,50.06, +924, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.47,49.75,50.05,50.05,50.05, +925, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.46,49.74,50.04,50.04,50.04, +926, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.22,47.45,49.73,50.03,50.03,50.03, +927, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.22,47.45,49.72,50.03,50.03,50.03, +928, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.44,49.71,50.02,50.02,50.02, +929, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.43,49.71,50.01,50.01,50.01, +930, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.42,49.70,50.00,50.00,50.00, +931, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.20,47.41,49.69,49.99,49.99,49.99, +932, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.20,47.40,49.68,49.98,49.98,49.98, +933, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.40,49.67,49.98,49.98,49.98, +934, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.39,49.66,49.97,49.97,49.97, +935, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.38,49.65,49.96,49.96,49.96, +936, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.37,49.65,49.95,49.95,49.95, +937, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.36,49.64,49.94,49.94,49.94, +938, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.35,49.63,49.93,49.93,49.93, +939, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.17,47.35,49.62,49.93,49.93,49.93, +940, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.17,47.34,49.61,49.92,49.92,49.92, +941, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.33,49.60,49.91,49.91,49.91, +942, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.32,49.59,49.90,49.90,49.90, +943, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.31,49.58,49.89,49.89,49.89, +944, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.15,47.30,49.58,49.88,49.88,49.88, +945, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.15,47.29,49.57,49.87,49.87,49.87, +946, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.29,49.56,49.87,49.87,49.87, +947, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.28,49.55,49.86,49.86,49.86, +948, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.27,49.54,49.85,49.85,49.85, +949, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.26,49.53,49.84,49.84,49.84, +950, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.25,49.52,49.83,49.83,49.83, +951, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.24,49.52,49.82,49.82,49.82, +952, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.12,47.24,49.51,49.82,49.82,49.82, +953, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.12,47.23,49.50,49.81,49.81,49.81, +954, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.22,49.49,49.80,49.80,49.80, +955, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.21,49.48,49.79,49.79,49.79, +956, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.20,49.47,49.78,49.78,49.78, +957, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.19,49.46,49.77,49.77,49.77, +958, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.18,49.46,49.77,49.77,49.77, +959, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.18,49.45,49.76,49.76,49.76, +960, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.09,47.17,49.44,49.75,49.75,49.75, +961, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.95,44.75,49.11,49.74,49.74,49.74,49.75 +962, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.95,44.75,49.10,49.73,49.73,49.73, +963, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.94,44.74,49.09,49.72,49.72,49.72, +964, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.94,44.74,49.08,49.71,49.71,49.71, +965, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.94,44.73,49.07,49.71,49.71,49.71, +966, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.94,44.73,49.06,49.70,49.70,49.70, +967, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.93,44.72,49.05,49.69,49.69,49.69, +968, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.93,44.72,49.04,49.68,49.68,49.68, +969, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.93,44.71,49.03,49.67,49.67,49.67, +970, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.92,44.71,49.02,49.66,49.66,49.66, +971, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.92,44.70,49.01,49.66,49.66,49.66, +972, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.92,44.70,48.99,49.65,49.65,49.65, +973, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.91,44.69,48.98,49.64,49.64,49.64, +974, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.91,44.69,48.97,49.63,49.63,49.63, +975, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.91,44.68,48.96,49.62,49.62,49.62, +976, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,42.26,48.28,49.58,49.61,49.61,49.62 +977, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.23,49.49,49.60,49.60,49.61 +978, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.21,49.48,49.60,49.60, +979, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.20,49.47,49.59,49.59, +980, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.19,49.46,49.58,49.58, +981, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.18,49.45,49.57,49.57, +982, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.17,49.45,49.56,49.56, +983, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.85,47.15,49.44,49.55,49.55, +984, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.85,47.14,49.43,49.54,49.54, +985, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.85,47.13,49.42,49.53,49.53, +986, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.85,47.12,49.41,49.52,49.52, +987, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.85,47.10,49.41,49.51,49.51, +988, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.85,47.09,49.40,49.50,49.50, +989, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.85,47.08,49.39,49.50,49.50, +990, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.07,49.38,49.49,49.49, +991, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.06,49.37,49.48,49.48, +992, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.05,49.37,49.47,49.47, +993, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.03,49.36,49.46,49.46, +994, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.02,49.35,49.45,49.45, +995, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.01,49.34,49.44,49.44, +996, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,47.00,49.33,49.43,49.43, +997, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,46.99,49.32,49.43,49.43, +998, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,46.97,49.31,49.42,49.42, +999, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,46.96,49.31,49.41,49.41, +1000, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,46.95,49.30,49.40,49.40, +1001, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.82,46.94,49.29,49.39,49.39, +1002, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.82,46.93,49.28,49.38,49.38, +1003, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.82,46.92,49.27,49.37,49.37, +1004, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.84,39.82,46.90,49.26,49.37,49.37, +1005, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.84,39.82,46.89,49.25,49.36,49.36, +1006, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.56,36.56,44.72,48.93,49.35,49.35,49.36 +1007, 19.722222, 51.666667, 14.444444, 0.300000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.45,35.38,44.25,48.79,49.33,49.34,49.35 +1008, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.34,36.34,44.23,48.78,49.33,49.33, +1009, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.76,37.76,44.22,48.77,49.32,49.32, +1010, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.19,39.19,44.21,48.76,49.31,49.31, +1011, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.61,40.61,44.21,48.75,49.30,49.30, +1012, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.03,42.03,44.20,48.74,49.29,49.29, +1013, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.19,43.19,44.71,48.74,49.28,49.28, +1014, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.33,44.33,45.27,48.73,49.27,49.27, +1015, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.46,45.46,45.84,48.72,49.26,49.26, +1016, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.53,46.53,46.53,48.71,49.25,49.25, +1017, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.47,47.47,47.47,48.70,49.25,49.25, +1018, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.40,48.40,48.40,48.74,49.24,49.24, +1019, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.19,49.19,49.19,49.19,49.23,49.23, +1020, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.67,49.67,49.67,49.67,49.67,49.67, +1021, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.22,48.01,49.66,49.66,49.66,49.66,49.67 +1022, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.80,45.78,49.18,49.65,49.65,49.65,49.66 +1023, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.81,42.76,48.08,49.64,49.64,49.64,49.65 +1024, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.66,39.60,46.43,49.48,49.64,49.64,49.64 +1025, 19.722222, 51.666667, 14.444444, 0.200000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.71,38.54,46.17,49.42,49.63,49.63,49.64 +1026, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.55,39.55,46.16,49.41,49.62,49.62, +1027, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.97,40.97,46.15,49.40,49.61,49.61, +1028, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.39,42.39,46.14,49.39,49.60,49.60, +1029, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.81,43.81,46.13,49.38,49.59,49.59, +1030, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.10,45.10,46.39,49.37,49.58,49.58, +1031, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.23,46.23,46.95,49.37,49.57,49.57, +1032, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.37,47.37,47.51,49.36,49.56,49.56, +1033, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.36,48.36,48.36,49.35,49.55,49.55, +1034, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.28,49.28,49.28,49.41,49.54,49.54, +1035, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.86,49.86,49.86,49.86,49.86,49.86, +1036, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.32,50.32,50.32,50.32,50.32,50.32, +1037, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.79,50.79,50.79,50.79,50.79,50.79, +1038, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.26,51.26,51.26,51.26,51.26,51.26, +1039, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,66.33,66.33,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +1040, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1041, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +1042, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +1043, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +1044, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +1045, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +1046, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +1047, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +1048, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +1049, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +1050, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +1051, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +1052, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +1053, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +1054, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +1055, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +1056, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +1057, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +1058, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +1059, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +1060, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +1061, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +1062, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +1063, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +1064, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +1065, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +1066, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +1067, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +1068, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +1069, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +1070, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +1071, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +1072, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +1073, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +1074, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, +1075, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, +1076, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, +1077, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, +1078, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, +1079, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, +1080, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, +1081, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, +1082, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, +1083, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, +1084, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, +1085, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, +1086, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, +1087, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, +1088, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, +1089, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, +1090, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, +1091, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, +1092, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, +1093, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, +1094, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, +1095, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, +1096, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, +1097, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, +1098, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, +1099, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, +1100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, +1101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, +1102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, +1103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, +1104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, +1105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, +1106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, +1107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, +1108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, +1109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, +1110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, +1111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, +1112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, +1113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, +1114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, +1115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, +1116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, +1117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, +1118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, +1119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, +1120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, +1121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, +1122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, +1123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, +1124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, +1125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, +1126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, +1127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, +1128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, +1129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, +1130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, +1131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, +1132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, +1133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, +1134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, +1135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, +1136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, +1137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, +1138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, +1139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, +1140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, +1141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, +1142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, +1143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, +1144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, +1145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, +1146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, +1147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, +1148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, +1149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, +1150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, +1151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, +1152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, +1153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, +1154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, +1155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, +1156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, +1157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, +1158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, +1159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, +1160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, +1161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, +1162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, +1163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, +1164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, +1165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, +1166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, +1167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, +1168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, +1169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, +1170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, +1171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, +1172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, +1173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, +1174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, +1175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, +1176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, +1177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, +1178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, +1179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, +1180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, +1181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, +1182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, +1183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, +1184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, +1185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, +1186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, +1187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, +1188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, +1189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, +1190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, +1191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, +1192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, +1193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, +1194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, +1195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, +1196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, +1197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, +1198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, +1199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, +1200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, +1201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, +1202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, +1203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, +1204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, +1205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, +1206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, +1207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, +1208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, +1209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, +1210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, +1211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, +1212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, +1213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, +1214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, +1215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, +1216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, +1217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, +1218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, +1219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, +1220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, +1221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, +1222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, +1223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, +1224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, +1225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, +1226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, +1227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, +1228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, +1229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, +1230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, +1231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, +1232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, +1233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, +1234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, +1235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, +1236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, +1237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, +1238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, +1239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, +1240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, +1241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, +1242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, +1243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, +1244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, +1245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, +1246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, +1247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, +1248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, +1249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, +1250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, +1251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, +1252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, +1253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, +1254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, +1255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, +1256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, +1257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, +1258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, +1259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, +1260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, +1261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, +1262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, +1263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, +1264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, +1265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, +1266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, +1267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, +1268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, +1269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, +1270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, +1271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, +1272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, +1273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, +1274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, +1275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, +1276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, +1277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, +1278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, +1279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, +1280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, +1281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, +1282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, +1283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, +1284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, +1285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, +1286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, +1287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, +1288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, +1289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, +1290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, +1291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, +1292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, +1293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, +1294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, +1295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, +1296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, +1297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, +1298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, +1299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, +1300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, +1301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, +1302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, +1303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, +1304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, +1305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, +1306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, +1307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, +1308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, +1309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, +1310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, +1311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, +1312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, +1313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, +1314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, +1315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, +1316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, +1317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, +1318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, +1319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, +1320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, +1321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, +1322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, +1323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, +1324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, +1325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, +1326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, +1327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, +1328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, +1329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, +1330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, +1331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, +1332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, +1333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, +1334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, +1335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, +1336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, +1337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, +1338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, +1339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, +1340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, +1341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, +1342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, +1343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, +1344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, +1345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, +1346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, +1347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, +1348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, +1349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, +1350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, +1351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, +1352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, +1353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, +1354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, +1355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, +1356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, +1357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, +1358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, +1359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, +1360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, +1361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, +1362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, +1363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, +1364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, +1365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, +1366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, +1367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, +1368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, +1369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, +1370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, +1371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, +1372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, +1373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, +1374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, +1375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, +1376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, +1377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, +1378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, +1379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, +1380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, +1381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, +1382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, +1383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, +1384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, +1385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, +1386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, +1387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, +1388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, +1389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, +1390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, +1391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, +1392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, +1393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, +1394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, +1395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, +1396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, +1397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, +1398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, +1399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, +1400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, +1401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, +1402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, +1403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, +1404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, +1405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, +1406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, +1407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, +1408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, +1409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, +1410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, +1411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, +1412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, +1413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, +1414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, +1415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, +1416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, +1417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, +1418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, +1419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, +1420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, +1421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, +1422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.48,48.63,48.63,48.63,48.63,48.63, +1423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.47,48.62,48.63,48.63,48.63,48.63, +1424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.46,48.62,48.62,48.62,48.62,48.62, +1425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.45,48.61,48.61,48.61,48.61,48.61, +1426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.44,48.60,48.60,48.60,48.60,48.60, +1427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.43,48.59,48.60,48.60,48.60,48.60, +1428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.42,48.59,48.59,48.59,48.59,48.59, +1429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.41,48.58,48.58,48.58,48.58,48.58, +1430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.40,48.57,48.57,48.57,48.57,48.57, +1431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.39,48.56,48.57,48.57,48.57,48.57, +1432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.38,48.56,48.56,48.56,48.56,48.56, +1433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.37,48.55,48.55,48.55,48.55,48.55, +1434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.36,48.54,48.54,48.54,48.54,48.54, +1435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.35,48.53,48.54,48.54,48.54,48.54, +1436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.34,48.52,48.53,48.53,48.53,48.53, +1437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.52,48.52,48.52,48.52,48.52, +1438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.51,48.51,48.51,48.51,48.51, +1439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.32,48.50,48.51,48.51,48.51,48.51, diff --git a/test/24hr67_vsmall_Preset_Rheem2020Build40.csv b/test/24hr67_vsmall_Preset_Rheem2020Build40.csv new file mode 100644 index 00000000..42bae76e --- /dev/null +++ b/test/24hr67_vsmall_Preset_Rheem2020Build40.csv @@ -0,0 +1,1441 @@ +minutes,Ta,Tsetpoint,inletT,draw,DRstatus,h_src1In (Wh),h_src1Out (Wh),h_src2In (Wh),h_src2Out (Wh),h_src3In (Wh),h_src3Out (Wh),tcouple1 (C),tcouple2 (C),tcouple3 (C),tcouple4 (C),tcouple5 (C),tcouple6 (C), toutlet (C) +0, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,50.62,51.65,51.65,51.65,51.65,51.66 +2, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.17,48.92,51.47,51.64,51.64,51.64,51.65 +3, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.16,48.92,51.46,51.63,51.63,51.63, +4, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.16,48.91,51.45,51.62,51.62,51.62, +5, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.15,48.90,51.44,51.61,51.61,51.61, +6, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.15,48.90,51.43,51.61,51.61,51.61, +7, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.14,48.89,51.41,51.60,51.60,51.60, +8, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.13,48.88,51.40,51.59,51.59,51.59, +9, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.13,48.88,51.39,51.58,51.58,51.58, +10, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.12,48.87,51.38,51.57,51.57,51.57, +11, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.12,48.87,51.37,51.56,51.56,51.56, +12, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.11,48.86,51.36,51.55,51.55,51.55, +13, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.11,48.85,51.35,51.54,51.54,51.54, +14, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.10,48.85,51.34,51.54,51.54,51.54, +15, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.10,48.84,51.33,51.53,51.53,51.53, +16, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.09,48.83,51.32,51.52,51.52,51.52, +17, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.09,48.83,51.31,51.51,51.51,51.51, +18, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.08,48.82,51.30,51.50,51.50,51.50, +19, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.08,48.81,51.29,51.49,51.49,51.49, +20, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.07,48.81,51.28,51.48,51.48,51.48, +21, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.07,48.80,51.27,51.47,51.47,51.47, +22, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.06,48.79,51.26,51.47,51.47,51.47, +23, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.06,48.79,51.25,51.46,51.46,51.46, +24, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.05,48.78,51.24,51.45,51.45,51.45, +25, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.05,48.77,51.23,51.44,51.44,51.44, +26, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.04,48.77,51.22,51.43,51.43,51.43, +27, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.04,48.76,51.21,51.42,51.42,51.42, +28, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.03,48.75,51.20,51.41,51.41,51.41, +29, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.03,48.75,51.19,51.40,51.40,51.40, +30, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.02,48.74,51.18,51.39,51.39,51.39, +31, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.02,48.73,51.17,51.39,51.39,51.39, +32, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.01,48.73,51.16,51.38,51.38,51.38, +33, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.01,48.72,51.15,51.37,51.37,51.37, +34, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.00,48.71,51.14,51.36,51.36,51.36, +35, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.00,48.71,51.13,51.35,51.35,51.35, +36, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.00,48.70,51.12,51.34,51.34,51.34, +37, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.99,48.69,51.11,51.33,51.33,51.33, +38, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.99,48.68,51.10,51.32,51.32,51.32, +39, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.98,48.68,51.09,51.32,51.32,51.32, +40, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.98,48.67,51.08,51.31,51.31,51.31, +41, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.97,48.66,51.07,51.30,51.30,51.30, +42, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.97,48.66,51.06,51.29,51.29,51.29, +43, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.96,48.65,51.05,51.28,51.28,51.28, +44, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.96,48.64,51.04,51.27,51.27,51.27, +45, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.95,48.63,51.03,51.26,51.26,51.26, +46, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.95,48.63,51.02,51.25,51.25,51.25, +47, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.94,48.62,51.01,51.25,51.25,51.25, +48, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.94,48.61,51.00,51.24,51.24,51.24, +49, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.93,48.61,50.99,51.23,51.23,51.23, +50, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.93,48.60,50.98,51.22,51.22,51.22, +51, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.93,48.59,50.97,51.21,51.21,51.21, +52, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.92,48.58,50.96,51.20,51.20,51.20, +53, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.92,48.58,50.95,51.19,51.19,51.19, +54, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.91,48.57,50.94,51.18,51.18,51.18, +55, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.91,48.56,50.93,51.18,51.18,51.18, +56, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.90,48.55,50.92,51.17,51.17,51.17, +57, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.90,48.55,50.91,51.16,51.16,51.16, +58, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.54,50.90,51.15,51.15,51.15, +59, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.53,50.89,51.14,51.14,51.14, +60, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.52,50.88,51.13,51.13,51.13, +61, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.57,46.12,50.48,51.12,51.12,51.12,51.13 +62, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.57,46.11,50.47,51.11,51.11,51.11, +63, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,46.11,50.46,51.11,51.11,51.11, +64, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,46.10,50.45,51.10,51.10,51.10, +65, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,46.10,50.44,51.09,51.09,51.09, +66, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.80,44.19,50.06,51.07,51.08,51.08,51.09 +67, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.79,44.18,50.05,51.06,51.07,51.07, +68, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.79,44.18,50.04,51.05,51.06,51.06, +69, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.79,44.18,50.02,51.04,51.05,51.05, +70, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.79,44.18,50.01,51.03,51.04,51.04, +71, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.95,42.50,49.49,51.00,51.03,51.03,51.04 +72, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.95,42.50,49.48,50.99,51.02,51.02, +73, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.94,42.50,49.46,50.98,51.02,51.02, +74, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.94,42.50,49.45,50.97,51.01,51.01, +75, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.94,42.50,49.44,50.96,51.00,51.00, +76, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.06,41.01,48.80,50.91,50.99,50.99,51.00 +77, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.05,41.01,48.78,50.90,50.98,50.98, +78, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.05,41.01,48.77,50.89,50.97,50.97, +79, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.05,41.01,48.76,50.88,50.96,50.96, +80, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.04,41.01,48.74,50.87,50.95,50.95, +81, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.04,41.01,48.73,50.87,50.94,50.94, +82, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.04,41.01,48.72,50.86,50.93,50.93, +83, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.03,41.01,48.70,50.85,50.92,50.92, +84, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.03,41.01,48.69,50.84,50.91,50.91, +85, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.03,41.01,48.68,50.83,50.90,50.90, +86, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.02,41.01,48.66,50.82,50.90,50.90, +87, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.02,41.01,48.65,50.81,50.89,50.89, +88, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.02,41.01,48.64,50.80,50.88,50.88, +89, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.01,41.01,48.62,50.79,50.87,50.87, +90, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.01,41.01,48.61,50.79,50.86,50.86, +91, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.01,41.01,48.60,50.78,50.85,50.85, +92, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.00,41.01,48.58,50.77,50.84,50.84, +93, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.00,41.01,48.57,50.76,50.83,50.83, +94, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.00,41.01,48.56,50.75,50.82,50.82, +95, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.00,41.01,48.54,50.74,50.81,50.81, +96, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.99,41.01,48.53,50.73,50.80,50.80, +97, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.99,41.01,48.52,50.72,50.80,50.80, +98, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.99,41.01,48.51,50.71,50.79,50.79, +99, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.98,41.01,48.49,50.70,50.78,50.78, +100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.98,41.01,48.48,50.70,50.77,50.77, +101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.98,41.01,48.47,50.69,50.76,50.76, +102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.97,41.01,48.45,50.68,50.75,50.75, +103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.97,41.01,48.44,50.67,50.74,50.74, +104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.97,41.01,48.43,50.66,50.73,50.73, +105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.96,41.01,48.42,50.65,50.72,50.72, +106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.96,41.01,48.40,50.64,50.71,50.71, +107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.96,41.01,48.39,50.63,50.71,50.71, +108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.95,41.01,48.38,50.62,50.70,50.70, +109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.95,41.01,48.37,50.62,50.69,50.69, +110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.95,41.01,48.35,50.61,50.68,50.68, +111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.95,41.01,48.34,50.60,50.67,50.67, +112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.94,41.01,48.33,50.59,50.66,50.66, +113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.94,41.01,48.32,50.58,50.65,50.65, +114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.94,41.01,48.30,50.57,50.64,50.64, +115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.93,41.01,48.29,50.56,50.63,50.63, +116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.93,41.01,48.28,50.55,50.62,50.62, +117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.93,41.01,48.27,50.54,50.62,50.62, +118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.92,41.01,48.25,50.53,50.61,50.61, +119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.92,41.00,48.24,50.53,50.60,50.60, +120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.92,41.00,48.23,50.52,50.59,50.59, +121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.92,41.00,48.22,50.51,50.58,50.58, +122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.91,41.00,48.20,50.50,50.57,50.57, +123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.91,41.00,48.19,50.49,50.56,50.56, +124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.91,41.00,48.18,50.48,50.55,50.55, +125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.90,41.00,48.17,50.47,50.54,50.54, +126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.90,41.00,48.16,50.46,50.53,50.53, +127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.90,41.00,48.14,50.45,50.53,50.53, +128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.89,41.00,48.13,50.44,50.52,50.52, +129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.89,40.99,48.12,50.44,50.51,50.51, +130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.89,40.99,48.11,50.43,50.50,50.50, +131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.89,40.99,48.10,50.42,50.49,50.49, +132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.88,40.99,48.08,50.41,50.48,50.48, +133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.88,40.99,48.07,50.40,50.47,50.47, +134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.88,40.99,48.06,50.39,50.46,50.46, +135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.87,40.99,48.05,50.38,50.45,50.45, +136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.87,40.99,48.04,50.37,50.45,50.45, +137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.87,40.99,48.03,50.36,50.44,50.44, +138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.86,40.98,48.01,50.35,50.43,50.43, +139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.86,40.98,48.00,50.35,50.42,50.42, +140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.86,40.98,47.99,50.34,50.41,50.41, +141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.86,40.98,47.98,50.33,50.40,50.40, +142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.85,40.98,47.97,50.32,50.39,50.39, +143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.85,40.98,47.96,50.31,50.38,50.38, +144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.85,40.98,47.94,50.30,50.37,50.37, +145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.84,40.97,47.93,50.29,50.36,50.36, +146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.84,40.97,47.92,50.28,50.36,50.36, +147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.84,40.97,47.91,50.27,50.35,50.35, +148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.84,40.97,47.90,50.26,50.34,50.34, +149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.83,40.97,47.89,50.26,50.33,50.33, +150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.83,40.97,47.87,50.25,50.32,50.32, +151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.83,40.97,47.86,50.24,50.31,50.31, +152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.82,40.96,47.85,50.23,50.30,50.30, +153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.82,40.96,47.84,50.22,50.29,50.29, +154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.82,40.96,47.83,50.21,50.28,50.28, +155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.82,40.96,47.82,50.20,50.28,50.28, +156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.81,40.96,47.81,50.19,50.27,50.27, +157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.81,40.95,47.80,50.18,50.26,50.26, +158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.81,40.95,47.78,50.18,50.25,50.25, +159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.80,40.95,47.77,50.17,50.24,50.24, +160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.80,40.95,47.76,50.16,50.23,50.23, +161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.80,40.95,47.75,50.15,50.22,50.22, +162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.80,40.95,47.74,50.14,50.21,50.21, +163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.79,40.94,47.73,50.13,50.20,50.20, +164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.79,40.94,47.72,50.12,50.20,50.20, +165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.79,40.94,47.71,50.11,50.19,50.19, +166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.78,40.94,47.70,50.10,50.18,50.18, +167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.78,40.94,47.68,50.09,50.17,50.17, +168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.78,40.93,47.67,50.08,50.16,50.16, +169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.78,40.93,47.66,50.08,50.15,50.15, +170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.77,40.93,47.65,50.07,50.14,50.14, +171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.77,40.93,47.64,50.06,50.13,50.13, +172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.77,40.93,47.63,50.05,50.13,50.13, +173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.77,40.92,47.62,50.04,50.12,50.12, +174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.76,40.92,47.61,50.03,50.11,50.11, +175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.76,40.92,47.60,50.02,50.10,50.10, +176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.76,40.92,47.59,50.01,50.09,50.09, +177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.75,40.92,47.58,50.00,50.08,50.08, +178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.75,40.91,47.56,49.99,50.07,50.07, +179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.75,40.91,47.55,49.99,50.06,50.06, +180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.75,40.91,47.54,49.98,50.05,50.05, +181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.74,40.91,47.53,49.97,50.05,50.05, +182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.74,40.90,47.52,49.96,50.04,50.04, +183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.74,40.90,47.51,49.95,50.03,50.03, +184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.74,40.90,47.50,49.94,50.02,50.02, +185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.73,40.90,47.49,49.93,50.01,50.01, +186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.73,40.90,47.48,49.92,50.00,50.00, +187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.73,40.89,47.47,49.91,49.99,49.99, +188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,40.89,47.46,49.90,49.98,49.98, +189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,40.89,47.45,49.90,49.98,49.98, +190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,40.89,47.44,49.89,49.97,49.97, +191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,40.88,47.43,49.88,49.96,49.96, +192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.71,40.88,47.42,49.87,49.95,49.95, +193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.71,40.88,47.40,49.86,49.94,49.94, +194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.71,40.88,47.39,49.85,49.93,49.93, +195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.71,40.87,47.38,49.84,49.92,49.92, +196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.70,40.87,47.37,49.83,49.91,49.91, +197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.70,40.87,47.36,49.82,49.90,49.90, +198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.70,40.87,47.35,49.81,49.90,49.90, +199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.69,40.86,47.34,49.81,49.89,49.89, +200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.69,40.86,47.33,49.80,49.88,49.88, +201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.69,40.86,47.32,49.79,49.87,49.87, +202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.69,40.86,47.31,49.78,49.86,49.86, +203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.68,40.85,47.30,49.77,49.85,49.85, +204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.68,40.85,47.29,49.76,49.84,49.84, +205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.68,40.85,47.28,49.75,49.83,49.83, +206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.68,40.85,47.27,49.74,49.83,49.83, +207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.67,40.84,47.26,49.73,49.82,49.82, +208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.67,40.84,47.25,49.73,49.81,49.81, +209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.67,40.84,47.24,49.72,49.80,49.80, +210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.67,40.84,47.23,49.71,49.79,49.79, +211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.66,40.83,47.22,49.70,49.78,49.78, +212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.66,40.83,47.21,49.69,49.77,49.77, +213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.66,40.83,47.20,49.68,49.76,49.76, +214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.65,40.82,47.19,49.67,49.76,49.76, +215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.65,40.82,47.18,49.66,49.75,49.75, +216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.65,40.82,47.17,49.65,49.74,49.74, +217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.65,40.82,47.16,49.64,49.73,49.73, +218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.64,40.81,47.15,49.64,49.72,49.72, +219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.64,40.81,47.14,49.63,49.71,49.71, +220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.64,40.81,47.13,49.62,49.70,49.70, +221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.64,40.81,47.12,49.61,49.69,49.69, +222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.63,40.80,47.11,49.60,49.69,49.69, +223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.63,40.80,47.10,49.59,49.68,49.68, +224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.63,40.80,47.09,49.58,49.67,49.67, +225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.63,40.79,47.08,49.57,49.66,49.66, +226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.62,40.79,47.07,49.56,49.65,49.65, +227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.62,40.79,47.06,49.55,49.64,49.64, +228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.62,40.78,47.05,49.55,49.63,49.63, +229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.62,40.78,47.04,49.54,49.62,49.62, +230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.61,40.78,47.03,49.53,49.62,49.62, +231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.61,40.78,47.02,49.52,49.61,49.61, +232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.61,40.77,47.01,49.51,49.60,49.60, +233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.60,40.77,47.00,49.50,49.59,49.59, +234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.60,40.77,46.99,49.49,49.58,49.58, +235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.60,40.76,46.98,49.48,49.57,49.57, +236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.60,40.76,46.97,49.47,49.56,49.56, +237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.59,40.76,46.96,49.46,49.56,49.56, +238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.59,40.76,46.95,49.46,49.55,49.55, +239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.59,40.75,46.94,49.45,49.54,49.54, +240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.59,40.75,46.93,49.44,49.53,49.53, +241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,40.75,46.92,49.43,49.52,49.52, +242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,40.74,46.91,49.42,49.51,49.51, +243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,40.74,46.90,49.41,49.50,49.50, +244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,40.74,46.89,49.40,49.49,49.49, +245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.57,40.73,46.88,49.39,49.49,49.49, +246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.57,40.73,46.87,49.38,49.48,49.48, +247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.57,40.73,46.86,49.38,49.47,49.47, +248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.57,40.72,46.85,49.37,49.46,49.46, +249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.56,40.72,46.84,49.36,49.45,49.45, +250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.56,40.72,46.83,49.35,49.44,49.44, +251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.56,40.71,46.82,49.34,49.43,49.43, +252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.56,40.71,46.81,49.33,49.42,49.42, +253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.55,40.71,46.81,49.32,49.42,49.42, +254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.55,40.70,46.80,49.31,49.41,49.41, +255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.55,40.70,46.79,49.30,49.40,49.40, +256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.55,40.70,46.78,49.29,49.39,49.39, +257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.54,40.70,46.77,49.29,49.38,49.38, +258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.54,40.69,46.76,49.28,49.37,49.37, +259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.54,40.69,46.75,49.27,49.36,49.36, +260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.54,40.69,46.74,49.26,49.36,49.36, +261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.53,40.68,46.73,49.25,49.35,49.35, +262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.53,40.68,46.72,49.24,49.34,49.34, +263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.53,40.68,46.71,49.23,49.33,49.33, +264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.53,40.67,46.70,49.22,49.32,49.32, +265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.52,40.67,46.69,49.21,49.31,49.31, +266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.52,40.67,46.68,49.21,49.30,49.30, +267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.52,40.66,46.67,49.20,49.30,49.30, +268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.52,40.66,46.66,49.19,49.29,49.29, +269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,40.66,46.65,49.18,49.28,49.28, +270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,40.65,46.64,49.17,49.27,49.27, +271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,40.65,46.64,49.16,49.26,49.26, +272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,40.65,46.63,49.15,49.25,49.25, +273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.50,40.64,46.62,49.14,49.24,49.24, +274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.50,40.64,46.61,49.13,49.23,49.23, +275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.50,40.64,46.60,49.13,49.23,49.23, +276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.50,40.63,46.59,49.12,49.22,49.22, +277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,40.63,46.58,49.11,49.21,49.21, +278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,40.62,46.57,49.10,49.20,49.20, +279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,40.62,46.56,49.09,49.19,49.19, +280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.48,40.62,46.55,49.08,49.18,49.18, +281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.48,40.61,46.54,49.07,49.17,49.17, +282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.48,40.61,46.53,49.06,49.17,49.17, +283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.48,40.61,46.52,49.05,49.16,49.16, +284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.47,40.60,46.52,49.04,49.15,49.15, +285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.47,40.60,46.51,49.04,49.14,49.14, +286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.47,40.60,46.50,49.03,49.13,49.13, +287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.47,40.59,46.49,49.02,49.12,49.12, +288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.46,40.59,46.48,49.01,49.11,49.11, +289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.46,40.59,46.47,49.00,49.11,49.11, +290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.46,40.58,46.46,48.99,49.10,49.10, +291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.46,40.58,46.45,48.98,49.09,49.09, +292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.45,40.58,46.44,48.97,49.08,49.08, +293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.45,40.57,46.43,48.97,49.07,49.07, +294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.45,40.57,46.42,48.96,49.06,49.06, +295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.45,40.57,46.41,48.95,49.05,49.05, +296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.56,46.41,48.94,49.05,49.05, +297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.56,46.40,48.93,49.04,49.04, +298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.55,46.39,48.92,49.03,49.03, +299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.55,46.38,48.91,49.02,49.02, +300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.55,46.37,48.90,49.01,49.01, +301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.43,40.54,46.36,48.89,49.00,49.00, +302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.43,40.54,46.35,48.89,48.99,48.99, +303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.43,40.54,46.34,48.88,48.99,48.99, +304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.43,40.53,46.33,48.87,48.98,48.98, +305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.42,40.53,46.32,48.86,48.97,48.97, +306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.42,40.53,46.32,48.85,48.96,48.96, +307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.42,40.52,46.31,48.84,48.95,48.95, +308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.42,40.52,46.30,48.83,48.94,48.94, +309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.41,40.51,46.29,48.82,48.93,48.93, +310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.41,40.51,46.28,48.81,48.93,48.93, +311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.41,40.51,46.27,48.81,48.92,48.92, +312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.41,40.50,46.26,48.80,48.91,48.91, +313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.40,40.50,46.25,48.79,48.90,48.90, +314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.40,40.50,46.24,48.78,48.89,48.89, +315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.40,40.49,46.24,48.77,48.88,48.88, +316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.40,40.49,46.23,48.76,48.88,48.88, +317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.39,40.49,46.22,48.75,48.87,48.87, +318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.39,40.48,46.21,48.74,48.86,48.86, +319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.39,40.48,46.20,48.73,48.85,48.85, +320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.39,40.47,46.19,48.73,48.84,48.84, +321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.38,40.47,46.18,48.72,48.83,48.83, +322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.38,40.47,46.17,48.71,48.82,48.82, +323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.38,40.46,46.17,48.70,48.82,48.82, +324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.38,40.46,46.16,48.69,48.81,48.81, +325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.37,40.46,46.15,48.68,48.80,48.80, +326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.37,40.45,46.14,48.67,48.79,48.79, +327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.37,40.45,46.13,48.66,48.78,48.78, +328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.37,40.44,46.12,48.66,48.77,48.77, +329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.36,40.44,46.11,48.65,48.76,48.76, +330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.36,40.44,46.10,48.64,48.76,48.76, +331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.36,40.43,46.10,48.63,48.75,48.75, +332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.36,40.43,46.09,48.62,48.74,48.74, +333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.35,40.42,46.08,48.61,48.73,48.73, +334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.35,40.42,46.07,48.60,48.72,48.72, +335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.35,40.42,46.06,48.59,48.71,48.71, +336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.35,40.41,46.05,48.59,48.70,48.70, +337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.34,40.41,46.04,48.58,48.70,48.70, +338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.34,40.41,46.03,48.57,48.69,48.69, +339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.34,40.40,46.03,48.56,48.68,48.68, +340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.34,40.40,46.02,48.55,48.67,48.67, +341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.33,40.39,46.01,48.54,48.66,48.66, +342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.33,40.39,46.00,48.53,48.65,48.65, +343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.33,40.39,45.99,48.52,48.65,48.65, +344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.33,40.38,45.98,48.51,48.64,48.64, +345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,40.38,45.97,48.51,48.63,48.63, +346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,40.37,45.97,48.50,48.62,48.62, +347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,40.37,45.96,48.49,48.61,48.61, +348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,40.37,45.95,48.48,48.60,48.60, +349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.31,40.36,45.94,48.47,48.59,48.59, +350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.31,40.36,45.93,48.46,48.59,48.59, +351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.31,40.36,45.92,48.45,48.58,48.58, +352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.31,40.35,45.91,48.44,48.57,48.57, +353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.30,40.35,45.91,48.44,48.56,48.56, +354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.30,40.34,45.90,48.43,48.55,48.55, +355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.30,40.34,45.89,48.42,48.54,48.54, +356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.30,40.34,45.88,48.41,48.54,48.54, +357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.33,45.87,48.40,48.53,48.53, +358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.33,45.86,48.39,48.52,48.52, +359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.32,45.85,48.38,48.51,48.51, +360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.32,45.85,48.37,48.50,48.50, +361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.32,45.84,48.37,48.49,48.49, +362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.28,40.31,45.83,48.36,48.49,48.49, +363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.28,40.31,45.82,48.35,48.48,48.48, +364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.28,40.30,45.81,48.34,48.47,48.47, +365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.28,40.30,45.80,48.33,48.46,48.46, +366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.27,40.30,45.80,48.32,48.45,48.45, +367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.27,40.29,45.79,48.31,48.44,48.44, +368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.27,40.29,45.78,48.31,48.43,48.43, +369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.27,40.28,45.77,48.30,48.43,48.43, +370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.26,40.28,45.76,48.29,48.42,48.42, +371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.26,40.28,45.75,48.28,48.41,48.41, +372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.26,40.27,45.75,48.27,48.40,48.40, +373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.26,40.27,45.74,48.26,48.39,48.39, +374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.25,40.26,45.73,48.25,48.38,48.38, +375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.25,40.26,45.72,48.24,48.38,48.38, +376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.25,40.26,45.71,48.24,48.37,48.37, +377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.25,40.25,45.70,48.23,48.36,48.36, +378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.24,40.25,45.70,48.22,48.35,48.35, +379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.24,40.24,45.69,48.21,48.34,48.34, +380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.24,40.24,45.68,48.20,48.33,48.33, +381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.24,40.24,45.67,48.19,48.33,48.33, +382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.23,40.23,45.66,48.18,48.32,48.32, +383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.23,40.23,45.65,48.17,48.31,48.31, +384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.23,40.22,45.65,48.17,48.30,48.30, +385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.23,40.22,45.64,48.16,48.29,48.29, +386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.22,40.22,45.63,48.15,48.28,48.28, +387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.22,40.21,45.62,48.14,48.28,48.28, +388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.22,40.21,45.61,48.13,48.27,48.27, +389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.22,40.20,45.60,48.12,48.26,48.26, +390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.20,45.60,48.11,48.25,48.25, +391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.20,45.59,48.11,48.24,48.24, +392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.19,45.58,48.10,48.23,48.23, +393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.19,45.57,48.09,48.23,48.23, +394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.18,45.56,48.08,48.22,48.22, +395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,40.18,45.55,48.07,48.21,48.21, +396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,40.18,45.55,48.06,48.20,48.20, +397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,40.17,45.54,48.05,48.19,48.19, +398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,40.17,45.53,48.04,48.18,48.18, +399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,40.16,45.52,48.04,48.17,48.17, +400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,40.16,45.51,48.03,48.17,48.17, +401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,40.16,45.51,48.02,48.16,48.16, +402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,40.15,45.50,48.01,48.15,48.15, +403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,40.15,45.49,48.00,48.14,48.14, +404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,40.14,45.48,47.99,48.13,48.13, +405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,40.14,45.47,47.98,48.12,48.12, +406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,40.14,45.46,47.98,48.12,48.12, +407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.17,40.13,45.46,47.97,48.11,48.11, +408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.17,40.13,45.45,47.96,48.10,48.10, +409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.17,40.12,45.44,47.95,48.09,48.09, +410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.17,40.12,45.43,47.94,48.08,48.08, +411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.16,40.11,45.42,47.93,48.07,48.07, +412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.16,40.11,45.42,47.92,48.07,48.07, +413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.16,40.11,45.41,47.92,48.06,48.06, +414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.16,40.10,45.40,47.91,48.05,48.05, +415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.15,40.10,45.39,47.90,48.04,48.04, +416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.15,40.09,45.38,47.89,48.03,48.03, +417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.15,40.09,45.38,47.88,48.02,48.02, +418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.15,40.09,45.37,47.87,48.02,48.02, +419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.08,45.36,47.86,48.01,48.01, +420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.08,45.35,47.86,48.00,48.00, +421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.07,45.34,47.85,47.99,47.99, +422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.07,45.34,47.84,47.98,47.98, +423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.06,45.33,47.83,47.98,47.98, +424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.13,40.06,45.32,47.82,47.97,47.97, +425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.13,40.06,45.31,47.81,47.96,47.96, +426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.13,40.05,45.30,47.80,47.95,47.95, +427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.13,40.05,45.29,47.80,47.94,47.94, +428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.12,40.04,45.29,47.79,47.93,47.93, +429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.12,40.04,45.28,47.78,47.93,47.93, +430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.12,40.04,45.27,47.77,47.92,47.92, +431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.12,40.03,45.26,47.76,47.91,47.91, +432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.11,40.03,45.25,47.75,47.90,47.90, +433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.11,40.02,45.25,47.74,47.89,47.89, +434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.11,40.02,45.24,47.74,47.88,47.88, +435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.11,40.01,45.23,47.73,47.88,47.88, +436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.10,40.01,45.22,47.72,47.87,47.87, +437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.10,40.01,45.22,47.71,47.86,47.86, +438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.10,40.00,45.21,47.70,47.85,47.85, +439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.10,40.00,45.20,47.69,47.84,47.84, +440, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.09,39.99,45.19,47.68,47.83,47.83, +441, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.09,39.99,45.18,47.68,47.83,47.83, +442, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.09,39.99,45.18,47.67,47.82,47.82, +443, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.09,39.98,45.17,47.66,47.81,47.81, +444, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.08,39.98,45.16,47.65,47.80,47.80, +445, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.08,39.97,45.15,47.64,47.79,47.79, +446, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.08,39.97,45.14,47.63,47.78,47.78, +447, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.08,39.96,45.14,47.62,47.78,47.78, +448, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.96,45.13,47.62,47.77,47.77, +449, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.96,45.12,47.61,47.76,47.76, +450, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.95,45.11,47.60,47.75,47.75, +451, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.95,45.10,47.59,47.74,47.74, +452, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.94,45.10,47.58,47.74,47.74, +453, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.06,39.94,45.09,47.57,47.73,47.73, +454, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.06,39.94,45.08,47.57,47.72,47.72, +455, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.06,39.93,45.07,47.56,47.71,47.71, +456, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.06,39.93,45.06,47.55,47.70,47.70, +457, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,39.92,45.06,47.54,47.69,47.69, +458, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,39.92,45.05,47.53,47.69,47.69, +459, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,39.91,45.04,47.52,47.68,47.68, +460, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,39.91,45.03,47.51,47.67,47.67, +461, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,39.91,45.03,47.51,47.66,47.66, +462, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,39.90,45.02,47.50,47.65,47.65, +463, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,39.90,45.01,47.49,47.64,47.64, +464, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,39.89,45.00,47.48,47.64,47.64, +465, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,39.89,44.99,47.47,47.63,47.63, +466, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,39.88,44.99,47.46,47.62,47.62, +467, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,39.88,44.98,47.46,47.61,47.61, +468, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,39.88,44.97,47.45,47.60,47.60, +469, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.02,39.87,44.96,47.44,47.60,47.60, +470, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.02,39.87,44.96,47.43,47.59,47.59, +471, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.02,39.86,44.95,47.42,47.58,47.58, +472, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.02,39.86,44.94,47.41,47.57,47.57, +473, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.01,39.85,44.93,47.40,47.56,47.56, +474, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.01,39.85,44.92,47.40,47.55,47.55, +475, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.01,39.85,44.92,47.39,47.55,47.55, +476, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.01,39.84,44.91,47.38,47.54,47.54, +477, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.00,39.84,44.90,47.37,47.53,47.53, +478, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.00,39.83,44.89,47.36,47.52,47.52, +479, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.00,39.83,44.89,47.35,47.51,47.51, +480, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.00,39.83,44.88,47.35,47.51,47.51, +481, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.66,37.73,44.06,47.08,47.50,47.50,47.51 +482, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.05,47.07,47.49,47.49, +483, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.04,47.07,47.48,47.48, +484, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.03,47.06,47.47,47.47, +485, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.02,47.05,47.46,47.46, +486, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.01,47.04,47.45,47.45, +487, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.64,37.73,44.00,47.03,47.45,47.45, +488, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.64,37.73,43.99,47.02,47.44,47.44, +489, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.64,37.73,43.98,47.02,47.43,47.43, +490, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.64,37.73,43.97,47.01,47.42,47.42, +491, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.63,37.73,43.97,47.00,47.41,47.41, +492, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.63,37.73,43.96,46.99,47.40,47.40, +493, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.63,37.73,43.95,46.98,47.40,47.40, +494, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.63,37.72,43.94,46.98,47.39,47.39, +495, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.62,37.72,43.93,46.97,47.38,47.38, +496, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.36,35.82,42.84,46.60,47.35,47.37,47.38 +497, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.92,34.47,41.51,46.14,47.30,47.36,47.37 +498, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.62,35.62,41.50,46.13,47.29,47.35, +499, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.04,37.04,41.50,46.12,47.28,47.34, +500, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.46,38.46,41.49,46.11,47.27,47.33, +501, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.84,39.84,41.56,46.10,47.27,47.32, +502, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.98,40.98,42.13,46.09,47.26,47.31, +503, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.11,42.11,42.69,46.09,47.25,47.30, +504, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.25,43.25,43.26,46.08,47.24,47.29, +505, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.20,44.20,44.20,46.07,47.23,47.28, +506, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.14,45.14,45.14,46.06,47.23,47.28, +507, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.99,45.99,45.99,46.33,47.22,47.27, +508, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.78,46.78,46.78,46.78,47.21,47.26, +509, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.40,47.40,47.40,47.40,47.40,47.40, +510, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.87,47.87,47.87,47.87,47.87,47.87, +511, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.33,48.33,48.33,48.33,48.33,48.33, +512, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.80,48.80,48.80,48.80,48.80,48.80, +513, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.27,49.27,49.27,49.27,49.27,49.27, +514, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.73,49.73,49.73,49.73,49.73,49.73, +515, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.20,50.20,50.20,50.20,50.20,50.20, +516, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.67,50.67,50.67,50.67,50.67,50.67, +517, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.13,51.13,51.13,51.13,51.13,51.13, +518, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.60,51.60,51.60,51.60,51.60,51.60, +519, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,11.78,11.78,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +520, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +521, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +522, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +523, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +524, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +525, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +526, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +527, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +528, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +529, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +530, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +531, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +532, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +533, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +534, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +535, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +536, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +537, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +538, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +539, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +540, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +541, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.28,50.45,51.49,51.49,51.49,51.49,51.49 +542, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.48,49.25,51.39,51.48,51.48,51.48,51.49 +543, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.47,49.24,51.38,51.47,51.47,51.47, +544, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.46,49.24,51.37,51.46,51.46,51.46, +545, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.46,49.23,51.36,51.45,51.45,51.45, +546, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.45,49.22,51.35,51.44,51.44,51.44, +547, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.44,49.22,51.34,51.43,51.43,51.43, +548, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.43,49.21,51.33,51.43,51.43,51.43, +549, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.43,49.21,51.32,51.42,51.42,51.42, +550, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.42,49.20,51.31,51.41,51.41,51.41, +551, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.41,49.20,51.30,51.40,51.40,51.40, +552, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.41,49.19,51.29,51.39,51.39,51.39, +553, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.40,49.19,51.28,51.38,51.38,51.38, +554, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.39,49.18,51.27,51.37,51.37,51.37, +555, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.38,49.17,51.25,51.36,51.36,51.36, +556, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.50,47.27,50.89,51.36,51.36,51.36,51.36 +557, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.49,47.26,50.88,51.35,51.35,51.35, +558, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.49,47.26,50.87,51.34,51.34,51.34, +559, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.25,50.86,51.33,51.33,51.33, +560, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.25,50.85,51.32,51.32,51.32, +561, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.24,50.83,51.31,51.31,51.31, +562, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.47,47.24,50.82,51.30,51.30,51.30, +563, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.47,47.23,50.81,51.29,51.29,51.29, +564, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.46,47.23,50.80,51.28,51.28,51.28, +565, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.46,47.22,50.79,51.28,51.28,51.28, +566, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.45,47.22,50.78,51.27,51.27,51.27, +567, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.45,47.21,50.77,51.26,51.26,51.26, +568, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.45,47.21,50.76,51.25,51.25,51.25, +569, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.44,47.20,50.75,51.24,51.24,51.24, +570, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.44,47.19,50.74,51.23,51.23,51.23, +571, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.43,47.19,50.73,51.22,51.22,51.22, +572, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.43,47.18,50.71,51.21,51.21,51.21, +573, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.43,47.18,50.70,51.21,51.21,51.21, +574, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.42,47.17,50.69,51.20,51.20,51.20, +575, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.42,47.17,50.68,51.19,51.19,51.19, +576, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.41,47.16,50.67,51.18,51.18,51.18, +577, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.41,47.15,50.66,51.17,51.17,51.17, +578, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.40,47.15,50.65,51.16,51.16,51.16, +579, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.40,47.14,50.64,51.15,51.15,51.15, +580, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.40,47.14,50.63,51.14,51.14,51.14, +581, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.39,47.13,50.62,51.14,51.14,51.14, +582, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.39,47.13,50.61,51.13,51.13,51.13, +583, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.38,47.12,50.60,51.12,51.12,51.12, +584, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.38,47.11,50.59,51.11,51.11,51.11, +585, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.38,47.11,50.58,51.10,51.10,51.10, +586, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.37,47.10,50.57,51.09,51.09,51.09, +587, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.37,47.10,50.55,51.08,51.08,51.08, +588, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.36,47.09,50.54,51.07,51.07,51.07, +589, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.36,47.08,50.53,51.06,51.06,51.06, +590, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.36,47.08,50.52,51.06,51.06,51.06, +591, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.35,47.07,50.51,51.05,51.05,51.05, +592, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.35,47.07,50.50,51.04,51.04,51.04, +593, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.34,47.06,50.49,51.03,51.03,51.03, +594, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.34,47.05,50.48,51.02,51.02,51.02, +595, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.34,47.05,50.47,51.01,51.01,51.01, +596, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.33,47.04,50.46,51.00,51.00,51.00, +597, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.33,47.04,50.45,50.99,50.99,50.99, +598, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.32,47.03,50.44,50.99,50.99,50.99, +599, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.32,47.02,50.43,50.98,50.98,50.98, +600, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.32,47.02,50.42,50.97,50.97,50.97, +601, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.31,47.01,50.41,50.96,50.96,50.96, +602, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.31,47.00,50.40,50.95,50.95,50.95, +603, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.31,47.00,50.39,50.94,50.94,50.94, +604, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.30,46.99,50.38,50.93,50.93,50.93, +605, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.30,46.99,50.37,50.92,50.92,50.92, +606, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.29,46.98,50.36,50.92,50.92,50.92, +607, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.29,46.97,50.35,50.91,50.91,50.91, +608, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.29,46.97,50.34,50.90,50.90,50.90, +609, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.28,46.96,50.33,50.89,50.89,50.89, +610, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.28,46.95,50.32,50.88,50.88,50.88, +611, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.28,46.95,50.31,50.87,50.87,50.87, +612, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.27,46.94,50.30,50.86,50.86,50.86, +613, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.27,46.93,50.29,50.85,50.85,50.85, +614, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.26,46.93,50.28,50.85,50.85,50.85, +615, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.26,46.92,50.27,50.84,50.84,50.84, +616, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.26,46.91,50.26,50.83,50.83,50.83, +617, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.25,46.91,50.25,50.82,50.82,50.82, +618, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.25,46.90,50.24,50.81,50.81,50.81, +619, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.25,46.89,50.23,50.80,50.80,50.80, +620, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.24,46.89,50.22,50.79,50.79,50.79, +621, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.24,46.88,50.21,50.79,50.79,50.79, +622, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.23,46.87,50.20,50.78,50.78,50.78, +623, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.23,46.87,50.19,50.77,50.77,50.77, +624, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.23,46.86,50.18,50.76,50.76,50.76, +625, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.22,46.85,50.17,50.75,50.75,50.75, +626, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.22,46.85,50.16,50.74,50.74,50.74, +627, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.22,46.84,50.15,50.73,50.73,50.73, +628, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.21,46.83,50.14,50.72,50.72,50.72, +629, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.21,46.83,50.13,50.72,50.72,50.72, +630, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.21,46.82,50.12,50.71,50.71,50.71, +631, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.20,46.81,50.11,50.70,50.70,50.70, +632, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.20,46.81,50.10,50.69,50.69,50.69, +633, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.19,46.80,50.09,50.68,50.68,50.68, +634, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.19,46.79,50.08,50.67,50.67,50.67, +635, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.19,46.79,50.07,50.66,50.66,50.66, +636, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.18,46.78,50.06,50.66,50.66,50.66, +637, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.18,46.77,50.05,50.65,50.65,50.65, +638, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.18,46.77,50.04,50.64,50.64,50.64, +639, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.17,46.76,50.03,50.63,50.63,50.63, +640, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.17,46.75,50.02,50.62,50.62,50.62, +641, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.17,46.74,50.01,50.61,50.61,50.61, +642, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.16,46.74,50.00,50.60,50.60,50.60, +643, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.16,46.73,49.99,50.59,50.59,50.59, +644, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.16,46.72,49.98,50.59,50.59,50.59, +645, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.15,46.72,49.97,50.58,50.58,50.58, +646, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.15,46.71,49.96,50.57,50.57,50.57, +647, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.14,46.70,49.95,50.56,50.56,50.56, +648, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.14,46.70,49.94,50.55,50.55,50.55, +649, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.14,46.69,49.93,50.54,50.54,50.54, +650, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.13,46.68,49.92,50.53,50.53,50.53, +651, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.13,46.67,49.91,50.53,50.53,50.53, +652, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.13,46.67,49.90,50.52,50.52,50.52, +653, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.12,46.66,49.89,50.51,50.51,50.51, +654, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.12,46.65,49.88,50.50,50.50,50.50, +655, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.12,46.65,49.87,50.49,50.49,50.49, +656, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.11,46.64,49.87,50.48,50.48,50.48, +657, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.11,46.63,49.86,50.47,50.47,50.47, +658, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.11,46.62,49.85,50.46,50.46,50.46, +659, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.10,46.62,49.84,50.46,50.46,50.46, +660, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.10,46.61,49.83,50.45,50.45,50.45, +661, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.10,46.60,49.82,50.44,50.44,50.44, +662, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.09,46.60,49.81,50.43,50.43,50.43, +663, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.09,46.59,49.80,50.42,50.42,50.42, +664, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.09,46.58,49.79,50.41,50.41,50.41, +665, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.08,46.57,49.78,50.40,50.40,50.40, +666, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.08,46.57,49.77,50.40,50.40,50.40, +667, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.08,46.56,49.76,50.39,50.39,50.39, +668, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.07,46.55,49.75,50.38,50.38,50.38, +669, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.07,46.54,49.74,50.37,50.37,50.37, +670, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.06,46.54,49.73,50.36,50.36,50.36, +671, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.06,46.53,49.72,50.35,50.35,50.35, +672, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.06,46.52,49.71,50.34,50.34,50.34, +673, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.05,46.52,49.70,50.34,50.34,50.34, +674, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.05,46.51,49.69,50.33,50.33,50.33, +675, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.05,46.50,49.69,50.32,50.32,50.32, +676, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.04,46.49,49.68,50.31,50.31,50.31, +677, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.04,46.49,49.67,50.30,50.30,50.30, +678, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.04,46.48,49.66,50.29,50.29,50.29, +679, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.03,46.47,49.65,50.28,50.28,50.28, +680, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.03,46.46,49.64,50.28,50.28,50.28, +681, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.03,46.46,49.63,50.27,50.27,50.27, +682, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.02,46.45,49.62,50.26,50.26,50.26, +683, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.02,46.44,49.61,50.25,50.25,50.25, +684, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.02,46.43,49.60,50.24,50.24,50.24, +685, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.01,46.43,49.59,50.23,50.23,50.23, +686, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.01,46.42,49.58,50.22,50.22,50.22, +687, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.01,46.41,49.57,50.22,50.22,50.22, +688, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.00,46.41,49.56,50.21,50.21,50.21, +689, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.00,46.40,49.56,50.20,50.20,50.20, +690, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.00,46.39,49.55,50.19,50.19,50.19, +691, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.99,46.38,49.54,50.18,50.18,50.18, +692, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.99,46.38,49.53,50.17,50.17,50.17, +693, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.99,46.37,49.52,50.16,50.16,50.16, +694, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.98,46.36,49.51,50.16,50.16,50.16, +695, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.98,46.35,49.50,50.15,50.15,50.15, +696, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.98,46.35,49.49,50.14,50.14,50.14, +697, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.97,46.34,49.48,50.13,50.13,50.13, +698, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.97,46.33,49.47,50.12,50.12,50.12, +699, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.97,46.32,49.46,50.11,50.11,50.11, +700, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.96,46.32,49.45,50.10,50.10,50.10, +701, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.96,46.31,49.45,50.10,50.10,50.10, +702, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.96,46.30,49.44,50.09,50.09,50.09, +703, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.95,46.29,49.43,50.08,50.08,50.08, +704, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.95,46.29,49.42,50.07,50.07,50.07, +705, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.95,46.28,49.41,50.06,50.06,50.06, +706, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.94,46.27,49.40,50.05,50.05,50.05, +707, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.94,46.26,49.39,50.04,50.04,50.04, +708, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.94,46.26,49.38,50.04,50.04,50.04, +709, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.93,46.25,49.37,50.03,50.03,50.03, +710, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.93,46.24,49.36,50.02,50.02,50.02, +711, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.93,46.23,49.35,50.01,50.01,50.01, +712, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.92,46.23,49.35,50.00,50.00,50.00, +713, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.92,46.22,49.34,49.99,49.99,49.99, +714, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.92,46.21,49.33,49.99,49.99,49.99, +715, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.91,46.20,49.32,49.98,49.98,49.98, +716, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.91,46.20,49.31,49.97,49.97,49.97, +717, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.91,46.19,49.30,49.96,49.96,49.96, +718, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.90,46.18,49.29,49.95,49.95,49.95, +719, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.90,46.17,49.28,49.94,49.94,49.94, +720, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.90,46.16,49.27,49.93,49.93,49.93, +721, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.89,46.16,49.26,49.93,49.93,49.93, +722, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.89,46.15,49.26,49.92,49.92,49.92, +723, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.89,46.14,49.25,49.91,49.91,49.91, +724, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.88,46.13,49.24,49.90,49.90,49.90, +725, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.88,46.13,49.23,49.89,49.89,49.89, +726, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.88,46.12,49.22,49.88,49.88,49.88, +727, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.87,46.11,49.21,49.88,49.88,49.88, +728, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.87,46.10,49.20,49.87,49.87,49.87, +729, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.87,46.10,49.19,49.86,49.86,49.86, +730, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.86,46.09,49.18,49.85,49.85,49.85, +731, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.86,46.08,49.17,49.84,49.84,49.84, +732, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.86,46.07,49.17,49.83,49.83,49.83, +733, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.85,46.07,49.16,49.82,49.82,49.82, +734, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.85,46.06,49.15,49.82,49.82,49.82, +735, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.85,46.05,49.14,49.81,49.81,49.81, +736, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.84,46.04,49.13,49.80,49.80,49.80, +737, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.84,46.04,49.12,49.79,49.79,49.79, +738, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.84,46.03,49.11,49.78,49.78,49.78, +739, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.83,46.02,49.10,49.77,49.77,49.77, +740, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.83,46.01,49.09,49.77,49.77,49.77, +741, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.83,46.00,49.09,49.76,49.76,49.76, +742, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.82,46.00,49.08,49.75,49.75,49.75, +743, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.82,45.99,49.07,49.74,49.74,49.74, +744, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.82,45.98,49.06,49.73,49.73,49.73, +745, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.81,45.97,49.05,49.72,49.72,49.72, +746, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.81,45.97,49.04,49.71,49.71,49.71, +747, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.81,45.96,49.03,49.71,49.71,49.71, +748, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.80,45.95,49.02,49.70,49.70,49.70, +749, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.80,45.94,49.02,49.69,49.69,49.69, +750, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.80,45.94,49.01,49.68,49.68,49.68, +751, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.79,45.93,49.00,49.67,49.67,49.67, +752, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.79,45.92,48.99,49.66,49.66,49.66, +753, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.79,45.91,48.98,49.66,49.66,49.66, +754, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.79,45.91,48.97,49.65,49.65,49.65, +755, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.78,45.90,48.96,49.64,49.64,49.64, +756, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.78,45.89,48.95,49.63,49.63,49.63, +757, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.78,45.88,48.95,49.62,49.62,49.62, +758, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.77,45.87,48.94,49.61,49.61,49.61, +759, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.77,45.87,48.93,49.60,49.60,49.60, +760, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.77,45.86,48.92,49.60,49.60,49.60, +761, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.76,45.85,48.91,49.59,49.59,49.59, +762, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.76,45.84,48.90,49.58,49.58,49.58, +763, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.76,45.84,48.89,49.57,49.57,49.57, +764, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.75,45.83,48.88,49.56,49.56,49.56, +765, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.75,45.82,48.88,49.55,49.55,49.55, +766, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.75,45.81,48.87,49.55,49.55,49.55, +767, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.74,45.81,48.86,49.54,49.54,49.54, +768, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.74,45.80,48.85,49.53,49.53,49.53, +769, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.74,45.79,48.84,49.52,49.52,49.52, +770, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.73,45.78,48.83,49.51,49.51,49.51, +771, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.73,45.77,48.82,49.50,49.50,49.50, +772, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.73,45.77,48.81,49.50,49.50,49.50, +773, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.72,45.76,48.81,49.49,49.49,49.49, +774, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.72,45.75,48.80,49.48,49.48,49.48, +775, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.72,45.74,48.79,49.47,49.47,49.47, +776, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.71,45.74,48.78,49.46,49.46,49.46, +777, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.71,45.73,48.77,49.45,49.45,49.45, +778, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.71,45.72,48.76,49.45,49.45,49.45, +779, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.70,45.71,48.75,49.44,49.44,49.44, +780, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.70,45.71,48.75,49.43,49.43,49.43, +781, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.70,45.70,48.74,49.42,49.42,49.42, +782, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.69,45.69,48.73,49.41,49.41,49.41, +783, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.69,45.68,48.72,49.40,49.40,49.40, +784, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.69,45.67,48.71,49.40,49.40,49.40, +785, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.68,45.67,48.70,49.39,49.39,49.39, +786, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.68,45.66,48.69,49.38,49.38,49.38, +787, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.68,45.65,48.69,49.37,49.37,49.37, +788, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.67,45.64,48.68,49.36,49.36,49.36, +789, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.67,45.64,48.67,49.35,49.35,49.35, +790, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.67,45.63,48.66,49.35,49.35,49.35, +791, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.66,45.62,48.65,49.34,49.34,49.34, +792, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.66,45.61,48.64,49.33,49.33,49.33, +793, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.66,45.61,48.63,49.32,49.32,49.32, +794, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.65,45.60,48.63,49.31,49.31,49.31, +795, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.65,45.59,48.62,49.30,49.30,49.30, +796, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.65,45.58,48.61,49.30,49.30,49.30, +797, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.64,45.57,48.60,49.29,49.29,49.29, +798, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.64,45.57,48.59,49.28,49.28,49.28, +799, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.64,45.56,48.58,49.27,49.27,49.27, +800, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.63,45.55,48.57,49.26,49.26,49.26, +801, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.63,45.54,48.57,49.25,49.25,49.25, +802, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.63,45.54,48.56,49.25,49.25,49.25, +803, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.62,45.53,48.55,49.24,49.24,49.24, +804, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.62,45.52,48.54,49.23,49.23,49.23, +805, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.62,45.51,48.53,49.22,49.22,49.22, +806, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.61,45.51,48.52,49.21,49.21,49.21, +807, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.61,45.50,48.51,49.20,49.20,49.20, +808, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.61,45.49,48.51,49.20,49.20,49.20, +809, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.60,45.48,48.50,49.19,49.19,49.19, +810, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.60,45.47,48.49,49.18,49.18,49.18, +811, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.60,45.47,48.48,49.17,49.17,49.17, +812, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.59,45.46,48.47,49.16,49.16,49.16, +813, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.59,45.45,48.46,49.15,49.15,49.15, +814, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.59,45.44,48.46,49.15,49.15,49.15, +815, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.58,45.44,48.45,49.14,49.14,49.14, +816, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.58,45.43,48.44,49.13,49.13,49.13, +817, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.58,45.42,48.43,49.12,49.12,49.12, +818, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.57,45.41,48.42,49.11,49.11,49.11, +819, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.57,45.41,48.41,49.10,49.10,49.10, +820, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.57,45.40,48.40,49.10,49.10,49.10, +821, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.56,45.39,48.40,49.09,49.09,49.09, +822, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.56,45.38,48.39,49.08,49.08,49.08, +823, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.56,45.37,48.38,49.07,49.07,49.07, +824, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.55,45.37,48.37,49.06,49.06,49.06, +825, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.55,45.36,48.36,49.05,49.05,49.05, +826, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.55,45.35,48.35,49.05,49.05,49.05, +827, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.54,45.34,48.35,49.04,49.04,49.04, +828, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.54,45.34,48.34,49.03,49.03,49.03, +829, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.54,45.33,48.33,49.02,49.02,49.02, +830, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.53,45.32,48.32,49.01,49.01,49.01, +831, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.53,45.31,48.31,49.01,49.01,49.01, +832, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.53,45.31,48.30,49.00,49.00,49.00, +833, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.52,45.30,48.30,48.99,48.99,48.99, +834, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.52,45.29,48.29,48.98,48.98,48.98, +835, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.52,45.28,48.28,48.97,48.97,48.97, +836, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.51,45.28,48.27,48.96,48.96,48.96, +837, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.51,45.27,48.26,48.96,48.96,48.96, +838, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.51,45.26,48.25,48.95,48.95,48.95, +839, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.50,45.25,48.25,48.94,48.94,48.94, +840, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.50,45.24,48.24,48.93,48.93,48.93, +841, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.50,45.24,48.23,48.92,48.92,48.92, +842, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.49,45.23,48.22,48.91,48.91,48.91, +843, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.49,45.22,48.21,48.91,48.91,48.91, +844, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.49,45.21,48.20,48.90,48.90,48.90, +845, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.48,45.21,48.20,48.89,48.89,48.89, +846, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.48,45.20,48.19,48.88,48.88,48.88, +847, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.48,45.19,48.18,48.87,48.87,48.87, +848, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.47,45.18,48.17,48.87,48.87,48.87, +849, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.47,45.18,48.16,48.86,48.86,48.86, +850, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.47,45.17,48.15,48.85,48.85,48.85, +851, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.46,45.16,48.15,48.84,48.84,48.84, +852, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.46,45.15,48.14,48.83,48.83,48.83, +853, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.46,45.15,48.13,48.82,48.82,48.82, +854, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.45,45.14,48.12,48.82,48.82,48.82, +855, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.45,45.13,48.11,48.81,48.81,48.81, +856, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.45,45.12,48.10,48.80,48.80,48.80, +857, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.44,45.12,48.10,48.79,48.79,48.79, +858, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.44,45.11,48.09,48.78,48.78,48.78, +859, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.44,45.10,48.08,48.77,48.77,48.77, +860, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.43,45.09,48.07,48.77,48.77,48.77, +861, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.43,45.08,48.06,48.76,48.76,48.76, +862, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.43,45.08,48.05,48.75,48.75,48.75, +863, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.42,45.07,48.05,48.74,48.74,48.74, +864, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.42,45.06,48.04,48.73,48.73,48.73, +865, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.42,45.05,48.03,48.73,48.73,48.73, +866, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.41,45.05,48.02,48.72,48.72,48.72, +867, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.41,45.04,48.01,48.71,48.71,48.71, +868, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.41,45.03,48.01,48.70,48.70,48.70, +869, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.40,45.02,48.00,48.69,48.69,48.69, +870, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.40,45.02,47.99,48.68,48.68,48.68, +871, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.40,45.01,47.98,48.68,48.68,48.68, +872, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.39,45.00,47.97,48.67,48.67,48.67, +873, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.39,44.99,47.96,48.66,48.66,48.66, +874, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.39,44.99,47.96,48.65,48.65,48.65, +875, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.38,44.98,47.95,48.64,48.64,48.64, +876, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.38,44.97,47.94,48.64,48.64,48.64, +877, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.38,44.96,47.93,48.63,48.63,48.63, +878, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.37,44.96,47.92,48.62,48.62,48.62, +879, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.37,44.95,47.92,48.61,48.61,48.61, +880, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.37,44.94,47.91,48.60,48.60,48.60, +881, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.36,44.93,47.90,48.60,48.60,48.60, +882, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.36,44.93,47.89,48.59,48.59,48.59, +883, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.36,44.92,47.88,48.58,48.58,48.58, +884, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.35,44.91,47.87,48.57,48.57,48.57, +885, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.35,44.90,47.87,48.56,48.56,48.56, +886, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.35,44.90,47.86,48.55,48.55,48.55, +887, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.34,44.89,47.85,48.55,48.55,48.55, +888, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.34,44.88,47.84,48.54,48.54,48.54, +889, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.34,44.87,47.83,48.53,48.53,48.53, +890, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.33,44.87,47.83,48.52,48.52,48.52, +891, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.33,44.86,47.82,48.51,48.51,48.51, +892, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.33,44.85,47.81,48.51,48.51,48.51, +893, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.32,44.84,47.80,48.50,48.50,48.50, +894, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.32,44.84,47.79,48.49,48.49,48.49, +895, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.32,44.83,47.78,48.48,48.48,48.48, +896, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.31,44.82,47.78,48.47,48.47,48.47, +897, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.31,44.81,47.77,48.47,48.47,48.47, +898, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.31,44.81,47.76,48.46,48.46,48.46, +899, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.30,44.80,47.75,48.45,48.45,48.45, +900, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.30,44.79,47.74,48.44,48.44,48.44, +901, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.30,44.78,47.74,48.43,48.43,48.43, +902, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.29,44.78,47.73,48.42,48.42,48.42, +903, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.29,44.77,47.72,48.42,48.42,48.42, +904, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.29,44.76,47.71,48.41,48.41,48.41, +905, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.28,44.75,47.70,48.40,48.40,48.40, +906, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.28,44.75,47.69,48.39,48.39,48.39, +907, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.28,44.74,47.69,48.38,48.38,48.38, +908, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.27,44.73,47.68,48.38,48.38,48.38, +909, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.27,44.72,47.67,48.37,48.37,48.37, +910, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.27,44.72,47.66,48.36,48.36,48.36, +911, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.26,44.71,47.65,48.35,48.35,48.35, +912, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.26,44.70,47.65,48.34,48.34,48.34, +913, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.26,44.69,47.64,48.34,48.34,48.34, +914, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.25,44.69,47.63,48.33,48.33,48.33, +915, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.25,44.68,47.62,48.32,48.32,48.32, +916, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.25,44.67,47.61,48.31,48.31,48.31, +917, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.24,44.66,47.61,48.30,48.30,48.30, +918, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.24,44.66,47.60,48.30,48.30,48.30, +919, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.23,44.65,47.59,48.29,48.29,48.29, +920, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.23,44.64,47.58,48.28,48.28,48.28, +921, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.23,44.63,47.57,48.27,48.27,48.27, +922, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.22,44.63,47.57,48.26,48.26,48.26, +923, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.22,44.62,47.56,48.25,48.25,48.25, +924, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.22,44.61,47.55,48.25,48.25,48.25, +925, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.21,44.60,47.54,48.24,48.24,48.24, +926, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.21,44.60,47.53,48.23,48.23,48.23, +927, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.21,44.59,47.53,48.22,48.22,48.22, +928, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.20,44.58,47.52,48.21,48.21,48.21, +929, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.20,44.57,47.51,48.21,48.21,48.21, +930, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.20,44.57,47.50,48.20,48.20,48.20, +931, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.19,44.56,47.49,48.19,48.19,48.19, +932, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.19,44.55,47.49,48.18,48.18,48.18, +933, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.19,44.54,47.48,48.17,48.17,48.17, +934, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.18,44.54,47.47,48.17,48.17,48.17, +935, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.18,44.53,47.46,48.16,48.16,48.16, +936, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.18,44.52,47.45,48.15,48.15,48.15, +937, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.17,44.52,47.45,48.14,48.14,48.14, +938, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.17,44.51,47.44,48.13,48.13,48.13, +939, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.17,44.50,47.43,48.13,48.13,48.13, +940, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.16,44.49,47.42,48.12,48.12,48.12, +941, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.16,44.49,47.41,48.11,48.11,48.11, +942, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.16,44.48,47.41,48.10,48.10,48.10, +943, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.15,44.47,47.40,48.09,48.09,48.09, +944, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.15,44.46,47.39,48.09,48.09,48.09, +945, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.15,44.46,47.38,48.08,48.08,48.08, +946, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.14,44.45,47.37,48.07,48.07,48.07, +947, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.14,44.44,47.37,48.06,48.06,48.06, +948, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.14,44.43,47.36,48.05,48.05,48.05, +949, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.13,44.43,47.35,48.05,48.05,48.05, +950, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.13,44.42,47.34,48.04,48.04,48.04, +951, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.12,44.41,47.33,48.03,48.03,48.03, +952, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.12,44.40,47.33,48.02,48.02,48.02, +953, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.12,44.40,47.32,48.01,48.01,48.01, +954, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.11,44.39,47.31,48.01,48.01,48.01, +955, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.11,44.38,47.30,48.00,48.00,48.00, +956, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.11,44.38,47.29,47.99,47.99,47.99, +957, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.10,44.37,47.29,47.98,47.98,47.98, +958, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.10,44.36,47.28,47.97,47.97,47.97, +959, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.10,44.35,47.27,47.97,47.97,47.97, +960, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.09,44.35,47.26,47.96,47.96,47.96, +961, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.09,44.34,47.25,47.95,47.95,47.95, +962, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.09,44.33,47.25,47.94,47.94,47.94, +963, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.08,44.32,47.24,47.93,47.93,47.93, +964, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.08,44.32,47.23,47.93,47.93,47.93, +965, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.08,44.31,47.22,47.92,47.92,47.92, +966, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.07,44.30,47.21,47.91,47.91,47.91, +967, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.07,44.30,47.21,47.90,47.90,47.90, +968, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.07,44.29,47.20,47.89,47.89,47.89, +969, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.06,44.28,47.19,47.89,47.89,47.89, +970, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.06,44.27,47.18,47.88,47.88,47.88, +971, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.06,44.27,47.17,47.87,47.87,47.87, +972, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.05,44.26,47.17,47.86,47.86,47.86, +973, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.05,44.25,47.16,47.85,47.85,47.85, +974, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.04,44.24,47.15,47.85,47.85,47.85, +975, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.04,44.24,47.14,47.84,47.84,47.84, +976, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.04,44.23,47.13,47.83,47.83,47.83, +977, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.03,44.22,47.13,47.82,47.82,47.82, +978, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.03,44.22,47.12,47.82,47.82,47.82, +979, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.03,44.21,47.11,47.81,47.81,47.81, +980, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.02,44.20,47.10,47.80,47.80,47.80, +981, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.02,44.19,47.10,47.79,47.79,47.79, +982, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.02,44.19,47.09,47.78,47.78,47.78, +983, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.01,44.18,47.08,47.78,47.78,47.78, +984, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.01,44.17,47.07,47.77,47.77,47.77, +985, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.01,44.16,47.06,47.76,47.76,47.76, +986, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.00,44.16,47.06,47.75,47.75,47.75, +987, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.00,44.15,47.05,47.74,47.74,47.74, +988, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.00,44.14,47.04,47.74,47.74,47.74, +989, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.99,44.14,47.03,47.73,47.73,47.73, +990, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.99,44.13,47.02,47.72,47.72,47.72, +991, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.98,44.12,47.02,47.71,47.71,47.71, +992, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.98,44.11,47.01,47.70,47.70,47.70, +993, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.98,44.11,47.00,47.70,47.70,47.70, +994, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.97,44.10,46.99,47.69,47.69,47.69, +995, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.97,44.09,46.99,47.68,47.68,47.68, +996, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.97,44.09,46.98,47.67,47.67,47.67, +997, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.96,44.08,46.97,47.66,47.66,47.66, +998, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.96,44.07,46.96,47.66,47.66,47.66, +999, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.96,44.06,46.95,47.65,47.65,47.65, +1000, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.95,44.06,46.95,47.64,47.64,47.64, +1001, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.95,44.05,46.94,47.63,47.63,47.63, +1002, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.95,44.04,46.93,47.63,47.63,47.63, +1003, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.94,44.04,46.92,47.62,47.62,47.62, +1004, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.94,44.03,46.91,47.61,47.61,47.61, +1005, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.94,44.02,46.91,47.60,47.60,47.60, +1006, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.93,44.01,46.90,47.59,47.59,47.59, +1007, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.93,44.01,46.89,47.59,47.59,47.59, +1008, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.92,44.00,46.88,47.58,47.58,47.58, +1009, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.92,43.99,46.88,47.57,47.57,47.57, +1010, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.92,43.98,46.87,47.56,47.56,47.56, +1011, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.91,43.98,46.86,47.55,47.55,47.55, +1012, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.91,43.97,46.85,47.55,47.55,47.55, +1013, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.91,43.96,46.84,47.54,47.54,47.54, +1014, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.90,43.96,46.84,47.53,47.53,47.53, +1015, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.90,43.95,46.83,47.52,47.52,47.52, +1016, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.90,43.94,46.82,47.52,47.52,47.52, +1017, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.89,43.94,46.81,47.51,47.51,47.51, +1018, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.89,43.93,46.81,47.50,47.50,47.50, +1019, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.89,43.92,46.80,47.49,47.49,47.49, +1020, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.88,43.91,46.79,47.48,47.48,47.48, +1021, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.88,43.91,46.78,47.48,47.48,47.48, +1022, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.88,43.90,46.77,47.47,47.47,47.47, +1023, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.87,43.89,46.77,47.46,47.46,47.46, +1024, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.87,43.89,46.76,47.45,47.45,47.45, +1025, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.86,43.88,46.75,47.44,47.44,47.44, +1026, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.86,43.87,46.74,47.44,47.44,47.44, +1027, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.86,43.86,46.74,47.43,47.43,47.43, +1028, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.85,43.86,46.73,47.42,47.42,47.42, +1029, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.85,43.85,46.72,47.41,47.41,47.41, +1030, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.85,43.84,46.71,47.41,47.41,47.41, +1031, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.84,43.84,46.70,47.40,47.40,47.40, +1032, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.84,43.83,46.70,47.39,47.39,47.39, +1033, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.84,43.82,46.69,47.38,47.38,47.38, +1034, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.83,43.81,46.68,47.37,47.37,47.37, +1035, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.83,43.81,46.67,47.37,47.37,47.37, +1036, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.83,43.80,46.67,47.36,47.36,47.36, +1037, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.82,43.79,46.66,47.35,47.35,47.35, +1038, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.82,43.79,46.65,47.34,47.34,47.34, +1039, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.81,43.78,46.64,47.34,47.34,47.34, +1040, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.81,43.77,46.63,47.33,47.33,47.33, +1041, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.81,43.77,46.63,47.32,47.32,47.32, +1042, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.80,43.76,46.62,47.31,47.31,47.31, +1043, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.80,43.75,46.61,47.30,47.30,47.30, +1044, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.80,43.74,46.60,47.30,47.30,47.30, +1045, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.79,43.74,46.60,47.29,47.29,47.29, +1046, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.79,43.73,46.59,47.28,47.28,47.28, +1047, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.79,43.72,46.58,47.27,47.27,47.27, +1048, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.78,43.72,46.57,47.26,47.26,47.26, +1049, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.78,43.71,46.57,47.26,47.26,47.26, +1050, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.77,43.70,46.56,47.25,47.25,47.25, +1051, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.77,43.69,46.55,47.24,47.24,47.24, +1052, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.77,43.69,46.54,47.23,47.23,47.23, +1053, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.76,43.68,46.53,47.23,47.23,47.23, +1054, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.76,43.67,46.53,47.22,47.22,47.22, +1055, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.76,43.67,46.52,47.21,47.21,47.21, +1056, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.75,43.66,46.51,47.20,47.20,47.20, +1057, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.75,43.65,46.50,47.19,47.19,47.19, +1058, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.75,43.65,46.50,47.19,47.19,47.19, +1059, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.74,43.64,46.49,47.18,47.18,47.18, +1060, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.74,43.63,46.48,47.17,47.17,47.17, +1061, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.74,43.63,46.47,47.16,47.16,47.16, +1062, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.73,43.62,46.47,47.16,47.16,47.16, +1063, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.73,43.61,46.46,47.15,47.15,47.15, +1064, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.72,43.60,46.45,47.14,47.14,47.14, +1065, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.72,43.60,46.44,47.13,47.13,47.13, +1066, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.72,43.59,46.43,47.13,47.13,47.13, +1067, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.71,43.58,46.43,47.12,47.12,47.12, +1068, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.71,43.58,46.42,47.11,47.11,47.11, +1069, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.71,43.57,46.41,47.10,47.10,47.10, +1070, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.70,43.56,46.40,47.09,47.09,47.09, +1071, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.70,43.56,46.40,47.09,47.09,47.09, +1072, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.70,43.55,46.39,47.08,47.08,47.08, +1073, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.69,43.54,46.38,47.07,47.07,47.07, +1074, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.69,43.53,46.37,47.06,47.06,47.06, +1075, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.68,43.53,46.37,47.06,47.06,47.06, +1076, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.68,43.52,46.36,47.05,47.05,47.05, +1077, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.68,43.51,46.35,47.04,47.04,47.04, +1078, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.67,43.51,46.34,47.03,47.03,47.03, +1079, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.67,43.50,46.33,47.02,47.02,47.02, +1080, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.67,43.49,46.33,47.02,47.02,47.02, +1081, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.66,43.49,46.32,47.01,47.01,47.01, +1082, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.66,43.48,46.31,47.00,47.00,47.00, +1083, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.66,43.47,46.30,46.99,46.99,46.99, +1084, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.65,43.47,46.30,46.99,46.99,46.99, +1085, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.65,43.46,46.29,46.98,46.98,46.98, +1086, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.64,43.45,46.28,46.97,46.97,46.97, +1087, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.64,43.45,46.27,46.96,46.96,46.96, +1088, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.64,43.44,46.27,46.96,46.96,46.96, +1089, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.63,43.43,46.26,46.95,46.95,46.95, +1090, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.63,43.42,46.25,46.94,46.94,46.94, +1091, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.63,43.42,46.24,46.93,46.93,46.93, +1092, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.62,43.41,46.24,46.92,46.92,46.92, +1093, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.62,43.40,46.23,46.92,46.92,46.92, +1094, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.62,43.40,46.22,46.91,46.91,46.91, +1095, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.61,43.39,46.21,46.90,46.90,46.90, +1096, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.61,43.38,46.21,46.89,46.89,46.89, +1097, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.60,43.38,46.20,46.89,46.89,46.89, +1098, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.60,43.37,46.19,46.88,46.88,46.88, +1099, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.60,43.36,46.18,46.87,46.87,46.87, +1100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.59,43.36,46.17,46.86,46.86,46.86, +1101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.59,43.35,46.17,46.86,46.86,46.86, +1102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.59,43.34,46.16,46.85,46.85,46.85, +1103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.58,43.34,46.15,46.84,46.84,46.84, +1104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.58,43.33,46.14,46.83,46.83,46.83, +1105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.58,43.32,46.14,46.82,46.82,46.82, +1106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.57,43.31,46.13,46.82,46.82,46.82, +1107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.57,43.31,46.12,46.81,46.81,46.81, +1108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,43.30,46.11,46.80,46.80,46.80, +1109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,43.29,46.11,46.79,46.79,46.79, +1110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,43.29,46.10,46.79,46.79,46.79, +1111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.55,43.28,46.09,46.78,46.78,46.78, +1112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.55,43.27,46.08,46.77,46.77,46.77, +1113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.55,43.27,46.08,46.76,46.76,46.76, +1114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.54,43.26,46.07,46.76,46.76,46.76, +1115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.54,43.25,46.06,46.75,46.75,46.75, +1116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.54,43.25,46.05,46.74,46.74,46.74, +1117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.53,43.24,46.05,46.73,46.73,46.73, +1118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.53,43.23,46.04,46.72,46.72,46.72, +1119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.52,43.23,46.03,46.72,46.72,46.72, +1120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.52,43.22,46.02,46.71,46.71,46.71, +1121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.52,43.21,46.02,46.70,46.70,46.70, +1122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.51,43.21,46.01,46.69,46.69,46.69, +1123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.51,43.20,46.00,46.69,46.69,46.69, +1124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.51,43.19,45.99,46.68,46.68,46.68, +1125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.50,43.19,45.99,46.67,46.67,46.67, +1126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.35,43.18,45.98,46.66,46.66,46.66, +1127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.53,43.84,45.97,46.66,46.66,46.66, +1128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.10,45.10,45.96,46.65,46.65,46.65, +1129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.32,46.32,46.35,46.64,46.64,46.64, +1130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.95,46.95,46.95,46.95,46.95,46.95, +1131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.42,47.42,47.42,47.42,47.42,47.42, +1132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.89,47.89,47.89,47.89,47.89,47.89, +1133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.36,48.36,48.36,48.36,48.36,48.36, +1134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.82,48.82,48.82,48.82,48.82,48.82, +1135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.29,49.29,49.29,49.29,49.29,49.29, +1136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.76,49.76,49.76,49.76,49.76,49.76, +1137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.22,50.22,50.22,50.22,50.22,50.22, +1138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.69,50.69,50.69,50.69,50.69,50.69, +1139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.16,51.16,51.16,51.16,51.16,51.16, +1140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.62,51.62,51.62,51.62,51.62,51.62, +1141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,8.28,8.28,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, +1142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, +1143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, +1144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, +1145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, +1146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, +1147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, +1148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, +1149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, +1150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, +1151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, +1152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, +1153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, +1154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, +1155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, +1156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, +1157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, +1158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, +1159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, +1160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, +1161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, +1162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, +1163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, +1164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, +1165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, +1166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, +1167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, +1168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, +1169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, +1170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, +1171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, +1172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, +1173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, +1174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, +1175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, +1176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, +1177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, +1178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, +1179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, +1180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, +1181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, +1182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, +1183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, +1184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, +1185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, +1186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, +1187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, +1188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, +1189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, +1190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, +1191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, +1192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, +1193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, +1194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, +1195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, +1196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, +1197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, +1198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, +1199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, +1200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, +1201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, +1202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, +1203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, +1204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, +1205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, +1206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, +1207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, +1208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, +1209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, +1210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, +1211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, +1212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, +1213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, +1214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, +1215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, +1216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, +1217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, +1218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, +1219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, +1220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, +1221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, +1222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, +1223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, +1224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, +1225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, +1226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, +1227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, +1228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, +1229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, +1230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, +1231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, +1232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, +1233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, +1234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, +1235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, +1236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, +1237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, +1238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, +1239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, +1240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, +1241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, +1242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, +1243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, +1244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, +1245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, +1246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, +1247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, +1248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, +1249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, +1250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, +1251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, +1252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, +1253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, +1254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, +1255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, +1256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, +1257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, +1258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, +1259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, +1260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, +1261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, +1262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, +1263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, +1264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, +1265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, +1266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, +1267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, +1268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, +1269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, +1270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, +1271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, +1272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, +1273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, +1274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, +1275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, +1276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, +1277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, +1278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, +1279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, +1280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, +1281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, +1282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, +1283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, +1284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, +1285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, +1286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, +1287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, +1288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, +1289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, +1290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, +1291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, +1292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, +1293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, +1294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, +1295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, +1296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, +1297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, +1298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, +1299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, +1300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, +1301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, +1302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, +1303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, +1304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, +1305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, +1306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, +1307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, +1308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, +1309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, +1310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, +1311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, +1312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, +1313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, +1314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, +1315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, +1316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, +1317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, +1318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, +1319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, +1320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, +1321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, +1322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, +1323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, +1324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, +1325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, +1326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, +1327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, +1328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, +1329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, +1330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, +1331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, +1332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, +1333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, +1334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, +1335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, +1336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, +1337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, +1338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, +1339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, +1340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, +1341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, +1342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, +1343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, +1344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, +1345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, +1346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, +1347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, +1348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, +1349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, +1350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, +1351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, +1352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, +1353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, +1354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, +1355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, +1356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, +1357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, +1358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, +1359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, +1360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, +1361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, +1362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, +1363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, +1364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, +1365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, +1366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, +1367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, +1368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, +1369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, +1370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, +1371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, +1372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, +1373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, +1374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, +1375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, +1376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, +1377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, +1378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, +1379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, +1380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, +1381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, +1382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, +1383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, +1384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, +1385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, +1386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, +1387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, +1388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, +1389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, +1390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, +1391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, +1392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, +1393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, +1394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, +1395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, +1396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, +1397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, +1398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, +1399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, +1400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, +1401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, +1402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, +1403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, +1404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, +1405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, +1406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, +1407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, +1408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, +1409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, +1410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, +1411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, +1412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, +1413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, +1414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, +1415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, +1416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, +1417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, +1418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, +1419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, +1420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, +1421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, +1422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, +1423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, +1424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, +1425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, +1426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, +1427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, +1428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, +1429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, +1430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, +1431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, +1432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, +1433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, +1434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, +1435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, +1436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, +1437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, +1438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, +1439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, diff --git a/test/main.cc b/test/main.cc index 9988f2ce..a4b50c3e 100644 --- a/test/main.cc +++ b/test/main.cc @@ -108,6 +108,5 @@ int main(int argc, char *argv[]){ hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress); } - return 0; } From a81fc7def5305704ae54b1e30d21154685db119a Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Mon, 18 Dec 2023 14:54:05 -0700 Subject: [PATCH 11/25] Clean up. --- test/24hr67_high_Preset_Rheem2020Build40.csv | 1441 ----------------- test/24hr67_low_Preset_Rheem2020Build40.csv | 1441 ----------------- .../24hr67_medium_Preset_Rheem2020Build40.csv | 1441 ----------------- .../24hr67_vsmall_Preset_Rheem2020Build40.csv | 1441 ----------------- 4 files changed, 5764 deletions(-) delete mode 100644 test/24hr67_high_Preset_Rheem2020Build40.csv delete mode 100644 test/24hr67_low_Preset_Rheem2020Build40.csv delete mode 100644 test/24hr67_medium_Preset_Rheem2020Build40.csv delete mode 100644 test/24hr67_vsmall_Preset_Rheem2020Build40.csv diff --git a/test/24hr67_high_Preset_Rheem2020Build40.csv b/test/24hr67_high_Preset_Rheem2020Build40.csv deleted file mode 100644 index 9bb39d5a..00000000 --- a/test/24hr67_high_Preset_Rheem2020Build40.csv +++ /dev/null @@ -1,1441 +0,0 @@ -minutes,Ta,Tsetpoint,inletT,draw,DRstatus,h_src1In (Wh),h_src1Out (Wh),h_src2In (Wh),h_src2Out (Wh),h_src3In (Wh),h_src3Out (Wh),tcouple1 (C),tcouple2 (C),tcouple3 (C),tcouple4 (C),tcouple5 (C),tcouple6 (C), toutlet (C) -0, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.19,48.56,51.65,51.65,51.65,51.65,51.66 -2, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.97,43.62,50.10,51.64,51.64,51.64,51.65 -3, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,25.90,32.97,46.12,51.62,51.63,51.63,51.64 -4, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.74,26.07,41.02,50.08,51.62,51.62,51.63 -5, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.73,24.04,32.33,46.12,51.60,51.61,51.62 -6, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.17,22.40,25.48,41.02,50.06,51.60,51.61 -7, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,21.67,21.67,23.61,32.38,46.13,51.57,51.60 -8, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,21.29,21.29,22.16,25.54,41.02,50.04,51.58 -9, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,21.01,21.01,21.49,23.62,32.44,46.12,51.53 -10, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.12,22.12,22.12,23.62,32.44,46.10, -11, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.01,23.01,23.01,23.80,32.44,46.09, -12, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.83,23.83,23.83,24.20,32.44,46.07, -13, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.63,24.63,24.63,24.63,32.44,46.05, -14, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,25.34,25.34,25.34,25.34,32.44,46.03, -15, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.06,26.06,26.06,26.06,32.45,46.02, -16, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.76,26.76,26.76,26.76,32.47,46.00, -17, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,27.40,27.40,27.40,27.40,32.78,45.98, -18, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.03,28.03,28.03,28.03,33.09,45.97, -19, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.67,28.67,28.67,28.67,33.39,45.95, -20, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.30,29.30,29.30,29.30,33.70,45.93, -21, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.93,29.93,29.93,29.93,34.01,45.91, -22, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.57,30.57,30.57,30.57,34.33,45.90, -23, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.20,31.20,31.20,31.20,34.64,45.88, -24, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.83,31.83,31.83,31.83,34.95,45.86, -25, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.46,32.46,32.46,32.46,35.26,45.84, -26, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.09,33.09,33.09,33.09,35.58,45.83, -27, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.73,33.73,33.73,33.73,35.89,45.81, -28, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.36,34.36,34.36,34.36,36.21,45.79, -29, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.99,34.99,34.99,34.99,36.52,45.77, -30, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.62,35.62,35.62,35.62,36.84,45.76, -31, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.28,35.28,35.61,35.61,36.43,44.10,47.96 -32, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.97,34.97,35.55,35.61,36.16,42.55,46.47 -33, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.94,35.94,35.94,35.94,36.33,42.54, -34, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.57,36.57,36.57,36.57,36.64,42.52, -35, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.15,37.15,37.15,37.15,37.15,42.51, -36, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.72,37.72,37.72,37.72,37.72,42.50, -37, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.29,38.29,38.29,38.29,38.29,42.48, -38, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.85,38.85,38.85,38.85,38.85,42.47, -39, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.42,39.42,39.42,39.42,39.42,42.46, -40, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.98,39.98,39.98,39.98,39.98,42.45, -41, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.28,39.28,39.98,39.98,39.98,41.66,44.67 -42, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.25,40.25,40.25,40.25,40.25,41.70, -43, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.77,40.77,40.77,40.77,40.77,41.95, -44, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.28,41.28,41.28,41.28,41.28,42.20, -45, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.79,41.79,41.79,41.79,41.79,42.45, -46, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.31,42.31,42.31,42.31,42.31,42.70, -47, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.82,42.82,42.82,42.82,42.82,42.94, -48, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.31,43.31,43.31,43.31,43.31,43.31, -49, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.78,43.78,43.78,43.78,43.78,43.78, -50, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.25,44.25,44.25,44.25,44.25,44.25, -51, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.71,44.71,44.71,44.71,44.71,44.71, -52, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.18,45.18,45.18,45.18,45.18,45.18, -53, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.65,45.65,45.65,45.65,45.65,45.65, -54, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.12,46.12,46.12,46.12,46.12,46.12, -55, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.59,46.59,46.59,46.59,46.59,46.59, -56, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.05,47.05,47.05,47.05,47.05,47.05, -57, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.52,47.52,47.52,47.52,47.52,47.52, -58, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.99,47.99,47.99,47.99,47.99,47.99, -59, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.46,48.46,48.46,48.46,48.46,48.46, -60, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.92,48.92,48.92,48.92,48.92,48.92, -61, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.39,49.39,49.39,49.39,49.39,49.39, -62, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.86,49.86,49.86,49.86,49.86,49.86, -63, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.32,50.32,50.32,50.32,50.32,50.32, -64, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.79,50.79,50.79,50.79,50.79,50.79, -65, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.26,51.26,51.26,51.26,51.26,51.26, -66, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,66.26,66.26,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -67, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -68, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -69, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -70, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -71, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -72, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -73, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -74, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -75, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -76, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -77, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -78, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -79, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -80, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -81, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -82, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -83, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -84, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -85, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -86, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -87, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -88, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -89, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -90, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -91, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -92, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -93, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -94, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -95, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -96, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -97, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -98, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -99, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -101, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.57,49.62,51.38,51.38,51.38,51.38,51.39 -102, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,46.75,50.87,51.37,51.37,51.37,51.38 -103, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.76,42.34,49.56,51.36,51.36,51.36,51.37 -104, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.25,37.53,47.45,51.19,51.35,51.35,51.36 -105, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.06,33.65,44.49,50.63,51.34,51.34,51.35 -106, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.10,32.75,43.47,50.28,51.32,51.33,51.34 -107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.85,33.85,43.46,50.27,51.31,51.32, -108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.28,35.28,43.45,50.26,51.30,51.31, -109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.70,36.70,43.45,50.25,51.29,51.30, -110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.12,38.12,43.44,50.24,51.28,51.29, -111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.55,39.55,43.44,50.23,51.27,51.28, -112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.90,40.90,43.55,50.22,51.26,51.27, -113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.04,42.04,44.12,50.21,51.25,51.26, -114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.18,43.18,44.68,50.20,51.24,51.25, -115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.31,44.31,45.25,50.19,51.24,51.24, -116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.45,45.45,45.81,50.18,51.23,51.23, -117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.51,46.51,46.51,50.16,51.22,51.22, -118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.46,47.46,47.46,50.15,51.21,51.21, -119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.40,48.40,48.40,50.15,51.20,51.20, -120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.34,49.34,49.34,50.14,51.19,51.19, -121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.16,50.16,50.16,50.49,51.18,51.18, -122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.95,50.95,50.95,50.95,51.17,51.17, -123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.49,51.49,51.49,51.49,51.49,51.49, -124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,29.41,29.41,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, -160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, -161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, -162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, -163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, -164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, -165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, -166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, -167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, -168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, -169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, -170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, -171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, -172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, -173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, -174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, -175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, -176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, -177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, -178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, -179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, -180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, -181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, -182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, -183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, -184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, -185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, -186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, -187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, -188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, -189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, -190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, -191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, -192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, -193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, -194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, -195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, -196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, -197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, -198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, -199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, -200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, -201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, -202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, -203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, -204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, -205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, -206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, -207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, -208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, -209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, -210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, -211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, -212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, -213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, -214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, -215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, -216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, -217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, -218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, -219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, -220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, -221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, -222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, -223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, -224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, -225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, -226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, -227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, -228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, -229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, -230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, -231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, -232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, -233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, -234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, -235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, -236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, -237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, -238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, -239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, -240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, -241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, -242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, -243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, -244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, -245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, -246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, -247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, -248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, -249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, -250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, -251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, -252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, -253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, -254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, -255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, -256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, -257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, -258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, -259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, -260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, -261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, -262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, -263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, -264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, -265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, -266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, -267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, -268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, -269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, -270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, -271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, -272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, -273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, -274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, -275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, -276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, -277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, -278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, -279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, -280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, -281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, -282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, -283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, -284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, -285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, -286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, -287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, -288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, -289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, -290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, -291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, -292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, -293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, -294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, -295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, -296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, -297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, -298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, -299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, -300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, -301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, -302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, -303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, -304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, -305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, -306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, -307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, -308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, -309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, -310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, -311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, -312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, -313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, -314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, -315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, -316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, -317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, -318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, -319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, -320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, -321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, -322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, -323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, -324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, -325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, -326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, -327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, -328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, -329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, -330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, -331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, -332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, -333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, -334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, -335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, -336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, -337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, -338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, -339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, -340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, -341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, -342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, -343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, -344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, -345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, -346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, -347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, -348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, -349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, -350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, -351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, -352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, -353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, -354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, -355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, -356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, -357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, -358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, -359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, -360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, -361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, -362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, -363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, -364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, -365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, -366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, -367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, -368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, -369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, -370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, -371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, -372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, -373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, -374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, -375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, -376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, -377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, -378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, -379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, -380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, -381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, -382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, -383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, -384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, -385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, -386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, -387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, -388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, -389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, -390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, -391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, -392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, -393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, -394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, -395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, -396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, -397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, -398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, -399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, -400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, -401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, -402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, -403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, -404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, -405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, -406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, -407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, -408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, -409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, -410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, -411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, -412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, -413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, -414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, -415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, -416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, -417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, -418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, -419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, -420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, -421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, -422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, -423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, -424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, -425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, -426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, -427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, -428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, -429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, -430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, -431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, -432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, -433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, -434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, -435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, -436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, -437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, -438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, -439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, -440, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, -441, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, -442, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, -443, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, -444, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, -445, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, -446, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, -447, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, -448, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, -449, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, -450, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, -451, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, -452, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, -453, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, -454, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, -455, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, -456, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, -457, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, -458, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, -459, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, -460, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, -461, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, -462, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, -463, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, -464, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, -465, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, -466, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, -467, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, -468, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, -469, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, -470, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, -471, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, -472, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, -473, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, -474, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, -475, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, -476, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, -477, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, -478, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, -479, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, -480, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, -481, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, -482, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, -483, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, -484, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, -485, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, -486, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, -487, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, -488, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, -489, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, -490, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, -491, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, -492, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, -493, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, -494, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, -495, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, -496, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, -497, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, -498, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, -499, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, -500, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, -501, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, -502, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, -503, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, -504, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, -505, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, -506, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, -507, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.48,48.63,48.63,48.63,48.63,48.63, -508, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.47,48.62,48.63,48.63,48.63,48.63, -509, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.46,48.62,48.62,48.62,48.62,48.62, -510, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.45,48.61,48.61,48.61,48.61,48.61, -511, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.44,48.60,48.60,48.60,48.60,48.60, -512, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.43,48.59,48.60,48.60,48.60,48.60, -513, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.42,48.59,48.59,48.59,48.59,48.59, -514, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.41,48.58,48.58,48.58,48.58,48.58, -515, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.40,48.57,48.57,48.57,48.57,48.57, -516, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.39,48.56,48.57,48.57,48.57,48.57, -517, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.38,48.56,48.56,48.56,48.56,48.56, -518, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.37,48.55,48.55,48.55,48.55,48.55, -519, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.36,48.54,48.54,48.54,48.54,48.54, -520, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.35,48.53,48.54,48.54,48.54,48.54, -521, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.34,48.52,48.53,48.53,48.53,48.53, -522, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.52,48.52,48.52,48.52,48.52, -523, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.51,48.51,48.51,48.51,48.51, -524, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.32,48.50,48.51,48.51,48.51,48.51, -525, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.31,48.49,48.50,48.50,48.50,48.50, -526, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.30,48.49,48.49,48.49,48.49,48.49, -527, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.29,48.48,48.48,48.48,48.48,48.48, -528, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.28,48.47,48.47,48.47,48.47,48.47, -529, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.27,48.46,48.47,48.47,48.47,48.47, -530, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.26,48.46,48.46,48.46,48.46,48.46, -531, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.25,48.45,48.45,48.45,48.45,48.45, -532, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.24,48.44,48.44,48.44,48.44,48.44, -533, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.23,48.43,48.44,48.44,48.44,48.44, -534, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.22,48.42,48.43,48.43,48.43,48.43, -535, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.21,48.42,48.42,48.42,48.42,48.42, -536, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.20,48.41,48.41,48.41,48.41,48.41, -537, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.19,48.40,48.41,48.41,48.41,48.41, -538, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.18,48.39,48.40,48.40,48.40,48.40, -539, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.17,48.39,48.39,48.39,48.39,48.39, -540, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.16,48.38,48.38,48.38,48.38,48.38, -541, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.15,48.37,48.38,48.38,48.38,48.38, -542, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.14,48.36,48.37,48.37,48.37,48.37, -543, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.13,48.36,48.36,48.36,48.36,48.36, -544, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.12,48.35,48.35,48.35,48.35,48.35, -545, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.11,48.34,48.35,48.35,48.35,48.35, -546, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.10,48.33,48.34,48.34,48.34,48.34, -547, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.09,48.32,48.33,48.33,48.33,48.33, -548, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.09,48.32,48.32,48.32,48.32,48.32, -549, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.08,48.31,48.32,48.32,48.32,48.32, -550, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.07,48.30,48.31,48.31,48.31,48.31, -551, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.06,48.29,48.30,48.30,48.30,48.30, -552, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.05,48.29,48.29,48.29,48.29,48.29, -553, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.04,48.28,48.29,48.29,48.29,48.29, -554, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.03,48.27,48.28,48.28,48.28,48.28, -555, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.02,48.26,48.27,48.27,48.27,48.27, -556, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.01,48.26,48.26,48.26,48.26,48.26, -557, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.00,48.25,48.26,48.26,48.26,48.26, -558, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.99,48.24,48.25,48.25,48.25,48.25, -559, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.98,48.23,48.24,48.24,48.24,48.24, -560, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.97,48.23,48.23,48.23,48.23,48.23, -561, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.96,48.22,48.23,48.23,48.23,48.23, -562, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.95,48.21,48.22,48.22,48.22,48.22, -563, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.94,48.20,48.21,48.21,48.21,48.21, -564, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.93,48.19,48.20,48.20,48.20,48.20, -565, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.92,48.19,48.20,48.20,48.20,48.20, -566, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.91,48.18,48.19,48.19,48.19,48.19, -567, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.91,48.17,48.18,48.18,48.18,48.18, -568, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.90,48.16,48.17,48.17,48.17,48.17, -569, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.89,48.16,48.17,48.17,48.17,48.17, -570, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.88,48.15,48.16,48.16,48.16,48.16, -571, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.87,48.14,48.15,48.15,48.15,48.15, -572, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.86,48.13,48.14,48.14,48.14,48.14, -573, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.85,48.13,48.14,48.14,48.14,48.14, -574, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.84,48.12,48.13,48.13,48.13,48.13, -575, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.83,48.11,48.12,48.12,48.12,48.12, -576, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.82,48.10,48.11,48.11,48.11,48.11, -577, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.81,48.10,48.11,48.11,48.11,48.11, -578, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.80,48.09,48.10,48.10,48.10,48.10, -579, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.79,48.08,48.09,48.09,48.09,48.09, -580, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.78,48.07,48.08,48.08,48.08,48.08, -581, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.77,48.06,48.08,48.08,48.08,48.08, -582, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.76,48.06,48.07,48.07,48.07,48.07, -583, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.75,48.05,48.06,48.06,48.06,48.06, -584, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.75,48.04,48.06,48.06,48.06,48.06, -585, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.74,48.03,48.05,48.05,48.05,48.05, -586, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.73,48.03,48.04,48.04,48.04,48.04, -587, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.72,48.02,48.03,48.03,48.03,48.03, -588, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.71,48.01,48.03,48.03,48.03,48.03, -589, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.70,48.00,48.02,48.02,48.02,48.02, -590, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.69,48.00,48.01,48.01,48.01,48.01, -591, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.68,47.99,48.00,48.00,48.00,48.00, -592, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.67,47.98,48.00,48.00,48.00,48.00, -593, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.66,47.97,47.99,47.99,47.99,47.99, -594, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.65,47.97,47.98,47.98,47.98,47.98, -595, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.64,47.96,47.97,47.97,47.97,47.97, -596, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.63,47.95,47.97,47.97,47.97,47.97, -597, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.62,47.94,47.96,47.96,47.96,47.96, -598, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.61,47.94,47.95,47.95,47.95,47.95, -599, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.61,47.93,47.94,47.94,47.94,47.94, -600, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.60,47.92,47.94,47.94,47.94,47.94, -601, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.59,47.91,47.93,47.93,47.93,47.93, -602, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.58,47.90,47.92,47.92,47.92,47.92, -603, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.57,47.90,47.91,47.91,47.91,47.91, -604, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.56,47.89,47.91,47.91,47.91,47.91, -605, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.55,47.88,47.90,47.90,47.90,47.90, -606, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.54,47.87,47.89,47.89,47.89,47.89, -607, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.53,47.87,47.88,47.88,47.88,47.88, -608, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.52,47.86,47.88,47.88,47.88,47.88, -609, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.51,47.85,47.87,47.87,47.87,47.87, -610, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.50,47.84,47.86,47.86,47.86,47.86, -611, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,47.84,47.85,47.85,47.85,47.85, -612, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,47.83,47.85,47.85,47.85,47.85, -613, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.48,47.82,47.84,47.84,47.84,47.84, -614, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.47,47.81,47.83,47.83,47.83,47.83, -615, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.46,47.81,47.83,47.83,47.83,47.83, -616, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.45,47.80,47.82,47.82,47.82,47.82, -617, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.44,47.79,47.81,47.81,47.81,47.81, -618, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.43,47.78,47.80,47.80,47.80,47.80, -619, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.42,47.78,47.80,47.80,47.80,47.80, -620, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.41,47.77,47.79,47.79,47.79,47.79, -621, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.40,47.76,47.78,47.78,47.78,47.78, -622, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.39,47.75,47.77,47.77,47.77,47.77, -623, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.38,47.74,47.77,47.77,47.77,47.77, -624, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.38,47.74,47.76,47.76,47.76,47.76, -625, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.37,47.73,47.75,47.75,47.75,47.75, -626, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.36,47.72,47.74,47.74,47.74,47.74, -627, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.35,47.71,47.74,47.74,47.74,47.74, -628, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.34,47.71,47.73,47.73,47.73,47.73, -629, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.33,47.70,47.72,47.72,47.72,47.72, -630, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.32,47.69,47.71,47.71,47.71,47.71, -631, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.93,44.49,47.70,47.71,47.71,47.71,47.71 -632, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,25.65,39.54,46.18,47.70,47.70,47.70,47.71 -633, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.97,30.37,42.31,47.68,47.69,47.69,47.70 -634, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.25,24.79,37.39,46.17,47.68,47.68,47.69 -635, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.45,23.26,29.86,42.31,47.66,47.67,47.68 -636, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.28,24.28,29.86,42.30,47.65,47.66, -637, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,25.55,25.55,30.18,42.30,47.64,47.66, -638, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.69,26.69,30.74,42.29,47.62,47.65, -639, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,27.83,27.83,31.31,42.28,47.61,47.64, -640, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.97,28.97,31.87,42.27,47.60,47.63, -641, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.11,30.11,32.44,42.26,47.59,47.62, -642, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.25,31.25,33.01,42.26,47.58,47.61, -643, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.39,32.39,33.58,42.25,47.57,47.60, -644, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.53,33.53,34.15,42.24,47.55,47.59, -645, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.67,34.67,34.72,42.23,47.54,47.58, -646, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.63,35.63,35.63,42.22,47.53,47.57, -647, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.58,36.58,36.58,42.22,47.52,47.56, -648, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.53,37.53,37.53,42.21,47.51,47.55, -649, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.47,38.47,38.47,42.21,47.50,47.55, -650, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.42,39.42,39.42,42.20,47.49,47.54, -651, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.30,40.30,40.30,42.40,47.47,47.53, -652, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.11,41.11,41.11,42.80,47.46,47.52, -653, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.92,41.92,41.92,43.21,47.45,47.51, -654, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.73,42.73,42.73,43.61,47.44,47.50, -655, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.53,43.53,43.53,44.01,47.43,47.49, -656, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.34,44.34,44.34,44.42,47.42,47.48, -657, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.07,45.07,45.07,45.07,47.41,47.47, -658, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.77,45.77,45.77,45.77,47.40,47.46, -659, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.48,46.48,46.48,46.48,47.39,47.45, -660, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.19,47.19,47.19,47.19,47.38,47.44, -661, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.73,47.73,47.73,47.73,47.73,47.73, -662, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.20,48.20,48.20,48.20,48.20,48.20, -663, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.66,48.66,48.66,48.66,48.66,48.66, -664, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.13,49.13,49.13,49.13,49.13,49.13, -665, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.60,49.60,49.60,49.60,49.60,49.60, -666, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.06,50.06,50.06,50.06,50.06,50.06, -667, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.53,50.53,50.53,50.53,50.53,50.53, -668, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.00,51.00,51.00,51.00,51.00,51.00, -669, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.46,51.46,51.46,51.46,51.46,51.46, -670, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,33.58,33.58,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -671, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -672, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -673, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -674, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -675, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -676, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -677, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -678, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -679, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -680, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -681, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -682, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -683, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -684, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -685, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -686, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -687, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -688, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -689, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -690, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -691, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.70,49.74,51.49,51.49,51.49,51.49,51.50 -692, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,46.88,50.99,51.49,51.49,51.49,51.49 -693, 19.722222, 51.666667, 14.444444, 1.600000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.22,42.61,49.76,51.48,51.48,51.48,51.49 -694, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.22,42.60,49.74,51.47,51.47,51.47, -695, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.59,49.73,51.46,51.46,51.46, -696, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.59,49.72,51.45,51.45,51.45, -697, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.58,49.71,51.44,51.44,51.44, -698, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.57,49.69,51.43,51.43,51.43, -699, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.57,49.68,51.42,51.42,51.42, -700, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.56,49.67,51.41,51.41,51.41, -701, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.55,49.65,51.40,51.40,51.40, -702, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.55,49.64,51.39,51.39,51.39, -703, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.54,49.63,51.39,51.39,51.39, -704, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.53,49.62,51.38,51.38,51.38, -705, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.27,42.53,49.60,51.37,51.37,51.37, -706, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.27,42.52,49.59,51.36,51.36,51.36, -707, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.28,42.52,49.58,51.35,51.35,51.35, -708, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.28,42.51,49.57,51.34,51.34,51.34, -709, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.28,42.50,49.56,51.33,51.33,51.33, -710, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.29,42.50,49.54,51.32,51.32,51.32, -711, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.29,42.49,49.53,51.31,51.31,51.31, -712, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.29,42.48,49.52,51.30,51.30,51.30, -713, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.30,42.48,49.51,51.29,51.29,51.29, -714, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.30,42.47,49.49,51.29,51.29,51.29, -715, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.31,42.46,49.48,51.28,51.28,51.28, -716, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.31,42.46,49.47,51.27,51.27,51.27, -717, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.31,42.45,49.46,51.26,51.26,51.26, -718, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.32,42.44,49.45,51.25,51.25,51.25, -719, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.32,42.44,49.43,51.24,51.24,51.24, -720, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.33,42.43,49.42,51.23,51.23,51.23, -721, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.89,38.87,48.24,51.12,51.22,51.22,51.23 -722, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.74,38.87,48.23,51.11,51.21,51.21, -723, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.29,39.17,48.21,51.10,51.20,51.20, -724, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.15,40.15,48.20,51.09,51.19,51.19, -725, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.58,41.58,48.19,51.08,51.19,51.19, -726, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.00,43.00,48.17,51.07,51.18,51.18, -727, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.42,44.42,48.16,51.06,51.17,51.17, -728, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.84,45.84,48.16,51.05,51.16,51.16, -729, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.12,47.12,48.42,51.04,51.15,51.15, -730, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.25,48.25,48.98,51.03,51.14,51.14, -731, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.39,49.39,49.54,51.03,51.13,51.13, -732, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.38,50.38,50.38,51.02,51.12,51.12, -733, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.20,51.20,51.20,51.20,51.20,51.20, -734, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -735, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,1.43,1.43,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -736, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -737, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -738, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -739, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -740, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -741, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -742, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -743, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -744, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -745, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -746, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -747, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -748, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -749, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -750, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -751, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -752, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -753, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -754, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -755, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -756, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -757, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -758, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -759, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -760, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -761, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -762, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -763, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -764, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -765, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -766, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.19,50.37,51.41,51.41,51.41,51.41,51.42 -767, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.18,50.37,51.40,51.40,51.40,51.40, -768, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.17,50.36,51.39,51.40,51.40,51.40, -769, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.16,50.35,51.38,51.39,51.39,51.39, -770, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.15,50.35,51.37,51.38,51.38,51.38, -771, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.63,51.19,51.37,51.37,51.37,51.38 -772, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.62,51.18,51.36,51.36,51.36, -773, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.62,51.17,51.35,51.35,51.35, -774, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.61,51.16,51.34,51.34,51.34, -775, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.87,48.60,51.15,51.33,51.33,51.33, -776, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.87,48.60,51.14,51.33,51.33,51.33, -777, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.86,48.59,51.13,51.32,51.32,51.32, -778, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.86,48.59,51.12,51.31,51.31,51.31, -779, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.85,48.58,51.11,51.30,51.30,51.30, -780, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.85,48.57,51.10,51.29,51.29,51.29, -781, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.84,48.57,51.09,51.28,51.28,51.28, -782, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.84,48.56,51.08,51.27,51.27,51.27, -783, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.83,48.55,51.07,51.26,51.26,51.26, -784, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.83,48.55,51.06,51.26,51.26,51.26, -785, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.82,48.54,51.05,51.25,51.25,51.25, -786, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.82,48.54,51.04,51.24,51.24,51.24, -787, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.81,48.53,51.03,51.23,51.23,51.23, -788, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.81,48.52,51.02,51.22,51.22,51.22, -789, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.80,48.52,51.01,51.21,51.21,51.21, -790, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.80,48.51,51.00,51.20,51.20,51.20, -791, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.79,48.50,50.99,51.19,51.19,51.19, -792, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.79,48.50,50.98,51.19,51.19,51.19, -793, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.78,48.49,50.97,51.18,51.18,51.18, -794, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.78,48.48,50.96,51.17,51.17,51.17, -795, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.77,48.48,50.95,51.16,51.16,51.16, -796, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.77,48.47,50.94,51.15,51.15,51.15, -797, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.76,48.46,50.93,51.14,51.14,51.14, -798, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.76,48.46,50.92,51.13,51.13,51.13, -799, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.75,48.45,50.91,51.12,51.12,51.12, -800, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.75,48.44,50.90,51.12,51.12,51.12, -801, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.74,48.44,50.89,51.11,51.11,51.11, -802, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.74,48.43,50.88,51.10,51.10,51.10, -803, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.42,50.87,51.09,51.09,51.09, -804, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.41,50.86,51.08,51.08,51.08, -805, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.41,50.85,51.07,51.07,51.07, -806, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.72,48.40,50.84,51.06,51.06,51.06, -807, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.72,48.39,50.83,51.06,51.06,51.06, -808, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.71,48.39,50.82,51.05,51.05,51.05, -809, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.71,48.38,50.81,51.04,51.04,51.04, -810, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.70,48.37,50.80,51.03,51.03,51.03, -811, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.70,48.37,50.79,51.02,51.02,51.02, -812, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.69,48.36,50.78,51.01,51.01,51.01, -813, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.69,48.35,50.77,51.00,51.00,51.00, -814, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.34,50.76,50.99,50.99,50.99, -815, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.34,50.75,50.99,50.99,50.99, -816, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.33,50.74,50.98,50.98,50.98, -817, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.67,48.32,50.73,50.97,50.97,50.97, -818, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.67,48.31,50.72,50.96,50.96,50.96, -819, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.66,48.31,50.71,50.95,50.95,50.95, -820, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.66,48.30,50.70,50.94,50.94,50.94, -821, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.65,48.29,50.69,50.93,50.93,50.93, -822, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.65,48.29,50.68,50.93,50.93,50.93, -823, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.64,48.28,50.67,50.92,50.92,50.92, -824, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.64,48.27,50.66,50.91,50.91,50.91, -825, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.26,50.65,50.90,50.90,50.90, -826, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.26,50.64,50.89,50.89,50.89, -827, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.25,50.63,50.88,50.88,50.88, -828, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.62,48.24,50.62,50.87,50.87,50.87, -829, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.62,48.23,50.61,50.86,50.86,50.86, -830, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.61,48.23,50.60,50.86,50.86,50.86, -831, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.61,48.22,50.59,50.85,50.85,50.85, -832, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.21,50.58,50.84,50.84,50.84, -833, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.20,50.57,50.83,50.83,50.83, -834, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.20,50.56,50.82,50.82,50.82, -835, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.59,48.19,50.55,50.81,50.81,50.81, -836, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.59,48.18,50.55,50.80,50.80,50.80, -837, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.58,48.17,50.54,50.80,50.80,50.80, -838, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.58,48.17,50.53,50.79,50.79,50.79, -839, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.16,50.52,50.78,50.78,50.78, -840, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.15,50.51,50.77,50.77,50.77, -841, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.14,50.50,50.76,50.76,50.76, -842, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.56,48.14,50.49,50.75,50.75,50.75, -843, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.56,48.13,50.48,50.74,50.74,50.74, -844, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.55,48.12,50.47,50.74,50.74,50.74, -845, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.55,48.11,50.46,50.73,50.73,50.73, -846, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.10,50.45,50.72,50.72,50.72, -847, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.10,50.44,50.71,50.71,50.71, -848, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.09,50.43,50.70,50.70,50.70, -849, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.53,48.08,50.42,50.69,50.69,50.69, -850, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.53,48.07,50.41,50.68,50.68,50.68, -851, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.52,48.07,50.40,50.67,50.67,50.67, -852, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.52,48.06,50.39,50.67,50.67,50.67, -853, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.05,50.39,50.66,50.66,50.66, -854, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.04,50.38,50.65,50.65,50.65, -855, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.03,50.37,50.64,50.64,50.64, -856, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.50,48.03,50.36,50.63,50.63,50.63, -857, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.50,48.02,50.35,50.62,50.62,50.62, -858, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.01,50.34,50.61,50.61,50.61, -859, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.00,50.33,50.61,50.61,50.61, -860, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.00,50.32,50.60,50.60,50.60, -861, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.48,47.99,50.31,50.59,50.59,50.59, -862, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.48,47.98,50.30,50.58,50.58,50.58, -863, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.47,47.97,50.29,50.57,50.57,50.57, -864, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.47,47.96,50.28,50.56,50.56,50.56, -865, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.96,50.28,50.55,50.55,50.55, -866, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.95,50.27,50.55,50.55,50.55, -867, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.94,50.26,50.54,50.54,50.54, -868, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.45,47.93,50.25,50.53,50.53,50.53, -869, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.45,47.92,50.24,50.52,50.52,50.52, -870, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.92,50.23,50.51,50.51,50.51, -871, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.91,50.22,50.50,50.50,50.50, -872, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.90,50.21,50.49,50.49,50.49, -873, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.43,47.89,50.20,50.49,50.49,50.49, -874, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.43,47.88,50.19,50.48,50.48,50.48, -875, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.88,50.18,50.47,50.47,50.47, -876, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.87,50.17,50.46,50.46,50.46, -877, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.86,50.17,50.45,50.45,50.45, -878, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.41,47.85,50.16,50.44,50.44,50.44, -879, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.41,47.84,50.15,50.43,50.43,50.43, -880, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.84,50.14,50.43,50.43,50.43, -881, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.83,50.13,50.42,50.42,50.42, -882, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.82,50.12,50.41,50.41,50.41, -883, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.39,47.81,50.11,50.40,50.40,50.40, -884, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.39,47.80,50.10,50.39,50.39,50.39, -885, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.79,50.09,50.38,50.38,50.38, -886, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.79,50.08,50.37,50.37,50.37, -887, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.78,50.08,50.37,50.37,50.37, -888, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.37,47.77,50.07,50.36,50.36,50.36, -889, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.37,47.76,50.06,50.35,50.35,50.35, -890, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.75,50.05,50.34,50.34,50.34, -891, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.75,50.04,50.33,50.33,50.33, -892, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.74,50.03,50.32,50.32,50.32, -893, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.35,47.73,50.02,50.31,50.31,50.31, -894, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.35,47.72,50.01,50.31,50.31,50.31, -895, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.71,50.00,50.30,50.30,50.30, -896, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.70,50.00,50.29,50.29,50.29, -897, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.70,49.99,50.28,50.28,50.28, -898, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.33,47.69,49.98,50.27,50.27,50.27, -899, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.33,47.68,49.97,50.26,50.26,50.26, -900, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.67,49.96,50.26,50.26,50.26, -901, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.66,49.95,50.25,50.25,50.25, -902, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.65,49.94,50.24,50.24,50.24, -903, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.31,47.65,49.93,50.23,50.23,50.23, -904, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.31,47.64,49.92,50.22,50.22,50.22, -905, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.63,49.92,50.21,50.21,50.21, -906, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.62,49.91,50.20,50.20,50.20, -907, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.61,49.90,50.20,50.20,50.20, -908, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.29,47.60,49.89,50.19,50.19,50.19, -909, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.29,47.60,49.88,50.18,50.18,50.18, -910, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.59,49.87,50.17,50.17,50.17, -911, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.58,49.86,50.16,50.16,50.16, -912, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.57,49.85,50.15,50.15,50.15, -913, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.27,47.56,49.85,50.14,50.14,50.14, -914, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.27,47.56,49.84,50.14,50.14,50.14, -915, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.55,49.83,50.13,50.13,50.13, -916, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.54,49.82,50.12,50.12,50.12, -917, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.53,49.81,50.11,50.11,50.11, -918, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.52,49.80,50.10,50.10,50.10, -919, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.51,49.79,50.09,50.09,50.09, -920, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.50,49.78,50.09,50.09,50.09, -921, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.24,47.50,49.78,50.08,50.08,50.08, -922, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.24,47.49,49.77,50.07,50.07,50.07, -923, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.48,49.76,50.06,50.06,50.06, -924, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.47,49.75,50.05,50.05,50.05, -925, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.46,49.74,50.04,50.04,50.04, -926, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.22,47.45,49.73,50.03,50.03,50.03, -927, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.22,47.45,49.72,50.03,50.03,50.03, -928, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.44,49.71,50.02,50.02,50.02, -929, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.43,49.71,50.01,50.01,50.01, -930, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.42,49.70,50.00,50.00,50.00, -931, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.20,47.41,49.69,49.99,49.99,49.99, -932, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.20,47.40,49.68,49.98,49.98,49.98, -933, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.40,49.67,49.98,49.98,49.98, -934, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.39,49.66,49.97,49.97,49.97, -935, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.38,49.65,49.96,49.96,49.96, -936, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.37,49.65,49.95,49.95,49.95, -937, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.36,49.64,49.94,49.94,49.94, -938, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.35,49.63,49.93,49.93,49.93, -939, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.17,47.35,49.62,49.93,49.93,49.93, -940, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.17,47.34,49.61,49.92,49.92,49.92, -941, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.33,49.60,49.91,49.91,49.91, -942, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.32,49.59,49.90,49.90,49.90, -943, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.31,49.58,49.89,49.89,49.89, -944, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.15,47.30,49.58,49.88,49.88,49.88, -945, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.15,47.29,49.57,49.87,49.87,49.87, -946, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.29,49.56,49.87,49.87,49.87, -947, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.28,49.55,49.86,49.86,49.86, -948, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.27,49.54,49.85,49.85,49.85, -949, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.26,49.53,49.84,49.84,49.84, -950, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.25,49.52,49.83,49.83,49.83, -951, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.24,49.52,49.82,49.82,49.82, -952, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.12,47.24,49.51,49.82,49.82,49.82, -953, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.12,47.23,49.50,49.81,49.81,49.81, -954, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.22,49.49,49.80,49.80,49.80, -955, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.21,49.48,49.79,49.79,49.79, -956, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.20,49.47,49.78,49.78,49.78, -957, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.19,49.46,49.77,49.77,49.77, -958, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.18,49.46,49.77,49.77,49.77, -959, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.18,49.45,49.76,49.76,49.76, -960, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.09,47.17,49.44,49.75,49.75,49.75, -961, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.95,44.75,49.11,49.74,49.74,49.74,49.75 -962, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.35,48.41,49.70,49.73,49.73,49.74 -963, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.35,48.40,49.69,49.72,49.72, -964, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.34,48.39,49.68,49.71,49.71, -965, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.34,48.37,49.67,49.71,49.71, -966, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.34,48.36,49.66,49.70,49.70, -967, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,42.34,48.35,49.66,49.69,49.69, -968, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.33,48.34,49.65,49.68,49.68, -969, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.33,48.33,49.64,49.67,49.67, -970, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.33,48.31,49.63,49.66,49.66, -971, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.32,48.30,49.62,49.65,49.65, -972, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.32,48.29,49.61,49.64,49.64, -973, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,42.32,48.28,49.61,49.64,49.64, -974, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,42.32,48.27,49.60,49.63,49.63, -975, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,42.31,48.25,49.59,49.62,49.62, -976, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.88,39.88,47.22,49.50,49.61,49.61,49.62 -977, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.74,37.54,45.87,49.31,49.60,49.60,49.61 -978, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.59,37.54,45.86,49.30,49.59,49.59, -979, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.49,38.49,45.84,49.30,49.58,49.58, -980, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.91,39.91,45.83,49.29,49.57,49.57, -981, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.33,41.33,45.82,49.28,49.56,49.56, -982, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.75,42.75,45.82,49.27,49.55,49.55, -983, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.15,44.15,45.86,49.26,49.54,49.54, -984, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.28,45.28,46.42,49.25,49.54,49.54, -985, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.42,46.42,46.99,49.24,49.53,49.53, -986, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.55,47.55,47.55,49.24,49.52,49.52, -987, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.49,48.49,48.49,49.23,49.51,49.51, -988, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.37,49.37,49.37,49.40,49.50,49.50, -989, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.89,49.89,49.89,49.89,49.89,49.89, -990, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.35,50.35,50.35,50.35,50.35,50.35, -991, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.74,48.66,50.34,50.35,50.35,50.35,50.35 -992, 19.722222, 51.666667, 14.444444, 0.300000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.82,47.72,50.25,50.34,50.34,50.34,50.35 -993, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.68,48.68,50.24,50.33,50.33,50.33, -994, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.10,50.10,50.23,50.32,50.32,50.32, -995, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.70,50.70,50.70,50.70,50.70,50.70, -996, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.16,51.16,51.16,51.16,51.16,51.16, -997, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.63,51.63,51.63,51.63,51.63,51.63, -998, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,6.99,6.99,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -999, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1000, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -1001, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -1002, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -1003, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -1004, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -1005, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -1006, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.83,49.85,51.60,51.60,51.60,51.60,51.61 -1007, 19.722222, 51.666667, 14.444444, 0.300000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.52,48.38,51.50,51.59,51.59,51.59,51.60 -1008, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.51,48.37,51.49,51.58,51.58,51.58, -1009, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.51,48.37,51.48,51.57,51.57,51.57, -1010, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.50,48.37,51.47,51.57,51.57,51.57, -1011, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.50,48.36,51.45,51.56,51.56,51.56, -1012, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.49,48.36,51.44,51.55,51.55,51.55, -1013, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.48,48.35,51.43,51.54,51.54,51.54, -1014, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.48,48.35,51.42,51.53,51.53,51.53, -1015, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.47,48.35,51.41,51.52,51.52,51.52, -1016, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.46,48.34,51.40,51.51,51.51,51.51, -1017, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.46,48.34,51.38,51.50,51.50,51.50, -1018, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.45,48.33,51.37,51.50,51.50,51.50, -1019, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.44,48.33,51.36,51.49,51.49,51.49, -1020, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.44,48.32,51.35,51.48,51.48,51.48, -1021, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,29.77,44.06,49.80,51.47,51.47,51.47,51.48 -1022, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.85,36.86,46.44,51.33,51.46,51.46,51.47 -1023, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.21,28.16,41.69,49.79,51.45,51.45,51.46 -1024, 19.722222, 51.666667, 14.444444, 3.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,22.86,23.88,35.20,46.43,51.30,51.44,51.45 -1025, 19.722222, 51.666667, 14.444444, 2.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,23.22,23.22,30.22,43.27,50.28,51.43,51.44 -1026, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,24.65,24.65,30.22,43.26,50.27,51.42, -1027, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,26.07,26.07,30.22,43.25,50.26,51.40, -1028, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,27.30,27.30,30.63,43.25,50.25,51.39, -1029, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.44,28.44,31.20,43.24,50.23,51.38, -1030, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.58,29.58,31.77,43.23,50.22,51.37, -1031, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.72,30.72,32.34,43.22,50.21,51.35, -1032, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.86,31.86,32.91,43.21,50.20,51.34, -1033, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.00,33.00,33.48,43.20,50.19,51.33, -1034, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.11,34.11,34.11,43.19,50.18,51.32, -1035, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.06,35.06,35.06,43.18,50.17,51.31, -1036, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.01,36.01,36.01,43.17,50.15,51.29, -1037, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.95,36.95,36.95,43.16,50.14,51.28, -1038, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.90,37.90,37.90,43.16,50.13,51.27, -1039, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.85,38.85,38.85,43.15,50.12,51.26, -1040, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.79,39.79,39.79,43.15,50.11,51.25, -1041, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.73,40.73,40.73,43.18,50.10,51.23, -1042, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.54,41.54,41.54,43.58,50.09,51.22, -1043, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.35,42.35,42.35,43.98,50.08,51.21, -1044, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.16,43.16,43.16,44.38,50.06,51.20, -1045, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.97,43.97,43.97,44.78,50.05,51.19, -1046, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.78,44.78,44.78,45.19,50.04,51.17, -1047, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.58,45.58,45.58,45.59,50.03,51.16, -1048, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.29,46.29,46.29,46.29,50.02,51.15, -1049, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.00,47.00,47.00,47.00,50.01,51.14, -1050, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.70,47.70,47.70,47.70,50.00,51.13, -1051, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.41,48.41,48.41,48.41,49.99,51.11, -1052, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.11,49.11,49.11,49.11,50.02,51.10, -1053, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.73,49.73,49.73,49.73,50.33,51.09, -1054, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.36,50.36,50.36,50.36,50.63,51.08, -1055, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.98,50.98,50.98,50.98,50.98,51.07, -1056, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.46,51.46,51.46,51.46,51.46,51.46, -1057, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,34.53,34.53,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -1058, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1059, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -1060, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -1061, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -1062, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -1063, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -1064, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -1065, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -1066, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -1067, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -1068, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -1069, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -1070, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -1071, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -1072, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -1073, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -1074, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -1075, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -1076, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -1077, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -1078, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -1079, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -1080, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -1081, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -1082, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -1083, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -1084, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -1085, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -1086, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -1087, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -1088, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -1089, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -1090, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -1091, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -1092, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, -1093, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, -1094, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, -1095, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, -1096, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, -1097, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, -1098, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, -1099, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, -1100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, -1101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, -1102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, -1103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, -1104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, -1105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, -1106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, -1107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, -1108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, -1109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, -1110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, -1111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, -1112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, -1113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, -1114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, -1115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, -1116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, -1117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, -1118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, -1119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, -1120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, -1121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, -1122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, -1123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, -1124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, -1125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, -1126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, -1127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, -1128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, -1129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, -1130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, -1131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, -1132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, -1133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, -1134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, -1135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, -1136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, -1137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, -1138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, -1139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, -1140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, -1141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, -1142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, -1143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, -1144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, -1145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, -1146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, -1147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, -1148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, -1149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, -1150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, -1151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, -1152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, -1153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, -1154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, -1155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, -1156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, -1157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, -1158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, -1159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, -1160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, -1161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, -1162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, -1163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, -1164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, -1165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, -1166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, -1167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, -1168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, -1169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, -1170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, -1171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, -1172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, -1173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, -1174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, -1175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, -1176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, -1177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, -1178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, -1179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, -1180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, -1181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, -1182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, -1183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, -1184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, -1185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, -1186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, -1187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, -1188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, -1189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, -1190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, -1191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, -1192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, -1193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, -1194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, -1195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, -1196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, -1197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, -1198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, -1199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, -1200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, -1201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, -1202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, -1203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, -1204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, -1205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, -1206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, -1207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, -1208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, -1209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, -1210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, -1211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, -1212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, -1213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, -1214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, -1215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, -1216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, -1217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, -1218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, -1219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, -1220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, -1221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, -1222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, -1223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, -1224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, -1225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, -1226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, -1227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, -1228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, -1229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, -1230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, -1231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, -1232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, -1233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, -1234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, -1235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, -1236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, -1237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, -1238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, -1239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, -1240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, -1241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, -1242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, -1243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, -1244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, -1245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, -1246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, -1247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, -1248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, -1249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, -1250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, -1251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, -1252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, -1253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, -1254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, -1255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, -1256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, -1257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, -1258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, -1259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, -1260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, -1261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, -1262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, -1263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, -1264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, -1265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, -1266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, -1267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, -1268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, -1269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, -1270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, -1271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, -1272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, -1273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, -1274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, -1275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, -1276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, -1277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, -1278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, -1279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, -1280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, -1281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, -1282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, -1283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, -1284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, -1285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, -1286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, -1287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, -1288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, -1289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, -1290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, -1291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, -1292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, -1293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, -1294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, -1295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, -1296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, -1297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, -1298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, -1299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, -1300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, -1301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, -1302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, -1303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, -1304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, -1305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, -1306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, -1307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, -1308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, -1309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, -1310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, -1311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, -1312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, -1313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, -1314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, -1315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, -1316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, -1317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, -1318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, -1319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, -1320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, -1321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, -1322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, -1323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, -1324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, -1325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, -1326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, -1327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, -1328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, -1329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, -1330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, -1331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, -1332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, -1333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, -1334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, -1335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, -1336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, -1337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, -1338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, -1339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, -1340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, -1341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, -1342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, -1343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, -1344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, -1345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, -1346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, -1347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, -1348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, -1349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, -1350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, -1351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, -1352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, -1353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, -1354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, -1355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, -1356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, -1357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, -1358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, -1359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, -1360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, -1361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, -1362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, -1363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, -1364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, -1365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, -1366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, -1367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, -1368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, -1369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, -1370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, -1371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, -1372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, -1373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, -1374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, -1375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, -1376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, -1377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, -1378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, -1379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, -1380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, -1381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, -1382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, -1383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, -1384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, -1385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, -1386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, -1387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, -1388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, -1389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, -1390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, -1391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, -1392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, -1393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, -1394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, -1395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, -1396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, -1397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, -1398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, -1399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, -1400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, -1401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, -1402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, -1403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, -1404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, -1405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, -1406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, -1407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, -1408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, -1409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, -1410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, -1411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, -1412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, -1413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, -1414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, -1415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, -1416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, -1417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, -1418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, -1419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, -1420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, -1421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, -1422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, -1423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, -1424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, -1425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, -1426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, -1427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, -1428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, -1429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, -1430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, -1431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, -1432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, -1433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, -1434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, -1435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, -1436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, -1437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, -1438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, -1439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, diff --git a/test/24hr67_low_Preset_Rheem2020Build40.csv b/test/24hr67_low_Preset_Rheem2020Build40.csv deleted file mode 100644 index eb44bbb0..00000000 --- a/test/24hr67_low_Preset_Rheem2020Build40.csv +++ /dev/null @@ -1,1441 +0,0 @@ -minutes,Ta,Tsetpoint,inletT,draw,DRstatus,h_src1In (Wh),h_src1Out (Wh),h_src2In (Wh),h_src2Out (Wh),h_src3In (Wh),h_src3Out (Wh),tcouple1 (C),tcouple2 (C),tcouple3 (C),tcouple4 (C),tcouple5 (C),tcouple6 (C), toutlet (C) -0, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.88,49.90,51.65,51.65,51.65,51.65,51.66 -2, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,47.04,51.14,51.64,51.64,51.64,51.65 -3, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.93,42.61,49.84,51.63,51.63,51.63,51.64 -4, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.38,37.77,47.72,51.46,51.62,51.62,51.63 -5, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.16,33.84,44.76,50.90,51.61,51.61,51.62 -6, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.64,31.34,41.30,49.76,51.55,51.60,51.61 -7, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.06,29.78,37.83,47.94,51.32,51.59,51.60 -8, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.53,28.71,34.80,45.46,50.77,51.56,51.59 -9, 19.722222, 51.666667, 14.444444, 1.400000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.37,28.37,32.81,43.06,49.92,51.48,51.57 -10, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.79,29.79,32.82,43.06,49.91,51.47, -11, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.10,31.10,33.04,43.05,49.90,51.46, -12, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.24,32.24,33.61,43.04,49.89,51.44, -13, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.38,33.38,34.18,43.03,49.88,51.43, -14, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.52,34.52,34.75,43.02,49.87,51.42, -15, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.54,35.54,35.54,43.01,49.86,51.41, -16, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.49,36.49,36.49,43.01,49.85,51.39, -17, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.44,37.44,37.44,43.00,49.84,51.38, -18, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.38,38.38,38.38,43.00,49.83,51.37, -19, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.33,39.33,39.33,42.99,49.82,51.35, -20, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.28,40.28,40.28,42.99,49.81,51.34, -21, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.12,41.12,41.12,43.30,49.80,51.33, -22, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.93,41.93,41.93,43.70,49.79,51.32, -23, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.74,42.74,42.74,44.10,49.78,51.30, -24, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.55,43.55,43.55,44.51,49.77,51.29, -25, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.35,44.35,44.35,44.91,49.75,51.28, -26, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.16,45.16,45.16,45.31,49.74,51.27, -27, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.91,45.91,45.91,45.91,49.73,51.25, -28, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.61,46.61,46.61,46.61,49.72,51.24, -29, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.32,47.32,47.32,47.32,49.71,51.23, -30, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.03,48.03,48.03,48.03,49.71,51.22, -31, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.22,47.09,48.02,48.02,49.28,51.10,51.22 -32, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.69,46.03,47.85,48.01,48.94,50.88,51.20 -33, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.78,46.78,47.85,48.01,48.94,50.87, -34, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.06,48.06,48.06,48.06,48.93,50.86, -35, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.72,48.72,48.72,48.72,49.10,50.84, -36, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.34,49.34,49.34,49.34,49.41,50.83, -37, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.92,49.92,49.92,49.92,49.92,50.82, -38, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.48,50.48,50.48,50.48,50.48,50.80, -39, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.00,51.00,51.00,51.00,51.00,51.00, -40, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.47,51.47,51.47,51.47,51.47,51.47, -41, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,32.50,32.50,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -42, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -43, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -44, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -45, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -46, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -47, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -48, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -49, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -50, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -51, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -52, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -53, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -54, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -55, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -56, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -57, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -58, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -59, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -60, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -61, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.30,50.47,51.50,51.50,51.50,51.50,51.51 -62, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.29,50.46,51.49,51.49,51.49,51.49, -63, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.28,50.45,51.48,51.49,51.49,51.49, -64, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.28,50.45,51.47,51.48,51.48,51.48, -65, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.27,50.44,51.46,51.47,51.47,51.47, -66, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.26,50.44,51.46,51.46,51.46,51.46, -67, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.25,50.43,51.45,51.45,51.45,51.45, -68, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.24,50.42,51.44,51.44,51.44,51.44, -69, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.23,50.42,51.43,51.43,51.43,51.43, -70, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.22,50.41,51.42,51.42,51.42,51.42, -71, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.21,50.41,51.41,51.42,51.42,51.42, -72, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.20,50.40,51.40,51.41,51.41,51.41, -73, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.19,50.39,51.39,51.40,51.40,51.40, -74, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.18,50.39,51.38,51.39,51.39,51.39, -75, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.18,50.38,51.37,51.38,51.38,51.38, -76, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.17,50.38,51.36,51.37,51.37,51.37, -77, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.16,50.37,51.35,51.36,51.36,51.36, -78, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.15,50.36,51.34,51.36,51.36,51.36, -79, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.14,50.36,51.34,51.35,51.35,51.35, -80, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.13,50.35,51.33,51.34,51.34,51.34, -81, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.12,50.34,51.32,51.33,51.33,51.33, -82, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.11,50.34,51.31,51.32,51.32,51.32, -83, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.10,50.33,51.30,51.31,51.31,51.31, -84, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.10,50.32,51.29,51.30,51.30,51.30, -85, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.09,50.32,51.28,51.30,51.30,51.30, -86, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.08,50.31,51.27,51.29,51.29,51.29, -87, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.07,50.30,51.26,51.28,51.28,51.28, -88, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.06,50.30,51.25,51.27,51.27,51.27, -89, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.05,50.29,51.24,51.26,51.26,51.26, -90, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.04,50.28,51.24,51.25,51.25,51.25, -91, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.04,50.28,51.23,51.24,51.24,51.24, -92, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.03,50.27,51.22,51.24,51.24,51.24, -93, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.02,50.26,51.21,51.23,51.23,51.23, -94, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.01,50.26,51.20,51.22,51.22,51.22, -95, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.00,50.25,51.19,51.21,51.21,51.21, -96, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.99,50.24,51.18,51.20,51.20,51.20, -97, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.98,50.24,51.17,51.19,51.19,51.19, -98, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.98,50.23,51.16,51.18,51.18,51.18, -99, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.97,50.22,51.15,51.18,51.18,51.18, -100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.96,50.22,51.15,51.17,51.17,51.17, -101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.95,50.21,51.14,51.16,51.16,51.16, -102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.94,50.20,51.13,51.15,51.15,51.15, -103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.93,50.20,51.12,51.14,51.14,51.14, -104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.93,50.19,51.11,51.13,51.13,51.13, -105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.92,50.18,51.10,51.12,51.12,51.12, -106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.91,50.18,51.09,51.12,51.12,51.12, -107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.90,50.17,51.08,51.11,51.11,51.11, -108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.89,50.16,51.07,51.10,51.10,51.10, -109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.88,50.15,51.07,51.09,51.09,51.09, -110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.88,50.15,51.06,51.08,51.08,51.08, -111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.87,50.14,51.05,51.07,51.07,51.07, -112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.86,50.13,51.04,51.06,51.06,51.06, -113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.85,50.13,51.03,51.06,51.06,51.06, -114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.84,50.12,51.02,51.05,51.05,51.05, -115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.83,50.11,51.01,51.04,51.04,51.04, -116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.83,50.10,51.00,51.03,51.03,51.03, -117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.82,50.10,50.99,51.02,51.02,51.02, -118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.81,50.09,50.99,51.01,51.01,51.01, -119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.80,50.08,50.98,51.00,51.00,51.00, -120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.79,50.08,50.97,51.00,51.00,51.00, -121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.79,50.07,50.96,50.99,50.99,50.99, -122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.78,50.06,50.95,50.98,50.98,50.98, -123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.77,50.05,50.94,50.97,50.97,50.97, -124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.76,50.05,50.93,50.96,50.96,50.96, -125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.75,50.04,50.92,50.95,50.95,50.95, -126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.75,50.03,50.92,50.95,50.95,50.95, -127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.74,50.02,50.91,50.94,50.94,50.94, -128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.73,50.02,50.90,50.93,50.93,50.93, -129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.72,50.01,50.89,50.92,50.92,50.92, -130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.72,50.00,50.88,50.91,50.91,50.91, -131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.71,49.99,50.87,50.90,50.90,50.90, -132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.70,49.99,50.86,50.89,50.89,50.89, -133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.69,49.98,50.86,50.89,50.89,50.89, -134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.68,49.97,50.85,50.88,50.88,50.88, -135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.68,49.96,50.84,50.87,50.87,50.87, -136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.67,49.96,50.83,50.86,50.86,50.86, -137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.66,49.95,50.82,50.85,50.85,50.85, -138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.65,49.94,50.81,50.84,50.84,50.84, -139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.64,49.93,50.80,50.83,50.83,50.83, -140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.64,49.93,50.79,50.83,50.83,50.83, -141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.63,49.92,50.79,50.82,50.82,50.82, -142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.62,49.91,50.78,50.81,50.81,50.81, -143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.61,49.90,50.77,50.80,50.80,50.80, -144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.61,49.90,50.76,50.79,50.79,50.79, -145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.60,49.89,50.75,50.78,50.78,50.78, -146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.59,49.88,50.74,50.78,50.78,50.78, -147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.58,49.87,50.73,50.77,50.77,50.77, -148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.58,49.87,50.73,50.76,50.76,50.76, -149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.57,49.86,50.72,50.75,50.75,50.75, -150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.56,49.85,50.71,50.74,50.74,50.74, -151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.55,49.84,50.70,50.73,50.73,50.73, -152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.55,49.83,50.69,50.72,50.72,50.72, -153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.54,49.83,50.68,50.72,50.72,50.72, -154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.53,49.82,50.67,50.71,50.71,50.71, -155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.52,49.81,50.67,50.70,50.70,50.70, -156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.52,49.80,50.66,50.69,50.69,50.69, -157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.51,49.80,50.65,50.68,50.68,50.68, -158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.50,49.79,50.64,50.67,50.67,50.67, -159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.49,49.78,50.63,50.67,50.67,50.67, -160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.49,49.77,50.62,50.66,50.66,50.66, -161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.48,49.76,50.61,50.65,50.65,50.65, -162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.47,49.76,50.61,50.64,50.64,50.64, -163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.46,49.75,50.60,50.63,50.63,50.63, -164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.46,49.74,50.59,50.62,50.62,50.62, -165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.45,49.73,50.58,50.62,50.62,50.62, -166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.44,49.72,50.57,50.61,50.61,50.61, -167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.43,49.72,50.56,50.60,50.60,50.60, -168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.43,49.71,50.55,50.59,50.59,50.59, -169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.42,49.70,50.55,50.58,50.58,50.58, -170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.41,49.69,50.54,50.57,50.57,50.57, -171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.40,49.68,50.53,50.56,50.56,50.56, -172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.40,49.68,50.52,50.56,50.56,50.56, -173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.39,49.67,50.51,50.55,50.55,50.55, -174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.38,49.66,50.50,50.54,50.54,50.54, -175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.37,49.65,50.50,50.53,50.53,50.53, -176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.37,49.64,50.49,50.52,50.52,50.52, -177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.36,49.64,50.48,50.51,50.51,50.51, -178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.35,49.63,50.47,50.51,50.51,50.51, -179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.35,49.62,50.46,50.50,50.50,50.50, -180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.34,49.61,50.45,50.49,50.49,50.49, -181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.33,49.60,50.44,50.48,50.48,50.48, -182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.32,49.60,50.44,50.47,50.47,50.47, -183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.32,49.59,50.43,50.46,50.46,50.46, -184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.31,49.58,50.42,50.46,50.46,50.46, -185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.30,49.57,50.41,50.45,50.45,50.45, -186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.29,49.56,50.40,50.44,50.44,50.44, -187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.29,49.56,50.39,50.43,50.43,50.43, -188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.28,49.55,50.39,50.42,50.42,50.42, -189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.27,49.54,50.38,50.41,50.41,50.41, -190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.27,49.53,50.37,50.41,50.41,50.41, -191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.26,49.52,50.36,50.40,50.40,50.40, -192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.25,49.51,50.35,50.39,50.39,50.39, -193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.24,49.51,50.34,50.38,50.38,50.38, -194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.24,49.50,50.34,50.37,50.37,50.37, -195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.23,49.49,50.33,50.36,50.36,50.36, -196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.22,49.48,50.32,50.36,50.36,50.36, -197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.22,49.47,50.31,50.35,50.35,50.35, -198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.21,49.47,50.30,50.34,50.34,50.34, -199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.20,49.46,50.29,50.33,50.33,50.33, -200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.19,49.45,50.29,50.32,50.32,50.32, -201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.19,49.44,50.28,50.31,50.31,50.31, -202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.18,49.43,50.27,50.31,50.31,50.31, -203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.17,49.42,50.26,50.30,50.30,50.30, -204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.17,49.42,50.25,50.29,50.29,50.29, -205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.16,49.41,50.24,50.28,50.28,50.28, -206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.15,49.40,50.24,50.27,50.27,50.27, -207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.14,49.39,50.23,50.26,50.26,50.26, -208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.14,49.38,50.22,50.26,50.26,50.26, -209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.13,49.37,50.21,50.25,50.25,50.25, -210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.12,49.37,50.20,50.24,50.24,50.24, -211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.12,49.36,50.19,50.23,50.23,50.23, -212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.11,49.35,50.19,50.22,50.22,50.22, -213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.10,49.34,50.18,50.21,50.21,50.21, -214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.10,49.33,50.17,50.21,50.21,50.21, -215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.09,49.32,50.16,50.20,50.20,50.20, -216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.08,49.32,50.15,50.19,50.19,50.19, -217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.07,49.31,50.14,50.18,50.18,50.18, -218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.07,49.30,50.14,50.17,50.17,50.17, -219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.06,49.29,50.13,50.16,50.16,50.16, -220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.05,49.28,50.12,50.16,50.16,50.16, -221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.05,49.27,50.11,50.15,50.15,50.15, -222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.04,49.27,50.10,50.14,50.14,50.14, -223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.03,49.26,50.10,50.13,50.13,50.13, -224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.03,49.25,50.09,50.12,50.12,50.12, -225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.02,49.24,50.08,50.11,50.11,50.11, -226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.01,49.23,50.07,50.11,50.11,50.11, -227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.01,49.22,50.06,50.10,50.10,50.10, -228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,45.00,49.22,50.05,50.09,50.09,50.09, -229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.99,49.21,50.05,50.08,50.08,50.08, -230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.98,49.20,50.04,50.07,50.07,50.07, -231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.98,49.19,50.03,50.06,50.06,50.06, -232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.97,49.18,50.02,50.06,50.06,50.06, -233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.96,49.17,50.01,50.05,50.05,50.05, -234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.96,49.17,50.00,50.04,50.04,50.04, -235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.95,49.16,50.00,50.03,50.03,50.03, -236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.94,49.15,49.99,50.02,50.02,50.02, -237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.94,49.14,49.98,50.01,50.01,50.01, -238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.93,49.13,49.97,50.01,50.01,50.01, -239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.92,49.12,49.96,50.00,50.00,50.00, -240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.92,49.12,49.96,49.99,49.99,49.99, -241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.91,49.11,49.95,49.98,49.98,49.98, -242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.90,49.10,49.94,49.97,49.97,49.97, -243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.90,49.09,49.93,49.97,49.97,49.97, -244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.89,49.08,49.92,49.96,49.96,49.96, -245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.88,49.07,49.92,49.95,49.95,49.95, -246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.88,49.07,49.91,49.94,49.94,49.94, -247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.87,49.06,49.90,49.93,49.93,49.93, -248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.86,49.05,49.89,49.92,49.92,49.92, -249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.85,49.04,49.88,49.92,49.92,49.92, -250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.85,49.03,49.87,49.91,49.91,49.91, -251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.84,49.02,49.87,49.90,49.90,49.90, -252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.83,49.01,49.86,49.89,49.89,49.89, -253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.83,49.01,49.85,49.88,49.88,49.88, -254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.82,49.00,49.84,49.87,49.87,49.87, -255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.81,48.99,49.83,49.87,49.87,49.87, -256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.81,48.98,49.83,49.86,49.86,49.86, -257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.80,48.97,49.82,49.85,49.85,49.85, -258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.79,48.96,49.81,49.84,49.84,49.84, -259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.79,48.96,49.80,49.83,49.83,49.83, -260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.78,48.95,49.79,49.83,49.83,49.83, -261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.77,48.94,49.78,49.82,49.82,49.82, -262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.77,48.93,49.78,49.81,49.81,49.81, -263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.76,48.92,49.77,49.80,49.80,49.80, -264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.75,48.91,49.76,49.79,49.79,49.79, -265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.75,48.90,49.75,49.78,49.78,49.78, -266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.74,48.90,49.74,49.78,49.78,49.78, -267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.73,48.89,49.74,49.77,49.77,49.77, -268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.73,48.88,49.73,49.76,49.76,49.76, -269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.72,48.87,49.72,49.75,49.75,49.75, -270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.71,48.86,49.71,49.74,49.74,49.74, -271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.71,48.85,49.70,49.74,49.74,49.74, -272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.70,48.84,49.70,49.73,49.73,49.73, -273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.69,48.84,49.69,49.72,49.72,49.72, -274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.69,48.83,49.68,49.71,49.71,49.71, -275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.68,48.82,49.67,49.70,49.70,49.70, -276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.67,48.81,49.66,49.69,49.69,49.69, -277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.67,48.80,49.66,49.69,49.69,49.69, -278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.66,48.79,49.65,49.68,49.68,49.68, -279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.65,48.79,49.64,49.67,49.67,49.67, -280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.65,48.78,49.63,49.66,49.66,49.66, -281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.64,48.77,49.62,49.65,49.65,49.65, -282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.63,48.76,49.62,49.65,49.65,49.65, -283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.63,48.75,49.61,49.64,49.64,49.64, -284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.62,48.74,49.60,49.63,49.63,49.63, -285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.61,48.73,49.59,49.62,49.62,49.62, -286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.61,48.73,49.58,49.61,49.61,49.61, -287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.60,48.72,49.57,49.60,49.60,49.60, -288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.59,48.71,49.57,49.60,49.60,49.60, -289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.59,48.70,49.56,49.59,49.59,49.59, -290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.58,48.69,49.55,49.58,49.58,49.58, -291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.57,48.68,49.54,49.57,49.57,49.57, -292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.57,48.67,49.53,49.56,49.56,49.56, -293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.56,48.67,49.53,49.56,49.56,49.56, -294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.55,48.66,49.52,49.55,49.55,49.55, -295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.55,48.65,49.51,49.54,49.54,49.54, -296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.54,48.64,49.50,49.53,49.53,49.53, -297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.53,48.63,49.49,49.52,49.52,49.52, -298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.53,48.62,49.49,49.52,49.52,49.52, -299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.52,48.62,49.48,49.51,49.51,49.51, -300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.51,48.61,49.47,49.50,49.50,49.50, -301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.51,48.60,49.46,49.49,49.49,49.49, -302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.50,48.59,49.45,49.48,49.48,49.48, -303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.50,48.58,49.45,49.47,49.47,49.47, -304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.49,48.57,49.44,49.47,49.47,49.47, -305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.48,48.56,49.43,49.46,49.46,49.46, -306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.48,48.56,49.42,49.45,49.45,49.45, -307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.47,48.55,49.41,49.44,49.44,49.44, -308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.46,48.54,49.41,49.43,49.43,49.43, -309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.46,48.53,49.40,49.43,49.43,49.43, -310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.45,48.52,49.39,49.42,49.42,49.42, -311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.44,48.51,49.38,49.41,49.41,49.41, -312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.44,48.50,49.37,49.40,49.40,49.40, -313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.43,48.50,49.37,49.39,49.39,49.39, -314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.42,48.49,49.36,49.39,49.39,49.39, -315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.42,48.48,49.35,49.38,49.38,49.38, -316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.41,48.47,49.34,49.37,49.37,49.37, -317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.40,48.46,49.33,49.36,49.36,49.36, -318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.40,48.45,49.33,49.35,49.35,49.35, -319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.39,48.44,49.32,49.35,49.35,49.35, -320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.38,48.44,49.31,49.34,49.34,49.34, -321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.38,48.43,49.30,49.33,49.33,49.33, -322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.37,48.42,49.29,49.32,49.32,49.32, -323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.36,48.41,49.29,49.31,49.31,49.31, -324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.36,48.40,49.28,49.31,49.31,49.31, -325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.35,48.39,49.27,49.30,49.30,49.30, -326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.34,48.39,49.26,49.29,49.29,49.29, -327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.34,48.38,49.26,49.28,49.28,49.28, -328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.33,48.37,49.25,49.27,49.27,49.27, -329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.33,48.36,49.24,49.26,49.26,49.26, -330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.32,48.35,49.23,49.26,49.26,49.26, -331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.31,48.34,49.22,49.25,49.25,49.25, -332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.31,48.33,49.22,49.24,49.24,49.24, -333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.30,48.33,49.21,49.23,49.23,49.23, -334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.29,48.32,49.20,49.22,49.22,49.22, -335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.29,48.31,49.19,49.22,49.22,49.22, -336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.28,48.30,49.18,49.21,49.21,49.21, -337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.27,48.29,49.18,49.20,49.20,49.20, -338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.27,48.28,49.17,49.19,49.19,49.19, -339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.26,48.27,49.16,49.18,49.18,49.18, -340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.25,48.27,49.15,49.18,49.18,49.18, -341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.25,48.26,49.14,49.17,49.17,49.17, -342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.24,48.25,49.14,49.16,49.16,49.16, -343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.23,48.24,49.13,49.15,49.15,49.15, -344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.23,48.23,49.12,49.14,49.14,49.14, -345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.22,48.22,49.11,49.14,49.14,49.14, -346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.22,48.22,49.10,49.13,49.13,49.13, -347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.21,48.21,49.10,49.12,49.12,49.12, -348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.20,48.20,49.09,49.11,49.11,49.11, -349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.20,48.19,49.08,49.10,49.10,49.10, -350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.19,48.18,49.07,49.10,49.10,49.10, -351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.18,48.17,49.06,49.09,49.09,49.09, -352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.18,48.16,49.06,49.08,49.08,49.08, -353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.17,48.16,49.05,49.07,49.07,49.07, -354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.16,48.15,49.04,49.06,49.06,49.06, -355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.16,48.14,49.03,49.06,49.06,49.06, -356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.15,48.13,49.03,49.05,49.05,49.05, -357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.14,48.12,49.02,49.04,49.04,49.04, -358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.14,48.11,49.01,49.03,49.03,49.03, -359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.13,48.11,49.00,49.02,49.02,49.02, -360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.13,48.10,48.99,49.02,49.02,49.02, -361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.12,48.09,48.99,49.01,49.01,49.01, -362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.11,48.08,48.98,49.00,49.00,49.00, -363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.11,48.07,48.97,48.99,48.99,48.99, -364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.10,48.06,48.96,48.98,48.98,48.98, -365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.09,48.05,48.95,48.98,48.98,48.98, -366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.09,48.05,48.95,48.97,48.97,48.97, -367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.08,48.04,48.94,48.96,48.96,48.96, -368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.07,48.03,48.93,48.95,48.95,48.95, -369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.07,48.02,48.92,48.94,48.94,48.94, -370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.06,48.01,48.92,48.94,48.94,48.94, -371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.06,48.00,48.91,48.93,48.93,48.93, -372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.05,48.00,48.90,48.92,48.92,48.92, -373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.04,47.99,48.89,48.91,48.91,48.91, -374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.04,47.98,48.88,48.91,48.91,48.91, -375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.03,47.97,48.88,48.90,48.90,48.90, -376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.02,47.96,48.87,48.89,48.89,48.89, -377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.02,47.95,48.86,48.88,48.88,48.88, -378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.01,47.94,48.85,48.87,48.87,48.87, -379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.00,47.94,48.84,48.87,48.87,48.87, -380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.00,47.93,48.84,48.86,48.86,48.86, -381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.99,47.92,48.83,48.85,48.85,48.85, -382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.99,47.91,48.82,48.84,48.84,48.84, -383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.98,47.90,48.81,48.83,48.83,48.83, -384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.97,47.89,48.81,48.83,48.83,48.83, -385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.97,47.89,48.80,48.82,48.82,48.82, -386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.96,47.88,48.79,48.81,48.81,48.81, -387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.95,47.87,48.78,48.80,48.80,48.80, -388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.95,47.86,48.77,48.79,48.79,48.79, -389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.94,47.85,48.77,48.79,48.79,48.79, -390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.93,47.84,48.76,48.78,48.78,48.78, -391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.93,47.84,48.75,48.77,48.77,48.77, -392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.92,47.83,48.74,48.76,48.76,48.76, -393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.92,47.82,48.73,48.75,48.75,48.75, -394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.91,47.81,48.73,48.75,48.75,48.75, -395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.90,47.80,48.72,48.74,48.74,48.74, -396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.90,47.79,48.71,48.73,48.73,48.73, -397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.89,47.78,48.70,48.72,48.72,48.72, -398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.88,47.78,48.70,48.72,48.72,48.72, -399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.88,47.77,48.69,48.71,48.71,48.71, -400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.87,47.76,48.68,48.70,48.70,48.70, -401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.86,47.75,48.67,48.69,48.69,48.69, -402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.86,47.74,48.66,48.68,48.68,48.68, -403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.85,47.73,48.66,48.68,48.68,48.68, -404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.85,47.73,48.65,48.67,48.67,48.67, -405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.84,47.72,48.64,48.66,48.66,48.66, -406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.83,47.71,48.63,48.65,48.65,48.65, -407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.83,47.70,48.63,48.64,48.64,48.64, -408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.82,47.69,48.62,48.64,48.64,48.64, -409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.81,47.68,48.61,48.63,48.63,48.63, -410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.81,47.68,48.60,48.62,48.62,48.62, -411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.80,47.67,48.59,48.61,48.61,48.61, -412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.80,47.66,48.59,48.60,48.60,48.60, -413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.79,47.65,48.58,48.60,48.60,48.60, -414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.78,47.64,48.57,48.59,48.59,48.59, -415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.78,47.63,48.56,48.58,48.58,48.58, -416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.77,47.63,48.56,48.57,48.57,48.57, -417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.76,47.62,48.55,48.57,48.57,48.57, -418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.76,47.61,48.54,48.56,48.56,48.56, -419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.75,47.60,48.53,48.55,48.55,48.55, -420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.74,47.59,48.52,48.54,48.54,48.54, -421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.74,47.58,48.52,48.53,48.53,48.53, -422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.73,47.58,48.51,48.53,48.53,48.53, -423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.73,47.57,48.50,48.52,48.52,48.52, -424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.72,47.56,48.49,48.51,48.51,48.51, -425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.71,47.55,48.49,48.50,48.50,48.50, -426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.71,47.54,48.48,48.49,48.49,48.49, -427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.70,47.53,48.47,48.49,48.49,48.49, -428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.69,47.53,48.46,48.48,48.48,48.48, -429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.69,47.52,48.45,48.47,48.47,48.47, -430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.68,47.51,48.45,48.46,48.46,48.46, -431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.68,47.50,48.44,48.46,48.46,48.46, -432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.67,47.49,48.43,48.45,48.45,48.45, -433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.66,47.48,48.42,48.44,48.44,48.44, -434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.66,47.48,48.42,48.43,48.43,48.43, -435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.65,47.47,48.41,48.42,48.42,48.42, -436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.64,47.46,48.40,48.42,48.42,48.42, -437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.64,47.45,48.39,48.41,48.41,48.41, -438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.63,47.44,48.38,48.40,48.40,48.40, -439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.63,47.43,48.38,48.39,48.39,48.39, -440, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.62,47.43,48.37,48.39,48.39,48.39, -441, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.61,47.42,48.36,48.38,48.38,48.38, -442, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.61,47.41,48.35,48.37,48.37,48.37, -443, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.60,47.40,48.35,48.36,48.36,48.36, -444, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.59,47.39,48.34,48.35,48.35,48.35, -445, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.59,47.38,48.33,48.35,48.35,48.35, -446, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.58,47.38,48.32,48.34,48.34,48.34, -447, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.57,47.37,48.32,48.33,48.33,48.33, -448, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.57,47.36,48.31,48.32,48.32,48.32, -449, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.56,47.35,48.30,48.32,48.32,48.32, -450, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.56,47.34,48.29,48.31,48.31,48.31, -451, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.55,47.34,48.28,48.30,48.30,48.30, -452, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.54,47.33,48.28,48.29,48.29,48.29, -453, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.54,47.32,48.27,48.28,48.28,48.28, -454, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.53,47.31,48.26,48.28,48.28,48.28, -455, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.52,47.30,48.25,48.27,48.27,48.27, -456, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.52,47.29,48.25,48.26,48.26,48.26, -457, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.51,47.29,48.24,48.25,48.25,48.25, -458, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.51,47.28,48.23,48.25,48.25,48.25, -459, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.50,47.27,48.22,48.24,48.24,48.24, -460, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.49,47.26,48.21,48.23,48.23,48.23, -461, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.49,47.25,48.21,48.22,48.22,48.22, -462, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.48,47.24,48.20,48.21,48.21,48.21, -463, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.47,47.24,48.19,48.21,48.21,48.21, -464, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.47,47.23,48.18,48.20,48.20,48.20, -465, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.46,47.22,48.18,48.19,48.19,48.19, -466, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.46,47.21,48.17,48.18,48.18,48.18, -467, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.45,47.20,48.16,48.18,48.18,48.18, -468, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.44,47.20,48.15,48.17,48.17,48.17, -469, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.44,47.19,48.15,48.16,48.16,48.16, -470, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.43,47.18,48.14,48.15,48.15,48.15, -471, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.42,47.17,48.13,48.14,48.14,48.14, -472, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.42,47.16,48.12,48.14,48.14,48.14, -473, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.41,47.15,48.11,48.13,48.13,48.13, -474, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.41,47.15,48.11,48.12,48.12,48.12, -475, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.40,47.14,48.10,48.11,48.11,48.11, -476, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.39,47.13,48.09,48.11,48.11,48.11, -477, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.39,47.12,48.08,48.10,48.10,48.10, -478, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.38,47.11,48.08,48.09,48.09,48.09, -479, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.38,47.11,48.07,48.08,48.08,48.08, -480, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.37,47.10,48.06,48.08,48.08,48.08, -481, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.36,47.09,48.05,48.07,48.07,48.07, -482, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.36,47.08,48.05,48.06,48.06,48.06, -483, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.35,47.07,48.04,48.05,48.05,48.05, -484, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.34,47.06,48.03,48.04,48.04,48.04, -485, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.34,47.06,48.02,48.04,48.04,48.04, -486, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.33,47.05,48.01,48.03,48.03,48.03, -487, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.33,47.04,48.01,48.02,48.02,48.02, -488, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.32,47.03,48.00,48.01,48.01,48.01, -489, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.31,47.02,47.99,48.01,48.01,48.01, -490, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.31,47.02,47.98,48.00,48.00,48.00, -491, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.30,47.01,47.98,47.99,47.99,47.99, -492, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.29,47.00,47.97,47.98,47.98,47.98, -493, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.29,46.99,47.96,47.98,47.98,47.98, -494, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.28,46.98,47.95,47.97,47.97,47.97, -495, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.28,46.97,47.95,47.96,47.96,47.96, -496, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.27,46.97,47.94,47.95,47.95,47.95, -497, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.26,46.96,47.93,47.94,47.94,47.94, -498, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.26,46.95,47.92,47.94,47.94,47.94, -499, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.25,46.94,47.92,47.93,47.93,47.93, -500, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.24,46.93,47.91,47.92,47.92,47.92, -501, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.24,46.93,47.90,47.91,47.91,47.91, -502, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.23,46.92,47.89,47.91,47.91,47.91, -503, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.23,46.91,47.88,47.90,47.90,47.90, -504, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.22,46.90,47.88,47.89,47.89,47.89, -505, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.21,46.89,47.87,47.88,47.88,47.88, -506, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.21,46.89,47.86,47.88,47.88,47.88, -507, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.20,46.88,47.85,47.87,47.87,47.87, -508, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.20,46.87,47.85,47.86,47.86,47.86, -509, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.19,46.86,47.84,47.85,47.85,47.85, -510, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.18,46.85,47.83,47.84,47.84,47.84, -511, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.18,46.85,47.82,47.84,47.84,47.84, -512, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.17,46.84,47.82,47.83,47.83,47.83, -513, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.16,46.83,47.81,47.82,47.82,47.82, -514, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.16,46.82,47.80,47.81,47.81,47.81, -515, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.15,46.81,47.79,47.81,47.81,47.81, -516, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.15,46.81,47.79,47.80,47.80,47.80, -517, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.14,46.80,47.78,47.79,47.79,47.79, -518, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.13,46.79,47.77,47.78,47.78,47.78, -519, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.13,46.78,47.76,47.78,47.78,47.78, -520, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.12,46.77,47.76,47.77,47.77,47.77, -521, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.11,46.76,47.75,47.76,47.76,47.76, -522, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.11,46.76,47.74,47.75,47.75,47.75, -523, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.10,46.75,47.73,47.75,47.75,47.75, -524, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.10,46.74,47.72,47.74,47.74,47.74, -525, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.09,46.73,47.72,47.73,47.73,47.73, -526, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.08,46.72,47.71,47.72,47.72,47.72, -527, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.08,46.72,47.70,47.72,47.72,47.72, -528, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.07,46.71,47.69,47.71,47.71,47.71, -529, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.07,46.70,47.69,47.70,47.70,47.70, -530, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.06,46.69,47.68,47.69,47.69,47.69, -531, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.05,46.68,47.67,47.68,47.68,47.68, -532, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.05,46.68,47.66,47.68,47.68,47.68, -533, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.04,46.67,47.66,47.67,47.67,47.67, -534, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.03,46.66,47.65,47.66,47.66,47.66, -535, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.03,46.65,47.64,47.65,47.65,47.65, -536, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.02,46.64,47.63,47.65,47.65,47.65, -537, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.02,46.64,47.63,47.64,47.64,47.64, -538, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.01,46.63,47.62,47.63,47.63,47.63, -539, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.00,46.62,47.61,47.62,47.62,47.62, -540, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,43.00,46.61,47.60,47.62,47.62,47.62, -541, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.99,46.60,47.60,47.61,47.61,47.61, -542, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.99,46.60,47.59,47.60,47.60,47.60, -543, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.98,46.59,47.58,47.59,47.59,47.59, -544, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.97,46.58,47.57,47.59,47.59,47.59, -545, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.97,46.57,47.57,47.58,47.58,47.58, -546, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.96,46.56,47.56,47.57,47.57,47.57, -547, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.95,46.56,47.55,47.56,47.56,47.56, -548, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.95,46.55,47.54,47.56,47.56,47.56, -549, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.94,46.54,47.54,47.55,47.55,47.55, -550, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.94,46.53,47.53,47.54,47.54,47.54, -551, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.93,46.52,47.52,47.53,47.53,47.53, -552, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.92,46.52,47.51,47.53,47.53,47.53, -553, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.92,46.51,47.51,47.52,47.52,47.52, -554, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.91,46.50,47.50,47.51,47.51,47.51, -555, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.91,46.49,47.49,47.50,47.50,47.50, -556, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.90,46.49,47.48,47.50,47.50,47.50, -557, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.89,46.48,47.47,47.49,47.49,47.49, -558, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.89,46.47,47.47,47.48,47.48,47.48, -559, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.88,46.46,47.46,47.47,47.47,47.47, -560, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.87,46.45,47.45,47.46,47.46,47.46, -561, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.87,46.45,47.44,47.46,47.46,47.46, -562, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.86,46.44,47.44,47.45,47.45,47.45, -563, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.86,46.43,47.43,47.44,47.44,47.44, -564, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.85,46.42,47.42,47.43,47.43,47.43, -565, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.84,46.41,47.41,47.43,47.43,47.43, -566, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.84,46.41,47.41,47.42,47.42,47.42, -567, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.83,46.40,47.40,47.41,47.41,47.41, -568, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.83,46.39,47.39,47.40,47.40,47.40, -569, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.82,46.38,47.38,47.40,47.40,47.40, -570, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.81,46.37,47.38,47.39,47.39,47.39, -571, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.81,46.37,47.37,47.38,47.38,47.38, -572, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.80,46.36,47.36,47.37,47.37,47.37, -573, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.80,46.35,47.35,47.37,47.37,47.37, -574, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.79,46.34,47.35,47.36,47.36,47.36, -575, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.78,46.34,47.34,47.35,47.35,47.35, -576, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.78,46.33,47.33,47.34,47.34,47.34, -577, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.77,46.32,47.32,47.34,47.34,47.34, -578, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.76,46.31,47.32,47.33,47.33,47.33, -579, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.76,46.30,47.31,47.32,47.32,47.32, -580, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.75,46.30,47.30,47.31,47.31,47.31, -581, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.75,46.29,47.29,47.31,47.31,47.31, -582, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.74,46.28,47.29,47.30,47.30,47.30, -583, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.73,46.27,47.28,47.29,47.29,47.29, -584, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.73,46.26,47.27,47.28,47.28,47.28, -585, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.72,46.26,47.26,47.28,47.28,47.28, -586, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.72,46.25,47.26,47.27,47.27,47.27, -587, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.71,46.24,47.25,47.26,47.26,47.26, -588, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.70,46.23,47.24,47.25,47.25,47.25, -589, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.70,46.23,47.23,47.25,47.25,47.25, -590, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.69,46.22,47.23,47.24,47.24,47.24, -591, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.69,46.21,47.22,47.23,47.23,47.23, -592, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.68,46.20,47.21,47.22,47.22,47.22, -593, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.67,46.19,47.20,47.22,47.22,47.22, -594, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.67,46.19,47.20,47.21,47.21,47.21, -595, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.66,46.18,47.19,47.20,47.20,47.20, -596, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.65,46.17,47.18,47.19,47.19,47.19, -597, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.65,46.16,47.17,47.19,47.19,47.19, -598, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.64,46.15,47.17,47.18,47.18,47.18, -599, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.64,46.15,47.16,47.17,47.17,47.17, -600, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.63,46.14,47.15,47.16,47.16,47.16, -601, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.62,46.13,47.14,47.16,47.16,47.16, -602, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.62,46.12,47.14,47.15,47.15,47.15, -603, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.61,46.12,47.13,47.14,47.14,47.14, -604, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.61,46.11,47.12,47.13,47.13,47.13, -605, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.60,46.10,47.11,47.13,47.13,47.13, -606, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.59,46.09,47.11,47.12,47.12,47.12, -607, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.59,46.08,47.10,47.11,47.11,47.11, -608, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.58,46.08,47.09,47.10,47.10,47.10, -609, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.58,46.07,47.08,47.10,47.10,47.10, -610, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.57,46.06,47.08,47.09,47.09,47.09, -611, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.56,46.05,47.07,47.08,47.08,47.08, -612, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.56,46.05,47.06,47.08,47.08,47.08, -613, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.55,46.04,47.05,47.07,47.07,47.07, -614, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.55,46.03,47.05,47.06,47.06,47.06, -615, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.54,46.02,47.04,47.05,47.05,47.05, -616, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.53,46.01,47.03,47.05,47.05,47.05, -617, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.53,46.01,47.02,47.04,47.04,47.04, -618, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.52,46.00,47.02,47.03,47.03,47.03, -619, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.51,45.99,47.01,47.02,47.02,47.02, -620, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.51,45.98,47.00,47.02,47.02,47.02, -621, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.50,45.98,47.00,47.01,47.01,47.01, -622, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.50,45.97,46.99,47.00,47.00,47.00, -623, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.49,45.96,46.98,46.99,46.99,46.99, -624, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.48,45.95,46.97,46.99,46.99,46.99, -625, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.48,45.95,46.97,46.98,46.98,46.98, -626, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.47,45.94,46.96,46.97,46.97,46.97, -627, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.47,45.93,46.95,46.96,46.96,46.96, -628, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.46,45.92,46.94,46.96,46.96,46.96, -629, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.45,45.91,46.94,46.95,46.95,46.95, -630, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.45,45.91,46.93,46.94,46.94,46.94, -631, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.02,43.29,46.77,46.93,46.93,46.93,46.94 -632, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.78,40.24,45.87,46.92,46.93,46.93,46.93 -633, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.03,36.43,44.14,46.86,46.92,46.92,46.93 -634, 19.722222, 51.666667, 14.444444, 0.900000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.76,34.13,42.88,46.68,46.91,46.91,46.92 -635, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.13,34.60,42.87,46.67,46.90,46.90, -636, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.79,35.79,42.86,46.66,46.89,46.89, -637, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.21,37.21,42.85,46.66,46.88,46.88, -638, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.64,38.64,42.84,46.65,46.88,46.88, -639, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.06,40.06,42.84,46.64,46.87,46.87, -640, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.37,41.37,43.04,46.63,46.86,46.86, -641, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.51,42.51,43.60,46.62,46.85,46.85, -642, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.64,43.64,44.17,46.61,46.84,46.84, -643, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.76,44.76,44.76,46.61,46.84,46.84, -644, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.71,45.71,45.71,46.60,46.83,46.83, -645, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.61,46.61,46.61,46.70,46.82,46.82, -646, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.16,47.16,47.16,47.16,47.16,47.16, -647, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.63,47.63,47.63,47.63,47.63,47.63, -648, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.10,48.10,48.10,48.10,48.10,48.10, -649, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.57,48.57,48.57,48.57,48.57,48.57, -650, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.03,49.03,49.03,49.03,49.03,49.03, -651, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.50,49.50,49.50,49.50,49.50,49.50, -652, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.97,49.97,49.97,49.97,49.97,49.97, -653, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.43,50.43,50.43,50.43,50.43,50.43, -654, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.90,50.90,50.90,50.90,50.90,50.90, -655, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.37,51.37,51.37,51.37,51.37,51.37, -656, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,48.90,48.90,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -657, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -658, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -659, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -660, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -661, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -662, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -663, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -664, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -665, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -666, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -667, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -668, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -669, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -670, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -671, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -672, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -673, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -674, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -675, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -676, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -677, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -678, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -679, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -680, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -681, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -682, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -683, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -684, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -685, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -686, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -687, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -688, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -689, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -690, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -691, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.57,49.62,51.38,51.38,51.38,51.38,51.39 -692, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,46.75,50.87,51.37,51.37,51.37,51.38 -693, 19.722222, 51.666667, 14.444444, 0.600000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,43.98,50.40,51.36,51.36,51.36,51.37 -694, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,43.98,50.39,51.35,51.35,51.35, -695, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.97,50.37,51.34,51.34,51.34, -696, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.97,50.36,51.33,51.33,51.33, -697, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.96,50.35,51.33,51.33,51.33, -698, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.96,50.33,51.32,51.32,51.32, -699, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.95,50.32,51.31,51.31,51.31, -700, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.95,50.30,51.30,51.30,51.30, -701, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.94,50.29,51.29,51.29,51.29, -702, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.94,50.28,51.28,51.28,51.28, -703, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.94,50.26,51.27,51.27,51.27, -704, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.93,50.25,51.26,51.26,51.26, -705, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.93,50.24,51.25,51.25,51.25, -706, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.92,50.22,51.25,51.25,51.25, -707, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.92,50.21,51.24,51.24,51.24, -708, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.91,50.20,51.23,51.23,51.23, -709, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.91,50.19,51.22,51.22,51.22, -710, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.90,50.17,51.21,51.21,51.21, -711, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.90,50.16,51.20,51.20,51.20, -712, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,43.89,50.15,51.19,51.19,51.19, -713, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.89,50.13,51.18,51.18,51.18, -714, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.88,50.12,51.18,51.18,51.18, -715, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.88,50.11,51.17,51.17,51.17, -716, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.87,50.09,51.16,51.16,51.16, -717, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.87,50.08,51.15,51.15,51.15, -718, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.86,50.07,51.14,51.14,51.14, -719, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.86,50.05,51.13,51.13,51.13, -720, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,43.85,50.04,51.12,51.12,51.12, -721, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.97,51.07,51.11,51.11,51.12 -722, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.95,51.06,51.10,51.10, -723, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.94,51.05,51.09,51.09, -724, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.93,51.04,51.09,51.09, -725, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.92,48.91,51.03,51.08,51.08, -726, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.90,51.03,51.07,51.07, -727, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.89,51.02,51.06,51.06, -728, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.87,51.01,51.05,51.05, -729, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.86,51.00,51.04,51.04, -730, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.91,48.85,50.99,51.03,51.03, -731, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.90,48.83,50.98,51.02,51.02, -732, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.90,48.82,50.97,51.01,51.01, -733, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.90,48.81,50.96,51.00,51.00, -734, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.98,40.90,48.79,50.95,50.99,50.99, -735, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.90,48.78,50.94,50.99,50.99, -736, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.89,48.77,50.94,50.98,50.98, -737, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.89,48.76,50.93,50.97,50.97, -738, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.89,48.74,50.92,50.96,50.96, -739, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.89,48.73,50.91,50.95,50.95, -740, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.88,48.72,50.90,50.94,50.94, -741, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.88,48.70,50.89,50.93,50.93, -742, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.88,48.69,50.88,50.92,50.92, -743, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.88,48.68,50.87,50.91,50.91, -744, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.87,48.67,50.86,50.90,50.90, -745, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.87,48.65,50.85,50.90,50.90, -746, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.87,48.64,50.85,50.89,50.89, -747, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.87,48.63,50.84,50.88,50.88, -748, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.86,48.61,50.83,50.87,50.87, -749, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.86,48.60,50.82,50.86,50.86, -750, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.86,48.59,50.81,50.85,50.85, -751, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.86,48.58,50.80,50.84,50.84, -752, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.85,48.56,50.79,50.83,50.83, -753, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.85,48.55,50.78,50.82,50.82, -754, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.85,48.54,50.77,50.81,50.81, -755, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.84,48.53,50.76,50.81,50.81, -756, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.84,48.51,50.76,50.80,50.80, -757, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.84,48.50,50.75,50.79,50.79, -758, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.84,48.49,50.74,50.78,50.78, -759, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.83,48.48,50.73,50.77,50.77, -760, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.83,48.46,50.72,50.76,50.76, -761, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.83,48.45,50.71,50.75,50.75, -762, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.82,48.44,50.70,50.74,50.74, -763, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.82,48.43,50.69,50.73,50.73, -764, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.82,48.42,50.68,50.72,50.72, -765, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.99,40.82,48.40,50.67,50.72,50.72, -766, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.00,38.10,47.08,50.51,50.71,50.71,50.72 -767, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.85,38.10,47.07,50.50,50.70,50.70, -768, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.86,38.94,47.06,50.49,50.69,50.69, -769, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.32,40.32,47.04,50.48,50.68,50.68, -770, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.74,41.74,47.03,50.47,50.67,50.67, -771, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.81,40.99,45.85,50.16,50.66,50.66,50.67 -772, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.32,42.32,45.84,50.15,50.65,50.65, -773, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.74,43.74,45.84,50.14,50.64,50.64, -774, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.94,44.94,46.26,50.13,50.63,50.63, -775, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.07,46.07,46.83,50.12,50.62,50.62, -776, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.21,47.21,47.39,50.11,50.61,50.61, -777, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.21,48.21,48.21,50.10,50.60,50.60, -778, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.16,49.16,49.16,50.09,50.59,50.59, -779, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.04,50.04,50.04,50.25,50.58,50.58, -780, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.72,50.72,50.72,50.72,50.72,50.72, -781, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.19,51.19,51.19,51.19,51.19,51.19, -782, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.66,51.66,51.66,51.66,51.66,51.66, -783, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,3.16,3.16,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -784, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -785, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -786, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -787, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -788, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -789, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -790, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -791, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -792, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -793, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -794, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -795, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -796, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -797, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -798, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -799, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -800, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -801, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -802, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -803, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -804, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -805, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -806, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -807, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -808, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -809, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -810, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -811, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -812, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -813, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -814, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -815, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -816, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -817, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -818, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, -819, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, -820, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, -821, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, -822, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, -823, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, -824, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, -825, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, -826, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, -827, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, -828, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, -829, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, -830, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, -831, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, -832, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, -833, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, -834, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, -835, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, -836, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, -837, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, -838, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, -839, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, -840, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, -841, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, -842, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, -843, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, -844, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, -845, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, -846, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, -847, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, -848, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, -849, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, -850, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, -851, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, -852, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, -853, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, -854, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, -855, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, -856, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, -857, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, -858, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, -859, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, -860, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, -861, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, -862, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, -863, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, -864, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, -865, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, -866, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, -867, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, -868, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, -869, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, -870, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, -871, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, -872, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, -873, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, -874, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, -875, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, -876, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, -877, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, -878, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, -879, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, -880, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, -881, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, -882, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, -883, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, -884, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, -885, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, -886, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, -887, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, -888, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, -889, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, -890, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, -891, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, -892, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, -893, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, -894, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, -895, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, -896, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, -897, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, -898, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, -899, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, -900, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, -901, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, -902, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, -903, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, -904, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, -905, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, -906, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, -907, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, -908, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, -909, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, -910, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, -911, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, -912, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, -913, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, -914, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, -915, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, -916, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, -917, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, -918, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, -919, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, -920, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, -921, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, -922, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, -923, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, -924, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, -925, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, -926, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, -927, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, -928, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, -929, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, -930, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, -931, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, -932, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, -933, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, -934, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, -935, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, -936, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, -937, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, -938, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, -939, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, -940, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, -941, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, -942, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, -943, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, -944, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, -945, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, -946, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, -947, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, -948, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, -949, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, -950, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, -951, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, -952, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, -953, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, -954, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, -955, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, -956, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, -957, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, -958, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, -959, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, -960, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, -961, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, -962, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, -963, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, -964, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, -965, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, -966, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, -967, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, -968, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, -969, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, -970, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, -971, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, -972, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, -973, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, -974, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, -975, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, -976, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.63,49.00,50.11,50.11,50.11,50.11,50.12 -977, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.60,47.27,49.91,50.10,50.10,50.10,50.11 -978, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.60,47.26,49.90,50.09,50.09,50.09, -979, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.59,47.26,49.89,50.08,50.08,50.08, -980, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.59,47.25,49.88,50.07,50.07,50.07, -981, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.58,47.24,49.87,50.07,50.07,50.07, -982, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.58,47.24,49.86,50.06,50.06,50.06, -983, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.58,47.23,49.85,50.05,50.05,50.05, -984, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.57,47.23,49.84,50.04,50.04,50.04, -985, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.57,47.22,49.83,50.03,50.03,50.03, -986, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.56,47.21,49.82,50.02,50.02,50.02, -987, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.56,47.21,49.81,50.01,50.01,50.01, -988, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.55,47.20,49.80,50.01,50.01,50.01, -989, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.55,47.20,49.79,50.00,50.00,50.00, -990, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.54,47.19,49.78,49.99,49.99,49.99, -991, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.54,47.18,49.77,49.98,49.98,49.98, -992, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.54,47.18,49.76,49.97,49.97,49.97, -993, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.53,47.17,49.75,49.96,49.96,49.96, -994, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.53,47.17,49.74,49.96,49.96,49.96, -995, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.52,47.16,49.73,49.95,49.95,49.95, -996, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.52,47.15,49.72,49.94,49.94,49.94, -997, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.51,47.15,49.71,49.93,49.93,49.93, -998, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.51,47.14,49.70,49.92,49.92,49.92, -999, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.50,47.13,49.69,49.91,49.91,49.91, -1000, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.50,47.13,49.68,49.91,49.91,49.91, -1001, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.50,47.12,49.67,49.90,49.90,49.90, -1002, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.49,47.11,49.66,49.89,49.89,49.89, -1003, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.49,47.11,49.65,49.88,49.88,49.88, -1004, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.10,49.64,49.87,49.87,49.87, -1005, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.10,49.63,49.86,49.86,49.86, -1006, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.35,43.94,48.89,49.86,49.86,49.86,49.86 -1007, 19.722222, 51.666667, 14.444444, 0.300000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.93,48.62,49.83,49.85,49.85,49.86 -1008, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.93,48.61,49.83,49.84,49.84, -1009, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.93,48.60,49.82,49.83,49.83, -1010, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.93,48.58,49.81,49.82,49.82, -1011, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.86,41.92,48.57,49.80,49.81,49.81, -1012, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.92,48.56,49.79,49.80,49.80, -1013, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.92,48.54,49.78,49.79,49.79, -1014, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.92,48.53,49.78,49.79,49.79, -1015, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.92,48.52,49.77,49.78,49.78, -1016, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.91,48.50,49.76,49.77,49.77, -1017, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.91,48.49,49.75,49.76,49.76, -1018, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.91,48.48,49.74,49.75,49.75, -1019, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.85,41.91,48.47,49.74,49.74,49.74, -1020, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,34.84,41.90,48.45,49.73,49.73,49.73, -1021, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.06,38.63,46.50,49.60,49.73,49.73,49.73 -1022, 19.722222, 51.666667, 14.444444, 1.300000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.07,36.09,44.55,49.29,49.72,49.72,49.73 -1023, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.71,36.29,44.54,49.28,49.71,49.71, -1024, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.42,37.42,44.53,49.27,49.70,49.70, -1025, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.85,38.85,44.53,49.26,49.69,49.69, -1026, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.27,40.27,44.52,49.25,49.68,49.68, -1027, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.69,41.69,44.51,49.24,49.67,49.67, -1028, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.96,42.96,44.81,49.23,49.66,49.66, -1029, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.09,44.09,45.37,49.22,49.65,49.65, -1030, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.23,45.23,45.94,49.21,49.64,49.64, -1031, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.36,46.36,46.50,49.20,49.63,49.63, -1032, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.35,47.35,47.35,49.19,49.62,49.62, -1033, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.29,48.29,48.29,49.18,49.61,49.61, -1034, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.18,49.18,49.18,49.34,49.61,49.61, -1035, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.82,49.82,49.82,49.82,49.82,49.82, -1036, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.28,50.28,50.28,50.28,50.28,50.28, -1037, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.75,50.75,50.75,50.75,50.75,50.75, -1038, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.22,51.22,51.22,51.22,51.22,51.22, -1039, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,72.48,72.48,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -1040, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1041, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -1042, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -1043, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -1044, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -1045, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -1046, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -1047, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -1048, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -1049, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -1050, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -1051, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -1052, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -1053, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -1054, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -1055, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -1056, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -1057, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -1058, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -1059, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -1060, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -1061, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -1062, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -1063, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -1064, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -1065, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -1066, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -1067, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -1068, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -1069, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -1070, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -1071, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -1072, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -1073, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -1074, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, -1075, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, -1076, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, -1077, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, -1078, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, -1079, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, -1080, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, -1081, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, -1082, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, -1083, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, -1084, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, -1085, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, -1086, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, -1087, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, -1088, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, -1089, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, -1090, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, -1091, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, -1092, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, -1093, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, -1094, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, -1095, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, -1096, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, -1097, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, -1098, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, -1099, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, -1100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, -1101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, -1102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, -1103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, -1104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, -1105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, -1106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, -1107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, -1108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, -1109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, -1110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, -1111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, -1112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, -1113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, -1114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, -1115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, -1116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, -1117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, -1118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, -1119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, -1120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, -1121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, -1122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, -1123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, -1124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, -1125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, -1126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, -1127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, -1128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, -1129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, -1130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, -1131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, -1132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, -1133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, -1134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, -1135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, -1136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, -1137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, -1138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, -1139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, -1140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, -1141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, -1142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, -1143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, -1144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, -1145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, -1146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, -1147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, -1148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, -1149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, -1150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, -1151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, -1152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, -1153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, -1154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, -1155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, -1156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, -1157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, -1158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, -1159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, -1160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, -1161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, -1162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, -1163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, -1164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, -1165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, -1166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, -1167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, -1168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, -1169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, -1170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, -1171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, -1172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, -1173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, -1174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, -1175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, -1176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, -1177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, -1178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, -1179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, -1180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, -1181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, -1182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, -1183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, -1184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, -1185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, -1186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, -1187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, -1188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, -1189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, -1190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, -1191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, -1192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, -1193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, -1194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, -1195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, -1196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, -1197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, -1198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, -1199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, -1200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, -1201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, -1202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, -1203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, -1204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, -1205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, -1206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, -1207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, -1208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, -1209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, -1210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, -1211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, -1212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, -1213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, -1214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, -1215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, -1216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, -1217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, -1218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, -1219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, -1220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, -1221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, -1222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, -1223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, -1224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, -1225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, -1226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, -1227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, -1228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, -1229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, -1230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, -1231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, -1232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, -1233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, -1234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, -1235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, -1236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, -1237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, -1238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, -1239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, -1240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, -1241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, -1242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, -1243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, -1244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, -1245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, -1246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, -1247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, -1248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, -1249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, -1250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, -1251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, -1252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, -1253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, -1254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, -1255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, -1256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, -1257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, -1258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, -1259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, -1260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, -1261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, -1262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, -1263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, -1264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, -1265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, -1266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, -1267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, -1268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, -1269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, -1270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, -1271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, -1272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, -1273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, -1274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, -1275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, -1276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, -1277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, -1278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, -1279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, -1280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, -1281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, -1282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, -1283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, -1284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, -1285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, -1286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, -1287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, -1288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, -1289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, -1290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, -1291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, -1292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, -1293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, -1294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, -1295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, -1296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, -1297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, -1298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, -1299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, -1300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, -1301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, -1302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, -1303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, -1304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, -1305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, -1306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, -1307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, -1308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, -1309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, -1310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, -1311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, -1312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, -1313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, -1314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, -1315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, -1316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, -1317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, -1318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, -1319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, -1320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, -1321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, -1322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, -1323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, -1324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, -1325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, -1326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, -1327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, -1328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, -1329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, -1330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, -1331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, -1332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, -1333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, -1334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, -1335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, -1336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, -1337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, -1338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, -1339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, -1340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, -1341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, -1342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, -1343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, -1344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, -1345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, -1346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, -1347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, -1348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, -1349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, -1350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, -1351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, -1352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, -1353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, -1354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, -1355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, -1356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, -1357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, -1358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, -1359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, -1360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, -1361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, -1362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, -1363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, -1364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, -1365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, -1366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, -1367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, -1368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, -1369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, -1370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, -1371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, -1372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, -1373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, -1374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, -1375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, -1376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, -1377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, -1378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, -1379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, -1380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, -1381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, -1382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, -1383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, -1384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, -1385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, -1386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, -1387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, -1388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, -1389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, -1390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, -1391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, -1392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, -1393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, -1394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, -1395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, -1396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, -1397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, -1398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, -1399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, -1400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, -1401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, -1402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, -1403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, -1404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, -1405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, -1406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, -1407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, -1408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, -1409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, -1410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, -1411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, -1412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, -1413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, -1414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, -1415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, -1416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, -1417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, -1418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, -1419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, -1420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, -1421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, -1422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.48,48.63,48.63,48.63,48.63,48.63, -1423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.47,48.62,48.63,48.63,48.63,48.63, -1424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.46,48.62,48.62,48.62,48.62,48.62, -1425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.45,48.61,48.61,48.61,48.61,48.61, -1426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.44,48.60,48.60,48.60,48.60,48.60, -1427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.43,48.59,48.60,48.60,48.60,48.60, -1428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.42,48.59,48.59,48.59,48.59,48.59, -1429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.41,48.58,48.58,48.58,48.58,48.58, -1430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.40,48.57,48.57,48.57,48.57,48.57, -1431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.39,48.56,48.57,48.57,48.57,48.57, -1432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.38,48.56,48.56,48.56,48.56,48.56, -1433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.37,48.55,48.55,48.55,48.55,48.55, -1434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.36,48.54,48.54,48.54,48.54,48.54, -1435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.35,48.53,48.54,48.54,48.54,48.54, -1436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.34,48.52,48.53,48.53,48.53,48.53, -1437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.52,48.52,48.52,48.52,48.52, -1438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.51,48.51,48.51,48.51,48.51, -1439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.32,48.50,48.51,48.51,48.51,48.51, diff --git a/test/24hr67_medium_Preset_Rheem2020Build40.csv b/test/24hr67_medium_Preset_Rheem2020Build40.csv deleted file mode 100644 index 386fb6f0..00000000 --- a/test/24hr67_medium_Preset_Rheem2020Build40.csv +++ /dev/null @@ -1,1441 +0,0 @@ -minutes,Ta,Tsetpoint,inletT,draw,DRstatus,h_src1In (Wh),h_src1Out (Wh),h_src2In (Wh),h_src2Out (Wh),h_src3In (Wh),h_src3Out (Wh),tcouple1 (C),tcouple2 (C),tcouple3 (C),tcouple4 (C),tcouple5 (C),tcouple6 (C), toutlet (C) -0, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.88,49.90,51.65,51.65,51.65,51.65,51.66 -2, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,47.04,51.14,51.64,51.64,51.64,51.65 -3, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.93,42.61,49.84,51.63,51.63,51.63,51.64 -4, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.38,37.77,47.72,51.46,51.62,51.62,51.63 -5, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.16,33.84,44.76,50.90,51.61,51.61,51.62 -6, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.64,31.34,41.30,49.76,51.55,51.60,51.61 -7, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.06,29.78,37.83,47.94,51.32,51.59,51.60 -8, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.53,28.71,34.80,45.46,50.77,51.56,51.59 -9, 19.722222, 51.666667, 14.444444, 1.400000, 1,0.00,0.00,75.00,75.00,0.00,0.00,28.37,28.37,32.81,43.06,49.92,51.48,51.57 -10, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.79,29.79,32.82,43.06,49.91,51.47, -11, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.10,31.10,33.04,43.05,49.90,51.46, -12, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.24,32.24,33.61,43.04,49.89,51.44, -13, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.38,33.38,34.18,43.03,49.88,51.43, -14, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.52,34.52,34.75,43.02,49.87,51.42, -15, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.54,35.54,35.54,43.01,49.86,51.41, -16, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.49,36.49,36.49,43.01,49.85,51.39, -17, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.44,37.44,37.44,43.00,49.84,51.38, -18, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.38,38.38,38.38,43.00,49.83,51.37, -19, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.33,39.33,39.33,42.99,49.82,51.35, -20, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.28,40.28,40.28,42.99,49.81,51.34, -21, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.12,41.12,41.12,43.30,49.80,51.33, -22, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.93,41.93,41.93,43.70,49.79,51.32, -23, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.74,42.74,42.74,44.10,49.78,51.30, -24, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.55,43.55,43.55,44.51,49.77,51.29, -25, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.35,44.35,44.35,44.91,49.75,51.28, -26, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.16,45.16,45.16,45.31,49.74,51.27, -27, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.91,45.91,45.91,45.91,49.73,51.25, -28, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.61,46.61,46.61,46.61,49.72,51.24, -29, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.32,47.32,47.32,47.32,49.71,51.23, -30, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.03,48.03,48.03,48.03,49.71,51.22, -31, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.22,47.09,48.02,48.02,49.28,51.10,51.22 -32, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.69,46.03,47.85,48.01,48.94,50.88,51.20 -33, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.78,46.78,47.85,48.01,48.94,50.87, -34, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.06,48.06,48.06,48.06,48.93,50.86, -35, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.72,48.72,48.72,48.72,49.10,50.84, -36, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.34,49.34,49.34,49.34,49.41,50.83, -37, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.92,49.92,49.92,49.92,49.92,50.82, -38, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.48,50.48,50.48,50.48,50.48,50.80, -39, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.00,51.00,51.00,51.00,51.00,51.00, -40, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.47,51.47,51.47,51.47,51.47,51.47, -41, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,32.50,32.50,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -42, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -43, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -44, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -45, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -46, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -47, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -48, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -49, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -50, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -51, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -52, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -53, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -54, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -55, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -56, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -57, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -58, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -59, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -60, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -61, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -62, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -63, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -64, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -65, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -66, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -67, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -68, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -69, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -70, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -71, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -72, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -73, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -74, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -75, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -76, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, -77, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, -78, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, -79, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, -80, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, -81, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, -82, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, -83, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, -84, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, -85, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, -86, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, -87, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, -88, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, -89, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, -90, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, -91, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, -92, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, -93, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, -94, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, -95, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, -96, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, -97, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, -98, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, -99, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, -100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, -101, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.34,49.41,51.17,51.18,51.18,51.18,51.18 -102, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,46.54,50.66,51.17,51.17,51.17,51.18 -103, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,30.63,42.14,49.36,51.16,51.16,51.16,51.17 -104, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.15,37.36,47.25,50.99,51.15,51.15,51.16 -105, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,29.98,33.51,44.30,50.42,51.14,51.14,51.15 -106, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.01,32.64,43.28,50.08,51.11,51.13,51.14 -107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.75,33.75,43.27,50.07,51.10,51.12, -108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.17,35.17,43.26,50.06,51.10,51.11, -109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.60,36.60,43.25,50.05,51.09,51.10, -110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.02,38.02,43.25,50.04,51.08,51.09, -111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.44,39.44,43.24,50.03,51.07,51.08, -112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.79,40.79,43.40,50.01,51.06,51.07, -113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.92,41.92,43.96,50.00,51.05,51.06, -114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.06,43.06,44.52,49.99,51.04,51.05, -115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.19,44.19,45.09,49.98,51.03,51.04, -116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.33,45.33,45.65,49.97,51.02,51.03, -117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.38,46.38,46.38,49.96,51.01,51.02, -118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.32,47.32,47.32,49.95,51.00,51.00, -119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.27,48.27,48.27,49.94,50.99,50.99, -120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.21,49.21,49.21,49.93,50.98,50.98, -121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.02,50.02,50.02,50.32,50.98,50.98, -122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.80,50.80,50.80,50.80,50.97,50.97, -123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.32,51.32,51.32,51.32,51.32,51.32, -124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,55.84,55.84,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, -160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, -161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, -162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, -163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, -164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, -165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, -166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, -167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, -168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, -169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, -170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, -171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, -172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, -173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, -174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, -175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, -176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, -177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, -178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, -179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, -180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, -181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, -182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, -183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, -184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, -185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, -186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, -187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, -188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, -189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, -190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, -191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, -192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, -193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, -194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, -195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, -196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, -197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, -198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, -199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, -200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, -201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, -202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, -203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, -204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, -205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, -206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, -207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, -208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, -209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, -210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, -211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, -212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, -213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, -214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, -215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, -216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, -217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, -218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, -219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, -220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, -221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, -222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, -223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, -224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, -225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, -226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, -227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, -228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, -229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, -230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, -231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, -232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, -233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, -234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, -235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, -236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, -237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, -238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, -239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, -240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, -241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, -242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, -243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, -244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, -245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, -246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, -247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, -248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, -249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, -250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, -251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, -252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, -253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, -254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, -255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, -256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, -257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, -258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, -259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, -260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, -261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, -262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, -263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, -264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, -265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, -266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, -267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, -268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, -269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, -270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, -271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, -272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, -273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, -274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, -275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, -276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, -277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, -278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, -279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, -280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, -281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, -282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, -283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, -284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, -285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, -286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, -287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, -288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, -289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, -290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, -291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, -292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, -293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, -294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, -295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, -296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, -297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, -298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, -299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, -300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, -301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, -302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, -303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, -304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, -305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, -306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, -307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, -308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, -309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, -310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, -311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, -312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, -313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, -314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, -315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, -316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, -317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, -318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, -319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, -320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, -321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, -322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, -323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, -324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, -325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, -326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, -327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, -328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, -329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, -330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, -331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, -332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, -333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, -334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, -335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, -336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, -337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, -338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, -339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, -340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, -341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, -342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, -343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, -344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, -345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, -346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, -347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, -348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, -349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, -350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, -351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, -352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, -353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, -354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, -355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, -356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, -357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, -358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, -359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, -360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, -361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, -362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, -363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, -364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, -365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, -366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, -367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, -368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, -369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, -370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, -371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, -372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, -373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, -374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, -375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, -376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, -377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, -378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, -379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, -380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, -381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, -382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, -383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, -384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, -385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, -386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, -387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, -388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, -389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, -390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, -391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, -392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, -393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, -394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, -395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, -396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, -397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, -398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, -399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, -400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, -401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, -402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, -403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, -404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, -405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, -406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, -407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, -408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, -409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, -410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, -411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, -412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, -413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, -414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, -415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, -416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, -417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, -418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, -419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, -420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, -421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, -422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, -423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, -424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, -425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, -426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, -427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, -428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, -429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, -430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, -431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, -432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, -433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, -434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, -435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, -436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, -437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, -438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, -439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, -440, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, -441, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, -442, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, -443, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, -444, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, -445, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, -446, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, -447, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, -448, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, -449, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, -450, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, -451, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, -452, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, -453, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, -454, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, -455, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, -456, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, -457, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, -458, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, -459, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, -460, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, -461, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, -462, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, -463, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, -464, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, -465, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, -466, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, -467, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, -468, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, -469, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, -470, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, -471, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, -472, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, -473, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, -474, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, -475, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, -476, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, -477, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, -478, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, -479, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, -480, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, -481, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, -482, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, -483, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, -484, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, -485, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, -486, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, -487, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, -488, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, -489, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, -490, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, -491, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, -492, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, -493, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, -494, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, -495, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, -496, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, -497, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, -498, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, -499, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, -500, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, -501, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, -502, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, -503, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, -504, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, -505, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, -506, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, -507, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.48,48.63,48.63,48.63,48.63,48.63, -508, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.47,48.62,48.63,48.63,48.63,48.63, -509, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.46,48.62,48.62,48.62,48.62,48.62, -510, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.45,48.61,48.61,48.61,48.61,48.61, -511, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.44,48.60,48.60,48.60,48.60,48.60, -512, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.43,48.59,48.60,48.60,48.60,48.60, -513, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.42,48.59,48.59,48.59,48.59,48.59, -514, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.41,48.58,48.58,48.58,48.58,48.58, -515, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.40,48.57,48.57,48.57,48.57,48.57, -516, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.39,48.56,48.57,48.57,48.57,48.57, -517, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.38,48.56,48.56,48.56,48.56,48.56, -518, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.37,48.55,48.55,48.55,48.55,48.55, -519, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.36,48.54,48.54,48.54,48.54,48.54, -520, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.35,48.53,48.54,48.54,48.54,48.54, -521, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.34,48.52,48.53,48.53,48.53,48.53, -522, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.52,48.52,48.52,48.52,48.52, -523, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.51,48.51,48.51,48.51,48.51, -524, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.32,48.50,48.51,48.51,48.51,48.51, -525, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.31,48.49,48.50,48.50,48.50,48.50, -526, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.30,48.49,48.49,48.49,48.49,48.49, -527, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.29,48.48,48.48,48.48,48.48,48.48, -528, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.28,48.47,48.47,48.47,48.47,48.47, -529, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.27,48.46,48.47,48.47,48.47,48.47, -530, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.26,48.46,48.46,48.46,48.46,48.46, -531, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.25,48.45,48.45,48.45,48.45,48.45, -532, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.24,48.44,48.44,48.44,48.44,48.44, -533, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.23,48.43,48.44,48.44,48.44,48.44, -534, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.22,48.42,48.43,48.43,48.43,48.43, -535, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.21,48.42,48.42,48.42,48.42,48.42, -536, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.20,48.41,48.41,48.41,48.41,48.41, -537, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.19,48.40,48.41,48.41,48.41,48.41, -538, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.18,48.39,48.40,48.40,48.40,48.40, -539, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.17,48.39,48.39,48.39,48.39,48.39, -540, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.16,48.38,48.38,48.38,48.38,48.38, -541, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.15,48.37,48.38,48.38,48.38,48.38, -542, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.14,48.36,48.37,48.37,48.37,48.37, -543, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.13,48.36,48.36,48.36,48.36,48.36, -544, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.12,48.35,48.35,48.35,48.35,48.35, -545, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.11,48.34,48.35,48.35,48.35,48.35, -546, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.10,48.33,48.34,48.34,48.34,48.34, -547, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.09,48.32,48.33,48.33,48.33,48.33, -548, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.09,48.32,48.32,48.32,48.32,48.32, -549, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.08,48.31,48.32,48.32,48.32,48.32, -550, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.07,48.30,48.31,48.31,48.31,48.31, -551, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.06,48.29,48.30,48.30,48.30,48.30, -552, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.05,48.29,48.29,48.29,48.29,48.29, -553, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.04,48.28,48.29,48.29,48.29,48.29, -554, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.03,48.27,48.28,48.28,48.28,48.28, -555, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.02,48.26,48.27,48.27,48.27,48.27, -556, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.01,48.26,48.26,48.26,48.26,48.26, -557, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.00,48.25,48.26,48.26,48.26,48.26, -558, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.99,48.24,48.25,48.25,48.25,48.25, -559, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.98,48.23,48.24,48.24,48.24,48.24, -560, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.97,48.23,48.23,48.23,48.23,48.23, -561, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.96,48.22,48.23,48.23,48.23,48.23, -562, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.95,48.21,48.22,48.22,48.22,48.22, -563, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.94,48.20,48.21,48.21,48.21,48.21, -564, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.93,48.19,48.20,48.20,48.20,48.20, -565, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.92,48.19,48.20,48.20,48.20,48.20, -566, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.91,48.18,48.19,48.19,48.19,48.19, -567, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.91,48.17,48.18,48.18,48.18,48.18, -568, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.90,48.16,48.17,48.17,48.17,48.17, -569, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.89,48.16,48.17,48.17,48.17,48.17, -570, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.88,48.15,48.16,48.16,48.16,48.16, -571, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.87,48.14,48.15,48.15,48.15,48.15, -572, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.86,48.13,48.14,48.14,48.14,48.14, -573, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.85,48.13,48.14,48.14,48.14,48.14, -574, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.84,48.12,48.13,48.13,48.13,48.13, -575, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.83,48.11,48.12,48.12,48.12,48.12, -576, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.82,48.10,48.11,48.11,48.11,48.11, -577, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.81,48.10,48.11,48.11,48.11,48.11, -578, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.80,48.09,48.10,48.10,48.10,48.10, -579, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.79,48.08,48.09,48.09,48.09,48.09, -580, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.78,48.07,48.08,48.08,48.08,48.08, -581, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.77,48.06,48.08,48.08,48.08,48.08, -582, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.76,48.06,48.07,48.07,48.07,48.07, -583, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.75,48.05,48.06,48.06,48.06,48.06, -584, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.75,48.04,48.06,48.06,48.06,48.06, -585, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.74,48.03,48.05,48.05,48.05,48.05, -586, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.73,48.03,48.04,48.04,48.04,48.04, -587, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.72,48.02,48.03,48.03,48.03,48.03, -588, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.71,48.01,48.03,48.03,48.03,48.03, -589, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.70,48.00,48.02,48.02,48.02,48.02, -590, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.69,48.00,48.01,48.01,48.01,48.01, -591, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.68,47.99,48.00,48.00,48.00,48.00, -592, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.67,47.98,48.00,48.00,48.00,48.00, -593, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.66,47.97,47.99,47.99,47.99,47.99, -594, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.65,47.97,47.98,47.98,47.98,47.98, -595, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.64,47.96,47.97,47.97,47.97,47.97, -596, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.63,47.95,47.97,47.97,47.97,47.97, -597, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.62,47.94,47.96,47.96,47.96,47.96, -598, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.61,47.94,47.95,47.95,47.95,47.95, -599, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.61,47.93,47.94,47.94,47.94,47.94, -600, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.60,47.92,47.94,47.94,47.94,47.94, -601, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.59,47.91,47.93,47.93,47.93,47.93, -602, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.58,47.90,47.92,47.92,47.92,47.92, -603, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.57,47.90,47.91,47.91,47.91,47.91, -604, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.56,47.89,47.91,47.91,47.91,47.91, -605, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.55,47.88,47.90,47.90,47.90,47.90, -606, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.54,47.87,47.89,47.89,47.89,47.89, -607, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.53,47.87,47.88,47.88,47.88,47.88, -608, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.52,47.86,47.88,47.88,47.88,47.88, -609, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.51,47.85,47.87,47.87,47.87,47.87, -610, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.50,47.84,47.86,47.86,47.86,47.86, -611, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,47.84,47.85,47.85,47.85,47.85, -612, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,47.83,47.85,47.85,47.85,47.85, -613, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.48,47.82,47.84,47.84,47.84,47.84, -614, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.47,47.81,47.83,47.83,47.83,47.83, -615, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.46,47.81,47.83,47.83,47.83,47.83, -616, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.45,47.80,47.82,47.82,47.82,47.82, -617, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.44,47.79,47.81,47.81,47.81,47.81, -618, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.43,47.78,47.80,47.80,47.80,47.80, -619, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.42,47.78,47.80,47.80,47.80,47.80, -620, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.41,47.77,47.79,47.79,47.79,47.79, -621, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.40,47.76,47.78,47.78,47.78,47.78, -622, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.39,47.75,47.77,47.77,47.77,47.77, -623, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.38,47.74,47.77,47.77,47.77,47.77, -624, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.38,47.74,47.76,47.76,47.76,47.76, -625, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.37,47.73,47.75,47.75,47.75,47.75, -626, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.36,47.72,47.74,47.74,47.74,47.74, -627, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.35,47.71,47.74,47.74,47.74,47.74, -628, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.34,47.71,47.73,47.73,47.73,47.73, -629, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.33,47.70,47.72,47.72,47.72,47.72, -630, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.32,47.69,47.71,47.71,47.71,47.71, -631, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.83,45.77,47.71,47.71,47.71,47.71,47.71 -632, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.77,42.94,47.18,47.70,47.70,47.70,47.71 -633, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.54,38.91,45.88,47.69,47.69,47.69,47.70 -634, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.99,35.13,43.83,47.52,47.68,47.68,47.69 -635, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,30.29,32.48,41.19,46.95,47.67,47.67,47.68 -636, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.96,32.09,40.33,46.61,47.65,47.67,47.67 -637, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.45,33.45,40.32,46.60,47.64,47.66, -638, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.87,34.87,40.32,46.59,47.63,47.65, -639, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.30,36.30,40.31,46.58,47.63,47.64, -640, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.72,37.72,40.31,46.57,47.62,47.63, -641, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.89,38.89,40.81,46.56,47.61,47.62, -642, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.03,40.03,41.37,46.55,47.60,47.61, -643, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.16,41.16,41.94,46.54,47.59,47.60, -644, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.30,42.30,42.50,46.53,47.58,47.59, -645, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.31,43.31,43.31,46.52,47.58,47.58, -646, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.26,44.26,44.26,46.52,47.57,47.57, -647, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.20,45.20,45.20,46.51,47.56,47.56, -648, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.10,46.10,46.10,46.64,47.55,47.56, -649, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.90,46.90,46.90,47.04,47.54,47.55, -650, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.61,47.61,47.61,47.61,47.61,47.61, -651, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.07,48.07,48.07,48.07,48.07,48.07, -652, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.54,48.54,48.54,48.54,48.54,48.54, -653, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.01,49.01,49.01,49.01,49.01,49.01, -654, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.48,49.48,49.48,49.48,49.48,49.48, -655, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.94,49.94,49.94,49.94,49.94,49.94, -656, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.41,50.41,50.41,50.41,50.41,50.41, -657, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.88,50.88,50.88,50.88,50.88,50.88, -658, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.34,51.34,51.34,51.34,51.34,51.34, -659, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,52.62,52.62,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -660, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -661, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -662, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -663, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -664, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -665, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -666, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -667, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -668, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -669, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -670, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -671, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -672, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -673, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -674, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -675, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -676, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -677, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -678, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -679, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -680, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -681, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -682, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -683, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -684, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -685, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -686, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -687, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -688, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -689, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -690, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -691, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.60,49.65,51.40,51.40,51.40,51.40,51.41 -692, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,46.78,50.89,51.40,51.40,51.40,51.40 -693, 19.722222, 51.666667, 14.444444, 1.600000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.16,42.52,49.67,51.39,51.39,51.39,51.40 -694, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.17,42.51,49.65,51.38,51.38,51.38, -695, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.17,42.50,49.64,51.37,51.37,51.37, -696, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.17,42.50,49.63,51.36,51.36,51.36, -697, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.18,42.49,49.61,51.35,51.35,51.35, -698, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.18,42.48,49.60,51.34,51.34,51.34, -699, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.19,42.48,49.59,51.33,51.33,51.33, -700, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.19,42.47,49.58,51.32,51.32,51.32, -701, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.19,42.47,49.56,51.31,51.31,51.31, -702, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.20,42.46,49.55,51.30,51.30,51.30, -703, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.20,42.45,49.54,51.30,51.30,51.30, -704, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.21,42.45,49.53,51.29,51.29,51.29, -705, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.21,42.44,49.51,51.28,51.28,51.28, -706, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.21,42.43,49.50,51.27,51.27,51.27, -707, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.22,42.43,49.49,51.26,51.26,51.26, -708, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.22,42.42,49.48,51.25,51.25,51.25, -709, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.41,49.46,51.24,51.24,51.24, -710, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.41,49.45,51.23,51.23,51.23, -711, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.23,42.40,49.44,51.22,51.22,51.22, -712, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.39,49.43,51.21,51.21,51.21, -713, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.24,42.39,49.42,51.21,51.21,51.21, -714, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.38,49.40,51.20,51.20,51.20, -715, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.37,49.39,51.19,51.19,51.19, -716, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.25,42.37,49.38,51.18,51.18,51.18, -717, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.36,49.37,51.17,51.17,51.17, -718, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.35,49.35,51.16,51.16,51.16, -719, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.26,42.35,49.34,51.15,51.15,51.15, -720, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,31.27,42.34,49.33,51.14,51.14,51.14, -721, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,32.84,38.79,48.15,51.03,51.13,51.13,51.14 -722, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.69,38.79,48.14,51.02,51.12,51.12, -723, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.23,39.10,48.12,51.01,51.11,51.11, -724, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.09,40.09,48.11,51.00,51.11,51.11, -725, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.51,41.51,48.10,50.99,51.10,51.10, -726, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.93,42.93,48.08,50.98,51.09,51.09, -727, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.35,44.35,48.07,50.97,51.08,51.08, -728, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.77,45.77,48.07,50.96,51.07,51.07, -729, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.05,47.05,48.34,50.96,51.06,51.06, -730, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.18,48.18,48.90,50.95,51.05,51.05, -731, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.32,49.32,49.46,50.94,51.04,51.04, -732, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.31,50.31,50.31,50.93,51.03,51.03, -733, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.12,51.12,51.12,51.12,51.12,51.12, -734, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.59,51.59,51.59,51.59,51.59,51.59, -735, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,14.25,14.25,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -736, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -737, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -738, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -739, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -740, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -741, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -742, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -743, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -744, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -745, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -746, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -747, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -748, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -749, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -750, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -751, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -752, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -753, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -754, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -755, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -756, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -757, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -758, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -759, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -760, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -761, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -762, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -763, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -764, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -765, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -766, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.19,50.37,51.41,51.41,51.41,51.41,51.42 -767, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.18,50.37,51.40,51.40,51.40,51.40, -768, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.17,50.36,51.39,51.40,51.40,51.40, -769, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.16,50.35,51.38,51.39,51.39,51.39, -770, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.15,50.35,51.37,51.38,51.38,51.38, -771, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.63,51.19,51.37,51.37,51.37,51.38 -772, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.62,51.18,51.36,51.36,51.36, -773, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.62,51.17,51.35,51.35,51.35, -774, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.61,51.16,51.34,51.34,51.34, -775, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.87,48.60,51.15,51.33,51.33,51.33, -776, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.87,48.60,51.14,51.33,51.33,51.33, -777, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.86,48.59,51.13,51.32,51.32,51.32, -778, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.86,48.59,51.12,51.31,51.31,51.31, -779, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.85,48.58,51.11,51.30,51.30,51.30, -780, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.85,48.57,51.10,51.29,51.29,51.29, -781, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.84,48.57,51.09,51.28,51.28,51.28, -782, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.84,48.56,51.08,51.27,51.27,51.27, -783, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.83,48.55,51.07,51.26,51.26,51.26, -784, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.83,48.55,51.06,51.26,51.26,51.26, -785, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.82,48.54,51.05,51.25,51.25,51.25, -786, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.82,48.54,51.04,51.24,51.24,51.24, -787, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.81,48.53,51.03,51.23,51.23,51.23, -788, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.81,48.52,51.02,51.22,51.22,51.22, -789, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.80,48.52,51.01,51.21,51.21,51.21, -790, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.80,48.51,51.00,51.20,51.20,51.20, -791, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.79,48.50,50.99,51.19,51.19,51.19, -792, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.79,48.50,50.98,51.19,51.19,51.19, -793, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.78,48.49,50.97,51.18,51.18,51.18, -794, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.78,48.48,50.96,51.17,51.17,51.17, -795, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.77,48.48,50.95,51.16,51.16,51.16, -796, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.77,48.47,50.94,51.15,51.15,51.15, -797, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.76,48.46,50.93,51.14,51.14,51.14, -798, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.76,48.46,50.92,51.13,51.13,51.13, -799, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.75,48.45,50.91,51.12,51.12,51.12, -800, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.75,48.44,50.90,51.12,51.12,51.12, -801, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.74,48.44,50.89,51.11,51.11,51.11, -802, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.74,48.43,50.88,51.10,51.10,51.10, -803, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.42,50.87,51.09,51.09,51.09, -804, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.41,50.86,51.08,51.08,51.08, -805, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.73,48.41,50.85,51.07,51.07,51.07, -806, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.72,48.40,50.84,51.06,51.06,51.06, -807, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.72,48.39,50.83,51.06,51.06,51.06, -808, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.71,48.39,50.82,51.05,51.05,51.05, -809, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.71,48.38,50.81,51.04,51.04,51.04, -810, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.70,48.37,50.80,51.03,51.03,51.03, -811, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.70,48.37,50.79,51.02,51.02,51.02, -812, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.69,48.36,50.78,51.01,51.01,51.01, -813, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.69,48.35,50.77,51.00,51.00,51.00, -814, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.34,50.76,50.99,50.99,50.99, -815, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.34,50.75,50.99,50.99,50.99, -816, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.68,48.33,50.74,50.98,50.98,50.98, -817, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.67,48.32,50.73,50.97,50.97,50.97, -818, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.67,48.31,50.72,50.96,50.96,50.96, -819, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.66,48.31,50.71,50.95,50.95,50.95, -820, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.66,48.30,50.70,50.94,50.94,50.94, -821, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.65,48.29,50.69,50.93,50.93,50.93, -822, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.65,48.29,50.68,50.93,50.93,50.93, -823, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.64,48.28,50.67,50.92,50.92,50.92, -824, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.64,48.27,50.66,50.91,50.91,50.91, -825, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.26,50.65,50.90,50.90,50.90, -826, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.26,50.64,50.89,50.89,50.89, -827, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.63,48.25,50.63,50.88,50.88,50.88, -828, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.62,48.24,50.62,50.87,50.87,50.87, -829, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.62,48.23,50.61,50.86,50.86,50.86, -830, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.61,48.23,50.60,50.86,50.86,50.86, -831, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.61,48.22,50.59,50.85,50.85,50.85, -832, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.21,50.58,50.84,50.84,50.84, -833, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.20,50.57,50.83,50.83,50.83, -834, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.60,48.20,50.56,50.82,50.82,50.82, -835, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.59,48.19,50.55,50.81,50.81,50.81, -836, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.59,48.18,50.55,50.80,50.80,50.80, -837, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.58,48.17,50.54,50.80,50.80,50.80, -838, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.58,48.17,50.53,50.79,50.79,50.79, -839, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.16,50.52,50.78,50.78,50.78, -840, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.15,50.51,50.77,50.77,50.77, -841, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.57,48.14,50.50,50.76,50.76,50.76, -842, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.56,48.14,50.49,50.75,50.75,50.75, -843, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.56,48.13,50.48,50.74,50.74,50.74, -844, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.55,48.12,50.47,50.74,50.74,50.74, -845, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.55,48.11,50.46,50.73,50.73,50.73, -846, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.10,50.45,50.72,50.72,50.72, -847, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.10,50.44,50.71,50.71,50.71, -848, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.54,48.09,50.43,50.70,50.70,50.70, -849, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.53,48.08,50.42,50.69,50.69,50.69, -850, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.53,48.07,50.41,50.68,50.68,50.68, -851, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.52,48.07,50.40,50.67,50.67,50.67, -852, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.52,48.06,50.39,50.67,50.67,50.67, -853, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.05,50.39,50.66,50.66,50.66, -854, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.04,50.38,50.65,50.65,50.65, -855, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.51,48.03,50.37,50.64,50.64,50.64, -856, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.50,48.03,50.36,50.63,50.63,50.63, -857, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.50,48.02,50.35,50.62,50.62,50.62, -858, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.01,50.34,50.61,50.61,50.61, -859, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.00,50.33,50.61,50.61,50.61, -860, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.49,48.00,50.32,50.60,50.60,50.60, -861, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.48,47.99,50.31,50.59,50.59,50.59, -862, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.48,47.98,50.30,50.58,50.58,50.58, -863, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.47,47.97,50.29,50.57,50.57,50.57, -864, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.47,47.96,50.28,50.56,50.56,50.56, -865, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.96,50.28,50.55,50.55,50.55, -866, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.95,50.27,50.55,50.55,50.55, -867, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.46,47.94,50.26,50.54,50.54,50.54, -868, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.45,47.93,50.25,50.53,50.53,50.53, -869, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.45,47.92,50.24,50.52,50.52,50.52, -870, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.92,50.23,50.51,50.51,50.51, -871, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.91,50.22,50.50,50.50,50.50, -872, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.44,47.90,50.21,50.49,50.49,50.49, -873, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.43,47.89,50.20,50.49,50.49,50.49, -874, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.43,47.88,50.19,50.48,50.48,50.48, -875, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.88,50.18,50.47,50.47,50.47, -876, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.87,50.17,50.46,50.46,50.46, -877, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.42,47.86,50.17,50.45,50.45,50.45, -878, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.41,47.85,50.16,50.44,50.44,50.44, -879, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.41,47.84,50.15,50.43,50.43,50.43, -880, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.84,50.14,50.43,50.43,50.43, -881, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.83,50.13,50.42,50.42,50.42, -882, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.40,47.82,50.12,50.41,50.41,50.41, -883, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.39,47.81,50.11,50.40,50.40,50.40, -884, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.39,47.80,50.10,50.39,50.39,50.39, -885, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.79,50.09,50.38,50.38,50.38, -886, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.79,50.08,50.37,50.37,50.37, -887, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.38,47.78,50.08,50.37,50.37,50.37, -888, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.37,47.77,50.07,50.36,50.36,50.36, -889, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.37,47.76,50.06,50.35,50.35,50.35, -890, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.75,50.05,50.34,50.34,50.34, -891, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.75,50.04,50.33,50.33,50.33, -892, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.36,47.74,50.03,50.32,50.32,50.32, -893, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.35,47.73,50.02,50.31,50.31,50.31, -894, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.35,47.72,50.01,50.31,50.31,50.31, -895, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.71,50.00,50.30,50.30,50.30, -896, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.70,50.00,50.29,50.29,50.29, -897, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.34,47.70,49.99,50.28,50.28,50.28, -898, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.33,47.69,49.98,50.27,50.27,50.27, -899, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.33,47.68,49.97,50.26,50.26,50.26, -900, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.67,49.96,50.26,50.26,50.26, -901, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.66,49.95,50.25,50.25,50.25, -902, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.32,47.65,49.94,50.24,50.24,50.24, -903, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.31,47.65,49.93,50.23,50.23,50.23, -904, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.31,47.64,49.92,50.22,50.22,50.22, -905, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.63,49.92,50.21,50.21,50.21, -906, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.62,49.91,50.20,50.20,50.20, -907, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.30,47.61,49.90,50.20,50.20,50.20, -908, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.29,47.60,49.89,50.19,50.19,50.19, -909, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.29,47.60,49.88,50.18,50.18,50.18, -910, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.59,49.87,50.17,50.17,50.17, -911, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.58,49.86,50.16,50.16,50.16, -912, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.28,47.57,49.85,50.15,50.15,50.15, -913, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.27,47.56,49.85,50.14,50.14,50.14, -914, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.27,47.56,49.84,50.14,50.14,50.14, -915, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.55,49.83,50.13,50.13,50.13, -916, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.54,49.82,50.12,50.12,50.12, -917, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.26,47.53,49.81,50.11,50.11,50.11, -918, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.52,49.80,50.10,50.10,50.10, -919, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.51,49.79,50.09,50.09,50.09, -920, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.25,47.50,49.78,50.09,50.09,50.09, -921, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.24,47.50,49.78,50.08,50.08,50.08, -922, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.24,47.49,49.77,50.07,50.07,50.07, -923, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.48,49.76,50.06,50.06,50.06, -924, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.47,49.75,50.05,50.05,50.05, -925, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.23,47.46,49.74,50.04,50.04,50.04, -926, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.22,47.45,49.73,50.03,50.03,50.03, -927, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.22,47.45,49.72,50.03,50.03,50.03, -928, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.44,49.71,50.02,50.02,50.02, -929, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.43,49.71,50.01,50.01,50.01, -930, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.21,47.42,49.70,50.00,50.00,50.00, -931, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.20,47.41,49.69,49.99,49.99,49.99, -932, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.20,47.40,49.68,49.98,49.98,49.98, -933, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.40,49.67,49.98,49.98,49.98, -934, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.39,49.66,49.97,49.97,49.97, -935, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.19,47.38,49.65,49.96,49.96,49.96, -936, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.37,49.65,49.95,49.95,49.95, -937, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.36,49.64,49.94,49.94,49.94, -938, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.18,47.35,49.63,49.93,49.93,49.93, -939, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.17,47.35,49.62,49.93,49.93,49.93, -940, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.17,47.34,49.61,49.92,49.92,49.92, -941, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.33,49.60,49.91,49.91,49.91, -942, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.32,49.59,49.90,49.90,49.90, -943, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.16,47.31,49.58,49.89,49.89,49.89, -944, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.15,47.30,49.58,49.88,49.88,49.88, -945, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.15,47.29,49.57,49.87,49.87,49.87, -946, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.29,49.56,49.87,49.87,49.87, -947, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.28,49.55,49.86,49.86,49.86, -948, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.14,47.27,49.54,49.85,49.85,49.85, -949, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.26,49.53,49.84,49.84,49.84, -950, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.25,49.52,49.83,49.83,49.83, -951, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.13,47.24,49.52,49.82,49.82,49.82, -952, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.12,47.24,49.51,49.82,49.82,49.82, -953, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.12,47.23,49.50,49.81,49.81,49.81, -954, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.22,49.49,49.80,49.80,49.80, -955, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.21,49.48,49.79,49.79,49.79, -956, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.11,47.20,49.47,49.78,49.78,49.78, -957, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.19,49.46,49.77,49.77,49.77, -958, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.18,49.46,49.77,49.77,49.77, -959, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.10,47.18,49.45,49.76,49.76,49.76, -960, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.09,47.17,49.44,49.75,49.75,49.75, -961, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.95,44.75,49.11,49.74,49.74,49.74,49.75 -962, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.95,44.75,49.10,49.73,49.73,49.73, -963, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.94,44.74,49.09,49.72,49.72,49.72, -964, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.94,44.74,49.08,49.71,49.71,49.71, -965, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.94,44.73,49.07,49.71,49.71,49.71, -966, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.94,44.73,49.06,49.70,49.70,49.70, -967, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.93,44.72,49.05,49.69,49.69,49.69, -968, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.93,44.72,49.04,49.68,49.68,49.68, -969, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.93,44.71,49.03,49.67,49.67,49.67, -970, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.92,44.71,49.02,49.66,49.66,49.66, -971, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.92,44.70,49.01,49.66,49.66,49.66, -972, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.92,44.70,48.99,49.65,49.65,49.65, -973, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.91,44.69,48.98,49.64,49.64,49.64, -974, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.91,44.69,48.97,49.63,49.63,49.63, -975, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.91,44.68,48.96,49.62,49.62,49.62, -976, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,42.26,48.28,49.58,49.61,49.61,49.62 -977, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.23,49.49,49.60,49.60,49.61 -978, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.21,49.48,49.60,49.60, -979, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.20,49.47,49.59,49.59, -980, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.19,49.46,49.58,49.58, -981, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.18,49.45,49.57,49.57, -982, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.86,47.17,49.45,49.56,49.56, -983, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.85,47.15,49.44,49.55,49.55, -984, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.85,47.14,49.43,49.54,49.54, -985, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.86,39.85,47.13,49.42,49.53,49.53, -986, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.85,47.12,49.41,49.52,49.52, -987, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.85,47.10,49.41,49.51,49.51, -988, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.85,47.09,49.40,49.50,49.50, -989, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.85,47.08,49.39,49.50,49.50, -990, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.07,49.38,49.49,49.49, -991, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.06,49.37,49.48,49.48, -992, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.05,49.37,49.47,49.47, -993, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.03,49.36,49.46,49.46, -994, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.02,49.35,49.45,49.45, -995, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.84,47.01,49.34,49.44,49.44, -996, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,47.00,49.33,49.43,49.43, -997, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,46.99,49.32,49.43,49.43, -998, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,46.97,49.31,49.42,49.42, -999, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,46.96,49.31,49.41,49.41, -1000, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.83,46.95,49.30,49.40,49.40, -1001, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.82,46.94,49.29,49.39,49.39, -1002, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.82,46.93,49.28,49.38,49.38, -1003, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.85,39.82,46.92,49.27,49.37,49.37, -1004, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.84,39.82,46.90,49.26,49.37,49.37, -1005, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.84,39.82,46.89,49.25,49.36,49.36, -1006, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,31.56,36.56,44.72,48.93,49.35,49.35,49.36 -1007, 19.722222, 51.666667, 14.444444, 0.300000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.45,35.38,44.25,48.79,49.33,49.34,49.35 -1008, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.34,36.34,44.23,48.78,49.33,49.33, -1009, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.76,37.76,44.22,48.77,49.32,49.32, -1010, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.19,39.19,44.21,48.76,49.31,49.31, -1011, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.61,40.61,44.21,48.75,49.30,49.30, -1012, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.03,42.03,44.20,48.74,49.29,49.29, -1013, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.19,43.19,44.71,48.74,49.28,49.28, -1014, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.33,44.33,45.27,48.73,49.27,49.27, -1015, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.46,45.46,45.84,48.72,49.26,49.26, -1016, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.53,46.53,46.53,48.71,49.25,49.25, -1017, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.47,47.47,47.47,48.70,49.25,49.25, -1018, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.40,48.40,48.40,48.74,49.24,49.24, -1019, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.19,49.19,49.19,49.19,49.23,49.23, -1020, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.67,49.67,49.67,49.67,49.67,49.67, -1021, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.22,48.01,49.66,49.66,49.66,49.66,49.67 -1022, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.80,45.78,49.18,49.65,49.65,49.65,49.66 -1023, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,36.81,42.76,48.08,49.64,49.64,49.64,49.65 -1024, 19.722222, 51.666667, 14.444444, 1.700000, 1,0.00,0.00,75.00,75.00,0.00,0.00,34.66,39.60,46.43,49.48,49.64,49.64,49.64 -1025, 19.722222, 51.666667, 14.444444, 0.200000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.71,38.54,46.17,49.42,49.63,49.63,49.64 -1026, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.55,39.55,46.16,49.41,49.62,49.62, -1027, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.97,40.97,46.15,49.40,49.61,49.61, -1028, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.39,42.39,46.14,49.39,49.60,49.60, -1029, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.81,43.81,46.13,49.38,49.59,49.59, -1030, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.10,45.10,46.39,49.37,49.58,49.58, -1031, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.23,46.23,46.95,49.37,49.57,49.57, -1032, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.37,47.37,47.51,49.36,49.56,49.56, -1033, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.36,48.36,48.36,49.35,49.55,49.55, -1034, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.28,49.28,49.28,49.41,49.54,49.54, -1035, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.86,49.86,49.86,49.86,49.86,49.86, -1036, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.32,50.32,50.32,50.32,50.32,50.32, -1037, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.79,50.79,50.79,50.79,50.79,50.79, -1038, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.26,51.26,51.26,51.26,51.26,51.26, -1039, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,66.33,66.33,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -1040, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1041, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -1042, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -1043, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -1044, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -1045, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -1046, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -1047, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -1048, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -1049, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -1050, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -1051, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -1052, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -1053, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -1054, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -1055, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -1056, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -1057, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -1058, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -1059, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -1060, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -1061, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -1062, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -1063, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -1064, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -1065, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -1066, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -1067, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -1068, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -1069, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -1070, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -1071, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -1072, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -1073, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -1074, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, -1075, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, -1076, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, -1077, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, -1078, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, -1079, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, -1080, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, -1081, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, -1082, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, -1083, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, -1084, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, -1085, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, -1086, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, -1087, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, -1088, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, -1089, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, -1090, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, -1091, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, -1092, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, -1093, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, -1094, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, -1095, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, -1096, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, -1097, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, -1098, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, -1099, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, -1100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, -1101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, -1102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, -1103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, -1104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, -1105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, -1106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, -1107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, -1108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, -1109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, -1110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, -1111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, -1112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, -1113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, -1114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, -1115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, -1116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, -1117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, -1118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, -1119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, -1120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, -1121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, -1122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, -1123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, -1124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, -1125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, -1126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, -1127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, -1128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, -1129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, -1130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, -1131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, -1132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, -1133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, -1134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, -1135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, -1136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, -1137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, -1138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, -1139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, -1140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, -1141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, -1142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, -1143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, -1144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, -1145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, -1146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, -1147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, -1148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, -1149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, -1150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, -1151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, -1152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, -1153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, -1154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, -1155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, -1156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, -1157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, -1158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, -1159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, -1160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, -1161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, -1162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, -1163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, -1164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, -1165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, -1166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, -1167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, -1168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, -1169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, -1170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, -1171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, -1172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, -1173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, -1174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, -1175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, -1176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, -1177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, -1178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, -1179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, -1180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, -1181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, -1182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, -1183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, -1184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, -1185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, -1186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, -1187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, -1188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, -1189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, -1190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, -1191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, -1192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, -1193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, -1194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, -1195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, -1196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, -1197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, -1198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, -1199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, -1200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, -1201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, -1202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, -1203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, -1204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, -1205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, -1206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, -1207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, -1208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, -1209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, -1210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, -1211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, -1212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, -1213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, -1214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, -1215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, -1216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, -1217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, -1218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, -1219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, -1220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, -1221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, -1222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, -1223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, -1224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, -1225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, -1226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, -1227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, -1228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, -1229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, -1230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, -1231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, -1232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, -1233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, -1234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, -1235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, -1236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, -1237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, -1238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, -1239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, -1240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, -1241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, -1242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, -1243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, -1244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, -1245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, -1246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, -1247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, -1248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, -1249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, -1250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, -1251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, -1252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, -1253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, -1254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, -1255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, -1256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, -1257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, -1258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, -1259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, -1260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, -1261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, -1262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, -1263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, -1264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, -1265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, -1266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, -1267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, -1268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, -1269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, -1270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, -1271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, -1272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, -1273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, -1274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, -1275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, -1276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, -1277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, -1278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, -1279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, -1280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, -1281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, -1282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, -1283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, -1284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, -1285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, -1286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, -1287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, -1288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, -1289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, -1290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, -1291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, -1292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, -1293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, -1294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, -1295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, -1296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, -1297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, -1298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, -1299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, -1300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, -1301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, -1302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, -1303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, -1304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, -1305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, -1306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, -1307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, -1308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, -1309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, -1310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, -1311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, -1312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, -1313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, -1314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, -1315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, -1316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, -1317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, -1318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, -1319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, -1320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, -1321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, -1322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, -1323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, -1324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, -1325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, -1326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, -1327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, -1328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, -1329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, -1330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, -1331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, -1332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, -1333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, -1334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, -1335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, -1336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, -1337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, -1338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.32,49.28,49.28,49.28,49.28,49.28, -1339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.31,49.27,49.27,49.27,49.27,49.27, -1340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.30,49.26,49.26,49.26,49.26,49.26, -1341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.29,49.25,49.25,49.25,49.25,49.25, -1342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.28,49.25,49.25,49.25,49.25,49.25, -1343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.27,49.24,49.24,49.24,49.24,49.24, -1344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.26,49.23,49.23,49.23,49.23,49.23, -1345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.25,49.22,49.22,49.22,49.22,49.22, -1346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.24,49.22,49.22,49.22,49.22,49.22, -1347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.23,49.21,49.21,49.21,49.21,49.21, -1348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.22,49.20,49.20,49.20,49.20,49.20, -1349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.21,49.19,49.19,49.19,49.19,49.19, -1350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.20,49.19,49.19,49.19,49.19,49.19, -1351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.19,49.18,49.18,49.18,49.18,49.18, -1352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.18,49.17,49.17,49.17,49.17,49.17, -1353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.17,49.16,49.16,49.16,49.16,49.16, -1354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.16,49.15,49.15,49.15,49.15,49.15, -1355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.15,49.15,49.15,49.15,49.15,49.15, -1356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.14,49.14,49.14,49.14,49.14,49.14, -1357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.13,49.13,49.13,49.13,49.13,49.13, -1358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.12,49.12,49.12,49.12,49.12,49.12, -1359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.11,49.12,49.12,49.12,49.12,49.12, -1360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.10,49.11,49.11,49.11,49.11,49.11, -1361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.09,49.10,49.10,49.10,49.10,49.10, -1362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.08,49.09,49.09,49.09,49.09,49.09, -1363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.07,49.09,49.09,49.09,49.09,49.09, -1364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.06,49.08,49.08,49.08,49.08,49.08, -1365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.05,49.07,49.07,49.07,49.07,49.07, -1366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.04,49.06,49.06,49.06,49.06,49.06, -1367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.03,49.05,49.05,49.05,49.05,49.05, -1368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.02,49.05,49.05,49.05,49.05,49.05, -1369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.01,49.04,49.04,49.04,49.04,49.04, -1370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.00,49.03,49.03,49.03,49.03,49.03, -1371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.99,49.02,49.02,49.02,49.02,49.02, -1372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.98,49.02,49.02,49.02,49.02,49.02, -1373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.97,49.01,49.01,49.01,49.01,49.01, -1374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.96,49.00,49.00,49.00,49.00,49.00, -1375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.95,48.99,48.99,48.99,48.99,48.99, -1376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.94,48.99,48.99,48.99,48.99,48.99, -1377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.93,48.98,48.98,48.98,48.98,48.98, -1378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.92,48.97,48.97,48.97,48.97,48.97, -1379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.91,48.96,48.96,48.96,48.96,48.96, -1380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.90,48.95,48.95,48.95,48.95,48.95, -1381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.89,48.95,48.95,48.95,48.95,48.95, -1382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.88,48.94,48.94,48.94,48.94,48.94, -1383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.87,48.93,48.93,48.93,48.93,48.93, -1384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.86,48.92,48.92,48.92,48.92,48.92, -1385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.85,48.92,48.92,48.92,48.92,48.92, -1386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.84,48.91,48.91,48.91,48.91,48.91, -1387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.83,48.90,48.90,48.90,48.90,48.90, -1388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.82,48.89,48.89,48.89,48.89,48.89, -1389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.81,48.89,48.89,48.89,48.89,48.89, -1390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.80,48.88,48.88,48.88,48.88,48.88, -1391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.79,48.87,48.87,48.87,48.87,48.87, -1392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.78,48.86,48.86,48.86,48.86,48.86, -1393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.77,48.85,48.85,48.85,48.85,48.85, -1394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.76,48.85,48.85,48.85,48.85,48.85, -1395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.75,48.84,48.84,48.84,48.84,48.84, -1396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.74,48.83,48.83,48.83,48.83,48.83, -1397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.73,48.82,48.82,48.82,48.82,48.82, -1398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.72,48.82,48.82,48.82,48.82,48.82, -1399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.71,48.81,48.81,48.81,48.81,48.81, -1400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.70,48.80,48.80,48.80,48.80,48.80, -1401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.69,48.79,48.79,48.79,48.79,48.79, -1402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.68,48.79,48.79,48.79,48.79,48.79, -1403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.67,48.78,48.78,48.78,48.78,48.78, -1404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.66,48.77,48.77,48.77,48.77,48.77, -1405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.65,48.76,48.76,48.76,48.76,48.76, -1406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.64,48.75,48.76,48.76,48.76,48.76, -1407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.63,48.75,48.75,48.75,48.75,48.75, -1408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.62,48.74,48.74,48.74,48.74,48.74, -1409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.61,48.73,48.73,48.73,48.73,48.73, -1410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.60,48.72,48.73,48.73,48.73,48.73, -1411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.59,48.72,48.72,48.72,48.72,48.72, -1412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.58,48.71,48.71,48.71,48.71,48.71, -1413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.57,48.70,48.70,48.70,48.70,48.70, -1414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.56,48.69,48.69,48.69,48.69,48.69, -1415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.55,48.69,48.69,48.69,48.69,48.69, -1416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.54,48.68,48.68,48.68,48.68,48.68, -1417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.53,48.67,48.67,48.67,48.67,48.67, -1418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.52,48.66,48.66,48.66,48.66,48.66, -1419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.51,48.65,48.66,48.66,48.66,48.66, -1420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.50,48.65,48.65,48.65,48.65,48.65, -1421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.49,48.64,48.64,48.64,48.64,48.64, -1422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.48,48.63,48.63,48.63,48.63,48.63, -1423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.47,48.62,48.63,48.63,48.63,48.63, -1424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.46,48.62,48.62,48.62,48.62,48.62, -1425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.45,48.61,48.61,48.61,48.61,48.61, -1426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.44,48.60,48.60,48.60,48.60,48.60, -1427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.43,48.59,48.60,48.60,48.60,48.60, -1428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.42,48.59,48.59,48.59,48.59,48.59, -1429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.41,48.58,48.58,48.58,48.58,48.58, -1430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.40,48.57,48.57,48.57,48.57,48.57, -1431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.39,48.56,48.57,48.57,48.57,48.57, -1432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.38,48.56,48.56,48.56,48.56,48.56, -1433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.37,48.55,48.55,48.55,48.55,48.55, -1434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.36,48.54,48.54,48.54,48.54,48.54, -1435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.35,48.53,48.54,48.54,48.54,48.54, -1436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.34,48.52,48.53,48.53,48.53,48.53, -1437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.52,48.52,48.52,48.52,48.52, -1438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.33,48.51,48.51,48.51,48.51,48.51, -1439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,47.32,48.50,48.51,48.51,48.51,48.51, diff --git a/test/24hr67_vsmall_Preset_Rheem2020Build40.csv b/test/24hr67_vsmall_Preset_Rheem2020Build40.csv deleted file mode 100644 index 42bae76e..00000000 --- a/test/24hr67_vsmall_Preset_Rheem2020Build40.csv +++ /dev/null @@ -1,1441 +0,0 @@ -minutes,Ta,Tsetpoint,inletT,draw,DRstatus,h_src1In (Wh),h_src1Out (Wh),h_src2In (Wh),h_src2Out (Wh),h_src3In (Wh),h_src3Out (Wh),tcouple1 (C),tcouple2 (C),tcouple3 (C),tcouple4 (C),tcouple5 (C),tcouple6 (C), toutlet (C) -0, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.49,50.62,51.65,51.65,51.65,51.65,51.66 -2, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.17,48.92,51.47,51.64,51.64,51.64,51.65 -3, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.16,48.92,51.46,51.63,51.63,51.63, -4, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.16,48.91,51.45,51.62,51.62,51.62, -5, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.15,48.90,51.44,51.61,51.61,51.61, -6, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.15,48.90,51.43,51.61,51.61,51.61, -7, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.14,48.89,51.41,51.60,51.60,51.60, -8, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.13,48.88,51.40,51.59,51.59,51.59, -9, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.13,48.88,51.39,51.58,51.58,51.58, -10, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.12,48.87,51.38,51.57,51.57,51.57, -11, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.12,48.87,51.37,51.56,51.56,51.56, -12, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.11,48.86,51.36,51.55,51.55,51.55, -13, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.11,48.85,51.35,51.54,51.54,51.54, -14, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.10,48.85,51.34,51.54,51.54,51.54, -15, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.10,48.84,51.33,51.53,51.53,51.53, -16, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.09,48.83,51.32,51.52,51.52,51.52, -17, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.09,48.83,51.31,51.51,51.51,51.51, -18, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.08,48.82,51.30,51.50,51.50,51.50, -19, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.08,48.81,51.29,51.49,51.49,51.49, -20, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.07,48.81,51.28,51.48,51.48,51.48, -21, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.07,48.80,51.27,51.47,51.47,51.47, -22, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.06,48.79,51.26,51.47,51.47,51.47, -23, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.06,48.79,51.25,51.46,51.46,51.46, -24, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.05,48.78,51.24,51.45,51.45,51.45, -25, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.05,48.77,51.23,51.44,51.44,51.44, -26, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.04,48.77,51.22,51.43,51.43,51.43, -27, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.04,48.76,51.21,51.42,51.42,51.42, -28, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.03,48.75,51.20,51.41,51.41,51.41, -29, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.03,48.75,51.19,51.40,51.40,51.40, -30, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.02,48.74,51.18,51.39,51.39,51.39, -31, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.02,48.73,51.17,51.39,51.39,51.39, -32, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.01,48.73,51.16,51.38,51.38,51.38, -33, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.01,48.72,51.15,51.37,51.37,51.37, -34, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.00,48.71,51.14,51.36,51.36,51.36, -35, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.00,48.71,51.13,51.35,51.35,51.35, -36, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,42.00,48.70,51.12,51.34,51.34,51.34, -37, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.99,48.69,51.11,51.33,51.33,51.33, -38, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.99,48.68,51.10,51.32,51.32,51.32, -39, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.98,48.68,51.09,51.32,51.32,51.32, -40, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.98,48.67,51.08,51.31,51.31,51.31, -41, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.97,48.66,51.07,51.30,51.30,51.30, -42, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.97,48.66,51.06,51.29,51.29,51.29, -43, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.96,48.65,51.05,51.28,51.28,51.28, -44, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.96,48.64,51.04,51.27,51.27,51.27, -45, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.95,48.63,51.03,51.26,51.26,51.26, -46, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.95,48.63,51.02,51.25,51.25,51.25, -47, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.94,48.62,51.01,51.25,51.25,51.25, -48, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.94,48.61,51.00,51.24,51.24,51.24, -49, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.93,48.61,50.99,51.23,51.23,51.23, -50, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.93,48.60,50.98,51.22,51.22,51.22, -51, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.93,48.59,50.97,51.21,51.21,51.21, -52, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.92,48.58,50.96,51.20,51.20,51.20, -53, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.92,48.58,50.95,51.19,51.19,51.19, -54, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.91,48.57,50.94,51.18,51.18,51.18, -55, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.91,48.56,50.93,51.18,51.18,51.18, -56, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.90,48.55,50.92,51.17,51.17,51.17, -57, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.90,48.55,50.91,51.16,51.16,51.16, -58, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.54,50.90,51.15,51.15,51.15, -59, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.89,48.53,50.89,51.14,51.14,51.14, -60, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,41.88,48.52,50.88,51.13,51.13,51.13, -61, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.57,46.12,50.48,51.12,51.12,51.12,51.13 -62, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.57,46.11,50.47,51.11,51.11,51.11, -63, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,46.11,50.46,51.11,51.11,51.11, -64, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,46.10,50.45,51.10,51.10,51.10, -65, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,46.10,50.44,51.09,51.09,51.09, -66, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.80,44.19,50.06,51.07,51.08,51.08,51.09 -67, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.79,44.18,50.05,51.06,51.07,51.07, -68, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.79,44.18,50.04,51.05,51.06,51.06, -69, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.79,44.18,50.02,51.04,51.05,51.05, -70, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,37.79,44.18,50.01,51.03,51.04,51.04, -71, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.95,42.50,49.49,51.00,51.03,51.03,51.04 -72, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.95,42.50,49.48,50.99,51.02,51.02, -73, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.94,42.50,49.46,50.98,51.02,51.02, -74, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.94,42.50,49.45,50.97,51.01,51.01, -75, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.94,42.50,49.44,50.96,51.00,51.00, -76, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.06,41.01,48.80,50.91,50.99,50.99,51.00 -77, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.05,41.01,48.78,50.90,50.98,50.98, -78, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.05,41.01,48.77,50.89,50.97,50.97, -79, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.05,41.01,48.76,50.88,50.96,50.96, -80, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.04,41.01,48.74,50.87,50.95,50.95, -81, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.04,41.01,48.73,50.87,50.94,50.94, -82, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.04,41.01,48.72,50.86,50.93,50.93, -83, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.03,41.01,48.70,50.85,50.92,50.92, -84, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.03,41.01,48.69,50.84,50.91,50.91, -85, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.03,41.01,48.68,50.83,50.90,50.90, -86, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.02,41.01,48.66,50.82,50.90,50.90, -87, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.02,41.01,48.65,50.81,50.89,50.89, -88, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.02,41.01,48.64,50.80,50.88,50.88, -89, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.01,41.01,48.62,50.79,50.87,50.87, -90, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.01,41.01,48.61,50.79,50.86,50.86, -91, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.01,41.01,48.60,50.78,50.85,50.85, -92, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.00,41.01,48.58,50.77,50.84,50.84, -93, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.00,41.01,48.57,50.76,50.83,50.83, -94, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.00,41.01,48.56,50.75,50.82,50.82, -95, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,36.00,41.01,48.54,50.74,50.81,50.81, -96, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.99,41.01,48.53,50.73,50.80,50.80, -97, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.99,41.01,48.52,50.72,50.80,50.80, -98, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.99,41.01,48.51,50.71,50.79,50.79, -99, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.98,41.01,48.49,50.70,50.78,50.78, -100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.98,41.01,48.48,50.70,50.77,50.77, -101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.98,41.01,48.47,50.69,50.76,50.76, -102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.97,41.01,48.45,50.68,50.75,50.75, -103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.97,41.01,48.44,50.67,50.74,50.74, -104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.97,41.01,48.43,50.66,50.73,50.73, -105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.96,41.01,48.42,50.65,50.72,50.72, -106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.96,41.01,48.40,50.64,50.71,50.71, -107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.96,41.01,48.39,50.63,50.71,50.71, -108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.95,41.01,48.38,50.62,50.70,50.70, -109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.95,41.01,48.37,50.62,50.69,50.69, -110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.95,41.01,48.35,50.61,50.68,50.68, -111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.95,41.01,48.34,50.60,50.67,50.67, -112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.94,41.01,48.33,50.59,50.66,50.66, -113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.94,41.01,48.32,50.58,50.65,50.65, -114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.94,41.01,48.30,50.57,50.64,50.64, -115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.93,41.01,48.29,50.56,50.63,50.63, -116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.93,41.01,48.28,50.55,50.62,50.62, -117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.93,41.01,48.27,50.54,50.62,50.62, -118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.92,41.01,48.25,50.53,50.61,50.61, -119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.92,41.00,48.24,50.53,50.60,50.60, -120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.92,41.00,48.23,50.52,50.59,50.59, -121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.92,41.00,48.22,50.51,50.58,50.58, -122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.91,41.00,48.20,50.50,50.57,50.57, -123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.91,41.00,48.19,50.49,50.56,50.56, -124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.91,41.00,48.18,50.48,50.55,50.55, -125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.90,41.00,48.17,50.47,50.54,50.54, -126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.90,41.00,48.16,50.46,50.53,50.53, -127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.90,41.00,48.14,50.45,50.53,50.53, -128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.89,41.00,48.13,50.44,50.52,50.52, -129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.89,40.99,48.12,50.44,50.51,50.51, -130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.89,40.99,48.11,50.43,50.50,50.50, -131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.89,40.99,48.10,50.42,50.49,50.49, -132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.88,40.99,48.08,50.41,50.48,50.48, -133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.88,40.99,48.07,50.40,50.47,50.47, -134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.88,40.99,48.06,50.39,50.46,50.46, -135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.87,40.99,48.05,50.38,50.45,50.45, -136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.87,40.99,48.04,50.37,50.45,50.45, -137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.87,40.99,48.03,50.36,50.44,50.44, -138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.86,40.98,48.01,50.35,50.43,50.43, -139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.86,40.98,48.00,50.35,50.42,50.42, -140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.86,40.98,47.99,50.34,50.41,50.41, -141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.86,40.98,47.98,50.33,50.40,50.40, -142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.85,40.98,47.97,50.32,50.39,50.39, -143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.85,40.98,47.96,50.31,50.38,50.38, -144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.85,40.98,47.94,50.30,50.37,50.37, -145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.84,40.97,47.93,50.29,50.36,50.36, -146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.84,40.97,47.92,50.28,50.36,50.36, -147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.84,40.97,47.91,50.27,50.35,50.35, -148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.84,40.97,47.90,50.26,50.34,50.34, -149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.83,40.97,47.89,50.26,50.33,50.33, -150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.83,40.97,47.87,50.25,50.32,50.32, -151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.83,40.97,47.86,50.24,50.31,50.31, -152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.82,40.96,47.85,50.23,50.30,50.30, -153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.82,40.96,47.84,50.22,50.29,50.29, -154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.82,40.96,47.83,50.21,50.28,50.28, -155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.82,40.96,47.82,50.20,50.28,50.28, -156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.81,40.96,47.81,50.19,50.27,50.27, -157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.81,40.95,47.80,50.18,50.26,50.26, -158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.81,40.95,47.78,50.18,50.25,50.25, -159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.80,40.95,47.77,50.17,50.24,50.24, -160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.80,40.95,47.76,50.16,50.23,50.23, -161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.80,40.95,47.75,50.15,50.22,50.22, -162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.80,40.95,47.74,50.14,50.21,50.21, -163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.79,40.94,47.73,50.13,50.20,50.20, -164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.79,40.94,47.72,50.12,50.20,50.20, -165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.79,40.94,47.71,50.11,50.19,50.19, -166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.78,40.94,47.70,50.10,50.18,50.18, -167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.78,40.94,47.68,50.09,50.17,50.17, -168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.78,40.93,47.67,50.08,50.16,50.16, -169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.78,40.93,47.66,50.08,50.15,50.15, -170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.77,40.93,47.65,50.07,50.14,50.14, -171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.77,40.93,47.64,50.06,50.13,50.13, -172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.77,40.93,47.63,50.05,50.13,50.13, -173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.77,40.92,47.62,50.04,50.12,50.12, -174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.76,40.92,47.61,50.03,50.11,50.11, -175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.76,40.92,47.60,50.02,50.10,50.10, -176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.76,40.92,47.59,50.01,50.09,50.09, -177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.75,40.92,47.58,50.00,50.08,50.08, -178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.75,40.91,47.56,49.99,50.07,50.07, -179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.75,40.91,47.55,49.99,50.06,50.06, -180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.75,40.91,47.54,49.98,50.05,50.05, -181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.74,40.91,47.53,49.97,50.05,50.05, -182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.74,40.90,47.52,49.96,50.04,50.04, -183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.74,40.90,47.51,49.95,50.03,50.03, -184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.74,40.90,47.50,49.94,50.02,50.02, -185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.73,40.90,47.49,49.93,50.01,50.01, -186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.73,40.90,47.48,49.92,50.00,50.00, -187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.73,40.89,47.47,49.91,49.99,49.99, -188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,40.89,47.46,49.90,49.98,49.98, -189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,40.89,47.45,49.90,49.98,49.98, -190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,40.89,47.44,49.89,49.97,49.97, -191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.72,40.88,47.43,49.88,49.96,49.96, -192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.71,40.88,47.42,49.87,49.95,49.95, -193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.71,40.88,47.40,49.86,49.94,49.94, -194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.71,40.88,47.39,49.85,49.93,49.93, -195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.71,40.87,47.38,49.84,49.92,49.92, -196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.70,40.87,47.37,49.83,49.91,49.91, -197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.70,40.87,47.36,49.82,49.90,49.90, -198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.70,40.87,47.35,49.81,49.90,49.90, -199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.69,40.86,47.34,49.81,49.89,49.89, -200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.69,40.86,47.33,49.80,49.88,49.88, -201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.69,40.86,47.32,49.79,49.87,49.87, -202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.69,40.86,47.31,49.78,49.86,49.86, -203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.68,40.85,47.30,49.77,49.85,49.85, -204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.68,40.85,47.29,49.76,49.84,49.84, -205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.68,40.85,47.28,49.75,49.83,49.83, -206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.68,40.85,47.27,49.74,49.83,49.83, -207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.67,40.84,47.26,49.73,49.82,49.82, -208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.67,40.84,47.25,49.73,49.81,49.81, -209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.67,40.84,47.24,49.72,49.80,49.80, -210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.67,40.84,47.23,49.71,49.79,49.79, -211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.66,40.83,47.22,49.70,49.78,49.78, -212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.66,40.83,47.21,49.69,49.77,49.77, -213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.66,40.83,47.20,49.68,49.76,49.76, -214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.65,40.82,47.19,49.67,49.76,49.76, -215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.65,40.82,47.18,49.66,49.75,49.75, -216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.65,40.82,47.17,49.65,49.74,49.74, -217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.65,40.82,47.16,49.64,49.73,49.73, -218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.64,40.81,47.15,49.64,49.72,49.72, -219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.64,40.81,47.14,49.63,49.71,49.71, -220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.64,40.81,47.13,49.62,49.70,49.70, -221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.64,40.81,47.12,49.61,49.69,49.69, -222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.63,40.80,47.11,49.60,49.69,49.69, -223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.63,40.80,47.10,49.59,49.68,49.68, -224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.63,40.80,47.09,49.58,49.67,49.67, -225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.63,40.79,47.08,49.57,49.66,49.66, -226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.62,40.79,47.07,49.56,49.65,49.65, -227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.62,40.79,47.06,49.55,49.64,49.64, -228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.62,40.78,47.05,49.55,49.63,49.63, -229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.62,40.78,47.04,49.54,49.62,49.62, -230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.61,40.78,47.03,49.53,49.62,49.62, -231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.61,40.78,47.02,49.52,49.61,49.61, -232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.61,40.77,47.01,49.51,49.60,49.60, -233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.60,40.77,47.00,49.50,49.59,49.59, -234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.60,40.77,46.99,49.49,49.58,49.58, -235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.60,40.76,46.98,49.48,49.57,49.57, -236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.60,40.76,46.97,49.47,49.56,49.56, -237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.59,40.76,46.96,49.46,49.56,49.56, -238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.59,40.76,46.95,49.46,49.55,49.55, -239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.59,40.75,46.94,49.45,49.54,49.54, -240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.59,40.75,46.93,49.44,49.53,49.53, -241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,40.75,46.92,49.43,49.52,49.52, -242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,40.74,46.91,49.42,49.51,49.51, -243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,40.74,46.90,49.41,49.50,49.50, -244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.58,40.74,46.89,49.40,49.49,49.49, -245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.57,40.73,46.88,49.39,49.49,49.49, -246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.57,40.73,46.87,49.38,49.48,49.48, -247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.57,40.73,46.86,49.38,49.47,49.47, -248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.57,40.72,46.85,49.37,49.46,49.46, -249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.56,40.72,46.84,49.36,49.45,49.45, -250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.56,40.72,46.83,49.35,49.44,49.44, -251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.56,40.71,46.82,49.34,49.43,49.43, -252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.56,40.71,46.81,49.33,49.42,49.42, -253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.55,40.71,46.81,49.32,49.42,49.42, -254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.55,40.70,46.80,49.31,49.41,49.41, -255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.55,40.70,46.79,49.30,49.40,49.40, -256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.55,40.70,46.78,49.29,49.39,49.39, -257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.54,40.70,46.77,49.29,49.38,49.38, -258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.54,40.69,46.76,49.28,49.37,49.37, -259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.54,40.69,46.75,49.27,49.36,49.36, -260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.54,40.69,46.74,49.26,49.36,49.36, -261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.53,40.68,46.73,49.25,49.35,49.35, -262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.53,40.68,46.72,49.24,49.34,49.34, -263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.53,40.68,46.71,49.23,49.33,49.33, -264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.53,40.67,46.70,49.22,49.32,49.32, -265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.52,40.67,46.69,49.21,49.31,49.31, -266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.52,40.67,46.68,49.21,49.30,49.30, -267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.52,40.66,46.67,49.20,49.30,49.30, -268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.52,40.66,46.66,49.19,49.29,49.29, -269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,40.66,46.65,49.18,49.28,49.28, -270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,40.65,46.64,49.17,49.27,49.27, -271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,40.65,46.64,49.16,49.26,49.26, -272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.51,40.65,46.63,49.15,49.25,49.25, -273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.50,40.64,46.62,49.14,49.24,49.24, -274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.50,40.64,46.61,49.13,49.23,49.23, -275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.50,40.64,46.60,49.13,49.23,49.23, -276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.50,40.63,46.59,49.12,49.22,49.22, -277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,40.63,46.58,49.11,49.21,49.21, -278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,40.62,46.57,49.10,49.20,49.20, -279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.49,40.62,46.56,49.09,49.19,49.19, -280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.48,40.62,46.55,49.08,49.18,49.18, -281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.48,40.61,46.54,49.07,49.17,49.17, -282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.48,40.61,46.53,49.06,49.17,49.17, -283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.48,40.61,46.52,49.05,49.16,49.16, -284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.47,40.60,46.52,49.04,49.15,49.15, -285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.47,40.60,46.51,49.04,49.14,49.14, -286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.47,40.60,46.50,49.03,49.13,49.13, -287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.47,40.59,46.49,49.02,49.12,49.12, -288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.46,40.59,46.48,49.01,49.11,49.11, -289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.46,40.59,46.47,49.00,49.11,49.11, -290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.46,40.58,46.46,48.99,49.10,49.10, -291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.46,40.58,46.45,48.98,49.09,49.09, -292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.45,40.58,46.44,48.97,49.08,49.08, -293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.45,40.57,46.43,48.97,49.07,49.07, -294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.45,40.57,46.42,48.96,49.06,49.06, -295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.45,40.57,46.41,48.95,49.05,49.05, -296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.56,46.41,48.94,49.05,49.05, -297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.56,46.40,48.93,49.04,49.04, -298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.55,46.39,48.92,49.03,49.03, -299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.55,46.38,48.91,49.02,49.02, -300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.44,40.55,46.37,48.90,49.01,49.01, -301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.43,40.54,46.36,48.89,49.00,49.00, -302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.43,40.54,46.35,48.89,48.99,48.99, -303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.43,40.54,46.34,48.88,48.99,48.99, -304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.43,40.53,46.33,48.87,48.98,48.98, -305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.42,40.53,46.32,48.86,48.97,48.97, -306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.42,40.53,46.32,48.85,48.96,48.96, -307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.42,40.52,46.31,48.84,48.95,48.95, -308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.42,40.52,46.30,48.83,48.94,48.94, -309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.41,40.51,46.29,48.82,48.93,48.93, -310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.41,40.51,46.28,48.81,48.93,48.93, -311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.41,40.51,46.27,48.81,48.92,48.92, -312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.41,40.50,46.26,48.80,48.91,48.91, -313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.40,40.50,46.25,48.79,48.90,48.90, -314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.40,40.50,46.24,48.78,48.89,48.89, -315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.40,40.49,46.24,48.77,48.88,48.88, -316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.40,40.49,46.23,48.76,48.88,48.88, -317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.39,40.49,46.22,48.75,48.87,48.87, -318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.39,40.48,46.21,48.74,48.86,48.86, -319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.39,40.48,46.20,48.73,48.85,48.85, -320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.39,40.47,46.19,48.73,48.84,48.84, -321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.38,40.47,46.18,48.72,48.83,48.83, -322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.38,40.47,46.17,48.71,48.82,48.82, -323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.38,40.46,46.17,48.70,48.82,48.82, -324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.38,40.46,46.16,48.69,48.81,48.81, -325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.37,40.46,46.15,48.68,48.80,48.80, -326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.37,40.45,46.14,48.67,48.79,48.79, -327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.37,40.45,46.13,48.66,48.78,48.78, -328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.37,40.44,46.12,48.66,48.77,48.77, -329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.36,40.44,46.11,48.65,48.76,48.76, -330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.36,40.44,46.10,48.64,48.76,48.76, -331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.36,40.43,46.10,48.63,48.75,48.75, -332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.36,40.43,46.09,48.62,48.74,48.74, -333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.35,40.42,46.08,48.61,48.73,48.73, -334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.35,40.42,46.07,48.60,48.72,48.72, -335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.35,40.42,46.06,48.59,48.71,48.71, -336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.35,40.41,46.05,48.59,48.70,48.70, -337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.34,40.41,46.04,48.58,48.70,48.70, -338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.34,40.41,46.03,48.57,48.69,48.69, -339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.34,40.40,46.03,48.56,48.68,48.68, -340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.34,40.40,46.02,48.55,48.67,48.67, -341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.33,40.39,46.01,48.54,48.66,48.66, -342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.33,40.39,46.00,48.53,48.65,48.65, -343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.33,40.39,45.99,48.52,48.65,48.65, -344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.33,40.38,45.98,48.51,48.64,48.64, -345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,40.38,45.97,48.51,48.63,48.63, -346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,40.37,45.97,48.50,48.62,48.62, -347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,40.37,45.96,48.49,48.61,48.61, -348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.32,40.37,45.95,48.48,48.60,48.60, -349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.31,40.36,45.94,48.47,48.59,48.59, -350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.31,40.36,45.93,48.46,48.59,48.59, -351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.31,40.36,45.92,48.45,48.58,48.58, -352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.31,40.35,45.91,48.44,48.57,48.57, -353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.30,40.35,45.91,48.44,48.56,48.56, -354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.30,40.34,45.90,48.43,48.55,48.55, -355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.30,40.34,45.89,48.42,48.54,48.54, -356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.30,40.34,45.88,48.41,48.54,48.54, -357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.33,45.87,48.40,48.53,48.53, -358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.33,45.86,48.39,48.52,48.52, -359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.32,45.85,48.38,48.51,48.51, -360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.32,45.85,48.37,48.50,48.50, -361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.29,40.32,45.84,48.37,48.49,48.49, -362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.28,40.31,45.83,48.36,48.49,48.49, -363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.28,40.31,45.82,48.35,48.48,48.48, -364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.28,40.30,45.81,48.34,48.47,48.47, -365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.28,40.30,45.80,48.33,48.46,48.46, -366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.27,40.30,45.80,48.32,48.45,48.45, -367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.27,40.29,45.79,48.31,48.44,48.44, -368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.27,40.29,45.78,48.31,48.43,48.43, -369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.27,40.28,45.77,48.30,48.43,48.43, -370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.26,40.28,45.76,48.29,48.42,48.42, -371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.26,40.28,45.75,48.28,48.41,48.41, -372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.26,40.27,45.75,48.27,48.40,48.40, -373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.26,40.27,45.74,48.26,48.39,48.39, -374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.25,40.26,45.73,48.25,48.38,48.38, -375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.25,40.26,45.72,48.24,48.38,48.38, -376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.25,40.26,45.71,48.24,48.37,48.37, -377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.25,40.25,45.70,48.23,48.36,48.36, -378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.24,40.25,45.70,48.22,48.35,48.35, -379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.24,40.24,45.69,48.21,48.34,48.34, -380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.24,40.24,45.68,48.20,48.33,48.33, -381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.24,40.24,45.67,48.19,48.33,48.33, -382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.23,40.23,45.66,48.18,48.32,48.32, -383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.23,40.23,45.65,48.17,48.31,48.31, -384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.23,40.22,45.65,48.17,48.30,48.30, -385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.23,40.22,45.64,48.16,48.29,48.29, -386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.22,40.22,45.63,48.15,48.28,48.28, -387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.22,40.21,45.62,48.14,48.28,48.28, -388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.22,40.21,45.61,48.13,48.27,48.27, -389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.22,40.20,45.60,48.12,48.26,48.26, -390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.20,45.60,48.11,48.25,48.25, -391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.20,45.59,48.11,48.24,48.24, -392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.19,45.58,48.10,48.23,48.23, -393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.19,45.57,48.09,48.23,48.23, -394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.21,40.18,45.56,48.08,48.22,48.22, -395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,40.18,45.55,48.07,48.21,48.21, -396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,40.18,45.55,48.06,48.20,48.20, -397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,40.17,45.54,48.05,48.19,48.19, -398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.20,40.17,45.53,48.04,48.18,48.18, -399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,40.16,45.52,48.04,48.17,48.17, -400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,40.16,45.51,48.03,48.17,48.17, -401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,40.16,45.51,48.02,48.16,48.16, -402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.19,40.15,45.50,48.01,48.15,48.15, -403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,40.15,45.49,48.00,48.14,48.14, -404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,40.14,45.48,47.99,48.13,48.13, -405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,40.14,45.47,47.98,48.12,48.12, -406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.18,40.14,45.46,47.98,48.12,48.12, -407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.17,40.13,45.46,47.97,48.11,48.11, -408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.17,40.13,45.45,47.96,48.10,48.10, -409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.17,40.12,45.44,47.95,48.09,48.09, -410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.17,40.12,45.43,47.94,48.08,48.08, -411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.16,40.11,45.42,47.93,48.07,48.07, -412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.16,40.11,45.42,47.92,48.07,48.07, -413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.16,40.11,45.41,47.92,48.06,48.06, -414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.16,40.10,45.40,47.91,48.05,48.05, -415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.15,40.10,45.39,47.90,48.04,48.04, -416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.15,40.09,45.38,47.89,48.03,48.03, -417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.15,40.09,45.38,47.88,48.02,48.02, -418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.15,40.09,45.37,47.87,48.02,48.02, -419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.08,45.36,47.86,48.01,48.01, -420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.08,45.35,47.86,48.00,48.00, -421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.07,45.34,47.85,47.99,47.99, -422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.07,45.34,47.84,47.98,47.98, -423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.14,40.06,45.33,47.83,47.98,47.98, -424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.13,40.06,45.32,47.82,47.97,47.97, -425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.13,40.06,45.31,47.81,47.96,47.96, -426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.13,40.05,45.30,47.80,47.95,47.95, -427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.13,40.05,45.29,47.80,47.94,47.94, -428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.12,40.04,45.29,47.79,47.93,47.93, -429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.12,40.04,45.28,47.78,47.93,47.93, -430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.12,40.04,45.27,47.77,47.92,47.92, -431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.12,40.03,45.26,47.76,47.91,47.91, -432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.11,40.03,45.25,47.75,47.90,47.90, -433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.11,40.02,45.25,47.74,47.89,47.89, -434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.11,40.02,45.24,47.74,47.88,47.88, -435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.11,40.01,45.23,47.73,47.88,47.88, -436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.10,40.01,45.22,47.72,47.87,47.87, -437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.10,40.01,45.22,47.71,47.86,47.86, -438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.10,40.00,45.21,47.70,47.85,47.85, -439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.10,40.00,45.20,47.69,47.84,47.84, -440, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.09,39.99,45.19,47.68,47.83,47.83, -441, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.09,39.99,45.18,47.68,47.83,47.83, -442, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.09,39.99,45.18,47.67,47.82,47.82, -443, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.09,39.98,45.17,47.66,47.81,47.81, -444, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.08,39.98,45.16,47.65,47.80,47.80, -445, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.08,39.97,45.15,47.64,47.79,47.79, -446, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.08,39.97,45.14,47.63,47.78,47.78, -447, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.08,39.96,45.14,47.62,47.78,47.78, -448, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.96,45.13,47.62,47.77,47.77, -449, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.96,45.12,47.61,47.76,47.76, -450, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.95,45.11,47.60,47.75,47.75, -451, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.95,45.10,47.59,47.74,47.74, -452, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.07,39.94,45.10,47.58,47.74,47.74, -453, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.06,39.94,45.09,47.57,47.73,47.73, -454, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.06,39.94,45.08,47.57,47.72,47.72, -455, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.06,39.93,45.07,47.56,47.71,47.71, -456, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.06,39.93,45.06,47.55,47.70,47.70, -457, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,39.92,45.06,47.54,47.69,47.69, -458, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,39.92,45.05,47.53,47.69,47.69, -459, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,39.91,45.04,47.52,47.68,47.68, -460, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.05,39.91,45.03,47.51,47.67,47.67, -461, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,39.91,45.03,47.51,47.66,47.66, -462, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,39.90,45.02,47.50,47.65,47.65, -463, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,39.90,45.01,47.49,47.64,47.64, -464, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.04,39.89,45.00,47.48,47.64,47.64, -465, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,39.89,44.99,47.47,47.63,47.63, -466, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,39.88,44.99,47.46,47.62,47.62, -467, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,39.88,44.98,47.46,47.61,47.61, -468, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.03,39.88,44.97,47.45,47.60,47.60, -469, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.02,39.87,44.96,47.44,47.60,47.60, -470, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.02,39.87,44.96,47.43,47.59,47.59, -471, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.02,39.86,44.95,47.42,47.58,47.58, -472, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.02,39.86,44.94,47.41,47.57,47.57, -473, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.01,39.85,44.93,47.40,47.56,47.56, -474, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.01,39.85,44.92,47.40,47.55,47.55, -475, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.01,39.85,44.92,47.39,47.55,47.55, -476, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.01,39.84,44.91,47.38,47.54,47.54, -477, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.00,39.84,44.90,47.37,47.53,47.53, -478, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.00,39.83,44.89,47.36,47.52,47.52, -479, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.00,39.83,44.89,47.35,47.51,47.51, -480, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,35.00,39.83,44.88,47.35,47.51,47.51, -481, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.66,37.73,44.06,47.08,47.50,47.50,47.51 -482, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.05,47.07,47.49,47.49, -483, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.04,47.07,47.48,47.48, -484, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.03,47.06,47.47,47.47, -485, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.02,47.05,47.46,47.46, -486, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.65,37.73,44.01,47.04,47.45,47.45, -487, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.64,37.73,44.00,47.03,47.45,47.45, -488, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.64,37.73,43.99,47.02,47.44,47.44, -489, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.64,37.73,43.98,47.02,47.43,47.43, -490, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.64,37.73,43.97,47.01,47.42,47.42, -491, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.63,37.73,43.97,47.00,47.41,47.41, -492, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.63,37.73,43.96,46.99,47.40,47.40, -493, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.63,37.73,43.95,46.98,47.40,47.40, -494, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.63,37.72,43.94,46.98,47.39,47.39, -495, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,32.62,37.72,43.93,46.97,47.38,47.38, -496, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.36,35.82,42.84,46.60,47.35,47.37,47.38 -497, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,33.92,34.47,41.51,46.14,47.30,47.36,47.37 -498, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,35.62,35.62,41.50,46.13,47.29,47.35, -499, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,37.04,37.04,41.50,46.12,47.28,47.34, -500, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,38.46,38.46,41.49,46.11,47.27,47.33, -501, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,39.84,39.84,41.56,46.10,47.27,47.32, -502, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,40.98,40.98,42.13,46.09,47.26,47.31, -503, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,42.11,42.11,42.69,46.09,47.25,47.30, -504, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.25,43.25,43.26,46.08,47.24,47.29, -505, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,44.20,44.20,44.20,46.07,47.23,47.28, -506, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.14,45.14,45.14,46.06,47.23,47.28, -507, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.99,45.99,45.99,46.33,47.22,47.27, -508, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.78,46.78,46.78,46.78,47.21,47.26, -509, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.40,47.40,47.40,47.40,47.40,47.40, -510, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.87,47.87,47.87,47.87,47.87,47.87, -511, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.33,48.33,48.33,48.33,48.33,48.33, -512, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.80,48.80,48.80,48.80,48.80,48.80, -513, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.27,49.27,49.27,49.27,49.27,49.27, -514, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.73,49.73,49.73,49.73,49.73,49.73, -515, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.20,50.20,50.20,50.20,50.20,50.20, -516, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.67,50.67,50.67,50.67,50.67,50.67, -517, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.13,51.13,51.13,51.13,51.13,51.13, -518, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.60,51.60,51.60,51.60,51.60,51.60, -519, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,11.78,11.78,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -520, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -521, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -522, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -523, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -524, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -525, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -526, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -527, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -528, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -529, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -530, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -531, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -532, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -533, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -534, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -535, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -536, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -537, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -538, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -539, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -540, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -541, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,46.28,50.45,51.49,51.49,51.49,51.49,51.49 -542, 19.722222, 51.666667, 14.444444, 0.500000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.48,49.25,51.39,51.48,51.48,51.48,51.49 -543, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.47,49.24,51.38,51.47,51.47,51.47, -544, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.46,49.24,51.37,51.46,51.46,51.46, -545, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.46,49.23,51.36,51.45,51.45,51.45, -546, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.45,49.22,51.35,51.44,51.44,51.44, -547, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.44,49.22,51.34,51.43,51.43,51.43, -548, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.43,49.21,51.33,51.43,51.43,51.43, -549, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.43,49.21,51.32,51.42,51.42,51.42, -550, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.42,49.20,51.31,51.41,51.41,51.41, -551, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.41,49.20,51.30,51.40,51.40,51.40, -552, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.41,49.19,51.29,51.39,51.39,51.39, -553, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.40,49.19,51.28,51.38,51.38,51.38, -554, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.39,49.18,51.27,51.37,51.37,51.37, -555, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,44.38,49.17,51.25,51.36,51.36,51.36, -556, 19.722222, 51.666667, 14.444444, 1.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.50,47.27,50.89,51.36,51.36,51.36,51.36 -557, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.49,47.26,50.88,51.35,51.35,51.35, -558, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.49,47.26,50.87,51.34,51.34,51.34, -559, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.25,50.86,51.33,51.33,51.33, -560, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.25,50.85,51.32,51.32,51.32, -561, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.48,47.24,50.83,51.31,51.31,51.31, -562, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.47,47.24,50.82,51.30,51.30,51.30, -563, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.47,47.23,50.81,51.29,51.29,51.29, -564, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.46,47.23,50.80,51.28,51.28,51.28, -565, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.46,47.22,50.79,51.28,51.28,51.28, -566, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.45,47.22,50.78,51.27,51.27,51.27, -567, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.45,47.21,50.77,51.26,51.26,51.26, -568, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.45,47.21,50.76,51.25,51.25,51.25, -569, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.44,47.20,50.75,51.24,51.24,51.24, -570, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.44,47.19,50.74,51.23,51.23,51.23, -571, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.43,47.19,50.73,51.22,51.22,51.22, -572, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.43,47.18,50.71,51.21,51.21,51.21, -573, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.43,47.18,50.70,51.21,51.21,51.21, -574, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.42,47.17,50.69,51.20,51.20,51.20, -575, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.42,47.17,50.68,51.19,51.19,51.19, -576, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.41,47.16,50.67,51.18,51.18,51.18, -577, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.41,47.15,50.66,51.17,51.17,51.17, -578, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.40,47.15,50.65,51.16,51.16,51.16, -579, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.40,47.14,50.64,51.15,51.15,51.15, -580, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.40,47.14,50.63,51.14,51.14,51.14, -581, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.39,47.13,50.62,51.14,51.14,51.14, -582, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.39,47.13,50.61,51.13,51.13,51.13, -583, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.38,47.12,50.60,51.12,51.12,51.12, -584, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.38,47.11,50.59,51.11,51.11,51.11, -585, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.38,47.11,50.58,51.10,51.10,51.10, -586, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.37,47.10,50.57,51.09,51.09,51.09, -587, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.37,47.10,50.55,51.08,51.08,51.08, -588, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.36,47.09,50.54,51.07,51.07,51.07, -589, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.36,47.08,50.53,51.06,51.06,51.06, -590, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.36,47.08,50.52,51.06,51.06,51.06, -591, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.35,47.07,50.51,51.05,51.05,51.05, -592, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.35,47.07,50.50,51.04,51.04,51.04, -593, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.34,47.06,50.49,51.03,51.03,51.03, -594, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.34,47.05,50.48,51.02,51.02,51.02, -595, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.34,47.05,50.47,51.01,51.01,51.01, -596, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.33,47.04,50.46,51.00,51.00,51.00, -597, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.33,47.04,50.45,50.99,50.99,50.99, -598, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.32,47.03,50.44,50.99,50.99,50.99, -599, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.32,47.02,50.43,50.98,50.98,50.98, -600, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.32,47.02,50.42,50.97,50.97,50.97, -601, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.31,47.01,50.41,50.96,50.96,50.96, -602, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.31,47.00,50.40,50.95,50.95,50.95, -603, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.31,47.00,50.39,50.94,50.94,50.94, -604, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.30,46.99,50.38,50.93,50.93,50.93, -605, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.30,46.99,50.37,50.92,50.92,50.92, -606, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.29,46.98,50.36,50.92,50.92,50.92, -607, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.29,46.97,50.35,50.91,50.91,50.91, -608, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.29,46.97,50.34,50.90,50.90,50.90, -609, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.28,46.96,50.33,50.89,50.89,50.89, -610, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.28,46.95,50.32,50.88,50.88,50.88, -611, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.28,46.95,50.31,50.87,50.87,50.87, -612, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.27,46.94,50.30,50.86,50.86,50.86, -613, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.27,46.93,50.29,50.85,50.85,50.85, -614, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.26,46.93,50.28,50.85,50.85,50.85, -615, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.26,46.92,50.27,50.84,50.84,50.84, -616, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.26,46.91,50.26,50.83,50.83,50.83, -617, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.25,46.91,50.25,50.82,50.82,50.82, -618, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.25,46.90,50.24,50.81,50.81,50.81, -619, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.25,46.89,50.23,50.80,50.80,50.80, -620, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.24,46.89,50.22,50.79,50.79,50.79, -621, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.24,46.88,50.21,50.79,50.79,50.79, -622, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.23,46.87,50.20,50.78,50.78,50.78, -623, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.23,46.87,50.19,50.77,50.77,50.77, -624, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.23,46.86,50.18,50.76,50.76,50.76, -625, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.22,46.85,50.17,50.75,50.75,50.75, -626, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.22,46.85,50.16,50.74,50.74,50.74, -627, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.22,46.84,50.15,50.73,50.73,50.73, -628, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.21,46.83,50.14,50.72,50.72,50.72, -629, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.21,46.83,50.13,50.72,50.72,50.72, -630, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.21,46.82,50.12,50.71,50.71,50.71, -631, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.20,46.81,50.11,50.70,50.70,50.70, -632, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.20,46.81,50.10,50.69,50.69,50.69, -633, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.19,46.80,50.09,50.68,50.68,50.68, -634, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.19,46.79,50.08,50.67,50.67,50.67, -635, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.19,46.79,50.07,50.66,50.66,50.66, -636, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.18,46.78,50.06,50.66,50.66,50.66, -637, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.18,46.77,50.05,50.65,50.65,50.65, -638, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.18,46.77,50.04,50.64,50.64,50.64, -639, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.17,46.76,50.03,50.63,50.63,50.63, -640, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.17,46.75,50.02,50.62,50.62,50.62, -641, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.17,46.74,50.01,50.61,50.61,50.61, -642, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.16,46.74,50.00,50.60,50.60,50.60, -643, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.16,46.73,49.99,50.59,50.59,50.59, -644, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.16,46.72,49.98,50.59,50.59,50.59, -645, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.15,46.72,49.97,50.58,50.58,50.58, -646, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.15,46.71,49.96,50.57,50.57,50.57, -647, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.14,46.70,49.95,50.56,50.56,50.56, -648, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.14,46.70,49.94,50.55,50.55,50.55, -649, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.14,46.69,49.93,50.54,50.54,50.54, -650, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.13,46.68,49.92,50.53,50.53,50.53, -651, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.13,46.67,49.91,50.53,50.53,50.53, -652, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.13,46.67,49.90,50.52,50.52,50.52, -653, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.12,46.66,49.89,50.51,50.51,50.51, -654, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.12,46.65,49.88,50.50,50.50,50.50, -655, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.12,46.65,49.87,50.49,50.49,50.49, -656, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.11,46.64,49.87,50.48,50.48,50.48, -657, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.11,46.63,49.86,50.47,50.47,50.47, -658, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.11,46.62,49.85,50.46,50.46,50.46, -659, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.10,46.62,49.84,50.46,50.46,50.46, -660, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.10,46.61,49.83,50.45,50.45,50.45, -661, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.10,46.60,49.82,50.44,50.44,50.44, -662, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.09,46.60,49.81,50.43,50.43,50.43, -663, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.09,46.59,49.80,50.42,50.42,50.42, -664, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.09,46.58,49.79,50.41,50.41,50.41, -665, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.08,46.57,49.78,50.40,50.40,50.40, -666, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.08,46.57,49.77,50.40,50.40,50.40, -667, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.08,46.56,49.76,50.39,50.39,50.39, -668, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.07,46.55,49.75,50.38,50.38,50.38, -669, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.07,46.54,49.74,50.37,50.37,50.37, -670, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.06,46.54,49.73,50.36,50.36,50.36, -671, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.06,46.53,49.72,50.35,50.35,50.35, -672, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.06,46.52,49.71,50.34,50.34,50.34, -673, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.05,46.52,49.70,50.34,50.34,50.34, -674, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.05,46.51,49.69,50.33,50.33,50.33, -675, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.05,46.50,49.69,50.32,50.32,50.32, -676, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.04,46.49,49.68,50.31,50.31,50.31, -677, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.04,46.49,49.67,50.30,50.30,50.30, -678, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.04,46.48,49.66,50.29,50.29,50.29, -679, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.03,46.47,49.65,50.28,50.28,50.28, -680, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.03,46.46,49.64,50.28,50.28,50.28, -681, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.03,46.46,49.63,50.27,50.27,50.27, -682, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.02,46.45,49.62,50.26,50.26,50.26, -683, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.02,46.44,49.61,50.25,50.25,50.25, -684, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.02,46.43,49.60,50.24,50.24,50.24, -685, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.01,46.43,49.59,50.23,50.23,50.23, -686, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.01,46.42,49.58,50.22,50.22,50.22, -687, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.01,46.41,49.57,50.22,50.22,50.22, -688, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.00,46.41,49.56,50.21,50.21,50.21, -689, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.00,46.40,49.56,50.20,50.20,50.20, -690, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,40.00,46.39,49.55,50.19,50.19,50.19, -691, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.99,46.38,49.54,50.18,50.18,50.18, -692, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.99,46.38,49.53,50.17,50.17,50.17, -693, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.99,46.37,49.52,50.16,50.16,50.16, -694, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.98,46.36,49.51,50.16,50.16,50.16, -695, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.98,46.35,49.50,50.15,50.15,50.15, -696, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.98,46.35,49.49,50.14,50.14,50.14, -697, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.97,46.34,49.48,50.13,50.13,50.13, -698, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.97,46.33,49.47,50.12,50.12,50.12, -699, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.97,46.32,49.46,50.11,50.11,50.11, -700, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.96,46.32,49.45,50.10,50.10,50.10, -701, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.96,46.31,49.45,50.10,50.10,50.10, -702, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.96,46.30,49.44,50.09,50.09,50.09, -703, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.95,46.29,49.43,50.08,50.08,50.08, -704, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.95,46.29,49.42,50.07,50.07,50.07, -705, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.95,46.28,49.41,50.06,50.06,50.06, -706, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.94,46.27,49.40,50.05,50.05,50.05, -707, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.94,46.26,49.39,50.04,50.04,50.04, -708, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.94,46.26,49.38,50.04,50.04,50.04, -709, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.93,46.25,49.37,50.03,50.03,50.03, -710, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.93,46.24,49.36,50.02,50.02,50.02, -711, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.93,46.23,49.35,50.01,50.01,50.01, -712, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.92,46.23,49.35,50.00,50.00,50.00, -713, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.92,46.22,49.34,49.99,49.99,49.99, -714, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.92,46.21,49.33,49.99,49.99,49.99, -715, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.91,46.20,49.32,49.98,49.98,49.98, -716, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.91,46.20,49.31,49.97,49.97,49.97, -717, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.91,46.19,49.30,49.96,49.96,49.96, -718, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.90,46.18,49.29,49.95,49.95,49.95, -719, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.90,46.17,49.28,49.94,49.94,49.94, -720, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.90,46.16,49.27,49.93,49.93,49.93, -721, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.89,46.16,49.26,49.93,49.93,49.93, -722, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.89,46.15,49.26,49.92,49.92,49.92, -723, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.89,46.14,49.25,49.91,49.91,49.91, -724, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.88,46.13,49.24,49.90,49.90,49.90, -725, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.88,46.13,49.23,49.89,49.89,49.89, -726, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.88,46.12,49.22,49.88,49.88,49.88, -727, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.87,46.11,49.21,49.88,49.88,49.88, -728, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.87,46.10,49.20,49.87,49.87,49.87, -729, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.87,46.10,49.19,49.86,49.86,49.86, -730, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.86,46.09,49.18,49.85,49.85,49.85, -731, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.86,46.08,49.17,49.84,49.84,49.84, -732, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.86,46.07,49.17,49.83,49.83,49.83, -733, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.85,46.07,49.16,49.82,49.82,49.82, -734, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.85,46.06,49.15,49.82,49.82,49.82, -735, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.85,46.05,49.14,49.81,49.81,49.81, -736, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.84,46.04,49.13,49.80,49.80,49.80, -737, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.84,46.04,49.12,49.79,49.79,49.79, -738, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.84,46.03,49.11,49.78,49.78,49.78, -739, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.83,46.02,49.10,49.77,49.77,49.77, -740, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.83,46.01,49.09,49.77,49.77,49.77, -741, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.83,46.00,49.09,49.76,49.76,49.76, -742, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.82,46.00,49.08,49.75,49.75,49.75, -743, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.82,45.99,49.07,49.74,49.74,49.74, -744, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.82,45.98,49.06,49.73,49.73,49.73, -745, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.81,45.97,49.05,49.72,49.72,49.72, -746, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.81,45.97,49.04,49.71,49.71,49.71, -747, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.81,45.96,49.03,49.71,49.71,49.71, -748, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.80,45.95,49.02,49.70,49.70,49.70, -749, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.80,45.94,49.02,49.69,49.69,49.69, -750, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.80,45.94,49.01,49.68,49.68,49.68, -751, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.79,45.93,49.00,49.67,49.67,49.67, -752, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.79,45.92,48.99,49.66,49.66,49.66, -753, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.79,45.91,48.98,49.66,49.66,49.66, -754, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.79,45.91,48.97,49.65,49.65,49.65, -755, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.78,45.90,48.96,49.64,49.64,49.64, -756, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.78,45.89,48.95,49.63,49.63,49.63, -757, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.78,45.88,48.95,49.62,49.62,49.62, -758, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.77,45.87,48.94,49.61,49.61,49.61, -759, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.77,45.87,48.93,49.60,49.60,49.60, -760, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.77,45.86,48.92,49.60,49.60,49.60, -761, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.76,45.85,48.91,49.59,49.59,49.59, -762, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.76,45.84,48.90,49.58,49.58,49.58, -763, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.76,45.84,48.89,49.57,49.57,49.57, -764, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.75,45.83,48.88,49.56,49.56,49.56, -765, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.75,45.82,48.88,49.55,49.55,49.55, -766, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.75,45.81,48.87,49.55,49.55,49.55, -767, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.74,45.81,48.86,49.54,49.54,49.54, -768, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.74,45.80,48.85,49.53,49.53,49.53, -769, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.74,45.79,48.84,49.52,49.52,49.52, -770, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.73,45.78,48.83,49.51,49.51,49.51, -771, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.73,45.77,48.82,49.50,49.50,49.50, -772, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.73,45.77,48.81,49.50,49.50,49.50, -773, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.72,45.76,48.81,49.49,49.49,49.49, -774, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.72,45.75,48.80,49.48,49.48,49.48, -775, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.72,45.74,48.79,49.47,49.47,49.47, -776, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.71,45.74,48.78,49.46,49.46,49.46, -777, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.71,45.73,48.77,49.45,49.45,49.45, -778, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.71,45.72,48.76,49.45,49.45,49.45, -779, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.70,45.71,48.75,49.44,49.44,49.44, -780, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.70,45.71,48.75,49.43,49.43,49.43, -781, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.70,45.70,48.74,49.42,49.42,49.42, -782, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.69,45.69,48.73,49.41,49.41,49.41, -783, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.69,45.68,48.72,49.40,49.40,49.40, -784, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.69,45.67,48.71,49.40,49.40,49.40, -785, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.68,45.67,48.70,49.39,49.39,49.39, -786, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.68,45.66,48.69,49.38,49.38,49.38, -787, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.68,45.65,48.69,49.37,49.37,49.37, -788, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.67,45.64,48.68,49.36,49.36,49.36, -789, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.67,45.64,48.67,49.35,49.35,49.35, -790, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.67,45.63,48.66,49.35,49.35,49.35, -791, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.66,45.62,48.65,49.34,49.34,49.34, -792, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.66,45.61,48.64,49.33,49.33,49.33, -793, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.66,45.61,48.63,49.32,49.32,49.32, -794, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.65,45.60,48.63,49.31,49.31,49.31, -795, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.65,45.59,48.62,49.30,49.30,49.30, -796, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.65,45.58,48.61,49.30,49.30,49.30, -797, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.64,45.57,48.60,49.29,49.29,49.29, -798, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.64,45.57,48.59,49.28,49.28,49.28, -799, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.64,45.56,48.58,49.27,49.27,49.27, -800, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.63,45.55,48.57,49.26,49.26,49.26, -801, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.63,45.54,48.57,49.25,49.25,49.25, -802, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.63,45.54,48.56,49.25,49.25,49.25, -803, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.62,45.53,48.55,49.24,49.24,49.24, -804, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.62,45.52,48.54,49.23,49.23,49.23, -805, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.62,45.51,48.53,49.22,49.22,49.22, -806, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.61,45.51,48.52,49.21,49.21,49.21, -807, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.61,45.50,48.51,49.20,49.20,49.20, -808, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.61,45.49,48.51,49.20,49.20,49.20, -809, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.60,45.48,48.50,49.19,49.19,49.19, -810, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.60,45.47,48.49,49.18,49.18,49.18, -811, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.60,45.47,48.48,49.17,49.17,49.17, -812, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.59,45.46,48.47,49.16,49.16,49.16, -813, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.59,45.45,48.46,49.15,49.15,49.15, -814, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.59,45.44,48.46,49.15,49.15,49.15, -815, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.58,45.44,48.45,49.14,49.14,49.14, -816, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.58,45.43,48.44,49.13,49.13,49.13, -817, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.58,45.42,48.43,49.12,49.12,49.12, -818, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.57,45.41,48.42,49.11,49.11,49.11, -819, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.57,45.41,48.41,49.10,49.10,49.10, -820, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.57,45.40,48.40,49.10,49.10,49.10, -821, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.56,45.39,48.40,49.09,49.09,49.09, -822, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.56,45.38,48.39,49.08,49.08,49.08, -823, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.56,45.37,48.38,49.07,49.07,49.07, -824, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.55,45.37,48.37,49.06,49.06,49.06, -825, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.55,45.36,48.36,49.05,49.05,49.05, -826, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.55,45.35,48.35,49.05,49.05,49.05, -827, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.54,45.34,48.35,49.04,49.04,49.04, -828, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.54,45.34,48.34,49.03,49.03,49.03, -829, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.54,45.33,48.33,49.02,49.02,49.02, -830, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.53,45.32,48.32,49.01,49.01,49.01, -831, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.53,45.31,48.31,49.01,49.01,49.01, -832, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.53,45.31,48.30,49.00,49.00,49.00, -833, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.52,45.30,48.30,48.99,48.99,48.99, -834, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.52,45.29,48.29,48.98,48.98,48.98, -835, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.52,45.28,48.28,48.97,48.97,48.97, -836, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.51,45.28,48.27,48.96,48.96,48.96, -837, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.51,45.27,48.26,48.96,48.96,48.96, -838, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.51,45.26,48.25,48.95,48.95,48.95, -839, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.50,45.25,48.25,48.94,48.94,48.94, -840, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.50,45.24,48.24,48.93,48.93,48.93, -841, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.50,45.24,48.23,48.92,48.92,48.92, -842, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.49,45.23,48.22,48.91,48.91,48.91, -843, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.49,45.22,48.21,48.91,48.91,48.91, -844, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.49,45.21,48.20,48.90,48.90,48.90, -845, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.48,45.21,48.20,48.89,48.89,48.89, -846, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.48,45.20,48.19,48.88,48.88,48.88, -847, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.48,45.19,48.18,48.87,48.87,48.87, -848, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.47,45.18,48.17,48.87,48.87,48.87, -849, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.47,45.18,48.16,48.86,48.86,48.86, -850, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.47,45.17,48.15,48.85,48.85,48.85, -851, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.46,45.16,48.15,48.84,48.84,48.84, -852, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.46,45.15,48.14,48.83,48.83,48.83, -853, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.46,45.15,48.13,48.82,48.82,48.82, -854, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.45,45.14,48.12,48.82,48.82,48.82, -855, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.45,45.13,48.11,48.81,48.81,48.81, -856, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.45,45.12,48.10,48.80,48.80,48.80, -857, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.44,45.12,48.10,48.79,48.79,48.79, -858, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.44,45.11,48.09,48.78,48.78,48.78, -859, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.44,45.10,48.08,48.77,48.77,48.77, -860, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.43,45.09,48.07,48.77,48.77,48.77, -861, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.43,45.08,48.06,48.76,48.76,48.76, -862, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.43,45.08,48.05,48.75,48.75,48.75, -863, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.42,45.07,48.05,48.74,48.74,48.74, -864, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.42,45.06,48.04,48.73,48.73,48.73, -865, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.42,45.05,48.03,48.73,48.73,48.73, -866, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.41,45.05,48.02,48.72,48.72,48.72, -867, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.41,45.04,48.01,48.71,48.71,48.71, -868, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.41,45.03,48.01,48.70,48.70,48.70, -869, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.40,45.02,48.00,48.69,48.69,48.69, -870, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.40,45.02,47.99,48.68,48.68,48.68, -871, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.40,45.01,47.98,48.68,48.68,48.68, -872, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.39,45.00,47.97,48.67,48.67,48.67, -873, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.39,44.99,47.96,48.66,48.66,48.66, -874, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.39,44.99,47.96,48.65,48.65,48.65, -875, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.38,44.98,47.95,48.64,48.64,48.64, -876, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.38,44.97,47.94,48.64,48.64,48.64, -877, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.38,44.96,47.93,48.63,48.63,48.63, -878, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.37,44.96,47.92,48.62,48.62,48.62, -879, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.37,44.95,47.92,48.61,48.61,48.61, -880, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.37,44.94,47.91,48.60,48.60,48.60, -881, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.36,44.93,47.90,48.60,48.60,48.60, -882, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.36,44.93,47.89,48.59,48.59,48.59, -883, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.36,44.92,47.88,48.58,48.58,48.58, -884, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.35,44.91,47.87,48.57,48.57,48.57, -885, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.35,44.90,47.87,48.56,48.56,48.56, -886, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.35,44.90,47.86,48.55,48.55,48.55, -887, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.34,44.89,47.85,48.55,48.55,48.55, -888, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.34,44.88,47.84,48.54,48.54,48.54, -889, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.34,44.87,47.83,48.53,48.53,48.53, -890, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.33,44.87,47.83,48.52,48.52,48.52, -891, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.33,44.86,47.82,48.51,48.51,48.51, -892, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.33,44.85,47.81,48.51,48.51,48.51, -893, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.32,44.84,47.80,48.50,48.50,48.50, -894, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.32,44.84,47.79,48.49,48.49,48.49, -895, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.32,44.83,47.78,48.48,48.48,48.48, -896, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.31,44.82,47.78,48.47,48.47,48.47, -897, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.31,44.81,47.77,48.47,48.47,48.47, -898, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.31,44.81,47.76,48.46,48.46,48.46, -899, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.30,44.80,47.75,48.45,48.45,48.45, -900, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.30,44.79,47.74,48.44,48.44,48.44, -901, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.30,44.78,47.74,48.43,48.43,48.43, -902, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.29,44.78,47.73,48.42,48.42,48.42, -903, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.29,44.77,47.72,48.42,48.42,48.42, -904, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.29,44.76,47.71,48.41,48.41,48.41, -905, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.28,44.75,47.70,48.40,48.40,48.40, -906, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.28,44.75,47.69,48.39,48.39,48.39, -907, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.28,44.74,47.69,48.38,48.38,48.38, -908, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.27,44.73,47.68,48.38,48.38,48.38, -909, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.27,44.72,47.67,48.37,48.37,48.37, -910, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.27,44.72,47.66,48.36,48.36,48.36, -911, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.26,44.71,47.65,48.35,48.35,48.35, -912, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.26,44.70,47.65,48.34,48.34,48.34, -913, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.26,44.69,47.64,48.34,48.34,48.34, -914, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.25,44.69,47.63,48.33,48.33,48.33, -915, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.25,44.68,47.62,48.32,48.32,48.32, -916, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.25,44.67,47.61,48.31,48.31,48.31, -917, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.24,44.66,47.61,48.30,48.30,48.30, -918, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.24,44.66,47.60,48.30,48.30,48.30, -919, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.23,44.65,47.59,48.29,48.29,48.29, -920, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.23,44.64,47.58,48.28,48.28,48.28, -921, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.23,44.63,47.57,48.27,48.27,48.27, -922, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.22,44.63,47.57,48.26,48.26,48.26, -923, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.22,44.62,47.56,48.25,48.25,48.25, -924, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.22,44.61,47.55,48.25,48.25,48.25, -925, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.21,44.60,47.54,48.24,48.24,48.24, -926, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.21,44.60,47.53,48.23,48.23,48.23, -927, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.21,44.59,47.53,48.22,48.22,48.22, -928, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.20,44.58,47.52,48.21,48.21,48.21, -929, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.20,44.57,47.51,48.21,48.21,48.21, -930, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.20,44.57,47.50,48.20,48.20,48.20, -931, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.19,44.56,47.49,48.19,48.19,48.19, -932, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.19,44.55,47.49,48.18,48.18,48.18, -933, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.19,44.54,47.48,48.17,48.17,48.17, -934, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.18,44.54,47.47,48.17,48.17,48.17, -935, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.18,44.53,47.46,48.16,48.16,48.16, -936, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.18,44.52,47.45,48.15,48.15,48.15, -937, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.17,44.52,47.45,48.14,48.14,48.14, -938, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.17,44.51,47.44,48.13,48.13,48.13, -939, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.17,44.50,47.43,48.13,48.13,48.13, -940, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.16,44.49,47.42,48.12,48.12,48.12, -941, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.16,44.49,47.41,48.11,48.11,48.11, -942, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.16,44.48,47.41,48.10,48.10,48.10, -943, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.15,44.47,47.40,48.09,48.09,48.09, -944, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.15,44.46,47.39,48.09,48.09,48.09, -945, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.15,44.46,47.38,48.08,48.08,48.08, -946, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.14,44.45,47.37,48.07,48.07,48.07, -947, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.14,44.44,47.37,48.06,48.06,48.06, -948, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.14,44.43,47.36,48.05,48.05,48.05, -949, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.13,44.43,47.35,48.05,48.05,48.05, -950, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.13,44.42,47.34,48.04,48.04,48.04, -951, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.12,44.41,47.33,48.03,48.03,48.03, -952, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.12,44.40,47.33,48.02,48.02,48.02, -953, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.12,44.40,47.32,48.01,48.01,48.01, -954, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.11,44.39,47.31,48.01,48.01,48.01, -955, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.11,44.38,47.30,48.00,48.00,48.00, -956, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.11,44.38,47.29,47.99,47.99,47.99, -957, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.10,44.37,47.29,47.98,47.98,47.98, -958, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.10,44.36,47.28,47.97,47.97,47.97, -959, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.10,44.35,47.27,47.97,47.97,47.97, -960, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.09,44.35,47.26,47.96,47.96,47.96, -961, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.09,44.34,47.25,47.95,47.95,47.95, -962, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.09,44.33,47.25,47.94,47.94,47.94, -963, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.08,44.32,47.24,47.93,47.93,47.93, -964, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.08,44.32,47.23,47.93,47.93,47.93, -965, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.08,44.31,47.22,47.92,47.92,47.92, -966, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.07,44.30,47.21,47.91,47.91,47.91, -967, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.07,44.30,47.21,47.90,47.90,47.90, -968, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.07,44.29,47.20,47.89,47.89,47.89, -969, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.06,44.28,47.19,47.89,47.89,47.89, -970, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.06,44.27,47.18,47.88,47.88,47.88, -971, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.06,44.27,47.17,47.87,47.87,47.87, -972, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.05,44.26,47.17,47.86,47.86,47.86, -973, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.05,44.25,47.16,47.85,47.85,47.85, -974, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.04,44.24,47.15,47.85,47.85,47.85, -975, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.04,44.24,47.14,47.84,47.84,47.84, -976, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.04,44.23,47.13,47.83,47.83,47.83, -977, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.03,44.22,47.13,47.82,47.82,47.82, -978, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.03,44.22,47.12,47.82,47.82,47.82, -979, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.03,44.21,47.11,47.81,47.81,47.81, -980, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.02,44.20,47.10,47.80,47.80,47.80, -981, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.02,44.19,47.10,47.79,47.79,47.79, -982, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.02,44.19,47.09,47.78,47.78,47.78, -983, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.01,44.18,47.08,47.78,47.78,47.78, -984, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.01,44.17,47.07,47.77,47.77,47.77, -985, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.01,44.16,47.06,47.76,47.76,47.76, -986, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.00,44.16,47.06,47.75,47.75,47.75, -987, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.00,44.15,47.05,47.74,47.74,47.74, -988, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,39.00,44.14,47.04,47.74,47.74,47.74, -989, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.99,44.14,47.03,47.73,47.73,47.73, -990, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.99,44.13,47.02,47.72,47.72,47.72, -991, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.98,44.12,47.02,47.71,47.71,47.71, -992, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.98,44.11,47.01,47.70,47.70,47.70, -993, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.98,44.11,47.00,47.70,47.70,47.70, -994, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.97,44.10,46.99,47.69,47.69,47.69, -995, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.97,44.09,46.99,47.68,47.68,47.68, -996, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.97,44.09,46.98,47.67,47.67,47.67, -997, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.96,44.08,46.97,47.66,47.66,47.66, -998, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.96,44.07,46.96,47.66,47.66,47.66, -999, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.96,44.06,46.95,47.65,47.65,47.65, -1000, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.95,44.06,46.95,47.64,47.64,47.64, -1001, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.95,44.05,46.94,47.63,47.63,47.63, -1002, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.95,44.04,46.93,47.63,47.63,47.63, -1003, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.94,44.04,46.92,47.62,47.62,47.62, -1004, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.94,44.03,46.91,47.61,47.61,47.61, -1005, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.94,44.02,46.91,47.60,47.60,47.60, -1006, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.93,44.01,46.90,47.59,47.59,47.59, -1007, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.93,44.01,46.89,47.59,47.59,47.59, -1008, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.92,44.00,46.88,47.58,47.58,47.58, -1009, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.92,43.99,46.88,47.57,47.57,47.57, -1010, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.92,43.98,46.87,47.56,47.56,47.56, -1011, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.91,43.98,46.86,47.55,47.55,47.55, -1012, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.91,43.97,46.85,47.55,47.55,47.55, -1013, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.91,43.96,46.84,47.54,47.54,47.54, -1014, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.90,43.96,46.84,47.53,47.53,47.53, -1015, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.90,43.95,46.83,47.52,47.52,47.52, -1016, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.90,43.94,46.82,47.52,47.52,47.52, -1017, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.89,43.94,46.81,47.51,47.51,47.51, -1018, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.89,43.93,46.81,47.50,47.50,47.50, -1019, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.89,43.92,46.80,47.49,47.49,47.49, -1020, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.88,43.91,46.79,47.48,47.48,47.48, -1021, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.88,43.91,46.78,47.48,47.48,47.48, -1022, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.88,43.90,46.77,47.47,47.47,47.47, -1023, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.87,43.89,46.77,47.46,47.46,47.46, -1024, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.87,43.89,46.76,47.45,47.45,47.45, -1025, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.86,43.88,46.75,47.44,47.44,47.44, -1026, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.86,43.87,46.74,47.44,47.44,47.44, -1027, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.86,43.86,46.74,47.43,47.43,47.43, -1028, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.85,43.86,46.73,47.42,47.42,47.42, -1029, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.85,43.85,46.72,47.41,47.41,47.41, -1030, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.85,43.84,46.71,47.41,47.41,47.41, -1031, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.84,43.84,46.70,47.40,47.40,47.40, -1032, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.84,43.83,46.70,47.39,47.39,47.39, -1033, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.84,43.82,46.69,47.38,47.38,47.38, -1034, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.83,43.81,46.68,47.37,47.37,47.37, -1035, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.83,43.81,46.67,47.37,47.37,47.37, -1036, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.83,43.80,46.67,47.36,47.36,47.36, -1037, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.82,43.79,46.66,47.35,47.35,47.35, -1038, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.82,43.79,46.65,47.34,47.34,47.34, -1039, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.81,43.78,46.64,47.34,47.34,47.34, -1040, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.81,43.77,46.63,47.33,47.33,47.33, -1041, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.81,43.77,46.63,47.32,47.32,47.32, -1042, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.80,43.76,46.62,47.31,47.31,47.31, -1043, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.80,43.75,46.61,47.30,47.30,47.30, -1044, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.80,43.74,46.60,47.30,47.30,47.30, -1045, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.79,43.74,46.60,47.29,47.29,47.29, -1046, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.79,43.73,46.59,47.28,47.28,47.28, -1047, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.79,43.72,46.58,47.27,47.27,47.27, -1048, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.78,43.72,46.57,47.26,47.26,47.26, -1049, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.78,43.71,46.57,47.26,47.26,47.26, -1050, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.77,43.70,46.56,47.25,47.25,47.25, -1051, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.77,43.69,46.55,47.24,47.24,47.24, -1052, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.77,43.69,46.54,47.23,47.23,47.23, -1053, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.76,43.68,46.53,47.23,47.23,47.23, -1054, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.76,43.67,46.53,47.22,47.22,47.22, -1055, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.76,43.67,46.52,47.21,47.21,47.21, -1056, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.75,43.66,46.51,47.20,47.20,47.20, -1057, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.75,43.65,46.50,47.19,47.19,47.19, -1058, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.75,43.65,46.50,47.19,47.19,47.19, -1059, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.74,43.64,46.49,47.18,47.18,47.18, -1060, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.74,43.63,46.48,47.17,47.17,47.17, -1061, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.74,43.63,46.47,47.16,47.16,47.16, -1062, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.73,43.62,46.47,47.16,47.16,47.16, -1063, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.73,43.61,46.46,47.15,47.15,47.15, -1064, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.72,43.60,46.45,47.14,47.14,47.14, -1065, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.72,43.60,46.44,47.13,47.13,47.13, -1066, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.72,43.59,46.43,47.13,47.13,47.13, -1067, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.71,43.58,46.43,47.12,47.12,47.12, -1068, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.71,43.58,46.42,47.11,47.11,47.11, -1069, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.71,43.57,46.41,47.10,47.10,47.10, -1070, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.70,43.56,46.40,47.09,47.09,47.09, -1071, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.70,43.56,46.40,47.09,47.09,47.09, -1072, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.70,43.55,46.39,47.08,47.08,47.08, -1073, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.69,43.54,46.38,47.07,47.07,47.07, -1074, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.69,43.53,46.37,47.06,47.06,47.06, -1075, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.68,43.53,46.37,47.06,47.06,47.06, -1076, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.68,43.52,46.36,47.05,47.05,47.05, -1077, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.68,43.51,46.35,47.04,47.04,47.04, -1078, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.67,43.51,46.34,47.03,47.03,47.03, -1079, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.67,43.50,46.33,47.02,47.02,47.02, -1080, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.67,43.49,46.33,47.02,47.02,47.02, -1081, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.66,43.49,46.32,47.01,47.01,47.01, -1082, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.66,43.48,46.31,47.00,47.00,47.00, -1083, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.66,43.47,46.30,46.99,46.99,46.99, -1084, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.65,43.47,46.30,46.99,46.99,46.99, -1085, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.65,43.46,46.29,46.98,46.98,46.98, -1086, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.64,43.45,46.28,46.97,46.97,46.97, -1087, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.64,43.45,46.27,46.96,46.96,46.96, -1088, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.64,43.44,46.27,46.96,46.96,46.96, -1089, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.63,43.43,46.26,46.95,46.95,46.95, -1090, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.63,43.42,46.25,46.94,46.94,46.94, -1091, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.63,43.42,46.24,46.93,46.93,46.93, -1092, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.62,43.41,46.24,46.92,46.92,46.92, -1093, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.62,43.40,46.23,46.92,46.92,46.92, -1094, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.62,43.40,46.22,46.91,46.91,46.91, -1095, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.61,43.39,46.21,46.90,46.90,46.90, -1096, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.61,43.38,46.21,46.89,46.89,46.89, -1097, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.60,43.38,46.20,46.89,46.89,46.89, -1098, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.60,43.37,46.19,46.88,46.88,46.88, -1099, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.60,43.36,46.18,46.87,46.87,46.87, -1100, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.59,43.36,46.17,46.86,46.86,46.86, -1101, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.59,43.35,46.17,46.86,46.86,46.86, -1102, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.59,43.34,46.16,46.85,46.85,46.85, -1103, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.58,43.34,46.15,46.84,46.84,46.84, -1104, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.58,43.33,46.14,46.83,46.83,46.83, -1105, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.58,43.32,46.14,46.82,46.82,46.82, -1106, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.57,43.31,46.13,46.82,46.82,46.82, -1107, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.57,43.31,46.12,46.81,46.81,46.81, -1108, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,43.30,46.11,46.80,46.80,46.80, -1109, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,43.29,46.11,46.79,46.79,46.79, -1110, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.56,43.29,46.10,46.79,46.79,46.79, -1111, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.55,43.28,46.09,46.78,46.78,46.78, -1112, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.55,43.27,46.08,46.77,46.77,46.77, -1113, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.55,43.27,46.08,46.76,46.76,46.76, -1114, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.54,43.26,46.07,46.76,46.76,46.76, -1115, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.54,43.25,46.06,46.75,46.75,46.75, -1116, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.54,43.25,46.05,46.74,46.74,46.74, -1117, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.53,43.24,46.05,46.73,46.73,46.73, -1118, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.53,43.23,46.04,46.72,46.72,46.72, -1119, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.52,43.23,46.03,46.72,46.72,46.72, -1120, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.52,43.22,46.02,46.71,46.71,46.71, -1121, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.52,43.21,46.02,46.70,46.70,46.70, -1122, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.51,43.21,46.01,46.69,46.69,46.69, -1123, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.51,43.20,46.00,46.69,46.69,46.69, -1124, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.51,43.19,45.99,46.68,46.68,46.68, -1125, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,38.50,43.19,45.99,46.67,46.67,46.67, -1126, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,41.35,43.18,45.98,46.66,46.66,46.66, -1127, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,43.53,43.84,45.97,46.66,46.66,46.66, -1128, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,45.10,45.10,45.96,46.65,46.65,46.65, -1129, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.32,46.32,46.35,46.64,46.64,46.64, -1130, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,46.95,46.95,46.95,46.95,46.95,46.95, -1131, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.42,47.42,47.42,47.42,47.42,47.42, -1132, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,47.89,47.89,47.89,47.89,47.89,47.89, -1133, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.36,48.36,48.36,48.36,48.36,48.36, -1134, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,48.82,48.82,48.82,48.82,48.82,48.82, -1135, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.29,49.29,49.29,49.29,49.29,49.29, -1136, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,49.76,49.76,49.76,49.76,49.76,49.76, -1137, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.22,50.22,50.22,50.22,50.22,50.22, -1138, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,50.69,50.69,50.69,50.69,50.69,50.69, -1139, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.16,51.16,51.16,51.16,51.16,51.16, -1140, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,75.00,75.00,0.00,0.00,51.62,51.62,51.62,51.62,51.62,51.62, -1141, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,8.28,8.28,0.00,0.00,51.67,51.67,51.67,51.67,51.67,51.67, -1142, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.65,51.66,51.66,51.66,51.66,51.66, -1143, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.64,51.65,51.65,51.65,51.65,51.65, -1144, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.63,51.64,51.64,51.64,51.64,51.64, -1145, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.62,51.63,51.63,51.63,51.63,51.63, -1146, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.60,51.63,51.63,51.63,51.63,51.63, -1147, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.59,51.62,51.62,51.62,51.62,51.62, -1148, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.58,51.61,51.61,51.61,51.61,51.61, -1149, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.57,51.60,51.60,51.60,51.60,51.60, -1150, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.56,51.59,51.59,51.59,51.59,51.59, -1151, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.54,51.58,51.58,51.58,51.58,51.58, -1152, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.53,51.58,51.58,51.58,51.58,51.58, -1153, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.52,51.57,51.57,51.57,51.57,51.57, -1154, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.51,51.56,51.56,51.56,51.56,51.56, -1155, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.49,51.55,51.55,51.55,51.55,51.55, -1156, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.48,51.54,51.54,51.54,51.54,51.54, -1157, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.47,51.54,51.54,51.54,51.54,51.54, -1158, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.46,51.53,51.53,51.53,51.53,51.53, -1159, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.45,51.52,51.52,51.52,51.52,51.52, -1160, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.43,51.51,51.51,51.51,51.51,51.51, -1161, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.42,51.50,51.50,51.50,51.50,51.50, -1162, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.41,51.49,51.49,51.49,51.49,51.49, -1163, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.40,51.49,51.49,51.49,51.49,51.49, -1164, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.38,51.48,51.48,51.48,51.48,51.48, -1165, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.37,51.47,51.47,51.47,51.47,51.47, -1166, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.36,51.46,51.46,51.46,51.46,51.46, -1167, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.35,51.45,51.45,51.45,51.45,51.45, -1168, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.34,51.45,51.45,51.45,51.45,51.45, -1169, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.32,51.44,51.44,51.44,51.44,51.44, -1170, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.31,51.43,51.43,51.43,51.43,51.43, -1171, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.30,51.42,51.42,51.42,51.42,51.42, -1172, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.29,51.41,51.41,51.41,51.41,51.41, -1173, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.28,51.40,51.40,51.40,51.40,51.40, -1174, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.26,51.40,51.40,51.40,51.40,51.40, -1175, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.25,51.39,51.39,51.39,51.39,51.39, -1176, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.24,51.38,51.38,51.38,51.38,51.38, -1177, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.23,51.37,51.37,51.37,51.37,51.37, -1178, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.22,51.36,51.36,51.36,51.36,51.36, -1179, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.21,51.36,51.36,51.36,51.36,51.36, -1180, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.19,51.35,51.35,51.35,51.35,51.35, -1181, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.18,51.34,51.34,51.34,51.34,51.34, -1182, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.17,51.33,51.33,51.33,51.33,51.33, -1183, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.16,51.32,51.32,51.32,51.32,51.32, -1184, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.15,51.31,51.31,51.31,51.31,51.31, -1185, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.13,51.31,51.31,51.31,51.31,51.31, -1186, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.12,51.30,51.30,51.30,51.30,51.30, -1187, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.11,51.29,51.29,51.29,51.29,51.29, -1188, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.10,51.28,51.28,51.28,51.28,51.28, -1189, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.09,51.27,51.27,51.27,51.27,51.27, -1190, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.08,51.27,51.27,51.27,51.27,51.27, -1191, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.06,51.26,51.26,51.26,51.26,51.26, -1192, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.05,51.25,51.25,51.25,51.25,51.25, -1193, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.04,51.24,51.24,51.24,51.24,51.24, -1194, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.03,51.23,51.23,51.23,51.23,51.23, -1195, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.02,51.22,51.22,51.22,51.22,51.22, -1196, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,51.01,51.22,51.22,51.22,51.22,51.22, -1197, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.99,51.21,51.21,51.21,51.21,51.21, -1198, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.98,51.20,51.20,51.20,51.20,51.20, -1199, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.97,51.19,51.19,51.19,51.19,51.19, -1200, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.96,51.18,51.18,51.18,51.18,51.18, -1201, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.95,51.18,51.18,51.18,51.18,51.18, -1202, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.93,51.17,51.17,51.17,51.17,51.17, -1203, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.92,51.16,51.16,51.16,51.16,51.16, -1204, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.91,51.15,51.15,51.15,51.15,51.15, -1205, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.90,51.14,51.14,51.14,51.14,51.14, -1206, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.89,51.13,51.13,51.13,51.13,51.13, -1207, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.88,51.13,51.13,51.13,51.13,51.13, -1208, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.86,51.12,51.12,51.12,51.12,51.12, -1209, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.85,51.11,51.11,51.11,51.11,51.11, -1210, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.84,51.10,51.10,51.10,51.10,51.10, -1211, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.83,51.09,51.09,51.09,51.09,51.09, -1212, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.82,51.09,51.09,51.09,51.09,51.09, -1213, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.81,51.08,51.08,51.08,51.08,51.08, -1214, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.80,51.07,51.07,51.07,51.07,51.07, -1215, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.78,51.06,51.06,51.06,51.06,51.06, -1216, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.77,51.05,51.05,51.05,51.05,51.05, -1217, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.76,51.05,51.05,51.05,51.05,51.05, -1218, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.75,51.04,51.04,51.04,51.04,51.04, -1219, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.74,51.03,51.03,51.03,51.03,51.03, -1220, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.73,51.02,51.02,51.02,51.02,51.02, -1221, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.71,51.01,51.01,51.01,51.01,51.01, -1222, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.70,51.00,51.00,51.00,51.00,51.00, -1223, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.69,51.00,51.00,51.00,51.00,51.00, -1224, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.68,50.99,50.99,50.99,50.99,50.99, -1225, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.67,50.98,50.98,50.98,50.98,50.98, -1226, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.66,50.97,50.97,50.97,50.97,50.97, -1227, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.64,50.96,50.96,50.96,50.96,50.96, -1228, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.63,50.96,50.96,50.96,50.96,50.96, -1229, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.62,50.95,50.95,50.95,50.95,50.95, -1230, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.61,50.94,50.94,50.94,50.94,50.94, -1231, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.60,50.93,50.93,50.93,50.93,50.93, -1232, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.59,50.92,50.92,50.92,50.92,50.92, -1233, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.58,50.92,50.92,50.92,50.92,50.92, -1234, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.56,50.91,50.91,50.91,50.91,50.91, -1235, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.55,50.90,50.90,50.90,50.90,50.90, -1236, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.54,50.89,50.89,50.89,50.89,50.89, -1237, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.53,50.88,50.88,50.88,50.88,50.88, -1238, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.52,50.88,50.88,50.88,50.88,50.88, -1239, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.51,50.87,50.87,50.87,50.87,50.87, -1240, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.49,50.86,50.86,50.86,50.86,50.86, -1241, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.48,50.85,50.85,50.85,50.85,50.85, -1242, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.47,50.84,50.84,50.84,50.84,50.84, -1243, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.46,50.83,50.83,50.83,50.83,50.83, -1244, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.45,50.83,50.83,50.83,50.83,50.83, -1245, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.44,50.82,50.82,50.82,50.82,50.82, -1246, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.43,50.81,50.81,50.81,50.81,50.81, -1247, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.41,50.80,50.80,50.80,50.80,50.80, -1248, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.40,50.79,50.79,50.79,50.79,50.79, -1249, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.39,50.79,50.79,50.79,50.79,50.79, -1250, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.38,50.78,50.78,50.78,50.78,50.78, -1251, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.37,50.77,50.77,50.77,50.77,50.77, -1252, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.36,50.76,50.76,50.76,50.76,50.76, -1253, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.35,50.75,50.75,50.75,50.75,50.75, -1254, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.33,50.75,50.75,50.75,50.75,50.75, -1255, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.32,50.74,50.74,50.74,50.74,50.74, -1256, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.31,50.73,50.73,50.73,50.73,50.73, -1257, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.30,50.72,50.72,50.72,50.72,50.72, -1258, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.29,50.71,50.71,50.71,50.71,50.71, -1259, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.28,50.71,50.71,50.71,50.71,50.71, -1260, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.27,50.70,50.70,50.70,50.70,50.70, -1261, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.25,50.69,50.69,50.69,50.69,50.69, -1262, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.24,50.68,50.68,50.68,50.68,50.68, -1263, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.23,50.67,50.67,50.67,50.67,50.67, -1264, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.22,50.67,50.67,50.67,50.67,50.67, -1265, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.21,50.66,50.66,50.66,50.66,50.66, -1266, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.20,50.65,50.65,50.65,50.65,50.65, -1267, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.19,50.64,50.64,50.64,50.64,50.64, -1268, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.18,50.63,50.63,50.63,50.63,50.63, -1269, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.16,50.63,50.63,50.63,50.63,50.63, -1270, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.15,50.62,50.62,50.62,50.62,50.62, -1271, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.14,50.61,50.61,50.61,50.61,50.61, -1272, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.13,50.60,50.60,50.60,50.60,50.60, -1273, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.12,50.59,50.59,50.59,50.59,50.59, -1274, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.11,50.59,50.59,50.59,50.59,50.59, -1275, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.10,50.58,50.58,50.58,50.58,50.58, -1276, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.09,50.57,50.57,50.57,50.57,50.57, -1277, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.07,50.56,50.56,50.56,50.56,50.56, -1278, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.06,50.55,50.55,50.55,50.55,50.55, -1279, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.05,50.55,50.55,50.55,50.55,50.55, -1280, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.04,50.54,50.54,50.54,50.54,50.54, -1281, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.03,50.53,50.53,50.53,50.53,50.53, -1282, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.02,50.52,50.52,50.52,50.52,50.52, -1283, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.01,50.51,50.51,50.51,50.51,50.51, -1284, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,50.00,50.51,50.51,50.51,50.51,50.51, -1285, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.98,50.50,50.50,50.50,50.50,50.50, -1286, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.97,50.49,50.49,50.49,50.49,50.49, -1287, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.96,50.48,50.48,50.48,50.48,50.48, -1288, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.95,50.47,50.47,50.47,50.47,50.47, -1289, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.94,50.47,50.47,50.47,50.47,50.47, -1290, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.93,50.46,50.46,50.46,50.46,50.46, -1291, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.92,50.45,50.45,50.45,50.45,50.45, -1292, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.91,50.44,50.44,50.44,50.44,50.44, -1293, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.89,50.43,50.43,50.43,50.43,50.43, -1294, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.88,50.43,50.43,50.43,50.43,50.43, -1295, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.87,50.42,50.42,50.42,50.42,50.42, -1296, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.86,50.41,50.41,50.41,50.41,50.41, -1297, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.85,50.40,50.40,50.40,50.40,50.40, -1298, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.84,50.39,50.39,50.39,50.39,50.39, -1299, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.83,50.39,50.39,50.39,50.39,50.39, -1300, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.82,50.38,50.38,50.38,50.38,50.38, -1301, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.81,50.37,50.37,50.37,50.37,50.37, -1302, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.79,50.36,50.36,50.36,50.36,50.36, -1303, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.78,50.35,50.35,50.35,50.35,50.35, -1304, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.77,50.35,50.35,50.35,50.35,50.35, -1305, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.76,50.34,50.34,50.34,50.34,50.34, -1306, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.75,50.33,50.33,50.33,50.33,50.33, -1307, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.74,50.32,50.32,50.32,50.32,50.32, -1308, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.73,50.31,50.31,50.31,50.31,50.31, -1309, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.72,50.31,50.31,50.31,50.31,50.31, -1310, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.71,50.30,50.30,50.30,50.30,50.30, -1311, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.69,50.29,50.29,50.29,50.29,50.29, -1312, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.68,50.28,50.28,50.28,50.28,50.28, -1313, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.67,50.27,50.27,50.27,50.27,50.27, -1314, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.66,50.27,50.27,50.27,50.27,50.27, -1315, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.65,50.26,50.26,50.26,50.26,50.26, -1316, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.64,50.25,50.25,50.25,50.25,50.25, -1317, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.63,50.24,50.24,50.24,50.24,50.24, -1318, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.62,50.23,50.23,50.23,50.23,50.23, -1319, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.61,50.23,50.23,50.23,50.23,50.23, -1320, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.60,50.22,50.22,50.22,50.22,50.22, -1321, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.58,50.21,50.21,50.21,50.21,50.21, -1322, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.57,50.20,50.20,50.20,50.20,50.20, -1323, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.56,50.19,50.19,50.19,50.19,50.19, -1324, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.55,50.19,50.19,50.19,50.19,50.19, -1325, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.54,50.18,50.18,50.18,50.18,50.18, -1326, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.53,50.17,50.17,50.17,50.17,50.17, -1327, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.52,50.16,50.16,50.16,50.16,50.16, -1328, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.51,50.16,50.16,50.16,50.16,50.16, -1329, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.50,50.15,50.15,50.15,50.15,50.15, -1330, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.49,50.14,50.14,50.14,50.14,50.14, -1331, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.47,50.13,50.13,50.13,50.13,50.13, -1332, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.46,50.12,50.12,50.12,50.12,50.12, -1333, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.45,50.12,50.12,50.12,50.12,50.12, -1334, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.44,50.11,50.11,50.11,50.11,50.11, -1335, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.43,50.10,50.10,50.10,50.10,50.10, -1336, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.42,50.09,50.09,50.09,50.09,50.09, -1337, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.41,50.08,50.08,50.08,50.08,50.08, -1338, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.40,50.08,50.08,50.08,50.08,50.08, -1339, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.39,50.07,50.07,50.07,50.07,50.07, -1340, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.38,50.06,50.06,50.06,50.06,50.06, -1341, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.37,50.05,50.05,50.05,50.05,50.05, -1342, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.36,50.04,50.04,50.04,50.04,50.04, -1343, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.34,50.04,50.04,50.04,50.04,50.04, -1344, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.33,50.03,50.03,50.03,50.03,50.03, -1345, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.32,50.02,50.02,50.02,50.02,50.02, -1346, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.31,50.01,50.01,50.01,50.01,50.01, -1347, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.30,50.00,50.00,50.00,50.00,50.00, -1348, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.29,50.00,50.00,50.00,50.00,50.00, -1349, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.28,49.99,49.99,49.99,49.99,49.99, -1350, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.27,49.98,49.98,49.98,49.98,49.98, -1351, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.26,49.97,49.97,49.97,49.97,49.97, -1352, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.25,49.97,49.97,49.97,49.97,49.97, -1353, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.24,49.96,49.96,49.96,49.96,49.96, -1354, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.23,49.95,49.95,49.95,49.95,49.95, -1355, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.21,49.94,49.94,49.94,49.94,49.94, -1356, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.20,49.93,49.93,49.93,49.93,49.93, -1357, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.19,49.93,49.93,49.93,49.93,49.93, -1358, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.18,49.92,49.92,49.92,49.92,49.92, -1359, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.17,49.91,49.91,49.91,49.91,49.91, -1360, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.16,49.90,49.90,49.90,49.90,49.90, -1361, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.15,49.89,49.89,49.89,49.89,49.89, -1362, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.14,49.89,49.89,49.89,49.89,49.89, -1363, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.13,49.88,49.88,49.88,49.88,49.88, -1364, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.12,49.87,49.87,49.87,49.87,49.87, -1365, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.11,49.86,49.86,49.86,49.86,49.86, -1366, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.10,49.86,49.86,49.86,49.86,49.86, -1367, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.09,49.85,49.85,49.85,49.85,49.85, -1368, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.07,49.84,49.84,49.84,49.84,49.84, -1369, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.06,49.83,49.83,49.83,49.83,49.83, -1370, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.05,49.82,49.82,49.82,49.82,49.82, -1371, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.04,49.82,49.82,49.82,49.82,49.82, -1372, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.03,49.81,49.81,49.81,49.81,49.81, -1373, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.02,49.80,49.80,49.80,49.80,49.80, -1374, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.01,49.79,49.79,49.79,49.79,49.79, -1375, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,49.00,49.78,49.78,49.78,49.78,49.78, -1376, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.99,49.78,49.78,49.78,49.78,49.78, -1377, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.98,49.77,49.77,49.77,49.77,49.77, -1378, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.97,49.76,49.76,49.76,49.76,49.76, -1379, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.96,49.75,49.75,49.75,49.75,49.75, -1380, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.95,49.75,49.75,49.75,49.75,49.75, -1381, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.94,49.74,49.74,49.74,49.74,49.74, -1382, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.93,49.73,49.73,49.73,49.73,49.73, -1383, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.92,49.72,49.72,49.72,49.72,49.72, -1384, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.90,49.71,49.71,49.71,49.71,49.71, -1385, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.89,49.71,49.71,49.71,49.71,49.71, -1386, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.88,49.70,49.70,49.70,49.70,49.70, -1387, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.87,49.69,49.69,49.69,49.69,49.69, -1388, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.86,49.68,49.68,49.68,49.68,49.68, -1389, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.85,49.67,49.67,49.67,49.67,49.67, -1390, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.84,49.67,49.67,49.67,49.67,49.67, -1391, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.83,49.66,49.66,49.66,49.66,49.66, -1392, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.82,49.65,49.65,49.65,49.65,49.65, -1393, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.81,49.64,49.64,49.64,49.64,49.64, -1394, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.80,49.64,49.64,49.64,49.64,49.64, -1395, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.79,49.63,49.63,49.63,49.63,49.63, -1396, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.78,49.62,49.62,49.62,49.62,49.62, -1397, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.77,49.61,49.61,49.61,49.61,49.61, -1398, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.76,49.60,49.60,49.60,49.60,49.60, -1399, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.75,49.60,49.60,49.60,49.60,49.60, -1400, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.74,49.59,49.59,49.59,49.59,49.59, -1401, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.73,49.58,49.58,49.58,49.58,49.58, -1402, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.71,49.57,49.57,49.57,49.57,49.57, -1403, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.70,49.57,49.57,49.57,49.57,49.57, -1404, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.69,49.56,49.56,49.56,49.56,49.56, -1405, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.68,49.55,49.55,49.55,49.55,49.55, -1406, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.67,49.54,49.54,49.54,49.54,49.54, -1407, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.66,49.53,49.53,49.53,49.53,49.53, -1408, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.65,49.53,49.53,49.53,49.53,49.53, -1409, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.64,49.52,49.52,49.52,49.52,49.52, -1410, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.63,49.51,49.51,49.51,49.51,49.51, -1411, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.62,49.50,49.50,49.50,49.50,49.50, -1412, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.61,49.50,49.50,49.50,49.50,49.50, -1413, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.60,49.49,49.49,49.49,49.49,49.49, -1414, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.59,49.48,49.48,49.48,49.48,49.48, -1415, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.58,49.47,49.47,49.47,49.47,49.47, -1416, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.57,49.46,49.46,49.46,49.46,49.46, -1417, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.56,49.46,49.46,49.46,49.46,49.46, -1418, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.55,49.45,49.45,49.45,49.45,49.45, -1419, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.54,49.44,49.44,49.44,49.44,49.44, -1420, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.53,49.43,49.43,49.43,49.43,49.43, -1421, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.52,49.43,49.43,49.43,49.43,49.43, -1422, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.51,49.42,49.42,49.42,49.42,49.42, -1423, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.50,49.41,49.41,49.41,49.41,49.41, -1424, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.49,49.40,49.40,49.40,49.40,49.40, -1425, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.48,49.39,49.39,49.39,49.39,49.39, -1426, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.46,49.39,49.39,49.39,49.39,49.39, -1427, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.45,49.38,49.38,49.38,49.38,49.38, -1428, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.44,49.37,49.37,49.37,49.37,49.37, -1429, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.43,49.36,49.36,49.36,49.36,49.36, -1430, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.42,49.36,49.36,49.36,49.36,49.36, -1431, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.41,49.35,49.35,49.35,49.35,49.35, -1432, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.40,49.34,49.34,49.34,49.34,49.34, -1433, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.39,49.33,49.33,49.33,49.33,49.33, -1434, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.38,49.32,49.32,49.32,49.32,49.32, -1435, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.37,49.32,49.32,49.32,49.32,49.32, -1436, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.36,49.31,49.31,49.31,49.31,49.31, -1437, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.35,49.30,49.30,49.30,49.30,49.30, -1438, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.34,49.29,49.29,49.29,49.29,49.29, -1439, 19.722222, 51.666667, 14.444444, 0.000000, 1,0.00,0.00,0.00,0.00,0.00,0.00,48.33,49.29,49.29,49.29,49.29,49.29, From aa158df8fc3767295b6480d3d454f367349e028c Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 19 Dec 2023 09:39:42 -0700 Subject: [PATCH 12/25] Problem with yearly test rgression. --- src/HPWH.cc | 143 ++++++++++++++++++++++++++++++-------------- src/HPWH.hh | 18 +++++- test/main.cc | 29 +++++---- test/testCalcUEF.cc | 27 +++++++-- 4 files changed, 156 insertions(+), 61 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 06f8bdfc..c0193c47 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -3936,13 +3936,12 @@ int HPWH::HPWHinit_file(string configFile) { } #endif -// reads the named schedule into the provided array //----------------------------------------------------------------------------- -/// @brief Reads a schedule into the schedule array. +/// @brief Reads a named schedule into a schedule array. /// @param[out] scheduleArray std::vector of test schedules /// @param[in] scheduleName name of schedule to read /// @param[in] minutesOfTest Upper (right) bounding fraction (0 to 1) -/// @return Resampled value; 0 if undefined. +/// @return true if successful, false otherwise //----------------------------------------------------------------------------- bool readSchedule(HPWH::Schedule &scheduleArray, std::string scheduleName, long testLength_min) { int minuteHrTmp; @@ -4002,12 +4001,12 @@ bool readSchedule(HPWH::Schedule &scheduleArray, std::string scheduleName, long return true; } -inline bool getBool(const std::string sValue){ - if((sValue == "F") || (sValue == "false") || (sValue == "False") || (stod(sValue) == 0.)) - return false; - return true; -} - +//----------------------------------------------------------------------------- +/// @brief Reads the control info for a test from file "testInfo.txt" +/// @param[in] testDirectory path to directory containing test files +/// @param[out] controlInfo data structure containing control info +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo &controlInfo) { std::ifstream controlFile; @@ -4084,6 +4083,13 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & return true; } +//----------------------------------------------------------------------------- +/// @brief Reads the schedules for a test +/// @param[in] testDirectory path to directory containing test files +/// @param[in] controlInfo data structure containing control info +/// @param[out] allSchedules collection of test schedules read +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlInfo &controlInfo, std::vector &allSchedules) { std::vector scheduleNames; @@ -4169,22 +4175,35 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn return true; } +//----------------------------------------------------------------------------- +/// @brief Reads the schedules for a test +/// @param[in] testDesc data structure contained test description +/// @param[in] outputDirectory destination path for test results (filename based on testDesc) +/// @param[in] controlInfo data structure containing control info +/// @param[in] allSchedules collection of test schedules +/// @param[in] airT_C air temperature (degC) used for temperature depression +/// @param[in] doTempDepress whether to apply temperature depression +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- bool HPWH::runSimulation( const TestDesc &testDesc, const std::string &outputDirectory, const HPWH::ControlInfo &controlInfo, std::vector &allSchedules, double airT_C, - const bool doTempDepress -) + const bool doTempDepress, + TestResults &testResults) { - const double energyBalThreshold = 0.005; // 0.5 % + const double energyBalThreshold = 0.001; // 0.1 % const int nTestTCouples = 6; const std::string sHead = "minutes,Ta,Tsetpoint,inletT,draw,"; const std::string sHeadMP = "condenserInletT,condenserOutletT,externalVolGPM,"; const std::string sHeadSoC = "targetSoCFract,soCFract,"; + // UEF data + testResults={false,0.,0.}; + FILE * outputFile = NULL; std::string sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; if (fopen_s(&outputFile, sOutputFilename.c_str(), "w+") != 0) { @@ -4210,14 +4229,18 @@ bool HPWH::runSimulation( // Loop over the minutes in the test for (int i = 0; i < controlInfo.timeToRun_min; i++) { + double inletT_C = allSchedules[0][i]; + double drawVolume_L = GAL_TO_L(allSchedules[1][i]); double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; - - // Process the dr status + double externalT_C = allSchedules[3][i]; HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); + double inlet2T_C = inletT_C; + double draw2Volume_L = drawVolume_L; // Change setpoint if there is a setpoint schedule. if (doChangeSetpoint) { - setSetpoint(allSchedules[5][i]); //expect this to fail sometimes + double testSetpointT_C = allSchedules[5][i]; + setSetpoint(testSetpointT_C); //expect this to fail sometimes } // Change SoC schedule @@ -4228,21 +4251,22 @@ bool HPWH::runSimulation( } } - double tankHCStart = getTankHeatContent_kJ(); + double initialTankHeatContent_kJ = getTankHeatContent_kJ(); // Run the step runOneStep( - allSchedules[0][i], // inlet water temperature (C) - GAL_TO_L(allSchedules[1][i]), // draw (gallons) - ambientT_C, // ambient Temp (C) - allSchedules[3][i], // external Temp (C) + inletT_C, // inlet water temperature (C) + drawVolume_L, // draw volume (L) + ambientT_C, // ambient Temp (C) + externalT_C, // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) - GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) - allSchedules[0][i], // inlet-2 Temp (C) + draw2Volume_L, // inlet-2 volume (L) + inlet2T_C, // inlet-2 Temp (C) NULL); // no extra heat - if (!isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,energyBalThreshold)) { + if (!isEnergyBalanced(drawVolume_L,inletT_C,initialTankHeatContent_kJ,energyBalThreshold)) { cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; + return false; } // Check timing @@ -4283,24 +4307,46 @@ bool HPWH::runSimulation( csvOptions |= HPWH::CSVOPT_IS_DRAWING; } WriteCSVRow(outputFile, sPreamble.c_str(), nTestTCouples, csvOptions); - } + double energyConsumed_kJ = 0.; + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { + energyConsumed_kJ += getNthHeatSourceEnergyInput(iHS, UNITS_KJ); + } + testResults.totalEnergyConsumed_kJ += energyConsumed_kJ; + testResults.totalVolumeRemoved_L += drawVolume_L; + } fclose(outputFile); + + testResults.passed = true; return true; } +//----------------------------------------------------------------------------- +/// @brief Reads the schedules for a test +/// @param[in] testDesc data structure contained test description +/// @param[in] outputDirectory destination path for test results (append file "DHW_YRLY.csv") +/// @param[in] controlInfo data structure containing control info +/// @param[in] allSchedules collection of test schedules +/// @param[in] airT_C air temperature (degC) used for temperature depression +/// @param[in] doTempDepress whether to apply temperature depression +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- bool HPWH::runYearlySimulation( const TestDesc &testDesc, const std::string &outputDirectory, const HPWH::ControlInfo &controlInfo, std::vector &allSchedules, double airT_C, - const bool doTempDepress) + const bool doTempDepress, + TestResults &testResults) { - const double energyBalThreshold = 0.005; // 0.5 % + const double energyBalThreshold = 0.001; // 0.1 % std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; + // UEF data + testResults={false,0.,0.}; + FILE * outputFile = NULL; if (fopen_s(&outputFile, sOutputFilename.c_str(), "a+") != 0) { cout << "Could not open output file " << sOutputFilename << "\n"; @@ -4309,24 +4355,26 @@ bool HPWH::runYearlySimulation( cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; - double cumHeatIn[3] = { 0,0,0 }; - double cumHeatOut[3] = { 0,0,0 }; + double cumHeatIn[3] = {0, 0, 0}; + double cumHeatOut[3] = {0, 0, 0}; bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); // Loop over the minutes in the test for (int i = 0; i < controlInfo.timeToRun_min; i++) { - if (!doTempDepress) { - airT_C = allSchedules[2][i]; - } - - // Process the dr status + double inletT_C = allSchedules[0][i]; + double drawVolume_L = GAL_TO_L(allSchedules[1][i]); + double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; + double externalT_C = allSchedules[3][i]; HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); + double inlet2T_C = inletT_C; + double draw2Volume_L = drawVolume_L; // Change setpoint if there is a setpoint schedule. if (doChangeSetpoint) { - setSetpoint(allSchedules[5][i]); //expect this to fail sometimes + double testSetpointT_C = allSchedules[5][i]; + setSetpoint(testSetpointT_C); //expect this to fail sometimes } // Change SoC schedule @@ -4345,20 +4393,20 @@ bool HPWH::runYearlySimulation( } } - double tankHCStart = getTankHeatContent_kJ(); + double initialTankHeatContent_kJ = getTankHeatContent_kJ(); // Run the step runOneStep( - allSchedules[0][i], // inlet water temperature (C) - GAL_TO_L(allSchedules[1][i]), // draw (gallons) - airT_C, // ambient Temp (C) - allSchedules[3][i], // external Temp (C) + inletT_C, // inlet water temperature (C) + drawVolume_L, // draw volume (L) + ambientT_C, // ambient Temp (C) + externalT_C, // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) - GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) - allSchedules[0][i], // inlet-2 Temp (C) + draw2Volume_L, // inlet-2 volume (L) + inlet2T_C, // inlet-2 Temp (C) NULL); // no extra heat - if (!isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,energyBalThreshold)) { + if (!isEnergyBalanced(drawVolume_L,inletT_C,initialTankHeatContent_kJ ,energyBalThreshold)) { cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; } @@ -4382,11 +4430,17 @@ bool HPWH::runYearlySimulation( } // Recording + double energyConsumed_kJ = 0.; for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - cumHeatIn[iHS] += getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KWH)*1000.; - cumHeatOut[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH)*1000.; + double heatSourceEnergyConsumed_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); + energyConsumed_kJ += heatSourceEnergyConsumed_kJ; + + cumHeatIn[iHS] += KJ_TO_KWH(heatSourceEnergyConsumed_kJ) * 1000.; + cumHeatOut[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; } + testResults.totalEnergyConsumed_kJ += energyConsumed_kJ; + testResults.totalVolumeRemoved_L += drawVolume_L; } std::string firstCol = testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; @@ -4405,5 +4459,6 @@ bool HPWH::runYearlySimulation( fprintf(outputFile, "\n"); fclose(outputFile); + testResults.passed = true; return true; } \ No newline at end of file diff --git a/src/HPWH.hh b/src/HPWH.hh index 3ffde725..67df5d3d 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -844,13 +844,20 @@ public: std::string testName; }; + struct TestResults{ + bool passed; + double totalEnergyConsumed_kJ; + double totalVolumeRemoved_L; + }; + bool runSimulation( const TestDesc &testDesc, const std::string &outputDirectory, const HPWH::ControlInfo &controlInfo, std::vector &allSchedules, double airT_C, - const bool doTempDepress); + const bool doTempDepress, + TestResults &testResults); bool runYearlySimulation( const TestDesc &testDesc, @@ -858,7 +865,8 @@ public: const HPWH::ControlInfo &controlInfo, std::vector &allSchedules, double airT_C, - const bool doTempDepress); + const bool doTempDepress, + TestResults &testResults); private: class HeatSource; @@ -1411,4 +1419,10 @@ void calcThermalDist( const std::vector &nodeTemp_C, const double setpointT_C); +inline bool getBool(const std::string sValue){ + if((sValue == "F") || (sValue == "false") || (sValue == "False") || (stoi(sValue) == 0)) + return false; + return true; +} + #endif diff --git a/test/main.cc b/test/main.cc index a4b50c3e..3370164c 100644 --- a/test/main.cc +++ b/test/main.cc @@ -25,6 +25,7 @@ using std::ifstream; int main(int argc, char *argv[]){ HPWH hpwh; + bool failed = false; const long maximumDurationNormalTest_min = 500000; @@ -34,8 +35,10 @@ int main(int argc, char *argv[]){ // Obvious wrong number of command line arguments if ((argc > 6)) { cout << "Invalid input. This program takes FOUR arguments: model specification type (ie. Preset or File), model specification (ie. Sanden80), test name (ie. test50) and output directory\n"; - exit(1); + failed = true; } + ASSERTFALSE(failed); + // Help message std::string input1, input2, input3, input4; if(argc > 1) { @@ -54,8 +57,9 @@ int main(int argc, char *argv[]){ cout << "All input files should be located in the test directory, with these names:\n"; cout << "drawschedule.csv DRschedule.csv ambientTschedule.csv evaporatorTschedule.csv inletTschedule.csv hpwhProperties.csv\n"; cout << "An output file, `modelname'Output.csv, will be written in the test directory\n"; - exit(1); + failed = true; } + ASSERTFALSE(failed); HPWH::TestDesc testDesc; testDesc.presetOrFile = input1; @@ -67,7 +71,7 @@ int main(int argc, char *argv[]){ if(testDesc.presetOrFile == "Preset") { if (getHPWHObject(hpwh, testDesc.modelName) == HPWH::HPWH_ABORT) { cout << "Error, preset model did not initialize.\n"; - exit(1); + failed = true; } } else if (testDesc.presetOrFile == "File") { std::string inputFile = testDesc.modelName + ".txt"; @@ -75,8 +79,9 @@ int main(int argc, char *argv[]){ } else { cout << "Invalid argument, received '"<< testDesc.presetOrFile << "', expected 'Preset' or 'File'.\n"; - exit(1); + failed = true; } + ASSERTFALSE(failed); double airT_C = 0.; bool doTempDepress = false; @@ -91,22 +96,26 @@ int main(int argc, char *argv[]){ hpwh.setDoTempDepression(doTempDepress); HPWH::ControlInfo controlInfo; + + if(!hpwh.readControlInfo(testDesc.testName,controlInfo)){ cout << "Control file testInfo.txt has unsettable specifics in it. \n"; - exit(1); + failed = true; } + ASSERTFALSE(failed); std::vector allSchedules; - if (!(hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules))) { - exit(1); - } + failed = !hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules); + ASSERTFALSE(failed); + HPWH::TestResults testResults; if (controlInfo.timeToRun_min > maximumDurationNormalTest_min) { - hpwh.runYearlySimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress); + failed = !hpwh.runYearlySimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults); } else { - hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress); + failed = !hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults); } + ASSERTFALSE(failed); return 0; } diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc index 1d5310ed..d540e392 100644 --- a/test/testCalcUEF.cc +++ b/test/testCalcUEF.cc @@ -12,13 +12,17 @@ const std::vector sProfileNames({ "24hr67_vsmall", "24hr67_medium", "24hr67_high" }); -void runTest(const HPWH::TestDesc testDesc,double airT_C = 0.,bool doTempDepress = false) { - +bool runTest( + const HPWH::TestDesc testDesc, + HPWH::TestResults &testResults, + double airT_C = 0., + bool doTempDepress = false) +{ HPWH hpwh; getHPWHObject(hpwh, testDesc.modelName); - std::string sOutputDirectory =".";// ../build/test/output + std::string sOutputDirectory = "../build/test/output"; // Parse the model if(testDesc.presetOrFile == "Preset") { @@ -51,7 +55,7 @@ void runTest(const HPWH::TestDesc testDesc,double airT_C = 0.,bool doTempDepress exit(1); } - hpwh.runSimulation(testDesc,sOutputDirectory,controlInfo,allSchedules,airT_C,doTempDepress); + return hpwh.runSimulation(testDesc,sOutputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults); } @@ -62,10 +66,23 @@ void runTestSuite(const std::string &sModelName,const std::string &sPresetOrFile testDesc.modelName = sModelName; testDesc.presetOrFile = sPresetOrFile; + double totalEnergyConsumed_kJ = 0.; + double totalVolumeRemoved_L = 0.; + for (auto &sProfileName: sProfileNames) { + HPWH::TestResults testResults; testDesc.testName = sProfileName; - runTest(testDesc); + ASSERTTRUE(runTest(testDesc,testResults)); + + totalEnergyConsumed_kJ += testResults.totalEnergyConsumed_kJ; + totalVolumeRemoved_L += testResults.totalVolumeRemoved_L; } + double totalMassRemoved_kg = HPWH::DENSITYWATER_kgperL * totalVolumeRemoved_L; + double totalHeatCapacity_kJperC = HPWH::CPWATER_kJperkgC * totalMassRemoved_kg; + double refEnergy_kJ = totalHeatCapacity_kJperC * (51.7 - 14.4); + + double UEF = refEnergy_kJ / totalEnergyConsumed_kJ; + std::cout << "UEF: " << UEF << "\n"; } int main(int argc, char *argv[]) From 0958cb44e464ddf96a6362cd20447168a4c46adb Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 19 Dec 2023 09:58:14 -0700 Subject: [PATCH 13/25] Restore yearly test. --- src/HPWH.cc | 50 +++++++++++++++++++------------------------------- 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index c0193c47..530e860c 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4340,13 +4340,10 @@ bool HPWH::runYearlySimulation( const bool doTempDepress, TestResults &testResults) { - const double energyBalThreshold = 0.001; // 0.1 % + const double energyBalThreshold = 0.005; // 0.5 % std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; - // UEF data - testResults={false,0.,0.}; - FILE * outputFile = NULL; if (fopen_s(&outputFile, sOutputFilename.c_str(), "a+") != 0) { cout << "Could not open output file " << sOutputFilename << "\n"; @@ -4355,26 +4352,24 @@ bool HPWH::runYearlySimulation( cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; - double cumHeatIn[3] = {0, 0, 0}; - double cumHeatOut[3] = {0, 0, 0}; + double cumHeatIn[3] = { 0,0,0 }; + double cumHeatOut[3] = { 0,0,0 }; bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); // Loop over the minutes in the test for (int i = 0; i < controlInfo.timeToRun_min; i++) { - double inletT_C = allSchedules[0][i]; - double drawVolume_L = GAL_TO_L(allSchedules[1][i]); - double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; - double externalT_C = allSchedules[3][i]; + if (!doTempDepress) { + airT_C = allSchedules[2][i]; + } + + // Process the dr status HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); - double inlet2T_C = inletT_C; - double draw2Volume_L = drawVolume_L; // Change setpoint if there is a setpoint schedule. if (doChangeSetpoint) { - double testSetpointT_C = allSchedules[5][i]; - setSetpoint(testSetpointT_C); //expect this to fail sometimes + setSetpoint(allSchedules[5][i]); //expect this to fail sometimes } // Change SoC schedule @@ -4393,20 +4388,20 @@ bool HPWH::runYearlySimulation( } } - double initialTankHeatContent_kJ = getTankHeatContent_kJ(); + double tankHCStart = getTankHeatContent_kJ(); // Run the step runOneStep( - inletT_C, // inlet water temperature (C) - drawVolume_L, // draw volume (L) - ambientT_C, // ambient Temp (C) - externalT_C, // external Temp (C) + allSchedules[0][i], // inlet water temperature (C) + GAL_TO_L(allSchedules[1][i]), // draw (gallons) + airT_C, // ambient Temp (C) + allSchedules[3][i], // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) - draw2Volume_L, // inlet-2 volume (L) - inlet2T_C, // inlet-2 Temp (C) + GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) + allSchedules[0][i], // inlet-2 Temp (C) NULL); // no extra heat - if (!isEnergyBalanced(drawVolume_L,inletT_C,initialTankHeatContent_kJ ,energyBalThreshold)) { + if (!isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,energyBalThreshold)) { cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; } @@ -4430,17 +4425,11 @@ bool HPWH::runYearlySimulation( } // Recording - double energyConsumed_kJ = 0.; for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - double heatSourceEnergyConsumed_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); - energyConsumed_kJ += heatSourceEnergyConsumed_kJ; - - cumHeatIn[iHS] += KJ_TO_KWH(heatSourceEnergyConsumed_kJ) * 1000.; - cumHeatOut[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; + cumHeatIn[iHS] += getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KWH)*1000.; + cumHeatOut[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH)*1000.; } - testResults.totalEnergyConsumed_kJ += energyConsumed_kJ; - testResults.totalVolumeRemoved_L += drawVolume_L; } std::string firstCol = testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; @@ -4459,6 +4448,5 @@ bool HPWH::runYearlySimulation( fprintf(outputFile, "\n"); fclose(outputFile); - testResults.passed = true; return true; } \ No newline at end of file From 4fde42cbf2db34d906ed5fc6f6c99a39e3efcf66 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 19 Dec 2023 12:43:57 -0700 Subject: [PATCH 14/25] Fix yearly mix-draw correction. --- src/HPWH.cc | 75 ++++++++++++++++++++++++++----------------- test/ref/DHW_YRLY.csv | 50 ++++++++++++++--------------- 2 files changed, 71 insertions(+), 54 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 530e860c..fe6bf523 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4234,13 +4234,10 @@ bool HPWH::runSimulation( double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; double externalT_C = allSchedules[3][i]; HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); - double inlet2T_C = inletT_C; - double draw2Volume_L = drawVolume_L; // Change setpoint if there is a setpoint schedule. if (doChangeSetpoint) { - double testSetpointT_C = allSchedules[5][i]; - setSetpoint(testSetpointT_C); //expect this to fail sometimes + setSetpoint(allSchedules[5][i]); //expect this to fail sometimes } // Change SoC schedule @@ -4251,7 +4248,10 @@ bool HPWH::runSimulation( } } - double initialTankHeatContent_kJ = getTankHeatContent_kJ(); + double inletT2_C = inletT_C; + double drawVolume2_L = drawVolume_L; + + double previousTankHeatContent_kJ = getTankHeatContent_kJ(); // Run the step runOneStep( @@ -4260,11 +4260,11 @@ bool HPWH::runSimulation( ambientT_C, // ambient Temp (C) externalT_C, // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) - draw2Volume_L, // inlet-2 volume (L) - inlet2T_C, // inlet-2 Temp (C) + drawVolume2_L, // inlet-2 volume (L) + inletT2_C, // inlet-2 Temp (C) NULL); // no extra heat - if (!isEnergyBalanced(drawVolume_L,inletT_C,initialTankHeatContent_kJ,energyBalThreshold)) { + if (!isEnergyBalanced(drawVolume_L,inletT_C,previousTankHeatContent_kJ,energyBalThreshold)) { cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; return false; } @@ -4342,6 +4342,9 @@ bool HPWH::runYearlySimulation( { const double energyBalThreshold = 0.005; // 0.5 % + // UEF data + testResults={false,0.,0.}; + std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; FILE * outputFile = NULL; @@ -4352,19 +4355,18 @@ bool HPWH::runYearlySimulation( cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; - double cumHeatIn[3] = { 0,0,0 }; - double cumHeatOut[3] = { 0,0,0 }; + double cumHeatIn[3] = {0, 0, 0}; + double cumHeatOut[3] = {0, 0, 0}; bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); // Loop over the minutes in the test for (int i = 0; i < controlInfo.timeToRun_min; i++) { - if (!doTempDepress) { - airT_C = allSchedules[2][i]; - } - - // Process the dr status + double inletT_C = allSchedules[0][i]; + double drawVolume_L = GAL_TO_L(allSchedules[1][i]); + double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; + double externalT_C = allSchedules[3][i]; HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); // Change setpoint if there is a setpoint schedule. @@ -4383,25 +4385,34 @@ bool HPWH::runYearlySimulation( // Mix down for yearly tests with large compressors if (getHPWHModel() >= 210) { //Do a simple mix down of the draw for the cold water temperature - if (getSetpoint() <= 125.) { - allSchedules[1][i] *= (125. - allSchedules[0][i]) / (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_F) - allSchedules[0][i]); + const double mixT_C = F_TO_C(125.); + if (getSetpoint() <= mixT_C) { // Seems to have been some confusion here regarding F<->C conversion + drawVolume_L *= (mixT_C - inletT_C) / (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); } } - double tankHCStart = getTankHeatContent_kJ(); + double inletT2_C = inletT_C; + double drawVolume2_L = drawVolume_L; + + double previousTankHeatContent_kJ = getTankHeatContent_kJ(); // Run the step - runOneStep( - allSchedules[0][i], // inlet water temperature (C) - GAL_TO_L(allSchedules[1][i]), // draw (gallons) - airT_C, // ambient Temp (C) - allSchedules[3][i], // external Temp (C) + int runResult = + runOneStep( + inletT_C, // inlet water temperature (C) + drawVolume_L, // draw (L) + ambientT_C, // ambient Temp (C) + externalT_C, // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) - GAL_TO_L(allSchedules[1][i]), // inlet-2 volume (gallons) - allSchedules[0][i], // inlet-2 Temp (C) + drawVolume2_L, // draw volume - 2 (L) + inletT2_C, // inlet Temp - 2 (C) NULL); // no extra heat - if (!isEnergyBalanced(GAL_TO_L(allSchedules[1][i]),allSchedules[0][i],tankHCStart,energyBalThreshold)) { + if (runResult != 0) { + return false; + } + + if (!isEnergyBalanced(drawVolume_L,inletT_C,previousTankHeatContent_kJ,energyBalThreshold)) { cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; } @@ -4425,11 +4436,16 @@ bool HPWH::runYearlySimulation( } // Recording + double energyConsumed_kJ = 0.; for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - cumHeatIn[iHS] += getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KWH)*1000.; - cumHeatOut[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH)*1000.; - } + double heatSourceEnergyConsumed_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); + energyConsumed_kJ += heatSourceEnergyConsumed_kJ; + cumHeatIn[iHS] += KJ_TO_KWH(heatSourceEnergyConsumed_kJ) * 1000.; + cumHeatOut[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; + } + testResults.totalEnergyConsumed_kJ += energyConsumed_kJ; + testResults.totalVolumeRemoved_L += drawVolume_L; } std::string firstCol = testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; @@ -4448,5 +4464,6 @@ bool HPWH::runYearlySimulation( fprintf(outputFile, "\n"); fclose(outputFile); + testResults.passed = true; return true; } \ No newline at end of file diff --git a/test/ref/DHW_YRLY.csv b/test/ref/DHW_YRLY.csv index 1fd19101..67aaf57e 100644 --- a/test/ref/DHW_YRLY.csv +++ b/test/ref/DHW_YRLY.csv @@ -4,9 +4,9 @@ testCA_3BR_CTZ15,Preset,GE502014,55875,55875,0,0,565517,2071441,621392,2127316,1 testCA_3BR_CTZ15,Preset,Rheem2020Prem40,43073,43073,0,0,537835,2245943,580908,2289016,1.00,-nan(ind),4.18,3.94 testCA_3BR_CTZ15,Preset,Rheem2020Prem50,21934,21934,0,0,533295,2224941,555229,2246875,1.00,-nan(ind),4.17,4.05 testCA_3BR_CTZ15,Preset,Rheem2020Build50,18422,18422,0,0,616009,2241746,634431,2260168,1.00,-nan(ind),3.64,3.56 -testCA_3BR_CTZ15,Preset,RheemPlugInDedicated50,686585,2277144,0,0,0,0,686585,2277144,3.32,-nan(ind),-nan(ind),3.32 -testCA_3BR_CTZ15,Preset,RheemPlugInShared40,557168,2339586,0,0,0,0,557168,2339586,4.20,-nan(ind),-nan(ind),4.20 -testCA_3BR_CTZ15,Preset,RheemPlugInShared50,550351,2305883,0,0,0,0,550351,2305883,4.19,-nan(ind),-nan(ind),4.19 +testCA_3BR_CTZ15,Preset,RheemPlugInDedicated50,679065,2251443,0,0,0,0,679065,2251443,3.32,-nan(ind),-nan(ind),3.32 +testCA_3BR_CTZ15,Preset,RheemPlugInShared40,543402,2272386,0,0,0,0,543402,2272386,4.18,-nan(ind),-nan(ind),4.18 +testCA_3BR_CTZ15,Preset,RheemPlugInShared50,536712,2240578,0,0,0,0,536712,2240578,4.17,-nan(ind),-nan(ind),4.17 testCA_3BR_CTZ15,Preset,AOSmithCAHP120,0,0,2475,2475,677748,2365264,680223,2367738,-nan(ind),1.00,3.49,3.48 testCA_3BR_CTZ15,Preset,AWHSTier3Generic80,17550,17550,0,0,695306,2264199,712856,2281749,1.00,-nan(ind),3.26,3.20 testCA_3BR_CTZ16,Preset,AOSmithHPTU80,6088,6088,1179534,1179534,690914,2297398,1876536,3483020,1.00,1.00,3.33,1.86 @@ -15,29 +15,29 @@ testCA_3BR_CTZ16,Preset,GE502014,130275,130275,353792,353792,898211,2756543,1382 testCA_3BR_CTZ16,Preset,Rheem2020Prem40,132342,132342,278799,278799,844628,3058799,1255769,3469941,1.00,1.00,3.62,2.76 testCA_3BR_CTZ16,Preset,Rheem2020Prem50,89483,89483,279666,279666,842085,3042790,1211235,3411939,1.00,1.00,3.61,2.82 testCA_3BR_CTZ16,Preset,Rheem2020Build50,73993,73993,281985,281985,931391,3066657,1287370,3422636,1.00,1.00,3.29,2.66 -testCA_3BR_CTZ16,Preset,RheemPlugInDedicated50,1075466,3298078,0,0,0,0,1075466,3298078,3.07,-nan(ind),-nan(ind),3.07 -testCA_3BR_CTZ16,Preset,RheemPlugInShared40,902116,3357097,0,0,0,0,902116,3357097,3.72,-nan(ind),-nan(ind),3.72 -testCA_3BR_CTZ16,Preset,RheemPlugInShared50,905228,3337523,0,0,0,0,905228,3337523,3.69,-nan(ind),-nan(ind),3.69 +testCA_3BR_CTZ16,Preset,RheemPlugInDedicated50,1057618,3238988,0,0,0,0,1057618,3238988,3.06,-nan(ind),-nan(ind),3.06 +testCA_3BR_CTZ16,Preset,RheemPlugInShared40,883664,3247384,0,0,0,0,883664,3247384,3.67,-nan(ind),-nan(ind),3.67 +testCA_3BR_CTZ16,Preset,RheemPlugInShared50,885671,3232546,0,0,0,0,885671,3232546,3.65,-nan(ind),-nan(ind),3.65 testCA_3BR_CTZ16,Preset,AOSmithCAHP120,0,0,1691018,1691018,540738,1798679,2231756,3489697,-nan(ind),1.00,3.33,1.56 testCA_3BR_CTZ16,Preset,AWHSTier3Generic80,41850,41850,1063562,1063562,852285,2430196,1957697,3535608,1.00,1.00,2.85,1.81 -testCA_36Unit_CTZ12,Preset,QAHV_N136TAU_HPB_SP,25579199,96336852,0,0,0,0,25579199,96336852,3.77,-nan(ind),-nan(ind),3.77 -testCA_36Unit_CTZ12,Preset,ColmacCxV_5_SP,29810230,93675724,0,0,0,0,29810230,93675724,3.14,-nan(ind),-nan(ind),3.14 -testCA_36Unit_CTZ12,Preset,ColmacCxA_10_SP,29863357,97002089,0,0,0,0,29863357,97002089,3.25,-nan(ind),-nan(ind),3.25 -testCA_36Unit_CTZ12,Preset,ColmacCxA_15_SP,37099048,97207160,0,0,0,0,37099048,97207160,2.62,-nan(ind),-nan(ind),2.62 -testCA_36Unit_CTZ12,Preset,ColmacCxA_20_SP,32819045,97554042,0,0,0,0,32819045,97554042,2.97,-nan(ind),-nan(ind),2.97 -testCA_36Unit_CTZ12,Preset,ColmacCxA_25_SP,34181024,97826810,0,0,0,0,34181024,97826810,2.86,-nan(ind),-nan(ind),2.86 -testCA_36Unit_CTZ12,Preset,ColmacCxA_30_SP,34200636,98139446,0,0,0,0,34200636,98139446,2.87,-nan(ind),-nan(ind),2.87 -testCA_36Unit_CTZ12,Preset,NyleC60A_SP,30073563,94790929,0,0,0,0,30073563,94790929,3.15,-nan(ind),-nan(ind),3.15 -testCA_36Unit_CTZ12,Preset,NyleC90A_SP,29066682,96788017,0,0,0,0,29066682,96788017,3.33,-nan(ind),-nan(ind),3.33 -testCA_36Unit_CTZ12,Preset,NyleC185A_SP,29660784,97554366,0,0,0,0,29660784,97554366,3.29,-nan(ind),-nan(ind),3.29 -testCA_36Unit_CTZ12,Preset,NyleC250A_SP,25595635,97547619,0,0,0,0,25595635,97547619,3.81,-nan(ind),-nan(ind),3.81 -testCA_36Unit_CTZ12,Preset,ColmacCxV_5_MP,31681534,87668021,0,0,0,0,31681534,87668021,2.77,-nan(ind),-nan(ind),2.77 -testCA_36Unit_CTZ12,Preset,ColmacCxA_15_MP,44752575,95899338,0,0,0,0,44752575,95899338,2.14,-nan(ind),-nan(ind),2.14 -testCA_36Unit_CTZ12,Preset,ColmacCxA_20_MP,37878323,97052064,0,0,0,0,37878323,97052064,2.56,-nan(ind),-nan(ind),2.56 -testCA_36Unit_CTZ12,Preset,NyleC60A_MP,40596680,89031773,0,0,0,0,40596680,89031773,2.19,-nan(ind),-nan(ind),2.19 -testCA_36Unit_CTZ12,Preset,NyleC185A_MP,42450434,97449918,0,0,0,0,42450434,97449918,2.30,-nan(ind),-nan(ind),2.30 -testCA_36Unit_CTZ12,Preset,NyleC250A_MP,34266642,97496299,0,0,0,0,34266642,97496299,2.85,-nan(ind),-nan(ind),2.85 -testCA_36Unit_CTZ12,Preset,RheemHPHD60,25796227,87357476,0,0,0,0,25796227,87357476,3.39,-nan(ind),-nan(ind),3.39 -testCA_36Unit_CTZ12,Preset,RheemHPHD135,34754223,95520122,0,0,0,0,34754223,95520122,2.75,-nan(ind),-nan(ind),2.75 +testCA_36Unit_CTZ12,Preset,QAHV_N136TAU_HPB_SP,28887817,109306091,0,0,0,0,28887817,109306091,3.78,-nan(ind),-nan(ind),3.78 +testCA_36Unit_CTZ12,Preset,ColmacCxV_5_SP,32850589,103410352,0,0,0,0,32850589,103410352,3.15,-nan(ind),-nan(ind),3.15 +testCA_36Unit_CTZ12,Preset,ColmacCxA_10_SP,33760216,109801866,0,0,0,0,33760216,109801866,3.25,-nan(ind),-nan(ind),3.25 +testCA_36Unit_CTZ12,Preset,ColmacCxA_15_SP,41954094,110051476,0,0,0,0,41954094,110051476,2.62,-nan(ind),-nan(ind),2.62 +testCA_36Unit_CTZ12,Preset,ColmacCxA_20_SP,37097541,110367945,0,0,0,0,37097541,110367945,2.98,-nan(ind),-nan(ind),2.98 +testCA_36Unit_CTZ12,Preset,ColmacCxA_25_SP,38614950,110609486,0,0,0,0,38614950,110609486,2.86,-nan(ind),-nan(ind),2.86 +testCA_36Unit_CTZ12,Preset,ColmacCxA_30_SP,38597500,110853106,0,0,0,0,38597500,110853106,2.87,-nan(ind),-nan(ind),2.87 +testCA_36Unit_CTZ12,Preset,NyleC60A_SP,33096290,104833977,0,0,0,0,33096290,104833977,3.17,-nan(ind),-nan(ind),3.17 +testCA_36Unit_CTZ12,Preset,NyleC90A_SP,32772566,109564452,0,0,0,0,32772566,109564452,3.34,-nan(ind),-nan(ind),3.34 +testCA_36Unit_CTZ12,Preset,NyleC185A_SP,33433462,110368635,0,0,0,0,33433462,110368635,3.30,-nan(ind),-nan(ind),3.30 +testCA_36Unit_CTZ12,Preset,NyleC250A_SP,28833891,110356894,0,0,0,0,28833891,110356894,3.83,-nan(ind),-nan(ind),3.83 +testCA_36Unit_CTZ12,Preset,ColmacCxV_5_MP,33287650,90596527,0,0,0,0,33287650,90596527,2.72,-nan(ind),-nan(ind),2.72 +testCA_36Unit_CTZ12,Preset,ColmacCxA_15_MP,49091287,105226890,0,0,0,0,49091287,105226890,2.14,-nan(ind),-nan(ind),2.14 +testCA_36Unit_CTZ12,Preset,ColmacCxA_20_MP,42053550,107837541,0,0,0,0,42053550,107837541,2.56,-nan(ind),-nan(ind),2.56 +testCA_36Unit_CTZ12,Preset,NyleC60A_MP,42678771,91755367,0,0,0,0,42678771,91755367,2.15,-nan(ind),-nan(ind),2.15 +testCA_36Unit_CTZ12,Preset,NyleC185A_MP,47216895,108462724,0,0,0,0,47216895,108462724,2.30,-nan(ind),-nan(ind),2.30 +testCA_36Unit_CTZ12,Preset,NyleC250A_MP,38205322,108713094,0,0,0,0,38205322,108713094,2.85,-nan(ind),-nan(ind),2.85 +testCA_36Unit_CTZ12,Preset,RheemHPHD60,27078847,89802997,0,0,0,0,27078847,89802997,3.32,-nan(ind),-nan(ind),3.32 +testCA_36Unit_CTZ12,Preset,RheemHPHD135,38056812,104589760,0,0,0,0,38056812,104589760,2.75,-nan(ind),-nan(ind),2.75 testCA_36Unit_CTZ12,Preset,TamScalable_SP,1000,1000,0,0,43439261,110163246,43440261,110164246,1.00,-nan(ind),2.54,2.54 testCA_36Unit_CTZ12,Preset,Scalable_MP,500,500,779200,779200,51100212,104284026,51879912,105063726,1.00,1.00,2.04,2.03 From 0f7e1fc7349050f1e11d68b4598a4feb08c10c1f Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 19 Dec 2023 15:21:40 -0700 Subject: [PATCH 15/25] Combine tests; use msg function. --- src/HPWH.cc | 299 ++++++++++++++++++++------------------------------- src/HPWH.hh | 11 +- test/main.cc | 14 +-- 3 files changed, 121 insertions(+), 203 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index fe6bf523..6d17ecc7 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -3943,15 +3943,18 @@ int HPWH::HPWHinit_file(string configFile) { /// @param[in] minutesOfTest Upper (right) bounding fraction (0 to 1) /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool readSchedule(HPWH::Schedule &scheduleArray, std::string scheduleName, long testLength_min) { +bool HPWH::readSchedule(HPWH::Schedule &scheduleArray, std::string scheduleName, long testLength_min) { int minuteHrTmp; bool hourInput; - string line, snippet, s, minORhr; + std::string line, snippet, s, minORhr; double valTmp; std::ifstream inputFile(scheduleName.c_str()); - //open the schedule file provided - cout << "Opening " << scheduleName << '\n'; + + if(hpwhVerbosity >= VRB_reluctant) { + msg("Opening %s\n",scheduleName.c_str()); + } + if(!inputFile.is_open()) { return false; } @@ -4014,7 +4017,9 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & // Read the test control file controlFile.open(fileToOpen.c_str()); if(!controlFile.is_open()) { - cout << "Could not open control file " << fileToOpen << "\n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("Could not open control file %s\n",fileToOpen.c_str()); + } return false; } @@ -4029,6 +4034,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & controlInfo.tot_limit = nullptr; controlInfo.useSoC = false; controlInfo.temperatureUnits = "C"; + controlInfo.extendedTest = false; std::string token; std::string sValue; @@ -4092,7 +4098,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & //----------------------------------------------------------------------------- bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlInfo &controlInfo, std::vector &allSchedules) { - std::vector scheduleNames; + std::vector scheduleNames; scheduleNames.push_back("inletT"); scheduleNames.push_back("draw"); scheduleNames.push_back("ambientT"); @@ -4108,7 +4114,9 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn Schedule schedule; if(!readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min)) { if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { - std::cout << "readSchedule returns an error on " << scheduleNames[i] << " schedule!\n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("readSchedule returns an error on schedule %s\n",scheduleNames[i].c_str()); + } return false; } } @@ -4161,7 +4169,9 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn } if (controlInfo.useSoC) { if (allSchedules[6].empty()) { - cout << "If useSoC is true need an SoCschedule.csv file \n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("If useSoC is true need an SoCschedule.csv file. \n"); + } } const double soCMinTUse_C = F_TO_C(110.); const double soCMains_C = F_TO_C(65.); @@ -4169,7 +4179,9 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn } if (outputCode != 0) { - cout << "Control file testInfo.txt has unsettable specifics in it. \n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("Control file testInfo.txt has unsettable specifics in it. \n"); + } return false; } return true; @@ -4197,164 +4209,43 @@ bool HPWH::runSimulation( const double energyBalThreshold = 0.001; // 0.1 % const int nTestTCouples = 6; - const std::string sHead = "minutes,Ta,Tsetpoint,inletT,draw,"; - const std::string sHeadMP = "condenserInletT,condenserOutletT,externalVolGPM,"; - const std::string sHeadSoC = "targetSoCFract,soCFract,"; - // UEF data - testResults={false,0.,0.}; + testResults = {false, 0., 0.}; FILE * outputFile = NULL; - std::string sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; - if (fopen_s(&outputFile, sOutputFilename.c_str(), "w+") != 0) { - cout << "Could not open output file " << sOutputFilename << "\n"; - return false; + std::string sOutputFilename; + std::string fileMode = "w+"; + if (controlInfo.extendedTest) { + sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; + fileMode = "a+"; } - - string sHeader = sHead; - if (isCompressoExternalMultipass()) { - sHeader += sHeadMP; - } - if(controlInfo.useSoC){ - sHeader += sHeadSoC; + else { + sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; } - int csvOptions = HPWH::CSVOPT_NONE; - WriteCSVHeading(outputFile, sHeader.c_str(), nTestTCouples, csvOptions); - // ------------------------------------- Simulate --------------------------------------- // - cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; - - bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); - - // Loop over the minutes in the test - for (int i = 0; i < controlInfo.timeToRun_min; i++) { - - double inletT_C = allSchedules[0][i]; - double drawVolume_L = GAL_TO_L(allSchedules[1][i]); - double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; - double externalT_C = allSchedules[3][i]; - HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); - - // Change setpoint if there is a setpoint schedule. - if (doChangeSetpoint) { - setSetpoint(allSchedules[5][i]); //expect this to fail sometimes - } - - // Change SoC schedule - if (controlInfo.useSoC) { - if (setTargetSoCFraction(allSchedules[6][i]) != 0) { - cout << "ERROR: Can not set the target state of charge fraction. \n"; - return false; - } - } - - double inletT2_C = inletT_C; - double drawVolume2_L = drawVolume_L; - - double previousTankHeatContent_kJ = getTankHeatContent_kJ(); - - // Run the step - runOneStep( - inletT_C, // inlet water temperature (C) - drawVolume_L, // draw volume (L) - ambientT_C, // ambient Temp (C) - externalT_C, // external Temp (C) - drStatus, // DDR Status (now an enum. Fixed for now as allow) - drawVolume2_L, // inlet-2 volume (L) - inletT2_C, // inlet-2 Temp (C) - NULL); // no extra heat - - if (!isEnergyBalanced(drawVolume_L,inletT_C,previousTankHeatContent_kJ,energyBalThreshold)) { - cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; - return false; - } - - // Check timing - for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - if (getNthHeatSourceRunTime(iHS) > 1.) { - cout << "ERROR: On minute " << i << " heat source " << iHS << " ran for " << getNthHeatSourceRunTime(iHS) << " min" << "\n"; - return false; - } - } - - // Check flow for external MP - if (isCompressoExternalMultipass()) { - double volumeHeated_gal = getExternalVolumeHeated(HPWH::UNITS_GAL); - double mpFlowVolume_gal = getExternalMPFlowRate(HPWH::UNITS_GPM)*getNthHeatSourceRunTime(getCompressorIndex()); - if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) { - cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " << volumeHeated_gal << ", mpFlowRate in 1 min [gal]: " - << mpFlowVolume_gal << "\n"; - return false; - } - } - - // Recording - if (doTempDepress) { - ambientT_C = getLocationTemp_C(); + if (fopen_s(&outputFile, sOutputFilename.c_str(), fileMode.c_str()) != 0) { + if(hpwhVerbosity >= VRB_reluctant) { + msg("Could not open output file \n", sOutputFilename.c_str()); } - std::string sPreamble = std::to_string(i) + ", " + std::to_string(ambientT_C) + ", " + std::to_string(getSetpoint()) + ", " + - std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; - // Add some more outputs for mp tests + return false; + } + + string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; + if (!controlInfo.extendedTest) { if (isCompressoExternalMultipass()) { - sPreamble += std::to_string(getCondenserWaterInletTemp()) + ", " + std::to_string(getCondenserWaterOutletTemp()) + ", " + - std::to_string(getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; + sHeader += "condenserInletT,condenserOutletT,externalVolGPM,"; } - if (controlInfo.useSoC) { - sPreamble += std::to_string(allSchedules[6][i]) + ", " + std::to_string(getSoCFraction()) + ", "; - } - csvOptions = HPWH::CSVOPT_NONE; - if (allSchedules[1][i] > 0.) { - csvOptions |= HPWH::CSVOPT_IS_DRAWING; + if(controlInfo.useSoC){ + sHeader += "targetSoCFract,soCFract,"; } - WriteCSVRow(outputFile, sPreamble.c_str(), nTestTCouples, csvOptions); - - double energyConsumed_kJ = 0.; - for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - energyConsumed_kJ += getNthHeatSourceEnergyInput(iHS, UNITS_KJ); - } - testResults.totalEnergyConsumed_kJ += energyConsumed_kJ; - testResults.totalVolumeRemoved_L += drawVolume_L; + WriteCSVHeading(outputFile, sHeader.c_str(), nTestTCouples, CSVOPT_NONE); } - fclose(outputFile); - - testResults.passed = true; - return true; -} - -//----------------------------------------------------------------------------- -/// @brief Reads the schedules for a test -/// @param[in] testDesc data structure contained test description -/// @param[in] outputDirectory destination path for test results (append file "DHW_YRLY.csv") -/// @param[in] controlInfo data structure containing control info -/// @param[in] allSchedules collection of test schedules -/// @param[in] airT_C air temperature (degC) used for temperature depression -/// @param[in] doTempDepress whether to apply temperature depression -/// @return true if successful, false otherwise -//----------------------------------------------------------------------------- -bool HPWH::runYearlySimulation( - const TestDesc &testDesc, - const std::string &outputDirectory, - const HPWH::ControlInfo &controlInfo, - std::vector &allSchedules, - double airT_C, - const bool doTempDepress, - TestResults &testResults) -{ - const double energyBalThreshold = 0.005; // 0.5 % - - // UEF data - testResults={false,0.,0.}; - std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; - - FILE * outputFile = NULL; - if (fopen_s(&outputFile, sOutputFilename.c_str(), "a+") != 0) { - cout << "Could not open output file " << sOutputFilename << "\n"; - return false; + // ------------------------------------- Simulate --------------------------------------- // + if(hpwhVerbosity >= VRB_reluctant) { + msg("Now Simulating %d Minutes of the Test\n", controlInfo.timeToRun_min); } - cout << "Now Simulating " << controlInfo.timeToRun_min << " Minutes of the Test\n"; - double cumHeatIn[3] = {0, 0, 0}; double cumHeatOut[3] = {0, 0, 0}; @@ -4377,17 +4268,21 @@ bool HPWH::runYearlySimulation( // Change SoC schedule if (controlInfo.useSoC) { if (setTargetSoCFraction(allSchedules[6][i]) != 0) { - cout << "ERROR: Can not set the target state of charge fraction. \n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("ERROR: Can not set the target state of charge fraction.\n"); + } return false; } } - - // Mix down for yearly tests with large compressors - if (getHPWHModel() >= 210) { - //Do a simple mix down of the draw for the cold water temperature - const double mixT_C = F_TO_C(125.); - if (getSetpoint() <= mixT_C) { // Seems to have been some confusion here regarding F<->C conversion - drawVolume_L *= (mixT_C - inletT_C) / (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); + + if (controlInfo.extendedTest) { + // Mix down for yearly tests with large compressors + if (getHPWHModel() >= 210) { + //Do a simple mix down of the draw for the cold water temperature + const double mixT_C = F_TO_C(125.); + if (getSetpoint() <= mixT_C) { // Seems to have been some confusion here regarding F<->C conversion + drawVolume_L *= (mixT_C - inletT_C) / (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); + } } } @@ -4400,27 +4295,35 @@ bool HPWH::runYearlySimulation( int runResult = runOneStep( inletT_C, // inlet water temperature (C) - drawVolume_L, // draw (L) + drawVolume_L, // draw volume (L) ambientT_C, // ambient Temp (C) externalT_C, // external Temp (C) drStatus, // DDR Status (now an enum. Fixed for now as allow) - drawVolume2_L, // draw volume - 2 (L) - inletT2_C, // inlet Temp - 2 (C) + drawVolume2_L, // inlet-2 volume (L) + inletT2_C, // inlet-2 Temp (C) NULL); // no extra heat if (runResult != 0) { + if(hpwhVerbosity >= VRB_reluctant) { + msg("ERROR: Run failed.\n"); + } return false; } if (!isEnergyBalanced(drawVolume_L,inletT_C,previousTankHeatContent_kJ,energyBalThreshold)) { - cout << "WARNING: On minute " << i << " HPWH has an energy balance error.\n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("WARNING: On minute %i, HPWH has an energy balance error.\n",i); + } + return false; } // Check timing for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { if (getNthHeatSourceRunTime(iHS) > 1.) { - cout << "ERROR: On minute " << i << " heat source " << iHS << " ran for " << getNthHeatSourceRunTime(iHS) << " min" << "\n"; - exit(1); + if(hpwhVerbosity >= VRB_reluctant) { + msg("ERROR: On minute %i, heat source %i ran for %i min.\n", iHS, getNthHeatSourceRunTime(iHS)); + } + return false; } } @@ -4429,13 +4332,38 @@ bool HPWH::runYearlySimulation( double volumeHeated_gal = getExternalVolumeHeated(HPWH::UNITS_GAL); double mpFlowVolume_gal = getExternalMPFlowRate(HPWH::UNITS_GPM)*getNthHeatSourceRunTime(getCompressorIndex()); if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) { - cout << "ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " << volumeHeated_gal << ", mpFlowRate in 1 min [gal]: " - << mpFlowVolume_gal << "\n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: %d, mpFlowRate in 1 min [gal] %d\n", + volumeHeated_gal, mpFlowVolume_gal); + } return false; } } // Recording + if (doTempDepress) { + ambientT_C = getLocationTemp_C(); + } + + if (!controlInfo.extendedTest) { + std::string sPreamble = std::to_string(i) + ", " + std::to_string(ambientT_C) + ", " + std::to_string(getSetpoint()) + ", " + + std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; + // Add some more outputs for mp tests + if (isCompressoExternalMultipass()) { + sPreamble += std::to_string(getCondenserWaterInletTemp()) + ", " + std::to_string(getCondenserWaterOutletTemp()) + ", " + + std::to_string(getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; + } + if (controlInfo.useSoC) { + sPreamble += std::to_string(allSchedules[6][i]) + ", " + std::to_string(getSoCFraction()) + ", "; + } + int csvOptions = CSVOPT_NONE; + if (allSchedules[1][i] > 0.) { + csvOptions |= CSVOPT_IS_DRAWING; + } + WriteCSVRow(outputFile, sPreamble.c_str(), nTestTCouples, csvOptions); + } + + // track energy draw and use double energyConsumed_kJ = 0.; for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { double heatSourceEnergyConsumed_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); @@ -4447,23 +4375,26 @@ bool HPWH::runYearlySimulation( testResults.totalEnergyConsumed_kJ += energyConsumed_kJ; testResults.totalVolumeRemoved_L += drawVolume_L; } - - std::string firstCol = testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; - fprintf(outputFile, "%s", firstCol.c_str()); - double totalIn = 0, totalOut = 0; - for (int iHS = 0; iHS < 3; iHS++) { - fprintf(outputFile, ",%0.0f,%0.0f", cumHeatIn[iHS], cumHeatOut[iHS]); - totalIn += cumHeatIn[iHS]; - totalOut += cumHeatOut[iHS]; - } - fprintf(outputFile, ",%0.0f,%0.0f", totalIn, totalOut); - for (int iHS = 0; iHS < 3; iHS++) { - fprintf(outputFile, ",%0.2f", cumHeatOut[iHS] /cumHeatIn[iHS]); + + if (controlInfo.extendedTest) { + std::string firstCol = testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; + fprintf(outputFile, "%s", firstCol.c_str()); + double totalIn = 0, totalOut = 0; + for (int iHS = 0; iHS < 3; iHS++) { + fprintf(outputFile, ",%0.0f,%0.0f", cumHeatIn[iHS], cumHeatOut[iHS]); + totalIn += cumHeatIn[iHS]; + totalOut += cumHeatOut[iHS]; + } + fprintf(outputFile, ",%0.0f,%0.0f", totalIn, totalOut); + for (int iHS = 0; iHS < 3; iHS++) { + fprintf(outputFile, ",%0.2f", cumHeatOut[iHS] /cumHeatIn[iHS]); + } + fprintf(outputFile, ",%0.2f", totalOut/totalIn); + fprintf(outputFile, "\n"); } - fprintf(outputFile, ",%0.2f", totalOut/totalIn); - fprintf(outputFile, "\n"); + fclose(outputFile); testResults.passed = true; return true; -} \ No newline at end of file +} diff --git a/src/HPWH.hh b/src/HPWH.hh index 67df5d3d..e61b1345 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -832,11 +832,13 @@ public: std::unique_ptr tot_limit; bool useSoC; std::string temperatureUnits; + bool extendedTest; }; bool readControlInfo(const std::string &testDirectory, ControlInfo &controlInfo); typedef std::vector Schedule; bool readSchedules(const std::string &testDirectory, const ControlInfo &controlInfo, std::vector &allSchedules); + bool readSchedule(Schedule &scheduleArray, std::string scheduleName, long testLength_min); struct TestDesc{ std::string presetOrFile; @@ -859,15 +861,6 @@ public: const bool doTempDepress, TestResults &testResults); - bool runYearlySimulation( - const TestDesc &testDesc, - const std::string &outputDirectory, - const HPWH::ControlInfo &controlInfo, - std::vector &allSchedules, - double airT_C, - const bool doTempDepress, - TestResults &testResults); - private: class HeatSource; diff --git a/test/main.cc b/test/main.cc index 3370164c..b9197d67 100644 --- a/test/main.cc +++ b/test/main.cc @@ -95,9 +95,7 @@ int main(int argc, char *argv[]){ hpwh.setMaxTempDepression(4.); hpwh.setDoTempDepression(doTempDepress); - HPWH::ControlInfo controlInfo; - - + HPWH::ControlInfo controlInfo; if(!hpwh.readControlInfo(testDesc.testName,controlInfo)){ cout << "Control file testInfo.txt has unsettable specifics in it. \n"; failed = true; @@ -108,14 +106,10 @@ int main(int argc, char *argv[]){ failed = !hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules); ASSERTFALSE(failed); + controlInfo.extendedTest = (controlInfo.timeToRun_min > maximumDurationNormalTest_min); + HPWH::TestResults testResults; - if (controlInfo.timeToRun_min > maximumDurationNormalTest_min) { - failed = !hpwh.runYearlySimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults); - } - else { - failed = !hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults); - } - ASSERTFALSE(failed); + ASSERTTRUE(hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults)); return 0; } From 57ddb51cd5702f4363f1c9789a0cfb4d18a31a74 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 19 Dec 2023 15:40:35 -0700 Subject: [PATCH 16/25] Change default DR status. --- test/24hr67_high/DRschedule.csv | 4 ++-- test/24hr67_low/DRschedule.csv | 4 ++-- test/24hr67_medium/DRschedule.csv | 4 ++-- test/24hr67_vsmall/DRschedule.csv | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/24hr67_high/DRschedule.csv b/test/24hr67_high/DRschedule.csv index 0fae0f27..bd79ca27 100644 --- a/test/24hr67_high/DRschedule.csv +++ b/test/24hr67_high/DRschedule.csv @@ -1,2 +1,2 @@ -default 1 -minutes,OnOff +default 0, +minutes,OnOff \ No newline at end of file diff --git a/test/24hr67_low/DRschedule.csv b/test/24hr67_low/DRschedule.csv index 0fae0f27..bd79ca27 100644 --- a/test/24hr67_low/DRschedule.csv +++ b/test/24hr67_low/DRschedule.csv @@ -1,2 +1,2 @@ -default 1 -minutes,OnOff +default 0, +minutes,OnOff \ No newline at end of file diff --git a/test/24hr67_medium/DRschedule.csv b/test/24hr67_medium/DRschedule.csv index 0fae0f27..bd79ca27 100644 --- a/test/24hr67_medium/DRschedule.csv +++ b/test/24hr67_medium/DRschedule.csv @@ -1,2 +1,2 @@ -default 1 -minutes,OnOff +default 0, +minutes,OnOff \ No newline at end of file diff --git a/test/24hr67_vsmall/DRschedule.csv b/test/24hr67_vsmall/DRschedule.csv index 0fae0f27..bd79ca27 100644 --- a/test/24hr67_vsmall/DRschedule.csv +++ b/test/24hr67_vsmall/DRschedule.csv @@ -1,2 +1,2 @@ -default 1 -minutes,OnOff +default 0, +minutes,OnOff \ No newline at end of file From f21e5886cfb7cf1d9b71eda5834c3b27a98622bf Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 20 Dec 2023 12:09:18 -0700 Subject: [PATCH 17/25] Improve calcUEF and test options. --- src/HPWH.cc | 98 +++++++++++++++++++++++------------------- src/HPWH.hh | 3 +- test/AquaThermAire.txt | 1 - test/main.cc | 39 ++++++++++------- test/testCalcUEF.cc | 54 ++++++++++++----------- 5 files changed, 108 insertions(+), 87 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 720c0401..d6484ef1 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -314,7 +314,6 @@ void HPWH::setAllDefaults() { prevDRstatus = DR_ALLOW; timerLimitTOT = 60.; timerTOT = 0.; usesSoCLogic = false; setMinutesPerStep(1.0); - hpwhVerbosity = VRB_minuteOut; hasHeatExchanger = false; heatExchangerEffectiveness = 0.9; } @@ -4116,7 +4115,8 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & controlInfo.tot_limit = nullptr; controlInfo.useSoC = false; controlInfo.temperatureUnits = "C"; - controlInfo.extendedTest = false; + controlInfo.recordMinuteData = false; + controlInfo.recordYearData = false; std::string token; std::string sValue; @@ -4294,33 +4294,37 @@ bool HPWH::runSimulation( // UEF data testResults = {false, 0., 0.}; - FILE * outputFile = NULL; - std::string sOutputFilename; - std::string fileMode = "w+"; - if (controlInfo.extendedTest) { - sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; - fileMode = "a+"; - } - else { - sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; + FILE *yearOutputFile = NULL; + if (controlInfo.recordYearData) { + std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; + if (fopen_s(&yearOutputFile, sOutputFilename.c_str(), "a+") != 0) { + if(hpwhVerbosity >= VRB_reluctant) { + msg("Could not open output file \n", sOutputFilename.c_str()); + } + return false; + } } - if (fopen_s(&outputFile, sOutputFilename.c_str(), fileMode.c_str()) != 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Could not open output file \n", sOutputFilename.c_str()); + FILE *minuteOutputFile = NULL; + if (controlInfo.recordMinuteData) { + std::string sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; + if (fopen_s(&minuteOutputFile, sOutputFilename.c_str(), "w+") != 0) { + if(hpwhVerbosity >= VRB_reluctant) { + msg("Could not open output file \n", sOutputFilename.c_str()); + } + return false; } - return false; - } + } - string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; - if (!controlInfo.extendedTest) { + if (controlInfo.recordMinuteData) { + string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; if (isCompressoExternalMultipass()) { sHeader += "condenserInletT,condenserOutletT,externalVolGPM,"; } if(controlInfo.useSoC){ sHeader += "targetSoCFract,soCFract,"; } - WriteCSVHeading(outputFile, sHeader.c_str(), nTestTCouples, CSVOPT_NONE); + WriteCSVHeading(minuteOutputFile, sHeader.c_str(), nTestTCouples, CSVOPT_NONE); } // ------------------------------------- Simulate --------------------------------------- // @@ -4328,8 +4332,8 @@ bool HPWH::runSimulation( msg("Now Simulating %d Minutes of the Test\n", controlInfo.timeToRun_min); } - double cumHeatIn[3] = {0, 0, 0}; - double cumHeatOut[3] = {0, 0, 0}; + double cumulativeEnergyIn_kWh[3] = {0., 0., 0.}; + double cumulativeEnergyOut_kWh[3] = {0., 0., 0.}; bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); @@ -4357,9 +4361,9 @@ bool HPWH::runSimulation( } } - if (controlInfo.extendedTest) { + if (controlInfo.recordYearData) { // Mix down for yearly tests with large compressors - if (getHPWHModel() >= 210) { + if (getHPWHModel() >= MODELS_ColmacCxV_5_SP) { //Do a simple mix down of the draw for the cold water temperature const double mixT_C = F_TO_C(125.); if (getSetpoint() <= mixT_C) { // Seems to have been some confusion here regarding F<->C conversion @@ -4427,7 +4431,8 @@ bool HPWH::runSimulation( ambientT_C = getLocationTemp_C(); } - if (!controlInfo.extendedTest) { + // write minute summary + if (controlInfo.recordMinuteData) { std::string sPreamble = std::to_string(i) + ", " + std::to_string(ambientT_C) + ", " + std::to_string(getSetpoint()) + ", " + std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; // Add some more outputs for mp tests @@ -4442,41 +4447,46 @@ bool HPWH::runSimulation( if (allSchedules[1][i] > 0.) { csvOptions |= CSVOPT_IS_DRAWING; } - WriteCSVRow(outputFile, sPreamble.c_str(), nTestTCouples, csvOptions); + WriteCSVRow(minuteOutputFile, sPreamble.c_str(), nTestTCouples, csvOptions); } - // track energy draw and use - double energyConsumed_kJ = 0.; + // accumulate energy and draw + double energyIn_kJ = 0.; for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - double heatSourceEnergyConsumed_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); - energyConsumed_kJ += heatSourceEnergyConsumed_kJ; + double heatSourceEnergyIn_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); + energyIn_kJ += heatSourceEnergyIn_kJ; - cumHeatIn[iHS] += KJ_TO_KWH(heatSourceEnergyConsumed_kJ) * 1000.; - cumHeatOut[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; + cumulativeEnergyIn_kWh[iHS] += KJ_TO_KWH(heatSourceEnergyIn_kJ) * 1000.; + cumulativeEnergyOut_kWh[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; } - testResults.totalEnergyConsumed_kJ += energyConsumed_kJ; + testResults.totalEnergyConsumed_kJ += energyIn_kJ; testResults.totalVolumeRemoved_L += drawVolume_L; } + // -------------------------------------Simulation complete --------------------------------------- // - if (controlInfo.extendedTest) { + if (controlInfo.recordMinuteData) { + fclose(minuteOutputFile); + } + + // write year summary + if (controlInfo.recordYearData) { std::string firstCol = testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; - fprintf(outputFile, "%s", firstCol.c_str()); - double totalIn = 0, totalOut = 0; + fprintf(yearOutputFile, "%s", firstCol.c_str()); + double totalEnergyIn_kWh = 0, totalEnergyOut_kWh = 0; for (int iHS = 0; iHS < 3; iHS++) { - fprintf(outputFile, ",%0.0f,%0.0f", cumHeatIn[iHS], cumHeatOut[iHS]); - totalIn += cumHeatIn[iHS]; - totalOut += cumHeatOut[iHS]; + fprintf(yearOutputFile, ",%0.0f,%0.0f", cumulativeEnergyIn_kWh[iHS], cumulativeEnergyOut_kWh[iHS]); + totalEnergyIn_kWh += cumulativeEnergyIn_kWh[iHS]; + totalEnergyOut_kWh += cumulativeEnergyOut_kWh[iHS]; } - fprintf(outputFile, ",%0.0f,%0.0f", totalIn, totalOut); + fprintf(yearOutputFile, ",%0.0f,%0.0f", totalEnergyIn_kWh, totalEnergyOut_kWh); for (int iHS = 0; iHS < 3; iHS++) { - fprintf(outputFile, ",%0.2f", cumHeatOut[iHS] /cumHeatIn[iHS]); + fprintf(yearOutputFile, ",%0.2f", cumulativeEnergyOut_kWh[iHS] /cumulativeEnergyIn_kWh[iHS]); } - fprintf(outputFile, ",%0.2f", totalOut/totalIn); - fprintf(outputFile, "\n"); + fprintf(yearOutputFile, ",%0.2f", totalEnergyOut_kWh/totalEnergyIn_kWh); + fprintf(yearOutputFile, "\n"); + fclose(yearOutputFile); } - fclose(outputFile); - testResults.passed = true; return true; } diff --git a/src/HPWH.hh b/src/HPWH.hh index e8acb6dd..c0acd306 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -831,7 +831,8 @@ public: std::unique_ptr tot_limit; bool useSoC; std::string temperatureUnits; - bool extendedTest; + bool recordMinuteData; + bool recordYearData; }; bool readControlInfo(const std::string &testDirectory, ControlInfo &controlInfo); diff --git a/test/AquaThermAire.txt b/test/AquaThermAire.txt index 04f47fa4..a53730a3 100644 --- a/test/AquaThermAire.txt +++ b/test/AquaThermAire.txt @@ -1,4 +1,3 @@ -verbosity silent numNodes 12 #number of nodes setpoint 50 C volume 54.4 gal diff --git a/test/main.cc b/test/main.cc index b9197d67..d9a0f775 100644 --- a/test/main.cc +++ b/test/main.cc @@ -25,21 +25,23 @@ using std::ifstream; int main(int argc, char *argv[]){ HPWH hpwh; - bool failed = false; const long maximumDurationNormalTest_min = 500000; +#if defined _DEBUG + hpwh.setVerbosity(HPWH::VRB_reluctant); +#endif + // process command line arguments cout << "Testing HPWHsim version " << HPWH::getVersion() << endl; // Obvious wrong number of command line arguments if ((argc > 6)) { cout << "Invalid input. This program takes FOUR arguments: model specification type (ie. Preset or File), model specification (ie. Sanden80), test name (ie. test50) and output directory\n"; - failed = true; + exit(1); } - ASSERTFALSE(failed); - // Help message + // parse inputs std::string input1, input2, input3, input4; if(argc > 1) { input1 = argv[1]; @@ -52,14 +54,15 @@ int main(int argc, char *argv[]){ input3 = "ghi"; input4 = "."; } + + // display help message if (argc < 5 || (argc > 6) || (input1 == "?") || (input1 == "help")) { cout << "Standard usage: \"hpwhTestTool.x [model spec type Preset/File] [model spec Name] [testName] [airtemp override F (optional)]\"\n"; cout << "All input files should be located in the test directory, with these names:\n"; cout << "drawschedule.csv DRschedule.csv ambientTschedule.csv evaporatorTschedule.csv inletTschedule.csv hpwhProperties.csv\n"; cout << "An output file, `modelname'Output.csv, will be written in the test directory\n"; - failed = true; + exit(1); } - ASSERTFALSE(failed); HPWH::TestDesc testDesc; testDesc.presetOrFile = input1; @@ -71,17 +74,18 @@ int main(int argc, char *argv[]){ if(testDesc.presetOrFile == "Preset") { if (getHPWHObject(hpwh, testDesc.modelName) == HPWH::HPWH_ABORT) { cout << "Error, preset model did not initialize.\n"; - failed = true; + exit(1); } } else if (testDesc.presetOrFile == "File") { std::string inputFile = testDesc.modelName + ".txt"; - if (hpwh.HPWHinit_file(inputFile) != 0) exit(1); + if (hpwh.HPWHinit_file(inputFile) != 0) { + exit(1); + } } else { cout << "Invalid argument, received '"<< testDesc.presetOrFile << "', expected 'Preset' or 'File'.\n"; - failed = true; + exit(1); } - ASSERTFALSE(failed); double airT_C = 0.; bool doTempDepress = false; @@ -98,18 +102,21 @@ int main(int argc, char *argv[]){ HPWH::ControlInfo controlInfo; if(!hpwh.readControlInfo(testDesc.testName,controlInfo)){ cout << "Control file testInfo.txt has unsettable specifics in it. \n"; - failed = true; + exit(1); } - ASSERTFALSE(failed); std::vector allSchedules; - failed = !hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules); - ASSERTFALSE(failed); + if (!hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules)) { + exit(1); + } - controlInfo.extendedTest = (controlInfo.timeToRun_min > maximumDurationNormalTest_min); + controlInfo.recordMinuteData = (controlInfo.timeToRun_min <= maximumDurationNormalTest_min); + controlInfo.recordYearData = !controlInfo.recordMinuteData; HPWH::TestResults testResults; - ASSERTTRUE(hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults)); + if (!hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults)) { + exit(1); + } return 0; } diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc index d540e392..1c07dc69 100644 --- a/test/testCalcUEF.cc +++ b/test/testCalcUEF.cc @@ -12,7 +12,7 @@ const std::vector sProfileNames({ "24hr67_vsmall", "24hr67_medium", "24hr67_high" }); -bool runTest( +static bool runTest( const HPWH::TestDesc testDesc, HPWH::TestResults &testResults, double airT_C = 0., @@ -20,24 +20,23 @@ bool runTest( { HPWH hpwh; +#if defined _DEBUG + hpwh.setVerbosity(HPWH::VRB_reluctant); +#endif + getHPWHObject(hpwh, testDesc.modelName); std::string sOutputDirectory = "../build/test/output"; - // Parse the model + // create the model + bool result = true; if(testDesc.presetOrFile == "Preset") { - if (getHPWHObject(hpwh, testDesc.modelName) == HPWH::HPWH_ABORT) { - cout << "Error, preset model did not initialize.\n"; - exit(1); - } + result = (getHPWHObject(hpwh, testDesc.modelName) != HPWH::HPWH_ABORT); } else if (testDesc.presetOrFile == "File") { std::string inputFile = testDesc.modelName + ".txt"; - if (hpwh.HPWHinit_file(inputFile) != 0) exit(1); - } - else { - cout << "Invalid argument, received '"<< testDesc.presetOrFile << "', expected 'Preset' or 'File'.\n"; - exit(1); + result = (hpwh.HPWHinit_file(inputFile) != HPWH::HPWH_ABORT); } + ASSERTTRUE(result); // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C to better // try and trigger the lockout and hysteresis conditions @@ -45,22 +44,23 @@ bool runTest( hpwh.setDoTempDepression(doTempDepress); HPWH::ControlInfo controlInfo; - if(!hpwh.readControlInfo(testDesc.testName,controlInfo)){ - cout << "Control file testInfo.txt has unsettable specifics in it. \n"; - exit(1); - } + result = hpwh.readControlInfo(testDesc.testName,controlInfo); + ASSERTTRUE(result); std::vector allSchedules; - if (!(hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules))) { - exit(1); - } + result = hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules); + ASSERTTRUE(result); - return hpwh.runSimulation(testDesc,sOutputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults); + controlInfo.recordMinuteData = false; + controlInfo.recordYearData = false; + result = hpwh.runSimulation(testDesc,sOutputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults); + ASSERTTRUE(result); + return result; } -/* Test energy balance for storage tank with extra heat (solar)*/ -void runTestSuite(const std::string &sModelName,const std::string &sPresetOrFile) { +/* Evaluate UEF based on simulations using standard profiles */ +static bool runUEFTestSuite(const std::string &sModelName,const std::string &sPresetOrFile, double &UEF) { HPWH::TestDesc testDesc; testDesc.modelName = sModelName; @@ -69,10 +69,11 @@ void runTestSuite(const std::string &sModelName,const std::string &sPresetOrFile double totalEnergyConsumed_kJ = 0.; double totalVolumeRemoved_L = 0.; + bool result = true; for (auto &sProfileName: sProfileNames) { HPWH::TestResults testResults; testDesc.testName = sProfileName; - ASSERTTRUE(runTest(testDesc,testResults)); + result &= runTest(testDesc,testResults); totalEnergyConsumed_kJ += testResults.totalEnergyConsumed_kJ; totalVolumeRemoved_L += testResults.totalVolumeRemoved_L; @@ -81,8 +82,8 @@ void runTestSuite(const std::string &sModelName,const std::string &sPresetOrFile double totalHeatCapacity_kJperC = HPWH::CPWATER_kJperkgC * totalMassRemoved_kg; double refEnergy_kJ = totalHeatCapacity_kJperC * (51.7 - 14.4); - double UEF = refEnergy_kJ / totalEnergyConsumed_kJ; - std::cout << "UEF: " << UEF << "\n"; + UEF = refEnergy_kJ / totalEnergyConsumed_kJ; + return result; } int main(int argc, char *argv[]) @@ -96,7 +97,10 @@ int main(int argc, char *argv[]) std::string sPresetOrFile = argv[1]; std::string sModelName = argv[2]; - runTestSuite(sModelName,sPresetOrFile); + double UEF = 0.; + if (runUEFTestSuite(sModelName, sPresetOrFile, UEF)) { + std::cout << "UEF: " << UEF << "\n"; + } return 0; } From efbca61283b637ec14f046bf053b40439f8b400a Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 20 Dec 2023 13:49:31 -0700 Subject: [PATCH 18/25] Clarify modified draw. --- src/HPWH.cc | 39 ++++++++++++++++++--------------------- src/HPWH.hh | 1 + test/main.cc | 7 ++++++- test/testCalcUEF.cc | 2 +- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index d6484ef1..c101fbe3 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4117,6 +4117,7 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & controlInfo.temperatureUnits = "C"; controlInfo.recordMinuteData = false; controlInfo.recordYearData = false; + controlInfo.modifyDraw = false; std::string token; std::string sValue; @@ -4288,7 +4289,7 @@ bool HPWH::runSimulation( const bool doTempDepress, TestResults &testResults) { - const double energyBalThreshold = 0.001; // 0.1 % + const double energyBalThreshold = 0.0001; // 0.1 % const int nTestTCouples = 6; // UEF data @@ -4327,17 +4328,17 @@ bool HPWH::runSimulation( WriteCSVHeading(minuteOutputFile, sHeader.c_str(), nTestTCouples, CSVOPT_NONE); } - // ------------------------------------- Simulate --------------------------------------- // - if(hpwhVerbosity >= VRB_reluctant) { - msg("Now Simulating %d Minutes of the Test\n", controlInfo.timeToRun_min); - } - double cumulativeEnergyIn_kWh[3] = {0., 0., 0.}; double cumulativeEnergyOut_kWh[3] = {0., 0., 0.}; bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); - // Loop over the minutes in the test + // ------------------------------------- Simulate --------------------------------------- // + if(hpwhVerbosity >= VRB_reluctant) { + msg("Now Simulating %d Minutes of the Test\n", controlInfo.timeToRun_min); + } + + // run simulation in 1-min steps for (int i = 0; i < controlInfo.timeToRun_min; i++) { double inletT_C = allSchedules[0][i]; @@ -4346,12 +4347,12 @@ bool HPWH::runSimulation( double externalT_C = allSchedules[3][i]; HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); - // Change setpoint if there is a setpoint schedule. + // change setpoint if specified in schedule if (doChangeSetpoint) { setSetpoint(allSchedules[5][i]); //expect this to fail sometimes } - // Change SoC schedule + // change SoC schedule if (controlInfo.useSoC) { if (setTargetSoCFraction(allSchedules[6][i]) != 0) { if(hpwhVerbosity >= VRB_reluctant) { @@ -4361,14 +4362,10 @@ bool HPWH::runSimulation( } } - if (controlInfo.recordYearData) { - // Mix down for yearly tests with large compressors - if (getHPWHModel() >= MODELS_ColmacCxV_5_SP) { - //Do a simple mix down of the draw for the cold water temperature - const double mixT_C = F_TO_C(125.); - if (getSetpoint() <= mixT_C) { // Seems to have been some confusion here regarding F<->C conversion - drawVolume_L *= (mixT_C - inletT_C) / (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); - } + if (controlInfo.modifyDraw) { + const double mixT_C = F_TO_C(125.); + if (getSetpoint() <= mixT_C) { // do a simple mix down of the draw for the cold-water temperature + drawVolume_L *= (mixT_C - inletT_C) / (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); } } @@ -4377,7 +4374,7 @@ bool HPWH::runSimulation( double previousTankHeatContent_kJ = getTankHeatContent_kJ(); - // Run the step + // run a step int runResult = runOneStep( inletT_C, // inlet water temperature (C) @@ -4400,10 +4397,10 @@ bool HPWH::runSimulation( if(hpwhVerbosity >= VRB_reluctant) { msg("WARNING: On minute %i, HPWH has an energy balance error.\n",i); } - return false; + // return false; // fails on ModelTest.testREGoesTo93C.TamScalable_SP.Preset; issue in addHeatExternal } - // Check timing + // check timing for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { if (getNthHeatSourceRunTime(iHS) > 1.) { if(hpwhVerbosity >= VRB_reluctant) { @@ -4413,7 +4410,7 @@ bool HPWH::runSimulation( } } - // Check flow for external MP + // check flow for external MP if (isCompressoExternalMultipass()) { double volumeHeated_gal = getExternalVolumeHeated(HPWH::UNITS_GAL); double mpFlowVolume_gal = getExternalMPFlowRate(HPWH::UNITS_GPM)*getNthHeatSourceRunTime(getCompressorIndex()); diff --git a/src/HPWH.hh b/src/HPWH.hh index c0acd306..a342cb4f 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -833,6 +833,7 @@ public: std::string temperatureUnits; bool recordMinuteData; bool recordYearData; + bool modifyDraw; }; bool readControlInfo(const std::string &testDirectory, ControlInfo &controlInfo); diff --git a/test/main.cc b/test/main.cc index d9a0f775..139a27b4 100644 --- a/test/main.cc +++ b/test/main.cc @@ -111,7 +111,12 @@ int main(int argc, char *argv[]){ } controlInfo.recordMinuteData = (controlInfo.timeToRun_min <= maximumDurationNormalTest_min); - controlInfo.recordYearData = !controlInfo.recordMinuteData; + controlInfo.recordYearData = (controlInfo.timeToRun_min > maximumDurationNormalTest_min); + + controlInfo.modifyDraw = ( // mix down large-compressor models for yearly tests + (hpwh.getHPWHModel() >= HPWH::MODELS_ColmacCxV_5_SP) && + (hpwh.getHPWHModel() <= HPWH::MODELS_RHEEM_HPHD135VNU_483_MP) && + (controlInfo.timeToRun_min > maximumDurationNormalTest_min)); HPWH::TestResults testResults; if (!hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults)) { diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc index 1c07dc69..5fe08a70 100644 --- a/test/testCalcUEF.cc +++ b/test/testCalcUEF.cc @@ -1,5 +1,5 @@ /* - * unit test for energy balancing + * calculate UEF for specified HPWH model */ #include "HPWH.hh" #include "testUtilityFcts.cc" From 0f7577e813df35ceff0e2252fe85321aeea28bc0 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 20 Dec 2023 13:51:52 -0700 Subject: [PATCH 19/25] Remove unused file. --- src/HPWHschedules.cc | 134 ------------------------------------------- 1 file changed, 134 deletions(-) delete mode 100644 src/HPWHschedules.cc diff --git a/src/HPWHschedules.cc b/src/HPWHschedules.cc deleted file mode 100644 index 1edd0fe7..00000000 --- a/src/HPWHschedules.cc +++ /dev/null @@ -1,134 +0,0 @@ - - typedef std::vector schedule; - - bool readTestSchedules(const std::string &testDirectory, std::vector &allSchedules) - { - - // Read the test control file - fileToOpen = testDirectory + "/" + "testInfo.txt"; - controlFile.open(fileToOpen.c_str()); - if(!controlFile.is_open()) { - cout << "Could not open control file " << fileToOpen << "\n"; - exit(1); - } - outputCode = 0; - minutesToRun = 0; - newSetpoint = 0.; - initialTankT_C = 0.; - doCondu = 1; - doInvMix = 1; - inletH = 0.; - newTankSize = 0.; - tot_limit = 0.; - useSoC = false; - bool hasInitialTankTemp = false; - cout << "Running: " << input2 << ", " << input1 << ", " << input3 << endl; - - while(controlFile >> var1 >> testVal) { - if(var1 == "setpoint") { // If a setpoint was specified then override the default - newSetpoint = testVal; - } - else if(var1 == "length_of_test") { - minutesToRun = (int) testVal; - } - else if(var1 == "doInversionMixing") { - doInvMix = (testVal > 0.0) ? 1 : 0; - } - else if(var1 == "doConduction") { - doCondu = (testVal > 0.0) ? 1 : 0; - } - else if(var1 == "inletH") { - inletH = testVal; - } - else if(var1 == "tanksize") { - newTankSize = testVal; - } - else if(var1 == "tot_limit") { - tot_limit = testVal; - } - else if(var1 == "useSoC") { - useSoC = (bool)testVal; - } - if(var1 == "initialTankT_C") { // Initialize at this temperature instead of setpoint - initialTankT_C = testVal; - hasInitialTankTemp = true; - } - else { - cout << var1 << " in testInfo.txt is an unrecogized key.\n"; - } - } - - if(minutesToRun == 0) { - cout << "Error, must record length_of_test in testInfo.txt file\n"; - exit(1); - } - - // ------------------------------------- Read Schedules--------------------------------------- // - scheduleNames.push_back("inletT"); - scheduleNames.push_back("draw"); - scheduleNames.push_back("ambientT"); - scheduleNames.push_back("evaporatorT"); - scheduleNames.push_back("DR"); - scheduleNames.push_back("setpoint"); - scheduleNames.push_back("SoC"); - - for(i = 0; (unsigned)i < scheduleNames.size(); i++) { - fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; - outputCode = readSchedule(allSchedules[i], fileToOpen, minutesToRun); - if(outputCode != 0) { - if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { - cout << "readSchedule returns an error on " << scheduleNames[i] << " schedule!\n"; - exit(1); - } - else { - outputCode = 0; - } - } - } - - - if (doInvMix == 0) { - outputCode += hpwh.setDoInversionMixing(false); - } - - if (doCondu == 0) { - outputCode += hpwh.setDoConduction(false); - } - if (newSetpoint > 0) { - if (!allSchedules[5].empty()) { - hpwh.setSetpoint(allSchedules[5][0]); //expect this to fail sometimes - if (hasInitialTankTemp) - hpwh.setTankToTemperature(initialTankT_C); - else - hpwh.resetTankToSetpoint(); - } - else { - hpwh.setSetpoint(newSetpoint); - if (hasInitialTankTemp) - hpwh.setTankToTemperature(initialTankT_C); - else - hpwh.resetTankToSetpoint(); - } - } - if (inletH > 0) { - outputCode += hpwh.setInletByFraction(inletH); - } - if (newTankSize > 0) { - hpwh.setTankSize(newTankSize, HPWH::UNITS_GAL); - } - if (tot_limit > 0) { - outputCode += hpwh.setTimerLimitTOT(tot_limit); - } - if (useSoC) { - if (allSchedules[6].empty()) { - cout << "If useSoC is true need an SoCschedule.csv file \n"; - } - outputCode += hpwh.switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); - } - - if (outputCode != 0) { - cout << "Control file testInfo.txt has unsettable specifics in it. \n"; - return false; - } - return true; -} \ No newline at end of file From 2c3caab3e16ddd88a06ebe267b9ad2effda1e1a2 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 20 Dec 2023 14:36:16 -0700 Subject: [PATCH 20/25] Clean comments, varianble names. --- src/HPWH.cc | 48 +++++++++++++++++++++++++++--------------------- src/HPWH.hh | 2 +- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index c101fbe3..50c385a9 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -4018,13 +4018,13 @@ int HPWH::HPWHinit_file(string configFile) { #endif //----------------------------------------------------------------------------- -/// @brief Reads a named schedule into a schedule array. -/// @param[out] scheduleArray std::vector of test schedules -/// @param[in] scheduleName name of schedule to read -/// @param[in] minutesOfTest Upper (right) bounding fraction (0 to 1) +/// @brief Reads a named schedule +/// @param[out] schedule schedule values +/// @param[in] scheduleName name of schedule to read +/// @param[in] testLength_min length of test (min) /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::readSchedule(HPWH::Schedule &scheduleArray, std::string scheduleName, long testLength_min) { +bool HPWH::readSchedule(HPWH::Schedule &schedule, std::string scheduleName, long testLength_min) { int minuteHrTmp; bool hourInput; std::string line, snippet, s, minORhr; @@ -4043,12 +4043,14 @@ bool HPWH::readSchedule(HPWH::Schedule &scheduleArray, std::string scheduleName, inputFile >> snippet >> valTmp; if(snippet != "default") { - cout << "First line of " << scheduleName << " must specify default\n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("First line of %s must specify default\n",scheduleName.c_str()); + } return false; } // Fill with the default value - scheduleArray.assign(testLength_min, valTmp); + schedule.assign(testLength_min, valTmp); // Burn the first two lines std::getline(inputFile, line); @@ -4061,22 +4063,21 @@ bool HPWH::readSchedule(HPWH::Schedule &scheduleArray, std::string scheduleName, return true; } hourInput = tolower(minORhr.at(0)) == 'h'; - char c; // to eat the commas nom nom - // Read all the exceptions to the default value + char c; // for commas while (inputFile >> minuteHrTmp >> c >> valTmp) { - - if (minuteHrTmp >= (int)scheduleArray.size()) { - cout << "In " << scheduleName << " the input file has more minutes than the test was defined with\n"; + if (minuteHrTmp >= static_cast(schedule.size())) { + if(hpwhVerbosity >= VRB_reluctant) { + msg("Input file for %s has more minutes than test definition\n",scheduleName.c_str()); + } return false; } - // Update the value + // update the value if (!hourInput) { - scheduleArray[minuteHrTmp] = valTmp; + schedule[minuteHrTmp] = valTmp; } else if (hourInput) { for (int j = minuteHrTmp * 60; j < (minuteHrTmp+1) * 60; j++) { - scheduleArray[j] = valTmp; - //cout << "minute " << j-(minuteHrTmp) * 60 << " of hour" << (minuteHrTmp)<<"\n"; + schedule[j] = valTmp; } } } @@ -4153,7 +4154,9 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & controlInfo.temperatureUnits = sValue; } else { - cout << token << " in testInfo.txt is an unrecogized key.\n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("Unrecognized key in %s\n",token.c_str()); + } } } controlFile.close(); @@ -4165,7 +4168,9 @@ bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo & } if(controlInfo.timeToRun_min == 0) { - cout << "Error, must record length_of_test in testInfo.txt file\n"; + if(hpwhVerbosity >= VRB_reluctant) { + msg("Error: record length_of_test not found in testInfo.txt file\n"); + } return false; } @@ -4271,13 +4276,14 @@ bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlIn } //----------------------------------------------------------------------------- -/// @brief Reads the schedules for a test -/// @param[in] testDesc data structure contained test description +/// @brief Runs a simulation +/// @param[in] testDesc data structure containing test description /// @param[in] outputDirectory destination path for test results (filename based on testDesc) /// @param[in] controlInfo data structure containing control info /// @param[in] allSchedules collection of test schedules /// @param[in] airT_C air temperature (degC) used for temperature depression /// @param[in] doTempDepress whether to apply temperature depression +/// @param[out] testResults data structure containing test results /// @return true if successful, false otherwise //----------------------------------------------------------------------------- bool HPWH::runSimulation( @@ -4423,7 +4429,7 @@ bool HPWH::runSimulation( } } - // Recording + // location temperature reported with temperature depression, instead of ambient temperature if (doTempDepress) { ambientT_C = getLocationTemp_C(); } diff --git a/src/HPWH.hh b/src/HPWH.hh index a342cb4f..01aae6ef 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -839,7 +839,7 @@ public: typedef std::vector Schedule; bool readSchedules(const std::string &testDirectory, const ControlInfo &controlInfo, std::vector &allSchedules); - bool readSchedule(Schedule &scheduleArray, std::string scheduleName, long testLength_min); + bool readSchedule(Schedule &schedule, std::string scheduleName, long testLength_min); struct TestDesc{ std::string presetOrFile; From 5c661016d4f06ca62bdebdf1c429195956fdf3b8 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 26 Dec 2023 12:00:30 -0700 Subject: [PATCH 21/25] Clang format. --- src/HPWH.cc | 9834 +++++++++++++++++++-------------- src/HPWH.hh | 2866 +++++----- src/HPWHHeatSources.cc | 2009 ++++--- src/HPWHHeatingLogics.cc | 447 +- src/HPWHpresets.cc | 8430 +++++++++++++++------------- src/HPWHversion.cc | 15 +- src/HPWHversion.in.hh | 4 +- test/main.cc | 227 +- test/testCalcUEF.cc | 181 +- test/testCompressorFcts.cc | 178 +- test/testEnergyBalance.cc | 113 +- test/testHeatingLogics.cc | 536 +- test/testMaxSetpoint.cc | 451 +- test/testPerformanceMaps.cc | 1051 ++-- test/testResistanceFcts.cc | 414 +- test/testScaleHPWH.cc | 935 ++-- test/testSizingFractions.cc | 213 +- test/testStateOfChargeFcts.cc | 113 +- test/testTankSizeFixed.cc | 201 +- test/testUtilityFcts.cc | 689 ++- 20 files changed, 16000 insertions(+), 12907 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 50c385a9..6c454629 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -47,8 +47,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -using std::endl; using std::cout; +using std::endl; using std::string; const float HPWH::DENSITYWATER_kgperL = 0.995f; @@ -65,42 +65,47 @@ const double HPWH::MINSINGLEPASSLIFT = dF_TO_dC(15.); //----------------------------------------------------------------------------- /// @brief Samples a std::vector to extract a single value spanning the fractional -/// coordinate range from frac_begin to frac_end. +/// coordinate range from frac_begin to frac_end. /// @note Bounding fractions are clipped or swapped, if needed. /// @param[in] sampleValues Contains values to be sampled /// @param[in] beginFraction Lower (left) bounding fraction (0 to 1) -/// @param[in] endFraction Upper (right) bounding fraction (0 to 1) +/// @param[in] endFraction Upper (right) bounding fraction (0 to 1) /// @return Resampled value; 0 if undefined. //----------------------------------------------------------------------------- -double getResampledValue(const std::vector &sampleValues,double beginFraction,double endFraction) -{ - if(beginFraction > endFraction)std::swap(beginFraction,endFraction); - if(beginFraction < 0.) beginFraction = 0.; - if(endFraction >1.) endFraction = 1.; - - double nNodes = static_cast(sampleValues.size()); - auto beginIndex = static_cast(beginFraction * nNodes); - - double previousFraction = beginFraction; - double nextFraction = previousFraction; - - double totValueWeight = 0.; - double totWeight = 0.; - for(std::size_t index = beginIndex; nextFraction < endFraction; ++index) - { - nextFraction = static_cast(index + 1) / nNodes; - if(nextFraction > endFraction) - { - nextFraction = endFraction; - } - double weight = nextFraction - previousFraction; - totValueWeight += weight *sampleValues[index]; - totWeight += weight; - previousFraction = nextFraction; - } - double resampled_value = 0.; - if(totWeight > 0.) resampled_value = totValueWeight / totWeight; - return resampled_value; +double +getResampledValue(const std::vector& sampleValues, double beginFraction, double endFraction) +{ + if (beginFraction > endFraction) + std::swap(beginFraction, endFraction); + if (beginFraction < 0.) + beginFraction = 0.; + if (endFraction > 1.) + endFraction = 1.; + + double nNodes = static_cast(sampleValues.size()); + auto beginIndex = static_cast(beginFraction * nNodes); + + double previousFraction = beginFraction; + double nextFraction = previousFraction; + + double totValueWeight = 0.; + double totWeight = 0.; + for (std::size_t index = beginIndex; nextFraction < endFraction; ++index) + { + nextFraction = static_cast(index + 1) / nNodes; + if (nextFraction > endFraction) + { + nextFraction = endFraction; + } + double weight = nextFraction - previousFraction; + totValueWeight += weight * sampleValues[index]; + totWeight += weight; + previousFraction = nextFraction; + } + double resampled_value = 0.; + if (totWeight > 0.) + resampled_value = totValueWeight / totWeight; + return resampled_value; } //----------------------------------------------------------------------------- @@ -110,30 +115,34 @@ double getResampledValue(const std::vector &sampleValues,double beginFra /// @param[in] sampleValues Contains values to replace with /// @return Success: true; Failure: false //----------------------------------------------------------------------------- -bool resample(std::vector &values,const std::vector &sampleValues) +bool resample(std::vector& values, const std::vector& sampleValues) { - if(sampleValues.empty()) return false; + if (sampleValues.empty()) + return false; double actualSize = static_cast(values.size()); double sizeRatio = static_cast(sampleValues.size()) / actualSize; auto binSize = static_cast(1. / sizeRatio); double beginFraction = 0., endFraction; std::size_t index = 0; - while(index < actualSize) + while (index < actualSize) { auto value = static_cast(index); auto sampleIndex = static_cast(floor(value * sizeRatio)); - if(sampleIndex + 1. < (value + 1.) * sizeRatio) { // General case: no binning possible + if (sampleIndex + 1. < (value + 1.) * sizeRatio) + { // General case: no binning possible endFraction = static_cast(index + 1) / actualSize; - values[index] = getResampledValue(sampleValues,beginFraction,endFraction); + values[index] = getResampledValue(sampleValues, beginFraction, endFraction); ++index; } - else { // Special case: direct copy a single value to a bin + else + { // Special case: direct copy a single value to a bin std::size_t beginIndex = index; std::size_t adjustedBinSize = binSize; - if(binSize > 1) + if (binSize > 1) { // Find beginning of bin and number to copy - beginIndex = static_cast(ceil(sampleIndex/sizeRatio)); - adjustedBinSize = static_cast(floor((sampleIndex + 1)/sizeRatio) - ceil(sampleIndex/sizeRatio)); + beginIndex = static_cast(ceil(sampleIndex / sizeRatio)); + adjustedBinSize = static_cast(floor((sampleIndex + 1) / sizeRatio) - + ceil(sampleIndex / sizeRatio)); } std::fill_n(values.begin() + beginIndex, adjustedBinSize, sampleValues[sampleIndex]); index = beginIndex + adjustedBinSize; @@ -148,4348 +157,5771 @@ bool resample(std::vector &values,const std::vector &sampleValue /// @brief Resample an extensive property (e.g., heat) /// @note See definition of int resample. //----------------------------------------------------------------------------- -bool resampleExtensive(std::vector &values,const std::vector &sampleValues) -{ - if(resample(values,sampleValues)) - { - double scale = static_cast(sampleValues.size()) / static_cast(values.size()); - for(auto &value: values) - value *= scale; - return true; - } - return false; -} - -double expitFunc(double x,double offset) { - double val; - val = 1 / (1 + exp(x - offset)); - return val; -} - -void normalize(std::vector &distribution) { - size_t N = distribution.size(); - - bool normalization_needed = true; - - // Need to renormalize if negligible elements are zeroed. - while (normalization_needed) - { - normalization_needed = false; - double sum_tmp = 0.; - for(size_t i = 0; i < N; i++) { - sum_tmp += distribution[i]; - } - if(sum_tmp > 0.) { - for(size_t i = 0; i < N; i++) { - distribution[i] /= sum_tmp; - //this gives a very slight speed improvement (milliseconds per simulated year) - if(distribution[i] < HPWH::TOL_MINVALUE) { - if (distribution[i] > 0.) { - normalization_needed = true; - } - distribution[i] = 0.; - } - } - } - else { - for(size_t i = 0; i < N; i++) { - distribution[i] = 0.; - } - } - } +bool resampleExtensive(std::vector& values, const std::vector& sampleValues) +{ + if (resample(values, sampleValues)) + { + double scale = + static_cast(sampleValues.size()) / static_cast(values.size()); + for (auto& value : values) + value *= scale; + return true; + } + return false; +} + +double expitFunc(double x, double offset) +{ + double val; + val = 1 / (1 + exp(x - offset)); + return val; +} + +void normalize(std::vector& distribution) +{ + size_t N = distribution.size(); + + bool normalization_needed = true; + + // Need to renormalize if negligible elements are zeroed. + while (normalization_needed) + { + normalization_needed = false; + double sum_tmp = 0.; + for (size_t i = 0; i < N; i++) + { + sum_tmp += distribution[i]; + } + if (sum_tmp > 0.) + { + for (size_t i = 0; i < N; i++) + { + distribution[i] /= sum_tmp; + // this gives a very slight speed improvement (milliseconds per simulated year) + if (distribution[i] < HPWH::TOL_MINVALUE) + { + if (distribution[i] > 0.) + { + normalization_needed = true; + } + distribution[i] = 0.; + } + } + } + else + { + for (size_t i = 0; i < N; i++) + { + distribution[i] = 0.; + } + } + } } //----------------------------------------------------------------------------- -/// @brief Finds the lowest tank node with non-zero weighting +/// @brief Finds the lowest tank node with non-zero weighting /// @param[in] nodeDist weighting to be applied /// @param[in] numTankNodes number of nodes in tank /// @returns index of lowest tank node //----------------------------------------------------------------------------- -int findLowestNode(const std::vector &nodeDist,const int numTankNodes){ - int lowest = 0; - const int distSize = static_cast(nodeDist.size()); - double nodeRatio = static_cast(numTankNodes) / distSize; +int findLowestNode(const std::vector& nodeDist, const int numTankNodes) +{ + int lowest = 0; + const int distSize = static_cast(nodeDist.size()); + double nodeRatio = static_cast(numTankNodes) / distSize; - for(auto j = 0; j < distSize; ++j) { - if(nodeDist[j] > 0.) { - lowest = static_cast(nodeRatio * j); - break; - } - } + for (auto j = 0; j < distSize; ++j) + { + if (nodeDist[j] > 0.) + { + lowest = static_cast(nodeRatio * j); + break; + } + } - return lowest; + return lowest; } //----------------------------------------------------------------------------- -/// @brief Calculates a width parameter for a thermal distribution +/// @brief Calculates a width parameter for a thermal distribution /// @param[in] nodeDist original distribution from which theraml distribution /// is derived -/// @returns width parameter (in degC) +/// @returns width parameter (in degC) //----------------------------------------------------------------------------- -double findShrinkageT_C(const std::vector &nodeDist){ - double alphaT_C = 1.,betaT_C = 2.; - double condentropy = 0.; - for(std::size_t iNode = 0; iNode < nodeDist.size(); ++iNode) { - double dist = nodeDist[iNode]; - if(dist > 0.) { - condentropy -= dist * log(dist); - } - } - // condentropy shifts as ln(# of condensity nodes) - double size_factor = static_cast(nodeDist.size()) / HPWH::CONDENSITY_SIZE; - double standard_condentropy = condentropy - log(size_factor); - - return alphaT_C + standard_condentropy * betaT_C; +double findShrinkageT_C(const std::vector& nodeDist) +{ + double alphaT_C = 1., betaT_C = 2.; + double condentropy = 0.; + for (std::size_t iNode = 0; iNode < nodeDist.size(); ++iNode) + { + double dist = nodeDist[iNode]; + if (dist > 0.) + { + condentropy -= dist * log(dist); + } + } + // condentropy shifts as ln(# of condensity nodes) + double size_factor = static_cast(nodeDist.size()) / HPWH::CONDENSITY_SIZE; + double standard_condentropy = condentropy - log(size_factor); + + return alphaT_C + standard_condentropy * betaT_C; } //----------------------------------------------------------------------------- -/// @brief Calculates a thermal distribution for heat distribution. +/// @brief Calculates a thermal distribution for heat distribution. /// @note Fails if all nodeTemp_C values exceed setpointT_C /// @param[out] thermalDist resulting thermal distribution; does not require pre-allocation /// @param[in] shrinkageT_C width of distribution /// @param[in] lowestNode index of lowest non-zero contribution /// @param[in] nodeTemp_C node temperatures -/// @param[in] setpointT_C distribution parameter +/// @param[in] setpointT_C distribution parameter //----------------------------------------------------------------------------- -void calcThermalDist( - std::vector &thermalDist, - const double shrinkageT_C, - const int lowestNode, - const std::vector &nodeT_C, - const double setpointT_C) { - - thermalDist.resize(nodeT_C.size()); - - // Populate the vector of heat distribution - double totDist = 0.; - for(int i = 0; i < static_cast(nodeT_C.size()); i++) { - double dist = 0.; - if(i >= lowestNode){ - double Toffset_C = 5.0 / 1.8; // 5 degF - double offset = Toffset_C / 1.; // should be dimensionless - dist = expitFunc((nodeT_C[i] - nodeT_C[lowestNode]) / shrinkageT_C,offset); - dist *= (setpointT_C - nodeT_C[i]); - if(dist < 0.) - dist = 0.; - } - thermalDist[i] = dist; - totDist += dist; - } - - if(totDist > 0.) { - normalize(thermalDist); - } - else { - thermalDist.assign(thermalDist.size(), 1./static_cast(thermalDist.size())); - } +void calcThermalDist(std::vector& thermalDist, + const double shrinkageT_C, + const int lowestNode, + const std::vector& nodeT_C, + const double setpointT_C) +{ + + thermalDist.resize(nodeT_C.size()); + + // Populate the vector of heat distribution + double totDist = 0.; + for (int i = 0; i < static_cast(nodeT_C.size()); i++) + { + double dist = 0.; + if (i >= lowestNode) + { + double Toffset_C = 5.0 / 1.8; // 5 degF + double offset = Toffset_C / 1.; // should be dimensionless + dist = expitFunc((nodeT_C[i] - nodeT_C[lowestNode]) / shrinkageT_C, offset); + dist *= (setpointT_C - nodeT_C[i]); + if (dist < 0.) + dist = 0.; + } + thermalDist[i] = dist; + totDist += dist; + } + if (totDist > 0.) + { + normalize(thermalDist); + } + else + { + thermalDist.assign(thermalDist.size(), 1. / static_cast(thermalDist.size())); + } } void HPWH::setMinutesPerStep(const double minutesPerStep_in) { - minutesPerStep = minutesPerStep_in; - secondsPerStep = sec_per_min * minutesPerStep; - hoursPerStep = minutesPerStep / min_per_hr; + minutesPerStep = minutesPerStep_in; + secondsPerStep = sec_per_min * minutesPerStep; + hoursPerStep = minutesPerStep / min_per_hr; }; // public HPWH functions -HPWH::HPWH(): messageCallback(NULL),messageCallbackContextPtr(NULL),hpwhVerbosity(VRB_silent) +HPWH::HPWH() : messageCallback(NULL), messageCallbackContextPtr(NULL), hpwhVerbosity(VRB_silent) { - setAllDefaults(); + setAllDefaults(); }; -void HPWH::setAllDefaults() { - tankTemps_C.clear(); - nextTankTemps_C.clear(); - heatSources.clear(); - - simHasFailed = true; isHeating = false; setpointFixed = false; tankSizeFixed = true; canScale = false; - member_inletT_C = HPWH_ABORT; - currentSoCFraction = 1.; - doTempDepression = false; - locationTemperature_C = UNINITIALIZED_LOCATIONTEMP; - mixBelowFractionOnDraw = 1. / 3.; - doInversionMixing = true; doConduction = true; - inletHeight = 0; inlet2Height = 0; fittingsUA_kJperHrC = 0.; - prevDRstatus = DR_ALLOW; timerLimitTOT = 60.; timerTOT = 0.; - usesSoCLogic = false; - setMinutesPerStep(1.0); - hasHeatExchanger = false; - heatExchangerEffectiveness = 0.9; -} - -HPWH::HPWH(const HPWH &hpwh) { - *this = hpwh; -} - -HPWH & HPWH::operator=(const HPWH &hpwh) { - if(this == &hpwh) { - return *this; - } +void HPWH::setAllDefaults() +{ + tankTemps_C.clear(); + nextTankTemps_C.clear(); + heatSources.clear(); + + simHasFailed = true; + isHeating = false; + setpointFixed = false; + tankSizeFixed = true; + canScale = false; + member_inletT_C = HPWH_ABORT; + currentSoCFraction = 1.; + doTempDepression = false; + locationTemperature_C = UNINITIALIZED_LOCATIONTEMP; + mixBelowFractionOnDraw = 1. / 3.; + doInversionMixing = true; + doConduction = true; + inletHeight = 0; + inlet2Height = 0; + fittingsUA_kJperHrC = 0.; + prevDRstatus = DR_ALLOW; + timerLimitTOT = 60.; + timerTOT = 0.; + usesSoCLogic = false; + setMinutesPerStep(1.0); + hasHeatExchanger = false; + heatExchangerEffectiveness = 0.9; +} + +HPWH::HPWH(const HPWH& hpwh) { *this = hpwh; } + +HPWH& HPWH::operator=(const HPWH& hpwh) +{ + if (this == &hpwh) + { + return *this; + } - simHasFailed = hpwh.simHasFailed; + simHasFailed = hpwh.simHasFailed; - hpwhVerbosity = hpwh.hpwhVerbosity; + hpwhVerbosity = hpwh.hpwhVerbosity; - //these should actually be the same pointers - messageCallback = hpwh.messageCallback; - messageCallbackContextPtr = hpwh.messageCallbackContextPtr; + // these should actually be the same pointers + messageCallback = hpwh.messageCallback; + messageCallbackContextPtr = hpwh.messageCallbackContextPtr; - isHeating = hpwh.isHeating; + isHeating = hpwh.isHeating; - heatSources = hpwh.heatSources; - for(auto &heatSource: heatSources) { - heatSource.hpwh = this; - //HeatSource assignment will fail (causing the simulation to fail) if a - //HeatSource has backups/companions. - //This could be dealt with in this function (tricky), but the HeatSource - //assignment can't know where its backup/companion pointer goes so it either - //fails or silently does something that's not at all useful. - //I prefer it to fail. -NDK 1/2016 - } + heatSources = hpwh.heatSources; + for (auto& heatSource : heatSources) + { + heatSource.hpwh = this; + // HeatSource assignment will fail (causing the simulation to fail) if a + // HeatSource has backups/companions. + // This could be dealt with in this function (tricky), but the HeatSource + // assignment can't know where its backup/companion pointer goes so it either + // fails or silently does something that's not at all useful. + // I prefer it to fail. -NDK 1/2016 + } - tankVolume_L = hpwh.tankVolume_L; - tankUA_kJperHrC = hpwh.tankUA_kJperHrC; - fittingsUA_kJperHrC = hpwh.fittingsUA_kJperHrC; + tankVolume_L = hpwh.tankVolume_L; + tankUA_kJperHrC = hpwh.tankUA_kJperHrC; + fittingsUA_kJperHrC = hpwh.fittingsUA_kJperHrC; - setpoint_C = hpwh.setpoint_C; + setpoint_C = hpwh.setpoint_C; - tankTemps_C = hpwh.tankTemps_C; - nextTankTemps_C = hpwh.nextTankTemps_C; + tankTemps_C = hpwh.tankTemps_C; + nextTankTemps_C = hpwh.nextTankTemps_C; - inletHeight = hpwh.inletHeight; - inlet2Height = hpwh.inlet2Height; + inletHeight = hpwh.inletHeight; + inlet2Height = hpwh.inlet2Height; - outletTemp_C = hpwh.outletTemp_C; - condenserInlet_C = hpwh.condenserInlet_C; - condenserOutlet_C = hpwh.condenserOutlet_C; - externalVolumeHeated_L = hpwh.externalVolumeHeated_L; - energyRemovedFromEnvironment_kWh = hpwh.energyRemovedFromEnvironment_kWh; - standbyLosses_kWh = hpwh.standbyLosses_kWh; + outletTemp_C = hpwh.outletTemp_C; + condenserInlet_C = hpwh.condenserInlet_C; + condenserOutlet_C = hpwh.condenserOutlet_C; + externalVolumeHeated_L = hpwh.externalVolumeHeated_L; + energyRemovedFromEnvironment_kWh = hpwh.energyRemovedFromEnvironment_kWh; + standbyLosses_kWh = hpwh.standbyLosses_kWh; - tankMixesOnDraw = hpwh.tankMixesOnDraw; - mixBelowFractionOnDraw = hpwh.mixBelowFractionOnDraw; + tankMixesOnDraw = hpwh.tankMixesOnDraw; + mixBelowFractionOnDraw = hpwh.mixBelowFractionOnDraw; - doTempDepression = hpwh.doTempDepression; + doTempDepression = hpwh.doTempDepression; - doInversionMixing = hpwh.doInversionMixing; - doConduction = hpwh.doConduction; + doInversionMixing = hpwh.doInversionMixing; + doConduction = hpwh.doConduction; - locationTemperature_C = hpwh.locationTemperature_C; + locationTemperature_C = hpwh.locationTemperature_C; - prevDRstatus = hpwh.prevDRstatus; - timerLimitTOT = hpwh.timerLimitTOT; + prevDRstatus = hpwh.prevDRstatus; + timerLimitTOT = hpwh.timerLimitTOT; - usesSoCLogic = hpwh.usesSoCLogic; + usesSoCLogic = hpwh.usesSoCLogic; - nodeVolume_L = hpwh.nodeVolume_L; - nodeHeight_m = hpwh.nodeHeight_m; - fracAreaTop = hpwh.fracAreaTop; - fracAreaSide = hpwh.fracAreaSide; - return *this; + nodeVolume_L = hpwh.nodeVolume_L; + nodeHeight_m = hpwh.nodeHeight_m; + fracAreaTop = hpwh.fracAreaTop; + fracAreaSide = hpwh.fracAreaSide; + return *this; } -HPWH::~HPWH() { -} +HPWH::~HPWH() {} int HPWH::runOneStep(double drawVolume_L, - double tankAmbientT_C,double heatSourceAmbientT_C, - DRMODES DRstatus, - double inletVol2_L,double inletT2_C, - std::vector* extraHeatDist_W) { - //returns 0 on successful completion, HPWH_ABORT on failure - - //check for errors - if(doTempDepression == true && minutesPerStep != 1) { - msg("minutesPerStep must equal one for temperature depression to work. \n"); - simHasFailed = true; - return HPWH_ABORT; - } - - if((DRstatus & (DR_TOO | DR_TOT))) { - if(hpwhVerbosity >= VRB_typical) { - msg("DR_TOO | DR_TOT use conflicting logic sets. The logic will follow a DR_TOT scheme \n"); - } - } - - if(hpwhVerbosity >= VRB_typical) { - msg("Beginning runOneStep. \nTank Temps: "); - printTankTemps(); - msg("Step Inputs: InletT_C: %.2lf, drawVolume_L: %.2lf, tankAmbientT_C: %.2lf, heatSourceAmbientT_C: %.2lf, DRstatus: %d, minutesPerStep: %.2lf \n", - member_inletT_C,drawVolume_L,tankAmbientT_C,heatSourceAmbientT_C,DRstatus,minutesPerStep); - } - //is the failure flag is set, don't run - if(simHasFailed) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("simHasFailed is set, aborting. \n"); - } - return HPWH_ABORT; - } - - //reset the output variables - outletTemp_C = 0.; - condenserInlet_C = 0.; - condenserOutlet_C = 0.; - externalVolumeHeated_L = 0.; - energyRemovedFromEnvironment_kWh = 0.; - standbyLosses_kWh = 0.; - - for(int i = 0; i < getNumHeatSources(); i++) { - heatSources[i].runtime_min = 0; - heatSources[i].energyInput_kWh = 0.; - heatSources[i].energyOutput_kWh = 0.; - } - extraEnergyInput_kWh = 0.; - - // if you are doing temp. depression, set tank and heatSource ambient temps - // to the tracked locationTemperature - double temperatureGoal = tankAmbientT_C; - if(doTempDepression) { - if(locationTemperature_C == UNINITIALIZED_LOCATIONTEMP) { - locationTemperature_C = tankAmbientT_C; - } - tankAmbientT_C = locationTemperature_C; - heatSourceAmbientT_C = locationTemperature_C; - } - - //process draws and standby losses - updateTankTemps(drawVolume_L,member_inletT_C,tankAmbientT_C,inletVol2_L,inletT2_C); - - updateSoCIfNecessary(); - - // First Logic DR checks ////////////////////////////////////////////////////////////////// - - // If the DR signal includes a top off but the previous signal did not, then top it off! - if((DRstatus & DR_LOC) != 0 && (DRstatus & DR_LOR) != 0) { - turnAllHeatSourcesOff(); // turns off isheating - if(hpwhVerbosity >= VRB_emetic) { - msg("DR_LOC | DR_LOC everything off, DRstatus = %i \n",DRstatus); - } - } else { //do normal check - if(((DRstatus & DR_TOO) != 0 || (DRstatus & DR_TOT) != 0) && timerTOT == 0) { - - // turn on the compressor and last resistance element. - if(hasACompressor()) { - heatSources[compressorIndex].engageHeatSource(DRstatus); - } - if(lowestElementIndex >= 0) { - heatSources[lowestElementIndex].engageHeatSource(DRstatus); - } - - if(hpwhVerbosity >= VRB_emetic) { - msg("TURNED ON DR_TOO engaged compressor and lowest resistance element, DRstatus = %i \n",DRstatus); - } - } - - //do HeatSource choice - for(int i = 0; i < getNumHeatSources(); i++) { - if(hpwhVerbosity >= VRB_emetic) { - msg("Heat source choice:\theatsource %d can choose from %lu turn on logics and %lu shut off logics\n",i,heatSources[i].turnOnLogicSet.size(),heatSources[i].shutOffLogicSet.size()); - } - if(isHeating == true) { - //check if anything that is on needs to turn off (generally for lowT cutoffs) - //things that just turn on later this step are checked for this in shouldHeat - if(heatSources[i].isEngaged() && heatSources[i].shutsOff()) { - heatSources[i].disengageHeatSource(); - //check if the backup heat source would have to shut off too - if(heatSources[i].backupHeatSource != NULL && heatSources[i].backupHeatSource->shutsOff() != true) { - //and if not, go ahead and turn it on - heatSources[i].backupHeatSource->engageHeatSource(DRstatus); - } - } - - //if there's a priority HeatSource (e.g. upper resistor) and it needs to - //come on, then turn off and start it up - if(heatSources[i].isVIP) { - if(hpwhVerbosity >= VRB_emetic) { - msg("\tVIP check"); - } - if(heatSources[i].shouldHeat()) { - if(shouldDRLockOut(heatSources[i].typeOfHeatSource,DRstatus)) { - if(hasACompressor()) { - heatSources[compressorIndex].engageHeatSource(DRstatus); - break; - } - } else { - turnAllHeatSourcesOff(); - heatSources[i].engageHeatSource(DRstatus); - //stop looking if the VIP needs to run - break; - } - } - } - } - //if nothing is currently on, then check if something should come on - else /* (isHeating == false) */ { - if(heatSources[i].shouldHeat()) { - heatSources[i].engageHeatSource(DRstatus); - //engaging a heat source sets isHeating to true, so this will only trigger once - } - } - - } //end loop over heat sources - - if(hpwhVerbosity >= VRB_emetic) { - msg("after heat source choosing: "); - for(int i = 0; i < getNumHeatSources(); i++) { - msg("heat source %d: %d \t",i,heatSources[i].isEngaged()); - } - msg("\n"); - } - - //do heating logic - double minutesToRun = minutesPerStep; - for(int i = 0; i < getNumHeatSources(); i++) { - // check/apply lock-outs - if(hpwhVerbosity >= VRB_emetic) { - msg("Checking lock-out logic for heat source %d:\n",i); - } - if(shouldDRLockOut(heatSources[i].typeOfHeatSource,DRstatus)) { - heatSources[i].lockOutHeatSource(); - if(hpwhVerbosity >= VRB_emetic) { - msg("Locked out heat source, DRstatus = %i\n",DRstatus); - } - } else - { - // locks or unlocks the heat source - heatSources[i].toLockOrUnlock(heatSourceAmbientT_C); - } - if(heatSources[i].isLockedOut() && heatSources[i].backupHeatSource == NULL) { - heatSources[i].disengageHeatSource(); - if(hpwhVerbosity >= HPWH::VRB_emetic) { - msg("\nWARNING: lock-out triggered, but no backupHeatSource defined. Simulation will continue will lock out the heat source."); - } - } - - //going through in order, check if the heat source is on - if(heatSources[i].isEngaged()) { - - HeatSource* heatSourcePtr; - if(heatSources[i].isLockedOut() && heatSources[i].backupHeatSource != NULL) { - - // Check that the backup isn't locked out too or already engaged then it will heat on its own. - if(heatSources[i].backupHeatSource->toLockOrUnlock(heatSourceAmbientT_C) || - shouldDRLockOut(heatSources[i].backupHeatSource->typeOfHeatSource,DRstatus) || //){ - heatSources[i].backupHeatSource->isEngaged()) { - continue; - } - // Don't turn the backup electric resistance heat source on if the VIP resistance element is on . - else if(VIPIndex >= 0 && heatSources[VIPIndex].isOn && - heatSources[i].backupHeatSource->isAResistance()) { - if(hpwhVerbosity >= VRB_typical) { - msg("Locked out back up heat source AND the engaged heat source %i, DRstatus = %i\n",i,DRstatus); - } - continue; - } else { - heatSourcePtr = heatSources[i].backupHeatSource; - } - } else { - heatSourcePtr = &heatSources[i]; - } - - addHeatParent(heatSourcePtr,heatSourceAmbientT_C,minutesToRun); - - //if it finished early. i.e. shuts off early like if the heatsource met setpoint or maxed out - if(heatSourcePtr->runtime_min < minutesToRun) { - //debugging message handling - if(hpwhVerbosity >= VRB_emetic) { - msg("done heating! runtime_min minutesToRun %.2lf %.2lf\n",heatSourcePtr->runtime_min,minutesToRun); - } - - //subtract time it ran and turn it off - minutesToRun -= heatSourcePtr->runtime_min; - heatSources[i].disengageHeatSource(); - //and if there's a heat source that follows this heat source (regardless of lockout) that's able to come on, - if(heatSources[i].followedByHeatSource != NULL && heatSources[i].followedByHeatSource->shutsOff() == false) { - //turn it on - heatSources[i].followedByHeatSource->engageHeatSource(DRstatus); - } - // or if there heat source can't produce hotter water (i.e. it's maxed out) and the tank still isn't at setpoint. - // the compressor should get locked out when the maxedOut is true but have to run the resistance first during this - // timestep to make sure tank is above the max temperature for the compressor. - else if(heatSources[i].maxedOut() && heatSources[i].backupHeatSource != NULL) { - - // Check that the backup isn't locked out or already engaged then it will heat or already heated on it's own. - if(!heatSources[i].backupHeatSource->toLockOrUnlock(heatSourceAmbientT_C) && //If not locked out - !shouldDRLockOut(heatSources[i].backupHeatSource->typeOfHeatSource,DRstatus) && // and not DR locked out - !heatSources[i].backupHeatSource->isEngaged()) { // and not already engaged - - HeatSource* backupHeatSourcePtr = heatSources[i].backupHeatSource; - // turn it on - backupHeatSourcePtr->engageHeatSource(DRstatus); - // add heat if it hasn't heated up this whole minute already - if(backupHeatSourcePtr->runtime_min >= 0.) { - addHeatParent(backupHeatSourcePtr,heatSourceAmbientT_C,minutesToRun - backupHeatSourcePtr->runtime_min); - } - } - } - } - } // heat source not engaged - } // end while iHS heat source - } - if(areAllHeatSourcesOff() == true) { - isHeating = false; - } - //If there's extra user defined heat to add -> Add extra heat! - if(extraHeatDist_W != NULL && (*extraHeatDist_W).size() != 0) { - addExtraHeat(*extraHeatDist_W); - updateSoCIfNecessary(); - } - - //track the depressed local temperature - if(doTempDepression) { - bool compressorRan = false; - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isEngaged() && !heatSources[i].isLockedOut() && heatSources[i].depressesTemperature) { - compressorRan = true; - } - } - - if(compressorRan) { - temperatureGoal -= maxDepression_C; //hardcoded 4.5 degree total drop - from experimental data. Changed to an input - } else { - //otherwise, do nothing, we're going back to ambient - } - - // shrink the gap by the same percentage every minute - that gives us - // exponential behavior the percentage was determined by a fit to - // experimental data - 9.4 minute half life and 4.5 degree total drop - //minus-equals is important, and fits with the order of locationTemperature - //and temperatureGoal, so as to not use fabs() and conditional tests - locationTemperature_C -= (locationTemperature_C - temperatureGoal)*(1 - 0.9289); - } - - //settle outputs - - //outletTemp_C and standbyLosses_kWh are taken care of in updateTankTemps - - //sum energyRemovedFromEnvironment_kWh for each heat source; - for(int i = 0; i < getNumHeatSources(); i++) { - energyRemovedFromEnvironment_kWh += (heatSources[i].energyOutput_kWh - heatSources[i].energyInput_kWh); - } - - //cursory check for inverted temperature profile - if(tankTemps_C[getNumNodes() - 1] < tankTemps_C[0]) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The top of the tank is cooler than the bottom. \n"); - } - } - - // Handle DR timer - prevDRstatus = DRstatus; - // DR check for TOT to increase timer. - timerTOT += minutesPerStep; - // Restart the time if we're over the limit or the command is not a top off. - if((DRstatus & DR_TOT) != 0 && timerTOT >= timerLimitTOT) { - resetTopOffTimer(); - } else if((DRstatus & DR_TOO) == 0 && (DRstatus & DR_TOT) == 0) { - resetTopOffTimer(); - } - - if(simHasFailed) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The simulation has encountered an error. \n"); - } - return HPWH_ABORT; - } - - if(hpwhVerbosity >= VRB_typical) { - msg("Ending runOneStep. \n\n\n\n"); - } - - return 0; //successful completion of the step returns 0 -} //end runOneStep - - -int HPWH::runNSteps(int N,double *inletT_C,double *drawVolume_L, - double *tankAmbientT_C,double *heatSourceAmbientT_C, - DRMODES *DRstatus) { - //returns 0 on successful completion, HPWH_ABORT on failure - - //these are all the accumulating variables we'll need - double energyRemovedFromEnvironment_kWh_SUM = 0; - double standbyLosses_kWh_SUM = 0; - double outletTemp_C_AVG = 0; - double totalDrawVolume_L = 0; - std::vector heatSources_runTimes_SUM(getNumHeatSources()); - std::vector heatSources_energyInputs_SUM(getNumHeatSources()); - std::vector heatSources_energyOutputs_SUM(getNumHeatSources()); - - if(hpwhVerbosity >= VRB_typical) { - msg("Begin runNSteps. \n"); - } - //run the sim one step at a time, accumulating the outputs as you go - for(int i = 0; i < N; i++) { - runOneStep(inletT_C[i],drawVolume_L[i],tankAmbientT_C[i],heatSourceAmbientT_C[i], - DRstatus[i]); - - if(simHasFailed) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("RunNSteps has encountered an error on step %d of N and has ceased running. \n",i + 1); - } - return HPWH_ABORT; - } - - energyRemovedFromEnvironment_kWh_SUM += energyRemovedFromEnvironment_kWh; - standbyLosses_kWh_SUM += standbyLosses_kWh; - - outletTemp_C_AVG += outletTemp_C * drawVolume_L[i]; - totalDrawVolume_L += drawVolume_L[i]; - - for(int j = 0; j < getNumHeatSources(); j++) { - heatSources_runTimes_SUM[j] += getNthHeatSourceRunTime(j); - heatSources_energyInputs_SUM[j] += getNthHeatSourceEnergyInput(j); - heatSources_energyOutputs_SUM[j] += getNthHeatSourceEnergyOutput(j); - } - - //print minutely output - if(hpwhVerbosity == VRB_minuteOut) { - msg("%f,%f,%f,",tankAmbientT_C[i],drawVolume_L[i],inletT_C[i]); - for(int j = 0; j < getNumHeatSources(); j++) { - msg("%f,%f,",getNthHeatSourceEnergyInput(j),getNthHeatSourceEnergyOutput(j)); - } - - std::vector displayTemps_C(10); - resampleIntensive(displayTemps_C, tankTemps_C); - bool first = true; - for (auto &displayTemp: displayTemps_C) - { - if (first) - first = false; - else - msg(","); - - msg("%f",displayTemp); - } - - for (int k = 1; k < 7; ++k) - { - if (first) - first = false; - else - msg(","); - - msg("%f", getNthSimTcouple(k,6)); - } - - msg("\n"); - } - - } - //finish weighted avg. of outlet temp by dividing by the total drawn volume - outletTemp_C_AVG /= totalDrawVolume_L; - - //now, reassign all of the accumulated values to their original spots - energyRemovedFromEnvironment_kWh = energyRemovedFromEnvironment_kWh_SUM; - standbyLosses_kWh = standbyLosses_kWh_SUM; - outletTemp_C = outletTemp_C_AVG; - - for(int i = 0; i < getNumHeatSources(); i++) { - heatSources[i].runtime_min = heatSources_runTimes_SUM[i]; - heatSources[i].energyInput_kWh = heatSources_energyInputs_SUM[i]; - heatSources[i].energyOutput_kWh = heatSources_energyOutputs_SUM[i]; - } - - if(hpwhVerbosity >= VRB_typical) { - msg("Ending runNSteps. \n\n\n\n"); - } - return 0; -} - -void HPWH::addHeatParent(HeatSource *heatSourcePtr,double heatSourceAmbientT_C,double minutesToRun) { - - double tempSetpoint_C = -273.15; - - // Check the air temprature and setpoint against maxOut_at_LowT - if(heatSourcePtr->isACompressor()) { - if(heatSourceAmbientT_C <= heatSourcePtr->maxOut_at_LowT.airT_C && - setpoint_C >= heatSourcePtr->maxOut_at_LowT.outT_C) - { - tempSetpoint_C = setpoint_C; //Store setpoint - setSetpoint(heatSourcePtr->maxOut_at_LowT.outT_C); // Reset to new setpoint as this is used in the add heat calc - } - } - //and add heat if it is - heatSourcePtr->addHeat(heatSourceAmbientT_C,minutesToRun); - - //Change the setpoint back to what it was pre-compressor depression - if(tempSetpoint_C > -273.15) { - setSetpoint(tempSetpoint_C); - } -} - - -void HPWH::setVerbosity(VERBOSITY hpwhVrb) { - hpwhVerbosity = hpwhVrb; -} -void HPWH::setMessageCallback(void(*callbackFunc)(const string message,void* contextPtr),void* contextPtr) { - messageCallback = callbackFunc; - messageCallbackContextPtr = contextPtr; -} -void HPWH::sayMessage(const string message) const { - if(messageCallback != NULL) { - (*messageCallback)(message,messageCallbackContextPtr); - } else { - std::cout << message; - } -} -void HPWH::msg(const char* fmt,...) const { - va_list ap; va_start(ap,fmt); - msgV(fmt,ap); -} -void HPWH::msgV(const char* fmt,va_list ap /*=NULL*/) const { - char outputString[MAXOUTSTRING]; - - const char* p; - if(ap) { -#if defined( _MSC_VER) - vsprintf_s< MAXOUTSTRING>(outputString,fmt,ap); -#else - vsnprintf(outputString,MAXOUTSTRING,fmt,ap); -#endif - p = outputString; - } else { - p = fmt; - } - sayMessage(p); -} // HPWH::msgV + double tankAmbientT_C, + double heatSourceAmbientT_C, + DRMODES DRstatus, + double inletVol2_L, + double inletT2_C, + std::vector* extraHeatDist_W) +{ + // returns 0 on successful completion, HPWH_ABORT on failure + // check for errors + if (doTempDepression == true && minutesPerStep != 1) + { + msg("minutesPerStep must equal one for temperature depression to work. \n"); + simHasFailed = true; + return HPWH_ABORT; + } -void HPWH::printHeatSourceInfo() { - std::stringstream ss; - double runtime = 0,outputVar = 0; + if ((DRstatus & (DR_TOO | DR_TOT))) + { + if (hpwhVerbosity >= VRB_typical) + { + msg("DR_TOO | DR_TOT use conflicting logic sets. The logic will follow a DR_TOT scheme " + " \n"); + } + } - ss << std::left; - ss << std::fixed; - ss << std::setprecision(2); - for(int i = 0; i < getNumHeatSources(); i++) { - ss << "heat source " << i << ": " << isNthHeatSourceRunning(i) << "\t\t"; - } - ss << endl; + if (hpwhVerbosity >= VRB_typical) + { + msg("Beginning runOneStep. \nTank Temps: "); + printTankTemps(); + msg("Step Inputs: InletT_C: %.2lf, drawVolume_L: %.2lf, tankAmbientT_C: %.2lf, " + "heatSourceAmbientT_C: %.2lf, DRstatus: %d, minutesPerStep: %.2lf \n", + member_inletT_C, + drawVolume_L, + tankAmbientT_C, + heatSourceAmbientT_C, + DRstatus, + minutesPerStep); + } + // is the failure flag is set, don't run + if (simHasFailed) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("simHasFailed is set, aborting. \n"); + } + return HPWH_ABORT; + } - for(int i = 0; i < getNumHeatSources(); i++) { - ss << "input energy kwh: " << std::setw(7) << getNthHeatSourceEnergyInput(i) << "\t"; - } - ss << endl; + // reset the output variables + outletTemp_C = 0.; + condenserInlet_C = 0.; + condenserOutlet_C = 0.; + externalVolumeHeated_L = 0.; + energyRemovedFromEnvironment_kWh = 0.; + standbyLosses_kWh = 0.; - for(int i = 0; i < getNumHeatSources(); i++) { - runtime = getNthHeatSourceRunTime(i); - if(runtime != 0) { - outputVar = getNthHeatSourceEnergyInput(i) / (runtime / 60.0); - } else { - outputVar = 0; - } - ss << "input power kw: " << std::setw(7) << outputVar << "\t\t"; - } - ss << endl; + for (int i = 0; i < getNumHeatSources(); i++) + { + heatSources[i].runtime_min = 0; + heatSources[i].energyInput_kWh = 0.; + heatSources[i].energyOutput_kWh = 0.; + } + extraEnergyInput_kWh = 0.; - for(int i = 0; i < getNumHeatSources(); i++) { - ss << "output energy kwh: " << std::setw(7) << getNthHeatSourceEnergyOutput(i,UNITS_KWH) << "\t"; - } - ss << endl; + // if you are doing temp. depression, set tank and heatSource ambient temps + // to the tracked locationTemperature + double temperatureGoal = tankAmbientT_C; + if (doTempDepression) + { + if (locationTemperature_C == UNINITIALIZED_LOCATIONTEMP) + { + locationTemperature_C = tankAmbientT_C; + } + tankAmbientT_C = locationTemperature_C; + heatSourceAmbientT_C = locationTemperature_C; + } - for(int i = 0; i < getNumHeatSources(); i++) { - runtime = getNthHeatSourceRunTime(i); - if(runtime != 0) { - outputVar = getNthHeatSourceEnergyOutput(i,UNITS_KWH) / (runtime / 60.0); - } else { - outputVar = 0; - } - ss << "output power kw: " << std::setw(7) << outputVar << "\t"; - } - ss << endl; + // process draws and standby losses + updateTankTemps(drawVolume_L, member_inletT_C, tankAmbientT_C, inletVol2_L, inletT2_C); - for(int i = 0; i < getNumHeatSources(); i++) { - ss << "run time min: " << std::setw(7) << getNthHeatSourceRunTime(i) << "\t\t"; - } - ss << endl << endl << endl; + updateSoCIfNecessary(); + // First Logic DR checks ////////////////////////////////////////////////////////////////// - msg(ss.str().c_str()); -} + // If the DR signal includes a top off but the previous signal did not, then top it off! + if ((DRstatus & DR_LOC) != 0 && (DRstatus & DR_LOR) != 0) + { + turnAllHeatSourcesOff(); // turns off isheating + if (hpwhVerbosity >= VRB_emetic) + { + msg("DR_LOC | DR_LOC everything off, DRstatus = %i \n", DRstatus); + } + } + else + { // do normal check + if (((DRstatus & DR_TOO) != 0 || (DRstatus & DR_TOT) != 0) && timerTOT == 0) + { + + // turn on the compressor and last resistance element. + if (hasACompressor()) + { + heatSources[compressorIndex].engageHeatSource(DRstatus); + } + if (lowestElementIndex >= 0) + { + heatSources[lowestElementIndex].engageHeatSource(DRstatus); + } + if (hpwhVerbosity >= VRB_emetic) + { + msg("TURNED ON DR_TOO engaged compressor and lowest resistance element, DRstatus = " + "%i \n", + DRstatus); + } + } -void HPWH::printTankTemps() { - std::stringstream ss; + // do HeatSource choice + for (int i = 0; i < getNumHeatSources(); i++) + { + if (hpwhVerbosity >= VRB_emetic) + { + msg("Heat source choice:\theatsource %d can choose from %lu turn on logics and %lu " + "shut off logics\n", + i, + heatSources[i].turnOnLogicSet.size(), + heatSources[i].shutOffLogicSet.size()); + } + if (isHeating == true) + { + // check if anything that is on needs to turn off (generally for lowT cutoffs) + // things that just turn on later this step are checked for this in shouldHeat + if (heatSources[i].isEngaged() && heatSources[i].shutsOff()) + { + heatSources[i].disengageHeatSource(); + // check if the backup heat source would have to shut off too + if (heatSources[i].backupHeatSource != NULL && + heatSources[i].backupHeatSource->shutsOff() != true) + { + // and if not, go ahead and turn it on + heatSources[i].backupHeatSource->engageHeatSource(DRstatus); + } + } + + // if there's a priority HeatSource (e.g. upper resistor) and it needs to + // come on, then turn off and start it up + if (heatSources[i].isVIP) + { + if (hpwhVerbosity >= VRB_emetic) + { + msg("\tVIP check"); + } + if (heatSources[i].shouldHeat()) + { + if (shouldDRLockOut(heatSources[i].typeOfHeatSource, DRstatus)) + { + if (hasACompressor()) + { + heatSources[compressorIndex].engageHeatSource(DRstatus); + break; + } + } + else + { + turnAllHeatSourcesOff(); + heatSources[i].engageHeatSource(DRstatus); + // stop looking if the VIP needs to run + break; + } + } + } + } + // if nothing is currently on, then check if something should come on + else /* (isHeating == false) */ + { + if (heatSources[i].shouldHeat()) + { + heatSources[i].engageHeatSource(DRstatus); + // engaging a heat source sets isHeating to true, so this will only trigger once + } + } - ss << std::left; + } // end loop over heat sources - for(int i = 0; i < getNumNodes(); i++) { - ss << std::setw(9) << getTankNodeTemp(i) << " "; - } - ss << endl; + if (hpwhVerbosity >= VRB_emetic) + { + msg("after heat source choosing: "); + for (int i = 0; i < getNumHeatSources(); i++) + { + msg("heat source %d: %d \t", i, heatSources[i].isEngaged()); + } + msg("\n"); + } - msg(ss.str().c_str()); -} + // do heating logic + double minutesToRun = minutesPerStep; + for (int i = 0; i < getNumHeatSources(); i++) + { + // check/apply lock-outs + if (hpwhVerbosity >= VRB_emetic) + { + msg("Checking lock-out logic for heat source %d:\n", i); + } + if (shouldDRLockOut(heatSources[i].typeOfHeatSource, DRstatus)) + { + heatSources[i].lockOutHeatSource(); + if (hpwhVerbosity >= VRB_emetic) + { + msg("Locked out heat source, DRstatus = %i\n", DRstatus); + } + } + else + { + // locks or unlocks the heat source + heatSources[i].toLockOrUnlock(heatSourceAmbientT_C); + } + if (heatSources[i].isLockedOut() && heatSources[i].backupHeatSource == NULL) + { + heatSources[i].disengageHeatSource(); + if (hpwhVerbosity >= HPWH::VRB_emetic) + { + msg("\nWARNING: lock-out triggered, but no backupHeatSource defined. " + "Simulation will continue will lock out the heat source."); + } + } -// public members to write to CSV file -int HPWH::WriteCSVHeading(FILE* outFILE,const char* preamble,int nTCouples,int options) const { + // going through in order, check if the heat source is on + if (heatSources[i].isEngaged()) + { + + HeatSource* heatSourcePtr; + if (heatSources[i].isLockedOut() && heatSources[i].backupHeatSource != NULL) + { + + // Check that the backup isn't locked out too or already engaged then it will + // heat on its own. + if (heatSources[i].backupHeatSource->toLockOrUnlock(heatSourceAmbientT_C) || + shouldDRLockOut(heatSources[i].backupHeatSource->typeOfHeatSource, + DRstatus) || //){ + heatSources[i].backupHeatSource->isEngaged()) + { + continue; + } + // Don't turn the backup electric resistance heat source on if the VIP + // resistance element is on . + else if (VIPIndex >= 0 && heatSources[VIPIndex].isOn && + heatSources[i].backupHeatSource->isAResistance()) + { + if (hpwhVerbosity >= VRB_typical) + { + msg("Locked out back up heat source AND the engaged heat source %i, " + "DRstatus = %i\n", + i, + DRstatus); + } + continue; + } + else + { + heatSourcePtr = heatSources[i].backupHeatSource; + } + } + else + { + heatSourcePtr = &heatSources[i]; + } + + addHeatParent(heatSourcePtr, heatSourceAmbientT_C, minutesToRun); + + // if it finished early. i.e. shuts off early like if the heatsource met setpoint or + // maxed out + if (heatSourcePtr->runtime_min < minutesToRun) + { + // debugging message handling + if (hpwhVerbosity >= VRB_emetic) + { + msg("done heating! runtime_min minutesToRun %.2lf %.2lf\n", + heatSourcePtr->runtime_min, + minutesToRun); + } + + // subtract time it ran and turn it off + minutesToRun -= heatSourcePtr->runtime_min; + heatSources[i].disengageHeatSource(); + // and if there's a heat source that follows this heat source (regardless of + // lockout) that's able to come on, + if (heatSources[i].followedByHeatSource != NULL && + heatSources[i].followedByHeatSource->shutsOff() == false) + { + // turn it on + heatSources[i].followedByHeatSource->engageHeatSource(DRstatus); + } + // or if there heat source can't produce hotter water (i.e. it's maxed out) and + // the tank still isn't at setpoint. the compressor should get locked out when + // the maxedOut is true but have to run the resistance first during this + // timestep to make sure tank is above the max temperature for the compressor. + else if (heatSources[i].maxedOut() && heatSources[i].backupHeatSource != NULL) + { + + // Check that the backup isn't locked out or already engaged then it will + // heat or already heated on it's own. + if (!heatSources[i].backupHeatSource->toLockOrUnlock( + heatSourceAmbientT_C) && // If not locked out + !shouldDRLockOut(heatSources[i].backupHeatSource->typeOfHeatSource, + DRstatus) && // and not DR locked out + !heatSources[i].backupHeatSource->isEngaged()) + { // and not already engaged + + HeatSource* backupHeatSourcePtr = heatSources[i].backupHeatSource; + // turn it on + backupHeatSourcePtr->engageHeatSource(DRstatus); + // add heat if it hasn't heated up this whole minute already + if (backupHeatSourcePtr->runtime_min >= 0.) + { + addHeatParent(backupHeatSourcePtr, + heatSourceAmbientT_C, + minutesToRun - backupHeatSourcePtr->runtime_min); + } + } + } + } + } // heat source not engaged + } // end while iHS heat source + } + if (areAllHeatSourcesOff() == true) + { + isHeating = false; + } + // If there's extra user defined heat to add -> Add extra heat! + if (extraHeatDist_W != NULL && (*extraHeatDist_W).size() != 0) + { + addExtraHeat(*extraHeatDist_W); + updateSoCIfNecessary(); + } - bool doIP = (options & CSVOPT_IPUNITS) != 0; + // track the depressed local temperature + if (doTempDepression) + { + bool compressorRan = false; + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isEngaged() && !heatSources[i].isLockedOut() && + heatSources[i].depressesTemperature) + { + compressorRan = true; + } + } - fprintf(outFILE,"%s",preamble); + if (compressorRan) + { + temperatureGoal -= maxDepression_C; // hardcoded 4.5 degree total drop - from + // experimental data. Changed to an input + } + else + { + // otherwise, do nothing, we're going back to ambient + } - fprintf(outFILE,"%s","DRstatus"); + // shrink the gap by the same percentage every minute - that gives us + // exponential behavior the percentage was determined by a fit to + // experimental data - 9.4 minute half life and 4.5 degree total drop + // minus-equals is important, and fits with the order of locationTemperature + // and temperatureGoal, so as to not use fabs() and conditional tests + locationTemperature_C -= (locationTemperature_C - temperatureGoal) * (1 - 0.9289); + } - for(int iHS = 0; iHS < getNumHeatSources(); iHS++) { - fprintf(outFILE,",h_src%dIn (Wh),h_src%dOut (Wh)",iHS + 1,iHS + 1); - } + // settle outputs - for(int iTC = 0; iTC < nTCouples; iTC++) { - fprintf(outFILE,",tcouple%d (%s)",iTC + 1,doIP ? "F" : "C"); - } + // outletTemp_C and standbyLosses_kWh are taken care of in updateTankTemps - fprintf(outFILE,",toutlet (%s)",doIP ? "F" : "C"); + // sum energyRemovedFromEnvironment_kWh for each heat source; + for (int i = 0; i < getNumHeatSources(); i++) + { + energyRemovedFromEnvironment_kWh += + (heatSources[i].energyOutput_kWh - heatSources[i].energyInput_kWh); + } - fprintf(outFILE,"\n"); + // cursory check for inverted temperature profile + if (tankTemps_C[getNumNodes() - 1] < tankTemps_C[0]) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The top of the tank is cooler than the bottom. \n"); + } + } - return 0; -} + // Handle DR timer + prevDRstatus = DRstatus; + // DR check for TOT to increase timer. + timerTOT += minutesPerStep; + // Restart the time if we're over the limit or the command is not a top off. + if ((DRstatus & DR_TOT) != 0 && timerTOT >= timerLimitTOT) + { + resetTopOffTimer(); + } + else if ((DRstatus & DR_TOO) == 0 && (DRstatus & DR_TOT) == 0) + { + resetTopOffTimer(); + } -int HPWH::WriteCSVRow(FILE* outFILE,const char* preamble,int nTCouples,int options) const { + if (simHasFailed) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The simulation has encountered an error. \n"); + } + return HPWH_ABORT; + } - bool doIP = (options & CSVOPT_IPUNITS) != 0; + if (hpwhVerbosity >= VRB_typical) + { + msg("Ending runOneStep. \n\n\n\n"); + } - fprintf(outFILE,"%s",preamble); + return 0; // successful completion of the step returns 0 +} // end runOneStep - fprintf(outFILE,"%i",prevDRstatus); +int HPWH::runNSteps(int N, + double* inletT_C, + double* drawVolume_L, + double* tankAmbientT_C, + double* heatSourceAmbientT_C, + DRMODES* DRstatus) +{ + // returns 0 on successful completion, HPWH_ABORT on failure + + // these are all the accumulating variables we'll need + double energyRemovedFromEnvironment_kWh_SUM = 0; + double standbyLosses_kWh_SUM = 0; + double outletTemp_C_AVG = 0; + double totalDrawVolume_L = 0; + std::vector heatSources_runTimes_SUM(getNumHeatSources()); + std::vector heatSources_energyInputs_SUM(getNumHeatSources()); + std::vector heatSources_energyOutputs_SUM(getNumHeatSources()); + + if (hpwhVerbosity >= VRB_typical) + { + msg("Begin runNSteps. \n"); + } + // run the sim one step at a time, accumulating the outputs as you go + for (int i = 0; i < N; i++) + { + runOneStep( + inletT_C[i], drawVolume_L[i], tankAmbientT_C[i], heatSourceAmbientT_C[i], DRstatus[i]); + + if (simHasFailed) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("RunNSteps has encountered an error on step %d of N and has ceased running. " + "\n", + i + 1); + } + return HPWH_ABORT; + } - for(int iHS = 0; iHS < getNumHeatSources(); iHS++) { - fprintf(outFILE,",%0.2f,%0.2f",getNthHeatSourceEnergyInput(iHS,UNITS_KWH)*1000., - getNthHeatSourceEnergyOutput(iHS,UNITS_KWH)*1000.); - } + energyRemovedFromEnvironment_kWh_SUM += energyRemovedFromEnvironment_kWh; + standbyLosses_kWh_SUM += standbyLosses_kWh; - for(int iTC = 0; iTC < nTCouples; iTC++) { - fprintf(outFILE,",%0.2f",getNthSimTcouple(iTC + 1,nTCouples,doIP ? UNITS_F : UNITS_C)); - } - - if (options & HPWH::CSVOPT_IS_DRAWING) { - fprintf(outFILE,",%0.2f",doIP ? C_TO_F(outletTemp_C) : outletTemp_C); - } - else { - fprintf(outFILE,","); - } + outletTemp_C_AVG += outletTemp_C * drawVolume_L[i]; + totalDrawVolume_L += drawVolume_L[i]; - fprintf(outFILE,"\n"); + for (int j = 0; j < getNumHeatSources(); j++) + { + heatSources_runTimes_SUM[j] += getNthHeatSourceRunTime(j); + heatSources_energyInputs_SUM[j] += getNthHeatSourceEnergyInput(j); + heatSources_energyOutputs_SUM[j] += getNthHeatSourceEnergyOutput(j); + } - return 0; -} - -bool HPWH::isSetpointFixed() const{ - return setpointFixed; -} - -int HPWH::setSetpoint(double newSetpoint,UNITS units /*=UNITS_C*/) { - - double newSetpoint_C,temp; - string why; - if(units == UNITS_C) { - newSetpoint_C = newSetpoint; - } else if(units == UNITS_F) { - newSetpoint_C = F_TO_C(newSetpoint); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for setSetpoint. \n"); - } - return HPWH_ABORT; - } - if(!isNewSetpointPossible(newSetpoint_C,temp,why)) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Unwilling to set this setpoint for the currently selected model, max setpoint is %f C. %s\n",temp,why.c_str()); - } - return HPWH_ABORT; - } - - setpoint_C = newSetpoint_C; - - return 0; -} - -double HPWH::getSetpoint(UNITS units /*=UNITS_C*/) const{ - if(units == UNITS_C) { - return setpoint_C; - } else if(units == UNITS_F) { - return C_TO_F(setpoint_C); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getSetpoint. \n"); - } - return HPWH_ABORT; - } -} - -double HPWH::getMaxCompressorSetpoint(UNITS units /*=UNITS_C*/) const { - - if(!hasACompressor()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Unit does not have a compressor \n"); - } - return HPWH_ABORT; - } - - double returnVal = heatSources[compressorIndex].maxSetpoint_C; - if(units == UNITS_C) { - returnVal = returnVal; - } else if(units == UNITS_F) { - returnVal = C_TO_F(returnVal); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getMaxCompressorSetpoint. \n"); - } - return HPWH_ABORT; - } - return returnVal; -} - -bool HPWH::isNewSetpointPossible(double newSetpoint,double& maxAllowedSetpoint,string& why,UNITS units /*=UNITS_C*/) const { - double newSetpoint_C; - double maxAllowedSetpoint_C = -273.15; - if(units == UNITS_C) { - newSetpoint_C = newSetpoint; - } else if(units == UNITS_F) { - newSetpoint_C = F_TO_C(newSetpoint); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for isNewSetpointPossible. \n"); - } - return false; - } - bool returnVal = false; - - if(isSetpointFixed()) { - returnVal = (newSetpoint == setpoint_C); - maxAllowedSetpoint_C = setpoint_C; - if(!returnVal) { - why = "The set point is fixed for the currently selected model."; - } - } else { - - if(hasACompressor()) { // If there's a compressor lets check the new setpoint against the compressor's max setpoint - - maxAllowedSetpoint_C = heatSources[compressorIndex].maxSetpoint_C - - heatSources[compressorIndex].secondaryHeatExchanger.hotSideTemperatureOffset_dC; - - if(newSetpoint_C > maxAllowedSetpoint_C && lowestElementIndex == -1) { - why = "The compressor cannot meet the setpoint temperature and there is no resistance backup."; - returnVal = false; - } else { - returnVal = true; - } - } - if(lowestElementIndex >= 0) { // If there's a resistance element lets check the new setpoint against the its max setpoint - maxAllowedSetpoint_C = heatSources[lowestElementIndex].maxSetpoint_C; - - if(newSetpoint_C > maxAllowedSetpoint_C) { - why = "The resistance elements cannot produce water this hot."; - returnVal = false; - } else { - returnVal = true; - } - } else if(lowestElementIndex == -1 && !hasACompressor()) { // There are no heat sources here! - if(hpwhModel == MODELS_StorageTank) { - returnVal = true; // The one pass the storage tank doesn't have any heating elements so sure change the setpoint it does nothing! - } else { - why = "There aren't any heat sources to check the new setpoint against!"; - returnVal = false; - } - } - } - - if(units == UNITS_C) { - maxAllowedSetpoint = maxAllowedSetpoint_C; - } else if(units == UNITS_F) { - maxAllowedSetpoint = C_TO_F(maxAllowedSetpoint_C); - } - return returnVal; -} - -double HPWH::calcSoCFraction(double tMains_C,double tMinUseful_C,double tMax_C) const { - // Note that volume is ignored in here since with even nodes it cancels out of the SoC fractional equation - if(tMains_C >= tMinUseful_C) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("tMains_C is greater than or equal tMinUseful_C. \n"); - } - return HPWH_ABORT; - } - if(tMinUseful_C > tMax_C) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("tMinUseful_C is greater tMax_C. \n"); - } - return HPWH_ABORT; - } - - double chargeEquivalent = 0.; - for(auto &T: tankTemps_C) { - chargeEquivalent += getChargePerNode(tMains_C,tMinUseful_C,T); - } - double maxSoC = getNumNodes() * getChargePerNode(tMains_C,tMinUseful_C,tMax_C); - return chargeEquivalent / maxSoC; -} - -double HPWH::getSoCFraction() const { - return currentSoCFraction; -} - -void HPWH::calcAndSetSoCFraction() { - double newSoCFraction = -1.; - - std::shared_ptr logicSoC = std::dynamic_pointer_cast(heatSources[compressorIndex].turnOnLogicSet[0]); - newSoCFraction = calcSoCFraction(logicSoC->getMainsT_C(),logicSoC->getTempMinUseful_C()); - - currentSoCFraction = newSoCFraction; -} - -double HPWH::getChargePerNode(double tCold,double tMix,double tHot) const { - if(tHot < tMix) { - return 0.; - } - return (tHot - tCold) / (tMix - tCold); -} - -double HPWH::getMinOperatingTemp(UNITS units /*=UNITS_C*/) const { - if(!hasACompressor()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("No compressor found in this HPWH. \n"); - } - return HPWH_ABORT; - } - if(units == UNITS_C) { - return heatSources[compressorIndex].minT; - } else if(units == UNITS_F) { - return C_TO_F(heatSources[compressorIndex].minT); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getMinOperatingTemp.\n"); - } - return HPWH_ABORT; - } -} - -int HPWH::resetTankToSetpoint() { - return setTankToTemperature(setpoint_C); -} - -int HPWH::setTankToTemperature(double temp_C) { - return setTankLayerTemperatures({temp_C}); -} + // print minutely output + if (hpwhVerbosity == VRB_minuteOut) + { + msg("%f,%f,%f,", tankAmbientT_C[i], drawVolume_L[i], inletT_C[i]); + for (int j = 0; j < getNumHeatSources(); j++) + { + msg("%f,%f,", getNthHeatSourceEnergyInput(j), getNthHeatSourceEnergyOutput(j)); + } -//----------------------------------------------------------------------------- -/// @brief Assigns new temps provided from a std::vector to tankTemps_C. -/// @param[in] setTankTemps new tank temps (arbitrary non-zero size) -/// @param[in] units temp units in setTankTemps (default = UNITS_C) -/// @return Success: 0; Failure: HPWH_ABORT -//----------------------------------------------------------------------------- -int HPWH::setTankLayerTemperatures(std::vector setTankTemps,const UNITS units) -{ - if((units != UNITS_C) && (units != UNITS_F)) - { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for setSetpoint. \n"); - } - return HPWH_ABORT; - } - - std::size_t numSetNodes = setTankTemps.size(); - if(numSetNodes == 0) - { - if(hpwhVerbosity >= VRB_reluctant) { - msg("No temperatures provided.\n"); - } - return HPWH_ABORT; - } - - // convert setTankTemps to °C, if necessary - if(units == UNITS_F) - for(auto &T: setTankTemps) - T = F_TO_C(T); - - // set node temps - if(!resampleIntensive(tankTemps_C,setTankTemps)) - return HPWH_ABORT; - - return 0; -} - -void HPWH::getTankTemps(std::vector &tankTemps) { - tankTemps = tankTemps_C; -} - -int HPWH::setAirFlowFreedom(double fanFraction) { - if(fanFraction < 0 || fanFraction > 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to set the fan fraction outside of bounds. \n"); - } - simHasFailed = true; - return HPWH_ABORT; - } else { - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isACompressor()) { - heatSources[i].airflowFreedom = fanFraction; - } - } - } - return 0; -} - -int HPWH::setDoTempDepression(bool doTempDepress) { - this->doTempDepression = doTempDepress; - return 0; -} - -int HPWH::setTankSize_adjustUA(double HPWH_size,UNITS units /*=UNITS_L*/,bool forceChange /*=false*/) { - //Uses the UA before the function is called and adjusts the A part of the UA to match the input volume given getTankSurfaceArea(). - double HPWH_size_L; - double oldA = getTankSurfaceArea(UNITS_FT2); - - if(units == UNITS_L) { - HPWH_size_L = HPWH_size; - } else if(units == UNITS_GAL) { - HPWH_size_L = GAL_TO_L(HPWH_size); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for setTankSize_adjustUA. \n"); - } - return HPWH_ABORT; - } - setTankSize(HPWH_size_L,UNITS_L,forceChange); - setUA(tankUA_kJperHrC / oldA * getTankSurfaceArea(UNITS_FT2),UNITS_kJperHrC); - return 0; -} - -/*static*/ double HPWH::getTankSurfaceArea(double vol,UNITS volUnits/*=UNITS_L*/,UNITS surfAUnits /*=UNITS_FT2*/) -{ - // returns tank surface area, old defualt was in ft2 - // Based off 88 insulated storage tanks currently available on the market from Sanden, AOSmith, HTP, Rheem, and Niles. - // Corresponds to the inner tank with volume tankVolume_L with the assumption that the aspect ratio is the same - // as the outer dimenisions of the whole unit. - double radius = getTankRadius(vol,volUnits,UNITS_FT); - - double value = 2. * 3.14159 * pow(radius,2) * (ASPECTRATIO + 1.); - - if(value >= 0.) - { - if(surfAUnits == UNITS_M2) - value = FT2_TO_M2(value); - else if(surfAUnits != UNITS_FT2) - value = -1.; - } - return value; -} - -double HPWH::getTankSurfaceArea(UNITS units /*=UNITS_FT2*/) const { - // returns tank surface area, old defualt was in ft2 - // Based off 88 insulated storage tanks currently available on the market from Sanden, AOSmith, HTP, Rheem, and Niles. - // Corresponds to the inner tank with volume tankVolume_L with the assumption that the aspect ratio is the same - // as the outer dimenisions of the whole unit. - double value = getTankSurfaceArea(tankVolume_L,UNITS_L,units); - if(value < 0.) - { - if(hpwhVerbosity >= VRB_reluctant) - msg("Incorrect unit specification for getTankSurfaceArea. \n"); - value = HPWH_ABORT; - } - return value; -} - -/*static*/ double HPWH::getTankRadius(double vol,UNITS volUnits/*=UNITS_L*/,UNITS radiusUnits /*=UNITS_FT*/) -{ // returns tank radius, ft for use in calculation of heat loss in the bottom and top of the tank. - // Based off 88 insulated storage tanks currently available on the market from Sanden, AOSmith, HTP, Rheem, and Niles, - // assumes the aspect ratio for the outer measurements is the same is the actual tank. - double volft3 = - volUnits == UNITS_L ? L_TO_FT3(vol) - : volUnits == UNITS_GAL ? L_TO_FT3(GAL_TO_L(vol)) - : -1.; - - double value = -1.; - if(volft3 >= 0.) - { - value = pow(volft3 / 3.14159 / ASPECTRATIO,1. / 3.); - if(radiusUnits == UNITS_M) - value = FT_TO_M(value); - else if(radiusUnits != UNITS_FT) - value = -1.; - } - return value; -} - -double HPWH::getTankRadius(UNITS units /*=UNITS_FT*/) const{ - // returns tank radius, ft for use in calculation of heat loss in the bottom and top of the tank. - // Based off 88 insulated storage tanks currently available on the market from Sanden, AOSmith, HTP, Rheem, and Niles, - // assumes the aspect ratio for the outer measurements is the same is the actual tank. - - double value = getTankRadius(tankVolume_L,UNITS_L,units); - - if(value < 0.) - { - if(hpwhVerbosity >= VRB_reluctant) - msg("Incorrect unit specification for getTankRadius. \n"); - value = HPWH_ABORT; - } - return value; -} - - -bool HPWH::isTankSizeFixed() const{ - return tankSizeFixed; -} - -int HPWH::setTankSize(double HPWH_size,UNITS units /*=UNITS_L*/,bool forceChange /*=false*/) { - if(isTankSizeFixed() && !forceChange) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Can not change the tank size for your currently selected model. \n"); - } - return HPWH_ABORT; - } - if(HPWH_size <= 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to set the tank volume outside of bounds. \n"); - } - simHasFailed = true; - return HPWH_ABORT; - } else { - if(units == UNITS_L) { - this->tankVolume_L = HPWH_size; - } else if(units == UNITS_GAL) { - this->tankVolume_L = (GAL_TO_L(HPWH_size)); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for setTankSize. \n"); - } - return HPWH_ABORT; - } - } - - calcSizeConstants(); - - return 0; -} -int HPWH::setDoInversionMixing(bool doInversionMixing_in) { - doInversionMixing = doInversionMixing_in; - return 0; -} -int HPWH::setDoConduction(bool doConduction_in) { - doConduction = doConduction_in; - return 0; -} - -int HPWH::setUA(double UA,UNITS units /*=UNITS_kJperHrC*/) { - if(units == UNITS_kJperHrC) { - tankUA_kJperHrC = UA; - } else if(units == UNITS_BTUperHrF) { - tankUA_kJperHrC = UAf_TO_UAc(UA); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for setUA. \n"); - } - return HPWH_ABORT; - } - return 0; -} - -int HPWH::getUA(double& UA,UNITS units /*=UNITS_kJperHrC*/) const { - UA = tankUA_kJperHrC; - if(units == UNITS_kJperHrC) { - // UA is already in correct units - } else if(units == UNITS_BTUperHrF) { - UA = UA / UAf_TO_UAc(1.); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getUA. \n"); - } - UA = -1.; - return HPWH_ABORT; - } - return 0; -} - -int HPWH::setFittingsUA(double UA,UNITS units /*=UNITS_kJperHrC*/) { - if(units == UNITS_kJperHrC) { - fittingsUA_kJperHrC = UA; - } else if(units == UNITS_BTUperHrF) { - fittingsUA_kJperHrC = UAf_TO_UAc(UA); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for setFittingsUA. \n"); - } - return HPWH_ABORT; - } - return 0; -} -int HPWH::getFittingsUA(double& UA,UNITS units /*=UNITS_kJperHrC*/) const { - UA = fittingsUA_kJperHrC; - if(units == UNITS_kJperHrC) { - // UA is already in correct units - } else if(units == UNITS_BTUperHrF) { - UA = UA / UAf_TO_UAc(1.); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getUA. \n"); - } - UA = -1.; - return HPWH_ABORT; - } - return 0; -} - -int HPWH::setInletByFraction(double fractionalHeight) { - return setNodeNumFromFractionalHeight(fractionalHeight,inletHeight); -} -int HPWH::setInlet2ByFraction(double fractionalHeight) { - return setNodeNumFromFractionalHeight(fractionalHeight,inlet2Height); -} - -int HPWH::setExternalInletHeightByFraction(double fractionalHeight) { - return setExternalPortHeightByFraction(fractionalHeight,1); -} -int HPWH::setExternalOutletHeightByFraction(double fractionalHeight) { - return setExternalPortHeightByFraction(fractionalHeight,2); -} - -int HPWH::setExternalPortHeightByFraction(double fractionalHeight,int whichExternalPort) { - if(!hasExternalHeatSource()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Does not have an external heat source \n"); - } - return HPWH_ABORT; - } - - int returnVal = 0; - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) { - if(whichExternalPort == 1) { - returnVal = setNodeNumFromFractionalHeight(fractionalHeight,heatSources[i].externalInletHeight); - } else { - returnVal = setNodeNumFromFractionalHeight(fractionalHeight,heatSources[i].externalOutletHeight); - } - - if(returnVal == HPWH_ABORT) { - return returnVal; - } - } - } - return returnVal; -} - -int HPWH::setNodeNumFromFractionalHeight(double fractionalHeight,int &inletNum) { - if(fractionalHeight > 1. || fractionalHeight < 0.) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Out of bounds fraction for setInletByFraction \n"); - } - return HPWH_ABORT; - } - - int node = (int)std::floor(getNumNodes() * fractionalHeight); - inletNum = (node == getNumNodes()) ? getIndexTopNode() : node; - - return 0; -} - -int HPWH::getExternalInletHeight() const { - if(!hasExternalHeatSource()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Does not have an external heat source \n"); - } - return HPWH_ABORT; - } - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) { - return heatSources[i].externalInletHeight; // Return the first one since all external sources have some ports - } - } - return HPWH_ABORT; -} -int HPWH::getExternalOutletHeight() const { - if(!hasExternalHeatSource()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Does not have an external heat source \n"); - } - return HPWH_ABORT; - } - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) { - return heatSources[i].externalOutletHeight; // Return the first one since all external sources have some ports - } - } - return HPWH_ABORT; -} - -int HPWH::setTimerLimitTOT(double limit_min) { - if(limit_min > 24.*60. || limit_min < 0.) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Out of bounds time limit for setTimerLimitTOT \n"); - } - return HPWH_ABORT; - } - - timerLimitTOT = limit_min; - - return 0; -} - -double HPWH::getTimerLimitTOT_minute() const { - return timerLimitTOT; -} - -int HPWH::getInletHeight(int whichInlet) const { - if(whichInlet == 1) { - return inletHeight; - } else if(whichInlet == 2) { - return inlet2Height; - } else - { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Invalid inlet chosen in getInletHeight \n"); - } - return HPWH_ABORT; - } -} - -int HPWH::setMaxTempDepression(double maxDepression,UNITS units /*=UNITS_C*/) { - if(units == UNITS_C) { - maxDepression_C = maxDepression; - } else if(units == UNITS_F) { - maxDepression_C = F_TO_C(maxDepression); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for max Temp Depression. \n"); - } - return HPWH_ABORT; - } - return 0; -} - -bool HPWH::hasEnteringWaterHighTempShutOff(int heatSourceIndex) { - bool retVal = false; - if(heatSourceIndex >= getNumHeatSources() || heatSourceIndex < 0) { - return retVal; - } - if(heatSources[heatSourceIndex].shutOffLogicSet.size() == 0) { - return retVal; - } - - for(std::shared_ptr shutOffLogic : heatSources[heatSourceIndex].shutOffLogicSet) { - if(shutOffLogic->getIsEnteringWaterHighTempShutoff()) { - retVal = true; - break; - } - } - return retVal; -} - -int HPWH::setEnteringWaterHighTempShutOff(double highTemp,bool tempIsAbsolute,int heatSourceIndex,UNITS unit /*=UNITS_C*/) { - if(!hasEnteringWaterHighTempShutOff(heatSourceIndex)) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to acess a heating logic that does not exist. \n"); - } - return HPWH_ABORT; - } - - double highTemp_C; - if(unit == UNITS_C) { - highTemp_C = highTemp; - } else if(unit == UNITS_F) { - highTemp_C = F_TO_C(highTemp); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for set Entering Water High Temp Shut Off. \n"); - } - return HPWH_ABORT; - } - - bool highTempIsNotValid = false; - if(tempIsAbsolute) { - // check differnce with setpoint - if(setpoint_C - highTemp_C < MINSINGLEPASSLIFT) { - highTempIsNotValid = true; - } - } else { - if(highTemp_C < MINSINGLEPASSLIFT) { - highTempIsNotValid = true; - } - } - if(highTempIsNotValid) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("High temperature shut off is too close to the setpoint, excpected a minimum difference of %.2lf.\n", - MINSINGLEPASSLIFT); - } - return HPWH_ABORT; - } - - for(std::shared_ptr shutOffLogic : heatSources[heatSourceIndex].shutOffLogicSet) { - if(shutOffLogic->getIsEnteringWaterHighTempShutoff()) { - std::dynamic_pointer_cast(shutOffLogic)->setDecisionPoint(highTemp_C,tempIsAbsolute); - break; - } - } - return 0; -} - -int HPWH::setTargetSoCFraction(double target) { - if(!isSoCControlled()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Can not set target state of charge if HPWH is not using state of charge controls."); - } - return HPWH_ABORT; - } - if(target < 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Can not set a negative target state of charge."); - } - return HPWH_ABORT; - } - - for(int i = 0; i < getNumHeatSources(); i++) { - for(std::shared_ptr logic : heatSources[i].shutOffLogicSet) { - if(!logic->getIsEnteringWaterHighTempShutoff()) { - logic->setDecisionPoint(target); - } - } - for(std::shared_ptr logic : heatSources[i].turnOnLogicSet) { - logic->setDecisionPoint(target); - } - } - return 0; -} - -bool HPWH::isSoCControlled() const { - return usesSoCLogic; -} - -bool HPWH::canUseSoCControls() { - bool retVal = true; - if(getCompressorCoilConfig() != HPWH::HeatSource::CONFIG_EXTERNAL) { - retVal = false; - } - return retVal; -} - -int HPWH::switchToSoCControls(double targetSoC,double hysteresisFraction /*= 0.05*/,double tempMinUseful /*= 43.333*/,bool constantMainsT /*= false*/, - double mainsT /*= 18.333*/,UNITS tempUnit /*= UNITS_C*/) { - if(!canUseSoCControls()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Cannot set up state of charge controls for integrated or wrapped HPWHs.\n"); - } - return HPWH_ABORT; - } - - double tempMinUseful_C,mainsT_C; - if(tempUnit == UNITS_C) { - tempMinUseful_C = tempMinUseful; - mainsT_C = mainsT; - } else if(tempUnit == UNITS_F) { - tempMinUseful_C = F_TO_C(tempMinUseful); - mainsT_C = F_TO_C(mainsT); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for set Enterinh Water High Temp Shut Off.\n"); - } - return HPWH_ABORT; - } - - if(mainsT_C >= tempMinUseful_C) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The mains temperature can't be equal to or greater than the minimum useful temperature.\n"); - } - return HPWH_ABORT; - } - - for(int i = 0; i < getNumHeatSources(); i++) { - heatSources[i].clearAllTurnOnLogic(); - - heatSources[i].shutOffLogicSet.erase(std::remove_if(heatSources[i].shutOffLogicSet.begin(), - heatSources[i].shutOffLogicSet.end(), - [&](const auto logic)-> bool - { return !logic->getIsEnteringWaterHighTempShutoff(); }), - heatSources[i].shutOffLogicSet.end()); - - heatSources[i].shutOffLogicSet.push_back(shutOffSoC("SoC Shut Off",targetSoC,hysteresisFraction,tempMinUseful_C,constantMainsT,mainsT_C)); - heatSources[i].turnOnLogicSet.push_back(turnOnSoC("SoC Turn On",targetSoC,hysteresisFraction,tempMinUseful_C,constantMainsT,mainsT_C)); - } - - usesSoCLogic = true; - - return 0; -} - -std::shared_ptr HPWH::turnOnSoC(string desc,double targetSoC,double hystFract,double tempMinUseful_C, - bool constantMainsT,double mainsT_C) { - return std::make_shared(desc,targetSoC,this,-hystFract,tempMinUseful_C,constantMainsT,mainsT_C); -} - -std::shared_ptr HPWH::shutOffSoC(string desc,double targetSoC,double hystFract,double tempMinUseful_C, - bool constantMainsT,double mainsT_C) { - return std::make_shared(desc,targetSoC,this,hystFract,tempMinUseful_C,constantMainsT,mainsT_C,std::greater()); -} + std::vector displayTemps_C(10); + resampleIntensive(displayTemps_C, tankTemps_C); + bool first = true; + for (auto& displayTemp : displayTemps_C) + { + if (first) + first = false; + else + msg(","); + + msg("%f", displayTemp); + } -//----------------------------------------------------------------------------- -/// @brief Builds a vector of logic node weights referred to a fixed number of -/// nodes given by LOGIC_NODE_SIZE. -/// @param[in] bottomFraction Lower bounding fraction (0 to 1) -/// @param[in] topFraction Upper bounding fraction (0 to 1) -/// @return vector of node weights -//----------------------------------------------------------------------------- -std::vector HPWH::getNodeWeightRange(double bottomFraction, double topFraction) { - std::vector nodeWeights; - if (topFraction < bottomFraction) std::swap(bottomFraction, topFraction); - auto bottomIndex = static_cast(bottomFraction * LOGIC_NODE_SIZE); - auto topIndex = static_cast(topFraction * LOGIC_NODE_SIZE); - for (auto index = bottomIndex; index < topIndex; ++index) { - nodeWeights.emplace_back(static_cast(index) + 1); - } - return nodeWeights; -} + for (int k = 1; k < 7; ++k) + { + if (first) + first = false; + else + msg(","); -std::shared_ptr HPWH::wholeTank(double decisionPoint,const UNITS units /* = UNITS_C */, const bool absolute /* = false */) { - std::vector nodeWeights = getNodeWeightRange(0., 1.); - double decisionPoint_C = convertTempToC(decisionPoint,units,absolute); - return std::make_shared("whole tank",nodeWeights,decisionPoint_C,this,absolute); -} + msg("%f", getNthSimTcouple(k, 6)); + } -std::shared_ptr HPWH::topThird(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(2./3., 1.); - return std::make_shared("top third",nodeWeights,decisionPoint,this); -} + msg("\n"); + } + } + // finish weighted avg. of outlet temp by dividing by the total drawn volume + outletTemp_C_AVG /= totalDrawVolume_L; -std::shared_ptr HPWH::topThird_absolute(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(2./3., 1.); - return std::make_shared("top third absolute",nodeWeights,decisionPoint,this,true); -} + // now, reassign all of the accumulated values to their original spots + energyRemovedFromEnvironment_kWh = energyRemovedFromEnvironment_kWh_SUM; + standbyLosses_kWh = standbyLosses_kWh_SUM; + outletTemp_C = outletTemp_C_AVG; -std::shared_ptr HPWH::secondThird(double decisionPoint,const UNITS units /* = UNITS_C */, const bool absolute /* = false */) { - std::vector nodeWeights = getNodeWeightRange(1./3., 2./3.); - double decisionPoint_C = convertTempToC(decisionPoint,units,absolute); - return std::make_shared("second third",nodeWeights,decisionPoint_C,this,absolute); -} + for (int i = 0; i < getNumHeatSources(); i++) + { + heatSources[i].runtime_min = heatSources_runTimes_SUM[i]; + heatSources[i].energyInput_kWh = heatSources_energyInputs_SUM[i]; + heatSources[i].energyOutput_kWh = heatSources_energyOutputs_SUM[i]; + } -std::shared_ptr HPWH::bottomThird(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./3.); - return std::make_shared("bottom third",nodeWeights,decisionPoint,this); + if (hpwhVerbosity >= VRB_typical) + { + msg("Ending runNSteps. \n\n\n\n"); + } + return 0; } -std::shared_ptr HPWH::bottomSixth(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./6.); - return std::make_shared("bottom sixth",nodeWeights,decisionPoint,this); -} +void HPWH::addHeatParent(HeatSource* heatSourcePtr, + double heatSourceAmbientT_C, + double minutesToRun) +{ -std::shared_ptr HPWH::bottomSixth_absolute(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./6.); - return std::make_shared("bottom sixth absolute",nodeWeights,decisionPoint,this,true); -} + double tempSetpoint_C = -273.15; -std::shared_ptr HPWH::secondSixth(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(1./6., 2./6.); - return std::make_shared("second sixth",nodeWeights,decisionPoint,this); -} + // Check the air temprature and setpoint against maxOut_at_LowT + if (heatSourcePtr->isACompressor()) + { + if (heatSourceAmbientT_C <= heatSourcePtr->maxOut_at_LowT.airT_C && + setpoint_C >= heatSourcePtr->maxOut_at_LowT.outT_C) + { + tempSetpoint_C = setpoint_C; // Store setpoint + setSetpoint(heatSourcePtr->maxOut_at_LowT + .outT_C); // Reset to new setpoint as this is used in the add heat calc + } + } + // and add heat if it is + heatSourcePtr->addHeat(heatSourceAmbientT_C, minutesToRun); -std::shared_ptr HPWH::thirdSixth(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(2./6., 3./6.); - return std::make_shared("third sixth",nodeWeights,decisionPoint,this); + // Change the setpoint back to what it was pre-compressor depression + if (tempSetpoint_C > -273.15) + { + setSetpoint(tempSetpoint_C); + } } -std::shared_ptr HPWH::fourthSixth(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(3./6., 4./6.); - return std::make_shared("fourth sixth",nodeWeights,decisionPoint,this); +void HPWH::setVerbosity(VERBOSITY hpwhVrb) { hpwhVerbosity = hpwhVrb; } +void HPWH::setMessageCallback(void (*callbackFunc)(const string message, void* contextPtr), + void* contextPtr) +{ + messageCallback = callbackFunc; + messageCallbackContextPtr = contextPtr; } - -std::shared_ptr HPWH::fifthSixth(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(4./6., 5./6.); - return std::make_shared("fifth sixth",nodeWeights,decisionPoint,this); +void HPWH::sayMessage(const string message) const +{ + if (messageCallback != NULL) + { + (*messageCallback)(message, messageCallbackContextPtr); + } + else + { + std::cout << message; + } } - -std::shared_ptr HPWH::topSixth(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(5./6., 1.); - return std::make_shared("top sixth",nodeWeights,decisionPoint,this); +void HPWH::msg(const char* fmt, ...) const +{ + va_list ap; + va_start(ap, fmt); + msgV(fmt, ap); } +void HPWH::msgV(const char* fmt, va_list ap /*=NULL*/) const +{ + char outputString[MAXOUTSTRING]; -std::shared_ptr HPWH::bottomHalf(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./2.); - return std::make_shared("bottom half",nodeWeights,decisionPoint,this); -} + const char* p; + if (ap) + { +#if defined(_MSC_VER) + vsprintf_s(outputString, fmt, ap); +#else + vsnprintf(outputString, MAXOUTSTRING, fmt, ap); +#endif + p = outputString; + } + else + { + p = fmt; + } + sayMessage(p); +} // HPWH::msgV -std::shared_ptr HPWH::bottomTwelfth(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./12.); - return std::make_shared("bottom twelfth",nodeWeights,decisionPoint,this); -} +void HPWH::printHeatSourceInfo() +{ + std::stringstream ss; + double runtime = 0, outputVar = 0; -std::shared_ptr HPWH::standby(double decisionPoint) { - std::vector nodeWeights; - nodeWeights.emplace_back(LOGIC_NODE_SIZE + 1); // uses very top computation node - return std::make_shared("standby",nodeWeights,decisionPoint,this); -} + ss << std::left; + ss << std::fixed; + ss << std::setprecision(2); + for (int i = 0; i < getNumHeatSources(); i++) + { + ss << "heat source " << i << ": " << isNthHeatSourceRunning(i) << "\t\t"; + } + ss << endl; -std::shared_ptr HPWH::topNodeMaxTemp(double decisionPoint) { - std::vector nodeWeights; - nodeWeights.emplace_back(LOGIC_NODE_SIZE + 1); // uses very top computation node - return std::make_shared("top node",nodeWeights,decisionPoint,this,true,std::greater()); -} + for (int i = 0; i < getNumHeatSources(); i++) + { + ss << "input energy kwh: " << std::setw(7) << getNthHeatSourceEnergyInput(i) << "\t"; + } + ss << endl; -std::shared_ptr HPWH::bottomNodeMaxTemp(double decisionPoint,bool isEnteringWaterHighTempShutoff /*=false*/) { - std::vector nodeWeights; - nodeWeights.emplace_back(0); // uses very bottom computation node - return std::make_shared("bottom node",nodeWeights,decisionPoint,this,true,std::greater(),isEnteringWaterHighTempShutoff); -} + for (int i = 0; i < getNumHeatSources(); i++) + { + runtime = getNthHeatSourceRunTime(i); + if (runtime != 0) + { + outputVar = getNthHeatSourceEnergyInput(i) / (runtime / 60.0); + } + else + { + outputVar = 0; + } + ss << "input power kw: " << std::setw(7) << outputVar << "\t\t"; + } + ss << endl; -std::shared_ptr HPWH::bottomTwelfthMaxTemp(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./12.); - return std::make_shared("bottom twelfth",nodeWeights,decisionPoint,this,true,std::greater()); -} + for (int i = 0; i < getNumHeatSources(); i++) + { + ss << "output energy kwh: " << std::setw(7) << getNthHeatSourceEnergyOutput(i, UNITS_KWH) + << "\t"; + } + ss << endl; -std::shared_ptr HPWH::topThirdMaxTemp(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(2./3., 1.); - return std::make_shared("top third",nodeWeights,decisionPoint,this,true,std::greater()); -} + for (int i = 0; i < getNumHeatSources(); i++) + { + runtime = getNthHeatSourceRunTime(i); + if (runtime != 0) + { + outputVar = getNthHeatSourceEnergyOutput(i, UNITS_KWH) / (runtime / 60.0); + } + else + { + outputVar = 0; + } + ss << "output power kw: " << std::setw(7) << outputVar << "\t"; + } + ss << endl; -std::shared_ptr HPWH::bottomSixthMaxTemp(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./6.); - return std::make_shared("bottom sixth",nodeWeights,decisionPoint,this,true,std::greater()); -} + for (int i = 0; i < getNumHeatSources(); i++) + { + ss << "run time min: " << std::setw(7) << getNthHeatSourceRunTime(i) << "\t\t"; + } + ss << endl << endl << endl; -std::shared_ptr HPWH::secondSixthMaxTemp(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(1./6., 2./6.); - return std::make_shared("second sixth",nodeWeights,decisionPoint,this,true,std::greater()); + msg(ss.str().c_str()); } -std::shared_ptr HPWH::fifthSixthMaxTemp(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(4./6., 5./6.); - return std::make_shared("top sixth",nodeWeights,decisionPoint,this,true,std::greater()); -} +void HPWH::printTankTemps() +{ + std::stringstream ss; -std::shared_ptr HPWH::topSixthMaxTemp(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(5./6., 1.); - return std::make_shared("top sixth",nodeWeights,decisionPoint,this,true,std::greater()); -} + ss << std::left; -std::shared_ptr HPWH::largeDraw(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./4.); - return std::make_shared("large draw",nodeWeights,decisionPoint,this,true); -} + for (int i = 0; i < getNumNodes(); i++) + { + ss << std::setw(9) << getTankNodeTemp(i) << " "; + } + ss << endl; -std::shared_ptr HPWH::largerDraw(double decisionPoint) { - std::vector nodeWeights = getNodeWeightRange(0., 1./2.); - return std::make_shared("larger draw",nodeWeights,decisionPoint,this,true); + msg(ss.str().c_str()); } -void HPWH::setNumNodes(const std::size_t num_nodes) +// public members to write to CSV file +int HPWH::WriteCSVHeading(FILE* outFILE, const char* preamble, int nTCouples, int options) const { - tankTemps_C.resize(num_nodes); - nextTankTemps_C.resize(num_nodes); -} - -int HPWH::getNumNodes() const -{ - return static_cast(tankTemps_C.size()); -} - -int HPWH::getIndexTopNode() const -{ - return getNumNodes() - 1; -} - -double HPWH::getTankNodeTemp(int nodeNum,UNITS units /*=UNITS_C*/) const { - if(tankTemps_C.empty()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to access the temperature of a tank node that does not exist. \n"); - } - return double(HPWH_ABORT); - } else { - double result = tankTemps_C[nodeNum]; - //if (result == double(HPWH_ABORT)) { can't happen? - // return result; - //} - if(units == UNITS_C) { - return result; - } else if(units == UNITS_F) { - return C_TO_F(result); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getTankNodeTemp. \n"); - } - return double(HPWH_ABORT); - } - } -} - -double HPWH::getNthSimTcouple(int iTCouple,int nTCouple,UNITS units /*=UNITS_C*/) const { - if(iTCouple > nTCouple || iTCouple < 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to access a simulated thermocouple that does not exist. \n"); - } - return double(HPWH_ABORT); - } - double beginFraction = static_cast(iTCouple - 1.) / static_cast(nTCouple); - double endFraction = static_cast(iTCouple) / static_cast(nTCouple); - - double simTcoupleTemp_C = getResampledValue(tankTemps_C,beginFraction,endFraction); - if(units == UNITS_C) { - return simTcoupleTemp_C; - } else if(units == UNITS_F) { - return C_TO_F(simTcoupleTemp_C); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getNthSimTcouple. \n"); - } - return double(HPWH_ABORT); - } - -} - -int HPWH::getNumHeatSources() const { - return static_cast(heatSources.size()); -} - -int HPWH::getCompressorIndex() const { - return compressorIndex; -} - -int HPWH::getNumResistanceElements() const { - int count = 0; - for(int i = 0; i < getNumHeatSources(); i++) { - count += heatSources[i].isAResistance() ? 1 : 0; - } - return count; -} - -double HPWH::getCompressorCapacity(double airTemp /*=19.722*/,double inletTemp /*=14.444*/,double outTemp /*=57.222*/, - UNITS pwrUnit /*=UNITS_KW*/,UNITS tempUnit /*=UNITS_C*/) { - // calculate capacity btu/hr, input btu/hr, and cop - double capTemp_BTUperHr,inputTemp_BTUperHr,copTemp; // temporary variables - double airTemp_C,inletTemp_C,outTemp_C; - - if(!hasACompressor()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Current model does not have a compressor. \n"); - } - return double(HPWH_ABORT); - } - - if(tempUnit == UNITS_C) { - airTemp_C = airTemp; - inletTemp_C = inletTemp; - outTemp_C = outTemp; - } else if(tempUnit == UNITS_F) { - airTemp_C = F_TO_C(airTemp); - inletTemp_C = F_TO_C(inletTemp); - outTemp_C = F_TO_C(outTemp); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for temperatures in getCompressorCapacity. \n"); - } - return double(HPWH_ABORT); - } - - if(airTemp_C < heatSources[compressorIndex].minT || airTemp_C > heatSources[compressorIndex].maxT) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The compress does not operate at the specified air temperature. \n"); - } - return double(HPWH_ABORT); - } - - double maxAllowedSetpoint_C = heatSources[compressorIndex].maxSetpoint_C - - heatSources[compressorIndex].secondaryHeatExchanger.hotSideTemperatureOffset_dC; - if(outTemp_C > maxAllowedSetpoint_C) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Inputted outlet temperature of the compressor is higher than can be produced."); - } - return double(HPWH_ABORT); - } - - if(heatSources[compressorIndex].isExternalMultipass()) { - double averageTemp_C = (outTemp_C + inletTemp_C) / 2.; - heatSources[compressorIndex].getCapacityMP(airTemp_C,averageTemp_C,inputTemp_BTUperHr,capTemp_BTUperHr,copTemp); - } else { - heatSources[compressorIndex].getCapacity(airTemp_C,inletTemp_C,outTemp_C,inputTemp_BTUperHr,capTemp_BTUperHr,copTemp); - } - - double outputCapacity = capTemp_BTUperHr; - if(pwrUnit == UNITS_KW) { - outputCapacity = BTU_TO_KWH(capTemp_BTUperHr); - } else if(pwrUnit != UNITS_BTUperHr) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for capacity in getCompressorCapacity. \n"); - } - return double(HPWH_ABORT); - } - - return outputCapacity; -} - -double HPWH::getNthHeatSourceEnergyInput(int N,UNITS units /*=UNITS_KWH*/) const { - //energy used by the heat source is positive - this should always be positive - if(N >= getNumHeatSources() || N < 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to access the energy input of a heat source that does not exist. \n"); - } - return double(HPWH_ABORT); - } - - if(units == UNITS_KWH) { - return heatSources[N].energyInput_kWh; - } else if(units == UNITS_BTU) { - return KWH_TO_BTU(heatSources[N].energyInput_kWh); - } else if(units == UNITS_KJ) { - return KWH_TO_KJ(heatSources[N].energyInput_kWh); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getNthHeatSourceEnergyInput. \n"); - } - return double(HPWH_ABORT); - } -} - -double HPWH::getNthHeatSourceEnergyOutput(int N,UNITS units /*=UNITS_KWH*/) const { - //returns energy from the heat source into the water - this should always be positive - if(N >= getNumHeatSources() || N < 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to access the energy output of a heat source that does not exist. \n"); - } - return double(HPWH_ABORT); - } - - if(units == UNITS_KWH) { - return heatSources[N].energyOutput_kWh; - } else if(units == UNITS_BTU) { - return KWH_TO_BTU(heatSources[N].energyOutput_kWh); - } else if(units == UNITS_KJ) { - return KWH_TO_KJ(heatSources[N].energyOutput_kWh); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getNthHeatSourceEnergyInput. \n"); - } - return double(HPWH_ABORT); - } -} - -double HPWH::getNthHeatSourceRunTime(int N) const { - if(N >= getNumHeatSources() || N < 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to access the run time of a heat source that does not exist. \n"); - } - return double(HPWH_ABORT); - } - return heatSources[N].runtime_min; -} - - -int HPWH::isNthHeatSourceRunning(int N) const { - if(N >= getNumHeatSources() || N < 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to access the status of a heat source that does not exist. \n"); - } - return HPWH_ABORT; - } - if(heatSources[N].isEngaged()) { - return 1; - } else { - return 0; - } -} - - -HPWH::HEATSOURCE_TYPE HPWH::getNthHeatSourceType(int N) const { - if(N >= getNumHeatSources() || N < 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You have attempted to access the type of a heat source that does not exist. \n"); - } - return HEATSOURCE_TYPE(HPWH_ABORT); - } - return heatSources[N].typeOfHeatSource; -} - - -double HPWH::getTankSize(UNITS units /*=UNITS_L*/) const { - if(units == UNITS_L) { - return tankVolume_L; - } else if(units == UNITS_GAL) { - return L_TO_GAL(tankVolume_L); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getTankSize. \n"); - } - return HPWH_ABORT; - } -} - - -double HPWH::getOutletTemp(UNITS units /*=UNITS_C*/) const { - if(units == UNITS_C) { - return outletTemp_C; - } else if(units == UNITS_F) { - return C_TO_F(outletTemp_C); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getOutletTemp. \n"); - } - return double(HPWH_ABORT); - } -} - - -double HPWH::getCondenserWaterInletTemp(UNITS units /*=UNITS_C*/) const { - if(units == UNITS_C) { - return condenserInlet_C; - } else if(units == UNITS_F) { - return C_TO_F(condenserInlet_C); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getCondenserWaterInletTemp. \n"); - } - return double(HPWH_ABORT); - } -} - -double HPWH::getCondenserWaterOutletTemp(UNITS units /*=UNITS_C*/) const { - if(units == UNITS_C) { - return condenserOutlet_C; - } else if(units == UNITS_F) { - return C_TO_F(condenserOutlet_C); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getCondenserWaterInletTemp. \n"); - } - return double(HPWH_ABORT); - } -} - -double HPWH::getExternalVolumeHeated(UNITS units /*=UNITS_L*/) const { - if(units == UNITS_L) { - return externalVolumeHeated_L; - } else if(units == UNITS_GAL) { - return L_TO_GAL(externalVolumeHeated_L); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getExternalVolumeHeated. \n"); - } - return double(HPWH_ABORT); - } -} - -double HPWH::getEnergyRemovedFromEnvironment(UNITS units /*=UNITS_KWH*/) const { - //moving heat from the space to the water is the positive direction - if(units == UNITS_KWH) { - return energyRemovedFromEnvironment_kWh; - } else if(units == UNITS_BTU) { - return KWH_TO_BTU(energyRemovedFromEnvironment_kWh); - } else if(units == UNITS_KJ) { - return KWH_TO_KJ(energyRemovedFromEnvironment_kWh); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getEnergyRemovedFromEnvironment. \n"); - } - return double(HPWH_ABORT); - } -} - -double HPWH::getStandbyLosses(UNITS units /*=UNITS_KWH*/) const { - //moving heat from the water to the space is the positive direction - if(units == UNITS_KWH) { - return standbyLosses_kWh; - } else if(units == UNITS_BTU) { - return KWH_TO_BTU(standbyLosses_kWh); - } else if(units == UNITS_KJ) { - return KWH_TO_KJ(standbyLosses_kWh); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getStandbyLosses. \n"); - } - return double(HPWH_ABORT); - } -} - -double HPWH::getTankHeatContent_kJ() const { - // returns tank heat content relative to 0 C using kJ - - //get average tank temperature - double avgTemp = 0.0; - for(int i = 0; i < getNumNodes(); i++) { - avgTemp += tankTemps_C[i]; - } - avgTemp /= getNumNodes(); - - double totalHeat = avgTemp * DENSITYWATER_kgperL * CPWATER_kJperkgC * tankVolume_L; - return totalHeat; -} - -double HPWH::getLocationTemp_C() const { - return locationTemperature_C; -} - -int HPWH::getHPWHModel() const { - return hpwhModel; -} -int HPWH::getCompressorCoilConfig() const { - if(!hasACompressor()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Current model does not have a compressor. \n"); - } - return HPWH_ABORT; - } - return heatSources[compressorIndex].configuration; -} -bool HPWH::isCompressorMultipass() const { - if(!hasACompressor()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Current model does not have a compressor. \n"); - } - return HPWH_ABORT; - } - return heatSources[compressorIndex].isMultipass; -} -bool HPWH::isCompressoExternalMultipass() const { - if(!hasACompressor()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Current model does not have a compressor. \n"); - } - return HPWH_ABORT; - } - return heatSources[compressorIndex].isExternalMultipass(); -} - -bool HPWH::hasACompressor() const { - return compressorIndex >= 0; -} - - -bool HPWH::hasExternalHeatSource() const { - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) { - return true; - } - } - return false; -} - -double HPWH::getExternalMPFlowRate(UNITS units /*=UNITS_GPM*/) const { - if(!isCompressoExternalMultipass()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Does not have an external multipass heat source \n"); - } - return HPWH_ABORT; - } - - if(units == HPWH::UNITS_LPS) { - return heatSources[compressorIndex].mpFlowRate_LPS; - } else if(units == HPWH::UNITS_GPM) { - return LPS_TO_GPM(heatSources[compressorIndex].mpFlowRate_LPS); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getExternalMPFlowRate. \n"); - } - return (double)HPWH_ABORT; - } -} - -double HPWH::getCompressorMinRuntime(UNITS units /*=UNITS_MIN*/) const { - - if(hasACompressor()) { - double min_minutes = 10.; - - if(units == UNITS_MIN) { - return min_minutes; - } else if(units == UNITS_SEC) { - return MIN_TO_SEC(min_minutes); - } else if(units == UNITS_HR) { - return MIN_TO_HR(min_minutes); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for getCompressorMinRunTime. \n"); - } - return (double)HPWH_ABORT; - } - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("This HPWH has no compressor. \n"); - } - return (double)HPWH_ABORT; - } -} - -int HPWH::getSizingFractions(double& aquaFract,double& useableFract) const { - double aFract = 1.; - double useFract = 1.; - - if(!hasACompressor()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Current model does not have a compressor. \n"); - } - return HPWH_ABORT; - } else if(usesSoCLogic) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Current model uses SOC control logic and does not have a definition for sizing fractions. \n"); - } - return HPWH_ABORT; - } - - // Every compressor must have at least one on logic - for(std::shared_ptr onLogic : heatSources[compressorIndex].turnOnLogicSet) { - double tempA; - - if(hpwhVerbosity >= VRB_emetic) { - msg("\tturnon logic: %s ",onLogic->description.c_str()); - } - tempA = onLogic->nodeWeightAvgFract(); // if standby logic will return 1 - aFract = tempA < aFract ? tempA : aFract; - } - aquaFract = aFract; - - // Compressors don't need to have an off logic - if(heatSources[compressorIndex].shutOffLogicSet.size() != 0) { - for(std::shared_ptr offLogic : heatSources[compressorIndex].shutOffLogicSet) { - - double tempUse; - - if(hpwhVerbosity >= VRB_emetic) { - msg("\tshutsOff logic: %s ",offLogic->description.c_str()); - } - if(offLogic->description == "large draw" || offLogic->description == "larger draw") { - tempUse = 1.; // These logics are just for checking if there's a big draw to switch to RE - } else { - tempUse = 1. - offLogic->nodeWeightAvgFract(); - } - useFract = tempUse < useFract ? tempUse : useFract; // Will return the smallest case of the useable fraction for multiple off logics - } - useableFract = useFract; - } else { - if(hpwhVerbosity >= VRB_emetic) { - msg("\no shutoff logics present"); - } - useableFract = 1.; - } - - // Check if double's are approximately equally and adjust the relationship so it follows the relationship we expect. - // The tolerance plays with 0.1 mm in position if the tank is 1m tall... - double temp = 1. - useableFract; - if(aboutEqual(aquaFract,temp)) { - useableFract = 1. - aquaFract + TOL_MINVALUE; - } - - return 0; -} - -bool HPWH::isHPWHScalable() const { - return canScale; -} - -int HPWH::setScaleHPWHCapacityCOP(double scaleCapacity /*=1.0*/,double scaleCOP /*=1.0*/) { - if(!isHPWHScalable()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Can not scale the HPWH Capacity or COP \n"); - } - return HPWH_ABORT; - } - if(!hasACompressor()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Current model does not have a compressor. \n"); - } - return HPWH_ABORT; - } - if(scaleCapacity <= 0 || scaleCOP <= 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Can not scale the HPWH Capacity or COP to 0 or less than 0 \n"); - } - return HPWH_ABORT; - } - - for(auto &perfP : heatSources[compressorIndex].perfMap) { - if(scaleCapacity != 1.) { - std::transform(perfP.inputPower_coeffs.begin(),perfP.inputPower_coeffs.end(),perfP.inputPower_coeffs.begin(), - std::bind(std::multiplies(),std::placeholders::_1,scaleCapacity)); - } - if(scaleCOP != 1.) { - std::transform(perfP.COP_coeffs.begin(),perfP.COP_coeffs.end(),perfP.COP_coeffs.begin(), - std::bind(std::multiplies(),std::placeholders::_1,scaleCOP)); - } - } - - return 0; -} - -int HPWH::setCompressorOutputCapacity(double newCapacity,double airTemp /*=19.722*/, - double inletTemp /*=14.444*/,double outTemp /*=57.222*/, - UNITS pwrUnit /*=UNITS_KW*/,UNITS tempUnit /*=UNITS_C*/) { - - double oldCapacity = getCompressorCapacity(airTemp,inletTemp,outTemp,pwrUnit,tempUnit); - if(oldCapacity == double(HPWH_ABORT)) { - return HPWH_ABORT; - } - - double scale = newCapacity / oldCapacity; - return setScaleHPWHCapacityCOP(scale,1.); // Scale the compressor capacity -} - - -int HPWH::setResistanceCapacity(double power,int which /*=-1*/,UNITS pwrUnit /*=UNITS_KW*/) { - - //Input checks - if(!isHPWHScalable()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Can not scale the resistance elements \n"); - } - return HPWH_ABORT; - } - if(getNumResistanceElements() == 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("There are no resistance elements to set capacity for \n"); - } - return HPWH_ABORT; - } - if(which < -1 || which > getNumResistanceElements() - 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Out of bounds value for which in setResistanceCapacity()\n"); - } - return HPWH_ABORT; - } - if(power < 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Can not have a negative input power \n"); - } - return HPWH_ABORT; - } - //Unit conversion - double watts; - if(pwrUnit == UNITS_KW) { - watts = power * 1000; // kW to W - } else if(pwrUnit == UNITS_BTUperHr) { - watts = BTU_TO_KWH(power) * 1000; // BTU to kW then kW to W - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for capacity in setResistanceCapacity. \n"); - } - return HPWH_ABORT; - } - - //Whew so many checks... - if(which == -1) { - // Just get all the elements - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isAResistance()) { - heatSources[i].changeResistanceWatts(watts); - } - } - } else { - heatSources[resistanceHeightMap[which].index].changeResistanceWatts(watts); - - // Then check for repeats in the position - int pos = resistanceHeightMap[which].position; - for(int i = 0; i < getNumResistanceElements(); i++) { - if(which != i && resistanceHeightMap[i].position == pos) { - heatSources[resistanceHeightMap[i].index].changeResistanceWatts(watts); - } - } - } - - return 0; -} - -double HPWH::getResistanceCapacity(int which /*=-1*/,UNITS pwrUnit /*=UNITS_KW*/) { - - //Input checks - if(getNumResistanceElements() == 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("There are no resistance elements to return capacity for \n"); - } - return HPWH_ABORT; - } - if(which < -1 || which > getNumResistanceElements() - 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Out of bounds value for which in getResistanceCapacity()\n"); - } - return HPWH_ABORT; - } - - double returnPower = 0; - if(which == -1) { - // Just get all the elements - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isAResistance()) { - returnPower += heatSources[i].perfMap[0].inputPower_coeffs[0]; - } - } - } else { - // get the power from "which" element by height - returnPower += heatSources[resistanceHeightMap[which].index].perfMap[0].inputPower_coeffs[0]; - - // Then check for repeats in the position - int pos = resistanceHeightMap[which].position; - for(int i = 0; i < getNumResistanceElements(); i++) { - if(which != i && resistanceHeightMap[i].position == pos) { - returnPower += heatSources[resistanceHeightMap[i].index].perfMap[0].inputPower_coeffs[0]; - } - } - } - - //Unit conversion - if(pwrUnit == UNITS_KW) { - returnPower /= 1000.; // W to KW - } else if(pwrUnit == UNITS_BTUperHr) { - returnPower = KWH_TO_BTU(returnPower/1000.); // W to BTU/hr - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect unit specification for capacity in getResistanceCapacity. \n"); - } - return HPWH_ABORT; - } - - return returnPower; -} - -int HPWH::getResistancePosition(int elementIndex) const { - - if(elementIndex < 0 || elementIndex > getNumHeatSources() - 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Out of bounds value for which in getResistancePosition\n"); - } - return HPWH_ABORT; - } - - if(!heatSources[elementIndex].isAResistance()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("This index is not a resistance element\n"); - } - return HPWH_ABORT; - } - - for(int i = 0; i < heatSources[elementIndex].getCondensitySize(); i++) { - if(heatSources[elementIndex].condensity[i] == 1) { // res elements have a condenstiy of 1 at a specific node - return i; - } - } - return HPWH_ABORT; -} - -//the privates -void HPWH::updateTankTemps(double drawVolume_L,double inletT_C,double tankAmbientT_C, - double inletVol2_L,double inletT2_C) { - - outletTemp_C = 0.; - - ///////////////////////////////////////////////////////////////////////////////////////////////// - if(drawVolume_L > 0.) { - - //calculate how many nodes to draw (wholeNodesToDraw), and the remainder (drawFraction) - if(inletVol2_L > drawVolume_L) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Volume in inlet 2 is greater than the draw volume. \n"); - } - simHasFailed = true; - return; - } - - // Check which inlet is higher; - int highInletH; - double highInletV,highInletT; - int lowInletH; - double lowInletT,lowInletV; - if(inletHeight > inlet2Height) { - highInletH = inletHeight; - highInletV = drawVolume_L - inletVol2_L; - highInletT = inletT_C; - lowInletH = inlet2Height; - lowInletT = inletT2_C; - lowInletV = inletVol2_L; - } else { - highInletH = inlet2Height; - highInletV = inletVol2_L; - highInletT = inletT2_C; - lowInletH = inletHeight; - lowInletT = inletT_C; - lowInletV = drawVolume_L - inletVol2_L; - } - - if (hasHeatExchanger) {// heat-exchange models - - const double densityTank_kgperL = DENSITYWATER_kgperL; - const double CpTank_kJperkgC = CPWATER_kJperkgC; - - double C_Node_kJperC = CpTank_kJperkgC * densityTank_kgperL * nodeVolume_L; - double C_draw_kJperC = CPWATER_kJperkgC * DENSITYWATER_kgperL * drawVolume_L; - - outletTemp_C = inletT_C; - for (auto &nodeTemp: tankTemps_C) { - double maxHeatExchange_kJ = C_draw_kJperC * (nodeTemp - outletTemp_C); - double heatExchange_kJ = nodeHeatExchangerEffectiveness * maxHeatExchange_kJ; - - nodeTemp -= heatExchange_kJ / C_Node_kJperC; - outletTemp_C += heatExchange_kJ / C_draw_kJperC; - } - } - else { - //calculate how many nodes to draw (drawVolume_N) - double drawVolume_N = drawVolume_L / nodeVolume_L; - if(drawVolume_L > tankVolume_L) { - //if (hpwhVerbosity >= VRB_reluctant) { - // //msg("WARNING: Drawing more than the tank volume in one step is undefined behavior. Terminating simulation. \n"); - // msg("WARNING: Drawing more than the tank volume in one step is undefined behavior. Continuing simulation at your own risk. \n"); - //} - //simHasFailed = true; - //return; - for(int i = 0; i < getNumNodes(); i++){ - outletTemp_C += tankTemps_C[i]; - tankTemps_C[i] = (inletT_C * (drawVolume_L - inletVol2_L) + inletT2_C * inletVol2_L) / drawVolume_L; - } - outletTemp_C = (outletTemp_C / getNumNodes() * tankVolume_L + tankTemps_C[0] * (drawVolume_L - tankVolume_L)) - / drawVolume_L * drawVolume_N; - - drawVolume_N = 0.; - } - - while(drawVolume_N > 0) { - - // Draw one node at a time - double drawFraction = drawVolume_N > 1. ? 1. : drawVolume_N; - double nodeInletTV = 0.; - - //add temperature for outletT average - outletTemp_C += drawFraction * tankTemps_C[getNumNodes() - 1]; - - double cumInletFraction = 0.; - for(int i = getNumNodes() - 1; i >= lowInletH; i--) { - - - // Reset inlet inputs at this node. - double nodeInletFraction = 0.; - nodeInletTV = 0.; - - // Sum of all inlets Vi*Ti at this node - if(i == highInletH) { - nodeInletTV += highInletV * drawFraction / drawVolume_L * highInletT; - nodeInletFraction += highInletV * drawFraction / drawVolume_L; - } - if(i == lowInletH) { - nodeInletTV += lowInletV * drawFraction / drawVolume_L * lowInletT; - nodeInletFraction += lowInletV * drawFraction / drawVolume_L; - - break; // if this is the bottom inlet break out of the four loop and use the boundary condition equation. - } - - // Look at the volume and temperature fluxes into this node - tankTemps_C[i] = (1. - (drawFraction - cumInletFraction)) * tankTemps_C[i] + - nodeInletTV + - (drawFraction - (cumInletFraction + nodeInletFraction)) * tankTemps_C[i - 1]; - - cumInletFraction += nodeInletFraction; - - } - - // Boundary condition equation because it shouldn't take anything from tankTemps_C[i - 1] but it also might not exist. - tankTemps_C[lowInletH] = (1. - (drawFraction - cumInletFraction)) * tankTemps_C[lowInletH] + nodeInletTV; - - drawVolume_N -= drawFraction; - - mixTankInversions(); - } - - //fill in average outlet T - it is a weighted averaged, with weights == nodes drawn - outletTemp_C /= (drawVolume_L / nodeVolume_L); - } - - //Account for mixing at the bottom of the tank - if(tankMixesOnDraw && drawVolume_L > 0.) { - int mixedBelowNode = (int)(getNumNodes() * mixBelowFractionOnDraw); - mixTankNodes(0,mixedBelowNode,3.0); - } - - } //end if(draw_volume_L > 0) - - // Initialize newTankTemps_C - nextTankTemps_C = tankTemps_C; - - double standbyLossesBottom_kJ = 0.; - double standbyLossesTop_kJ = 0.; - double standbyLossesSides_kJ = 0.; - - // Standby losses from the top and bottom of the tank - { - auto standbyLossRate_kJperHrC = tankUA_kJperHrC * fracAreaTop; - - standbyLossesBottom_kJ = standbyLossRate_kJperHrC * hoursPerStep * (tankTemps_C[0] - tankAmbientT_C); - standbyLossesTop_kJ = standbyLossRate_kJperHrC * hoursPerStep * (tankTemps_C[getNumNodes() - 1] - tankAmbientT_C); - - nextTankTemps_C.front() -= standbyLossesBottom_kJ / nodeCp_kJperC; - nextTankTemps_C.back() -= standbyLossesTop_kJ / nodeCp_kJperC; - } - - // Standby losses from the sides of the tank - { - auto standbyLossRate_kJperHrC = (tankUA_kJperHrC * fracAreaSide + fittingsUA_kJperHrC) / getNumNodes(); - for(int i = 0; i < getNumNodes(); i++) { - double standbyLosses_kJ = standbyLossRate_kJperHrC * hoursPerStep * (tankTemps_C[i] - tankAmbientT_C); - standbyLossesSides_kJ += standbyLosses_kJ; - - nextTankTemps_C[i] -= standbyLosses_kJ / nodeCp_kJperC; - } - } - - // Heat transfer between nodes - if(doConduction) { - // Get the "constant" tau for the stability condition and the conduction calculation - const double tau = KWATER_WpermC / ((CPWATER_kJperkgC * 1000.0) * (DENSITYWATER_kgperL * 1000.0) - * (nodeHeight_m * nodeHeight_m)) * secondsPerStep; - if(tau > 0.5) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The stability condition for conduction has failed, these results are going to be interesting!\n"); - } - simHasFailed = true; - return; - } + bool doIP = (options & CSVOPT_IPUNITS) != 0; - // End nodes - if (getNumNodes() > 1) { // inner edges of top and bottom nodes - nextTankTemps_C.front() += 2. * tau * (tankTemps_C[1] - tankTemps_C.front()); - nextTankTemps_C.back() += 2. * tau * (tankTemps_C[getNumNodes() - 2] - tankTemps_C.back()); - } + fprintf(outFILE, "%s", preamble); - // Internal nodes - for(int i = 1; i < getNumNodes() - 1; i++) { - nextTankTemps_C[i] += 2. * tau * (tankTemps_C[i + 1] - 2. * tankTemps_C[i] + tankTemps_C[i - 1]); - } - } + fprintf(outFILE, "%s", "DRstatus"); - // Update tankTemps_C - tankTemps_C = nextTankTemps_C; - - standbyLosses_kWh += KJ_TO_KWH(standbyLossesBottom_kJ + standbyLossesTop_kJ + standbyLossesSides_kJ); - - // check for inverted temperature profile - mixTankInversions(); - -} //end updateTankTemps + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) + { + fprintf(outFILE, ",h_src%dIn (Wh),h_src%dOut (Wh)", iHS + 1, iHS + 1); + } -void HPWH::updateSoCIfNecessary() { - if(usesSoCLogic) { - calcAndSetSoCFraction(); - } -} + for (int iTC = 0; iTC < nTCouples; iTC++) + { + fprintf(outFILE, ",tcouple%d (%s)", iTC + 1, doIP ? "F" : "C"); + } -// Inversion mixing modeled after bigladder EnergyPlus code PK -void HPWH::mixTankInversions() { - bool hasInversion; - const double volumePerNode_L = tankVolume_L / getNumNodes(); - //int numdos = 0; - if(doInversionMixing) { - do { - hasInversion = false; - //Start from the top and check downwards - for(int i = getNumNodes() - 1; i > 0; i--) { - if(tankTemps_C[i] < tankTemps_C[i - 1]) { - // Temperature inversion! - hasInversion = true; - - //Mix this inversion mixing temperature by averaging all of the inverted nodes together together. - double Tmixed = 0.0; - double massMixed = 0.0; - int m; - for(m = i; m >= 0; m--) { - Tmixed += tankTemps_C[m] * (volumePerNode_L * DENSITYWATER_kgperL); - massMixed += (volumePerNode_L * DENSITYWATER_kgperL); - if((m == 0) || (Tmixed / massMixed > tankTemps_C[m - 1])) { - break; - } - } - Tmixed /= massMixed; - - // Assign the tank temps from i to k - for(int k = i; k >= m; k--) tankTemps_C[k] = Tmixed; - } - - } - - } while(hasInversion); - } -} + fprintf(outFILE, ",toutlet (%s)", doIP ? "F" : "C"); -//----------------------------------------------------------------------------- -/// @brief Adds heat amount qAdd_kJ at and above the node with index nodeNum. -/// Returns unused heat to prevent exceeding maximum or setpoint. -/// @note Moved from HPWH::HeatSource -/// @param[in] qAdd_kJ Amount of heat to add -/// @param[in] nodeNum Lowest node at which to add heat -/// @param[in] maxT_C Maximum allowable temperature to maintain -//----------------------------------------------------------------------------- -double HPWH::addHeatAboveNode(double qAdd_kJ,int nodeNum,const double maxT_C) { - - // Do not exceed maxT_C or setpoint - double maxHeatToT_C = std::min(maxT_C,setpoint_C); - - if(hpwhVerbosity >= VRB_emetic) { - msg("node %2d cap_kwh %.4lf \n",nodeNum,KJ_TO_KWH(qAdd_kJ)); - } - - // find number of nodes at or above nodeNum with the same temperature - int numNodesToHeat = 1; - for(int i = nodeNum; i < getNumNodes() - 1; i++) { - if(tankTemps_C[i] != tankTemps_C[i + 1]) { - break; - } else { - numNodesToHeat++; - } - } - - while((qAdd_kJ > 0.) && (nodeNum + numNodesToHeat - 1 < getNumNodes())) { - - // assume there is another node above the equal-temp nodes - int targetTempNodeNum = nodeNum + numNodesToHeat; - - double heatToT_C; - if(targetTempNodeNum > (getNumNodes() - 1)) { - // no nodes above the equal-temp nodes; target temperature is the maximum - heatToT_C = maxHeatToT_C; - } - else { - heatToT_C = tankTemps_C[targetTempNodeNum]; - if(heatToT_C > maxHeatToT_C) { - // Ensure temperature does not exceed maximum - heatToT_C = maxHeatToT_C; - } - } - - // heat needed to bring all equal-temp nodes up to heatToT_C - double qIncrement_kJ = nodeCp_kJperC * numNodesToHeat * (heatToT_C - tankTemps_C[nodeNum]); - - if(qIncrement_kJ > qAdd_kJ) { - // insufficient heat to reach heatToT_C; use all available heat - heatToT_C = tankTemps_C[nodeNum] + qAdd_kJ / nodeCp_kJperC / numNodesToHeat; - for(int j = 0; j < numNodesToHeat; ++j) { - tankTemps_C[nodeNum + j] = heatToT_C; - } - qAdd_kJ = 0.; - } - else if(qIncrement_kJ > 0.) - { // add qIncrement_kJ to raise all equal-temp-nodes to heatToT_C - for(int j = 0; j < numNodesToHeat; ++j) - tankTemps_C[nodeNum + j] = heatToT_C; - qAdd_kJ -= qIncrement_kJ; - } - numNodesToHeat++; - } - - // return any unused heat - return qAdd_kJ; -} + fprintf(outFILE, "\n"); -//----------------------------------------------------------------------------- -/// @brief Adds extra heat amount qAdd_kJ at and above the node with index nodeNum. -/// Does not limit final temperatures. -/// @param[in] qAdd_kJ Amount of heat to add -/// @param[in] nodeNum Lowest node at which to add heat -//----------------------------------------------------------------------------- -void HPWH::addExtraHeatAboveNode(double qAdd_kJ,const int nodeNum) { - - if(hpwhVerbosity >= VRB_emetic) { - msg("node %2d cap_kwh %.4lf \n",nodeNum,KJ_TO_KWH(qAdd_kJ)); - } - - // find number of nodes at or above nodeNum with the same temperature - int numNodesToHeat = 1; - for(int i = nodeNum; i < getNumNodes() - 1; i++) { - if(tankTemps_C[i] != tankTemps_C[i + 1]) { - break; - } else { - numNodesToHeat++; - } - } - - while((qAdd_kJ > 0.) && (nodeNum + numNodesToHeat - 1 < getNumNodes())) { - - // assume there is another node above the equal-temp nodes - int targetTempNodeNum = nodeNum + numNodesToHeat; - - double heatToT_C; - if(targetTempNodeNum > (getNumNodes() - 1)) { - // no nodes above the equal-temp nodes; target temperature limited by the heat available - heatToT_C = tankTemps_C[nodeNum] + qAdd_kJ / nodeCp_kJperC / numNodesToHeat; - } - else { - heatToT_C = tankTemps_C[targetTempNodeNum]; - } - - // heat needed to bring all equal-temp nodes up to heatToT_C - double qIncrement_kJ = nodeCp_kJperC * numNodesToHeat * (heatToT_C - tankTemps_C[nodeNum]); - - if(qIncrement_kJ > qAdd_kJ) { - // insufficient heat to reach heatToT_C; use all available heat - heatToT_C = tankTemps_C[nodeNum] + qAdd_kJ / nodeCp_kJperC / numNodesToHeat; - for(int j = 0; j < numNodesToHeat; ++j) { - tankTemps_C[nodeNum + j] = heatToT_C; - } - qAdd_kJ = 0.; - } - else if(qIncrement_kJ > 0.) - { // add qIncrement_kJ to raise all equal-temp-nodes to heatToT_C - for(int j = 0; j < numNodesToHeat; ++j) - tankTemps_C[nodeNum + j] = heatToT_C; - qAdd_kJ -= qIncrement_kJ; - } - numNodesToHeat++; - } + return 0; } -//----------------------------------------------------------------------------- -/// @brief Modifies a heat distribution using a thermal distribution. -/// @param[in,out] heatDistribution_W The distribution to be modified -//----------------------------------------------------------------------------- -void HPWH::modifyHeatDistribution(std::vector &heatDistribution_W) +int HPWH::WriteCSVRow(FILE* outFILE, const char* preamble, int nTCouples, int options) const { - double totalHeat_W = 0.; - for(auto &heatDist_W: heatDistribution_W) - totalHeat_W += heatDist_W; - if(totalHeat_W == 0.) - return; + bool doIP = (options & CSVOPT_IPUNITS) != 0; - for(auto &heatDist_W: heatDistribution_W) - heatDist_W /= totalHeat_W; + fprintf(outFILE, "%s", preamble); - double shrinkageT_C = findShrinkageT_C(heatDistribution_W); - int lowestNode = findLowestNode(heatDistribution_W,getNumNodes()); + fprintf(outFILE, "%i", prevDRstatus); - std::vector modHeatDistribution_W; - calcThermalDist(modHeatDistribution_W,shrinkageT_C,lowestNode,tankTemps_C,setpoint_C); - - heatDistribution_W = modHeatDistribution_W; - for(auto &heatDist_W: heatDistribution_W) - heatDist_W *= totalHeat_W; -} + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) + { + fprintf(outFILE, + ",%0.2f,%0.2f", + getNthHeatSourceEnergyInput(iHS, UNITS_KWH) * 1000., + getNthHeatSourceEnergyOutput(iHS, UNITS_KWH) * 1000.); + } -//----------------------------------------------------------------------------- -/// @brief Adds extra heat to tank. -/// @param[in] extraHeatDist_W A distribution of extra heat to add -//----------------------------------------------------------------------------- -void HPWH::addExtraHeat(std::vector &extraHeatDist_W){ + for (int iTC = 0; iTC < nTCouples; iTC++) + { + fprintf(outFILE, ",%0.2f", getNthSimTcouple(iTC + 1, nTCouples, doIP ? UNITS_F : UNITS_C)); + } - auto modHeatDistribution_W = extraHeatDist_W; - modifyHeatDistribution(modHeatDistribution_W); + if (options & HPWH::CSVOPT_IS_DRAWING) + { + fprintf(outFILE, ",%0.2f", doIP ? C_TO_F(outletTemp_C) : outletTemp_C); + } + else + { + fprintf(outFILE, ","); + } - std::vector heatDistribution_W(getNumNodes()); - resampleExtensive(heatDistribution_W,modHeatDistribution_W); + fprintf(outFILE, "\n"); - // Unnecessary unit conversions used here to match former method - double tot_qAdded_BTUperHr = 0.; - for(int i = getNumNodes() - 1; i >= 0; i--) { - if(heatDistribution_W[i] != 0) { - double qAdd_BTUperHr = KWH_TO_BTU(heatDistribution_W[i] / 1000.); - double qAdd_KJ = BTU_TO_KJ(qAdd_BTUperHr * minutesPerStep / min_per_hr); - addExtraHeatAboveNode(qAdd_KJ,i); - tot_qAdded_BTUperHr += qAdd_BTUperHr; - } - } - // Write the input & output energy - extraEnergyInput_kWh = BTU_TO_KWH(tot_qAdded_BTUperHr * minutesPerStep / min_per_hr); + return 0; } -/////////////////////////////////////////////////////////////////////////////////// - -void HPWH::turnAllHeatSourcesOff() { - for(int i = 0; i < getNumHeatSources(); i++) { - heatSources[i].disengageHeatSource(); - } - isHeating = false; -} - -bool HPWH::areAllHeatSourcesOff() const { - bool allOff = true; - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isEngaged() == true) { - allOff = false; - } - } - return allOff; -} - -double HPWH::tankAvg_C(const std::vector nodeWeights) const { - double sum = 0; - double totWeight = 0; - - std::vector resampledTankTemps(LOGIC_NODE_SIZE); - resample(resampledTankTemps, tankTemps_C); - - for (auto &nodeWeight : nodeWeights) { - if (nodeWeight.nodeNum == 0) { // bottom node only - sum += tankTemps_C.front() * nodeWeight.weight; - totWeight += nodeWeight.weight; - } - else if (nodeWeight.nodeNum > LOGIC_NODE_SIZE) { // top node only - sum += tankTemps_C.back() * nodeWeight.weight; - totWeight += nodeWeight.weight; - } - else { // general case; sum over all weighted nodes - sum += resampledTankTemps[static_cast(nodeWeight.nodeNum - 1)] * nodeWeight.weight; - totWeight += nodeWeight.weight; - } - } - return sum / totWeight; -} - -void HPWH::mixTankNodes(int mixedAboveNode,int mixedBelowNode,double mixFactor) { - double ave = 0.; - double numAvgNodes = (double)(mixedBelowNode - mixedAboveNode); - for(int i = mixedAboveNode; i < mixedBelowNode; i++) { - ave += tankTemps_C[i]; - } - ave /= numAvgNodes; - - for(int i = mixedAboveNode; i < mixedBelowNode; i++) { - tankTemps_C[i] += ((ave - tankTemps_C[i]) / mixFactor); - //tankTemps_C[i] = tankTemps_C[i] * (1.0 - 1.0 / mixFactor) + ave / mixFactor; - } -} - -void HPWH::calcSizeConstants() { - // calculate conduction between the nodes AND heat loss by node with top and bottom having greater surface area. - // model uses explicit finite difference to find conductive heat exchange between the tank nodes with the boundary conditions - // on the top and bottom node being the fraction of UA that corresponds to the top and bottom of the tank. - // The assumption is that the aspect ratio is the same for all tanks and is the same for the outside measurements of the unit - // and the inner water tank. - const double tankRad_m = getTankRadius(UNITS_M); - const double tankHeight_m = ASPECTRATIO * tankRad_m; - - nodeVolume_L = tankVolume_L / getNumNodes(); - nodeMass_kg = nodeVolume_L * DENSITYWATER_kgperL; - nodeCp_kJperC = nodeMass_kg * CPWATER_kJperkgC; - nodeHeight_m = tankHeight_m / getNumNodes(); - - // The fraction of UA that is on the top or the bottom of the tank. So 2 * fracAreaTop + fracAreaSide is the total tank area. - fracAreaTop = tankRad_m / (2.0 * (tankHeight_m + tankRad_m)); - - // fracAreaSide is the faction of the area of the cylinder that's not the top or bottom. - fracAreaSide = tankHeight_m / (tankHeight_m + tankRad_m); - - /// Single-node heat-exchange effectiveness - nodeHeatExchangerEffectiveness = 1. - pow(1. - heatExchangerEffectiveness, 1./ static_cast(getNumNodes())); -} - -void HPWH::calcDerivedValues() { - // condentropy/shrinkage and lowestNode are now in calcDerivedHeatingValues() - calcDerivedHeatingValues(); - - calcSizeConstants(); - - mapResRelativePosToHeatSources(); - - //heat source ability to depress temp - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isACompressor()) { - heatSources[i].depressesTemperature = true; - } else if(heatSources[i].isAResistance()) { - heatSources[i].depressesTemperature = false; - } - } -} - -void HPWH::calcDerivedHeatingValues(){ - static char outputString[MAXOUTSTRING]; //this is used for debugging outputs - - // find condentropy/shrinkage - for(int i = 0; i < getNumHeatSources(); ++i) { - heatSources[i].Tshrinkage_C = findShrinkageT_C(heatSources[i].condensity); - - if(hpwhVerbosity >= VRB_emetic) { - msg(outputString,"Heat Source %d \n",i); - msg(outputString,"shrinkage %.2lf \n\n",heatSources[i].Tshrinkage_C); - } - } - - // find lowest node - for(int i = 0; i < getNumHeatSources(); i++) { - heatSources[i].lowestNode = findLowestNode(heatSources[i].condensity,getNumNodes()); - - if(hpwhVerbosity >= VRB_emetic) { - msg(outputString,"Heat Source %d \n",i); - msg(outputString," lowest : %d \n",heatSources[i].lowestNode); - } - } - - // define condenser index and lowest resistance element index - compressorIndex = -1; // Default = No compressor - lowestElementIndex = -1; // Default = No resistance elements - highestElementIndex = -1; // Default = No resistance elements - VIPIndex = -1; // Default = No VIP element - double lowestPos = 1.; - double highestPos = 0.; // -1 to make sure a an element on the bottom can still be identified. - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isACompressor()) { - compressorIndex = i; // NOTE: Maybe won't work with multiple compressors (last compressor will be used) - } else if(heatSources[i].isAResistance()){ - // Gets VIP element index - if(heatSources[i].isVIP) { - if(VIPIndex == -1) { - VIPIndex = i; - } else { - if(hpwhVerbosity >= VRB_minuteOut) { - msg("More than one resistance element is assigned to VIP"); - }; - } - } - int condensitySize = heatSources[i].getCondensitySize(); - for(int j = 0; j < condensitySize; ++j) { - double pos = static_cast(j) / condensitySize; - if((heatSources[i].condensity[j] > 0.) && (pos < lowestPos)) { - lowestElementIndex = i; - lowestPos = pos; - } - if((heatSources[i].condensity[j] > 0.) && (pos >= highestPos)) { - highestElementIndex = i; - highestPos = pos; - } - } - } - } - if(hpwhVerbosity >= VRB_emetic) { - msg(outputString," compressorIndex : %d \n",compressorIndex); - msg(outputString," lowestElementIndex : %d \n",lowestElementIndex); - msg(outputString," highestElementIndex : %d \n",highestElementIndex); - } - if(hpwhVerbosity >= VRB_emetic) { - msg(outputString," VIPIndex : %d \n",VIPIndex); - } - - //heat source ability to depress temp - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isACompressor()) { - heatSources[i].depressesTemperature = true; - } else if(heatSources[i].isAResistance()) { - heatSources[i].depressesTemperature = false; - } - } - -} - -void HPWH::mapResRelativePosToHeatSources() { - resistanceHeightMap.clear(); - resistanceHeightMap.reserve(getNumResistanceElements()); - - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isAResistance()) { - resistanceHeightMap.push_back({i, - getResistancePosition(i) - }); - } - } - - // Sort by height, low to high - std::sort(resistanceHeightMap.begin(),resistanceHeightMap.end(), - [](const HPWH::resPoint & a,const HPWH::resPoint & b) -> bool { - return a.position < b.position; // (5 < 5) // evaluates to false - }); -} +bool HPWH::isSetpointFixed() const { return setpointFixed; } -// Used to check a few inputs after the initialization of a tank model from a preset or a file. -int HPWH::checkInputs() { - int returnVal = 0; - //use a returnVal so that all checks are processed and error messages written - - if(getNumHeatSources() <= 0 && hpwhModel != MODELS_StorageTank) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You must have at least one HeatSource.\n"); - } - returnVal = HPWH_ABORT; - } - - double condensitySum; - //loop through all heat sources to check each for malconfigurations - for(int i = 0; i < getNumHeatSources(); i++) { - //check the heat source type to make sure it has been set - if(heatSources[i].typeOfHeatSource == TYPE_none) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Heat source %d does not have a specified type. Initialization failed.\n",i); - } - returnVal = HPWH_ABORT; - } - //check to make sure there is at least one onlogic or parent with onlogic - int parent = heatSources[i].findParent(); - if(heatSources[i].turnOnLogicSet.size() == 0 && (parent == -1 || heatSources[parent].turnOnLogicSet.size() == 0)) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("You must specify at least one logic to turn on the element or the element must be set as a backup for another heat source with at least one logic."); - } - returnVal = HPWH_ABORT; - } - - // Validate on logics - for(std::shared_ptr logic : heatSources[i].turnOnLogicSet) { - if(!logic->isValid()) { - returnVal = HPWH_ABORT; - if(hpwhVerbosity >= VRB_reluctant) { - msg("On logic at index %i is invalid",i); - } - } - } - // Validate off logics - for(std::shared_ptr logic : heatSources[i].shutOffLogicSet) { - if(!logic->isValid()) { - returnVal = HPWH_ABORT; - if(hpwhVerbosity >= VRB_reluctant) { - msg("Off logic at index %i is invalid",i); - } - } - } - - //check is condensity sums to 1 - condensitySum = 0; - - for(int j = 0; j < heatSources[i].getCondensitySize(); j++) condensitySum += heatSources[i].condensity[j]; - if(fabs(condensitySum - 1.0) > 1e-6) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The condensity for heatsource %d does not sum to 1. \n",i); - msg("It sums to %f \n",condensitySum); - } - returnVal = HPWH_ABORT; - } - //check that air flows are all set properly - if(heatSources[i].airflowFreedom > 1.0 || heatSources[i].airflowFreedom <= 0.0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The airflowFreedom must be between 0 and 1 for heatsource %d. \n",i); - } - returnVal = HPWH_ABORT; - } - - if(heatSources[i].isACompressor()) { - if(heatSources[i].doDefrost) { - if(heatSources[i].defrostMap.size() < 3) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Defrost logic set to true but no valid defrost map of length 3 or greater set. \n"); - } - returnVal = HPWH_ABORT; - } - if(heatSources[i].configuration != HeatSource::CONFIG_EXTERNAL) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Defrost is only simulated for external compressors. \n"); - } - returnVal = HPWH_ABORT; - } - } - } - if(heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) { - - if(heatSources[i].shutOffLogicSet.size() != 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("External heat sources can only have one shut off logic. \n "); - } - returnVal = HPWH_ABORT; - } - if(0 > heatSources[i].externalOutletHeight || heatSources[i].externalOutletHeight > getNumNodes() - 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("External heat sources need an external outlet height within the bounds from from 0 to numNodes-1. \n"); - } - returnVal = HPWH_ABORT; - } - if(0 > heatSources[i].externalInletHeight || heatSources[i].externalInletHeight > getNumNodes() - 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("External heat sources need an external inlet height within the bounds from from 0 to numNodes-1. \n"); - } - returnVal = HPWH_ABORT; - } - } else { - if(heatSources[i].secondaryHeatExchanger.extraPumpPower_W != 0 || heatSources[i].secondaryHeatExchanger.extraPumpPower_W) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Heatsource %d is not an external heat source but has an external secondary heat exchanger. \n",i); - } - returnVal = HPWH_ABORT; - } - } - - - // Check performance map - // perfGrid and perfGridValues, and the length of vectors in perfGridValues are equal and that ; - if(heatSources[i].useBtwxtGrid) { - // If useBtwxtGrid is true that the perfMap is empty - if(heatSources[i].perfMap.size() != 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Using the grid lookups but a regression based perforamnce map is given \n"); - } - returnVal = HPWH_ABORT; - } - - // Check length of vectors in perfGridValue are equal - if(heatSources[i].perfGridValues[0].size() != heatSources[i].perfGridValues[1].size() - && heatSources[i].perfGridValues[0].size() != 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("When using grid lookups for perfmance the vectors in perfGridValues must be the same length. \n"); - } - returnVal = HPWH_ABORT; - } - - // Check perfGrid's vectors lengths multiplied together == the perfGridValues vector lengths - size_t expLength = 1; - for(const auto& v : heatSources[i].perfGrid) - { - expLength *= v.size(); - } - if(expLength != heatSources[i].perfGridValues[0].size()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("When using grid lookups for perfmance the vectors in perfGridValues must be the same length. \n"); - } - returnVal = HPWH_ABORT; - } - } else { - // Check that perfmap only has 1 point if config_external and multipass - if(heatSources[i].isExternalMultipass() && heatSources[i].perfMap.size() != 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("External multipass heat sources must have a perfMap of only one point with regression equations. \n"); - } - returnVal = HPWH_ABORT; - } - } - } - - // Check that the on logic and off logics are ordered properly - if(hasACompressor()) { - double aquaF = 0.,useF = 1.; - getSizingFractions(aquaF,useF); - if(aquaF < (1. - useF)) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The relationship between the on logic and off logic is not supported. The off logic is beneath the on logic."); - } - returnVal = HPWH_ABORT; - } - } - - double maxTemp; string why; - double tempSetpoint = setpoint_C; - if(!isNewSetpointPossible(tempSetpoint,maxTemp,why)) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Cannot set new setpoint. %s",why.c_str()); - } - returnVal = HPWH_ABORT; - } - - //Check if the UA is out of bounds - if(tankUA_kJperHrC < 0.0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("The tankUA_kJperHrC is less than 0 for a HPWH, it must be greater than 0, tankUA_kJperHrC is: %f \n",tankUA_kJperHrC); - } - returnVal = HPWH_ABORT; - } - - // Check single-node heat-exchange effectiveness validity - if( heatExchangerEffectiveness > 1.) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Heat-exchanger effectiveness cannot exceed 1.\n"); - } - returnVal = HPWH_ABORT; - } - - //if there's no failures, return 0 - return returnVal; -} - -bool HPWH::shouldDRLockOut(HEATSOURCE_TYPE hs,DRMODES DR_signal) const { - - if(hs == TYPE_compressor && (DR_signal & DR_LOC) != 0) { - return true; - } else if(hs == TYPE_resistance && (DR_signal & DR_LOR) != 0) { - return true; - } - return false; -} - -void HPWH::resetTopOffTimer() { - timerTOT = 0.; -} +int HPWH::setSetpoint(double newSetpoint, UNITS units /*=UNITS_C*/) +{ -//----------------------------------------------------------------------------- -/// @brief Checks whether energy is balanced during a simulation step. + double newSetpoint_C, temp; + string why; + if (units == UNITS_C) + { + newSetpoint_C = newSetpoint; + } + else if (units == UNITS_F) + { + newSetpoint_C = F_TO_C(newSetpoint); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for setSetpoint. \n"); + } + return HPWH_ABORT; + } + if (!isNewSetpointPossible(newSetpoint_C, temp, why)) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Unwilling to set this setpoint for the currently selected model, max setpoint is " + "%f C. %s\n", + temp, + why.c_str()); + } + return HPWH_ABORT; + } + + setpoint_C = newSetpoint_C; + + return 0; +} + +double HPWH::getSetpoint(UNITS units /*=UNITS_C*/) const +{ + if (units == UNITS_C) + { + return setpoint_C; + } + else if (units == UNITS_F) + { + return C_TO_F(setpoint_C); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getSetpoint. \n"); + } + return HPWH_ABORT; + } +} + +double HPWH::getMaxCompressorSetpoint(UNITS units /*=UNITS_C*/) const +{ + + if (!hasACompressor()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Unit does not have a compressor \n"); + } + return HPWH_ABORT; + } + + double returnVal = heatSources[compressorIndex].maxSetpoint_C; + if (units == UNITS_C) + { + returnVal = returnVal; + } + else if (units == UNITS_F) + { + returnVal = C_TO_F(returnVal); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getMaxCompressorSetpoint. \n"); + } + return HPWH_ABORT; + } + return returnVal; +} + +bool HPWH::isNewSetpointPossible(double newSetpoint, + double& maxAllowedSetpoint, + string& why, + UNITS units /*=UNITS_C*/) const +{ + double newSetpoint_C; + double maxAllowedSetpoint_C = -273.15; + if (units == UNITS_C) + { + newSetpoint_C = newSetpoint; + } + else if (units == UNITS_F) + { + newSetpoint_C = F_TO_C(newSetpoint); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for isNewSetpointPossible. \n"); + } + return false; + } + bool returnVal = false; + + if (isSetpointFixed()) + { + returnVal = (newSetpoint == setpoint_C); + maxAllowedSetpoint_C = setpoint_C; + if (!returnVal) + { + why = "The set point is fixed for the currently selected model."; + } + } + else + { + + if (hasACompressor()) + { // If there's a compressor lets check the new setpoint against the compressor's max + // setpoint + + maxAllowedSetpoint_C = + heatSources[compressorIndex].maxSetpoint_C - + heatSources[compressorIndex].secondaryHeatExchanger.hotSideTemperatureOffset_dC; + + if (newSetpoint_C > maxAllowedSetpoint_C && lowestElementIndex == -1) + { + why = "The compressor cannot meet the setpoint temperature and there is no " + "resistance backup."; + returnVal = false; + } + else + { + returnVal = true; + } + } + if (lowestElementIndex >= 0) + { // If there's a resistance element lets check the new setpoint against the its max + // setpoint + maxAllowedSetpoint_C = heatSources[lowestElementIndex].maxSetpoint_C; + + if (newSetpoint_C > maxAllowedSetpoint_C) + { + why = "The resistance elements cannot produce water this hot."; + returnVal = false; + } + else + { + returnVal = true; + } + } + else if (lowestElementIndex == -1 && !hasACompressor()) + { // There are no heat sources here! + if (hpwhModel == MODELS_StorageTank) + { + returnVal = true; // The one pass the storage tank doesn't have any heating elements + // so sure change the setpoint it does nothing! + } + else + { + why = "There aren't any heat sources to check the new setpoint against!"; + returnVal = false; + } + } + } + + if (units == UNITS_C) + { + maxAllowedSetpoint = maxAllowedSetpoint_C; + } + else if (units == UNITS_F) + { + maxAllowedSetpoint = C_TO_F(maxAllowedSetpoint_C); + } + return returnVal; +} + +double HPWH::calcSoCFraction(double tMains_C, double tMinUseful_C, double tMax_C) const +{ + // Note that volume is ignored in here since with even nodes it cancels out of the SoC + // fractional equation + if (tMains_C >= tMinUseful_C) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("tMains_C is greater than or equal tMinUseful_C. \n"); + } + return HPWH_ABORT; + } + if (tMinUseful_C > tMax_C) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("tMinUseful_C is greater tMax_C. \n"); + } + return HPWH_ABORT; + } + + double chargeEquivalent = 0.; + for (auto& T : tankTemps_C) + { + chargeEquivalent += getChargePerNode(tMains_C, tMinUseful_C, T); + } + double maxSoC = getNumNodes() * getChargePerNode(tMains_C, tMinUseful_C, tMax_C); + return chargeEquivalent / maxSoC; +} + +double HPWH::getSoCFraction() const { return currentSoCFraction; } + +void HPWH::calcAndSetSoCFraction() +{ + double newSoCFraction = -1.; + + std::shared_ptr logicSoC = + std::dynamic_pointer_cast( + heatSources[compressorIndex].turnOnLogicSet[0]); + newSoCFraction = calcSoCFraction(logicSoC->getMainsT_C(), logicSoC->getTempMinUseful_C()); + + currentSoCFraction = newSoCFraction; +} + +double HPWH::getChargePerNode(double tCold, double tMix, double tHot) const +{ + if (tHot < tMix) + { + return 0.; + } + return (tHot - tCold) / (tMix - tCold); +} + +double HPWH::getMinOperatingTemp(UNITS units /*=UNITS_C*/) const +{ + if (!hasACompressor()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("No compressor found in this HPWH. \n"); + } + return HPWH_ABORT; + } + if (units == UNITS_C) + { + return heatSources[compressorIndex].minT; + } + else if (units == UNITS_F) + { + return C_TO_F(heatSources[compressorIndex].minT); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getMinOperatingTemp.\n"); + } + return HPWH_ABORT; + } +} + +int HPWH::resetTankToSetpoint() { return setTankToTemperature(setpoint_C); } + +int HPWH::setTankToTemperature(double temp_C) { return setTankLayerTemperatures({temp_C}); } + +//----------------------------------------------------------------------------- +/// @brief Assigns new temps provided from a std::vector to tankTemps_C. +/// @param[in] setTankTemps new tank temps (arbitrary non-zero size) +/// @param[in] units temp units in setTankTemps (default = UNITS_C) +/// @return Success: 0; Failure: HPWH_ABORT +//----------------------------------------------------------------------------- +int HPWH::setTankLayerTemperatures(std::vector setTankTemps, const UNITS units) +{ + if ((units != UNITS_C) && (units != UNITS_F)) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for setSetpoint. \n"); + } + return HPWH_ABORT; + } + + std::size_t numSetNodes = setTankTemps.size(); + if (numSetNodes == 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("No temperatures provided.\n"); + } + return HPWH_ABORT; + } + + // convert setTankTemps to °C, if necessary + if (units == UNITS_F) + for (auto& T : setTankTemps) + T = F_TO_C(T); + + // set node temps + if (!resampleIntensive(tankTemps_C, setTankTemps)) + return HPWH_ABORT; + + return 0; +} + +void HPWH::getTankTemps(std::vector& tankTemps) { tankTemps = tankTemps_C; } + +int HPWH::setAirFlowFreedom(double fanFraction) +{ + if (fanFraction < 0 || fanFraction > 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to set the fan fraction outside of bounds. \n"); + } + simHasFailed = true; + return HPWH_ABORT; + } + else + { + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isACompressor()) + { + heatSources[i].airflowFreedom = fanFraction; + } + } + } + return 0; +} + +int HPWH::setDoTempDepression(bool doTempDepress) +{ + this->doTempDepression = doTempDepress; + return 0; +} + +int HPWH::setTankSize_adjustUA(double HPWH_size, + UNITS units /*=UNITS_L*/, + bool forceChange /*=false*/) +{ + // Uses the UA before the function is called and adjusts the A part of the UA to match the input + // volume given getTankSurfaceArea(). + double HPWH_size_L; + double oldA = getTankSurfaceArea(UNITS_FT2); + + if (units == UNITS_L) + { + HPWH_size_L = HPWH_size; + } + else if (units == UNITS_GAL) + { + HPWH_size_L = GAL_TO_L(HPWH_size); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for setTankSize_adjustUA. \n"); + } + return HPWH_ABORT; + } + setTankSize(HPWH_size_L, UNITS_L, forceChange); + setUA(tankUA_kJperHrC / oldA * getTankSurfaceArea(UNITS_FT2), UNITS_kJperHrC); + return 0; +} + +/*static*/ double +HPWH::getTankSurfaceArea(double vol, UNITS volUnits /*=UNITS_L*/, UNITS surfAUnits /*=UNITS_FT2*/) +{ + // returns tank surface area, old defualt was in ft2 + // Based off 88 insulated storage tanks currently available on the market from Sanden, AOSmith, + // HTP, Rheem, and Niles. Corresponds to the inner tank with volume tankVolume_L with the + // assumption that the aspect ratio is the same as the outer dimenisions of the whole unit. + double radius = getTankRadius(vol, volUnits, UNITS_FT); + + double value = 2. * 3.14159 * pow(radius, 2) * (ASPECTRATIO + 1.); + + if (value >= 0.) + { + if (surfAUnits == UNITS_M2) + value = FT2_TO_M2(value); + else if (surfAUnits != UNITS_FT2) + value = -1.; + } + return value; +} + +double HPWH::getTankSurfaceArea(UNITS units /*=UNITS_FT2*/) const +{ + // returns tank surface area, old defualt was in ft2 + // Based off 88 insulated storage tanks currently available on the market from Sanden, AOSmith, + // HTP, Rheem, and Niles. Corresponds to the inner tank with volume tankVolume_L with the + // assumption that the aspect ratio is the same as the outer dimenisions of the whole unit. + double value = getTankSurfaceArea(tankVolume_L, UNITS_L, units); + if (value < 0.) + { + if (hpwhVerbosity >= VRB_reluctant) + msg("Incorrect unit specification for getTankSurfaceArea. \n"); + value = HPWH_ABORT; + } + return value; +} + +/*static*/ double +HPWH::getTankRadius(double vol, UNITS volUnits /*=UNITS_L*/, UNITS radiusUnits /*=UNITS_FT*/) +{ // returns tank radius, ft for use in calculation of heat loss in the bottom and top of the tank. + // Based off 88 insulated storage tanks currently available on the market from Sanden, AOSmith, + // HTP, Rheem, and Niles, assumes the aspect ratio for the outer measurements is the same is the + // actual tank. + double volft3 = volUnits == UNITS_L ? L_TO_FT3(vol) + : volUnits == UNITS_GAL ? L_TO_FT3(GAL_TO_L(vol)) + : -1.; + + double value = -1.; + if (volft3 >= 0.) + { + value = pow(volft3 / 3.14159 / ASPECTRATIO, 1. / 3.); + if (radiusUnits == UNITS_M) + value = FT_TO_M(value); + else if (radiusUnits != UNITS_FT) + value = -1.; + } + return value; +} + +double HPWH::getTankRadius(UNITS units /*=UNITS_FT*/) const +{ + // returns tank radius, ft for use in calculation of heat loss in the bottom and top of the + // tank. Based off 88 insulated storage tanks currently available on the market from Sanden, + // AOSmith, HTP, Rheem, and Niles, assumes the aspect ratio for the outer measurements is the + // same is the actual tank. + + double value = getTankRadius(tankVolume_L, UNITS_L, units); + + if (value < 0.) + { + if (hpwhVerbosity >= VRB_reluctant) + msg("Incorrect unit specification for getTankRadius. \n"); + value = HPWH_ABORT; + } + return value; +} + +bool HPWH::isTankSizeFixed() const { return tankSizeFixed; } + +int HPWH::setTankSize(double HPWH_size, UNITS units /*=UNITS_L*/, bool forceChange /*=false*/) +{ + if (isTankSizeFixed() && !forceChange) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Can not change the tank size for your currently selected model. \n"); + } + return HPWH_ABORT; + } + if (HPWH_size <= 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to set the tank volume outside of bounds. \n"); + } + simHasFailed = true; + return HPWH_ABORT; + } + else + { + if (units == UNITS_L) + { + this->tankVolume_L = HPWH_size; + } + else if (units == UNITS_GAL) + { + this->tankVolume_L = (GAL_TO_L(HPWH_size)); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for setTankSize. \n"); + } + return HPWH_ABORT; + } + } + + calcSizeConstants(); + + return 0; +} +int HPWH::setDoInversionMixing(bool doInversionMixing_in) +{ + doInversionMixing = doInversionMixing_in; + return 0; +} +int HPWH::setDoConduction(bool doConduction_in) +{ + doConduction = doConduction_in; + return 0; +} + +int HPWH::setUA(double UA, UNITS units /*=UNITS_kJperHrC*/) +{ + if (units == UNITS_kJperHrC) + { + tankUA_kJperHrC = UA; + } + else if (units == UNITS_BTUperHrF) + { + tankUA_kJperHrC = UAf_TO_UAc(UA); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for setUA. \n"); + } + return HPWH_ABORT; + } + return 0; +} + +int HPWH::getUA(double& UA, UNITS units /*=UNITS_kJperHrC*/) const +{ + UA = tankUA_kJperHrC; + if (units == UNITS_kJperHrC) + { + // UA is already in correct units + } + else if (units == UNITS_BTUperHrF) + { + UA = UA / UAf_TO_UAc(1.); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getUA. \n"); + } + UA = -1.; + return HPWH_ABORT; + } + return 0; +} + +int HPWH::setFittingsUA(double UA, UNITS units /*=UNITS_kJperHrC*/) +{ + if (units == UNITS_kJperHrC) + { + fittingsUA_kJperHrC = UA; + } + else if (units == UNITS_BTUperHrF) + { + fittingsUA_kJperHrC = UAf_TO_UAc(UA); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for setFittingsUA. \n"); + } + return HPWH_ABORT; + } + return 0; +} +int HPWH::getFittingsUA(double& UA, UNITS units /*=UNITS_kJperHrC*/) const +{ + UA = fittingsUA_kJperHrC; + if (units == UNITS_kJperHrC) + { + // UA is already in correct units + } + else if (units == UNITS_BTUperHrF) + { + UA = UA / UAf_TO_UAc(1.); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getUA. \n"); + } + UA = -1.; + return HPWH_ABORT; + } + return 0; +} + +int HPWH::setInletByFraction(double fractionalHeight) +{ + return setNodeNumFromFractionalHeight(fractionalHeight, inletHeight); +} +int HPWH::setInlet2ByFraction(double fractionalHeight) +{ + return setNodeNumFromFractionalHeight(fractionalHeight, inlet2Height); +} + +int HPWH::setExternalInletHeightByFraction(double fractionalHeight) +{ + return setExternalPortHeightByFraction(fractionalHeight, 1); +} +int HPWH::setExternalOutletHeightByFraction(double fractionalHeight) +{ + return setExternalPortHeightByFraction(fractionalHeight, 2); +} + +int HPWH::setExternalPortHeightByFraction(double fractionalHeight, int whichExternalPort) +{ + if (!hasExternalHeatSource()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Does not have an external heat source \n"); + } + return HPWH_ABORT; + } + + int returnVal = 0; + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) + { + if (whichExternalPort == 1) + { + returnVal = setNodeNumFromFractionalHeight(fractionalHeight, + heatSources[i].externalInletHeight); + } + else + { + returnVal = setNodeNumFromFractionalHeight(fractionalHeight, + heatSources[i].externalOutletHeight); + } + + if (returnVal == HPWH_ABORT) + { + return returnVal; + } + } + } + return returnVal; +} + +int HPWH::setNodeNumFromFractionalHeight(double fractionalHeight, int& inletNum) +{ + if (fractionalHeight > 1. || fractionalHeight < 0.) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Out of bounds fraction for setInletByFraction \n"); + } + return HPWH_ABORT; + } + + int node = (int)std::floor(getNumNodes() * fractionalHeight); + inletNum = (node == getNumNodes()) ? getIndexTopNode() : node; + + return 0; +} + +int HPWH::getExternalInletHeight() const +{ + if (!hasExternalHeatSource()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Does not have an external heat source \n"); + } + return HPWH_ABORT; + } + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) + { + return heatSources[i].externalInletHeight; // Return the first one since all external + // sources have some ports + } + } + return HPWH_ABORT; +} +int HPWH::getExternalOutletHeight() const +{ + if (!hasExternalHeatSource()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Does not have an external heat source \n"); + } + return HPWH_ABORT; + } + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) + { + return heatSources[i].externalOutletHeight; // Return the first one since all external + // sources have some ports + } + } + return HPWH_ABORT; +} + +int HPWH::setTimerLimitTOT(double limit_min) +{ + if (limit_min > 24. * 60. || limit_min < 0.) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Out of bounds time limit for setTimerLimitTOT \n"); + } + return HPWH_ABORT; + } + + timerLimitTOT = limit_min; + + return 0; +} + +double HPWH::getTimerLimitTOT_minute() const { return timerLimitTOT; } + +int HPWH::getInletHeight(int whichInlet) const +{ + if (whichInlet == 1) + { + return inletHeight; + } + else if (whichInlet == 2) + { + return inlet2Height; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Invalid inlet chosen in getInletHeight \n"); + } + return HPWH_ABORT; + } +} + +int HPWH::setMaxTempDepression(double maxDepression, UNITS units /*=UNITS_C*/) +{ + if (units == UNITS_C) + { + maxDepression_C = maxDepression; + } + else if (units == UNITS_F) + { + maxDepression_C = F_TO_C(maxDepression); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for max Temp Depression. \n"); + } + return HPWH_ABORT; + } + return 0; +} + +bool HPWH::hasEnteringWaterHighTempShutOff(int heatSourceIndex) +{ + bool retVal = false; + if (heatSourceIndex >= getNumHeatSources() || heatSourceIndex < 0) + { + return retVal; + } + if (heatSources[heatSourceIndex].shutOffLogicSet.size() == 0) + { + return retVal; + } + + for (std::shared_ptr shutOffLogic : heatSources[heatSourceIndex].shutOffLogicSet) + { + if (shutOffLogic->getIsEnteringWaterHighTempShutoff()) + { + retVal = true; + break; + } + } + return retVal; +} + +int HPWH::setEnteringWaterHighTempShutOff(double highTemp, + bool tempIsAbsolute, + int heatSourceIndex, + UNITS unit /*=UNITS_C*/) +{ + if (!hasEnteringWaterHighTempShutOff(heatSourceIndex)) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to acess a heating logic that does not exist. \n"); + } + return HPWH_ABORT; + } + + double highTemp_C; + if (unit == UNITS_C) + { + highTemp_C = highTemp; + } + else if (unit == UNITS_F) + { + highTemp_C = F_TO_C(highTemp); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for set Entering Water High Temp Shut Off. \n"); + } + return HPWH_ABORT; + } + + bool highTempIsNotValid = false; + if (tempIsAbsolute) + { + // check differnce with setpoint + if (setpoint_C - highTemp_C < MINSINGLEPASSLIFT) + { + highTempIsNotValid = true; + } + } + else + { + if (highTemp_C < MINSINGLEPASSLIFT) + { + highTempIsNotValid = true; + } + } + if (highTempIsNotValid) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("High temperature shut off is too close to the setpoint, excpected a minimum " + "difference of %.2lf.\n", + MINSINGLEPASSLIFT); + } + return HPWH_ABORT; + } + + for (std::shared_ptr shutOffLogic : heatSources[heatSourceIndex].shutOffLogicSet) + { + if (shutOffLogic->getIsEnteringWaterHighTempShutoff()) + { + std::dynamic_pointer_cast(shutOffLogic) + ->setDecisionPoint(highTemp_C, tempIsAbsolute); + break; + } + } + return 0; +} + +int HPWH::setTargetSoCFraction(double target) +{ + if (!isSoCControlled()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Can not set target state of charge if HPWH is not using state of charge " + "controls."); + } + return HPWH_ABORT; + } + if (target < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Can not set a negative target state of charge."); + } + return HPWH_ABORT; + } + + for (int i = 0; i < getNumHeatSources(); i++) + { + for (std::shared_ptr logic : heatSources[i].shutOffLogicSet) + { + if (!logic->getIsEnteringWaterHighTempShutoff()) + { + logic->setDecisionPoint(target); + } + } + for (std::shared_ptr logic : heatSources[i].turnOnLogicSet) + { + logic->setDecisionPoint(target); + } + } + return 0; +} + +bool HPWH::isSoCControlled() const { return usesSoCLogic; } + +bool HPWH::canUseSoCControls() +{ + bool retVal = true; + if (getCompressorCoilConfig() != HPWH::HeatSource::CONFIG_EXTERNAL) + { + retVal = false; + } + return retVal; +} + +int HPWH::switchToSoCControls(double targetSoC, + double hysteresisFraction /*= 0.05*/, + double tempMinUseful /*= 43.333*/, + bool constantMainsT /*= false*/, + double mainsT /*= 18.333*/, + UNITS tempUnit /*= UNITS_C*/) +{ + if (!canUseSoCControls()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Cannot set up state of charge controls for integrated or wrapped HPWHs.\n"); + } + return HPWH_ABORT; + } + + double tempMinUseful_C, mainsT_C; + if (tempUnit == UNITS_C) + { + tempMinUseful_C = tempMinUseful; + mainsT_C = mainsT; + } + else if (tempUnit == UNITS_F) + { + tempMinUseful_C = F_TO_C(tempMinUseful); + mainsT_C = F_TO_C(mainsT); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for set Enterinh Water High Temp Shut Off.\n"); + } + return HPWH_ABORT; + } + + if (mainsT_C >= tempMinUseful_C) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The mains temperature can't be equal to or greater than the minimum useful " + "temperature.\n"); + } + return HPWH_ABORT; + } + + for (int i = 0; i < getNumHeatSources(); i++) + { + heatSources[i].clearAllTurnOnLogic(); + + heatSources[i].shutOffLogicSet.erase( + std::remove_if(heatSources[i].shutOffLogicSet.begin(), + heatSources[i].shutOffLogicSet.end(), + [&](const auto logic) -> bool + { return !logic->getIsEnteringWaterHighTempShutoff(); }), + heatSources[i].shutOffLogicSet.end()); + + heatSources[i].shutOffLogicSet.push_back(shutOffSoC("SoC Shut Off", + targetSoC, + hysteresisFraction, + tempMinUseful_C, + constantMainsT, + mainsT_C)); + heatSources[i].turnOnLogicSet.push_back(turnOnSoC("SoC Turn On", + targetSoC, + hysteresisFraction, + tempMinUseful_C, + constantMainsT, + mainsT_C)); + } + + usesSoCLogic = true; + + return 0; +} + +std::shared_ptr HPWH::turnOnSoC(string desc, + double targetSoC, + double hystFract, + double tempMinUseful_C, + bool constantMainsT, + double mainsT_C) +{ + return std::make_shared( + desc, targetSoC, this, -hystFract, tempMinUseful_C, constantMainsT, mainsT_C); +} + +std::shared_ptr HPWH::shutOffSoC(string desc, + double targetSoC, + double hystFract, + double tempMinUseful_C, + bool constantMainsT, + double mainsT_C) +{ + return std::make_shared(desc, + targetSoC, + this, + hystFract, + tempMinUseful_C, + constantMainsT, + mainsT_C, + std::greater()); +} + +//----------------------------------------------------------------------------- +/// @brief Builds a vector of logic node weights referred to a fixed number of +/// nodes given by LOGIC_NODE_SIZE. +/// @param[in] bottomFraction Lower bounding fraction (0 to 1) +/// @param[in] topFraction Upper bounding fraction (0 to 1) +/// @return vector of node weights +//----------------------------------------------------------------------------- +std::vector HPWH::getNodeWeightRange(double bottomFraction, double topFraction) +{ + std::vector nodeWeights; + if (topFraction < bottomFraction) + std::swap(bottomFraction, topFraction); + auto bottomIndex = static_cast(bottomFraction * LOGIC_NODE_SIZE); + auto topIndex = static_cast(topFraction * LOGIC_NODE_SIZE); + for (auto index = bottomIndex; index < topIndex; ++index) + { + nodeWeights.emplace_back(static_cast(index) + 1); + } + return nodeWeights; +} + +std::shared_ptr HPWH::wholeTank(double decisionPoint, + const UNITS units /* = UNITS_C */, + const bool absolute /* = false */) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1.); + double decisionPoint_C = convertTempToC(decisionPoint, units, absolute); + return std::make_shared( + "whole tank", nodeWeights, decisionPoint_C, this, absolute); +} + +std::shared_ptr HPWH::topThird(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(2. / 3., 1.); + return std::make_shared( + "top third", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::topThird_absolute(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(2. / 3., 1.); + return std::make_shared( + "top third absolute", nodeWeights, decisionPoint, this, true); +} + +std::shared_ptr HPWH::secondThird(double decisionPoint, + const UNITS units /* = UNITS_C */, + const bool absolute /* = false */) +{ + std::vector nodeWeights = getNodeWeightRange(1. / 3., 2. / 3.); + double decisionPoint_C = convertTempToC(decisionPoint, units, absolute); + return std::make_shared( + "second third", nodeWeights, decisionPoint_C, this, absolute); +} + +std::shared_ptr HPWH::bottomThird(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 3.); + return std::make_shared( + "bottom third", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::bottomSixth(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 6.); + return std::make_shared( + "bottom sixth", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::bottomSixth_absolute(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 6.); + return std::make_shared( + "bottom sixth absolute", nodeWeights, decisionPoint, this, true); +} + +std::shared_ptr HPWH::secondSixth(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(1. / 6., 2. / 6.); + return std::make_shared( + "second sixth", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::thirdSixth(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(2. / 6., 3. / 6.); + return std::make_shared( + "third sixth", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::fourthSixth(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(3. / 6., 4. / 6.); + return std::make_shared( + "fourth sixth", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::fifthSixth(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(4. / 6., 5. / 6.); + return std::make_shared( + "fifth sixth", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::topSixth(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(5. / 6., 1.); + return std::make_shared( + "top sixth", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::bottomHalf(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 2.); + return std::make_shared( + "bottom half", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::bottomTwelfth(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 12.); + return std::make_shared( + "bottom twelfth", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::standby(double decisionPoint) +{ + std::vector nodeWeights; + nodeWeights.emplace_back(LOGIC_NODE_SIZE + 1); // uses very top computation node + return std::make_shared( + "standby", nodeWeights, decisionPoint, this); +} + +std::shared_ptr HPWH::topNodeMaxTemp(double decisionPoint) +{ + std::vector nodeWeights; + nodeWeights.emplace_back(LOGIC_NODE_SIZE + 1); // uses very top computation node + return std::make_shared( + "top node", nodeWeights, decisionPoint, this, true, std::greater()); +} + +std::shared_ptr +HPWH::bottomNodeMaxTemp(double decisionPoint, bool isEnteringWaterHighTempShutoff /*=false*/) +{ + std::vector nodeWeights; + nodeWeights.emplace_back(0); // uses very bottom computation node + return std::make_shared("bottom node", + nodeWeights, + decisionPoint, + this, + true, + std::greater(), + isEnteringWaterHighTempShutoff); +} + +std::shared_ptr HPWH::bottomTwelfthMaxTemp(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 12.); + return std::make_shared( + "bottom twelfth", nodeWeights, decisionPoint, this, true, std::greater()); +} + +std::shared_ptr HPWH::topThirdMaxTemp(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(2. / 3., 1.); + return std::make_shared( + "top third", nodeWeights, decisionPoint, this, true, std::greater()); +} + +std::shared_ptr HPWH::bottomSixthMaxTemp(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 6.); + return std::make_shared( + "bottom sixth", nodeWeights, decisionPoint, this, true, std::greater()); +} + +std::shared_ptr HPWH::secondSixthMaxTemp(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(1. / 6., 2. / 6.); + return std::make_shared( + "second sixth", nodeWeights, decisionPoint, this, true, std::greater()); +} + +std::shared_ptr HPWH::fifthSixthMaxTemp(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(4. / 6., 5. / 6.); + return std::make_shared( + "top sixth", nodeWeights, decisionPoint, this, true, std::greater()); +} + +std::shared_ptr HPWH::topSixthMaxTemp(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(5. / 6., 1.); + return std::make_shared( + "top sixth", nodeWeights, decisionPoint, this, true, std::greater()); +} + +std::shared_ptr HPWH::largeDraw(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 4.); + return std::make_shared( + "large draw", nodeWeights, decisionPoint, this, true); +} + +std::shared_ptr HPWH::largerDraw(double decisionPoint) +{ + std::vector nodeWeights = getNodeWeightRange(0., 1. / 2.); + return std::make_shared( + "larger draw", nodeWeights, decisionPoint, this, true); +} + +void HPWH::setNumNodes(const std::size_t num_nodes) +{ + tankTemps_C.resize(num_nodes); + nextTankTemps_C.resize(num_nodes); +} + +int HPWH::getNumNodes() const { return static_cast(tankTemps_C.size()); } + +int HPWH::getIndexTopNode() const { return getNumNodes() - 1; } + +double HPWH::getTankNodeTemp(int nodeNum, UNITS units /*=UNITS_C*/) const +{ + if (tankTemps_C.empty()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to access the temperature of a tank node that does not exist. " + "\n"); + } + return double(HPWH_ABORT); + } + else + { + double result = tankTemps_C[nodeNum]; + // if (result == double(HPWH_ABORT)) { can't happen? + // return result; + // } + if (units == UNITS_C) + { + return result; + } + else if (units == UNITS_F) + { + return C_TO_F(result); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getTankNodeTemp. \n"); + } + return double(HPWH_ABORT); + } + } +} + +double HPWH::getNthSimTcouple(int iTCouple, int nTCouple, UNITS units /*=UNITS_C*/) const +{ + if (iTCouple > nTCouple || iTCouple < 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to access a simulated thermocouple that does not exist. \n"); + } + return double(HPWH_ABORT); + } + double beginFraction = static_cast(iTCouple - 1.) / static_cast(nTCouple); + double endFraction = static_cast(iTCouple) / static_cast(nTCouple); + + double simTcoupleTemp_C = getResampledValue(tankTemps_C, beginFraction, endFraction); + if (units == UNITS_C) + { + return simTcoupleTemp_C; + } + else if (units == UNITS_F) + { + return C_TO_F(simTcoupleTemp_C); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getNthSimTcouple. \n"); + } + return double(HPWH_ABORT); + } +} + +int HPWH::getNumHeatSources() const { return static_cast(heatSources.size()); } + +int HPWH::getCompressorIndex() const { return compressorIndex; } + +int HPWH::getNumResistanceElements() const +{ + int count = 0; + for (int i = 0; i < getNumHeatSources(); i++) + { + count += heatSources[i].isAResistance() ? 1 : 0; + } + return count; +} + +double HPWH::getCompressorCapacity(double airTemp /*=19.722*/, + double inletTemp /*=14.444*/, + double outTemp /*=57.222*/, + UNITS pwrUnit /*=UNITS_KW*/, + UNITS tempUnit /*=UNITS_C*/) +{ + // calculate capacity btu/hr, input btu/hr, and cop + double capTemp_BTUperHr, inputTemp_BTUperHr, copTemp; // temporary variables + double airTemp_C, inletTemp_C, outTemp_C; + + if (!hasACompressor()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Current model does not have a compressor. \n"); + } + return double(HPWH_ABORT); + } + + if (tempUnit == UNITS_C) + { + airTemp_C = airTemp; + inletTemp_C = inletTemp; + outTemp_C = outTemp; + } + else if (tempUnit == UNITS_F) + { + airTemp_C = F_TO_C(airTemp); + inletTemp_C = F_TO_C(inletTemp); + outTemp_C = F_TO_C(outTemp); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for temperatures in getCompressorCapacity. \n"); + } + return double(HPWH_ABORT); + } + + if (airTemp_C < heatSources[compressorIndex].minT || + airTemp_C > heatSources[compressorIndex].maxT) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The compress does not operate at the specified air temperature. \n"); + } + return double(HPWH_ABORT); + } + + double maxAllowedSetpoint_C = + heatSources[compressorIndex].maxSetpoint_C - + heatSources[compressorIndex].secondaryHeatExchanger.hotSideTemperatureOffset_dC; + if (outTemp_C > maxAllowedSetpoint_C) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Inputted outlet temperature of the compressor is higher than can be produced."); + } + return double(HPWH_ABORT); + } + + if (heatSources[compressorIndex].isExternalMultipass()) + { + double averageTemp_C = (outTemp_C + inletTemp_C) / 2.; + heatSources[compressorIndex].getCapacityMP( + airTemp_C, averageTemp_C, inputTemp_BTUperHr, capTemp_BTUperHr, copTemp); + } + else + { + heatSources[compressorIndex].getCapacity( + airTemp_C, inletTemp_C, outTemp_C, inputTemp_BTUperHr, capTemp_BTUperHr, copTemp); + } + + double outputCapacity = capTemp_BTUperHr; + if (pwrUnit == UNITS_KW) + { + outputCapacity = BTU_TO_KWH(capTemp_BTUperHr); + } + else if (pwrUnit != UNITS_BTUperHr) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for capacity in getCompressorCapacity. \n"); + } + return double(HPWH_ABORT); + } + + return outputCapacity; +} + +double HPWH::getNthHeatSourceEnergyInput(int N, UNITS units /*=UNITS_KWH*/) const +{ + // energy used by the heat source is positive - this should always be positive + if (N >= getNumHeatSources() || N < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to access the energy input of a heat source that does not " + "exist. \n"); + } + return double(HPWH_ABORT); + } + + if (units == UNITS_KWH) + { + return heatSources[N].energyInput_kWh; + } + else if (units == UNITS_BTU) + { + return KWH_TO_BTU(heatSources[N].energyInput_kWh); + } + else if (units == UNITS_KJ) + { + return KWH_TO_KJ(heatSources[N].energyInput_kWh); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getNthHeatSourceEnergyInput. \n"); + } + return double(HPWH_ABORT); + } +} + +double HPWH::getNthHeatSourceEnergyOutput(int N, UNITS units /*=UNITS_KWH*/) const +{ + // returns energy from the heat source into the water - this should always be positive + if (N >= getNumHeatSources() || N < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to access the energy output of a heat source that does not " + "exist. \n"); + } + return double(HPWH_ABORT); + } + + if (units == UNITS_KWH) + { + return heatSources[N].energyOutput_kWh; + } + else if (units == UNITS_BTU) + { + return KWH_TO_BTU(heatSources[N].energyOutput_kWh); + } + else if (units == UNITS_KJ) + { + return KWH_TO_KJ(heatSources[N].energyOutput_kWh); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getNthHeatSourceEnergyInput. \n"); + } + return double(HPWH_ABORT); + } +} + +double HPWH::getNthHeatSourceRunTime(int N) const +{ + if (N >= getNumHeatSources() || N < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to access the run time of a heat source that does not exist. " + "\n"); + } + return double(HPWH_ABORT); + } + return heatSources[N].runtime_min; +} + +int HPWH::isNthHeatSourceRunning(int N) const +{ + if (N >= getNumHeatSources() || N < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to access the status of a heat source that does not exist. " + "\n"); + } + return HPWH_ABORT; + } + if (heatSources[N].isEngaged()) + { + return 1; + } + else + { + return 0; + } +} + +HPWH::HEATSOURCE_TYPE HPWH::getNthHeatSourceType(int N) const +{ + if (N >= getNumHeatSources() || N < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have attempted to access the type of a heat source that does not exist. \n"); + } + return HEATSOURCE_TYPE(HPWH_ABORT); + } + return heatSources[N].typeOfHeatSource; +} + +double HPWH::getTankSize(UNITS units /*=UNITS_L*/) const +{ + if (units == UNITS_L) + { + return tankVolume_L; + } + else if (units == UNITS_GAL) + { + return L_TO_GAL(tankVolume_L); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getTankSize. \n"); + } + return HPWH_ABORT; + } +} + +double HPWH::getOutletTemp(UNITS units /*=UNITS_C*/) const +{ + if (units == UNITS_C) + { + return outletTemp_C; + } + else if (units == UNITS_F) + { + return C_TO_F(outletTemp_C); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getOutletTemp. \n"); + } + return double(HPWH_ABORT); + } +} + +double HPWH::getCondenserWaterInletTemp(UNITS units /*=UNITS_C*/) const +{ + if (units == UNITS_C) + { + return condenserInlet_C; + } + else if (units == UNITS_F) + { + return C_TO_F(condenserInlet_C); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getCondenserWaterInletTemp. \n"); + } + return double(HPWH_ABORT); + } +} + +double HPWH::getCondenserWaterOutletTemp(UNITS units /*=UNITS_C*/) const +{ + if (units == UNITS_C) + { + return condenserOutlet_C; + } + else if (units == UNITS_F) + { + return C_TO_F(condenserOutlet_C); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getCondenserWaterInletTemp. \n"); + } + return double(HPWH_ABORT); + } +} + +double HPWH::getExternalVolumeHeated(UNITS units /*=UNITS_L*/) const +{ + if (units == UNITS_L) + { + return externalVolumeHeated_L; + } + else if (units == UNITS_GAL) + { + return L_TO_GAL(externalVolumeHeated_L); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getExternalVolumeHeated. \n"); + } + return double(HPWH_ABORT); + } +} + +double HPWH::getEnergyRemovedFromEnvironment(UNITS units /*=UNITS_KWH*/) const +{ + // moving heat from the space to the water is the positive direction + if (units == UNITS_KWH) + { + return energyRemovedFromEnvironment_kWh; + } + else if (units == UNITS_BTU) + { + return KWH_TO_BTU(energyRemovedFromEnvironment_kWh); + } + else if (units == UNITS_KJ) + { + return KWH_TO_KJ(energyRemovedFromEnvironment_kWh); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getEnergyRemovedFromEnvironment. \n"); + } + return double(HPWH_ABORT); + } +} + +double HPWH::getStandbyLosses(UNITS units /*=UNITS_KWH*/) const +{ + // moving heat from the water to the space is the positive direction + if (units == UNITS_KWH) + { + return standbyLosses_kWh; + } + else if (units == UNITS_BTU) + { + return KWH_TO_BTU(standbyLosses_kWh); + } + else if (units == UNITS_KJ) + { + return KWH_TO_KJ(standbyLosses_kWh); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getStandbyLosses. \n"); + } + return double(HPWH_ABORT); + } +} + +double HPWH::getTankHeatContent_kJ() const +{ + // returns tank heat content relative to 0 C using kJ + + // get average tank temperature + double avgTemp = 0.0; + for (int i = 0; i < getNumNodes(); i++) + { + avgTemp += tankTemps_C[i]; + } + avgTemp /= getNumNodes(); + + double totalHeat = avgTemp * DENSITYWATER_kgperL * CPWATER_kJperkgC * tankVolume_L; + return totalHeat; +} + +double HPWH::getLocationTemp_C() const { return locationTemperature_C; } + +int HPWH::getHPWHModel() const { return hpwhModel; } +int HPWH::getCompressorCoilConfig() const +{ + if (!hasACompressor()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Current model does not have a compressor. \n"); + } + return HPWH_ABORT; + } + return heatSources[compressorIndex].configuration; +} +bool HPWH::isCompressorMultipass() const +{ + if (!hasACompressor()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Current model does not have a compressor. \n"); + } + return HPWH_ABORT; + } + return heatSources[compressorIndex].isMultipass; +} +bool HPWH::isCompressoExternalMultipass() const +{ + if (!hasACompressor()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Current model does not have a compressor. \n"); + } + return HPWH_ABORT; + } + return heatSources[compressorIndex].isExternalMultipass(); +} + +bool HPWH::hasACompressor() const { return compressorIndex >= 0; } + +bool HPWH::hasExternalHeatSource() const +{ + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) + { + return true; + } + } + return false; +} + +double HPWH::getExternalMPFlowRate(UNITS units /*=UNITS_GPM*/) const +{ + if (!isCompressoExternalMultipass()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Does not have an external multipass heat source \n"); + } + return HPWH_ABORT; + } + + if (units == HPWH::UNITS_LPS) + { + return heatSources[compressorIndex].mpFlowRate_LPS; + } + else if (units == HPWH::UNITS_GPM) + { + return LPS_TO_GPM(heatSources[compressorIndex].mpFlowRate_LPS); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getExternalMPFlowRate. \n"); + } + return (double)HPWH_ABORT; + } +} + +double HPWH::getCompressorMinRuntime(UNITS units /*=UNITS_MIN*/) const +{ + + if (hasACompressor()) + { + double min_minutes = 10.; + + if (units == UNITS_MIN) + { + return min_minutes; + } + else if (units == UNITS_SEC) + { + return MIN_TO_SEC(min_minutes); + } + else if (units == UNITS_HR) + { + return MIN_TO_HR(min_minutes); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for getCompressorMinRunTime. \n"); + } + return (double)HPWH_ABORT; + } + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("This HPWH has no compressor. \n"); + } + return (double)HPWH_ABORT; + } +} + +int HPWH::getSizingFractions(double& aquaFract, double& useableFract) const +{ + double aFract = 1.; + double useFract = 1.; + + if (!hasACompressor()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Current model does not have a compressor. \n"); + } + return HPWH_ABORT; + } + else if (usesSoCLogic) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Current model uses SOC control logic and does not have a definition for sizing " + "fractions. \n"); + } + return HPWH_ABORT; + } + + // Every compressor must have at least one on logic + for (std::shared_ptr onLogic : heatSources[compressorIndex].turnOnLogicSet) + { + double tempA; + + if (hpwhVerbosity >= VRB_emetic) + { + msg("\tturnon logic: %s ", onLogic->description.c_str()); + } + tempA = onLogic->nodeWeightAvgFract(); // if standby logic will return 1 + aFract = tempA < aFract ? tempA : aFract; + } + aquaFract = aFract; + + // Compressors don't need to have an off logic + if (heatSources[compressorIndex].shutOffLogicSet.size() != 0) + { + for (std::shared_ptr offLogic : heatSources[compressorIndex].shutOffLogicSet) + { + + double tempUse; + + if (hpwhVerbosity >= VRB_emetic) + { + msg("\tshutsOff logic: %s ", offLogic->description.c_str()); + } + if (offLogic->description == "large draw" || offLogic->description == "larger draw") + { + tempUse = + 1.; // These logics are just for checking if there's a big draw to switch to RE + } + else + { + tempUse = 1. - offLogic->nodeWeightAvgFract(); + } + useFract = + tempUse < useFract ? tempUse : useFract; // Will return the smallest case of the + // useable fraction for multiple off logics + } + useableFract = useFract; + } + else + { + if (hpwhVerbosity >= VRB_emetic) + { + msg("\no shutoff logics present"); + } + useableFract = 1.; + } + + // Check if double's are approximately equally and adjust the relationship so it follows the + // relationship we expect. The tolerance plays with 0.1 mm in position if the tank is 1m tall... + double temp = 1. - useableFract; + if (aboutEqual(aquaFract, temp)) + { + useableFract = 1. - aquaFract + TOL_MINVALUE; + } + + return 0; +} + +bool HPWH::isHPWHScalable() const { return canScale; } + +int HPWH::setScaleHPWHCapacityCOP(double scaleCapacity /*=1.0*/, double scaleCOP /*=1.0*/) +{ + if (!isHPWHScalable()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Can not scale the HPWH Capacity or COP \n"); + } + return HPWH_ABORT; + } + if (!hasACompressor()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Current model does not have a compressor. \n"); + } + return HPWH_ABORT; + } + if (scaleCapacity <= 0 || scaleCOP <= 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Can not scale the HPWH Capacity or COP to 0 or less than 0 \n"); + } + return HPWH_ABORT; + } + + for (auto& perfP : heatSources[compressorIndex].perfMap) + { + if (scaleCapacity != 1.) + { + std::transform( + perfP.inputPower_coeffs.begin(), + perfP.inputPower_coeffs.end(), + perfP.inputPower_coeffs.begin(), + std::bind(std::multiplies(), std::placeholders::_1, scaleCapacity)); + } + if (scaleCOP != 1.) + { + std::transform(perfP.COP_coeffs.begin(), + perfP.COP_coeffs.end(), + perfP.COP_coeffs.begin(), + std::bind(std::multiplies(), std::placeholders::_1, scaleCOP)); + } + } + + return 0; +} + +int HPWH::setCompressorOutputCapacity(double newCapacity, + double airTemp /*=19.722*/, + double inletTemp /*=14.444*/, + double outTemp /*=57.222*/, + UNITS pwrUnit /*=UNITS_KW*/, + UNITS tempUnit /*=UNITS_C*/) +{ + + double oldCapacity = getCompressorCapacity(airTemp, inletTemp, outTemp, pwrUnit, tempUnit); + if (oldCapacity == double(HPWH_ABORT)) + { + return HPWH_ABORT; + } + + double scale = newCapacity / oldCapacity; + return setScaleHPWHCapacityCOP(scale, 1.); // Scale the compressor capacity +} + +int HPWH::setResistanceCapacity(double power, int which /*=-1*/, UNITS pwrUnit /*=UNITS_KW*/) +{ + + // Input checks + if (!isHPWHScalable()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Can not scale the resistance elements \n"); + } + return HPWH_ABORT; + } + if (getNumResistanceElements() == 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("There are no resistance elements to set capacity for \n"); + } + return HPWH_ABORT; + } + if (which < -1 || which > getNumResistanceElements() - 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Out of bounds value for which in setResistanceCapacity()\n"); + } + return HPWH_ABORT; + } + if (power < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Can not have a negative input power \n"); + } + return HPWH_ABORT; + } + // Unit conversion + double watts; + if (pwrUnit == UNITS_KW) + { + watts = power * 1000; // kW to W + } + else if (pwrUnit == UNITS_BTUperHr) + { + watts = BTU_TO_KWH(power) * 1000; // BTU to kW then kW to W + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for capacity in setResistanceCapacity. \n"); + } + return HPWH_ABORT; + } + + // Whew so many checks... + if (which == -1) + { + // Just get all the elements + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isAResistance()) + { + heatSources[i].changeResistanceWatts(watts); + } + } + } + else + { + heatSources[resistanceHeightMap[which].index].changeResistanceWatts(watts); + + // Then check for repeats in the position + int pos = resistanceHeightMap[which].position; + for (int i = 0; i < getNumResistanceElements(); i++) + { + if (which != i && resistanceHeightMap[i].position == pos) + { + heatSources[resistanceHeightMap[i].index].changeResistanceWatts(watts); + } + } + } + + return 0; +} + +double HPWH::getResistanceCapacity(int which /*=-1*/, UNITS pwrUnit /*=UNITS_KW*/) +{ + + // Input checks + if (getNumResistanceElements() == 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("There are no resistance elements to return capacity for \n"); + } + return HPWH_ABORT; + } + if (which < -1 || which > getNumResistanceElements() - 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Out of bounds value for which in getResistanceCapacity()\n"); + } + return HPWH_ABORT; + } + + double returnPower = 0; + if (which == -1) + { + // Just get all the elements + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isAResistance()) + { + returnPower += heatSources[i].perfMap[0].inputPower_coeffs[0]; + } + } + } + else + { + // get the power from "which" element by height + returnPower += + heatSources[resistanceHeightMap[which].index].perfMap[0].inputPower_coeffs[0]; + + // Then check for repeats in the position + int pos = resistanceHeightMap[which].position; + for (int i = 0; i < getNumResistanceElements(); i++) + { + if (which != i && resistanceHeightMap[i].position == pos) + { + returnPower += + heatSources[resistanceHeightMap[i].index].perfMap[0].inputPower_coeffs[0]; + } + } + } + + // Unit conversion + if (pwrUnit == UNITS_KW) + { + returnPower /= 1000.; // W to KW + } + else if (pwrUnit == UNITS_BTUperHr) + { + returnPower = KWH_TO_BTU(returnPower / 1000.); // W to BTU/hr + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect unit specification for capacity in getResistanceCapacity. \n"); + } + return HPWH_ABORT; + } + + return returnPower; +} + +int HPWH::getResistancePosition(int elementIndex) const +{ + + if (elementIndex < 0 || elementIndex > getNumHeatSources() - 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Out of bounds value for which in getResistancePosition\n"); + } + return HPWH_ABORT; + } + + if (!heatSources[elementIndex].isAResistance()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("This index is not a resistance element\n"); + } + return HPWH_ABORT; + } + + for (int i = 0; i < heatSources[elementIndex].getCondensitySize(); i++) + { + if (heatSources[elementIndex].condensity[i] == 1) + { // res elements have a condenstiy of 1 at a specific node + return i; + } + } + return HPWH_ABORT; +} + +// the privates +void HPWH::updateTankTemps(double drawVolume_L, + double inletT_C, + double tankAmbientT_C, + double inletVol2_L, + double inletT2_C) +{ + + outletTemp_C = 0.; + + ///////////////////////////////////////////////////////////////////////////////////////////////// + if (drawVolume_L > 0.) + { + + // calculate how many nodes to draw (wholeNodesToDraw), and the remainder (drawFraction) + if (inletVol2_L > drawVolume_L) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Volume in inlet 2 is greater than the draw volume. \n"); + } + simHasFailed = true; + return; + } + + // Check which inlet is higher; + int highInletH; + double highInletV, highInletT; + int lowInletH; + double lowInletT, lowInletV; + if (inletHeight > inlet2Height) + { + highInletH = inletHeight; + highInletV = drawVolume_L - inletVol2_L; + highInletT = inletT_C; + lowInletH = inlet2Height; + lowInletT = inletT2_C; + lowInletV = inletVol2_L; + } + else + { + highInletH = inlet2Height; + highInletV = inletVol2_L; + highInletT = inletT2_C; + lowInletH = inletHeight; + lowInletT = inletT_C; + lowInletV = drawVolume_L - inletVol2_L; + } + + if (hasHeatExchanger) + { // heat-exchange models + + const double densityTank_kgperL = DENSITYWATER_kgperL; + const double CpTank_kJperkgC = CPWATER_kJperkgC; + + double C_Node_kJperC = CpTank_kJperkgC * densityTank_kgperL * nodeVolume_L; + double C_draw_kJperC = CPWATER_kJperkgC * DENSITYWATER_kgperL * drawVolume_L; + + outletTemp_C = inletT_C; + for (auto& nodeTemp : tankTemps_C) + { + double maxHeatExchange_kJ = C_draw_kJperC * (nodeTemp - outletTemp_C); + double heatExchange_kJ = nodeHeatExchangerEffectiveness * maxHeatExchange_kJ; + + nodeTemp -= heatExchange_kJ / C_Node_kJperC; + outletTemp_C += heatExchange_kJ / C_draw_kJperC; + } + } + else + { + // calculate how many nodes to draw (drawVolume_N) + double drawVolume_N = drawVolume_L / nodeVolume_L; + if (drawVolume_L > tankVolume_L) + { + // if (hpwhVerbosity >= VRB_reluctant) { + // //msg("WARNING: Drawing more than the tank volume in one step is undefined + //behavior. Terminating simulation. \n"); msg("WARNING: Drawing more than the tank + //volume in one step is undefined behavior. Continuing simulation at your own risk. + //\n"); + // } + // simHasFailed = true; + // return; + for (int i = 0; i < getNumNodes(); i++) + { + outletTemp_C += tankTemps_C[i]; + tankTemps_C[i] = + (inletT_C * (drawVolume_L - inletVol2_L) + inletT2_C * inletVol2_L) / + drawVolume_L; + } + outletTemp_C = (outletTemp_C / getNumNodes() * tankVolume_L + + tankTemps_C[0] * (drawVolume_L - tankVolume_L)) / + drawVolume_L * drawVolume_N; + + drawVolume_N = 0.; + } + + while (drawVolume_N > 0) + { + + // Draw one node at a time + double drawFraction = drawVolume_N > 1. ? 1. : drawVolume_N; + double nodeInletTV = 0.; + + // add temperature for outletT average + outletTemp_C += drawFraction * tankTemps_C[getNumNodes() - 1]; + + double cumInletFraction = 0.; + for (int i = getNumNodes() - 1; i >= lowInletH; i--) + { + + // Reset inlet inputs at this node. + double nodeInletFraction = 0.; + nodeInletTV = 0.; + + // Sum of all inlets Vi*Ti at this node + if (i == highInletH) + { + nodeInletTV += highInletV * drawFraction / drawVolume_L * highInletT; + nodeInletFraction += highInletV * drawFraction / drawVolume_L; + } + if (i == lowInletH) + { + nodeInletTV += lowInletV * drawFraction / drawVolume_L * lowInletT; + nodeInletFraction += lowInletV * drawFraction / drawVolume_L; + + break; // if this is the bottom inlet break out of the four loop and use the + // boundary condition equation. + } + + // Look at the volume and temperature fluxes into this node + tankTemps_C[i] = (1. - (drawFraction - cumInletFraction)) * tankTemps_C[i] + + nodeInletTV + + (drawFraction - (cumInletFraction + nodeInletFraction)) * + tankTemps_C[i - 1]; + + cumInletFraction += nodeInletFraction; + } + + // Boundary condition equation because it shouldn't take anything from tankTemps_C[i + // - 1] but it also might not exist. + tankTemps_C[lowInletH] = + (1. - (drawFraction - cumInletFraction)) * tankTemps_C[lowInletH] + nodeInletTV; + + drawVolume_N -= drawFraction; + + mixTankInversions(); + } + + // fill in average outlet T - it is a weighted averaged, with weights == nodes drawn + outletTemp_C /= (drawVolume_L / nodeVolume_L); + } + + // Account for mixing at the bottom of the tank + if (tankMixesOnDraw && drawVolume_L > 0.) + { + int mixedBelowNode = (int)(getNumNodes() * mixBelowFractionOnDraw); + mixTankNodes(0, mixedBelowNode, 3.0); + } + + } // end if(draw_volume_L > 0) + + // Initialize newTankTemps_C + nextTankTemps_C = tankTemps_C; + + double standbyLossesBottom_kJ = 0.; + double standbyLossesTop_kJ = 0.; + double standbyLossesSides_kJ = 0.; + + // Standby losses from the top and bottom of the tank + { + auto standbyLossRate_kJperHrC = tankUA_kJperHrC * fracAreaTop; + + standbyLossesBottom_kJ = + standbyLossRate_kJperHrC * hoursPerStep * (tankTemps_C[0] - tankAmbientT_C); + standbyLossesTop_kJ = standbyLossRate_kJperHrC * hoursPerStep * + (tankTemps_C[getNumNodes() - 1] - tankAmbientT_C); + + nextTankTemps_C.front() -= standbyLossesBottom_kJ / nodeCp_kJperC; + nextTankTemps_C.back() -= standbyLossesTop_kJ / nodeCp_kJperC; + } + + // Standby losses from the sides of the tank + { + auto standbyLossRate_kJperHrC = + (tankUA_kJperHrC * fracAreaSide + fittingsUA_kJperHrC) / getNumNodes(); + for (int i = 0; i < getNumNodes(); i++) + { + double standbyLosses_kJ = + standbyLossRate_kJperHrC * hoursPerStep * (tankTemps_C[i] - tankAmbientT_C); + standbyLossesSides_kJ += standbyLosses_kJ; + + nextTankTemps_C[i] -= standbyLosses_kJ / nodeCp_kJperC; + } + } + + // Heat transfer between nodes + if (doConduction) + { + + // Get the "constant" tau for the stability condition and the conduction calculation + const double tau = KWATER_WpermC / + ((CPWATER_kJperkgC * 1000.0) * (DENSITYWATER_kgperL * 1000.0) * + (nodeHeight_m * nodeHeight_m)) * + secondsPerStep; + if (tau > 0.5) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The stability condition for conduction has failed, these results are going to " + "be interesting!\n"); + } + simHasFailed = true; + return; + } + + // End nodes + if (getNumNodes() > 1) + { // inner edges of top and bottom nodes + nextTankTemps_C.front() += 2. * tau * (tankTemps_C[1] - tankTemps_C.front()); + nextTankTemps_C.back() += + 2. * tau * (tankTemps_C[getNumNodes() - 2] - tankTemps_C.back()); + } + + // Internal nodes + for (int i = 1; i < getNumNodes() - 1; i++) + { + nextTankTemps_C[i] += + 2. * tau * (tankTemps_C[i + 1] - 2. * tankTemps_C[i] + tankTemps_C[i - 1]); + } + } + + // Update tankTemps_C + tankTemps_C = nextTankTemps_C; + + standbyLosses_kWh += + KJ_TO_KWH(standbyLossesBottom_kJ + standbyLossesTop_kJ + standbyLossesSides_kJ); + + // check for inverted temperature profile + mixTankInversions(); + +} // end updateTankTemps + +void HPWH::updateSoCIfNecessary() +{ + if (usesSoCLogic) + { + calcAndSetSoCFraction(); + } +} + +// Inversion mixing modeled after bigladder EnergyPlus code PK +void HPWH::mixTankInversions() +{ + bool hasInversion; + const double volumePerNode_L = tankVolume_L / getNumNodes(); + // int numdos = 0; + if (doInversionMixing) + { + do + { + hasInversion = false; + // Start from the top and check downwards + for (int i = getNumNodes() - 1; i > 0; i--) + { + if (tankTemps_C[i] < tankTemps_C[i - 1]) + { + // Temperature inversion! + hasInversion = true; + + // Mix this inversion mixing temperature by averaging all of the inverted nodes + // together together. + double Tmixed = 0.0; + double massMixed = 0.0; + int m; + for (m = i; m >= 0; m--) + { + Tmixed += tankTemps_C[m] * (volumePerNode_L * DENSITYWATER_kgperL); + massMixed += (volumePerNode_L * DENSITYWATER_kgperL); + if ((m == 0) || (Tmixed / massMixed > tankTemps_C[m - 1])) + { + break; + } + } + Tmixed /= massMixed; + + // Assign the tank temps from i to k + for (int k = i; k >= m; k--) + tankTemps_C[k] = Tmixed; + } + } + + } while (hasInversion); + } +} + +//----------------------------------------------------------------------------- +/// @brief Adds heat amount qAdd_kJ at and above the node with index nodeNum. +/// Returns unused heat to prevent exceeding maximum or setpoint. +/// @note Moved from HPWH::HeatSource +/// @param[in] qAdd_kJ Amount of heat to add +/// @param[in] nodeNum Lowest node at which to add heat +/// @param[in] maxT_C Maximum allowable temperature to maintain +//----------------------------------------------------------------------------- +double HPWH::addHeatAboveNode(double qAdd_kJ, int nodeNum, const double maxT_C) +{ + + // Do not exceed maxT_C or setpoint + double maxHeatToT_C = std::min(maxT_C, setpoint_C); + + if (hpwhVerbosity >= VRB_emetic) + { + msg("node %2d cap_kwh %.4lf \n", nodeNum, KJ_TO_KWH(qAdd_kJ)); + } + + // find number of nodes at or above nodeNum with the same temperature + int numNodesToHeat = 1; + for (int i = nodeNum; i < getNumNodes() - 1; i++) + { + if (tankTemps_C[i] != tankTemps_C[i + 1]) + { + break; + } + else + { + numNodesToHeat++; + } + } + + while ((qAdd_kJ > 0.) && (nodeNum + numNodesToHeat - 1 < getNumNodes())) + { + + // assume there is another node above the equal-temp nodes + int targetTempNodeNum = nodeNum + numNodesToHeat; + + double heatToT_C; + if (targetTempNodeNum > (getNumNodes() - 1)) + { + // no nodes above the equal-temp nodes; target temperature is the maximum + heatToT_C = maxHeatToT_C; + } + else + { + heatToT_C = tankTemps_C[targetTempNodeNum]; + if (heatToT_C > maxHeatToT_C) + { + // Ensure temperature does not exceed maximum + heatToT_C = maxHeatToT_C; + } + } + + // heat needed to bring all equal-temp nodes up to heatToT_C + double qIncrement_kJ = nodeCp_kJperC * numNodesToHeat * (heatToT_C - tankTemps_C[nodeNum]); + + if (qIncrement_kJ > qAdd_kJ) + { + // insufficient heat to reach heatToT_C; use all available heat + heatToT_C = tankTemps_C[nodeNum] + qAdd_kJ / nodeCp_kJperC / numNodesToHeat; + for (int j = 0; j < numNodesToHeat; ++j) + { + tankTemps_C[nodeNum + j] = heatToT_C; + } + qAdd_kJ = 0.; + } + else if (qIncrement_kJ > 0.) + { // add qIncrement_kJ to raise all equal-temp-nodes to heatToT_C + for (int j = 0; j < numNodesToHeat; ++j) + tankTemps_C[nodeNum + j] = heatToT_C; + qAdd_kJ -= qIncrement_kJ; + } + numNodesToHeat++; + } + + // return any unused heat + return qAdd_kJ; +} + +//----------------------------------------------------------------------------- +/// @brief Adds extra heat amount qAdd_kJ at and above the node with index nodeNum. +/// Does not limit final temperatures. +/// @param[in] qAdd_kJ Amount of heat to add +/// @param[in] nodeNum Lowest node at which to add heat +//----------------------------------------------------------------------------- +void HPWH::addExtraHeatAboveNode(double qAdd_kJ, const int nodeNum) +{ + + if (hpwhVerbosity >= VRB_emetic) + { + msg("node %2d cap_kwh %.4lf \n", nodeNum, KJ_TO_KWH(qAdd_kJ)); + } + + // find number of nodes at or above nodeNum with the same temperature + int numNodesToHeat = 1; + for (int i = nodeNum; i < getNumNodes() - 1; i++) + { + if (tankTemps_C[i] != tankTemps_C[i + 1]) + { + break; + } + else + { + numNodesToHeat++; + } + } + + while ((qAdd_kJ > 0.) && (nodeNum + numNodesToHeat - 1 < getNumNodes())) + { + + // assume there is another node above the equal-temp nodes + int targetTempNodeNum = nodeNum + numNodesToHeat; + + double heatToT_C; + if (targetTempNodeNum > (getNumNodes() - 1)) + { + // no nodes above the equal-temp nodes; target temperature limited by the heat available + heatToT_C = tankTemps_C[nodeNum] + qAdd_kJ / nodeCp_kJperC / numNodesToHeat; + } + else + { + heatToT_C = tankTemps_C[targetTempNodeNum]; + } + + // heat needed to bring all equal-temp nodes up to heatToT_C + double qIncrement_kJ = nodeCp_kJperC * numNodesToHeat * (heatToT_C - tankTemps_C[nodeNum]); + + if (qIncrement_kJ > qAdd_kJ) + { + // insufficient heat to reach heatToT_C; use all available heat + heatToT_C = tankTemps_C[nodeNum] + qAdd_kJ / nodeCp_kJperC / numNodesToHeat; + for (int j = 0; j < numNodesToHeat; ++j) + { + tankTemps_C[nodeNum + j] = heatToT_C; + } + qAdd_kJ = 0.; + } + else if (qIncrement_kJ > 0.) + { // add qIncrement_kJ to raise all equal-temp-nodes to heatToT_C + for (int j = 0; j < numNodesToHeat; ++j) + tankTemps_C[nodeNum + j] = heatToT_C; + qAdd_kJ -= qIncrement_kJ; + } + numNodesToHeat++; + } +} + +//----------------------------------------------------------------------------- +/// @brief Modifies a heat distribution using a thermal distribution. +/// @param[in,out] heatDistribution_W The distribution to be modified +//----------------------------------------------------------------------------- +void HPWH::modifyHeatDistribution(std::vector& heatDistribution_W) +{ + double totalHeat_W = 0.; + for (auto& heatDist_W : heatDistribution_W) + totalHeat_W += heatDist_W; + + if (totalHeat_W == 0.) + return; + + for (auto& heatDist_W : heatDistribution_W) + heatDist_W /= totalHeat_W; + + double shrinkageT_C = findShrinkageT_C(heatDistribution_W); + int lowestNode = findLowestNode(heatDistribution_W, getNumNodes()); + + std::vector modHeatDistribution_W; + calcThermalDist(modHeatDistribution_W, shrinkageT_C, lowestNode, tankTemps_C, setpoint_C); + + heatDistribution_W = modHeatDistribution_W; + for (auto& heatDist_W : heatDistribution_W) + heatDist_W *= totalHeat_W; +} + +//----------------------------------------------------------------------------- +/// @brief Adds extra heat to tank. +/// @param[in] extraHeatDist_W A distribution of extra heat to add +//----------------------------------------------------------------------------- +void HPWH::addExtraHeat(std::vector& extraHeatDist_W) +{ + + auto modHeatDistribution_W = extraHeatDist_W; + modifyHeatDistribution(modHeatDistribution_W); + + std::vector heatDistribution_W(getNumNodes()); + resampleExtensive(heatDistribution_W, modHeatDistribution_W); + + // Unnecessary unit conversions used here to match former method + double tot_qAdded_BTUperHr = 0.; + for (int i = getNumNodes() - 1; i >= 0; i--) + { + if (heatDistribution_W[i] != 0) + { + double qAdd_BTUperHr = KWH_TO_BTU(heatDistribution_W[i] / 1000.); + double qAdd_KJ = BTU_TO_KJ(qAdd_BTUperHr * minutesPerStep / min_per_hr); + addExtraHeatAboveNode(qAdd_KJ, i); + tot_qAdded_BTUperHr += qAdd_BTUperHr; + } + } + // Write the input & output energy + extraEnergyInput_kWh = BTU_TO_KWH(tot_qAdded_BTUperHr * minutesPerStep / min_per_hr); +} + +/////////////////////////////////////////////////////////////////////////////////// + +void HPWH::turnAllHeatSourcesOff() +{ + for (int i = 0; i < getNumHeatSources(); i++) + { + heatSources[i].disengageHeatSource(); + } + isHeating = false; +} + +bool HPWH::areAllHeatSourcesOff() const +{ + bool allOff = true; + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isEngaged() == true) + { + allOff = false; + } + } + return allOff; +} + +double HPWH::tankAvg_C(const std::vector nodeWeights) const +{ + double sum = 0; + double totWeight = 0; + + std::vector resampledTankTemps(LOGIC_NODE_SIZE); + resample(resampledTankTemps, tankTemps_C); + + for (auto& nodeWeight : nodeWeights) + { + if (nodeWeight.nodeNum == 0) + { // bottom node only + sum += tankTemps_C.front() * nodeWeight.weight; + totWeight += nodeWeight.weight; + } + else if (nodeWeight.nodeNum > LOGIC_NODE_SIZE) + { // top node only + sum += tankTemps_C.back() * nodeWeight.weight; + totWeight += nodeWeight.weight; + } + else + { // general case; sum over all weighted nodes + sum += resampledTankTemps[static_cast(nodeWeight.nodeNum - 1)] * + nodeWeight.weight; + totWeight += nodeWeight.weight; + } + } + return sum / totWeight; +} + +void HPWH::mixTankNodes(int mixedAboveNode, int mixedBelowNode, double mixFactor) +{ + double ave = 0.; + double numAvgNodes = (double)(mixedBelowNode - mixedAboveNode); + for (int i = mixedAboveNode; i < mixedBelowNode; i++) + { + ave += tankTemps_C[i]; + } + ave /= numAvgNodes; + + for (int i = mixedAboveNode; i < mixedBelowNode; i++) + { + tankTemps_C[i] += ((ave - tankTemps_C[i]) / mixFactor); + // tankTemps_C[i] = tankTemps_C[i] * (1.0 - 1.0 / mixFactor) + ave / mixFactor; + } +} + +void HPWH::calcSizeConstants() +{ + // calculate conduction between the nodes AND heat loss by node with top and bottom having + // greater surface area. model uses explicit finite difference to find conductive heat exchange + // between the tank nodes with the boundary conditions on the top and bottom node being the + // fraction of UA that corresponds to the top and bottom of the tank. The assumption is that the + // aspect ratio is the same for all tanks and is the same for the outside measurements of the + // unit and the inner water tank. + const double tankRad_m = getTankRadius(UNITS_M); + const double tankHeight_m = ASPECTRATIO * tankRad_m; + + nodeVolume_L = tankVolume_L / getNumNodes(); + nodeMass_kg = nodeVolume_L * DENSITYWATER_kgperL; + nodeCp_kJperC = nodeMass_kg * CPWATER_kJperkgC; + nodeHeight_m = tankHeight_m / getNumNodes(); + + // The fraction of UA that is on the top or the bottom of the tank. So 2 * fracAreaTop + + // fracAreaSide is the total tank area. + fracAreaTop = tankRad_m / (2.0 * (tankHeight_m + tankRad_m)); + + // fracAreaSide is the faction of the area of the cylinder that's not the top or bottom. + fracAreaSide = tankHeight_m / (tankHeight_m + tankRad_m); + + /// Single-node heat-exchange effectiveness + nodeHeatExchangerEffectiveness = + 1. - pow(1. - heatExchangerEffectiveness, 1. / static_cast(getNumNodes())); +} + +void HPWH::calcDerivedValues() +{ + // condentropy/shrinkage and lowestNode are now in calcDerivedHeatingValues() + calcDerivedHeatingValues(); + + calcSizeConstants(); + + mapResRelativePosToHeatSources(); + + // heat source ability to depress temp + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isACompressor()) + { + heatSources[i].depressesTemperature = true; + } + else if (heatSources[i].isAResistance()) + { + heatSources[i].depressesTemperature = false; + } + } +} + +void HPWH::calcDerivedHeatingValues() +{ + static char outputString[MAXOUTSTRING]; // this is used for debugging outputs + + // find condentropy/shrinkage + for (int i = 0; i < getNumHeatSources(); ++i) + { + heatSources[i].Tshrinkage_C = findShrinkageT_C(heatSources[i].condensity); + + if (hpwhVerbosity >= VRB_emetic) + { + msg(outputString, "Heat Source %d \n", i); + msg(outputString, "shrinkage %.2lf \n\n", heatSources[i].Tshrinkage_C); + } + } + + // find lowest node + for (int i = 0; i < getNumHeatSources(); i++) + { + heatSources[i].lowestNode = findLowestNode(heatSources[i].condensity, getNumNodes()); + + if (hpwhVerbosity >= VRB_emetic) + { + msg(outputString, "Heat Source %d \n", i); + msg(outputString, " lowest : %d \n", heatSources[i].lowestNode); + } + } + + // define condenser index and lowest resistance element index + compressorIndex = -1; // Default = No compressor + lowestElementIndex = -1; // Default = No resistance elements + highestElementIndex = -1; // Default = No resistance elements + VIPIndex = -1; // Default = No VIP element + double lowestPos = 1.; + double highestPos = 0.; // -1 to make sure a an element on the bottom can still be identified. + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isACompressor()) + { + compressorIndex = i; // NOTE: Maybe won't work with multiple compressors (last + // compressor will be used) + } + else if (heatSources[i].isAResistance()) + { + // Gets VIP element index + if (heatSources[i].isVIP) + { + if (VIPIndex == -1) + { + VIPIndex = i; + } + else + { + if (hpwhVerbosity >= VRB_minuteOut) + { + msg("More than one resistance element is assigned to VIP"); + }; + } + } + int condensitySize = heatSources[i].getCondensitySize(); + for (int j = 0; j < condensitySize; ++j) + { + double pos = static_cast(j) / condensitySize; + if ((heatSources[i].condensity[j] > 0.) && (pos < lowestPos)) + { + lowestElementIndex = i; + lowestPos = pos; + } + if ((heatSources[i].condensity[j] > 0.) && (pos >= highestPos)) + { + highestElementIndex = i; + highestPos = pos; + } + } + } + } + if (hpwhVerbosity >= VRB_emetic) + { + msg(outputString, " compressorIndex : %d \n", compressorIndex); + msg(outputString, " lowestElementIndex : %d \n", lowestElementIndex); + msg(outputString, " highestElementIndex : %d \n", highestElementIndex); + } + if (hpwhVerbosity >= VRB_emetic) + { + msg(outputString, " VIPIndex : %d \n", VIPIndex); + } + + // heat source ability to depress temp + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isACompressor()) + { + heatSources[i].depressesTemperature = true; + } + else if (heatSources[i].isAResistance()) + { + heatSources[i].depressesTemperature = false; + } + } +} + +void HPWH::mapResRelativePosToHeatSources() +{ + resistanceHeightMap.clear(); + resistanceHeightMap.reserve(getNumResistanceElements()); + + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isAResistance()) + { + resistanceHeightMap.push_back({i, getResistancePosition(i)}); + } + } + + // Sort by height, low to high + std::sort(resistanceHeightMap.begin(), + resistanceHeightMap.end(), + [](const HPWH::resPoint& a, const HPWH::resPoint& b) -> bool + { + return a.position < b.position; // (5 < 5) // evaluates to false + }); +} + +// Used to check a few inputs after the initialization of a tank model from a preset or a file. +int HPWH::checkInputs() +{ + int returnVal = 0; + // use a returnVal so that all checks are processed and error messages written + + if (getNumHeatSources() <= 0 && hpwhModel != MODELS_StorageTank) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You must have at least one HeatSource.\n"); + } + returnVal = HPWH_ABORT; + } + + double condensitySum; + // loop through all heat sources to check each for malconfigurations + for (int i = 0; i < getNumHeatSources(); i++) + { + // check the heat source type to make sure it has been set + if (heatSources[i].typeOfHeatSource == TYPE_none) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Heat source %d does not have a specified type. Initialization failed.\n", i); + } + returnVal = HPWH_ABORT; + } + // check to make sure there is at least one onlogic or parent with onlogic + int parent = heatSources[i].findParent(); + if (heatSources[i].turnOnLogicSet.size() == 0 && + (parent == -1 || heatSources[parent].turnOnLogicSet.size() == 0)) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You must specify at least one logic to turn on the element or the element " + "must be set as a backup for another heat source with at least one logic."); + } + returnVal = HPWH_ABORT; + } + + // Validate on logics + for (std::shared_ptr logic : heatSources[i].turnOnLogicSet) + { + if (!logic->isValid()) + { + returnVal = HPWH_ABORT; + if (hpwhVerbosity >= VRB_reluctant) + { + msg("On logic at index %i is invalid", i); + } + } + } + // Validate off logics + for (std::shared_ptr logic : heatSources[i].shutOffLogicSet) + { + if (!logic->isValid()) + { + returnVal = HPWH_ABORT; + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Off logic at index %i is invalid", i); + } + } + } + + // check is condensity sums to 1 + condensitySum = 0; + + for (int j = 0; j < heatSources[i].getCondensitySize(); j++) + condensitySum += heatSources[i].condensity[j]; + if (fabs(condensitySum - 1.0) > 1e-6) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The condensity for heatsource %d does not sum to 1. \n", i); + msg("It sums to %f \n", condensitySum); + } + returnVal = HPWH_ABORT; + } + // check that air flows are all set properly + if (heatSources[i].airflowFreedom > 1.0 || heatSources[i].airflowFreedom <= 0.0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The airflowFreedom must be between 0 and 1 for heatsource %d. \n", i); + } + returnVal = HPWH_ABORT; + } + + if (heatSources[i].isACompressor()) + { + if (heatSources[i].doDefrost) + { + if (heatSources[i].defrostMap.size() < 3) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Defrost logic set to true but no valid defrost map of length 3 or " + "greater set. \n"); + } + returnVal = HPWH_ABORT; + } + if (heatSources[i].configuration != HeatSource::CONFIG_EXTERNAL) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Defrost is only simulated for external compressors. \n"); + } + returnVal = HPWH_ABORT; + } + } + } + if (heatSources[i].configuration == HeatSource::CONFIG_EXTERNAL) + { + + if (heatSources[i].shutOffLogicSet.size() != 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("External heat sources can only have one shut off logic. \n "); + } + returnVal = HPWH_ABORT; + } + if (0 > heatSources[i].externalOutletHeight || + heatSources[i].externalOutletHeight > getNumNodes() - 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("External heat sources need an external outlet height within the bounds " + "from from 0 to numNodes-1. \n"); + } + returnVal = HPWH_ABORT; + } + if (0 > heatSources[i].externalInletHeight || + heatSources[i].externalInletHeight > getNumNodes() - 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("External heat sources need an external inlet height within the bounds " + "from from 0 to numNodes-1. \n"); + } + returnVal = HPWH_ABORT; + } + } + else + { + if (heatSources[i].secondaryHeatExchanger.extraPumpPower_W != 0 || + heatSources[i].secondaryHeatExchanger.extraPumpPower_W) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Heatsource %d is not an external heat source but has an external " + "secondary heat exchanger. \n", + i); + } + returnVal = HPWH_ABORT; + } + } + + // Check performance map + // perfGrid and perfGridValues, and the length of vectors in perfGridValues are equal and + // that ; + if (heatSources[i].useBtwxtGrid) + { + // If useBtwxtGrid is true that the perfMap is empty + if (heatSources[i].perfMap.size() != 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Using the grid lookups but a regression based perforamnce map is given " + "\n"); + } + returnVal = HPWH_ABORT; + } + + // Check length of vectors in perfGridValue are equal + if (heatSources[i].perfGridValues[0].size() != + heatSources[i].perfGridValues[1].size() && + heatSources[i].perfGridValues[0].size() != 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("When using grid lookups for perfmance the vectors in perfGridValues must " + "be the same length. \n"); + } + returnVal = HPWH_ABORT; + } + + // Check perfGrid's vectors lengths multiplied together == the perfGridValues vector + // lengths + size_t expLength = 1; + for (const auto& v : heatSources[i].perfGrid) + { + expLength *= v.size(); + } + if (expLength != heatSources[i].perfGridValues[0].size()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("When using grid lookups for perfmance the vectors in perfGridValues must " + "be the same length. \n"); + } + returnVal = HPWH_ABORT; + } + } + else + { + // Check that perfmap only has 1 point if config_external and multipass + if (heatSources[i].isExternalMultipass() && heatSources[i].perfMap.size() != 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("External multipass heat sources must have a perfMap of only one point " + "with regression equations. \n"); + } + returnVal = HPWH_ABORT; + } + } + } + + // Check that the on logic and off logics are ordered properly + if (hasACompressor()) + { + double aquaF = 0., useF = 1.; + getSizingFractions(aquaF, useF); + if (aquaF < (1. - useF)) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The relationship between the on logic and off logic is not supported. The off " + "logic is beneath the on logic."); + } + returnVal = HPWH_ABORT; + } + } + + double maxTemp; + string why; + double tempSetpoint = setpoint_C; + if (!isNewSetpointPossible(tempSetpoint, maxTemp, why)) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Cannot set new setpoint. %s", why.c_str()); + } + returnVal = HPWH_ABORT; + } + + // Check if the UA is out of bounds + if (tankUA_kJperHrC < 0.0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("The tankUA_kJperHrC is less than 0 for a HPWH, it must be greater than 0, " + "tankUA_kJperHrC is: %f \n", + tankUA_kJperHrC); + } + returnVal = HPWH_ABORT; + } + + // Check single-node heat-exchange effectiveness validity + if (heatExchangerEffectiveness > 1.) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Heat-exchanger effectiveness cannot exceed 1.\n"); + } + returnVal = HPWH_ABORT; + } + + // if there's no failures, return 0 + return returnVal; +} + +bool HPWH::shouldDRLockOut(HEATSOURCE_TYPE hs, DRMODES DR_signal) const +{ + + if (hs == TYPE_compressor && (DR_signal & DR_LOC) != 0) + { + return true; + } + else if (hs == TYPE_resistance && (DR_signal & DR_LOR) != 0) + { + return true; + } + return false; +} + +void HPWH::resetTopOffTimer() { timerTOT = 0.; } + +//----------------------------------------------------------------------------- +/// @brief Checks whether energy is balanced during a simulation step. /// @note Used in test/main.cc /// @param[in] drawVol_L Water volume drawn during simulation step /// @param[in] prevHeatContent_kJ Heat content of tank prior to simulation step -/// @param[in] fracEnergyTolerance Fractional tolerance for energy imbalance +/// @param[in] fracEnergyTolerance Fractional tolerance for energy imbalance /// @return true if balanced; false otherwise. //----------------------------------------------------------------------------- -bool HPWH::isEnergyBalanced( - const double drawVol_L,const double prevHeatContent_kJ,const double fracEnergyTolerance /* = 0.001 */) -{ - // Check energy balancing. - double qInElectrical_kJ = 0.; - for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - qInElectrical_kJ += getNthHeatSourceEnergyInput(iHS, UNITS_KJ); - } - - double qInExtra_kJ = KWH_TO_KJ(extraEnergyInput_kWh); - double qInHeatSourceEnviron_kJ = getEnergyRemovedFromEnvironment(UNITS_KJ); - double qOutTankEnviron_kJ = KWH_TO_KJ(standbyLosses_kWh); - double qOutWater_kJ = drawVol_L * (outletTemp_C - member_inletT_C) * DENSITYWATER_kgperL * CPWATER_kJperkgC; // assumes only one inlet - double expectedTankHeatContent_kJ = - prevHeatContent_kJ // previous heat content - + qInElectrical_kJ // electrical energy delivered to heat sources - + qInExtra_kJ // extra energy delivered to heat sources - + qInHeatSourceEnviron_kJ // heat extracted from environment by condenser - - qOutTankEnviron_kJ // heat released from tank to environment - - qOutWater_kJ; // heat expelled to outlet by water flow - - double qBal_kJ = getTankHeatContent_kJ() - expectedTankHeatContent_kJ; - - double fracEnergyDiff = fabs(qBal_kJ) / std::max(prevHeatContent_kJ, 1.); - if(fracEnergyDiff > fracEnergyTolerance) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Energy-balance error: %f kJ, %f %% \n",qBal_kJ,100. * fracEnergyDiff); - } - return false; - } - return true; +bool HPWH::isEnergyBalanced(const double drawVol_L, + const double prevHeatContent_kJ, + const double fracEnergyTolerance /* = 0.001 */) +{ + // Check energy balancing. + double qInElectrical_kJ = 0.; + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) + { + qInElectrical_kJ += getNthHeatSourceEnergyInput(iHS, UNITS_KJ); + } + + double qInExtra_kJ = KWH_TO_KJ(extraEnergyInput_kWh); + double qInHeatSourceEnviron_kJ = getEnergyRemovedFromEnvironment(UNITS_KJ); + double qOutTankEnviron_kJ = KWH_TO_KJ(standbyLosses_kWh); + double qOutWater_kJ = drawVol_L * (outletTemp_C - member_inletT_C) * DENSITYWATER_kgperL * + CPWATER_kJperkgC; // assumes only one inlet + double expectedTankHeatContent_kJ = + prevHeatContent_kJ // previous heat content + + qInElectrical_kJ // electrical energy delivered to heat sources + + qInExtra_kJ // extra energy delivered to heat sources + + qInHeatSourceEnviron_kJ // heat extracted from environment by condenser + - qOutTankEnviron_kJ // heat released from tank to environment + - qOutWater_kJ; // heat expelled to outlet by water flow + + double qBal_kJ = getTankHeatContent_kJ() - expectedTankHeatContent_kJ; + + double fracEnergyDiff = fabs(qBal_kJ) / std::max(prevHeatContent_kJ, 1.); + if (fracEnergyDiff > fracEnergyTolerance) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Energy-balance error: %f kJ, %f %% \n", qBal_kJ, 100. * fracEnergyDiff); + } + return false; + } + return true; } #ifndef HPWH_ABRIDGED -int HPWH::HPWHinit_file(string configFile) { - - setAllDefaults(); // reset all defaults if you're re-initilizing - // sets simHasFailed = true; this gets cleared on successful completion of init - // return 0 on success, HPWH_ABORT for failure - - //open file, check and report errors - std::ifstream inputFILE; - inputFILE.open(configFile.c_str()); - if(!inputFILE.is_open()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Input file failed to open. \n"); - } - return HPWH_ABORT; - } - - //some variables that will be handy - int heatsource,sourceNum,nTemps,tempInt; - std::size_t num_nodes = 0, numHeatSources = 0; - bool hasInitialTankTemp = false; - double initalTankT_C = F_TO_C(120.); - - string tempString,units; - double tempDouble; - - //being file processing, line by line - string line_s; - std::stringstream line_ss; - string token; - while(std::getline(inputFILE,line_s)) { - line_ss.clear(); - line_ss.str(line_s); - - //grab the first word, and start comparing - line_ss >> token; - if(token.at(0) == '#' || line_s.empty()) { - //if you hit a comment, skip to next line - continue; - } else if(token == "numNodes") { - line_ss >> num_nodes; - } else if(token == "volume") { - line_ss >> tempDouble >> units; - if(units == "gal") tempDouble = GAL_TO_L(tempDouble); - else if(units == "L"); //do nothing, lol - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s. \n",token.c_str()); - } - return HPWH_ABORT; - } - tankVolume_L = tempDouble; - } else if(token == "UA") { - line_ss >> tempDouble >> units; - if(units != "kJperHrC") { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s. \n",token.c_str()); - } - return HPWH_ABORT; - } - tankUA_kJperHrC = tempDouble; - } else if(token == "depressTemp") { - line_ss >> tempString; - if(tempString == "true") { - doTempDepression = true; - } else if(tempString == "false") { - doTempDepression = false; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper value for %s\n",token.c_str()); - } - return HPWH_ABORT; - } - } else if(token == "mixOnDraw") { - line_ss >> tempString; - if(tempString == "true") { - tankMixesOnDraw = true; - } else if(tempString == "false") { - tankMixesOnDraw = false; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper value for %s\n",token.c_str()); - } - return HPWH_ABORT; - } - } else if(token == "mixBelowFractionOnDraw") { - line_ss >> tempDouble; - if(tempDouble < 0 || tempDouble > 1) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Out of bounds value for %s. Should be between 0 and 1. \n",token.c_str()); - } - return HPWH_ABORT; - } - mixBelowFractionOnDraw = tempDouble; - } else if(token == "setpoint") { - line_ss >> tempDouble >> units; - if(units == "F") tempDouble = F_TO_C(tempDouble); - else if(units == "C"); //do nothing, lol - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s. \n",token.c_str()); - } - return HPWH_ABORT; - } - setpoint_C = tempDouble; - //tank will be set to setpoint at end of function - } else if(token == "setpointFixed") { - line_ss >> tempString; - if(tempString == "true") setpointFixed = true; - else if(tempString == "false") setpointFixed = false; - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper value for %s\n",token.c_str()); - } - return HPWH_ABORT; - } - } else if(token == "initialTankTemp") { - line_ss >> tempDouble >> units; - if(units == "F") tempDouble = F_TO_C(tempDouble); - else if(units == "C"); - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s. \n",token.c_str()); - } - return HPWH_ABORT; - } - initalTankT_C = tempDouble; - hasInitialTankTemp = true; - } else if(token == "hasHeatExchanger") { - // false of this model uses heat exchange - line_ss >> tempString; - if(tempString == "true") hasHeatExchanger = true; - else if(tempString == "false") hasHeatExchanger = false; - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper value for %s\n",token.c_str()); - } - return HPWH_ABORT; - } - } else if(token == "heatExchangerEffectiveness") { - // applies to heat-exchange models only - line_ss >> tempDouble; - heatExchangerEffectiveness = tempDouble; - } else if(token == "verbosity") { - line_ss >> token; - if(token == "silent") { - hpwhVerbosity = VRB_silent; - } else if(token == "reluctant") { - hpwhVerbosity = VRB_reluctant; - } else if(token == "typical") { - hpwhVerbosity = VRB_typical; - } else if(token == "emetic") { - hpwhVerbosity = VRB_emetic; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect verbosity on input. \n"); - } - return HPWH_ABORT; - } - } - - else if(token == "numHeatSources") { - line_ss >> numHeatSources; - heatSources.reserve(numHeatSources); - for(int i = 0; i < numHeatSources; i++) { - heatSources.emplace_back(this); - } - } else if(token == "heatsource") { - if(numHeatSources == 0) { - msg("You must specify the number of heatsources before setting their properties. \n"); - return HPWH_ABORT; - } - line_ss >> heatsource >> token; - if(token == "isVIP") { - line_ss >> tempString; - if(tempString == "true") heatSources[heatsource].isVIP = true; - else if(tempString == "false") heatSources[heatsource].isVIP = false; - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper value for %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } else if(token == "isOn") { - line_ss >> tempString; - if(tempString == "true") heatSources[heatsource].isOn = true; - else if(tempString == "false") heatSources[heatsource].isOn = false; - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper value for %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } else if(token == "minT") { - line_ss >> tempDouble >> units; - if(units == "F") tempDouble = F_TO_C(tempDouble); - else if(units == "C"); //do nothing, lol - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s. \n",token.c_str()); - } - return HPWH_ABORT; - } - heatSources[heatsource].minT = tempDouble; - } else if(token == "maxT") { - line_ss >> tempDouble >> units; - if(units == "F") tempDouble = F_TO_C(tempDouble); - else if(units == "C"); //do nothing, lol - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s. \n",token.c_str()); - } - return HPWH_ABORT; - } - heatSources[heatsource].maxT = tempDouble; - } else if(token == "onlogic" || token == "offlogic" || token == "standbylogic") { - line_ss >> tempString; - if(tempString == "nodes") { - std::vector nodeNums; - std::vector weights; - std::string nextToken; - line_ss >> nextToken; - while(std::regex_match(nextToken,std::regex("\\d+"))) { - int nodeNum = std::stoi(nextToken); - if(nodeNum > LOGIC_NODE_SIZE + 1 || nodeNum < 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Node number for heatsource %d %s must be between 0 and %d. \n",heatsource,token.c_str(), LOGIC_NODE_SIZE + 1); - } - return HPWH_ABORT; - } - nodeNums.push_back(nodeNum); - line_ss >> nextToken; - } - if(nextToken == "weights") { - line_ss >> nextToken; - while(std::regex_match(nextToken,std::regex("-?\\d*\\.\\d+(?:e-?\\d+)?"))) { - weights.push_back(std::stod(nextToken)); - line_ss >> nextToken; - } - } else { - for(auto n : nodeNums) { - n += 0; // used to get rid of unused variable compiler warning - weights.push_back(1.0); - } - } - if(nodeNums.size() != weights.size()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Number of weights for heatsource %d %s (%d) does not match number of nodes for %s (%d). \n",heatsource,token.c_str(),weights.size(),token.c_str(),nodeNums.size()); - } - return HPWH_ABORT; - } - if(nextToken != "absolute" && nextToken != "relative") { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper definition, \"%s\", for heat source %d %s. Should be \"relative\" or \"absoute\".\n",nextToken.c_str(),heatsource,token.c_str()); - } - return HPWH_ABORT; - } - bool absolute = (nextToken == "absolute"); - std::string compareStr; - line_ss >> compareStr >> tempDouble >> units; - std::function compare; - if(compareStr == "<") compare = std::less(); - else if(compareStr == ">") compare = std::greater(); - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper comparison, \"%s\", for heat source %d %s. Should be \"<\" or \">\".\n",compareStr.c_str(),heatsource,token.c_str()); - } - return HPWH_ABORT; - } - if(units == "F") { - if(absolute) { - tempDouble = F_TO_C(tempDouble); - } else { - tempDouble = dF_TO_dC(tempDouble); - } - } else if(units == "C"); //do nothing, lol - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s from heatsource %d. \n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - std::vector nodeWeights; - for(size_t i = 0; i < nodeNums.size(); i++) { - nodeWeights.emplace_back(nodeNums[i],weights[i]); - } - std::shared_ptr logic = std::make_shared("custom",nodeWeights,tempDouble,this,absolute,compare); - if(token == "onlogic") { - heatSources[heatsource].addTurnOnLogic(logic); - } else if(token == "offlogic") { - heatSources[heatsource].addShutOffLogic(std::move(logic)); - } else { // standby logic - heatSources[heatsource].standbyLogic = std::make_shared("standby logic",nodeWeights,tempDouble,this,absolute,compare); - } - } else if(token == "onlogic") { - std::string nextToken; - line_ss >> nextToken; - bool absolute = (nextToken == "absolute"); - if(absolute) { - std::string compareStr; - line_ss >> compareStr >> tempDouble >> units; - std::function compare; - if(compareStr == "<") compare = std::less(); - else if(compareStr == ">") compare = std::greater(); - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper comparison, \"%s\", for heat source %d %s. Should be \"<\" or \">\".\n",compareStr.c_str(),heatsource,token.c_str()); - } - return HPWH_ABORT; - } - line_ss >> tempDouble; - } - else { - tempDouble = std::stod(nextToken); - } - line_ss >> units; - if(units == "F") { - if(absolute) { - tempDouble = F_TO_C(tempDouble); - } else { - tempDouble = dF_TO_dC(tempDouble); - } - } else if(units == "C"); //do nothing, lol - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s from heatsource %d. \n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - if(tempString == "wholeTank") { - heatSources[heatsource].addTurnOnLogic(HPWH::wholeTank(tempDouble,UNITS_C,absolute)); - } else if(tempString == "topThird") { - heatSources[heatsource].addTurnOnLogic(HPWH::topThird(tempDouble)); - } else if(tempString == "bottomThird") { - heatSources[heatsource].addTurnOnLogic(HPWH::bottomThird(tempDouble)); - } else if(tempString == "standby") { - heatSources[heatsource].addTurnOnLogic(HPWH::standby(tempDouble)); - } else if(tempString == "bottomSixth") { - heatSources[heatsource].addTurnOnLogic(HPWH::bottomSixth(tempDouble)); - } else if(tempString == "secondSixth") { - heatSources[heatsource].addTurnOnLogic(HPWH::secondSixth(tempDouble)); - } else if(tempString == "thirdSixth") { - heatSources[heatsource].addTurnOnLogic(HPWH::thirdSixth(tempDouble)); - } else if(tempString == "fourthSixth") { - heatSources[heatsource].addTurnOnLogic(HPWH::fourthSixth(tempDouble)); - } else if(tempString == "fifthSixth") { - heatSources[heatsource].addTurnOnLogic(HPWH::fifthSixth(tempDouble)); - } else if(tempString == "topSixth") { - heatSources[heatsource].addTurnOnLogic(HPWH::topSixth(tempDouble)); - } else if(tempString == "bottomHalf") { - heatSources[heatsource].addTurnOnLogic(HPWH::bottomHalf(tempDouble)); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } else if(token == "offlogic") { - line_ss >> tempDouble >> units; - if(units == "F") tempDouble = F_TO_C(tempDouble); - else if(units == "C"); //do nothing, lol - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s from heatsource %d. \n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - if(tempString == "topNodeMaxTemp") { - heatSources[heatsource].addShutOffLogic(HPWH::topNodeMaxTemp(tempDouble)); - } else if(tempString == "bottomNodeMaxTemp") { - heatSources[heatsource].addShutOffLogic(HPWH::bottomNodeMaxTemp(tempDouble)); - } else if(tempString == "bottomTwelfthMaxTemp") { - heatSources[heatsource].addShutOffLogic(HPWH::bottomTwelfthMaxTemp(tempDouble)); - } else if(tempString == "bottomSixthMaxTemp") { - heatSources[heatsource].addShutOffLogic(HPWH::bottomSixthMaxTemp(tempDouble)); - } else if(tempString == "largeDraw") { - heatSources[heatsource].addShutOffLogic(HPWH::largeDraw(tempDouble)); - } else if(tempString == "largerDraw") { - heatSources[heatsource].addShutOffLogic(HPWH::largerDraw(tempDouble)); - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } - } else if(token == "type") { - line_ss >> tempString; - if(tempString == "resistor") { - heatSources[heatsource].typeOfHeatSource = TYPE_resistance; - } else if(tempString == "compressor") { - heatSources[heatsource].typeOfHeatSource = TYPE_compressor; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } else if(token == "coilConfig") { - line_ss >> tempString; - if(tempString == "wrapped") { - heatSources[heatsource].configuration = HeatSource::CONFIG_WRAPPED; - } else if(tempString == "submerged") { - heatSources[heatsource].configuration = HeatSource::CONFIG_SUBMERGED; - } else if(tempString == "external") { - heatSources[heatsource].configuration = HeatSource::CONFIG_EXTERNAL; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } else if(token == "heatCycle") { - line_ss >> tempString; - if(tempString == "singlepass") { - heatSources[heatsource].isMultipass = false; - } else if(tempString == "multipass") { - heatSources[heatsource].isMultipass = true; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } - - else if(token == "externalInlet") { - line_ss >> tempInt; - if(tempInt < num_nodes && tempInt >= 0) { - heatSources[heatsource].externalInletHeight = tempInt; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } else if(token == "externalOutlet") { - line_ss >> tempInt; - if(tempInt < num_nodes && tempInt >= 0) { - heatSources[heatsource].externalOutletHeight = tempInt; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper %s for heat source %d\n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - } - - else if(token == "condensity") { - double x; - std::vector condensity; - while (line_ss >> x) - condensity.push_back(x); - heatSources[heatsource].setCondensity(condensity); - } else if(token == "nTemps") { - line_ss >> nTemps; - heatSources[heatsource].perfMap.resize(nTemps); - } else if(std::regex_match(token,std::regex("T\\d+"))) { - std::smatch match; - std::regex_match(token,match,std::regex("T(\\d+)")); - nTemps = std::stoi(match[1].str()); - int maxTemps = (int)heatSources[heatsource].perfMap.size(); - - if(maxTemps < nTemps) { - if(maxTemps == 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("%s specified for heatsource %d before definition of nTemps. \n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect specification for %s from heatsource %d. nTemps, %d, is less than %d. \n",token.c_str(),heatsource,maxTemps,nTemps); - } - return HPWH_ABORT; - } - } - line_ss >> tempDouble >> units; - // if (units == "F") tempDouble = F_TO_C(tempDouble); - if(units == "F"); - // else if (units == "C") ; //do nothing, lol - else if(units == "C") tempDouble = C_TO_F(tempDouble); - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s from heatsource %d. \n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - heatSources[heatsource].perfMap[nTemps - 1].T_F = tempDouble; - } else if(std::regex_match(token,std::regex("(?:inPow|cop)T\\d+(?:const|lin|quad)"))) { - std::smatch match; - std::regex_match(token,match,std::regex("(inPow|cop)T(\\d+)(const|lin|quad)")); - string var = match[1].str(); - nTemps = std::stoi(match[2].str()); - string coeff = match[3].str(); - int coeff_num; - if(coeff == "const") { - coeff_num = 0; - } else if(coeff == "lin") { - coeff_num = 1; - } else if(coeff == "quad") { - coeff_num = 2; - } - - int maxTemps = (int)heatSources[heatsource].perfMap.size(); - - if(maxTemps < nTemps) { - if(maxTemps == 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("%s specified for heatsource %d before definition of nTemps. \n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect specification for %s from heatsource %d. nTemps, %d, is less than %d. \n",token.c_str(),heatsource,maxTemps,nTemps); - } - return HPWH_ABORT; - } - } - line_ss >> tempDouble; - - if(var == "inPow") { - heatSources[heatsource].perfMap[nTemps - 1].inputPower_coeffs.push_back(tempDouble); - } else if(var == "cop") { - heatSources[heatsource].perfMap[nTemps - 1].COP_coeffs.push_back(tempDouble); - } - } else if(token == "hysteresis") { - line_ss >> tempDouble >> units; - if(units == "F") tempDouble = dF_TO_dC(tempDouble); - else if(units == "C"); //do nothing, lol - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect units specification for %s from heatsource %d. \n",token.c_str(),heatsource); - } - return HPWH_ABORT; - } - heatSources[heatsource].hysteresis_dC = tempDouble; - } else if(token == "backupSource") { - line_ss >> sourceNum; - heatSources[heatsource].backupHeatSource = &heatSources[sourceNum]; - } else if(token == "companionSource") { - line_ss >> sourceNum; - heatSources[heatsource].companionHeatSource = &heatSources[sourceNum]; - } else if(token == "followedBySource") { - line_ss >> sourceNum; - heatSources[heatsource].followedByHeatSource = &heatSources[sourceNum]; - } else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Improper specifier (%s) for heat source %d\n",token.c_str(),heatsource); - } - } - - } //end heatsource options - else { - msg("Improper keyword: %s \n",token.c_str()); - return HPWH_ABORT; - } - - } //end while over lines - - - //take care of the non-input processing - hpwhModel = MODELS_CustomFile; - - tankTemps_C.resize(num_nodes); - - if (hasInitialTankTemp) - setTankToTemperature(initalTankT_C); - else - resetTankToSetpoint(); - - nextTankTemps_C.resize(num_nodes); - - isHeating = false; - for(int i = 0; i < getNumHeatSources(); i++) { - if(heatSources[i].isOn) { - isHeating = true; - } - heatSources[i].sortPerformanceMap(); - } - - calcDerivedValues(); - - if(checkInputs() == HPWH_ABORT) { - return HPWH_ABORT; - } - simHasFailed = false; - return 0; +int HPWH::HPWHinit_file(string configFile) +{ + + setAllDefaults(); // reset all defaults if you're re-initilizing + // sets simHasFailed = true; this gets cleared on successful completion of init + // return 0 on success, HPWH_ABORT for failure + + // open file, check and report errors + std::ifstream inputFILE; + inputFILE.open(configFile.c_str()); + if (!inputFILE.is_open()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Input file failed to open. \n"); + } + return HPWH_ABORT; + } + + // some variables that will be handy + int heatsource, sourceNum, nTemps, tempInt; + std::size_t num_nodes = 0, numHeatSources = 0; + bool hasInitialTankTemp = false; + double initalTankT_C = F_TO_C(120.); + + string tempString, units; + double tempDouble; + + // being file processing, line by line + string line_s; + std::stringstream line_ss; + string token; + while (std::getline(inputFILE, line_s)) + { + line_ss.clear(); + line_ss.str(line_s); + + // grab the first word, and start comparing + line_ss >> token; + if (token.at(0) == '#' || line_s.empty()) + { + // if you hit a comment, skip to next line + continue; + } + else if (token == "numNodes") + { + line_ss >> num_nodes; + } + else if (token == "volume") + { + line_ss >> tempDouble >> units; + if (units == "gal") + tempDouble = GAL_TO_L(tempDouble); + else if (units == "L") + ; // do nothing, lol + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s. \n", token.c_str()); + } + return HPWH_ABORT; + } + tankVolume_L = tempDouble; + } + else if (token == "UA") + { + line_ss >> tempDouble >> units; + if (units != "kJperHrC") + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s. \n", token.c_str()); + } + return HPWH_ABORT; + } + tankUA_kJperHrC = tempDouble; + } + else if (token == "depressTemp") + { + line_ss >> tempString; + if (tempString == "true") + { + doTempDepression = true; + } + else if (tempString == "false") + { + doTempDepression = false; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper value for %s\n", token.c_str()); + } + return HPWH_ABORT; + } + } + else if (token == "mixOnDraw") + { + line_ss >> tempString; + if (tempString == "true") + { + tankMixesOnDraw = true; + } + else if (tempString == "false") + { + tankMixesOnDraw = false; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper value for %s\n", token.c_str()); + } + return HPWH_ABORT; + } + } + else if (token == "mixBelowFractionOnDraw") + { + line_ss >> tempDouble; + if (tempDouble < 0 || tempDouble > 1) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Out of bounds value for %s. Should be between 0 and 1. \n", token.c_str()); + } + return HPWH_ABORT; + } + mixBelowFractionOnDraw = tempDouble; + } + else if (token == "setpoint") + { + line_ss >> tempDouble >> units; + if (units == "F") + tempDouble = F_TO_C(tempDouble); + else if (units == "C") + ; // do nothing, lol + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s. \n", token.c_str()); + } + return HPWH_ABORT; + } + setpoint_C = tempDouble; + // tank will be set to setpoint at end of function + } + else if (token == "setpointFixed") + { + line_ss >> tempString; + if (tempString == "true") + setpointFixed = true; + else if (tempString == "false") + setpointFixed = false; + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper value for %s\n", token.c_str()); + } + return HPWH_ABORT; + } + } + else if (token == "initialTankTemp") + { + line_ss >> tempDouble >> units; + if (units == "F") + tempDouble = F_TO_C(tempDouble); + else if (units == "C") + ; + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s. \n", token.c_str()); + } + return HPWH_ABORT; + } + initalTankT_C = tempDouble; + hasInitialTankTemp = true; + } + else if (token == "hasHeatExchanger") + { + // false of this model uses heat exchange + line_ss >> tempString; + if (tempString == "true") + hasHeatExchanger = true; + else if (tempString == "false") + hasHeatExchanger = false; + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper value for %s\n", token.c_str()); + } + return HPWH_ABORT; + } + } + else if (token == "heatExchangerEffectiveness") + { + // applies to heat-exchange models only + line_ss >> tempDouble; + heatExchangerEffectiveness = tempDouble; + } + else if (token == "verbosity") + { + line_ss >> token; + if (token == "silent") + { + hpwhVerbosity = VRB_silent; + } + else if (token == "reluctant") + { + hpwhVerbosity = VRB_reluctant; + } + else if (token == "typical") + { + hpwhVerbosity = VRB_typical; + } + else if (token == "emetic") + { + hpwhVerbosity = VRB_emetic; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect verbosity on input. \n"); + } + return HPWH_ABORT; + } + } + + else if (token == "numHeatSources") + { + line_ss >> numHeatSources; + heatSources.reserve(numHeatSources); + for (int i = 0; i < numHeatSources; i++) + { + heatSources.emplace_back(this); + } + } + else if (token == "heatsource") + { + if (numHeatSources == 0) + { + msg("You must specify the number of heatsources before setting their properties. " + "\n"); + return HPWH_ABORT; + } + line_ss >> heatsource >> token; + if (token == "isVIP") + { + line_ss >> tempString; + if (tempString == "true") + heatSources[heatsource].isVIP = true; + else if (tempString == "false") + heatSources[heatsource].isVIP = false; + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper value for %s for heat source %d\n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + } + else if (token == "isOn") + { + line_ss >> tempString; + if (tempString == "true") + heatSources[heatsource].isOn = true; + else if (tempString == "false") + heatSources[heatsource].isOn = false; + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper value for %s for heat source %d\n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + } + else if (token == "minT") + { + line_ss >> tempDouble >> units; + if (units == "F") + tempDouble = F_TO_C(tempDouble); + else if (units == "C") + ; // do nothing, lol + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s. \n", token.c_str()); + } + return HPWH_ABORT; + } + heatSources[heatsource].minT = tempDouble; + } + else if (token == "maxT") + { + line_ss >> tempDouble >> units; + if (units == "F") + tempDouble = F_TO_C(tempDouble); + else if (units == "C") + ; // do nothing, lol + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s. \n", token.c_str()); + } + return HPWH_ABORT; + } + heatSources[heatsource].maxT = tempDouble; + } + else if (token == "onlogic" || token == "offlogic" || token == "standbylogic") + { + line_ss >> tempString; + if (tempString == "nodes") + { + std::vector nodeNums; + std::vector weights; + std::string nextToken; + line_ss >> nextToken; + while (std::regex_match(nextToken, std::regex("\\d+"))) + { + int nodeNum = std::stoi(nextToken); + if (nodeNum > LOGIC_NODE_SIZE + 1 || nodeNum < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Node number for heatsource %d %s must be between 0 and %d. " + "\n", + heatsource, + token.c_str(), + LOGIC_NODE_SIZE + 1); + } + return HPWH_ABORT; + } + nodeNums.push_back(nodeNum); + line_ss >> nextToken; + } + if (nextToken == "weights") + { + line_ss >> nextToken; + while (std::regex_match(nextToken, std::regex("-?\\d*\\.\\d+(?:e-?\\d+)?"))) + { + weights.push_back(std::stod(nextToken)); + line_ss >> nextToken; + } + } + else + { + for (auto n : nodeNums) + { + n += 0; // used to get rid of unused variable compiler warning + weights.push_back(1.0); + } + } + if (nodeNums.size() != weights.size()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Number of weights for heatsource %d %s (%d) does not match number " + "of nodes for %s (%d). \n", + heatsource, + token.c_str(), + weights.size(), + token.c_str(), + nodeNums.size()); + } + return HPWH_ABORT; + } + if (nextToken != "absolute" && nextToken != "relative") + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper definition, \"%s\", for heat source %d %s. Should be " + "\"relative\" or \"absoute\".\n", + nextToken.c_str(), + heatsource, + token.c_str()); + } + return HPWH_ABORT; + } + bool absolute = (nextToken == "absolute"); + std::string compareStr; + line_ss >> compareStr >> tempDouble >> units; + std::function compare; + if (compareStr == "<") + compare = std::less(); + else if (compareStr == ">") + compare = std::greater(); + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper comparison, \"%s\", for heat source %d %s. Should be " + "\"<\" or \">\".\n", + compareStr.c_str(), + heatsource, + token.c_str()); + } + return HPWH_ABORT; + } + if (units == "F") + { + if (absolute) + { + tempDouble = F_TO_C(tempDouble); + } + else + { + tempDouble = dF_TO_dC(tempDouble); + } + } + else if (units == "C") + ; // do nothing, lol + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s from heatsource %d. \n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + std::vector nodeWeights; + for (size_t i = 0; i < nodeNums.size(); i++) + { + nodeWeights.emplace_back(nodeNums[i], weights[i]); + } + std::shared_ptr logic = + std::make_shared( + "custom", nodeWeights, tempDouble, this, absolute, compare); + if (token == "onlogic") + { + heatSources[heatsource].addTurnOnLogic(logic); + } + else if (token == "offlogic") + { + heatSources[heatsource].addShutOffLogic(std::move(logic)); + } + else + { // standby logic + heatSources[heatsource].standbyLogic = + std::make_shared( + "standby logic", nodeWeights, tempDouble, this, absolute, compare); + } + } + else if (token == "onlogic") + { + std::string nextToken; + line_ss >> nextToken; + bool absolute = (nextToken == "absolute"); + if (absolute) + { + std::string compareStr; + line_ss >> compareStr >> tempDouble >> units; + std::function compare; + if (compareStr == "<") + compare = std::less(); + else if (compareStr == ">") + compare = std::greater(); + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper comparison, \"%s\", for heat source %d %s. Should be " + "\"<\" or \">\".\n", + compareStr.c_str(), + heatsource, + token.c_str()); + } + return HPWH_ABORT; + } + line_ss >> tempDouble; + } + else + { + tempDouble = std::stod(nextToken); + } + line_ss >> units; + if (units == "F") + { + if (absolute) + { + tempDouble = F_TO_C(tempDouble); + } + else + { + tempDouble = dF_TO_dC(tempDouble); + } + } + else if (units == "C") + ; // do nothing, lol + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s from heatsource %d. \n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + if (tempString == "wholeTank") + { + heatSources[heatsource].addTurnOnLogic( + HPWH::wholeTank(tempDouble, UNITS_C, absolute)); + } + else if (tempString == "topThird") + { + heatSources[heatsource].addTurnOnLogic(HPWH::topThird(tempDouble)); + } + else if (tempString == "bottomThird") + { + heatSources[heatsource].addTurnOnLogic(HPWH::bottomThird(tempDouble)); + } + else if (tempString == "standby") + { + heatSources[heatsource].addTurnOnLogic(HPWH::standby(tempDouble)); + } + else if (tempString == "bottomSixth") + { + heatSources[heatsource].addTurnOnLogic(HPWH::bottomSixth(tempDouble)); + } + else if (tempString == "secondSixth") + { + heatSources[heatsource].addTurnOnLogic(HPWH::secondSixth(tempDouble)); + } + else if (tempString == "thirdSixth") + { + heatSources[heatsource].addTurnOnLogic(HPWH::thirdSixth(tempDouble)); + } + else if (tempString == "fourthSixth") + { + heatSources[heatsource].addTurnOnLogic(HPWH::fourthSixth(tempDouble)); + } + else if (tempString == "fifthSixth") + { + heatSources[heatsource].addTurnOnLogic(HPWH::fifthSixth(tempDouble)); + } + else if (tempString == "topSixth") + { + heatSources[heatsource].addTurnOnLogic(HPWH::topSixth(tempDouble)); + } + else if (tempString == "bottomHalf") + { + heatSources[heatsource].addTurnOnLogic(HPWH::bottomHalf(tempDouble)); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper %s for heat source %d\n", token.c_str(), heatsource); + } + return HPWH_ABORT; + } + } + else if (token == "offlogic") + { + line_ss >> tempDouble >> units; + if (units == "F") + tempDouble = F_TO_C(tempDouble); + else if (units == "C") + ; // do nothing, lol + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s from heatsource %d. \n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + if (tempString == "topNodeMaxTemp") + { + heatSources[heatsource].addShutOffLogic(HPWH::topNodeMaxTemp(tempDouble)); + } + else if (tempString == "bottomNodeMaxTemp") + { + heatSources[heatsource].addShutOffLogic( + HPWH::bottomNodeMaxTemp(tempDouble)); + } + else if (tempString == "bottomTwelfthMaxTemp") + { + heatSources[heatsource].addShutOffLogic( + HPWH::bottomTwelfthMaxTemp(tempDouble)); + } + else if (tempString == "bottomSixthMaxTemp") + { + heatSources[heatsource].addShutOffLogic( + HPWH::bottomSixthMaxTemp(tempDouble)); + } + else if (tempString == "largeDraw") + { + heatSources[heatsource].addShutOffLogic(HPWH::largeDraw(tempDouble)); + } + else if (tempString == "largerDraw") + { + heatSources[heatsource].addShutOffLogic(HPWH::largerDraw(tempDouble)); + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper %s for heat source %d\n", token.c_str(), heatsource); + } + return HPWH_ABORT; + } + } + } + else if (token == "type") + { + line_ss >> tempString; + if (tempString == "resistor") + { + heatSources[heatsource].typeOfHeatSource = TYPE_resistance; + } + else if (tempString == "compressor") + { + heatSources[heatsource].typeOfHeatSource = TYPE_compressor; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper %s for heat source %d\n", token.c_str(), heatsource); + } + return HPWH_ABORT; + } + } + else if (token == "coilConfig") + { + line_ss >> tempString; + if (tempString == "wrapped") + { + heatSources[heatsource].configuration = HeatSource::CONFIG_WRAPPED; + } + else if (tempString == "submerged") + { + heatSources[heatsource].configuration = HeatSource::CONFIG_SUBMERGED; + } + else if (tempString == "external") + { + heatSources[heatsource].configuration = HeatSource::CONFIG_EXTERNAL; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper %s for heat source %d\n", token.c_str(), heatsource); + } + return HPWH_ABORT; + } + } + else if (token == "heatCycle") + { + line_ss >> tempString; + if (tempString == "singlepass") + { + heatSources[heatsource].isMultipass = false; + } + else if (tempString == "multipass") + { + heatSources[heatsource].isMultipass = true; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper %s for heat source %d\n", token.c_str(), heatsource); + } + return HPWH_ABORT; + } + } + + else if (token == "externalInlet") + { + line_ss >> tempInt; + if (tempInt < num_nodes && tempInt >= 0) + { + heatSources[heatsource].externalInletHeight = tempInt; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper %s for heat source %d\n", token.c_str(), heatsource); + } + return HPWH_ABORT; + } + } + else if (token == "externalOutlet") + { + line_ss >> tempInt; + if (tempInt < num_nodes && tempInt >= 0) + { + heatSources[heatsource].externalOutletHeight = tempInt; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper %s for heat source %d\n", token.c_str(), heatsource); + } + return HPWH_ABORT; + } + } + + else if (token == "condensity") + { + double x; + std::vector condensity; + while (line_ss >> x) + condensity.push_back(x); + heatSources[heatsource].setCondensity(condensity); + } + else if (token == "nTemps") + { + line_ss >> nTemps; + heatSources[heatsource].perfMap.resize(nTemps); + } + else if (std::regex_match(token, std::regex("T\\d+"))) + { + std::smatch match; + std::regex_match(token, match, std::regex("T(\\d+)")); + nTemps = std::stoi(match[1].str()); + int maxTemps = (int)heatSources[heatsource].perfMap.size(); + + if (maxTemps < nTemps) + { + if (maxTemps == 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("%s specified for heatsource %d before definition of nTemps. \n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect specification for %s from heatsource %d. nTemps, %d, is " + "less than %d. \n", + token.c_str(), + heatsource, + maxTemps, + nTemps); + } + return HPWH_ABORT; + } + } + line_ss >> tempDouble >> units; + // if (units == "F") tempDouble = F_TO_C(tempDouble); + if (units == "F") + ; + // else if (units == "C") ; //do nothing, lol + else if (units == "C") + tempDouble = C_TO_F(tempDouble); + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s from heatsource %d. \n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + heatSources[heatsource].perfMap[nTemps - 1].T_F = tempDouble; + } + else if (std::regex_match(token, std::regex("(?:inPow|cop)T\\d+(?:const|lin|quad)"))) + { + std::smatch match; + std::regex_match(token, match, std::regex("(inPow|cop)T(\\d+)(const|lin|quad)")); + string var = match[1].str(); + nTemps = std::stoi(match[2].str()); + string coeff = match[3].str(); + int coeff_num; + if (coeff == "const") + { + coeff_num = 0; + } + else if (coeff == "lin") + { + coeff_num = 1; + } + else if (coeff == "quad") + { + coeff_num = 2; + } + + int maxTemps = (int)heatSources[heatsource].perfMap.size(); + + if (maxTemps < nTemps) + { + if (maxTemps == 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("%s specified for heatsource %d before definition of nTemps. \n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect specification for %s from heatsource %d. nTemps, %d, is " + "less than %d. \n", + token.c_str(), + heatsource, + maxTemps, + nTemps); + } + return HPWH_ABORT; + } + } + line_ss >> tempDouble; + + if (var == "inPow") + { + heatSources[heatsource].perfMap[nTemps - 1].inputPower_coeffs.push_back( + tempDouble); + } + else if (var == "cop") + { + heatSources[heatsource].perfMap[nTemps - 1].COP_coeffs.push_back(tempDouble); + } + } + else if (token == "hysteresis") + { + line_ss >> tempDouble >> units; + if (units == "F") + tempDouble = dF_TO_dC(tempDouble); + else if (units == "C") + ; // do nothing, lol + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect units specification for %s from heatsource %d. \n", + token.c_str(), + heatsource); + } + return HPWH_ABORT; + } + heatSources[heatsource].hysteresis_dC = tempDouble; + } + else if (token == "backupSource") + { + line_ss >> sourceNum; + heatSources[heatsource].backupHeatSource = &heatSources[sourceNum]; + } + else if (token == "companionSource") + { + line_ss >> sourceNum; + heatSources[heatsource].companionHeatSource = &heatSources[sourceNum]; + } + else if (token == "followedBySource") + { + line_ss >> sourceNum; + heatSources[heatsource].followedByHeatSource = &heatSources[sourceNum]; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Improper specifier (%s) for heat source %d\n", token.c_str(), heatsource); + } + } + + } // end heatsource options + else + { + msg("Improper keyword: %s \n", token.c_str()); + return HPWH_ABORT; + } + + } // end while over lines + + // take care of the non-input processing + hpwhModel = MODELS_CustomFile; + + tankTemps_C.resize(num_nodes); + + if (hasInitialTankTemp) + setTankToTemperature(initalTankT_C); + else + resetTankToSetpoint(); + + nextTankTemps_C.resize(num_nodes); + + isHeating = false; + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isOn) + { + isHeating = true; + } + heatSources[i].sortPerformanceMap(); + } + + calcDerivedValues(); + + if (checkInputs() == HPWH_ABORT) + { + return HPWH_ABORT; + } + simHasFailed = false; + return 0; } #endif //----------------------------------------------------------------------------- -/// @brief Reads a named schedule +/// @brief Reads a named schedule /// @param[out] schedule schedule values /// @param[in] scheduleName name of schedule to read -/// @param[in] testLength_min length of test (min) +/// @param[in] testLength_min length of test (min) /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::readSchedule(HPWH::Schedule &schedule, std::string scheduleName, long testLength_min) { - int minuteHrTmp; - bool hourInput; - std::string line, snippet, s, minORhr; - double valTmp; - - std::ifstream inputFile(scheduleName.c_str()); - - if(hpwhVerbosity >= VRB_reluctant) { - msg("Opening %s\n",scheduleName.c_str()); - } - - if(!inputFile.is_open()) { - return false; - } - - inputFile >> snippet >> valTmp; - - if(snippet != "default") { - if(hpwhVerbosity >= VRB_reluctant) { - msg("First line of %s must specify default\n",scheduleName.c_str()); - } - return false; - } - - // Fill with the default value - schedule.assign(testLength_min, valTmp); - - // Burn the first two lines - std::getline(inputFile, line); - std::getline(inputFile, line); - - std::stringstream ss(line); // Will parse with a stringstream - // Grab the first token, which is the minute or hour marker - ss >> minORhr; - if (minORhr.empty() ) { // If nothing left in the file - return true; - } - hourInput = tolower(minORhr.at(0)) == 'h'; - char c; // for commas - while (inputFile >> minuteHrTmp >> c >> valTmp) { - if (minuteHrTmp >= static_cast(schedule.size())) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Input file for %s has more minutes than test definition\n",scheduleName.c_str()); - } - return false; - } - // update the value - if (!hourInput) { - schedule[minuteHrTmp] = valTmp; - } - else if (hourInput) { - for (int j = minuteHrTmp * 60; j < (minuteHrTmp+1) * 60; j++) { - schedule[j] = valTmp; - } - } - } - - inputFile.close(); - return true; +bool HPWH::readSchedule(HPWH::Schedule& schedule, std::string scheduleName, long testLength_min) +{ + int minuteHrTmp; + bool hourInput; + std::string line, snippet, s, minORhr; + double valTmp; + + std::ifstream inputFile(scheduleName.c_str()); + + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Opening %s\n", scheduleName.c_str()); + } + + if (!inputFile.is_open()) + { + return false; + } + + inputFile >> snippet >> valTmp; + + if (snippet != "default") + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("First line of %s must specify default\n", scheduleName.c_str()); + } + return false; + } + + // Fill with the default value + schedule.assign(testLength_min, valTmp); + + // Burn the first two lines + std::getline(inputFile, line); + std::getline(inputFile, line); + + std::stringstream ss(line); // Will parse with a stringstream + // Grab the first token, which is the minute or hour marker + ss >> minORhr; + if (minORhr.empty()) + { // If nothing left in the file + return true; + } + hourInput = tolower(minORhr.at(0)) == 'h'; + char c; // for commas + while (inputFile >> minuteHrTmp >> c >> valTmp) + { + if (minuteHrTmp >= static_cast(schedule.size())) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Input file for %s has more minutes than test definition\n", + scheduleName.c_str()); + } + return false; + } + // update the value + if (!hourInput) + { + schedule[minuteHrTmp] = valTmp; + } + else if (hourInput) + { + for (int j = minuteHrTmp * 60; j < (minuteHrTmp + 1) * 60; j++) + { + schedule[j] = valTmp; + } + } + } + + inputFile.close(); + return true; } //----------------------------------------------------------------------------- /// @brief Reads the control info for a test from file "testInfo.txt" /// @param[in] testDirectory path to directory containing test files -/// @param[out] controlInfo data structure containing control info +/// @param[out] controlInfo data structure containing control info /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::readControlInfo(const std::string &testDirectory, HPWH::ControlInfo &controlInfo) -{ - std::ifstream controlFile; - std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; - // Read the test control file - controlFile.open(fileToOpen.c_str()); - if(!controlFile.is_open()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Could not open control file %s\n",fileToOpen.c_str()); - } - return false; - } - - controlInfo.outputCode = 0; - controlInfo.timeToRun_min = 0; - controlInfo.setpointT_C = 0.; - controlInfo.initialTankT_C = nullptr; - controlInfo.doConduction = true; - controlInfo.doInversionMixing = true; - controlInfo.inletH = nullptr; - controlInfo.tankSize_gal = nullptr; - controlInfo.tot_limit = nullptr; - controlInfo.useSoC = false; - controlInfo.temperatureUnits = "C"; - controlInfo.recordMinuteData = false; - controlInfo.recordYearData = false; - controlInfo.modifyDraw = false; - - std::string token; - std::string sValue; - while(controlFile >> token >> sValue) { - if(token == "setpoint") { // If a setpoint was specified then override the default - controlInfo.setpointT_C = std::stod(sValue); - } - else if(token == "length_of_test") { - controlInfo.timeToRun_min = std::stoi(sValue); - } - else if(token == "doInversionMixing") { - controlInfo.doInversionMixing = getBool(sValue); - } - else if(token == "doConduction") { - controlInfo.doConduction = getBool(sValue); - } - else if(token == "inletH") { - controlInfo.inletH = std::unique_ptr(new double(std::stod(sValue))); - } - else if(token == "tanksize") { - controlInfo.tankSize_gal = std::unique_ptr(new double(std::stod(sValue))); - } - else if(token == "tot_limit") { - controlInfo.tot_limit = std::unique_ptr(new double(std::stod(sValue))); - } - else if(token == "useSoC") { - controlInfo.useSoC = getBool(sValue); - } - else if(token == "initialTankT_C") { // Initialize at this temperature instead of setpoint - controlInfo.initialTankT_C = std::unique_ptr(new double(std::stod(sValue))); - } - else if(token == "temperature_units") { // Initialize at this temperature instead of setpoint - controlInfo.temperatureUnits = sValue; - } - else { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Unrecognized key in %s\n",token.c_str()); - } - } - } - controlFile.close(); - - if(controlInfo.temperatureUnits == "F") { - controlInfo.setpointT_C = F_TO_C(controlInfo.setpointT_C); - if (controlInfo.initialTankT_C !=nullptr) - *controlInfo.initialTankT_C=F_TO_C(*controlInfo.initialTankT_C); - } - - if(controlInfo.timeToRun_min == 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Error: record length_of_test not found in testInfo.txt file\n"); - } - return false; - } - - return true; +bool HPWH::readControlInfo(const std::string& testDirectory, HPWH::ControlInfo& controlInfo) +{ + std::ifstream controlFile; + std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; + // Read the test control file + controlFile.open(fileToOpen.c_str()); + if (!controlFile.is_open()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Could not open control file %s\n", fileToOpen.c_str()); + } + return false; + } + + controlInfo.outputCode = 0; + controlInfo.timeToRun_min = 0; + controlInfo.setpointT_C = 0.; + controlInfo.initialTankT_C = nullptr; + controlInfo.doConduction = true; + controlInfo.doInversionMixing = true; + controlInfo.inletH = nullptr; + controlInfo.tankSize_gal = nullptr; + controlInfo.tot_limit = nullptr; + controlInfo.useSoC = false; + controlInfo.temperatureUnits = "C"; + controlInfo.recordMinuteData = false; + controlInfo.recordYearData = false; + controlInfo.modifyDraw = false; + + std::string token; + std::string sValue; + while (controlFile >> token >> sValue) + { + if (token == "setpoint") + { // If a setpoint was specified then override the default + controlInfo.setpointT_C = std::stod(sValue); + } + else if (token == "length_of_test") + { + controlInfo.timeToRun_min = std::stoi(sValue); + } + else if (token == "doInversionMixing") + { + controlInfo.doInversionMixing = getBool(sValue); + } + else if (token == "doConduction") + { + controlInfo.doConduction = getBool(sValue); + } + else if (token == "inletH") + { + controlInfo.inletH = std::unique_ptr(new double(std::stod(sValue))); + } + else if (token == "tanksize") + { + controlInfo.tankSize_gal = std::unique_ptr(new double(std::stod(sValue))); + } + else if (token == "tot_limit") + { + controlInfo.tot_limit = std::unique_ptr(new double(std::stod(sValue))); + } + else if (token == "useSoC") + { + controlInfo.useSoC = getBool(sValue); + } + else if (token == "initialTankT_C") + { // Initialize at this temperature instead of setpoint + controlInfo.initialTankT_C = std::unique_ptr(new double(std::stod(sValue))); + } + else if (token == "temperature_units") + { // Initialize at this temperature instead of setpoint + controlInfo.temperatureUnits = sValue; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Unrecognized key in %s\n", token.c_str()); + } + } + } + controlFile.close(); + + if (controlInfo.temperatureUnits == "F") + { + controlInfo.setpointT_C = F_TO_C(controlInfo.setpointT_C); + if (controlInfo.initialTankT_C != nullptr) + *controlInfo.initialTankT_C = F_TO_C(*controlInfo.initialTankT_C); + } + + if (controlInfo.timeToRun_min == 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Error: record length_of_test not found in testInfo.txt file\n"); + } + return false; + } + + return true; } //----------------------------------------------------------------------------- /// @brief Reads the schedules for a test /// @param[in] testDirectory path to directory containing test files -/// @param[in] controlInfo data structure containing control info -/// @param[out] allSchedules collection of test schedules read +/// @param[in] controlInfo data structure containing control info +/// @param[out] allSchedules collection of test schedules read /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::readSchedules(const std::string &testDirectory, const HPWH::ControlInfo &controlInfo, std::vector &allSchedules) -{ - std::vector scheduleNames; - scheduleNames.push_back("inletT"); - scheduleNames.push_back("draw"); - scheduleNames.push_back("ambientT"); - scheduleNames.push_back("evaporatorT"); - scheduleNames.push_back("DR"); - scheduleNames.push_back("setpoint"); - scheduleNames.push_back("SoC"); - - long outputCode = controlInfo.outputCode; - allSchedules.reserve(scheduleNames.size()); - for(auto i = 0; i < scheduleNames.size(); i++) { - std::string fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; - Schedule schedule; - if(!readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min)) { - if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { - if(hpwhVerbosity >= VRB_reluctant) { - msg("readSchedule returns an error on schedule %s\n",scheduleNames[i].c_str()); - } - return false; - } - } - allSchedules.push_back(schedule); - } - - if(controlInfo.temperatureUnits == "F") { - for(auto &T: allSchedules[0]) { - T = F_TO_C(T); - } - for(auto &T: allSchedules[2]) { - T = F_TO_C(T); - } - for(auto &T: allSchedules[3]) { - T = F_TO_C(T); - } - for(auto &T: allSchedules[5]) { - T = F_TO_C(T); - } - } - - setDoInversionMixing(controlInfo.doInversionMixing); - setDoConduction(controlInfo.doConduction); - - if (controlInfo.setpointT_C > 0.) { - if (!allSchedules[5].empty()) { - setSetpoint(allSchedules[5][0]); //expect this to fail sometimes - if (controlInfo.initialTankT_C != nullptr) - setTankToTemperature(*controlInfo.initialTankT_C); - else - resetTankToSetpoint(); - } - else { - setSetpoint(controlInfo.setpointT_C); - if (controlInfo.initialTankT_C != nullptr) - setTankToTemperature(*controlInfo.initialTankT_C); - else - resetTankToSetpoint(); - } - } - - if (controlInfo.inletH != nullptr) { - outputCode += setInletByFraction(*controlInfo.inletH); - } - if (controlInfo.tankSize_gal != nullptr) { - outputCode += setTankSize(*controlInfo.tankSize_gal, HPWH::UNITS_GAL); - } - if (controlInfo.tot_limit != nullptr) { - outputCode += setTimerLimitTOT(*controlInfo.tot_limit); - } - if (controlInfo.useSoC) { - if (allSchedules[6].empty()) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("If useSoC is true need an SoCschedule.csv file. \n"); - } - } - const double soCMinTUse_C = F_TO_C(110.); - const double soCMains_C = F_TO_C(65.); - outputCode += switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); - } - - if (outputCode != 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Control file testInfo.txt has unsettable specifics in it. \n"); - } - return false; - } - return true; +bool HPWH::readSchedules(const std::string& testDirectory, + const HPWH::ControlInfo& controlInfo, + std::vector& allSchedules) +{ + std::vector scheduleNames; + scheduleNames.push_back("inletT"); + scheduleNames.push_back("draw"); + scheduleNames.push_back("ambientT"); + scheduleNames.push_back("evaporatorT"); + scheduleNames.push_back("DR"); + scheduleNames.push_back("setpoint"); + scheduleNames.push_back("SoC"); + + long outputCode = controlInfo.outputCode; + allSchedules.reserve(scheduleNames.size()); + for (auto i = 0; i < scheduleNames.size(); i++) + { + std::string fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; + Schedule schedule; + if (!readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min)) + { + if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("readSchedule returns an error on schedule %s\n", scheduleNames[i].c_str()); + } + return false; + } + } + allSchedules.push_back(schedule); + } + + if (controlInfo.temperatureUnits == "F") + { + for (auto& T : allSchedules[0]) + { + T = F_TO_C(T); + } + for (auto& T : allSchedules[2]) + { + T = F_TO_C(T); + } + for (auto& T : allSchedules[3]) + { + T = F_TO_C(T); + } + for (auto& T : allSchedules[5]) + { + T = F_TO_C(T); + } + } + + setDoInversionMixing(controlInfo.doInversionMixing); + setDoConduction(controlInfo.doConduction); + + if (controlInfo.setpointT_C > 0.) + { + if (!allSchedules[5].empty()) + { + setSetpoint(allSchedules[5][0]); // expect this to fail sometimes + if (controlInfo.initialTankT_C != nullptr) + setTankToTemperature(*controlInfo.initialTankT_C); + else + resetTankToSetpoint(); + } + else + { + setSetpoint(controlInfo.setpointT_C); + if (controlInfo.initialTankT_C != nullptr) + setTankToTemperature(*controlInfo.initialTankT_C); + else + resetTankToSetpoint(); + } + } + + if (controlInfo.inletH != nullptr) + { + outputCode += setInletByFraction(*controlInfo.inletH); + } + if (controlInfo.tankSize_gal != nullptr) + { + outputCode += setTankSize(*controlInfo.tankSize_gal, HPWH::UNITS_GAL); + } + if (controlInfo.tot_limit != nullptr) + { + outputCode += setTimerLimitTOT(*controlInfo.tot_limit); + } + if (controlInfo.useSoC) + { + if (allSchedules[6].empty()) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("If useSoC is true need an SoCschedule.csv file. \n"); + } + } + const double soCMinTUse_C = F_TO_C(110.); + const double soCMains_C = F_TO_C(65.); + outputCode += switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); + } + + if (outputCode != 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Control file testInfo.txt has unsettable specifics in it. \n"); + } + return false; + } + return true; } //----------------------------------------------------------------------------- /// @brief Runs a simulation /// @param[in] testDesc data structure containing test description /// @param[in] outputDirectory destination path for test results (filename based on testDesc) -/// @param[in] controlInfo data structure containing control info -/// @param[in] allSchedules collection of test schedules -/// @param[in] airT_C air temperature (degC) used for temperature depression -/// @param[in] doTempDepress whether to apply temperature depression +/// @param[in] controlInfo data structure containing control info +/// @param[in] allSchedules collection of test schedules +/// @param[in] airT_C air temperature (degC) used for temperature depression +/// @param[in] doTempDepress whether to apply temperature depression /// @param[out] testResults data structure containing test results /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::runSimulation( - const TestDesc &testDesc, - const std::string &outputDirectory, - const HPWH::ControlInfo &controlInfo, - std::vector &allSchedules, - double airT_C, - const bool doTempDepress, - TestResults &testResults) -{ - const double energyBalThreshold = 0.0001; // 0.1 % - const int nTestTCouples = 6; - - // UEF data - testResults = {false, 0., 0.}; - - FILE *yearOutputFile = NULL; - if (controlInfo.recordYearData) { - std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; - if (fopen_s(&yearOutputFile, sOutputFilename.c_str(), "a+") != 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Could not open output file \n", sOutputFilename.c_str()); - } - return false; - } - } - - FILE *minuteOutputFile = NULL; - if (controlInfo.recordMinuteData) { - std::string sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; - if (fopen_s(&minuteOutputFile, sOutputFilename.c_str(), "w+") != 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("Could not open output file \n", sOutputFilename.c_str()); - } - return false; - } - } - - if (controlInfo.recordMinuteData) { - string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; - if (isCompressoExternalMultipass()) { - sHeader += "condenserInletT,condenserOutletT,externalVolGPM,"; - } - if(controlInfo.useSoC){ - sHeader += "targetSoCFract,soCFract,"; - } - WriteCSVHeading(minuteOutputFile, sHeader.c_str(), nTestTCouples, CSVOPT_NONE); - } - - double cumulativeEnergyIn_kWh[3] = {0., 0., 0.}; - double cumulativeEnergyOut_kWh[3] = {0., 0., 0.}; - - bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); - - // ------------------------------------- Simulate --------------------------------------- // - if(hpwhVerbosity >= VRB_reluctant) { - msg("Now Simulating %d Minutes of the Test\n", controlInfo.timeToRun_min); - } - - // run simulation in 1-min steps - for (int i = 0; i < controlInfo.timeToRun_min; i++) { - - double inletT_C = allSchedules[0][i]; - double drawVolume_L = GAL_TO_L(allSchedules[1][i]); - double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; - double externalT_C = allSchedules[3][i]; - HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); - - // change setpoint if specified in schedule - if (doChangeSetpoint) { - setSetpoint(allSchedules[5][i]); //expect this to fail sometimes - } - - // change SoC schedule - if (controlInfo.useSoC) { - if (setTargetSoCFraction(allSchedules[6][i]) != 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("ERROR: Can not set the target state of charge fraction.\n"); - } - return false; - } - } - - if (controlInfo.modifyDraw) { - const double mixT_C = F_TO_C(125.); - if (getSetpoint() <= mixT_C) { // do a simple mix down of the draw for the cold-water temperature - drawVolume_L *= (mixT_C - inletT_C) / (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); - } - } - - double inletT2_C = inletT_C; - double drawVolume2_L = drawVolume_L; - - double previousTankHeatContent_kJ = getTankHeatContent_kJ(); - - // run a step - int runResult = - runOneStep( - inletT_C, // inlet water temperature (C) - drawVolume_L, // draw volume (L) - ambientT_C, // ambient Temp (C) - externalT_C, // external Temp (C) - drStatus, // DDR Status (now an enum. Fixed for now as allow) - drawVolume2_L, // inlet-2 volume (L) - inletT2_C, // inlet-2 Temp (C) - NULL); // no extra heat - - if (runResult != 0) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("ERROR: Run failed.\n"); - } - return false; - } - - if (!isEnergyBalanced(drawVolume_L,inletT_C,previousTankHeatContent_kJ,energyBalThreshold)) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("WARNING: On minute %i, HPWH has an energy balance error.\n",i); - } - // return false; // fails on ModelTest.testREGoesTo93C.TamScalable_SP.Preset; issue in addHeatExternal - } - - // check timing - for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - if (getNthHeatSourceRunTime(iHS) > 1.) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("ERROR: On minute %i, heat source %i ran for %i min.\n", iHS, getNthHeatSourceRunTime(iHS)); - } - return false; - } - } - - // check flow for external MP - if (isCompressoExternalMultipass()) { - double volumeHeated_gal = getExternalVolumeHeated(HPWH::UNITS_GAL); - double mpFlowVolume_gal = getExternalMPFlowRate(HPWH::UNITS_GPM)*getNthHeatSourceRunTime(getCompressorIndex()); - if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) { - if(hpwhVerbosity >= VRB_reluctant) { - msg("ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: %d, mpFlowRate in 1 min [gal] %d\n", - volumeHeated_gal, mpFlowVolume_gal); - } - return false; - } - } - - // location temperature reported with temperature depression, instead of ambient temperature - if (doTempDepress) { - ambientT_C = getLocationTemp_C(); - } - - // write minute summary - if (controlInfo.recordMinuteData) { - std::string sPreamble = std::to_string(i) + ", " + std::to_string(ambientT_C) + ", " + std::to_string(getSetpoint()) + ", " + - std::to_string(allSchedules[0][i]) + ", " + std::to_string(allSchedules[1][i]) + ", "; - // Add some more outputs for mp tests - if (isCompressoExternalMultipass()) { - sPreamble += std::to_string(getCondenserWaterInletTemp()) + ", " + std::to_string(getCondenserWaterOutletTemp()) + ", " + - std::to_string(getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; - } - if (controlInfo.useSoC) { - sPreamble += std::to_string(allSchedules[6][i]) + ", " + std::to_string(getSoCFraction()) + ", "; - } - int csvOptions = CSVOPT_NONE; - if (allSchedules[1][i] > 0.) { - csvOptions |= CSVOPT_IS_DRAWING; - } - WriteCSVRow(minuteOutputFile, sPreamble.c_str(), nTestTCouples, csvOptions); - } - - // accumulate energy and draw - double energyIn_kJ = 0.; - for (int iHS = 0; iHS < getNumHeatSources(); iHS++) { - double heatSourceEnergyIn_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); - energyIn_kJ += heatSourceEnergyIn_kJ; - - cumulativeEnergyIn_kWh[iHS] += KJ_TO_KWH(heatSourceEnergyIn_kJ) * 1000.; - cumulativeEnergyOut_kWh[iHS] += getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; - } - testResults.totalEnergyConsumed_kJ += energyIn_kJ; - testResults.totalVolumeRemoved_L += drawVolume_L; - } - // -------------------------------------Simulation complete --------------------------------------- // - - if (controlInfo.recordMinuteData) { - fclose(minuteOutputFile); - } - - // write year summary - if (controlInfo.recordYearData) { - std::string firstCol = testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; - fprintf(yearOutputFile, "%s", firstCol.c_str()); - double totalEnergyIn_kWh = 0, totalEnergyOut_kWh = 0; - for (int iHS = 0; iHS < 3; iHS++) { - fprintf(yearOutputFile, ",%0.0f,%0.0f", cumulativeEnergyIn_kWh[iHS], cumulativeEnergyOut_kWh[iHS]); - totalEnergyIn_kWh += cumulativeEnergyIn_kWh[iHS]; - totalEnergyOut_kWh += cumulativeEnergyOut_kWh[iHS]; - } - fprintf(yearOutputFile, ",%0.0f,%0.0f", totalEnergyIn_kWh, totalEnergyOut_kWh); - for (int iHS = 0; iHS < 3; iHS++) { - fprintf(yearOutputFile, ",%0.2f", cumulativeEnergyOut_kWh[iHS] /cumulativeEnergyIn_kWh[iHS]); - } - fprintf(yearOutputFile, ",%0.2f", totalEnergyOut_kWh/totalEnergyIn_kWh); - fprintf(yearOutputFile, "\n"); - fclose(yearOutputFile); - } - - testResults.passed = true; - return true; +bool HPWH::runSimulation(const TestDesc& testDesc, + const std::string& outputDirectory, + const HPWH::ControlInfo& controlInfo, + std::vector& allSchedules, + double airT_C, + const bool doTempDepress, + TestResults& testResults) +{ + const double energyBalThreshold = 0.0001; // 0.1 % + const int nTestTCouples = 6; + + // UEF data + testResults = {false, 0., 0.}; + + FILE* yearOutputFile = NULL; + if (controlInfo.recordYearData) + { + std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; + if (fopen_s(&yearOutputFile, sOutputFilename.c_str(), "a+") != 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Could not open output file \n", sOutputFilename.c_str()); + } + return false; + } + } + + FILE* minuteOutputFile = NULL; + if (controlInfo.recordMinuteData) + { + std::string sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; + if (fopen_s(&minuteOutputFile, sOutputFilename.c_str(), "w+") != 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Could not open output file \n", sOutputFilename.c_str()); + } + return false; + } + } + + if (controlInfo.recordMinuteData) + { + string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; + if (isCompressoExternalMultipass()) + { + sHeader += "condenserInletT,condenserOutletT,externalVolGPM,"; + } + if (controlInfo.useSoC) + { + sHeader += "targetSoCFract,soCFract,"; + } + WriteCSVHeading(minuteOutputFile, sHeader.c_str(), nTestTCouples, CSVOPT_NONE); + } + + double cumulativeEnergyIn_kWh[3] = {0., 0., 0.}; + double cumulativeEnergyOut_kWh[3] = {0., 0., 0.}; + + bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); + + // ------------------------------------- Simulate --------------------------------------- // + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Now Simulating %d Minutes of the Test\n", controlInfo.timeToRun_min); + } + + // run simulation in 1-min steps + for (int i = 0; i < controlInfo.timeToRun_min; i++) + { + + double inletT_C = allSchedules[0][i]; + double drawVolume_L = GAL_TO_L(allSchedules[1][i]); + double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; + double externalT_C = allSchedules[3][i]; + HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); + + // change setpoint if specified in schedule + if (doChangeSetpoint) + { + setSetpoint(allSchedules[5][i]); // expect this to fail sometimes + } + + // change SoC schedule + if (controlInfo.useSoC) + { + if (setTargetSoCFraction(allSchedules[6][i]) != 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("ERROR: Can not set the target state of charge fraction.\n"); + } + return false; + } + } + + if (controlInfo.modifyDraw) + { + const double mixT_C = F_TO_C(125.); + if (getSetpoint() <= mixT_C) + { // do a simple mix down of the draw for the cold-water temperature + drawVolume_L *= (mixT_C - inletT_C) / + (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); + } + } + + double inletT2_C = inletT_C; + double drawVolume2_L = drawVolume_L; + + double previousTankHeatContent_kJ = getTankHeatContent_kJ(); + + // run a step + int runResult = runOneStep(inletT_C, // inlet water temperature (C) + drawVolume_L, // draw volume (L) + ambientT_C, // ambient Temp (C) + externalT_C, // external Temp (C) + drStatus, // DDR Status (now an enum. Fixed for now as allow) + drawVolume2_L, // inlet-2 volume (L) + inletT2_C, // inlet-2 Temp (C) + NULL); // no extra heat + + if (runResult != 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("ERROR: Run failed.\n"); + } + return false; + } + + if (!isEnergyBalanced( + drawVolume_L, inletT_C, previousTankHeatContent_kJ, energyBalThreshold)) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("WARNING: On minute %i, HPWH has an energy balance error.\n", i); + } + // return false; // fails on ModelTest.testREGoesTo93C.TamScalable_SP.Preset; issue in + // addHeatExternal + } + + // check timing + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) + { + if (getNthHeatSourceRunTime(iHS) > 1.) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("ERROR: On minute %i, heat source %i ran for %i min.\n", + iHS, + getNthHeatSourceRunTime(iHS)); + } + return false; + } + } + + // check flow for external MP + if (isCompressoExternalMultipass()) + { + double volumeHeated_gal = getExternalVolumeHeated(HPWH::UNITS_GAL); + double mpFlowVolume_gal = getExternalMPFlowRate(HPWH::UNITS_GPM) * + getNthHeatSourceRunTime(getCompressorIndex()); + if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " + "%d, mpFlowRate in 1 min [gal] %d\n", + volumeHeated_gal, + mpFlowVolume_gal); + } + return false; + } + } + + // location temperature reported with temperature depression, instead of ambient temperature + if (doTempDepress) + { + ambientT_C = getLocationTemp_C(); + } + + // write minute summary + if (controlInfo.recordMinuteData) + { + std::string sPreamble = std::to_string(i) + ", " + std::to_string(ambientT_C) + ", " + + std::to_string(getSetpoint()) + ", " + + std::to_string(allSchedules[0][i]) + ", " + + std::to_string(allSchedules[1][i]) + ", "; + // Add some more outputs for mp tests + if (isCompressoExternalMultipass()) + { + sPreamble += std::to_string(getCondenserWaterInletTemp()) + ", " + + std::to_string(getCondenserWaterOutletTemp()) + ", " + + std::to_string(getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; + } + if (controlInfo.useSoC) + { + sPreamble += std::to_string(allSchedules[6][i]) + ", " + + std::to_string(getSoCFraction()) + ", "; + } + int csvOptions = CSVOPT_NONE; + if (allSchedules[1][i] > 0.) + { + csvOptions |= CSVOPT_IS_DRAWING; + } + WriteCSVRow(minuteOutputFile, sPreamble.c_str(), nTestTCouples, csvOptions); + } + + // accumulate energy and draw + double energyIn_kJ = 0.; + for (int iHS = 0; iHS < getNumHeatSources(); iHS++) + { + double heatSourceEnergyIn_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); + energyIn_kJ += heatSourceEnergyIn_kJ; + + cumulativeEnergyIn_kWh[iHS] += KJ_TO_KWH(heatSourceEnergyIn_kJ) * 1000.; + cumulativeEnergyOut_kWh[iHS] += + getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; + } + testResults.totalEnergyConsumed_kJ += energyIn_kJ; + testResults.totalVolumeRemoved_L += drawVolume_L; + } + // -------------------------------------Simulation complete + // --------------------------------------- // + + if (controlInfo.recordMinuteData) + { + fclose(minuteOutputFile); + } + + // write year summary + if (controlInfo.recordYearData) + { + std::string firstCol = + testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; + fprintf(yearOutputFile, "%s", firstCol.c_str()); + double totalEnergyIn_kWh = 0, totalEnergyOut_kWh = 0; + for (int iHS = 0; iHS < 3; iHS++) + { + fprintf(yearOutputFile, + ",%0.0f,%0.0f", + cumulativeEnergyIn_kWh[iHS], + cumulativeEnergyOut_kWh[iHS]); + totalEnergyIn_kWh += cumulativeEnergyIn_kWh[iHS]; + totalEnergyOut_kWh += cumulativeEnergyOut_kWh[iHS]; + } + fprintf(yearOutputFile, ",%0.0f,%0.0f", totalEnergyIn_kWh, totalEnergyOut_kWh); + for (int iHS = 0; iHS < 3; iHS++) + { + fprintf(yearOutputFile, + ",%0.2f", + cumulativeEnergyOut_kWh[iHS] / cumulativeEnergyIn_kWh[iHS]); + } + fprintf(yearOutputFile, ",%0.2f", totalEnergyOut_kWh / totalEnergyIn_kWh); + fprintf(yearOutputFile, "\n"); + fclose(yearOutputFile); + } + + testResults.passed = true; + return true; } diff --git a/src/HPWH.hh b/src/HPWH.hh index 01aae6ef..a0d3731d 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -10,1363 +10,1541 @@ #include #include -#include //for exit +#include //for exit #include -namespace Btwxt { class RegularGridInterpolator; }; +namespace Btwxt +{ +class RegularGridInterpolator; +}; -//#define HPWH_ABRIDGED +// #define HPWH_ABRIDGED /**< If HPWH_ABRIDGED is defined, then some function definitions will be * excluded from compiling. This is done in order to reduce the size of the * final compiled code. */ #include "HPWHversion.hh" -class HPWH { -public: - static const int version_major = HPWHVRSN_MAJOR; - static const int version_minor = HPWHVRSN_MINOR; - static const int version_patch = HPWHVRSN_PATCH; - static const std::string version_maint; // Initialized in source file (HPWH.cc) - - static const float DENSITYWATER_kgperL; - static const float KWATER_WpermC; - static const float CPWATER_kJperkgC; - static const int CONDENSITY_SIZE = 12; /** SANCO2 5-23 - MODELS_SANCO2_43 = 120, /**< SANCO2 43 gallon CO2 external heat pump */ - MODELS_SANCO2_83 = 121, /**< SANCO2 83 gallon CO2 external heat pump */ - MODELS_SANCO2_GS3_45HPA_US_SP = 122, /**< SANCO2 80 gallon CO2 external heat pump used for MF */ - MODELS_SANCO2_119 = 123, /**< SANCO2 120 gallon CO2 external heat pump */ - - // Sanden synomyms for backward compatability - // allow unmodified code using HPWHsim to build - MODELS_Sanden40 = MODELS_SANCO2_43, - MODELS_Sanden80 = MODELS_SANCO2_83, - MODELS_Sanden_GS3_45HPA_US_SP = MODELS_SANCO2_GS3_45HPA_US_SP, - MODELS_Sanden120 = MODELS_SANCO2_119, - - // The new-ish Rheem - MODELS_RheemHB50 = 140, /**< Rheem 2014 (?) Model */ - MODELS_RheemHBDR2250 = 141, /**< 50 gallon, 2250 W resistance Rheem HB Duct Ready */ - MODELS_RheemHBDR4550 = 142, /**< 50 gallon, 4500 W resistance Rheem HB Duct Ready */ - MODELS_RheemHBDR2265 = 143, /**< 65 gallon, 2250 W resistance Rheem HB Duct Ready */ - MODELS_RheemHBDR4565 = 144, /**< 65 gallon, 4500 W resistance Rheem HB Duct Ready */ - MODELS_RheemHBDR2280 = 145, /**< 80 gallon, 2250 W resistance Rheem HB Duct Ready */ - MODELS_RheemHBDR4580 = 146, /**< 80 gallon, 4500 W resistance Rheem HB Duct Ready */ - - // The new new Rheem - MODELS_Rheem2020Prem40 = 151, /**< 40 gallon, Rheem 2020 Premium */ - MODELS_Rheem2020Prem50 = 152, /**< 50 gallon, Rheem 2020 Premium */ - MODELS_Rheem2020Prem65 = 153, /**< 65 gallon, Rheem 2020 Premium */ - MODELS_Rheem2020Prem80 = 154, /**< 80 gallon, Rheem 2020 Premium */ - MODELS_Rheem2020Build40 = 155, /**< 40 gallon, Rheem 2020 Builder */ - MODELS_Rheem2020Build50 = 156, /**< 50 gallon, Rheem 2020 Builder */ - MODELS_Rheem2020Build65 = 157, /**< 65 gallon, Rheem 2020 Builder */ - MODELS_Rheem2020Build80 = 158, /**< 80 gallon, Rheem 2020 Builder */ - - // Rheem 120V dedicated-circuit product, no resistance elements - MODELS_RheemPlugInDedicated40 = 1160, /**< 40 gallon, Rheem 120V dedicated-circuit */ - MODELS_RheemPlugInDedicated50 = 1161, /**< 50 gallon, Rheem 120V dedicated-circuit */ - - // Rheem 120V shared-circuit products, no resistance elements. - MODELS_RheemPlugInShared40 = 1150, /**< 40 gallon, Rheem 120V shared-circuit */ - MODELS_RheemPlugInShared50 = 1151, /**< 50 gallon, Rheem 120V shared-circuit */ - MODELS_RheemPlugInShared65 = 1152, /**< 65 gallon, Rheem 120V shared-circuit */ - MODELS_RheemPlugInShared80 = 1153, /**< 80 gallon, Rheem 120V shared-circuit */ - - // The new-ish Stiebel - MODELS_Stiebel220E = 160, /**< Stiebel Eltron (2014 model?) */ - - // Generic water heaters, corresponding to the tiers 1, 2, and 3 - MODELS_Generic1 = 170, /**< Generic Tier 1 */ - MODELS_Generic2 = 171, /**< Generic Tier 2 */ - MODELS_Generic3 = 172, /**< Generic Tier 3 */ - MODELS_UEF2generic = 173, /**< UEF 2.0, modified GE2014STDMode case */ - MODELS_genericCustomUEF = 174, /**< used for creating "generic" model with custom uef*/ - - MODELS_AWHSTier3Generic40 = 175, /**< Generic AWHS Tier 3 50 gallons*/ - MODELS_AWHSTier3Generic50 = 176, /**< Generic AWHS Tier 3 50 gallons*/ - MODELS_AWHSTier3Generic65 = 177, /**< Generic AWHS Tier 3 65 gallons*/ - MODELS_AWHSTier3Generic80 = 178, /**< Generic AWHS Tier 3 80 gallons*/ - - MODELS_StorageTank = 180, /**< Generic Tank without heaters */ - MODELS_TamScalable_SP = 190, /** < HPWH input passed off a poor preforming SP model that has scalable input capacity and COP */ - MODELS_Scalable_MP = 191, /** < Lower performance MP model that has scalable input capacity and COP */ - - // Non-preset models - MODELS_CustomFile = 200, /**< HPWH parameters were input via file */ - MODELS_CustomResTank = 201, /**< HPWH parameters were input via HPWHinit_resTank */ - MODELS_CustomResTankGeneric = 202, /**< HPWH parameters were input via HPWHinit_commercialResTank */ - - // Larger Colmac models in single pass configuration - MODELS_ColmacCxV_5_SP = 210, /**< Colmac CxA_5 external heat pump in Single Pass Mode */ - MODELS_ColmacCxA_10_SP = 211, /**< Colmac CxA_10 external heat pump in Single Pass Mode */ - MODELS_ColmacCxA_15_SP = 212, /**< Colmac CxA_15 external heat pump in Single Pass Mode */ - MODELS_ColmacCxA_20_SP = 213, /**< Colmac CxA_20 external heat pump in Single Pass Mode */ - MODELS_ColmacCxA_25_SP = 214, /**< Colmac CxA_25 external heat pump in Single Pass Mode */ - MODELS_ColmacCxA_30_SP = 215, /**< Colmac CxA_30 external heat pump in Single Pass Mode */ - - // Larger Colmac models in multi pass configuration - MODELS_ColmacCxV_5_MP = 310, /**< Colmac CxA_5 external heat pump in Multi Pass Mode */ - MODELS_ColmacCxA_10_MP = 311, /**< Colmac CxA_10 external heat pump in Multi Pass Mode */ - MODELS_ColmacCxA_15_MP = 312, /**< Colmac CxA_15 external heat pump in Multi Pass Mode */ - MODELS_ColmacCxA_20_MP = 313, /**< Colmac CxA_20 external heat pump in Multi Pass Mode */ - MODELS_ColmacCxA_25_MP = 314, /**< Colmac CxA_25 external heat pump in Multi Pass Mode */ - MODELS_ColmacCxA_30_MP = 315, /**< Colmac CxA_30 external heat pump in Multi Pass Mode */ - - // Larger Nyle models in single pass configuration - MODELS_NyleC25A_SP = 230, /*< Nyle C25A external heat pump in Single Pass Mode */ - MODELS_NyleC60A_SP = 231, /*< Nyle C60A external heat pump in Single Pass Mode */ - MODELS_NyleC90A_SP = 232, /*< Nyle C90A external heat pump in Single Pass Mode */ - MODELS_NyleC125A_SP = 233, /*< Nyle C125A external heat pump in Single Pass Mode */ - MODELS_NyleC185A_SP = 234, /*< Nyle C185A external heat pump in Single Pass Mode */ - MODELS_NyleC250A_SP = 235, /*< Nyle C250A external heat pump in Single Pass Mode */ - // Larger Nyle models with the cold weather package! - MODELS_NyleC60A_C_SP = 241, /*< Nyle C60A external heat pump in Single Pass Mode */ - MODELS_NyleC90A_C_SP = 242, /*< Nyle C90A external heat pump in Single Pass Mode */ - MODELS_NyleC125A_C_SP = 243, /*< Nyle C125A external heat pump in Single Pass Mode */ - MODELS_NyleC185A_C_SP = 244, /*< Nyle C185A external heat pump in Single Pass Mode */ - MODELS_NyleC250A_C_SP = 245, /*< Nyle C250A external heat pump in Single Pass Mode */ - - // Mitsubishi Electric Trane - MODELS_MITSUBISHI_QAHV_N136TAU_HPB_SP = 250, /*< Mitsubishi Electric Trane QAHV external CO2 heat pump */ - - // Larger Nyle models in multi pass configuration - //MODELS_NyleC25A_MP = 330, /*< Nyle C25A external heat pump in Multi Pass Mode */ - MODELS_NyleC60A_MP = 331, /*< Nyle C60A external heat pump in Multi Pass Mode */ - MODELS_NyleC90A_MP = 332, /*< Nyle C90A external heat pump in Multi Pass Mode */ - MODELS_NyleC125A_MP = 333, /*< Nyle C125A external heat pump in Multi Pass Mode */ - MODELS_NyleC185A_MP = 334, /*< Nyle C185A external heat pump in Multi Pass Mode */ - MODELS_NyleC250A_MP = 335, /*< Nyle C250A external heat pump in Multi Pass Mode */ - - MODELS_NyleC60A_C_MP = 341, /*< Nyle C60A external heat pump in Multi Pass Mode */ - MODELS_NyleC90A_C_MP = 342, /*< Nyle C90A external heat pump in Multi Pass Mode */ - MODELS_NyleC125A_C_MP = 343, /*< Nyle C125A external heat pump in Multi Pass Mode */ - MODELS_NyleC185A_C_MP = 344, /*< Nyle C185A external heat pump in Multi Pass Mode */ - MODELS_NyleC250A_C_MP = 345, /*< Nyle C250A external heat pump in Multi Pass Mode */ - - // Large Rheem multi pass models - MODELS_RHEEM_HPHD60HNU_201_MP = 350, - MODELS_RHEEM_HPHD60VNU_201_MP = 351, - MODELS_RHEEM_HPHD135HNU_483_MP = 352, // really bad fit to data due to inconsistency in data - MODELS_RHEEM_HPHD135VNU_483_MP = 353, // really bad fit to data due to inconsistency in data - - MODELS_AquaThermAire = 400 // heat exchanger model - }; - - ///specifies the modes for writing output - ///the specified values are used for >= comparisons, so the numerical order is relevant - enum VERBOSITY { - VRB_silent = 0, /**< print no outputs */ - VRB_reluctant = 10, /**< print only outputs for fatal errors */ - VRB_minuteOut = 15, /**< print minutely output */ - VRB_typical = 20, /**< print some basic debugging info */ - VRB_emetic = 30 /**< print all the things */ - }; - - - enum UNITS{ - UNITS_C, /**< celsius */ - UNITS_F, /**< fahrenheit */ - UNITS_KWH, /**< kilowatt hours */ - UNITS_BTU, /**< british thermal units */ - UNITS_KJ, /**< kilojoules */ - UNITS_KW, /**< kilowatt */ - UNITS_BTUperHr, /**< british thermal units per Hour */ - UNITS_GAL, /**< gallons */ - UNITS_L, /**< liters */ - UNITS_kJperHrC, /**< UA, metric units */ - UNITS_BTUperHrF, /**< UA, imperial units */ - UNITS_FT, /**< feet */ - UNITS_M, /**< meters */ - UNITS_FT2, /**< square feet */ - UNITS_M2, /**< square meters */ - UNITS_MIN, /**< minutes */ - UNITS_SEC, /**< seconds */ - UNITS_HR, /**< hours */ - UNITS_GPM, /**< gallons per minute */ - UNITS_LPS /**< liters per second */ - }; - - /** specifies the type of heat source */ - enum HEATSOURCE_TYPE { - TYPE_none, /**< a default to check to make sure it's been set */ - TYPE_resistance, /**< a resistance element */ - TYPE_compressor /**< a vapor cycle compressor */ - }; - - /** specifies the extrapolation method based on Tair, from the perfmap for a heat source */ - enum EXTRAP_METHOD { - EXTRAP_LINEAR, /**< the default extrapolates linearly */ - EXTRAP_NEAREST /**< extrapolates using nearest neighbor, will just continue from closest point */ - }; - - /** specifies the unit type for outputs in the CSV file-s */ - enum CSVOPTIONS { - CSVOPT_NONE = 0, - CSVOPT_IPUNITS = 1 << 0, - CSVOPT_IS_DRAWING = 1 << 1 - }; - - struct NodeWeight { - int nodeNum; - double weight; - NodeWeight(int n,double w): nodeNum(n),weight(w) {}; - - NodeWeight(int n): nodeNum(n),weight(1.0) {}; - }; - - struct HeatingLogic { - public: - std::string description; - std::function compare; - - HeatingLogic(std::string desc,double decisionPoint_in,HPWH *hpwh_in, - std::function c,bool isHTS): - description(desc),decisionPoint(decisionPoint_in),hpwh(hpwh_in),compare(c), - isEnteringWaterHighTempShutoff(isHTS) - {}; - - /**< checks that the input is all valid. */ - virtual const bool isValid() = 0; - /**< gets the value for comparing the tank value to, i.e. the target SoC */ - virtual const double getComparisonValue() = 0; - /**< gets the calculated value from the tank, i.e. SoC or tank average of node weights*/ - virtual const double getTankValue() = 0; - /**< function to calculate where the average node for a logic set is. */ - virtual const double nodeWeightAvgFract() = 0; - /**< gets the fraction of a node that has to be heated up to met the turnoff condition*/ - virtual const double getFractToMeetComparisonExternal() = 0; - - virtual int setDecisionPoint(double value) = 0; - double getDecisionPoint() { return decisionPoint; } - bool getIsEnteringWaterHighTempShutoff() { return isEnteringWaterHighTempShutoff; } - - protected: - double decisionPoint; - HPWH* hpwh; - bool isEnteringWaterHighTempShutoff; - }; - - struct SoCBasedHeatingLogic: HeatingLogic { - public: - SoCBasedHeatingLogic(std::string desc,double decisionPoint,HPWH *hpwh, - double hF = -0.05,double tM_C = 43.333,bool constMains = false,double mains_C = 18.333, - std::function c = std::less()): - HeatingLogic(desc,decisionPoint,hpwh,c,false), - hysteresisFraction(hF),tempMinUseful_C(tM_C), - useCostantMains(constMains),constantMains_C(mains_C) - {}; - const bool isValid(); - - const double getComparisonValue(); - const double getTankValue(); - const double nodeWeightAvgFract(); - const double getFractToMeetComparisonExternal(); - const double getMainsT_C(); - const double getTempMinUseful_C(); - int setDecisionPoint(double value); - int setConstantMainsTemperature(double mains_C); - - private: - double tempMinUseful_C; - double hysteresisFraction; - bool useCostantMains; - double constantMains_C; - }; - - struct TempBasedHeatingLogic: HeatingLogic { - public: - TempBasedHeatingLogic(std::string desc,std::vector n, - double decisionPoint,HPWH *hpwh,bool a = false, - std::function c = std::less(), - bool isHTS = false): - HeatingLogic(desc,decisionPoint,hpwh,c,isHTS), - nodeWeights(n),isAbsolute(a) - {}; - - const bool isValid(); - - const double getComparisonValue(); - const double getTankValue(); - const double nodeWeightAvgFract(); - const double getFractToMeetComparisonExternal(); - - int setDecisionPoint(double value); - int setDecisionPoint(double value,bool absolute); - - private: - const bool areNodeWeightsValid(); - - bool isAbsolute; - std::vector nodeWeights; - }; - - std::shared_ptr shutOffSoC(std::string desc,double targetSoC,double hystFract,double tempMinUseful_C, - bool constMains,double mains_C); - std::shared_ptr turnOnSoC(std::string desc,double targetSoC,double hystFract,double tempMinUseful_C, - bool constMains,double mains_C); - - std::shared_ptr wholeTank(double decisionPoint,const UNITS units = UNITS_C, const bool absolute = false); - std::shared_ptr topThird(double decisionPoint); - std::shared_ptr topThird_absolute(double decisionPoint); - std::shared_ptr secondThird(double decisionPoint,const UNITS units = UNITS_C, const bool absolute = false); - std::shared_ptr bottomThird(double decisionPoint); - std::shared_ptr bottomHalf(double decisionPoint) ; - std::shared_ptr bottomTwelfth(double decisionPoint); - std::shared_ptr bottomSixth(double decisionPoint); - std::shared_ptr bottomSixth_absolute(double decisionPoint); - std::shared_ptr secondSixth(double decisionPoint); - std::shared_ptr thirdSixth(double decisionPoint); - std::shared_ptr fourthSixth(double decisionPoint); - std::shared_ptr fifthSixth(double decisionPoint); - std::shared_ptr topSixth(double decisionPoint); - - std::shared_ptr standby(double decisionPoint); - std::shared_ptr topNodeMaxTemp(double decisionPoint); - std::shared_ptr bottomNodeMaxTemp(double decisionPoint,bool isEnteringWaterHighTempShutoff = false); - std::shared_ptr bottomTwelfthMaxTemp(double decisionPoint); - std::shared_ptr topThirdMaxTemp(double decisionPoint); - std::shared_ptr bottomSixthMaxTemp(double decisionPoint); - std::shared_ptr secondSixthMaxTemp(double decisionPoint); - std::shared_ptr fifthSixthMaxTemp(double decisionPoint); - std::shared_ptr topSixthMaxTemp(double decisionPoint); - - std::shared_ptr largeDraw(double decisionPoint); - std::shared_ptr largerDraw(double decisionPoint); - - ///this is the value that the public functions will return in case of a simulation - ///destroying error - static const int HPWH_ABORT = -274000; - - static std::string getVersion(); - /**< This function returns a string with the current version number */ - - int HPWHinit_presets(MODELS presetNum); - /**< This function will reset all member variables to defaults and then - * load in a set of parameters that are hardcoded in this function - - * which particular set of parameters is selected by presetNum. - * This is similar to the way the HPWHsim currently operates, as used in SEEM, - * but not quite as versatile. - * My impression is that this could be a useful input paradigm for CSE - * - * The return value is 0 for successful initialization, HPWH_ABORT otherwise - */ - - int HPWHinit_file(std::string configFile); - /**< This function will load in a set of parameters from a file - * The file name is the input - there should be at most one set of parameters per file - * This is useful for testing new variations, and for the sort of variability - * that we typically do when creating SEEM runs - * Appropriate use of this function can be found in the documentation - - * The return value is 0 for successful initialization, HPWH_ABORT otherwise - */ - - int HPWHinit_resTank(); /**< Default resistance tank, EF 0.95, volume 47.5 */ - int HPWHinit_resTank(double tankVol_L,double energyFactor,double upperPower_W,double lowerPower_W); - /**< This function will initialize a HPWH object to be a resistance tank. Since - * resistance tanks are so simple, they can be specified with only four variables: - * tank volume, energy factor, and the power of the upper and lower elements. Energy - * factor is converted into UA internally, although an external setter for UA is - * also provided in case the energy factor is unknown. - * - * Several assumptions regarding the tank configuration are assumed: the lower element - * is at the bottom, the upper element is at the top third. The logics are also set - * to standard setting, with upper as VIP activating when the top third is too cold. - */ - - int HPWHinit_resTankGeneric(double tankVol_L,double rValue_M2KperW,double upperPower_W,double lowerPower_W); - /**< This function will initialize a HPWH object to be a generic resistance storage water heater, - * with a specific R-Value defined at initalization. - * - * Several assumptions regarding the tank configuration are assumed: the lower element - * is at the bottom, the upper element is at the top third. The controls are the same standard controls for - * the HPWHinit_resTank() - */ - - int HPWHinit_genericHPWH(double tankVol_L,double energyFactor,double resUse_C); - /**< This function will initialize a HPWH object to be a non-specific HPWH model - * with an energy factor as specified. Since energy - * factor is not strongly correlated with energy use, most settings - * are taken from the GE2015_STDMode model. - */ - - int runOneStep(double drawVolume_L,double ambientT_C, - double externalT_C,DRMODES DRstatus,double inletVol2_L = 0.,double inletT2_C = 0., - std::vector* extraHeatDist_W = NULL); - /**< This function will progress the simulation forward in time by one step - * all calculated outputs are stored in private variables and accessed through functions - * - * The return value is 0 for successful simulation run, HPWH_ABORT otherwise - */ - - /** An overloaded function that uses takes inletT_C */ - int runOneStep(double inletT_C,double drawVolume_L,double ambientT_C, - double externalT_C,DRMODES DRstatus,double inletVol2_L = 0.,double inletT2_C = 0., - std::vector* extraHeatDist_W = NULL) { - setInletT(inletT_C); - return runOneStep(drawVolume_L,ambientT_C, - externalT_C,DRstatus,inletVol2_L,inletT2_C, - extraHeatDist_W); - }; - - - int runNSteps(int N,double *inletT_C,double *drawVolume_L, - double *tankAmbientT_C,double *heatSourceAmbientT_C, - DRMODES *DRstatus); - /**< This function will progress the simulation forward in time by N (equal) steps - * The calculated values will be summed or averaged, as appropriate, and - * then stored in the usual variables to be accessed through functions - * - * The return value is 0 for successful simulation run, HPWH_ABORT otherwise - */ - - /** Setters for the what are typically input variables */ - void setInletT(double newInletT_C) { member_inletT_C = newInletT_C; }; - void setMinutesPerStep(double newMinutesPerStep); - - void setVerbosity(VERBOSITY hpwhVrb); - /**< sets the verbosity to the specified level */ - void setMessageCallback(void (*callbackFunc)(const std::string message,void* pContext),void* pContext); - /**< sets the function to be used for message passing */ - void printHeatSourceInfo(); - /**< this prints out the heat source info, nicely formatted - specifically input/output energy/power, and runtime - will print to cout if messageCallback pointer is unspecified - does not use verbosity, as it is public and expected to be called only when needed */ - void printTankTemps(); - /**< this prints out all the node temps, kind of nicely formatted - does not use verbosity, as it is public and expected to be called only when needed */ - - int WriteCSVHeading(FILE* outFILE,const char* preamble = "",int nTCouples = 6,int options = CSVOPT_NONE) const; - int WriteCSVRow(FILE* outFILE,const char* preamble = "",int nTCouples = 6,int options = CSVOPT_NONE) const; - /**< a couple of function to write the outputs to a file - they both will return 0 for success - the preamble should be supplied with a trailing comma, as these functions do - not add one. Additionally, a newline is written with each call. */ - - /**< Sets the tank node temps based on the provided vector of temps, which are mapped onto the - existing nodes, regardless of numNodes. */ - int setTankLayerTemperatures(std::vector setTemps, const UNITS units = UNITS_C); - void getTankTemps(std::vector &tankTemps); - - bool isSetpointFixed() const; /**< is the setpoint allowed to be changed */ - int setSetpoint(double newSetpoint,UNITS units = UNITS_C);/** 0 minutes and < 1440 minutes. */ - double getTimerLimitTOT_minute() const; - /**< Returns the timer limit in minutes for the DR_TOT call. */ - - int getInletHeight(int whichInlet) const; - /**< returns the water inlet height node number */ - - /**< resizes the tankTemp_C and nextTankTemp_C node vectors */ - void setNumNodes(const std::size_t num_nodes); - - /**< returns the number of nodes */ - int getNumNodes() const; - - /**< returns the index of the top node */ - int getIndexTopNode() const; - - double getTankNodeTemp(int nodeNum,UNITS units = UNITS_C) const; - /**< returns the temperature of the water at the specified node - with specified units - or HPWH_ABORT for incorrect node number or unit failure */ - - double getNthSimTcouple(int iTCouple,int nTCouple,UNITS units = UNITS_C) const; - /**< returns the temperature from a set number of virtual "thermocouples" specified by nTCouple, - which are constructed from the node temperature array. Specify iTCouple from 1-nTCouple, - 1 at the bottom using specified units - returns HPWH_ABORT for iTCouple < 0, > nTCouple, or incorrect units */ - - int getNumHeatSources() const; - /**< returns the number of heat sources */ - - int getNumResistanceElements() const; - /**< returns the number of resistance elements */ - - int getCompressorIndex() const; - /**< returns the index of the compressor in the heat source array. - Note only supports HPWHs with one compressor, if multiple will return the last index - of a compressor */ - - double getCompressorCapacity(double airTemp = 19.722,double inletTemp = 14.444,double outTemp = 57.222, - UNITS pwrUnit = UNITS_KW,UNITS tempUnit = UNITS_C); - /**< Returns the heating output capacity of the compressor for the current HPWH model. - Note only supports HPWHs with one compressor, if multiple will return the last index - of a compressor. Outlet temperatures greater than the max allowable setpoints will return an error, but - for compressors with a fixed setpoint the */ - - int setCompressorOutputCapacity(double newCapacity,double airTemp = 19.722,double inletTemp = 14.444,double outTemp = 57.222, - UNITS pwrUnit = UNITS_KW,UNITS tempUnit = UNITS_C); - /**< Sets the heating output capacity of the compressor at the defined air, inlet water, and outlet temperatures. - For multi-pass models the capacity is set as the average between the inletTemp and outTemp since multi-pass models will increase - the water temperature only a few degrees at a time (i.e. maybe 10 degF) until the tank reaches the outTemp, the capacity at - inletTemp might not be accurate for the entire heating cycle. - Note only supports HPWHs with one compressor, if multiple will return the last index - of a compressor */ - - int setScaleHPWHCapacityCOP(double scaleCapacity = 1.,double scaleCOP = 1.); - /**< Scales the heatpump water heater input capacity and COP*/ - - int setResistanceCapacity(double power,int which = -1,UNITS pwrUNIT = UNITS_KW); - /**< Scale the resistance elements in the heat source list. Which heat source is chosen is changes is given by "which" - - If which (-1) sets all the resisistance elements in the tank. - - If which (0, 1, 2...) sets the resistance element in a low to high order. - So if there are 3 elements 0 is the bottom, 1 is the middle, and 2 is the top element, regardless of their order - in heatSources. If the elements exist on at the same node then all of the elements are set. - - The only valid values for which are between -1 and getNumResistanceElements()-1. Since which is defined as the - by the ordered height of the resistance elements it cannot refer to a compressor. - */ - - double getResistanceCapacity(int which = -1,UNITS pwrUNIT = UNITS_KW); - /**< Returns the resistance elements capacity. Which heat source is chosen is changes is given by "which" - - If which (-1) gets all the resisistance elements in the tank. - - If which (0, 1, 2...) sets the resistance element in a low to high order. - So if there are 3 elements 0 is the bottom, 1 is the middle, and 2 is the top element, regardless of their order - in heatSources. If the elements exist on at the same node then all of the elements are set. - - The only valid values for which are between -1 and getNumResistanceElements()-1. Since which is defined as the - by the ordered height of the resistance elements it cannot refer to a compressor. - */ - - int getResistancePosition(int elementIndex) const; - - double getNthHeatSourceEnergyInput(int N,UNITS units = UNITS_KWH) const; - /**< returns the energy input to the Nth heat source, with the specified units - energy used by the heat source is positive - should always be positive - returns HPWH_ABORT for N out of bounds or incorrect units */ - - double getNthHeatSourceEnergyOutput(int N,UNITS units = UNITS_KWH) const; - /**< returns the energy output from the Nth heat source, with the specified units - energy put into the water is positive - should always be positive - returns HPWH_ABORT for N out of bounds or incorrect units */ - - double getNthHeatSourceRunTime(int N) const; - /**< returns the run time for the Nth heat source, in minutes - note: they may sum to more than 1 time step for concurrently running heat sources - returns HPWH_ABORT for N out of bounds */ - int isNthHeatSourceRunning(int N) const; - /**< returns 1 if the Nth heat source is currently engaged, 0 if it is not, and - returns HPWH_ABORT for N out of bounds */ - HEATSOURCE_TYPE getNthHeatSourceType(int N) const; - /**< returns the enum value for what type of heat source the Nth heat source is */ - - - double getOutletTemp(UNITS units = UNITS_C) const; - /**< returns the outlet temperature in the specified units - returns 0 when no draw occurs, or HPWH_ABORT for incorrect unit specifier */ - double getCondenserWaterInletTemp(UNITS units = UNITS_C) const; - /**< returns the condenser inlet temperature in the specified units - returns 0 when no HP not running occurs, or HPWH_ABORT for incorrect unit specifier */ - - double getCondenserWaterOutletTemp(UNITS units = UNITS_C) const; - /**< returns the condenser outlet temperature in the specified units - returns 0 when no HP not running occurs, or HPWH_ABORT for incorrect unit specifier */ - - double getExternalVolumeHeated(UNITS units = UNITS_L) const; - /**< returns the volume of water heated in an external in the specified units - returns 0 when no external heat source is running */ - - double getEnergyRemovedFromEnvironment(UNITS units = UNITS_KWH) const; - /**< get the total energy removed from the environment by all heat sources in specified units - (not net energy - does not include standby) - moving heat from the space to the water is the positive direction - returns HPWH_ABORT for incorrect units */ - - double getStandbyLosses(UNITS units = UNITS_KWH) const; - /**< get the amount of heat lost through the tank in specified units - moving heat from the water to the space is the positive direction - negative should occur seldom - returns HPWH_ABORT for incorrect units */ - - double getTankHeatContent_kJ() const; - /**< get the heat content of the tank, relative to zero celsius - * returns using kilojoules */ - - int getHPWHModel() const; - /**< get the model number of the HPWHsim model number of the hpwh */ - - int getCompressorCoilConfig() const; - bool isCompressorMultipass() const; - bool isCompressoExternalMultipass() const; - - bool hasACompressor() const; - /**< Returns if the HPWH model has a compressor or not, could be a storage or resistance tank. */ - - bool hasExternalHeatSource() const; - /**< Returns if the HPWH model has any external heat sources or not, could be a compressor or resistance element. */ - double getExternalMPFlowRate(UNITS units = UNITS_GPM) const; - /**< Returns the constant flow rate for an external multipass heat sources. */ - - - double getCompressorMinRuntime(UNITS units = UNITS_MIN) const; - - int getSizingFractions(double &aquafract,double &percentUseable) const; - /**< returns the fraction of total tank volume from the bottom up where the aquastat is - or the turn on logic for the compressor, and the USEable fraction of storage or 1 minus - where the shut off logic is for the compressor. If the logic spans multiple nodes it - returns the weighted average of the nodes */ - - bool isHPWHScalable() const; - /**< returns if the HPWH is scalable or not*/ - - bool shouldDRLockOut(HEATSOURCE_TYPE hs,DRMODES DR_signal) const; - /**< Checks the demand response signal against the different heat source types */ - - void resetTopOffTimer(); - /**< resets variables for timer associated with the DR_TOT call */ - - double getLocationTemp_C() const; - int setMaxTempDepression(double maxDepression,UNITS units = UNITS_C); - - bool hasEnteringWaterHighTempShutOff(int heatSourceIndex); - int setEnteringWaterHighTempShutOff(double highTemp,bool tempIsAbsolute,int heatSourceIndex,UNITS units = UNITS_C); - /**< functions to check for and set specific high temperature shut off logics. - HPWHs can only have one of these, which is at least typical */ - - int setTargetSoCFraction(double target); - - bool canUseSoCControls(); - - int switchToSoCControls(double targetSoC,double hysteresisFraction = 0.05,double tempMinUseful = 43.333,bool constantMainsT = false, - double mainsT = 18.333,UNITS tempUnit = UNITS_C); - - bool isSoCControlled() const; - - /// Checks whether energy is balanced during a simulation step. - bool isEnergyBalanced(const double drawVol_L,const double prevHeatContent_kJ,const double fracEnergyTolerance = 0.001); - - /// Overloaded version of above that allows specification of inlet temperature. - bool isEnergyBalanced(const double drawVol_L,double inletT_C_in,const double prevHeatContent_kJ,const double fracEnergyTolerance) { - setInletT(inletT_C_in); - return isEnergyBalanced(drawVol_L,prevHeatContent_kJ,fracEnergyTolerance); - } - - /// Addition of heat from a normal heat sources; return excess heat, if needed, to prevent exceeding maximum or setpoint - double addHeatAboveNode(double qAdd_kJ,const int nodeNum,const double maxT_C); - - /// Addition of extra heat handled separately from normal heat sources - void addExtraHeatAboveNode(double qAdd_kJ,const int nodeNum); - - struct ControlInfo{ - long outputCode; - long timeToRun_min; - double setpointT_C; - std::unique_ptr initialTankT_C; - bool doConduction; - bool doInversionMixing; - std::unique_ptr inletH; - std::unique_ptr tankSize_gal; - std::unique_ptr tot_limit; - bool useSoC; - std::string temperatureUnits; - bool recordMinuteData; - bool recordYearData; - bool modifyDraw; - }; - bool readControlInfo(const std::string &testDirectory, ControlInfo &controlInfo); - - typedef std::vector Schedule; - bool readSchedules(const std::string &testDirectory, const ControlInfo &controlInfo, std::vector &allSchedules); - bool readSchedule(Schedule &schedule, std::string scheduleName, long testLength_min); - - struct TestDesc{ - std::string presetOrFile; - std::string modelName; - std::string testName; - }; - - struct TestResults{ - bool passed; - double totalEnergyConsumed_kJ; - double totalVolumeRemoved_L; - }; - - bool runSimulation( - const TestDesc &testDesc, - const std::string &outputDirectory, - const HPWH::ControlInfo &controlInfo, - std::vector &allSchedules, - double airT_C, - const bool doTempDepress, - TestResults &testResults); - -private: - class HeatSource; - - void setAllDefaults(); /**< sets all the defaults default */ - - void updateTankTemps(double draw,double inletT_C,double ambientT_C,double inletVol2_L,double inletT2_L); - void mixTankInversions(); - /**< Mixes the any temperature inversions in the tank after all the temperature calculations */ - void updateSoCIfNecessary(); - - bool areAllHeatSourcesOff() const; - /**< test if all the heat sources are off */ - void turnAllHeatSourcesOff(); - /**< disengage each heat source */ - - void addHeatParent(HeatSource *heatSourcePtr,double heatSourceAmbientT_C,double minutesToRun); - - /// adds extra heat to the set of nodes that are at the same temperature, above the - /// specified node number - void modifyHeatDistribution(std::vector &heatDistribution); - void addExtraHeat(std::vector &extraHeatDist_W); - - /// "extra" heat added during a simulation step - double extraEnergyInput_kWh; - - double tankAvg_C(const std::vector nodeWeights) const; - /**< functions to calculate what the temperature in a portion of the tank is */ - - void mixTankNodes(int mixedAboveNode,int mixedBelowNode,double mixFactor); - /**< function to average the nodes in a tank together bewtween the mixed abovenode and mixed below node. */ - - void calcDerivedValues(); - /**< a helper function for the inits, calculating condentropy and the lowest node */ - void calcSizeConstants(); - /**< a helper function to set constants for the UA and tank size*/ - void calcDerivedHeatingValues(); - /**< a helper for the helper, calculating condentropy and the lowest node*/ - void mapResRelativePosToHeatSources(); - /**< a helper function for the inits, creating a mapping function for the position of the resistance elements - to their indexes in heatSources. */ - - int checkInputs(); - /**< a helper function to run a few checks on the HPWH input parameters */ - - double getChargePerNode(double tCold,double tMix,double tHot) const; - - void calcAndSetSoCFraction(); - - void sayMessage(const std::string message) const; - /**< if the messagePriority is >= the hpwh verbosity, - either pass your message out to the callback function or print it to cout - otherwise do nothing */ - void msg(const char* fmt,...) const; - void msgV(const char* fmt,va_list ap=NULL) const; - - bool simHasFailed; - /**< did an internal error cause the simulation to fail? */ - - bool isHeating; - /**< is the hpwh currently heating or not? */ - - bool setpointFixed; - /**< does the HPWH allow the setpoint to vary */ - - bool tankSizeFixed; - /**< does the HPWH have a constant tank size or can it be changed */ - - bool canScale; - /**< can the HPWH scale capactiy and COP or not */ - - VERBOSITY hpwhVerbosity; - /**< an enum to let the sim know how much output to say */ - - void (*messageCallback)(const std::string message,void* contextPtr); - /**< function pointer to indicate an external message processing function */ - void* messageCallbackContextPtr; - /**< caller context pointer for external message processing */ - - - - MODELS hpwhModel; - /**< The hpwh should know which preset initialized it, or if it was from a fileget */ - - // a std::vector containing the HeatSources, in order of priority - std::vector heatSources; - - int compressorIndex; - /**< The index of the compressor heat source (set to -1 if no compressor)*/ - - int lowestElementIndex; - /**< The index of the lowest resistance element heat source (set to -1 if no resistance elements)*/ - - int highestElementIndex; - /**< The index of the highest resistance element heat source. if only one element it equals lowestElementIndex (set to -1 if no resistance elements)*/ - - int VIPIndex; - /**< The index of the VIP resistance element heat source (set to -1 if no VIP resistance elements)*/ - - int inletHeight; - /**< the number of a node in the tank that the inlet water enters the tank at, must be between 0 and numNodes-1 */ - - int inlet2Height; - /**< the number of a node in the tank that the 2nd inlet water enters the tank at, must be between 0 and numNodes-1 */ - - /**< the volume in liters of the tank */ - double tankVolume_L; - - /**< the UA of the tank, in metric units */ - double tankUA_kJperHrC; - - /**< the UA of the fittings for the tank, in metric units */ - double fittingsUA_kJperHrC; - - /**< the volume (L) of a single node */ - double nodeVolume_L; - - /**< the mass of water (kg) in a single node */ - double nodeMass_kg; - - /**< the heat capacity of the water (kJ/�C) in a single node */ - double nodeCp_kJperC; - - /**< the height in meters of the one node */ - double nodeHeight_m; - - double fracAreaTop; - /**< the fraction of the UA on the top and bottom of the tank, assuming it's a cylinder */ - double fracAreaSide; - /**< the fraction of the UA on the sides of the tank, assuming it's a cylinder */ - - double currentSoCFraction; - /**< the current state of charge according to the logic */ - - double setpoint_C; - /**< the setpoint of the tank */ +class HPWH +{ + public: + static const int version_major = HPWHVRSN_MAJOR; + static const int version_minor = HPWHVRSN_MINOR; + static const int version_patch = HPWHVRSN_PATCH; + static const std::string version_maint; // Initialized in source file (HPWH.cc) + + static const float DENSITYWATER_kgperL; + static const float KWATER_WpermC; + static const float CPWATER_kJperkgC; + static const int CONDENSITY_SIZE = + 12; /** SANCO2 5-23 + MODELS_SANCO2_43 = 120, /**< SANCO2 43 gallon CO2 external heat pump */ + MODELS_SANCO2_83 = 121, /**< SANCO2 83 gallon CO2 external heat pump */ + MODELS_SANCO2_GS3_45HPA_US_SP = + 122, /**< SANCO2 80 gallon CO2 external heat pump used for MF */ + MODELS_SANCO2_119 = 123, /**< SANCO2 120 gallon CO2 external heat pump */ + + // Sanden synomyms for backward compatability + // allow unmodified code using HPWHsim to build + MODELS_Sanden40 = MODELS_SANCO2_43, + MODELS_Sanden80 = MODELS_SANCO2_83, + MODELS_Sanden_GS3_45HPA_US_SP = MODELS_SANCO2_GS3_45HPA_US_SP, + MODELS_Sanden120 = MODELS_SANCO2_119, + + // The new-ish Rheem + MODELS_RheemHB50 = 140, /**< Rheem 2014 (?) Model */ + MODELS_RheemHBDR2250 = 141, /**< 50 gallon, 2250 W resistance Rheem HB Duct Ready */ + MODELS_RheemHBDR4550 = 142, /**< 50 gallon, 4500 W resistance Rheem HB Duct Ready */ + MODELS_RheemHBDR2265 = 143, /**< 65 gallon, 2250 W resistance Rheem HB Duct Ready */ + MODELS_RheemHBDR4565 = 144, /**< 65 gallon, 4500 W resistance Rheem HB Duct Ready */ + MODELS_RheemHBDR2280 = 145, /**< 80 gallon, 2250 W resistance Rheem HB Duct Ready */ + MODELS_RheemHBDR4580 = 146, /**< 80 gallon, 4500 W resistance Rheem HB Duct Ready */ + + // The new new Rheem + MODELS_Rheem2020Prem40 = 151, /**< 40 gallon, Rheem 2020 Premium */ + MODELS_Rheem2020Prem50 = 152, /**< 50 gallon, Rheem 2020 Premium */ + MODELS_Rheem2020Prem65 = 153, /**< 65 gallon, Rheem 2020 Premium */ + MODELS_Rheem2020Prem80 = 154, /**< 80 gallon, Rheem 2020 Premium */ + MODELS_Rheem2020Build40 = 155, /**< 40 gallon, Rheem 2020 Builder */ + MODELS_Rheem2020Build50 = 156, /**< 50 gallon, Rheem 2020 Builder */ + MODELS_Rheem2020Build65 = 157, /**< 65 gallon, Rheem 2020 Builder */ + MODELS_Rheem2020Build80 = 158, /**< 80 gallon, Rheem 2020 Builder */ + + // Rheem 120V dedicated-circuit product, no resistance elements + MODELS_RheemPlugInDedicated40 = 1160, /**< 40 gallon, Rheem 120V dedicated-circuit */ + MODELS_RheemPlugInDedicated50 = 1161, /**< 50 gallon, Rheem 120V dedicated-circuit */ + + // Rheem 120V shared-circuit products, no resistance elements. + MODELS_RheemPlugInShared40 = 1150, /**< 40 gallon, Rheem 120V shared-circuit */ + MODELS_RheemPlugInShared50 = 1151, /**< 50 gallon, Rheem 120V shared-circuit */ + MODELS_RheemPlugInShared65 = 1152, /**< 65 gallon, Rheem 120V shared-circuit */ + MODELS_RheemPlugInShared80 = 1153, /**< 80 gallon, Rheem 120V shared-circuit */ + + // The new-ish Stiebel + MODELS_Stiebel220E = 160, /**< Stiebel Eltron (2014 model?) */ + + // Generic water heaters, corresponding to the tiers 1, 2, and 3 + MODELS_Generic1 = 170, /**< Generic Tier 1 */ + MODELS_Generic2 = 171, /**< Generic Tier 2 */ + MODELS_Generic3 = 172, /**< Generic Tier 3 */ + MODELS_UEF2generic = 173, /**< UEF 2.0, modified GE2014STDMode case */ + MODELS_genericCustomUEF = 174, /**< used for creating "generic" model with custom uef*/ + + MODELS_AWHSTier3Generic40 = 175, /**< Generic AWHS Tier 3 50 gallons*/ + MODELS_AWHSTier3Generic50 = 176, /**< Generic AWHS Tier 3 50 gallons*/ + MODELS_AWHSTier3Generic65 = 177, /**< Generic AWHS Tier 3 65 gallons*/ + MODELS_AWHSTier3Generic80 = 178, /**< Generic AWHS Tier 3 80 gallons*/ + + MODELS_StorageTank = 180, /**< Generic Tank without heaters */ + MODELS_TamScalable_SP = 190, /** < HPWH input passed off a poor preforming SP model that has + scalable input capacity and COP */ + MODELS_Scalable_MP = + 191, /** < Lower performance MP model that has scalable input capacity and COP */ + + // Non-preset models + MODELS_CustomFile = 200, /**< HPWH parameters were input via file */ + MODELS_CustomResTank = 201, /**< HPWH parameters were input via HPWHinit_resTank */ + MODELS_CustomResTankGeneric = + 202, /**< HPWH parameters were input via HPWHinit_commercialResTank */ + + // Larger Colmac models in single pass configuration + MODELS_ColmacCxV_5_SP = 210, /**< Colmac CxA_5 external heat pump in Single Pass Mode */ + MODELS_ColmacCxA_10_SP = 211, /**< Colmac CxA_10 external heat pump in Single Pass Mode */ + MODELS_ColmacCxA_15_SP = 212, /**< Colmac CxA_15 external heat pump in Single Pass Mode */ + MODELS_ColmacCxA_20_SP = 213, /**< Colmac CxA_20 external heat pump in Single Pass Mode */ + MODELS_ColmacCxA_25_SP = 214, /**< Colmac CxA_25 external heat pump in Single Pass Mode */ + MODELS_ColmacCxA_30_SP = 215, /**< Colmac CxA_30 external heat pump in Single Pass Mode */ + + // Larger Colmac models in multi pass configuration + MODELS_ColmacCxV_5_MP = 310, /**< Colmac CxA_5 external heat pump in Multi Pass Mode */ + MODELS_ColmacCxA_10_MP = 311, /**< Colmac CxA_10 external heat pump in Multi Pass Mode */ + MODELS_ColmacCxA_15_MP = 312, /**< Colmac CxA_15 external heat pump in Multi Pass Mode */ + MODELS_ColmacCxA_20_MP = 313, /**< Colmac CxA_20 external heat pump in Multi Pass Mode */ + MODELS_ColmacCxA_25_MP = 314, /**< Colmac CxA_25 external heat pump in Multi Pass Mode */ + MODELS_ColmacCxA_30_MP = 315, /**< Colmac CxA_30 external heat pump in Multi Pass Mode */ + + // Larger Nyle models in single pass configuration + MODELS_NyleC25A_SP = 230, /*< Nyle C25A external heat pump in Single Pass Mode */ + MODELS_NyleC60A_SP = 231, /*< Nyle C60A external heat pump in Single Pass Mode */ + MODELS_NyleC90A_SP = 232, /*< Nyle C90A external heat pump in Single Pass Mode */ + MODELS_NyleC125A_SP = 233, /*< Nyle C125A external heat pump in Single Pass Mode */ + MODELS_NyleC185A_SP = 234, /*< Nyle C185A external heat pump in Single Pass Mode */ + MODELS_NyleC250A_SP = 235, /*< Nyle C250A external heat pump in Single Pass Mode */ + // Larger Nyle models with the cold weather package! + MODELS_NyleC60A_C_SP = 241, /*< Nyle C60A external heat pump in Single Pass Mode */ + MODELS_NyleC90A_C_SP = 242, /*< Nyle C90A external heat pump in Single Pass Mode */ + MODELS_NyleC125A_C_SP = 243, /*< Nyle C125A external heat pump in Single Pass Mode */ + MODELS_NyleC185A_C_SP = 244, /*< Nyle C185A external heat pump in Single Pass Mode */ + MODELS_NyleC250A_C_SP = 245, /*< Nyle C250A external heat pump in Single Pass Mode */ + + // Mitsubishi Electric Trane + MODELS_MITSUBISHI_QAHV_N136TAU_HPB_SP = + 250, /*< Mitsubishi Electric Trane QAHV external CO2 heat pump */ + + // Larger Nyle models in multi pass configuration + // MODELS_NyleC25A_MP = 330, /*< Nyle C25A external heat pump in Multi Pass Mode */ + MODELS_NyleC60A_MP = 331, /*< Nyle C60A external heat pump in Multi Pass Mode */ + MODELS_NyleC90A_MP = 332, /*< Nyle C90A external heat pump in Multi Pass Mode */ + MODELS_NyleC125A_MP = 333, /*< Nyle C125A external heat pump in Multi Pass Mode */ + MODELS_NyleC185A_MP = 334, /*< Nyle C185A external heat pump in Multi Pass Mode */ + MODELS_NyleC250A_MP = 335, /*< Nyle C250A external heat pump in Multi Pass Mode */ + + MODELS_NyleC60A_C_MP = 341, /*< Nyle C60A external heat pump in Multi Pass Mode */ + MODELS_NyleC90A_C_MP = 342, /*< Nyle C90A external heat pump in Multi Pass Mode */ + MODELS_NyleC125A_C_MP = 343, /*< Nyle C125A external heat pump in Multi Pass Mode */ + MODELS_NyleC185A_C_MP = 344, /*< Nyle C185A external heat pump in Multi Pass Mode */ + MODELS_NyleC250A_C_MP = 345, /*< Nyle C250A external heat pump in Multi Pass Mode */ + + // Large Rheem multi pass models + MODELS_RHEEM_HPHD60HNU_201_MP = 350, + MODELS_RHEEM_HPHD60VNU_201_MP = 351, + MODELS_RHEEM_HPHD135HNU_483_MP = 352, // really bad fit to data due to inconsistency in data + MODELS_RHEEM_HPHD135VNU_483_MP = 353, // really bad fit to data due to inconsistency in data + + MODELS_AquaThermAire = 400 // heat exchanger model + }; + + /// specifies the modes for writing output + /// the specified values are used for >= comparisons, so the numerical order is relevant + enum VERBOSITY + { + VRB_silent = 0, /**< print no outputs */ + VRB_reluctant = 10, /**< print only outputs for fatal errors */ + VRB_minuteOut = 15, /**< print minutely output */ + VRB_typical = 20, /**< print some basic debugging info */ + VRB_emetic = 30 /**< print all the things */ + }; + + enum UNITS + { + UNITS_C, /**< celsius */ + UNITS_F, /**< fahrenheit */ + UNITS_KWH, /**< kilowatt hours */ + UNITS_BTU, /**< british thermal units */ + UNITS_KJ, /**< kilojoules */ + UNITS_KW, /**< kilowatt */ + UNITS_BTUperHr, /**< british thermal units per Hour */ + UNITS_GAL, /**< gallons */ + UNITS_L, /**< liters */ + UNITS_kJperHrC, /**< UA, metric units */ + UNITS_BTUperHrF, /**< UA, imperial units */ + UNITS_FT, /**< feet */ + UNITS_M, /**< meters */ + UNITS_FT2, /**< square feet */ + UNITS_M2, /**< square meters */ + UNITS_MIN, /**< minutes */ + UNITS_SEC, /**< seconds */ + UNITS_HR, /**< hours */ + UNITS_GPM, /**< gallons per minute */ + UNITS_LPS /**< liters per second */ + }; + + /** specifies the type of heat source */ + enum HEATSOURCE_TYPE + { + TYPE_none, /**< a default to check to make sure it's been set */ + TYPE_resistance, /**< a resistance element */ + TYPE_compressor /**< a vapor cycle compressor */ + }; + + /** specifies the extrapolation method based on Tair, from the perfmap for a heat source */ + enum EXTRAP_METHOD + { + EXTRAP_LINEAR, /**< the default extrapolates linearly */ + EXTRAP_NEAREST /**< extrapolates using nearest neighbor, will just continue from closest + point */ + }; + + /** specifies the unit type for outputs in the CSV file-s */ + enum CSVOPTIONS + { + CSVOPT_NONE = 0, + CSVOPT_IPUNITS = 1 << 0, + CSVOPT_IS_DRAWING = 1 << 1 + }; + + struct NodeWeight + { + int nodeNum; + double weight; + NodeWeight(int n, double w) : nodeNum(n), weight(w) {}; + + NodeWeight(int n) : nodeNum(n), weight(1.0) {}; + }; + + struct HeatingLogic + { + public: + std::string description; + std::function compare; + + HeatingLogic(std::string desc, + double decisionPoint_in, + HPWH* hpwh_in, + std::function c, + bool isHTS) + : description(desc) + , decisionPoint(decisionPoint_in) + , hpwh(hpwh_in) + , compare(c) + , isEnteringWaterHighTempShutoff(isHTS) {}; + + /**< checks that the input is all valid. */ + virtual const bool isValid() = 0; + /**< gets the value for comparing the tank value to, i.e. the target SoC */ + virtual const double getComparisonValue() = 0; + /**< gets the calculated value from the tank, i.e. SoC or tank average of node weights*/ + virtual const double getTankValue() = 0; + /**< function to calculate where the average node for a logic set is. */ + virtual const double nodeWeightAvgFract() = 0; + /**< gets the fraction of a node that has to be heated up to met the turnoff condition*/ + virtual const double getFractToMeetComparisonExternal() = 0; + + virtual int setDecisionPoint(double value) = 0; + double getDecisionPoint() { return decisionPoint; } + bool getIsEnteringWaterHighTempShutoff() { return isEnteringWaterHighTempShutoff; } + + protected: + double decisionPoint; + HPWH* hpwh; + bool isEnteringWaterHighTempShutoff; + }; + + struct SoCBasedHeatingLogic : HeatingLogic + { + public: + SoCBasedHeatingLogic(std::string desc, + double decisionPoint, + HPWH* hpwh, + double hF = -0.05, + double tM_C = 43.333, + bool constMains = false, + double mains_C = 18.333, + std::function c = std::less()) + : HeatingLogic(desc, decisionPoint, hpwh, c, false) + , hysteresisFraction(hF) + , tempMinUseful_C(tM_C) + , useCostantMains(constMains) + , constantMains_C(mains_C) {}; + const bool isValid(); + + const double getComparisonValue(); + const double getTankValue(); + const double nodeWeightAvgFract(); + const double getFractToMeetComparisonExternal(); + const double getMainsT_C(); + const double getTempMinUseful_C(); + int setDecisionPoint(double value); + int setConstantMainsTemperature(double mains_C); + + private: + double tempMinUseful_C; + double hysteresisFraction; + bool useCostantMains; + double constantMains_C; + }; + + struct TempBasedHeatingLogic : HeatingLogic + { + public: + TempBasedHeatingLogic(std::string desc, + std::vector n, + double decisionPoint, + HPWH* hpwh, + bool a = false, + std::function c = std::less(), + bool isHTS = false) + : HeatingLogic(desc, decisionPoint, hpwh, c, isHTS), nodeWeights(n), isAbsolute(a) {}; + + const bool isValid(); + + const double getComparisonValue(); + const double getTankValue(); + const double nodeWeightAvgFract(); + const double getFractToMeetComparisonExternal(); + + int setDecisionPoint(double value); + int setDecisionPoint(double value, bool absolute); + + private: + const bool areNodeWeightsValid(); + + bool isAbsolute; + std::vector nodeWeights; + }; + + std::shared_ptr shutOffSoC(std::string desc, + double targetSoC, + double hystFract, + double tempMinUseful_C, + bool constMains, + double mains_C); + std::shared_ptr turnOnSoC(std::string desc, + double targetSoC, + double hystFract, + double tempMinUseful_C, + bool constMains, + double mains_C); + + std::shared_ptr + wholeTank(double decisionPoint, const UNITS units = UNITS_C, const bool absolute = false); + std::shared_ptr topThird(double decisionPoint); + std::shared_ptr topThird_absolute(double decisionPoint); + std::shared_ptr + secondThird(double decisionPoint, const UNITS units = UNITS_C, const bool absolute = false); + std::shared_ptr bottomThird(double decisionPoint); + std::shared_ptr bottomHalf(double decisionPoint); + std::shared_ptr bottomTwelfth(double decisionPoint); + std::shared_ptr bottomSixth(double decisionPoint); + std::shared_ptr bottomSixth_absolute(double decisionPoint); + std::shared_ptr secondSixth(double decisionPoint); + std::shared_ptr thirdSixth(double decisionPoint); + std::shared_ptr fourthSixth(double decisionPoint); + std::shared_ptr fifthSixth(double decisionPoint); + std::shared_ptr topSixth(double decisionPoint); + + std::shared_ptr standby(double decisionPoint); + std::shared_ptr topNodeMaxTemp(double decisionPoint); + std::shared_ptr + bottomNodeMaxTemp(double decisionPoint, bool isEnteringWaterHighTempShutoff = false); + std::shared_ptr bottomTwelfthMaxTemp(double decisionPoint); + std::shared_ptr topThirdMaxTemp(double decisionPoint); + std::shared_ptr bottomSixthMaxTemp(double decisionPoint); + std::shared_ptr secondSixthMaxTemp(double decisionPoint); + std::shared_ptr fifthSixthMaxTemp(double decisionPoint); + std::shared_ptr topSixthMaxTemp(double decisionPoint); + + std::shared_ptr largeDraw(double decisionPoint); + std::shared_ptr largerDraw(double decisionPoint); + + /// this is the value that the public functions will return in case of a simulation + /// destroying error + static const int HPWH_ABORT = -274000; + + static std::string getVersion(); + /**< This function returns a string with the current version number */ + + int HPWHinit_presets(MODELS presetNum); + /**< This function will reset all member variables to defaults and then + * load in a set of parameters that are hardcoded in this function - + * which particular set of parameters is selected by presetNum. + * This is similar to the way the HPWHsim currently operates, as used in SEEM, + * but not quite as versatile. + * My impression is that this could be a useful input paradigm for CSE + * + * The return value is 0 for successful initialization, HPWH_ABORT otherwise + */ + + int HPWHinit_file(std::string configFile); + /**< This function will load in a set of parameters from a file + * The file name is the input - there should be at most one set of parameters per file + * This is useful for testing new variations, and for the sort of variability + * that we typically do when creating SEEM runs + * Appropriate use of this function can be found in the documentation + + * The return value is 0 for successful initialization, HPWH_ABORT otherwise + */ + + int HPWHinit_resTank(); /**< Default resistance tank, EF 0.95, volume 47.5 */ + int HPWHinit_resTank(double tankVol_L, + double energyFactor, + double upperPower_W, + double lowerPower_W); + /**< This function will initialize a HPWH object to be a resistance tank. Since + * resistance tanks are so simple, they can be specified with only four variables: + * tank volume, energy factor, and the power of the upper and lower elements. Energy + * factor is converted into UA internally, although an external setter for UA is + * also provided in case the energy factor is unknown. + * + * Several assumptions regarding the tank configuration are assumed: the lower element + * is at the bottom, the upper element is at the top third. The logics are also set + * to standard setting, with upper as VIP activating when the top third is too cold. + */ + + int HPWHinit_resTankGeneric(double tankVol_L, + double rValue_M2KperW, + double upperPower_W, + double lowerPower_W); + /**< This function will initialize a HPWH object to be a generic resistance storage water + * heater, with a specific R-Value defined at initalization. + * + * Several assumptions regarding the tank configuration are assumed: the lower element + * is at the bottom, the upper element is at the top third. The controls are the same standard + * controls for the HPWHinit_resTank() + */ + + int HPWHinit_genericHPWH(double tankVol_L, double energyFactor, double resUse_C); + /**< This function will initialize a HPWH object to be a non-specific HPWH model + * with an energy factor as specified. Since energy + * factor is not strongly correlated with energy use, most settings + * are taken from the GE2015_STDMode model. + */ + + int runOneStep(double drawVolume_L, + double ambientT_C, + double externalT_C, + DRMODES DRstatus, + double inletVol2_L = 0., + double inletT2_C = 0., + std::vector* extraHeatDist_W = NULL); + /**< This function will progress the simulation forward in time by one step + * all calculated outputs are stored in private variables and accessed through functions + * + * The return value is 0 for successful simulation run, HPWH_ABORT otherwise + */ + + /** An overloaded function that uses takes inletT_C */ + int runOneStep(double inletT_C, + double drawVolume_L, + double ambientT_C, + double externalT_C, + DRMODES DRstatus, + double inletVol2_L = 0., + double inletT2_C = 0., + std::vector* extraHeatDist_W = NULL) + { + setInletT(inletT_C); + return runOneStep(drawVolume_L, + ambientT_C, + externalT_C, + DRstatus, + inletVol2_L, + inletT2_C, + extraHeatDist_W); + }; + + int runNSteps(int N, + double* inletT_C, + double* drawVolume_L, + double* tankAmbientT_C, + double* heatSourceAmbientT_C, + DRMODES* DRstatus); + /**< This function will progress the simulation forward in time by N (equal) steps + * The calculated values will be summed or averaged, as appropriate, and + * then stored in the usual variables to be accessed through functions + * + * The return value is 0 for successful simulation run, HPWH_ABORT otherwise + */ + + /** Setters for the what are typically input variables */ + void setInletT(double newInletT_C) { member_inletT_C = newInletT_C; }; + void setMinutesPerStep(double newMinutesPerStep); + + void setVerbosity(VERBOSITY hpwhVrb); + /**< sets the verbosity to the specified level */ + void setMessageCallback(void (*callbackFunc)(const std::string message, void* pContext), + void* pContext); + /**< sets the function to be used for message passing */ + void printHeatSourceInfo(); + /**< this prints out the heat source info, nicely formatted + specifically input/output energy/power, and runtime + will print to cout if messageCallback pointer is unspecified + does not use verbosity, as it is public and expected to be called only when needed */ + void printTankTemps(); + /**< this prints out all the node temps, kind of nicely formatted + does not use verbosity, as it is public and expected to be called only when needed */ + + int WriteCSVHeading(FILE* outFILE, + const char* preamble = "", + int nTCouples = 6, + int options = CSVOPT_NONE) const; + int WriteCSVRow(FILE* outFILE, + const char* preamble = "", + int nTCouples = 6, + int options = CSVOPT_NONE) const; + /**< a couple of function to write the outputs to a file + they both will return 0 for success + the preamble should be supplied with a trailing comma, as these functions do + not add one. Additionally, a newline is written with each call. */ + + /**< Sets the tank node temps based on the provided vector of temps, which are mapped onto the + existing nodes, regardless of numNodes. */ + int setTankLayerTemperatures(std::vector setTemps, const UNITS units = UNITS_C); + void getTankTemps(std::vector& tankTemps); + + bool isSetpointFixed() const; /**< is the setpoint allowed to be changed */ + int setSetpoint(double newSetpoint, UNITS units = UNITS_C); /** 0 minutes and < 1440 + * minutes. */ + double getTimerLimitTOT_minute() const; + /**< Returns the timer limit in minutes for the DR_TOT call. */ + + int getInletHeight(int whichInlet) const; + /**< returns the water inlet height node number */ + + /**< resizes the tankTemp_C and nextTankTemp_C node vectors */ + void setNumNodes(const std::size_t num_nodes); + + /**< returns the number of nodes */ + int getNumNodes() const; + + /**< returns the index of the top node */ + int getIndexTopNode() const; + + double getTankNodeTemp(int nodeNum, UNITS units = UNITS_C) const; + /**< returns the temperature of the water at the specified node - with specified units + or HPWH_ABORT for incorrect node number or unit failure */ + + double getNthSimTcouple(int iTCouple, int nTCouple, UNITS units = UNITS_C) const; + /**< returns the temperature from a set number of virtual "thermocouples" specified by nTCouple, + which are constructed from the node temperature array. Specify iTCouple from 1-nTCouple, + 1 at the bottom using specified units + returns HPWH_ABORT for iTCouple < 0, > nTCouple, or incorrect units */ + + int getNumHeatSources() const; + /**< returns the number of heat sources */ + + int getNumResistanceElements() const; + /**< returns the number of resistance elements */ + + int getCompressorIndex() const; + /**< returns the index of the compressor in the heat source array. + Note only supports HPWHs with one compressor, if multiple will return the last index + of a compressor */ + + double getCompressorCapacity(double airTemp = 19.722, + double inletTemp = 14.444, + double outTemp = 57.222, + UNITS pwrUnit = UNITS_KW, + UNITS tempUnit = UNITS_C); + /**< Returns the heating output capacity of the compressor for the current HPWH model. + Note only supports HPWHs with one compressor, if multiple will return the last index + of a compressor. Outlet temperatures greater than the max allowable setpoints will return an + error, but for compressors with a fixed setpoint the */ + + int setCompressorOutputCapacity(double newCapacity, + double airTemp = 19.722, + double inletTemp = 14.444, + double outTemp = 57.222, + UNITS pwrUnit = UNITS_KW, + UNITS tempUnit = UNITS_C); + /**< Sets the heating output capacity of the compressor at the defined air, inlet water, and + outlet temperatures. For multi-pass models the capacity is set as the average between the + inletTemp and outTemp since multi-pass models will increase the water temperature only a few + degrees at a time (i.e. maybe 10 degF) until the tank reaches the outTemp, the capacity at + inletTemp might not be accurate for the entire heating cycle. + Note only supports HPWHs with one compressor, if multiple will return the last index + of a compressor */ + + int setScaleHPWHCapacityCOP(double scaleCapacity = 1., double scaleCOP = 1.); + /**< Scales the heatpump water heater input capacity and COP*/ + + int setResistanceCapacity(double power, int which = -1, UNITS pwrUNIT = UNITS_KW); + /**< Scale the resistance elements in the heat source list. Which heat source is chosen is + changes is given by "which" + - If which (-1) sets all the resisistance elements in the tank. + - If which (0, 1, 2...) sets the resistance element in a low to high order. + So if there are 3 elements 0 is the bottom, 1 is the middle, and 2 is the top element, + regardless of their order in heatSources. If the elements exist on at the same node then all of + the elements are set. + + The only valid values for which are between -1 and getNumResistanceElements()-1. Since which is + defined as the by the ordered height of the resistance elements it cannot refer to a compressor. + */ + + double getResistanceCapacity(int which = -1, UNITS pwrUNIT = UNITS_KW); + /**< Returns the resistance elements capacity. Which heat source is chosen is changes is given + by "which" + - If which (-1) gets all the resisistance elements in the tank. + - If which (0, 1, 2...) sets the resistance element in a low to high order. + So if there are 3 elements 0 is the bottom, 1 is the middle, and 2 is the top element, + regardless of their order in heatSources. If the elements exist on at the same node then all of + the elements are set. + + The only valid values for which are between -1 and getNumResistanceElements()-1. Since which is + defined as the by the ordered height of the resistance elements it cannot refer to a compressor. + */ + + int getResistancePosition(int elementIndex) const; + + double getNthHeatSourceEnergyInput(int N, UNITS units = UNITS_KWH) const; + /**< returns the energy input to the Nth heat source, with the specified units + energy used by the heat source is positive - should always be positive + returns HPWH_ABORT for N out of bounds or incorrect units */ + + double getNthHeatSourceEnergyOutput(int N, UNITS units = UNITS_KWH) const; + /**< returns the energy output from the Nth heat source, with the specified units + energy put into the water is positive - should always be positive + returns HPWH_ABORT for N out of bounds or incorrect units */ + + double getNthHeatSourceRunTime(int N) const; + /**< returns the run time for the Nth heat source, in minutes + note: they may sum to more than 1 time step for concurrently running heat sources + returns HPWH_ABORT for N out of bounds */ + int isNthHeatSourceRunning(int N) const; + /**< returns 1 if the Nth heat source is currently engaged, 0 if it is not, and + returns HPWH_ABORT for N out of bounds */ + HEATSOURCE_TYPE getNthHeatSourceType(int N) const; + /**< returns the enum value for what type of heat source the Nth heat source is */ + + double getOutletTemp(UNITS units = UNITS_C) const; + /**< returns the outlet temperature in the specified units + returns 0 when no draw occurs, or HPWH_ABORT for incorrect unit specifier */ + double getCondenserWaterInletTemp(UNITS units = UNITS_C) const; + /**< returns the condenser inlet temperature in the specified units + returns 0 when no HP not running occurs, or HPWH_ABORT for incorrect unit specifier */ + + double getCondenserWaterOutletTemp(UNITS units = UNITS_C) const; + /**< returns the condenser outlet temperature in the specified units + returns 0 when no HP not running occurs, or HPWH_ABORT for incorrect unit specifier */ + + double getExternalVolumeHeated(UNITS units = UNITS_L) const; + /**< returns the volume of water heated in an external in the specified units + returns 0 when no external heat source is running */ + + double getEnergyRemovedFromEnvironment(UNITS units = UNITS_KWH) const; + /**< get the total energy removed from the environment by all heat sources in specified units + (not net energy - does not include standby) + moving heat from the space to the water is the positive direction + returns HPWH_ABORT for incorrect units */ + + double getStandbyLosses(UNITS units = UNITS_KWH) const; + /**< get the amount of heat lost through the tank in specified units + moving heat from the water to the space is the positive direction + negative should occur seldom + returns HPWH_ABORT for incorrect units */ + + double getTankHeatContent_kJ() const; + /**< get the heat content of the tank, relative to zero celsius + * returns using kilojoules */ + + int getHPWHModel() const; + /**< get the model number of the HPWHsim model number of the hpwh */ + + int getCompressorCoilConfig() const; + bool isCompressorMultipass() const; + bool isCompressoExternalMultipass() const; + + bool hasACompressor() const; + /**< Returns if the HPWH model has a compressor or not, could be a storage or resistance tank. + */ + + bool hasExternalHeatSource() const; + /**< Returns if the HPWH model has any external heat sources or not, could be a compressor or + * resistance element. */ + double getExternalMPFlowRate(UNITS units = UNITS_GPM) const; + /**< Returns the constant flow rate for an external multipass heat sources. */ + + double getCompressorMinRuntime(UNITS units = UNITS_MIN) const; + + int getSizingFractions(double& aquafract, double& percentUseable) const; + /**< returns the fraction of total tank volume from the bottom up where the aquastat is + or the turn on logic for the compressor, and the USEable fraction of storage or 1 minus + where the shut off logic is for the compressor. If the logic spans multiple nodes it + returns the weighted average of the nodes */ + + bool isHPWHScalable() const; + /**< returns if the HPWH is scalable or not*/ + + bool shouldDRLockOut(HEATSOURCE_TYPE hs, DRMODES DR_signal) const; + /**< Checks the demand response signal against the different heat source types */ + + void resetTopOffTimer(); + /**< resets variables for timer associated with the DR_TOT call */ + + double getLocationTemp_C() const; + int setMaxTempDepression(double maxDepression, UNITS units = UNITS_C); + + bool hasEnteringWaterHighTempShutOff(int heatSourceIndex); + int setEnteringWaterHighTempShutOff(double highTemp, + bool tempIsAbsolute, + int heatSourceIndex, + UNITS units = UNITS_C); + /**< functions to check for and set specific high temperature shut off logics. + HPWHs can only have one of these, which is at least typical */ + + int setTargetSoCFraction(double target); + + bool canUseSoCControls(); + + int switchToSoCControls(double targetSoC, + double hysteresisFraction = 0.05, + double tempMinUseful = 43.333, + bool constantMainsT = false, + double mainsT = 18.333, + UNITS tempUnit = UNITS_C); + + bool isSoCControlled() const; + + /// Checks whether energy is balanced during a simulation step. + bool isEnergyBalanced(const double drawVol_L, + const double prevHeatContent_kJ, + const double fracEnergyTolerance = 0.001); + + /// Overloaded version of above that allows specification of inlet temperature. + bool isEnergyBalanced(const double drawVol_L, + double inletT_C_in, + const double prevHeatContent_kJ, + const double fracEnergyTolerance) + { + setInletT(inletT_C_in); + return isEnergyBalanced(drawVol_L, prevHeatContent_kJ, fracEnergyTolerance); + } + + /// Addition of heat from a normal heat sources; return excess heat, if needed, to prevent + /// exceeding maximum or setpoint + double addHeatAboveNode(double qAdd_kJ, const int nodeNum, const double maxT_C); + + /// Addition of extra heat handled separately from normal heat sources + void addExtraHeatAboveNode(double qAdd_kJ, const int nodeNum); + + struct ControlInfo + { + long outputCode; + long timeToRun_min; + double setpointT_C; + std::unique_ptr initialTankT_C; + bool doConduction; + bool doInversionMixing; + std::unique_ptr inletH; + std::unique_ptr tankSize_gal; + std::unique_ptr tot_limit; + bool useSoC; + std::string temperatureUnits; + bool recordMinuteData; + bool recordYearData; + bool modifyDraw; + }; + bool readControlInfo(const std::string& testDirectory, ControlInfo& controlInfo); + + typedef std::vector Schedule; + bool readSchedules(const std::string& testDirectory, + const ControlInfo& controlInfo, + std::vector& allSchedules); + bool readSchedule(Schedule& schedule, std::string scheduleName, long testLength_min); + + struct TestDesc + { + std::string presetOrFile; + std::string modelName; + std::string testName; + }; + + struct TestResults + { + bool passed; + double totalEnergyConsumed_kJ; + double totalVolumeRemoved_L; + }; + + bool runSimulation(const TestDesc& testDesc, + const std::string& outputDirectory, + const HPWH::ControlInfo& controlInfo, + std::vector& allSchedules, + double airT_C, + const bool doTempDepress, + TestResults& testResults); + + private: + class HeatSource; + + void setAllDefaults(); /**< sets all the defaults default */ + + void updateTankTemps( + double draw, double inletT_C, double ambientT_C, double inletVol2_L, double inletT2_L); + void mixTankInversions(); + /**< Mixes the any temperature inversions in the tank after all the temperature calculations */ + void updateSoCIfNecessary(); + + bool areAllHeatSourcesOff() const; + /**< test if all the heat sources are off */ + void turnAllHeatSourcesOff(); + /**< disengage each heat source */ + + void addHeatParent(HeatSource* heatSourcePtr, double heatSourceAmbientT_C, double minutesToRun); + + /// adds extra heat to the set of nodes that are at the same temperature, above the + /// specified node number + void modifyHeatDistribution(std::vector& heatDistribution); + void addExtraHeat(std::vector& extraHeatDist_W); + + /// "extra" heat added during a simulation step + double extraEnergyInput_kWh; + + double tankAvg_C(const std::vector nodeWeights) const; + /**< functions to calculate what the temperature in a portion of the tank is */ + + void mixTankNodes(int mixedAboveNode, int mixedBelowNode, double mixFactor); + /**< function to average the nodes in a tank together bewtween the mixed abovenode and mixed + * below node. */ + + void calcDerivedValues(); + /**< a helper function for the inits, calculating condentropy and the lowest node */ + void calcSizeConstants(); + /**< a helper function to set constants for the UA and tank size*/ + void calcDerivedHeatingValues(); + /**< a helper for the helper, calculating condentropy and the lowest node*/ + void mapResRelativePosToHeatSources(); + /**< a helper function for the inits, creating a mapping function for the position of the + resistance elements to their indexes in heatSources. */ + + int checkInputs(); + /**< a helper function to run a few checks on the HPWH input parameters */ + + double getChargePerNode(double tCold, double tMix, double tHot) const; + + void calcAndSetSoCFraction(); + + void sayMessage(const std::string message) const; + /**< if the messagePriority is >= the hpwh verbosity, + either pass your message out to the callback function or print it to cout + otherwise do nothing */ + void msg(const char* fmt, ...) const; + void msgV(const char* fmt, va_list ap = NULL) const; + + bool simHasFailed; + /**< did an internal error cause the simulation to fail? */ + + bool isHeating; + /**< is the hpwh currently heating or not? */ - /**< holds the temperature of each node - 0 is the bottom node */ - std::vector tankTemps_C; + bool setpointFixed; + /**< does the HPWH allow the setpoint to vary */ - /**< holds the future temperature of each node for the conduction calculation - 0 is the bottom node */ - std::vector nextTankTemps_C; + bool tankSizeFixed; + /**< does the HPWH have a constant tank size or can it be changed */ - DRMODES prevDRstatus; - /**< the DRstatus of the tank in the previous time step and at the end of runOneStep */ + bool canScale; + /**< can the HPWH scale capactiy and COP or not */ - double timerLimitTOT; - /**< the time limit in minutes on the timer when the compressor and resistance elements are turned back on, used with DR_TOT. */ - double timerTOT; - /**< the timer used for DR_TOT to turn on the compressor and resistance elements. */ + VERBOSITY hpwhVerbosity; + /**< an enum to let the sim know how much output to say */ - bool usesSoCLogic; + void (*messageCallback)(const std::string message, void* contextPtr); + /**< function pointer to indicate an external message processing function */ + void* messageCallbackContextPtr; + /**< caller context pointer for external message processing */ - // Some outputs - double outletTemp_C; - /**< the temperature of the outlet water - taken from top of tank, 0 if no flow */ + MODELS hpwhModel; + /**< The hpwh should know which preset initialized it, or if it was from a fileget */ - double condenserInlet_C; - /**< the temperature of the inlet water to the condensor either an average of tank nodes or taken from the bottom, 0 if no flow or no compressor */ - double condenserOutlet_C; - /**< the temperature of the outlet water from the condensor either, 0 if no flow or no compressor */ - double externalVolumeHeated_L; - /**< the volume of water heated by an external source, 0 if no flow or no external heat source */ + // a std::vector containing the HeatSources, in order of priority + std::vector heatSources; - double energyRemovedFromEnvironment_kWh; - /**< the total energy removed from the environment, to heat the water */ - double standbyLosses_kWh; - /**< the amount of heat lost to standby */ + int compressorIndex; + /**< The index of the compressor heat source (set to -1 if no compressor)*/ - // special variables for adding abilities - bool tankMixesOnDraw; - /**< whether or not the bottom fraction (defined by mixBelowFraction) - of the tank should mix during draws */ - double mixBelowFractionOnDraw; - /**< mixes the tank below this fraction on draws iff tankMixesOnDraw */ + int lowestElementIndex; + /**< The index of the lowest resistance element heat source (set to -1 if no resistance + * elements)*/ + + int highestElementIndex; + /**< The index of the highest resistance element heat source. if only one element it equals + * lowestElementIndex (set to -1 if no resistance elements)*/ - bool doTempDepression; - /**< whether the HPWH should use the alternate ambient temperature that - gets depressed when a compressor is running - NOTE: this only works for 1 minute steps */ - double locationTemperature_C; - /**< this is the special location temperature that stands in for the the - ambient temperature if you are doing temp. depression */ - double maxDepression_C = 2.5; - /** a couple variables to hold values which are typically inputs */ - double member_inletT_C; + int VIPIndex; + /**< The index of the VIP resistance element heat source (set to -1 if no VIP resistance + * elements)*/ - double minutesPerStep = 1.; - double secondsPerStep,hoursPerStep; + int inletHeight; + /**< the number of a node in the tank that the inlet water enters the tank at, must be between 0 + * and numNodes-1 */ - bool doInversionMixing; - /**< If and only if true will model temperature inversion mixing in the tank */ + int inlet2Height; + /**< the number of a node in the tank that the 2nd inlet water enters the tank at, must be + * between 0 and numNodes-1 */ - bool doConduction; - /**< If and only if true will model conduction between the internal nodes of the tank */ + /**< the volume in liters of the tank */ + double tankVolume_L; + + /**< the UA of the tank, in metric units */ + double tankUA_kJperHrC; - struct resPoint { - int index; - int position; - }; - std::vector resistanceHeightMap; - /**< A map from index of an resistance element in heatSources to position in the tank, its - is sorted by height from lowest to highest*/ - - /// Generates a vector of logical nodes - std::vector getNodeWeightRange(double bottomFraction,double topFraction); - - /// False: water is drawn from the tank itself; True: tank provides heat exchange only - bool hasHeatExchanger; - - /// Coefficient (0-1) of effectiveness for heat exchange between tank and water line (used by heat-exchange models only). - double heatExchangerEffectiveness; - - /// Coefficient (0-1) of effectiveness for heat exchange between a single tank node and water line (derived from heatExchangerEffectiveness). - double nodeHeatExchangerEffectiveness; - -}; //end of HPWH class - -class HPWH::HeatSource { -public: - friend class HPWH; - - HeatSource(){} /**< default constructor, does not create a useful HeatSource */ - HeatSource(HPWH *parentHPWH); - /**< constructor assigns a pointer to the hpwh that owns this heat source */ - HeatSource(const HeatSource &hSource); ///copy constructor - HeatSource& operator=(const HeatSource &hSource); ///assignment operator - /**< the copy constructor and assignment operator basically just checks if there - are backup/companion pointers - these can't be copied */ - - void setupAsResistiveElement(int node,double Watts,int condensitySize = CONDENSITY_SIZE); - /**< configure the heat source to be a resisive element, positioned at the - specified node, with the specified power in watts */ - - bool isEngaged() const; - /**< return whether or not the heat source is engaged */ - void engageHeatSource(DRMODES DRstatus = DR_ALLOW); - /**< turn heat source on, i.e. set isEngaged to TRUE */ - void disengageHeatSource(); - /**< turn heat source off, i.e. set isEngaged to FALSE */ - - bool isLockedOut() const; - /**< return whether or not the heat source is locked out */ - void lockOutHeatSource(); - /**< lockout heat source, i.e. set isLockedOut to TRUE */ - void unlockHeatSource(); - /**< unlock heat source, i.e. set isLockedOut to FALSE */ - - bool shouldLockOut(double heatSourceAmbientT_C) const; - /**< queries the heat source as to whether it should lock out */ - bool shouldUnlock(double heatSourceAmbientT_C) const; - /**< queries the heat source as to whether it should unlock */ - - bool toLockOrUnlock(double heatSourceAmbientT_C); - /**< combines shouldLockOut and shouldUnlock to one master function which locks or unlocks the heatsource. Return boolean lockedOut (true if locked, false if unlocked)*/ - - bool shouldHeat() const; - /**< queries the heat source as to whether or not it should turn on */ - bool shutsOff() const; - /**< queries the heat source whether should shut off */ - - bool maxedOut() const; - /**< queries the heat source as to if it shouldn't produce hotter water and the tank isn't at setpoint. */ - - int findParent() const; - /**< returns the index of the heat source where this heat source is a backup. - returns -1 if none found. */ - - double fractToMeetComparisonExternal() const; - /**< calculates the distance the current state is from the shutOff logic for external configurations*/ - - void addHeat(double externalT_C,double minutesToRun); - /**< adds heat to the hpwh - this is the function that interprets the - various configurations (internal/external, resistance/heat pump) to add heat */ - - /// Assign new condensity values from supplied vector. Note the input vector is currently resampled - /// to preserve a condensity vector of size CONDENSITY_SIZE. - void setCondensity(const std::vector &condensity_in); - - int getCondensitySize() const; - - void linearInterp(double &ynew,double xnew,double x0,double x1,double y0,double y1); - /**< Does a simple linear interpolation between two points to the xnew point */ - - void regressedMethod(double &ynew,std::vector &coefficents,double x1,double x2,double x3); - /**< Does a calculation based on the ten term regression equation */ - - void regressedMethodMP(double &ynew,std::vector &coefficents,double x1,double x2); - /**< Does a calculation based on the five term regression equation for MP split systems */ - - void btwxtInterp(double& input_BTUperHr,double& cop,std::vector& target); - /**< Does a linear interpolation in btwxt to the target point*/ - - void setupDefrostMap(double derate35 = 0.8865); - /**< configure the heat source with a default for the defrost derating */ - void defrostDerate(double &to_derate,double airT_C); - /**< Derates the COP of a system based on the air temperature */ - -private: - //start with a few type definitions - enum COIL_CONFIG { - CONFIG_SUBMERGED, - CONFIG_WRAPPED, - CONFIG_EXTERNAL - }; - - /** the creator of the heat source, necessary to access HPWH variables */ - HPWH *hpwh; - - // these are the heat source state/output variables - bool isOn; - /**< is the heat source running or not */ - - bool lockedOut; - /**< is the heat source locked out */ - - bool doDefrost; - /**< If and only if true will derate the COP of a compressor to simulate a defrost cycle */ - - // some outputs - double runtime_min; - /**< this is the percentage of the step that the heat source was running */ - double energyInput_kWh; - /**< the energy used by the heat source */ - double energyOutput_kWh; - /**< the energy put into the water by the heat source */ - -// these are the heat source property variables - bool isVIP; - /**< is this heat source a high priority heat source? (e.g. upper resisitor) */ - HeatSource* backupHeatSource; - /**< a pointer to the heat source which serves as backup to this one - should be NULL if no backup exists */ - HeatSource* companionHeatSource; - /**< a pointer to the heat source which will run concurrently with this one - it still will only turn on if shutsOff is false */ - - HeatSource* followedByHeatSource; - /**< a pointer to the heat source which will attempt to run after this one */ - - // condensity is represented as a std::vector of size CONDENSITY_SIZE. - // It represents the location within the tank where heat will be distributed, - // and it also is used to calculate the condenser temperature for inputPower/COP calcs. - // It is conceptually linked to the way condenser coils are wrapped around - // (or within) the tank, however a resistance heat source can also be simulated - // by specifying the entire condensity in one node. */ - std::vector condensity; - - double Tshrinkage_C; - /**< Tshrinkage_C is a derived from the condentropy (conditional entropy), - using the condensity and fixed parameters Talpha_C and Tbeta_C. - Talpha_C and Tbeta_C are not intended to be settable - see the hpwh_init functions for calculation of shrinkage */ - - struct perfPoint { - double T_F; - std::vector inputPower_coeffs; // c0 + c1*T + c2*T*T - std::vector COP_coeffs; // c0 + c1*T + c2*T*T - }; - - std::vector perfMap; - /**< A map with input/COP quadratic curve coefficients at a given external temperature */ - - std::vector< std::vector > perfGrid; - /**< The axis values defining the regular grid for the performance data. - SP would have 3 axis, MP would have 2 axis*/ - - std::vector< std::vector > perfGridValues; - /**< The values for input power and cop use matching to the grid. Should be long format with { { inputPower_W }, { COP } }. */ - - class Btwxt::RegularGridInterpolator *perfRGI; - /**< The grid interpolator used for mapping performance*/ - - bool useBtwxtGrid; - - /** a vector to hold the set of logical choices for turning this element on */ - std::vector> turnOnLogicSet; - /** a vector to hold the set of logical choices that can cause an element to turn off */ - std::vector> shutOffLogicSet; - /** a single logic that checks the bottom point is below a temperature so the system doesn't short cycle*/ - std::shared_ptr standbyLogic; - - /** some compressors have a resistance element for defrost*/ - struct resistanceElementDefrost - { - double inputPwr_kW; - double constTempLift_dF; - double onBelowT_F; - }; - resistanceElementDefrost resDefrost; - - struct defrostPoint { - double T_F; - double derate_fraction; - }; - std::vector defrostMap; - /**< A list of points for the defrost derate factor ordered by increasing external temperature */ - - struct maxOut_minAir { - double outT_C; - double airT_C; - }; - maxOut_minAir maxOut_at_LowT; - /**< maximum output temperature at the minimum operating temperature of HPWH environment (minT)*/ - - struct SecondaryHeatExchanger { - double coldSideTemperatureOffest_dC; - double hotSideTemperatureOffset_dC; - double extraPumpPower_W; - }; - - SecondaryHeatExchanger secondaryHeatExchanger; /**< adjustments for a approximating a secondary heat exchanger by adding extra input energy for the pump and - an increaes in the water to the incoming waater temperature to the heatpump*/ - - void addTurnOnLogic(std::shared_ptr logic); - void addShutOffLogic(std::shared_ptr logic); - /**< these are two small functions to remove some of the cruft in initiation functions */ - void clearAllTurnOnLogic(); - void clearAllShutOffLogic(); - void clearAllLogic(); - /**< these are two small functions to remove some of the cruft in initiation functions */ - - - - void changeResistanceWatts(double watts); - /**< function to change the resistance wattage */ - - bool isACompressor() const; - /**< returns if the heat source uses a compressor or not */ - bool isAResistance() const; - /**< returns if the heat source uses a resistance element or not */ - bool isExternalMultipass() const; - - double minT; - /**< minimum operating temperature of HPWH environment */ - - double maxT; - /**< maximum operating temperature of HPWH environment */ - - double maxSetpoint_C; - /**< the maximum setpoint of the heat source can create, used for compressors predominately */ - - double hysteresis_dC; - /**< a hysteresis term that prevents short cycling due to heat pump self-interaction - when the heat source is engaged, it is subtracted from lowT cutoffs and - added to lowTreheat cutoffs */ + /**< the UA of the fittings for the tank, in metric units */ + double fittingsUA_kJperHrC; - bool depressesTemperature; - /**< heat pumps can depress the temperature of their space in certain instances - - whether or not this occurs is a bool in HPWH, but a heat source must - know if it is capable of contributing to this effect or not - NOTE: this only works for 1 minute steps - ALSO: this is set according the the heat source type, not user-specified */ + /**< the volume (L) of a single node */ + double nodeVolume_L; - double airflowFreedom; - /**< airflowFreedom is the fraction of full flow. This is used to de-rate compressor - cop (not capacity) for cases where the air flow is restricted - typically ducting */ + /**< the mass of water (kg) in a single node */ + double nodeMass_kg; - int externalInletHeight; /** tankTemps_C; - // some private functions, mostly used for heating the water with the addHeat function + /**< holds the future temperature of each node for the conduction calculation - 0 is the bottom + * node */ + std::vector nextTankTemps_C; - double addHeatExternal(double externalT_C,double minutesToRun,double &cap_BTUperHr,double &input_BTUperHr,double &cop); - /**< Add heat from a source outside of the tank. Assume the condensity is where - the water is drawn from and hot water is put at the top of the tank. */ + DRMODES prevDRstatus; + /**< the DRstatus of the tank in the previous time step and at the end of runOneStep */ - /** I wrote some methods to help with the add heat interface - MJL */ - void getCapacity(double externalT_C,double condenserTemp_C,double setpointTemp_C,double &input_BTUperHr,double &cap_BTUperHr,double &cop); + double timerLimitTOT; + /**< the time limit in minutes on the timer when the compressor and resistance elements are + * turned back on, used with DR_TOT. */ + double timerTOT; + /**< the timer used for DR_TOT to turn on the compressor and resistance elements. */ - /** An overloaded function that uses uses the setpoint temperature */ - void getCapacity(double externalT_C,double condenserTemp_C,double &input_BTUperHr,double &cap_BTUperHr,double &cop) { - getCapacity(externalT_C,condenserTemp_C,hpwh->getSetpoint(),input_BTUperHr,cap_BTUperHr,cop); - }; - /** An equivalent getCapcity function just for multipass external (or split) HPWHs */ - void getCapacityMP(double externalT_C,double condenserTemp_C,double &input_BTUperHr,double &cap_BTUperHr,double &cop); + bool usesSoCLogic; - double calcMPOutletTemperature(double heatingCapacity_KW); - /**< returns the temperature of outlet of a external multipass hpwh */ + // Some outputs + double outletTemp_C; + /**< the temperature of the outlet water - taken from top of tank, 0 if no flow */ - void calcHeatDist(std::vector &heatDistribution); + double condenserInlet_C; + /**< the temperature of the inlet water to the condensor either an average of tank nodes or + * taken from the bottom, 0 if no flow or no compressor */ + double condenserOutlet_C; + /**< the temperature of the outlet water from the condensor either, 0 if no flow or no + * compressor */ + double externalVolumeHeated_L; + /**< the volume of water heated by an external source, 0 if no flow or no external heat source + */ - double getTankTemp() const; - /**< returns the tank temperature weighted by the condensity for this heat source */ + double energyRemovedFromEnvironment_kWh; + /**< the total energy removed from the environment, to heat the water */ + double standbyLosses_kWh; + /**< the amount of heat lost to standby */ - void sortPerformanceMap(); - /**< sorts the Performance Map by increasing external temperatures */ + // special variables for adding abilities + bool tankMixesOnDraw; + /**< whether or not the bottom fraction (defined by mixBelowFraction) + of the tank should mix during draws */ + double mixBelowFractionOnDraw; + /**< mixes the tank below this fraction on draws iff tankMixesOnDraw */ -}; // end of HeatSource class + bool doTempDepression; + /**< whether the HPWH should use the alternate ambient temperature that + gets depressed when a compressor is running + NOTE: this only works for 1 minute steps */ + double locationTemperature_C; + /**< this is the special location temperature that stands in for the the + ambient temperature if you are doing temp. depression */ + double maxDepression_C = 2.5; + /** a couple variables to hold values which are typically inputs */ + double member_inletT_C; + + double minutesPerStep = 1.; + double secondsPerStep, hoursPerStep; + + bool doInversionMixing; + /**< If and only if true will model temperature inversion mixing in the tank */ + + bool doConduction; + /**< If and only if true will model conduction between the internal nodes of the tank */ -constexpr double BTUperKWH = 3412.14163312794; // https://www.rapidtables.com/convert/energy/kWh_to_BTU.html -constexpr double FperC = 9. / 5.; // degF / degC -constexpr double offsetF = 32.; // degF offset + struct resPoint + { + int index; + int position; + }; + std::vector resistanceHeightMap; + /**< A map from index of an resistance element in heatSources to position in the tank, its + is sorted by height from lowest to highest*/ + + /// Generates a vector of logical nodes + std::vector getNodeWeightRange(double bottomFraction, double topFraction); + + /// False: water is drawn from the tank itself; True: tank provides heat exchange only + bool hasHeatExchanger; + + /// Coefficient (0-1) of effectiveness for heat exchange between tank and water line (used by + /// heat-exchange models only). + double heatExchangerEffectiveness; + + /// Coefficient (0-1) of effectiveness for heat exchange between a single tank node and water + /// line (derived from heatExchangerEffectiveness). + double nodeHeatExchangerEffectiveness; + +}; // end of HPWH class + +class HPWH::HeatSource +{ + public: + friend class HPWH; + + HeatSource() {} /**< default constructor, does not create a useful HeatSource */ + HeatSource(HPWH* parentHPWH); + /**< constructor assigns a pointer to the hpwh that owns this heat source */ + HeatSource(const HeatSource& hSource); /// copy constructor + HeatSource& operator=(const HeatSource& hSource); /// assignment operator + /**< the copy constructor and assignment operator basically just checks if there + are backup/companion pointers - these can't be copied */ + + void setupAsResistiveElement(int node, double Watts, int condensitySize = CONDENSITY_SIZE); + /**< configure the heat source to be a resisive element, positioned at the + specified node, with the specified power in watts */ + + bool isEngaged() const; + /**< return whether or not the heat source is engaged */ + void engageHeatSource(DRMODES DRstatus = DR_ALLOW); + /**< turn heat source on, i.e. set isEngaged to TRUE */ + void disengageHeatSource(); + /**< turn heat source off, i.e. set isEngaged to FALSE */ + + bool isLockedOut() const; + /**< return whether or not the heat source is locked out */ + void lockOutHeatSource(); + /**< lockout heat source, i.e. set isLockedOut to TRUE */ + void unlockHeatSource(); + /**< unlock heat source, i.e. set isLockedOut to FALSE */ + + bool shouldLockOut(double heatSourceAmbientT_C) const; + /**< queries the heat source as to whether it should lock out */ + bool shouldUnlock(double heatSourceAmbientT_C) const; + /**< queries the heat source as to whether it should unlock */ + + bool toLockOrUnlock(double heatSourceAmbientT_C); + /**< combines shouldLockOut and shouldUnlock to one master function which locks or unlocks the + * heatsource. Return boolean lockedOut (true if locked, false if unlocked)*/ + + bool shouldHeat() const; + /**< queries the heat source as to whether or not it should turn on */ + bool shutsOff() const; + /**< queries the heat source whether should shut off */ + + bool maxedOut() const; + /**< queries the heat source as to if it shouldn't produce hotter water and the tank isn't at + * setpoint. */ + + int findParent() const; + /**< returns the index of the heat source where this heat source is a backup. + returns -1 if none found. */ + + double fractToMeetComparisonExternal() const; + /**< calculates the distance the current state is from the shutOff logic for external + * configurations*/ + + void addHeat(double externalT_C, double minutesToRun); + /**< adds heat to the hpwh - this is the function that interprets the + various configurations (internal/external, resistance/heat pump) to add heat */ + + /// Assign new condensity values from supplied vector. Note the input vector is currently + /// resampled to preserve a condensity vector of size CONDENSITY_SIZE. + void setCondensity(const std::vector& condensity_in); + + int getCondensitySize() const; + + void linearInterp(double& ynew, double xnew, double x0, double x1, double y0, double y1); + /**< Does a simple linear interpolation between two points to the xnew point */ + + void regressedMethod( + double& ynew, std::vector& coefficents, double x1, double x2, double x3); + /**< Does a calculation based on the ten term regression equation */ + + void regressedMethodMP(double& ynew, std::vector& coefficents, double x1, double x2); + /**< Does a calculation based on the five term regression equation for MP split systems */ + + void btwxtInterp(double& input_BTUperHr, double& cop, std::vector& target); + /**< Does a linear interpolation in btwxt to the target point*/ + + void setupDefrostMap(double derate35 = 0.8865); + /**< configure the heat source with a default for the defrost derating */ + void defrostDerate(double& to_derate, double airT_C); + /**< Derates the COP of a system based on the air temperature */ + + private: + // start with a few type definitions + enum COIL_CONFIG + { + CONFIG_SUBMERGED, + CONFIG_WRAPPED, + CONFIG_EXTERNAL + }; + + /** the creator of the heat source, necessary to access HPWH variables */ + HPWH* hpwh; + + // these are the heat source state/output variables + bool isOn; + /**< is the heat source running or not */ + + bool lockedOut; + /**< is the heat source locked out */ + + bool doDefrost; + /**< If and only if true will derate the COP of a compressor to simulate a defrost cycle */ + + // some outputs + double runtime_min; + /**< this is the percentage of the step that the heat source was running */ + double energyInput_kWh; + /**< the energy used by the heat source */ + double energyOutput_kWh; + /**< the energy put into the water by the heat source */ + + // these are the heat source property variables + bool isVIP; + /**< is this heat source a high priority heat source? (e.g. upper resisitor) */ + HeatSource* backupHeatSource; + /**< a pointer to the heat source which serves as backup to this one + should be NULL if no backup exists */ + HeatSource* companionHeatSource; + /**< a pointer to the heat source which will run concurrently with this one + it still will only turn on if shutsOff is false */ + + HeatSource* followedByHeatSource; + /**< a pointer to the heat source which will attempt to run after this one */ + + // condensity is represented as a std::vector of size CONDENSITY_SIZE. + // It represents the location within the tank where heat will be distributed, + // and it also is used to calculate the condenser temperature for inputPower/COP calcs. + // It is conceptually linked to the way condenser coils are wrapped around + // (or within) the tank, however a resistance heat source can also be simulated + // by specifying the entire condensity in one node. */ + std::vector condensity; + + double Tshrinkage_C; + /**< Tshrinkage_C is a derived from the condentropy (conditional entropy), + using the condensity and fixed parameters Talpha_C and Tbeta_C. + Talpha_C and Tbeta_C are not intended to be settable + see the hpwh_init functions for calculation of shrinkage */ + + struct perfPoint + { + double T_F; + std::vector inputPower_coeffs; // c0 + c1*T + c2*T*T + std::vector COP_coeffs; // c0 + c1*T + c2*T*T + }; + + std::vector perfMap; + /**< A map with input/COP quadratic curve coefficients at a given external temperature */ + + std::vector> perfGrid; + /**< The axis values defining the regular grid for the performance data. + SP would have 3 axis, MP would have 2 axis*/ + + std::vector> perfGridValues; + /**< The values for input power and cop use matching to the grid. Should be long format with { { + * inputPower_W }, { COP } }. */ + + class Btwxt::RegularGridInterpolator* perfRGI; + /**< The grid interpolator used for mapping performance*/ + + bool useBtwxtGrid; + + /** a vector to hold the set of logical choices for turning this element on */ + std::vector> turnOnLogicSet; + /** a vector to hold the set of logical choices that can cause an element to turn off */ + std::vector> shutOffLogicSet; + /** a single logic that checks the bottom point is below a temperature so the system doesn't + * short cycle*/ + std::shared_ptr standbyLogic; + + /** some compressors have a resistance element for defrost*/ + struct resistanceElementDefrost + { + double inputPwr_kW; + double constTempLift_dF; + double onBelowT_F; + }; + resistanceElementDefrost resDefrost; + + struct defrostPoint + { + double T_F; + double derate_fraction; + }; + std::vector defrostMap; + /**< A list of points for the defrost derate factor ordered by increasing external temperature + */ + + struct maxOut_minAir + { + double outT_C; + double airT_C; + }; + maxOut_minAir maxOut_at_LowT; + /**< maximum output temperature at the minimum operating temperature of HPWH environment + * (minT)*/ + + struct SecondaryHeatExchanger + { + double coldSideTemperatureOffest_dC; + double hotSideTemperatureOffset_dC; + double extraPumpPower_W; + }; + + SecondaryHeatExchanger secondaryHeatExchanger; /**< adjustments for a approximating a secondary + heat exchanger by adding extra input energy for the pump and an increaes in the water to the + incoming waater temperature to the heatpump*/ + + void addTurnOnLogic(std::shared_ptr logic); + void addShutOffLogic(std::shared_ptr logic); + /**< these are two small functions to remove some of the cruft in initiation functions */ + void clearAllTurnOnLogic(); + void clearAllShutOffLogic(); + void clearAllLogic(); + /**< these are two small functions to remove some of the cruft in initiation functions */ + + void changeResistanceWatts(double watts); + /**< function to change the resistance wattage */ + + bool isACompressor() const; + /**< returns if the heat source uses a compressor or not */ + bool isAResistance() const; + /**< returns if the heat source uses a resistance element or not */ + bool isExternalMultipass() const; + + double minT; + /**< minimum operating temperature of HPWH environment */ + + double maxT; + /**< maximum operating temperature of HPWH environment */ + + double maxSetpoint_C; + /**< the maximum setpoint of the heat source can create, used for compressors predominately */ + + double hysteresis_dC; + /**< a hysteresis term that prevents short cycling due to heat pump self-interaction + when the heat source is engaged, it is subtracted from lowT cutoffs and + added to lowTreheat cutoffs */ + + bool depressesTemperature; + /**< heat pumps can depress the temperature of their space in certain instances - + whether or not this occurs is a bool in HPWH, but a heat source must + know if it is capable of contributing to this effect or not + NOTE: this only works for 1 minute steps + ALSO: this is set according the the heat source type, not user-specified */ + + double airflowFreedom; + /**< airflowFreedom is the fraction of full flow. This is used to de-rate compressor + cop (not capacity) for cases where the air flow is restricted - typically ducting */ + + int externalInletHeight; /**getSetpoint(), input_BTUperHr, cap_BTUperHr, cop); + }; + /** An equivalent getCapcity function just for multipass external (or split) HPWHs */ + void getCapacityMP(double externalT_C, + double condenserTemp_C, + double& input_BTUperHr, + double& cap_BTUperHr, + double& cop); + + double calcMPOutletTemperature(double heatingCapacity_KW); + /**< returns the temperature of outlet of a external multipass hpwh */ + + void calcHeatDist(std::vector& heatDistribution); + + double getTankTemp() const; + /**< returns the tank temperature weighted by the condensity for this heat source */ + + void sortPerformanceMap(); + /**< sorts the Performance Map by increasing external temperatures */ + +}; // end of HeatSource class + +constexpr double BTUperKWH = + 3412.14163312794; // https://www.rapidtables.com/convert/energy/kWh_to_BTU.html +constexpr double FperC = 9. / 5.; // degF / degC +constexpr double offsetF = 32.; // degF offset constexpr double sec_per_min = 60.; // seconds / min -constexpr double min_per_hr = 60.; // min / hr +constexpr double min_per_hr = 60.; // min / hr constexpr double sec_per_hr = sec_per_min * min_per_hr; // seconds / hr // a few extra functions for unit conversion @@ -1394,43 +1572,49 @@ inline double FT2_TO_M2(double feet2) { return (feet2 / 10.7640); } inline double MIN_TO_SEC(double minute) { return minute * sec_per_min; } inline double MIN_TO_HR(double minute) { return minute / min_per_hr; } -inline HPWH::DRMODES operator|(HPWH::DRMODES a,HPWH::DRMODES b) +inline HPWH::DRMODES operator|(HPWH::DRMODES a, HPWH::DRMODES b) { - return static_cast(static_cast(a) | static_cast(b)); + return static_cast(static_cast(a) | static_cast(b)); } -template< typename T> inline bool aboutEqual(T a,T b) { return fabs(a - b) < HPWH::TOL_MINVALUE; } +template +inline bool aboutEqual(T a, T b) +{ + return fabs(a - b) < HPWH::TOL_MINVALUE; +} /// Generate an absolute or relative temperature in degC. -inline double convertTempToC(const double T_F_or_C,const HPWH::UNITS units,const bool absolute){ - return (units == HPWH::UNITS_C) ? T_F_or_C : (absolute ? F_TO_C(T_F_or_C) : dF_TO_dC(T_F_or_C)); +inline double convertTempToC(const double T_F_or_C, const HPWH::UNITS units, const bool absolute) +{ + return (units == HPWH::UNITS_C) ? T_F_or_C : (absolute ? F_TO_C(T_F_or_C) : dF_TO_dC(T_F_or_C)); } // resampling utility functions -double getResampledValue(const std::vector &values,double beginFraction,double endFraction); -bool resample(std::vector &values,const std::vector &sampleValues); -inline bool resampleIntensive(std::vector &values,const std::vector &sampleValues) +double +getResampledValue(const std::vector& values, double beginFraction, double endFraction); +bool resample(std::vector& values, const std::vector& sampleValues); +inline bool resampleIntensive(std::vector& values, const std::vector& sampleValues) { - return resample(values,sampleValues); + return resample(values, sampleValues); } -bool resampleExtensive(std::vector &values,const std::vector &sampleValues); +bool resampleExtensive(std::vector& values, const std::vector& sampleValues); /// helper functions -double expitFunc(double x,double offset); -void normalize(std::vector &distribution); -int findLowestNode(const std::vector &nodeDist,const int numTankNodes); -double findShrinkageT_C(const std::vector &nodeDist); -void calcThermalDist( - std::vector &thermalDist, - const double shrinkageT_C, - const int lowestNode, - const std::vector &nodeTemp_C, - const double setpointT_C); - -inline bool getBool(const std::string sValue){ - if((sValue == "F") || (sValue == "false") || (sValue == "False") || (stoi(sValue) == 0)) - return false; - return true; +double expitFunc(double x, double offset); +void normalize(std::vector& distribution); +int findLowestNode(const std::vector& nodeDist, const int numTankNodes); +double findShrinkageT_C(const std::vector& nodeDist); +void calcThermalDist(std::vector& thermalDist, + const double shrinkageT_C, + const int lowestNode, + const std::vector& nodeTemp_C, + const double setpointT_C); + +inline bool getBool(const std::string sValue) +{ + if ((sValue == "F") || (sValue == "false") || (sValue == "False") || (stoi(sValue) == 0)) + return false; + return true; } #endif diff --git a/src/HPWHHeatSources.cc b/src/HPWHHeatSources.cc index 37ebcaf4..2f204646 100644 --- a/src/HPWHHeatSources.cc +++ b/src/HPWHHeatSources.cc @@ -5,916 +5,1167 @@ #include #include - // vendor +// vendor #include #include "HPWH.hh" -//public HPWH::HeatSource functions -HPWH::HeatSource::HeatSource(HPWH *parentInput) - :hpwh(parentInput),isOn(false),lockedOut(false),doDefrost(false),backupHeatSource(NULL),companionHeatSource(NULL), - followedByHeatSource(NULL),minT(-273.15),maxT(100),hysteresis_dC(0),airflowFreedom(1.0),maxSetpoint_C(100.), - typeOfHeatSource(TYPE_none),extrapolationMethod(EXTRAP_LINEAR),maxOut_at_LowT{100,-273.15},standbyLogic(NULL), - isMultipass(true),mpFlowRate_LPS(0.),externalInletHeight(-1),externalOutletHeight(-1),useBtwxtGrid(false), - secondaryHeatExchanger{0.,0.,0.} -{} +// public HPWH::HeatSource functions +HPWH::HeatSource::HeatSource(HPWH* parentInput) + : hpwh(parentInput) + , isOn(false) + , lockedOut(false) + , doDefrost(false) + , backupHeatSource(NULL) + , companionHeatSource(NULL) + , followedByHeatSource(NULL) + , minT(-273.15) + , maxT(100) + , hysteresis_dC(0) + , airflowFreedom(1.0) + , maxSetpoint_C(100.) + , typeOfHeatSource(TYPE_none) + , extrapolationMethod(EXTRAP_LINEAR) + , maxOut_at_LowT {100, -273.15} + , standbyLogic(NULL) + , isMultipass(true) + , mpFlowRate_LPS(0.) + , externalInletHeight(-1) + , externalOutletHeight(-1) + , useBtwxtGrid(false) + , secondaryHeatExchanger {0., 0., 0.} +{ +} + +HPWH::HeatSource::HeatSource(const HeatSource& hSource) { *this = hSource; } + +HPWH::HeatSource& HPWH::HeatSource::operator=(const HeatSource& hSource) +{ + if (this == &hSource) + { + return *this; + } + + hpwh = hSource.hpwh; + isOn = hSource.isOn; + lockedOut = hSource.lockedOut; + doDefrost = hSource.doDefrost; + + runtime_min = hSource.runtime_min; + energyInput_kWh = hSource.energyInput_kWh; + energyOutput_kWh = hSource.energyOutput_kWh; + + isVIP = hSource.isVIP; + + if (hSource.backupHeatSource != NULL || hSource.companionHeatSource != NULL || + hSource.followedByHeatSource != NULL) + { + hpwh->simHasFailed = true; + if (hpwh->hpwhVerbosity >= VRB_reluctant) + { + hpwh->msg( + "HeatSources cannot be copied if they contain pointers to other HeatSources\n"); + } + } + else + { + companionHeatSource = NULL; + backupHeatSource = NULL; + followedByHeatSource = NULL; + } + + condensity = hSource.condensity; + + Tshrinkage_C = hSource.Tshrinkage_C; + + perfMap = hSource.perfMap; + + perfGrid = hSource.perfGrid; + perfGridValues = hSource.perfGridValues; + perfRGI = hSource.perfRGI; + useBtwxtGrid = hSource.useBtwxtGrid; + + defrostMap = hSource.defrostMap; + resDefrost = hSource.resDefrost; + + // i think vector assignment works correctly here + turnOnLogicSet = hSource.turnOnLogicSet; + shutOffLogicSet = hSource.shutOffLogicSet; + standbyLogic = hSource.standbyLogic; + + minT = hSource.minT; + maxT = hSource.maxT; + maxOut_at_LowT = hSource.maxOut_at_LowT; + hysteresis_dC = hSource.hysteresis_dC; + maxSetpoint_C = hSource.maxSetpoint_C; + + depressesTemperature = hSource.depressesTemperature; + airflowFreedom = hSource.airflowFreedom; + + configuration = hSource.configuration; + typeOfHeatSource = hSource.typeOfHeatSource; + isMultipass = hSource.isMultipass; + mpFlowRate_LPS = hSource.mpFlowRate_LPS; + + externalInletHeight = hSource.externalInletHeight; + externalOutletHeight = hSource.externalOutletHeight; + + lowestNode = hSource.lowestNode; + extrapolationMethod = hSource.extrapolationMethod; + secondaryHeatExchanger = hSource.secondaryHeatExchanger; + + return *this; +} + +void HPWH::HeatSource::setCondensity(const std::vector& condensity_in) +{ + condensity = condensity_in; +} + +int HPWH::HeatSource::getCondensitySize() const { return static_cast(condensity.size()); } + +int HPWH::HeatSource::findParent() const +{ + for (int i = 0; i < hpwh->getNumHeatSources(); ++i) + { + if (this == hpwh->heatSources[i].backupHeatSource) + { + return i; + } + } + return -1; +} -HPWH::HeatSource::HeatSource(const HeatSource &hSource) { - *this = hSource; +bool HPWH::HeatSource::isEngaged() const { return isOn; } + +bool HPWH::HeatSource::isLockedOut() const { return lockedOut; } + +void HPWH::HeatSource::lockOutHeatSource() { lockedOut = true; } + +void HPWH::HeatSource::unlockHeatSource() { lockedOut = false; } + +bool HPWH::HeatSource::shouldLockOut(double heatSourceAmbientT_C) const +{ + + // if it's already locked out, keep it locked out + if (isLockedOut() == true) + { + return true; + } + else + { + // when the "external" temperature is too cold - typically used for compressor low temp. + // cutoffs when running, use hysteresis + bool lock = false; + if (isEngaged() == true && heatSourceAmbientT_C < minT - hysteresis_dC) + { + lock = true; + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + { + hpwh->msg("\tlock-out: running below minT\tambient: %.2f\tminT: %.2f", + heatSourceAmbientT_C, + minT); + } + } + // when not running, don't use hysteresis + else if (isEngaged() == false && heatSourceAmbientT_C < minT) + { + lock = true; + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + { + hpwh->msg("\tlock-out: already below minT\tambient: %.2f\tminT: %.2f", + heatSourceAmbientT_C, + minT); + } + } + + // when the "external" temperature is too warm - typically used for resistance lockout + // when running, use hysteresis + if (isEngaged() == true && heatSourceAmbientT_C > maxT + hysteresis_dC) + { + lock = true; + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + { + hpwh->msg("\tlock-out: running above maxT\tambient: %.2f\tmaxT: %.2f", + heatSourceAmbientT_C, + maxT); + } + } + // when not running, don't use hysteresis + else if (isEngaged() == false && heatSourceAmbientT_C > maxT) + { + lock = true; + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + { + hpwh->msg("\tlock-out: already above maxT\tambient: %.2f\tmaxT: %.2f", + heatSourceAmbientT_C, + maxT); + } + } + + if (maxedOut()) + { + lock = true; + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + { + hpwh->msg("\tlock-out: condenser water temperature above max: %.2f", maxSetpoint_C); + } + } + // if (lock == true && backupHeatSource == NULL) { + // if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) { + // hpwh->msg("\nWARNING: lock-out triggered, but no backupHeatSource defined. + //Simulation will continue without lock-out"); + // } + // lock = false; + // } + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("\n"); + } + return lock; + } } -HPWH::HeatSource& HPWH::HeatSource::operator=(const HeatSource &hSource) { - if(this == &hSource) { - return *this; - } +bool HPWH::HeatSource::shouldUnlock(double heatSourceAmbientT_C) const +{ + + // if it's already unlocked, keep it unlocked + if (isLockedOut() == false) + { + return true; + } + // if it the heat source is capped and can't produce hotter water + else if (maxedOut()) + { + return false; + } + else + { + // when the "external" temperature is no longer too cold or too warm + // when running, use hysteresis + bool unlock = false; + if (isEngaged() == true && heatSourceAmbientT_C > minT + hysteresis_dC && + heatSourceAmbientT_C < maxT - hysteresis_dC) + { + unlock = true; + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic && + heatSourceAmbientT_C > minT + hysteresis_dC) + { + hpwh->msg("\tunlock: running above minT\tambient: %.2f\tminT: %.2f", + heatSourceAmbientT_C, + minT); + } + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic && + heatSourceAmbientT_C < maxT - hysteresis_dC) + { + hpwh->msg("\tunlock: running below maxT\tambient: %.2f\tmaxT: %.2f", + heatSourceAmbientT_C, + maxT); + } + } + // when not running, don't use hysteresis + else if (isEngaged() == false && heatSourceAmbientT_C > minT && heatSourceAmbientT_C < maxT) + { + unlock = true; + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C > minT) + { + hpwh->msg("\tunlock: already above minT\tambient: %.2f\tminT: %.2f", + heatSourceAmbientT_C, + minT); + } + if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C < maxT) + { + hpwh->msg("\tunlock: already below maxT\tambient: %.2f\tmaxT: %.2f", + heatSourceAmbientT_C, + maxT); + } + } + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("\n"); + } + return unlock; + } +} - hpwh = hSource.hpwh; - isOn = hSource.isOn; - lockedOut = hSource.lockedOut; - doDefrost = hSource.doDefrost; +bool HPWH::HeatSource::toLockOrUnlock(double heatSourceAmbientT_C) +{ - runtime_min = hSource.runtime_min; - energyInput_kWh = hSource.energyInput_kWh; - energyOutput_kWh = hSource.energyOutput_kWh; + if (shouldLockOut(heatSourceAmbientT_C)) + { + lockOutHeatSource(); + } + if (shouldUnlock(heatSourceAmbientT_C)) + { + unlockHeatSource(); + } - isVIP = hSource.isVIP; + return isLockedOut(); +} - if(hSource.backupHeatSource != NULL || hSource.companionHeatSource != NULL || hSource.followedByHeatSource != NULL) { - hpwh->simHasFailed = true; - if(hpwh->hpwhVerbosity >= VRB_reluctant) { - hpwh->msg("HeatSources cannot be copied if they contain pointers to other HeatSources\n"); - } - } else { - companionHeatSource = NULL; - backupHeatSource = NULL; - followedByHeatSource = NULL; - } +void HPWH::HeatSource::engageHeatSource(DRMODES DR_signal) +{ + isOn = true; + hpwh->isHeating = true; + if (companionHeatSource != NULL && companionHeatSource->shutsOff() != true && + companionHeatSource->isEngaged() == false && + hpwh->shouldDRLockOut(companionHeatSource->typeOfHeatSource, DR_signal) == false) + { + companionHeatSource->engageHeatSource(DR_signal); + } +} - condensity = hSource.condensity; +void HPWH::HeatSource::disengageHeatSource() { isOn = false; } + +bool HPWH::HeatSource::shouldHeat() const +{ + // return true if the heat source logic tells it to come on, false if it doesn't, + // or if an unsepcified selector was used + bool shouldEngage = false; + + for (int i = 0; i < (int)turnOnLogicSet.size(); i++) + { + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("\tshouldHeat logic: %s ", turnOnLogicSet[i]->description.c_str()); + } + + double average = turnOnLogicSet[i]->getTankValue(); + double comparison = turnOnLogicSet[i]->getComparisonValue(); + + if (turnOnLogicSet[i]->compare(average, comparison)) + { + if (turnOnLogicSet[i]->description == "standby" && standbyLogic != NULL) + { + double comparisonStandby = standbyLogic->getComparisonValue(); + double avgStandby = standbyLogic->getTankValue(); + + if (turnOnLogicSet[i]->compare(avgStandby, comparisonStandby)) + { + shouldEngage = true; + } + } + else + { + shouldEngage = true; + } + } + + // quit searching the logics if one of them turns it on + if (shouldEngage) + { + // debugging message handling + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("engages!\n"); + } + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("average: %.2lf \t setpoint: %.2lf \t decisionPoint: %.2lf \t " + "comparison: %2.1f\n", + average, + hpwh->setpoint_C, + turnOnLogicSet[i]->getDecisionPoint(), + comparison); + } + break; + } + + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("returns: %d \t", shouldEngage); + } + } // end loop over set of logic conditions + + // if everything else wants it to come on, but if it would shut off anyways don't turn it on + if (shouldEngage == true && shutsOff() == true) + { + shouldEngage = false; + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("but is denied by shutsOff"); + } + } + + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("\n"); + } + return shouldEngage; +} - Tshrinkage_C = hSource.Tshrinkage_C; +bool HPWH::HeatSource::shutsOff() const +{ + bool shutOff = false; + + if (hpwh->tankTemps_C[0] >= hpwh->setpoint_C) + { + shutOff = true; + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("shutsOff bottom node hot: %.2d C \n returns true", hpwh->tankTemps_C[0]); + } + return shutOff; + } + + for (int i = 0; i < (int)shutOffLogicSet.size(); i++) + { + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("\tshutsOff logic: %s ", shutOffLogicSet[i]->description.c_str()); + } + + double average = shutOffLogicSet[i]->getTankValue(); + double comparison = shutOffLogicSet[i]->getComparisonValue(); + + if (shutOffLogicSet[i]->compare(average, comparison)) + { + shutOff = true; + + // debugging message handling + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("shuts down %s\n", shutOffLogicSet[i]->description.c_str()); + } + } + } + + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("returns: %d \n", shutOff); + } + return shutOff; +} - perfMap = hSource.perfMap; +bool HPWH::HeatSource::maxedOut() const +{ + bool maxed = false; + + // If the heat source can't produce water at the setpoint and the control logics are saying to + // shut off + if (hpwh->setpoint_C > maxSetpoint_C) + { + if (hpwh->tankTemps_C[0] >= maxSetpoint_C || shutsOff()) + { + maxed = true; + } + } + return maxed; +} - perfGrid = hSource.perfGrid; - perfGridValues = hSource.perfGridValues; - perfRGI = hSource.perfRGI; - useBtwxtGrid = hSource.useBtwxtGrid; +double HPWH::HeatSource::fractToMeetComparisonExternal() const +{ + double fracTemp; + double frac = 1.; - defrostMap = hSource.defrostMap; - resDefrost = hSource.resDefrost; + for (int i = 0; i < (int)shutOffLogicSet.size(); i++) + { + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("\tshutsOff logic: %s ", shutOffLogicSet[i]->description.c_str()); + } - //i think vector assignment works correctly here - turnOnLogicSet = hSource.turnOnLogicSet; - shutOffLogicSet = hSource.shutOffLogicSet; - standbyLogic = hSource.standbyLogic; - - minT = hSource.minT; - maxT = hSource.maxT; - maxOut_at_LowT = hSource.maxOut_at_LowT; - hysteresis_dC = hSource.hysteresis_dC; - maxSetpoint_C = hSource.maxSetpoint_C; - - depressesTemperature = hSource.depressesTemperature; - airflowFreedom = hSource.airflowFreedom; - - configuration = hSource.configuration; - typeOfHeatSource = hSource.typeOfHeatSource; - isMultipass = hSource.isMultipass; - mpFlowRate_LPS = hSource.mpFlowRate_LPS; - - externalInletHeight = hSource.externalInletHeight; - externalOutletHeight = hSource.externalOutletHeight; - - lowestNode = hSource.lowestNode; - extrapolationMethod = hSource.extrapolationMethod; - secondaryHeatExchanger = hSource.secondaryHeatExchanger; - - return *this; -} - -void HPWH::HeatSource::setCondensity(const std::vector &condensity_in) { - condensity = condensity_in; -} - -int HPWH::HeatSource::getCondensitySize() const { - return static_cast(condensity.size()); -} - -int HPWH::HeatSource::findParent() const { - for(int i = 0; i < hpwh->getNumHeatSources(); ++i) { - if(this == hpwh->heatSources[i].backupHeatSource) { - return i; - } - } - return -1; -} - -bool HPWH::HeatSource::isEngaged() const { - return isOn; -} - -bool HPWH::HeatSource::isLockedOut() const { - return lockedOut; -} - -void HPWH::HeatSource::lockOutHeatSource() { - lockedOut = true; -} - -void HPWH::HeatSource::unlockHeatSource() { - lockedOut = false; -} - -bool HPWH::HeatSource::shouldLockOut(double heatSourceAmbientT_C) const { - - // if it's already locked out, keep it locked out - if(isLockedOut() == true) { - return true; - } else { - //when the "external" temperature is too cold - typically used for compressor low temp. cutoffs - //when running, use hysteresis - bool lock = false; - if(isEngaged() == true && heatSourceAmbientT_C < minT - hysteresis_dC) { - lock = true; - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic) { - hpwh->msg("\tlock-out: running below minT\tambient: %.2f\tminT: %.2f",heatSourceAmbientT_C,minT); - } - } - //when not running, don't use hysteresis - else if(isEngaged() == false && heatSourceAmbientT_C < minT) { - lock = true; - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic) { - hpwh->msg("\tlock-out: already below minT\tambient: %.2f\tminT: %.2f",heatSourceAmbientT_C,minT); - } - } - - //when the "external" temperature is too warm - typically used for resistance lockout - //when running, use hysteresis - if(isEngaged() == true && heatSourceAmbientT_C > maxT + hysteresis_dC) { - lock = true; - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic) { - hpwh->msg("\tlock-out: running above maxT\tambient: %.2f\tmaxT: %.2f",heatSourceAmbientT_C,maxT); - } - } - //when not running, don't use hysteresis - else if(isEngaged() == false && heatSourceAmbientT_C > maxT) { - lock = true; - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic) { - hpwh->msg("\tlock-out: already above maxT\tambient: %.2f\tmaxT: %.2f",heatSourceAmbientT_C,maxT); - } - } - - if(maxedOut()) { - lock = true; - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic) { - hpwh->msg("\tlock-out: condenser water temperature above max: %.2f",maxSetpoint_C); - } - } - // if (lock == true && backupHeatSource == NULL) { - // if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) { - // hpwh->msg("\nWARNING: lock-out triggered, but no backupHeatSource defined. Simulation will continue without lock-out"); - // } - // lock = false; - // } - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("\n"); - } - return lock; - } -} - -bool HPWH::HeatSource::shouldUnlock(double heatSourceAmbientT_C) const { - - // if it's already unlocked, keep it unlocked - if(isLockedOut() == false) { - return true; - } - // if it the heat source is capped and can't produce hotter water - else if(maxedOut()) { - return false; - } else { - //when the "external" temperature is no longer too cold or too warm - //when running, use hysteresis - bool unlock = false; - if(isEngaged() == true && heatSourceAmbientT_C > minT + hysteresis_dC && heatSourceAmbientT_C < maxT - hysteresis_dC) { - unlock = true; - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C > minT + hysteresis_dC) { - hpwh->msg("\tunlock: running above minT\tambient: %.2f\tminT: %.2f",heatSourceAmbientT_C,minT); - } - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C < maxT - hysteresis_dC) { - hpwh->msg("\tunlock: running below maxT\tambient: %.2f\tmaxT: %.2f",heatSourceAmbientT_C,maxT); - } - } - //when not running, don't use hysteresis - else if(isEngaged() == false && heatSourceAmbientT_C > minT && heatSourceAmbientT_C < maxT) { - unlock = true; - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C > minT) { - hpwh->msg("\tunlock: already above minT\tambient: %.2f\tminT: %.2f",heatSourceAmbientT_C,minT); - } - if(hpwh->hpwhVerbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C < maxT) { - hpwh->msg("\tunlock: already below maxT\tambient: %.2f\tmaxT: %.2f",heatSourceAmbientT_C,maxT); - } - } - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("\n"); - } - return unlock; - } -} - -bool HPWH::HeatSource::toLockOrUnlock(double heatSourceAmbientT_C) { - - if(shouldLockOut(heatSourceAmbientT_C)) { - lockOutHeatSource(); - } - if(shouldUnlock(heatSourceAmbientT_C)) { - unlockHeatSource(); - } - - return isLockedOut(); -} - -void HPWH::HeatSource::engageHeatSource(DRMODES DR_signal) { - isOn = true; - hpwh->isHeating = true; - if(companionHeatSource != NULL && - companionHeatSource->shutsOff() != true && - companionHeatSource->isEngaged() == false && - hpwh->shouldDRLockOut(companionHeatSource->typeOfHeatSource,DR_signal) == false) - { - companionHeatSource->engageHeatSource(DR_signal); - } -} - -void HPWH::HeatSource::disengageHeatSource() { - isOn = false; -} - -bool HPWH::HeatSource::shouldHeat() const { - //return true if the heat source logic tells it to come on, false if it doesn't, - //or if an unsepcified selector was used - bool shouldEngage = false; - - for(int i = 0; i < (int)turnOnLogicSet.size(); i++) { - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("\tshouldHeat logic: %s ",turnOnLogicSet[i]->description.c_str()); - } - - double average = turnOnLogicSet[i]->getTankValue(); - double comparison = turnOnLogicSet[i]->getComparisonValue(); - - if(turnOnLogicSet[i]->compare(average,comparison)) { - if(turnOnLogicSet[i]->description == "standby" && standbyLogic != NULL) { - double comparisonStandby = standbyLogic->getComparisonValue(); - double avgStandby = standbyLogic->getTankValue(); - - if(turnOnLogicSet[i]->compare(avgStandby,comparisonStandby)) { - shouldEngage = true; - } - } else{ - shouldEngage = true; - } - } - - //quit searching the logics if one of them turns it on - if(shouldEngage) { - //debugging message handling - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("engages!\n"); - } - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("average: %.2lf \t setpoint: %.2lf \t decisionPoint: %.2lf \t comparison: %2.1f\n",average, - hpwh->setpoint_C,turnOnLogicSet[i]->getDecisionPoint(),comparison); - } - break; - } - - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("returns: %d \t",shouldEngage); - } - } //end loop over set of logic conditions - - //if everything else wants it to come on, but if it would shut off anyways don't turn it on - if(shouldEngage == true && shutsOff() == true) { - shouldEngage = false; - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("but is denied by shutsOff"); - } - } - - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("\n"); - } - return shouldEngage; -} - -bool HPWH::HeatSource::shutsOff() const { - bool shutOff = false; - - if(hpwh->tankTemps_C[0] >= hpwh->setpoint_C) { - shutOff = true; - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("shutsOff bottom node hot: %.2d C \n returns true",hpwh->tankTemps_C[0]); - } - return shutOff; - } - - for(int i = 0; i < (int)shutOffLogicSet.size(); i++) { - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("\tshutsOff logic: %s ",shutOffLogicSet[i]->description.c_str()); - } - - double average = shutOffLogicSet[i]->getTankValue(); - double comparison = shutOffLogicSet[i]->getComparisonValue(); - - if(shutOffLogicSet[i]->compare(average,comparison)) { - shutOff = true; - - //debugging message handling - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("shuts down %s\n",shutOffLogicSet[i]->description.c_str()); - } - } - } - - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("returns: %d \n",shutOff); - } - return shutOff; -} - -bool HPWH::HeatSource::maxedOut() const { - bool maxed = false; - - // If the heat source can't produce water at the setpoint and the control logics are saying to shut off - if(hpwh->setpoint_C > maxSetpoint_C){ - if(hpwh->tankTemps_C[0] >= maxSetpoint_C || shutsOff()) { - maxed = true; - } - } - return maxed; -} - -double HPWH::HeatSource::fractToMeetComparisonExternal() const { - double fracTemp; - double frac = 1.; - - for(int i = 0; i < (int)shutOffLogicSet.size(); i++) { - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("\tshutsOff logic: %s ",shutOffLogicSet[i]->description.c_str()); - } - - fracTemp = shutOffLogicSet[i]->getFractToMeetComparisonExternal(); - - frac = fracTemp < frac ? fracTemp : frac; - } - - return frac; -} - -void HPWH::HeatSource::addHeat(double externalT_C,double minutesToRun) { - double input_BTUperHr = 0.,cap_BTUperHr = 0.,cop = 0.; - - switch(configuration) { - case CONFIG_SUBMERGED: - case CONFIG_WRAPPED: - { - std::vector heatDistribution; - - // calcHeatDist takes care of the swooping for wrapped configurations - calcHeatDist(heatDistribution); - - // calculate capacity btu/hr, input btu/hr, and cop - if(isACompressor()) { - hpwh->condenserInlet_C = getTankTemp(); - getCapacity(externalT_C,getTankTemp(),input_BTUperHr,cap_BTUperHr,cop); - } - else { - getCapacity(externalT_C,getTankTemp(),input_BTUperHr,cap_BTUperHr,cop); - - } - // some outputs for debugging - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("capacity_kWh %.2lf \t\t cap_BTUperHr %.2lf \n",BTU_TO_KWH(cap_BTUperHr)*(minutesToRun) / min_per_hr,cap_BTUperHr); - } - - //the loop over nodes here is intentional - essentially each node that has - //some amount of heatDistribution acts as a separate resistive element - //maybe start from the top and go down? test this with graphs - - // set the leftover capacity to 0 - double leftoverCap_kJ = 0.; - for(int i = hpwh->getNumNodes() - 1; i >= 0; i--) { - //for(int i = 0; i < hpwh->numNodes; i++){ - double nodeCap_kJ = BTU_TO_KJ(cap_BTUperHr * minutesToRun / min_per_hr * heatDistribution[i]); - if(nodeCap_kJ != 0.) { - //add leftoverCap to the next run, and keep passing it on - leftoverCap_kJ = hpwh->addHeatAboveNode(nodeCap_kJ + leftoverCap_kJ,i,maxSetpoint_C); - } - } - - if(isACompressor()) { // outlet temperature is the condenser temperature after heat has been added - hpwh->condenserOutlet_C = getTankTemp(); - } - - //after you've done everything, any leftover capacity is time that didn't run - double cap_kJ = BTU_TO_KJ(cap_BTUperHr * minutesToRun / min_per_hr); - runtime_min = (1. - (leftoverCap_kJ / cap_kJ)) * minutesToRun; -#if 1 // error check, 1-22-2017; updated 12-6-2023 - if(runtime_min < -TOL_MINVALUE) - if(hpwh->hpwhVerbosity >= VRB_reluctant) - hpwh->msg("Internal error: Negative runtime = %0.3f min\n",runtime_min); -#endif - } - break; + fracTemp = shutOffLogicSet[i]->getFractToMeetComparisonExternal(); - case CONFIG_EXTERNAL: - //Else the heat source is external. SANCO2 system is only current example - //capacity is calculated internal to this functio - // n, and cap/input_BTUperHr, cop are outputs - runtime_min = addHeatExternal(externalT_C,minutesToRun,cap_BTUperHr,input_BTUperHr,cop); - break; - } + frac = fracTemp < frac ? fracTemp : frac; + } - // Write the input & output energy - energyInput_kWh += BTU_TO_KWH(input_BTUperHr * runtime_min / min_per_hr); - energyOutput_kWh += BTU_TO_KWH(cap_BTUperHr * runtime_min / min_per_hr); + return frac; +} + +void HPWH::HeatSource::addHeat(double externalT_C, double minutesToRun) +{ + double input_BTUperHr = 0., cap_BTUperHr = 0., cop = 0.; + + switch (configuration) + { + case CONFIG_SUBMERGED: + case CONFIG_WRAPPED: + { + std::vector heatDistribution; + + // calcHeatDist takes care of the swooping for wrapped configurations + calcHeatDist(heatDistribution); + + // calculate capacity btu/hr, input btu/hr, and cop + if (isACompressor()) + { + hpwh->condenserInlet_C = getTankTemp(); + getCapacity(externalT_C, getTankTemp(), input_BTUperHr, cap_BTUperHr, cop); + } + else + { + getCapacity(externalT_C, getTankTemp(), input_BTUperHr, cap_BTUperHr, cop); + } + // some outputs for debugging + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("capacity_kWh %.2lf \t\t cap_BTUperHr %.2lf \n", + BTU_TO_KWH(cap_BTUperHr) * (minutesToRun) / min_per_hr, + cap_BTUperHr); + } + + // the loop over nodes here is intentional - essentially each node that has + // some amount of heatDistribution acts as a separate resistive element + // maybe start from the top and go down? test this with graphs + + // set the leftover capacity to 0 + double leftoverCap_kJ = 0.; + for (int i = hpwh->getNumNodes() - 1; i >= 0; i--) + { + // for(int i = 0; i < hpwh->numNodes; i++){ + double nodeCap_kJ = + BTU_TO_KJ(cap_BTUperHr * minutesToRun / min_per_hr * heatDistribution[i]); + if (nodeCap_kJ != 0.) + { + // add leftoverCap to the next run, and keep passing it on + leftoverCap_kJ = + hpwh->addHeatAboveNode(nodeCap_kJ + leftoverCap_kJ, i, maxSetpoint_C); + } + } + + if (isACompressor()) + { // outlet temperature is the condenser temperature after heat has been added + hpwh->condenserOutlet_C = getTankTemp(); + } + + // after you've done everything, any leftover capacity is time that didn't run + double cap_kJ = BTU_TO_KJ(cap_BTUperHr * minutesToRun / min_per_hr); + runtime_min = (1. - (leftoverCap_kJ / cap_kJ)) * minutesToRun; +#if 1 // error check, 1-22-2017; updated 12-6-2023 + if (runtime_min < -TOL_MINVALUE) + if (hpwh->hpwhVerbosity >= VRB_reluctant) + hpwh->msg("Internal error: Negative runtime = %0.3f min\n", runtime_min); +#endif + } + break; + + case CONFIG_EXTERNAL: + // Else the heat source is external. SANCO2 system is only current example + // capacity is calculated internal to this functio + // n, and cap/input_BTUperHr, cop are outputs + runtime_min = addHeatExternal(externalT_C, minutesToRun, cap_BTUperHr, input_BTUperHr, cop); + break; + } + + // Write the input & output energy + energyInput_kWh += BTU_TO_KWH(input_BTUperHr * runtime_min / min_per_hr); + energyOutput_kWh += BTU_TO_KWH(cap_BTUperHr * runtime_min / min_per_hr); } // private HPWH::HeatSource functions -void HPWH::HeatSource::sortPerformanceMap() { - std::sort(perfMap.begin(),perfMap.end(), - [](const HPWH::HeatSource::perfPoint & a,const HPWH::HeatSource::perfPoint & b) -> bool { - return a.T_F < b.T_F; - }); -} - -double HPWH::HeatSource::getTankTemp() const{ - - std::vector resampledTankTemps(getCondensitySize()); - resample(resampledTankTemps, hpwh->tankTemps_C); - - double tankTemp_C = 0.; - - std::size_t j = 0; - for(auto &resampledNodeTemp: resampledTankTemps) { - tankTemp_C += condensity[j] * resampledNodeTemp; - // Note that condensity is normalized. - ++j; - } - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("tank temp %.2lf \n",tankTemp_C); - } - return tankTemp_C; -} - -void HPWH::HeatSource::getCapacity(double externalT_C,double condenserTemp_C,double setpointTemp_C,double &input_BTUperHr,double &cap_BTUperHr,double &cop) { - double externalT_F,condenserTemp_F; - - // Add an offset to the condenser temperature (or incoming coldwater temperature) to approximate a secondary heat exchange in line with the compressor - condenserTemp_F = C_TO_F(condenserTemp_C + secondaryHeatExchanger.coldSideTemperatureOffest_dC); - externalT_F = C_TO_F(externalT_C); - - // Get bounding performance map points for interpolation/extrapolation - bool extrapolate = false; - size_t i_prev = 0; - size_t i_next = 1; - double Tout_F = C_TO_F(setpointTemp_C + secondaryHeatExchanger.hotSideTemperatureOffset_dC); - - if(useBtwxtGrid) { - std::vector target{externalT_F,Tout_F,condenserTemp_F}; - btwxtInterp(input_BTUperHr,cop,target); - } else { - if(perfMap.empty()) { // Avoid using empty perfMap - input_BTUperHr = 0.; - cop = 0.; - } else if(perfMap.size() > 1) { - double COP_T1,COP_T2; //cop at ambient temperatures T1 and T2 - double inputPower_T1_Watts,inputPower_T2_Watts; //input power at ambient temperatures T1 and T2 - - for(size_t i = 0; i < perfMap.size(); ++i) { - if(externalT_F < perfMap[i].T_F) { - if(i == 0) { - extrapolate = true; - i_prev = 0; - i_next = 1; - } else { - i_prev = i - 1; - i_next = i; - } - break; - } else { - if(i == perfMap.size() - 1) { - extrapolate = true; - i_prev = i - 1; - i_next = i; - break; - } - } - } - - // Calculate COP and Input Power at each of the two reference temepratures - COP_T1 = perfMap[i_prev].COP_coeffs[0]; - COP_T1 += perfMap[i_prev].COP_coeffs[1] * condenserTemp_F; - COP_T1 += perfMap[i_prev].COP_coeffs[2] * condenserTemp_F * condenserTemp_F; - - COP_T2 = perfMap[i_next].COP_coeffs[0]; - COP_T2 += perfMap[i_next].COP_coeffs[1] * condenserTemp_F; - COP_T2 += perfMap[i_next].COP_coeffs[2] * condenserTemp_F * condenserTemp_F; - - inputPower_T1_Watts = perfMap[i_prev].inputPower_coeffs[0]; - inputPower_T1_Watts += perfMap[i_prev].inputPower_coeffs[1] * condenserTemp_F; - inputPower_T1_Watts += perfMap[i_prev].inputPower_coeffs[2] * condenserTemp_F * condenserTemp_F; - - inputPower_T2_Watts = perfMap[i_next].inputPower_coeffs[0]; - inputPower_T2_Watts += perfMap[i_next].inputPower_coeffs[1] * condenserTemp_F; - inputPower_T2_Watts += perfMap[i_next].inputPower_coeffs[2] * condenserTemp_F * condenserTemp_F; - - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("inputPower_T1_constant_W linear_WperF quadratic_WperF2 \t%.2lf %.2lf %.2lf \n",perfMap[0].inputPower_coeffs[0],perfMap[0].inputPower_coeffs[1],perfMap[0].inputPower_coeffs[2]); - hpwh->msg("inputPower_T2_constant_W linear_WperF quadratic_WperF2 \t%.2lf %.2lf %.2lf \n",perfMap[1].inputPower_coeffs[0],perfMap[1].inputPower_coeffs[1],perfMap[1].inputPower_coeffs[2]); - hpwh->msg("inputPower_T1_Watts: %.2lf \tinputPower_T2_Watts: %.2lf \n",inputPower_T1_Watts,inputPower_T2_Watts); - - if(extrapolate) { - hpwh->msg("Warning performance extrapolation\n\tExternal Temperature: %.2lf\tNearest temperatures: %.2lf, %.2lf \n\n",externalT_F,perfMap[i_prev].T_F,perfMap[i_next].T_F); - } - } - - // Interpolate to get COP and input power at the current ambient temperature - linearInterp(cop,externalT_F,perfMap[i_prev].T_F,perfMap[i_next].T_F,COP_T1,COP_T2); - linearInterp(input_BTUperHr,externalT_F,perfMap[i_prev].T_F,perfMap[i_next].T_F,inputPower_T1_Watts,inputPower_T2_Watts); - input_BTUperHr = KWH_TO_BTU(input_BTUperHr / 1000.0);//1000 converts w to kw); - - } else { //perfMap.size() == 1 or we've got an issue. - if(externalT_F > perfMap[0].T_F) { - extrapolate = true; - if(extrapolationMethod == EXTRAP_NEAREST) { - externalT_F = perfMap[0].T_F; - } - } - - regressedMethod(input_BTUperHr,perfMap[0].inputPower_coeffs,externalT_F,Tout_F,condenserTemp_F); - input_BTUperHr = KWH_TO_BTU(input_BTUperHr); - - regressedMethod(cop,perfMap[0].COP_coeffs,externalT_F,Tout_F,condenserTemp_F); - } - } - - if(doDefrost) { - //adjust COP by the defrost factor - defrostDerate(cop,externalT_F); - } - - cap_BTUperHr = cop * input_BTUperHr; - - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("externalT_F: %.2lf, Tout_F: %.2lf, condenserTemp_F: %.2lf\n",externalT_F,Tout_F,condenserTemp_F); - hpwh->msg("input_BTUperHr: %.2lf , cop: %.2lf, cap_BTUperHr: %.2lf \n",input_BTUperHr,cop,cap_BTUperHr); - } - //here is where the scaling for flow restriction happens - //the input power doesn't change, we just scale the cop by a small percentage - //that is based on the flow rate. The equation is a fit to three points, - //measured experimentally - 12 percent reduction at 150 cfm, 10 percent at - //200, and 0 at 375. Flow is expressed as fraction of full flow. - if(airflowFreedom != 1) { - double airflow = 375 * airflowFreedom; - cop *= 0.00056*airflow + 0.79; - } - if(hpwh->hpwhVerbosity >= VRB_typical) { - hpwh->msg("cop: %.2lf \tinput_BTUperHr: %.2lf \tcap_BTUperHr: %.2lf \n",cop,input_BTUperHr,cap_BTUperHr); - if(cop < 0.) { - hpwh->msg(" Warning: COP is Negative! \n"); - } - if(cop < 1.) { - hpwh->msg(" Warning: COP is Less than 1! \n"); - } - } -} - -void HPWH::HeatSource::getCapacityMP(double externalT_C,double condenserTemp_C,double &input_BTUperHr,double &cap_BTUperHr,double &cop) { - double externalT_F,condenserTemp_F; - bool resDefrostHeatingOn = false; - // Convert Celsius to Fahrenheit for the curve fits - condenserTemp_F = C_TO_F(condenserTemp_C + secondaryHeatExchanger.coldSideTemperatureOffest_dC); - externalT_F = C_TO_F(externalT_C); - - // Check if we have resistance elements to turn on for defrost and add the constant lift. - if(resDefrost.inputPwr_kW > 0) { - if(externalT_F < resDefrost.onBelowT_F) { - externalT_F += resDefrost.constTempLift_dF; - resDefrostHeatingOn = true; - } - } - - if(useBtwxtGrid) { - std::vector target{externalT_F,condenserTemp_F}; - btwxtInterp(input_BTUperHr,cop,target); - } else { - // Get bounding performance map points for interpolation/extrapolation - bool extrapolate = false; - if(externalT_F > perfMap[0].T_F) { - extrapolate = true; - if(extrapolationMethod == EXTRAP_NEAREST) { - externalT_F = perfMap[0].T_F; - } - } - - //Const Tair Tin Tair2 Tin2 TairTin - regressedMethodMP(input_BTUperHr,perfMap[0].inputPower_coeffs,externalT_F,condenserTemp_F); - regressedMethodMP(cop,perfMap[0].COP_coeffs,externalT_F,condenserTemp_F); - - } - input_BTUperHr = KWH_TO_BTU(input_BTUperHr); - - if(doDefrost) { - //adjust COP by the defrost factor - defrostDerate(cop,externalT_F); - } - - cap_BTUperHr = cop * input_BTUperHr; - - //For accounting add the resistance defrost to the input energy - if(resDefrostHeatingOn){ - input_BTUperHr += KW_TO_BTUperH(resDefrost.inputPwr_kW); - } - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("externalT_F: %.2lf, condenserTemp_F: %.2lf\n",externalT_F,condenserTemp_F); - hpwh->msg("input_BTUperHr: %.2lf , cop: %.2lf, cap_BTUperHr: %.2lf \n",input_BTUperHr,cop,cap_BTUperHr); - } -} - -double HPWH::HeatSource::calcMPOutletTemperature(double heatingCapacity_KW) { - return hpwh->tankTemps_C[externalOutletHeight] + heatingCapacity_KW / (mpFlowRate_LPS * DENSITYWATER_kgperL * CPWATER_kJperkgC); -} - -void HPWH::HeatSource::setupDefrostMap(double derate35/*=0.8865*/) { - doDefrost = true; - defrostMap.reserve(3); - defrostMap.push_back({17.,1.}); - defrostMap.push_back({35.,derate35}); - defrostMap.push_back({47.,1.}); -} - -void HPWH::HeatSource::defrostDerate(double &to_derate,double airT_F) { - if(airT_F <= defrostMap[0].T_F || airT_F >= defrostMap[defrostMap.size() - 1].T_F) { - return; // Air temperature outside bounds of the defrost map. There is no extrapolation here. - } - double derate_factor = 1.; - size_t i_prev = 0; - for(size_t i = 1; i < defrostMap.size(); ++i) { - if(airT_F <= defrostMap[i].T_F) { - i_prev = i - 1; - break; - } - } - linearInterp(derate_factor,airT_F, - defrostMap[i_prev].T_F,defrostMap[i_prev + 1].T_F, - defrostMap[i_prev].derate_fraction,defrostMap[i_prev + 1].derate_fraction); - to_derate *= derate_factor; -} - -void HPWH::HeatSource::linearInterp(double &ynew,double xnew,double x0,double x1,double y0,double y1) { - ynew = y0 + (xnew - x0) * (y1 - y0) / (x1 - x0); -} - -void HPWH::HeatSource::regressedMethod(double &ynew,std::vector &coefficents,double x1,double x2,double x3) { - ynew = coefficents[0] + - coefficents[1] * x1 + - coefficents[2] * x2 + - coefficents[3] * x3 + - coefficents[4] * x1 * x1 + - coefficents[5] * x2 * x2 + - coefficents[6] * x3 * x3 + - coefficents[7] * x1 * x2 + - coefficents[8] * x1 * x3 + - coefficents[9] * x2 * x3 + - coefficents[10] * x1 * x2 * x3; -} - -void HPWH::HeatSource::regressedMethodMP(double &ynew,std::vector &coefficents,double x1,double x2) { - //Const Tair Tin Tair2 Tin2 TairTin - ynew = coefficents[0] + - coefficents[1] * x1 + - coefficents[2] * x2 + - coefficents[3] * x1 * x1 + - coefficents[4] * x2 * x2 + - coefficents[5] * x1 * x2; -} - -void HPWH::HeatSource::btwxtInterp(double& input_BTUperHr,double& cop,std::vector &target) { - - std::vector result = perfRGI->get_values_at_target(target); - - input_BTUperHr = result[0]; - cop = result[1]; -} - -void HPWH::HeatSource::calcHeatDist(std::vector &heatDistribution) { - - // Populate the vector of heat distribution - if(configuration == CONFIG_SUBMERGED) { - heatDistribution.resize(hpwh->getNumNodes()); - resampleExtensive(heatDistribution, condensity); - } - else if(configuration == CONFIG_WRAPPED) { // Wrapped around the tank, send through the logistic function - calcThermalDist(heatDistribution,Tshrinkage_C,lowestNode,hpwh->tankTemps_C,hpwh->setpoint_C); - } -} - -bool HPWH::HeatSource::isACompressor() const { - return this->typeOfHeatSource == TYPE_compressor; -} - -bool HPWH::HeatSource::isAResistance() const { - return this->typeOfHeatSource == TYPE_resistance; -} -bool HPWH::HeatSource::isExternalMultipass() const { - return isMultipass && configuration == HeatSource::CONFIG_EXTERNAL; -} - -double HPWH::HeatSource::addHeatExternal(double externalT_C,double minutesToRun,double &cap_BTUperHr,double &input_BTUperHr,double &cop) { - double heatingCapacity_kJ,heatingCapacityNeeded_kJ,deltaT_C,timeUsed_min,nodeHeat_kJperNode,nodeFrac,fractToShutOff; - double inputTemp_BTUperHr = 0,capTemp_BTUperHr = 0,copTemp = 0; - double volumePerNode_LperNode = hpwh->tankVolume_L / hpwh->getNumNodes(); - double timeRemaining_min = minutesToRun; - double maxTargetTemp_C = std::min(maxSetpoint_C,hpwh->setpoint_C); - double targetTemp_C = 0.; - input_BTUperHr = 0; - cap_BTUperHr = 0; - cop = 0; - - do { - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("bottom tank temp: %.2lf \n",hpwh->tankTemps_C[0]); - } - - if(this->isMultipass) { - // if multipass evenly mix the tank up - hpwh->mixTankNodes(0,hpwh->getNumNodes(),1.0); // 1.0 will give even mixing, so all temperatures mixed end at average temperature. - - //how much heat is added this timestep - getCapacityMP(externalT_C,hpwh->tankTemps_C[externalOutletHeight],inputTemp_BTUperHr,capTemp_BTUperHr,copTemp); - double heatingCapacity_KW = BTUperH_TO_KW(capTemp_BTUperHr); - - heatingCapacity_kJ = heatingCapacity_KW * (timeRemaining_min * sec_per_min); - - targetTemp_C = calcMPOutletTemperature(heatingCapacity_KW); - deltaT_C = targetTemp_C - hpwh->tankTemps_C[externalOutletHeight]; - } else { - //how much heat is available this timestep - getCapacity(externalT_C,hpwh->tankTemps_C[externalOutletHeight],inputTemp_BTUperHr,capTemp_BTUperHr,copTemp); - heatingCapacity_kJ = BTU_TO_KJ(capTemp_BTUperHr * (minutesToRun / min_per_hr)); - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("\theatingCapacity_kJ stepwise: %.2lf \n",heatingCapacity_kJ); - } - - //adjust capacity for how much time is left in this step - heatingCapacity_kJ *= (timeRemaining_min / minutesToRun); - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("\theatingCapacity_kJ remaining this node: %.2lf \n",heatingCapacity_kJ); - } - - //calculate what percentage of the bottom node can be heated to setpoint - //with amount of heat available this timestep - targetTemp_C = maxTargetTemp_C; - deltaT_C = targetTemp_C - hpwh->tankTemps_C[externalOutletHeight]; - - } - - nodeHeat_kJperNode = volumePerNode_LperNode * DENSITYWATER_kgperL * CPWATER_kJperkgC * deltaT_C; - - // Caclulate fraction of node to move - if(nodeHeat_kJperNode <= 0.) { // protect against dividing by zero - if bottom node is at (or above) setpoint, add no heat - nodeFrac = 0.; - } else { - nodeFrac = heatingCapacity_kJ / nodeHeat_kJperNode; - } - - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("nodeHeat_kJperNode: %.2lf nodeFrac: %.2lf \n\n",nodeHeat_kJperNode,nodeFrac); - } - - fractToShutOff = fractToMeetComparisonExternal(); - if(fractToShutOff < 1. && fractToShutOff < nodeFrac && !this->isMultipass) { // circle back and check on this for multipass - nodeFrac = fractToShutOff; - heatingCapacityNeeded_kJ = nodeFrac * nodeHeat_kJperNode; - - timeUsed_min = (heatingCapacityNeeded_kJ / heatingCapacity_kJ) * timeRemaining_min; - timeRemaining_min -= timeUsed_min; - } - //if more than one, round down to 1 and subtract the amount of time it would - //take to heat that node from the timeRemaining - else if(nodeFrac > 1.) { - nodeFrac = 1.; - timeUsed_min = (nodeHeat_kJperNode / heatingCapacity_kJ)*timeRemaining_min; - timeRemaining_min -= timeUsed_min; - } - //otherwise just the fraction available - //this should make heatingCapacity == 0 if nodeFrac < 1 - else { - timeUsed_min = timeRemaining_min; - timeRemaining_min = 0.; - } - - // Track the condenser temperature if this is a compressor before moving the nodes - if(isACompressor()) { - hpwh->condenserInlet_C += hpwh->tankTemps_C[externalOutletHeight] * timeUsed_min; - hpwh->condenserOutlet_C += targetTemp_C * timeUsed_min; - } - - // Moving the nodes down - // move all nodes down, mixing if less than a full node - for(int n = externalOutletHeight; n < externalInletHeight; n++) { - hpwh->tankTemps_C[n] = hpwh->tankTemps_C[n] * (1 - nodeFrac) + hpwh->tankTemps_C[n + 1] * nodeFrac; - } - //add water to top node, heated to setpoint - hpwh->tankTemps_C[externalInletHeight] = hpwh->tankTemps_C[externalInletHeight] * (1. - nodeFrac) + targetTemp_C * nodeFrac; - - hpwh->mixTankInversions(); - hpwh->updateSoCIfNecessary(); - - // track outputs - weight by the time ran - // Add in pump power to approximate a secondary heat exchange in line with the compressor - input_BTUperHr += (inputTemp_BTUperHr + W_TO_BTUperH(secondaryHeatExchanger.extraPumpPower_W)) * timeUsed_min; - cap_BTUperHr += capTemp_BTUperHr * timeUsed_min; - cop += copTemp * timeUsed_min; - - hpwh->externalVolumeHeated_L += nodeFrac * volumePerNode_LperNode; - - //if there's still time remaining and you haven't heated to the cutoff - //specified in shutsOff logic, keep heating - } while(timeRemaining_min > 0 && shutsOff() != true); - - // divide outputs by sum of weight - the total time ran - // not timeRemaining_min == minutesToRun is possible - // must prevent divide by 0 (added 4-11-2023) - double timeRun = minutesToRun - timeRemaining_min; - if(timeRun > 0.) - { - input_BTUperHr /= timeRun; - cap_BTUperHr /= timeRun; - cop /= timeRun; - hpwh->condenserInlet_C /= timeRun; - hpwh->condenserOutlet_C /= timeRun; - } - - if(hpwh->hpwhVerbosity >= VRB_emetic) { - hpwh->msg("final remaining time: %.2lf \n",timeRemaining_min); - } - // return the time left - return timeRun; -} - -void HPWH::HeatSource::setupAsResistiveElement(int node,double Watts,int condensitySize/* = CONDENSITY_SIZE*/) { - - isOn = false; - isVIP = false; - condensity = std::vector(condensitySize, 0.); - condensity[node] = 1; - - perfMap.reserve(2); +void HPWH::HeatSource::sortPerformanceMap() +{ + std::sort(perfMap.begin(), + perfMap.end(), + [](const HPWH::HeatSource::perfPoint& a, const HPWH::HeatSource::perfPoint& b) -> bool + { return a.T_F < b.T_F; }); +} - perfMap.push_back({ - 50, // Temperature (T_F) - {Watts,0.0,0.0}, // Input Power Coefficients (inputPower_coeffs) - {1.0,0.0,0.0} // COP Coefficients (COP_coeffs) - }); - - perfMap.push_back({ - 67, // Temperature (T_F) - {Watts,0.0,0.0}, // Input Power Coefficients (inputPower_coeffs) - {1.0,0.0,0.0} // COP Coefficients (COP_coeffs) - }); - - configuration = CONFIG_SUBMERGED; //immersed in tank - - typeOfHeatSource = TYPE_resistance; +double HPWH::HeatSource::getTankTemp() const +{ + + std::vector resampledTankTemps(getCondensitySize()); + resample(resampledTankTemps, hpwh->tankTemps_C); + + double tankTemp_C = 0.; + + std::size_t j = 0; + for (auto& resampledNodeTemp : resampledTankTemps) + { + tankTemp_C += condensity[j] * resampledNodeTemp; + // Note that condensity is normalized. + ++j; + } + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("tank temp %.2lf \n", tankTemp_C); + } + return tankTemp_C; } - -void HPWH::HeatSource::addTurnOnLogic(std::shared_ptr logic) { - this->turnOnLogicSet.push_back(logic); + +void HPWH::HeatSource::getCapacity(double externalT_C, + double condenserTemp_C, + double setpointTemp_C, + double& input_BTUperHr, + double& cap_BTUperHr, + double& cop) +{ + double externalT_F, condenserTemp_F; + + // Add an offset to the condenser temperature (or incoming coldwater temperature) to approximate + // a secondary heat exchange in line with the compressor + condenserTemp_F = C_TO_F(condenserTemp_C + secondaryHeatExchanger.coldSideTemperatureOffest_dC); + externalT_F = C_TO_F(externalT_C); + + // Get bounding performance map points for interpolation/extrapolation + bool extrapolate = false; + size_t i_prev = 0; + size_t i_next = 1; + double Tout_F = C_TO_F(setpointTemp_C + secondaryHeatExchanger.hotSideTemperatureOffset_dC); + + if (useBtwxtGrid) + { + std::vector target {externalT_F, Tout_F, condenserTemp_F}; + btwxtInterp(input_BTUperHr, cop, target); + } + else + { + if (perfMap.empty()) + { // Avoid using empty perfMap + input_BTUperHr = 0.; + cop = 0.; + } + else if (perfMap.size() > 1) + { + double COP_T1, COP_T2; // cop at ambient temperatures T1 and T2 + double inputPower_T1_Watts, + inputPower_T2_Watts; // input power at ambient temperatures T1 and T2 + + for (size_t i = 0; i < perfMap.size(); ++i) + { + if (externalT_F < perfMap[i].T_F) + { + if (i == 0) + { + extrapolate = true; + i_prev = 0; + i_next = 1; + } + else + { + i_prev = i - 1; + i_next = i; + } + break; + } + else + { + if (i == perfMap.size() - 1) + { + extrapolate = true; + i_prev = i - 1; + i_next = i; + break; + } + } + } + + // Calculate COP and Input Power at each of the two reference temepratures + COP_T1 = perfMap[i_prev].COP_coeffs[0]; + COP_T1 += perfMap[i_prev].COP_coeffs[1] * condenserTemp_F; + COP_T1 += perfMap[i_prev].COP_coeffs[2] * condenserTemp_F * condenserTemp_F; + + COP_T2 = perfMap[i_next].COP_coeffs[0]; + COP_T2 += perfMap[i_next].COP_coeffs[1] * condenserTemp_F; + COP_T2 += perfMap[i_next].COP_coeffs[2] * condenserTemp_F * condenserTemp_F; + + inputPower_T1_Watts = perfMap[i_prev].inputPower_coeffs[0]; + inputPower_T1_Watts += perfMap[i_prev].inputPower_coeffs[1] * condenserTemp_F; + inputPower_T1_Watts += + perfMap[i_prev].inputPower_coeffs[2] * condenserTemp_F * condenserTemp_F; + + inputPower_T2_Watts = perfMap[i_next].inputPower_coeffs[0]; + inputPower_T2_Watts += perfMap[i_next].inputPower_coeffs[1] * condenserTemp_F; + inputPower_T2_Watts += + perfMap[i_next].inputPower_coeffs[2] * condenserTemp_F * condenserTemp_F; + + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("inputPower_T1_constant_W linear_WperF quadratic_WperF2 \t%.2lf " + "%.2lf %.2lf \n", + perfMap[0].inputPower_coeffs[0], + perfMap[0].inputPower_coeffs[1], + perfMap[0].inputPower_coeffs[2]); + hpwh->msg("inputPower_T2_constant_W linear_WperF quadratic_WperF2 \t%.2lf " + "%.2lf %.2lf \n", + perfMap[1].inputPower_coeffs[0], + perfMap[1].inputPower_coeffs[1], + perfMap[1].inputPower_coeffs[2]); + hpwh->msg("inputPower_T1_Watts: %.2lf \tinputPower_T2_Watts: %.2lf \n", + inputPower_T1_Watts, + inputPower_T2_Watts); + + if (extrapolate) + { + hpwh->msg("Warning performance extrapolation\n\tExternal Temperature: " + "%.2lf\tNearest temperatures: %.2lf, %.2lf \n\n", + externalT_F, + perfMap[i_prev].T_F, + perfMap[i_next].T_F); + } + } + + // Interpolate to get COP and input power at the current ambient temperature + linearInterp( + cop, externalT_F, perfMap[i_prev].T_F, perfMap[i_next].T_F, COP_T1, COP_T2); + linearInterp(input_BTUperHr, + externalT_F, + perfMap[i_prev].T_F, + perfMap[i_next].T_F, + inputPower_T1_Watts, + inputPower_T2_Watts); + input_BTUperHr = KWH_TO_BTU(input_BTUperHr / 1000.0); // 1000 converts w to kw); + } + else + { // perfMap.size() == 1 or we've got an issue. + if (externalT_F > perfMap[0].T_F) + { + extrapolate = true; + if (extrapolationMethod == EXTRAP_NEAREST) + { + externalT_F = perfMap[0].T_F; + } + } + + regressedMethod( + input_BTUperHr, perfMap[0].inputPower_coeffs, externalT_F, Tout_F, condenserTemp_F); + input_BTUperHr = KWH_TO_BTU(input_BTUperHr); + + regressedMethod(cop, perfMap[0].COP_coeffs, externalT_F, Tout_F, condenserTemp_F); + } + } + + if (doDefrost) + { + // adjust COP by the defrost factor + defrostDerate(cop, externalT_F); + } + + cap_BTUperHr = cop * input_BTUperHr; + + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("externalT_F: %.2lf, Tout_F: %.2lf, condenserTemp_F: %.2lf\n", + externalT_F, + Tout_F, + condenserTemp_F); + hpwh->msg("input_BTUperHr: %.2lf , cop: %.2lf, cap_BTUperHr: %.2lf \n", + input_BTUperHr, + cop, + cap_BTUperHr); + } + // here is where the scaling for flow restriction happens + // the input power doesn't change, we just scale the cop by a small percentage + // that is based on the flow rate. The equation is a fit to three points, + // measured experimentally - 12 percent reduction at 150 cfm, 10 percent at + // 200, and 0 at 375. Flow is expressed as fraction of full flow. + if (airflowFreedom != 1) + { + double airflow = 375 * airflowFreedom; + cop *= 0.00056 * airflow + 0.79; + } + if (hpwh->hpwhVerbosity >= VRB_typical) + { + hpwh->msg("cop: %.2lf \tinput_BTUperHr: %.2lf \tcap_BTUperHr: %.2lf \n", + cop, + input_BTUperHr, + cap_BTUperHr); + if (cop < 0.) + { + hpwh->msg(" Warning: COP is Negative! \n"); + } + if (cop < 1.) + { + hpwh->msg(" Warning: COP is Less than 1! \n"); + } + } } - -void HPWH::HeatSource::addShutOffLogic(std::shared_ptr logic) { - this->shutOffLogicSet.push_back(logic); + +void HPWH::HeatSource::getCapacityMP(double externalT_C, + double condenserTemp_C, + double& input_BTUperHr, + double& cap_BTUperHr, + double& cop) +{ + double externalT_F, condenserTemp_F; + bool resDefrostHeatingOn = false; + // Convert Celsius to Fahrenheit for the curve fits + condenserTemp_F = C_TO_F(condenserTemp_C + secondaryHeatExchanger.coldSideTemperatureOffest_dC); + externalT_F = C_TO_F(externalT_C); + + // Check if we have resistance elements to turn on for defrost and add the constant lift. + if (resDefrost.inputPwr_kW > 0) + { + if (externalT_F < resDefrost.onBelowT_F) + { + externalT_F += resDefrost.constTempLift_dF; + resDefrostHeatingOn = true; + } + } + + if (useBtwxtGrid) + { + std::vector target {externalT_F, condenserTemp_F}; + btwxtInterp(input_BTUperHr, cop, target); + } + else + { + // Get bounding performance map points for interpolation/extrapolation + bool extrapolate = false; + if (externalT_F > perfMap[0].T_F) + { + extrapolate = true; + if (extrapolationMethod == EXTRAP_NEAREST) + { + externalT_F = perfMap[0].T_F; + } + } + + // Const Tair Tin Tair2 Tin2 TairTin + regressedMethodMP( + input_BTUperHr, perfMap[0].inputPower_coeffs, externalT_F, condenserTemp_F); + regressedMethodMP(cop, perfMap[0].COP_coeffs, externalT_F, condenserTemp_F); + } + input_BTUperHr = KWH_TO_BTU(input_BTUperHr); + + if (doDefrost) + { + // adjust COP by the defrost factor + defrostDerate(cop, externalT_F); + } + + cap_BTUperHr = cop * input_BTUperHr; + + // For accounting add the resistance defrost to the input energy + if (resDefrostHeatingOn) + { + input_BTUperHr += KW_TO_BTUperH(resDefrost.inputPwr_kW); + } + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("externalT_F: %.2lf, condenserTemp_F: %.2lf\n", externalT_F, condenserTemp_F); + hpwh->msg("input_BTUperHr: %.2lf , cop: %.2lf, cap_BTUperHr: %.2lf \n", + input_BTUperHr, + cop, + cap_BTUperHr); + } } -void HPWH::HeatSource::clearAllTurnOnLogic() { - this->turnOnLogicSet.clear(); +double HPWH::HeatSource::calcMPOutletTemperature(double heatingCapacity_KW) +{ + return hpwh->tankTemps_C[externalOutletHeight] + + heatingCapacity_KW / (mpFlowRate_LPS * DENSITYWATER_kgperL * CPWATER_kJperkgC); } -void HPWH::HeatSource::clearAllShutOffLogic() { - this->shutOffLogicSet.clear(); +void HPWH::HeatSource::setupDefrostMap(double derate35 /*=0.8865*/) +{ + doDefrost = true; + defrostMap.reserve(3); + defrostMap.push_back({17., 1.}); + defrostMap.push_back({35., derate35}); + defrostMap.push_back({47., 1.}); } -void HPWH::HeatSource::clearAllLogic() { - this->clearAllTurnOnLogic(); - this->clearAllShutOffLogic(); +void HPWH::HeatSource::defrostDerate(double& to_derate, double airT_F) +{ + if (airT_F <= defrostMap[0].T_F || airT_F >= defrostMap[defrostMap.size() - 1].T_F) + { + return; // Air temperature outside bounds of the defrost map. There is no extrapolation + // here. + } + double derate_factor = 1.; + size_t i_prev = 0; + for (size_t i = 1; i < defrostMap.size(); ++i) + { + if (airT_F <= defrostMap[i].T_F) + { + i_prev = i - 1; + break; + } + } + linearInterp(derate_factor, + airT_F, + defrostMap[i_prev].T_F, + defrostMap[i_prev + 1].T_F, + defrostMap[i_prev].derate_fraction, + defrostMap[i_prev + 1].derate_fraction); + to_derate *= derate_factor; +} + +void HPWH::HeatSource::linearInterp( + double& ynew, double xnew, double x0, double x1, double y0, double y1) +{ + ynew = y0 + (xnew - x0) * (y1 - y0) / (x1 - x0); +} + +void HPWH::HeatSource::regressedMethod( + double& ynew, std::vector& coefficents, double x1, double x2, double x3) +{ + ynew = coefficents[0] + coefficents[1] * x1 + coefficents[2] * x2 + coefficents[3] * x3 + + coefficents[4] * x1 * x1 + coefficents[5] * x2 * x2 + coefficents[6] * x3 * x3 + + coefficents[7] * x1 * x2 + coefficents[8] * x1 * x3 + coefficents[9] * x2 * x3 + + coefficents[10] * x1 * x2 * x3; +} + +void HPWH::HeatSource::regressedMethodMP(double& ynew, + std::vector& coefficents, + double x1, + double x2) +{ + // Const Tair Tin Tair2 Tin2 TairTin + ynew = coefficents[0] + coefficents[1] * x1 + coefficents[2] * x2 + coefficents[3] * x1 * x1 + + coefficents[4] * x2 * x2 + coefficents[5] * x1 * x2; +} + +void HPWH::HeatSource::btwxtInterp(double& input_BTUperHr, double& cop, std::vector& target) +{ + + std::vector result = perfRGI->get_values_at_target(target); + + input_BTUperHr = result[0]; + cop = result[1]; +} + +void HPWH::HeatSource::calcHeatDist(std::vector& heatDistribution) +{ + + // Populate the vector of heat distribution + if (configuration == CONFIG_SUBMERGED) + { + heatDistribution.resize(hpwh->getNumNodes()); + resampleExtensive(heatDistribution, condensity); + } + else if (configuration == CONFIG_WRAPPED) + { // Wrapped around the tank, send through the logistic function + calcThermalDist( + heatDistribution, Tshrinkage_C, lowestNode, hpwh->tankTemps_C, hpwh->setpoint_C); + } +} + +bool HPWH::HeatSource::isACompressor() const { return this->typeOfHeatSource == TYPE_compressor; } + +bool HPWH::HeatSource::isAResistance() const { return this->typeOfHeatSource == TYPE_resistance; } +bool HPWH::HeatSource::isExternalMultipass() const +{ + return isMultipass && configuration == HeatSource::CONFIG_EXTERNAL; +} + +double HPWH::HeatSource::addHeatExternal(double externalT_C, + double minutesToRun, + double& cap_BTUperHr, + double& input_BTUperHr, + double& cop) +{ + double heatingCapacity_kJ, heatingCapacityNeeded_kJ, deltaT_C, timeUsed_min, nodeHeat_kJperNode, + nodeFrac, fractToShutOff; + double inputTemp_BTUperHr = 0, capTemp_BTUperHr = 0, copTemp = 0; + double volumePerNode_LperNode = hpwh->tankVolume_L / hpwh->getNumNodes(); + double timeRemaining_min = minutesToRun; + double maxTargetTemp_C = std::min(maxSetpoint_C, hpwh->setpoint_C); + double targetTemp_C = 0.; + input_BTUperHr = 0; + cap_BTUperHr = 0; + cop = 0; + + do + { + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("bottom tank temp: %.2lf \n", hpwh->tankTemps_C[0]); + } + + if (this->isMultipass) + { + // if multipass evenly mix the tank up + hpwh->mixTankNodes( + 0, hpwh->getNumNodes(), 1.0); // 1.0 will give even mixing, so all temperatures + // mixed end at average temperature. + + // how much heat is added this timestep + getCapacityMP(externalT_C, + hpwh->tankTemps_C[externalOutletHeight], + inputTemp_BTUperHr, + capTemp_BTUperHr, + copTemp); + double heatingCapacity_KW = BTUperH_TO_KW(capTemp_BTUperHr); + + heatingCapacity_kJ = heatingCapacity_KW * (timeRemaining_min * sec_per_min); + + targetTemp_C = calcMPOutletTemperature(heatingCapacity_KW); + deltaT_C = targetTemp_C - hpwh->tankTemps_C[externalOutletHeight]; + } + else + { + // how much heat is available this timestep + getCapacity(externalT_C, + hpwh->tankTemps_C[externalOutletHeight], + inputTemp_BTUperHr, + capTemp_BTUperHr, + copTemp); + heatingCapacity_kJ = BTU_TO_KJ(capTemp_BTUperHr * (minutesToRun / min_per_hr)); + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("\theatingCapacity_kJ stepwise: %.2lf \n", heatingCapacity_kJ); + } + + // adjust capacity for how much time is left in this step + heatingCapacity_kJ *= (timeRemaining_min / minutesToRun); + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("\theatingCapacity_kJ remaining this node: %.2lf \n", heatingCapacity_kJ); + } + + // calculate what percentage of the bottom node can be heated to setpoint + // with amount of heat available this timestep + targetTemp_C = maxTargetTemp_C; + deltaT_C = targetTemp_C - hpwh->tankTemps_C[externalOutletHeight]; + } + + nodeHeat_kJperNode = + volumePerNode_LperNode * DENSITYWATER_kgperL * CPWATER_kJperkgC * deltaT_C; + + // Caclulate fraction of node to move + if (nodeHeat_kJperNode <= 0.) + { // protect against dividing by zero - if bottom node is at (or above) setpoint, add no + // heat + nodeFrac = 0.; + } + else + { + nodeFrac = heatingCapacity_kJ / nodeHeat_kJperNode; + } + + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg( + "nodeHeat_kJperNode: %.2lf nodeFrac: %.2lf \n\n", nodeHeat_kJperNode, nodeFrac); + } + + fractToShutOff = fractToMeetComparisonExternal(); + if (fractToShutOff < 1. && fractToShutOff < nodeFrac && !this->isMultipass) + { // circle back and check on this for multipass + nodeFrac = fractToShutOff; + heatingCapacityNeeded_kJ = nodeFrac * nodeHeat_kJperNode; + + timeUsed_min = (heatingCapacityNeeded_kJ / heatingCapacity_kJ) * timeRemaining_min; + timeRemaining_min -= timeUsed_min; + } + // if more than one, round down to 1 and subtract the amount of time it would + // take to heat that node from the timeRemaining + else if (nodeFrac > 1.) + { + nodeFrac = 1.; + timeUsed_min = (nodeHeat_kJperNode / heatingCapacity_kJ) * timeRemaining_min; + timeRemaining_min -= timeUsed_min; + } + // otherwise just the fraction available + // this should make heatingCapacity == 0 if nodeFrac < 1 + else + { + timeUsed_min = timeRemaining_min; + timeRemaining_min = 0.; + } + + // Track the condenser temperature if this is a compressor before moving the nodes + if (isACompressor()) + { + hpwh->condenserInlet_C += hpwh->tankTemps_C[externalOutletHeight] * timeUsed_min; + hpwh->condenserOutlet_C += targetTemp_C * timeUsed_min; + } + + // Moving the nodes down + // move all nodes down, mixing if less than a full node + for (int n = externalOutletHeight; n < externalInletHeight; n++) + { + hpwh->tankTemps_C[n] = + hpwh->tankTemps_C[n] * (1 - nodeFrac) + hpwh->tankTemps_C[n + 1] * nodeFrac; + } + // add water to top node, heated to setpoint + hpwh->tankTemps_C[externalInletHeight] = + hpwh->tankTemps_C[externalInletHeight] * (1. - nodeFrac) + targetTemp_C * nodeFrac; + + hpwh->mixTankInversions(); + hpwh->updateSoCIfNecessary(); + + // track outputs - weight by the time ran + // Add in pump power to approximate a secondary heat exchange in line with the compressor + input_BTUperHr += + (inputTemp_BTUperHr + W_TO_BTUperH(secondaryHeatExchanger.extraPumpPower_W)) * + timeUsed_min; + cap_BTUperHr += capTemp_BTUperHr * timeUsed_min; + cop += copTemp * timeUsed_min; + + hpwh->externalVolumeHeated_L += nodeFrac * volumePerNode_LperNode; + + // if there's still time remaining and you haven't heated to the cutoff + // specified in shutsOff logic, keep heating + } while (timeRemaining_min > 0 && shutsOff() != true); + + // divide outputs by sum of weight - the total time ran + // not timeRemaining_min == minutesToRun is possible + // must prevent divide by 0 (added 4-11-2023) + double timeRun = minutesToRun - timeRemaining_min; + if (timeRun > 0.) + { + input_BTUperHr /= timeRun; + cap_BTUperHr /= timeRun; + cop /= timeRun; + hpwh->condenserInlet_C /= timeRun; + hpwh->condenserOutlet_C /= timeRun; + } + + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + hpwh->msg("final remaining time: %.2lf \n", timeRemaining_min); + } + // return the time left + return timeRun; +} + +void HPWH::HeatSource::setupAsResistiveElement(int node, + double Watts, + int condensitySize /* = CONDENSITY_SIZE*/) +{ + + isOn = false; + isVIP = false; + condensity = std::vector(condensitySize, 0.); + condensity[node] = 1; + + perfMap.reserve(2); + + perfMap.push_back({ + 50, // Temperature (T_F) + {Watts, 0.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {1.0, 0.0, 0.0} // COP Coefficients (COP_coeffs) + }); + + perfMap.push_back({ + 67, // Temperature (T_F) + {Watts, 0.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {1.0, 0.0, 0.0} // COP Coefficients (COP_coeffs) + }); + + configuration = CONFIG_SUBMERGED; // immersed in tank + + typeOfHeatSource = TYPE_resistance; +} + +void HPWH::HeatSource::addTurnOnLogic(std::shared_ptr logic) +{ + this->turnOnLogicSet.push_back(logic); +} + +void HPWH::HeatSource::addShutOffLogic(std::shared_ptr logic) +{ + this->shutOffLogicSet.push_back(logic); +} + +void HPWH::HeatSource::clearAllTurnOnLogic() { this->turnOnLogicSet.clear(); } + +void HPWH::HeatSource::clearAllShutOffLogic() { this->shutOffLogicSet.clear(); } + +void HPWH::HeatSource::clearAllLogic() +{ + this->clearAllTurnOnLogic(); + this->clearAllShutOffLogic(); } -void HPWH::HeatSource::changeResistanceWatts(double watts) { - for(auto &perfP : perfMap) { - perfP.inputPower_coeffs[0] = watts; - } +void HPWH::HeatSource::changeResistanceWatts(double watts) +{ + for (auto& perfP : perfMap) + { + perfP.inputPower_coeffs[0] = watts; + } } diff --git a/src/HPWHHeatingLogics.cc b/src/HPWHHeatingLogics.cc index 174d75f1..e2f1838d 100644 --- a/src/HPWHHeatingLogics.cc +++ b/src/HPWHHeatingLogics.cc @@ -5,226 +5,285 @@ File of the presets heating logics available HPWHsim #include "HPWH.hh" /* State of Charge Based Logic*/ -const bool HPWH::SoCBasedHeatingLogic::isValid() { - bool isValid = true; - if(decisionPoint < 0) { - isValid = false; - } - return isValid; +const bool HPWH::SoCBasedHeatingLogic::isValid() +{ + bool isValid = true; + if (decisionPoint < 0) + { + isValid = false; + } + return isValid; } -const double HPWH::SoCBasedHeatingLogic::getComparisonValue() { - return decisionPoint + hysteresisFraction; +const double HPWH::SoCBasedHeatingLogic::getComparisonValue() +{ + return decisionPoint + hysteresisFraction; } -const double HPWH::SoCBasedHeatingLogic::getTankValue() { - double soCFraction; - if(hpwh->member_inletT_C == HPWH_ABORT && !useCostantMains) { - soCFraction = HPWH_ABORT; - } else { - soCFraction = hpwh->getSoCFraction(); - } - return soCFraction; +const double HPWH::SoCBasedHeatingLogic::getTankValue() +{ + double soCFraction; + if (hpwh->member_inletT_C == HPWH_ABORT && !useCostantMains) + { + soCFraction = HPWH_ABORT; + } + else + { + soCFraction = hpwh->getSoCFraction(); + } + return soCFraction; } -const double HPWH::SoCBasedHeatingLogic::getMainsT_C() { - if(useCostantMains) { - return constantMains_C; - } else { - return hpwh->member_inletT_C; - } +const double HPWH::SoCBasedHeatingLogic::getMainsT_C() +{ + if (useCostantMains) + { + return constantMains_C; + } + else + { + return hpwh->member_inletT_C; + } } -const double HPWH::SoCBasedHeatingLogic::getTempMinUseful_C() { - return tempMinUseful_C; -} - -int HPWH::SoCBasedHeatingLogic::setDecisionPoint(double value) { - decisionPoint = value; - return 0; -} +const double HPWH::SoCBasedHeatingLogic::getTempMinUseful_C() { return tempMinUseful_C; } -int HPWH::SoCBasedHeatingLogic::setConstantMainsTemperature(double mains_C) { - constantMains_C = mains_C; - useCostantMains = true; - return 0; +int HPWH::SoCBasedHeatingLogic::setDecisionPoint(double value) +{ + decisionPoint = value; + return 0; } -const double HPWH::SoCBasedHeatingLogic::nodeWeightAvgFract() { - return getComparisonValue(); +int HPWH::SoCBasedHeatingLogic::setConstantMainsTemperature(double mains_C) +{ + constantMains_C = mains_C; + useCostantMains = true; + return 0; } -const double HPWH::SoCBasedHeatingLogic::getFractToMeetComparisonExternal() { - double deltaSoCFraction = (getComparisonValue() + HPWH::TOL_MINVALUE) - getTankValue(); - - // Check how much of a change in the SoC fraction occurs if one full node at set point is added. If this is less than the change needed move on. - double fullNodeSoC = 1. / hpwh->getNumNodes(); - if(deltaSoCFraction >= fullNodeSoC) { - return 1.; - } - - // Find the last node greater the min use temp - int calcNode = 0; - for(int i = hpwh->getNumNodes() - 1; i >= 0; i--) { - if(hpwh->tankTemps_C[i] < tempMinUseful_C) { - calcNode = i + 1; - break; - } - } - if(calcNode == hpwh->getNumNodes()) { // if the whole tank is cold - return 1.; - } - - // Find the fraction to heat the calc node to meet the target SoC fraction without heating the node below up to tempMinUseful. - double maxSoC = hpwh->getNumNodes() * hpwh->getChargePerNode(getMainsT_C(),tempMinUseful_C,hpwh->setpoint_C); - double targetTemp = deltaSoCFraction * maxSoC + (hpwh->tankTemps_C[calcNode] - getMainsT_C()) / (tempMinUseful_C - getMainsT_C()); - targetTemp = targetTemp * (tempMinUseful_C - getMainsT_C()) + getMainsT_C(); - - //Catch case where node temperature == setpoint - double fractCalcNode; - if(hpwh->tankTemps_C[calcNode] >= hpwh->setpoint_C) { - fractCalcNode = 1; - } else { - fractCalcNode = (targetTemp - hpwh->tankTemps_C[calcNode]) / (hpwh->setpoint_C - hpwh->tankTemps_C[calcNode]); - } - - // If we're at the bottom node there's not another node to heat so case 2 doesn't apply. - if(calcNode == 0) { - return fractCalcNode; - } - - // Fraction to heat next node, where the step change occurs - double fractNextNode = (tempMinUseful_C - hpwh->tankTemps_C[calcNode - 1]) / (hpwh->tankTemps_C[calcNode] - hpwh->tankTemps_C[calcNode - 1]); - fractNextNode += HPWH::TOL_MINVALUE; - - if(hpwh->hpwhVerbosity >= VRB_emetic) { - double smallestSoCChangeWhenHeatingNextNode = 1. / maxSoC * (1. + fractNextNode * (hpwh->setpoint_C - hpwh->tankTemps_C[calcNode]) / - (tempMinUseful_C - getMainsT_C())); - hpwh->msg("fractThisNode %.6f, fractNextNode %.6f, smallestSoCChangeWithNextNode: %.6f, deltaSoCFraction: %.6f\n", - fractCalcNode,fractNextNode,smallestSoCChangeWhenHeatingNextNode,deltaSoCFraction); - } - - // if the fraction is enough to heat up the next node, do that minimum and handle the heating of the next node next iteration. - return std::min(fractCalcNode,fractNextNode); +const double HPWH::SoCBasedHeatingLogic::nodeWeightAvgFract() { return getComparisonValue(); } + +const double HPWH::SoCBasedHeatingLogic::getFractToMeetComparisonExternal() +{ + double deltaSoCFraction = (getComparisonValue() + HPWH::TOL_MINVALUE) - getTankValue(); + + // Check how much of a change in the SoC fraction occurs if one full node at set point is added. + // If this is less than the change needed move on. + double fullNodeSoC = 1. / hpwh->getNumNodes(); + if (deltaSoCFraction >= fullNodeSoC) + { + return 1.; + } + + // Find the last node greater the min use temp + int calcNode = 0; + for (int i = hpwh->getNumNodes() - 1; i >= 0; i--) + { + if (hpwh->tankTemps_C[i] < tempMinUseful_C) + { + calcNode = i + 1; + break; + } + } + if (calcNode == hpwh->getNumNodes()) + { // if the whole tank is cold + return 1.; + } + + // Find the fraction to heat the calc node to meet the target SoC fraction without heating the + // node below up to tempMinUseful. + double maxSoC = hpwh->getNumNodes() * + hpwh->getChargePerNode(getMainsT_C(), tempMinUseful_C, hpwh->setpoint_C); + double targetTemp = deltaSoCFraction * maxSoC + (hpwh->tankTemps_C[calcNode] - getMainsT_C()) / + (tempMinUseful_C - getMainsT_C()); + targetTemp = targetTemp * (tempMinUseful_C - getMainsT_C()) + getMainsT_C(); + + // Catch case where node temperature == setpoint + double fractCalcNode; + if (hpwh->tankTemps_C[calcNode] >= hpwh->setpoint_C) + { + fractCalcNode = 1; + } + else + { + fractCalcNode = (targetTemp - hpwh->tankTemps_C[calcNode]) / + (hpwh->setpoint_C - hpwh->tankTemps_C[calcNode]); + } + + // If we're at the bottom node there's not another node to heat so case 2 doesn't apply. + if (calcNode == 0) + { + return fractCalcNode; + } + + // Fraction to heat next node, where the step change occurs + double fractNextNode = (tempMinUseful_C - hpwh->tankTemps_C[calcNode - 1]) / + (hpwh->tankTemps_C[calcNode] - hpwh->tankTemps_C[calcNode - 1]); + fractNextNode += HPWH::TOL_MINVALUE; + + if (hpwh->hpwhVerbosity >= VRB_emetic) + { + double smallestSoCChangeWhenHeatingNextNode = + 1. / maxSoC * + (1. + fractNextNode * (hpwh->setpoint_C - hpwh->tankTemps_C[calcNode]) / + (tempMinUseful_C - getMainsT_C())); + hpwh->msg("fractThisNode %.6f, fractNextNode %.6f, smallestSoCChangeWithNextNode: %.6f, " + "deltaSoCFraction: %.6f\n", + fractCalcNode, + fractNextNode, + smallestSoCChangeWhenHeatingNextNode, + deltaSoCFraction); + } + + // if the fraction is enough to heat up the next node, do that minimum and handle the heating of + // the next node next iteration. + return std::min(fractCalcNode, fractNextNode); } /* Temperature Based Heating Logic*/ -const bool HPWH::TempBasedHeatingLogic::isValid() { - bool isValid = true; - if(!areNodeWeightsValid()) { - isValid = false; - } - return isValid; +const bool HPWH::TempBasedHeatingLogic::isValid() +{ + bool isValid = true; + if (!areNodeWeightsValid()) + { + isValid = false; + } + return isValid; } -const bool HPWH::TempBasedHeatingLogic::areNodeWeightsValid() { - for(auto nodeWeight : nodeWeights) { - if(nodeWeight.nodeNum > 13 || nodeWeight.nodeNum < 0) { - return false; - } - } - return true; +const bool HPWH::TempBasedHeatingLogic::areNodeWeightsValid() +{ + for (auto nodeWeight : nodeWeights) + { + if (nodeWeight.nodeNum > 13 || nodeWeight.nodeNum < 0) + { + return false; + } + } + return true; } -const double HPWH::TempBasedHeatingLogic::getComparisonValue() { - double value = decisionPoint; - if(isAbsolute) { - return value; - } else { - return hpwh->getSetpoint() - value; - } +const double HPWH::TempBasedHeatingLogic::getComparisonValue() +{ + double value = decisionPoint; + if (isAbsolute) + { + return value; + } + else + { + return hpwh->getSetpoint() - value; + } } -const double HPWH::TempBasedHeatingLogic::getTankValue() { - return hpwh->tankAvg_C(nodeWeights); -} +const double HPWH::TempBasedHeatingLogic::getTankValue() { return hpwh->tankAvg_C(nodeWeights); } -int HPWH::TempBasedHeatingLogic::setDecisionPoint(double value) { - decisionPoint = value; - return 0; +int HPWH::TempBasedHeatingLogic::setDecisionPoint(double value) +{ + decisionPoint = value; + return 0; } -int HPWH::TempBasedHeatingLogic::setDecisionPoint(double value,bool absolute) { - isAbsolute = absolute; - return setDecisionPoint(value); +int HPWH::TempBasedHeatingLogic::setDecisionPoint(double value, bool absolute) +{ + isAbsolute = absolute; + return setDecisionPoint(value); } -const double HPWH::TempBasedHeatingLogic::nodeWeightAvgFract() { - double logicNode; - double calcNodes = 0,totWeight = 0; - - for(auto nodeWeight : nodeWeights) { - // bottom calc node only - if(nodeWeight.nodeNum == 0) { // simple equation - return 1. / (double)hpwh->getNumNodes(); - } - // top calc node only - else if(nodeWeight.nodeNum == LOGIC_NODE_SIZE + 1) { - return 1.; - } else { // have to tally up the nodes - calcNodes += nodeWeight.nodeNum * nodeWeight.weight; - totWeight += nodeWeight.weight; - } - } - - logicNode = calcNodes / totWeight; - - return logicNode / static_cast(LOGIC_NODE_SIZE); +const double HPWH::TempBasedHeatingLogic::nodeWeightAvgFract() +{ + double logicNode; + double calcNodes = 0, totWeight = 0; + + for (auto nodeWeight : nodeWeights) + { + // bottom calc node only + if (nodeWeight.nodeNum == 0) + { // simple equation + return 1. / (double)hpwh->getNumNodes(); + } + // top calc node only + else if (nodeWeight.nodeNum == LOGIC_NODE_SIZE + 1) + { + return 1.; + } + else + { // have to tally up the nodes + calcNodes += nodeWeight.nodeNum * nodeWeight.weight; + totWeight += nodeWeight.weight; + } + } + + logicNode = calcNodes / totWeight; + + return logicNode / static_cast(LOGIC_NODE_SIZE); } -const double HPWH::TempBasedHeatingLogic::getFractToMeetComparisonExternal() { - double fracTemp; - double diff; - int calcNode = 0; - int firstNode = -1; - double sum = 0; - double totWeight = 0; - - std::vector resampledTankTemps(LOGIC_NODE_SIZE); - resample(resampledTankTemps,hpwh->tankTemps_C); - double comparison = getComparisonValue(); - comparison += HPWH::TOL_MINVALUE; // Make this possible so we do slightly over heat - - double nodeDensity = static_cast(hpwh->getNumNodes()) / LOGIC_NODE_SIZE; - for(auto nodeWeight : nodeWeights) { - - // bottom calc node only - if(nodeWeight.nodeNum == 0) { // bottom-most tank node only - firstNode = calcNode = 0; - double nodeTemp = hpwh->tankTemps_C.front(); - sum = nodeTemp * nodeWeight.weight; - totWeight = nodeWeight.weight; - } - // top calc node only - else if(nodeWeight.nodeNum == LOGIC_NODE_SIZE + 1) { // top-most tank node only - calcNode = firstNode = hpwh->getNumNodes() - 1; - double nodeTemp = hpwh->tankTemps_C.back(); - sum = nodeTemp * nodeWeight.weight; - totWeight = nodeWeight.weight; - } else { // all tank nodes corresponding to logical node - firstNode = static_cast(nodeDensity * (nodeWeight.nodeNum - 1)); - calcNode = static_cast(nodeDensity * (nodeWeight.nodeNum))- 1; - double nodeTemp = resampledTankTemps[static_cast(nodeWeight.nodeNum - 1)]; - sum += nodeTemp * nodeWeight.weight; - totWeight += nodeWeight.weight; - } - } - - if(calcNode == hpwh->getNumNodes() - 1) { // top node calc - diff = hpwh->getSetpoint() - hpwh->tankTemps_C[firstNode]; - } else { - diff = hpwh->tankTemps_C[calcNode + 1] - hpwh->tankTemps_C[firstNode]; - } - // if totWeight * comparison - sum < 0 then the shutoff condition is already true and you shouldn't - // be here. Will revaluate shut off condition at the end the do while loop of addHeatExternal, in the - // mean time lets not shift anything around. - if(compare(sum,totWeight * comparison)) { // Then should shut off - fracTemp = 0.; // 0 means shift no nodes - } else { - // if the difference in denominator is <= 0 then we aren't adding heat to the nodes we care about, so - // shift a whole node. - // factor of hpwh->nodeDensity included below to reproduce original algorithm - fracTemp = diff > 0. ? (totWeight * comparison - sum) * nodeDensity / diff : 1.; - } - - return fracTemp; +const double HPWH::TempBasedHeatingLogic::getFractToMeetComparisonExternal() +{ + double fracTemp; + double diff; + int calcNode = 0; + int firstNode = -1; + double sum = 0; + double totWeight = 0; + + std::vector resampledTankTemps(LOGIC_NODE_SIZE); + resample(resampledTankTemps, hpwh->tankTemps_C); + double comparison = getComparisonValue(); + comparison += HPWH::TOL_MINVALUE; // Make this possible so we do slightly over heat + + double nodeDensity = static_cast(hpwh->getNumNodes()) / LOGIC_NODE_SIZE; + for (auto nodeWeight : nodeWeights) + { + + // bottom calc node only + if (nodeWeight.nodeNum == 0) + { // bottom-most tank node only + firstNode = calcNode = 0; + double nodeTemp = hpwh->tankTemps_C.front(); + sum = nodeTemp * nodeWeight.weight; + totWeight = nodeWeight.weight; + } + // top calc node only + else if (nodeWeight.nodeNum == LOGIC_NODE_SIZE + 1) + { // top-most tank node only + calcNode = firstNode = hpwh->getNumNodes() - 1; + double nodeTemp = hpwh->tankTemps_C.back(); + sum = nodeTemp * nodeWeight.weight; + totWeight = nodeWeight.weight; + } + else + { // all tank nodes corresponding to logical node + firstNode = static_cast(nodeDensity * (nodeWeight.nodeNum - 1)); + calcNode = static_cast(nodeDensity * (nodeWeight.nodeNum)) - 1; + double nodeTemp = resampledTankTemps[static_cast(nodeWeight.nodeNum - 1)]; + sum += nodeTemp * nodeWeight.weight; + totWeight += nodeWeight.weight; + } + } + + if (calcNode == hpwh->getNumNodes() - 1) + { // top node calc + diff = hpwh->getSetpoint() - hpwh->tankTemps_C[firstNode]; + } + else + { + diff = hpwh->tankTemps_C[calcNode + 1] - hpwh->tankTemps_C[firstNode]; + } + // if totWeight * comparison - sum < 0 then the shutoff condition is already true and you + // shouldn't be here. Will revaluate shut off condition at the end the do while loop of + // addHeatExternal, in the mean time lets not shift anything around. + if (compare(sum, totWeight * comparison)) + { // Then should shut off + fracTemp = 0.; // 0 means shift no nodes + } + else + { + // if the difference in denominator is <= 0 then we aren't adding heat to the nodes we care + // about, so shift a whole node. factor of hpwh->nodeDensity included below to reproduce + // original algorithm + fracTemp = diff > 0. ? (totWeight * comparison - sum) * nodeDensity / diff : 1.; + } + + return fracTemp; } diff --git a/src/HPWHpresets.cc b/src/HPWHpresets.cc index a39bb2f3..49565891 100644 --- a/src/HPWHpresets.cc +++ b/src/HPWHpresets.cc @@ -7,3914 +7,4594 @@ File Containing all of the presets available in HPWHsim #include -int HPWH::HPWHinit_resTank() { - //a default resistance tank, nominal 50 gallons, 0.95 EF, standard double 4.5 kW elements - return this->HPWHinit_resTank(GAL_TO_L(47.5), 0.95, 4500, 4500); +int HPWH::HPWHinit_resTank() +{ + // a default resistance tank, nominal 50 gallons, 0.95 EF, standard double 4.5 kW elements + return this->HPWHinit_resTank(GAL_TO_L(47.5), 0.95, 4500, 4500); } -int HPWH::HPWHinit_resTank(double tankVol_L, double energyFactor, double upperPower_W, double lowerPower_W) { - - setAllDefaults(); // reset all defaults if you're re-initilizing - // sets simHasFailed = true; this gets cleared on successful completion of init - // return 0 on success, HPWH_ABORT for failure - - heatSources.clear(); - - //low power element will cause divide by zero/negative UA in EF -> UA conversion - if (lowerPower_W < 550) { - if (hpwhVerbosity >= VRB_reluctant) { - msg("Resistance tank lower element wattage below 550 W. DOES NOT COMPUTE\n"); - } - return HPWH_ABORT; - } - if (upperPower_W < 0.) { - if (hpwhVerbosity >= VRB_reluctant) { - msg("Upper resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); - } - return HPWH_ABORT; - } - if (energyFactor <= 0.) { - if (hpwhVerbosity >= VRB_reluctant) { - msg("Energy Factor less than zero. DOES NOT COMPUTE\n"); - } - return HPWH_ABORT; - } - - setNumNodes(12); - - //use tank size setting function since it has bounds checking - tankSizeFixed = false; - int failure = this->setTankSize(tankVol_L); - if (failure == HPWH_ABORT) { - return failure; - } - - setpoint_C = F_TO_C(127.0); - - //start tank off at setpoint - resetTankToSetpoint(); - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource resistiveElementBottom(this); - resistiveElementBottom.setupAsResistiveElement(0, lowerPower_W); - - //standard logic conditions - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40))); - resistiveElementBottom.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); - - if (upperPower_W > 0.) { - // Only add an upper element when the upperPower_W > 0 otherwise ignore this. - // If the element is added this can mess with the intended logic. - HeatSource resistiveElementTop(this); - resistiveElementTop.setupAsResistiveElement(8, upperPower_W); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); - resistiveElementTop.isVIP = true; - - // set everything in it's correct place - heatSources.resize(2); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - - heatSources[0].followedByHeatSource = &heatSources[1]; - } - else { - heatSources.resize(1); - heatSources[0] = resistiveElementBottom; - } - - // (1/EnFac - 1/RecovEff) / (67.5 * ((24/41094) - 1/(RecovEff * Power_btuperHr))) - // Previous comment and the equation source said (1/EnFac + 1/RecovEff) however this was - // determined to be a typo from the source that was kept in the comment. On 8/12/2021 - // the comment was changed to reflect the correct mathematical formulation which is performed - // below. - double recoveryEfficiency = 0.98; - double numerator = (1.0 / energyFactor) - (1.0 / recoveryEfficiency); - double temp = 1.0 / (recoveryEfficiency * lowerPower_W*3.41443); - double denominator = 67.5 * ((24.0 / 41094.0) - temp); - tankUA_kJperHrC = UAf_TO_UAc(numerator / denominator); - - if (tankUA_kJperHrC < 0.) { - if (hpwhVerbosity >= VRB_reluctant && tankUA_kJperHrC < -0.1) { - msg("Computed tankUA_kJperHrC is less than 0, and is reset to 0."); - } - tankUA_kJperHrC = 0.0; - } - - hpwhModel = MODELS_CustomResTank; - - //calculate oft-used derived values - calcDerivedValues(); - - if (checkInputs() == HPWH_ABORT) return HPWH_ABORT; - - isHeating = false; - for (int i = 0; i < getNumHeatSources(); i++) { - if (heatSources[i].isOn) { - isHeating = true; - } - heatSources[i].sortPerformanceMap(); - } - - if (hpwhVerbosity >= VRB_emetic) { - for (int i = 0; i < getNumHeatSources(); i++) { - msg("heat source %d: %p \n", i, &heatSources[i]); - } - msg("\n\n"); - } - - simHasFailed = false; - return 0; //successful init returns 0 +int HPWH::HPWHinit_resTank(double tankVol_L, + double energyFactor, + double upperPower_W, + double lowerPower_W) +{ + + setAllDefaults(); // reset all defaults if you're re-initilizing + // sets simHasFailed = true; this gets cleared on successful completion of init + // return 0 on success, HPWH_ABORT for failure + + heatSources.clear(); + + // low power element will cause divide by zero/negative UA in EF -> UA conversion + if (lowerPower_W < 550) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Resistance tank lower element wattage below 550 W. DOES NOT COMPUTE\n"); + } + return HPWH_ABORT; + } + if (upperPower_W < 0.) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Upper resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); + } + return HPWH_ABORT; + } + if (energyFactor <= 0.) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Energy Factor less than zero. DOES NOT COMPUTE\n"); + } + return HPWH_ABORT; + } + + setNumNodes(12); + + // use tank size setting function since it has bounds checking + tankSizeFixed = false; + int failure = this->setTankSize(tankVol_L); + if (failure == HPWH_ABORT) + { + return failure; + } + + setpoint_C = F_TO_C(127.0); + + // start tank off at setpoint + resetTankToSetpoint(); + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource resistiveElementBottom(this); + resistiveElementBottom.setupAsResistiveElement(0, lowerPower_W); + + // standard logic conditions + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40))); + resistiveElementBottom.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); + + if (upperPower_W > 0.) + { + // Only add an upper element when the upperPower_W > 0 otherwise ignore this. + // If the element is added this can mess with the intended logic. + HeatSource resistiveElementTop(this); + resistiveElementTop.setupAsResistiveElement(8, upperPower_W); + + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); + resistiveElementTop.isVIP = true; + + // set everything in it's correct place + heatSources.resize(2); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + + heatSources[0].followedByHeatSource = &heatSources[1]; + } + else + { + heatSources.resize(1); + heatSources[0] = resistiveElementBottom; + } + + // (1/EnFac - 1/RecovEff) / (67.5 * ((24/41094) - 1/(RecovEff * Power_btuperHr))) + // Previous comment and the equation source said (1/EnFac + 1/RecovEff) however this was + // determined to be a typo from the source that was kept in the comment. On 8/12/2021 + // the comment was changed to reflect the correct mathematical formulation which is performed + // below. + double recoveryEfficiency = 0.98; + double numerator = (1.0 / energyFactor) - (1.0 / recoveryEfficiency); + double temp = 1.0 / (recoveryEfficiency * lowerPower_W * 3.41443); + double denominator = 67.5 * ((24.0 / 41094.0) - temp); + tankUA_kJperHrC = UAf_TO_UAc(numerator / denominator); + + if (tankUA_kJperHrC < 0.) + { + if (hpwhVerbosity >= VRB_reluctant && tankUA_kJperHrC < -0.1) + { + msg("Computed tankUA_kJperHrC is less than 0, and is reset to 0."); + } + tankUA_kJperHrC = 0.0; + } + + hpwhModel = MODELS_CustomResTank; + + // calculate oft-used derived values + calcDerivedValues(); + + if (checkInputs() == HPWH_ABORT) + return HPWH_ABORT; + + isHeating = false; + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isOn) + { + isHeating = true; + } + heatSources[i].sortPerformanceMap(); + } + + if (hpwhVerbosity >= VRB_emetic) + { + for (int i = 0; i < getNumHeatSources(); i++) + { + msg("heat source %d: %p \n", i, &heatSources[i]); + } + msg("\n\n"); + } + + simHasFailed = false; + return 0; // successful init returns 0 } - -int HPWH::HPWHinit_resTankGeneric(double tankVol_L, double rValue_M2KperW, double upperPower_W, double lowerPower_W) { - - setAllDefaults(); // reset all defaults if you're re-initilizing - // sets simHasFailed = true; this gets cleared on successful completion of init - // return 0 on success, HPWH_ABORT for failure - heatSources.clear(); - - //low power element will cause divide by zero/negative UA in EF -> UA conversion - if (lowerPower_W < 0) { - if (hpwhVerbosity >= VRB_reluctant) { - msg("Lower resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); - } - return HPWH_ABORT; - } - if (upperPower_W < 0.) { - if (hpwhVerbosity >= VRB_reluctant) { - msg("Upper resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); - } - return HPWH_ABORT; - } - if (rValue_M2KperW <= 0.) { - if (hpwhVerbosity >= VRB_reluctant) { - msg("R-Value is equal to or below 0. DOES NOT COMPUTE\n"); - } - return HPWH_ABORT; - } - - setNumNodes(12); - - //set tank size function has bounds checking - tankSizeFixed = false; - if (this->setTankSize(tankVol_L) == HPWH_ABORT) { - return HPWH_ABORT; - } - canScale = true; - - setpoint_C = F_TO_C(127.0); - resetTankToSetpoint(); //start tank off at setpoint - - doTempDepression = false; - tankMixesOnDraw = true; - - // Deal with upper element - if (upperPower_W > 0.) { - // Only add an upper element when the upperPower_W > 0 otherwise ignore this. - // If the element is added this can mess with the intended logic. - HeatSource resistiveElementTop(this); - resistiveElementTop.setupAsResistiveElement(8, upperPower_W); - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); - resistiveElementTop.isVIP = true; - - // Upper should always be first in heatSources if it exists. - heatSources.push_back(resistiveElementTop); - } - - // Deal with bottom element - if (lowerPower_W > 0.) { - HeatSource resistiveElementBottom(this); - resistiveElementBottom.setupAsResistiveElement(0, lowerPower_W); - - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40.))); - resistiveElementBottom.addTurnOnLogic(HPWH::standby(dF_TO_dC(10.))); - - // set everything in it's correct place - heatSources.push_back(resistiveElementBottom); - } - - if (getNumHeatSources() == 2) { - heatSources[0].followedByHeatSource = &heatSources[1]; - } - - // Calc UA - double SA_M2 = getTankSurfaceArea(tankVol_L, HPWH::UNITS_L, HPWH::UNITS_M2); - double tankUA_WperK = SA_M2 / rValue_M2KperW; - tankUA_kJperHrC = tankUA_WperK * 3.6; // 3.6 = 3600 S/Hr and 1/1000 kJ/J - - if (tankUA_kJperHrC < 0.) { - if (hpwhVerbosity >= VRB_reluctant && tankUA_kJperHrC < -0.1) { - msg("Computed tankUA_kJperHrC is less than 0, and is reset to 0."); - } - tankUA_kJperHrC = 0.0; - } - - hpwhModel = HPWH::MODELS_CustomResTankGeneric; - - //calculate oft-used derived values - calcDerivedValues(); - - if (checkInputs() == HPWH_ABORT) return HPWH_ABORT; - - isHeating = false; - for (auto &source: heatSources) { - if (source.isOn) { - isHeating = true; - } - source.sortPerformanceMap(); - } - - if (hpwhVerbosity >= VRB_emetic) { - for (int i = 0; i < getNumHeatSources(); i++) { - msg("heat source %d: %p \n", i, &heatSources[i]); - } - msg("\n\n"); - } - - simHasFailed = false; - return 0; //successful init returns 0 +int HPWH::HPWHinit_resTankGeneric(double tankVol_L, + double rValue_M2KperW, + double upperPower_W, + double lowerPower_W) +{ + + setAllDefaults(); // reset all defaults if you're re-initilizing + // sets simHasFailed = true; this gets cleared on successful completion of init + // return 0 on success, HPWH_ABORT for failure + heatSources.clear(); + + // low power element will cause divide by zero/negative UA in EF -> UA conversion + if (lowerPower_W < 0) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Lower resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); + } + return HPWH_ABORT; + } + if (upperPower_W < 0.) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Upper resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); + } + return HPWH_ABORT; + } + if (rValue_M2KperW <= 0.) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("R-Value is equal to or below 0. DOES NOT COMPUTE\n"); + } + return HPWH_ABORT; + } + + setNumNodes(12); + + // set tank size function has bounds checking + tankSizeFixed = false; + if (this->setTankSize(tankVol_L) == HPWH_ABORT) + { + return HPWH_ABORT; + } + canScale = true; + + setpoint_C = F_TO_C(127.0); + resetTankToSetpoint(); // start tank off at setpoint + + doTempDepression = false; + tankMixesOnDraw = true; + + // Deal with upper element + if (upperPower_W > 0.) + { + // Only add an upper element when the upperPower_W > 0 otherwise ignore this. + // If the element is added this can mess with the intended logic. + HeatSource resistiveElementTop(this); + resistiveElementTop.setupAsResistiveElement(8, upperPower_W); + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); + resistiveElementTop.isVIP = true; + + // Upper should always be first in heatSources if it exists. + heatSources.push_back(resistiveElementTop); + } + + // Deal with bottom element + if (lowerPower_W > 0.) + { + HeatSource resistiveElementBottom(this); + resistiveElementBottom.setupAsResistiveElement(0, lowerPower_W); + + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40.))); + resistiveElementBottom.addTurnOnLogic(HPWH::standby(dF_TO_dC(10.))); + + // set everything in it's correct place + heatSources.push_back(resistiveElementBottom); + } + + if (getNumHeatSources() == 2) + { + heatSources[0].followedByHeatSource = &heatSources[1]; + } + + // Calc UA + double SA_M2 = getTankSurfaceArea(tankVol_L, HPWH::UNITS_L, HPWH::UNITS_M2); + double tankUA_WperK = SA_M2 / rValue_M2KperW; + tankUA_kJperHrC = tankUA_WperK * 3.6; // 3.6 = 3600 S/Hr and 1/1000 kJ/J + + if (tankUA_kJperHrC < 0.) + { + if (hpwhVerbosity >= VRB_reluctant && tankUA_kJperHrC < -0.1) + { + msg("Computed tankUA_kJperHrC is less than 0, and is reset to 0."); + } + tankUA_kJperHrC = 0.0; + } + + hpwhModel = HPWH::MODELS_CustomResTankGeneric; + + // calculate oft-used derived values + calcDerivedValues(); + + if (checkInputs() == HPWH_ABORT) + return HPWH_ABORT; + + isHeating = false; + for (auto& source : heatSources) + { + if (source.isOn) + { + isHeating = true; + } + source.sortPerformanceMap(); + } + + if (hpwhVerbosity >= VRB_emetic) + { + for (int i = 0; i < getNumHeatSources(); i++) + { + msg("heat source %d: %p \n", i, &heatSources[i]); + } + msg("\n\n"); + } + + simHasFailed = false; + return 0; // successful init returns 0 } -int HPWH::HPWHinit_genericHPWH(double tankVol_L, double energyFactor, double resUse_C) { - - setAllDefaults(); // reset all defaults if you're re-initilizing - // sets simHasFailed = true; this gets cleared on successful completion of init - // return 0 on success, HPWH_ABORT for failure - heatSources.clear(); - - //except where noted, these values are taken from MODELS_GE2014STDMode on 5/17/16 - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - //start tank off at setpoint - resetTankToSetpoint(); - - tankSizeFixed = false; - - //custom settings - these are set later - //tankVolume_L = GAL_TO_L(45); - //tankUA_kJperHrC = 6.5; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(45.); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - //this is set customly, from input - //resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(19.6605))); - resistiveElementTop.addTurnOnLogic(HPWH::topThird(resUse_C)); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(86.1111))); - - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(12.392))); - - //custom adjustment for poorer performance - //compressor.addShutOffLogic(HPWH::lowT(F_TO_C(37))); - // - //end section of parameters from GE model - - //set tank volume from input - //use tank size setting function since it has bounds checking - int failure = this->setTankSize(tankVol_L); - if (failure == HPWH_ABORT) { - if (hpwhVerbosity >= VRB_reluctant) { - msg("Failure to set tank size in generic hpwh init."); - } - return failure; - } - - // derive conservative (high) UA from tank volume - // curve fit by Jim Lutz, 5-25-2016 - double tankVol_gal = tankVol_L / GAL_TO_L(1.); - double v1 = 7.5156316175 * pow(tankVol_gal, 0.33) + 5.9995357658; - tankUA_kJperHrC = 0.0076183819 * v1 * v1; - - //do a linear interpolation to scale COP curve constant, using measured values - // Chip's attempt 24-May-2014 - double uefSpan = 3.4 - 2.0; - - //force COP to be 70% of GE at UEF 2 and 95% at UEF 3.4 - //use a fudge factor to scale cop and input power in tandem to maintain constant capacity - double fUEF = (energyFactor - 2.0) / uefSpan; - double genericFudge = (1. - fUEF)*.7 + fUEF * .95; - - compressor.perfMap[0].COP_coeffs[0] *= genericFudge; - compressor.perfMap[0].COP_coeffs[1] *= genericFudge; - compressor.perfMap[0].COP_coeffs[2] *= genericFudge; - - compressor.perfMap[1].COP_coeffs[0] *= genericFudge; - compressor.perfMap[1].COP_coeffs[1] *= genericFudge; - compressor.perfMap[1].COP_coeffs[2] *= genericFudge; - - compressor.perfMap[0].inputPower_coeffs[0] /= genericFudge; - compressor.perfMap[0].inputPower_coeffs[1] /= genericFudge; - compressor.perfMap[0].inputPower_coeffs[2] /= genericFudge; - - compressor.perfMap[1].inputPower_coeffs[0] /= genericFudge; - compressor.perfMap[1].inputPower_coeffs[1] /= genericFudge; - compressor.perfMap[1].inputPower_coeffs[2] /= genericFudge; - - //set everything in its place - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - //standard finishing up init, borrowed from init function - - hpwhModel = MODELS_genericCustomUEF; - - //calculate oft-used derived values - calcDerivedValues(); - - if (checkInputs() == HPWH_ABORT) { - return HPWH_ABORT; - } - - isHeating = false; - for (int i = 0; i < getNumHeatSources(); i++) { - if (heatSources[i].isOn) { - isHeating = true; - } - heatSources[i].sortPerformanceMap(); - } - - if (hpwhVerbosity >= VRB_emetic) { - for (int i = 0; i < getNumHeatSources(); i++) { - msg("heat source %d: %p \n", i, &heatSources[i]); - } - msg("\n\n"); - } - - simHasFailed = false; - - return 0; +int HPWH::HPWHinit_genericHPWH(double tankVol_L, double energyFactor, double resUse_C) +{ + + setAllDefaults(); // reset all defaults if you're re-initilizing + // sets simHasFailed = true; this gets cleared on successful completion of init + // return 0 on success, HPWH_ABORT for failure + heatSources.clear(); + + // except where noted, these values are taken from MODELS_GE2014STDMode on 5/17/16 + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + // start tank off at setpoint + resetTankToSetpoint(); + + tankSizeFixed = false; + + // custom settings - these are set later + // tankVolume_L = GAL_TO_L(45); + // tankUA_kJperHrC = 6.5; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(45.); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + // this is set customly, from input + // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(19.6605))); + resistiveElementTop.addTurnOnLogic(HPWH::topThird(resUse_C)); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(86.1111))); + + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(12.392))); + + // custom adjustment for poorer performance + // compressor.addShutOffLogic(HPWH::lowT(F_TO_C(37))); + // + // end section of parameters from GE model + + // set tank volume from input + // use tank size setting function since it has bounds checking + int failure = this->setTankSize(tankVol_L); + if (failure == HPWH_ABORT) + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Failure to set tank size in generic hpwh init."); + } + return failure; + } + + // derive conservative (high) UA from tank volume + // curve fit by Jim Lutz, 5-25-2016 + double tankVol_gal = tankVol_L / GAL_TO_L(1.); + double v1 = 7.5156316175 * pow(tankVol_gal, 0.33) + 5.9995357658; + tankUA_kJperHrC = 0.0076183819 * v1 * v1; + + // do a linear interpolation to scale COP curve constant, using measured values + // Chip's attempt 24-May-2014 + double uefSpan = 3.4 - 2.0; + + // force COP to be 70% of GE at UEF 2 and 95% at UEF 3.4 + // use a fudge factor to scale cop and input power in tandem to maintain constant capacity + double fUEF = (energyFactor - 2.0) / uefSpan; + double genericFudge = (1. - fUEF) * .7 + fUEF * .95; + + compressor.perfMap[0].COP_coeffs[0] *= genericFudge; + compressor.perfMap[0].COP_coeffs[1] *= genericFudge; + compressor.perfMap[0].COP_coeffs[2] *= genericFudge; + + compressor.perfMap[1].COP_coeffs[0] *= genericFudge; + compressor.perfMap[1].COP_coeffs[1] *= genericFudge; + compressor.perfMap[1].COP_coeffs[2] *= genericFudge; + + compressor.perfMap[0].inputPower_coeffs[0] /= genericFudge; + compressor.perfMap[0].inputPower_coeffs[1] /= genericFudge; + compressor.perfMap[0].inputPower_coeffs[2] /= genericFudge; + + compressor.perfMap[1].inputPower_coeffs[0] /= genericFudge; + compressor.perfMap[1].inputPower_coeffs[1] /= genericFudge; + compressor.perfMap[1].inputPower_coeffs[2] /= genericFudge; + + // set everything in its place + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + // standard finishing up init, borrowed from init function + + hpwhModel = MODELS_genericCustomUEF; + + // calculate oft-used derived values + calcDerivedValues(); + + if (checkInputs() == HPWH_ABORT) + { + return HPWH_ABORT; + } + + isHeating = false; + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isOn) + { + isHeating = true; + } + heatSources[i].sortPerformanceMap(); + } + + if (hpwhVerbosity >= VRB_emetic) + { + for (int i = 0; i < getNumHeatSources(); i++) + { + msg("heat source %d: %p \n", i, &heatSources[i]); + } + msg("\n\n"); + } + + simHasFailed = false; + + return 0; } +int HPWH::HPWHinit_presets(MODELS presetNum) +{ -int HPWH::HPWHinit_presets(MODELS presetNum) { - - setAllDefaults(); // reset all defaults if you're re-initilizing - // sets simHasFailed = true; this gets cleared on successful completion of init - // return 0 on success, HPWH_ABORT for failure - - heatSources.clear(); - - bool hasInitialTankTemp = false; - double initialTankT_C = F_TO_C(120.); - - //resistive with no UA losses for testing - if (presetNum == MODELS_restankNoUA) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankSizeFixed = false; - tankVolume_L = GAL_TO_L(50); - tankUA_kJperHrC = 0; //0 to turn off - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementTop.setupAsResistiveElement(8, 4500); - - //standard logic conditions - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40))); - resistiveElementBottom.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); - resistiveElementTop.isVIP = true; - - //assign heat sources into array in order of priority - //set everything in its places - heatSources.resize(2); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - - heatSources[0].followedByHeatSource = &heatSources[1]; - } - - //resistive tank with massive UA loss for testing - else if (presetNum == MODELS_restankHugeUA) { - setNumNodes(12); - setpoint_C = 50; - - tankSizeFixed = false; - tankVolume_L = 120; - tankUA_kJperHrC = 500; //0 to turn off - - doTempDepression = false; - tankMixesOnDraw = false; - - //set up a resistive element at the bottom, 4500 kW - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementTop.setupAsResistiveElement(9, 4500); - - //standard logic conditions - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(20)); - resistiveElementBottom.addTurnOnLogic(HPWH::standby(15)); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(20)); - resistiveElementTop.isVIP = true; - - //assign heat sources into array in order of priority - heatSources.resize(2); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - - heatSources[0].followedByHeatSource = &heatSources[1]; - } - - //realistic resistive tank - else if (presetNum == MODELS_restankRealistic) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankSizeFixed = false; - tankVolume_L = GAL_TO_L(50); - tankUA_kJperHrC = 10; //0 to turn off - - doTempDepression = false; - //should eventually put tankmixes to true when testing progresses - tankMixesOnDraw = false; - - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementTop.setupAsResistiveElement(9, 4500); - - //standard logic conditions - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(20)); - resistiveElementBottom.addTurnOnLogic(HPWH::standby(15)); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(20)); - resistiveElementTop.isVIP = true; - - //set everything in its place - heatSources.resize(2); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - - heatSources[0].followedByHeatSource = &heatSources[1]; - } - - else if (presetNum == MODELS_StorageTank) { - setNumNodes(12); - setpoint_C = 800.; - - initialTankT_C = F_TO_C(127.); - hasInitialTankTemp = true; - - tankSizeFixed = false; - tankVolume_L = GAL_TO_L(80); - tankUA_kJperHrC = 10; //0 to turn off - - doTempDepression = false; - tankMixesOnDraw = false; - } + setAllDefaults(); // reset all defaults if you're re-initilizing + // sets simHasFailed = true; this gets cleared on successful completion of init + // return 0 on success, HPWH_ABORT for failure - //basic compressor tank for testing - else if (presetNum == MODELS_basicIntegrated) { - setNumNodes(12); - setpoint_C = 50; + heatSources.clear(); - tankSizeFixed = false; - tankVolume_L = 120; - tankUA_kJperHrC = 10; //0 to turn off - //tankUA_kJperHrC = 0; //0 to turn off + bool hasInitialTankTemp = false; + double initialTankT_C = F_TO_C(120.); - doTempDepression = false; - tankMixesOnDraw = false; + // resistive with no UA losses for testing + if (presetNum == MODELS_restankNoUA) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - HeatSource compressor(this); + tankSizeFixed = false; + tankVolume_L = GAL_TO_L(50); + tankUA_kJperHrC = 0; // 0 to turn off - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementTop.setupAsResistiveElement(9, 4500); + doTempDepression = false; + tankMixesOnDraw = true; - resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); - //standard logic conditions - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(20)); - resistiveElementBottom.addTurnOnLogic(HPWH::standby(15)); + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementTop.setupAsResistiveElement(8, 4500); - resistiveElementTop.addTurnOnLogic(HPWH::topThird(20)); - resistiveElementTop.isVIP = true; + // standard logic conditions + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40))); + resistiveElementBottom.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); + resistiveElementTop.isVIP = true; - //double oneSixth = 1.0 / 6.0; - compressor.setCondensity({1., 0.}); + // assign heat sources into array in order of priority + // set everything in its places + heatSources.resize(2); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; - //GE tier 1 values - compressor.perfMap.reserve(2); + heatSources[0].followedByHeatSource = &heatSources[1]; + } - compressor.perfMap.push_back({ - 47, // Temperature (T_F) - {0.290 * 1000, 0.00159 * 1000, 0.00000107 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {4.49, -0.0187, -0.0000133} // COP Coefficients (COP_coeffs) - }); + // resistive tank with massive UA loss for testing + else if (presetNum == MODELS_restankHugeUA) + { + setNumNodes(12); + setpoint_C = 50; - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {0.375 * 1000, 0.00121 * 1000, 0.00000216 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {5.60, -0.0252, 0.00000254} // COP Coefficients (COP_coeffs) - }); + tankSizeFixed = false; + tankVolume_L = 120; + tankUA_kJperHrC = 500; // 0 to turn off - compressor.minT = 0; - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(4); - compressor.configuration = HeatSource::CONFIG_WRAPPED; //wrapped around tank - compressor.maxSetpoint_C = MAXOUTLET_R134A; + doTempDepression = false; + tankMixesOnDraw = false; - compressor.addTurnOnLogic(HPWH::bottomThird(20)); - compressor.addTurnOnLogic(HPWH::standby(15)); + // set up a resistive element at the bottom, 4500 kW + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); - //set everything in its place - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = compressor; - heatSources[2] = resistiveElementBottom; + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementTop.setupAsResistiveElement(9, 4500); - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - - //simple external style for testing - else if (presetNum == MODELS_externalTest) { - setNumNodes(96); - setpoint_C = 50; - - tankSizeFixed = false; - tankVolume_L = 120; - //tankUA_kJperHrC = 10; //0 to turn off - tankUA_kJperHrC = 0; //0 to turn off - - doTempDepression = false; - tankMixesOnDraw = false; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - - //GE tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 47, // Temperature (T_F) - {0.290 * 1000, 0.00159 * 1000, 0.00000107 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {4.49, -0.0187, -0.0000133} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {0.375 * 1000, 0.00121 * 1000, 0.00000216 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {5.60, -0.0252, 0.00000254} // COP Coefficients (COP_coeffs) - }); - - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = 0; //no hysteresis - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.isMultipass = false; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - compressor.addTurnOnLogic(HPWH::bottomThird(20)); - compressor.addTurnOnLogic(HPWH::standby(15)); - - //lowT cutoff - compressor.addShutOffLogic(HPWH::bottomNodeMaxTemp(20, true)); - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - //voltex 60 gallon - else if (presetNum == MODELS_AOSmithPHPT60) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = 215.8; - tankUA_kJperHrC = 7.31; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - double split = 1.0 / 5.0; - compressor.setCondensity({split, split, split, split, split, 0, 0, 0, 0, 0, 0, 0}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 47, // Temperature (T_F) - {0.467 * 1000, 0.00281 * 1000, 0.0000072 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {4.86, -0.0222, -0.00001} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {0.541 * 1000, 0.00147 * 1000, 0.0000176 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {6.58, -0.0392, 0.0000407} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(45.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(4); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(8, 4250); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 2000); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); - - //logic conditions - double compStart = dF_TO_dC(43.6); - double standbyT = dF_TO_dC(23.8); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(compStart)); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(25.0))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = compressor; - heatSources[2] = resistiveElementBottom; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_AOSmithPHPT80) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = 283.9; - tankUA_kJperHrC = 8.8; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - double split = 1.0 / 5.0; - compressor.setCondensity({split, split, split, split, split, 0, 0, 0, 0, 0, 0, 0}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 47, // Temperature (T_F) - {0.467 * 1000, 0.00281 * 1000, 0.0000072 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {4.86, -0.0222, -0.00001} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {0.541 * 1000, 0.00147 * 1000, 0.0000176 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {6.58, -0.0392, 0.0000407} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(45.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(4); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(8, 4250); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 2000); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); - - - //logic conditions - double compStart = dF_TO_dC(43.6); - double standbyT = dF_TO_dC(23.8); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(compStart)); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(25.0))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = compressor; - heatSources[2] = resistiveElementBottom; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_GE2012) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = 172; - tankUA_kJperHrC = 6.8; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - double split = 1.0 / 5.0; - compressor.setCondensity({split, split, split, split, split, 0, 0, 0, 0, 0, 0, 0}); - - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 47, // Temperature (T_F) - {0.3 * 1000, 0.00159 * 1000, 0.00000107 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {4.7, -0.0210, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {0.378 * 1000, 0.00121 * 1000, 0.00000216 * 1000}, // Input Power Coefficients (inputPower_coeffs) - {4.8, -0.0167, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(45.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(4); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(8, 4200); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4200); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); - - - //logic conditions - // double compStart = dF_TO_dC(24.4); - double compStart = dF_TO_dC(40.0); - double standbyT = dF_TO_dC(5.2); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - // compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(66))); - compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(65))); - - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(compStart)); - //resistiveElementBottom.addShutOffLogic(HPWH::lowTreheat(lowTcutoff)); - //GE element never turns off? - - // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(31.0))); - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(28.0))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = compressor; - heatSources[2] = resistiveElementBottom; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - } - // If a Colmac single pass preset cold weather or not - else if (MODELS_ColmacCxV_5_SP <= presetNum && presetNum <= MODELS_ColmacCxA_30_SP) { - setNumNodes(96); - setpoint_C = F_TO_C(135.0); - tankSizeFixed = false; - - doTempDepression = false; - tankMixesOnDraw = false; - - tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important - tankUA_kJperHrC = 7; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.isMultipass = false; - compressor.perfMap.reserve(1); - compressor.hysteresis_dC = 0; - - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = getNumNodes() - 1; - - //logic conditions - std::vector nodeWeights; - nodeWeights.emplace_back(4); - compressor.addTurnOnLogic(std::make_shared("fourth node", nodeWeights, dF_TO_dC(15), this)); - - //lowT cutoff - std::vector nodeWeights1; - nodeWeights1.emplace_back(1); - compressor.addShutOffLogic(std::make_shared("bottom node", nodeWeights1, dF_TO_dC(15.), - this, false, std::greater(), true)); - compressor.depressesTemperature = false; //no temp depression - - //Defrost Derate - compressor.setupDefrostMap(); - - if (presetNum == MODELS_ColmacCxV_5_SP) { - setTankSize_adjustUA(200., UNITS_GAL); - //logic conditions - compressor.minT = F_TO_C(-4.0); - compressor.maxSetpoint_C = MAXOUTLET_R410A; - - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 4.9621645063, -0.0096084144, -0.0095647009, -0.0115911960, -0.0000788517, 0.0000886176, - 0.0001114142, 0.0001832377, -0.0000451308, 0.0000411975, 0.0000003535}, // Input Power Coefficients (inputPower_coeffs) - - { 3.8189922420, 0.0569412237, -0.0320101962, -0.0012859036, 0.0000576439, 0.0001101241, - -0.0000352368, -0.0002630301, -0.0000509365, 0.0000369655, -0.0000000606} // COP Coefficients (COP_coeffs) - }); - } - else { - //logic conditions - compressor.minT = F_TO_C(40.); - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - if (presetNum == MODELS_ColmacCxA_10_SP) { - setTankSize_adjustUA(500., UNITS_GAL); - - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 5.9786974243, 0.0194445115, -0.0077802278, 0.0053809029, -0.0000334832, 0.0001864310, 0.0001190540, - 0.0000040405, -0.0002538279, -0.0000477652, 0.0000014101}, // Input Power Coefficients (inputPower_coeffs) - - { 3.6128563086, 0.0527064498, -0.0278198945, -0.0070529748, 0.0000934705, 0.0000781711, -0.0000359215, - -0.0002223206, 0.0000359239, 0.0000727189, -0.0000005037} // COP Coefficients (COP_coeffs) - }); - - } - else if (presetNum == MODELS_ColmacCxA_15_SP) { - setTankSize_adjustUA(600., UNITS_GAL); - - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 15.5869846555, -0.0044503761, -0.0577941202, -0.0286911185, -0.0000803325, 0.0003399817, - 0.0002009576, 0.0002494761, -0.0000595773, 0.0001401800, 0.0000004312}, // Input Power Coefficients (inputPower_coeffs) - - { 1.6643120405, 0.0515623393, -0.0110239930, 0.0041514430, 0.0000481544, 0.0000493424, - -0.0000262721, -0.0002356218, -0.0000989625, -0.0000070572, 0.0000004108} // COP Coefficients (COP_coeffs) - }); - - } - else if (presetNum == MODELS_ColmacCxA_20_SP) { - setTankSize_adjustUA(800., UNITS_GAL); - - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 23.0746692231, 0.0248584608, -0.1417927282, -0.0253733303, -0.0004882754, 0.0006508079, - 0.0002139934, 0.0005552752, -0.0002026772, 0.0000607338, 0.0000021571}, // Input Power Coefficients (inputPower_coeffs) - - { 1.7692660120, 0.0525134783, -0.0081102040, -0.0008715405, 0.0001274956, 0.0000369489, - -0.0000293775, -0.0002778086, -0.0000095067, 0.0000381186, -0.0000003135} // COP Coefficients (COP_coeffs) - }); - - } - else if (presetNum == MODELS_ColmacCxA_25_SP) { - setTankSize_adjustUA(1000., UNITS_GAL); - - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 20.4185336541, -0.0236920615, -0.0736219119, -0.0260385082, -0.0005048074, 0.0004940510, - 0.0002632660, 0.0009820050, -0.0000223587, 0.0000885101, 0.0000005649}, // Input Power Coefficients (inputPower_coeffs) - - { 0.8942843854, 0.0677641611, -0.0001582927, 0.0048083998, 0.0001196407, 0.0000334921, - -0.0000378740, -0.0004146401, -0.0001213363, -0.0000031856, 0.0000006306} // COP Coefficients (COP_coeffs) - }); - - } - else if (presetNum == MODELS_ColmacCxA_30_SP) { - setTankSize_adjustUA(1200., UNITS_GAL); - - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 11.3687485772, -0.0207292362, 0.0496254077, -0.0038394967, -0.0005991041, 0.0001304318, - 0.0003099774, 0.0012092717, -0.0001455509, -0.0000893889, 0.0000018221}, // Input Power Coefficients (inputPower_coeffs) - - { 4.4170108542, 0.0596384263, -0.0416104579, -0.0017199887, 0.0000774664, 0.0001521934, - -0.0000251665, -0.0003289731, -0.0000801823, 0.0000325972, 0.0000002705} // COP Coefficients (COP_coeffs) - }); - } - } //End if MODELS_ColmacCxV_5_SP - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - - - // if colmac multipass - else if (MODELS_ColmacCxV_5_MP <= presetNum && presetNum <= MODELS_ColmacCxA_30_MP) { - setNumNodes(24); - setpoint_C = F_TO_C(135.0); - tankSizeFixed = false; - - doTempDepression = false; - tankMixesOnDraw = false; - - tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important - tankUA_kJperHrC = 7; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.perfMap.reserve(1); - compressor.hysteresis_dC = 0; - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = static_cast(getNumNodes() / 3) - 1; - - //logic conditions - std::vector nodeWeights; - nodeWeights.emplace_back(4); - compressor.addTurnOnLogic(std::make_shared("fourth node", nodeWeights, dF_TO_dC(5.), this)); - - std::vector nodeWeights1; - nodeWeights1.emplace_back(4); - compressor.addShutOffLogic(std::make_shared("fourth node", nodeWeights1, dF_TO_dC(0.), this, false, std::greater())); - - compressor.depressesTemperature = false; //no temp depression - - //Defrost Derate - compressor.setupDefrostMap(); - - if (presetNum == MODELS_ColmacCxV_5_MP) { - setTankSize_adjustUA(200., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(9.); //https://colmacwaterheat.com/wp-content/uploads/2020/10/Technical-Datasheet-Air-Source.pdf - - //logic conditions - compressor.minT = F_TO_C(-4.0); - compressor.maxT = F_TO_C(105.); - compressor.maxSetpoint_C = MAXOUTLET_R410A; - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 5.8438525529, 0.0003288231, -0.0494255840, -0.0000386642, 0.0004385362, 0.0000647268}, // Input Power Coefficients (inputPower_coeffs) - - { 0.6679056901, 0.0499777846, 0.0251828292, 0.0000699764, -0.0001552229, -0.0002911167} // COP Coefficients (COP_coeffs) - }); - } - else { - //logic conditions - compressor.minT = F_TO_C(40.); - compressor.maxT = F_TO_C(105.); - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - if (presetNum == MODELS_ColmacCxA_10_MP) { - setTankSize_adjustUA(500., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(18.); - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 8.6918824405, 0.0136666667, -0.0548348214, -0.0000208333, 0.0005301339, -0.0000250000}, // Input Power Coefficients (inputPower_coeffs) - - { 0.6944181117, 0.0445926666, 0.0213188804, 0.0001172913, -0.0001387694, -0.0002365885} // COP Coefficients (COP_coeffs) - }); - - } - else if (presetNum == MODELS_ColmacCxA_15_MP) { - setTankSize_adjustUA(600., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(26.); - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 12.4908723958, 0.0073988095, -0.0411417411, 0.0000000000, 0.0005789621, 0.0000696429}, // Input Power Coefficients (inputPower_coeffs) - - { 1.2846349520, 0.0334658309, 0.0019121906, 0.0002840970, 0.0000497136, -0.0004401737} // COP Coefficients (COP_coeffs) - - }); - - } - else if (presetNum == MODELS_ColmacCxA_20_MP) { - setTankSize_adjustUA(800., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(36.); //https://colmacwaterheat.com/wp-content/uploads/2020/10/Technical-Datasheet-Air-Source.pdf - - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 14.4893345424, 0.0355357143, -0.0476593192, -0.0002916667, 0.0006120954, 0.0003607143}, // Input Power Coefficients (inputPower_coeffs) - - { 1.2421582831, 0.0450256569, 0.0051234755, 0.0001271296, -0.0000299981, -0.0002910606} // COP Coefficients (COP_coeffs) - }); - - } - else if (presetNum == MODELS_ColmacCxA_25_MP) { - setTankSize_adjustUA(1000., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(32.); - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 14.5805808222, 0.0081934524, -0.0216169085, -0.0001979167, 0.0007376535, 0.0004955357}, // Input Power Coefficients (inputPower_coeffs) - - { 2.0013175767, 0.0576617432, -0.0130480870, 0.0000856818, 0.0000610760, -0.0003684106} // COP Coefficients (COP_coeffs) - }); - - } - else if (presetNum == MODELS_ColmacCxA_30_MP) { - setTankSize_adjustUA(1200., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(41.); - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 14.5824911644, 0.0072083333, -0.0278055246, -0.0002916667, 0.0008841378, 0.0008125000}, // Input Power Coefficients (inputPower_coeffs) - - { 2.6996807527, 0.0617507969, -0.0220966420, 0.0000336149, 0.0000890989, -0.0003682431} // COP Coefficients (COP_coeffs) - }); - } - } - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - // If Nyle single pass preset - else if (MODELS_NyleC25A_SP <= presetNum && presetNum <= MODELS_NyleC250A_C_SP) { - setNumNodes(96); - setpoint_C = F_TO_C(135.0); - tankSizeFixed = false; - - tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important - tankUA_kJperHrC = 7; - - doTempDepression = false; - tankMixesOnDraw = false; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.extrapolationMethod = EXTRAP_NEAREST; - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.isMultipass = false; - compressor.perfMap.reserve(1); - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = getNumNodes() - 1; - - //logic conditions - if (MODELS_NyleC25A_SP <= presetNum && presetNum <= MODELS_NyleC250A_SP) {// If not cold weather package - compressor.minT = F_TO_C(40.); // Min air temperature sans Cold Weather Package - } - else { - compressor.minT = F_TO_C(35.);// Min air temperature WITH Cold Weather Package - } - compressor.maxT = F_TO_C(120.0); // Max air temperature - compressor.hysteresis_dC = 0; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - // Defines the maximum outlet temperature at the a low air temperature - compressor.maxOut_at_LowT.outT_C = F_TO_C(140.); - compressor.maxOut_at_LowT.airT_C = F_TO_C(40.); - - std::vector nodeWeights; - nodeWeights.emplace_back(4); - compressor.addTurnOnLogic(std::make_shared("fourth node", nodeWeights, dF_TO_dC(15), this, false)); - - //lowT cutoff - std::vector nodeWeights1; - nodeWeights1.emplace_back(1); - compressor.addShutOffLogic(std::make_shared("bottom node", nodeWeights1, dF_TO_dC(15.), this, false, - std::greater(), true)); - compressor.depressesTemperature = false; //no temp depression - - //Defrost Derate - compressor.setupDefrostMap(); - - //Perfmaps for each compressor size - if (presetNum == MODELS_NyleC25A_SP) { - setTankSize_adjustUA(200., UNITS_GAL); - compressor.perfMap.push_back({ - 90, // Temperature (T_F) - - {4.060120364 ,-0.020584279,-0.024201054,-0.007023945,0.000017461,0.000110366,0.000060338, - 0.000120015,0.000111068,0.000138907,-0.000001569}, // Input Power Coefficients (inputPower_coeffs) - - {0.462979529,0.065656840,0.001077377,0.003428059,0.000243692,0.000021522,0.000005143, - -0.000384778,-0.000404744,-0.000036277, 0.000001900 } // COP Coefficients (COP_coeffs) - }); - } - else if (presetNum == MODELS_NyleC60A_SP || presetNum == MODELS_NyleC60A_C_SP) { - setTankSize_adjustUA(300., UNITS_GAL); - compressor.perfMap.push_back({ - 90, // Temperature (T_F) - - {-0.1180905709,0.0045354306,0.0314990479,-0.0406839757,0.0002355294,0.0000818684,0.0001943834, - -0.0002160871,0.0003053633,0.0003612413,-0.0000035912}, // Input Power Coefficients (inputPower_coeffs) - - {6.8205043418,0.0860385185,-0.0748330699,-0.0172447955,0.0000510842,0.0002187441,-0.0000321036, - -0.0003311463,-0.0002154270,0.0001307922,0.0000005568} // COP Coefficients (COP_coeffs) - }); - } - else if (presetNum == MODELS_NyleC90A_SP || presetNum == MODELS_NyleC90A_C_SP) { - setTankSize_adjustUA(400., UNITS_GAL); - compressor.perfMap.push_back({ - 90, // Temperature (T_F) - - {13.27612215047,-0.01014009337,-0.13401028549,-0.02325705976,-0.00032515646,0.00040270625, - 0.00001988733,0.00069451670,0.00069067890,0.00071091372,-0.00000854352}, // Input Power Coefficients (inputPower_coeffs) - - {1.49112327987,0.06616282153,0.00715307252,-0.01269458185,0.00031448571,0.00001765313, - 0.00006002498,-0.00045661397,-0.00034003896,-0.00004327766,0.00000176015} // COP Coefficients (COP_coeffs) - }); - } - else if (presetNum == MODELS_NyleC125A_SP || presetNum == MODELS_NyleC125A_C_SP) { - setTankSize_adjustUA(500., UNITS_GAL); - compressor.perfMap.push_back({ - 90, // Temperature (T_F) - - {-3.558277209, -0.038590968, 0.136307181, -0.016945699,0.000983753, -5.18201E-05, - 0.000476904, -0.000514211, -0.000359172, 0.000266509, -1.58646E-07}, // Input Power Coefficients (inputPower_coeffs) - - {4.889555031, 0.117102769, -0.060005795, -0.011871234, -1.79926E-05, 0.000207293, - -1.4452E-05, -0.000492486, -0.000376814, 7.85911E-05, 1.47884E-06}// COP Coefficients (COP_coeffs) - }); - } - else if (presetNum == MODELS_NyleC185A_SP || presetNum == MODELS_NyleC185A_C_SP) { - setTankSize_adjustUA(800., UNITS_GAL); - compressor.perfMap.push_back({ - 90, // Temperature (T_F) - - {18.58007733, -0.215324777, -0.089782421, 0.01503161, 0.000332503, 0.000274216, - 2.70498E-05, 0.001387914, 0.000449199, 0.000829578, -5.28641E-06}, // Input Power Coefficients (inputPower_coeffs) - - {-0.629432348, 0.181466663, 0.00044047, 0.012104957, -6.61515E-05, 9.29975E-05, - 9.78042E-05, -0.000872708,-0.001013945, -0.00021852, 5.55444E-06}// COP Coefficients (COP_coeffs) - }); - } - else if (presetNum == MODELS_NyleC250A_SP || presetNum == MODELS_NyleC250A_C_SP) { - setTankSize_adjustUA(800., UNITS_GAL); - - compressor.perfMap.push_back({ - 90, // Temperature (T_F) - - {-13.89057656,0.025902417,0.304250541,0.061695153,-0.001474249,-0.001126845,-0.000220192, - 0.001241026,0.000571009,-0.000479282,9.04063E-06},// Input Power Coefficients (inputPower_coeffs) - - {7.443904067,0.185978755,-0.098481635,-0.002500073,0.000127658,0.000444321,0.000139547, - -0.001000195,-0.001140199,-8.77557E-05,4.87405E-06} // COP Coefficients (COP_coeffs) - }); - } - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - - // If Nyle multipass presets - else if (MODELS_NyleC60A_MP <= presetNum && presetNum <= MODELS_NyleC250A_C_MP) { - setNumNodes(24); - setpoint_C = F_TO_C(135.0); - tankSizeFixed = false; - - doTempDepression = false; - tankMixesOnDraw = false; - - tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important - tankUA_kJperHrC = 7; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.extrapolationMethod = EXTRAP_NEAREST; - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.hysteresis_dC = 0; - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = static_cast(getNumNodes() / 3.) - 1; - - //logic conditions//logic conditions - if (MODELS_NyleC60A_MP <= presetNum && presetNum <= MODELS_NyleC250A_MP) {// If not cold weather package - compressor.minT = F_TO_C(40.); // Min air temperature sans Cold Weather Package - } - else { - compressor.minT = F_TO_C(35.);// Min air temperature WITH Cold Weather Package - } - compressor.maxT = F_TO_C(130.0); // Max air temperature - compressor.maxSetpoint_C = F_TO_C(160.); - - std::vector nodeWeights; - nodeWeights.emplace_back(4); - compressor.addTurnOnLogic(std::make_shared("fourth node", nodeWeights, dF_TO_dC(5.), this)); - - std::vector nodeWeights1; - nodeWeights1.emplace_back(4); - compressor.addShutOffLogic(std::make_shared("fourth node", nodeWeights1, dF_TO_dC(0.), this, false, std::greater())); - compressor.depressesTemperature = false; //no temp depression - - //Defrost Derate - compressor.setupDefrostMap(); - - // Performance grid - compressor.perfGrid.reserve(2); - compressor.perfGridValues.reserve(2); - - // Nyle MP models are all on the same grid axes - compressor.perfGrid.push_back({ 40., 60., 80., 90. }); // Grid Axis 1 Tair (F) - compressor.perfGrid.push_back({ 40., 60., 80., 100., 130., 150. }); // Grid Axis 2 Tin (F) - - if (presetNum == MODELS_NyleC60A_MP || presetNum == MODELS_NyleC60A_C_MP) { - setTankSize_adjustUA(360., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(13.); - if (presetNum == MODELS_NyleC60A_C_MP) { - compressor.resDefrost = { - 4.5, // inputPwr_kW; - 5.0, // constTempLift_dF; - 40.0 // onBelowT_F - }; - } - // Grid values in long format, table 1, input power (W) - compressor.perfGridValues.push_back({ 3.64, 4.11, 4.86, 5.97, 8.68, 9.95, 3.72, 4.27, 4.99, 6.03, 8.55, 10.02, 3.98, 4.53, - 5.24, 6.24, 8.54, 9.55, 4.45, 4.68, 5.37, 6.34, 8.59, 9.55 - }); - // Grid values in long format, table 2, COP - compressor.perfGridValues.push_back({ 3.362637363, 2.917274939, 2.407407407, 1.907872697, 1.296082949, 1.095477387, 4.438172043, - 3.772833724, 3.132264529, 2.505804312, 1.678362573, 1.386227545, 5.467336683, 4.708609272, 3.921755725, 3.169871795, 2.165105386, - 1.860732984, 5.512359551, 5.153846154, 4.290502793, 3.417981073, 2.272409779, 1.927748691 - }); - } - else if (presetNum == MODELS_NyleC90A_MP || presetNum == MODELS_NyleC90A_C_MP) { - setTankSize_adjustUA(480., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(20.); - if (presetNum == MODELS_NyleC90A_C_MP) { - compressor.resDefrost = { - 5.4, // inputPwr_kW; - 5.0, // constTempLift_dF; - 40.0 // onBelowT_F - }; - } - // Grid values in long format, table 1, input power (W) - compressor.perfGridValues.push_back({ 4.41, 6.04, 7.24, 9.14, 12.23, 14.73, 4.78, 6.61, 7.74, 9.40, 12.47, 14.75, - 5.51, 6.66, 8.44, 9.95, 13.06, 15.35, 6.78, 7.79, 8.81, 10.01, 11.91, 13.35 - }); - // Grid values in long format, table 2, COP - compressor.perfGridValues.push_back({ 4.79138322, 3.473509934, 2.801104972, 2.177242888, 1.569910057, 1.272233537, 6.071129707, - 4.264750378, 3.536175711, 2.827659574, 2.036086608, 1.666440678, 7.150635209, 5.659159159, 4.305687204, 3.493467337, - 2.487748851, 2.018241042, 6.750737463, 5.604621309, 4.734392736, 3.94005994, 3.04534005, 2.558801498 - }); - - } - else if (presetNum == MODELS_NyleC125A_MP || presetNum == MODELS_NyleC125A_C_MP) { - setTankSize_adjustUA(600., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(28.); - if (presetNum == MODELS_NyleC125A_C_MP) { - compressor.resDefrost = { - 9.0, // inputPwr_kW; - 5.0, // constTempLift_dF; - 40.0 // onBelowT_F - }; - } - // Grid values in long format, table 1, input power (W) - compressor.perfGridValues.push_back({ 6.4, 7.72, 9.65, 12.54, 20.54, 24.69, 6.89, 8.28, 10.13, 12.85, 19.75, 24.39, - 7.69, 9.07, 10.87, 13.44, 19.68, 22.35, 8.58, 9.5, 11.27, 13.69, 19.72, 22.4 - }); - // Grid values in long format, table 2, COP - compressor.perfGridValues.push_back({ 4.2390625, 3.465025907, 2.718134715, 2.060606061, 1.247809153, 1.016605913, - 5.374455733, 4.352657005, 3.453109576, 2.645136187, 1.66278481, 1.307093071, 6.503250975, 5.276736494, 4.229070837, - 3.27827381, 2.113821138, 1.770469799, 6.657342657, 5.749473684, 4.612244898, 3.542731921, 2.221095335, 1.816964286 - }); - } - else if (presetNum == MODELS_NyleC185A_MP || presetNum == MODELS_NyleC185A_C_MP) { - setTankSize_adjustUA(960., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(40.); - if (presetNum == MODELS_NyleC185A_C_MP) { - compressor.resDefrost = { - 7.2, // inputPwr_kW; - 5.0, // constTempLift_dF; - 40.0 // onBelowTemp_F - }; - } - // Grid values in long format, table 1, input power (W) - compressor.perfGridValues.push_back({ 7.57, 11.66, 14.05, 18.3, 25.04, 30.48, 6.99, 10.46, 14.28, 18.19, 26.24, 32.32, - 7.87, 12.04, 15.02, 18.81, 25.99, 31.26, 8.15, 12.46, 15.17, 18.95, 26.23, 31.62 - }); - // Grid values in long format, table 2, COP - compressor.perfGridValues.push_back({ 5.531043593, 3.556603774, 2.918149466, 2.214754098, 1.590255591, 1.291010499, - 8.010014306, 5.258126195, 3.778711485, 2.916437603, 1.964176829, 1.56404703, 9.65819568, 6.200166113, 4.792276964, - 3.705475811, 2.561369758, 2.05950096, 10.26993865, 6.350722311, 5.04218853, 3.841688654, 2.574151735, 2.025616698 - }); - } - else if (presetNum == MODELS_NyleC250A_MP || presetNum == MODELS_NyleC250A_C_MP) { - setTankSize_adjustUA(960., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(50.); - if (presetNum == MODELS_NyleC250A_C_MP) { - compressor.resDefrost = { - 18.0, // inputPwr_kW; - 5.0, // constTempLift_dF; - 40.0 // onBelowT_F - }; - } - // Grid values in long format, table 1, input power (W) - compressor.perfGridValues.push_back({ 10.89, 12.23, 13.55, 14.58, 15.74, 16.72, 11.46, 13.76, 15.97, 17.79, - 20.56, 22.50, 10.36, 14.66, 18.07, 21.23, 25.81, 29.01, 8.67, 15.05, 18.76, 21.87, 26.63, 30.02 - }); - - // Grid values in long format, table 2, COP - compressor.perfGridValues.push_back({ 5.81818181, 4.50040883, 3.69667896, 3.12414266, 2.38500635, 1.93540669, - 7.24520069, 5.50145348, 4.39323732, 3.67734682, 2.73249027, 2.23911111, 10.6196911, 7.05320600, 5.41228555, - 4.28638718, 3.04804339, 2.46053085, 14.7831603, 7.77903268, 5.71801705, 4.40237768, 2.92489673, 2.21419054 - }); - - } - - // Set up regular grid interpolator. - compressor.perfRGI = new Btwxt::RegularGridInterpolator(compressor.perfGrid, compressor.perfGridValues); - compressor.useBtwxtGrid = true; - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - // if rheem multipass - else if (MODELS_RHEEM_HPHD60HNU_201_MP <= presetNum && presetNum <= MODELS_RHEEM_HPHD135VNU_483_MP) { - setNumNodes(24); - setpoint_C = F_TO_C(135.0); - tankSizeFixed = false; - - doTempDepression = false; - tankMixesOnDraw = false; - - tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important - tankUA_kJperHrC = 7; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.perfMap.reserve(1); - compressor.hysteresis_dC = 0; - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = static_cast(getNumNodes() / 3.) - 1; - - //logic conditions - std::vector nodeWeights; - nodeWeights.emplace_back(4); - compressor.addTurnOnLogic(std::make_shared("fourth node", nodeWeights, dF_TO_dC(5.), this)); - - std::vector nodeWeights1; - nodeWeights1.emplace_back(4); - compressor.addShutOffLogic(std::make_shared("fourth node", nodeWeights1, dF_TO_dC(0.), this, false, std::greater())); - compressor.depressesTemperature = false; //no temp depression - - //Defrost Derate - compressor.setupDefrostMap(); - - //logic conditions - compressor.minT = F_TO_C(45.); - compressor.maxT = F_TO_C(110.); - compressor.maxSetpoint_C = MAXOUTLET_R134A; // data says 150... - - if (presetNum == MODELS_RHEEM_HPHD60HNU_201_MP || presetNum == MODELS_RHEEM_HPHD60VNU_201_MP) { - setTankSize_adjustUA(250., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(17.4); - compressor.perfMap.push_back({ - 110, // Temperature (T_F) - - { 1.8558438453, 0.0120796155, -0.0135443327, 0.0000059621, 0.0003010506, -0.0000463525}, // Input Power Coefficients (inputPower_coeffs) - - { 3.6840046360, 0.0995685071, -0.0398107723, -0.0001903160, 0.0000980361, -0.0003469814} // COP Coefficients (COP_coeffs) - }); - } - else if (presetNum == MODELS_RHEEM_HPHD135HNU_483_MP || presetNum == MODELS_RHEEM_HPHD135VNU_483_MP) { - setTankSize_adjustUA(500., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(34.87); - compressor.perfMap.push_back({ - 110, // Temperature (T_F) - - { 5.1838201136, 0.0247312962, -0.0120766440, 0.0000493862, 0.0005422089, -0.0001385078}, // Input Power Coefficients (inputPower_coeffs) - - { 5.0207181209, 0.0442525790, -0.0418284882, 0.0000793531, 0.0001132421, -0.0002491563} // COP Coefficients (COP_coeffs) - }); - } - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - - else if (presetNum == MODELS_MITSUBISHI_QAHV_N136TAU_HPB_SP) { - setNumNodes(96); - setpoint_C = 65; - - tankVolume_L = GAL_TO_L(500); - tankUA_kJperHrC = 12; - tankSizeFixed = false; - - doTempDepression = false; - tankMixesOnDraw = false; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.minT = F_TO_C(-13.); - compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = getNumNodes() - 1; - - // What to do about these?! - compressor.hysteresis_dC = 4; - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.isMultipass = false; - compressor.maxSetpoint_C = F_TO_C(176.1); - - // Turn on - std::vector nodeWeights; - nodeWeights.emplace_back(4); - compressor.addTurnOnLogic(std::make_shared("eighth node absolute", nodeWeights, F_TO_C(110.), this, true)); - - //lowT cutoff - std::vector nodeWeights1; - nodeWeights1.emplace_back(1); - compressor.addShutOffLogic(std::make_shared("bottom node", nodeWeights1, dF_TO_dC(15.), this, false, - std::greater(), true)); - compressor.depressesTemperature = false; - - // Performance grid: externalT_F, Tout_F, condenserTemp_F - compressor.perfGrid.reserve(2); - compressor.perfGridValues.reserve(2); - compressor.perfGrid.push_back({ -13, -11.2, -7.6, -4, -0.4, 3.2, 6.8, 10.4, 14, 17.6, 21.2, 24.8, 28.4, 32, 35.6, 39.2, - 42.8, 46.4, 50, 53.6, 57.2, 60.8, 64.4, 68, 71.6, 75.2, 78.8, 82.4, 86, 89.6, 93.2, 96.8, 100.4, 104}); // Grid Axis 1 Tair (F) - compressor.perfGrid.push_back({ 140., 158., 176. }); // Grid Axis 2 Tout (F) - compressor.perfGrid.push_back({ 41, 48.2, 62.6, 75.2, 84.2}); // Grid Axis 3 Tin (F) - - // Grid values in long format, table 1, input power (Btu/hr) - compressor.perfGridValues.push_back({ 56518.565328, 57130.739544, 57094.73612, 57166.756616, 57238.777112, 56518.565328, 57130.739544, 57094.73612, 57166.756616, 57238.777112, - 58061.348896, 58360.24692, 58591.39286, 58870.368216, 59093.547136, 56626.5960719999, 57202.763452, 57310.794196, 57310.794196, 57490.848848, 56626.5960719999, 57202.763452, - 57310.794196, 57310.794196, 57490.848848, 58280.539188, 58519.65556, 58786.67868, 59093.547136, 59372.5190799999, 56950.695128, 57850.95474, 57814.947904, 57814.947904, - 57922.978648, 56950.695128, 57850.95474, 57814.947904, 57814.947904, 57922.978648, 58679.067612, 58977.969048, 59372.5190799999, 59651.494436, 59930.46638, 57418.831764, - 58175.053796, 58283.08454, 58247.07088, 58427.12212, 57418.831764, 58175.053796, 58283.08454, 58247.07088, 58427.12212, 59137.384512, 59376.504296, 59902.566456, 60265.23476, - 60516.313604, 57778.930832, 58643.190432, 58823.23826, 58643.190432, 58967.282664, 57778.930832, 58643.190432, 58823.23826, 58643.190432, 58967.282664, 59515.99368, 59954.377676, - 60321.031196, 60934.77152, 61213.743464, 58103.029888, 59075.313408, 59219.357812, 59291.374896, 59579.45688, 58103.029888, 59075.313408, 59219.357812, 59291.374896, 59579.45688, - 60014.159328, 60273.205192, 60934.77152, 61436.922384, 61799.587276, 58535.152864, 59399.412464, 59795.525192, 59903.555936, 60299.672076, 58535.152864, 59399.412464, 59795.525192, - 59903.555936, 60299.672076, 60512.321564, 60751.448172, 61409.02246, 62022.769608, 62329.641476, 58931.275828, 59651.4842, 60011.58668, 60263.66524, 60551.747224, 58931.275828, - 59651.4842, 60011.58668, 60263.66524, 60551.747224, 60910.860224, 61369.1703, 62022.769608, 62580.713496, 62803.895828, 59219.357812, 60155.634496, 60443.71648, 60659.777968, - 61163.92144, 59219.357812, 60155.634496, 60443.71648, 60659.777968, 61163.92144, 61329.321552, 61687.997816, 62441.224112, 63166.56072, 63585.015224, 59651.4842, 60479.726728, - 61019.88386, 61163.92144, 61920.146884, 59651.4842, 60479.726728, 61019.88386, 61163.92144, 61920.146884, 61707.923896, 62186.166876, 63027.071336, 63724.504608, 64170.862448, - 59723.504696, 60839.83262, 61379.993164, 61524.030744, 62352.273272, 59723.504696, 60839.83262, 61379.993164, 61524.030744, 62352.273272, 61966.96976, 62445.21274, 63361.839716, - 64142.969348, 64505.63424, 59759.511532, 60695.788216, 61524.030744, 61884.136636, 62712.382576, 59759.511532, 60695.788216, 61524.030744, 61884.136636, 62712.382576, 62166.240796, - 62744.114176, 63668.714996, 64282.451908, 64589.323776, 59759.511532, 61019.88386, 61848.1298, 62064.191288, 62964.4509, 59759.511532, 61019.88386, 61848.1298, 62064.191288, - 62964.4509, 62425.28666, 63003.16004, 63975.58004, 64533.523928, 64617.2237, 59471.429548, 61055.894108, 61956.160544, 62460.304016, 63216.526048, 59471.429548, 61055.894108, - 61956.160544, 62460.304016, 63216.526048, 62624.550872, 63202.424252, 64310.351832, 64756.70626, 64728.806336, 61632.061488, 63036.474808, 63828.7105, 64296.847136, 65053.069168, - 61632.061488, 63036.474808, 63828.7105, 64296.847136, 65053.069168, 63561.10734, 64099.125148, 65258.8605359999, 65593.625504, 65621.525428, 51189.004268, 52917.506408, 54826.070024, - 57094.73612, 59327.388556, 51189.004268, 52917.506408, 54826.070024, 57094.73612, 59327.388556, 55391.172288, 58240.683616, 62106.459144, 65733.114888, 65705.214964, 41286.100768, - 42726.524336, 45931.460292, 49784.590948, 53457.6669519999, 41286.100768, 42726.524336, 45931.460292, 49784.590948, 53457.6669519999, 49433.093532, 51067.083272, 57921.8561, - 61604.3082799999, 64477.734316, 35632.444064, 37108.87788, 41394.134924, 45139.228012, 49568.526048, 35632.444064, 37108.87788, 41394.134924, 45139.228012, 49568.526048, 47540.06134, - 47221.233824, 56080.631716, 59539.904976, 61883.276812, 34192.023908, 35596.430404, 39809.6669519999, 43410.72246, 47659.969256, 34192.023908, 35596.430404, 39809.6669519999, - 43410.72246, 47659.969256, 47559.98742, 47061.821772, 54490.482764, 57893.959588, 60153.648712, 32895.641332, 34192.023908, 38225.202392, 41646.20666, 45751.409052, 32895.641332, - 34192.023908, 38225.202392, 41646.20666, 45751.409052, 47659.621232, 46842.624656, 52956.13366, 56220.1211, 58312.420916, 31563.25192, 32715.58668, 36532.707088, 39881.687448, - 43914.869344, 31563.25192, 32715.58668, 36532.707088, 39881.687448, 43914.869344, 47719.402884, 46742.994256, 51393.877808, 54518.382688, 56554.886068, 30194.85226, 31347.18702, - 35092.286932, 38117.171648, 42006.312552, 30194.85226, 31347.18702, 35092.286932, 38117.171648, 42006.312552, 47799.1072039999, 46324.532928, 49692.139396, 52732.951328, 54769.45812, - 30446.923996, 31383.197268, 34300.054652, 37144.884716, 40781.953884, 30446.923996, 31383.197268, 34300.054652, 37144.884716, 40781.953884, 45547.391924, 44212.307032, 47320.867636, - 50389.57608, 52202.90054, 30698.995732, 31311.176772, 33723.88386, 36316.6456, 39701.636208, 30698.995732, 31311.176772, 33723.88386, 36316.6456, 39701.636208, 43295.680056, - 41980.517832, 45089.078436, 47795.121988, 49720.03932, 30987.081128, 31311.176772, 33183.726728, 35344.358668, 38477.27754, 30987.081128, 31311.176772, 33183.726728, 35344.358668, - 38477.27754, 41562.059916, 40486.017476, 43415.236536, 46037.590552, 47795.121988, 31203.146028, 31311.176772, 32571.545688, 34552.126388, 37360.949616, 31203.146028, 31311.176772, - 32571.545688, 34552.126388, 37360.949616, 40486.017476, 39310.3446359999, 42159.859376, 44782.20998, 46511.844904, 31167.132368, 31311.176772, 32355.4842, 34156.010248, 36712.758328, - 31167.132368, 31311.176772, 32355.4842, 34156.010248, 36712.758328, 39449.830608, 38353.862088, 41127.657724, 43666.31538, 45284.360844, 31059.101624, 31131.12212, 32319.473952, - 34156.010248, 36748.771988, 31059.101624, 31131.12212, 32319.473952, 34156.010248, 36748.771988, 38592.985284, 37457.161192, 40151.249096, 42801.496212, 44419.541676, 30879.050384, - 31023.091376, 32319.473952, 34192.023908, 36820.789072, 30879.050384, 31023.091376, 32319.473952, 34192.023908, 36820.789072, 37756.062628, 36680.0236, 39258.536828, 41797.194484, - 43387.343436, 30807.029888, 30951.07088, 32427.504696, 34156.010248, 36748.771988, 30807.029888, 30951.07088, 32427.504696, 34156.010248, 36748.771988, 37795.9182, 36779.657412, - 39258.536828, 41769.29456, 43331.547, 30626.976942, 30735.007686, 32319.473952, 34156.010248, 36748.771988, 30626.976942, 30735.007686, 32319.473952, 34156.010248, 36748.771988, - 37815.84428, 36779.657412, 39286.431634, 41825.090996, 43359.446924, 30446.923996, 30518.944492, 32355.4842, 34264.040992, 36820.789072, 30446.923996, 30518.944492, 32355.4842, - 34264.040992, 36820.789072, 37775.988708, 36759.731332, 39286.431634, 41825.090996, 43359.446924, 30230.859096, 30410.913748, 32319.473952, 34192.023908, 36748.771988, 30230.859096, - 30410.913748, 32319.473952, 34192.023908, 36748.771988, 37775.988708, 36759.731332, 39342.226364, 41825.090996, 43303.650488, 30194.85226, 30194.85226, 32391.491036, 34156.010248, - 36748.771988, 30194.85226, 30194.85226, 32391.491036, 34156.010248, 36748.771988, 37756.062628, 36779.657412, 39342.226364, 41825.090996, 43359.446924 - }); - - // Grid values in long format, table 2, COP - compressor.perfGridValues.push_back({ 1.177126, 1.1393, 1.091664, 1.033858, 0.981755, 1.177126, 1.1393, 1.091664, 1.033858, 0.981755, 1.134534, 1.106615, 1.04928, 0.989101, 0.946182, 1.228935, - 1.190326, 1.136507, 1.075244, 1.023802, 1.228935, 1.190326, 1.136507, 1.075244, 1.023802, 1.174944, 1.147101, 1.087318, 1.026909, 0.980265, 1.324165, 1.27451, 1.218468, 1.156182, 1.103823, - 1.324165, 1.27451, 1.218468, 1.156182, 1.103823, 1.267595, 1.236929, 1.165864, 1.102888, 1.052601, 1.415804, 1.365212, 1.301359, 1.238022, 1.180586, 1.415804, 1.365212, 1.301359, 1.238022, - 1.180586, 1.358408, 1.324943, 1.249272, 1.179609, 1.128155, 1.510855, 1.453792, 1.381237, 1.31747, 1.253435, 1.510855, 1.453792, 1.381237, 1.31747, 1.253435, 1.446639, 1.404653, 1.331368, - 1.249056, 1.195511, 1.60469, 1.540079, 1.462451, 1.39417, 1.326987, 1.60469, 1.540079, 1.462451, 1.39417, 1.326987, 1.529924, 1.492107, 1.404944, 1.325122, 1.265433, 1.690249, 1.630494, - 1.539446, 1.464082, 1.395939, 1.690249, 1.630494, 1.539446, 1.464082, 1.395939, 1.610302, 1.56761, 1.479273, 1.393118, 1.33076, 1.776046, 1.715967, 1.624662, 1.540783, 1.469819, 1.776046, - 1.715967, 1.624662, 1.540783, 1.469819, 1.693465, 1.646725, 1.550545, 1.459601, 1.400666, 1.865309, 1.797965, 1.703902, 1.612645, 1.539888, 1.865309, 1.797965, 1.703902, 1.612645, 1.539888, - 1.776866, 1.728095, 1.626829, 1.531743, 1.461555, 1.956837, 1.881215, 1.777073, 1.690021, 1.603082, 1.956837, 1.881215, 1.777073, 1.690021, 1.603082, 1.857512, 1.807899, 1.699347, 1.599321, - 1.526899, 2.038891, 1.956496, 1.848049, 1.757975, 1.668207, 2.038891, 1.956496, 1.848049, 1.757975, 1.668207, 1.934721, 1.878022, 1.764777, 1.657606, 1.583414, 2.110576, 2.028182, 1.922739, - 1.818155, 1.725237, 2.110576, 2.028182, 1.922739, 1.818155, 1.725237, 1.997516, 1.937435, 1.824625, 1.712596, 1.630169, 2.185899, 2.091178, 1.989083, 1.883087, 1.786388, 2.185899, 2.091178, - 1.989083, 1.883087, 1.786388, 2.06464, 2.003084, 1.88041, 1.763428, 1.68041, 2.29337, 2.155411, 2.063354, 1.942635, 1.844204, 2.29337, 2.155411, 2.063354, 1.942635, 1.844204, 2.125448, 2.061323, - 1.933955, 1.810339, 1.720612, 2.213555, 2.111682, 2.027503, 1.91515, 1.819817, 2.213555, 2.111682, 2.027503, 1.91515, 1.819817, 2.126499, 2.064584, 1.935343, 1.818713, 1.728239, 2.665142, - 2.578088, 2.488506, 2.388206, 2.29651, 2.665142, 2.578088, 2.488506, 2.388206, 2.29651, 2.46407, 2.344111, 2.198428, 2.057188, 1.96338, 3.304405, 3.191319, 2.971384, 2.741049, 2.550691, 3.304405, - 3.191319, 2.971384, 2.741049, 2.550691, 2.763177, 2.673398, 2.356773, 2.216348, 2.116712, 3.827691, 3.676371, 3.297085, 3.022338, 2.752997, 3.827691, 3.676371, 3.297085, 3.022338, 2.752997, - 2.871739, 2.890389, 2.434648, 2.292726, 2.205906, 3.989995, 3.834598, 3.428313, 3.14185, 2.862486, 3.989995, 3.834598, 3.428313, 3.14185, 2.862486, 2.871269, 2.900921, 2.506208, 2.358391, - 2.270261, 4.147236, 3.992101, 3.570419, 3.274967, 2.982684, 4.147236, 3.992101, 3.570419, 3.274967, 2.982684, 2.865266, 2.913751, 2.578296, 2.428607, 2.341945, 4.322305, 4.172262, 3.73583, - 3.419865, 3.107421, 4.322305, 4.172262, 3.73583, 3.419865, 3.107421, 2.861677, 2.919962, 2.65667, 2.504413, 2.414725, 4.518187, 4.354394, 3.889174, 3.578177, 3.248607, 4.518187, 4.354394, 3.889174, - 3.578177, 3.248607, 2.856905, 2.946338, 2.747649, 2.589208, 2.493442, 4.481963, 4.349398, 3.979002, 3.671837, 3.346137, 4.481963, 4.349398, 3.979002, 3.671837, 3.346137, 2.998141, 3.087098, 2.885335, - 2.709619, 2.616032, 4.445162, 4.359402, 4.046983, 3.755577, 3.437188, 4.445162, 4.359402, 4.046983, 3.755577, 3.437188, 3.154067, 3.251216, 3.028152, 2.856705, 2.746669, 4.402673, 4.359402, 4.112859, - 3.858889, 3.546561, 4.402673, 4.359402, 4.112859, 3.858889, 3.546561, 3.285629, 3.371232, 3.1449, 2.965763, 2.857289, 4.373341, 4.359402, 4.19016, 3.947368, 3.65253, 4.373341, 4.359402, 4.19016, - 3.947368, 3.65253, 3.372955, 3.472057, 3.238544, 3.048902, 2.936122, 4.378394, 4.359402, 4.218141, 3.993147, 3.717018, 4.378394, 4.359402, 4.218141, 3.993147, 3.717018, 3.461548, 3.558644, 3.319824, - 3.126817, 3.015709, 4.391304, 4.384616, 4.222841, 3.993147, 3.713376, 4.391304, 4.384616, 4.222841, 3.993147, 3.713376, 3.538402, 3.643836, 3.400556, 3.189995, 3.074423, 4.419242, 4.399884, 4.222841, - 3.988941, 3.706113, 4.419242, 4.399884, 4.222841, 3.988941, 3.706113, 3.616836, 3.721038, 3.477882, 3.266644, 3.147565, 4.429573, 4.410122, 4.208773, 3.993147, 3.713376, 4.429573, 4.410122, 4.208773, - 3.993147, 3.713376, 3.613022, 3.710957, 3.477882, 3.268826, 3.151618, 4.45679, 4.441125, 4.222841, 3.993147, 3.713376, 4.45679, 4.441125, 4.222841, 3.993147, 3.713376, 3.611119, 3.710957, 3.475413, - 3.264466, 3.14959, 4.483146, 4.472566, 4.218141, 3.980557, 3.706113, 4.483146, 4.472566, 4.218141, 3.980557, 3.706113, 3.614928, 3.712969, 3.475413, 3.264466, 3.14959, 4.515188, 4.488454, 4.222841, - 3.988941, 3.713376, 4.515188, 4.488454, 4.222841, 3.988941, 3.713376, 3.614928, 3.712969, 3.470484, 3.264466, 3.153648, 4.522957, 4.520572, 4.213452, 3.993147, 3.713376, 4.522957, 4.520572, 4.213452, - 3.993147, 3.713376, 3.616836, 3.710957, 3.470484, 3.264466, 3.14959 - }); - - // Set up regular grid interpolator. - Btwxt::GridAxis g0(compressor.perfGrid[0], "TAir", Btwxt::InterpolationMethod::linear, Btwxt::ExtrapolationMethod::constant); - Btwxt::GridAxis g1(compressor.perfGrid[1], "TOut", Btwxt::InterpolationMethod::linear, Btwxt::ExtrapolationMethod::constant); - Btwxt::GridAxis g2(compressor.perfGrid[2], "TIn", Btwxt::InterpolationMethod::linear, Btwxt::ExtrapolationMethod::linear); - - std::vector gx{ g0, g1, g2 }; - - compressor.perfRGI = new Btwxt::RegularGridInterpolator(gx, compressor.perfGridValues); - compressor.useBtwxtGrid = true; - - compressor.secondaryHeatExchanger = { dF_TO_dC(10.), dF_TO_dC(15.), 27. }; - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - - else if (presetNum == MODELS_SANCO2_83 || presetNum == MODELS_SANCO2_GS3_45HPA_US_SP || presetNum == MODELS_SANCO2_119) { - setNumNodes(96); - setpoint_C = 65; - setpointFixed = true; - - if (presetNum == MODELS_SANCO2_119) { - tankVolume_L = GAL_TO_L(119); - tankUA_kJperHrC = 9; - } - else { - tankVolume_L = 315; - tankUA_kJperHrC = 7; - if (presetNum == MODELS_SANCO2_GS3_45HPA_US_SP) { - tankSizeFixed = false; - } - } - - doTempDepression = false; - tankMixesOnDraw = false; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.minT = F_TO_C(-25.); - compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = getNumNodes() - 1; - - compressor.perfMap.reserve(5); - - compressor.perfMap.push_back({ - 17, // Temperature (T_F) - {1650, 5.5, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {3.2, -0.015, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 35, // Temperature (T_F) - {1100, 4.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {3.7, -0.015, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {880, 3.1, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.25, -0.025, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {740, 4.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {6.2, -0.03, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95, // Temperature (T_F) - {790, 2, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.15, -0.04, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.hysteresis_dC = 4; - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.isMultipass = false; - compressor.maxSetpoint_C = MAXOUTLET_R744; - - std::vector nodeWeights; - nodeWeights.emplace_back(8); - compressor.addTurnOnLogic(std::make_shared("eighth node absolute", nodeWeights, F_TO_C(113), this, true)); - if (presetNum == MODELS_SANCO2_83 || presetNum == MODELS_SANCO2_119) { - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(8.2639))); - // Adds a bonus standby logic so the external heater does not cycle, recommended for any external heater with standby - std::vector nodeWeightStandby; - nodeWeightStandby.emplace_back(0); - compressor.standbyLogic = std::make_shared("bottom node absolute", nodeWeightStandby, F_TO_C(113), this, true, std::greater()); - } - //lowT cutoff - std::vector nodeWeights1; - nodeWeights1.emplace_back(1); - compressor.addShutOffLogic(std::make_shared("bottom node absolute", nodeWeights1, F_TO_C(135), this, true, - std::greater(), true)); - compressor.depressesTemperature = false; //no temp depression - - //set everything in its place - heatSources.resize(1); - heatSources[0] = compressor; - } - else if (presetNum == MODELS_SANCO2_43) { - setNumNodes(96); - setpoint_C = 65; - setpointFixed = true; - - tankVolume_L = 160; - //tankUA_kJperHrC = 10; //0 to turn off - tankUA_kJperHrC = 5; - - doTempDepression = false; - tankMixesOnDraw = false; - - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.minT = F_TO_C(-25.); - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = getIndexTopNode(); - - compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - - compressor.perfMap.reserve(5); - - compressor.perfMap.push_back({ - 17, // Temperature (T_F) - {1650, 5.5, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {3.2, -0.015, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 35, // Temperature (T_F) - {1100, 4.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {3.7, -0.015, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {880, 3.1, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.25, -0.025, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {740, 4.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {6.2, -0.03, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95, // Temperature (T_F) - {790, 2, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.15, -0.04, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.hysteresis_dC = 4; - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.isMultipass = false; - compressor.maxSetpoint_C = MAXOUTLET_R744; - - std::vector nodeWeights; - nodeWeights.emplace_back(4); - std::vector nodeWeightStandby; - nodeWeightStandby.emplace_back(0); - compressor.addTurnOnLogic(std::make_shared("fourth node absolute", nodeWeights, F_TO_C(113), this, true)); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(8.2639))); - compressor.standbyLogic = std::make_shared("bottom node absolute", nodeWeightStandby, F_TO_C(113), this, true, std::greater()); - - //lowT cutoff - std::vector nodeWeights1; - nodeWeights1.emplace_back(1); - compressor.addShutOffLogic(std::make_shared("bottom twelfth absolute", nodeWeights1, F_TO_C(135), this, true, - std::greater(), true)); - compressor.depressesTemperature = false; //no temp depression - - //set everything in its place - heatSources.resize(1); - heatSources[0] = compressor; - } - else if (presetNum == MODELS_AOSmithHPTU50 || presetNum == MODELS_RheemHBDR2250 || presetNum == MODELS_RheemHBDR4550) { - setNumNodes(24); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = 171; - tankUA_kJperHrC = 6; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - double split = 1.0 / 5.0; - compressor.setCondensity({split, split, split, split, split, 0, 0, 0, 0, 0, 0, 0}); - - // performance map - compressor.perfMap.reserve(3); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {170, 2.02, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.93, -0.027, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {144.5, 2.42, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.67, -0.037, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95, // Temperature (T_F) - {94.1, 3.15, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {11.1, -0.056, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(42.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - if (presetNum == MODELS_RheemHBDR2250) { - resistiveElementTop.setupAsResistiveElement(8, 2250); - } - else { - resistiveElementTop.setupAsResistiveElement(8, 4500); - } - resistiveElementTop.isVIP = true; - - //bottom resistor values - if (presetNum == MODELS_RheemHBDR2250) { - resistiveElementBottom.setupAsResistiveElement(0, 2250); - } - else { - resistiveElementBottom.setupAsResistiveElement(0, 4500); - } - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - double compStart = dF_TO_dC(35); - double standbyT = dF_TO_dC(9); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); - - std::vector nodeWeights; - nodeWeights.emplace_back(11); nodeWeights.emplace_back(12); - resistiveElementTop.addTurnOnLogic(std::make_shared("top sixth absolute", nodeWeights, F_TO_C(105), this, true)); - // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(28))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - heatSources[0].companionHeatSource = &heatSources[2]; - - - } - else if (presetNum == MODELS_AOSmithHPTU66 || presetNum == MODELS_RheemHBDR2265 || presetNum == MODELS_RheemHBDR4565) { - setNumNodes(24); - setpoint_C = F_TO_C(127.0); - - if (presetNum == MODELS_AOSmithHPTU66) { - tankVolume_L = 244.6; - } - else { - tankVolume_L = 221.4; - } - tankUA_kJperHrC = 8; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - //double split = 1.0 / 4.0; - compressor.setCondensity({1., 0., 0.}); - - // performance map - compressor.perfMap.reserve(3); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {170, 2.02, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.93, -0.027, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {144.5, 2.42, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.67, -0.037, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95, // Temperature (T_F) - {94.1, 3.15, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {11.1, -0.056, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(42.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - if (presetNum == MODELS_RheemHBDR2265) { - resistiveElementTop.setupAsResistiveElement(8, 2250); - } - else { - resistiveElementTop.setupAsResistiveElement(8, 4500); - } - resistiveElementTop.isVIP = true; - - //bottom resistor values - if (presetNum == MODELS_RheemHBDR2265) { - resistiveElementBottom.setupAsResistiveElement(0, 2250); - } - else { - resistiveElementBottom.setupAsResistiveElement(0, 4500); - } - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - double compStart = dF_TO_dC(35); - double standbyT = dF_TO_dC(9); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); - - std::vector nodeWeights; - nodeWeights.emplace_back(11); nodeWeights.emplace_back(12); - resistiveElementTop.addTurnOnLogic(std::make_shared("top sixth absolute", nodeWeights, F_TO_C(105), this, true)); - // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(31))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - heatSources[0].companionHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_AOSmithHPTU80 || presetNum == MODELS_RheemHBDR2280 || presetNum == MODELS_RheemHBDR4580) { - setNumNodes(24); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = 299.5; - tankUA_kJperHrC = 9; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //double split = 1.0 / 3.0; - compressor.setCondensity({1., 0., 0., 0.}); - - compressor.perfMap.reserve(3); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {170, 2.02, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.93, -0.027, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {144.5, 2.42, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.67, -0.037, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95, // Temperature (T_F) - {94.1, 3.15, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {11.1, -0.056, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(42.0); - compressor.maxT = F_TO_C(120.0); - compressor.hysteresis_dC = dF_TO_dC(1); - - //top resistor values - if (presetNum == MODELS_RheemHBDR2280) { - resistiveElementTop.setupAsResistiveElement(8, 2250); - } - else { - resistiveElementTop.setupAsResistiveElement(8, 4500); - } - resistiveElementTop.isVIP = true; - - //bottom resistor values - if (presetNum == MODELS_RheemHBDR2280) { - resistiveElementBottom.setupAsResistiveElement(0, 2250); - } - else { - resistiveElementBottom.setupAsResistiveElement(0, 4500); - } - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - double compStart = dF_TO_dC(35); - double standbyT = dF_TO_dC(9); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); - - std::vector nodeWeights; - // nodeWeights.emplace_back(9); nodeWeights.emplace_back(10); - nodeWeights.emplace_back(11); nodeWeights.emplace_back(12); - resistiveElementTop.addTurnOnLogic(std::make_shared("top sixth absolute", nodeWeights, F_TO_C(105), this, true)); - // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(35))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - heatSources[0].companionHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_AOSmithHPTU80_DR) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = 283.9; - tankUA_kJperHrC = 9; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 47, // Temperature (T_F) - {142.6, 2.152, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {6.989258, -0.038320, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {120.14, 2.513, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {8.188, -0.0432, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(42.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(8, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - double compStart = dF_TO_dC(34.1636); - double standbyT = dF_TO_dC(7.1528); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80.108))); - - // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(39.9691))); - resistiveElementTop.addTurnOnLogic(HPWH::topThird_absolute(F_TO_C(87))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_AOSmithCAHP120) { - setNumNodes(24); - setpoint_C = F_TO_C(150.0); - - tankVolume_L = GAL_TO_L(111.76); // AOSmith docs say 111.76 - tankUA_kJperHrC = UAf_TO_UAc(3.94); - - doTempDepression = false; - tankMixesOnDraw = false; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({0.3, 0.3, 0.2, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}); - - //From CAHP 120 COP Tests - compressor.perfMap.reserve(3); - - // Tuned on the multiple K167 tests - compressor.perfMap.push_back({ - 50., // Temperature (T_F) - {2010.49966, -4.20966, 0.085395}, // Input Power Coefficients (inputPower_coeffs) - {5.91, -0.026299, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67.5, // Temperature (T_F) - {2171.012, -6.936571, 0.1094962}, // Input Power Coefficients (inputPower_coeffs) - {7.26272, -0.034135, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95., // Temperature (T_F) - {2276.0625, -7.106608, 0.119911}, // Input Power Coefficients (inputPower_coeffs) - {8.821262, -0.042059, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(47.0); //Product documentation says 45F doesn't look like it in CMP-T test// - compressor.maxT = F_TO_C(110.0); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - double wattRE = 6000;//5650.; - resistiveElementTop.setupAsResistiveElement(7, wattRE); - resistiveElementTop.isVIP = true; // VIP is the only source that turns on independently when something else is already heating. - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, wattRE); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - resistiveElementBottom.setCondensity({0.2, 0.8, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}); // Based of CMP test - - //logic conditions for - double compStart = dF_TO_dC(5.25); - double standbyT = dF_TO_dC(5.); //Given CMP_T test - compressor.addTurnOnLogic(HPWH::secondSixth(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - double resistanceStart = 12.; - resistiveElementTop.addTurnOnLogic(HPWH::topThird(resistanceStart)); - resistiveElementBottom.addTurnOnLogic(HPWH::topThird(resistanceStart)); - - resistiveElementTop.addShutOffLogic(HPWH::fifthSixthMaxTemp(F_TO_C(117.))); - resistiveElementBottom.addShutOffLogic(HPWH::secondSixthMaxTemp(F_TO_C(109.))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - //heatSources[2].followedByHeatSource = &heatSources[1];; - - heatSources[0].companionHeatSource = &heatSources[1]; - heatSources[1].companionHeatSource = &heatSources[2]; - - } - else if (MODELS_AOSmithHPTS50 <= presetNum && presetNum <= MODELS_AOSmithHPTS80) - { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - if (presetNum == MODELS_AOSmithHPTS50) { - tankVolume_L = GAL_TO_L(45.6); - tankUA_kJperHrC = 6.403; - } - else if (presetNum == MODELS_AOSmithHPTS66) { - tankVolume_L = GAL_TO_L(67.63); - tankUA_kJperHrC = UAf_TO_UAc(1.5) * 6.403 / UAf_TO_UAc(1.16); - } - else if (presetNum == MODELS_AOSmithHPTS80) { - tankVolume_L = GAL_TO_L(81.94); - tankUA_kJperHrC = UAf_TO_UAc(1.73) * 6.403 / UAf_TO_UAc(1.16); - } - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementTop(this); - HeatSource resistiveElementBottom(this); - - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({0, 0.2, 0.2, 0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0}); - - // performance map - compressor.perfMap.reserve(3); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {66.82, 2.49, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {8.64, -0.0436, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67.5, // Temperature (T_F) - {85.1, 2.38, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {10.82, -0.0551, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95, // Temperature (T_F) - {89, 2.62, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {12.52, -0.0534, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(1.); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - resistiveElementTop.setupAsResistiveElement(8, 4500); - resistiveElementTop.isVIP = true; - - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - double compStart = dF_TO_dC(30.2); - double standbyT = dF_TO_dC(9); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(11.87))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[2]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - heatSources[0].companionHeatSource = &heatSources[2]; - } - - else if (presetNum == MODELS_GE2014STDMode) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(45); - tankUA_kJperHrC = 6.5; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(19.6605))); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(86.1111))); - - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(12.392))); - // compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(65))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; + // standard logic conditions + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(20)); + resistiveElementBottom.addTurnOnLogic(HPWH::standby(15)); - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; + resistiveElementTop.addTurnOnLogic(HPWH::topThird(20)); + resistiveElementTop.isVIP = true; - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_GE2014STDMode_80) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(75.4); - tankUA_kJperHrC = 10.; + // assign heat sources into array in order of priority + heatSources.resize(2); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(19.6605))); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(86.1111))); - - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(12.392))); - compressor.minT = F_TO_C(37); - // compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(65))); - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_GE2014) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(45); - tankUA_kJperHrC = 6.5; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); - resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); - - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); - // compressor.addShutOffLogic(HPWH::largerDraw(F_TO_C(62.4074))); - - resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_GE2014_80) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(75.4); - tankUA_kJperHrC = 10.; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); - resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); - - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); - // compressor.addShutOffLogic(HPWH::largerDraw(F_TO_C(62.4074))); - - resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_GE2014_80DR) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(75.4); - tankUA_kJperHrC = 10.; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); - resistiveElementTop.addTurnOnLogic(HPWH::topThird_absolute(F_TO_C(87))); - // resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); - - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); - // compressor.addShutOffLogic(HPWH::largerDraw(F_TO_C(62.4074))); - - resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); - // resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - // PRESET USING GE2014 DATA - else if (presetNum == MODELS_BWC2020_65) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(64); - tankUA_kJperHrC = 7.6; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); - resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); - - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); - // compressor.addShutOffLogic(HPWH::largerDraw(F_TO_C(62.4074))); - - resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - } - // If Rheem Premium - else if (MODELS_Rheem2020Prem40 <= presetNum && presetNum <= MODELS_Rheem2020Prem80) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - if (presetNum == MODELS_Rheem2020Prem40) { - tankVolume_L = GAL_TO_L(36.1); - tankUA_kJperHrC = 9.5; - } - else if (presetNum == MODELS_Rheem2020Prem50) { - tankVolume_L = GAL_TO_L(45.1); - tankUA_kJperHrC = 8.55; - } - else if (presetNum == MODELS_Rheem2020Prem65) { - tankVolume_L = GAL_TO_L(58.5); - tankUA_kJperHrC = 10.64; - } - else if (presetNum == MODELS_Rheem2020Prem80) { - tankVolume_L = GAL_TO_L(72.0); - tankUA_kJperHrC = 10.83; - } - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({0.2, 0.2, 0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0, 0}); - - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {250, -1.0883, 0.0176}, // Input Power Coefficients (inputPower_coeffs) - {6.7, -0.0087, -0.0002} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {275.0, -0.6631, 0.01571}, // Input Power Coefficients (inputPower_coeffs) - {7.0, -0.0168, -0.0001} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.0); - compressor.hysteresis_dC = dF_TO_dC(1); - compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(8, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); - - //logic conditions - double compStart = dF_TO_dC(32); - double standbyT = dF_TO_dC(9); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); - resistiveElementTop.addTurnOnLogic(HPWH::topSixth(dF_TO_dC(20.4167))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[1].backupHeatSource = &heatSources[2]; - heatSources[2].backupHeatSource = &heatSources[1]; - - heatSources[0].followedByHeatSource = &heatSources[2]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - heatSources[0].companionHeatSource = &heatSources[2]; - } - - // If Rheem Build - else if (MODELS_Rheem2020Build40 <= presetNum && presetNum <= MODELS_Rheem2020Build80) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - if (presetNum == MODELS_Rheem2020Build40) { - tankVolume_L = GAL_TO_L(36.1); - tankUA_kJperHrC = 9.5; - } - else if (presetNum == MODELS_Rheem2020Build50) { - tankVolume_L = GAL_TO_L(45.1); - tankUA_kJperHrC = 8.55; - } - else if (presetNum == MODELS_Rheem2020Build65) { - tankVolume_L = GAL_TO_L(58.5); - tankUA_kJperHrC = 10.64; - } - else if (presetNum == MODELS_Rheem2020Build80) { - tankVolume_L = GAL_TO_L(72.0); - tankUA_kJperHrC = 10.83; - } - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({0.2, 0.2, 0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0, 0}); - - compressor.perfMap.reserve(2); - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {220.0, 0.8743, 0.00454}, // Input Power Coefficients (inputPower_coeffs) - { 7.96064, -0.0448, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {275.0, -0.6631, 0.01571}, // Input Power Coefficients (inputPower_coeffs) - {8.45936, -0.04539, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.hysteresis_dC = dF_TO_dC(1); - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.0); - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(8, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); - - //logic conditions - double compStart = dF_TO_dC(30); - double standbyT = dF_TO_dC(9); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); - resistiveElementTop.addTurnOnLogic(HPWH::topSixth(dF_TO_dC(20.4167))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[1].backupHeatSource = &heatSources[2]; - heatSources[2].backupHeatSource = &heatSources[1]; - - heatSources[0].followedByHeatSource = &heatSources[2]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - heatSources[0].companionHeatSource = &heatSources[2]; - } - else if (MODELS_RheemPlugInShared40 <= presetNum && presetNum <= MODELS_RheemPlugInShared80) { - setNumNodes(12); - - if (presetNum == MODELS_RheemPlugInShared40) { - tankVolume_L = GAL_TO_L(36.0); - tankUA_kJperHrC = 9.5; - setpoint_C = F_TO_C(140.0); - } - else if (presetNum == MODELS_RheemPlugInShared50) { - tankVolume_L = GAL_TO_L(45.0); - tankUA_kJperHrC = 8.55; - setpoint_C = F_TO_C(140.0); - } - else if (presetNum == MODELS_RheemPlugInShared65) { - tankVolume_L = GAL_TO_L(58.5); - tankUA_kJperHrC = 10.64; - setpoint_C = F_TO_C(127.0); - } - else if (presetNum == MODELS_RheemPlugInShared80) { - tankVolume_L = GAL_TO_L(72.0); - tankUA_kJperHrC = 10.83; - setpoint_C = F_TO_C(127.0); - } - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({0.2, 0.2, 0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0, 0}); - - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {250, -1.0883, 0.0176}, // Input Power Coefficients (inputPower_coeffs) - {6.7, -0.0087, -0.0002} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {275.0, -0.6631, 0.01571}, // Input Power Coefficients (inputPower_coeffs) - {7.0, -0.0168, -0.0001} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.0); - compressor.hysteresis_dC = dF_TO_dC(1); - compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //logic conditions - double compStart = dF_TO_dC(32); - double standbyT = dF_TO_dC(9); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - else if (presetNum == MODELS_RheemPlugInDedicated40 || presetNum == MODELS_RheemPlugInDedicated50) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - if (presetNum == MODELS_RheemPlugInDedicated40) { - tankVolume_L = GAL_TO_L(36); - tankUA_kJperHrC = 5.5; - } - else if (presetNum == MODELS_RheemPlugInDedicated50) { - tankVolume_L = GAL_TO_L(45); - tankUA_kJperHrC = 6.33; - } - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({0.5, 0.5, 0.}); - - compressor.perfMap.reserve(2); - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {528.91, 4.8988, 0.0}, // Input Power Coefficients (inputPower_coeffs) - { 4.3943, -0.012443, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95, // Temperature (T_F) - {494.03, 7.7266, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.48189, -0.01604, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.hysteresis_dC = dF_TO_dC(1); - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.0); - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; - - //logic conditions - double compStart = dF_TO_dC(20); - double standbyT = dF_TO_dC(9); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - else if (presetNum == MODELS_RheemHB50) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(45); - tankUA_kJperHrC = 7; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 47, // Temperature (T_F) - {280, 4.97342, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.634009, -0.029485, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {280, 5.35992, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {6.3, -0.03, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.hysteresis_dC = dF_TO_dC(1); - compressor.minT = F_TO_C(40.0); - compressor.maxT = F_TO_C(120.0); - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(8, 4200); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 2250); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - double compStart = dF_TO_dC(38); - double standbyT = dF_TO_dC(13.2639); - compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); - compressor.addTurnOnLogic(HPWH::standby(standbyT)); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(76.7747))); - - resistiveElementTop.addTurnOnLogic(HPWH::topSixth(dF_TO_dC(20.4167))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_Stiebel220E) { - setNumNodes(12); - setpoint_C = F_TO_C(127); - - tankVolume_L = GAL_TO_L(56); - //tankUA_kJperHrC = 10; //0 to turn off - tankUA_kJperHrC = 9; - - doTempDepression = false; - tankMixesOnDraw = false; - - HeatSource compressor(this); - HeatSource resistiveElement(this); - - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - resistiveElement.setupAsResistiveElement(0, 1500); - resistiveElement.hysteresis_dC = dF_TO_dC(0); - - compressor.setCondensity({0, 0.12, 0.22, 0.22, 0.22, 0.22, 0, 0, 0, 0, 0, 0}); - - compressor.perfMap.reserve(2); + heatSources[0].followedByHeatSource = &heatSources[1]; + } - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {295.55337, 2.28518, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.744118, -0.025946, 0.0} // COP Coefficients (COP_coeffs) - }); + // realistic resistive tank + else if (presetNum == MODELS_restankRealistic) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {282.2126, 2.82001, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {8.012112, -0.039394, 0.0} // COP Coefficients (COP_coeffs) - }); + tankSizeFixed = false; + tankVolume_L = GAL_TO_L(50); + tankUA_kJperHrC = 10; // 0 to turn off - compressor.minT = F_TO_C(32.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = 0; //no hysteresis - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; + doTempDepression = false; + // should eventually put tankmixes to true when testing progresses + tankMixesOnDraw = false; - compressor.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(6.5509))); - compressor.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); - - compressor.depressesTemperature = false; //no temp depression + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); - //set everything in its places - heatSources.resize(2); - heatSources[0] = compressor; - heatSources[1] = resistiveElement; + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementTop.setupAsResistiveElement(9, 4500); - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[0].backupHeatSource = &heatSources[1]; + // standard logic conditions + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(20)); + resistiveElementBottom.addTurnOnLogic(HPWH::standby(15)); - } - else if (presetNum == MODELS_Generic1) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(50); - tankUA_kJperHrC = 9; - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {472.58616, 2.09340, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {2.942642, -0.0125954, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {439.5615, 2.62997, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {3.95076, -0.01638033, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(45.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(8, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40.0))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); - compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(65))); - - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(80))); - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(110))); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(35))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_Generic2) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(50); - tankUA_kJperHrC = 7.5; - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - HeatSource resistiveElementTop(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {272.58616, 2.09340, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {4.042642, -0.0205954, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {239.5615, 2.62997, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.25076, -0.02638033, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(40.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); - compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(60))); - - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(80))); - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(40))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; + resistiveElementTop.addTurnOnLogic(HPWH::topThird(20)); + resistiveElementTop.isVIP = true; - } - else if (presetNum == MODELS_Generic3) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(50); - tankUA_kJperHrC = 5; - - doTempDepression = false; - tankMixesOnDraw = true; - - //set everything in its places - HeatSource resistiveElementTop(this); - HeatSource compressor(this); - HeatSource resistiveElementBottom(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {172.58616, 2.09340, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.242642, -0.0285954, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {139.5615, 2.62997, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {6.75076, -0.03638033, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(35.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4500); - resistiveElementBottom.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); - compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(55))); - - resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(60))); - - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(40))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (presetNum == MODELS_UEF2generic) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - tankVolume_L = GAL_TO_L(45); - tankUA_kJperHrC = 6.5; - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource resistiveElementTop(this); - HeatSource resistiveElementBottom(this); - HeatSource compressor(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {4.29, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - {5.61, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(37.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(18.6605))); - - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(86.1111))); - - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(12.392))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - } - else if (MODELS_AWHSTier3Generic40 <= presetNum && presetNum <= MODELS_AWHSTier3Generic80) { - setNumNodes(12); - setpoint_C = F_TO_C(127.0); - - if (presetNum == MODELS_AWHSTier3Generic40) { - tankVolume_L = GAL_TO_L(36.1); - tankUA_kJperHrC = 5; - } - else if (presetNum == MODELS_AWHSTier3Generic50) { - tankVolume_L = GAL_TO_L(45); - tankUA_kJperHrC = 6.5; - } - else if (presetNum == MODELS_AWHSTier3Generic65) { - tankVolume_L = GAL_TO_L(64); - tankUA_kJperHrC = 7.6; - } - else if (presetNum == MODELS_AWHSTier3Generic80) { - tankVolume_L = GAL_TO_L(75.4); - tankUA_kJperHrC = 10.; - } - else { - if (hpwhVerbosity >= VRB_reluctant) { - msg("Incorrect model specification. \n"); - } - return HPWH_ABORT; - } - - doTempDepression = false; - tankMixesOnDraw = true; - - HeatSource resistiveElementTop(this); - HeatSource resistiveElementBottom(this); - HeatSource compressor(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1., 0., 0.}); - - //voltex60 tier 1 values - compressor.perfMap.reserve(2); - - compressor.perfMap.push_back({ - 50, // Temperature (T_F) - {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) - //{5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - {5.22288834, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 70, // Temperature (T_F) - {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) - //{7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - {6.84694165, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(42.0); - compressor.maxT = F_TO_C(120.); - compressor.hysteresis_dC = dF_TO_dC(2); - compressor.configuration = HeatSource::CONFIG_WRAPPED; - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - //top resistor values - resistiveElementTop.setupAsResistiveElement(6, 4500); - resistiveElementTop.isVIP = true; - - //bottom resistor values - resistiveElementBottom.setupAsResistiveElement(0, 4000); - resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); - - //logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); - resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); - compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); - resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); - resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - } - // If a the model is the TamOMatic, HotTam, Generic... This model is scalable. - else if (presetNum == MODELS_TamScalable_SP) { - setNumNodes(24); - setpoint_C = F_TO_C(135.0); - tankSizeFixed = false; - canScale = true; // a fully scallable model - - doTempDepression = false; - tankMixesOnDraw = false; - - tankVolume_L = 315; - tankUA_kJperHrC = 7; - setTankSize_adjustUA(600., UNITS_GAL); - - HeatSource resistiveElementTop(this); - HeatSource resistiveElementBottom(this); - HeatSource compressor(this); - - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.isMultipass = false; - compressor.perfMap.reserve(1); - compressor.hysteresis_dC = 0; - - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = getIndexTopNode(); - - //Defrost Derate - compressor.setupDefrostMap(); - - //Perfmap for input power and COP made from data for poor preforming modeled to be scalled for this model - std::vector inputPwr_coeffs = { 13.6, 0.00995, -0.0342, -0.014, -0.000110, 0.00026, 0.000232, 0.000195, -0.00034, 5.30E-06, 2.3600E-06}; - std::vector COP_coeffs = { 1.945, 0.0412, -0.0112, -0.00161, 0.0000492, 0.0000348, -0.0000323, -0.000166, 0.0000112, 0.0000392, -3.52E-07}; - - compressor.perfMap.push_back({ - 105, // Temperature (T_F) - inputPwr_coeffs, // Input Power Coefficients (inputPower_coeffs - COP_coeffs // COP Coefficients (COP_coeffs) - }); - - //logic conditions - compressor.minT = F_TO_C(40.); - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - std::vector nodeWeights; - nodeWeights.emplace_back(4); - compressor.addTurnOnLogic(std::make_shared("fourth node", nodeWeights, dF_TO_dC(15), this)); - - //lowT cutoff - std::vector nodeWeights1; - nodeWeights1.emplace_back(1); - compressor.addShutOffLogic(std::make_shared("bottom node", nodeWeights1, dF_TO_dC(15.), this, false, - std::greater(), true)); - compressor.depressesTemperature = false; //no temp depression - - resistiveElementBottom.setupAsResistiveElement(0, 30000); - resistiveElementTop.setupAsResistiveElement(9, 30000); - - //top resistor values - //standard logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(15))); - resistiveElementTop.isVIP = true; - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - heatSources[0].companionHeatSource = &heatSources[2]; - } - else if (presetNum == MODELS_Scalable_MP) { - setNumNodes(24); - setpoint_C = F_TO_C(135.0); - tankSizeFixed = false; - canScale = true; // a fully scallable model - - doTempDepression = false; - tankMixesOnDraw = false; - - tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important - tankUA_kJperHrC = 7; - - HeatSource resistiveElementTop(this); - HeatSource resistiveElementBottom(this); - HeatSource compressor(this); - compressor.isOn = false; - compressor.isVIP = true; - compressor.typeOfHeatSource = TYPE_compressor; - compressor.setCondensity({0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}); - compressor.configuration = HeatSource::CONFIG_EXTERNAL; - compressor.perfMap.reserve(1); - compressor.hysteresis_dC = 0; - compressor.externalOutletHeight = 0; - compressor.externalInletHeight = static_cast(getNumNodes() / 3.) - 1; - - //logic conditions - std::vector nodeWeights; - nodeWeights.emplace_back(4); - compressor.addTurnOnLogic(std::make_shared("fourth node", nodeWeights, dF_TO_dC(5.), this, false)); - - std::vector nodeWeights1; - nodeWeights1.emplace_back(4); - compressor.addShutOffLogic(std::make_shared("fourth node", nodeWeights1, dF_TO_dC(0.), this, false, std::greater())); - compressor.depressesTemperature = false; //no temp depression - - //Defrost Derate - compressor.setupDefrostMap(); - - //logic conditions - compressor.minT = F_TO_C(40.); - compressor.maxT = F_TO_C(105.); - compressor.maxSetpoint_C = MAXOUTLET_R134A; - - setTankSize_adjustUA(600., UNITS_GAL); - compressor.mpFlowRate_LPS = GPM_TO_LPS(25.); - compressor.perfMap.push_back({ - 100, // Temperature (T_F) - - { 12.4, 0.00739, -0.0410, 0.0, 0.000578, 0.0000696}, // Input Power Coefficients (inputPower_coeffs) - - { 1.20, 0.0333, 0.00191, 0.000283, 0.0000496, -0.000440} // COP Coefficients (COP_coeffs) - - }); - - resistiveElementBottom.setupAsResistiveElement(0, 30000); - resistiveElementTop.setupAsResistiveElement(9, 30000); - - //top resistor values - //standard logic conditions - resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(30))); - resistiveElementTop.isVIP = true; - - //set everything in its places - heatSources.resize(3); - heatSources[0] = resistiveElementTop; - heatSources[1] = resistiveElementBottom; - heatSources[2] = compressor; - - //and you have to do this after putting them into heatSources, otherwise - //you don't get the right pointers - heatSources[2].backupHeatSource = &heatSources[1]; - heatSources[1].backupHeatSource = &heatSources[2]; - - heatSources[0].followedByHeatSource = &heatSources[1]; - heatSources[1].followedByHeatSource = &heatSources[2]; - - heatSources[0].companionHeatSource = &heatSources[2]; - } - else if (presetNum == MODELS_AquaThermAire) { // AquaThermAire - setNumNodes(12); - setpoint_C = 50.; - - initialTankT_C = 49.32; - hasInitialTankTemp = true; - - tankVolume_L = GAL_TO_L(54.4); - tankUA_kJperHrC = 10.35; - - doTempDepression = false; - tankMixesOnDraw = false; - - // heat exchangers only - hasHeatExchanger = true; - heatExchangerEffectiveness = 0.93; - - HeatSource compressor(this); - - //compressor values - compressor.isOn = false; - compressor.isVIP = false; - compressor.typeOfHeatSource = TYPE_compressor; - - compressor.setCondensity({1.}); - - //AOSmithPHPT60 values - compressor.perfMap.reserve(4); - - compressor.perfMap.push_back({ - 5, // Temperature (T_F) - {-1423, 38.70 ,0.}, // Input Power Coefficients (inputPower_coeffs) - {-0.13839, 0.012319, 0.} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 34, // Temperature (T_F) - {-1558, 42.40, 0.}, // Input Power Coefficients (inputPower_coeffs) - {-0.19375, 0.017247, 0.} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 67, // Temperature (T_F) - {-1713, 46.60, 0.}, // Input Power Coefficients (inputPower_coeffs) - {-0.28156, 0.025064, 0.} // COP Coefficients (COP_coeffs) - }); - - compressor.perfMap.push_back({ - 95, // Temperature (T_F) - {-1844, 50.17, 0.}, // Input Power Coefficients (inputPower_coeffs) - {-0.47273, 0.042082, 0.} // COP Coefficients (COP_coeffs) - }); - - compressor.minT = F_TO_C(-25); - compressor.maxT = F_TO_C(125.); - compressor.hysteresis_dC = dF_TO_dC(1); - compressor.configuration = HeatSource::CONFIG_SUBMERGED; - - //logic conditions - compressor.addTurnOnLogic(HPWH::wholeTank(111,UNITS_F,true)); - compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(14))); - - //set everything in its places - heatSources.resize(1); - heatSources[0] = compressor; - } - else { - if (hpwhVerbosity >= VRB_reluctant) { - msg("You have tried to select a preset model which does not exist. \n"); - } - return HPWH_ABORT; - } - - if (hasInitialTankTemp) - setTankToTemperature(initialTankT_C); - else //start tank off at setpoint - resetTankToSetpoint(); - - hpwhModel = presetNum; - - //calculate oft-used derived values - calcDerivedValues(); - - if (checkInputs() == HPWH_ABORT) { - return HPWH_ABORT; - } - - isHeating = false; - for (int i = 0; i < getNumHeatSources(); i++) { - if (heatSources[i].isOn) { - isHeating = true; - } - heatSources[i].sortPerformanceMap(); - } - - if (hpwhVerbosity >= VRB_emetic) { - for (int i = 0; i < getNumHeatSources(); i++) { - msg("heat source %d: %p \n", i, &heatSources[i]); - } - msg("\n\n"); - } - - simHasFailed = false; - return 0; //successful init returns 0 -} //end HPWHinit_presets \ No newline at end of file + // set everything in its place + heatSources.resize(2); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + + heatSources[0].followedByHeatSource = &heatSources[1]; + } + + else if (presetNum == MODELS_StorageTank) + { + setNumNodes(12); + setpoint_C = 800.; + + initialTankT_C = F_TO_C(127.); + hasInitialTankTemp = true; + + tankSizeFixed = false; + tankVolume_L = GAL_TO_L(80); + tankUA_kJperHrC = 10; // 0 to turn off + + doTempDepression = false; + tankMixesOnDraw = false; + } + + // basic compressor tank for testing + else if (presetNum == MODELS_basicIntegrated) + { + setNumNodes(12); + setpoint_C = 50; + + tankSizeFixed = false; + tankVolume_L = 120; + tankUA_kJperHrC = 10; // 0 to turn off + // tankUA_kJperHrC = 0; //0 to turn off + + doTempDepression = false; + tankMixesOnDraw = false; + + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + HeatSource compressor(this); + + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementTop.setupAsResistiveElement(9, 4500); + + resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); + + // standard logic conditions + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(20)); + resistiveElementBottom.addTurnOnLogic(HPWH::standby(15)); + + resistiveElementTop.addTurnOnLogic(HPWH::topThird(20)); + resistiveElementTop.isVIP = true; + + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + // double oneSixth = 1.0 / 6.0; + compressor.setCondensity({1., 0.}); + + // GE tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 47, // Temperature (T_F) + {0.290 * 1000, + 0.00159 * 1000, + 0.00000107 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {4.49, -0.0187, -0.0000133} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {0.375 * 1000, + 0.00121 * 1000, + 0.00000216 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {5.60, -0.0252, 0.00000254} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = 0; + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(4); + compressor.configuration = HeatSource::CONFIG_WRAPPED; // wrapped around tank + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + compressor.addTurnOnLogic(HPWH::bottomThird(20)); + compressor.addTurnOnLogic(HPWH::standby(15)); + + // set everything in its place + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = compressor; + heatSources[2] = resistiveElementBottom; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + + // simple external style for testing + else if (presetNum == MODELS_externalTest) + { + setNumNodes(96); + setpoint_C = 50; + + tankSizeFixed = false; + tankVolume_L = 120; + // tankUA_kJperHrC = 10; //0 to turn off + tankUA_kJperHrC = 0; // 0 to turn off + + doTempDepression = false; + tankMixesOnDraw = false; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + + // GE tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 47, // Temperature (T_F) + {0.290 * 1000, + 0.00159 * 1000, + 0.00000107 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {4.49, -0.0187, -0.0000133} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {0.375 * 1000, + 0.00121 * 1000, + 0.00000216 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {5.60, -0.0252, 0.00000254} // COP Coefficients (COP_coeffs) + }); + + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = 0; // no hysteresis + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.isMultipass = false; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + compressor.addTurnOnLogic(HPWH::bottomThird(20)); + compressor.addTurnOnLogic(HPWH::standby(15)); + + // lowT cutoff + compressor.addShutOffLogic(HPWH::bottomNodeMaxTemp(20, true)); + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + // voltex 60 gallon + else if (presetNum == MODELS_AOSmithPHPT60) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = 215.8; + tankUA_kJperHrC = 7.31; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + double split = 1.0 / 5.0; + compressor.setCondensity({split, split, split, split, split, 0, 0, 0, 0, 0, 0, 0}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 47, // Temperature (T_F) + {0.467 * 1000, + 0.00281 * 1000, + 0.0000072 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {4.86, -0.0222, -0.00001} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {0.541 * 1000, + 0.00147 * 1000, + 0.0000176 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {6.58, -0.0392, 0.0000407} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(45.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(4); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(8, 4250); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 2000); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); + + // logic conditions + double compStart = dF_TO_dC(43.6); + double standbyT = dF_TO_dC(23.8); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(compStart)); + + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(25.0))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = compressor; + heatSources[2] = resistiveElementBottom; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_AOSmithPHPT80) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = 283.9; + tankUA_kJperHrC = 8.8; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + double split = 1.0 / 5.0; + compressor.setCondensity({split, split, split, split, split, 0, 0, 0, 0, 0, 0, 0}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 47, // Temperature (T_F) + {0.467 * 1000, + 0.00281 * 1000, + 0.0000072 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {4.86, -0.0222, -0.00001} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {0.541 * 1000, + 0.00147 * 1000, + 0.0000176 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {6.58, -0.0392, 0.0000407} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(45.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(4); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(8, 4250); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 2000); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); + + // logic conditions + double compStart = dF_TO_dC(43.6); + double standbyT = dF_TO_dC(23.8); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(compStart)); + + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(25.0))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = compressor; + heatSources[2] = resistiveElementBottom; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_GE2012) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = 172; + tankUA_kJperHrC = 6.8; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + double split = 1.0 / 5.0; + compressor.setCondensity({split, split, split, split, split, 0, 0, 0, 0, 0, 0, 0}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 47, // Temperature (T_F) + {0.3 * 1000, + 0.00159 * 1000, + 0.00000107 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {4.7, -0.0210, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {0.378 * 1000, + 0.00121 * 1000, + 0.00000216 * 1000}, // Input Power Coefficients (inputPower_coeffs) + {4.8, -0.0167, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(45.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(4); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(8, 4200); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4200); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); + + // logic conditions + // double compStart = dF_TO_dC(24.4); + double compStart = dF_TO_dC(40.0); + double standbyT = dF_TO_dC(5.2); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + // compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(66))); + compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(65))); + + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(compStart)); + // resistiveElementBottom.addShutOffLogic(HPWH::lowTreheat(lowTcutoff)); + // GE element never turns off? + + // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(31.0))); + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(28.0))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = compressor; + heatSources[2] = resistiveElementBottom; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + // If a Colmac single pass preset cold weather or not + else if (MODELS_ColmacCxV_5_SP <= presetNum && presetNum <= MODELS_ColmacCxA_30_SP) + { + setNumNodes(96); + setpoint_C = F_TO_C(135.0); + tankSizeFixed = false; + + doTempDepression = false; + tankMixesOnDraw = false; + + tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important + tankUA_kJperHrC = 7; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.isMultipass = false; + compressor.perfMap.reserve(1); + compressor.hysteresis_dC = 0; + + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = getNumNodes() - 1; + + // logic conditions + std::vector nodeWeights; + nodeWeights.emplace_back(4); + compressor.addTurnOnLogic(std::make_shared( + "fourth node", nodeWeights, dF_TO_dC(15), this)); + + // lowT cutoff + std::vector nodeWeights1; + nodeWeights1.emplace_back(1); + compressor.addShutOffLogic(std::make_shared( + "bottom node", nodeWeights1, dF_TO_dC(15.), this, false, std::greater(), true)); + compressor.depressesTemperature = false; // no temp depression + + // Defrost Derate + compressor.setupDefrostMap(); + + if (presetNum == MODELS_ColmacCxV_5_SP) + { + setTankSize_adjustUA(200., UNITS_GAL); + // logic conditions + compressor.minT = F_TO_C(-4.0); + compressor.maxSetpoint_C = MAXOUTLET_R410A; + + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {4.9621645063, + -0.0096084144, + -0.0095647009, + -0.0115911960, + -0.0000788517, + 0.0000886176, + 0.0001114142, + 0.0001832377, + -0.0000451308, + 0.0000411975, + 0.0000003535}, // Input Power Coefficients (inputPower_coeffs) + + {3.8189922420, + 0.0569412237, + -0.0320101962, + -0.0012859036, + 0.0000576439, + 0.0001101241, + -0.0000352368, + -0.0002630301, + -0.0000509365, + 0.0000369655, + -0.0000000606} // COP Coefficients (COP_coeffs) + }); + } + else + { + // logic conditions + compressor.minT = F_TO_C(40.); + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + if (presetNum == MODELS_ColmacCxA_10_SP) + { + setTankSize_adjustUA(500., UNITS_GAL); + + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {5.9786974243, + 0.0194445115, + -0.0077802278, + 0.0053809029, + -0.0000334832, + 0.0001864310, + 0.0001190540, + 0.0000040405, + -0.0002538279, + -0.0000477652, + 0.0000014101}, // Input Power Coefficients (inputPower_coeffs) + + {3.6128563086, + 0.0527064498, + -0.0278198945, + -0.0070529748, + 0.0000934705, + 0.0000781711, + -0.0000359215, + -0.0002223206, + 0.0000359239, + 0.0000727189, + -0.0000005037} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_ColmacCxA_15_SP) + { + setTankSize_adjustUA(600., UNITS_GAL); + + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {15.5869846555, + -0.0044503761, + -0.0577941202, + -0.0286911185, + -0.0000803325, + 0.0003399817, + 0.0002009576, + 0.0002494761, + -0.0000595773, + 0.0001401800, + 0.0000004312}, // Input Power Coefficients (inputPower_coeffs) + + {1.6643120405, + 0.0515623393, + -0.0110239930, + 0.0041514430, + 0.0000481544, + 0.0000493424, + -0.0000262721, + -0.0002356218, + -0.0000989625, + -0.0000070572, + 0.0000004108} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_ColmacCxA_20_SP) + { + setTankSize_adjustUA(800., UNITS_GAL); + + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {23.0746692231, + 0.0248584608, + -0.1417927282, + -0.0253733303, + -0.0004882754, + 0.0006508079, + 0.0002139934, + 0.0005552752, + -0.0002026772, + 0.0000607338, + 0.0000021571}, // Input Power Coefficients (inputPower_coeffs) + + {1.7692660120, + 0.0525134783, + -0.0081102040, + -0.0008715405, + 0.0001274956, + 0.0000369489, + -0.0000293775, + -0.0002778086, + -0.0000095067, + 0.0000381186, + -0.0000003135} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_ColmacCxA_25_SP) + { + setTankSize_adjustUA(1000., UNITS_GAL); + + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {20.4185336541, + -0.0236920615, + -0.0736219119, + -0.0260385082, + -0.0005048074, + 0.0004940510, + 0.0002632660, + 0.0009820050, + -0.0000223587, + 0.0000885101, + 0.0000005649}, // Input Power Coefficients (inputPower_coeffs) + + {0.8942843854, + 0.0677641611, + -0.0001582927, + 0.0048083998, + 0.0001196407, + 0.0000334921, + -0.0000378740, + -0.0004146401, + -0.0001213363, + -0.0000031856, + 0.0000006306} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_ColmacCxA_30_SP) + { + setTankSize_adjustUA(1200., UNITS_GAL); + + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {11.3687485772, + -0.0207292362, + 0.0496254077, + -0.0038394967, + -0.0005991041, + 0.0001304318, + 0.0003099774, + 0.0012092717, + -0.0001455509, + -0.0000893889, + 0.0000018221}, // Input Power Coefficients (inputPower_coeffs) + + {4.4170108542, + 0.0596384263, + -0.0416104579, + -0.0017199887, + 0.0000774664, + 0.0001521934, + -0.0000251665, + -0.0003289731, + -0.0000801823, + 0.0000325972, + 0.0000002705} // COP Coefficients (COP_coeffs) + }); + } + } // End if MODELS_ColmacCxV_5_SP + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + + // if colmac multipass + else if (MODELS_ColmacCxV_5_MP <= presetNum && presetNum <= MODELS_ColmacCxA_30_MP) + { + setNumNodes(24); + setpoint_C = F_TO_C(135.0); + tankSizeFixed = false; + + doTempDepression = false; + tankMixesOnDraw = false; + + tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important + tankUA_kJperHrC = 7; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.perfMap.reserve(1); + compressor.hysteresis_dC = 0; + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = static_cast(getNumNodes() / 3) - 1; + + // logic conditions + std::vector nodeWeights; + nodeWeights.emplace_back(4); + compressor.addTurnOnLogic(std::make_shared( + "fourth node", nodeWeights, dF_TO_dC(5.), this)); + + std::vector nodeWeights1; + nodeWeights1.emplace_back(4); + compressor.addShutOffLogic(std::make_shared( + "fourth node", nodeWeights1, dF_TO_dC(0.), this, false, std::greater())); + + compressor.depressesTemperature = false; // no temp depression + + // Defrost Derate + compressor.setupDefrostMap(); + + if (presetNum == MODELS_ColmacCxV_5_MP) + { + setTankSize_adjustUA(200., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS( + 9.); // https://colmacwaterheat.com/wp-content/uploads/2020/10/Technical-Datasheet-Air-Source.pdf + + // logic conditions + compressor.minT = F_TO_C(-4.0); + compressor.maxT = F_TO_C(105.); + compressor.maxSetpoint_C = MAXOUTLET_R410A; + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {5.8438525529, + 0.0003288231, + -0.0494255840, + -0.0000386642, + 0.0004385362, + 0.0000647268}, // Input Power Coefficients (inputPower_coeffs) + + {0.6679056901, + 0.0499777846, + 0.0251828292, + 0.0000699764, + -0.0001552229, + -0.0002911167} // COP Coefficients (COP_coeffs) + }); + } + else + { + // logic conditions + compressor.minT = F_TO_C(40.); + compressor.maxT = F_TO_C(105.); + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + if (presetNum == MODELS_ColmacCxA_10_MP) + { + setTankSize_adjustUA(500., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(18.); + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {8.6918824405, + 0.0136666667, + -0.0548348214, + -0.0000208333, + 0.0005301339, + -0.0000250000}, // Input Power Coefficients (inputPower_coeffs) + + {0.6944181117, + 0.0445926666, + 0.0213188804, + 0.0001172913, + -0.0001387694, + -0.0002365885} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_ColmacCxA_15_MP) + { + setTankSize_adjustUA(600., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(26.); + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {12.4908723958, + 0.0073988095, + -0.0411417411, + 0.0000000000, + 0.0005789621, + 0.0000696429}, // Input Power Coefficients (inputPower_coeffs) + + {1.2846349520, + 0.0334658309, + 0.0019121906, + 0.0002840970, + 0.0000497136, + -0.0004401737} // COP Coefficients (COP_coeffs) + + }); + } + else if (presetNum == MODELS_ColmacCxA_20_MP) + { + setTankSize_adjustUA(800., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS( + 36.); // https://colmacwaterheat.com/wp-content/uploads/2020/10/Technical-Datasheet-Air-Source.pdf + + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {14.4893345424, + 0.0355357143, + -0.0476593192, + -0.0002916667, + 0.0006120954, + 0.0003607143}, // Input Power Coefficients (inputPower_coeffs) + + {1.2421582831, + 0.0450256569, + 0.0051234755, + 0.0001271296, + -0.0000299981, + -0.0002910606} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_ColmacCxA_25_MP) + { + setTankSize_adjustUA(1000., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(32.); + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {14.5805808222, + 0.0081934524, + -0.0216169085, + -0.0001979167, + 0.0007376535, + 0.0004955357}, // Input Power Coefficients (inputPower_coeffs) + + {2.0013175767, + 0.0576617432, + -0.0130480870, + 0.0000856818, + 0.0000610760, + -0.0003684106} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_ColmacCxA_30_MP) + { + setTankSize_adjustUA(1200., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(41.); + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {14.5824911644, + 0.0072083333, + -0.0278055246, + -0.0002916667, + 0.0008841378, + 0.0008125000}, // Input Power Coefficients (inputPower_coeffs) + + {2.6996807527, + 0.0617507969, + -0.0220966420, + 0.0000336149, + 0.0000890989, + -0.0003682431} // COP Coefficients (COP_coeffs) + }); + } + } + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + // If Nyle single pass preset + else if (MODELS_NyleC25A_SP <= presetNum && presetNum <= MODELS_NyleC250A_C_SP) + { + setNumNodes(96); + setpoint_C = F_TO_C(135.0); + tankSizeFixed = false; + + tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important + tankUA_kJperHrC = 7; + + doTempDepression = false; + tankMixesOnDraw = false; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.extrapolationMethod = EXTRAP_NEAREST; + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.isMultipass = false; + compressor.perfMap.reserve(1); + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = getNumNodes() - 1; + + // logic conditions + if (MODELS_NyleC25A_SP <= presetNum && presetNum <= MODELS_NyleC250A_SP) + { // If not cold weather package + compressor.minT = F_TO_C(40.); // Min air temperature sans Cold Weather Package + } + else + { + compressor.minT = F_TO_C(35.); // Min air temperature WITH Cold Weather Package + } + compressor.maxT = F_TO_C(120.0); // Max air temperature + compressor.hysteresis_dC = 0; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // Defines the maximum outlet temperature at the a low air temperature + compressor.maxOut_at_LowT.outT_C = F_TO_C(140.); + compressor.maxOut_at_LowT.airT_C = F_TO_C(40.); + + std::vector nodeWeights; + nodeWeights.emplace_back(4); + compressor.addTurnOnLogic(std::make_shared( + "fourth node", nodeWeights, dF_TO_dC(15), this, false)); + + // lowT cutoff + std::vector nodeWeights1; + nodeWeights1.emplace_back(1); + compressor.addShutOffLogic(std::make_shared( + "bottom node", nodeWeights1, dF_TO_dC(15.), this, false, std::greater(), true)); + compressor.depressesTemperature = false; // no temp depression + + // Defrost Derate + compressor.setupDefrostMap(); + + // Perfmaps for each compressor size + if (presetNum == MODELS_NyleC25A_SP) + { + setTankSize_adjustUA(200., UNITS_GAL); + compressor.perfMap.push_back({ + 90, // Temperature (T_F) + + {4.060120364, + -0.020584279, + -0.024201054, + -0.007023945, + 0.000017461, + 0.000110366, + 0.000060338, + 0.000120015, + 0.000111068, + 0.000138907, + -0.000001569}, // Input Power Coefficients (inputPower_coeffs) + + {0.462979529, + 0.065656840, + 0.001077377, + 0.003428059, + 0.000243692, + 0.000021522, + 0.000005143, + -0.000384778, + -0.000404744, + -0.000036277, + 0.000001900} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_NyleC60A_SP || presetNum == MODELS_NyleC60A_C_SP) + { + setTankSize_adjustUA(300., UNITS_GAL); + compressor.perfMap.push_back({ + 90, // Temperature (T_F) + + {-0.1180905709, + 0.0045354306, + 0.0314990479, + -0.0406839757, + 0.0002355294, + 0.0000818684, + 0.0001943834, + -0.0002160871, + 0.0003053633, + 0.0003612413, + -0.0000035912}, // Input Power Coefficients (inputPower_coeffs) + + {6.8205043418, + 0.0860385185, + -0.0748330699, + -0.0172447955, + 0.0000510842, + 0.0002187441, + -0.0000321036, + -0.0003311463, + -0.0002154270, + 0.0001307922, + 0.0000005568} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_NyleC90A_SP || presetNum == MODELS_NyleC90A_C_SP) + { + setTankSize_adjustUA(400., UNITS_GAL); + compressor.perfMap.push_back({ + 90, // Temperature (T_F) + + {13.27612215047, + -0.01014009337, + -0.13401028549, + -0.02325705976, + -0.00032515646, + 0.00040270625, + 0.00001988733, + 0.00069451670, + 0.00069067890, + 0.00071091372, + -0.00000854352}, // Input Power Coefficients (inputPower_coeffs) + + {1.49112327987, + 0.06616282153, + 0.00715307252, + -0.01269458185, + 0.00031448571, + 0.00001765313, + 0.00006002498, + -0.00045661397, + -0.00034003896, + -0.00004327766, + 0.00000176015} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_NyleC125A_SP || presetNum == MODELS_NyleC125A_C_SP) + { + setTankSize_adjustUA(500., UNITS_GAL); + compressor.perfMap.push_back({ + 90, // Temperature (T_F) + + {-3.558277209, + -0.038590968, + 0.136307181, + -0.016945699, + 0.000983753, + -5.18201E-05, + 0.000476904, + -0.000514211, + -0.000359172, + 0.000266509, + -1.58646E-07}, // Input Power Coefficients (inputPower_coeffs) + + {4.889555031, + 0.117102769, + -0.060005795, + -0.011871234, + -1.79926E-05, + 0.000207293, + -1.4452E-05, + -0.000492486, + -0.000376814, + 7.85911E-05, + 1.47884E-06} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_NyleC185A_SP || presetNum == MODELS_NyleC185A_C_SP) + { + setTankSize_adjustUA(800., UNITS_GAL); + compressor.perfMap.push_back({ + 90, // Temperature (T_F) + + {18.58007733, + -0.215324777, + -0.089782421, + 0.01503161, + 0.000332503, + 0.000274216, + 2.70498E-05, + 0.001387914, + 0.000449199, + 0.000829578, + -5.28641E-06}, // Input Power Coefficients (inputPower_coeffs) + + {-0.629432348, + 0.181466663, + 0.00044047, + 0.012104957, + -6.61515E-05, + 9.29975E-05, + 9.78042E-05, + -0.000872708, + -0.001013945, + -0.00021852, + 5.55444E-06} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_NyleC250A_SP || presetNum == MODELS_NyleC250A_C_SP) + { + setTankSize_adjustUA(800., UNITS_GAL); + + compressor.perfMap.push_back({ + 90, // Temperature (T_F) + + {-13.89057656, + 0.025902417, + 0.304250541, + 0.061695153, + -0.001474249, + -0.001126845, + -0.000220192, + 0.001241026, + 0.000571009, + -0.000479282, + 9.04063E-06}, // Input Power Coefficients (inputPower_coeffs) + + {7.443904067, + 0.185978755, + -0.098481635, + -0.002500073, + 0.000127658, + 0.000444321, + 0.000139547, + -0.001000195, + -0.001140199, + -8.77557E-05, + 4.87405E-06} // COP Coefficients (COP_coeffs) + }); + } + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + + // If Nyle multipass presets + else if (MODELS_NyleC60A_MP <= presetNum && presetNum <= MODELS_NyleC250A_C_MP) + { + setNumNodes(24); + setpoint_C = F_TO_C(135.0); + tankSizeFixed = false; + + doTempDepression = false; + tankMixesOnDraw = false; + + tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important + tankUA_kJperHrC = 7; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.extrapolationMethod = EXTRAP_NEAREST; + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.hysteresis_dC = 0; + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = static_cast(getNumNodes() / 3.) - 1; + + // logic conditions//logic conditions + if (MODELS_NyleC60A_MP <= presetNum && presetNum <= MODELS_NyleC250A_MP) + { // If not cold weather package + compressor.minT = F_TO_C(40.); // Min air temperature sans Cold Weather Package + } + else + { + compressor.minT = F_TO_C(35.); // Min air temperature WITH Cold Weather Package + } + compressor.maxT = F_TO_C(130.0); // Max air temperature + compressor.maxSetpoint_C = F_TO_C(160.); + + std::vector nodeWeights; + nodeWeights.emplace_back(4); + compressor.addTurnOnLogic(std::make_shared( + "fourth node", nodeWeights, dF_TO_dC(5.), this)); + + std::vector nodeWeights1; + nodeWeights1.emplace_back(4); + compressor.addShutOffLogic(std::make_shared( + "fourth node", nodeWeights1, dF_TO_dC(0.), this, false, std::greater())); + compressor.depressesTemperature = false; // no temp depression + + // Defrost Derate + compressor.setupDefrostMap(); + + // Performance grid + compressor.perfGrid.reserve(2); + compressor.perfGridValues.reserve(2); + + // Nyle MP models are all on the same grid axes + compressor.perfGrid.push_back({40., 60., 80., 90.}); // Grid Axis 1 Tair (F) + compressor.perfGrid.push_back({40., 60., 80., 100., 130., 150.}); // Grid Axis 2 Tin (F) + + if (presetNum == MODELS_NyleC60A_MP || presetNum == MODELS_NyleC60A_C_MP) + { + setTankSize_adjustUA(360., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(13.); + if (presetNum == MODELS_NyleC60A_C_MP) + { + compressor.resDefrost = { + 4.5, // inputPwr_kW; + 5.0, // constTempLift_dF; + 40.0 // onBelowT_F + }; + } + // Grid values in long format, table 1, input power (W) + compressor.perfGridValues.push_back({3.64, 4.11, 4.86, 5.97, 8.68, 9.95, 3.72, 4.27, + 4.99, 6.03, 8.55, 10.02, 3.98, 4.53, 5.24, 6.24, + 8.54, 9.55, 4.45, 4.68, 5.37, 6.34, 8.59, 9.55}); + // Grid values in long format, table 2, COP + compressor.perfGridValues.push_back( + {3.362637363, 2.917274939, 2.407407407, 1.907872697, 1.296082949, 1.095477387, + 4.438172043, 3.772833724, 3.132264529, 2.505804312, 1.678362573, 1.386227545, + 5.467336683, 4.708609272, 3.921755725, 3.169871795, 2.165105386, 1.860732984, + 5.512359551, 5.153846154, 4.290502793, 3.417981073, 2.272409779, 1.927748691}); + } + else if (presetNum == MODELS_NyleC90A_MP || presetNum == MODELS_NyleC90A_C_MP) + { + setTankSize_adjustUA(480., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(20.); + if (presetNum == MODELS_NyleC90A_C_MP) + { + compressor.resDefrost = { + 5.4, // inputPwr_kW; + 5.0, // constTempLift_dF; + 40.0 // onBelowT_F + }; + } + // Grid values in long format, table 1, input power (W) + compressor.perfGridValues.push_back( + {4.41, 6.04, 7.24, 9.14, 12.23, 14.73, 4.78, 6.61, 7.74, 9.40, 12.47, 14.75, + 5.51, 6.66, 8.44, 9.95, 13.06, 15.35, 6.78, 7.79, 8.81, 10.01, 11.91, 13.35}); + // Grid values in long format, table 2, COP + compressor.perfGridValues.push_back( + {4.79138322, 3.473509934, 2.801104972, 2.177242888, 1.569910057, 1.272233537, + 6.071129707, 4.264750378, 3.536175711, 2.827659574, 2.036086608, 1.666440678, + 7.150635209, 5.659159159, 4.305687204, 3.493467337, 2.487748851, 2.018241042, + 6.750737463, 5.604621309, 4.734392736, 3.94005994, 3.04534005, 2.558801498}); + } + else if (presetNum == MODELS_NyleC125A_MP || presetNum == MODELS_NyleC125A_C_MP) + { + setTankSize_adjustUA(600., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(28.); + if (presetNum == MODELS_NyleC125A_C_MP) + { + compressor.resDefrost = { + 9.0, // inputPwr_kW; + 5.0, // constTempLift_dF; + 40.0 // onBelowT_F + }; + } + // Grid values in long format, table 1, input power (W) + compressor.perfGridValues.push_back( + {6.4, 7.72, 9.65, 12.54, 20.54, 24.69, 6.89, 8.28, 10.13, 12.85, 19.75, 24.39, + 7.69, 9.07, 10.87, 13.44, 19.68, 22.35, 8.58, 9.5, 11.27, 13.69, 19.72, 22.4}); + // Grid values in long format, table 2, COP + compressor.perfGridValues.push_back( + {4.2390625, 3.465025907, 2.718134715, 2.060606061, 1.247809153, 1.016605913, + 5.374455733, 4.352657005, 3.453109576, 2.645136187, 1.66278481, 1.307093071, + 6.503250975, 5.276736494, 4.229070837, 3.27827381, 2.113821138, 1.770469799, + 6.657342657, 5.749473684, 4.612244898, 3.542731921, 2.221095335, 1.816964286}); + } + else if (presetNum == MODELS_NyleC185A_MP || presetNum == MODELS_NyleC185A_C_MP) + { + setTankSize_adjustUA(960., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(40.); + if (presetNum == MODELS_NyleC185A_C_MP) + { + compressor.resDefrost = { + 7.2, // inputPwr_kW; + 5.0, // constTempLift_dF; + 40.0 // onBelowTemp_F + }; + } + // Grid values in long format, table 1, input power (W) + compressor.perfGridValues.push_back( + {7.57, 11.66, 14.05, 18.3, 25.04, 30.48, 6.99, 10.46, 14.28, 18.19, 26.24, 32.32, + 7.87, 12.04, 15.02, 18.81, 25.99, 31.26, 8.15, 12.46, 15.17, 18.95, 26.23, 31.62}); + // Grid values in long format, table 2, COP + compressor.perfGridValues.push_back( + {5.531043593, 3.556603774, 2.918149466, 2.214754098, 1.590255591, 1.291010499, + 8.010014306, 5.258126195, 3.778711485, 2.916437603, 1.964176829, 1.56404703, + 9.65819568, 6.200166113, 4.792276964, 3.705475811, 2.561369758, 2.05950096, + 10.26993865, 6.350722311, 5.04218853, 3.841688654, 2.574151735, 2.025616698}); + } + else if (presetNum == MODELS_NyleC250A_MP || presetNum == MODELS_NyleC250A_C_MP) + { + setTankSize_adjustUA(960., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(50.); + if (presetNum == MODELS_NyleC250A_C_MP) + { + compressor.resDefrost = { + 18.0, // inputPwr_kW; + 5.0, // constTempLift_dF; + 40.0 // onBelowT_F + }; + } + // Grid values in long format, table 1, input power (W) + compressor.perfGridValues.push_back({10.89, 12.23, 13.55, 14.58, 15.74, 16.72, + 11.46, 13.76, 15.97, 17.79, 20.56, 22.50, + 10.36, 14.66, 18.07, 21.23, 25.81, 29.01, + 8.67, 15.05, 18.76, 21.87, 26.63, 30.02}); + + // Grid values in long format, table 2, COP + compressor.perfGridValues.push_back( + {5.81818181, 4.50040883, 3.69667896, 3.12414266, 2.38500635, 1.93540669, + 7.24520069, 5.50145348, 4.39323732, 3.67734682, 2.73249027, 2.23911111, + 10.6196911, 7.05320600, 5.41228555, 4.28638718, 3.04804339, 2.46053085, + 14.7831603, 7.77903268, 5.71801705, 4.40237768, 2.92489673, 2.21419054}); + } + + // Set up regular grid interpolator. + compressor.perfRGI = + new Btwxt::RegularGridInterpolator(compressor.perfGrid, compressor.perfGridValues); + compressor.useBtwxtGrid = true; + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + // if rheem multipass + else if (MODELS_RHEEM_HPHD60HNU_201_MP <= presetNum && + presetNum <= MODELS_RHEEM_HPHD135VNU_483_MP) + { + setNumNodes(24); + setpoint_C = F_TO_C(135.0); + tankSizeFixed = false; + + doTempDepression = false; + tankMixesOnDraw = false; + + tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important + tankUA_kJperHrC = 7; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.perfMap.reserve(1); + compressor.hysteresis_dC = 0; + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = static_cast(getNumNodes() / 3.) - 1; + + // logic conditions + std::vector nodeWeights; + nodeWeights.emplace_back(4); + compressor.addTurnOnLogic(std::make_shared( + "fourth node", nodeWeights, dF_TO_dC(5.), this)); + + std::vector nodeWeights1; + nodeWeights1.emplace_back(4); + compressor.addShutOffLogic(std::make_shared( + "fourth node", nodeWeights1, dF_TO_dC(0.), this, false, std::greater())); + compressor.depressesTemperature = false; // no temp depression + + // Defrost Derate + compressor.setupDefrostMap(); + + // logic conditions + compressor.minT = F_TO_C(45.); + compressor.maxT = F_TO_C(110.); + compressor.maxSetpoint_C = MAXOUTLET_R134A; // data says 150... + + if (presetNum == MODELS_RHEEM_HPHD60HNU_201_MP || + presetNum == MODELS_RHEEM_HPHD60VNU_201_MP) + { + setTankSize_adjustUA(250., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(17.4); + compressor.perfMap.push_back({ + 110, // Temperature (T_F) + + {1.8558438453, + 0.0120796155, + -0.0135443327, + 0.0000059621, + 0.0003010506, + -0.0000463525}, // Input Power Coefficients (inputPower_coeffs) + + {3.6840046360, + 0.0995685071, + -0.0398107723, + -0.0001903160, + 0.0000980361, + -0.0003469814} // COP Coefficients (COP_coeffs) + }); + } + else if (presetNum == MODELS_RHEEM_HPHD135HNU_483_MP || + presetNum == MODELS_RHEEM_HPHD135VNU_483_MP) + { + setTankSize_adjustUA(500., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(34.87); + compressor.perfMap.push_back({ + 110, // Temperature (T_F) + + {5.1838201136, + 0.0247312962, + -0.0120766440, + 0.0000493862, + 0.0005422089, + -0.0001385078}, // Input Power Coefficients (inputPower_coeffs) + + {5.0207181209, + 0.0442525790, + -0.0418284882, + 0.0000793531, + 0.0001132421, + -0.0002491563} // COP Coefficients (COP_coeffs) + }); + } + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + + else if (presetNum == MODELS_MITSUBISHI_QAHV_N136TAU_HPB_SP) + { + setNumNodes(96); + setpoint_C = 65; + + tankVolume_L = GAL_TO_L(500); + tankUA_kJperHrC = 12; + tankSizeFixed = false; + + doTempDepression = false; + tankMixesOnDraw = false; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.minT = F_TO_C(-13.); + compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = getNumNodes() - 1; + + // What to do about these?! + compressor.hysteresis_dC = 4; + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.isMultipass = false; + compressor.maxSetpoint_C = F_TO_C(176.1); + + // Turn on + std::vector nodeWeights; + nodeWeights.emplace_back(4); + compressor.addTurnOnLogic(std::make_shared( + "eighth node absolute", nodeWeights, F_TO_C(110.), this, true)); + + // lowT cutoff + std::vector nodeWeights1; + nodeWeights1.emplace_back(1); + compressor.addShutOffLogic(std::make_shared( + "bottom node", nodeWeights1, dF_TO_dC(15.), this, false, std::greater(), true)); + compressor.depressesTemperature = false; + + // Performance grid: externalT_F, Tout_F, condenserTemp_F + compressor.perfGrid.reserve(2); + compressor.perfGridValues.reserve(2); + compressor.perfGrid.push_back( + {-13, -11.2, -7.6, -4, -0.4, 3.2, 6.8, 10.4, 14, 17.6, 21.2, 24.8, + 28.4, 32, 35.6, 39.2, 42.8, 46.4, 50, 53.6, 57.2, 60.8, 64.4, 68, + 71.6, 75.2, 78.8, 82.4, 86, 89.6, 93.2, 96.8, 100.4, 104}); // Grid Axis 1 Tair (F) + compressor.perfGrid.push_back({140., 158., 176.}); // Grid Axis 2 Tout (F) + compressor.perfGrid.push_back({41, 48.2, 62.6, 75.2, 84.2}); // Grid Axis 3 Tin (F) + + // Grid values in long format, table 1, input power (Btu/hr) + compressor.perfGridValues.push_back( + {56518.565328, 57130.739544, 57094.73612, 57166.756616, + 57238.777112, 56518.565328, 57130.739544, 57094.73612, + 57166.756616, 57238.777112, 58061.348896, 58360.24692, + 58591.39286, 58870.368216, 59093.547136, 56626.5960719999, + 57202.763452, 57310.794196, 57310.794196, 57490.848848, + 56626.5960719999, 57202.763452, 57310.794196, 57310.794196, + 57490.848848, 58280.539188, 58519.65556, 58786.67868, + 59093.547136, 59372.5190799999, 56950.695128, 57850.95474, + 57814.947904, 57814.947904, 57922.978648, 56950.695128, + 57850.95474, 57814.947904, 57814.947904, 57922.978648, + 58679.067612, 58977.969048, 59372.5190799999, 59651.494436, + 59930.46638, 57418.831764, 58175.053796, 58283.08454, + 58247.07088, 58427.12212, 57418.831764, 58175.053796, + 58283.08454, 58247.07088, 58427.12212, 59137.384512, + 59376.504296, 59902.566456, 60265.23476, 60516.313604, + 57778.930832, 58643.190432, 58823.23826, 58643.190432, + 58967.282664, 57778.930832, 58643.190432, 58823.23826, + 58643.190432, 58967.282664, 59515.99368, 59954.377676, + 60321.031196, 60934.77152, 61213.743464, 58103.029888, + 59075.313408, 59219.357812, 59291.374896, 59579.45688, + 58103.029888, 59075.313408, 59219.357812, 59291.374896, + 59579.45688, 60014.159328, 60273.205192, 60934.77152, + 61436.922384, 61799.587276, 58535.152864, 59399.412464, + 59795.525192, 59903.555936, 60299.672076, 58535.152864, + 59399.412464, 59795.525192, 59903.555936, 60299.672076, + 60512.321564, 60751.448172, 61409.02246, 62022.769608, + 62329.641476, 58931.275828, 59651.4842, 60011.58668, + 60263.66524, 60551.747224, 58931.275828, 59651.4842, + 60011.58668, 60263.66524, 60551.747224, 60910.860224, + 61369.1703, 62022.769608, 62580.713496, 62803.895828, + 59219.357812, 60155.634496, 60443.71648, 60659.777968, + 61163.92144, 59219.357812, 60155.634496, 60443.71648, + 60659.777968, 61163.92144, 61329.321552, 61687.997816, + 62441.224112, 63166.56072, 63585.015224, 59651.4842, + 60479.726728, 61019.88386, 61163.92144, 61920.146884, + 59651.4842, 60479.726728, 61019.88386, 61163.92144, + 61920.146884, 61707.923896, 62186.166876, 63027.071336, + 63724.504608, 64170.862448, 59723.504696, 60839.83262, + 61379.993164, 61524.030744, 62352.273272, 59723.504696, + 60839.83262, 61379.993164, 61524.030744, 62352.273272, + 61966.96976, 62445.21274, 63361.839716, 64142.969348, + 64505.63424, 59759.511532, 60695.788216, 61524.030744, + 61884.136636, 62712.382576, 59759.511532, 60695.788216, + 61524.030744, 61884.136636, 62712.382576, 62166.240796, + 62744.114176, 63668.714996, 64282.451908, 64589.323776, + 59759.511532, 61019.88386, 61848.1298, 62064.191288, + 62964.4509, 59759.511532, 61019.88386, 61848.1298, + 62064.191288, 62964.4509, 62425.28666, 63003.16004, + 63975.58004, 64533.523928, 64617.2237, 59471.429548, + 61055.894108, 61956.160544, 62460.304016, 63216.526048, + 59471.429548, 61055.894108, 61956.160544, 62460.304016, + 63216.526048, 62624.550872, 63202.424252, 64310.351832, + 64756.70626, 64728.806336, 61632.061488, 63036.474808, + 63828.7105, 64296.847136, 65053.069168, 61632.061488, + 63036.474808, 63828.7105, 64296.847136, 65053.069168, + 63561.10734, 64099.125148, 65258.8605359999, 65593.625504, + 65621.525428, 51189.004268, 52917.506408, 54826.070024, + 57094.73612, 59327.388556, 51189.004268, 52917.506408, + 54826.070024, 57094.73612, 59327.388556, 55391.172288, + 58240.683616, 62106.459144, 65733.114888, 65705.214964, + 41286.100768, 42726.524336, 45931.460292, 49784.590948, + 53457.6669519999, 41286.100768, 42726.524336, 45931.460292, + 49784.590948, 53457.6669519999, 49433.093532, 51067.083272, + 57921.8561, 61604.3082799999, 64477.734316, 35632.444064, + 37108.87788, 41394.134924, 45139.228012, 49568.526048, + 35632.444064, 37108.87788, 41394.134924, 45139.228012, + 49568.526048, 47540.06134, 47221.233824, 56080.631716, + 59539.904976, 61883.276812, 34192.023908, 35596.430404, + 39809.6669519999, 43410.72246, 47659.969256, 34192.023908, + 35596.430404, 39809.6669519999, 43410.72246, 47659.969256, + 47559.98742, 47061.821772, 54490.482764, 57893.959588, + 60153.648712, 32895.641332, 34192.023908, 38225.202392, + 41646.20666, 45751.409052, 32895.641332, 34192.023908, + 38225.202392, 41646.20666, 45751.409052, 47659.621232, + 46842.624656, 52956.13366, 56220.1211, 58312.420916, + 31563.25192, 32715.58668, 36532.707088, 39881.687448, + 43914.869344, 31563.25192, 32715.58668, 36532.707088, + 39881.687448, 43914.869344, 47719.402884, 46742.994256, + 51393.877808, 54518.382688, 56554.886068, 30194.85226, + 31347.18702, 35092.286932, 38117.171648, 42006.312552, + 30194.85226, 31347.18702, 35092.286932, 38117.171648, + 42006.312552, 47799.1072039999, 46324.532928, 49692.139396, + 52732.951328, 54769.45812, 30446.923996, 31383.197268, + 34300.054652, 37144.884716, 40781.953884, 30446.923996, + 31383.197268, 34300.054652, 37144.884716, 40781.953884, + 45547.391924, 44212.307032, 47320.867636, 50389.57608, + 52202.90054, 30698.995732, 31311.176772, 33723.88386, + 36316.6456, 39701.636208, 30698.995732, 31311.176772, + 33723.88386, 36316.6456, 39701.636208, 43295.680056, + 41980.517832, 45089.078436, 47795.121988, 49720.03932, + 30987.081128, 31311.176772, 33183.726728, 35344.358668, + 38477.27754, 30987.081128, 31311.176772, 33183.726728, + 35344.358668, 38477.27754, 41562.059916, 40486.017476, + 43415.236536, 46037.590552, 47795.121988, 31203.146028, + 31311.176772, 32571.545688, 34552.126388, 37360.949616, + 31203.146028, 31311.176772, 32571.545688, 34552.126388, + 37360.949616, 40486.017476, 39310.3446359999, 42159.859376, + 44782.20998, 46511.844904, 31167.132368, 31311.176772, + 32355.4842, 34156.010248, 36712.758328, 31167.132368, + 31311.176772, 32355.4842, 34156.010248, 36712.758328, + 39449.830608, 38353.862088, 41127.657724, 43666.31538, + 45284.360844, 31059.101624, 31131.12212, 32319.473952, + 34156.010248, 36748.771988, 31059.101624, 31131.12212, + 32319.473952, 34156.010248, 36748.771988, 38592.985284, + 37457.161192, 40151.249096, 42801.496212, 44419.541676, + 30879.050384, 31023.091376, 32319.473952, 34192.023908, + 36820.789072, 30879.050384, 31023.091376, 32319.473952, + 34192.023908, 36820.789072, 37756.062628, 36680.0236, + 39258.536828, 41797.194484, 43387.343436, 30807.029888, + 30951.07088, 32427.504696, 34156.010248, 36748.771988, + 30807.029888, 30951.07088, 32427.504696, 34156.010248, + 36748.771988, 37795.9182, 36779.657412, 39258.536828, + 41769.29456, 43331.547, 30626.976942, 30735.007686, + 32319.473952, 34156.010248, 36748.771988, 30626.976942, + 30735.007686, 32319.473952, 34156.010248, 36748.771988, + 37815.84428, 36779.657412, 39286.431634, 41825.090996, + 43359.446924, 30446.923996, 30518.944492, 32355.4842, + 34264.040992, 36820.789072, 30446.923996, 30518.944492, + 32355.4842, 34264.040992, 36820.789072, 37775.988708, + 36759.731332, 39286.431634, 41825.090996, 43359.446924, + 30230.859096, 30410.913748, 32319.473952, 34192.023908, + 36748.771988, 30230.859096, 30410.913748, 32319.473952, + 34192.023908, 36748.771988, 37775.988708, 36759.731332, + 39342.226364, 41825.090996, 43303.650488, 30194.85226, + 30194.85226, 32391.491036, 34156.010248, 36748.771988, + 30194.85226, 30194.85226, 32391.491036, 34156.010248, + 36748.771988, 37756.062628, 36779.657412, 39342.226364, + 41825.090996, 43359.446924}); + + // Grid values in long format, table 2, COP + compressor.perfGridValues.push_back( + {1.177126, 1.1393, 1.091664, 1.033858, 0.981755, 1.177126, 1.1393, 1.091664, + 1.033858, 0.981755, 1.134534, 1.106615, 1.04928, 0.989101, 0.946182, 1.228935, + 1.190326, 1.136507, 1.075244, 1.023802, 1.228935, 1.190326, 1.136507, 1.075244, + 1.023802, 1.174944, 1.147101, 1.087318, 1.026909, 0.980265, 1.324165, 1.27451, + 1.218468, 1.156182, 1.103823, 1.324165, 1.27451, 1.218468, 1.156182, 1.103823, + 1.267595, 1.236929, 1.165864, 1.102888, 1.052601, 1.415804, 1.365212, 1.301359, + 1.238022, 1.180586, 1.415804, 1.365212, 1.301359, 1.238022, 1.180586, 1.358408, + 1.324943, 1.249272, 1.179609, 1.128155, 1.510855, 1.453792, 1.381237, 1.31747, + 1.253435, 1.510855, 1.453792, 1.381237, 1.31747, 1.253435, 1.446639, 1.404653, + 1.331368, 1.249056, 1.195511, 1.60469, 1.540079, 1.462451, 1.39417, 1.326987, + 1.60469, 1.540079, 1.462451, 1.39417, 1.326987, 1.529924, 1.492107, 1.404944, + 1.325122, 1.265433, 1.690249, 1.630494, 1.539446, 1.464082, 1.395939, 1.690249, + 1.630494, 1.539446, 1.464082, 1.395939, 1.610302, 1.56761, 1.479273, 1.393118, + 1.33076, 1.776046, 1.715967, 1.624662, 1.540783, 1.469819, 1.776046, 1.715967, + 1.624662, 1.540783, 1.469819, 1.693465, 1.646725, 1.550545, 1.459601, 1.400666, + 1.865309, 1.797965, 1.703902, 1.612645, 1.539888, 1.865309, 1.797965, 1.703902, + 1.612645, 1.539888, 1.776866, 1.728095, 1.626829, 1.531743, 1.461555, 1.956837, + 1.881215, 1.777073, 1.690021, 1.603082, 1.956837, 1.881215, 1.777073, 1.690021, + 1.603082, 1.857512, 1.807899, 1.699347, 1.599321, 1.526899, 2.038891, 1.956496, + 1.848049, 1.757975, 1.668207, 2.038891, 1.956496, 1.848049, 1.757975, 1.668207, + 1.934721, 1.878022, 1.764777, 1.657606, 1.583414, 2.110576, 2.028182, 1.922739, + 1.818155, 1.725237, 2.110576, 2.028182, 1.922739, 1.818155, 1.725237, 1.997516, + 1.937435, 1.824625, 1.712596, 1.630169, 2.185899, 2.091178, 1.989083, 1.883087, + 1.786388, 2.185899, 2.091178, 1.989083, 1.883087, 1.786388, 2.06464, 2.003084, + 1.88041, 1.763428, 1.68041, 2.29337, 2.155411, 2.063354, 1.942635, 1.844204, + 2.29337, 2.155411, 2.063354, 1.942635, 1.844204, 2.125448, 2.061323, 1.933955, + 1.810339, 1.720612, 2.213555, 2.111682, 2.027503, 1.91515, 1.819817, 2.213555, + 2.111682, 2.027503, 1.91515, 1.819817, 2.126499, 2.064584, 1.935343, 1.818713, + 1.728239, 2.665142, 2.578088, 2.488506, 2.388206, 2.29651, 2.665142, 2.578088, + 2.488506, 2.388206, 2.29651, 2.46407, 2.344111, 2.198428, 2.057188, 1.96338, + 3.304405, 3.191319, 2.971384, 2.741049, 2.550691, 3.304405, 3.191319, 2.971384, + 2.741049, 2.550691, 2.763177, 2.673398, 2.356773, 2.216348, 2.116712, 3.827691, + 3.676371, 3.297085, 3.022338, 2.752997, 3.827691, 3.676371, 3.297085, 3.022338, + 2.752997, 2.871739, 2.890389, 2.434648, 2.292726, 2.205906, 3.989995, 3.834598, + 3.428313, 3.14185, 2.862486, 3.989995, 3.834598, 3.428313, 3.14185, 2.862486, + 2.871269, 2.900921, 2.506208, 2.358391, 2.270261, 4.147236, 3.992101, 3.570419, + 3.274967, 2.982684, 4.147236, 3.992101, 3.570419, 3.274967, 2.982684, 2.865266, + 2.913751, 2.578296, 2.428607, 2.341945, 4.322305, 4.172262, 3.73583, 3.419865, + 3.107421, 4.322305, 4.172262, 3.73583, 3.419865, 3.107421, 2.861677, 2.919962, + 2.65667, 2.504413, 2.414725, 4.518187, 4.354394, 3.889174, 3.578177, 3.248607, + 4.518187, 4.354394, 3.889174, 3.578177, 3.248607, 2.856905, 2.946338, 2.747649, + 2.589208, 2.493442, 4.481963, 4.349398, 3.979002, 3.671837, 3.346137, 4.481963, + 4.349398, 3.979002, 3.671837, 3.346137, 2.998141, 3.087098, 2.885335, 2.709619, + 2.616032, 4.445162, 4.359402, 4.046983, 3.755577, 3.437188, 4.445162, 4.359402, + 4.046983, 3.755577, 3.437188, 3.154067, 3.251216, 3.028152, 2.856705, 2.746669, + 4.402673, 4.359402, 4.112859, 3.858889, 3.546561, 4.402673, 4.359402, 4.112859, + 3.858889, 3.546561, 3.285629, 3.371232, 3.1449, 2.965763, 2.857289, 4.373341, + 4.359402, 4.19016, 3.947368, 3.65253, 4.373341, 4.359402, 4.19016, 3.947368, + 3.65253, 3.372955, 3.472057, 3.238544, 3.048902, 2.936122, 4.378394, 4.359402, + 4.218141, 3.993147, 3.717018, 4.378394, 4.359402, 4.218141, 3.993147, 3.717018, + 3.461548, 3.558644, 3.319824, 3.126817, 3.015709, 4.391304, 4.384616, 4.222841, + 3.993147, 3.713376, 4.391304, 4.384616, 4.222841, 3.993147, 3.713376, 3.538402, + 3.643836, 3.400556, 3.189995, 3.074423, 4.419242, 4.399884, 4.222841, 3.988941, + 3.706113, 4.419242, 4.399884, 4.222841, 3.988941, 3.706113, 3.616836, 3.721038, + 3.477882, 3.266644, 3.147565, 4.429573, 4.410122, 4.208773, 3.993147, 3.713376, + 4.429573, 4.410122, 4.208773, 3.993147, 3.713376, 3.613022, 3.710957, 3.477882, + 3.268826, 3.151618, 4.45679, 4.441125, 4.222841, 3.993147, 3.713376, 4.45679, + 4.441125, 4.222841, 3.993147, 3.713376, 3.611119, 3.710957, 3.475413, 3.264466, + 3.14959, 4.483146, 4.472566, 4.218141, 3.980557, 3.706113, 4.483146, 4.472566, + 4.218141, 3.980557, 3.706113, 3.614928, 3.712969, 3.475413, 3.264466, 3.14959, + 4.515188, 4.488454, 4.222841, 3.988941, 3.713376, 4.515188, 4.488454, 4.222841, + 3.988941, 3.713376, 3.614928, 3.712969, 3.470484, 3.264466, 3.153648, 4.522957, + 4.520572, 4.213452, 3.993147, 3.713376, 4.522957, 4.520572, 4.213452, 3.993147, + 3.713376, 3.616836, 3.710957, 3.470484, 3.264466, 3.14959}); + + // Set up regular grid interpolator. + Btwxt::GridAxis g0(compressor.perfGrid[0], + "TAir", + Btwxt::InterpolationMethod::linear, + Btwxt::ExtrapolationMethod::constant); + Btwxt::GridAxis g1(compressor.perfGrid[1], + "TOut", + Btwxt::InterpolationMethod::linear, + Btwxt::ExtrapolationMethod::constant); + Btwxt::GridAxis g2(compressor.perfGrid[2], + "TIn", + Btwxt::InterpolationMethod::linear, + Btwxt::ExtrapolationMethod::linear); + + std::vector gx {g0, g1, g2}; + + compressor.perfRGI = new Btwxt::RegularGridInterpolator(gx, compressor.perfGridValues); + compressor.useBtwxtGrid = true; + + compressor.secondaryHeatExchanger = {dF_TO_dC(10.), dF_TO_dC(15.), 27.}; + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + + else if (presetNum == MODELS_SANCO2_83 || presetNum == MODELS_SANCO2_GS3_45HPA_US_SP || + presetNum == MODELS_SANCO2_119) + { + setNumNodes(96); + setpoint_C = 65; + setpointFixed = true; + + if (presetNum == MODELS_SANCO2_119) + { + tankVolume_L = GAL_TO_L(119); + tankUA_kJperHrC = 9; + } + else + { + tankVolume_L = 315; + tankUA_kJperHrC = 7; + if (presetNum == MODELS_SANCO2_GS3_45HPA_US_SP) + { + tankSizeFixed = false; + } + } + + doTempDepression = false; + tankMixesOnDraw = false; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.minT = F_TO_C(-25.); + compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = getNumNodes() - 1; + + compressor.perfMap.reserve(5); + + compressor.perfMap.push_back({ + 17, // Temperature (T_F) + {1650, 5.5, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {3.2, -0.015, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 35, // Temperature (T_F) + {1100, 4.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {3.7, -0.015, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {880, 3.1, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.25, -0.025, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {740, 4.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {6.2, -0.03, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95, // Temperature (T_F) + {790, 2, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.15, -0.04, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.hysteresis_dC = 4; + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.isMultipass = false; + compressor.maxSetpoint_C = MAXOUTLET_R744; + + std::vector nodeWeights; + nodeWeights.emplace_back(8); + compressor.addTurnOnLogic(std::make_shared( + "eighth node absolute", nodeWeights, F_TO_C(113), this, true)); + if (presetNum == MODELS_SANCO2_83 || presetNum == MODELS_SANCO2_119) + { + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(8.2639))); + // Adds a bonus standby logic so the external heater does not cycle, recommended for any + // external heater with standby + std::vector nodeWeightStandby; + nodeWeightStandby.emplace_back(0); + compressor.standbyLogic = + std::make_shared("bottom node absolute", + nodeWeightStandby, + F_TO_C(113), + this, + true, + std::greater()); + } + // lowT cutoff + std::vector nodeWeights1; + nodeWeights1.emplace_back(1); + compressor.addShutOffLogic( + std::make_shared("bottom node absolute", + nodeWeights1, + F_TO_C(135), + this, + true, + std::greater(), + true)); + compressor.depressesTemperature = false; // no temp depression + + // set everything in its place + heatSources.resize(1); + heatSources[0] = compressor; + } + else if (presetNum == MODELS_SANCO2_43) + { + setNumNodes(96); + setpoint_C = 65; + setpointFixed = true; + + tankVolume_L = 160; + // tankUA_kJperHrC = 10; //0 to turn off + tankUA_kJperHrC = 5; + + doTempDepression = false; + tankMixesOnDraw = false; + + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.minT = F_TO_C(-25.); + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = getIndexTopNode(); + + compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + + compressor.perfMap.reserve(5); + + compressor.perfMap.push_back({ + 17, // Temperature (T_F) + {1650, 5.5, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {3.2, -0.015, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 35, // Temperature (T_F) + {1100, 4.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {3.7, -0.015, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {880, 3.1, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.25, -0.025, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {740, 4.0, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {6.2, -0.03, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95, // Temperature (T_F) + {790, 2, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.15, -0.04, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.hysteresis_dC = 4; + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.isMultipass = false; + compressor.maxSetpoint_C = MAXOUTLET_R744; + + std::vector nodeWeights; + nodeWeights.emplace_back(4); + std::vector nodeWeightStandby; + nodeWeightStandby.emplace_back(0); + compressor.addTurnOnLogic(std::make_shared( + "fourth node absolute", nodeWeights, F_TO_C(113), this, true)); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(8.2639))); + compressor.standbyLogic = + std::make_shared("bottom node absolute", + nodeWeightStandby, + F_TO_C(113), + this, + true, + std::greater()); + + // lowT cutoff + std::vector nodeWeights1; + nodeWeights1.emplace_back(1); + compressor.addShutOffLogic( + std::make_shared("bottom twelfth absolute", + nodeWeights1, + F_TO_C(135), + this, + true, + std::greater(), + true)); + compressor.depressesTemperature = false; // no temp depression + + // set everything in its place + heatSources.resize(1); + heatSources[0] = compressor; + } + else if (presetNum == MODELS_AOSmithHPTU50 || presetNum == MODELS_RheemHBDR2250 || + presetNum == MODELS_RheemHBDR4550) + { + setNumNodes(24); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = 171; + tankUA_kJperHrC = 6; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + double split = 1.0 / 5.0; + compressor.setCondensity({split, split, split, split, split, 0, 0, 0, 0, 0, 0, 0}); + + // performance map + compressor.perfMap.reserve(3); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {170, 2.02, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.93, -0.027, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {144.5, 2.42, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.67, -0.037, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95, // Temperature (T_F) + {94.1, 3.15, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {11.1, -0.056, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(42.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + if (presetNum == MODELS_RheemHBDR2250) + { + resistiveElementTop.setupAsResistiveElement(8, 2250); + } + else + { + resistiveElementTop.setupAsResistiveElement(8, 4500); + } + resistiveElementTop.isVIP = true; + + // bottom resistor values + if (presetNum == MODELS_RheemHBDR2250) + { + resistiveElementBottom.setupAsResistiveElement(0, 2250); + } + else + { + resistiveElementBottom.setupAsResistiveElement(0, 4500); + } + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + double compStart = dF_TO_dC(35); + double standbyT = dF_TO_dC(9); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); + + std::vector nodeWeights; + nodeWeights.emplace_back(11); + nodeWeights.emplace_back(12); + resistiveElementTop.addTurnOnLogic(std::make_shared( + "top sixth absolute", nodeWeights, F_TO_C(105), this, true)); + // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(28))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + heatSources[0].companionHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_AOSmithHPTU66 || presetNum == MODELS_RheemHBDR2265 || + presetNum == MODELS_RheemHBDR4565) + { + setNumNodes(24); + setpoint_C = F_TO_C(127.0); + + if (presetNum == MODELS_AOSmithHPTU66) + { + tankVolume_L = 244.6; + } + else + { + tankVolume_L = 221.4; + } + tankUA_kJperHrC = 8; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + // double split = 1.0 / 4.0; + compressor.setCondensity({1., 0., 0.}); + + // performance map + compressor.perfMap.reserve(3); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {170, 2.02, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.93, -0.027, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {144.5, 2.42, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.67, -0.037, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95, // Temperature (T_F) + {94.1, 3.15, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {11.1, -0.056, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(42.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + if (presetNum == MODELS_RheemHBDR2265) + { + resistiveElementTop.setupAsResistiveElement(8, 2250); + } + else + { + resistiveElementTop.setupAsResistiveElement(8, 4500); + } + resistiveElementTop.isVIP = true; + + // bottom resistor values + if (presetNum == MODELS_RheemHBDR2265) + { + resistiveElementBottom.setupAsResistiveElement(0, 2250); + } + else + { + resistiveElementBottom.setupAsResistiveElement(0, 4500); + } + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + double compStart = dF_TO_dC(35); + double standbyT = dF_TO_dC(9); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); + + std::vector nodeWeights; + nodeWeights.emplace_back(11); + nodeWeights.emplace_back(12); + resistiveElementTop.addTurnOnLogic(std::make_shared( + "top sixth absolute", nodeWeights, F_TO_C(105), this, true)); + // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(31))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + heatSources[0].companionHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_AOSmithHPTU80 || presetNum == MODELS_RheemHBDR2280 || + presetNum == MODELS_RheemHBDR4580) + { + setNumNodes(24); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = 299.5; + tankUA_kJperHrC = 9; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // double split = 1.0 / 3.0; + compressor.setCondensity({1., 0., 0., 0.}); + + compressor.perfMap.reserve(3); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {170, 2.02, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.93, -0.027, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {144.5, 2.42, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.67, -0.037, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95, // Temperature (T_F) + {94.1, 3.15, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {11.1, -0.056, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(42.0); + compressor.maxT = F_TO_C(120.0); + compressor.hysteresis_dC = dF_TO_dC(1); + + // top resistor values + if (presetNum == MODELS_RheemHBDR2280) + { + resistiveElementTop.setupAsResistiveElement(8, 2250); + } + else + { + resistiveElementTop.setupAsResistiveElement(8, 4500); + } + resistiveElementTop.isVIP = true; + + // bottom resistor values + if (presetNum == MODELS_RheemHBDR2280) + { + resistiveElementBottom.setupAsResistiveElement(0, 2250); + } + else + { + resistiveElementBottom.setupAsResistiveElement(0, 4500); + } + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + double compStart = dF_TO_dC(35); + double standbyT = dF_TO_dC(9); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); + + std::vector nodeWeights; + // nodeWeights.emplace_back(9); nodeWeights.emplace_back(10); + nodeWeights.emplace_back(11); + nodeWeights.emplace_back(12); + resistiveElementTop.addTurnOnLogic(std::make_shared( + "top sixth absolute", nodeWeights, F_TO_C(105), this, true)); + // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(35))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + heatSources[0].companionHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_AOSmithHPTU80_DR) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = 283.9; + tankUA_kJperHrC = 9; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 47, // Temperature (T_F) + {142.6, 2.152, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {6.989258, -0.038320, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {120.14, 2.513, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {8.188, -0.0432, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(42.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(8, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + double compStart = dF_TO_dC(34.1636); + double standbyT = dF_TO_dC(7.1528); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80.108))); + + // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(39.9691))); + resistiveElementTop.addTurnOnLogic(HPWH::topThird_absolute(F_TO_C(87))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_AOSmithCAHP120) + { + setNumNodes(24); + setpoint_C = F_TO_C(150.0); + + tankVolume_L = GAL_TO_L(111.76); // AOSmith docs say 111.76 + tankUA_kJperHrC = UAf_TO_UAc(3.94); + + doTempDepression = false; + tankMixesOnDraw = false; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({0.3, 0.3, 0.2, 0.1, 0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}); + + // From CAHP 120 COP Tests + compressor.perfMap.reserve(3); + + // Tuned on the multiple K167 tests + compressor.perfMap.push_back({ + 50., // Temperature (T_F) + {2010.49966, -4.20966, 0.085395}, // Input Power Coefficients (inputPower_coeffs) + {5.91, -0.026299, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67.5, // Temperature (T_F) + {2171.012, -6.936571, 0.1094962}, // Input Power Coefficients (inputPower_coeffs) + {7.26272, -0.034135, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95., // Temperature (T_F) + {2276.0625, -7.106608, 0.119911}, // Input Power Coefficients (inputPower_coeffs) + {8.821262, -0.042059, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = + F_TO_C(47.0); // Product documentation says 45F doesn't look like it in CMP-T test// + compressor.maxT = F_TO_C(110.0); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + double wattRE = 6000; // 5650.; + resistiveElementTop.setupAsResistiveElement(7, wattRE); + resistiveElementTop.isVIP = true; // VIP is the only source that turns on independently when + // something else is already heating. + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, wattRE); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + resistiveElementBottom.setCondensity( + {0.2, 0.8, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}); // Based of CMP test + + // logic conditions for + double compStart = dF_TO_dC(5.25); + double standbyT = dF_TO_dC(5.); // Given CMP_T test + compressor.addTurnOnLogic(HPWH::secondSixth(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + double resistanceStart = 12.; + resistiveElementTop.addTurnOnLogic(HPWH::topThird(resistanceStart)); + resistiveElementBottom.addTurnOnLogic(HPWH::topThird(resistanceStart)); + + resistiveElementTop.addShutOffLogic(HPWH::fifthSixthMaxTemp(F_TO_C(117.))); + resistiveElementBottom.addShutOffLogic(HPWH::secondSixthMaxTemp(F_TO_C(109.))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + // heatSources[2].followedByHeatSource = &heatSources[1];; + + heatSources[0].companionHeatSource = &heatSources[1]; + heatSources[1].companionHeatSource = &heatSources[2]; + } + else if (MODELS_AOSmithHPTS50 <= presetNum && presetNum <= MODELS_AOSmithHPTS80) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + if (presetNum == MODELS_AOSmithHPTS50) + { + tankVolume_L = GAL_TO_L(45.6); + tankUA_kJperHrC = 6.403; + } + else if (presetNum == MODELS_AOSmithHPTS66) + { + tankVolume_L = GAL_TO_L(67.63); + tankUA_kJperHrC = UAf_TO_UAc(1.5) * 6.403 / UAf_TO_UAc(1.16); + } + else if (presetNum == MODELS_AOSmithHPTS80) + { + tankVolume_L = GAL_TO_L(81.94); + tankUA_kJperHrC = UAf_TO_UAc(1.73) * 6.403 / UAf_TO_UAc(1.16); + } + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementTop(this); + HeatSource resistiveElementBottom(this); + + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({0, 0.2, 0.2, 0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0}); + + // performance map + compressor.perfMap.reserve(3); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {66.82, 2.49, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {8.64, -0.0436, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67.5, // Temperature (T_F) + {85.1, 2.38, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {10.82, -0.0551, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95, // Temperature (T_F) + {89, 2.62, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {12.52, -0.0534, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(1.); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + resistiveElementTop.setupAsResistiveElement(8, 4500); + resistiveElementTop.isVIP = true; + + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + double compStart = dF_TO_dC(30.2); + double standbyT = dF_TO_dC(9); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(11.87))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[2]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + heatSources[0].companionHeatSource = &heatSources[2]; + } + + else if (presetNum == MODELS_GE2014STDMode) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(45); + tankUA_kJperHrC = 6.5; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(19.6605))); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(86.1111))); + + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(12.392))); + // compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(65))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_GE2014STDMode_80) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(75.4); + tankUA_kJperHrC = 10.; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(19.6605))); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(86.1111))); + + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(12.392))); + compressor.minT = F_TO_C(37); + // compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(65))); + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_GE2014) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(45); + tankUA_kJperHrC = 6.5; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); + resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); + + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); + // compressor.addShutOffLogic(HPWH::largerDraw(F_TO_C(62.4074))); + + resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_GE2014_80) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(75.4); + tankUA_kJperHrC = 10.; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); + resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); + + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); + // compressor.addShutOffLogic(HPWH::largerDraw(F_TO_C(62.4074))); + + resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_GE2014_80DR) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(75.4); + tankUA_kJperHrC = 10.; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + // resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); + resistiveElementTop.addTurnOnLogic(HPWH::topThird_absolute(F_TO_C(87))); + // resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); + + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); + // compressor.addShutOffLogic(HPWH::largerDraw(F_TO_C(62.4074))); + + resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); + // resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + // PRESET USING GE2014 DATA + else if (presetNum == MODELS_BWC2020_65) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(64); + tankUA_kJperHrC = 7.6; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); + resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); + + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); + // compressor.addShutOffLogic(HPWH::largerDraw(F_TO_C(62.4074))); + + resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + } + // If Rheem Premium + else if (MODELS_Rheem2020Prem40 <= presetNum && presetNum <= MODELS_Rheem2020Prem80) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + if (presetNum == MODELS_Rheem2020Prem40) + { + tankVolume_L = GAL_TO_L(36.1); + tankUA_kJperHrC = 9.5; + } + else if (presetNum == MODELS_Rheem2020Prem50) + { + tankVolume_L = GAL_TO_L(45.1); + tankUA_kJperHrC = 8.55; + } + else if (presetNum == MODELS_Rheem2020Prem65) + { + tankVolume_L = GAL_TO_L(58.5); + tankUA_kJperHrC = 10.64; + } + else if (presetNum == MODELS_Rheem2020Prem80) + { + tankVolume_L = GAL_TO_L(72.0); + tankUA_kJperHrC = 10.83; + } + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({0.2, 0.2, 0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0, 0}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {250, -1.0883, 0.0176}, // Input Power Coefficients (inputPower_coeffs) + {6.7, -0.0087, -0.0002} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {275.0, -0.6631, 0.01571}, // Input Power Coefficients (inputPower_coeffs) + {7.0, -0.0168, -0.0001} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.0); + compressor.hysteresis_dC = dF_TO_dC(1); + compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(8, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); + + // logic conditions + double compStart = dF_TO_dC(32); + double standbyT = dF_TO_dC(9); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); + resistiveElementTop.addTurnOnLogic(HPWH::topSixth(dF_TO_dC(20.4167))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[1].backupHeatSource = &heatSources[2]; + heatSources[2].backupHeatSource = &heatSources[1]; + + heatSources[0].followedByHeatSource = &heatSources[2]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + heatSources[0].companionHeatSource = &heatSources[2]; + } + + // If Rheem Build + else if (MODELS_Rheem2020Build40 <= presetNum && presetNum <= MODELS_Rheem2020Build80) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + if (presetNum == MODELS_Rheem2020Build40) + { + tankVolume_L = GAL_TO_L(36.1); + tankUA_kJperHrC = 9.5; + } + else if (presetNum == MODELS_Rheem2020Build50) + { + tankVolume_L = GAL_TO_L(45.1); + tankUA_kJperHrC = 8.55; + } + else if (presetNum == MODELS_Rheem2020Build65) + { + tankVolume_L = GAL_TO_L(58.5); + tankUA_kJperHrC = 10.64; + } + else if (presetNum == MODELS_Rheem2020Build80) + { + tankVolume_L = GAL_TO_L(72.0); + tankUA_kJperHrC = 10.83; + } + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({0.2, 0.2, 0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0, 0}); + + compressor.perfMap.reserve(2); + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {220.0, 0.8743, 0.00454}, // Input Power Coefficients (inputPower_coeffs) + {7.96064, -0.0448, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {275.0, -0.6631, 0.01571}, // Input Power Coefficients (inputPower_coeffs) + {8.45936, -0.04539, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.hysteresis_dC = dF_TO_dC(1); + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.0); + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(8, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(4); + + // logic conditions + double compStart = dF_TO_dC(30); + double standbyT = dF_TO_dC(9); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); + resistiveElementTop.addTurnOnLogic(HPWH::topSixth(dF_TO_dC(20.4167))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[1].backupHeatSource = &heatSources[2]; + heatSources[2].backupHeatSource = &heatSources[1]; + + heatSources[0].followedByHeatSource = &heatSources[2]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + heatSources[0].companionHeatSource = &heatSources[2]; + } + else if (MODELS_RheemPlugInShared40 <= presetNum && presetNum <= MODELS_RheemPlugInShared80) + { + setNumNodes(12); + + if (presetNum == MODELS_RheemPlugInShared40) + { + tankVolume_L = GAL_TO_L(36.0); + tankUA_kJperHrC = 9.5; + setpoint_C = F_TO_C(140.0); + } + else if (presetNum == MODELS_RheemPlugInShared50) + { + tankVolume_L = GAL_TO_L(45.0); + tankUA_kJperHrC = 8.55; + setpoint_C = F_TO_C(140.0); + } + else if (presetNum == MODELS_RheemPlugInShared65) + { + tankVolume_L = GAL_TO_L(58.5); + tankUA_kJperHrC = 10.64; + setpoint_C = F_TO_C(127.0); + } + else if (presetNum == MODELS_RheemPlugInShared80) + { + tankVolume_L = GAL_TO_L(72.0); + tankUA_kJperHrC = 10.83; + setpoint_C = F_TO_C(127.0); + } + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({0.2, 0.2, 0.2, 0.2, 0.2, 0, 0, 0, 0, 0, 0, 0}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {250, -1.0883, 0.0176}, // Input Power Coefficients (inputPower_coeffs) + {6.7, -0.0087, -0.0002} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {275.0, -0.6631, 0.01571}, // Input Power Coefficients (inputPower_coeffs) + {7.0, -0.0168, -0.0001} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.0); + compressor.hysteresis_dC = dF_TO_dC(1); + compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // logic conditions + double compStart = dF_TO_dC(32); + double standbyT = dF_TO_dC(9); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + else if (presetNum == MODELS_RheemPlugInDedicated40 || + presetNum == MODELS_RheemPlugInDedicated50) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + if (presetNum == MODELS_RheemPlugInDedicated40) + { + tankVolume_L = GAL_TO_L(36); + tankUA_kJperHrC = 5.5; + } + else if (presetNum == MODELS_RheemPlugInDedicated50) + { + tankVolume_L = GAL_TO_L(45); + tankUA_kJperHrC = 6.33; + } + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({0.5, 0.5, 0.}); + + compressor.perfMap.reserve(2); + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {528.91, 4.8988, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {4.3943, -0.012443, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95, // Temperature (T_F) + {494.03, 7.7266, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.48189, -0.01604, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.hysteresis_dC = dF_TO_dC(1); + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.0); + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; + + // logic conditions + double compStart = dF_TO_dC(20); + double standbyT = dF_TO_dC(9); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + else if (presetNum == MODELS_RheemHB50) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(45); + tankUA_kJperHrC = 7; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 47, // Temperature (T_F) + {280, 4.97342, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.634009, -0.029485, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {280, 5.35992, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {6.3, -0.03, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.hysteresis_dC = dF_TO_dC(1); + compressor.minT = F_TO_C(40.0); + compressor.maxT = F_TO_C(120.0); + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + compressor.configuration = HPWH::HeatSource::CONFIG_WRAPPED; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(8, 4200); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 2250); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + double compStart = dF_TO_dC(38); + double standbyT = dF_TO_dC(13.2639); + compressor.addTurnOnLogic(HPWH::bottomThird(compStart)); + compressor.addTurnOnLogic(HPWH::standby(standbyT)); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(76.7747))); + + resistiveElementTop.addTurnOnLogic(HPWH::topSixth(dF_TO_dC(20.4167))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_Stiebel220E) + { + setNumNodes(12); + setpoint_C = F_TO_C(127); + + tankVolume_L = GAL_TO_L(56); + // tankUA_kJperHrC = 10; //0 to turn off + tankUA_kJperHrC = 9; + + doTempDepression = false; + tankMixesOnDraw = false; + + HeatSource compressor(this); + HeatSource resistiveElement(this); + + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + resistiveElement.setupAsResistiveElement(0, 1500); + resistiveElement.hysteresis_dC = dF_TO_dC(0); + + compressor.setCondensity({0, 0.12, 0.22, 0.22, 0.22, 0.22, 0, 0, 0, 0, 0, 0}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {295.55337, 2.28518, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.744118, -0.025946, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {282.2126, 2.82001, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {8.012112, -0.039394, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(32.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = 0; // no hysteresis + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + compressor.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(6.5509))); + compressor.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); + + compressor.depressesTemperature = false; // no temp depression + + // set everything in its places + heatSources.resize(2); + heatSources[0] = compressor; + heatSources[1] = resistiveElement; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[0].backupHeatSource = &heatSources[1]; + } + else if (presetNum == MODELS_Generic1) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(50); + tankUA_kJperHrC = 9; + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {472.58616, 2.09340, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {2.942642, -0.0125954, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {439.5615, 2.62997, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {3.95076, -0.01638033, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(45.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(8, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40.0))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); + compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(65))); + + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(80))); + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(110))); + + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(35))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_Generic2) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(50); + tankUA_kJperHrC = 7.5; + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + HeatSource resistiveElementTop(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {272.58616, 2.09340, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {4.042642, -0.0205954, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {239.5615, 2.62997, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.25076, -0.02638033, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(40.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); + compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(60))); + + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(80))); + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(100))); + + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(40))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_Generic3) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(50); + tankUA_kJperHrC = 5; + + doTempDepression = false; + tankMixesOnDraw = true; + + // set everything in its places + HeatSource resistiveElementTop(this); + HeatSource compressor(this); + HeatSource resistiveElementBottom(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {172.58616, 2.09340, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.242642, -0.0285954, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {139.5615, 2.62997, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {6.75076, -0.03638033, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(35.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4500); + resistiveElementBottom.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(40))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(10))); + compressor.addShutOffLogic(HPWH::largeDraw(F_TO_C(55))); + + resistiveElementBottom.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(60))); + + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(40))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_UEF2generic) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + tankVolume_L = GAL_TO_L(45); + tankUA_kJperHrC = 6.5; + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource resistiveElementTop(this); + HeatSource resistiveElementBottom(this); + HeatSource compressor(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {4.29, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + {5.61, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(37.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(18.6605))); + + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(86.1111))); + + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(12.392))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + else if (MODELS_AWHSTier3Generic40 <= presetNum && presetNum <= MODELS_AWHSTier3Generic80) + { + setNumNodes(12); + setpoint_C = F_TO_C(127.0); + + if (presetNum == MODELS_AWHSTier3Generic40) + { + tankVolume_L = GAL_TO_L(36.1); + tankUA_kJperHrC = 5; + } + else if (presetNum == MODELS_AWHSTier3Generic50) + { + tankVolume_L = GAL_TO_L(45); + tankUA_kJperHrC = 6.5; + } + else if (presetNum == MODELS_AWHSTier3Generic65) + { + tankVolume_L = GAL_TO_L(64); + tankUA_kJperHrC = 7.6; + } + else if (presetNum == MODELS_AWHSTier3Generic80) + { + tankVolume_L = GAL_TO_L(75.4); + tankUA_kJperHrC = 10.; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("Incorrect model specification. \n"); + } + return HPWH_ABORT; + } + + doTempDepression = false; + tankMixesOnDraw = true; + + HeatSource resistiveElementTop(this); + HeatSource resistiveElementBottom(this); + HeatSource compressor(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1., 0., 0.}); + + // voltex60 tier 1 values + compressor.perfMap.reserve(2); + + compressor.perfMap.push_back({ + 50, // Temperature (T_F) + {187.064124, 1.939747, 0.0}, // Input Power Coefficients (inputPower_coeffs) + //{5.4977772, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + {5.22288834, -0.0243008, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 70, // Temperature (T_F) + {148.0418, 2.553291, 0.0}, // Input Power Coefficients (inputPower_coeffs) + //{7.207307, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + {6.84694165, -0.0335265, 0.0} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(42.0); + compressor.maxT = F_TO_C(120.); + compressor.hysteresis_dC = dF_TO_dC(2); + compressor.configuration = HeatSource::CONFIG_WRAPPED; + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + // top resistor values + resistiveElementTop.setupAsResistiveElement(6, 4500); + resistiveElementTop.isVIP = true; + + // bottom resistor values + resistiveElementBottom.setupAsResistiveElement(0, 4000); + resistiveElementBottom.setCondensity({0, 0.2, 0.8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + resistiveElementBottom.hysteresis_dC = dF_TO_dC(2); + + // logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(20))); + resistiveElementTop.addShutOffLogic(HPWH::topNodeMaxTemp(F_TO_C(116.6358))); + compressor.addTurnOnLogic(HPWH::bottomThird(dF_TO_dC(33.6883))); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(11.0648))); + resistiveElementBottom.addTurnOnLogic(HPWH::thirdSixth(dF_TO_dC(60))); + resistiveElementBottom.addShutOffLogic(HPWH::bottomTwelfthMaxTemp(F_TO_C(80))); + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + } + // If a the model is the TamOMatic, HotTam, Generic... This model is scalable. + else if (presetNum == MODELS_TamScalable_SP) + { + setNumNodes(24); + setpoint_C = F_TO_C(135.0); + tankSizeFixed = false; + canScale = true; // a fully scallable model + + doTempDepression = false; + tankMixesOnDraw = false; + + tankVolume_L = 315; + tankUA_kJperHrC = 7; + setTankSize_adjustUA(600., UNITS_GAL); + + HeatSource resistiveElementTop(this); + HeatSource resistiveElementBottom(this); + HeatSource compressor(this); + + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.isMultipass = false; + compressor.perfMap.reserve(1); + compressor.hysteresis_dC = 0; + + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = getIndexTopNode(); + + // Defrost Derate + compressor.setupDefrostMap(); + + // Perfmap for input power and COP made from data for poor preforming modeled to be scalled + // for this model + std::vector inputPwr_coeffs = {13.6, + 0.00995, + -0.0342, + -0.014, + -0.000110, + 0.00026, + 0.000232, + 0.000195, + -0.00034, + 5.30E-06, + 2.3600E-06}; + std::vector COP_coeffs = {1.945, + 0.0412, + -0.0112, + -0.00161, + 0.0000492, + 0.0000348, + -0.0000323, + -0.000166, + 0.0000112, + 0.0000392, + -3.52E-07}; + + compressor.perfMap.push_back({ + 105, // Temperature (T_F) + inputPwr_coeffs, // Input Power Coefficients (inputPower_coeffs + COP_coeffs // COP Coefficients (COP_coeffs) + }); + + // logic conditions + compressor.minT = F_TO_C(40.); + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + std::vector nodeWeights; + nodeWeights.emplace_back(4); + compressor.addTurnOnLogic(std::make_shared( + "fourth node", nodeWeights, dF_TO_dC(15), this)); + + // lowT cutoff + std::vector nodeWeights1; + nodeWeights1.emplace_back(1); + compressor.addShutOffLogic(std::make_shared( + "bottom node", nodeWeights1, dF_TO_dC(15.), this, false, std::greater(), true)); + compressor.depressesTemperature = false; // no temp depression + + resistiveElementBottom.setupAsResistiveElement(0, 30000); + resistiveElementTop.setupAsResistiveElement(9, 30000); + + // top resistor values + // standard logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(15))); + resistiveElementTop.isVIP = true; + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + heatSources[0].companionHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_Scalable_MP) + { + setNumNodes(24); + setpoint_C = F_TO_C(135.0); + tankSizeFixed = false; + canScale = true; // a fully scallable model + + doTempDepression = false; + tankMixesOnDraw = false; + + tankVolume_L = 315; // Gets adjust per model but ratio between vol and UA is important + tankUA_kJperHrC = 7; + + HeatSource resistiveElementTop(this); + HeatSource resistiveElementBottom(this); + HeatSource compressor(this); + compressor.isOn = false; + compressor.isVIP = true; + compressor.typeOfHeatSource = TYPE_compressor; + compressor.setCondensity({0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0}); + compressor.configuration = HeatSource::CONFIG_EXTERNAL; + compressor.perfMap.reserve(1); + compressor.hysteresis_dC = 0; + compressor.externalOutletHeight = 0; + compressor.externalInletHeight = static_cast(getNumNodes() / 3.) - 1; + + // logic conditions + std::vector nodeWeights; + nodeWeights.emplace_back(4); + compressor.addTurnOnLogic(std::make_shared( + "fourth node", nodeWeights, dF_TO_dC(5.), this, false)); + + std::vector nodeWeights1; + nodeWeights1.emplace_back(4); + compressor.addShutOffLogic(std::make_shared( + "fourth node", nodeWeights1, dF_TO_dC(0.), this, false, std::greater())); + compressor.depressesTemperature = false; // no temp depression + + // Defrost Derate + compressor.setupDefrostMap(); + + // logic conditions + compressor.minT = F_TO_C(40.); + compressor.maxT = F_TO_C(105.); + compressor.maxSetpoint_C = MAXOUTLET_R134A; + + setTankSize_adjustUA(600., UNITS_GAL); + compressor.mpFlowRate_LPS = GPM_TO_LPS(25.); + compressor.perfMap.push_back({ + 100, // Temperature (T_F) + + {12.4, 0.00739, -0.0410, 0.0, 0.000578, 0.0000696}, // Input Power Coefficients + // (inputPower_coeffs) + + {1.20, 0.0333, 0.00191, 0.000283, 0.0000496, -0.000440} // COP Coefficients (COP_coeffs) + + }); + + resistiveElementBottom.setupAsResistiveElement(0, 30000); + resistiveElementTop.setupAsResistiveElement(9, 30000); + + // top resistor values + // standard logic conditions + resistiveElementTop.addTurnOnLogic(HPWH::topThird(dF_TO_dC(30))); + resistiveElementTop.isVIP = true; + + // set everything in its places + heatSources.resize(3); + heatSources[0] = resistiveElementTop; + heatSources[1] = resistiveElementBottom; + heatSources[2] = compressor; + + // and you have to do this after putting them into heatSources, otherwise + // you don't get the right pointers + heatSources[2].backupHeatSource = &heatSources[1]; + heatSources[1].backupHeatSource = &heatSources[2]; + + heatSources[0].followedByHeatSource = &heatSources[1]; + heatSources[1].followedByHeatSource = &heatSources[2]; + + heatSources[0].companionHeatSource = &heatSources[2]; + } + else if (presetNum == MODELS_AquaThermAire) + { // AquaThermAire + setNumNodes(12); + setpoint_C = 50.; + + initialTankT_C = 49.32; + hasInitialTankTemp = true; + + tankVolume_L = GAL_TO_L(54.4); + tankUA_kJperHrC = 10.35; + + doTempDepression = false; + tankMixesOnDraw = false; + + // heat exchangers only + hasHeatExchanger = true; + heatExchangerEffectiveness = 0.93; + + HeatSource compressor(this); + + // compressor values + compressor.isOn = false; + compressor.isVIP = false; + compressor.typeOfHeatSource = TYPE_compressor; + + compressor.setCondensity({1.}); + + // AOSmithPHPT60 values + compressor.perfMap.reserve(4); + + compressor.perfMap.push_back({ + 5, // Temperature (T_F) + {-1423, 38.70, 0.}, // Input Power Coefficients (inputPower_coeffs) + {-0.13839, 0.012319, 0.} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 34, // Temperature (T_F) + {-1558, 42.40, 0.}, // Input Power Coefficients (inputPower_coeffs) + {-0.19375, 0.017247, 0.} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 67, // Temperature (T_F) + {-1713, 46.60, 0.}, // Input Power Coefficients (inputPower_coeffs) + {-0.28156, 0.025064, 0.} // COP Coefficients (COP_coeffs) + }); + + compressor.perfMap.push_back({ + 95, // Temperature (T_F) + {-1844, 50.17, 0.}, // Input Power Coefficients (inputPower_coeffs) + {-0.47273, 0.042082, 0.} // COP Coefficients (COP_coeffs) + }); + + compressor.minT = F_TO_C(-25); + compressor.maxT = F_TO_C(125.); + compressor.hysteresis_dC = dF_TO_dC(1); + compressor.configuration = HeatSource::CONFIG_SUBMERGED; + + // logic conditions + compressor.addTurnOnLogic(HPWH::wholeTank(111, UNITS_F, true)); + compressor.addTurnOnLogic(HPWH::standby(dF_TO_dC(14))); + + // set everything in its places + heatSources.resize(1); + heatSources[0] = compressor; + } + else + { + if (hpwhVerbosity >= VRB_reluctant) + { + msg("You have tried to select a preset model which does not exist. \n"); + } + return HPWH_ABORT; + } + + if (hasInitialTankTemp) + setTankToTemperature(initialTankT_C); + else // start tank off at setpoint + resetTankToSetpoint(); + + hpwhModel = presetNum; + + // calculate oft-used derived values + calcDerivedValues(); + + if (checkInputs() == HPWH_ABORT) + { + return HPWH_ABORT; + } + + isHeating = false; + for (int i = 0; i < getNumHeatSources(); i++) + { + if (heatSources[i].isOn) + { + isHeating = true; + } + heatSources[i].sortPerformanceMap(); + } + + if (hpwhVerbosity >= VRB_emetic) + { + for (int i = 0; i < getNumHeatSources(); i++) + { + msg("heat source %d: %p \n", i, &heatSources[i]); + } + msg("\n\n"); + } + + simHasFailed = false; + return 0; // successful init returns 0 +} // end HPWHinit_presets diff --git a/src/HPWHversion.cc b/src/HPWHversion.cc index 7bba6197..50d30efc 100644 --- a/src/HPWHversion.cc +++ b/src/HPWHversion.cc @@ -1,17 +1,18 @@ /* -* Version control -*/ + * Version control + */ #include "HPWHVersion.hh" #include "HPWH.hh" -//ugh, this should be in the header +// ugh, this should be in the header const std::string HPWH::version_maint = HPWHVRSN_META; -std::string HPWH::getVersion() { - std::stringstream version; +std::string HPWH::getVersion() +{ + std::stringstream version; - version << version_major << '.' << version_minor << '.' << version_patch << version_maint; + version << version_major << '.' << version_minor << '.' << version_patch << version_maint; - return version.str(); + return version.str(); } diff --git a/src/HPWHversion.in.hh b/src/HPWHversion.in.hh index 7adffdc4..5ff3b8c7 100644 --- a/src/HPWHversion.in.hh +++ b/src/HPWHversion.in.hh @@ -1,6 +1,6 @@ /* -* Version control -*/ + * Version control + */ #ifndef HPWHversion_hh #define HPWHversion_hh diff --git a/test/main.cc b/test/main.cc index 139a27b4..17604842 100644 --- a/test/main.cc +++ b/test/main.cc @@ -13,115 +13,142 @@ #include #include #include -#include -#include // std::max +#include +#include // std::max #define MAX_DIR_LENGTH 255 using std::cout; using std::endl; -using std::string; using std::ifstream; +using std::string; -int main(int argc, char *argv[]){ - HPWH hpwh; +int main(int argc, char* argv[]) +{ + HPWH hpwh; - const long maximumDurationNormalTest_min = 500000; + const long maximumDurationNormalTest_min = 500000; #if defined _DEBUG - hpwh.setVerbosity(HPWH::VRB_reluctant); + hpwh.setVerbosity(HPWH::VRB_reluctant); #endif - - // process command line arguments - cout << "Testing HPWHsim version " << HPWH::getVersion() << endl; - - // Obvious wrong number of command line arguments - if ((argc > 6)) { - cout << "Invalid input. This program takes FOUR arguments: model specification type (ie. Preset or File), model specification (ie. Sanden80), test name (ie. test50) and output directory\n"; - exit(1); - } - - // parse inputs - std::string input1, input2, input3, input4; - if(argc > 1) { - input1 = argv[1]; - input2 = argv[2]; - input3 = argv[3]; - input4 = argv[4]; - } else { - input1 = "asdf"; // Makes the next conditional not crash... a little clumsy but whatever - input2 = "def"; - input3 = "ghi"; - input4 = "."; - } - - // display help message - if (argc < 5 || (argc > 6) || (input1 == "?") || (input1 == "help")) { - cout << "Standard usage: \"hpwhTestTool.x [model spec type Preset/File] [model spec Name] [testName] [airtemp override F (optional)]\"\n"; - cout << "All input files should be located in the test directory, with these names:\n"; - cout << "drawschedule.csv DRschedule.csv ambientTschedule.csv evaporatorTschedule.csv inletTschedule.csv hpwhProperties.csv\n"; - cout << "An output file, `modelname'Output.csv, will be written in the test directory\n"; - exit(1); - } - - HPWH::TestDesc testDesc; - testDesc.presetOrFile = input1; - testDesc.modelName = input2; - testDesc.testName = input3; - std::string outputDirectory = input4; - - // Parse the model - if(testDesc.presetOrFile == "Preset") { - if (getHPWHObject(hpwh, testDesc.modelName) == HPWH::HPWH_ABORT) { - cout << "Error, preset model did not initialize.\n"; - exit(1); - } - } else if (testDesc.presetOrFile == "File") { - std::string inputFile = testDesc.modelName + ".txt"; - if (hpwh.HPWHinit_file(inputFile) != 0) { - exit(1); - } - } - else { - cout << "Invalid argument, received '"<< testDesc.presetOrFile << "', expected 'Preset' or 'File'.\n"; - exit(1); - } - - double airT_C = 0.; - bool doTempDepress = false; - if(argc == 6) { // air temperature specified on command line - airT_C = F_TO_C(std::stoi(argv[5])); - doTempDepress = true; - } - - // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C to better - // try and trigger the lockout and hysteresis conditions - hpwh.setMaxTempDepression(4.); - hpwh.setDoTempDepression(doTempDepress); - - HPWH::ControlInfo controlInfo; - if(!hpwh.readControlInfo(testDesc.testName,controlInfo)){ - cout << "Control file testInfo.txt has unsettable specifics in it. \n"; - exit(1); - } - - std::vector allSchedules; - if (!hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules)) { - exit(1); - } - - controlInfo.recordMinuteData = (controlInfo.timeToRun_min <= maximumDurationNormalTest_min); - controlInfo.recordYearData = (controlInfo.timeToRun_min > maximumDurationNormalTest_min); - - controlInfo.modifyDraw = ( // mix down large-compressor models for yearly tests - (hpwh.getHPWHModel() >= HPWH::MODELS_ColmacCxV_5_SP) && - (hpwh.getHPWHModel() <= HPWH::MODELS_RHEEM_HPHD135VNU_483_MP) && - (controlInfo.timeToRun_min > maximumDurationNormalTest_min)); - - HPWH::TestResults testResults; - if (!hpwh.runSimulation(testDesc,outputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults)) { - exit(1); - } - - return 0; + + // process command line arguments + cout << "Testing HPWHsim version " << HPWH::getVersion() << endl; + + // Obvious wrong number of command line arguments + if ((argc > 6)) + { + cout << "Invalid input. This program takes FOUR arguments: model specification type (ie. " + "Preset or File), model specification (ie. Sanden80), test name (ie. test50) and " + "output directory\n"; + exit(1); + } + + // parse inputs + std::string input1, input2, input3, input4; + if (argc > 1) + { + input1 = argv[1]; + input2 = argv[2]; + input3 = argv[3]; + input4 = argv[4]; + } + else + { + input1 = "asdf"; // Makes the next conditional not crash... a little clumsy but whatever + input2 = "def"; + input3 = "ghi"; + input4 = "."; + } + + // display help message + if (argc < 5 || (argc > 6) || (input1 == "?") || (input1 == "help")) + { + cout << "Standard usage: \"hpwhTestTool.x [model spec type Preset/File] [model spec Name] " + "[testName] [airtemp override F (optional)]\"\n"; + cout << "All input files should be located in the test directory, with these names:\n"; + cout << "drawschedule.csv DRschedule.csv ambientTschedule.csv evaporatorTschedule.csv " + "inletTschedule.csv hpwhProperties.csv\n"; + cout << "An output file, `modelname'Output.csv, will be written in the test directory\n"; + exit(1); + } + + HPWH::TestDesc testDesc; + testDesc.presetOrFile = input1; + testDesc.modelName = input2; + testDesc.testName = input3; + std::string outputDirectory = input4; + + // Parse the model + if (testDesc.presetOrFile == "Preset") + { + if (getHPWHObject(hpwh, testDesc.modelName) == HPWH::HPWH_ABORT) + { + cout << "Error, preset model did not initialize.\n"; + exit(1); + } + } + else if (testDesc.presetOrFile == "File") + { + std::string inputFile = testDesc.modelName + ".txt"; + if (hpwh.HPWHinit_file(inputFile) != 0) + { + exit(1); + } + } + else + { + cout << "Invalid argument, received '" << testDesc.presetOrFile + << "', expected 'Preset' or 'File'.\n"; + exit(1); + } + + double airT_C = 0.; + bool doTempDepress = false; + if (argc == 6) + { // air temperature specified on command line + airT_C = F_TO_C(std::stoi(argv[5])); + doTempDepress = true; + } + + // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C + // to better try and trigger the lockout and hysteresis conditions + hpwh.setMaxTempDepression(4.); + hpwh.setDoTempDepression(doTempDepress); + + HPWH::ControlInfo controlInfo; + if (!hpwh.readControlInfo(testDesc.testName, controlInfo)) + { + cout << "Control file testInfo.txt has unsettable specifics in it. \n"; + exit(1); + } + + std::vector allSchedules; + if (!hpwh.readSchedules(testDesc.testName, controlInfo, allSchedules)) + { + exit(1); + } + + controlInfo.recordMinuteData = (controlInfo.timeToRun_min <= maximumDurationNormalTest_min); + controlInfo.recordYearData = (controlInfo.timeToRun_min > maximumDurationNormalTest_min); + + controlInfo.modifyDraw = ( // mix down large-compressor models for yearly tests + (hpwh.getHPWHModel() >= HPWH::MODELS_ColmacCxV_5_SP) && + (hpwh.getHPWHModel() <= HPWH::MODELS_RHEEM_HPHD135VNU_483_MP) && + (controlInfo.timeToRun_min > maximumDurationNormalTest_min)); + + HPWH::TestResults testResults; + if (!hpwh.runSimulation(testDesc, + outputDirectory, + controlInfo, + allSchedules, + airT_C, + doTempDepress, + testResults)) + { + exit(1); + } + + return 0; } diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc index 5fe08a70..833051dc 100644 --- a/test/testCalcUEF.cc +++ b/test/testCalcUEF.cc @@ -5,102 +5,109 @@ #include "testUtilityFcts.cc" #include -#include - -const std::vector sProfileNames({ "24hr67_vsmall", - "24hr67_low", - "24hr67_medium", - "24hr67_high" }); - -static bool runTest( - const HPWH::TestDesc testDesc, - HPWH::TestResults &testResults, - double airT_C = 0., - bool doTempDepress = false) +#include + +const std::vector + sProfileNames({"24hr67_vsmall", "24hr67_low", "24hr67_medium", "24hr67_high"}); + +static bool runTest(const HPWH::TestDesc testDesc, + HPWH::TestResults& testResults, + double airT_C = 0., + bool doTempDepress = false) { - HPWH hpwh; + HPWH hpwh; #if defined _DEBUG - hpwh.setVerbosity(HPWH::VRB_reluctant); + hpwh.setVerbosity(HPWH::VRB_reluctant); #endif - getHPWHObject(hpwh, testDesc.modelName); - - std::string sOutputDirectory = "../build/test/output"; - - // create the model - bool result = true; - if(testDesc.presetOrFile == "Preset") { - result = (getHPWHObject(hpwh, testDesc.modelName) != HPWH::HPWH_ABORT); - } else if (testDesc.presetOrFile == "File") { - std::string inputFile = testDesc.modelName + ".txt"; - result = (hpwh.HPWHinit_file(inputFile) != HPWH::HPWH_ABORT); - } - ASSERTTRUE(result); - - // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C to better - // try and trigger the lockout and hysteresis conditions - hpwh.setMaxTempDepression(4.); - hpwh.setDoTempDepression(doTempDepress); - - HPWH::ControlInfo controlInfo; - result = hpwh.readControlInfo(testDesc.testName,controlInfo); - ASSERTTRUE(result); - - std::vector allSchedules; - result = hpwh.readSchedules(testDesc.testName,controlInfo,allSchedules); - ASSERTTRUE(result); - - controlInfo.recordMinuteData = false; - controlInfo.recordYearData = false; - result = hpwh.runSimulation(testDesc,sOutputDirectory,controlInfo,allSchedules,airT_C,doTempDepress,testResults); - ASSERTTRUE(result); - - return result; + getHPWHObject(hpwh, testDesc.modelName); + + std::string sOutputDirectory = "../build/test/output"; + + // create the model + bool result = true; + if (testDesc.presetOrFile == "Preset") + { + result = (getHPWHObject(hpwh, testDesc.modelName) != HPWH::HPWH_ABORT); + } + else if (testDesc.presetOrFile == "File") + { + std::string inputFile = testDesc.modelName + ".txt"; + result = (hpwh.HPWHinit_file(inputFile) != HPWH::HPWH_ABORT); + } + ASSERTTRUE(result); + + // Use the built-in temperature depression for the lockout test. Set the temp depression of 4C + // to better try and trigger the lockout and hysteresis conditions + hpwh.setMaxTempDepression(4.); + hpwh.setDoTempDepression(doTempDepress); + + HPWH::ControlInfo controlInfo; + result = hpwh.readControlInfo(testDesc.testName, controlInfo); + ASSERTTRUE(result); + + std::vector allSchedules; + result = hpwh.readSchedules(testDesc.testName, controlInfo, allSchedules); + ASSERTTRUE(result); + + controlInfo.recordMinuteData = false; + controlInfo.recordYearData = false; + result = hpwh.runSimulation( + testDesc, sOutputDirectory, controlInfo, allSchedules, airT_C, doTempDepress, testResults); + ASSERTTRUE(result); + + return result; } /* Evaluate UEF based on simulations using standard profiles */ -static bool runUEFTestSuite(const std::string &sModelName,const std::string &sPresetOrFile, double &UEF) { - - HPWH::TestDesc testDesc; - testDesc.modelName = sModelName; - testDesc.presetOrFile = sPresetOrFile; - - double totalEnergyConsumed_kJ = 0.; - double totalVolumeRemoved_L = 0.; - - bool result = true; - for (auto &sProfileName: sProfileNames) { - HPWH::TestResults testResults; - testDesc.testName = sProfileName; - result &= runTest(testDesc,testResults); - - totalEnergyConsumed_kJ += testResults.totalEnergyConsumed_kJ; - totalVolumeRemoved_L += testResults.totalVolumeRemoved_L; - } - double totalMassRemoved_kg = HPWH::DENSITYWATER_kgperL * totalVolumeRemoved_L; - double totalHeatCapacity_kJperC = HPWH::CPWATER_kJperkgC * totalMassRemoved_kg; - double refEnergy_kJ = totalHeatCapacity_kJperC * (51.7 - 14.4); - - UEF = refEnergy_kJ / totalEnergyConsumed_kJ; - return result; -} - -int main(int argc, char *argv[]) +static bool +runUEFTestSuite(const std::string& sModelName, const std::string& sPresetOrFile, double& UEF) { - // process command line arguments - if ((argc != 3)) { - cout << "Invalid input. This program takes TWO arguments: model type (i.e., Preset or File), model name (i.e., Sanden80)\n"; - exit(1); - } - std::string sPresetOrFile = argv[1]; - std::string sModelName = argv[2]; - - double UEF = 0.; - if (runUEFTestSuite(sModelName, sPresetOrFile, UEF)) { - std::cout << "UEF: " << UEF << "\n"; - } + HPWH::TestDesc testDesc; + testDesc.modelName = sModelName; + testDesc.presetOrFile = sPresetOrFile; + + double totalEnergyConsumed_kJ = 0.; + double totalVolumeRemoved_L = 0.; + + bool result = true; + for (auto& sProfileName : sProfileNames) + { + HPWH::TestResults testResults; + testDesc.testName = sProfileName; + result &= runTest(testDesc, testResults); + + totalEnergyConsumed_kJ += testResults.totalEnergyConsumed_kJ; + totalVolumeRemoved_L += testResults.totalVolumeRemoved_L; + } + double totalMassRemoved_kg = HPWH::DENSITYWATER_kgperL * totalVolumeRemoved_L; + double totalHeatCapacity_kJperC = HPWH::CPWATER_kJperkgC * totalMassRemoved_kg; + double refEnergy_kJ = totalHeatCapacity_kJperC * (51.7 - 14.4); + + UEF = refEnergy_kJ / totalEnergyConsumed_kJ; + return result; +} - return 0; +int main(int argc, char* argv[]) +{ + // process command line arguments + if ((argc != 3)) + { + cout << "Invalid input. This program takes TWO arguments: model type (i.e., Preset or " + "File), model name (i.e., Sanden80)\n"; + exit(1); + } + + std::string sPresetOrFile = argv[1]; + std::string sModelName = argv[2]; + + double UEF = 0.; + if (runUEFTestSuite(sModelName, sPresetOrFile, UEF)) + { + std::cout << "UEF: " << UEF << "\n"; + } + + return 0; } diff --git a/test/testCompressorFcts.cc b/test/testCompressorFcts.cc index ab13578b..c3aff1e1 100644 --- a/test/testCompressorFcts.cc +++ b/test/testCompressorFcts.cc @@ -14,75 +14,141 @@ using std::cout; using std::string; - - -void testHasACompressor(string input, bool expected) { - HPWH hpwh; - getHPWHObject(hpwh, input); // get preset model - ASSERTTRUE(hpwh.hasACompressor() == expected); +void testHasACompressor(string input, bool expected) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); // get preset model + ASSERTTRUE(hpwh.hasACompressor() == expected); } -void testGetCompCoilConfig(string input, int expected) { - HPWH hpwh; - getHPWHObject(hpwh, input); // get preset model - ASSERTTRUE(hpwh.getCompressorCoilConfig() == expected); +void testGetCompCoilConfig(string input, int expected) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); // get preset model + ASSERTTRUE(hpwh.getCompressorCoilConfig() == expected); } -void testIsCompressorMultipass(string input, bool expected) { - HPWH hpwh; - getHPWHObject(hpwh, input); // get preset model - ASSERTTRUE(hpwh.isCompressorMultipass() == expected); +void testIsCompressorMultipass(string input, bool expected) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); // get preset model + ASSERTTRUE(hpwh.isCompressorMultipass() == expected); } -void testIsCompressoExternalMultipass(string input, bool expected) { - HPWH hpwh; - getHPWHObject(hpwh, input); // get preset model - ASSERTTRUE(hpwh.isCompressoExternalMultipass() == expected); +void testIsCompressoExternalMultipass(string input, bool expected) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); // get preset model + ASSERTTRUE(hpwh.isCompressoExternalMultipass() == expected); } -void testGetMaxCompressorSetpoint(string input, double expected) { - HPWH hpwh; - getHPWHObject(hpwh, input); // get preset model - ASSERTTRUE(hpwh.getMaxCompressorSetpoint() == expected); +void testGetMaxCompressorSetpoint(string input, double expected) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); // get preset model + ASSERTTRUE(hpwh.getMaxCompressorSetpoint() == expected); } -void testGetMinOperatingTemp(string input, double expected) { - HPWH hpwh; - getHPWHObject(hpwh, input); // get preset model - ASSERTTRUE(hpwh.getMinOperatingTemp(HPWH::UNITS_F) == expected); +void testGetMinOperatingTemp(string input, double expected) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); // get preset model + ASSERTTRUE(hpwh.getMinOperatingTemp(HPWH::UNITS_F) == expected); } int main(int, char*) { - const int length = 14; - const string models [length] = {"AOSmithHPTU50", "Stiebel220e","AOSmithCAHP120", \ - "Sanden80", "ColmacCxV_5_SP", "ColmacCxA_20_SP", \ - "TamScalable_SP", "restankRealistic", "StorageTank", \ - "ColmacCxA_20_MP", "Scalable_MP", "NyleC90A_MP", "NyleC90A_C_MP", \ - "QAHV_N136TAU_HPB_SP"}; - const int hasComp[length] = { true, true, true, true, true, true, true, false, false, true, true, true, true, true }; - const int coilConfig[length] = { 1, 1, 1, 2, 2, 2, 2, HPWH::HPWH_ABORT, HPWH::HPWH_ABORT, 2, 2, 2, 2, 2}; // 1 Wrapped 2 External - const int heatCycle[length] = { true, true, true, false, false, false, false, HPWH::HPWH_ABORT, HPWH::HPWH_ABORT, true, true, true, true, false }; //true single, false singlepass - const int isExtMP[length] = { false, false, false, false, false, false, false, HPWH::HPWH_ABORT, HPWH::HPWH_ABORT, true, true, true, true, false }; - - const double maxStpt[length] = { HPWH::MAXOUTLET_R134A, HPWH::MAXOUTLET_R134A,HPWH::MAXOUTLET_R134A, - HPWH::MAXOUTLET_R744, HPWH::MAXOUTLET_R410A, HPWH::MAXOUTLET_R134A, - HPWH::MAXOUTLET_R134A, HPWH::HPWH_ABORT, HPWH::HPWH_ABORT, - HPWH::MAXOUTLET_R134A, HPWH::MAXOUTLET_R134A, F_TO_C(160.), F_TO_C(160.), F_TO_C(176.1) }; // deg C - - const double minTemp[length] = { 42., 32., 47., -25, -4., 40., 40., HPWH::HPWH_ABORT, HPWH::HPWH_ABORT, 40., 40., 40., 35., -13.}; //deg F - - for (int i = 0; i < length; i++) { - testHasACompressor(models[i], hasComp[i]); - testGetCompCoilConfig(models[i], coilConfig[i]); - testIsCompressorMultipass(models[i], heatCycle[i]); - testIsCompressoExternalMultipass(models[i], isExtMP[i]); - - testGetMaxCompressorSetpoint(models[i], maxStpt[i]); - testGetMinOperatingTemp(models[i], minTemp[i]); - } - - //Made it through the gauntlet - return 0; + const int length = 14; + const string models[length] = {"AOSmithHPTU50", + "Stiebel220e", + "AOSmithCAHP120", + "Sanden80", + "ColmacCxV_5_SP", + "ColmacCxA_20_SP", + "TamScalable_SP", + "restankRealistic", + "StorageTank", + "ColmacCxA_20_MP", + "Scalable_MP", + "NyleC90A_MP", + "NyleC90A_C_MP", + "QAHV_N136TAU_HPB_SP"}; + const int hasComp[length] = { + true, true, true, true, true, true, true, false, false, true, true, true, true, true}; + const int coilConfig[length] = { + 1, 1, 1, 2, 2, 2, 2, HPWH::HPWH_ABORT, HPWH::HPWH_ABORT, 2, 2, 2, 2, 2}; // 1 Wrapped 2 + // External + const int heatCycle[length] = {true, + true, + true, + false, + false, + false, + false, + HPWH::HPWH_ABORT, + HPWH::HPWH_ABORT, + true, + true, + true, + true, + false}; // true single, false singlepass + const int isExtMP[length] = {false, + false, + false, + false, + false, + false, + false, + HPWH::HPWH_ABORT, + HPWH::HPWH_ABORT, + true, + true, + true, + true, + false}; + + const double maxStpt[length] = {HPWH::MAXOUTLET_R134A, + HPWH::MAXOUTLET_R134A, + HPWH::MAXOUTLET_R134A, + HPWH::MAXOUTLET_R744, + HPWH::MAXOUTLET_R410A, + HPWH::MAXOUTLET_R134A, + HPWH::MAXOUTLET_R134A, + HPWH::HPWH_ABORT, + HPWH::HPWH_ABORT, + HPWH::MAXOUTLET_R134A, + HPWH::MAXOUTLET_R134A, + F_TO_C(160.), + F_TO_C(160.), + F_TO_C(176.1)}; // deg C + + const double minTemp[length] = {42., + 32., + 47., + -25, + -4., + 40., + 40., + HPWH::HPWH_ABORT, + HPWH::HPWH_ABORT, + 40., + 40., + 40., + 35., + -13.}; // deg F + + for (int i = 0; i < length; i++) + { + testHasACompressor(models[i], hasComp[i]); + testGetCompCoilConfig(models[i], coilConfig[i]); + testIsCompressorMultipass(models[i], heatCycle[i]); + testIsCompressoExternalMultipass(models[i], isExtMP[i]); + + testGetMaxCompressorSetpoint(models[i], maxStpt[i]); + testGetMinOperatingTemp(models[i], minTemp[i]); + } + + // Made it through the gauntlet + return 0; } diff --git a/test/testEnergyBalance.cc b/test/testEnergyBalance.cc index 9257ef1d..0ddc1669 100644 --- a/test/testEnergyBalance.cc +++ b/test/testEnergyBalance.cc @@ -5,74 +5,77 @@ #include "testUtilityFcts.cc" #include -#include +#include /* Test energy balance for AOSmithHPTS50*/ -void testEnergyBalanceAOSmithHPTS50() { +void testEnergyBalanceAOSmithHPTS50() +{ - HPWH hpwh; - getHPWHObject(hpwh, "AOSmithHPTS50"); + HPWH hpwh; + getHPWHObject(hpwh, "AOSmithHPTS50"); - double maxDrawVol_L = 1.; - const double ambientT_C = 20.; - const double externalT_C = 20.; + double maxDrawVol_L = 1.; + const double ambientT_C = 20.; + const double externalT_C = 20.; - // - hpwh.setTankToTemperature(20.); - hpwh.setInletT(5.); + // + hpwh.setTankToTemperature(20.); + hpwh.setInletT(5.); - const double Pi = 4. * atan(1.); - double testDuration_min = 60.; - for(int i_min = 0; i_min < testDuration_min; ++i_min) - { - double t_min = static_cast(i_min); + const double Pi = 4. * atan(1.); + double testDuration_min = 60.; + for (int i_min = 0; i_min < testDuration_min; ++i_min) + { + double t_min = static_cast(i_min); - double flowFac = sin(Pi * t_min / testDuration_min) - 0.5; - flowFac += fabs(flowFac); // semi-sinusoidal flow profile - double drawVol_L = flowFac * maxDrawVol_L; + double flowFac = sin(Pi * t_min / testDuration_min) - 0.5; + flowFac += fabs(flowFac); // semi-sinusoidal flow profile + double drawVol_L = flowFac * maxDrawVol_L; - double prevHeatContent_kJ = hpwh.getTankHeatContent_kJ(); - hpwh.runOneStep(drawVol_L, ambientT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(hpwh.isEnergyBalanced(drawVol_L,prevHeatContent_kJ,1.e-6)); - } + double prevHeatContent_kJ = hpwh.getTankHeatContent_kJ(); + hpwh.runOneStep(drawVol_L, ambientT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(hpwh.isEnergyBalanced(drawVol_L, prevHeatContent_kJ, 1.e-6)); + } } /* Test energy balance for storage tank with extra heat (solar)*/ -void testEnergyBalanceSolar() { - - HPWH hpwh; - getHPWHObject(hpwh, "StorageTank"); - - double maxDrawVol_L = 1.; - const double ambientT_C = 20.; - const double externalT_C = 20.; - - std::vector nodePowerExtra_W = {1000.}; - // - hpwh.setUA(0.); - hpwh.setTankToTemperature(20.); - hpwh.setInletT(5.); - - const double Pi = 4. * atan(1.); - double testDuration_min = 60.; - for(int i_min = 0; i_min < testDuration_min; ++i_min) - { - double t_min = static_cast(i_min); - - double flowFac = sin(Pi * t_min / testDuration_min) - 0.5; - flowFac += fabs(flowFac); // semi-sinusoidal flow profile - double drawVol_L = flowFac * maxDrawVol_L; - - double prevHeatContent_kJ = hpwh.getTankHeatContent_kJ(); - hpwh.runOneStep(drawVol_L, ambientT_C, externalT_C, HPWH::DR_ALLOW,0.,0.,&nodePowerExtra_W); - ASSERTTRUE(hpwh.isEnergyBalanced(drawVol_L,prevHeatContent_kJ,1.e-6)); - } +void testEnergyBalanceSolar() +{ + + HPWH hpwh; + getHPWHObject(hpwh, "StorageTank"); + + double maxDrawVol_L = 1.; + const double ambientT_C = 20.; + const double externalT_C = 20.; + + std::vector nodePowerExtra_W = {1000.}; + // + hpwh.setUA(0.); + hpwh.setTankToTemperature(20.); + hpwh.setInletT(5.); + + const double Pi = 4. * atan(1.); + double testDuration_min = 60.; + for (int i_min = 0; i_min < testDuration_min; ++i_min) + { + double t_min = static_cast(i_min); + + double flowFac = sin(Pi * t_min / testDuration_min) - 0.5; + flowFac += fabs(flowFac); // semi-sinusoidal flow profile + double drawVol_L = flowFac * maxDrawVol_L; + + double prevHeatContent_kJ = hpwh.getTankHeatContent_kJ(); + hpwh.runOneStep( + drawVol_L, ambientT_C, externalT_C, HPWH::DR_ALLOW, 0., 0., &nodePowerExtra_W); + ASSERTTRUE(hpwh.isEnergyBalanced(drawVol_L, prevHeatContent_kJ, 1.e-6)); + } } int main(int, char*) { - testEnergyBalanceAOSmithHPTS50(); - testEnergyBalanceSolar(); - - return 0; + testEnergyBalanceAOSmithHPTS50(); + testEnergyBalanceSolar(); + + return 0; } diff --git a/test/testHeatingLogics.cc b/test/testHeatingLogics.cc index 24705fd0..2603675f 100644 --- a/test/testHeatingLogics.cc +++ b/test/testHeatingLogics.cc @@ -2,7 +2,7 @@ #include "testUtilityFcts.cc" #include -#include +#include #include using std::cout; @@ -22,275 +22,331 @@ void testSetStateOfCharge(string& input); void testSetStateOfCharge(string& input, double coldWater_F, double minTUse_F, double tankTAt76SoC); void testExtraHeat(); -const std::vector hasHighShuttOffVectSP = { "Sanden80", "QAHV_N136TAU_HPB_SP", \ - "ColmacCxA_20_SP", "ColmacCxV_5_SP", "NyleC60A_SP", "NyleC60A_C_SP", "NyleC185A_C_SP", "TamScalable_SP" }; - -const std::vector noHighShuttOffVectMPExternal = {"Scalable_MP", "ColmacCxA_20_MP", "ColmacCxA_15_MP", \ - "ColmacCxV_5_MP", "NyleC90A_MP", "NyleC90A_C_MP" , "NyleC250A_MP", "NyleC250A_C_MP" }; - -const std::vector noHighShuttOffVectIntegrated = { "AOSmithHPTU80", "Rheem2020Build80", \ - "Stiebel220e", "AOSmithCAHP120", "AWHSTier3Generic80", "Generic1", "RheemPlugInDedicated50", \ - "RheemPlugInShared65", "restankRealistic", "StorageTank"}; - -int main(int, char*) { - double tempsForSetSoC[5][3] = { {49, 99, 125}, {65, 110, 129}, {32, 120, 121}, {32, 33, 121}, {80, 81, 132.5} }; - - for (string hpwhStr : hasHighShuttOffVectSP) { - testHasEnteringWaterShutOff(hpwhStr); - testSetEnteringWaterShuffOffOutOfBoundsIndex(hpwhStr); - testSetEnteringWaterShuffOffDeadbandToSmall(hpwhStr); - testSetEnteringWaterHighTempShutOffAbsolute(hpwhStr); - testSetEnteringWaterHighTempShutOffRelative(hpwhStr); - - testChangeToStateofChargeControlled(hpwhStr); - for (int i = 0; i < 5; i++) { - testSetStateOfCharge(hpwhStr, tempsForSetSoC[i][0], tempsForSetSoC[i][1], tempsForSetSoC[i][2]); - } - } - - for (string hpwhStr : noHighShuttOffVectMPExternal) { - testDoesNotHaveEnteringWaterShutOff(hpwhStr); - testCanNotSetEnteringWaterShutOff(hpwhStr); - - testChangeToStateofChargeControlled(hpwhStr); - for (int i = 0; i < 5; i++) { - testSetStateOfCharge(hpwhStr, tempsForSetSoC[i][0], tempsForSetSoC[i][1], tempsForSetSoC[i][2]); - } - } - - for (string hpwhStr : noHighShuttOffVectIntegrated) { - testDoesNotHaveEnteringWaterShutOff(hpwhStr); - testCanNotSetEnteringWaterShutOff(hpwhStr); - } - - testExtraHeat(); - return 0; +const std::vector hasHighShuttOffVectSP = {"Sanden80", + "QAHV_N136TAU_HPB_SP", + "ColmacCxA_20_SP", + "ColmacCxV_5_SP", + "NyleC60A_SP", + "NyleC60A_C_SP", + "NyleC185A_C_SP", + "TamScalable_SP"}; + +const std::vector noHighShuttOffVectMPExternal = {"Scalable_MP", + "ColmacCxA_20_MP", + "ColmacCxA_15_MP", + "ColmacCxV_5_MP", + "NyleC90A_MP", + "NyleC90A_C_MP", + "NyleC250A_MP", + "NyleC250A_C_MP"}; + +const std::vector noHighShuttOffVectIntegrated = {"AOSmithHPTU80", + "Rheem2020Build80", + "Stiebel220e", + "AOSmithCAHP120", + "AWHSTier3Generic80", + "Generic1", + "RheemPlugInDedicated50", + "RheemPlugInShared65", + "restankRealistic", + "StorageTank"}; + +int main(int, char*) +{ + double tempsForSetSoC[5][3] = { + {49, 99, 125}, {65, 110, 129}, {32, 120, 121}, {32, 33, 121}, {80, 81, 132.5}}; + + for (string hpwhStr : hasHighShuttOffVectSP) + { + testHasEnteringWaterShutOff(hpwhStr); + testSetEnteringWaterShuffOffOutOfBoundsIndex(hpwhStr); + testSetEnteringWaterShuffOffDeadbandToSmall(hpwhStr); + testSetEnteringWaterHighTempShutOffAbsolute(hpwhStr); + testSetEnteringWaterHighTempShutOffRelative(hpwhStr); + + testChangeToStateofChargeControlled(hpwhStr); + for (int i = 0; i < 5; i++) + { + testSetStateOfCharge( + hpwhStr, tempsForSetSoC[i][0], tempsForSetSoC[i][1], tempsForSetSoC[i][2]); + } + } + + for (string hpwhStr : noHighShuttOffVectMPExternal) + { + testDoesNotHaveEnteringWaterShutOff(hpwhStr); + testCanNotSetEnteringWaterShutOff(hpwhStr); + + testChangeToStateofChargeControlled(hpwhStr); + for (int i = 0; i < 5; i++) + { + testSetStateOfCharge( + hpwhStr, tempsForSetSoC[i][0], tempsForSetSoC[i][1], tempsForSetSoC[i][2]); + } + } + + for (string hpwhStr : noHighShuttOffVectIntegrated) + { + testDoesNotHaveEnteringWaterShutOff(hpwhStr); + testCanNotSetEnteringWaterShutOff(hpwhStr); + } + + testExtraHeat(); + return 0; } -void testHasEnteringWaterShutOff(string& input) { - HPWH hpwh; - getHPWHObject(hpwh, input); - int index = hpwh.getCompressorIndex() == -1 ? 0 : hpwh.getCompressorIndex(); - ASSERTTRUE(hpwh.hasEnteringWaterHighTempShutOff(index) == true); +void testHasEnteringWaterShutOff(string& input) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); + int index = hpwh.getCompressorIndex() == -1 ? 0 : hpwh.getCompressorIndex(); + ASSERTTRUE(hpwh.hasEnteringWaterHighTempShutOff(index) == true); } -void testDoesNotHaveEnteringWaterShutOff(string& input) { - HPWH hpwh; - getHPWHObject(hpwh, input); - int index = hpwh.getCompressorIndex() == -1 ? 0 : hpwh.getCompressorIndex(); - ASSERTTRUE(hpwh.hasEnteringWaterHighTempShutOff(index) == false); +void testDoesNotHaveEnteringWaterShutOff(string& input) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); + int index = hpwh.getCompressorIndex() == -1 ? 0 : hpwh.getCompressorIndex(); + ASSERTTRUE(hpwh.hasEnteringWaterHighTempShutOff(index) == false); } -void testCanNotSetEnteringWaterShutOff(string& input) { - HPWH hpwh; - getHPWHObject(hpwh, input); - int index = hpwh.getCompressorIndex() == -1 ? 0 : hpwh.getCompressorIndex(); - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(10., false, index) == HPWH::HPWH_ABORT); +void testCanNotSetEnteringWaterShutOff(string& input) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); + int index = hpwh.getCompressorIndex() == -1 ? 0 : hpwh.getCompressorIndex(); + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(10., false, index) == HPWH::HPWH_ABORT); } -void testSetEnteringWaterShuffOffOutOfBoundsIndex(string& input) { - HPWH hpwh; - getHPWHObject(hpwh, input); - int index = -1; - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(10., false, index) == HPWH::HPWH_ABORT); - index = 15; - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(10., false, index) == HPWH::HPWH_ABORT); +void testSetEnteringWaterShuffOffOutOfBoundsIndex(string& input) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); + int index = -1; + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(10., false, index) == HPWH::HPWH_ABORT); + index = 15; + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(10., false, index) == HPWH::HPWH_ABORT); } -void testSetEnteringWaterShuffOffDeadbandToSmall(string& input) { - HPWH hpwh; - getHPWHObject(hpwh, input); +void testSetEnteringWaterShuffOffDeadbandToSmall(string& input) +{ + HPWH hpwh; + getHPWHObject(hpwh, input); - double value = HPWH::MINSINGLEPASSLIFT - 1.; - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(value, false, hpwh.getCompressorIndex()) == HPWH::HPWH_ABORT); - - value = HPWH::MINSINGLEPASSLIFT; - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(value, false, hpwh.getCompressorIndex()) == 0); + double value = HPWH::MINSINGLEPASSLIFT - 1.; + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(value, false, hpwh.getCompressorIndex()) == + HPWH::HPWH_ABORT); - value = hpwh.getSetpoint() - (HPWH::MINSINGLEPASSLIFT-1); - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(value, true, hpwh.getCompressorIndex()) == HPWH::HPWH_ABORT); + value = HPWH::MINSINGLEPASSLIFT; + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(value, false, hpwh.getCompressorIndex()) == 0); - value = hpwh.getSetpoint() - HPWH::MINSINGLEPASSLIFT; - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(value, true, hpwh.getCompressorIndex()) == 0); + value = hpwh.getSetpoint() - (HPWH::MINSINGLEPASSLIFT - 1); + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(value, true, hpwh.getCompressorIndex()) == + HPWH::HPWH_ABORT); + + value = hpwh.getSetpoint() - HPWH::MINSINGLEPASSLIFT; + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(value, true, hpwh.getCompressorIndex()) == 0); } -/* Tests we can set the entering water high temp shutt off with aboslute values and it works turns off and on as expected. */ -void testSetEnteringWaterHighTempShutOffAbsolute(string& input) { - const double drawVolume_L = 0.; - const double externalT_C = 20.; - const double delta = 2.; - const double highT_C = 20.; - const bool doAbsolute = true; - HPWH hpwh; - getHPWHObject(hpwh, input); - - // make tank cold to force on - hpwh.setTankToTemperature(highT_C); - - // run a step and check we're heating - hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(compressorIsRunning(hpwh)); - - // change entering water temp to below temp - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(highT_C - delta, doAbsolute, hpwh.getCompressorIndex()) == 0); - - // run a step and check we're not heating. - hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTFALSE(compressorIsRunning(hpwh)); - - // and reverse it - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(highT_C + delta, doAbsolute, hpwh.getCompressorIndex()) == 0); - hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(compressorIsRunning(hpwh)); +/* Tests we can set the entering water high temp shutt off with aboslute values and it works turns + * off and on as expected. */ +void testSetEnteringWaterHighTempShutOffAbsolute(string& input) +{ + const double drawVolume_L = 0.; + const double externalT_C = 20.; + const double delta = 2.; + const double highT_C = 20.; + const bool doAbsolute = true; + HPWH hpwh; + getHPWHObject(hpwh, input); + + // make tank cold to force on + hpwh.setTankToTemperature(highT_C); + + // run a step and check we're heating + hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(compressorIsRunning(hpwh)); + + // change entering water temp to below temp + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff( + highT_C - delta, doAbsolute, hpwh.getCompressorIndex()) == 0); + + // run a step and check we're not heating. + hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTFALSE(compressorIsRunning(hpwh)); + + // and reverse it + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff( + highT_C + delta, doAbsolute, hpwh.getCompressorIndex()) == 0); + hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(compressorIsRunning(hpwh)); } -/* Tests we can set the entering water high temp shutt off with relative values and it works turns off and on as expected. */ -void testSetEnteringWaterHighTempShutOffRelative(string& input) { - const double drawVolume_L = 0.; - const double externalT_C = 20.; - const double delta = 2.; - const double highT_C = 20.; - const bool doAbsolute = false; - HPWH hpwh; - getHPWHObject(hpwh, input); - - const double relativeHighT_C = hpwh.getSetpoint() - highT_C; - // make tank cold to force on - hpwh.setTankToTemperature(highT_C); - - // run a step and check we're heating - hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(hpwh.isNthHeatSourceRunning(hpwh.getCompressorIndex()) == 1); - - // change entering water temp to below temp - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(relativeHighT_C + delta, doAbsolute, hpwh.getCompressorIndex()) == 0); - - // run a step and check we're not heating. - hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(hpwh.isNthHeatSourceRunning(hpwh.getCompressorIndex()) == 0); - - // and reverse it - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(relativeHighT_C - delta, doAbsolute, hpwh.getCompressorIndex()) == 0); - hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(hpwh.isNthHeatSourceRunning(hpwh.getCompressorIndex()) == 1); +/* Tests we can set the entering water high temp shutt off with relative values and it works turns + * off and on as expected. */ +void testSetEnteringWaterHighTempShutOffRelative(string& input) +{ + const double drawVolume_L = 0.; + const double externalT_C = 20.; + const double delta = 2.; + const double highT_C = 20.; + const bool doAbsolute = false; + HPWH hpwh; + getHPWHObject(hpwh, input); + + const double relativeHighT_C = hpwh.getSetpoint() - highT_C; + // make tank cold to force on + hpwh.setTankToTemperature(highT_C); + + // run a step and check we're heating + hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(hpwh.isNthHeatSourceRunning(hpwh.getCompressorIndex()) == 1); + + // change entering water temp to below temp + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff( + relativeHighT_C + delta, doAbsolute, hpwh.getCompressorIndex()) == 0); + + // run a step and check we're not heating. + hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(hpwh.isNthHeatSourceRunning(hpwh.getCompressorIndex()) == 0); + + // and reverse it + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff( + relativeHighT_C - delta, doAbsolute, hpwh.getCompressorIndex()) == 0); + hpwh.runOneStep(highT_C, drawVolume_L, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(hpwh.isNthHeatSourceRunning(hpwh.getCompressorIndex()) == 1); } /* Test we can switch and the controls change as expected*/ -void testChangeToStateofChargeControlled(string& input) { - HPWH hpwh; - const double externalT_C = 20.; - const double setpointT_C = F_TO_C(149.); - - getHPWHObject(hpwh, input); - const bool originalHasHighTempShutOff = hpwh.hasEnteringWaterHighTempShutOff(hpwh.getCompressorIndex()); - if (!hpwh.isSetpointFixed()) { - double temp; - string tempStr; - if (!hpwh.isNewSetpointPossible(setpointT_C, temp, tempStr)) { - return; // Numbers don't aline for this type - } - hpwh.setSetpoint(setpointT_C); - } - - //Just created so should be fasle - ASSERTFALSE(hpwh.isSoCControlled()); - - // change to SOC control; - hpwh.switchToSoCControls(.76, .05, 99, true, 49, HPWH::UNITS_F); - ASSERTTRUE(hpwh.isSoCControlled()); - - // check entering water high temp shut off controll unchanged - ASSERTTRUE(hpwh.hasEnteringWaterHighTempShutOff(hpwh.getCompressorIndex()) == originalHasHighTempShutOff); - - // Test we can change the SoC and run a step and check we're heating - if (hpwh.hasEnteringWaterHighTempShutOff(hpwh.getCompressorIndex())) { - ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff(setpointT_C-HPWH::MINSINGLEPASSLIFT, true, hpwh.getCompressorIndex()) == 0); // Force to ignore this part. - } - ASSERTTRUE(hpwh.setTankToTemperature(F_TO_C(100.)) == 0); // .51 - hpwh.runOneStep( 0, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(compressorIsRunning(hpwh)); - - // Test if we're on and in band stay on - hpwh.setTankToTemperature(F_TO_C(125)); // .76 (current target) - hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(compressorIsRunning(hpwh)); - - // Test we can change the SoC and turn off - hpwh.setTankToTemperature(F_TO_C(133)); // .84 - hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTFALSE(compressorIsRunning(hpwh)); - - // Test if off and in band stay off - hpwh.setTankToTemperature(F_TO_C(125)); // .76 (current target) - hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTFALSE(compressorIsRunning(hpwh)); +void testChangeToStateofChargeControlled(string& input) +{ + HPWH hpwh; + const double externalT_C = 20.; + const double setpointT_C = F_TO_C(149.); + + getHPWHObject(hpwh, input); + const bool originalHasHighTempShutOff = + hpwh.hasEnteringWaterHighTempShutOff(hpwh.getCompressorIndex()); + if (!hpwh.isSetpointFixed()) + { + double temp; + string tempStr; + if (!hpwh.isNewSetpointPossible(setpointT_C, temp, tempStr)) + { + return; // Numbers don't aline for this type + } + hpwh.setSetpoint(setpointT_C); + } + + // Just created so should be fasle + ASSERTFALSE(hpwh.isSoCControlled()); + + // change to SOC control; + hpwh.switchToSoCControls(.76, .05, 99, true, 49, HPWH::UNITS_F); + ASSERTTRUE(hpwh.isSoCControlled()); + + // check entering water high temp shut off controll unchanged + ASSERTTRUE(hpwh.hasEnteringWaterHighTempShutOff(hpwh.getCompressorIndex()) == + originalHasHighTempShutOff); + + // Test we can change the SoC and run a step and check we're heating + if (hpwh.hasEnteringWaterHighTempShutOff(hpwh.getCompressorIndex())) + { + ASSERTTRUE(hpwh.setEnteringWaterHighTempShutOff( + setpointT_C - HPWH::MINSINGLEPASSLIFT, true, hpwh.getCompressorIndex()) == + 0); // Force to ignore this part. + } + ASSERTTRUE(hpwh.setTankToTemperature(F_TO_C(100.)) == 0); // .51 + hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(compressorIsRunning(hpwh)); + + // Test if we're on and in band stay on + hpwh.setTankToTemperature(F_TO_C(125)); // .76 (current target) + hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(compressorIsRunning(hpwh)); + + // Test we can change the SoC and turn off + hpwh.setTankToTemperature(F_TO_C(133)); // .84 + hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTFALSE(compressorIsRunning(hpwh)); + + // Test if off and in band stay off + hpwh.setTankToTemperature(F_TO_C(125)); // .76 (current target) + hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTFALSE(compressorIsRunning(hpwh)); } /*Test we can change the target and turn off and on*/ -void testSetStateOfCharge(string& input, double coldWater_F, double minTUse_F, double tankTAt76SoC) { - HPWH hpwh; - const double externalT_C = 20.; - const double setpointT_C = F_TO_C(149.); - - getHPWHObject(hpwh, input); - if (!hpwh.isSetpointFixed()) { - double temp; - string tempStr; - if (!hpwh.isNewSetpointPossible(setpointT_C, temp, tempStr)) { - return; // Numbers don't aline for this type - } - hpwh.setSetpoint(setpointT_C); - } - - // change to SOC control; - hpwh.switchToSoCControls(.85, .05, minTUse_F, true, coldWater_F, HPWH::UNITS_F); - ASSERTTRUE(hpwh.isSoCControlled()); - - // Test if we're on and in band stay on - hpwh.setTankToTemperature(F_TO_C(tankTAt76SoC)); // .76 - hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTTRUE(compressorIsRunning(hpwh)); - - // Test we can change the target SoC and turn off - hpwh.setTargetSoCFraction(0.5); - hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTFALSE(compressorIsRunning(hpwh)); - - // Change back in the band and stay turned off - hpwh.setTargetSoCFraction(0.72); - hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTFALSE(compressorIsRunning(hpwh)); - - // Drop below the band and turn on - hpwh.setTargetSoCFraction(0.70); - hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); - ASSERTFALSE(compressorIsRunning(hpwh)); +void testSetStateOfCharge(string& input, double coldWater_F, double minTUse_F, double tankTAt76SoC) +{ + HPWH hpwh; + const double externalT_C = 20.; + const double setpointT_C = F_TO_C(149.); + + getHPWHObject(hpwh, input); + if (!hpwh.isSetpointFixed()) + { + double temp; + string tempStr; + if (!hpwh.isNewSetpointPossible(setpointT_C, temp, tempStr)) + { + return; // Numbers don't aline for this type + } + hpwh.setSetpoint(setpointT_C); + } + + // change to SOC control; + hpwh.switchToSoCControls(.85, .05, minTUse_F, true, coldWater_F, HPWH::UNITS_F); + ASSERTTRUE(hpwh.isSoCControlled()); + + // Test if we're on and in band stay on + hpwh.setTankToTemperature(F_TO_C(tankTAt76SoC)); // .76 + hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTTRUE(compressorIsRunning(hpwh)); + + // Test we can change the target SoC and turn off + hpwh.setTargetSoCFraction(0.5); + hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTFALSE(compressorIsRunning(hpwh)); + + // Change back in the band and stay turned off + hpwh.setTargetSoCFraction(0.72); + hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTFALSE(compressorIsRunning(hpwh)); + + // Drop below the band and turn on + hpwh.setTargetSoCFraction(0.70); + hpwh.runOneStep(0, externalT_C, externalT_C, HPWH::DR_ALLOW); + ASSERTFALSE(compressorIsRunning(hpwh)); } /*Test adding extra heat to a tank for one minute*/ -void testExtraHeat() { - HPWH hpwh; - getHPWHObject(hpwh, "StorageTank"); +void testExtraHeat() +{ + HPWH hpwh; + getHPWHObject(hpwh, "StorageTank"); - const double ambientT_C = 20.; - const double externalT_C = 20.; - const double inletVol2_L = 0.; - const double inletT2_C = 0.; + const double ambientT_C = 20.; + const double externalT_C = 20.; + const double inletVol2_L = 0.; + const double inletT2_C = 0.; - double extraPower_W = 1000.; - std::vector nodePowerExtra_W = {extraPower_W}; + double extraPower_W = 1000.; + std::vector nodePowerExtra_W = {extraPower_W}; - // - hpwh.setUA(0.); - hpwh.setTankToTemperature(20.); + // + hpwh.setUA(0.); + hpwh.setTankToTemperature(20.); - double Q_init = hpwh.getTankHeatContent_kJ(); - hpwh.runOneStep(0, ambientT_C, externalT_C, HPWH::DR_LOC, inletVol2_L, inletT2_C, &nodePowerExtra_W); - double Q_final = hpwh.getTankHeatContent_kJ(); + double Q_init = hpwh.getTankHeatContent_kJ(); + hpwh.runOneStep( + 0, ambientT_C, externalT_C, HPWH::DR_LOC, inletVol2_L, inletT2_C, &nodePowerExtra_W); + double Q_final = hpwh.getTankHeatContent_kJ(); - double dQ_actual_kJ = (Q_final - Q_init); + double dQ_actual_kJ = (Q_final - Q_init); - double dQ_expected_kJ = extraPower_W * 60. / 1.e3; // 1 min + double dQ_expected_kJ = extraPower_W * 60. / 1.e3; // 1 min - ASSERTTRUE(cmpd(dQ_actual_kJ, dQ_expected_kJ)); -} \ No newline at end of file + ASSERTTRUE(cmpd(dQ_actual_kJ, dQ_expected_kJ)); +} diff --git a/test/testMaxSetpoint.cc b/test/testMaxSetpoint.cc index 2414387d..2ec8c138 100644 --- a/test/testMaxSetpoint.cc +++ b/test/testMaxSetpoint.cc @@ -9,13 +9,11 @@ #include "testUtilityFcts.cc" #include -#include - +#include using std::cout; using std::string; - void testMaxSetpointResistanceTank(); void testScalableCompressor(); void testJustR134ACompressor(); @@ -31,263 +29,276 @@ const double REMaxShouldBe = 100.; int main(int, char*) { - testMaxSetpointResistanceTank(); - testScalableCompressor(); - testJustR134ACompressor(); - testJustR410ACompressor(); - testJustQAHVCompressor(); - testHybridModel(); - testStorageTankSetpoint(); - testSetpointFixed(); - testResampling(); - testSetTankTemps(); - - //Made it through the gauntlet - return 0; + testMaxSetpointResistanceTank(); + testScalableCompressor(); + testJustR134ACompressor(); + testJustR410ACompressor(); + testJustQAHVCompressor(); + testHybridModel(); + testStorageTankSetpoint(); + testSetpointFixed(); + testResampling(); + testSetTankTemps(); + + // Made it through the gauntlet + return 0; } -void testMaxSetpointResistanceTank() { - HPWH hpwh; - double num; - string why; - hpwh.HPWHinit_resTank(); - - ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(99., num, why)); // Can go to near boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(100., num, why)); // Can go to boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(10., num, why)); // Can go low, albiet dumb - ASSERTTRUE(REMaxShouldBe == num); - - // Check this carries over into setting the setpoint - ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling - ASSERTTRUE(hpwh.setSetpoint(99.) == 0) +void testMaxSetpointResistanceTank() +{ + HPWH hpwh; + double num; + string why; + hpwh.HPWHinit_resTank(); + + ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling + ASSERTTRUE(hpwh.isNewSetpointPossible(99., num, why)); // Can go to near boiling + ASSERTTRUE(hpwh.isNewSetpointPossible(100., num, why)); // Can go to boiling + ASSERTTRUE(hpwh.isNewSetpointPossible(10., num, why)); // Can go low, albiet dumb + ASSERTTRUE(REMaxShouldBe == num); + + // Check this carries over into setting the setpoint + ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling + ASSERTTRUE(hpwh.setSetpoint(99.) == 0) } -void testScalableCompressor() { - HPWH hpwh; +void testScalableCompressor() +{ + HPWH hpwh; - string input = "TamScalable_SP"; // Just a compressor with R134A - double num; - string why; + string input = "TamScalable_SP"; // Just a compressor with R134A + double num; + string why; - getHPWHObject(hpwh, input); + getHPWHObject(hpwh, input); - ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(99., num, why)); // Can go to near boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(60., num, why)); // Can go to normal - ASSERTTRUE(hpwh.isNewSetpointPossible(100, num, why)); // Can go to programed max + ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling + ASSERTTRUE(hpwh.isNewSetpointPossible(99., num, why)); // Can go to near boiling + ASSERTTRUE(hpwh.isNewSetpointPossible(60., num, why)); // Can go to normal + ASSERTTRUE(hpwh.isNewSetpointPossible(100, num, why)); // Can go to programed max - // Check this carries over into setting the setpoint - ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling - ASSERTTRUE(hpwh.setSetpoint(50.) == 0) + // Check this carries over into setting the setpoint + ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling + ASSERTTRUE(hpwh.setSetpoint(50.) == 0) } -void testJustR134ACompressor() { - HPWH hpwh; +void testJustR134ACompressor() +{ + HPWH hpwh; - string input = "NyleC90A_SP"; // Just a compressor with R134A - double num; - string why; + string input = "NyleC90A_SP"; // Just a compressor with R134A + double num; + string why; - getHPWHObject(hpwh, input); + getHPWHObject(hpwh, input); - ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling - ASSERTFALSE(hpwh.isNewSetpointPossible(99., num, why)); // Can't go to near boiling - ASSERTTRUE(HPWH::MAXOUTLET_R134A == num); //Assert we're getting the right number - ASSERTTRUE(hpwh.isNewSetpointPossible(60., num, why)); // Can go to normal - ASSERTTRUE(hpwh.isNewSetpointPossible(HPWH::MAXOUTLET_R134A, num, why)); // Can go to programed max + ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling + ASSERTFALSE(hpwh.isNewSetpointPossible(99., num, why)); // Can't go to near boiling + ASSERTTRUE(HPWH::MAXOUTLET_R134A == num); // Assert we're getting the right number + ASSERTTRUE(hpwh.isNewSetpointPossible(60., num, why)); // Can go to normal + ASSERTTRUE( + hpwh.isNewSetpointPossible(HPWH::MAXOUTLET_R134A, num, why)); // Can go to programed max - // Check this carries over into setting the setpoint - ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling - ASSERTTRUE(hpwh.setSetpoint(50.) == 0) + // Check this carries over into setting the setpoint + ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling + ASSERTTRUE(hpwh.setSetpoint(50.) == 0) } -void testJustR410ACompressor() { - HPWH hpwh; - string input = "ColmacCxV_5_SP"; // Just a compressor with R410A - double num; - string why; - - getHPWHObject(hpwh, input); - - ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling - ASSERTFALSE(hpwh.isNewSetpointPossible(99., num, why)); // Can't go to near boiling - ASSERTTRUE(HPWH::MAXOUTLET_R410A == num); //Assert we're getting the right number - ASSERTTRUE(hpwh.isNewSetpointPossible(50., num, why)); // Can go to normal - ASSERTTRUE(hpwh.isNewSetpointPossible(HPWH::MAXOUTLET_R410A, num, why)); // Can go to programed max - - // Check this carries over into setting the setpoint - ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling - ASSERTTRUE(hpwh.setSetpoint(50.) == 0) +void testJustR410ACompressor() +{ + HPWH hpwh; + string input = "ColmacCxV_5_SP"; // Just a compressor with R410A + double num; + string why; + + getHPWHObject(hpwh, input); + + ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling + ASSERTFALSE(hpwh.isNewSetpointPossible(99., num, why)); // Can't go to near boiling + ASSERTTRUE(HPWH::MAXOUTLET_R410A == num); // Assert we're getting the right number + ASSERTTRUE(hpwh.isNewSetpointPossible(50., num, why)); // Can go to normal + ASSERTTRUE( + hpwh.isNewSetpointPossible(HPWH::MAXOUTLET_R410A, num, why)); // Can go to programed max + + // Check this carries over into setting the setpoint + ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling + ASSERTTRUE(hpwh.setSetpoint(50.) == 0) } -void testJustQAHVCompressor() { - HPWH hpwh; - string input = "QAHV_N136TAU_HPB_SP"; - double num; - string why; +void testJustQAHVCompressor() +{ + HPWH hpwh; + string input = "QAHV_N136TAU_HPB_SP"; + double num; + string why; - getHPWHObject(hpwh, input); + getHPWHObject(hpwh, input); - const double maxQAHVSetpoint = F_TO_C(176.1); - const double qAHVHotSideTemepratureOffset = dF_TO_dC(15.); + const double maxQAHVSetpoint = F_TO_C(176.1); + const double qAHVHotSideTemepratureOffset = dF_TO_dC(15.); - // isNewSetpointPossible should be fine, we aren't changing the setpoint of the Sanden. - ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling - ASSERTFALSE(hpwh.isNewSetpointPossible(99., num, why)); // Can't go to near boiling + // isNewSetpointPossible should be fine, we aren't changing the setpoint of the Sanden. + ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling + ASSERTFALSE(hpwh.isNewSetpointPossible(99., num, why)); // Can't go to near boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(60., num, why)); // Can go to normal + ASSERTTRUE(hpwh.isNewSetpointPossible(60., num, why)); // Can go to normal - ASSERTFALSE(hpwh.isNewSetpointPossible(maxQAHVSetpoint, num, why)); - ASSERTTRUE(hpwh.isNewSetpointPossible(maxQAHVSetpoint-qAHVHotSideTemepratureOffset, num, why)); + ASSERTFALSE(hpwh.isNewSetpointPossible(maxQAHVSetpoint, num, why)); + ASSERTTRUE( + hpwh.isNewSetpointPossible(maxQAHVSetpoint - qAHVHotSideTemepratureOffset, num, why)); - // Check this carries over into setting the setpoint. - ASSERTTRUE(hpwh.setSetpoint(101) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwh.setSetpoint(maxQAHVSetpoint) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwh.setSetpoint(maxQAHVSetpoint - qAHVHotSideTemepratureOffset) == 0); + // Check this carries over into setting the setpoint. + ASSERTTRUE(hpwh.setSetpoint(101) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwh.setSetpoint(maxQAHVSetpoint) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwh.setSetpoint(maxQAHVSetpoint - qAHVHotSideTemepratureOffset) == 0); } -void testHybridModel() { - HPWH hpwh; - string input = "AOSmithCAHP120"; //Hybrid unit with a compressor with R134A - double num; - string why; - - getHPWHObject(hpwh, input); - - ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(99., num, why)); // Can go to near boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(100., num, why)); // Can go to boiling - ASSERTTRUE(hpwh.isNewSetpointPossible(10., num, why)); // Can go low, albiet dumb - ASSERTTRUE(REMaxShouldBe == num); // Max is boiling - - // Check this carries over into setting the setpoint - ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling - ASSERTTRUE(hpwh.setSetpoint(99.) == 0) // Can go lower than boiling though +void testHybridModel() +{ + HPWH hpwh; + string input = "AOSmithCAHP120"; // Hybrid unit with a compressor with R134A + double num; + string why; + + getHPWHObject(hpwh, input); + + ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling + ASSERTTRUE(hpwh.isNewSetpointPossible(99., num, why)); // Can go to near boiling + ASSERTTRUE(hpwh.isNewSetpointPossible(100., num, why)); // Can go to boiling + ASSERTTRUE(hpwh.isNewSetpointPossible(10., num, why)); // Can go low, albiet dumb + ASSERTTRUE(REMaxShouldBe == num); // Max is boiling + + // Check this carries over into setting the setpoint + ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling + ASSERTTRUE(hpwh.setSetpoint(99.) == 0) // Can go lower than boiling though } -void testStorageTankSetpoint() { - HPWH hpwh; - string input = "StorageTank"; //Hybrid unit with a compressor with R134A - double num; - string why; - - getHPWHObject(hpwh, input); +void testStorageTankSetpoint() +{ + HPWH hpwh; + string input = "StorageTank"; // Hybrid unit with a compressor with R134A + double num; + string why; - // Storage tanks have free reign! - ASSERTTRUE(hpwh.isNewSetpointPossible(101., num, why)); // Can go above boiling! - ASSERTTRUE(hpwh.isNewSetpointPossible(99., num, why)); // Can go to near boiling! - ASSERTTRUE(hpwh.isNewSetpointPossible(10., num, why)); // Can go low, albiet dumb + getHPWHObject(hpwh, input); - // Check this carries over into setting the setpoint - ASSERTTRUE(hpwh.setSetpoint(101.) == 0); // Can't go above boiling - ASSERTTRUE(hpwh.setSetpoint(99.) == 0) // Can go lower than boiling though + // Storage tanks have free reign! + ASSERTTRUE(hpwh.isNewSetpointPossible(101., num, why)); // Can go above boiling! + ASSERTTRUE(hpwh.isNewSetpointPossible(99., num, why)); // Can go to near boiling! + ASSERTTRUE(hpwh.isNewSetpointPossible(10., num, why)); // Can go low, albiet dumb + // Check this carries over into setting the setpoint + ASSERTTRUE(hpwh.setSetpoint(101.) == 0); // Can't go above boiling + ASSERTTRUE(hpwh.setSetpoint(99.) == 0) // Can go lower than boiling though } -void testSetpointFixed() { - HPWH hpwh; - string input = "Sanden80"; //Fixed setpoint model - double num, num1; - string why; - - getHPWHObject(hpwh, input); - - // Storage tanks have free reign! - ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling! - ASSERTFALSE(hpwh.isNewSetpointPossible(99., num, why)); // Can't go to near boiling! - ASSERTFALSE(hpwh.isNewSetpointPossible(60., num, why)); // Can't go to normalish - ASSERTFALSE(hpwh.isNewSetpointPossible(10., num, why)); // Can't go low, albiet dumb - - ASSERTTRUE(num == hpwh.getSetpoint()); // Make sure it thinks the max is the setpoint - ASSERTTRUE(hpwh.isNewSetpointPossible(num, num1, why)) // Check that the setpoint can be set to the setpoint. - - // Check this carries over into setting the setpoint - ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling - ASSERTTRUE(hpwh.setSetpoint(99.) == HPWH::HPWH_ABORT) // Can go lower than boiling though - ASSERTTRUE(hpwh.setSetpoint(60.) == HPWH::HPWH_ABORT); // Can't go to normalish - ASSERTTRUE(hpwh.setSetpoint(10.) == HPWH::HPWH_ABORT); // Can't go low, albiet dumb +void testSetpointFixed() +{ + HPWH hpwh; + string input = "Sanden80"; // Fixed setpoint model + double num, num1; + string why; + + getHPWHObject(hpwh, input); + + // Storage tanks have free reign! + ASSERTFALSE(hpwh.isNewSetpointPossible(101., num, why)); // Can't go above boiling! + ASSERTFALSE(hpwh.isNewSetpointPossible(99., num, why)); // Can't go to near boiling! + ASSERTFALSE(hpwh.isNewSetpointPossible(60., num, why)); // Can't go to normalish + ASSERTFALSE(hpwh.isNewSetpointPossible(10., num, why)); // Can't go low, albiet dumb + + ASSERTTRUE(num == hpwh.getSetpoint()); // Make sure it thinks the max is the setpoint + ASSERTTRUE(hpwh.isNewSetpointPossible( + num, num1, why)) // Check that the setpoint can be set to the setpoint. + + // Check this carries over into setting the setpoint + ASSERTTRUE(hpwh.setSetpoint(101.) == HPWH::HPWH_ABORT); // Can't go above boiling + ASSERTTRUE(hpwh.setSetpoint(99.) == HPWH::HPWH_ABORT) // Can go lower than boiling though + ASSERTTRUE(hpwh.setSetpoint(60.) == HPWH::HPWH_ABORT); // Can't go to normalish + ASSERTTRUE(hpwh.setSetpoint(10.) == HPWH::HPWH_ABORT); // Can't go low, albiet dumb } -void testResampling() { +void testResampling() +{ -// test extensive resampling + // test extensive resampling std::vector values(10); - std::vector sampleValues{20., 40., 60., 40., 20.}; - ASSERTTRUE(resampleExtensive(values, sampleValues)); + std::vector sampleValues {20., 40., 60., 40., 20.}; + ASSERTTRUE(resampleExtensive(values, sampleValues)); - // Check some expected values. - ASSERTTRUE(relcmpd(values[1], 10.)); // - ASSERTTRUE(relcmpd(values[5], 30.)); // + // Check some expected values. + ASSERTTRUE(relcmpd(values[1], 10.)); // + ASSERTTRUE(relcmpd(values[5], 30.)); // -// test intensive resampling - ASSERTTRUE(resampleIntensive(values, sampleValues)); + // test intensive resampling + ASSERTTRUE(resampleIntensive(values, sampleValues)); - // Check some expected values. - ASSERTTRUE(relcmpd(values[1], 20.)); // - ASSERTTRUE(relcmpd(values[5], 60.)); // + // Check some expected values. + ASSERTTRUE(relcmpd(values[1], 20.)); // + ASSERTTRUE(relcmpd(values[5], 60.)); // } -void testSetTankTemps() { - HPWH hpwh; - getHPWHObject(hpwh, "Rheem2020Prem50"); // 12-node model - - std::vector newTemps; - -// test 1 - std::vector setTemps{10., 60.}; - hpwh.setTankLayerTemperatures(setTemps); - hpwh.getTankTemps(newTemps); - - // Check some expected values. - ASSERTTRUE(relcmpd(newTemps[0], 10.0)); // - ASSERTTRUE(relcmpd(newTemps[11], 60.0)); // - -// test 2 - setTemps = {10., 20., 30., 40., 50., 60.}; - hpwh.setTankLayerTemperatures(setTemps); - hpwh.getTankTemps(newTemps); - - // Check some expected values. - ASSERTTRUE(relcmpd(newTemps[0], 10.)); // - ASSERTTRUE(relcmpd(newTemps[5], 30.)); // - ASSERTTRUE(relcmpd(newTemps[6], 40.)); // - ASSERTTRUE(relcmpd(newTemps[11], 60.)); // - -// test 3 - setTemps = {10., 15., 20., 25., 30., 35., 40., 45., 50., 55., 60., 65., 70., 75., 80., 85., 90.}; - hpwh.setTankLayerTemperatures(setTemps); - hpwh.getTankTemps(newTemps); - - // Check some expected values. - ASSERTTRUE(relcmpd(newTemps[2], 25.3, 0.1)); // - ASSERTTRUE(relcmpd(newTemps[8], 67.6, 0.1)); // - -// test 4 - int nSet = 24; - setTemps.resize(nSet); - double Ti = 20., Tf = 66.; - for (std::size_t i = 0; i < nSet; ++i) - setTemps[i] = Ti + (Tf - Ti) * i / (nSet - 1); - hpwh.setTankLayerTemperatures(setTemps); - hpwh.getTankTemps(newTemps); - - // Check some expected values. - ASSERTTRUE(relcmpd(newTemps[4], 37.)); // - ASSERTTRUE(relcmpd(newTemps[10], 61.)); // - -// test 5 - nSet = 12; - setTemps.resize(nSet); - Ti = 20.; Tf = 64.; - for (std::size_t i = 0; i < nSet; ++i) - setTemps[i] = Ti + (Tf - Ti) * i / (nSet - 1); - hpwh.setTankLayerTemperatures(setTemps); - hpwh.getTankTemps(newTemps); - - // Check some expected values. - ASSERTTRUE(fabs(newTemps[3] - 32.) < 0.1); // - ASSERTTRUE(fabs(newTemps[11] - 64.) < 0.1); // - +void testSetTankTemps() +{ + HPWH hpwh; + getHPWHObject(hpwh, "Rheem2020Prem50"); // 12-node model + + std::vector newTemps; + + // test 1 + std::vector setTemps {10., 60.}; + hpwh.setTankLayerTemperatures(setTemps); + hpwh.getTankTemps(newTemps); + + // Check some expected values. + ASSERTTRUE(relcmpd(newTemps[0], 10.0)); // + ASSERTTRUE(relcmpd(newTemps[11], 60.0)); // + + // test 2 + setTemps = {10., 20., 30., 40., 50., 60.}; + hpwh.setTankLayerTemperatures(setTemps); + hpwh.getTankTemps(newTemps); + + // Check some expected values. + ASSERTTRUE(relcmpd(newTemps[0], 10.)); // + ASSERTTRUE(relcmpd(newTemps[5], 30.)); // + ASSERTTRUE(relcmpd(newTemps[6], 40.)); // + ASSERTTRUE(relcmpd(newTemps[11], 60.)); // + + // test 3 + setTemps = { + 10., 15., 20., 25., 30., 35., 40., 45., 50., 55., 60., 65., 70., 75., 80., 85., 90.}; + hpwh.setTankLayerTemperatures(setTemps); + hpwh.getTankTemps(newTemps); + + // Check some expected values. + ASSERTTRUE(relcmpd(newTemps[2], 25.3, 0.1)); // + ASSERTTRUE(relcmpd(newTemps[8], 67.6, 0.1)); // + + // test 4 + int nSet = 24; + setTemps.resize(nSet); + double Ti = 20., Tf = 66.; + for (std::size_t i = 0; i < nSet; ++i) + setTemps[i] = Ti + (Tf - Ti) * i / (nSet - 1); + hpwh.setTankLayerTemperatures(setTemps); + hpwh.getTankTemps(newTemps); + + // Check some expected values. + ASSERTTRUE(relcmpd(newTemps[4], 37.)); // + ASSERTTRUE(relcmpd(newTemps[10], 61.)); // + + // test 5 + nSet = 12; + setTemps.resize(nSet); + Ti = 20.; + Tf = 64.; + for (std::size_t i = 0; i < nSet; ++i) + setTemps[i] = Ti + (Tf - Ti) * i / (nSet - 1); + hpwh.setTankLayerTemperatures(setTemps); + hpwh.getTankTemps(newTemps); + + // Check some expected values. + ASSERTTRUE(fabs(newTemps[3] - 32.) < 0.1); // + ASSERTTRUE(fabs(newTemps[11] - 64.) < 0.1); // } - diff --git a/test/testPerformanceMaps.cc b/test/testPerformanceMaps.cc index 5f90aa00..67f642fb 100644 --- a/test/testPerformanceMaps.cc +++ b/test/testPerformanceMaps.cc @@ -6,7 +6,7 @@ #include "testUtilityFcts.cc" #include -#include +#include using std::cout; using std::string; @@ -14,562 +14,669 @@ using std::string; const double tInOffsetQAHV_dF = 10.; const double tOutOffsetQAHV_dF = 15.; -struct performancePointMP { - double tairF; - double tinF; - double outputBTUH; +struct performancePointMP +{ + double tairF; + double tinF; + double outputBTUH; }; -double getCapacityMP_F_KW(HPWH& hpwh, performancePointMP& point) { - return hpwh.getCompressorCapacity(point.tairF, point.tinF, point.tinF, HPWH::UNITS_KW, HPWH::UNITS_F); +double getCapacityMP_F_KW(HPWH& hpwh, performancePointMP& point) +{ + return hpwh.getCompressorCapacity( + point.tairF, point.tinF, point.tinF, HPWH::UNITS_KW, HPWH::UNITS_F); } -struct performancePointSP { - double tairF; - double toutF; - double tinF; - double outputBTUH; +struct performancePointSP +{ + double tairF; + double toutF; + double tinF; + double outputBTUH; }; -double getCapacitySP_F_BTUHR(HPWH& hpwh, performancePointSP& point) { - return hpwh.getCompressorCapacity(point.tairF, point.tinF, point.toutF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); +double getCapacitySP_F_BTUHR(HPWH& hpwh, performancePointSP& point) +{ + return hpwh.getCompressorCapacity( + point.tairF, point.tinF, point.toutF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); } -double getCapacitySP_F_BTUHR(HPWH& hpwh, performancePointSP& point, double tInOffSet_dF, double tOutOffSet_dF) { - return hpwh.getCompressorCapacity(point.tairF, point.tinF-tInOffSet_dF, point.toutF-tOutOffSet_dF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); +double getCapacitySP_F_BTUHR(HPWH& hpwh, + performancePointSP& point, + double tInOffSet_dF, + double tOutOffSet_dF) +{ + return hpwh.getCompressorCapacity(point.tairF, + point.tinF - tInOffSet_dF, + point.toutF - tOutOffSet_dF, + HPWH::UNITS_BTUperHr, + HPWH::UNITS_F); } -void testCXA15MatchesDataMap() { - HPWH hpwh; - string input = "ColmacCxA_15_SP"; - double capacity_kW, capacity_BTUperHr; - // get preset model - getHPWHObject(hpwh, input); - - // test hot ////////////////////////// - double airTempF = 100.; - double waterTempF = 125.; - double setpointF = 150.; - double capacityData_kW = 52.779317; - - capacity_BTUperHr = hpwh.getCompressorCapacity(airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - capacity_kW = hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); - - ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); - ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); - - // test middle //////////////// - airTempF = 80.; - waterTempF = 40.; - setpointF = 150.; - capacityData_kW = 44.962957379; - - capacity_BTUperHr = hpwh.getCompressorCapacity(airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - capacity_kW = hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); - - ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); - ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); - - // test cold //////////////// - airTempF = 60.; - waterTempF = 40.; - setpointF = 125.; - capacityData_kW = 37.5978306881; - - capacity_BTUperHr = hpwh.getCompressorCapacity(airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - capacity_kW = hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); - - ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); - ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); +void testCXA15MatchesDataMap() +{ + HPWH hpwh; + string input = "ColmacCxA_15_SP"; + double capacity_kW, capacity_BTUperHr; + // get preset model + getHPWHObject(hpwh, input); + + // test hot ////////////////////////// + double airTempF = 100.; + double waterTempF = 125.; + double setpointF = 150.; + double capacityData_kW = 52.779317; + + capacity_BTUperHr = hpwh.getCompressorCapacity( + airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + capacity_kW = + hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); + + ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); + ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); + + // test middle //////////////// + airTempF = 80.; + waterTempF = 40.; + setpointF = 150.; + capacityData_kW = 44.962957379; + + capacity_BTUperHr = hpwh.getCompressorCapacity( + airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + capacity_kW = + hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); + + ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); + ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); + + // test cold //////////////// + airTempF = 60.; + waterTempF = 40.; + setpointF = 125.; + capacityData_kW = 37.5978306881; + + capacity_BTUperHr = hpwh.getCompressorCapacity( + airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + capacity_kW = + hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); + + ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); + ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); } -void testCXA30MatchesDataMap() { - HPWH hpwh; - string input = "ColmacCxA_30_SP"; - double capacity_kW, capacity_BTUperHr; - // get preset model - getHPWHObject(hpwh, input); - - // test hot ////////////////////////// - double airTempF = 100.; - double waterTempF = 125.; - double setpointF = 150.; - double capacityData_kW = 105.12836804; - - capacity_BTUperHr = hpwh.getCompressorCapacity(airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - capacity_kW = hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); - - ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); - ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); - - // test middle //////////////// - airTempF = 80.; - waterTempF = 40.; - setpointF = 150.; - capacityData_kW = 89.186101453; - - capacity_BTUperHr = hpwh.getCompressorCapacity(airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - capacity_kW = hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); - - ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); - ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); - - // test cold //////////////// - airTempF = 60.; - waterTempF = 40.; - setpointF = 125.; - capacityData_kW = 74.2437689948; - - capacity_BTUperHr = hpwh.getCompressorCapacity(airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - capacity_kW = hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); - - ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); - ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); +void testCXA30MatchesDataMap() +{ + HPWH hpwh; + string input = "ColmacCxA_30_SP"; + double capacity_kW, capacity_BTUperHr; + // get preset model + getHPWHObject(hpwh, input); + + // test hot ////////////////////////// + double airTempF = 100.; + double waterTempF = 125.; + double setpointF = 150.; + double capacityData_kW = 105.12836804; + + capacity_BTUperHr = hpwh.getCompressorCapacity( + airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + capacity_kW = + hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); + + ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); + ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); + + // test middle //////////////// + airTempF = 80.; + waterTempF = 40.; + setpointF = 150.; + capacityData_kW = 89.186101453; + + capacity_BTUperHr = hpwh.getCompressorCapacity( + airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + capacity_kW = + hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); + + ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); + ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); + + // test cold //////////////// + airTempF = 60.; + waterTempF = 40.; + setpointF = 125.; + capacityData_kW = 74.2437689948; + + capacity_BTUperHr = hpwh.getCompressorCapacity( + airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + capacity_kW = + hpwh.getCompressorCapacity(F_TO_C(airTempF), F_TO_C(waterTempF), F_TO_C(setpointF)); + + ASSERTTRUE(relcmpd(KWH_TO_BTU(capacityData_kW), capacity_BTUperHr)); + ASSERTTRUE(relcmpd(capacityData_kW, capacity_kW)); } // Colmac MP perfmaps tests -void testCXV5MPMatchesDataMap() { - HPWH hpwh; - string input = "ColmacCxV_5_MP"; - performancePointMP checkPoint; +void testCXV5MPMatchesDataMap() +{ + HPWH hpwh; + string input = "ColmacCxV_5_MP"; + performancePointMP checkPoint; - // get preset model - getHPWHObject(hpwh, input); + // get preset model + getHPWHObject(hpwh, input); - // test some points outside of defrost //////////////// - checkPoint = { 10.0, 60.0, 8.7756391 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + // test some points outside of defrost //////////////// + checkPoint = {10.0, 60.0, 8.7756391}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 10.0, 102.0, 9.945545 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {10.0, 102.0, 9.945545}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 70.0, 74.0, 19.09682784 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {70.0, 74.0, 19.09682784}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 70.0, 116.0, 18.97090763 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {70.0, 116.0, 18.97090763}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 100.0, 116.0, 24.48703111 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 116.0, 24.48703111}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testCXA10MPMatchesDataMap() { - HPWH hpwh; - string input = "ColmacCxA_10_MP"; - performancePointMP checkPoint; +void testCXA10MPMatchesDataMap() +{ + HPWH hpwh; + string input = "ColmacCxA_10_MP"; + performancePointMP checkPoint; - // get preset model - getHPWHObject(hpwh, input); + // get preset model + getHPWHObject(hpwh, input); - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 66.0, 29.36581754 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + // test some points outside of defrost //////////////// + checkPoint = {60.0, 66.0, 29.36581754}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 60.0, 114.0, 27.7407144 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {60.0, 114.0, 27.7407144}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 66.0, 37.4860496 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 66.0, 37.4860496}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 114.0, 35.03416199 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 114.0, 35.03416199}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 100.0, 66.0, 46.63144 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 66.0, 46.63144}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 100.0, 114.0, 43.4308219 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 114.0, 43.4308219}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testCXA15MPMatchesDataMap() { - HPWH hpwh; - string input = "ColmacCxA_15_MP"; - performancePointMP checkPoint; +void testCXA15MPMatchesDataMap() +{ + HPWH hpwh; + string input = "ColmacCxA_15_MP"; + performancePointMP checkPoint; - // get preset model - getHPWHObject(hpwh, input); + // get preset model + getHPWHObject(hpwh, input); - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 66.0, 37.94515042 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + // test some points outside of defrost //////////////// + checkPoint = {60.0, 66.0, 37.94515042}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 60.0, 114.0, 35.2295393 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {60.0, 114.0, 35.2295393}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 66.0, 50.360549115 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 66.0, 50.360549115}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 114.0, 43.528417017 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 114.0, 43.528417017}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 100.0, 66.0, 66.2675493 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 66.0, 66.2675493}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 100.0, 114.0, 55.941855 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 114.0, 55.941855}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testCXA20MPMatchesDataMap() { - HPWH hpwh; - string input = "ColmacCxA_20_MP"; - performancePointMP checkPoint; +void testCXA20MPMatchesDataMap() +{ + HPWH hpwh; + string input = "ColmacCxA_20_MP"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); - // get preset model - getHPWHObject(hpwh, input); + // test some points outside of defrost //////////////// + checkPoint = {60.0, 66.0, 57.0994624}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 66.0, 57.0994624 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {60.0, 114.0, 53.554293}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 60.0, 114.0, 53.554293 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 66.0, 73.11242842}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 66.0, 73.11242842 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 114.0, 68.034677}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 114.0, 68.034677 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - - checkPoint = { 100.0, 66.0, 90.289474295 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - - checkPoint = { 100.0, 114.0, 84.69323 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 66.0, 90.289474295}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + + checkPoint = {100.0, 114.0, 84.69323}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testCXA25MPMatchesDataMap() { - HPWH hpwh; - string input = "ColmacCxA_25_MP"; - performancePointMP checkPoint; +void testCXA25MPMatchesDataMap() +{ + HPWH hpwh; + string input = "ColmacCxA_25_MP"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); - // get preset model - getHPWHObject(hpwh, input); + // test some points outside of defrost //////////////// + checkPoint = {60.0, 66.0, 67.28116620}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 66.0, 67.28116620 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {60.0, 114.0, 63.5665037}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 60.0, 114.0, 63.5665037 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 66.0, 84.9221285742}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 66.0, 84.9221285742 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 114.0, 79.6237088}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 114.0, 79.6237088 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 66.0, 103.43268186}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 100.0, 66.0, 103.43268186 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - - checkPoint = { 100.0, 114.0, 97.71458413 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 114.0, 97.71458413}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testCXA30MPMatchesDataMap() { - HPWH hpwh; - string input = "ColmacCxA_30_MP"; - performancePointMP checkPoint; +void testCXA30MPMatchesDataMap() +{ + HPWH hpwh; + string input = "ColmacCxA_30_MP"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); - // get preset model - getHPWHObject(hpwh, input); + // test some points outside of defrost //////////////// + checkPoint = {60.0, 66.0, 76.741462845}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 66.0, 76.741462845 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - - checkPoint = { 60.0, 114.0, 73.66879620 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {60.0, 114.0, 73.66879620}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 66.0, 94.863116775 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 66.0, 94.863116775}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 114.0, 90.998904269 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 114.0, 90.998904269}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 100.0, 66.0, 112.864628 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 66.0, 112.864628}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 100.0, 114.0, 109.444451 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {100.0, 114.0, 109.444451}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testRheemHPHD60() { - //MODELS_RHEEM_HPHD60HNU_201_MP - //MODELS_RHEEM_HPHD60VNU_201_MP - HPWH hpwh; - string input = "RheemHPHD60"; - performancePointMP checkPoint; - - // get preset model - getHPWHObject(hpwh, input); - - // test some points outside of defrost //////////////// - checkPoint = { 66.6666666, 60.0, 16.785535996 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 66.6666666, 120.0, 16.76198953 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 88.3333333, 80.0, 20.8571194294 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 110.0, 100.0, 24.287512 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); +void testRheemHPHD60() +{ + // MODELS_RHEEM_HPHD60HNU_201_MP + // MODELS_RHEEM_HPHD60VNU_201_MP + HPWH hpwh; + string input = "RheemHPHD60"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); + + // test some points outside of defrost //////////////// + checkPoint = {66.6666666, 60.0, 16.785535996}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {66.6666666, 120.0, 16.76198953}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {88.3333333, 80.0, 20.8571194294}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {110.0, 100.0, 24.287512}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testRheemHPHD135() { - //MODELS_RHEEM_HPHD135HNU_483_MP - //MODELS_RHEEM_HPHD135VNU_483_MP - HPWH hpwh; - string input = "RheemHPHD135"; - performancePointMP checkPoint; - - // get preset model - getHPWHObject(hpwh, input); - - // test some points outside of defrost //////////////// - checkPoint = { 66.6666666, 80.0, 38.560161199 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 66.6666666, 140.0, 34.70681846 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 88.3333333, 140.0, 42.40407101 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 110.0, 120.0, 54.3580927 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); +void testRheemHPHD135() +{ + // MODELS_RHEEM_HPHD135HNU_483_MP + // MODELS_RHEEM_HPHD135VNU_483_MP + HPWH hpwh; + string input = "RheemHPHD135"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); + + // test some points outside of defrost //////////////// + checkPoint = {66.6666666, 80.0, 38.560161199}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {66.6666666, 140.0, 34.70681846}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {88.3333333, 140.0, 42.40407101}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {110.0, 120.0, 54.3580927}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testNyleC60AMP() { - HPWH hpwh; - string input = "NyleC60A_MP"; - performancePointMP checkPoint; - - // get preset model - getHPWHObject(hpwh, input); - - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 60.0, 16.11 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 60.0, 21.33 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 90.0, 130.0, 19.52 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); +void testNyleC60AMP() +{ + HPWH hpwh; + string input = "NyleC60A_MP"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); + + // test some points outside of defrost //////////////// + checkPoint = {60.0, 60.0, 16.11}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 60.0, 21.33}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {90.0, 130.0, 19.52}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testNyleC90AMP() { - HPWH hpwh; - string input = "NyleC90A_MP"; - performancePointMP checkPoint; - - // get preset model - getHPWHObject(hpwh, input); - - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 60.0, 28.19 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 60.0, 37.69 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 90.0, 130.0, 36.27 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); +void testNyleC90AMP() +{ + HPWH hpwh; + string input = "NyleC90A_MP"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); + + // test some points outside of defrost //////////////// + checkPoint = {60.0, 60.0, 28.19}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 60.0, 37.69}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {90.0, 130.0, 36.27}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testNyleC125AMP() { - HPWH hpwh; - string input = "NyleC125A_MP"; - performancePointMP checkPoint; - - // get preset model - getHPWHObject(hpwh, input); - - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 60.0, 36.04}; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 60.0, 47.86 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 90.0, 130.0, 43.80}; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); +void testNyleC125AMP() +{ + HPWH hpwh; + string input = "NyleC125A_MP"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); + + // test some points outside of defrost //////////////// + checkPoint = {60.0, 60.0, 36.04}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 60.0, 47.86}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {90.0, 130.0, 43.80}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testNyleC185AMP() { - HPWH hpwh; - string input = "NyleC185A_MP"; - performancePointMP checkPoint; - - // get preset model - getHPWHObject(hpwh, input); - - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 60.0, 55.00}; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 60.0, 74.65 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 90.0, 130.0, 67.52 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); +void testNyleC185AMP() +{ + HPWH hpwh; + string input = "NyleC185A_MP"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); + + // test some points outside of defrost //////////////// + checkPoint = {60.0, 60.0, 55.00}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 60.0, 74.65}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {90.0, 130.0, 67.52}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testNyleC250AMP() { - HPWH hpwh; - string input = "NyleC250A_MP"; - performancePointMP checkPoint; - - // get preset model - getHPWHObject(hpwh, input); - - // test some points outside of defrost //////////////// - checkPoint = { 60.0, 60.0, 75.70 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 80.0, 60.0, 103.40 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); - checkPoint = { 90.0, 130.0, 77.89 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); +void testNyleC250AMP() +{ + HPWH hpwh; + string input = "NyleC250A_MP"; + performancePointMP checkPoint; + + // get preset model + getHPWHObject(hpwh, input); + + // test some points outside of defrost //////////////// + checkPoint = {60.0, 60.0, 75.70}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {80.0, 60.0, 103.40}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); + checkPoint = {90.0, 130.0, 77.89}; + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacityMP_F_KW(hpwh, checkPoint))); } -void testQAHVMatchesDataMap() { - HPWH hpwh; - string input = "QAHV_N136TAU_HPB_SP"; - performancePointSP checkPoint; // tairF, toutF, tinF, outputW - double outputBTUH; - getHPWHObject(hpwh, input); - - // test - checkPoint = { -13.0, 140.0, 41.0, 66529.49616 }; - outputBTUH = getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF); - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, outputBTUH)); - // test - checkPoint = { -13.0, 176.0, 41.0, 65872.597448 }; - ASSERTTRUE(getCapacitySP_F_BTUHR(hpwh, checkPoint) == HPWH::HPWH_ABORT); // max setpoint without adjustment forces error - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { -13.0, 176.0, 84.2, 55913.249232 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 14.0, 176.0, 84.2, 92933.01932 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 42.8, 140.0, 41.0, 136425.98804}; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 50.0, 140.0, 41.0, 136425.98804 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 50.0, 176.0, 84.2, 136564.470884}; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 60.8, 158.0, 84.2, 136461.998288 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 71.6, 158.0, 48.2, 136498.001712 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - - // test constant with setpoint between 140 and 158 - checkPoint = { 71.6, 149.0, 48.2, 136498.001712 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 82.4, 176.0, 41.0, 136557.496756 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 104.0, 140.0, 62.6, 136480 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 104.0, 158.0, 62.6, 136480 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - // test - checkPoint = { 104.0, 176.0, 84.2, 136564.470884 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); +void testQAHVMatchesDataMap() +{ + HPWH hpwh; + string input = "QAHV_N136TAU_HPB_SP"; + performancePointSP checkPoint; // tairF, toutF, tinF, outputW + double outputBTUH; + getHPWHObject(hpwh, input); + + // test + checkPoint = {-13.0, 140.0, 41.0, 66529.49616}; + outputBTUH = getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF); + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, outputBTUH)); + // test + checkPoint = {-13.0, 176.0, 41.0, 65872.597448}; + ASSERTTRUE(getCapacitySP_F_BTUHR(hpwh, checkPoint) == + HPWH::HPWH_ABORT); // max setpoint without adjustment forces error + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {-13.0, 176.0, 84.2, 55913.249232}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {14.0, 176.0, 84.2, 92933.01932}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {42.8, 140.0, 41.0, 136425.98804}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {50.0, 140.0, 41.0, 136425.98804}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {50.0, 176.0, 84.2, 136564.470884}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {60.8, 158.0, 84.2, 136461.998288}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {71.6, 158.0, 48.2, 136498.001712}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + + // test constant with setpoint between 140 and 158 + checkPoint = {71.6, 149.0, 48.2, 136498.001712}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {82.4, 176.0, 41.0, 136557.496756}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {104.0, 140.0, 62.6, 136480}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {104.0, 158.0, 62.6, 136480}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + // test + checkPoint = {104.0, 176.0, 84.2, 136564.470884}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); } -// Also test QAHV constant extrpolation at high air temperatures AND linear extrapolation to hot water temperatures! -void testQAHVExtrapolates() { - HPWH hpwh; - string input = "QAHV_N136TAU_HPB_SP"; - performancePointSP checkPoint; // tairF, toutF, tinF, outputW - getHPWHObject(hpwh, input); - - // test linear along Tin - checkPoint = { -13.0, 140.0, 36.0, 66529.49616 }; - ASSERTTRUE(checkPoint.outputBTUH < getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has increased - // test linear along Tin - checkPoint = { -13.0, 140.0, 100.0, 66529.49616 }; - ASSERTTRUE(checkPoint.outputBTUH > getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has decreased - // test linear along Tin - checkPoint = { -13.0, 176.0, 36.0, 65872.597448 }; - ASSERTTRUE(checkPoint.outputBTUH < getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has increased - // test linear along Tin - checkPoint = { -13.0, 176.0, 100.0, 55913.249232 }; - ASSERTTRUE(checkPoint.outputBTUH > getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has decreased at high Tin - // test linear along Tin - checkPoint = { 10.4, 140.0, 111., 89000.085396 }; - ASSERTTRUE(checkPoint.outputBTUH > getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has decreased at high Tin - // test linear along Tin - checkPoint = { 64.4, 158.0, 100, 136461.998288 }; - ASSERTTRUE(checkPoint.outputBTUH > getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has decreased at high Tin - // test linear along Tin - checkPoint = { 86.0, 158.0, 100, 136461.998288 }; - ASSERTTRUE(checkPoint.outputBTUH > getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has decreased at high Tin - // test linear along Tin - checkPoint = { 104.0, 176.0, 100., 136564.470884 }; - ASSERTTRUE(checkPoint.outputBTUH > getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has decreased at high Tin - - // test const along Tair - checkPoint = { 110.0, 140.0, 62.6, 136480 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - - // test const along Tair - checkPoint = { 114.0, 176.0, 84.2, 136564.470884 }; - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); - - checkPoint = { 114.0, 200.0, 84.2, 136564.470884 }; - double output = getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF); - ASSERTTRUE(output == HPWH::HPWH_ABORT); +// Also test QAHV constant extrpolation at high air temperatures AND linear extrapolation to hot +// water temperatures! +void testQAHVExtrapolates() +{ + HPWH hpwh; + string input = "QAHV_N136TAU_HPB_SP"; + performancePointSP checkPoint; // tairF, toutF, tinF, outputW + getHPWHObject(hpwh, input); + + // test linear along Tin + checkPoint = {-13.0, 140.0, 36.0, 66529.49616}; + ASSERTTRUE( + checkPoint.outputBTUH < + getCapacitySP_F_BTUHR( + hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has increased + // test linear along Tin + checkPoint = {-13.0, 140.0, 100.0, 66529.49616}; + ASSERTTRUE( + checkPoint.outputBTUH > + getCapacitySP_F_BTUHR( + hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has decreased + // test linear along Tin + checkPoint = {-13.0, 176.0, 36.0, 65872.597448}; + ASSERTTRUE( + checkPoint.outputBTUH < + getCapacitySP_F_BTUHR( + hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF)); // Check output has increased + // test linear along Tin + checkPoint = {-13.0, 176.0, 100.0, 55913.249232}; + ASSERTTRUE(checkPoint.outputBTUH > + getCapacitySP_F_BTUHR(hpwh, + checkPoint, + tInOffsetQAHV_dF, + tOutOffsetQAHV_dF)); // Check output has decreased at high Tin + // test linear along Tin + checkPoint = {10.4, 140.0, 111., 89000.085396}; + ASSERTTRUE(checkPoint.outputBTUH > + getCapacitySP_F_BTUHR(hpwh, + checkPoint, + tInOffsetQAHV_dF, + tOutOffsetQAHV_dF)); // Check output has decreased at high Tin + // test linear along Tin + checkPoint = {64.4, 158.0, 100, 136461.998288}; + ASSERTTRUE(checkPoint.outputBTUH > + getCapacitySP_F_BTUHR(hpwh, + checkPoint, + tInOffsetQAHV_dF, + tOutOffsetQAHV_dF)); // Check output has decreased at high Tin + // test linear along Tin + checkPoint = {86.0, 158.0, 100, 136461.998288}; + ASSERTTRUE(checkPoint.outputBTUH > + getCapacitySP_F_BTUHR(hpwh, + checkPoint, + tInOffsetQAHV_dF, + tOutOffsetQAHV_dF)); // Check output has decreased at high Tin + // test linear along Tin + checkPoint = {104.0, 176.0, 100., 136564.470884}; + ASSERTTRUE(checkPoint.outputBTUH > + getCapacitySP_F_BTUHR(hpwh, + checkPoint, + tInOffsetQAHV_dF, + tOutOffsetQAHV_dF)); // Check output has decreased at high Tin + + // test const along Tair + checkPoint = {110.0, 140.0, 62.6, 136480}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + + // test const along Tair + checkPoint = {114.0, 176.0, 84.2, 136564.470884}; + ASSERTTRUE( + relcmpd(checkPoint.outputBTUH, + getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF))); + + checkPoint = {114.0, 200.0, 84.2, 136564.470884}; + double output = getCapacitySP_F_BTUHR(hpwh, checkPoint, tInOffsetQAHV_dF, tOutOffsetQAHV_dF); + ASSERTTRUE(output == HPWH::HPWH_ABORT); } void testSanden() { - HPWH hpwh; - string input = "Sanden120"; - performancePointSP checkPoint; // tairF, toutF, tinF, outputW - double outputBTUH; - getHPWHObject(hpwh, input); - - // nominal - checkPoint = { 60, 149.0, 41.0, 15059.59167 }; - outputBTUH = hpwh.getCompressorCapacity(checkPoint.tairF, checkPoint.tinF, checkPoint.toutF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, outputBTUH)); - - // Cold outlet temperature - checkPoint = { 60, 125.0, 41.0, 15059.59167 }; - outputBTUH = hpwh.getCompressorCapacity(checkPoint.tairF, checkPoint.tinF, checkPoint.toutF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - ASSERTTRUE(relcmpd(checkPoint.outputBTUH, outputBTUH)); - - // tests fails when output high - checkPoint = { 60, 200, 41.0, 15059.59167 }; - outputBTUH = hpwh.getCompressorCapacity(checkPoint.tairF, checkPoint.tinF, checkPoint.toutF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - ASSERTTRUE(outputBTUH == HPWH::HPWH_ABORT); + HPWH hpwh; + string input = "Sanden120"; + performancePointSP checkPoint; // tairF, toutF, tinF, outputW + double outputBTUH; + getHPWHObject(hpwh, input); + + // nominal + checkPoint = {60, 149.0, 41.0, 15059.59167}; + outputBTUH = hpwh.getCompressorCapacity( + checkPoint.tairF, checkPoint.tinF, checkPoint.toutF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, outputBTUH)); + + // Cold outlet temperature + checkPoint = {60, 125.0, 41.0, 15059.59167}; + outputBTUH = hpwh.getCompressorCapacity( + checkPoint.tairF, checkPoint.tinF, checkPoint.toutF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + ASSERTTRUE(relcmpd(checkPoint.outputBTUH, outputBTUH)); + + // tests fails when output high + checkPoint = {60, 200, 41.0, 15059.59167}; + outputBTUH = hpwh.getCompressorCapacity( + checkPoint.tairF, checkPoint.tinF, checkPoint.toutF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + ASSERTTRUE(outputBTUH == HPWH::HPWH_ABORT); } int main(int, char*) { - testSanden(); // check can still work with HPWH::getCapacity() as expected - - testQAHVMatchesDataMap(); // Test QAHV grid data input correctly - testQAHVExtrapolates(); // Test QAHV grid data extrapolate correctly - - // Tests that the correct capacity is returned for specific equipement that matches the data set - testCXA15MatchesDataMap(); - testCXA30MatchesDataMap(); - - testCXV5MPMatchesDataMap(); - testCXA10MPMatchesDataMap(); - testCXA15MPMatchesDataMap(); - testCXA20MPMatchesDataMap(); - testCXA25MPMatchesDataMap(); - testCXA30MPMatchesDataMap(); - - testRheemHPHD135(); - testRheemHPHD60(); - - testNyleC60AMP(); - testNyleC90AMP(); - testNyleC125AMP(); - testNyleC185AMP(); - testNyleC250AMP(); - - //Made it through the gauntlet - return 0; -} \ No newline at end of file + testSanden(); // check can still work with HPWH::getCapacity() as expected + + testQAHVMatchesDataMap(); // Test QAHV grid data input correctly + testQAHVExtrapolates(); // Test QAHV grid data extrapolate correctly + + // Tests that the correct capacity is returned for specific equipement that matches the data set + testCXA15MatchesDataMap(); + testCXA30MatchesDataMap(); + + testCXV5MPMatchesDataMap(); + testCXA10MPMatchesDataMap(); + testCXA15MPMatchesDataMap(); + testCXA20MPMatchesDataMap(); + testCXA25MPMatchesDataMap(); + testCXA30MPMatchesDataMap(); + + testRheemHPHD135(); + testRheemHPHD60(); + + testNyleC60AMP(); + testNyleC90AMP(); + testNyleC125AMP(); + testNyleC185AMP(); + testNyleC250AMP(); + + // Made it through the gauntlet + return 0; +} diff --git a/test/testResistanceFcts.cc b/test/testResistanceFcts.cc index efe556c4..480a32d6 100644 --- a/test/testResistanceFcts.cc +++ b/test/testResistanceFcts.cc @@ -9,225 +9,265 @@ #include "testUtilityFcts.cc" #include -#include +#include using std::cout; using std::string; - -void testSetResistanceCapacityErrorChecks() { - HPWH hpwhHP1, hpwhR; - string input = "ColmacCxA_30_SP"; - - // get preset model - getHPWHObject(hpwhHP1, input); - - ASSERTTRUE(hpwhHP1.setResistanceCapacity(100.) == HPWH::HPWH_ABORT); // Need's to be scalable - - input = "restankRealistic"; - // get preset model - getHPWHObject(hpwhR, input); - ASSERTTRUE(hpwhR.setResistanceCapacity(-100.) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwhR.setResistanceCapacity(100., 3) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwhR.setResistanceCapacity(100., 30000) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwhR.setResistanceCapacity(100., -3) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwhR.setResistanceCapacity(100., 0, HPWH::UNITS_F) == HPWH::HPWH_ABORT); +void testSetResistanceCapacityErrorChecks() +{ + HPWH hpwhHP1, hpwhR; + string input = "ColmacCxA_30_SP"; + + // get preset model + getHPWHObject(hpwhHP1, input); + + ASSERTTRUE(hpwhHP1.setResistanceCapacity(100.) == HPWH::HPWH_ABORT); // Need's to be scalable + + input = "restankRealistic"; + // get preset model + getHPWHObject(hpwhR, input); + ASSERTTRUE(hpwhR.setResistanceCapacity(-100.) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwhR.setResistanceCapacity(100., 3) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwhR.setResistanceCapacity(100., 30000) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwhR.setResistanceCapacity(100., -3) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwhR.setResistanceCapacity(100., 0, HPWH::UNITS_F) == HPWH::HPWH_ABORT); } -void testGetSetResistanceErrors() { - HPWH hpwh; - double lowerElementPower_W = 1000; - double lowerElementPower = lowerElementPower_W / 1000; - hpwh.HPWHinit_resTank(100., 0.95, 0., lowerElementPower_W); - - double returnVal; - returnVal = hpwh.getResistanceCapacity(0, HPWH::UNITS_KW); // lower - ASSERTTRUE(relcmpd(returnVal, lowerElementPower)); - returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW); // both, - ASSERTTRUE(relcmpd(returnVal, lowerElementPower)); - returnVal = hpwh.getResistanceCapacity(1, HPWH::UNITS_KW); // higher doesn't exist - ASSERTTRUE(returnVal == HPWH::HPWH_ABORT); +void testGetSetResistanceErrors() +{ + HPWH hpwh; + double lowerElementPower_W = 1000; + double lowerElementPower = lowerElementPower_W / 1000; + hpwh.HPWHinit_resTank(100., 0.95, 0., lowerElementPower_W); + + double returnVal; + returnVal = hpwh.getResistanceCapacity(0, HPWH::UNITS_KW); // lower + ASSERTTRUE(relcmpd(returnVal, lowerElementPower)); + returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW); // both, + ASSERTTRUE(relcmpd(returnVal, lowerElementPower)); + returnVal = hpwh.getResistanceCapacity(1, HPWH::UNITS_KW); // higher doesn't exist + ASSERTTRUE(returnVal == HPWH::HPWH_ABORT); } -void testCommercialTankInitErrors() { - HPWH hpwh; - // init model - ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(-800., 10., 100., 100.) == HPWH::HPWH_ABORT); // negative volume - ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., 10., -100., 100.) == HPWH::HPWH_ABORT); // negative element - ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., 10., 100., -100.) == HPWH::HPWH_ABORT); // negative element - ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., -10., 100., 100.) == HPWH::HPWH_ABORT); // negative r value - ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., 0., 100., 100.) == HPWH::HPWH_ABORT); // 0 r value - ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., 10., 0., 0.) == HPWH::HPWH_ABORT); // Check needs one element +void testCommercialTankInitErrors() +{ + HPWH hpwh; + // init model + ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(-800., 10., 100., 100.) == + HPWH::HPWH_ABORT); // negative volume + ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., 10., -100., 100.) == + HPWH::HPWH_ABORT); // negative element + ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., 10., 100., -100.) == + HPWH::HPWH_ABORT); // negative element + ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., -10., 100., 100.) == + HPWH::HPWH_ABORT); // negative r value + ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., 0., 100., 100.) == HPWH::HPWH_ABORT); // 0 r value + ASSERTTRUE(hpwh.HPWHinit_resTankGeneric(800., 10., 0., 0.) == + HPWH::HPWH_ABORT); // Check needs one element } -void testGetNumResistanceElements() { - HPWH hpwh; - - hpwh.HPWHinit_resTankGeneric(800., 10., 0., 1000.); - ASSERTTRUE(hpwh.getNumResistanceElements() == 1); // Check 1 elements - hpwh.HPWHinit_resTankGeneric(800., 10., 1000., 0.); - ASSERTTRUE(hpwh.getNumResistanceElements() == 1); // Check 1 elements - hpwh.HPWHinit_resTankGeneric(800., 10., 1000., 1000.); - ASSERTTRUE(hpwh.getNumResistanceElements() == 2); // Check 2 elements +void testGetNumResistanceElements() +{ + HPWH hpwh; + + hpwh.HPWHinit_resTankGeneric(800., 10., 0., 1000.); + ASSERTTRUE(hpwh.getNumResistanceElements() == 1); // Check 1 elements + hpwh.HPWHinit_resTankGeneric(800., 10., 1000., 0.); + ASSERTTRUE(hpwh.getNumResistanceElements() == 1); // Check 1 elements + hpwh.HPWHinit_resTankGeneric(800., 10., 1000., 1000.); + ASSERTTRUE(hpwh.getNumResistanceElements() == 2); // Check 2 elements } -void testGetResistancePositionInRETank() { - HPWH hpwh; - - hpwh.HPWHinit_resTankGeneric(800., 10., 0., 1000.); - ASSERTTRUE(hpwh.getResistancePosition(0) == 0); // Check lower element is there - ASSERTTRUE(hpwh.getResistancePosition(1) == HPWH::HPWH_ABORT); // Check no element - ASSERTTRUE(hpwh.getResistancePosition(2) == HPWH::HPWH_ABORT); // Check no element - - hpwh.HPWHinit_resTankGeneric(800., 10., 1000., 0.); - ASSERTTRUE(hpwh.getResistancePosition(0) == 8); // Check upper element there - ASSERTTRUE(hpwh.getResistancePosition(1) == HPWH::HPWH_ABORT); // Check no elements - ASSERTTRUE(hpwh.getResistancePosition(2) == HPWH::HPWH_ABORT); // Check no elements - - hpwh.HPWHinit_resTankGeneric(800., 10., 1000., 1000.); - ASSERTTRUE(hpwh.getResistancePosition(0) == 8); // Check upper element there - ASSERTTRUE(hpwh.getResistancePosition(1) == 0); // Check lower element is there - ASSERTTRUE(hpwh.getResistancePosition(2) == HPWH::HPWH_ABORT); // Check 0 elements} +void testGetResistancePositionInRETank() +{ + HPWH hpwh; + + hpwh.HPWHinit_resTankGeneric(800., 10., 0., 1000.); + ASSERTTRUE(hpwh.getResistancePosition(0) == 0); // Check lower element is there + ASSERTTRUE(hpwh.getResistancePosition(1) == HPWH::HPWH_ABORT); // Check no element + ASSERTTRUE(hpwh.getResistancePosition(2) == HPWH::HPWH_ABORT); // Check no element + + hpwh.HPWHinit_resTankGeneric(800., 10., 1000., 0.); + ASSERTTRUE(hpwh.getResistancePosition(0) == 8); // Check upper element there + ASSERTTRUE(hpwh.getResistancePosition(1) == HPWH::HPWH_ABORT); // Check no elements + ASSERTTRUE(hpwh.getResistancePosition(2) == HPWH::HPWH_ABORT); // Check no elements + + hpwh.HPWHinit_resTankGeneric(800., 10., 1000., 1000.); + ASSERTTRUE(hpwh.getResistancePosition(0) == 8); // Check upper element there + ASSERTTRUE(hpwh.getResistancePosition(1) == 0); // Check lower element is there + ASSERTTRUE(hpwh.getResistancePosition(2) == HPWH::HPWH_ABORT); // Check 0 elements} } -void testGetResistancePositionInCompressorTank() { - HPWH hpwh; +void testGetResistancePositionInCompressorTank() +{ + HPWH hpwh; - string input = "TamScalable_SP"; - // get preset model - getHPWHObject(hpwh, input); + string input = "TamScalable_SP"; + // get preset model + getHPWHObject(hpwh, input); - ASSERTTRUE(hpwh.getResistancePosition(0) == 9); // Check top elements - ASSERTTRUE(hpwh.getResistancePosition(1) == 0); // Check bottom elements - ASSERTTRUE(hpwh.getResistancePosition(2) == HPWH::HPWH_ABORT); // Check compressor isn't RE - ASSERTTRUE(hpwh.getResistancePosition(-1) == HPWH::HPWH_ABORT); // Check out of bounds - ASSERTTRUE(hpwh.getResistancePosition(1000) == HPWH::HPWH_ABORT); // Check out of bounds + ASSERTTRUE(hpwh.getResistancePosition(0) == 9); // Check top elements + ASSERTTRUE(hpwh.getResistancePosition(1) == 0); // Check bottom elements + ASSERTTRUE(hpwh.getResistancePosition(2) == HPWH::HPWH_ABORT); // Check compressor isn't RE + ASSERTTRUE(hpwh.getResistancePosition(-1) == HPWH::HPWH_ABORT); // Check out of bounds + ASSERTTRUE(hpwh.getResistancePosition(1000) == HPWH::HPWH_ABORT); // Check out of bounds } -void testCommercialTankErrorsWithBottomElement() { - HPWH hpwh; - double elementPower_kW = 10.; //KW - // init model - hpwh.HPWHinit_resTankGeneric(800., 10., 0., elementPower_kW * 1000.); - - // Check only lowest setting works - double factor = 3.; - // set both, but really only one - ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, -1, HPWH::UNITS_KW) == 0); // Check sets - ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW), factor * elementPower_kW)); // Check gets just bottom with both - ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(0, HPWH::UNITS_KW), factor * elementPower_kW)); // Check gets bottom with bottom - ASSERTTRUE(hpwh.getResistanceCapacity(1, HPWH::UNITS_KW) == HPWH::HPWH_ABORT); // only have one element - - // set lowest - factor = 4.; - ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, 0, HPWH::UNITS_KW) == 0); // Set just bottom - ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW), factor * elementPower_kW)); // Check gets just bottom with both - ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(0, HPWH::UNITS_KW), factor * elementPower_kW)); // Check gets bottom with bottom - ASSERTTRUE(hpwh.getResistanceCapacity(1, HPWH::UNITS_KW) == HPWH::HPWH_ABORT); // only have one element - - ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, 1, HPWH::UNITS_KW) == HPWH::HPWH_ABORT); // set top returns error +void testCommercialTankErrorsWithBottomElement() +{ + HPWH hpwh; + double elementPower_kW = 10.; // KW + // init model + hpwh.HPWHinit_resTankGeneric(800., 10., 0., elementPower_kW * 1000.); + + // Check only lowest setting works + double factor = 3.; + // set both, but really only one + ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, -1, HPWH::UNITS_KW) == + 0); // Check sets + ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW), + factor * elementPower_kW)); // Check gets just bottom with both + ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(0, HPWH::UNITS_KW), + factor * elementPower_kW)); // Check gets bottom with bottom + ASSERTTRUE(hpwh.getResistanceCapacity(1, HPWH::UNITS_KW) == + HPWH::HPWH_ABORT); // only have one element + + // set lowest + factor = 4.; + ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, 0, HPWH::UNITS_KW) == + 0); // Set just bottom + ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW), + factor * elementPower_kW)); // Check gets just bottom with both + ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(0, HPWH::UNITS_KW), + factor * elementPower_kW)); // Check gets bottom with bottom + ASSERTTRUE(hpwh.getResistanceCapacity(1, HPWH::UNITS_KW) == + HPWH::HPWH_ABORT); // only have one element + + ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, 1, HPWH::UNITS_KW) == + HPWH::HPWH_ABORT); // set top returns error } -void testCommercialTankErrorsWithTopElement() { - HPWH hpwh; - double elementPower_kW = 10.; //KW - // init model - hpwh.HPWHinit_resTankGeneric(800., 10., elementPower_kW * 1000., 0.); - - // Check only bottom setting works - double factor = 3.; - // set both, but only bottom really. - ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, -1, HPWH::UNITS_KW) == 0); // Check sets - ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW), factor * elementPower_kW)); // Check gets just bottom which is now top with both - ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(0, HPWH::UNITS_KW), factor * elementPower_kW)); // Check the lower and only element - ASSERTTRUE(hpwh.getResistanceCapacity(1, HPWH::UNITS_KW) == HPWH::HPWH_ABORT); // error on non existant element - - // set top - factor = 4.; - ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, 0, HPWH::UNITS_KW) == 0); // only one element to set - ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(0, HPWH::UNITS_KW), factor * elementPower_kW)); // Check gets just bottom which is now top with both - ASSERTTRUE(hpwh.getResistanceCapacity(1, HPWH::UNITS_KW) == HPWH::HPWH_ABORT); // error on non existant bottom - - // set bottom returns error - ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, 2, HPWH::UNITS_KW) == HPWH::HPWH_ABORT); +void testCommercialTankErrorsWithTopElement() +{ + HPWH hpwh; + double elementPower_kW = 10.; // KW + // init model + hpwh.HPWHinit_resTankGeneric(800., 10., elementPower_kW * 1000., 0.); + + // Check only bottom setting works + double factor = 3.; + // set both, but only bottom really. + ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, -1, HPWH::UNITS_KW) == + 0); // Check sets + ASSERTTRUE( + relcmpd(hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW), + factor * elementPower_kW)); // Check gets just bottom which is now top with both + ASSERTTRUE(relcmpd(hpwh.getResistanceCapacity(0, HPWH::UNITS_KW), + factor * elementPower_kW)); // Check the lower and only element + ASSERTTRUE(hpwh.getResistanceCapacity(1, HPWH::UNITS_KW) == + HPWH::HPWH_ABORT); // error on non existant element + + // set top + factor = 4.; + ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, 0, HPWH::UNITS_KW) == + 0); // only one element to set + ASSERTTRUE( + relcmpd(hpwh.getResistanceCapacity(0, HPWH::UNITS_KW), + factor * elementPower_kW)); // Check gets just bottom which is now top with both + ASSERTTRUE(hpwh.getResistanceCapacity(1, HPWH::UNITS_KW) == + HPWH::HPWH_ABORT); // error on non existant bottom + + // set bottom returns error + ASSERTTRUE(hpwh.setResistanceCapacity(factor * elementPower_kW, 2, HPWH::UNITS_KW) == + HPWH::HPWH_ABORT); } -struct InsulationPoint { - double volume_L; - double rValue_IP; - double expectedUA_SI; +struct InsulationPoint +{ + double volume_L; + double rValue_IP; + double expectedUA_SI; }; #define R_TO_RSI(rvalue) rvalue * 0.176110 -#define INITGEN(point) hpwh.HPWHinit_resTankGeneric(point.volume_L, R_TO_RSI(point.rValue_IP), elementPower_kW * 1000., elementPower_kW * 1000.) -void testCommercialTankInit() { - HPWH hpwh; - double elementPower_kW = 10.; //KW - double UA; - const InsulationPoint testPoint800 = { 800., 10., 10.500366 }; - const InsulationPoint testPoint2 = { 2., 6., 0.322364 }; - const InsulationPoint testPoint50 = { 50., 12., 1.37808 }; - const InsulationPoint testPoint200 = { 200., 16., 2.604420 }; - const InsulationPoint testPoint200B = { 200., 6., 6.94512163 }; - const InsulationPoint testPoint2000 = { 2000., 16., 12.0886496 }; - const InsulationPoint testPoint20000 = { 20000., 6., 149.628109 }; - - - // Check UA is as expected at 800 gal - INITGEN(testPoint800); - hpwh.getUA(UA); - ASSERTTRUE(relcmpd(UA, testPoint800.expectedUA_SI, 0.0001)); - // Check UA independent of elements - hpwh.HPWHinit_resTankGeneric(testPoint800.volume_L, R_TO_RSI(testPoint800.rValue_IP), elementPower_kW, elementPower_kW); - hpwh.getUA(UA); - ASSERTTRUE(relcmpd(UA, testPoint800.expectedUA_SI, 0.0001)); - - // Check UA is as expected at 2 gal - INITGEN(testPoint2); - hpwh.getUA(UA); - ASSERTTRUE(relcmpd(UA, testPoint2.expectedUA_SI, 0.0001)); - - // Check UA is as expected at 50 gal - INITGEN(testPoint50); - hpwh.getUA(UA); - ASSERTTRUE(relcmpd(UA, testPoint50.expectedUA_SI, 0.0001)); - - // Check UA is as expected at 200 gal - INITGEN(testPoint200); - hpwh.getUA(UA); - ASSERTTRUE(relcmpd(UA, testPoint200.expectedUA_SI, 0.0001)); - - INITGEN(testPoint200B); - hpwh.getUA(UA); - ASSERTTRUE(relcmpd(UA, testPoint200B.expectedUA_SI, 0.0001)); - - // Check UA is as expected at 2000 gal - INITGEN(testPoint2000); - hpwh.getUA(UA); - ASSERTTRUE(relcmpd(UA, testPoint2000.expectedUA_SI, 0.0001)); - - // Check UA is as expected at 20000 gal - INITGEN(testPoint20000); - hpwh.getUA(UA); - ASSERTTRUE(relcmpd(UA, testPoint20000.expectedUA_SI, 0.0001)); +#define INITGEN(point) \ + hpwh.HPWHinit_resTankGeneric(point.volume_L, \ + R_TO_RSI(point.rValue_IP), \ + elementPower_kW * 1000., \ + elementPower_kW * 1000.) +void testCommercialTankInit() +{ + HPWH hpwh; + double elementPower_kW = 10.; // KW + double UA; + const InsulationPoint testPoint800 = {800., 10., 10.500366}; + const InsulationPoint testPoint2 = {2., 6., 0.322364}; + const InsulationPoint testPoint50 = {50., 12., 1.37808}; + const InsulationPoint testPoint200 = {200., 16., 2.604420}; + const InsulationPoint testPoint200B = {200., 6., 6.94512163}; + const InsulationPoint testPoint2000 = {2000., 16., 12.0886496}; + const InsulationPoint testPoint20000 = {20000., 6., 149.628109}; + + // Check UA is as expected at 800 gal + INITGEN(testPoint800); + hpwh.getUA(UA); + ASSERTTRUE(relcmpd(UA, testPoint800.expectedUA_SI, 0.0001)); + // Check UA independent of elements + hpwh.HPWHinit_resTankGeneric( + testPoint800.volume_L, R_TO_RSI(testPoint800.rValue_IP), elementPower_kW, elementPower_kW); + hpwh.getUA(UA); + ASSERTTRUE(relcmpd(UA, testPoint800.expectedUA_SI, 0.0001)); + + // Check UA is as expected at 2 gal + INITGEN(testPoint2); + hpwh.getUA(UA); + ASSERTTRUE(relcmpd(UA, testPoint2.expectedUA_SI, 0.0001)); + + // Check UA is as expected at 50 gal + INITGEN(testPoint50); + hpwh.getUA(UA); + ASSERTTRUE(relcmpd(UA, testPoint50.expectedUA_SI, 0.0001)); + + // Check UA is as expected at 200 gal + INITGEN(testPoint200); + hpwh.getUA(UA); + ASSERTTRUE(relcmpd(UA, testPoint200.expectedUA_SI, 0.0001)); + + INITGEN(testPoint200B); + hpwh.getUA(UA); + ASSERTTRUE(relcmpd(UA, testPoint200B.expectedUA_SI, 0.0001)); + + // Check UA is as expected at 2000 gal + INITGEN(testPoint2000); + hpwh.getUA(UA); + ASSERTTRUE(relcmpd(UA, testPoint2000.expectedUA_SI, 0.0001)); + + // Check UA is as expected at 20000 gal + INITGEN(testPoint20000); + hpwh.getUA(UA); + ASSERTTRUE(relcmpd(UA, testPoint20000.expectedUA_SI, 0.0001)); } #undef INITGEN #undef R_TO_RSI int main(int, char*) { - testSetResistanceCapacityErrorChecks(); // Check the resistance reset throws errors when expected. + testSetResistanceCapacityErrorChecks(); // Check the resistance reset throws errors when + // expected. - testGetSetResistanceErrors(); // Check can make ER residential tank with one lower element, and can't set/get upper + testGetSetResistanceErrors(); // Check can make ER residential tank with one lower element, and + // can't set/get upper - testCommercialTankInitErrors(); // test it inits as expected - testGetNumResistanceElements(); // unit test on getNumResistanceElements() - testGetResistancePositionInRETank(); // unit test on getResistancePosition() for an RE tank - testGetResistancePositionInCompressorTank(); // unit test on getResistancePosition() for a compressor + testCommercialTankInitErrors(); // test it inits as expected + testGetNumResistanceElements(); // unit test on getNumResistanceElements() + testGetResistancePositionInRETank(); // unit test on getResistancePosition() for an RE tank + testGetResistancePositionInCompressorTank(); // unit test on getResistancePosition() for a + // compressor - testCommercialTankErrorsWithBottomElement(); // - testCommercialTankErrorsWithTopElement(); - testCommercialTankInit(); // + testCommercialTankErrorsWithBottomElement(); // + testCommercialTankErrorsWithTopElement(); + testCommercialTankInit(); // - //Made it through the gauntlet - return 0; + // Made it through the gauntlet + return 0; } diff --git a/test/testScaleHPWH.cc b/test/testScaleHPWH.cc index e1f83390..f6ee350b 100644 --- a/test/testScaleHPWH.cc +++ b/test/testScaleHPWH.cc @@ -9,522 +9,569 @@ #include "testUtilityFcts.cc" #include -#include +#include using std::cout; using std::string; -struct performance { - double input, output, cop; +struct performance +{ + double input, output, cop; }; -void getCompressorPerformance(HPWH &hpwh, performance &point, double waterTempC, double airTempC, double setpointC) { - if (hpwh.isCompressorMultipass()) { // Multipass capacity looks at the average of the temperature of the lift - hpwh.setSetpoint((waterTempC + setpointC) / 2.); - } - else { - hpwh.setSetpoint(waterTempC); - } - hpwh.resetTankToSetpoint(); //Force tank cold - hpwh.setSetpoint(setpointC); - - // Run the step - hpwh.runOneStep(waterTempC, // Inlet water temperature (C ) - 0., // Flow in gallons - airTempC, // Ambient Temp (C) - airTempC, // External Temp (C) - //HPWH::DR_TOO // DR Status (now an enum. Fixed for now as allow) - (HPWH::DR_TOO | HPWH::DR_LOR) // DR Status (now an enum. Fixed for now as allow) - ); - - // Check the heat in and out of the compressor - point.input = hpwh.getNthHeatSourceEnergyInput(hpwh.getCompressorIndex()); - point.output = hpwh.getNthHeatSourceEnergyOutput(hpwh.getCompressorIndex()); - point.cop = point.output / point.input ; +void getCompressorPerformance( + HPWH& hpwh, performance& point, double waterTempC, double airTempC, double setpointC) +{ + if (hpwh.isCompressorMultipass()) + { // Multipass capacity looks at the average of the temperature of the lift + hpwh.setSetpoint((waterTempC + setpointC) / 2.); + } + else + { + hpwh.setSetpoint(waterTempC); + } + hpwh.resetTankToSetpoint(); // Force tank cold + hpwh.setSetpoint(setpointC); + + // Run the step + hpwh.runOneStep(waterTempC, // Inlet water temperature (C ) + 0., // Flow in gallons + airTempC, // Ambient Temp (C) + airTempC, // External Temp (C) + // HPWH::DR_TOO // DR Status (now an enum. Fixed for now as allow) + (HPWH::DR_TOO | HPWH::DR_LOR) // DR Status (now an enum. Fixed for now as allow) + ); + + // Check the heat in and out of the compressor + point.input = hpwh.getNthHeatSourceEnergyInput(hpwh.getCompressorIndex()); + point.output = hpwh.getNthHeatSourceEnergyOutput(hpwh.getCompressorIndex()); + point.cop = point.output / point.input; } -void scaleCapacityCOP(HPWH &hpwh, double scaleInput, double scaleCOP, performance &point0, performance &point1, - double waterTempC = F_TO_C(63), double airTempC = F_TO_C(77), double setpointC = F_TO_C(135)) { - // Get peformance unscalled - getCompressorPerformance(hpwh, point0, waterTempC, airTempC, setpointC); +void scaleCapacityCOP(HPWH& hpwh, + double scaleInput, + double scaleCOP, + performance& point0, + performance& point1, + double waterTempC = F_TO_C(63), + double airTempC = F_TO_C(77), + double setpointC = F_TO_C(135)) +{ + // Get peformance unscalled + getCompressorPerformance(hpwh, point0, waterTempC, airTempC, setpointC); - // Scale the compressor - int val = hpwh.setScaleHPWHCapacityCOP(scaleInput, scaleCOP); - ASSERTTRUE(val == 0); + // Scale the compressor + int val = hpwh.setScaleHPWHCapacityCOP(scaleInput, scaleCOP); + ASSERTTRUE(val == 0); - // Get the scaled performance - getCompressorPerformance(hpwh, point1, waterTempC, airTempC, setpointC); + // Get the scaled performance + getCompressorPerformance(hpwh, point1, waterTempC, airTempC, setpointC); } -void testNoScaleOutOfBounds() { // Test that we can NOT scale the scalable model with scale <= 0 - HPWH hpwh; +void testNoScaleOutOfBounds() +{ // Test that we can NOT scale the scalable model with scale <= 0 + HPWH hpwh; - string input = "TamScalable_SP"; + string input = "TamScalable_SP"; - double num; + double num; - // get preset model - getHPWHObject(hpwh, input); + // get preset model + getHPWHObject(hpwh, input); - num = 0; - ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(num, 1.) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(1., num) == HPWH::HPWH_ABORT); + num = 0; + ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(num, 1.) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(1., num) == HPWH::HPWH_ABORT); - num = -1; - ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(num, 1.) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(1., num) == HPWH::HPWH_ABORT); + num = -1; + ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(num, 1.) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(1., num) == HPWH::HPWH_ABORT); } -void testNoneScalable() { // Test a model that is not scalable - HPWH hpwh; +void testNoneScalable() +{ // Test a model that is not scalable + HPWH hpwh; - string input = "AOSmithCAHP120"; + string input = "AOSmithCAHP120"; - // get preset model - getHPWHObject(hpwh, input); + // get preset model + getHPWHObject(hpwh, input); - ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(1., 1.) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(1., 1.) == HPWH::HPWH_ABORT); } -void testScalableHPWHScales() { // Test the scalable hpwh can scale - HPWH hpwh; - - string input = "TamScalable_SP"; - - performance point0, point1; - double num, anotherNum; - - // get preset model - getHPWHObject(hpwh, input); - - num = 0.001; // Very low - scaleCapacityCOP(hpwh, num, 1., point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop)); - - scaleCapacityCOP(hpwh, 1., num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - scaleCapacityCOP(hpwh, num, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 0.2; // normal but bad low - scaleCapacityCOP(hpwh, num, 1., point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop)); - - scaleCapacityCOP(hpwh, 1., num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - scaleCapacityCOP(hpwh, num, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 3.; // normal but pretty high - scaleCapacityCOP(hpwh, num, 1., point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop)); - - scaleCapacityCOP(hpwh, 1., num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - scaleCapacityCOP(hpwh, num, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 1000; // really high - scaleCapacityCOP(hpwh, num, 1., point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop)); - - scaleCapacityCOP(hpwh, 1., num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - scaleCapacityCOP(hpwh, num, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 10; - anotherNum = 0.1; // weird high and low - scaleCapacityCOP(hpwh, num, anotherNum, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / anotherNum)); - - scaleCapacityCOP(hpwh, anotherNum, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / anotherNum)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 1.5; - anotherNum = 0.9; // real high and low - scaleCapacityCOP(hpwh, num, anotherNum, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / anotherNum)); - - scaleCapacityCOP(hpwh, anotherNum, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / anotherNum)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); +void testScalableHPWHScales() +{ // Test the scalable hpwh can scale + HPWH hpwh; + + string input = "TamScalable_SP"; + + performance point0, point1; + double num, anotherNum; + + // get preset model + getHPWHObject(hpwh, input); + + num = 0.001; // Very low + scaleCapacityCOP(hpwh, num, 1., point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop)); + + scaleCapacityCOP(hpwh, 1., num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + scaleCapacityCOP(hpwh, num, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 0.2; // normal but bad low + scaleCapacityCOP(hpwh, num, 1., point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop)); + + scaleCapacityCOP(hpwh, 1., num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + scaleCapacityCOP(hpwh, num, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 3.; // normal but pretty high + scaleCapacityCOP(hpwh, num, 1., point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop)); + + scaleCapacityCOP(hpwh, 1., num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + scaleCapacityCOP(hpwh, num, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 1000; // really high + scaleCapacityCOP(hpwh, num, 1., point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop)); + + scaleCapacityCOP(hpwh, 1., num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + scaleCapacityCOP(hpwh, num, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 10; + anotherNum = 0.1; // weird high and low + scaleCapacityCOP(hpwh, num, anotherNum, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / anotherNum)); + + scaleCapacityCOP(hpwh, anotherNum, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / anotherNum)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 1.5; + anotherNum = 0.9; // real high and low + scaleCapacityCOP(hpwh, num, anotherNum, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / anotherNum)); + + scaleCapacityCOP(hpwh, anotherNum, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / anotherNum)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); } -void testScalableMPHPWHScales() { // Test the scalable MP hpwh can scale - HPWH hpwh; - - string input = "Scalable_MP"; - - performance point0, point1; - double num, anotherNum; - - // get preset model - getHPWHObject(hpwh, input); - - num = 0.001; // Very low - scaleCapacityCOP(hpwh, num, 1., point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop)); - - scaleCapacityCOP(hpwh, 1., num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - scaleCapacityCOP(hpwh, num, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 0.2; // normal but bad low - scaleCapacityCOP(hpwh, num, 1., point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop)); - - scaleCapacityCOP(hpwh, 1., num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - scaleCapacityCOP(hpwh, num, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 3.; // normal but pretty high - scaleCapacityCOP(hpwh, num, 1., point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop)); - - scaleCapacityCOP(hpwh, 1., num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - scaleCapacityCOP(hpwh, num, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 1000; // really high - scaleCapacityCOP(hpwh, num, 1., point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop)); - - scaleCapacityCOP(hpwh, 1., num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input)); - ASSERTTRUE(cmpd(point0.output, point1.output / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - scaleCapacityCOP(hpwh, num, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 10; - anotherNum = 0.1; // weird high and low - scaleCapacityCOP(hpwh, num, anotherNum, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / anotherNum)); - - scaleCapacityCOP(hpwh, anotherNum, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / anotherNum)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); - - num = 1.5; - anotherNum = 0.9; // real high and low - scaleCapacityCOP(hpwh, num, anotherNum, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / num)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / anotherNum)); - - scaleCapacityCOP(hpwh, anotherNum, num, point0, point1); - ASSERTTRUE(cmpd(point0.input, point1.input / anotherNum)); - ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); - ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); +void testScalableMPHPWHScales() +{ // Test the scalable MP hpwh can scale + HPWH hpwh; + + string input = "Scalable_MP"; + + performance point0, point1; + double num, anotherNum; + + // get preset model + getHPWHObject(hpwh, input); + + num = 0.001; // Very low + scaleCapacityCOP(hpwh, num, 1., point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop)); + + scaleCapacityCOP(hpwh, 1., num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + scaleCapacityCOP(hpwh, num, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 0.2; // normal but bad low + scaleCapacityCOP(hpwh, num, 1., point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop)); + + scaleCapacityCOP(hpwh, 1., num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + scaleCapacityCOP(hpwh, num, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 3.; // normal but pretty high + scaleCapacityCOP(hpwh, num, 1., point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop)); + + scaleCapacityCOP(hpwh, 1., num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + scaleCapacityCOP(hpwh, num, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 1000; // really high + scaleCapacityCOP(hpwh, num, 1., point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop)); + + scaleCapacityCOP(hpwh, 1., num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input)); + ASSERTTRUE(cmpd(point0.output, point1.output / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + scaleCapacityCOP(hpwh, num, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / num)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 10; + anotherNum = 0.1; // weird high and low + scaleCapacityCOP(hpwh, num, anotherNum, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / anotherNum)); + + scaleCapacityCOP(hpwh, anotherNum, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / anotherNum)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); + + num = 1.5; + anotherNum = 0.9; // real high and low + scaleCapacityCOP(hpwh, num, anotherNum, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / num)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / anotherNum)); + + scaleCapacityCOP(hpwh, anotherNum, num, point0, point1); + ASSERTTRUE(cmpd(point0.input, point1.input / anotherNum)); + ASSERTTRUE(cmpd(point0.output, point1.output / num / anotherNum)); + ASSERTTRUE(cmpd(point0.cop, point1.cop / num)); } -void testSPGetCompressorCapacity() { - HPWH hpwh; +void testSPGetCompressorCapacity() +{ + HPWH hpwh; - string input = "ColmacCxA_20_SP"; + string input = "ColmacCxA_20_SP"; - performance point0; + performance point0; - double capacity_kWH, capacity_BTU; - double waterTempC = F_TO_C(63); - double airTempC = F_TO_C(77); - double setpointC = F_TO_C(135); + double capacity_kWH, capacity_BTU; + double waterTempC = F_TO_C(63); + double airTempC = F_TO_C(77); + double setpointC = F_TO_C(135); - // get preset model - getHPWHObject(hpwh, input); + // get preset model + getHPWHObject(hpwh, input); - getCompressorPerformance(hpwh, point0, waterTempC, airTempC, setpointC); // gives kWH - capacity_kWH = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC) / 60; // div 60 to kWh because I know above only runs 1 minute + getCompressorPerformance(hpwh, point0, waterTempC, airTempC, setpointC); // gives kWH + capacity_kWH = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC) / + 60; // div 60 to kWh because I know above only runs 1 minute - ASSERTTRUE(cmpd(point0.output, capacity_kWH)); + ASSERTTRUE(cmpd(point0.output, capacity_kWH)); - //Test with IP units - capacity_BTU = hpwh.getCompressorCapacity(C_TO_F(airTempC), C_TO_F(waterTempC), C_TO_F(setpointC), HPWH::UNITS_BTUperHr, HPWH::UNITS_F) / 60; // div 60 to BTU because I know above only runs 1 minute - ASSERTTRUE(relcmpd(KWH_TO_BTU(point0.output), capacity_BTU)); // relative cmp since in btu's these will be large numbers + // Test with IP units + capacity_BTU = hpwh.getCompressorCapacity(C_TO_F(airTempC), + C_TO_F(waterTempC), + C_TO_F(setpointC), + HPWH::UNITS_BTUperHr, + HPWH::UNITS_F) / + 60; // div 60 to BTU because I know above only runs 1 minute + ASSERTTRUE(relcmpd(KWH_TO_BTU(point0.output), + capacity_BTU)); // relative cmp since in btu's these will be large numbers } -void testMPGetCompressorCapacity() { - HPWH hpwh; - - string input = "ColmacCxA_20_MP"; - - performance point0; - - double capacity_kWH, capacity_BTU; - double waterTempC = F_TO_C(50); // 50 and 126 to make average 88 - double airTempC = F_TO_C(61.7); - double setpointC = F_TO_C(126); - - // get preset model - getHPWHObject(hpwh, input); - capacity_kWH = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC) / 60.; // div 60 to kWh because I know above only runs 1 minute - getCompressorPerformance(hpwh, point0, waterTempC, airTempC, setpointC); // gives kWH - ASSERTTRUE(cmpd(point0.output, capacity_kWH)); - - //Test with IP units - capacity_BTU = hpwh.getCompressorCapacity(C_TO_F(airTempC), C_TO_F(waterTempC), C_TO_F(setpointC), HPWH::UNITS_BTUperHr, HPWH::UNITS_F) / 60; // div 60 to BTU because I know above only runs 1 minute - ASSERTTRUE(relcmpd(KWH_TO_BTU(point0.output), capacity_BTU, 0.0001)); // relative cmp since in btu's these will be large numbers +void testMPGetCompressorCapacity() +{ + HPWH hpwh; + + string input = "ColmacCxA_20_MP"; + + performance point0; + + double capacity_kWH, capacity_BTU; + double waterTempC = F_TO_C(50); // 50 and 126 to make average 88 + double airTempC = F_TO_C(61.7); + double setpointC = F_TO_C(126); + + // get preset model + getHPWHObject(hpwh, input); + capacity_kWH = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC) / + 60.; // div 60 to kWh because I know above only runs 1 minute + getCompressorPerformance(hpwh, point0, waterTempC, airTempC, setpointC); // gives kWH + ASSERTTRUE(cmpd(point0.output, capacity_kWH)); + + // Test with IP units + capacity_BTU = hpwh.getCompressorCapacity(C_TO_F(airTempC), + C_TO_F(waterTempC), + C_TO_F(setpointC), + HPWH::UNITS_BTUperHr, + HPWH::UNITS_F) / + 60; // div 60 to BTU because I know above only runs 1 minute + ASSERTTRUE(relcmpd(KWH_TO_BTU(point0.output), + capacity_BTU, + 0.0001)); // relative cmp since in btu's these will be large numbers } - -void testSetMPCompressorOutputCapacity() { - HPWH hpwh; - - string input = "Scalable_MP"; - - double newCapacity_kW, num; - double waterTempC = F_TO_C(44); - double airTempC = F_TO_C(98); - double setpointC = F_TO_C(150); - - // get preset model - getHPWHObject(hpwh, input); - - //Scale output to 1 kW - num = 1.; - hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); - newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); - ASSERTTRUE(cmpd(num, newCapacity_kW)); - - //Scale output to .01 kW - num = .01; - hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); - newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); - ASSERTTRUE(cmpd(num, newCapacity_kW)); - - //Scale output to 1000 kW - num = 1000.; - hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); - newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); - ASSERTTRUE(cmpd(num, newCapacity_kW)); - - // Check again with changed setpoint, for MP it should affect output capacity since it looks at the mean temperature for the cycle. - setpointC = F_TO_C(100); - newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); - ASSERTFALSE(cmpd(num, newCapacity_kW)); +void testSetMPCompressorOutputCapacity() +{ + HPWH hpwh; + + string input = "Scalable_MP"; + + double newCapacity_kW, num; + double waterTempC = F_TO_C(44); + double airTempC = F_TO_C(98); + double setpointC = F_TO_C(150); + + // get preset model + getHPWHObject(hpwh, input); + + // Scale output to 1 kW + num = 1.; + hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); + newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); + ASSERTTRUE(cmpd(num, newCapacity_kW)); + + // Scale output to .01 kW + num = .01; + hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); + newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); + ASSERTTRUE(cmpd(num, newCapacity_kW)); + + // Scale output to 1000 kW + num = 1000.; + hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); + newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); + ASSERTTRUE(cmpd(num, newCapacity_kW)); + + // Check again with changed setpoint, for MP it should affect output capacity since it looks at + // the mean temperature for the cycle. + setpointC = F_TO_C(100); + newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); + ASSERTFALSE(cmpd(num, newCapacity_kW)); } -void testSetCompressorOutputCapacity() { - HPWH hpwh; - - string input = "TamScalable_SP"; - - double newCapacity_kW, num; - double waterTempC = F_TO_C(44); - double airTempC = F_TO_C(98); - double setpointC = F_TO_C(145); - - // get preset model - getHPWHObject(hpwh, input); - - //Scale output to 1 kW - num = 1.; - hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); - newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); - ASSERTTRUE(cmpd(num, newCapacity_kW)); - - //Scale output to .01 kW - num = .01; - hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); - newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); - ASSERTTRUE(cmpd(num, newCapacity_kW)); - - //Scale output to 1000 kW - num = 1000.; - hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); - newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); - ASSERTTRUE(cmpd(num, newCapacity_kW)); - - //Scale output to 1000 kW but let's use do the calc in other units - num = KW_TO_BTUperHR(num); - hpwh.setCompressorOutputCapacity(num, C_TO_F(airTempC), C_TO_F(waterTempC), C_TO_F(setpointC), HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - double newCapacity_BTUperHr = hpwh.getCompressorCapacity(C_TO_F(airTempC), C_TO_F(waterTempC), C_TO_F(setpointC), HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - ASSERTTRUE(relcmpd(num, newCapacity_BTUperHr)); +void testSetCompressorOutputCapacity() +{ + HPWH hpwh; + + string input = "TamScalable_SP"; + + double newCapacity_kW, num; + double waterTempC = F_TO_C(44); + double airTempC = F_TO_C(98); + double setpointC = F_TO_C(145); + + // get preset model + getHPWHObject(hpwh, input); + + // Scale output to 1 kW + num = 1.; + hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); + newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); + ASSERTTRUE(cmpd(num, newCapacity_kW)); + + // Scale output to .01 kW + num = .01; + hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); + newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); + ASSERTTRUE(cmpd(num, newCapacity_kW)); + + // Scale output to 1000 kW + num = 1000.; + hpwh.setCompressorOutputCapacity(num, airTempC, waterTempC, setpointC); + newCapacity_kW = hpwh.getCompressorCapacity(airTempC, waterTempC, setpointC); + ASSERTTRUE(cmpd(num, newCapacity_kW)); + + // Scale output to 1000 kW but let's use do the calc in other units + num = KW_TO_BTUperHR(num); + hpwh.setCompressorOutputCapacity(num, + C_TO_F(airTempC), + C_TO_F(waterTempC), + C_TO_F(setpointC), + HPWH::UNITS_BTUperHr, + HPWH::UNITS_F); + double newCapacity_BTUperHr = hpwh.getCompressorCapacity(C_TO_F(airTempC), + C_TO_F(waterTempC), + C_TO_F(setpointC), + HPWH::UNITS_BTUperHr, + HPWH::UNITS_F); + ASSERTTRUE(relcmpd(num, newCapacity_BTUperHr)); } -void testChipsCaseWithIPUnits() { - HPWH hpwh; +void testChipsCaseWithIPUnits() +{ + HPWH hpwh; - string input = "TamScalable_SP"; + string input = "TamScalable_SP"; - double waterTempF = 50; - double airTempF = 50; - double setpointF = 120; - double wh_heatingCap = 20000.; + double waterTempF = 50; + double airTempF = 50; + double setpointF = 120; + double wh_heatingCap = 20000.; - // get preset model - getHPWHObject(hpwh, input); + // get preset model + getHPWHObject(hpwh, input); - //Scale output to 20000 btu/hr but let's use do the calc in other units - hpwh.setCompressorOutputCapacity(wh_heatingCap, airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - double newCapacity_BTUperHr = hpwh.getCompressorCapacity(airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); - ASSERTTRUE(relcmpd(wh_heatingCap, newCapacity_BTUperHr)); + // Scale output to 20000 btu/hr but let's use do the calc in other units + hpwh.setCompressorOutputCapacity( + wh_heatingCap, airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + double newCapacity_BTUperHr = hpwh.getCompressorCapacity( + airTempF, waterTempF, setpointF, HPWH::UNITS_BTUperHr, HPWH::UNITS_F); + ASSERTTRUE(relcmpd(wh_heatingCap, newCapacity_BTUperHr)); } -void testScaleRestank() { - HPWH hpwh; +void testScaleRestank() +{ + HPWH hpwh; - string input = "restankRealistic"; - // get preset model - getHPWHObject(hpwh, input); + string input = "restankRealistic"; + // get preset model + getHPWHObject(hpwh, input); - //Scale COP for restank fails. - int val = hpwh.setScaleHPWHCapacityCOP(2., 2.); - ASSERTTRUE(val == HPWH::HPWH_ABORT); + // Scale COP for restank fails. + int val = hpwh.setScaleHPWHCapacityCOP(2., 2.); + ASSERTTRUE(val == HPWH::HPWH_ABORT); } -void testResistanceScales() { - HPWH hpwh; - - string input = "TamScalable_SP"; - double elementPower = 30.0; //KW - - //hpwh.HPWHinit_resTank(); - getHPWHObject(hpwh, input); - - double returnVal; - returnVal = hpwh.getResistanceCapacity(0, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, elementPower)); - returnVal = hpwh.getResistanceCapacity(1, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, elementPower)); - returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, 2.*elementPower)); - - // check units convert - returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_BTUperHr); - ASSERTTRUE(relcmpd(returnVal, 2.*elementPower * 3412.14)); - - // Check setting bottom works - double factor = 2.0; - hpwh.setResistanceCapacity(factor * elementPower, 0); - returnVal = hpwh.getResistanceCapacity(0, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, factor * elementPower)); - returnVal = hpwh.getResistanceCapacity(1, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, elementPower)); - returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, factor * elementPower + elementPower)); - - // Check setting both works - factor = 3.; - hpwh.setResistanceCapacity(factor * elementPower, -1); - returnVal = hpwh.getResistanceCapacity(0, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, factor * elementPower)); - returnVal = hpwh.getResistanceCapacity(1, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, factor * elementPower)); - returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW); - ASSERTTRUE(relcmpd(returnVal, 2.*factor * elementPower)); +void testResistanceScales() +{ + HPWH hpwh; + + string input = "TamScalable_SP"; + double elementPower = 30.0; // KW + + // hpwh.HPWHinit_resTank(); + getHPWHObject(hpwh, input); + + double returnVal; + returnVal = hpwh.getResistanceCapacity(0, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, elementPower)); + returnVal = hpwh.getResistanceCapacity(1, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, elementPower)); + returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, 2. * elementPower)); + + // check units convert + returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_BTUperHr); + ASSERTTRUE(relcmpd(returnVal, 2. * elementPower * 3412.14)); + + // Check setting bottom works + double factor = 2.0; + hpwh.setResistanceCapacity(factor * elementPower, 0); + returnVal = hpwh.getResistanceCapacity(0, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, factor * elementPower)); + returnVal = hpwh.getResistanceCapacity(1, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, elementPower)); + returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, factor * elementPower + elementPower)); + + // Check setting both works + factor = 3.; + hpwh.setResistanceCapacity(factor * elementPower, -1); + returnVal = hpwh.getResistanceCapacity(0, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, factor * elementPower)); + returnVal = hpwh.getResistanceCapacity(1, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, factor * elementPower)); + returnVal = hpwh.getResistanceCapacity(-1, HPWH::UNITS_KW); + ASSERTTRUE(relcmpd(returnVal, 2. * factor * elementPower)); } -void testStorageTankErrors() { - HPWH hpwh; - string input = "StorageTank"; - // get preset model - getHPWHObject(hpwh, input); - - ASSERTTRUE(hpwh.setResistanceCapacity(1000.) == HPWH::HPWH_ABORT); - ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(1., 1.) == HPWH::HPWH_ABORT); +void testStorageTankErrors() +{ + HPWH hpwh; + string input = "StorageTank"; + // get preset model + getHPWHObject(hpwh, input); + ASSERTTRUE(hpwh.setResistanceCapacity(1000.) == HPWH::HPWH_ABORT); + ASSERTTRUE(hpwh.setScaleHPWHCapacityCOP(1., 1.) == HPWH::HPWH_ABORT); } int main(int, char*) { - testSetMPCompressorOutputCapacity(); + testSetMPCompressorOutputCapacity(); + testScalableHPWHScales(); // Test the scalable model scales properly + testNoScaleOutOfBounds(); // Test that models can't scale with invalid inputs - testScalableHPWHScales(); // Test the scalable model scales properly + testNoneScalable(); // Test that models can't scale that are non scalable presets - testNoScaleOutOfBounds(); // Test that models can't scale with invalid inputs - - testNoneScalable(); // Test that models can't scale that are non scalable presets - - testScaleRestank(); // Test the resistance tank can't scale the compressor + testScaleRestank(); // Test the resistance tank can't scale the compressor - testResistanceScales(); // Test the resistance tank scales the resistance elements + testResistanceScales(); // Test the resistance tank scales the resistance elements - testSPGetCompressorCapacity(); //Test we can get the capacity + testSPGetCompressorCapacity(); // Test we can get the capacity - testSetCompressorOutputCapacity(); //Test we can set the capacity with a specific number + testSetCompressorOutputCapacity(); // Test we can set the capacity with a specific number - testChipsCaseWithIPUnits(); //Debuging Chip's case + testChipsCaseWithIPUnits(); // Debuging Chip's case - testStorageTankErrors(); // Make sure we can't scale the storage tank. + testStorageTankErrors(); // Make sure we can't scale the storage tank. - testScalableMPHPWHScales(); // Test for proper scaling in the MP scalable model + testScalableMPHPWHScales(); // Test for proper scaling in the MP scalable model - testMPGetCompressorCapacity(); // Test MP capacity in and out correct. + testMPGetCompressorCapacity(); // Test MP capacity in and out correct. - //testSetMPCompressorOutputCapacity(); // Tets MP capacity can be set correctly. + // testSetMPCompressorOutputCapacity(); // Tets MP capacity can be set correctly. - //Made it through the gauntlet - return 0; + // Made it through the gauntlet + return 0; } diff --git a/test/testSizingFractions.cc b/test/testSizingFractions.cc index b3af85eb..9a3664d6 100644 --- a/test/testSizingFractions.cc +++ b/test/testSizingFractions.cc @@ -9,7 +9,7 @@ #include "testUtilityFcts.cc" #include -#include +#include #define SIZE (double)HPWH::CONDENSITY_SIZE @@ -28,144 +28,149 @@ void testGetCompressorMinRuntime(); int main(int, char*) { - testScalableSizingFract(); - testSandenSizingFract(); - testColmacSizingFract(); - testHPTU50SizingFract(); - test220eSizingFract(); - testGESizingFract(); - testResTankSizingFract(); - testStoTankSizingFract(); - - //Made it through the gauntlet - return 0; + testScalableSizingFract(); + testSandenSizingFract(); + testColmacSizingFract(); + testHPTU50SizingFract(); + test220eSizingFract(); + testGESizingFract(); + testResTankSizingFract(); + testStoTankSizingFract(); + + // Made it through the gauntlet + return 0; } +void testScalableSizingFract() +{ + HPWH hpwh; + double AF, pU; + double AF_answer = 4. / SIZE; -void testScalableSizingFract() { - HPWH hpwh; - double AF, pU; - double AF_answer = 4. / SIZE; - - string input = "TamScalable_SP"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model + string input = "TamScalable_SP"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model - int val = hpwh.getSizingFractions( AF, pU); - ASSERTTRUE(val == 0); - ASSERTTRUE(cmpd(AF, AF_answer)); - ASSERTTRUE(cmpd(pU, 1 - 1. / SIZE)); + int val = hpwh.getSizingFractions(AF, pU); + ASSERTTRUE(val == 0); + ASSERTTRUE(cmpd(AF, AF_answer)); + ASSERTTRUE(cmpd(pU, 1 - 1. / SIZE)); } -void testSandenSizingFract() { - HPWH hpwh; - double AF, pU; - double AF_answer = 8. / SIZE; +void testSandenSizingFract() +{ + HPWH hpwh; + double AF, pU; + double AF_answer = 8. / SIZE; - string input = "Sanden80"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model + string input = "Sanden80"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model - int val = hpwh.getSizingFractions(AF, pU); - ASSERTTRUE(val == 0); - ASSERTTRUE(cmpd(AF, AF_answer)); - ASSERTTRUE(cmpd(pU, 1 - 1. / SIZE)); + int val = hpwh.getSizingFractions(AF, pU); + ASSERTTRUE(val == 0); + ASSERTTRUE(cmpd(AF, AF_answer)); + ASSERTTRUE(cmpd(pU, 1 - 1. / SIZE)); } -void testColmacSizingFract() { - HPWH hpwh; - double AF, pU; - double AF_answer = 4. / SIZE; +void testColmacSizingFract() +{ + HPWH hpwh; + double AF, pU; + double AF_answer = 4. / SIZE; - string input = "ColmacCxV_5_SP"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model + string input = "ColmacCxV_5_SP"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model - int val = hpwh.getSizingFractions(AF, pU); - ASSERTTRUE(val == 0); - ASSERTTRUE(cmpd(AF, AF_answer)); - ASSERTTRUE(cmpd(pU, 1 - 1. / SIZE)); + int val = hpwh.getSizingFractions(AF, pU); + ASSERTTRUE(val == 0); + ASSERTTRUE(cmpd(AF, AF_answer)); + ASSERTTRUE(cmpd(pU, 1 - 1. / SIZE)); } -void testHPTU50SizingFract() { - HPWH hpwh; - double AF, pU; - double AF_answer = (1. + 2. + 3. + 4.) / 4. / SIZE; +void testHPTU50SizingFract() +{ + HPWH hpwh; + double AF, pU; + double AF_answer = (1. + 2. + 3. + 4.) / 4. / SIZE; - string input = "AOSmithHPTU50"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model + string input = "AOSmithHPTU50"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model - int val = hpwh.getSizingFractions(AF, pU); - ASSERTTRUE(val == 0); - ASSERTTRUE(cmpd(AF, AF_answer)); - ASSERTTRUE(cmpd(pU, 1.)); + int val = hpwh.getSizingFractions(AF, pU); + ASSERTTRUE(val == 0); + ASSERTTRUE(cmpd(AF, AF_answer)); + ASSERTTRUE(cmpd(pU, 1.)); } -void testGESizingFract() { - HPWH hpwh; - double AF, pU; - double AF_answer = (1. + 2. + 3. + 4.) / 4. / SIZE; +void testGESizingFract() +{ + HPWH hpwh; + double AF, pU; + double AF_answer = (1. + 2. + 3. + 4.) / 4. / SIZE; - string input = "GE"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model + string input = "GE"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model - int val = hpwh.getSizingFractions(AF, pU); - ASSERTTRUE(val == 0); - ASSERTTRUE(cmpd(AF, AF_answer)); - ASSERTTRUE(cmpd(pU, 1.)); + int val = hpwh.getSizingFractions(AF, pU); + ASSERTTRUE(val == 0); + ASSERTTRUE(cmpd(AF, AF_answer)); + ASSERTTRUE(cmpd(pU, 1.)); } -void test220eSizingFract() { - HPWH hpwh; - double AF, pU; - double AF_answer = (5. + 6.) / 2. / SIZE; +void test220eSizingFract() +{ + HPWH hpwh; + double AF, pU; + double AF_answer = (5. + 6.) / 2. / SIZE; - string input = "Stiebel220e"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model + string input = "Stiebel220e"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model - int val = hpwh.getSizingFractions(AF, pU); - ASSERTTRUE(val == 0); - ASSERTTRUE(cmpd(AF, AF_answer)); - ASSERTTRUE(cmpd(pU, 1 - 1./SIZE)); + int val = hpwh.getSizingFractions(AF, pU); + ASSERTTRUE(val == 0); + ASSERTTRUE(cmpd(AF, AF_answer)); + ASSERTTRUE(cmpd(pU, 1 - 1. / SIZE)); } +void testResTankSizingFract() +{ + HPWH hpwh; + double AF, pU; -void testResTankSizingFract() { - HPWH hpwh; - double AF, pU; - - string input = "restankRealistic"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model + string input = "restankRealistic"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model - int val = hpwh.getSizingFractions(AF, pU); - ASSERTTRUE(val == HPWH::HPWH_ABORT); + int val = hpwh.getSizingFractions(AF, pU); + ASSERTTRUE(val == HPWH::HPWH_ABORT); } -void testStoTankSizingFract() { - HPWH hpwh; - double AF, pU; +void testStoTankSizingFract() +{ + HPWH hpwh; + double AF, pU; - string input = "StorageTank"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model + string input = "StorageTank"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model - int val = hpwh.getSizingFractions(AF, pU); - ASSERTTRUE(val == HPWH::HPWH_ABORT); + int val = hpwh.getSizingFractions(AF, pU); + ASSERTTRUE(val == HPWH::HPWH_ABORT); } +void testGetCompressorMinRuntime() +{ + HPWH hpwh; + string input = "TamScalable_SP"; // Just a compressor with R134A + getHPWHObject(hpwh, input); // get preset model -void testGetCompressorMinRuntime() { - HPWH hpwh; - string input = "TamScalable_SP"; // Just a compressor with R134A - getHPWHObject(hpwh, input); // get preset model - - double expected_mins = 10.; - double expected_secs = expected_mins * 60.; - double expected_hrs = expected_mins / 60.; - - double mins = hpwh.getCompressorMinRuntime(); - ASSERTTRUE(mins == expected_mins); + double expected_mins = 10.; + double expected_secs = expected_mins * 60.; + double expected_hrs = expected_mins / 60.; - double secs = hpwh.getCompressorMinRuntime(HPWH::UNITS_SEC); - ASSERTTRUE(secs == expected_secs); + double mins = hpwh.getCompressorMinRuntime(); + ASSERTTRUE(mins == expected_mins); - double hrs = hpwh.getCompressorMinRuntime(HPWH::UNITS_HR); - ASSERTTRUE(hrs == expected_hrs); + double secs = hpwh.getCompressorMinRuntime(HPWH::UNITS_SEC); + ASSERTTRUE(secs == expected_secs); -} \ No newline at end of file + double hrs = hpwh.getCompressorMinRuntime(HPWH::UNITS_HR); + ASSERTTRUE(hrs == expected_hrs); +} diff --git a/test/testStateOfChargeFcts.cc b/test/testStateOfChargeFcts.cc index c3cb90fa..a4a93892 100644 --- a/test/testStateOfChargeFcts.cc +++ b/test/testStateOfChargeFcts.cc @@ -2,78 +2,79 @@ #include "testUtilityFcts.cc" #include -#include +#include void testGetStateOfCharge(); void testChargeBelowSetpoint(); - int main() { - testGetStateOfCharge(); - testChargeBelowSetpoint(); + testGetStateOfCharge(); + testChargeBelowSetpoint(); } -void testGetStateOfCharge() { - HPWH hpwh; - string input = "Sanden80"; - getHPWHObject(hpwh, input); - double tMains_C = F_TO_C(55.); - double tMinUseful_C = F_TO_C(110.); - double chargeFraction; +void testGetStateOfCharge() +{ + HPWH hpwh; + string input = "Sanden80"; + getHPWHObject(hpwh, input); + double tMains_C = F_TO_C(55.); + double tMinUseful_C = F_TO_C(110.); + double chargeFraction; - // Check for errors - chargeFraction = hpwh.calcSoCFraction(F_TO_C(125.), tMinUseful_C); - ASSERTTRUE(chargeFraction == HPWH::HPWH_ABORT); - chargeFraction = hpwh.calcSoCFraction(tMains_C, F_TO_C(155.)); - ASSERTTRUE(chargeFraction == HPWH::HPWH_ABORT); - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(100.)); - ASSERTTRUE(chargeFraction == HPWH::HPWH_ABORT); + // Check for errors + chargeFraction = hpwh.calcSoCFraction(F_TO_C(125.), tMinUseful_C); + ASSERTTRUE(chargeFraction == HPWH::HPWH_ABORT); + chargeFraction = hpwh.calcSoCFraction(tMains_C, F_TO_C(155.)); + ASSERTTRUE(chargeFraction == HPWH::HPWH_ABORT); + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(100.)); + ASSERTTRUE(chargeFraction == HPWH::HPWH_ABORT); - // Check state of charge returns 1 at setpoint - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C); - ASSERTTRUE(cmpd(chargeFraction, 1.)); - chargeFraction = hpwh.calcSoCFraction(tMains_C + 5., tMinUseful_C); - ASSERTTRUE(cmpd(chargeFraction, 1.)); - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C + 5.); - ASSERTTRUE(cmpd(chargeFraction, 1.)); + // Check state of charge returns 1 at setpoint + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C); + ASSERTTRUE(cmpd(chargeFraction, 1.)); + chargeFraction = hpwh.calcSoCFraction(tMains_C + 5., tMinUseful_C); + ASSERTTRUE(cmpd(chargeFraction, 1.)); + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C + 5.); + ASSERTTRUE(cmpd(chargeFraction, 1.)); - // Varying max temp - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(110.)); - ASSERTTRUE(cmpd(chargeFraction, 1.70909)); - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(120.)); - ASSERTTRUE(cmpd(chargeFraction, 1.4461)); - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(135.)); - ASSERTTRUE(cmpd(chargeFraction, 1.175)); + // Varying max temp + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(110.)); + ASSERTTRUE(cmpd(chargeFraction, 1.70909)); + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(120.)); + ASSERTTRUE(cmpd(chargeFraction, 1.4461)); + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(135.)); + ASSERTTRUE(cmpd(chargeFraction, 1.175)); } -void testChargeBelowSetpoint() { - HPWH hpwh; - string input = "ColmacCxV_5_SP"; - getHPWHObject(hpwh, input); - double tMains_C = F_TO_C(60.); - double tMinUseful_C = F_TO_C(110.); - double chargeFraction; +void testChargeBelowSetpoint() +{ + HPWH hpwh; + string input = "ColmacCxV_5_SP"; + getHPWHObject(hpwh, input); + double tMains_C = F_TO_C(60.); + double tMinUseful_C = F_TO_C(110.); + double chargeFraction; - // Check state of charge returns 1 at setpoint - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C); - ASSERTTRUE(cmpd(chargeFraction, 1.)); + // Check state of charge returns 1 at setpoint + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C); + ASSERTTRUE(cmpd(chargeFraction, 1.)); - // Check state of charge returns 0 when tank below useful - hpwh.setTankToTemperature(F_TO_C(109.)); - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(140.)); - ASSERTTRUE(cmpd(chargeFraction, 0.)); + // Check state of charge returns 0 when tank below useful + hpwh.setTankToTemperature(F_TO_C(109.)); + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(140.)); + ASSERTTRUE(cmpd(chargeFraction, 0.)); - // Check some lower values with tank set at constant temperatures - hpwh.setTankToTemperature(F_TO_C(110.)); - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(140.)); - ASSERTTRUE(cmpd(chargeFraction, 0.625)); + // Check some lower values with tank set at constant temperatures + hpwh.setTankToTemperature(F_TO_C(110.)); + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(140.)); + ASSERTTRUE(cmpd(chargeFraction, 0.625)); - hpwh.setTankToTemperature(F_TO_C(120.)); - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(140.)); - ASSERTTRUE(cmpd(chargeFraction, 0.75)); + hpwh.setTankToTemperature(F_TO_C(120.)); + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(140.)); + ASSERTTRUE(cmpd(chargeFraction, 0.75)); - hpwh.setTankToTemperature(F_TO_C(130.)); - chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(140.)); - ASSERTTRUE(cmpd(chargeFraction, 0.875)); + hpwh.setTankToTemperature(F_TO_C(130.)); + chargeFraction = hpwh.calcSoCFraction(tMains_C, tMinUseful_C, F_TO_C(140.)); + ASSERTTRUE(cmpd(chargeFraction, 0.875)); } diff --git a/test/testTankSizeFixed.cc b/test/testTankSizeFixed.cc index be4886d2..af286fcc 100644 --- a/test/testTankSizeFixed.cc +++ b/test/testTankSizeFixed.cc @@ -9,8 +9,7 @@ #include "testUtilityFcts.cc" #include -#include - +#include using std::cout; using std::string; @@ -18,97 +17,119 @@ using std::string; int testForceChangeTankSize(HPWH::MODELS model); int testIsTankSizeFixed(HPWH::MODELS model); -int main(int argc, char *argv[]) +int main(int argc, char* argv[]) { - HPWH::MODELS presetModel; - - string input;// = "AOSmithCAHP120"; - - if (argc != 2) { - cout << "Invalid input. This program takes One arguments: preset model specification (ie. Sanden80). Recieved input: \n"; - for (int ii = 0; ii < argc; ii++) { - cout << argv[ii] << " "; - } - exit(1); - } - else { - input = argv[1]; - } - - // get model number - presetModel = mapStringToPreset(input); - - ASSERTTRUE(testIsTankSizeFixed(presetModel) == 0, "Tank size is not fixed"); - ASSERTTRUE(testForceChangeTankSize(presetModel) == 0, "Tank size was not forced to change"); - - //Made it through the gauntlet - return 0; + HPWH::MODELS presetModel; + + string input; // = "AOSmithCAHP120"; + + if (argc != 2) + { + cout << "Invalid input. This program takes One arguments: preset model specification (ie. " + "Sanden80). Recieved input: \n"; + for (int ii = 0; ii < argc; ii++) + { + cout << argv[ii] << " "; + } + exit(1); + } + else + { + input = argv[1]; + } + + // get model number + presetModel = mapStringToPreset(input); + + ASSERTTRUE(testIsTankSizeFixed(presetModel) == 0, "Tank size is not fixed"); + ASSERTTRUE(testForceChangeTankSize(presetModel) == 0, "Tank size was not forced to change"); + + // Made it through the gauntlet + return 0; } -int testIsTankSizeFixed(HPWH::MODELS model) { - HPWH hpwh; - - // set preset - if (hpwh.HPWHinit_presets(model) != 0) return 1; - - double originalTankSize = hpwh.getTankSize(); - double newTankSize = originalTankSize + 100; - - // change the tank size - int result = hpwh.setTankSize(newTankSize); - - if (result != 0 && result != HPWH::HPWH_ABORT) { - cout << "Error, setTankSize() returned an invalid result: " << result << "\n"; - return 1; - } - - if (hpwh.isTankSizeFixed()) { // better not have change! - if (result == 0) { - cout << "Error, setTankSize() returned 0 when should be HPWH_ABORT\n"; - return 1; - } - if (originalTankSize != hpwh.getTankSize()) { - cout << "Error, the tank size has changed when isTankSizeFixed is true\n"; - return 1; - } - } - else { // it better have changed - if (result != 0) { - cout << "Error, setTankSize() returned HPWH_ABORT when it should be 0\n"; - return 1; - } - if (newTankSize != hpwh.getTankSize()) { - cout << "Error, the tank size hasn't changed to the new tank size when it should have. New Size: " << newTankSize << ". Returned Value: " << hpwh.getTankSize() << "\n"; - return 1; - } - } - return 0; +int testIsTankSizeFixed(HPWH::MODELS model) +{ + HPWH hpwh; + + // set preset + if (hpwh.HPWHinit_presets(model) != 0) + return 1; + + double originalTankSize = hpwh.getTankSize(); + double newTankSize = originalTankSize + 100; + + // change the tank size + int result = hpwh.setTankSize(newTankSize); + + if (result != 0 && result != HPWH::HPWH_ABORT) + { + cout << "Error, setTankSize() returned an invalid result: " << result << "\n"; + return 1; + } + + if (hpwh.isTankSizeFixed()) + { // better not have change! + if (result == 0) + { + cout << "Error, setTankSize() returned 0 when should be HPWH_ABORT\n"; + return 1; + } + if (originalTankSize != hpwh.getTankSize()) + { + cout << "Error, the tank size has changed when isTankSizeFixed is true\n"; + return 1; + } + } + else + { // it better have changed + if (result != 0) + { + cout << "Error, setTankSize() returned HPWH_ABORT when it should be 0\n"; + return 1; + } + if (newTankSize != hpwh.getTankSize()) + { + cout << "Error, the tank size hasn't changed to the new tank size when it should have. " + "New Size: " + << newTankSize << ". Returned Value: " << hpwh.getTankSize() << "\n"; + return 1; + } + } + return 0; } -int testForceChangeTankSize(HPWH::MODELS model) { - HPWH hpwh; - - // set preset - if (hpwh.HPWHinit_presets(model) != 0) return 1; - - double newTankSize = 133.312; //No way a tank has this size originally - - // change the tank size - int result = hpwh.setTankSize(newTankSize, HPWH::UNITS_GAL, true); - - if (result != 0 && result != HPWH::HPWH_ABORT) { - cout << "Error, setTankSize() returned an invalid result: " << result << "\n"; - return 1; - } - - // it better have changed - if (result != 0) { - cout << "Error, setTankSize() returned HPWH_ABORT when it should be 0\n"; - return 1; - } - if (newTankSize != hpwh.getTankSize(HPWH::UNITS_GAL)) { - cout << "Error, the tank size hasn't changed to the new tank size when it should have. New Size: " << newTankSize << ". Returned Value: " << hpwh.getTankSize(HPWH::UNITS_GAL) << "\n"; - return 1; - } - return 0; +int testForceChangeTankSize(HPWH::MODELS model) +{ + HPWH hpwh; + + // set preset + if (hpwh.HPWHinit_presets(model) != 0) + return 1; + + double newTankSize = 133.312; // No way a tank has this size originally + + // change the tank size + int result = hpwh.setTankSize(newTankSize, HPWH::UNITS_GAL, true); + + if (result != 0 && result != HPWH::HPWH_ABORT) + { + cout << "Error, setTankSize() returned an invalid result: " << result << "\n"; + return 1; + } + + // it better have changed + if (result != 0) + { + cout << "Error, setTankSize() returned HPWH_ABORT when it should be 0\n"; + return 1; + } + if (newTankSize != hpwh.getTankSize(HPWH::UNITS_GAL)) + { + cout << "Error, the tank size hasn't changed to the new tank size when it should have. New " + "Size: " + << newTankSize << ". Returned Value: " << hpwh.getTankSize(HPWH::UNITS_GAL) << "\n"; + return 1; + } + return 0; } diff --git a/test/testUtilityFcts.cc b/test/testUtilityFcts.cc index f1a85566..94e2a76e 100644 --- a/test/testUtilityFcts.cc +++ b/test/testUtilityFcts.cc @@ -10,319 +10,414 @@ */ #include "HPWH.hh" #include -#include +#include using std::cout; using std::string; -#define F_TO_C(T) ((T-32.0)*5.0/9.0) -#define C_TO_F(T) (((9.0/5.0)*T) + 32.0) -#define dF_TO_dC(T) (T*5.0/9.0) -#define GAL_TO_L(GAL) (GAL*3.78541) +#define F_TO_C(T) ((T - 32.0) * 5.0 / 9.0) +#define C_TO_F(T) (((9.0 / 5.0) * T) + 32.0) +#define dF_TO_dC(T) (T * 5.0 / 9.0) +#define GAL_TO_L(GAL) (GAL * 3.78541) #define KW_TO_BTUperHR(KW) (KW * BTUperKWH) #define KWH_TO_BTU(KW) (KW * BTUperKWH) +#define ASSERTTRUE(input, ...) \ + if (!(input)) \ + { \ + cout << "Assertation failed at " << __FILE__ << ", line: " << __LINE__ << ".\n"; \ + exit(1); \ + } +#define ASSERTFALSE(input, ...) \ + if ((input)) \ + { \ + cout << "Assertation failed at " << __FILE__ << ", line: " << __LINE__ << ".\n"; \ + exit(1); \ + } -#define ASSERTTRUE(input, ...) if(! (input)) {cout<< "Assertation failed at " <<__FILE__ << ", line: " << __LINE__ << ".\n"; exit(1);} -#define ASSERTFALSE(input, ...) if( (input)) {cout<< "Assertation failed at " <<__FILE__ << ", line: " << __LINE__ << ".\n"; exit(1);} - - -//Compare doubles -bool cmpd(double A, double B, double epsilon = 0.0001) { - return (fabs(A - B) < epsilon); -} -//Relative Compare doubles -bool relcmpd(double A, double B, double epsilon = 0.00001) { - return fabs(A - B) < (epsilon *(fabs(A) < fabs(B) ? fabs(B) : fabs(A))); +// Compare doubles +bool cmpd(double A, double B, double epsilon = 0.0001) { return (fabs(A - B) < epsilon); } +// Relative Compare doubles +bool relcmpd(double A, double B, double epsilon = 0.00001) +{ + return fabs(A - B) < (epsilon * (fabs(A) < fabs(B) ? fabs(B) : fabs(A))); } -bool compressorIsRunning(HPWH& hpwh) { - return (bool)hpwh.isNthHeatSourceRunning(hpwh.getCompressorIndex()); +bool compressorIsRunning(HPWH& hpwh) +{ + return (bool)hpwh.isNthHeatSourceRunning(hpwh.getCompressorIndex()); } -HPWH::MODELS mapStringToPreset(string modelName) { +HPWH::MODELS mapStringToPreset(string modelName) +{ - HPWH::MODELS hpwhModel; + HPWH::MODELS hpwhModel; - if(modelName == "Voltex60" || modelName == "AOSmithPHPT60") { - hpwhModel = HPWH::MODELS_AOSmithPHPT60; - } - else if (modelName == "Voltex80" || modelName == "AOSmith80") { - hpwhModel = HPWH::MODELS_AOSmithPHPT80; - } - else if (modelName == "GEred" || modelName == "GE") { - hpwhModel = HPWH::MODELS_GE2012; - } - else if (modelName == "SandenGAU" || modelName == "Sanden80" || modelName == "SandenGen3") { - hpwhModel = HPWH::MODELS_Sanden80; - } - else if (modelName == "Sanden120") { - hpwhModel = HPWH::MODELS_Sanden120; - } - else if (modelName == "SandenGES" || modelName == "Sanden40") { - hpwhModel = HPWH::MODELS_Sanden40; - } - else if (modelName == "AOSmithHPTU50") { - hpwhModel = HPWH::MODELS_AOSmithHPTU50; - } - else if (modelName == "AOSmithHPTU66") { - hpwhModel = HPWH::MODELS_AOSmithHPTU66; - } - else if (modelName == "AOSmithHPTU80") { - hpwhModel = HPWH::MODELS_AOSmithHPTU80; - } - else if (modelName == "AOSmithHPTS50") { - hpwhModel = HPWH::MODELS_AOSmithHPTS50; - } - else if (modelName == "AOSmithHPTS66") { - hpwhModel = HPWH::MODELS_AOSmithHPTS66; - } - else if (modelName == "AOSmithHPTS80") { - hpwhModel = HPWH::MODELS_AOSmithHPTS80; - } - else if (modelName == "AOSmithHPTU80DR") { - hpwhModel = HPWH::MODELS_AOSmithHPTU80_DR; - } - else if (modelName == "GE502014STDMode" || modelName == "GE2014STDMode") { - hpwhModel = HPWH::MODELS_GE2014STDMode; - } - else if (modelName == "GE502014" || modelName == "GE2014") { - hpwhModel = HPWH::MODELS_GE2014; - } - else if (modelName == "GE802014") { - hpwhModel = HPWH::MODELS_GE2014_80DR; - } - else if (modelName == "RheemHB50") { - hpwhModel = HPWH::MODELS_RheemHB50; - } - else if (modelName == "Stiebel220e" || modelName == "Stiebel220E") { - hpwhModel = HPWH::MODELS_Stiebel220E; - } - else if (modelName == "Generic1") { - hpwhModel = HPWH::MODELS_Generic1; - } - else if (modelName == "Generic2") { - hpwhModel = HPWH::MODELS_Generic2; - } - else if (modelName == "Generic3") { - hpwhModel = HPWH::MODELS_Generic3; - } - else if (modelName == "custom") { - hpwhModel = HPWH::MODELS_CustomFile; - } - else if (modelName == "restankRealistic") { - hpwhModel = HPWH::MODELS_restankRealistic; - } - else if (modelName == "StorageTank") { - hpwhModel = HPWH::MODELS_StorageTank; - } - else if (modelName == "BWC2020_65") { - hpwhModel = HPWH::MODELS_BWC2020_65; - } - // New Rheems - else if (modelName == "Rheem2020Prem40") { - hpwhModel = HPWH::MODELS_Rheem2020Prem40; - } - else if (modelName == "Rheem2020Prem50") { - hpwhModel = HPWH::MODELS_Rheem2020Prem50; - } - else if (modelName == "Rheem2020Prem65") { - hpwhModel = HPWH::MODELS_Rheem2020Prem65; - } - else if (modelName == "Rheem2020Prem80") { - hpwhModel = HPWH::MODELS_Rheem2020Prem80; - } - else if (modelName == "Rheem2020Build40") { - hpwhModel = HPWH::MODELS_Rheem2020Build40; - } - else if (modelName == "Rheem2020Build50") { - hpwhModel = HPWH::MODELS_Rheem2020Build50; - } - else if (modelName == "Rheem2020Build65") { - hpwhModel = HPWH::MODELS_Rheem2020Build65; - } - else if (modelName == "Rheem2020Build80") { - hpwhModel = HPWH::MODELS_Rheem2020Build80; - } - else if (modelName == "RheemPlugInDedicated40") { - hpwhModel = HPWH::MODELS_RheemPlugInDedicated40; - } - else if (modelName == "RheemPlugInDedicated50") { - hpwhModel = HPWH::MODELS_RheemPlugInDedicated50; - } - else if (modelName == "RheemPlugInShared40") { - hpwhModel = HPWH::MODELS_RheemPlugInShared40; - } - else if (modelName == "RheemPlugInShared50") { - hpwhModel = HPWH::MODELS_RheemPlugInShared50; - } - else if (modelName == "RheemPlugInShared65") { - hpwhModel = HPWH::MODELS_RheemPlugInShared65; - } - else if (modelName == "RheemPlugInShared80") { - hpwhModel = HPWH::MODELS_RheemPlugInShared80; - } - // Large HPWH's - else if (modelName == "AOSmithCAHP120") { - hpwhModel = HPWH::MODELS_AOSmithCAHP120; - } - else if (modelName == "ColmacCxV_5_SP") { - hpwhModel = HPWH::MODELS_ColmacCxV_5_SP; - } - else if (modelName == "ColmacCxA_10_SP") { - hpwhModel = HPWH::MODELS_ColmacCxA_10_SP; - } - else if (modelName == "ColmacCxA_15_SP") { - hpwhModel = HPWH::MODELS_ColmacCxA_15_SP; - } - else if (modelName == "ColmacCxA_20_SP") { - hpwhModel = HPWH::MODELS_ColmacCxA_20_SP; - } - else if (modelName == "ColmacCxA_25_SP") { - hpwhModel = HPWH::MODELS_ColmacCxA_25_SP; - } - else if (modelName == "ColmacCxA_30_SP") { - hpwhModel = HPWH::MODELS_ColmacCxA_30_SP; - } + if (modelName == "Voltex60" || modelName == "AOSmithPHPT60") + { + hpwhModel = HPWH::MODELS_AOSmithPHPT60; + } + else if (modelName == "Voltex80" || modelName == "AOSmith80") + { + hpwhModel = HPWH::MODELS_AOSmithPHPT80; + } + else if (modelName == "GEred" || modelName == "GE") + { + hpwhModel = HPWH::MODELS_GE2012; + } + else if (modelName == "SandenGAU" || modelName == "Sanden80" || modelName == "SandenGen3") + { + hpwhModel = HPWH::MODELS_Sanden80; + } + else if (modelName == "Sanden120") + { + hpwhModel = HPWH::MODELS_Sanden120; + } + else if (modelName == "SandenGES" || modelName == "Sanden40") + { + hpwhModel = HPWH::MODELS_Sanden40; + } + else if (modelName == "AOSmithHPTU50") + { + hpwhModel = HPWH::MODELS_AOSmithHPTU50; + } + else if (modelName == "AOSmithHPTU66") + { + hpwhModel = HPWH::MODELS_AOSmithHPTU66; + } + else if (modelName == "AOSmithHPTU80") + { + hpwhModel = HPWH::MODELS_AOSmithHPTU80; + } + else if (modelName == "AOSmithHPTS50") + { + hpwhModel = HPWH::MODELS_AOSmithHPTS50; + } + else if (modelName == "AOSmithHPTS66") + { + hpwhModel = HPWH::MODELS_AOSmithHPTS66; + } + else if (modelName == "AOSmithHPTS80") + { + hpwhModel = HPWH::MODELS_AOSmithHPTS80; + } + else if (modelName == "AOSmithHPTU80DR") + { + hpwhModel = HPWH::MODELS_AOSmithHPTU80_DR; + } + else if (modelName == "GE502014STDMode" || modelName == "GE2014STDMode") + { + hpwhModel = HPWH::MODELS_GE2014STDMode; + } + else if (modelName == "GE502014" || modelName == "GE2014") + { + hpwhModel = HPWH::MODELS_GE2014; + } + else if (modelName == "GE802014") + { + hpwhModel = HPWH::MODELS_GE2014_80DR; + } + else if (modelName == "RheemHB50") + { + hpwhModel = HPWH::MODELS_RheemHB50; + } + else if (modelName == "Stiebel220e" || modelName == "Stiebel220E") + { + hpwhModel = HPWH::MODELS_Stiebel220E; + } + else if (modelName == "Generic1") + { + hpwhModel = HPWH::MODELS_Generic1; + } + else if (modelName == "Generic2") + { + hpwhModel = HPWH::MODELS_Generic2; + } + else if (modelName == "Generic3") + { + hpwhModel = HPWH::MODELS_Generic3; + } + else if (modelName == "custom") + { + hpwhModel = HPWH::MODELS_CustomFile; + } + else if (modelName == "restankRealistic") + { + hpwhModel = HPWH::MODELS_restankRealistic; + } + else if (modelName == "StorageTank") + { + hpwhModel = HPWH::MODELS_StorageTank; + } + else if (modelName == "BWC2020_65") + { + hpwhModel = HPWH::MODELS_BWC2020_65; + } + // New Rheems + else if (modelName == "Rheem2020Prem40") + { + hpwhModel = HPWH::MODELS_Rheem2020Prem40; + } + else if (modelName == "Rheem2020Prem50") + { + hpwhModel = HPWH::MODELS_Rheem2020Prem50; + } + else if (modelName == "Rheem2020Prem65") + { + hpwhModel = HPWH::MODELS_Rheem2020Prem65; + } + else if (modelName == "Rheem2020Prem80") + { + hpwhModel = HPWH::MODELS_Rheem2020Prem80; + } + else if (modelName == "Rheem2020Build40") + { + hpwhModel = HPWH::MODELS_Rheem2020Build40; + } + else if (modelName == "Rheem2020Build50") + { + hpwhModel = HPWH::MODELS_Rheem2020Build50; + } + else if (modelName == "Rheem2020Build65") + { + hpwhModel = HPWH::MODELS_Rheem2020Build65; + } + else if (modelName == "Rheem2020Build80") + { + hpwhModel = HPWH::MODELS_Rheem2020Build80; + } + else if (modelName == "RheemPlugInDedicated40") + { + hpwhModel = HPWH::MODELS_RheemPlugInDedicated40; + } + else if (modelName == "RheemPlugInDedicated50") + { + hpwhModel = HPWH::MODELS_RheemPlugInDedicated50; + } + else if (modelName == "RheemPlugInShared40") + { + hpwhModel = HPWH::MODELS_RheemPlugInShared40; + } + else if (modelName == "RheemPlugInShared50") + { + hpwhModel = HPWH::MODELS_RheemPlugInShared50; + } + else if (modelName == "RheemPlugInShared65") + { + hpwhModel = HPWH::MODELS_RheemPlugInShared65; + } + else if (modelName == "RheemPlugInShared80") + { + hpwhModel = HPWH::MODELS_RheemPlugInShared80; + } + // Large HPWH's + else if (modelName == "AOSmithCAHP120") + { + hpwhModel = HPWH::MODELS_AOSmithCAHP120; + } + else if (modelName == "ColmacCxV_5_SP") + { + hpwhModel = HPWH::MODELS_ColmacCxV_5_SP; + } + else if (modelName == "ColmacCxA_10_SP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_10_SP; + } + else if (modelName == "ColmacCxA_15_SP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_15_SP; + } + else if (modelName == "ColmacCxA_20_SP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_20_SP; + } + else if (modelName == "ColmacCxA_25_SP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_25_SP; + } + else if (modelName == "ColmacCxA_30_SP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_30_SP; + } - else if (modelName == "ColmacCxV_5_MP") { - hpwhModel = HPWH::MODELS_ColmacCxV_5_MP; - } - else if (modelName == "ColmacCxA_10_MP") { - hpwhModel = HPWH::MODELS_ColmacCxA_10_MP; - } - else if (modelName == "ColmacCxA_15_MP") { - hpwhModel = HPWH::MODELS_ColmacCxA_15_MP; - } - else if (modelName == "ColmacCxA_20_MP") { - hpwhModel = HPWH::MODELS_ColmacCxA_20_MP; - } - else if (modelName == "ColmacCxA_25_MP") { - hpwhModel = HPWH::MODELS_ColmacCxA_25_MP; - } - else if (modelName == "ColmacCxA_30_MP") { - hpwhModel = HPWH::MODELS_ColmacCxA_30_MP; - } - - else if (modelName == "RheemHPHD60") { - hpwhModel = HPWH::MODELS_RHEEM_HPHD60VNU_201_MP; - } - else if (modelName == "RheemHPHD135") { - hpwhModel = HPWH::MODELS_RHEEM_HPHD135VNU_483_MP; - } - //Nyle Single pass models - else if (modelName == "NyleC25A_SP") { - hpwhModel = HPWH::MODELS_NyleC25A_SP; - } - else if (modelName == "NyleC60A_SP") { - hpwhModel = HPWH::MODELS_NyleC60A_SP; - } - else if (modelName == "NyleC90A_SP") { - hpwhModel = HPWH::MODELS_NyleC90A_SP; - } - else if (modelName == "NyleC185A_SP") { - hpwhModel = HPWH::MODELS_NyleC185A_SP; - } - else if (modelName == "NyleC250A_SP") { - hpwhModel = HPWH::MODELS_NyleC250A_SP; - } - else if (modelName == "NyleC60A_C_SP") { - hpwhModel = HPWH::MODELS_NyleC60A_C_SP; - } - else if (modelName == "NyleC90A_C_SP") { - hpwhModel = HPWH::MODELS_NyleC90A_C_SP; - } - else if (modelName == "NyleC185A_C_SP") { - hpwhModel = HPWH::MODELS_NyleC185A_C_SP; - } - else if (modelName == "NyleC250A_C_SP") { - hpwhModel = HPWH::MODELS_NyleC250A_C_SP; - } - // Nyle MP models - else if (modelName == "NyleC60A_MP") { - hpwhModel = HPWH::MODELS_NyleC60A_MP; - } - else if (modelName == "NyleC90A_MP") { - hpwhModel = HPWH::MODELS_NyleC90A_MP; - } - else if (modelName == "NyleC125A_MP") { - hpwhModel = HPWH::MODELS_NyleC125A_MP; - } - else if (modelName == "NyleC185A_MP") { - hpwhModel = HPWH::MODELS_NyleC185A_MP; - } - else if (modelName == "NyleC250A_MP") { - hpwhModel = HPWH::MODELS_NyleC250A_MP; - } - else if (modelName == "NyleC60A_C_MP") { - hpwhModel = HPWH::MODELS_NyleC60A_C_MP; - } - else if (modelName == "NyleC90A_C_MP") { - hpwhModel = HPWH::MODELS_NyleC90A_C_MP; - } - else if (modelName == "NyleC125A_C_MP") { - hpwhModel = HPWH::MODELS_NyleC125A_C_MP; - } - else if (modelName == "NyleC185A_C_MP") { - hpwhModel = HPWH::MODELS_NyleC185A_C_MP; - } - else if (modelName == "NyleC250A_C_MP") { - hpwhModel = HPWH::MODELS_NyleC250A_C_MP; - } - else if (modelName == "QAHV_N136TAU_HPB_SP") { - hpwhModel = HPWH::MODELS_MITSUBISHI_QAHV_N136TAU_HPB_SP; - } - // Stack in a couple scalable models - else if (modelName == "TamScalable_SP") { - hpwhModel = HPWH::MODELS_TamScalable_SP; - } - else if (modelName == "TamScalable_SP_2X") { - hpwhModel = HPWH::MODELS_TamScalable_SP; - } - else if (modelName == "TamScalable_SP_Half") { - hpwhModel = HPWH::MODELS_TamScalable_SP; - } - else if (modelName == "Scalable_MP") { - hpwhModel = HPWH::MODELS_Scalable_MP; - } - else if (modelName == "AWHSTier3Generic40") { - hpwhModel = HPWH::MODELS_AWHSTier3Generic40; - } - else if (modelName == "AWHSTier3Generic50") { - hpwhModel = HPWH::MODELS_AWHSTier3Generic50; - } - else if (modelName == "AWHSTier3Generic65") { - hpwhModel = HPWH::MODELS_AWHSTier3Generic65; - } - else if (modelName == "AWHSTier3Generic80") { - hpwhModel = HPWH::MODELS_AWHSTier3Generic80; - } - else if (modelName == "AquaThermAire") { - hpwhModel = HPWH::MODELS_AquaThermAire; - } - else { - hpwhModel = HPWH::MODELS_basicIntegrated; - cout << "Couldn't find model " << modelName << ". Exiting...\n"; - exit(1); - } - return hpwhModel; -} + else if (modelName == "ColmacCxV_5_MP") + { + hpwhModel = HPWH::MODELS_ColmacCxV_5_MP; + } + else if (modelName == "ColmacCxA_10_MP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_10_MP; + } + else if (modelName == "ColmacCxA_15_MP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_15_MP; + } + else if (modelName == "ColmacCxA_20_MP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_20_MP; + } + else if (modelName == "ColmacCxA_25_MP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_25_MP; + } + else if (modelName == "ColmacCxA_30_MP") + { + hpwhModel = HPWH::MODELS_ColmacCxA_30_MP; + } + else if (modelName == "RheemHPHD60") + { + hpwhModel = HPWH::MODELS_RHEEM_HPHD60VNU_201_MP; + } + else if (modelName == "RheemHPHD135") + { + hpwhModel = HPWH::MODELS_RHEEM_HPHD135VNU_483_MP; + } + // Nyle Single pass models + else if (modelName == "NyleC25A_SP") + { + hpwhModel = HPWH::MODELS_NyleC25A_SP; + } + else if (modelName == "NyleC60A_SP") + { + hpwhModel = HPWH::MODELS_NyleC60A_SP; + } + else if (modelName == "NyleC90A_SP") + { + hpwhModel = HPWH::MODELS_NyleC90A_SP; + } + else if (modelName == "NyleC185A_SP") + { + hpwhModel = HPWH::MODELS_NyleC185A_SP; + } + else if (modelName == "NyleC250A_SP") + { + hpwhModel = HPWH::MODELS_NyleC250A_SP; + } + else if (modelName == "NyleC60A_C_SP") + { + hpwhModel = HPWH::MODELS_NyleC60A_C_SP; + } + else if (modelName == "NyleC90A_C_SP") + { + hpwhModel = HPWH::MODELS_NyleC90A_C_SP; + } + else if (modelName == "NyleC185A_C_SP") + { + hpwhModel = HPWH::MODELS_NyleC185A_C_SP; + } + else if (modelName == "NyleC250A_C_SP") + { + hpwhModel = HPWH::MODELS_NyleC250A_C_SP; + } + // Nyle MP models + else if (modelName == "NyleC60A_MP") + { + hpwhModel = HPWH::MODELS_NyleC60A_MP; + } + else if (modelName == "NyleC90A_MP") + { + hpwhModel = HPWH::MODELS_NyleC90A_MP; + } + else if (modelName == "NyleC125A_MP") + { + hpwhModel = HPWH::MODELS_NyleC125A_MP; + } + else if (modelName == "NyleC185A_MP") + { + hpwhModel = HPWH::MODELS_NyleC185A_MP; + } + else if (modelName == "NyleC250A_MP") + { + hpwhModel = HPWH::MODELS_NyleC250A_MP; + } + else if (modelName == "NyleC60A_C_MP") + { + hpwhModel = HPWH::MODELS_NyleC60A_C_MP; + } + else if (modelName == "NyleC90A_C_MP") + { + hpwhModel = HPWH::MODELS_NyleC90A_C_MP; + } + else if (modelName == "NyleC125A_C_MP") + { + hpwhModel = HPWH::MODELS_NyleC125A_C_MP; + } + else if (modelName == "NyleC185A_C_MP") + { + hpwhModel = HPWH::MODELS_NyleC185A_C_MP; + } + else if (modelName == "NyleC250A_C_MP") + { + hpwhModel = HPWH::MODELS_NyleC250A_C_MP; + } + else if (modelName == "QAHV_N136TAU_HPB_SP") + { + hpwhModel = HPWH::MODELS_MITSUBISHI_QAHV_N136TAU_HPB_SP; + } + // Stack in a couple scalable models + else if (modelName == "TamScalable_SP") + { + hpwhModel = HPWH::MODELS_TamScalable_SP; + } + else if (modelName == "TamScalable_SP_2X") + { + hpwhModel = HPWH::MODELS_TamScalable_SP; + } + else if (modelName == "TamScalable_SP_Half") + { + hpwhModel = HPWH::MODELS_TamScalable_SP; + } + else if (modelName == "Scalable_MP") + { + hpwhModel = HPWH::MODELS_Scalable_MP; + } + else if (modelName == "AWHSTier3Generic40") + { + hpwhModel = HPWH::MODELS_AWHSTier3Generic40; + } + else if (modelName == "AWHSTier3Generic50") + { + hpwhModel = HPWH::MODELS_AWHSTier3Generic50; + } + else if (modelName == "AWHSTier3Generic65") + { + hpwhModel = HPWH::MODELS_AWHSTier3Generic65; + } + else if (modelName == "AWHSTier3Generic80") + { + hpwhModel = HPWH::MODELS_AWHSTier3Generic80; + } + else if (modelName == "AquaThermAire") + { + hpwhModel = HPWH::MODELS_AquaThermAire; + } + else + { + hpwhModel = HPWH::MODELS_basicIntegrated; + cout << "Couldn't find model " << modelName << ". Exiting...\n"; + exit(1); + } + return hpwhModel; +} -int getHPWHObject(HPWH &hpwh, string modelName) { - /**Sets up the preset HPWH object with modelName */ - int returnVal = 1; - HPWH::MODELS model = mapStringToPreset(modelName); +int getHPWHObject(HPWH& hpwh, string modelName) +{ + /**Sets up the preset HPWH object with modelName */ + int returnVal = 1; + HPWH::MODELS model = mapStringToPreset(modelName); - returnVal = hpwh.HPWHinit_presets(model); + returnVal = hpwh.HPWHinit_presets(model); - if (modelName == "TamScalable_SP_2X") { - hpwh.setScaleHPWHCapacityCOP(2., 1.); // Scale the compressor - hpwh.setResistanceCapacity(60.); // Reset resistance elements in kW - } - else if (modelName == "TamScalable_SP_Half") { - hpwh.setScaleHPWHCapacityCOP(1/2., 1.); // Scale the compressor - hpwh.setResistanceCapacity(15.); // Reset resistance elements in kW - } - return returnVal; -} \ No newline at end of file + if (modelName == "TamScalable_SP_2X") + { + hpwh.setScaleHPWHCapacityCOP(2., 1.); // Scale the compressor + hpwh.setResistanceCapacity(60.); // Reset resistance elements in kW + } + else if (modelName == "TamScalable_SP_Half") + { + hpwh.setScaleHPWHCapacityCOP(1 / 2., 1.); // Scale the compressor + hpwh.setResistanceCapacity(15.); // Reset resistance elements in kW + } + return returnVal; +} From b28a608f54b20a30533f1c730f7a205cbf6c0b27 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 26 Dec 2023 13:00:21 -0700 Subject: [PATCH 22/25] Format change. --- src/HPWH.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index f823aec3..75d3bb0c 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -3402,10 +3402,10 @@ void HPWH::updateTankTemps(double drawVolume_L, if (drawVolume_L > tankVolume_L) { // if (hpwhVerbosity >= VRB_reluctant) { - // //msg("WARNING: Drawing more than the tank volume in one step is undefined - //behavior. Terminating simulation. \n"); msg("WARNING: Drawing more than the tank - //volume in one step is undefined behavior. Continuing simulation at your own risk. - //\n"); + // msg("WARNING: Drawing more than the tank volume in one step is undefined + // behavior. Terminating simulation. \n"); msg("WARNING: Drawing more than the + // tank volume in one step is undefined behavior. Continuing simulation at your own + // risk. \n"); // } // simHasFailed = true; // return; From 68e5b3dc25dee0dd354767b200a32ca007c77d21 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 26 Dec 2023 15:58:44 -0700 Subject: [PATCH 23/25] Add Simulator class. --- src/CMakeLists.txt | 1 + src/HPWH.cc | 1009 ++++++++------------------------------ src/HPWH.hh | 175 ++++--- src/HPWHHeatSources.cc | 72 +-- src/HPWHHeatingLogics.cc | 2 +- src/HPWHSimulator.cc | 611 +++++++++++++++++++++++ src/HPWHpresets.cc | 30 +- test/main.cc | 28 +- test/testCalcUEF.cc | 19 +- 9 files changed, 1002 insertions(+), 945 deletions(-) create mode 100644 src/HPWHSimulator.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0be9497d..1e9214e3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -22,6 +22,7 @@ set(source HPWHHeatSources.cc HPWHHeatingLogics.cc HPWHpresets.cc + HPWHSimulator.cc ) add_library(libHPWHsim ${source} ${headers}) diff --git a/src/HPWH.cc b/src/HPWH.cc index 75d3bb0c..913e5c5a 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -63,6 +63,10 @@ const double HPWH::MAXOUTLET_R410A = F_TO_C(140.); const double HPWH::MAXOUTLET_R744 = F_TO_C(190.); const double HPWH::MINSINGLEPASSLIFT = dF_TO_dC(15.); +/* static */ void (*HPWH::messageCallback)(const std::string message, void* contextPtr) = nullptr; + +/* static */ void* HPWH::messageCallbackContextPtr = nullptr; + //----------------------------------------------------------------------------- /// @brief Samples a std::vector to extract a single value spanning the fractional /// coordinate range from frac_begin to frac_end. @@ -321,7 +325,7 @@ void HPWH::setMinutesPerStep(const double minutesPerStep_in) }; // public HPWH functions -HPWH::HPWH() : messageCallback(NULL), messageCallbackContextPtr(NULL), hpwhVerbosity(VRB_silent) +HPWH::HPWH() : verbosity(VRB_silent) { setAllDefaults(); }; @@ -367,7 +371,7 @@ HPWH& HPWH::operator=(const HPWH& hpwh) simHasFailed = hpwh.simHasFailed; - hpwhVerbosity = hpwh.hpwhVerbosity; + verbosity = hpwh.verbosity; // these should actually be the same pointers messageCallback = hpwh.messageCallback; @@ -450,14 +454,14 @@ int HPWH::runOneStep(double drawVolume_L, if ((DRstatus & (DR_TOO | DR_TOT))) { - if (hpwhVerbosity >= VRB_typical) + if (verbosity >= VRB_typical) { msg("DR_TOO | DR_TOT use conflicting logic sets. The logic will follow a DR_TOT scheme " " \n"); } } - if (hpwhVerbosity >= VRB_typical) + if (verbosity >= VRB_typical) { msg("Beginning runOneStep. \nTank Temps: "); printTankTemps(); @@ -473,7 +477,7 @@ int HPWH::runOneStep(double drawVolume_L, // is the failure flag is set, don't run if (simHasFailed) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("simHasFailed is set, aborting. \n"); } @@ -520,7 +524,7 @@ int HPWH::runOneStep(double drawVolume_L, if ((DRstatus & DR_LOC) != 0 && (DRstatus & DR_LOR) != 0) { turnAllHeatSourcesOff(); // turns off isheating - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("DR_LOC | DR_LOC everything off, DRstatus = %i \n", DRstatus); } @@ -540,7 +544,7 @@ int HPWH::runOneStep(double drawVolume_L, heatSources[lowestElementIndex].engageHeatSource(DRstatus); } - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("TURNED ON DR_TOO engaged compressor and lowest resistance element, DRstatus = " "%i \n", @@ -551,7 +555,7 @@ int HPWH::runOneStep(double drawVolume_L, // do HeatSource choice for (int i = 0; i < getNumHeatSources(); i++) { - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("Heat source choice:\theatsource %d can choose from %lu turn on logics and %lu " "shut off logics\n", @@ -579,7 +583,7 @@ int HPWH::runOneStep(double drawVolume_L, // come on, then turn off and start it up if (heatSources[i].isVIP) { - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("\tVIP check"); } @@ -615,7 +619,7 @@ int HPWH::runOneStep(double drawVolume_L, } // end loop over heat sources - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("after heat source choosing: "); for (int i = 0; i < getNumHeatSources(); i++) @@ -630,14 +634,14 @@ int HPWH::runOneStep(double drawVolume_L, for (int i = 0; i < getNumHeatSources(); i++) { // check/apply lock-outs - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("Checking lock-out logic for heat source %d:\n", i); } if (shouldDRLockOut(heatSources[i].typeOfHeatSource, DRstatus)) { heatSources[i].lockOutHeatSource(); - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("Locked out heat source, DRstatus = %i\n", DRstatus); } @@ -650,7 +654,7 @@ int HPWH::runOneStep(double drawVolume_L, if (heatSources[i].isLockedOut() && heatSources[i].backupHeatSource == NULL) { heatSources[i].disengageHeatSource(); - if (hpwhVerbosity >= HPWH::VRB_emetic) + if (verbosity >= HPWH::VRB_emetic) { msg("\nWARNING: lock-out triggered, but no backupHeatSource defined. " "Simulation will continue will lock out the heat source."); @@ -679,7 +683,7 @@ int HPWH::runOneStep(double drawVolume_L, else if (VIPIndex >= 0 && heatSources[VIPIndex].isOn && heatSources[i].backupHeatSource->isAResistance()) { - if (hpwhVerbosity >= VRB_typical) + if (verbosity >= VRB_typical) { msg("Locked out back up heat source AND the engaged heat source %i, " "DRstatus = %i\n", @@ -705,7 +709,7 @@ int HPWH::runOneStep(double drawVolume_L, if (heatSourcePtr->runtime_min < minutesToRun) { // debugging message handling - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("done heating! runtime_min minutesToRun %.2lf %.2lf\n", heatSourcePtr->runtime_min, @@ -811,7 +815,7 @@ int HPWH::runOneStep(double drawVolume_L, // cursory check for inverted temperature profile if (tankTemps_C[getNumNodes() - 1] < tankTemps_C[0]) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The top of the tank is cooler than the bottom. \n"); } @@ -833,14 +837,14 @@ int HPWH::runOneStep(double drawVolume_L, if (simHasFailed) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The simulation has encountered an error. \n"); } return HPWH_ABORT; } - if (hpwhVerbosity >= VRB_typical) + if (verbosity >= VRB_typical) { msg("Ending runOneStep. \n\n\n\n"); } @@ -866,7 +870,7 @@ int HPWH::runNSteps(int N, std::vector heatSources_energyInputs_SUM(getNumHeatSources()); std::vector heatSources_energyOutputs_SUM(getNumHeatSources()); - if (hpwhVerbosity >= VRB_typical) + if (verbosity >= VRB_typical) { msg("Begin runNSteps. \n"); } @@ -878,7 +882,7 @@ int HPWH::runNSteps(int N, if (simHasFailed) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("RunNSteps has encountered an error on step %d of N and has ceased running. " "\n", @@ -901,7 +905,7 @@ int HPWH::runNSteps(int N, } // print minutely output - if (hpwhVerbosity == VRB_minuteOut) + if (verbosity == VRB_minuteOut) { msg("%f,%f,%f,", tankAmbientT_C[i], drawVolume_L[i], inletT_C[i]); for (int j = 0; j < getNumHeatSources(); j++) @@ -950,7 +954,7 @@ int HPWH::runNSteps(int N, heatSources[i].energyOutput_kWh = heatSources_energyOutputs_SUM[i]; } - if (hpwhVerbosity >= VRB_typical) + if (verbosity >= VRB_typical) { msg("Ending runNSteps. \n\n\n\n"); } @@ -985,51 +989,6 @@ void HPWH::addHeatParent(HeatSource* heatSourcePtr, } } -void HPWH::setVerbosity(VERBOSITY hpwhVrb) { hpwhVerbosity = hpwhVrb; } -void HPWH::setMessageCallback(void (*callbackFunc)(const string message, void* contextPtr), - void* contextPtr) -{ - messageCallback = callbackFunc; - messageCallbackContextPtr = contextPtr; -} -void HPWH::sayMessage(const string message) const -{ - if (messageCallback != NULL) - { - (*messageCallback)(message, messageCallbackContextPtr); - } - else - { - std::cout << message; - } -} -void HPWH::msg(const char* fmt, ...) const -{ - va_list ap; - va_start(ap, fmt); - msgV(fmt, ap); -} -void HPWH::msgV(const char* fmt, va_list ap /*=NULL*/) const -{ - char outputString[MAXOUTSTRING]; - - const char* p; - if (ap) - { -#if defined(_MSC_VER) - vsprintf_s(outputString, fmt, ap); -#else - vsnprintf(outputString, MAXOUTSTRING, fmt, ap); -#endif - p = outputString; - } - else - { - p = fmt; - } - sayMessage(p); -} // HPWH::msgV - void HPWH::printHeatSourceInfo() { std::stringstream ss; @@ -1191,7 +1150,7 @@ int HPWH::setSetpoint(double newSetpoint, UNITS units /*=UNITS_C*/) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for setSetpoint. \n"); } @@ -1199,7 +1158,7 @@ int HPWH::setSetpoint(double newSetpoint, UNITS units /*=UNITS_C*/) } if (!isNewSetpointPossible(newSetpoint_C, temp, why)) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Unwilling to set this setpoint for the currently selected model, max setpoint is " "%f C. %s\n", @@ -1226,7 +1185,7 @@ double HPWH::getSetpoint(UNITS units /*=UNITS_C*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getSetpoint. \n"); } @@ -1239,7 +1198,7 @@ double HPWH::getMaxCompressorSetpoint(UNITS units /*=UNITS_C*/) const if (!hasACompressor()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Unit does not have a compressor \n"); } @@ -1257,7 +1216,7 @@ double HPWH::getMaxCompressorSetpoint(UNITS units /*=UNITS_C*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getMaxCompressorSetpoint. \n"); } @@ -1283,7 +1242,7 @@ bool HPWH::isNewSetpointPossible(double newSetpoint, } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for isNewSetpointPossible. \n"); } @@ -1369,7 +1328,7 @@ double HPWH::calcSoCFraction(double tMains_C, double tMinUseful_C, double tMax_C // fractional equation if (tMains_C >= tMinUseful_C) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("tMains_C is greater than or equal tMinUseful_C. \n"); } @@ -1377,7 +1336,7 @@ double HPWH::calcSoCFraction(double tMains_C, double tMinUseful_C, double tMax_C } if (tMinUseful_C > tMax_C) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("tMinUseful_C is greater tMax_C. \n"); } @@ -1420,7 +1379,7 @@ double HPWH::getMinOperatingTemp(UNITS units /*=UNITS_C*/) const { if (!hasACompressor()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("No compressor found in this HPWH. \n"); } @@ -1436,7 +1395,7 @@ double HPWH::getMinOperatingTemp(UNITS units /*=UNITS_C*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getMinOperatingTemp.\n"); } @@ -1458,7 +1417,7 @@ int HPWH::setTankLayerTemperatures(std::vector setTankTemps, const UNITS { if ((units != UNITS_C) && (units != UNITS_F)) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for setSetpoint. \n"); } @@ -1468,7 +1427,7 @@ int HPWH::setTankLayerTemperatures(std::vector setTankTemps, const UNITS std::size_t numSetNodes = setTankTemps.size(); if (numSetNodes == 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("No temperatures provided.\n"); } @@ -1493,7 +1452,7 @@ int HPWH::setAirFlowFreedom(double fanFraction) { if (fanFraction < 0 || fanFraction > 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to set the fan fraction outside of bounds. \n"); } @@ -1538,7 +1497,7 @@ int HPWH::setTankSize_adjustUA(double HPWH_size, } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for setTankSize_adjustUA. \n"); } @@ -1579,7 +1538,7 @@ double HPWH::getTankSurfaceArea(UNITS units /*=UNITS_FT2*/) const double value = getTankSurfaceArea(tankVolume_L, UNITS_L, units); if (value < 0.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) msg("Incorrect unit specification for getTankSurfaceArea. \n"); value = HPWH_ABORT; } @@ -1619,7 +1578,7 @@ double HPWH::getTankRadius(UNITS units /*=UNITS_FT*/) const if (value < 0.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) msg("Incorrect unit specification for getTankRadius. \n"); value = HPWH_ABORT; } @@ -1632,7 +1591,7 @@ int HPWH::setTankSize(double HPWH_size, UNITS units /*=UNITS_L*/, bool forceChan { if (isTankSizeFixed() && !forceChange) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Can not change the tank size for your currently selected model. \n"); } @@ -1640,7 +1599,7 @@ int HPWH::setTankSize(double HPWH_size, UNITS units /*=UNITS_L*/, bool forceChan } if (HPWH_size <= 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to set the tank volume outside of bounds. \n"); } @@ -1659,7 +1618,7 @@ int HPWH::setTankSize(double HPWH_size, UNITS units /*=UNITS_L*/, bool forceChan } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for setTankSize. \n"); } @@ -1694,7 +1653,7 @@ int HPWH::setUA(double UA, UNITS units /*=UNITS_kJperHrC*/) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for setUA. \n"); } @@ -1716,7 +1675,7 @@ int HPWH::getUA(double& UA, UNITS units /*=UNITS_kJperHrC*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getUA. \n"); } @@ -1738,7 +1697,7 @@ int HPWH::setFittingsUA(double UA, UNITS units /*=UNITS_kJperHrC*/) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for setFittingsUA. \n"); } @@ -1759,7 +1718,7 @@ int HPWH::getFittingsUA(double& UA, UNITS units /*=UNITS_kJperHrC*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getUA. \n"); } @@ -1791,7 +1750,7 @@ int HPWH::setExternalPortHeightByFraction(double fractionalHeight, int whichExte { if (!hasExternalHeatSource()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Does not have an external heat source \n"); } @@ -1827,7 +1786,7 @@ int HPWH::setNodeNumFromFractionalHeight(double fractionalHeight, int& inletNum) { if (fractionalHeight > 1. || fractionalHeight < 0.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Out of bounds fraction for setInletByFraction \n"); } @@ -1844,7 +1803,7 @@ int HPWH::getExternalInletHeight() const { if (!hasExternalHeatSource()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Does not have an external heat source \n"); } @@ -1864,7 +1823,7 @@ int HPWH::getExternalOutletHeight() const { if (!hasExternalHeatSource()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Does not have an external heat source \n"); } @@ -1885,7 +1844,7 @@ int HPWH::setTimerLimitTOT(double limit_min) { if (limit_min > 24. * 60. || limit_min < 0.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Out of bounds time limit for setTimerLimitTOT \n"); } @@ -1911,7 +1870,7 @@ int HPWH::getInletHeight(int whichInlet) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Invalid inlet chosen in getInletHeight \n"); } @@ -1931,7 +1890,7 @@ int HPWH::setMaxTempDepression(double maxDepression, UNITS units /*=UNITS_C*/) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for max Temp Depression. \n"); } @@ -1970,7 +1929,7 @@ int HPWH::setEnteringWaterHighTempShutOff(double highTemp, { if (!hasEnteringWaterHighTempShutOff(heatSourceIndex)) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to acess a heating logic that does not exist. \n"); } @@ -1988,7 +1947,7 @@ int HPWH::setEnteringWaterHighTempShutOff(double highTemp, } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for set Entering Water High Temp Shut Off. \n"); } @@ -2013,7 +1972,7 @@ int HPWH::setEnteringWaterHighTempShutOff(double highTemp, } if (highTempIsNotValid) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("High temperature shut off is too close to the setpoint, excpected a minimum " "difference of %.2lf.\n", @@ -2038,7 +1997,7 @@ int HPWH::setTargetSoCFraction(double target) { if (!isSoCControlled()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Can not set target state of charge if HPWH is not using state of charge " "controls."); @@ -2047,7 +2006,7 @@ int HPWH::setTargetSoCFraction(double target) } if (target < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Can not set a negative target state of charge."); } @@ -2092,7 +2051,7 @@ int HPWH::switchToSoCControls(double targetSoC, { if (!canUseSoCControls()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Cannot set up state of charge controls for integrated or wrapped HPWHs.\n"); } @@ -2112,7 +2071,7 @@ int HPWH::switchToSoCControls(double targetSoC, } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for set Enterinh Water High Temp Shut Off.\n"); } @@ -2121,7 +2080,7 @@ int HPWH::switchToSoCControls(double targetSoC, if (mainsT_C >= tempMinUseful_C) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The mains temperature can't be equal to or greater than the minimum useful " "temperature.\n"); @@ -2412,7 +2371,7 @@ double HPWH::getTankNodeTemp(int nodeNum, UNITS units /*=UNITS_C*/) const { if (tankTemps_C.empty()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to access the temperature of a tank node that does not exist. " "\n"); @@ -2435,7 +2394,7 @@ double HPWH::getTankNodeTemp(int nodeNum, UNITS units /*=UNITS_C*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getTankNodeTemp. \n"); } @@ -2448,7 +2407,7 @@ double HPWH::getNthSimTcouple(int iTCouple, int nTCouple, UNITS units /*=UNITS_C { if (iTCouple > nTCouple || iTCouple < 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to access a simulated thermocouple that does not exist. \n"); } @@ -2468,7 +2427,7 @@ double HPWH::getNthSimTcouple(int iTCouple, int nTCouple, UNITS units /*=UNITS_C } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getNthSimTcouple. \n"); } @@ -2502,7 +2461,7 @@ double HPWH::getCompressorCapacity(double airTemp /*=19.722*/, if (!hasACompressor()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Current model does not have a compressor. \n"); } @@ -2523,7 +2482,7 @@ double HPWH::getCompressorCapacity(double airTemp /*=19.722*/, } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for temperatures in getCompressorCapacity. \n"); } @@ -2533,7 +2492,7 @@ double HPWH::getCompressorCapacity(double airTemp /*=19.722*/, if (airTemp_C < heatSources[compressorIndex].minT || airTemp_C > heatSources[compressorIndex].maxT) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The compress does not operate at the specified air temperature. \n"); } @@ -2545,7 +2504,7 @@ double HPWH::getCompressorCapacity(double airTemp /*=19.722*/, heatSources[compressorIndex].secondaryHeatExchanger.hotSideTemperatureOffset_dC; if (outTemp_C > maxAllowedSetpoint_C) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Inputted outlet temperature of the compressor is higher than can be produced."); } @@ -2571,7 +2530,7 @@ double HPWH::getCompressorCapacity(double airTemp /*=19.722*/, } else if (pwrUnit != UNITS_BTUperHr) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for capacity in getCompressorCapacity. \n"); } @@ -2586,7 +2545,7 @@ double HPWH::getNthHeatSourceEnergyInput(int N, UNITS units /*=UNITS_KWH*/) cons // energy used by the heat source is positive - this should always be positive if (N >= getNumHeatSources() || N < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to access the energy input of a heat source that does not " "exist. \n"); @@ -2608,7 +2567,7 @@ double HPWH::getNthHeatSourceEnergyInput(int N, UNITS units /*=UNITS_KWH*/) cons } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getNthHeatSourceEnergyInput. \n"); } @@ -2621,7 +2580,7 @@ double HPWH::getNthHeatSourceEnergyOutput(int N, UNITS units /*=UNITS_KWH*/) con // returns energy from the heat source into the water - this should always be positive if (N >= getNumHeatSources() || N < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to access the energy output of a heat source that does not " "exist. \n"); @@ -2643,7 +2602,7 @@ double HPWH::getNthHeatSourceEnergyOutput(int N, UNITS units /*=UNITS_KWH*/) con } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getNthHeatSourceEnergyInput. \n"); } @@ -2655,7 +2614,7 @@ double HPWH::getNthHeatSourceRunTime(int N) const { if (N >= getNumHeatSources() || N < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to access the run time of a heat source that does not exist. " "\n"); @@ -2669,7 +2628,7 @@ int HPWH::isNthHeatSourceRunning(int N) const { if (N >= getNumHeatSources() || N < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to access the status of a heat source that does not exist. " "\n"); @@ -2690,7 +2649,7 @@ HPWH::HEATSOURCE_TYPE HPWH::getNthHeatSourceType(int N) const { if (N >= getNumHeatSources() || N < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have attempted to access the type of a heat source that does not exist. \n"); } @@ -2711,7 +2670,7 @@ double HPWH::getTankSize(UNITS units /*=UNITS_L*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getTankSize. \n"); } @@ -2731,7 +2690,7 @@ double HPWH::getOutletTemp(UNITS units /*=UNITS_C*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getOutletTemp. \n"); } @@ -2751,7 +2710,7 @@ double HPWH::getCondenserWaterInletTemp(UNITS units /*=UNITS_C*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getCondenserWaterInletTemp. \n"); } @@ -2771,7 +2730,7 @@ double HPWH::getCondenserWaterOutletTemp(UNITS units /*=UNITS_C*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getCondenserWaterInletTemp. \n"); } @@ -2791,7 +2750,7 @@ double HPWH::getExternalVolumeHeated(UNITS units /*=UNITS_L*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getExternalVolumeHeated. \n"); } @@ -2816,7 +2775,7 @@ double HPWH::getEnergyRemovedFromEnvironment(UNITS units /*=UNITS_KWH*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getEnergyRemovedFromEnvironment. \n"); } @@ -2841,7 +2800,7 @@ double HPWH::getStandbyLosses(UNITS units /*=UNITS_KWH*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getStandbyLosses. \n"); } @@ -2872,7 +2831,7 @@ int HPWH::getCompressorCoilConfig() const { if (!hasACompressor()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Current model does not have a compressor. \n"); } @@ -2884,7 +2843,7 @@ bool HPWH::isCompressorMultipass() const { if (!hasACompressor()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Current model does not have a compressor. \n"); } @@ -2896,7 +2855,7 @@ bool HPWH::isCompressoExternalMultipass() const { if (!hasACompressor()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Current model does not have a compressor. \n"); } @@ -2923,7 +2882,7 @@ double HPWH::getExternalMPFlowRate(UNITS units /*=UNITS_GPM*/) const { if (!isCompressoExternalMultipass()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Does not have an external multipass heat source \n"); } @@ -2940,7 +2899,7 @@ double HPWH::getExternalMPFlowRate(UNITS units /*=UNITS_GPM*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getExternalMPFlowRate. \n"); } @@ -2969,7 +2928,7 @@ double HPWH::getCompressorMinRuntime(UNITS units /*=UNITS_MIN*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for getCompressorMinRunTime. \n"); } @@ -2978,7 +2937,7 @@ double HPWH::getCompressorMinRuntime(UNITS units /*=UNITS_MIN*/) const } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("This HPWH has no compressor. \n"); } @@ -2993,7 +2952,7 @@ int HPWH::getSizingFractions(double& aquaFract, double& useableFract) const if (!hasACompressor()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Current model does not have a compressor. \n"); } @@ -3001,7 +2960,7 @@ int HPWH::getSizingFractions(double& aquaFract, double& useableFract) const } else if (usesSoCLogic) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Current model uses SOC control logic and does not have a definition for sizing " "fractions. \n"); @@ -3014,7 +2973,7 @@ int HPWH::getSizingFractions(double& aquaFract, double& useableFract) const { double tempA; - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("\tturnon logic: %s ", onLogic->description.c_str()); } @@ -3031,7 +2990,7 @@ int HPWH::getSizingFractions(double& aquaFract, double& useableFract) const double tempUse; - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("\tshutsOff logic: %s ", offLogic->description.c_str()); } @@ -3052,7 +3011,7 @@ int HPWH::getSizingFractions(double& aquaFract, double& useableFract) const } else { - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("\no shutoff logics present"); } @@ -3076,7 +3035,7 @@ int HPWH::setScaleHPWHCapacityCOP(double scaleCapacity /*=1.0*/, double scaleCOP { if (!isHPWHScalable()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Can not scale the HPWH Capacity or COP \n"); } @@ -3084,7 +3043,7 @@ int HPWH::setScaleHPWHCapacityCOP(double scaleCapacity /*=1.0*/, double scaleCOP } if (!hasACompressor()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Current model does not have a compressor. \n"); } @@ -3092,7 +3051,7 @@ int HPWH::setScaleHPWHCapacityCOP(double scaleCapacity /*=1.0*/, double scaleCOP } if (scaleCapacity <= 0 || scaleCOP <= 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Can not scale the HPWH Capacity or COP to 0 or less than 0 \n"); } @@ -3145,7 +3104,7 @@ int HPWH::setResistanceCapacity(double power, int which /*=-1*/, UNITS pwrUnit / // Input checks if (!isHPWHScalable()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Can not scale the resistance elements \n"); } @@ -3153,7 +3112,7 @@ int HPWH::setResistanceCapacity(double power, int which /*=-1*/, UNITS pwrUnit / } if (getNumResistanceElements() == 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("There are no resistance elements to set capacity for \n"); } @@ -3161,7 +3120,7 @@ int HPWH::setResistanceCapacity(double power, int which /*=-1*/, UNITS pwrUnit / } if (which < -1 || which > getNumResistanceElements() - 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Out of bounds value for which in setResistanceCapacity()\n"); } @@ -3169,7 +3128,7 @@ int HPWH::setResistanceCapacity(double power, int which /*=-1*/, UNITS pwrUnit / } if (power < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Can not have a negative input power \n"); } @@ -3187,7 +3146,7 @@ int HPWH::setResistanceCapacity(double power, int which /*=-1*/, UNITS pwrUnit / } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for capacity in setResistanceCapacity. \n"); } @@ -3230,7 +3189,7 @@ double HPWH::getResistanceCapacity(int which /*=-1*/, UNITS pwrUnit /*=UNITS_KW* // Input checks if (getNumResistanceElements() == 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("There are no resistance elements to return capacity for \n"); } @@ -3238,7 +3197,7 @@ double HPWH::getResistanceCapacity(int which /*=-1*/, UNITS pwrUnit /*=UNITS_KW* } if (which < -1 || which > getNumResistanceElements() - 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Out of bounds value for which in getResistanceCapacity()\n"); } @@ -3286,7 +3245,7 @@ double HPWH::getResistanceCapacity(int which /*=-1*/, UNITS pwrUnit /*=UNITS_KW* } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect unit specification for capacity in getResistanceCapacity. \n"); } @@ -3301,7 +3260,7 @@ int HPWH::getResistancePosition(int elementIndex) const if (elementIndex < 0 || elementIndex > getNumHeatSources() - 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Out of bounds value for which in getResistancePosition\n"); } @@ -3310,7 +3269,7 @@ int HPWH::getResistancePosition(int elementIndex) const if (!heatSources[elementIndex].isAResistance()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("This index is not a resistance element\n"); } @@ -3344,7 +3303,7 @@ void HPWH::updateTankTemps(double drawVolume_L, // calculate how many nodes to draw (wholeNodesToDraw), and the remainder (drawFraction) if (inletVol2_L > drawVolume_L) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Volume in inlet 2 is greater than the draw volume. \n"); } @@ -3401,7 +3360,7 @@ void HPWH::updateTankTemps(double drawVolume_L, double drawVolume_N = drawVolume_L / nodeVolume_L; if (drawVolume_L > tankVolume_L) { - // if (hpwhVerbosity >= VRB_reluctant) { + // if (verbosity >= VRB_reluctant) { // msg("WARNING: Drawing more than the tank volume in one step is undefined // behavior. Terminating simulation. \n"); msg("WARNING: Drawing more than the // tank volume in one step is undefined behavior. Continuing simulation at your own @@ -3533,7 +3492,7 @@ void HPWH::updateTankTemps(double drawVolume_L, secondsPerStep; if (tau > 0.5) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The stability condition for conduction has failed, these results are going to " "be interesting!\n"); @@ -3636,7 +3595,7 @@ double HPWH::addHeatAboveNode(double qAdd_kJ, int nodeNum, const double maxT_C) // Do not exceed maxT_C or setpoint double maxHeatToT_C = std::min(maxT_C, setpoint_C); - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("node %2d cap_kwh %.4lf \n", nodeNum, KJ_TO_KWH(qAdd_kJ)); } @@ -3712,7 +3671,7 @@ double HPWH::addHeatAboveNode(double qAdd_kJ, int nodeNum, const double maxT_C) void HPWH::addExtraHeatAboveNode(double qAdd_kJ, const int nodeNum) { - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg("node %2d cap_kwh %.4lf \n", nodeNum, KJ_TO_KWH(qAdd_kJ)); } @@ -3958,7 +3917,7 @@ void HPWH::calcDerivedHeatingValues() { heatSources[i].Tshrinkage_C = findShrinkageT_C(heatSources[i].condensity); - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg(outputString, "Heat Source %d \n", i); msg(outputString, "shrinkage %.2lf \n\n", heatSources[i].Tshrinkage_C); @@ -3970,7 +3929,7 @@ void HPWH::calcDerivedHeatingValues() { heatSources[i].lowestNode = findLowestNode(heatSources[i].condensity, getNumNodes()); - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg(outputString, "Heat Source %d \n", i); msg(outputString, " lowest : %d \n", heatSources[i].lowestNode); @@ -4002,7 +3961,7 @@ void HPWH::calcDerivedHeatingValues() } else { - if (hpwhVerbosity >= VRB_minuteOut) + if (verbosity >= VRB_minuteOut) { msg("More than one resistance element is assigned to VIP"); }; @@ -4025,13 +3984,13 @@ void HPWH::calcDerivedHeatingValues() } } } - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg(outputString, " compressorIndex : %d \n", compressorIndex); msg(outputString, " lowestElementIndex : %d \n", lowestElementIndex); msg(outputString, " highestElementIndex : %d \n", highestElementIndex); } - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { msg(outputString, " VIPIndex : %d \n", VIPIndex); } @@ -4080,7 +4039,7 @@ int HPWH::checkInputs() if (getNumHeatSources() <= 0 && hpwhModel != MODELS_StorageTank) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You must have at least one HeatSource.\n"); } @@ -4094,7 +4053,7 @@ int HPWH::checkInputs() // check the heat source type to make sure it has been set if (heatSources[i].typeOfHeatSource == TYPE_none) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Heat source %d does not have a specified type. Initialization failed.\n", i); } @@ -4105,7 +4064,7 @@ int HPWH::checkInputs() if (heatSources[i].turnOnLogicSet.size() == 0 && (parent == -1 || heatSources[parent].turnOnLogicSet.size() == 0)) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You must specify at least one logic to turn on the element or the element " "must be set as a backup for another heat source with at least one logic."); @@ -4119,7 +4078,7 @@ int HPWH::checkInputs() if (!logic->isValid()) { returnVal = HPWH_ABORT; - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("On logic at index %i is invalid", i); } @@ -4131,7 +4090,7 @@ int HPWH::checkInputs() if (!logic->isValid()) { returnVal = HPWH_ABORT; - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Off logic at index %i is invalid", i); } @@ -4145,7 +4104,7 @@ int HPWH::checkInputs() condensitySum += heatSources[i].condensity[j]; if (fabs(condensitySum - 1.0) > 1e-6) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The condensity for heatsource %d does not sum to 1. \n", i); msg("It sums to %f \n", condensitySum); @@ -4155,7 +4114,7 @@ int HPWH::checkInputs() // check that air flows are all set properly if (heatSources[i].airflowFreedom > 1.0 || heatSources[i].airflowFreedom <= 0.0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The airflowFreedom must be between 0 and 1 for heatsource %d. \n", i); } @@ -4168,7 +4127,7 @@ int HPWH::checkInputs() { if (heatSources[i].defrostMap.size() < 3) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Defrost logic set to true but no valid defrost map of length 3 or " "greater set. \n"); @@ -4177,7 +4136,7 @@ int HPWH::checkInputs() } if (heatSources[i].configuration != HeatSource::CONFIG_EXTERNAL) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Defrost is only simulated for external compressors. \n"); } @@ -4190,7 +4149,7 @@ int HPWH::checkInputs() if (heatSources[i].shutOffLogicSet.size() != 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("External heat sources can only have one shut off logic. \n "); } @@ -4199,7 +4158,7 @@ int HPWH::checkInputs() if (0 > heatSources[i].externalOutletHeight || heatSources[i].externalOutletHeight > getNumNodes() - 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("External heat sources need an external outlet height within the bounds " "from from 0 to numNodes-1. \n"); @@ -4209,7 +4168,7 @@ int HPWH::checkInputs() if (0 > heatSources[i].externalInletHeight || heatSources[i].externalInletHeight > getNumNodes() - 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("External heat sources need an external inlet height within the bounds " "from from 0 to numNodes-1. \n"); @@ -4222,7 +4181,7 @@ int HPWH::checkInputs() if (heatSources[i].secondaryHeatExchanger.extraPumpPower_W != 0 || heatSources[i].secondaryHeatExchanger.extraPumpPower_W) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Heatsource %d is not an external heat source but has an external " "secondary heat exchanger. \n", @@ -4240,7 +4199,7 @@ int HPWH::checkInputs() // If useBtwxtGrid is true that the perfMap is empty if (heatSources[i].perfMap.size() != 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Using the grid lookups but a regression based perforamnce map is given " "\n"); @@ -4253,7 +4212,7 @@ int HPWH::checkInputs() heatSources[i].perfGridValues[1].size() && heatSources[i].perfGridValues[0].size() != 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("When using grid lookups for perfmance the vectors in perfGridValues must " "be the same length. \n"); @@ -4270,7 +4229,7 @@ int HPWH::checkInputs() } if (expLength != heatSources[i].perfGridValues[0].size()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("When using grid lookups for perfmance the vectors in perfGridValues must " "be the same length. \n"); @@ -4283,7 +4242,7 @@ int HPWH::checkInputs() // Check that perfmap only has 1 point if config_external and multipass if (heatSources[i].isExternalMultipass() && heatSources[i].perfMap.size() != 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("External multipass heat sources must have a perfMap of only one point " "with regression equations. \n"); @@ -4300,7 +4259,7 @@ int HPWH::checkInputs() getSizingFractions(aquaF, useF); if (aquaF < (1. - useF)) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The relationship between the on logic and off logic is not supported. The off " "logic is beneath the on logic."); @@ -4314,7 +4273,7 @@ int HPWH::checkInputs() double tempSetpoint = setpoint_C; if (!isNewSetpointPossible(tempSetpoint, maxTemp, why)) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Cannot set new setpoint. %s", why.c_str()); } @@ -4324,7 +4283,7 @@ int HPWH::checkInputs() // Check if the UA is out of bounds if (tankUA_kJperHrC < 0.0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("The tankUA_kJperHrC is less than 0 for a HPWH, it must be greater than 0, " "tankUA_kJperHrC is: %f \n", @@ -4336,7 +4295,7 @@ int HPWH::checkInputs() // Check single-node heat-exchange effectiveness validity if (heatExchangerEffectiveness > 1.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Heat-exchanger effectiveness cannot exceed 1.\n"); } @@ -4400,7 +4359,7 @@ bool HPWH::isEnergyBalanced(const double drawVol_L, double fracEnergyDiff = fabs(qBal_kJ) / std::max(prevHeatContent_kJ, 1.); if (fracEnergyDiff > fracEnergyTolerance) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Energy-balance error: %f kJ, %f %% \n", qBal_kJ, 100. * fracEnergyDiff); } @@ -4422,7 +4381,7 @@ int HPWH::HPWHinit_file(string configFile) inputFILE.open(configFile.c_str()); if (!inputFILE.is_open()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Input file failed to open. \n"); } @@ -4467,7 +4426,7 @@ int HPWH::HPWHinit_file(string configFile) ; // do nothing, lol else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s. \n", token.c_str()); } @@ -4480,7 +4439,7 @@ int HPWH::HPWHinit_file(string configFile) line_ss >> tempDouble >> units; if (units != "kJperHrC") { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s. \n", token.c_str()); } @@ -4501,7 +4460,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper value for %s\n", token.c_str()); } @@ -4521,7 +4480,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper value for %s\n", token.c_str()); } @@ -4533,7 +4492,7 @@ int HPWH::HPWHinit_file(string configFile) line_ss >> tempDouble; if (tempDouble < 0 || tempDouble > 1) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Out of bounds value for %s. Should be between 0 and 1. \n", token.c_str()); } @@ -4550,7 +4509,7 @@ int HPWH::HPWHinit_file(string configFile) ; // do nothing, lol else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s. \n", token.c_str()); } @@ -4568,7 +4527,7 @@ int HPWH::HPWHinit_file(string configFile) setpointFixed = false; else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper value for %s\n", token.c_str()); } @@ -4584,7 +4543,7 @@ int HPWH::HPWHinit_file(string configFile) ; else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s. \n", token.c_str()); } @@ -4603,7 +4562,7 @@ int HPWH::HPWHinit_file(string configFile) hasHeatExchanger = false; else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper value for %s\n", token.c_str()); } @@ -4621,23 +4580,23 @@ int HPWH::HPWHinit_file(string configFile) line_ss >> token; if (token == "silent") { - hpwhVerbosity = VRB_silent; + verbosity = VRB_silent; } else if (token == "reluctant") { - hpwhVerbosity = VRB_reluctant; + verbosity = VRB_reluctant; } else if (token == "typical") { - hpwhVerbosity = VRB_typical; + verbosity = VRB_typical; } else if (token == "emetic") { - hpwhVerbosity = VRB_emetic; + verbosity = VRB_emetic; } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect verbosity on input. \n"); } @@ -4672,7 +4631,7 @@ int HPWH::HPWHinit_file(string configFile) heatSources[heatsource].isVIP = false; else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper value for %s for heat source %d\n", token.c_str(), @@ -4690,7 +4649,7 @@ int HPWH::HPWHinit_file(string configFile) heatSources[heatsource].isOn = false; else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper value for %s for heat source %d\n", token.c_str(), @@ -4708,7 +4667,7 @@ int HPWH::HPWHinit_file(string configFile) ; // do nothing, lol else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s. \n", token.c_str()); } @@ -4725,7 +4684,7 @@ int HPWH::HPWHinit_file(string configFile) ; // do nothing, lol else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s. \n", token.c_str()); } @@ -4747,7 +4706,7 @@ int HPWH::HPWHinit_file(string configFile) int nodeNum = std::stoi(nextToken); if (nodeNum > LOGIC_NODE_SIZE + 1 || nodeNum < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Node number for heatsource %d %s must be between 0 and %d. " "\n", @@ -4779,7 +4738,7 @@ int HPWH::HPWHinit_file(string configFile) } if (nodeNums.size() != weights.size()) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Number of weights for heatsource %d %s (%d) does not match number " "of nodes for %s (%d). \n", @@ -4793,7 +4752,7 @@ int HPWH::HPWHinit_file(string configFile) } if (nextToken != "absolute" && nextToken != "relative") { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper definition, \"%s\", for heat source %d %s. Should be " "\"relative\" or \"absoute\".\n", @@ -4813,7 +4772,7 @@ int HPWH::HPWHinit_file(string configFile) compare = std::greater(); else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper comparison, \"%s\", for heat source %d %s. Should be " "\"<\" or \">\".\n", @@ -4838,7 +4797,7 @@ int HPWH::HPWHinit_file(string configFile) ; // do nothing, lol else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s from heatsource %d. \n", token.c_str(), @@ -4885,7 +4844,7 @@ int HPWH::HPWHinit_file(string configFile) compare = std::greater(); else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper comparison, \"%s\", for heat source %d %s. Should be " "\"<\" or \">\".\n", @@ -4917,7 +4876,7 @@ int HPWH::HPWHinit_file(string configFile) ; // do nothing, lol else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s from heatsource %d. \n", token.c_str(), @@ -4972,7 +4931,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper %s for heat source %d\n", token.c_str(), heatsource); } @@ -4988,7 +4947,7 @@ int HPWH::HPWHinit_file(string configFile) ; // do nothing, lol else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s from heatsource %d. \n", token.c_str(), @@ -5025,7 +4984,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper %s for heat source %d\n", token.c_str(), heatsource); } @@ -5046,7 +5005,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper %s for heat source %d\n", token.c_str(), heatsource); } @@ -5070,7 +5029,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper %s for heat source %d\n", token.c_str(), heatsource); } @@ -5090,7 +5049,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper %s for heat source %d\n", token.c_str(), heatsource); } @@ -5107,7 +5066,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper %s for heat source %d\n", token.c_str(), heatsource); } @@ -5123,7 +5082,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper %s for heat source %d\n", token.c_str(), heatsource); } @@ -5155,7 +5114,7 @@ int HPWH::HPWHinit_file(string configFile) { if (maxTemps == 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("%s specified for heatsource %d before definition of nTemps. \n", token.c_str(), @@ -5165,7 +5124,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect specification for %s from heatsource %d. nTemps, %d, is " "less than %d. \n", @@ -5186,7 +5145,7 @@ int HPWH::HPWHinit_file(string configFile) tempDouble = C_TO_F(tempDouble); else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s from heatsource %d. \n", token.c_str(), @@ -5223,7 +5182,7 @@ int HPWH::HPWHinit_file(string configFile) { if (maxTemps == 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("%s specified for heatsource %d before definition of nTemps. \n", token.c_str(), @@ -5233,7 +5192,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect specification for %s from heatsource %d. nTemps, %d, is " "less than %d. \n", @@ -5266,7 +5225,7 @@ int HPWH::HPWHinit_file(string configFile) ; // do nothing, lol else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect units specification for %s from heatsource %d. \n", token.c_str(), @@ -5293,7 +5252,7 @@ int HPWH::HPWHinit_file(string configFile) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Improper specifier (%s) for heat source %d\n", token.c_str(), heatsource); } @@ -5341,587 +5300,51 @@ int HPWH::HPWHinit_file(string configFile) } #endif -//----------------------------------------------------------------------------- -/// @brief Reads a named schedule -/// @param[out] schedule schedule values -/// @param[in] scheduleName name of schedule to read -/// @param[in] testLength_min length of test (min) -/// @return true if successful, false otherwise -//----------------------------------------------------------------------------- -bool HPWH::readSchedule(HPWH::Schedule& schedule, std::string scheduleName, long testLength_min) -{ - int minuteHrTmp; - bool hourInput; - std::string line, snippet, s, minORhr; - double valTmp; - std::ifstream inputFile(scheduleName.c_str()); - - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Opening %s\n", scheduleName.c_str()); - } - - if (!inputFile.is_open()) - { - return false; - } - - inputFile >> snippet >> valTmp; - - if (snippet != "default") - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("First line of %s must specify default\n", scheduleName.c_str()); - } - return false; - } - - // Fill with the default value - schedule.assign(testLength_min, valTmp); - - // Burn the first two lines - std::getline(inputFile, line); - std::getline(inputFile, line); - - std::stringstream ss(line); // Will parse with a stringstream - // Grab the first token, which is the minute or hour marker - ss >> minORhr; - if (minORhr.empty()) - { // If nothing left in the file - return true; - } - hourInput = tolower(minORhr.at(0)) == 'h'; - char c; // for commas - while (inputFile >> minuteHrTmp >> c >> valTmp) - { - if (minuteHrTmp >= static_cast(schedule.size())) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Input file for %s has more minutes than test definition\n", - scheduleName.c_str()); - } - return false; - } - // update the value - if (!hourInput) - { - schedule[minuteHrTmp] = valTmp; - } - else if (hourInput) - { - for (int j = minuteHrTmp * 60; j < (minuteHrTmp + 1) * 60; j++) - { - schedule[j] = valTmp; - } - } - } +void HPWH::setVerbosity(VERBOSITY verbosity_in) { verbosity = verbosity_in; } - inputFile.close(); - return true; +// static +void HPWH::setMessageCallback(void (*callbackFunc)(const string message, void* contextPtr), + void* contextPtr) +{ + messageCallback = callbackFunc; + messageCallbackContextPtr = contextPtr; } -//----------------------------------------------------------------------------- -/// @brief Reads the control info for a test from file "testInfo.txt" -/// @param[in] testDirectory path to directory containing test files -/// @param[out] controlInfo data structure containing control info -/// @return true if successful, false otherwise -//----------------------------------------------------------------------------- -bool HPWH::readControlInfo(const std::string& testDirectory, HPWH::ControlInfo& controlInfo) +void HPWH::sayMessage(const string message) { - std::ifstream controlFile; - std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; - // Read the test control file - controlFile.open(fileToOpen.c_str()); - if (!controlFile.is_open()) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Could not open control file %s\n", fileToOpen.c_str()); - } - return false; - } - - controlInfo.outputCode = 0; - controlInfo.timeToRun_min = 0; - controlInfo.setpointT_C = 0.; - controlInfo.initialTankT_C = nullptr; - controlInfo.doConduction = true; - controlInfo.doInversionMixing = true; - controlInfo.inletH = nullptr; - controlInfo.tankSize_gal = nullptr; - controlInfo.tot_limit = nullptr; - controlInfo.useSoC = false; - controlInfo.temperatureUnits = "C"; - controlInfo.recordMinuteData = false; - controlInfo.recordYearData = false; - controlInfo.modifyDraw = false; - - std::string token; - std::string sValue; - while (controlFile >> token >> sValue) - { - if (token == "setpoint") - { // If a setpoint was specified then override the default - controlInfo.setpointT_C = std::stod(sValue); - } - else if (token == "length_of_test") - { - controlInfo.timeToRun_min = std::stoi(sValue); - } - else if (token == "doInversionMixing") - { - controlInfo.doInversionMixing = getBool(sValue); - } - else if (token == "doConduction") - { - controlInfo.doConduction = getBool(sValue); - } - else if (token == "inletH") - { - controlInfo.inletH = std::unique_ptr(new double(std::stod(sValue))); - } - else if (token == "tanksize") - { - controlInfo.tankSize_gal = std::unique_ptr(new double(std::stod(sValue))); - } - else if (token == "tot_limit") - { - controlInfo.tot_limit = std::unique_ptr(new double(std::stod(sValue))); - } - else if (token == "useSoC") - { - controlInfo.useSoC = getBool(sValue); - } - else if (token == "initialTankT_C") - { // Initialize at this temperature instead of setpoint - controlInfo.initialTankT_C = std::unique_ptr(new double(std::stod(sValue))); - } - else if (token == "temperature_units") - { // Initialize at this temperature instead of setpoint - controlInfo.temperatureUnits = sValue; - } - else - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Unrecognized key in %s\n", token.c_str()); - } - } - } - controlFile.close(); - - if (controlInfo.temperatureUnits == "F") + if (messageCallback != NULL) { - controlInfo.setpointT_C = F_TO_C(controlInfo.setpointT_C); - if (controlInfo.initialTankT_C != nullptr) - *controlInfo.initialTankT_C = F_TO_C(*controlInfo.initialTankT_C); + (*messageCallback)(message, messageCallbackContextPtr); } - - if (controlInfo.timeToRun_min == 0) + else { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Error: record length_of_test not found in testInfo.txt file\n"); - } - return false; + std::cout << message; } - - return true; } - -//----------------------------------------------------------------------------- -/// @brief Reads the schedules for a test -/// @param[in] testDirectory path to directory containing test files -/// @param[in] controlInfo data structure containing control info -/// @param[out] allSchedules collection of test schedules read -/// @return true if successful, false otherwise -//----------------------------------------------------------------------------- -bool HPWH::readSchedules(const std::string& testDirectory, - const HPWH::ControlInfo& controlInfo, - std::vector& allSchedules) -{ - std::vector scheduleNames; - scheduleNames.push_back("inletT"); - scheduleNames.push_back("draw"); - scheduleNames.push_back("ambientT"); - scheduleNames.push_back("evaporatorT"); - scheduleNames.push_back("DR"); - scheduleNames.push_back("setpoint"); - scheduleNames.push_back("SoC"); - - long outputCode = controlInfo.outputCode; - allSchedules.reserve(scheduleNames.size()); - for (auto i = 0; i < scheduleNames.size(); i++) - { - std::string fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; - Schedule schedule; - if (!readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min)) - { - if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("readSchedule returns an error on schedule %s\n", scheduleNames[i].c_str()); - } - return false; - } - } - allSchedules.push_back(schedule); - } - - if (controlInfo.temperatureUnits == "F") - { - for (auto& T : allSchedules[0]) - { - T = F_TO_C(T); - } - for (auto& T : allSchedules[2]) - { - T = F_TO_C(T); - } - for (auto& T : allSchedules[3]) - { - T = F_TO_C(T); - } - for (auto& T : allSchedules[5]) - { - T = F_TO_C(T); - } - } - - setDoInversionMixing(controlInfo.doInversionMixing); - setDoConduction(controlInfo.doConduction); - - if (controlInfo.setpointT_C > 0.) - { - if (!allSchedules[5].empty()) - { - setSetpoint(allSchedules[5][0]); // expect this to fail sometimes - if (controlInfo.initialTankT_C != nullptr) - setTankToTemperature(*controlInfo.initialTankT_C); - else - resetTankToSetpoint(); - } - else - { - setSetpoint(controlInfo.setpointT_C); - if (controlInfo.initialTankT_C != nullptr) - setTankToTemperature(*controlInfo.initialTankT_C); - else - resetTankToSetpoint(); - } - } - - if (controlInfo.inletH != nullptr) - { - outputCode += setInletByFraction(*controlInfo.inletH); - } - if (controlInfo.tankSize_gal != nullptr) - { - outputCode += setTankSize(*controlInfo.tankSize_gal, HPWH::UNITS_GAL); - } - if (controlInfo.tot_limit != nullptr) - { - outputCode += setTimerLimitTOT(*controlInfo.tot_limit); - } - if (controlInfo.useSoC) - { - if (allSchedules[6].empty()) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("If useSoC is true need an SoCschedule.csv file. \n"); - } - } - const double soCMinTUse_C = F_TO_C(110.); - const double soCMains_C = F_TO_C(65.); - outputCode += switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); - } - - if (outputCode != 0) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Control file testInfo.txt has unsettable specifics in it. \n"); - } - return false; - } - return true; +void HPWH::msg(const char* fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + msgV(fmt, ap); } - -//----------------------------------------------------------------------------- -/// @brief Runs a simulation -/// @param[in] testDesc data structure containing test description -/// @param[in] outputDirectory destination path for test results (filename based on testDesc) -/// @param[in] controlInfo data structure containing control info -/// @param[in] allSchedules collection of test schedules -/// @param[in] airT_C air temperature (degC) used for temperature depression -/// @param[in] doTempDepress whether to apply temperature depression -/// @param[out] testResults data structure containing test results -/// @return true if successful, false otherwise -//----------------------------------------------------------------------------- -bool HPWH::runSimulation(const TestDesc& testDesc, - const std::string& outputDirectory, - const HPWH::ControlInfo& controlInfo, - std::vector& allSchedules, - double airT_C, - const bool doTempDepress, - TestResults& testResults) +void HPWH::msgV(const char* fmt, va_list ap /*=NULL*/) { - const double energyBalThreshold = 0.0001; // 0.1 % - const int nTestTCouples = 6; - - // UEF data - testResults = {false, 0., 0.}; - - FILE* yearOutputFile = NULL; - if (controlInfo.recordYearData) - { - std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; - if (fopen_s(&yearOutputFile, sOutputFilename.c_str(), "a+") != 0) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Could not open output file \n", sOutputFilename.c_str()); - } - return false; - } - } - - FILE* minuteOutputFile = NULL; - if (controlInfo.recordMinuteData) - { - std::string sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + - testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; - if (fopen_s(&minuteOutputFile, sOutputFilename.c_str(), "w+") != 0) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Could not open output file \n", sOutputFilename.c_str()); - } - return false; - } - } - - if (controlInfo.recordMinuteData) - { - string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; - if (isCompressoExternalMultipass()) - { - sHeader += "condenserInletT,condenserOutletT,externalVolGPM,"; - } - if (controlInfo.useSoC) - { - sHeader += "targetSoCFract,soCFract,"; - } - WriteCSVHeading(minuteOutputFile, sHeader.c_str(), nTestTCouples, CSVOPT_NONE); - } - - double cumulativeEnergyIn_kWh[3] = {0., 0., 0.}; - double cumulativeEnergyOut_kWh[3] = {0., 0., 0.}; - - bool doChangeSetpoint = (!allSchedules[5].empty()) && (!isSetpointFixed()); - - // ------------------------------------- Simulate --------------------------------------- // - if (hpwhVerbosity >= VRB_reluctant) - { - msg("Now Simulating %d Minutes of the Test\n", controlInfo.timeToRun_min); - } - - // run simulation in 1-min steps - for (int i = 0; i < controlInfo.timeToRun_min; i++) - { - - double inletT_C = allSchedules[0][i]; - double drawVolume_L = GAL_TO_L(allSchedules[1][i]); - double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; - double externalT_C = allSchedules[3][i]; - HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); - - // change setpoint if specified in schedule - if (doChangeSetpoint) - { - setSetpoint(allSchedules[5][i]); // expect this to fail sometimes - } - - // change SoC schedule - if (controlInfo.useSoC) - { - if (setTargetSoCFraction(allSchedules[6][i]) != 0) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("ERROR: Can not set the target state of charge fraction.\n"); - } - return false; - } - } - - if (controlInfo.modifyDraw) - { - const double mixT_C = F_TO_C(125.); - if (getSetpoint() <= mixT_C) - { // do a simple mix down of the draw for the cold-water temperature - drawVolume_L *= (mixT_C - inletT_C) / - (getTankNodeTemp(getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); - } - } - - double inletT2_C = inletT_C; - double drawVolume2_L = drawVolume_L; - - double previousTankHeatContent_kJ = getTankHeatContent_kJ(); - - // run a step - int runResult = runOneStep(inletT_C, // inlet water temperature (C) - drawVolume_L, // draw volume (L) - ambientT_C, // ambient Temp (C) - externalT_C, // external Temp (C) - drStatus, // DDR Status (now an enum. Fixed for now as allow) - drawVolume2_L, // inlet-2 volume (L) - inletT2_C, // inlet-2 Temp (C) - NULL); // no extra heat - - if (runResult != 0) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("ERROR: Run failed.\n"); - } - return false; - } - - if (!isEnergyBalanced( - drawVolume_L, inletT_C, previousTankHeatContent_kJ, energyBalThreshold)) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("WARNING: On minute %i, HPWH has an energy balance error.\n", i); - } - // return false; // fails on ModelTest.testREGoesTo93C.TamScalable_SP.Preset; issue in - // addHeatExternal - } - - // check timing - for (int iHS = 0; iHS < getNumHeatSources(); iHS++) - { - if (getNthHeatSourceRunTime(iHS) > 1.) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("ERROR: On minute %i, heat source %i ran for %i min.\n", - iHS, - getNthHeatSourceRunTime(iHS)); - } - return false; - } - } - - // check flow for external MP - if (isCompressoExternalMultipass()) - { - double volumeHeated_gal = getExternalVolumeHeated(HPWH::UNITS_GAL); - double mpFlowVolume_gal = getExternalMPFlowRate(HPWH::UNITS_GPM) * - getNthHeatSourceRunTime(getCompressorIndex()); - if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) - { - if (hpwhVerbosity >= VRB_reluctant) - { - msg("ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " - "%d, mpFlowRate in 1 min [gal] %d\n", - volumeHeated_gal, - mpFlowVolume_gal); - } - return false; - } - } - - // location temperature reported with temperature depression, instead of ambient temperature - if (doTempDepress) - { - ambientT_C = getLocationTemp_C(); - } - - // write minute summary - if (controlInfo.recordMinuteData) - { - std::string sPreamble = std::to_string(i) + ", " + std::to_string(ambientT_C) + ", " + - std::to_string(getSetpoint()) + ", " + - std::to_string(allSchedules[0][i]) + ", " + - std::to_string(allSchedules[1][i]) + ", "; - // Add some more outputs for mp tests - if (isCompressoExternalMultipass()) - { - sPreamble += std::to_string(getCondenserWaterInletTemp()) + ", " + - std::to_string(getCondenserWaterOutletTemp()) + ", " + - std::to_string(getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; - } - if (controlInfo.useSoC) - { - sPreamble += std::to_string(allSchedules[6][i]) + ", " + - std::to_string(getSoCFraction()) + ", "; - } - int csvOptions = CSVOPT_NONE; - if (allSchedules[1][i] > 0.) - { - csvOptions |= CSVOPT_IS_DRAWING; - } - WriteCSVRow(minuteOutputFile, sPreamble.c_str(), nTestTCouples, csvOptions); - } - - // accumulate energy and draw - double energyIn_kJ = 0.; - for (int iHS = 0; iHS < getNumHeatSources(); iHS++) - { - double heatSourceEnergyIn_kJ = getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); - energyIn_kJ += heatSourceEnergyIn_kJ; - - cumulativeEnergyIn_kWh[iHS] += KJ_TO_KWH(heatSourceEnergyIn_kJ) * 1000.; - cumulativeEnergyOut_kWh[iHS] += - getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; - } - testResults.totalEnergyConsumed_kJ += energyIn_kJ; - testResults.totalVolumeRemoved_L += drawVolume_L; - } - // -------------------------------------Simulation complete - // --------------------------------------- // + char outputString[MAXOUTSTRING]; - if (controlInfo.recordMinuteData) + const char* p; + if (ap) { - fclose(minuteOutputFile); +#if defined(_MSC_VER) + vsprintf_s(outputString, fmt, ap); +#else + vsnprintf(outputString, MAXOUTSTRING, fmt, ap); +#endif + p = outputString; } - - // write year summary - if (controlInfo.recordYearData) + else { - std::string firstCol = - testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; - fprintf(yearOutputFile, "%s", firstCol.c_str()); - double totalEnergyIn_kWh = 0, totalEnergyOut_kWh = 0; - for (int iHS = 0; iHS < 3; iHS++) - { - fprintf(yearOutputFile, - ",%0.0f,%0.0f", - cumulativeEnergyIn_kWh[iHS], - cumulativeEnergyOut_kWh[iHS]); - totalEnergyIn_kWh += cumulativeEnergyIn_kWh[iHS]; - totalEnergyOut_kWh += cumulativeEnergyOut_kWh[iHS]; - } - fprintf(yearOutputFile, ",%0.0f,%0.0f", totalEnergyIn_kWh, totalEnergyOut_kWh); - for (int iHS = 0; iHS < 3; iHS++) - { - fprintf(yearOutputFile, - ",%0.2f", - cumulativeEnergyOut_kWh[iHS] / cumulativeEnergyIn_kWh[iHS]); - } - fprintf(yearOutputFile, ",%0.2f", totalEnergyOut_kWh / totalEnergyIn_kWh); - fprintf(yearOutputFile, "\n"); - fclose(yearOutputFile); + p = fmt; } - - testResults.passed = true; - return true; -} + sayMessage(p); +} // HPWH::msgV \ No newline at end of file diff --git a/src/HPWH.hh b/src/HPWH.hh index a0d3731d..370bf10a 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -244,17 +244,6 @@ class HPWH MODELS_AquaThermAire = 400 // heat exchanger model }; - /// specifies the modes for writing output - /// the specified values are used for >= comparisons, so the numerical order is relevant - enum VERBOSITY - { - VRB_silent = 0, /**< print no outputs */ - VRB_reluctant = 10, /**< print only outputs for fatal errors */ - VRB_minuteOut = 15, /**< print minutely output */ - VRB_typical = 20, /**< print some basic debugging info */ - VRB_emetic = 30 /**< print all the things */ - }; - enum UNITS { UNITS_C, /**< celsius */ @@ -570,10 +559,6 @@ class HPWH void setInletT(double newInletT_C) { member_inletT_C = newInletT_C; }; void setMinutesPerStep(double newMinutesPerStep); - void setVerbosity(VERBOSITY hpwhVrb); - /**< sets the verbosity to the specified level */ - void setMessageCallback(void (*callbackFunc)(const std::string message, void* pContext), - void* pContext); /**< sets the function to be used for message passing */ void printHeatSourceInfo(); /**< this prints out the heat source info, nicely formatted @@ -942,56 +927,9 @@ class HPWH /// Addition of extra heat handled separately from normal heat sources void addExtraHeatAboveNode(double qAdd_kJ, const int nodeNum); - struct ControlInfo - { - long outputCode; - long timeToRun_min; - double setpointT_C; - std::unique_ptr initialTankT_C; - bool doConduction; - bool doInversionMixing; - std::unique_ptr inletH; - std::unique_ptr tankSize_gal; - std::unique_ptr tot_limit; - bool useSoC; - std::string temperatureUnits; - bool recordMinuteData; - bool recordYearData; - bool modifyDraw; - }; - bool readControlInfo(const std::string& testDirectory, ControlInfo& controlInfo); - - typedef std::vector Schedule; - bool readSchedules(const std::string& testDirectory, - const ControlInfo& controlInfo, - std::vector& allSchedules); - bool readSchedule(Schedule& schedule, std::string scheduleName, long testLength_min); - - struct TestDesc - { - std::string presetOrFile; - std::string modelName; - std::string testName; - }; - - struct TestResults - { - bool passed; - double totalEnergyConsumed_kJ; - double totalVolumeRemoved_L; - }; - - bool runSimulation(const TestDesc& testDesc, - const std::string& outputDirectory, - const HPWH::ControlInfo& controlInfo, - std::vector& allSchedules, - double airT_C, - const bool doTempDepress, - TestResults& testResults); - private: class HeatSource; - + void setAllDefaults(); /**< sets all the defaults default */ void updateTankTemps( @@ -1039,13 +977,6 @@ class HPWH void calcAndSetSoCFraction(); - void sayMessage(const std::string message) const; - /**< if the messagePriority is >= the hpwh verbosity, - either pass your message out to the callback function or print it to cout - otherwise do nothing */ - void msg(const char* fmt, ...) const; - void msgV(const char* fmt, va_list ap = NULL) const; - bool simHasFailed; /**< did an internal error cause the simulation to fail? */ @@ -1061,14 +992,6 @@ class HPWH bool canScale; /**< can the HPWH scale capactiy and COP or not */ - VERBOSITY hpwhVerbosity; - /**< an enum to let the sim know how much output to say */ - - void (*messageCallback)(const std::string message, void* contextPtr); - /**< function pointer to indicate an external message processing function */ - void* messageCallbackContextPtr; - /**< caller context pointer for external message processing */ - MODELS hpwhModel; /**< The hpwh should know which preset initialized it, or if it was from a fileget */ @@ -1216,6 +1139,40 @@ class HPWH /// Coefficient (0-1) of effectiveness for heat exchange between a single tank node and water /// line (derived from heatExchangerEffectiveness). double nodeHeatExchangerEffectiveness; + +public: + /// specifies the modes for writing output + /// the specified values are used for >= comparisons, so the numerical order is relevant + enum VERBOSITY + { + VRB_silent = 0, /**< print no outputs */ + VRB_reluctant = 10, /**< print only outputs for fatal errors */ + VRB_minuteOut = 15, /**< print minutely output */ + VRB_typical = 20, /**< print some basic debugging info */ + VRB_emetic = 30 /**< print all the things */ + }; + + VERBOSITY verbosity; + /**< an enum to let the sim know how much output to say */ + + void setVerbosity(VERBOSITY verbosity_in); + + static void (*messageCallback)(const std::string message, void* contextPtr); + /**< function pointer to indicate an external message processing function */ + static void* messageCallbackContextPtr; + /**< caller context pointer for external message processing */ + + static void sayMessage(const std::string message); + /**< if the messagePriority is >= the hpwh verbosity, + either pass your message out to the callback function or print it to cout + otherwise do nothing */ + static void msg(const char* fmt, ...); + static void msgV(const char* fmt, va_list ap = NULL); + + /**< sets the verbosity to the specified level */ + static void setMessageCallback(void (*callbackFunc)(const std::string message, void* pContext), + void* pContext); + class Simulator; }; // end of HPWH class @@ -1539,6 +1496,68 @@ class HPWH::HeatSource }; // end of HeatSource class +class HPWH::Simulator { + public: + friend class HPWH; + + VERBOSITY verbosity; + void setVerbosity(VERBOSITY verbosity_in) { verbosity = verbosity_in;} + + Simulator(); + /**< constructor assigns a pointer to the hpwh that owns this heat source */ + Simulator(const Simulator& simulator_in); /// copy constructor + Simulator& operator=(const Simulator& simulator_in); /// assignment operator + + struct ControlInfo + { + long outputCode; + long timeToRun_min; + double setpointT_C; + std::unique_ptr initialTankT_C; + bool doConduction; + bool doInversionMixing; + std::unique_ptr inletH; + std::unique_ptr tankSize_gal; + std::unique_ptr tot_limit; + bool useSoC; + std::string temperatureUnits; + bool recordMinuteData; + bool recordYearData; + bool modifyDraw; + }; + bool readControlInfo(const std::string& testDirectory, ControlInfo& controlInfo); + + typedef std::vector Schedule; + bool readSchedules(const std::string& testDirectory, + const ControlInfo& controlInfo, + std::vector& allSchedules); + bool readSchedule(Schedule& schedule, std::string scheduleName, long testLength_min); + + struct TestDesc + { + std::string presetOrFile; + std::string modelName; + std::string testName; + }; + + struct TestResults + { + bool passed; + double totalEnergyConsumed_kJ; + double totalVolumeRemoved_L; + }; + + bool run(HPWH &hpwh, + const TestDesc& testDesc, + const std::string& outputDirectory, + const ControlInfo& controlInfo, + std::vector& allSchedules, + double airT_C, + const bool doTempDepress, + TestResults& testResults); + +}; + constexpr double BTUperKWH = 3412.14163312794; // https://www.rapidtables.com/convert/energy/kWh_to_BTU.html constexpr double FperC = 9. / 5.; // degF / degC diff --git a/src/HPWHHeatSources.cc b/src/HPWHHeatSources.cc index 2f204646..de022373 100644 --- a/src/HPWHHeatSources.cc +++ b/src/HPWHHeatSources.cc @@ -61,7 +61,7 @@ HPWH::HeatSource& HPWH::HeatSource::operator=(const HeatSource& hSource) hSource.followedByHeatSource != NULL) { hpwh->simHasFailed = true; - if (hpwh->hpwhVerbosity >= VRB_reluctant) + if (hpwh->verbosity >= VRB_reluctant) { hpwh->msg( "HeatSources cannot be copied if they contain pointers to other HeatSources\n"); @@ -160,7 +160,7 @@ bool HPWH::HeatSource::shouldLockOut(double heatSourceAmbientT_C) const if (isEngaged() == true && heatSourceAmbientT_C < minT - hysteresis_dC) { lock = true; - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + if (hpwh->verbosity >= HPWH::VRB_emetic) { hpwh->msg("\tlock-out: running below minT\tambient: %.2f\tminT: %.2f", heatSourceAmbientT_C, @@ -171,7 +171,7 @@ bool HPWH::HeatSource::shouldLockOut(double heatSourceAmbientT_C) const else if (isEngaged() == false && heatSourceAmbientT_C < minT) { lock = true; - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + if (hpwh->verbosity >= HPWH::VRB_emetic) { hpwh->msg("\tlock-out: already below minT\tambient: %.2f\tminT: %.2f", heatSourceAmbientT_C, @@ -184,7 +184,7 @@ bool HPWH::HeatSource::shouldLockOut(double heatSourceAmbientT_C) const if (isEngaged() == true && heatSourceAmbientT_C > maxT + hysteresis_dC) { lock = true; - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + if (hpwh->verbosity >= HPWH::VRB_emetic) { hpwh->msg("\tlock-out: running above maxT\tambient: %.2f\tmaxT: %.2f", heatSourceAmbientT_C, @@ -195,7 +195,7 @@ bool HPWH::HeatSource::shouldLockOut(double heatSourceAmbientT_C) const else if (isEngaged() == false && heatSourceAmbientT_C > maxT) { lock = true; - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + if (hpwh->verbosity >= HPWH::VRB_emetic) { hpwh->msg("\tlock-out: already above maxT\tambient: %.2f\tmaxT: %.2f", heatSourceAmbientT_C, @@ -206,19 +206,19 @@ bool HPWH::HeatSource::shouldLockOut(double heatSourceAmbientT_C) const if (maxedOut()) { lock = true; - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) + if (hpwh->verbosity >= HPWH::VRB_emetic) { hpwh->msg("\tlock-out: condenser water temperature above max: %.2f", maxSetpoint_C); } } // if (lock == true && backupHeatSource == NULL) { - // if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic) { + // if (hpwh->verbosity >= HPWH::VRB_emetic) { // hpwh->msg("\nWARNING: lock-out triggered, but no backupHeatSource defined. //Simulation will continue without lock-out"); // } // lock = false; // } - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("\n"); } @@ -248,14 +248,14 @@ bool HPWH::HeatSource::shouldUnlock(double heatSourceAmbientT_C) const heatSourceAmbientT_C < maxT - hysteresis_dC) { unlock = true; - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic && + if (hpwh->verbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C > minT + hysteresis_dC) { hpwh->msg("\tunlock: running above minT\tambient: %.2f\tminT: %.2f", heatSourceAmbientT_C, minT); } - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic && + if (hpwh->verbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C < maxT - hysteresis_dC) { hpwh->msg("\tunlock: running below maxT\tambient: %.2f\tmaxT: %.2f", @@ -267,20 +267,20 @@ bool HPWH::HeatSource::shouldUnlock(double heatSourceAmbientT_C) const else if (isEngaged() == false && heatSourceAmbientT_C > minT && heatSourceAmbientT_C < maxT) { unlock = true; - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C > minT) + if (hpwh->verbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C > minT) { hpwh->msg("\tunlock: already above minT\tambient: %.2f\tminT: %.2f", heatSourceAmbientT_C, minT); } - if (hpwh->hpwhVerbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C < maxT) + if (hpwh->verbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C < maxT) { hpwh->msg("\tunlock: already below maxT\tambient: %.2f\tmaxT: %.2f", heatSourceAmbientT_C, maxT); } } - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("\n"); } @@ -325,7 +325,7 @@ bool HPWH::HeatSource::shouldHeat() const for (int i = 0; i < (int)turnOnLogicSet.size(); i++) { - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("\tshouldHeat logic: %s ", turnOnLogicSet[i]->description.c_str()); } @@ -355,11 +355,11 @@ bool HPWH::HeatSource::shouldHeat() const if (shouldEngage) { // debugging message handling - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("engages!\n"); } - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("average: %.2lf \t setpoint: %.2lf \t decisionPoint: %.2lf \t " "comparison: %2.1f\n", @@ -371,7 +371,7 @@ bool HPWH::HeatSource::shouldHeat() const break; } - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("returns: %d \t", shouldEngage); } @@ -381,13 +381,13 @@ bool HPWH::HeatSource::shouldHeat() const if (shouldEngage == true && shutsOff() == true) { shouldEngage = false; - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("but is denied by shutsOff"); } } - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("\n"); } @@ -401,7 +401,7 @@ bool HPWH::HeatSource::shutsOff() const if (hpwh->tankTemps_C[0] >= hpwh->setpoint_C) { shutOff = true; - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("shutsOff bottom node hot: %.2d C \n returns true", hpwh->tankTemps_C[0]); } @@ -410,7 +410,7 @@ bool HPWH::HeatSource::shutsOff() const for (int i = 0; i < (int)shutOffLogicSet.size(); i++) { - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("\tshutsOff logic: %s ", shutOffLogicSet[i]->description.c_str()); } @@ -423,14 +423,14 @@ bool HPWH::HeatSource::shutsOff() const shutOff = true; // debugging message handling - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("shuts down %s\n", shutOffLogicSet[i]->description.c_str()); } } } - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("returns: %d \n", shutOff); } @@ -460,7 +460,7 @@ double HPWH::HeatSource::fractToMeetComparisonExternal() const for (int i = 0; i < (int)shutOffLogicSet.size(); i++) { - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("\tshutsOff logic: %s ", shutOffLogicSet[i]->description.c_str()); } @@ -498,7 +498,7 @@ void HPWH::HeatSource::addHeat(double externalT_C, double minutesToRun) getCapacity(externalT_C, getTankTemp(), input_BTUperHr, cap_BTUperHr, cop); } // some outputs for debugging - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("capacity_kWh %.2lf \t\t cap_BTUperHr %.2lf \n", BTU_TO_KWH(cap_BTUperHr) * (minutesToRun) / min_per_hr, @@ -534,7 +534,7 @@ void HPWH::HeatSource::addHeat(double externalT_C, double minutesToRun) runtime_min = (1. - (leftoverCap_kJ / cap_kJ)) * minutesToRun; #if 1 // error check, 1-22-2017; updated 12-6-2023 if (runtime_min < -TOL_MINVALUE) - if (hpwh->hpwhVerbosity >= VRB_reluctant) + if (hpwh->verbosity >= VRB_reluctant) hpwh->msg("Internal error: Negative runtime = %0.3f min\n", runtime_min); #endif } @@ -577,7 +577,7 @@ double HPWH::HeatSource::getTankTemp() const // Note that condensity is normalized. ++j; } - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("tank temp %.2lf \n", tankTemp_C); } @@ -670,7 +670,7 @@ void HPWH::HeatSource::getCapacity(double externalT_C, inputPower_T2_Watts += perfMap[i_next].inputPower_coeffs[2] * condenserTemp_F * condenserTemp_F; - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("inputPower_T1_constant_W linear_WperF quadratic_WperF2 \t%.2lf " "%.2lf %.2lf \n", @@ -734,7 +734,7 @@ void HPWH::HeatSource::getCapacity(double externalT_C, cap_BTUperHr = cop * input_BTUperHr; - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("externalT_F: %.2lf, Tout_F: %.2lf, condenserTemp_F: %.2lf\n", externalT_F, @@ -755,7 +755,7 @@ void HPWH::HeatSource::getCapacity(double externalT_C, double airflow = 375 * airflowFreedom; cop *= 0.00056 * airflow + 0.79; } - if (hpwh->hpwhVerbosity >= VRB_typical) + if (hpwh->verbosity >= VRB_typical) { hpwh->msg("cop: %.2lf \tinput_BTUperHr: %.2lf \tcap_BTUperHr: %.2lf \n", cop, @@ -832,7 +832,7 @@ void HPWH::HeatSource::getCapacityMP(double externalT_C, { input_BTUperHr += KW_TO_BTUperH(resDefrost.inputPwr_kW); } - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("externalT_F: %.2lf, condenserTemp_F: %.2lf\n", externalT_F, condenserTemp_F); hpwh->msg("input_BTUperHr: %.2lf , cop: %.2lf, cap_BTUperHr: %.2lf \n", @@ -960,7 +960,7 @@ double HPWH::HeatSource::addHeatExternal(double externalT_C, do { - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("bottom tank temp: %.2lf \n", hpwh->tankTemps_C[0]); } @@ -994,14 +994,14 @@ double HPWH::HeatSource::addHeatExternal(double externalT_C, capTemp_BTUperHr, copTemp); heatingCapacity_kJ = BTU_TO_KJ(capTemp_BTUperHr * (minutesToRun / min_per_hr)); - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("\theatingCapacity_kJ stepwise: %.2lf \n", heatingCapacity_kJ); } // adjust capacity for how much time is left in this step heatingCapacity_kJ *= (timeRemaining_min / minutesToRun); - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("\theatingCapacity_kJ remaining this node: %.2lf \n", heatingCapacity_kJ); } @@ -1026,7 +1026,7 @@ double HPWH::HeatSource::addHeatExternal(double externalT_C, nodeFrac = heatingCapacity_kJ / nodeHeat_kJperNode; } - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg( "nodeHeat_kJperNode: %.2lf nodeFrac: %.2lf \n\n", nodeHeat_kJperNode, nodeFrac); @@ -1105,7 +1105,7 @@ double HPWH::HeatSource::addHeatExternal(double externalT_C, hpwh->condenserOutlet_C /= timeRun; } - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { hpwh->msg("final remaining time: %.2lf \n", timeRemaining_min); } diff --git a/src/HPWHHeatingLogics.cc b/src/HPWHHeatingLogics.cc index e2f1838d..f21b1da1 100644 --- a/src/HPWHHeatingLogics.cc +++ b/src/HPWHHeatingLogics.cc @@ -121,7 +121,7 @@ const double HPWH::SoCBasedHeatingLogic::getFractToMeetComparisonExternal() (hpwh->tankTemps_C[calcNode] - hpwh->tankTemps_C[calcNode - 1]); fractNextNode += HPWH::TOL_MINVALUE; - if (hpwh->hpwhVerbosity >= VRB_emetic) + if (hpwh->verbosity >= VRB_emetic) { double smallestSoCChangeWhenHeatingNextNode = 1. / maxSoC * diff --git a/src/HPWHSimulator.cc b/src/HPWHSimulator.cc new file mode 100644 index 00000000..a31ae6ed --- /dev/null +++ b/src/HPWHSimulator.cc @@ -0,0 +1,611 @@ +/* + * Implementation of class HPWH::Simulator + */ + +#include +#include +#include +#include + +#include "HPWH.hh" + +HPWH::Simulator::Simulator() : verbosity(VRB_typical) +{ +} + +HPWH::Simulator::Simulator(const Simulator& simulator) { *this = simulator; } + + +HPWH::Simulator &HPWH::Simulator::operator=(const Simulator& simulator_in) +{ + if (this == &simulator_in) + { + return *this; + } + return *this; +} + +//----------------------------------------------------------------------------- +/// @brief Reads a named schedule +/// @param[out] schedule schedule values +/// @param[in] scheduleName name of schedule to read +/// @param[in] testLength_min length of test (min) +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- +bool HPWH::Simulator::readSchedule(Schedule& schedule, std::string scheduleName, long testLength_min) +{ + int minuteHrTmp; + bool hourInput; + std::string line, snippet, s, minORhr; + double valTmp; + + std::ifstream inputFile(scheduleName.c_str()); + + if (verbosity >= VRB_reluctant) + { + msg("Opening %s\n", scheduleName.c_str()); + } + + if (!inputFile.is_open()) + { + return false; + } + + inputFile >> snippet >> valTmp; + + if (snippet != "default") + { + if (verbosity >= VRB_reluctant) + { + msg("First line of %s must specify default\n", scheduleName.c_str()); + } + return false; + } + + // Fill with the default value + schedule.assign(testLength_min, valTmp); + + // Burn the first two lines + std::getline(inputFile, line); + std::getline(inputFile, line); + + std::stringstream ss(line); // Will parse with a stringstream + // Grab the first token, which is the minute or hour marker + ss >> minORhr; + if (minORhr.empty()) + { // If nothing left in the file + return true; + } + hourInput = tolower(minORhr.at(0)) == 'h'; + char c; // for commas + while (inputFile >> minuteHrTmp >> c >> valTmp) + { + if (minuteHrTmp >= static_cast(schedule.size())) + { + if (verbosity >= VRB_reluctant) + { + msg("Input file for %s has more minutes than test definition\n", + scheduleName.c_str()); + } + return false; + } + // update the value + if (!hourInput) + { + schedule[minuteHrTmp] = valTmp; + } + else if (hourInput) + { + for (int j = minuteHrTmp * 60; j < (minuteHrTmp + 1) * 60; j++) + { + schedule[j] = valTmp; + } + } + } + + inputFile.close(); + return true; +} + +//----------------------------------------------------------------------------- +/// @brief Reads the control info for a test from file "testInfo.txt" +/// @param[in] testDirectory path to directory containing test files +/// @param[out] controlInfo data structure containing control info +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- +bool HPWH::Simulator::readControlInfo(const std::string& testDirectory, ControlInfo& controlInfo) +{ + std::ifstream controlFile; + std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; + // Read the test control file + controlFile.open(fileToOpen.c_str()); + if (!controlFile.is_open()) + { + if (verbosity >= VRB_reluctant) + { + msg("Could not open control file %s\n", fileToOpen.c_str()); + } + return false; + } + + controlInfo.outputCode = 0; + controlInfo.timeToRun_min = 0; + controlInfo.setpointT_C = 0.; + controlInfo.initialTankT_C = nullptr; + controlInfo.doConduction = true; + controlInfo.doInversionMixing = true; + controlInfo.inletH = nullptr; + controlInfo.tankSize_gal = nullptr; + controlInfo.tot_limit = nullptr; + controlInfo.useSoC = false; + controlInfo.temperatureUnits = "C"; + controlInfo.recordMinuteData = false; + controlInfo.recordYearData = false; + controlInfo.modifyDraw = false; + + std::string token; + std::string sValue; + while (controlFile >> token >> sValue) + { + if (token == "setpoint") + { // If a setpoint was specified then override the default + controlInfo.setpointT_C = std::stod(sValue); + } + else if (token == "length_of_test") + { + controlInfo.timeToRun_min = std::stoi(sValue); + } + else if (token == "doInversionMixing") + { + controlInfo.doInversionMixing = getBool(sValue); + } + else if (token == "doConduction") + { + controlInfo.doConduction = getBool(sValue); + } + else if (token == "inletH") + { + controlInfo.inletH = std::unique_ptr(new double(std::stod(sValue))); + } + else if (token == "tanksize") + { + controlInfo.tankSize_gal = std::unique_ptr(new double(std::stod(sValue))); + } + else if (token == "tot_limit") + { + controlInfo.tot_limit = std::unique_ptr(new double(std::stod(sValue))); + } + else if (token == "useSoC") + { + controlInfo.useSoC = getBool(sValue); + } + else if (token == "initialTankT_C") + { // Initialize at this temperature instead of setpoint + controlInfo.initialTankT_C = std::unique_ptr(new double(std::stod(sValue))); + } + else if (token == "temperature_units") + { // Initialize at this temperature instead of setpoint + controlInfo.temperatureUnits = sValue; + } + else + { + if (verbosity >= VRB_reluctant) + { + msg("Unrecognized key in %s\n", token.c_str()); + } + } + } + controlFile.close(); + + if (controlInfo.temperatureUnits == "F") + { + controlInfo.setpointT_C = F_TO_C(controlInfo.setpointT_C); + if (controlInfo.initialTankT_C != nullptr) + *controlInfo.initialTankT_C = F_TO_C(*controlInfo.initialTankT_C); + } + + if (controlInfo.timeToRun_min == 0) + { + if (verbosity >= VRB_reluctant) + { + msg("Error: record length_of_test not found in testInfo.txt file\n"); + } + return false; + } + + return true; +} + +//----------------------------------------------------------------------------- +/// @brief Reads the schedules for a test +/// @param[in] testDirectory path to directory containing test files +/// @param[in] controlInfo data structure containing control info +/// @param[out] allSchedules collection of test schedules read +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- +bool HPWH::Simulator::readSchedules(const std::string& testDirectory, + const ControlInfo& controlInfo, + std::vector& allSchedules) +{ + std::vector scheduleNames; + scheduleNames.push_back("inletT"); + scheduleNames.push_back("draw"); + scheduleNames.push_back("ambientT"); + scheduleNames.push_back("evaporatorT"); + scheduleNames.push_back("DR"); + scheduleNames.push_back("setpoint"); + scheduleNames.push_back("SoC"); + + long outputCode = controlInfo.outputCode; + allSchedules.reserve(scheduleNames.size()); + for (auto i = 0; i < scheduleNames.size(); i++) + { + std::string fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; + Schedule schedule; + if (!readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min)) + { + if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") + { + if (verbosity >= VRB_reluctant) + { + msg("readSchedule returns an error on schedule %s\n", scheduleNames[i].c_str()); + } + return false; + } + } + allSchedules.push_back(schedule); + } + + if (controlInfo.temperatureUnits == "F") + { + for (auto& T : allSchedules[0]) + { + T = F_TO_C(T); + } + for (auto& T : allSchedules[2]) + { + T = F_TO_C(T); + } + for (auto& T : allSchedules[3]) + { + T = F_TO_C(T); + } + for (auto& T : allSchedules[5]) + { + T = F_TO_C(T); + } + } + + if (outputCode != 0) + { + if (verbosity >= VRB_reluctant) + { + msg("Control file testInfo.txt has unsettable specifics in it. \n"); + } + return false; + } + return true; +} + +//----------------------------------------------------------------------------- +/// @brief Runs a simulation +/// @param[in] testDesc data structure containing test description +/// @param[in] outputDirectory destination path for test results (filename based on testDesc) +/// @param[in] controlInfo data structure containing control info +/// @param[in] allSchedules collection of test schedules +/// @param[in] airT_C air temperature (degC) used for temperature depression +/// @param[in] doTempDepress whether to apply temperature depression +/// @param[out] testResults data structure containing test results +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- +bool HPWH::Simulator::run(HPWH &hpwh, + const TestDesc& testDesc, + const std::string& outputDirectory, + const ControlInfo& controlInfo, + std::vector& allSchedules, + double airT_C, + const bool doTempDepress, + TestResults& testResults) +{ + const double energyBalThreshold = 0.0001; // 0.1 % + const int nTestTCouples = 6; + + hpwh.setDoInversionMixing(controlInfo.doInversionMixing); + hpwh.setDoConduction(controlInfo.doConduction); + + if (controlInfo.setpointT_C > 0.) + { + if (!allSchedules[5].empty()) + { + hpwh.setSetpoint(allSchedules[5][0]); // expect this to fail sometimes + if (controlInfo.initialTankT_C != nullptr) + hpwh.setTankToTemperature(*controlInfo.initialTankT_C); + else + hpwh.resetTankToSetpoint(); + } + else + { + hpwh.setSetpoint(controlInfo.setpointT_C); + if (controlInfo.initialTankT_C != nullptr) + hpwh.setTankToTemperature(*controlInfo.initialTankT_C); + else + hpwh.resetTankToSetpoint(); + } + } + + if (controlInfo.inletH != nullptr) + { + hpwh.setInletByFraction(*controlInfo.inletH); + } + if (controlInfo.tankSize_gal != nullptr) + { + hpwh.setTankSize(*controlInfo.tankSize_gal, HPWH::UNITS_GAL); + } + if (controlInfo.tot_limit != nullptr) + { + hpwh.setTimerLimitTOT(*controlInfo.tot_limit); + } + if (controlInfo.useSoC) + { + if (allSchedules[6].empty()) + { + if (verbosity >= VRB_reluctant) + { + msg("If useSoC is true need an SoCschedule.csv file. \n"); + } + } + const double soCMinTUse_C = F_TO_C(110.); + const double soCMains_C = F_TO_C(65.); + hpwh.switchToSoCControls(1., .05, soCMinTUse_C, true, soCMains_C); + } + + // UEF data + testResults = {false, 0., 0.}; + + FILE* yearOutputFile = NULL; + if (controlInfo.recordYearData) + { + std::string sOutputFilename = outputDirectory + "/DHW_YRLY.csv"; + if (fopen_s(&yearOutputFile, sOutputFilename.c_str(), "a+") != 0) + { + if (hpwh.verbosity >= VRB_reluctant) + { + msg("Could not open output file \n", sOutputFilename.c_str()); + } + return false; + } + } + + FILE* minuteOutputFile = NULL; + if (controlInfo.recordMinuteData) + { + std::string sOutputFilename = outputDirectory + "/" + testDesc.testName + "_" + + testDesc.presetOrFile + "_" + testDesc.modelName + ".csv"; + if (fopen_s(&minuteOutputFile, sOutputFilename.c_str(), "w+") != 0) + { + if (hpwh.verbosity >= VRB_reluctant) + { + msg("Could not open output file \n", sOutputFilename.c_str()); + } + return false; + } + } + + if (controlInfo.recordMinuteData) + { + std::string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; + if (hpwh.isCompressoExternalMultipass()) + { + sHeader += "condenserInletT,condenserOutletT,externalVolGPM,"; + } + if (controlInfo.useSoC) + { + sHeader += "targetSoCFract,soCFract,"; + } + hpwh.WriteCSVHeading(minuteOutputFile, sHeader.c_str(), nTestTCouples, CSVOPT_NONE); + } + + double cumulativeEnergyIn_kWh[3] = {0., 0., 0.}; + double cumulativeEnergyOut_kWh[3] = {0., 0., 0.}; + + bool doChangeSetpoint = (!allSchedules[5].empty()) && (!hpwh.isSetpointFixed()); + + // ------------------------------------- Simulate --------------------------------------- // + if (verbosity >= VRB_reluctant) + { + msg("Now Simulating %d Minutes of the Test\n", controlInfo.timeToRun_min); + } + + // run simulation in 1-min steps + for (int i = 0; i < controlInfo.timeToRun_min; i++) + { + + double inletT_C = allSchedules[0][i]; + double drawVolume_L = GAL_TO_L(allSchedules[1][i]); + double ambientT_C = doTempDepress ? airT_C : allSchedules[2][i]; + double externalT_C = allSchedules[3][i]; + HPWH::DRMODES drStatus = static_cast(int(allSchedules[4][i])); + + // change setpoint if specified in schedule + if (doChangeSetpoint) + { + hpwh.setSetpoint(allSchedules[5][i]); // expect this to fail sometimes + } + + // change SoC schedule + if (controlInfo.useSoC) + { + if (hpwh.setTargetSoCFraction(allSchedules[6][i]) != 0) + { + if (verbosity >= VRB_reluctant) + { + msg("ERROR: Can not set the target state of charge fraction.\n"); + } + return false; + } + } + + if (controlInfo.modifyDraw) + { + const double mixT_C = F_TO_C(125.); + if (hpwh.getSetpoint() <= mixT_C) + { // do a simple mix down of the draw for the cold-water temperature + drawVolume_L *= (mixT_C - inletT_C) / + (hpwh.getTankNodeTemp(hpwh.getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); + } + } + + double inletT2_C = inletT_C; + double drawVolume2_L = drawVolume_L; + + double previousTankHeatContent_kJ = hpwh.getTankHeatContent_kJ(); + + // run a step + int runResult = hpwh.runOneStep(inletT_C, // inlet water temperature (C) + drawVolume_L, // draw volume (L) + ambientT_C, // ambient Temp (C) + externalT_C, // external Temp (C) + drStatus, // DDR Status (now an enum. Fixed for now as allow) + drawVolume2_L, // inlet-2 volume (L) + inletT2_C, // inlet-2 Temp (C) + NULL); // no extra heat + + if (runResult != 0) + { + if (verbosity >= VRB_reluctant) + { + msg("ERROR: Run failed.\n"); + } + return false; + } + + if (!hpwh.isEnergyBalanced( + drawVolume_L, inletT_C, previousTankHeatContent_kJ, energyBalThreshold)) + { + if (verbosity >= VRB_reluctant) + { + msg("WARNING: On minute %i, HPWH has an energy balance error.\n", i); + } + // return false; // fails on ModelTest.testREGoesTo93C.TamScalable_SP.Preset; issue in + // addHeatExternal + } + + // check timing + for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) + { + if (hpwh.getNthHeatSourceRunTime(iHS) > 1.) + { + if (verbosity >= VRB_reluctant) + { + msg("ERROR: On minute %i, heat source %i ran for %i min.\n", + iHS, + hpwh.getNthHeatSourceRunTime(iHS)); + } + return false; + } + } + + // check flow for external MP + if (hpwh.isCompressoExternalMultipass()) + { + double volumeHeated_gal = hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL); + double mpFlowVolume_gal = hpwh.getExternalMPFlowRate(HPWH::UNITS_GPM) * + hpwh.getNthHeatSourceRunTime(hpwh.getCompressorIndex()); + if (fabs(volumeHeated_gal - mpFlowVolume_gal) > 0.000001) + { + if (verbosity >= VRB_reluctant) + { + msg("ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " + "%d, mpFlowRate in 1 min [gal] %d\n", + volumeHeated_gal, + mpFlowVolume_gal); + } + return false; + } + } + + // location temperature reported with temperature depression, instead of ambient temperature + if (doTempDepress) + { + ambientT_C = hpwh.getLocationTemp_C(); + } + + // write minute summary + if (controlInfo.recordMinuteData) + { + std::string sPreamble = std::to_string(i) + ", " + std::to_string(ambientT_C) + ", " + + std::to_string(hpwh.getSetpoint()) + ", " + + std::to_string(allSchedules[0][i]) + ", " + + std::to_string(allSchedules[1][i]) + ", "; + // Add some more outputs for mp tests + if (hpwh.isCompressoExternalMultipass()) + { + sPreamble += std::to_string(hpwh.getCondenserWaterInletTemp()) + ", " + + std::to_string(hpwh.getCondenserWaterOutletTemp()) + ", " + + std::to_string(hpwh.getExternalVolumeHeated(HPWH::UNITS_GAL)) + ", "; + } + if (controlInfo.useSoC) + { + sPreamble += std::to_string(allSchedules[6][i]) + ", " + + std::to_string(hpwh.getSoCFraction()) + ", "; + } + int csvOptions = CSVOPT_NONE; + if (allSchedules[1][i] > 0.) + { + csvOptions |= CSVOPT_IS_DRAWING; + } + hpwh.WriteCSVRow(minuteOutputFile, sPreamble.c_str(), nTestTCouples, csvOptions); + } + + // accumulate energy and draw + double energyIn_kJ = 0.; + for (int iHS = 0; iHS < hpwh.getNumHeatSources(); iHS++) + { + double heatSourceEnergyIn_kJ = hpwh.getNthHeatSourceEnergyInput(iHS, HPWH::UNITS_KJ); + energyIn_kJ += heatSourceEnergyIn_kJ; + + cumulativeEnergyIn_kWh[iHS] += KJ_TO_KWH(heatSourceEnergyIn_kJ) * 1000.; + cumulativeEnergyOut_kWh[iHS] += + hpwh.getNthHeatSourceEnergyOutput(iHS, HPWH::UNITS_KWH) * 1000.; + } + testResults.totalEnergyConsumed_kJ += energyIn_kJ; + testResults.totalVolumeRemoved_L += drawVolume_L; + } + // -------------------------------------Simulation complete-------------------------------------- // + + if (controlInfo.recordMinuteData) + { + fclose(minuteOutputFile); + } + + // write year summary + if (controlInfo.recordYearData) + { + std::string firstCol = + testDesc.testName + "," + testDesc.presetOrFile + "," + testDesc.modelName; + fprintf(yearOutputFile, "%s", firstCol.c_str()); + double totalEnergyIn_kWh = 0, totalEnergyOut_kWh = 0; + for (int iHS = 0; iHS < 3; iHS++) + { + fprintf(yearOutputFile, + ",%0.0f,%0.0f", + cumulativeEnergyIn_kWh[iHS], + cumulativeEnergyOut_kWh[iHS]); + totalEnergyIn_kWh += cumulativeEnergyIn_kWh[iHS]; + totalEnergyOut_kWh += cumulativeEnergyOut_kWh[iHS]; + } + fprintf(yearOutputFile, ",%0.0f,%0.0f", totalEnergyIn_kWh, totalEnergyOut_kWh); + for (int iHS = 0; iHS < 3; iHS++) + { + fprintf(yearOutputFile, + ",%0.2f", + cumulativeEnergyOut_kWh[iHS] / cumulativeEnergyIn_kWh[iHS]); + } + fprintf(yearOutputFile, ",%0.2f", totalEnergyOut_kWh / totalEnergyIn_kWh); + fprintf(yearOutputFile, "\n"); + fclose(yearOutputFile); + } + + testResults.passed = true; + return true; +} diff --git a/src/HPWHpresets.cc b/src/HPWHpresets.cc index cf6e7625..2170026d 100644 --- a/src/HPWHpresets.cc +++ b/src/HPWHpresets.cc @@ -27,7 +27,7 @@ int HPWH::HPWHinit_resTank(double tankVol_L, // low power element will cause divide by zero/negative UA in EF -> UA conversion if (lowerPower_W < 550) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Resistance tank lower element wattage below 550 W. DOES NOT COMPUTE\n"); } @@ -35,7 +35,7 @@ int HPWH::HPWHinit_resTank(double tankVol_L, } if (upperPower_W < 0.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Upper resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); } @@ -43,7 +43,7 @@ int HPWH::HPWHinit_resTank(double tankVol_L, } if (energyFactor <= 0.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Energy Factor less than zero. DOES NOT COMPUTE\n"); } @@ -111,7 +111,7 @@ int HPWH::HPWHinit_resTank(double tankVol_L, if (tankUA_kJperHrC < 0.) { - if (hpwhVerbosity >= VRB_reluctant && tankUA_kJperHrC < -0.1) + if (verbosity >= VRB_reluctant && tankUA_kJperHrC < -0.1) { msg("Computed tankUA_kJperHrC is less than 0, and is reset to 0."); } @@ -136,7 +136,7 @@ int HPWH::HPWHinit_resTank(double tankVol_L, heatSources[i].sortPerformanceMap(); } - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { for (int i = 0; i < getNumHeatSources(); i++) { @@ -163,7 +163,7 @@ int HPWH::HPWHinit_resTankGeneric(double tankVol_L, // low power element will cause divide by zero/negative UA in EF -> UA conversion if (lowerPower_W < 0) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Lower resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); } @@ -171,7 +171,7 @@ int HPWH::HPWHinit_resTankGeneric(double tankVol_L, } if (upperPower_W < 0.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Upper resistance tank wattage below 0 W. DOES NOT COMPUTE\n"); } @@ -179,7 +179,7 @@ int HPWH::HPWHinit_resTankGeneric(double tankVol_L, } if (rValue_M2KperW <= 0.) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("R-Value is equal to or below 0. DOES NOT COMPUTE\n"); } @@ -241,7 +241,7 @@ int HPWH::HPWHinit_resTankGeneric(double tankVol_L, if (tankUA_kJperHrC < 0.) { - if (hpwhVerbosity >= VRB_reluctant && tankUA_kJperHrC < -0.1) + if (verbosity >= VRB_reluctant && tankUA_kJperHrC < -0.1) { msg("Computed tankUA_kJperHrC is less than 0, and is reset to 0."); } @@ -266,7 +266,7 @@ int HPWH::HPWHinit_resTankGeneric(double tankVol_L, source.sortPerformanceMap(); } - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { for (int i = 0; i < getNumHeatSources(); i++) { @@ -363,7 +363,7 @@ int HPWH::HPWHinit_genericHPWH(double tankVol_L, double energyFactor, double res int failure = this->setTankSize(tankVol_L); if (failure == HPWH_ABORT) { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Failure to set tank size in generic hpwh init."); } @@ -437,7 +437,7 @@ int HPWH::HPWHinit_genericHPWH(double tankVol_L, double energyFactor, double res heatSources[i].sortPerformanceMap(); } - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { for (int i = 0; i < getNumHeatSources(); i++) { @@ -4223,7 +4223,7 @@ int HPWH::HPWHinit_presets(MODELS presetNum) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("Incorrect model specification. \n"); } @@ -4554,7 +4554,7 @@ int HPWH::HPWHinit_presets(MODELS presetNum) } else { - if (hpwhVerbosity >= VRB_reluctant) + if (verbosity >= VRB_reluctant) { msg("You have tried to select a preset model which does not exist. \n"); } @@ -4586,7 +4586,7 @@ int HPWH::HPWHinit_presets(MODELS presetNum) heatSources[i].sortPerformanceMap(); } - if (hpwhVerbosity >= VRB_emetic) + if (verbosity >= VRB_emetic) { for (int i = 0; i < getNumHeatSources(); i++) { diff --git a/test/main.cc b/test/main.cc index 17604842..ca070eac 100644 --- a/test/main.cc +++ b/test/main.cc @@ -26,6 +26,7 @@ using std::string; int main(int argc, char* argv[]) { HPWH hpwh; + HPWH::Simulator simulator; const long maximumDurationNormalTest_min = 500000; @@ -74,7 +75,7 @@ int main(int argc, char* argv[]) exit(1); } - HPWH::TestDesc testDesc; + HPWH::Simulator::TestDesc testDesc; testDesc.presetOrFile = input1; testDesc.modelName = input2; testDesc.testName = input3; @@ -117,15 +118,15 @@ int main(int argc, char* argv[]) hpwh.setMaxTempDepression(4.); hpwh.setDoTempDepression(doTempDepress); - HPWH::ControlInfo controlInfo; - if (!hpwh.readControlInfo(testDesc.testName, controlInfo)) + HPWH::Simulator::ControlInfo controlInfo; + if (!simulator.readControlInfo(testDesc.testName, controlInfo)) { cout << "Control file testInfo.txt has unsettable specifics in it. \n"; exit(1); } - std::vector allSchedules; - if (!hpwh.readSchedules(testDesc.testName, controlInfo, allSchedules)) + std::vector allSchedules; + if (!simulator.readSchedules(testDesc.testName, controlInfo, allSchedules)) { exit(1); } @@ -138,14 +139,15 @@ int main(int argc, char* argv[]) (hpwh.getHPWHModel() <= HPWH::MODELS_RHEEM_HPHD135VNU_483_MP) && (controlInfo.timeToRun_min > maximumDurationNormalTest_min)); - HPWH::TestResults testResults; - if (!hpwh.runSimulation(testDesc, - outputDirectory, - controlInfo, - allSchedules, - airT_C, - doTempDepress, - testResults)) + HPWH::Simulator::TestResults testResults; + if (!simulator.run(hpwh, + testDesc, + outputDirectory, + controlInfo, + allSchedules, + airT_C, + doTempDepress, + testResults)) { exit(1); } diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc index 833051dc..29dce3ec 100644 --- a/test/testCalcUEF.cc +++ b/test/testCalcUEF.cc @@ -10,8 +10,8 @@ const std::vector sProfileNames({"24hr67_vsmall", "24hr67_low", "24hr67_medium", "24hr67_high"}); -static bool runTest(const HPWH::TestDesc testDesc, - HPWH::TestResults& testResults, +static bool runTest(const HPWH::Simulator::TestDesc testDesc, + HPWH::Simulator::TestResults& testResults, double airT_C = 0., bool doTempDepress = false) { @@ -43,17 +43,18 @@ static bool runTest(const HPWH::TestDesc testDesc, hpwh.setMaxTempDepression(4.); hpwh.setDoTempDepression(doTempDepress); - HPWH::ControlInfo controlInfo; - result = hpwh.readControlInfo(testDesc.testName, controlInfo); + HPWH::Simulator simulator; + HPWH::Simulator::ControlInfo controlInfo; + result = simulator.readControlInfo(testDesc.testName, controlInfo); ASSERTTRUE(result); - std::vector allSchedules; - result = hpwh.readSchedules(testDesc.testName, controlInfo, allSchedules); + std::vector allSchedules; + result = simulator.readSchedules(testDesc.testName, controlInfo, allSchedules); ASSERTTRUE(result); controlInfo.recordMinuteData = false; controlInfo.recordYearData = false; - result = hpwh.runSimulation( + result = simulator.run(hpwh, testDesc, sOutputDirectory, controlInfo, allSchedules, airT_C, doTempDepress, testResults); ASSERTTRUE(result); @@ -65,7 +66,7 @@ static bool runUEFTestSuite(const std::string& sModelName, const std::string& sPresetOrFile, double& UEF) { - HPWH::TestDesc testDesc; + HPWH::Simulator::TestDesc testDesc; testDesc.modelName = sModelName; testDesc.presetOrFile = sPresetOrFile; @@ -75,7 +76,7 @@ runUEFTestSuite(const std::string& sModelName, const std::string& sPresetOrFile, bool result = true; for (auto& sProfileName : sProfileNames) { - HPWH::TestResults testResults; + HPWH::Simulator::TestResults testResults; testDesc.testName = sProfileName; result &= runTest(testDesc, testResults); From c29575ee017a7d96712bf4732548b187787d6b3d Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Tue, 26 Dec 2023 16:02:27 -0700 Subject: [PATCH 24/25] Fix format. --- src/HPWH.cc | 8 ++---- src/HPWH.hh | 32 +++++++++++----------- src/HPWHHeatSources.cc | 8 +++--- src/HPWHSimulator.cc | 60 ++++++++++++++++++++++-------------------- 4 files changed, 52 insertions(+), 56 deletions(-) diff --git a/src/HPWH.cc b/src/HPWH.cc index 913e5c5a..5e8d4f61 100644 --- a/src/HPWH.cc +++ b/src/HPWH.cc @@ -325,10 +325,7 @@ void HPWH::setMinutesPerStep(const double minutesPerStep_in) }; // public HPWH functions -HPWH::HPWH() : verbosity(VRB_silent) -{ - setAllDefaults(); -}; +HPWH::HPWH() : verbosity(VRB_silent) { setAllDefaults(); }; void HPWH::setAllDefaults() { @@ -5300,7 +5297,6 @@ int HPWH::HPWHinit_file(string configFile) } #endif - void HPWH::setVerbosity(VERBOSITY verbosity_in) { verbosity = verbosity_in; } // static @@ -5347,4 +5343,4 @@ void HPWH::msgV(const char* fmt, va_list ap /*=NULL*/) p = fmt; } sayMessage(p); -} // HPWH::msgV \ No newline at end of file +} // HPWH::msgV diff --git a/src/HPWH.hh b/src/HPWH.hh index 370bf10a..41a4aad8 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -929,7 +929,7 @@ class HPWH private: class HeatSource; - + void setAllDefaults(); /**< sets all the defaults default */ void updateTankTemps( @@ -1139,8 +1139,8 @@ class HPWH /// Coefficient (0-1) of effectiveness for heat exchange between a single tank node and water /// line (derived from heatExchangerEffectiveness). double nodeHeatExchangerEffectiveness; - -public: + + public: /// specifies the modes for writing output /// the specified values are used for >= comparisons, so the numerical order is relevant enum VERBOSITY @@ -1171,7 +1171,7 @@ public: /**< sets the verbosity to the specified level */ static void setMessageCallback(void (*callbackFunc)(const std::string message, void* pContext), - void* pContext); + void* pContext); class Simulator; }; // end of HPWH class @@ -1496,18 +1496,19 @@ class HPWH::HeatSource }; // end of HeatSource class -class HPWH::Simulator { +class HPWH::Simulator +{ public: friend class HPWH; VERBOSITY verbosity; - void setVerbosity(VERBOSITY verbosity_in) { verbosity = verbosity_in;} + void setVerbosity(VERBOSITY verbosity_in) { verbosity = verbosity_in; } Simulator(); /**< constructor assigns a pointer to the hpwh that owns this heat source */ Simulator(const Simulator& simulator_in); /// copy constructor Simulator& operator=(const Simulator& simulator_in); /// assignment operator - + struct ControlInfo { long outputCode; @@ -1547,15 +1548,14 @@ class HPWH::Simulator { double totalVolumeRemoved_L; }; - bool run(HPWH &hpwh, - const TestDesc& testDesc, - const std::string& outputDirectory, - const ControlInfo& controlInfo, - std::vector& allSchedules, - double airT_C, - const bool doTempDepress, - TestResults& testResults); - + bool run(HPWH& hpwh, + const TestDesc& testDesc, + const std::string& outputDirectory, + const ControlInfo& controlInfo, + std::vector& allSchedules, + double airT_C, + const bool doTempDepress, + TestResults& testResults); }; constexpr double BTUperKWH = diff --git a/src/HPWHHeatSources.cc b/src/HPWHHeatSources.cc index de022373..7d741b7a 100644 --- a/src/HPWHHeatSources.cc +++ b/src/HPWHHeatSources.cc @@ -214,7 +214,7 @@ bool HPWH::HeatSource::shouldLockOut(double heatSourceAmbientT_C) const // if (lock == true && backupHeatSource == NULL) { // if (hpwh->verbosity >= HPWH::VRB_emetic) { // hpwh->msg("\nWARNING: lock-out triggered, but no backupHeatSource defined. - //Simulation will continue without lock-out"); + // Simulation will continue without lock-out"); // } // lock = false; // } @@ -248,15 +248,13 @@ bool HPWH::HeatSource::shouldUnlock(double heatSourceAmbientT_C) const heatSourceAmbientT_C < maxT - hysteresis_dC) { unlock = true; - if (hpwh->verbosity >= HPWH::VRB_emetic && - heatSourceAmbientT_C > minT + hysteresis_dC) + if (hpwh->verbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C > minT + hysteresis_dC) { hpwh->msg("\tunlock: running above minT\tambient: %.2f\tminT: %.2f", heatSourceAmbientT_C, minT); } - if (hpwh->verbosity >= HPWH::VRB_emetic && - heatSourceAmbientT_C < maxT - hysteresis_dC) + if (hpwh->verbosity >= HPWH::VRB_emetic && heatSourceAmbientT_C < maxT - hysteresis_dC) { hpwh->msg("\tunlock: running below maxT\tambient: %.2f\tmaxT: %.2f", heatSourceAmbientT_C, diff --git a/src/HPWHSimulator.cc b/src/HPWHSimulator.cc index a31ae6ed..8da706e7 100644 --- a/src/HPWHSimulator.cc +++ b/src/HPWHSimulator.cc @@ -9,14 +9,11 @@ #include "HPWH.hh" -HPWH::Simulator::Simulator() : verbosity(VRB_typical) -{ -} +HPWH::Simulator::Simulator() : verbosity(VRB_typical) {} HPWH::Simulator::Simulator(const Simulator& simulator) { *this = simulator; } - -HPWH::Simulator &HPWH::Simulator::operator=(const Simulator& simulator_in) +HPWH::Simulator& HPWH::Simulator::operator=(const Simulator& simulator_in) { if (this == &simulator_in) { @@ -32,7 +29,9 @@ HPWH::Simulator &HPWH::Simulator::operator=(const Simulator& simulator_in) /// @param[in] testLength_min length of test (min) /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::Simulator::readSchedule(Schedule& schedule, std::string scheduleName, long testLength_min) +bool HPWH::Simulator::readSchedule(Schedule& schedule, + std::string scheduleName, + long testLength_min) { int minuteHrTmp; bool hourInput; @@ -224,8 +223,8 @@ bool HPWH::Simulator::readControlInfo(const std::string& testDirectory, ControlI /// @return true if successful, false otherwise //----------------------------------------------------------------------------- bool HPWH::Simulator::readSchedules(const std::string& testDirectory, - const ControlInfo& controlInfo, - std::vector& allSchedules) + const ControlInfo& controlInfo, + std::vector& allSchedules) { std::vector scheduleNames; scheduleNames.push_back("inletT"); @@ -276,7 +275,7 @@ bool HPWH::Simulator::readSchedules(const std::string& testDirectory, } } - if (outputCode != 0) + if (outputCode != 0) { if (verbosity >= VRB_reluctant) { @@ -298,14 +297,14 @@ bool HPWH::Simulator::readSchedules(const std::string& testDirectory, /// @param[out] testResults data structure containing test results /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::Simulator::run(HPWH &hpwh, - const TestDesc& testDesc, - const std::string& outputDirectory, - const ControlInfo& controlInfo, - std::vector& allSchedules, - double airT_C, - const bool doTempDepress, - TestResults& testResults) +bool HPWH::Simulator::run(HPWH& hpwh, + const TestDesc& testDesc, + const std::string& outputDirectory, + const ControlInfo& controlInfo, + std::vector& allSchedules, + double airT_C, + const bool doTempDepress, + TestResults& testResults) { const double energyBalThreshold = 0.0001; // 0.1 % const int nTestTCouples = 6; @@ -393,7 +392,7 @@ bool HPWH::Simulator::run(HPWH &hpwh, if (controlInfo.recordMinuteData) { - std::string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; + std::string sHeader = "minutes,Ta,Tsetpoint,inletT,draw,"; if (hpwh.isCompressoExternalMultipass()) { sHeader += "condenserInletT,condenserOutletT,externalVolGPM,"; @@ -450,8 +449,9 @@ bool HPWH::Simulator::run(HPWH &hpwh, const double mixT_C = F_TO_C(125.); if (hpwh.getSetpoint() <= mixT_C) { // do a simple mix down of the draw for the cold-water temperature - drawVolume_L *= (mixT_C - inletT_C) / - (hpwh.getTankNodeTemp(hpwh.getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); + drawVolume_L *= + (mixT_C - inletT_C) / + (hpwh.getTankNodeTemp(hpwh.getNumNodes() - 1, HPWH::UNITS_C) - inletT_C); } } @@ -461,14 +461,15 @@ bool HPWH::Simulator::run(HPWH &hpwh, double previousTankHeatContent_kJ = hpwh.getTankHeatContent_kJ(); // run a step - int runResult = hpwh.runOneStep(inletT_C, // inlet water temperature (C) - drawVolume_L, // draw volume (L) - ambientT_C, // ambient Temp (C) - externalT_C, // external Temp (C) - drStatus, // DDR Status (now an enum. Fixed for now as allow) - drawVolume2_L, // inlet-2 volume (L) - inletT2_C, // inlet-2 Temp (C) - NULL); // no extra heat + int runResult = + hpwh.runOneStep(inletT_C, // inlet water temperature (C) + drawVolume_L, // draw volume (L) + ambientT_C, // ambient Temp (C) + externalT_C, // external Temp (C) + drStatus, // DDR Status (now an enum. Fixed for now as allow) + drawVolume2_L, // inlet-2 volume (L) + inletT2_C, // inlet-2 Temp (C) + NULL); // no extra heat if (runResult != 0) { @@ -571,7 +572,8 @@ bool HPWH::Simulator::run(HPWH &hpwh, testResults.totalEnergyConsumed_kJ += energyIn_kJ; testResults.totalVolumeRemoved_L += drawVolume_L; } - // -------------------------------------Simulation complete-------------------------------------- // + // -------------------------------------Simulation + // complete-------------------------------------- // if (controlInfo.recordMinuteData) { From 27e10f58cce256e2baa307184bded7faccd807b7 Mon Sep 17 00:00:00 2001 From: Phil Ahrenkiel Date: Wed, 27 Dec 2023 09:28:20 -0700 Subject: [PATCH 25/25] Read schedules as streams. --- src/HPWH.hh | 15 ++- src/HPWHSimulator.cc | 220 ++++++++++++++++++++++++------------------- test/main.cc | 13 ++- test/testCalcUEF.cc | 18 +++- 4 files changed, 159 insertions(+), 107 deletions(-) diff --git a/src/HPWH.hh b/src/HPWH.hh index 41a4aad8..95c21247 100644 --- a/src/HPWH.hh +++ b/src/HPWH.hh @@ -1526,13 +1526,22 @@ class HPWH::Simulator bool recordYearData; bool modifyDraw; }; - bool readControlInfo(const std::string& testDirectory, ControlInfo& controlInfo); + bool openFileText(std::ifstream& fileStream, const std::string& sFilename); + void closeFileText(std::ifstream& fileStream); + + bool openResourceText(std::istream& resourceStream, const std::string& sFilename); + + bool readControlInfo(std::istream& controlStream, ControlInfo& controlInfo); typedef std::vector Schedule; - bool readSchedules(const std::string& testDirectory, + bool readSchedules(const bool isResource, + const std::string& testName, const ControlInfo& controlInfo, std::vector& allSchedules); - bool readSchedule(Schedule& schedule, std::string scheduleName, long testLength_min); + bool readSchedule(Schedule& schedule, + const std::string& scheduleName, + std::istream& scheduleStream, + long testLength_min); struct TestDesc { diff --git a/src/HPWHSimulator.cc b/src/HPWHSimulator.cc index 8da706e7..f7f9183b 100644 --- a/src/HPWHSimulator.cc +++ b/src/HPWHSimulator.cc @@ -22,87 +22,36 @@ HPWH::Simulator& HPWH::Simulator::operator=(const Simulator& simulator_in) return *this; } -//----------------------------------------------------------------------------- -/// @brief Reads a named schedule -/// @param[out] schedule schedule values -/// @param[in] scheduleName name of schedule to read -/// @param[in] testLength_min length of test (min) -/// @return true if successful, false otherwise -//----------------------------------------------------------------------------- -bool HPWH::Simulator::readSchedule(Schedule& schedule, - std::string scheduleName, - long testLength_min) +bool HPWH::Simulator::openFileText(std::ifstream& fileStream, const std::string& sFilename) { - int minuteHrTmp; - bool hourInput; - std::string line, snippet, s, minORhr; - double valTmp; - - std::ifstream inputFile(scheduleName.c_str()); - - if (verbosity >= VRB_reluctant) - { - msg("Opening %s\n", scheduleName.c_str()); - } - - if (!inputFile.is_open()) - { - return false; - } - - inputFile >> snippet >> valTmp; - - if (snippet != "default") + // std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; + // Read the test control file + fileStream.open(sFilename.c_str()); + if (!fileStream.is_open()) { if (verbosity >= VRB_reluctant) { - msg("First line of %s must specify default\n", scheduleName.c_str()); + msg("Could not open control file %s\n", sFilename.c_str()); } return false; } + return true; +} - // Fill with the default value - schedule.assign(testLength_min, valTmp); - - // Burn the first two lines - std::getline(inputFile, line); - std::getline(inputFile, line); - - std::stringstream ss(line); // Will parse with a stringstream - // Grab the first token, which is the minute or hour marker - ss >> minORhr; - if (minORhr.empty()) - { // If nothing left in the file - return true; - } - hourInput = tolower(minORhr.at(0)) == 'h'; - char c; // for commas - while (inputFile >> minuteHrTmp >> c >> valTmp) +bool HPWH::Simulator::openResourceText(std::istream& resourceStream, const std::string& sFilename) +{ + std::ifstream* controlFile = static_cast(&resourceStream); + // std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; + // Read the test control file + controlFile->open(sFilename.c_str()); + if (!controlFile->is_open()) { - if (minuteHrTmp >= static_cast(schedule.size())) - { - if (verbosity >= VRB_reluctant) - { - msg("Input file for %s has more minutes than test definition\n", - scheduleName.c_str()); - } - return false; - } - // update the value - if (!hourInput) - { - schedule[minuteHrTmp] = valTmp; - } - else if (hourInput) + if (verbosity >= VRB_reluctant) { - for (int j = minuteHrTmp * 60; j < (minuteHrTmp + 1) * 60; j++) - { - schedule[j] = valTmp; - } + msg("Could not open control file %s\n", sFilename.c_str()); } + return false; } - - inputFile.close(); return true; } @@ -112,21 +61,8 @@ bool HPWH::Simulator::readSchedule(Schedule& schedule, /// @param[out] controlInfo data structure containing control info /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::Simulator::readControlInfo(const std::string& testDirectory, ControlInfo& controlInfo) +bool HPWH::Simulator::readControlInfo(std::istream& controlStream, ControlInfo& controlInfo) { - std::ifstream controlFile; - std::string fileToOpen = testDirectory + "/" + "testInfo.txt"; - // Read the test control file - controlFile.open(fileToOpen.c_str()); - if (!controlFile.is_open()) - { - if (verbosity >= VRB_reluctant) - { - msg("Could not open control file %s\n", fileToOpen.c_str()); - } - return false; - } - controlInfo.outputCode = 0; controlInfo.timeToRun_min = 0; controlInfo.setpointT_C = 0.; @@ -144,7 +80,7 @@ bool HPWH::Simulator::readControlInfo(const std::string& testDirectory, ControlI std::string token; std::string sValue; - while (controlFile >> token >> sValue) + while (controlStream >> token >> sValue) { if (token == "setpoint") { // If a setpoint was specified then override the default @@ -194,7 +130,6 @@ bool HPWH::Simulator::readControlInfo(const std::string& testDirectory, ControlI } } } - controlFile.close(); if (controlInfo.temperatureUnits == "F") { @@ -215,6 +150,78 @@ bool HPWH::Simulator::readControlInfo(const std::string& testDirectory, ControlI return true; } +//----------------------------------------------------------------------------- +/// @brief Reads a named schedule +/// @param[out] schedule schedule values +/// @param[in] scheduleName name of schedule to read +/// @param[in] testLength_min length of test (min) +/// @return true if successful, false otherwise +//----------------------------------------------------------------------------- +bool HPWH::Simulator::readSchedule(Schedule& schedule, + const std::string& scheduleName, + std::istream& scheduleStream, + long testLength_min) +{ + int minuteHrTmp; + bool hourInput; + std::string line, snippet, s, minORhr; + double valTmp; + + scheduleStream >> snippet >> valTmp; + + if (snippet != "default") + { + if (verbosity >= VRB_reluctant) + { + msg("First line of %s must specify default\n", scheduleName.c_str()); + } + return false; + } + + // Fill with the default value + schedule.assign(testLength_min, valTmp); + + // Burn the first two lines + std::getline(scheduleStream, line); + std::getline(scheduleStream, line); + + std::stringstream ss(line); // Will parse with a stringstream + // Grab the first token, which is the minute or hour marker + ss >> minORhr; + if (minORhr.empty()) + { // If nothing left in the file + return true; + } + hourInput = tolower(minORhr.at(0)) == 'h'; + char c; // for commas + while (scheduleStream >> minuteHrTmp >> c >> valTmp) + { + if (minuteHrTmp >= static_cast(schedule.size())) + { + if (verbosity >= VRB_reluctant) + { + msg("Input file for %s has more minutes than test definition\n", + scheduleName.c_str()); + } + return false; + } + // update the value + if (!hourInput) + { + schedule[minuteHrTmp] = valTmp; + } + else if (hourInput) + { + for (int j = minuteHrTmp * 60; j < (minuteHrTmp + 1) * 60; j++) + { + schedule[j] = valTmp; + } + } + } + + return true; +} + //----------------------------------------------------------------------------- /// @brief Reads the schedules for a test /// @param[in] testDirectory path to directory containing test files @@ -222,7 +229,8 @@ bool HPWH::Simulator::readControlInfo(const std::string& testDirectory, ControlI /// @param[out] allSchedules collection of test schedules read /// @return true if successful, false otherwise //----------------------------------------------------------------------------- -bool HPWH::Simulator::readSchedules(const std::string& testDirectory, +bool HPWH::Simulator::readSchedules(const bool isResource, + const std::string& testName, const ControlInfo& controlInfo, std::vector& allSchedules) { @@ -239,20 +247,37 @@ bool HPWH::Simulator::readSchedules(const std::string& testDirectory, allSchedules.reserve(scheduleNames.size()); for (auto i = 0; i < scheduleNames.size(); i++) { - std::string fileToOpen = testDirectory + "/" + scheduleNames[i] + "schedule.csv"; Schedule schedule; - if (!readSchedule(schedule, fileToOpen, controlInfo.timeToRun_min)) + if (isResource) + { + } + else { - if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") + std::ifstream fileStream; + std::string sFilename = testName + "/" + scheduleNames[i] + "schedule.csv"; + if (openFileText(fileStream, sFilename)) + { + + if (readSchedule(schedule, scheduleNames[i], fileStream, controlInfo.timeToRun_min)) + { + fileStream.close(); + } + else + { + msg("Unable to read schedule file %s\n", scheduleNames[i].c_str()); + return false; + } + } + else if (scheduleNames[i] != "setpoint" && scheduleNames[i] != "SoC") { if (verbosity >= VRB_reluctant) { - msg("readSchedule returns an error on schedule %s\n", scheduleNames[i].c_str()); + msg("Unable to open schedule file %s\n", scheduleNames[i].c_str()); } return false; } + allSchedules.push_back(schedule); } - allSchedules.push_back(schedule); } if (controlInfo.temperatureUnits == "F") @@ -487,8 +512,8 @@ bool HPWH::Simulator::run(HPWH& hpwh, { msg("WARNING: On minute %i, HPWH has an energy balance error.\n", i); } - // return false; // fails on ModelTest.testREGoesTo93C.TamScalable_SP.Preset; issue in - // addHeatExternal + // return false; // fails on ModelTest.testREGoesTo93C.TamScalable_SP.Preset; issue + // in addHeatExternal } // check timing @@ -516,7 +541,8 @@ bool HPWH::Simulator::run(HPWH& hpwh, { if (verbosity >= VRB_reluctant) { - msg("ERROR: Externally heated volumes are inconsistent! Volume Heated [gal]: " + msg("ERROR: Externally heated volumes are inconsistent! Volume Heated " + "[gal]: " "%d, mpFlowRate in 1 min [gal] %d\n", volumeHeated_gal, mpFlowVolume_gal); @@ -525,7 +551,8 @@ bool HPWH::Simulator::run(HPWH& hpwh, } } - // location temperature reported with temperature depression, instead of ambient temperature + // location temperature reported with temperature depression, instead of ambient + // temperature if (doTempDepress) { ambientT_C = hpwh.getLocationTemp_C(); @@ -572,8 +599,7 @@ bool HPWH::Simulator::run(HPWH& hpwh, testResults.totalEnergyConsumed_kJ += energyIn_kJ; testResults.totalVolumeRemoved_L += drawVolume_L; } - // -------------------------------------Simulation - // complete-------------------------------------- // + // -----Simulation complete-------------------------------------- // if (controlInfo.recordMinuteData) { diff --git a/test/main.cc b/test/main.cc index ca070eac..76eef7e5 100644 --- a/test/main.cc +++ b/test/main.cc @@ -119,14 +119,20 @@ int main(int argc, char* argv[]) hpwh.setDoTempDepression(doTempDepress); HPWH::Simulator::ControlInfo controlInfo; - if (!simulator.readControlInfo(testDesc.testName, controlInfo)) + std::ifstream fileStream; + + if (!simulator.openFileText(fileStream, testDesc.testName + "/" + "testInfo.txt")) + { + exit(1); + } + + if (!simulator.readControlInfo(fileStream, controlInfo)) { - cout << "Control file testInfo.txt has unsettable specifics in it. \n"; exit(1); } std::vector allSchedules; - if (!simulator.readSchedules(testDesc.testName, controlInfo, allSchedules)) + if (!simulator.readSchedules(false, testDesc.testName, controlInfo, allSchedules)) { exit(1); } @@ -151,6 +157,5 @@ int main(int argc, char* argv[]) { exit(1); } - return 0; } diff --git a/test/testCalcUEF.cc b/test/testCalcUEF.cc index 29dce3ec..e9ae6e43 100644 --- a/test/testCalcUEF.cc +++ b/test/testCalcUEF.cc @@ -5,6 +5,7 @@ #include "testUtilityFcts.cc" #include +#include #include const std::vector @@ -45,17 +46,28 @@ static bool runTest(const HPWH::Simulator::TestDesc testDesc, HPWH::Simulator simulator; HPWH::Simulator::ControlInfo controlInfo; - result = simulator.readControlInfo(testDesc.testName, controlInfo); + std::ifstream fileStream; + + result = simulator.openFileText(fileStream, testDesc.testName + "/" + "testInfo.txt"); + ASSERTTRUE(result); + + result = simulator.readControlInfo(fileStream, controlInfo); ASSERTTRUE(result); std::vector allSchedules; - result = simulator.readSchedules(testDesc.testName, controlInfo, allSchedules); + result = simulator.readSchedules(false, testDesc.testName, controlInfo, allSchedules); ASSERTTRUE(result); controlInfo.recordMinuteData = false; controlInfo.recordYearData = false; result = simulator.run(hpwh, - testDesc, sOutputDirectory, controlInfo, allSchedules, airT_C, doTempDepress, testResults); + testDesc, + sOutputDirectory, + controlInfo, + allSchedules, + airT_C, + doTempDepress, + testResults); ASSERTTRUE(result); return result;