Getting there with adding REACTION_PRESSURE capabilities.

Still need to look at copy, dump, and maybe others.

git-svn-id: svn://136.177.114.72/svn_GW/phreeqcpp/branches/ErrorHandling@5844 1feff8c3-07ed-0310-ac33-dd36852eb9cd
This commit is contained in:
David L Parkhurst 2011-12-01 22:08:35 +00:00
parent 8a678fa9e7
commit 4a7158c44b
7 changed files with 127 additions and 4 deletions

View File

@ -351,4 +351,59 @@ cxxPressure::dump_xml(std::ostream & s_oss, unsigned int indent) const const
return;
}
#endif
#endif
/* ---------------------------------------------------------------------- */
LDBLE cxxPressure::
Pressure_for_step(int step_number)
/* ---------------------------------------------------------------------- */
{
/*
* Determine pressure of reaction step
*/
LDBLE p_temp;
if (this->pressures.size() == 0)
{
p_temp = 1;
}
else if (this->equalIncrements)
{
if (this->pressures.size() != 2)
{
error_msg("Number of pressures not equal to 2 for equal increments.", 0);
}
if (step_number > this->count)
{
p_temp = this->pressures[1];
}
else
{
LDBLE denom;
denom = (this->count <= 1) ? 1 : (LDBLE) (this->count - 1);
p_temp = this->pressures[0] + ( this->pressures[1] - this->pressures[0]) *
((LDBLE) (step_number - 1)) / (denom);
}
}
else
{
if (step_number > (int) this->pressures.size())
{
p_temp = this->pressures[this->pressures.size() - 1];
}
else
{
p_temp = this->pressures[step_number - 1];
}
}
return (p_temp);
}
int cxxPressure::
Get_count(void) const
{
if (equalIncrements)
{
return this->count;
}
return (int) this->pressures.size();
}

View File

@ -22,9 +22,9 @@ class cxxPressure:public cxxNumKeyword
int read(CParser & parser);
void read_raw(CParser & parser);
LDBLE Pressure_for_step(int step_number);
std::vector<double> & Get_pressures(void) {return pressures;};
int Get_count(void) const {return count;};
int Get_count(void) const;
void Set_count(int i) {count = i;};
bool Get_equalIncrements(void) const {return equalIncrements;};
void Set_equalIncrements(bool tf) {equalIncrements = tf;};

View File

