Added Basic functions GFW and SOLN_VOL.

Added test case gfw in mytest and added to Makefile

git-svn-id: svn://136.177.114.72/svn_GW/phreeqc3/trunk@6796 1feff8c3-07ed-0310-ac33-dd36852eb9cd
This commit is contained in:
David L Parkhurst 2012-07-18 19:15:04 +00:00
parent b0b007ca92
commit ad3e78e2f5
5 changed files with 59 additions and 4 deletions

View File

@ -1522,7 +1522,13 @@ listtokens(FILE * f, tokenrec * l_buf)
output_msg("QBrn"); // Q_Born, d(eps_r)/d(P)/(eps_r^2)
break;
case tokkappa:
output_msg("kappa"); // compressibility of pure water, d(rho)/d(P) / rho
output_msg("KAPPA"); // compressibility of pure water, d(rho)/d(P) / rho
break;
case tokgfw:
output_msg("GFW"); // gram formula weight of a formula
break;
case toksoln_vol:
output_msg("SOLN_VOL"); // volume of solution
break;
}
l_buf = l_buf->next;
@ -3099,6 +3105,17 @@ factor(struct LOC_exec * LINK)
case tokkappa:
n.UU.val = PhreeqcPtr->kappa_0;
break;
case tokgfw:
{
const char * str = stringfactor(STR1, LINK);
LDBLE gfw;
PhreeqcPtr->compute_gfw(str, &gfw);
n.UU.val = (parse_all) ? 1 : gfw;
}
break;
case toksoln_vol:
n.UU.val = (parse_all) ? 1 : PhreeqcPtr->calc_solution_volume();
break;
case toklog10:
n.UU.val = log10(realfactor(LINK));
break;
@ -6407,7 +6424,9 @@ const std::map<const std::string, PBasic::BASIC_TOKEN>::value_type temp_tokens[]
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("dh_b", PBasic::tokdh_b),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("dh_av", PBasic::tokdh_av),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("qbrn", PBasic::tokqbrn),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("kappa", PBasic::tokkappa)
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("kappa", PBasic::tokkappa),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("gfw", PBasic::tokgfw),
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("soln_vol", PBasic::toksoln_vol)
};
std::map<const std::string, PBasic::BASIC_TOKEN> PBasic::command_tokens(temp_tokens, temp_tokens + sizeof temp_tokens / sizeof temp_tokens[0]);

View File

@ -308,7 +308,9 @@ public:
tokdh_b,
tokdh_av,
tokqbrn,
tokkappa
tokkappa,
tokgfw,
toksoln_vol
};
#if !defined(PHREEQCI_GUI)

View File

@ -140,6 +140,8 @@ public:
static LDBLE f_rho(LDBLE rho_old, void *cookie);
static LDBLE f_Vm(LDBLE v1, void *cookie);
LDBLE calc_solution_volume(void);
// chart.cpp
#if defined PHREEQ98
void DeleteCurves(void);
@ -1651,7 +1653,6 @@ protected:
LDBLE dgdP; // dg / dP, pressure derivative of g-function, for supcrt calc'n of molal volume
#endif
LDBLE solution_mass, solution_volume;
LDBLE f_rho(LDBLE rho_old);
/* phqalloc.cpp ------------------------------- */
PHRQMemHeader *s_pTail;

View File

@ -395,6 +395,37 @@ f_rho(LDBLE rho_old, void *cookie)
return (rho - rho_old);
}
#endif
/* ---------------------------------------------------------------------- */
LDBLE Phreeqc::
calc_solution_volume(void)
/* ---------------------------------------------------------------------- */
{
/*
* Calculates solution volume based on sum of mass of element plus density
*/
LDBLE total_mass = 0;
LDBLE gfw;
compute_gfw("H", &gfw);
total_mass = total_h_x * gfw;
compute_gfw("O", &gfw);
total_mass += total_o_x * gfw;
for (int i = 0; i < count_master; i++)
{
if (master[i]->s->type != AQ) continue;
struct master *master_ptr = master[i];
if (master_ptr->primary == TRUE)
{
total_mass += master_ptr->total_primary * master_ptr->gfw;
//if (master_ptr->total_primary > 0)
// std::cerr << master_ptr->elt->name << " " << master_ptr->total_primary << "\n";
}
}
LDBLE rho = calc_dens();
LDBLE vol = 1e-3 * total_mass / rho;
return (vol);
}
/* DP: End function for interval halving */
/* ---------------------------------------------------------------------- */

View File

@ -2086,6 +2086,8 @@ print_totals(void)
(double) dens));
if (dens > 1.999) output_msg(sformatf("%18s\n", " (Program's limit)"));
else output_msg(sformatf("\n"));
output_msg(sformatf("%45s%9.5f\n", " Volume (L) = ",
(double) calc_solution_volume()));
}
/* VP: Density End */
output_msg(sformatf("%45s%7.3f\n", "Activity of water = ",