Changed read _modify to warning if entity not found.

Tony's bug in phrq_io. punch_ostream was deleted twice.

roughed in REACTION_TEMPERATURE_MODIFY and REACTION_PRESSURE_MODIFY. Think they work, and 
added to test case modify_ignore.

git-svn-id: svn://136.177.114.72/svn_GW/phreeqc3/trunk@8453 1feff8c3-07ed-0310-ac33-dd36852eb9cd
This commit is contained in:
David L Parkhurst 2014-02-06 18:28:24 +00:00
parent 063ba6202a
commit aee604b56e
7 changed files with 81 additions and 29 deletions

View File

@ -541,7 +541,7 @@ close_ostreams(void)
streams.insert(output_ostream);
streams.insert(log_ostream);
// streams.insert(punch_ostream); // Should be removed in ~SelectedOutput
// streams.insert(punch_ostream); // Should be deleted in ~SelectedOutput
#ifdef ERROR_OSTREAM
streams.insert(error_ostream);
#else

View File

@ -2062,6 +2062,7 @@ namespace Utilities
return phreeqc_cookie->cleanup_after_parser(parser);
}
#ifdef SKIP
template < typename T >
int Rxn_read_modify(std::map < int, T > &m, std::set < int > &s, Phreeqc * phreeqc_cookie)
{
@ -2092,6 +2093,45 @@ namespace Utilities
return phreeqc_cookie->cleanup_after_parser(parser);
}
#endif
template < typename T >
int Rxn_read_modify(std::map < int, T > &m, std::set < int > &s, Phreeqc * phreeqc_cookie)
{
typename std::map < int, T >::iterator it;
CParser parser(phreeqc_cookie->Get_phrq_io());
std::string key_name;
std::string::iterator b = parser.line().begin();
std::string::iterator e = parser.line().end();
CParser::copy_token(key_name, b, e);
cxxNumKeyword nk;
nk.read_number_description(parser);
T * entity_ptr = Utilities::Rxn_find(m, nk.Get_n_user());
if (!entity_ptr)
{
std::ostringstream errstr;
errstr << "Could not find " << key_name << " " << nk.Get_n_user() << ", ignoring modify data.\n";
phreeqc_cookie->warning_msg(errstr.str().c_str());
//phreeqc_cookie->error_msg(errstr.str().c_str(), PHRQ_io::OT_STOP);
// Don't throw, read data into dummy entity, then ignore
T entity;
entity_ptr = &entity;
entity_ptr->read_raw(parser, false);
return phreeqc_cookie->cleanup_after_parser(parser);
}
entity_ptr->read_raw(parser, false);
entity_ptr->Set_n_user(nk.Get_n_user());
entity_ptr->Set_n_user_end(nk.Get_n_user_end());
entity_ptr->Set_description(nk.Get_description());
s.insert(entity_ptr->Get_n_user());
return phreeqc_cookie->cleanup_after_parser(parser);
}
template < typename T >
void Rxn_mix(std::map <int, cxxMix> &mix_map, std::map < int, T > &entity_map, Phreeqc * phreeqc_cookie)

View File

@ -192,7 +192,7 @@ cxxPressure::dump_raw(std::ostream & s_oss, unsigned int indent, int *n_out) con
}
void
cxxPressure::read_raw(CParser & parser)
cxxPressure::read_raw(CParser & parser, bool check)
{
// clear steps for modify operation, if pressures are read
bool cleared_once = false;
@ -294,17 +294,20 @@ cxxPressure::read_raw(CParser & parser)
break;
}
// members that must be defined
if (equalIncrements_defined == false)
if (check)
{
parser.incr_input_error();
parser.error_msg("Equal_increments not defined for REACTION_PRESSURE_RAW input.",
PHRQ_io::OT_CONTINUE);
}
if (count_defined == false)
{
parser.incr_input_error();
parser.error_msg("Count_temps not defined for REACTION_PRESSURE_RAW input.",
PHRQ_io::OT_CONTINUE);
if (equalIncrements_defined == false)
{
parser.incr_input_error();
parser.error_msg("Equal_increments not defined for REACTION_PRESSURE_RAW input.",
PHRQ_io::OT_CONTINUE);
}
if (count_defined == false)
{
parser.incr_input_error();
parser.error_msg("Count_temps not defined for REACTION_PRESSURE_RAW input.",
PHRQ_io::OT_CONTINUE);
}
}
}
#ifdef SKIP

