@@ -1548,6 +1548,14 @@ listtokens(FILE * f, tokenrec * l_buf)
1548
1548
case tokspecies_formula_:
1549
1549
output_msg (" SPECIES_FORMULA$" );
1550
1550
break ;
1551
+ case tokphase_equation:
1552
+ case tokphase_equation_:
1553
+ output_msg (" PHASE_EQUATION$" );
1554
+ break ;
1555
+ case tokspecies_equation:
1556
+ case tokspecies_equation_:
1557
+ output_msg (" SPECIES_EQUATION$" );
1558
+ break ;
1551
1559
case toksr:
1552
1560
output_msg (" SR" );
1553
1561
break ;
@@ -4080,6 +4088,202 @@ factor(struct LOC_exec * LINK)
4080
4088
}
4081
4089
break ;
4082
4090
4091
+ case tokphase_equation:
4092
+ case tokphase_equation_:
4093
+ {
4094
+ require (toklp, LINK);
4095
+ std::string phase_name (stringfactor (STR1, LINK));
4096
+ varrec* elts_varrec = NULL , * coef_varrec = NULL ;
4097
+ std::vector<std::pair<std::string, double > > stoichiometry;
4098
+ /*
4099
+ * Parse arguments
4100
+ */
4101
+ require (tokcomma, LINK);
4102
+
4103
+ count_varrec = LINK->t ->UU .vp ;
4104
+ if (LINK->t ->kind != tokvar || count_varrec->stringvar != 0 )
4105
+ snerr (" : Cannot find count variable" );
4106
+
4107
+ /* return number of names of species */
4108
+ LINK->t = LINK->t ->next ;
4109
+ require (tokcomma, LINK);
4110
+ elts_varrec = LINK->t ->UU .vp ;
4111
+ if (LINK->t ->kind != tokvar || elts_varrec->stringvar != 1 )
4112
+ snerr (" : Cannot find species string variable" );
4113
+
4114
+ /* return coefficients of species */
4115
+ LINK->t = LINK->t ->next ;
4116
+ require (tokcomma, LINK);
4117
+ coef_varrec = LINK->t ->UU .vp ;
4118
+ if (LINK->t ->kind != tokvar || coef_varrec->stringvar != 0 )
4119
+ snerr (" : Cannot find coefficient variable" );
4120
+ LINK->t = LINK->t ->next ;
4121
+
4122
+ require (tokrp, LINK);
4123
+
4124
+ free_dim_stringvar (elts_varrec);
4125
+ PhreeqcPtr->free_check_null (coef_varrec->UU .U0 .arr );
4126
+ coef_varrec->UU .U0 .arr = NULL ;
4127
+ /*
4128
+ * Call subroutine
4129
+ */
4130
+ std::string eq = PhreeqcPtr->phase_equation (phase_name, stoichiometry);
4131
+
4132
+ // put type as return value
4133
+ n.stringval = true ;
4134
+ n.UU .sval = PhreeqcPtr->string_duplicate (eq.c_str ());
4135
+
4136
+ /*
4137
+ * fill in varrec structure
4138
+ */
4139
+
4140
+ size_t count = stoichiometry.size ();
4141
+ *count_varrec->UU .U0 .val = (LDBLE)count;
4142
+ /*
4143
+ * malloc space
4144
+ */
4145
+ elts_varrec->UU .U1 .sarr = (char **)PhreeqcPtr->PHRQ_malloc ((count + 1 ) * sizeof (char *));
4146
+ if (elts_varrec->UU .U1 .sarr == NULL )
4147
+ {
4148
+ PhreeqcPtr->malloc_error ();
4149
+ #if !defined(R_SO)
4150
+ exit (4 );
4151
+ #endif
4152
+ }
4153
+ coef_varrec->UU .U0 .arr = (LDBLE*)PhreeqcPtr->PHRQ_malloc ((count + 1 ) * sizeof (LDBLE));
4154
+ if (coef_varrec->UU .U0 .arr == NULL )
4155
+ {
4156
+ PhreeqcPtr->malloc_error ();
4157
+ #if !defined(R_SO)
4158
+ exit (4 );
4159
+ #endif
4160
+ }
4161
+
4162
+ // first position not used
4163
+ elts_varrec->UU .U1 .sarr [0 ] = NULL ;
4164
+ coef_varrec->UU .U0 .arr [0 ] = 0 ;
4165
+
4166
+ // set dims for Basic array
4167
+ for (i = 0 ; i < maxdims; i++)
4168
+ {
4169
+ elts_varrec->dims [i] = 0 ;
4170
+ coef_varrec->dims [i] = 0 ;
4171
+ }
4172
+ // set dims for first dimension and number of dims
4173
+ elts_varrec->dims [0 ] = (long )(count + 1 );
4174
+ coef_varrec->dims [0 ] = (long )(count + 1 );
4175
+ elts_varrec->numdims = 1 ;
4176
+ coef_varrec->numdims = 1 ;
4177
+
4178
+ // fill in arrays
4179
+ i = 1 ;
4180
+ for (std::vector<std::pair<std::string, double > >::iterator it = stoichiometry.begin (); it != stoichiometry.end (); it++)
4181
+ {
4182
+ elts_varrec->UU .U1 .sarr [i] = PhreeqcPtr->string_duplicate ((it->first ).c_str ());
4183
+ coef_varrec->UU .U0 .arr [i] = it->second ;
4184
+ i++;
4185
+ }
4186
+ }
4187
+ break ;
4188
+
4189
+ case tokspecies_equation:
4190
+ case tokspecies_equation_:
4191
+ {
4192
+ require (toklp, LINK);
4193
+ std::string species_name (stringfactor (STR1, LINK));
4194
+ varrec* elts_varrec = NULL , * coef_varrec = NULL ;
4195
+ std::vector<std::pair<std::string, double > > stoichiometry;
4196
+ /*
4197
+ * Parse arguments
4198
+ */
4199
+ require (tokcomma, LINK);
4200
+
4201
+ count_varrec = LINK->t ->UU .vp ;
4202
+ if (LINK->t ->kind != tokvar || count_varrec->stringvar != 0 )
4203
+ snerr (" : Cannot find count variable" );
4204
+
4205
+ /* return number of names of species */
4206
+ LINK->t = LINK->t ->next ;
4207
+ require (tokcomma, LINK);
4208
+ elts_varrec = LINK->t ->UU .vp ;
4209
+ if (LINK->t ->kind != tokvar || elts_varrec->stringvar != 1 )
4210
+ snerr (" : Cannot find species string variable" );
4211
+
4212
+ /* return coefficients of species */
4213
+ LINK->t = LINK->t ->next ;
4214
+ require (tokcomma, LINK);
4215
+ coef_varrec = LINK->t ->UU .vp ;
4216
+ if (LINK->t ->kind != tokvar || coef_varrec->stringvar != 0 )
4217
+ snerr (" : Cannot find coefficient variable" );
4218
+ LINK->t = LINK->t ->next ;
4219
+
4220
+ require (tokrp, LINK);
4221
+
4222
+ free_dim_stringvar (elts_varrec);
4223
+ PhreeqcPtr->free_check_null (coef_varrec->UU .U0 .arr );
4224
+ coef_varrec->UU .U0 .arr = NULL ;
4225
+ /*
4226
+ * Call subroutine
4227
+ */
4228
+ std::string eq = PhreeqcPtr->species_equation (species_name, stoichiometry);
4229
+
4230
+ // put type as return value
4231
+ n.stringval = true ;
4232
+ n.UU .sval = PhreeqcPtr->string_duplicate (eq.c_str ());
4233
+
4234
+ /*
4235
+ * fill in varrec structure
4236
+ */
4237
+
4238
+ size_t count = stoichiometry.size ();
4239
+ *count_varrec->UU .U0 .val = (LDBLE)count;
4240
+ /*
4241
+ * malloc space
4242
+ */
4243
+ elts_varrec->UU .U1 .sarr = (char **)PhreeqcPtr->PHRQ_malloc ((count + 1 ) * sizeof (char *));
4244
+ if (elts_varrec->UU .U1 .sarr == NULL )
4245
+ {
4246
+ PhreeqcPtr->malloc_error ();
4247
+ #if !defined(R_SO)
4248
+ exit (4 );
4249
+ #endif
4250
+ }
4251
+ coef_varrec->UU .U0 .arr = (LDBLE*)PhreeqcPtr->PHRQ_malloc ((count + 1 ) * sizeof (LDBLE));
4252
+ if (coef_varrec->UU .U0 .arr == NULL )
4253
+ {
4254
+ PhreeqcPtr->malloc_error ();
4255
+ #if !defined(R_SO)
4256
+ exit (4 );
4257
+ #endif
4258
+ }
4259
+
4260
+ // first position not used
4261
+ elts_varrec->UU .U1 .sarr [0 ] = NULL ;
4262
+ coef_varrec->UU .U0 .arr [0 ] = 0 ;
4263
+
4264
+ // set dims for Basic array
4265
+ for (i = 0 ; i < maxdims; i++)
4266
+ {
4267
+ elts_varrec->dims [i] = 0 ;
4268
+ coef_varrec->dims [i] = 0 ;
4269
+ }
4270
+ // set dims for first dimension and number of dims
4271
+ elts_varrec->dims [0 ] = (long )(count + 1 );
4272
+ coef_varrec->dims [0 ] = (long )(count + 1 );
4273
+ elts_varrec->numdims = 1 ;
4274
+ coef_varrec->numdims = 1 ;
4275
+
4276
+ // fill in arrays
4277
+ i = 1 ;
4278
+ for (std::vector<std::pair<std::string, double > >::iterator it = stoichiometry.begin (); it != stoichiometry.end (); it++)
4279
+ {
4280
+ elts_varrec->UU .U1 .sarr [i] = PhreeqcPtr->string_duplicate ((it->first ).c_str ());
4281
+ coef_varrec->UU .U0 .arr [i] = it->second ;
4282
+ i++;
4283
+ }
4284
+ }
4285
+ break ;
4286
+
4083
4287
case toksr:
4084
4288
{
4085
4289
const char * str = stringfactor (STR1, LINK);
@@ -8088,6 +8292,10 @@ const std::map<const std::string, PBasic::BASIC_TOKEN>::value_type temp_tokens[]
8088
8292
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" soln_vol" , PBasic::toksoln_vol),
8089
8293
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" species_formula" , PBasic::tokspecies_formula),
8090
8294
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" species_formula$" , PBasic::tokspecies_formula_),
8295
+ std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" phase_equation" , PBasic::tokphase_equation),
8296
+ std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" phase_equation$" , PBasic::tokphase_equation_),
8297
+ std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" species_equation" , PBasic::tokspecies_equation),
8298
+ std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" species_equation$" , PBasic::tokspecies_equation_),
8091
8299
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" sr" , PBasic::toksr),
8092
8300
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" step_no" , PBasic::tokstep_no),
8093
8301
std::map<const std::string, PBasic::BASIC_TOKEN>::value_type (" str_e$" , PBasic::tokstr_e_),
0 commit comments