#include #include #include #include int id; int vt[8]; double dv[8]; char sv[8][100]; char buffer[100]; struct MyData { double year; }; void ExtractWrite(int cell) { VAR v; int j; VarInit(&v); for (j = 0; j < 8; ++j) { GetSelectedOutputValue(id, 1, j, &v); vt[j] = v.type; switch (vt[j]) { case TT_DOUBLE: dv[j] = v.dVal; snprintf(sv[j], sizeof(sv[j]), "%23.15e", v.dVal); break; case TT_STRING: strcpy(sv[j], v.sVal); break; } VarClear(&v); } printf("Cell %d %d\n\tpH: %4.2f\tSR(calcite): %4.2f\n", cell, (int) dv[7], dv[5], dv[6]); } void EHandler(void) { OutputErrorString(id); exit(EXIT_FAILURE); } const char *ConCat(const char *str1, const char *str2) { strcpy(buffer, str1); return strcat(buffer, str2); } double MyCallback(double x1, double x2, const char * str1, void *mydata) { /* Use of a callback is optional. The callback provides a way to obtain data from a Basic program through the variables x1, x2, and str1, and send data to a Basic program through the return value of the callback. The void pointer mydata can be used to obtain data from the calling program; in this example, it points to a structure. The callback function is called whenever CALLBACK(x1, x2, str$) is used in a Basic program (usually USER_PUNCH). See file "ic". */ if (strcmp(str1, "Year") == 0) { fprintf(stderr, "\nCallback for cell %d: pH %8.2f\n", (int) x1, x2); return ((struct MyData *) mydata)->year; } return -1; } int main(void) { struct MyData mydata; mydata.year = 2012.0; /* Create module, load database, define initial conditions and selected output */ id = CreateIPhreeqc(); if (LoadDatabase(id, "phreeqc.dat") != 0) EHandler(); if (SetBasicCallback(id, MyCallback, &mydata) != 0) EHandler(); if (RunFile(id, "ic") != 0) EHandler(); /* Run cell 1, extract/write result */ if (RunString(id, "RUN_CELLS; -cells; 1; END") != 0) EHandler(); ExtractWrite(1); /* Advect cell 1 solution to cell 2, run cell 2, extract/write results */ AccumulateLine(id, ConCat("SOLUTION_MODIFY 2", "" )); AccumulateLine(id, ConCat(" -cb ", sv[0])); AccumulateLine(id, ConCat(" -total_h ", sv[1])); AccumulateLine(id, ConCat(" -total_o ", sv[2])); AccumulateLine(id, ConCat(" -totals ", "" )); AccumulateLine(id, ConCat(" C ", sv[3])); AccumulateLine(id, ConCat(" Ca ", sv[4])); mydata.year += 1.0; AccumulateLine(id, ConCat("RUN_CELLS; -cells; 2; END", "" )); if (RunAccumulated(id) != 0) EHandler(); ExtractWrite(2); /* Destroy module */ if (DestroyIPhreeqc(id) != IPQ_OK) EHandler(); exit(EXIT_SUCCESS); }