@ -2281,6 +2281,14 @@ run_as_cells(void)
if (abs(use.temperature_ptr->count_t) > count_steps)
count_steps = abs(use.temperature_ptr->count_t);
}
if (use.pressure_in == TRUE && use.pressure_ptr != NULL)
{
int count = ((cxxPressure *) use.pressure_ptr)->Get_count();
if (count > count_steps)
{
count_steps = count;
}
}
count_total_steps = count_steps;
/*
* save data for saving solutions

View File

@ -268,6 +268,7 @@ cxxStorageBin::Get_Temperature(int n_user)
}
return (NULL);
}
void
cxxStorageBin::Set_Temperature(int n_user, cxxTemperature * entity)
{
@ -275,12 +276,33 @@ cxxStorageBin::Set_Temperature(int n_user, cxxTemperature * entity)
return;
Temperatures[n_user] = *entity;
}
void
cxxStorageBin::Remove_Temperature(int n_user)
{
Temperatures.erase(n_user);
}
cxxPressure *
cxxStorageBin::Get_Pressure(int n_user)
{
return Utilities::Reactant_find(this->Pressures, n_user);
}
void
cxxStorageBin::Set_Pressure(int n_user, cxxPressure * entity)
{
if (entity == NULL)
return;
Pressures[n_user] = *entity;
}
void
cxxStorageBin::Remove_Pressure(int n_user)
{
Pressures.erase(n_user);
}
const std::map < int, cxxSolution > &
cxxStorageBin::Get_Solutions() const
{
@ -331,7 +353,11 @@ cxxStorageBin::Get_Temperatures() const
{
return this->Temperatures;
}
const std::map < int, cxxPressure > &
cxxStorageBin::Get_Pressures() const
{
return this->Pressures;
}
#ifdef SKIP
void
cxxStorageBin::dump_xml(std::ostream & s_oss, unsigned int indent) const const
@ -827,6 +853,9 @@ cxxStorageBin::Remove(int n)
// Temperature
this->Temperatures.erase(n);
// Pressure
this->Pressures.erase(n);
}
void
cxxStorageBin::Clear(void)
@ -862,6 +891,9 @@ cxxStorageBin::Clear(void)
// Temperature
this->Temperatures.clear();
// Pressure
this->Pressures.clear();
}
#ifdef SKIP
cxxSolution *
@ -1490,6 +1522,15 @@ cxxStorageBin::Set_System(struct Use *use_ptr)
this->system.Set_Temperature(&(it->second));
}
}
// reaction pressure
if (use_ptr->pressure_ptr != NULL)
{
cxxPressure * p = Utilities::Reactant_find(this->Pressures, use_ptr->n_pressure_user);
if (p != NULL)
{
this->system.Set_Pressure(p);
}
}
}
void
cxxStorageBin::Set_System(int i)
@ -1578,4 +1619,9 @@ cxxStorageBin::Set_System(int i)
this->system.Set_Temperature(&(it->second));
}
}
// reaction pressure
{
this->system.Set_Pressure(Utilities::Reactant_find(this->Pressures, i));
}
}

View File

@ -72,6 +72,10 @@ class cxxStorageBin: public PHRQ_base
void Set_Temperature(int n_user, cxxTemperature * entity);
void Remove_Temperature(int n_user);
cxxPressure *Get_Pressure(int n_user);
void Set_Pressure(int n_user, cxxPressure * entity);
void Remove_Pressure(int n_user);
cxxSystem &Get_System(void);
void Set_System(struct Use *use_ptr);
void Set_System(int i);
@ -98,6 +102,7 @@ class cxxStorageBin: public PHRQ_base
const std::map < int, cxxMix > &Get_Mixes() const;
const std::map < int, cxxReaction > &Get_Reactions() const;
const std::map < int, cxxTemperature > &Get_Temperatures() const;
const std::map < int, cxxPressure > &Get_Pressures() const;
cxxSystem & Get_system(void) {return system;};
#ifdef USE_MPI
@ -122,6 +127,7 @@ class cxxStorageBin: public PHRQ_base
std::map < int, cxxMix > Mixes;
std::map < int, cxxReaction > Reactions;
std::map < int, cxxTemperature > Temperatures;
std::map < int, cxxPressure > Pressures;
cxxSystem system;
};

View File

@ -29,6 +29,7 @@ PHRQ_base(io)
this->mix = NULL;
this->reaction = NULL;
this->temperature = NULL;
this->pressure = NULL;
}
cxxSystem::~cxxSystem(void)
{
@ -46,6 +47,7 @@ cxxSystem::Initialize(void)
this->mix = NULL;
this->reaction = NULL;
this->temperature = NULL;
this->pressure = NULL;
}
void
cxxSystem::totalize(PHREEQC_PTR_ARG)

View File

@ -22,6 +22,7 @@ class cxxSSassemblage;
class cxxSurface;
class cxxReaction;
class cxxTemperature;
class cxxPressure;
class cxxMix;
class cxxSystem: public PHRQ_base
@ -70,6 +71,10 @@ public:
{
this->temperature = entity;
}
void Set_Pressure(cxxPressure * entity)
{
this->pressure = entity;
}
void totalize(PHREEQC_PTR_ARG);
cxxNameDouble &Get_Totals(void)
{
@ -87,6 +92,7 @@ protected:
cxxMix * mix;
cxxReaction * reaction;
cxxTemperature * temperature;
cxxPressure * pressure;
cxxNameDouble totals;
};