View File

@ -21,7 +21,7 @@ class cxxPressure:public cxxNumKeyword
void dump_raw(std::ostream & s_oss, unsigned int indent, int *n_out=NULL) const;
int read(CParser & parser);
void read_raw(CParser & parser);
void read_raw(CParser & parser, bool check = false);
LDBLE Pressure_for_step(int step_number);
std::vector<LDBLE> & Get_pressures(void) {return pressures;}
const std::vector<LDBLE> & Get_pressures(void)const {return pressures;}

View File

@ -229,7 +229,7 @@ cxxTemperature::dump_raw(std::ostream & s_oss, unsigned int indent, int *n_out)
}
void
cxxTemperature::read_raw(CParser & parser)
cxxTemperature::read_raw(CParser & parser, bool check)
{
LDBLE d;
CParser::TOKEN_TYPE k;
@ -335,21 +335,24 @@ cxxTemperature::read_raw(CParser & parser)
break;
}
// members that must be defined
if (equalIncrements_defined == false)
if (check)
{
parser.incr_input_error();
parser.
error_msg
("Equal_increments not defined for REACTION_TEMPERATURE_RAW input.",
PHRQ_io::OT_CONTINUE);
}
if (countTemps_defined == false)
{
parser.incr_input_error();
parser.
error_msg
("Count_temps not defined for REACTION_TEMPERATURE_RAW input.",
PHRQ_io::OT_CONTINUE);
if (equalIncrements_defined == false)
{
parser.incr_input_error();
parser.
error_msg
("Equal_increments not defined for REACTION_TEMPERATURE_RAW input.",
PHRQ_io::OT_CONTINUE);
}
if (countTemps_defined == false)
{
parser.incr_input_error();
parser.
error_msg
("Count_temps not defined for REACTION_TEMPERATURE_RAW input.",
PHRQ_io::OT_CONTINUE);
}
}
}
/* ---------------------------------------------------------------------- */

View File

@ -20,7 +20,7 @@ class cxxTemperature:public cxxNumKeyword
void dump_raw(std::ostream & s_oss, unsigned int indent, int *n_out=NULL) const;
void read_raw(CParser & parser);
void read_raw(CParser & parser, bool check = false);
int read(CParser & parser);
LDBLE Temperature_for_step(int step_number);
std::vector<LDBLE> & Get_temps(void) {return temps;}

View File

@ -355,6 +355,9 @@ read_input(void)
case Keywords::KEY_REACTION_MODIFY:
Utilities::Rxn_read_modify(Rxn_reaction_map, Rxn_new_reaction, this);
break;
case Keywords::KEY_REACTION_TEMPERATURE_MODIFY:
Utilities::Rxn_read_modify(Rxn_temperature_map, Rxn_new_temperature, this);
break;
//case LAST_C_KEYWORD + 22: //reaction_temperature_modify
// keyword[LAST_C_KEYWORD + 22].keycount++;
// read_reaction_temperature_modify();
@ -365,6 +368,9 @@ read_input(void)
case Keywords::KEY_REACTION_PRESSURE_RAW:
Utilities::Rxn_read_raw(Rxn_pressure_map, Rxn_new_pressure, this);
break;
case Keywords::KEY_REACTION_PRESSURE_MODIFY:
Utilities::Rxn_read_modify(Rxn_pressure_map, Rxn_new_pressure, this);
break;
default:
error_msg("Error in keyword switch", STOP);
break;