mirror of
https://git.gfz-potsdam.de/naaice/iphreeqc.git
synced 2025-12-16 08:38:23 +01:00
Merge commit '62c51bb410b3f9fd18cc5a21b5341e9652089d86'
This commit is contained in:
commit
606942c6ed
@ -1443,6 +1443,7 @@ listtokens(FILE * f, tokenrec * l_buf)
|
|||||||
output_msg("TRIM");
|
output_msg("TRIM");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case tokpad_:
|
||||||
case tokpad:
|
case tokpad:
|
||||||
output_msg("PAD");
|
output_msg("PAD");
|
||||||
break;
|
break;
|
||||||
@ -2639,6 +2640,7 @@ factor(struct LOC_exec * LINK)
|
|||||||
n.UU.sval = (parse_all) ? PhreeqcPtr->string_duplicate("unknown") : PhreeqcPtr->iso_unit(STR1.c_str());
|
n.UU.sval = (parse_all) ? PhreeqcPtr->string_duplicate("unknown") : PhreeqcPtr->iso_unit(STR1.c_str());
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case tokpad_:
|
||||||
case tokpad:
|
case tokpad:
|
||||||
n.stringval = true;
|
n.stringval = true;
|
||||||
require(toklp, LINK);
|
require(toklp, LINK);
|
||||||
@ -2664,145 +2666,157 @@ factor(struct LOC_exec * LINK)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case toksys:
|
case toksys:
|
||||||
require(toklp, LINK);
|
|
||||||
elt_name = stringfactor(STR1, LINK);
|
|
||||||
/*
|
|
||||||
* Parse arguments
|
|
||||||
*/
|
|
||||||
if (LINK->t != NULL && LINK->t->kind == tokcomma)
|
|
||||||
{
|
{
|
||||||
/* return number of species */
|
int isort = 0;
|
||||||
LINK->t = LINK->t->next;
|
require(toklp, LINK);
|
||||||
count_varrec = LINK->t->UU.vp;
|
elt_name = stringfactor(STR1, LINK);
|
||||||
if (LINK->t->kind != tokvar || !count_varrec || count_varrec->stringvar != 0)
|
/*
|
||||||
|
* Parse arguments
|
||||||
|
*/
|
||||||
|
if (LINK->t != NULL && LINK->t->kind == tokcomma)
|
||||||
{
|
{
|
||||||
snerr(": can`t find variable");
|
/* return number of species */
|
||||||
#if !defined(R_SO)
|
LINK->t = LINK->t->next;
|
||||||
exit(4);
|
count_varrec = LINK->t->UU.vp;
|
||||||
#endif
|
if (LINK->t->kind != tokvar || !count_varrec || count_varrec->stringvar != 0)
|
||||||
|
{
|
||||||
|
snerr(": can`t find variable");
|
||||||
|
#if !defined(R_SO)
|
||||||
|
exit(4);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return number of names of species */
|
||||||
|
LINK->t = LINK->t->next;
|
||||||
|
require(tokcomma, LINK);
|
||||||
|
names_varrec = LINK->t->UU.vp;
|
||||||
|
if (LINK->t->kind != tokvar || !names_varrec || names_varrec->stringvar != 1)
|
||||||
|
{
|
||||||
|
snerr(": can`t find name of species");
|
||||||
|
#if !defined(R_SO)
|
||||||
|
exit(4);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return number of types of species */
|
||||||
|
LINK->t = LINK->t->next;
|
||||||
|
require(tokcomma, LINK);
|
||||||
|
types_varrec = LINK->t->UU.vp;
|
||||||
|
if (LINK->t->kind != tokvar || types_varrec->stringvar != 1)
|
||||||
|
snerr(": can`t find type of species");
|
||||||
|
|
||||||
|
/* return number of moles of species */
|
||||||
|
LINK->t = LINK->t->next;
|
||||||
|
require(tokcomma, LINK);
|
||||||
|
moles_varrec = LINK->t->UU.vp;
|
||||||
|
if (LINK->t->kind != tokvar || moles_varrec->stringvar != 0)
|
||||||
|
snerr(": can`t find moles of species");
|
||||||
|
LINK->t = LINK->t->next;
|
||||||
|
if (LINK->t != NULL && LINK->t->kind == tokcomma)
|
||||||
|
{
|
||||||
|
LINK->t = LINK->t->next;
|
||||||
|
isort = intexpr(LINK);
|
||||||
|
arg_num = 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arg_num = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
arg_num = 1;
|
||||||
|
}
|
||||||
|
require(tokrp, LINK);
|
||||||
|
|
||||||
|
if (arg_num > 1)
|
||||||
|
{
|
||||||
|
free_dim_stringvar(names_varrec);
|
||||||
|
free_dim_stringvar(types_varrec);
|
||||||
|
PhreeqcPtr->free_check_null(moles_varrec->UU.U0.arr);
|
||||||
|
moles_varrec->UU.U0.arr = NULL;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Call subroutine
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
n.UU.val = system_total(elt_name, count_varrec->UU.U0.val, &(names_varrec->UU.U1.sarr), &(types_varrec->UU.U1.sarr), &(moles_varrec->UU.U0.arr));
|
||||||
|
*/
|
||||||
|
if (parse_all)
|
||||||
|
{
|
||||||
|
PhreeqcPtr->sys_tot = 0;
|
||||||
|
PhreeqcPtr->count_sys = 1000;
|
||||||
|
int count_sys = PhreeqcPtr->count_sys;
|
||||||
|
names_arg = (char**)PhreeqcPtr->PHRQ_calloc((size_t)(count_sys + 1), sizeof(char*));
|
||||||
|
if (names_arg == NULL)
|
||||||
|
{
|
||||||
|
PhreeqcPtr->malloc_error();
|
||||||
|
#if !defined(R_SO)
|
||||||
|
exit(4);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
types_arg = (char**)PhreeqcPtr->PHRQ_calloc((size_t)(count_sys + 1), sizeof(char*));
|
||||||
|
if (types_arg == NULL)
|
||||||
|
{
|
||||||
|
PhreeqcPtr->malloc_error();
|
||||||
|
#if !defined(R_SO)
|
||||||
|
exit(4);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
moles_arg = (LDBLE*)PhreeqcPtr->PHRQ_calloc((size_t)(count_sys + 1), sizeof(LDBLE));
|
||||||
|
if (moles_arg == NULL)
|
||||||
|
{
|
||||||
|
PhreeqcPtr->malloc_error();
|
||||||
|
#if !defined(R_SO)
|
||||||
|
exit(4);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
names_arg[0] = NULL;
|
||||||
|
types_arg[0] = NULL;
|
||||||
|
moles_arg[0] = 0;
|
||||||
|
count_species = (LDBLE)count_sys;
|
||||||
|
n.UU.val = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
n.UU.val = PhreeqcPtr->system_total(elt_name, &count_species, &(names_arg),
|
||||||
|
&(types_arg), &(moles_arg), isort);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return number of names of species */
|
/*
|
||||||
LINK->t = LINK->t->next;
|
* fill in varrec structure
|
||||||
require(tokcomma, LINK);
|
*/
|
||||||
names_varrec = LINK->t->UU.vp;
|
if (arg_num > 1)
|
||||||
if (LINK->t->kind != tokvar || !names_varrec || names_varrec->stringvar != 1)
|
|
||||||
{
|
{
|
||||||
snerr(": can`t find name of species");
|
*count_varrec->UU.U0.val = count_species;
|
||||||
#if !defined(R_SO)
|
names_varrec->UU.U1.sarr = names_arg;
|
||||||
exit(4);
|
types_varrec->UU.U1.sarr = types_arg;
|
||||||
#endif
|
moles_varrec->UU.U0.arr = moles_arg;
|
||||||
}
|
|
||||||
|
|
||||||
/* return number of types of species */
|
for (i = 0; i < maxdims; i++)
|
||||||
LINK->t = LINK->t->next;
|
{
|
||||||
require(tokcomma, LINK);
|
names_varrec->dims[i] = 0;
|
||||||
types_varrec = LINK->t->UU.vp;
|
types_varrec->dims[i] = 0;
|
||||||
if (LINK->t->kind != tokvar || types_varrec->stringvar != 1)
|
moles_varrec->dims[i] = 0;
|
||||||
snerr(": can`t find type of species");
|
}
|
||||||
|
names_varrec->dims[0] = (long)(*count_varrec->UU.U0.val) + 1;
|
||||||
/* return number of moles of species */
|
types_varrec->dims[0] = (long)(*count_varrec->UU.U0.val) + 1;
|
||||||
LINK->t = LINK->t->next;
|
moles_varrec->dims[0] = (long)(*count_varrec->UU.U0.val) + 1;
|
||||||
require(tokcomma, LINK);
|
names_varrec->numdims = 1;
|
||||||
moles_varrec = LINK->t->UU.vp;
|
types_varrec->numdims = 1;
|
||||||
if (LINK->t->kind != tokvar || moles_varrec->stringvar != 0)
|
moles_varrec->numdims = 1;
|
||||||
snerr(": can`t find moles of species");
|
|
||||||
LINK->t = LINK->t->next;
|
|
||||||
arg_num = 4;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
arg_num = 1;
|
|
||||||
}
|
|
||||||
require(tokrp, LINK);
|
|
||||||
|
|
||||||
if (arg_num > 1)
|
|
||||||
{
|
|
||||||
free_dim_stringvar(names_varrec);
|
|
||||||
free_dim_stringvar(types_varrec);
|
|
||||||
PhreeqcPtr->free_check_null(moles_varrec->UU.U0.arr);
|
|
||||||
moles_varrec->UU.U0.arr = NULL;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* Call subroutine
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
n.UU.val = system_total(elt_name, count_varrec->UU.U0.val, &(names_varrec->UU.U1.sarr), &(types_varrec->UU.U1.sarr), &(moles_varrec->UU.U0.arr));
|
|
||||||
*/
|
|
||||||
if (parse_all)
|
|
||||||
{
|
|
||||||
PhreeqcPtr->sys_tot = 0;
|
|
||||||
PhreeqcPtr->count_sys = 1000;
|
|
||||||
int count_sys = PhreeqcPtr->count_sys;
|
|
||||||
names_arg = (char **) PhreeqcPtr->PHRQ_calloc((size_t) (count_sys + 1), sizeof(char *));
|
|
||||||
if (names_arg == NULL)
|
|
||||||
{
|
|
||||||
PhreeqcPtr->malloc_error();
|
|
||||||
#if !defined(R_SO)
|
|
||||||
exit(4);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
types_arg = (char **)PhreeqcPtr->PHRQ_calloc((size_t) (count_sys + 1), sizeof(char *));
|
else
|
||||||
if (types_arg == NULL)
|
|
||||||
{
|
{
|
||||||
PhreeqcPtr->malloc_error();
|
for (i = 0; i < count_species + 1; i++)
|
||||||
#if !defined(R_SO)
|
{
|
||||||
exit(4);
|
PhreeqcPtr->free_check_null(names_arg[i]);
|
||||||
#endif
|
PhreeqcPtr->free_check_null(types_arg[i]);
|
||||||
|
}
|
||||||
|
PhreeqcPtr->free_check_null(names_arg);
|
||||||
|
PhreeqcPtr->free_check_null(types_arg);
|
||||||
|
PhreeqcPtr->free_check_null(moles_arg);
|
||||||
}
|
}
|
||||||
moles_arg = (LDBLE *) PhreeqcPtr->PHRQ_calloc((size_t) (count_sys + 1), sizeof(LDBLE));
|
|
||||||
if (moles_arg == NULL)
|
|
||||||
{
|
|
||||||
PhreeqcPtr->malloc_error();
|
|
||||||
#if !defined(R_SO)
|
|
||||||
exit(4);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
names_arg[0] = NULL;
|
|
||||||
types_arg[0] = NULL;
|
|
||||||
moles_arg[0] = 0;
|
|
||||||
count_species = (LDBLE) count_sys;
|
|
||||||
n.UU.val = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
n.UU.val = PhreeqcPtr->system_total(elt_name, &count_species, &(names_arg),
|
|
||||||
&(types_arg), &(moles_arg));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fill in varrec structure
|
|
||||||
*/
|
|
||||||
if (arg_num > 1)
|
|
||||||
{
|
|
||||||
*count_varrec->UU.U0.val = count_species;
|
|
||||||
names_varrec->UU.U1.sarr = names_arg;
|
|
||||||
types_varrec->UU.U1.sarr = types_arg;
|
|
||||||
moles_varrec->UU.U0.arr = moles_arg;
|
|
||||||
|
|
||||||
for (i = 0; i < maxdims; i++)
|
|
||||||
{
|
|
||||||
names_varrec->dims[i] = 0;
|
|
||||||
types_varrec->dims[i] = 0;
|
|
||||||
moles_varrec->dims[i] = 0;
|
|
||||||
}
|
|
||||||
names_varrec->dims[0] = (long) (*count_varrec->UU.U0.val) + 1;
|
|
||||||
types_varrec->dims[0] = (long) (*count_varrec->UU.U0.val) + 1;
|
|
||||||
moles_varrec->dims[0] = (long) (*count_varrec->UU.U0.val) + 1;
|
|
||||||
names_varrec->numdims = 1;
|
|
||||||
types_varrec->numdims = 1;
|
|
||||||
moles_varrec->numdims = 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (i = 0; i < count_species + 1; i++)
|
|
||||||
{
|
|
||||||
PhreeqcPtr->free_check_null(names_arg[i]);
|
|
||||||
PhreeqcPtr->free_check_null(types_arg[i]);
|
|
||||||
}
|
|
||||||
PhreeqcPtr->free_check_null(names_arg);
|
|
||||||
PhreeqcPtr->free_check_null(types_arg);
|
|
||||||
PhreeqcPtr->free_check_null(moles_arg);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -7415,6 +7429,7 @@ const std::map<const std::string, PBasic::BASIC_TOKEN>::value_type temp_tokens[]
|
|||||||
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("rtrim", PBasic::tokrtrim),
|
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("rtrim", PBasic::tokrtrim),
|
||||||
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("trim", PBasic::toktrim),
|
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("trim", PBasic::toktrim),
|
||||||
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("pad", PBasic::tokpad),
|
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("pad", PBasic::tokpad),
|
||||||
|
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("pad$", PBasic::tokpad_),
|
||||||
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("rxn", PBasic::tokrxn),
|
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("rxn", PBasic::tokrxn),
|
||||||
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("dist", PBasic::tokdist),
|
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("dist", PBasic::tokdist),
|
||||||
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("mol", PBasic::tokmol),
|
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type("mol", PBasic::tokmol),
|
||||||
|
|||||||
@ -272,6 +272,7 @@ public:
|
|||||||
tokrtrim,
|
tokrtrim,
|
||||||
toktrim,
|
toktrim,
|
||||||
tokpad,
|
tokpad,
|
||||||
|
tokpad_,
|
||||||
tokchange_por,
|
tokchange_por,
|
||||||
tokget_por,
|
tokget_por,
|
||||||
tokosmotic,
|
tokosmotic,
|
||||||
|
|||||||
@ -151,8 +151,9 @@ public:
|
|||||||
LDBLE surf_total(const char *total_name, const char *surface_name);
|
LDBLE surf_total(const char *total_name, const char *surface_name);
|
||||||
LDBLE surf_total_no_redox(const char *total_name, const char *surface_name);
|
LDBLE surf_total_no_redox(const char *total_name, const char *surface_name);
|
||||||
static int system_species_compare(const void *ptr1, const void *ptr2);
|
static int system_species_compare(const void *ptr1, const void *ptr2);
|
||||||
|
static int system_species_compare_name(const void* ptr1, const void* ptr2);
|
||||||
LDBLE system_total(const char *total_name, LDBLE * count, char ***names,
|
LDBLE system_total(const char *total_name, LDBLE * count, char ***names,
|
||||||
char ***types, LDBLE ** moles);
|
char ***types, LDBLE ** moles, int i);
|
||||||
std::string kinetics_formula(std::string kinetics_name, cxxNameDouble &stoichiometry);
|
std::string kinetics_formula(std::string kinetics_name, cxxNameDouble &stoichiometry);
|
||||||
std::string phase_formula(std::string phase_name, cxxNameDouble &stoichiometry);
|
std::string phase_formula(std::string phase_name, cxxNameDouble &stoichiometry);
|
||||||
std::string species_formula(std::string phase_name, cxxNameDouble &stoichiometry);
|
std::string species_formula(std::string phase_name, cxxNameDouble &stoichiometry);
|
||||||
|
|||||||
@ -2980,7 +2980,7 @@ edl_species(const char *surf_name, LDBLE * count, char ***names, LDBLE ** moles,
|
|||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
LDBLE Phreeqc::
|
LDBLE Phreeqc::
|
||||||
system_total(const char *total_name, LDBLE * count, char ***names,
|
system_total(const char *total_name, LDBLE * count, char ***names,
|
||||||
char ***types, LDBLE ** moles)
|
char ***types, LDBLE ** moles, int isort)
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
@ -3043,11 +3043,16 @@ system_total(const char *total_name, LDBLE * count, char ***names,
|
|||||||
/*
|
/*
|
||||||
* Sort system species
|
* Sort system species
|
||||||
*/
|
*/
|
||||||
if (count_sys > 1)
|
if (count_sys > 1 && isort == 0)
|
||||||
{
|
{
|
||||||
qsort(sys, (size_t) count_sys,
|
qsort(sys, (size_t) count_sys,
|
||||||
(size_t) sizeof(struct system_species), system_species_compare);
|
(size_t) sizeof(struct system_species), system_species_compare);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qsort(sys, (size_t)count_sys,
|
||||||
|
(size_t)sizeof(struct system_species), system_species_compare_name);
|
||||||
|
}
|
||||||
/*
|
/*
|
||||||
* malloc space
|
* malloc space
|
||||||
*/
|
*/
|
||||||
@ -4211,6 +4216,16 @@ system_species_compare(const void *ptr1, const void *ptr2)
|
|||||||
return (-1);
|
return (-1);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
int Phreeqc::
|
||||||
|
system_species_compare_name(const void* ptr1, const void* ptr2)
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
{
|
||||||
|
const struct system_species* a, * b;
|
||||||
|
|
||||||
|
a = (const struct system_species*)ptr1;
|
||||||
|
b = (const struct system_species*)ptr2;
|
||||||
|
return (strncmp(a->name, b->name, MAX_LENGTH));
|
||||||
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
int Phreeqc::
|
int Phreeqc::
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user