From fa7776b8feb7abeecd118858e4e77ba5601a4a89 Mon Sep 17 00:00:00 2001 From: David Parkhurst Date: Tue, 11 Dec 2018 17:17:49 -0700 Subject: [PATCH] added modify methods for restart files --- phreeqcpp/Phreeqc.h | 34 ++++++++++++++++++++++++++++++ phreeqcpp/StorageBin.cxx | 45 +++++++++++++++++++++++++++++++++++----- 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/phreeqcpp/Phreeqc.h b/phreeqcpp/Phreeqc.h index ed8003cb..4faf48d3 100644 --- a/phreeqcpp/Phreeqc.h +++ b/phreeqcpp/Phreeqc.h @@ -2244,6 +2244,40 @@ namespace Utilities return phreeqc_cookie->cleanup_after_parser(parser); } + template < typename T > + int SB_read_modify(std::map < int, T > &m, CParser &parser) + { + typename std::map < int, T >::iterator it; + + 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"; + //io->warning_msg(errstr.str().c_str()); + + // Don't throw, read data into dummy entity, then ignore + T entity; + entity_ptr = &entity; + entity_ptr->read_raw(parser, false); + return FALSE; + } + + 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()); + + return TRUE; + } + template < typename T > void Rxn_mix(std::map &mix_map, std::map < int, T > &entity_map, Phreeqc * phreeqc_cookie) { diff --git a/phreeqcpp/StorageBin.cxx b/phreeqcpp/StorageBin.cxx index 56663587..24e698d0 100644 --- a/phreeqcpp/StorageBin.cxx +++ b/phreeqcpp/StorageBin.cxx @@ -1006,6 +1006,11 @@ cxxStorageBin::read_raw(CParser & parser) Solutions[entity.Get_n_user()] = entity; } break; + case Keywords::KEY_SOLUTION_MODIFY: + { + Utilities::SB_read_modify(this->Solutions, parser); + } + break; case Keywords::KEY_EXCHANGE_RAW: { cxxExchange entity(this->Get_io()); @@ -1013,6 +1018,11 @@ cxxStorageBin::read_raw(CParser & parser) Exchangers[entity.Get_n_user()] = entity; } break; + case Keywords::KEY_EXCHANGE_MODIFY: + { + Utilities::SB_read_modify(this->Exchangers, parser); + } + break; case Keywords::KEY_GAS_PHASE_RAW: { cxxGasPhase entity(this->Get_io()); @@ -1020,6 +1030,11 @@ cxxStorageBin::read_raw(CParser & parser) GasPhases[entity.Get_n_user()] = entity; } break; + case Keywords::KEY_GAS_PHASE_MODIFY: + { + Utilities::SB_read_modify(this->GasPhases, parser); + } + break; case Keywords::KEY_KINETICS_RAW: { cxxKinetics entity(this->Get_io()); @@ -1027,7 +1042,11 @@ cxxStorageBin::read_raw(CParser & parser) Kinetics[entity.Get_n_user()] = entity; } break; - + case Keywords::KEY_KINETICS_MODIFY: + { + Utilities::SB_read_modify(this->Kinetics, parser); + } + break; case Keywords::KEY_EQUILIBRIUM_PHASES_RAW: { cxxPPassemblage entity(this->Get_io()); @@ -1035,7 +1054,11 @@ cxxStorageBin::read_raw(CParser & parser) PPassemblages[entity.Get_n_user()] = entity; } break; - + case Keywords::KEY_EQUILIBRIUM_PHASES_MODIFY: + { + Utilities::SB_read_modify(this->PPassemblages, parser); + } + break; case Keywords::KEY_SOLID_SOLUTIONS_RAW: { cxxSSassemblage entity; @@ -1043,7 +1066,11 @@ cxxStorageBin::read_raw(CParser & parser) SSassemblages[entity.Get_n_user()] = entity; } break; - + case Keywords::KEY_SOLID_SOLUTIONS_MODIFY: + { + Utilities::SB_read_modify(this->SSassemblages, parser); + } + break; case Keywords::KEY_SURFACE_RAW: { cxxSurface entity(this->Get_io()); @@ -1051,7 +1078,11 @@ cxxStorageBin::read_raw(CParser & parser) Surfaces[entity.Get_n_user()] = entity; } break; - + case Keywords::KEY_SURFACE_MODIFY: + { + Utilities::SB_read_modify(this->Surfaces, parser); + } + break; case Keywords::KEY_REACTION_TEMPERATURE_RAW: { cxxTemperature entity(this->Get_io()); @@ -1059,7 +1090,6 @@ cxxStorageBin::read_raw(CParser & parser) Temperatures[entity.Get_n_user()] = entity; } break; - case Keywords::KEY_REACTION_RAW: { cxxReaction entity; @@ -1067,6 +1097,11 @@ cxxStorageBin::read_raw(CParser & parser) Reactions[entity.Get_n_user()] = entity; } break; + case Keywords::KEY_REACTION_MODIFY: + { + Utilities::SB_read_modify(this->Reactions, parser); + } + break; case Keywords::KEY_MIX_RAW: { cxxMix entity;