Fixed bug that caused selected_output to

accumulate in selected_output storage
This commit is contained in:
Charlton, Scott R 2023-08-25 19:44:03 -06:00
parent 41d3a2b050
commit 9919afd8ab
2 changed files with 75 additions and 27 deletions

View File

@ -614,11 +614,11 @@ TEST(TestIPhreeqc, TestRunString)
ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
obj.SetOutputFileOn(1);
obj.SetErrorFileOn(0);
obj.SetLogFileOn(0);
obj.SetSelectedOutputFileOn(0);
obj.SetDumpFileOn(0);
obj.SetOutputFileOn(true);
obj.SetErrorFileOn(false);
obj.SetLogFileOn(false);
obj.SetSelectedOutputFileOn(false);
obj.SetDumpFileOn(false);
ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
ASSERT_EQ(0, obj.RunString(input));
@ -662,11 +662,11 @@ TEST(TestIPhreeqc, TestGetSelectedOutputValue)
ASSERT_EQ(VR_OK, EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
ASSERT_EQ(VR_OK, USER_PUNCH(obj, "Ca", max));
obj.SetOutputFileOn(0);
obj.SetErrorFileOn(0);
obj.SetLogFileOn(0);
obj.SetSelectedOutputFileOn(0);
obj.SetDumpFileOn(0);
obj.SetOutputFileOn(false);
obj.SetErrorFileOn(false);
obj.SetLogFileOn(false);
obj.SetSelectedOutputFileOn(false);
obj.SetDumpFileOn(false);
ASSERT_EQ(0, obj.RunAccumulated());
/*
@ -1799,11 +1799,11 @@ TEST(TestIPhreeqc, TestLongHeadings)
// COMMENT: {10/30/2013 10:39:40 PM} ASSERT_EQ( VR_OK, obj.AccumulateLine(oss.str().c_str()) );
// COMMENT: {10/30/2013 10:39:40 PM} //}}
obj.SetOutputFileOn(0);
obj.SetErrorFileOn(0);
obj.SetLogFileOn(0);
obj.SetSelectedOutputFileOn(0);
obj.SetDumpFileOn(0);
obj.SetOutputFileOn(false);
obj.SetErrorFileOn(false);
obj.SetLogFileOn(false);
obj.SetSelectedOutputFileOn(false);
obj.SetDumpFileOn(false);
ASSERT_EQ(0, obj.RunAccumulated());
ASSERT_EQ(2, obj.GetSelectedOutputRowCount());
@ -1866,12 +1866,12 @@ TEST(TestIPhreeqc, TestDumpString)
ASSERT_EQ(VR_OK, DUMP(obj));
// run
obj.SetOutputFileOn(0);
obj.SetErrorFileOn(0);
obj.SetLogFileOn(0);
obj.SetSelectedOutputFileOn(0);
obj.SetDumpFileOn(0);
obj.SetDumpStringOn(1);
obj.SetOutputFileOn(false);
obj.SetErrorFileOn(false);
obj.SetLogFileOn(false);
obj.SetSelectedOutputFileOn(false);
obj.SetDumpFileOn(false);
obj.SetDumpStringOn(true);
ASSERT_EQ(0, obj.RunAccumulated());
const char* dump_str = obj.GetDumpString();
@ -3107,7 +3107,7 @@ TEST(TestIPhreeqc, TestSetSelectedOutputFileName)
ASSERT_EQ(false, obj.GetDumpFileOn());
ASSERT_EQ(false, obj.GetDumpStringOn());
obj.SetSelectedOutputFileOn(1);
obj.SetSelectedOutputFileOn(true);
obj.SetSelectedOutputFileName(SELOUT_FILENAME);
ASSERT_EQ(0, obj.RunAccumulated());
@ -3249,14 +3249,48 @@ TEST(TestIPhreeqc, TestGetSelectedOutputStringLineCount)
ASSERT_EQ(false, obj.GetDumpFileOn());
ASSERT_EQ(false, obj.GetDumpStringOn());
ASSERT_EQ(false, obj.GetSelectedOutputStringOn() != 0);
ASSERT_EQ(false, obj.GetSelectedOutputStringOn());
obj.SetSelectedOutputStringOn(true);
ASSERT_EQ(true, obj.GetSelectedOutputStringOn());
ASSERT_EQ(0, obj.RunAccumulated());
ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount());
}
TEST(TestIPhreeqc, TestGetSelectedOutputStringLineCountMultipleRuns)
{
IPhreeqc obj;
obj.LoadDatabase("llnl.dat");
ASSERT_EQ(false, obj.GetSelectedOutputStringOn());
obj.SetSelectedOutputStringOn(true);
ASSERT_EQ(true, obj.GetSelectedOutputStringOn());
obj.RunString(R"(
SOLUTION 1
C 1
Ca 1
Na 1
EQUILIBRIUM_PHASES
calcite 0 0.01
SELECTED_OUTPUT
-totals C Ca Na
)");
ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount()); // header + i_soln + react
obj.RunString(R"(
SOLUTION 1
C 2
Ca 2
Na 2
)");
ASSERT_EQ(2, obj.GetSelectedOutputStringLineCount()); // header + i_soln
}
TEST(TestIPhreeqc, TestGetSelectedOutputStringLine)
{
IPhreeqc obj;
@ -3299,8 +3333,9 @@ TEST(TestIPhreeqc, TestGetSelectedOutputStringLine)
ASSERT_EQ(VR_OK, ::EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
ASSERT_EQ(VR_OK, ::USER_PUNCH(obj, "Ca", max));
ASSERT_EQ(false, obj.GetSelectedOutputStringOn() != 0);
ASSERT_EQ(false, obj.GetSelectedOutputStringOn());
obj.SetSelectedOutputStringOn(true);
ASSERT_EQ(true, obj.GetSelectedOutputStringOn());
ASSERT_EQ(0, obj.RunAccumulated());
ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount());

View File

@ -1164,7 +1164,6 @@ void IPhreeqc::check_database(const char* sz_routine)
delete (*it).second;
}
this->SelectedOutputMap.clear();
this->SelectedOutputStringMap.clear();
// release
this->LogString.clear();
@ -1172,13 +1171,15 @@ void IPhreeqc::check_database(const char* sz_routine)
this->OutputString.clear();
this->OutputLines.clear();
// clear selected_output string storage
// GetSelectedOutputStringLine and GetSelectedOutputString
std::map< int, std::string >::iterator mit = SelectedOutputStringMap.begin();
for (; mit != SelectedOutputStringMap.begin(); ++mit)
for (; mit != SelectedOutputStringMap.end(); ++mit)
{
(*mit).second.clear();
}
std::map< int, std::vector< std::string > >::iterator lit = this->SelectedOutputLinesMap.begin();
for (; lit != this->SelectedOutputLinesMap.begin(); ++lit)
for (; lit != this->SelectedOutputLinesMap.end(); ++lit)
{
(*lit).second.clear();
}
@ -1245,6 +1246,18 @@ void IPhreeqc::do_run(const char* sz_routine, std::istream* pis, PFN_PRERUN_CALL
this->PhreeqcPtr->dup_print(token, TRUE);
if (this->PhreeqcPtr->read_input() == EOF)
break;
if (this->PhreeqcPtr->simulation == 1)
{
// force headings for selected output (on every call to do_run)
// might want to split tidy_punch to avoid duplicate searches like master_bsearch
std::map< int, SelectedOutput >::iterator pit = this->PhreeqcPtr->SelectedOutput_map.begin();
for (; pit != this->PhreeqcPtr->SelectedOutput_map.end(); ++pit)
{
(*pit).second.Set_new_def(true);
this->PhreeqcPtr->keycount[Keywords::KEY_SELECTED_OUTPUT] = 1;
}
}
// bool bWarning = false;
std::map< int, SelectedOutput >::iterator mit = this->PhreeqcPtr->SelectedOutput_map.begin();