pyEQL 1.4.0rc9__cp312-cp312-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. pyEQL/__init__.py +50 -0
  2. pyEQL/_phreeqc.cp312-win_amd64.pyd +0 -0
  3. pyEQL/activity_correction.py +879 -0
  4. pyEQL/database/geothermal.dat +5693 -0
  5. pyEQL/database/llnl.dat +19305 -0
  6. pyEQL/database/phreeqc_license.txt +54 -0
  7. pyEQL/database/pyeql_db.json +35607 -0
  8. pyEQL/engines.py +1153 -0
  9. pyEQL/equilibrium.py +227 -0
  10. pyEQL/functions.py +281 -0
  11. pyEQL/phreeqc/__init__.py +5 -0
  12. pyEQL/phreeqc/bindings.cpp +84 -0
  13. pyEQL/phreeqc/core.py +239 -0
  14. pyEQL/phreeqc/database/Amm.dat +1968 -0
  15. pyEQL/phreeqc/database/CMakeLists.txt +32 -0
  16. pyEQL/phreeqc/database/ColdChem.dat +267 -0
  17. pyEQL/phreeqc/database/Concrete_PHR.dat +158 -0
  18. pyEQL/phreeqc/database/Concrete_PZ.dat +195 -0
  19. pyEQL/phreeqc/database/Kinec.v2.dat +12039 -0
  20. pyEQL/phreeqc/database/Kinec_v3.dat +12159 -0
  21. pyEQL/phreeqc/database/Makefile.am +28 -0
  22. pyEQL/phreeqc/database/Makefile.in +530 -0
  23. pyEQL/phreeqc/database/PHREEQC_ThermoddemV1.10_15Dec2020.dat +12965 -0
  24. pyEQL/phreeqc/database/Tipping_Hurley.dat +4137 -0
  25. pyEQL/phreeqc/database/__init__.py +0 -0
  26. pyEQL/phreeqc/database/core10.dat +6824 -0
  27. pyEQL/phreeqc/database/frezchem.dat +634 -0
  28. pyEQL/phreeqc/database/iso.dat +7235 -0
  29. pyEQL/phreeqc/database/llnl.dat +19310 -0
  30. pyEQL/phreeqc/database/minteq.dat +5654 -0
  31. pyEQL/phreeqc/database/minteq.v4.dat +13212 -0
  32. pyEQL/phreeqc/database/phreeqc.dat +1972 -0
  33. pyEQL/phreeqc/database/phreeqc_rates.dat +3158 -0
  34. pyEQL/phreeqc/database/pitzer.dat +1044 -0
  35. pyEQL/phreeqc/database/sit.dat +14348 -0
  36. pyEQL/phreeqc/database/wateq4f.dat +4036 -0
  37. pyEQL/phreeqc/ext/README.md +10 -0
  38. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/CMakeLists.txt +476 -0
  39. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/INSTALL +302 -0
  40. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/IPhreeqc.rc +61 -0
  41. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/IPhreeqcConfig.cmake.in +4 -0
  42. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/Makefile.am +8 -0
  43. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/Makefile.in +816 -0
  44. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/aclocal.m4 +1217 -0
  45. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/ALL_BUILD.vcxproj +185 -0
  46. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/ALL_BUILD.vcxproj.filters +8 -0
  47. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/generate.stamp +1 -0
  48. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CMakeFiles/generate.stamp.depend +79 -0
  49. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/CTestTestfile.cmake +6 -0
  50. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/Continuous.vcxproj +240 -0
  51. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/Continuous.vcxproj.filters +17 -0
  52. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/DartConfiguration.tcl +109 -0
  53. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/Experimental.vcxproj +240 -0
  54. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/Experimental.vcxproj.filters +17 -0
  55. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/INSTALL.vcxproj +209 -0
  56. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/INSTALL.vcxproj.filters +13 -0
  57. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/CSelectedOutput.obj +0 -0
  58. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Dictionary.obj +0 -0
  59. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/ExchComp.obj +0 -0
  60. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Exchange.obj +0 -0
  61. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/GasComp.obj +0 -0
  62. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/GasPhase.obj +0 -0
  63. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.lib.recipe +11 -0
  64. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.obj +0 -0
  65. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/CL.command.1.tlog +0 -0
  66. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/CL.read.1.tlog +0 -0
  67. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/CL.write.1.tlog +0 -0
  68. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/Cl.items.tlog +82 -0
  69. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/CustomBuild.command.1.tlog +10 -0
  70. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/CustomBuild.read.1.tlog +78 -0
  71. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/CustomBuild.write.1.tlog +2 -0
  72. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/IPhreeqc.lastbuildstate +2 -0
  73. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/Lib-link.read.1.tlog +0 -0
  74. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/Lib-link.write.1.tlog +0 -0
  75. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc.tlog/Lib.command.1.tlog +0 -0
  76. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqcLib.obj +0 -0
  77. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/IPhreeqc_interface_F.obj +0 -0
  78. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/ISolution.obj +0 -0
  79. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/ISolutionComp.obj +0 -0
  80. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Keywords.obj +0 -0
  81. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/KineticsComp.obj +0 -0
  82. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/NameDouble.obj +0 -0
  83. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/NumKeyword.obj +0 -0
  84. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/PBasic.obj +0 -0
  85. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/PHRQ_base.obj +0 -0
  86. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/PHRQ_io.obj +0 -0
  87. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/PHRQ_io_output.obj +0 -0
  88. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/PPassemblage.obj +0 -0
  89. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/PPassemblageComp.obj +0 -0
  90. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Parser.obj +0 -0
  91. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Phreeqc.obj +0 -0
  92. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Pressure.obj +0 -0
  93. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Reaction.obj +0 -0
  94. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/ReadClass.obj +0 -0
  95. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/SS.obj +0 -0
  96. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/SSassemblage.obj +0 -0
  97. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/SScomp.obj +0 -0
  98. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/SelectedOutput.obj +0 -0
  99. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Serializer.obj +0 -0
  100. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Solution.obj +0 -0
  101. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/SolutionIsotope.obj +0 -0
  102. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/StorageBin.obj +0 -0
  103. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/StorageBinList.obj +0 -0
  104. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Surface.obj +0 -0
  105. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/SurfaceCharge.obj +0 -0
  106. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/SurfaceComp.obj +0 -0
  107. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/System.obj +0 -0
  108. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Temperature.obj +0 -0
  109. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Use.obj +0 -0
  110. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/UserPunch.obj +0 -0
  111. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Utils.obj +0 -0
  112. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/Var.obj +0 -0
  113. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/advection.obj +0 -0
  114. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/basicsubs.obj +0 -0
  115. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/cl1.obj +0 -0
  116. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/cvdense.obj +0 -0
  117. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/cvode.obj +0 -0
  118. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/cxxKinetics.obj +0 -0
  119. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/cxxMix.obj +0 -0
  120. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/dense.obj +0 -0
  121. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/dumper.obj +0 -0
  122. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/gases.obj +0 -0
  123. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/input.obj +0 -0
  124. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/integrate.obj +0 -0
  125. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/inverse.obj +0 -0
  126. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/isotopes.obj +0 -0
  127. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/kinetics.obj +0 -0
  128. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/mainsubs.obj +0 -0
  129. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/model.obj +0 -0
  130. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/nvector.obj +0 -0
  131. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/nvector_serial.obj +0 -0
  132. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/parse.obj +0 -0
  133. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/phqalloc.obj +0 -0
  134. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/pitzer.obj +0 -0
  135. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/pitzer_structures.obj +0 -0
  136. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/prep.obj +0 -0
  137. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/print.obj +0 -0
  138. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/read.obj +0 -0
  139. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/readtr.obj +0 -0
  140. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/runner.obj +0 -0
  141. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/sit.obj +0 -0
  142. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/smalldense.obj +0 -0
  143. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/spread.obj +0 -0
  144. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/step.obj +0 -0
  145. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/structures.obj +0 -0
  146. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/sundialsmath.obj +0 -0
  147. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/tally.obj +0 -0
  148. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/tidy.obj +0 -0
  149. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/transport.obj +0 -0
  150. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.dir/Release/utilities.obj +0 -0
  151. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.sln +116 -0
  152. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.vcxproj +443 -0
  153. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/IPhreeqc.vcxproj.filters +456 -0
  154. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/Nightly.vcxproj +240 -0
  155. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/Nightly.vcxproj.filters +17 -0
  156. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/NightlyMemoryCheck.vcxproj +240 -0
  157. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/NightlyMemoryCheck.vcxproj.filters +17 -0
  158. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/Release/IPhreeqc.lib +0 -0
  159. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/build/cmake_install.cmake +40 -0
  160. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/ar-lib +270 -0
  161. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/compile +347 -0
  162. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/config.guess +1441 -0
  163. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/config.sub +1813 -0
  164. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/depcomp +791 -0
  165. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/install-sh +508 -0
  166. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/ltmain.sh +11156 -0
  167. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/missing +215 -0
  168. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/config/test-driver +148 -0
  169. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/configure +23867 -0
  170. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/configure.ac +136 -0
  171. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Amm.dat +1968 -0
  172. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/CMakeLists.txt +32 -0
  173. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/ColdChem.dat +267 -0
  174. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Concrete_PHR.dat +158 -0
  175. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Concrete_PZ.dat +195 -0
  176. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Kinec.v2.dat +12039 -0
  177. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Kinec_v3.dat +12159 -0
  178. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Makefile.am +28 -0
  179. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Makefile.in +530 -0
  180. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/PHREEQC_ThermoddemV1.10_15Dec2020.dat +12965 -0
  181. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/Tipping_Hurley.dat +4137 -0
  182. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/core10.dat +6824 -0
  183. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/frezchem.dat +634 -0
  184. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/iso.dat +7235 -0
  185. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/llnl.dat +19310 -0
  186. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/minteq.dat +5654 -0
  187. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/minteq.v4.dat +13212 -0
  188. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/phreeqc.dat +1972 -0
  189. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/phreeqc_rates.dat +3158 -0
  190. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/pitzer.dat +1044 -0
  191. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/sit.dat +14348 -0
  192. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/database/wateq4f.dat +4036 -0
  193. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/CMakeLists.txt +35 -0
  194. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/IPhreeqc.pdf +0 -0
  195. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/Makefile.am +24 -0
  196. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/Makefile.in +545 -0
  197. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/NOTICE +51 -0
  198. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/Phreeqc_2_1999_manual.pdf +0 -0
  199. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/Phreeqc_3_2013_manual.pdf +0 -0
  200. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/README +428 -0
  201. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/RELEASE +7294 -0
  202. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/IPhreeqc_8h.html +5096 -0
  203. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/IPhreeqc_8h_source.html +389 -0
  204. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/IPhreeqc_8hpp.html +83 -0
  205. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/IPhreeqc_8hpp_source.html +478 -0
  206. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/Var_8h.html +318 -0
  207. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/Var_8h_source.html +200 -0
  208. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/bc_s.png +0 -0
  209. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/bdwn.png +0 -0
  210. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/classIPhreeqc.html +2274 -0
  211. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/classIPhreeqc.png +0 -0
  212. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/classIPhreeqcStop.html +69 -0
  213. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/classIPhreeqcStop.png +0 -0
  214. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/closed.png +0 -0
  215. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +68 -0
  216. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/doxygen.css +1440 -0
  217. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/doxygen.png +0 -0
  218. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/dynsections.js +97 -0
  219. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2blank.png +0 -0
  220. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2doc.png +0 -0
  221. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2folderclosed.png +0 -0
  222. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2folderopen.png +0 -0
  223. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2lastnode.png +0 -0
  224. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2link.png +0 -0
  225. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2mlastnode.png +0 -0
  226. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2mnode.png +0 -0
  227. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2node.png +0 -0
  228. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2plastnode.png +0 -0
  229. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2pnode.png +0 -0
  230. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2splitbar.png +0 -0
  231. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/ftv2vertline.png +0 -0
  232. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/index.html +58 -0
  233. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/jquery.js +31 -0
  234. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/nav_f.png +0 -0
  235. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/nav_g.png +0 -0
  236. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/nav_h.png +0 -0
  237. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/open.png +0 -0
  238. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/structVAR.html +143 -0
  239. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/sync_off.png +0 -0
  240. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/sync_on.png +0 -0
  241. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tab_a.png +0 -0
  242. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tab_b.png +0 -0
  243. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tab_h.png +0 -0
  244. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tab_s.png +0 -0
  245. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/html/tabs.css +60 -0
  246. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/doc/phreeqc3.chm +0 -0
  247. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/CMakeLists.txt +11 -0
  248. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/Makefile.am +88 -0
  249. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/Makefile.in +696 -0
  250. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/CMakeLists.txt +1 -0
  251. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/CMakeLists.txt +35 -0
  252. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/CMakeLists.txt.in +21 -0
  253. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/README.txt +44 -0
  254. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/advect.c +101 -0
  255. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/ic +17 -0
  256. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/c/advect/phreeqc.dat +1579 -0
  257. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/CMakeLists.txt +10 -0
  258. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/README.txt +3 -0
  259. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/excel/CMakeLists.txt +9 -0
  260. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/excel/phreeqc.dat +1582 -0
  261. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/excel/runphreeqc.xls +0 -0
  262. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/excel/withcallback.xls +0 -0
  263. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/CMakeLists.txt +11 -0
  264. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/Gypsum.py +52 -0
  265. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/parallel_advect.py +465 -0
  266. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/phreeqc.dat +1582 -0
  267. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/pitzer.dat +790 -0
  268. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/com/python/wateq4f.dat +3846 -0
  269. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/CMakeLists.txt +1 -0
  270. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/CMakeLists.txt +35 -0
  271. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/CMakeLists.txt.in +20 -0
  272. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/README.txt +45 -0
  273. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/advect.cpp +110 -0
  274. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/ic +17 -0
  275. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/cpp/advect/phreeqc.dat +1579 -0
  276. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/CMakeLists.txt +1 -0
  277. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/CMakeLists.txt +44 -0
  278. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/CMakeLists.txt.in +24 -0
  279. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/README.txt +45 -0
  280. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/advect.F90 +102 -0
  281. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/ic +17 -0
  282. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/fortran/advect/phreeqc.dat +1579 -0
  283. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/CMakeLists.txt +26 -0
  284. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/CMakeLists.txt.in +20 -0
  285. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/README.txt +37 -0
  286. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/ex2 +26 -0
  287. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/main.cpp +20 -0
  288. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/phreeqc.dat +1837 -0
  289. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/examples/using-cmake/post-install.cmake.in +7 -0
  290. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/CMakeLists.txt +185 -0
  291. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/FileTest.cpp +171 -0
  292. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/FileTest.h +34 -0
  293. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/Makefile.am +18 -0
  294. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/Makefile.in +466 -0
  295. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestCVar.cpp +9 -0
  296. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestIPhreeqc.cpp +4901 -0
  297. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestIPhreeqcLib.cpp +4644 -0
  298. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestSelectedOutput.cpp +669 -0
  299. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/TestVar.cpp +10 -0
  300. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/conv_fail.in +11 -0
  301. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/dump +42 -0
  302. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/iso.dat +7231 -0
  303. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/kinn20140218 +349 -0
  304. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/missing_e.dat +1556 -0
  305. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/multi_punch +105 -0
  306. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/multi_punch_no_set +102 -0
  307. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/phreeqc.dat.90a6449 +1935 -0
  308. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/gtest/phreeqc.dat.old +1556 -0
  309. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/libtool.m4 +8388 -0
  310. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/ltoptions.m4 +437 -0
  311. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/ltsugar.m4 +124 -0
  312. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/ltversion.m4 +23 -0
  313. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/m4/lt~obsolete.m4 +99 -0
  314. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/resource.h +14 -0
  315. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/CSelectedOutput.cpp +401 -0
  316. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/CSelectedOutput.hxx +77 -0
  317. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/CVar.hxx +162 -0
  318. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Debug.h +12 -0
  319. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/ErrorReporter.hxx +70 -0
  320. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.cpp +1889 -0
  321. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.f.inc +91 -0
  322. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.f90.inc +603 -0
  323. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.h +2182 -0
  324. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc.hpp +1027 -0
  325. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqcCallbacks.h +19 -0
  326. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqcF.f +653 -0
  327. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqcLib.cpp +1098 -0
  328. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc_interface.F90 +1283 -0
  329. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc_interface_F.cpp +535 -0
  330. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/IPhreeqc_interface_F.h +162 -0
  331. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Makefile.am +210 -0
  332. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Makefile.in +1294 -0
  333. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/README.Fortran +17 -0
  334. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Var.c +84 -0
  335. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Var.h +152 -0
  336. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/Version.h +36 -0
  337. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fimpl.h +282 -0
  338. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap.cpp +646 -0
  339. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap.h +163 -0
  340. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap1.cpp +24 -0
  341. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap2.cpp +24 -0
  342. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap3.cpp +24 -0
  343. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap4.cpp +24 -0
  344. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap5.cpp +24 -0
  345. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap6.cpp +25 -0
  346. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap7.cpp +25 -0
  347. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/fwrap8.cpp +24 -0
  348. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ChartHandler.cpp +225 -0
  349. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ChartHandler.h +59 -0
  350. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ChartObject.cpp +1382 -0
  351. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ChartObject.h +444 -0
  352. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/CurveObject.cpp +42 -0
  353. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/CurveObject.h +79 -0
  354. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Dictionary.cpp +41 -0
  355. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Dictionary.h +28 -0
  356. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ExchComp.cxx +398 -0
  357. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ExchComp.h +117 -0
  358. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Exchange.cxx +466 -0
  359. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Exchange.h +74 -0
  360. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Form1.h +1184 -0
  361. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Form1.resX +36 -0
  362. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/GasComp.cxx +265 -0
  363. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/GasComp.h +59 -0
  364. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/GasPhase.cxx +659 -0
  365. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/GasPhase.h +103 -0
  366. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ISolution.cxx +40 -0
  367. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ISolution.h +53 -0
  368. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ISolutionComp.cxx +202 -0
  369. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ISolutionComp.h +138 -0
  370. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/KineticsComp.cxx +318 -0
  371. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/KineticsComp.h +81 -0
  372. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NA.h +1 -0
  373. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NameDouble.cxx +537 -0
  374. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NameDouble.h +66 -0
  375. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NumKeyword.cxx +190 -0
  376. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/NumKeyword.h +67 -0
  377. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PBasic.cpp +8350 -0
  378. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PBasic.h +572 -0
  379. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PHRQ_io_output.cpp +411 -0
  380. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PPassemblage.cxx +375 -0
  381. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PPassemblage.h +70 -0
  382. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PPassemblageComp.cxx +441 -0
  383. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PPassemblageComp.h +83 -0
  384. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Phreeqc.cpp +2087 -0
  385. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Phreeqc.h +2164 -0
  386. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PhreeqcKeywords/Keywords.cpp +242 -0
  387. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/PhreeqcKeywords/Keywords.h +104 -0
  388. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Pressure.cxx +417 -0
  389. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Pressure.h +43 -0
  390. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Reaction.cxx +284 -0
  391. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Reaction.h +57 -0
  392. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ReadClass.cxx +1150 -0
  393. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SS.cxx +609 -0
  394. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SS.h +128 -0
  395. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SSassemblage.cxx +317 -0
  396. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SSassemblage.h +59 -0
  397. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SScomp.cxx +297 -0
  398. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SScomp.h +66 -0
  399. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SelectedOutput.cpp +115 -0
  400. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SelectedOutput.h +209 -0
  401. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Serializer.cxx +213 -0
  402. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Serializer.h +42 -0
  403. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Solution.cxx +1795 -0
  404. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Solution.h +154 -0
  405. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SolutionIsotope.cxx +333 -0
  406. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SolutionIsotope.h +85 -0
  407. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/StorageBin.cxx +1507 -0
  408. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/StorageBin.h +141 -0
  409. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/StorageBinList.cpp +358 -0
  410. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/StorageBinList.h +81 -0
  411. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Surface.cxx +837 -0
  412. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Surface.h +108 -0
  413. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SurfaceCharge.cxx +617 -0
  414. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SurfaceCharge.h +137 -0
  415. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SurfaceComp.cxx +509 -0
  416. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/SurfaceComp.h +70 -0
  417. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/System.cxx +103 -0
  418. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/System.h +89 -0
  419. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Temperature.cxx +423 -0
  420. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Temperature.h +42 -0
  421. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Use.cpp +78 -0
  422. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/Use.h +159 -0
  423. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/UserPunch.cpp +32 -0
  424. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/UserPunch.h +39 -0
  425. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/ZedGraph.dll +0 -0
  426. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/advection.cpp +140 -0
  427. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/basicsubs.cpp +4333 -0
  428. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cl1.cpp +881 -0
  429. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_base.cxx +117 -0
  430. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_base.h +48 -0
  431. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_exports.h +20 -0
  432. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_io.cpp +914 -0
  433. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/PHRQ_io.h +207 -0
  434. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/Parser.cxx +1331 -0
  435. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/Parser.h +310 -0
  436. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/Utils.cxx +263 -0
  437. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/Utils.h +29 -0
  438. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/common/phrqtype.h +18 -0
  439. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cvdense.cpp +566 -0
  440. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cvdense.h +267 -0
  441. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cvode.cpp +3939 -0
  442. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cvode.h +940 -0
  443. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cxxKinetics.cxx +617 -0
  444. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cxxKinetics.h +78 -0
  445. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cxxMix.cxx +154 -0
  446. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/cxxMix.h +58 -0
  447. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/dense.cpp +175 -0
  448. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/dense.h +341 -0
  449. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/dumper.cpp +277 -0
  450. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/dumper.h +60 -0
  451. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/gases.cpp +748 -0
  452. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/global_structures.h +1672 -0
  453. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/input.cpp +133 -0
  454. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/integrate.cpp +1219 -0
  455. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/inverse.cpp +5135 -0
  456. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/isotopes.cpp +1813 -0
  457. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/kinetics.cpp +3180 -0
  458. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/mainsubs.cpp +2320 -0
  459. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/model.cpp +5843 -0
  460. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/nvector.cpp +272 -0
  461. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/nvector.h +485 -0
  462. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/nvector_serial.cpp +1032 -0
  463. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/nvector_serial.h +369 -0
  464. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/parse.cpp +1044 -0
  465. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/phqalloc.cpp +316 -0
  466. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/phqalloc.h +47 -0
  467. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/pitzer.cpp +2709 -0
  468. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/pitzer_structures.cpp +225 -0
  469. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/prep.cpp +6267 -0
  470. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/print.cpp +3673 -0
  471. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/read.cpp +10245 -0
  472. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/readtr.cpp +1495 -0
  473. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/runner.cpp +158 -0
  474. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/runner.h +33 -0
  475. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/sit.cpp +1684 -0
  476. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/smalldense.cpp +324 -0
  477. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/smalldense.h +261 -0
  478. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/spread.cpp +1309 -0
  479. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/step.cpp +1566 -0
  480. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/structures.cpp +3381 -0
  481. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/sundialsmath.cpp +133 -0
  482. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/sundialsmath.h +162 -0
  483. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/sundialstypes.h +183 -0
  484. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/tally.cpp +1288 -0
  485. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/tidy.cpp +5600 -0
  486. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/transport.cpp +6403 -0
  487. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/phreeqcpp/utilities.cpp +1339 -0
  488. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/src/thread.h +64 -0
  489. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/CMakeLists.txt +133 -0
  490. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/Makefile.am +45 -0
  491. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/Makefile.in +1128 -0
  492. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/ex2.in +26 -0
  493. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/main.f90 +31 -0
  494. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/main77.f +6 -0
  495. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/main_fortran.cxx +8 -0
  496. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/phreeqc.dat.in +1556 -0
  497. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/test_c.c +148 -0
  498. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/test_cxx.cxx +152 -0
  499. pyEQL/phreeqc/ext/iphreeqc-3.8.6-17100/tests/test_f90.F90 +328 -0
  500. pyEQL/phreeqc/iphreeqc_wrapper.cpp +75 -0
  501. pyEQL/phreeqc/solution.py +74 -0
  502. pyEQL/phreeqc/var.py +50 -0
  503. pyEQL/presets/Ringers lactate.yaml +20 -0
  504. pyEQL/presets/__init__.py +17 -0
  505. pyEQL/presets/normal saline.yaml +17 -0
  506. pyEQL/presets/rainwater.yaml +17 -0
  507. pyEQL/presets/seawater.yaml +29 -0
  508. pyEQL/presets/urine.yaml +26 -0
  509. pyEQL/presets/wastewater.yaml +21 -0
  510. pyEQL/py.typed +0 -0
  511. pyEQL/salt_ion_match.py +112 -0
  512. pyEQL/solute.py +163 -0
  513. pyEQL/solution.py +2714 -0
  514. pyEQL/utils.py +237 -0
  515. pyeql-1.4.0rc9.dist-info/METADATA +130 -0
  516. pyeql-1.4.0rc9.dist-info/RECORD +519 -0
  517. pyeql-1.4.0rc9.dist-info/WHEEL +5 -0
  518. pyeql-1.4.0rc9.dist-info/licenses/AUTHORS.md +21 -0
  519. pyeql-1.4.0rc9.dist-info/licenses/LICENSE.txt +20 -0
@@ -0,0 +1,4901 @@
1
+ #include <gtest/gtest.h>
2
+ #include <gmock/gmock.h>
3
+
4
+ #include <cmath>
5
+ #include <cfloat>
6
+ #include <cassert>
7
+ #include "IPhreeqc.hpp"
8
+ #include "Phreeqc.h"
9
+ #include "FileTest.h"
10
+ #undef true
11
+ #undef false
12
+ #include "CVar.hxx"
13
+
14
+ using ::testing::HasSubstr;
15
+
16
+ VRESULT SOLUTION(IPhreeqc& obj, double C, double Ca, double Na);
17
+ VRESULT EQUILIBRIUM_PHASES(IPhreeqc& obj, const char* phase, double si, double amount);
18
+ VRESULT USER_PUNCH(IPhreeqc& obj, const char* element, int max);
19
+ VRESULT SELECTED_OUTPUT(IPhreeqc& obj);
20
+ VRESULT DUMP(IPhreeqc& obj);
21
+
22
+ void TestFileOnOff(const char* FILENAME_FORMAT, bool output_file_on, bool error_file_on, bool log_file_on, bool selected_output_file_on, bool dump_file_on);
23
+
24
+ TEST(TestIPhreeqc, TestLoadDatabase)
25
+ {
26
+ std::string FILES[] = { "phreeqc.dat", "pitzer.dat", "wateq4f.dat",
27
+ "Amm.dat", "frezchem.dat", "iso.dat",
28
+ "llnl.dat", "minteq.dat", "minteq.v4.dat",
29
+ "sit.dat","ColdChem.dat","core10.dat",
30
+ "Tipping_Hurley.dat"
31
+ };
32
+
33
+ for (int j = 0; j < sizeof(FILES) / sizeof(std::string); ++j)
34
+ {
35
+ IPhreeqc obj;
36
+ for (int i = 0; i < 10; ++i)
37
+ {
38
+ ASSERT_EQ(true, ::FileExists(FILES[j].c_str()));
39
+ ASSERT_TRUE(::FileSize(FILES[j].c_str()) > 0);
40
+ ASSERT_EQ(0, obj.LoadDatabase(FILES[j].c_str()));
41
+ }
42
+
43
+ // make sure settings are cleared
44
+ //
45
+
46
+ IPhreeqc obj2;
47
+ for (int i = 0; i < 10; ++i)
48
+ {
49
+ ASSERT_EQ(false, obj2.GetSelectedOutputFileOn());
50
+
51
+ obj2.SetSelectedOutputFileOn(true);
52
+ ASSERT_EQ(true, obj2.GetSelectedOutputFileOn());
53
+
54
+ obj2.SetSelectedOutputFileOn(true);
55
+ ASSERT_EQ(true, obj2.GetSelectedOutputFileOn());
56
+
57
+ ASSERT_EQ(true, ::FileExists(FILES[j].c_str()));
58
+ ASSERT_TRUE(::FileSize(FILES[j].c_str()) > 0);
59
+ ASSERT_EQ(0, obj2.LoadDatabase(FILES[j].c_str()));
60
+
61
+ // all previous definitions are cleared
62
+ ASSERT_EQ(false, obj2.GetSelectedOutputFileOn());
63
+ }
64
+ }
65
+ }
66
+
67
+ TEST(TestIPhreeqc, TestLoadDatabaseString)
68
+ {
69
+ const char ex15_dat[] =
70
+ "SOLUTION_MASTER_SPECIES\n"
71
+ "C CO2 2.0 61.0173 12.0111\n"
72
+ "Cl Cl- 0.0 Cl 35.453\n"
73
+ "Co Co+2 0.0 58.93 58.93 \n"
74
+ "E e- 0.0 0.0 0.0\n"
75
+ "H H+ -1. 1.008 1.008\n"
76
+ "H(0) H2 0.0 1.008\n"
77
+ "H(1) H+ -1. 1.008\n"
78
+ "N NH4+ 0.0 14.0067 14.0067\n"
79
+ "Na Na+ 0.0 Na 22.9898\n"
80
+ "Nta Nta-3 3.0 1. 1.\n"
81
+ "O H2O 0.0 16.00 16.00\n"
82
+ "O(-2) H2O 0.0 18.016\n"
83
+ "O(0) O2 0.0 16.00\n"
84
+ "SOLUTION_SPECIES\n"
85
+ "2H2O = O2 + 4H+ + 4e- \n"
86
+ " log_k -86.08; -gamma 1e7 0.0\n"
87
+ "2 H+ + 2 e- = H2\n"
88
+ " log_k -3.15; -gamma 1e7 0.0\n"
89
+ "H+ = H+\n"
90
+ " log_k 0.0; -gamma 1e7 0.0\n"
91
+ "e- = e-\n"
92
+ " log_k 0.0; -gamma 1e7 0.0\n"
93
+ "H2O = H2O\n"
94
+ " log_k 0.0; -gamma 1e7 0.0\n"
95
+ "CO2 = CO2\n"
96
+ " log_k 0.0; -gamma 1e7 0.0\n"
97
+ "Na+ = Na+\n"
98
+ " log_k 0.0; -gamma 1e7 0.0\n"
99
+ "Cl- = Cl-\n"
100
+ " log_k 0.0; -gamma 1e7 0.0\n"
101
+ "Co+2 = Co+2\n"
102
+ " log_k 0.0; -gamma 1e7 0.0\n"
103
+ "NH4+ = NH4+\n"
104
+ " log_k 0.0; -gamma 1e7 0.0\n"
105
+ "Nta-3 = Nta-3\n"
106
+ " log_k 0.0; -gamma 1e7 0.0\n"
107
+ "Nta-3 + 3H+ = H3Nta\n"
108
+ " log_k 14.9; -gamma 1e7 0.0\n"
109
+ "Nta-3 + 2H+ = H2Nta-\n"
110
+ " log_k 13.3; -gamma 1e7 0.0\n"
111
+ "Nta-3 + H+ = HNta-2\n"
112
+ " log_k 10.3; -gamma 1e7 0.0\n"
113
+ "Nta-3 + Co+2 = CoNta-\n"
114
+ " log_k 11.7; -gamma 1e7 0.0\n"
115
+ "2 Nta-3 + Co+2 = CoNta2-4\n"
116
+ " log_k 14.5; -gamma 1e7 0.0\n"
117
+ "Nta-3 + Co+2 + H2O = CoOHNta-2 + H+\n"
118
+ " log_k 0.5; -gamma 1e7 0.0\n"
119
+ "Co+2 + H2O = CoOH+ + H+\n"
120
+ " log_k -9.7; -gamma 1e7 0.0\n"
121
+ "Co+2 + 2H2O = Co(OH)2 + 2H+\n"
122
+ " log_k -22.9; -gamma 1e7 0.0\n"
123
+ "Co+2 + 3H2O = Co(OH)3- + 3H+\n"
124
+ " log_k -31.5; -gamma 1e7 0.0\n"
125
+ "CO2 + H2O = HCO3- + H+\n"
126
+ " log_k -6.35; -gamma 1e7 0.0\n"
127
+ "CO2 + H2O = CO3-2 + 2H+\n"
128
+ " log_k -16.68; -gamma 1e7 0.0\n"
129
+ "NH4+ = NH3 + H+\n"
130
+ " log_k -9.3; -gamma 1e7 0.0\n"
131
+ "H2O = OH- + H+\n"
132
+ " log_k -14.0; -gamma 1e7 0.0\n"
133
+ "END\n";
134
+
135
+ IPhreeqc obj;
136
+ ASSERT_EQ(0, obj.LoadDatabaseString(ex15_dat));
137
+ }
138
+
139
+ TEST(TestIPhreeqc, TestLoadDatabaseStringBadInput)
140
+ {
141
+ IPhreeqc obj;
142
+
143
+ for (int i = 0; i < 10; ++i)
144
+ {
145
+ ASSERT_TRUE(0 != obj.LoadDatabaseString("phreeqc.dat.list"));
146
+ }
147
+ }
148
+
149
+ TEST(TestIPhreeqc, TestLoadDatabaseEx14AsDB)
150
+ {
151
+ const char ex14[] =
152
+ "TITLE Example 14.--Transport with equilibrium_phases, exchange, and surface reactions\n"
153
+ "#\n"
154
+ "# Use phreeqc.dat\n"
155
+ "# Dzombak and Morel (1990) aqueous and surface complexation models for arsenic\n"
156
+ "# are defined here\n"
157
+ "#\n"
158
+ "SURFACE_MASTER_SPECIES\n"
159
+ " Surf SurfOH\n"
160
+ "SURFACE_SPECIES\n"
161
+ " SurfOH = SurfOH\n"
162
+ " log_k 0.0\n"
163
+ " SurfOH + H+ = SurfOH2+\n"
164
+ " log_k 7.29\n"
165
+ " SurfOH = SurfO- + H+\n"
166
+ " log_k -8.93\n"
167
+ " SurfOH + AsO4-3 + 3H+ = SurfH2AsO4 + H2O\n"
168
+ " log_k 29.31\n"
169
+ " SurfOH + AsO4-3 + 2H+ = SurfHAsO4- + H2O\n"
170
+ " log_k 23.51\n"
171
+ " SurfOH + AsO4-3 = SurfOHAsO4-3\n"
172
+ " log_k 10.58\n"
173
+ "SOLUTION_MASTER_SPECIES\n"
174
+ " As H3AsO4 -1.0 74.9216 74.9216\n"
175
+ "SOLUTION_SPECIES\n"
176
+ " H3AsO4 = H3AsO4\n"
177
+ " log_k 0.0\n"
178
+ " H3AsO4 = AsO4-3 + 3H+\n"
179
+ " log_k -20.7\n"
180
+ " H+ + AsO4-3 = HAsO4-2\n"
181
+ " log_k 11.50\n"
182
+ " 2H+ + AsO4-3 = H2AsO4-\n"
183
+ " log_k 18.46\n"
184
+ "SOLUTION 1 Brine\n"
185
+ " pH 5.713\n"
186
+ " pe 4.0 O2(g) -0.7\n"
187
+ " temp 25.\n"
188
+ " units mol/kgw\n"
189
+ " Ca .4655\n"
190
+ " Mg .1609\n"
191
+ " Na 5.402\n"
192
+ " Cl 6.642 charge\n"
193
+ " C .00396\n"
194
+ " S .004725\n"
195
+ " As .025 umol/kgw\n"
196
+ "END\n"
197
+ "USE solution 1\n"
198
+ "EQUILIBRIUM_PHASES 1\n"
199
+ " Dolomite 0.0 1.6\n"
200
+ " Calcite 0.0 0.1\n"
201
+ "SAVE solution 1\n"
202
+ "# prints initial condition to the selected-output file\n"
203
+ "SELECTED_OUTPUT\n"
204
+ " -file ex14.sel\n"
205
+ " -reset false\n"
206
+ " -step\n"
207
+ "USER_PUNCH\n"
208
+ " -head m_Ca m_Mg m_Na umol_As pH mmol_sorbedAs\n"
209
+ " 10 PUNCH TOT(\"Ca\"), TOT(\"Mg\"), TOT(\"Na\"), TOT(\"As\")*1e6, -LA(\"H+\"), SURF(\"As\", \"Surf\")*1000\n"
210
+ "END\n"
211
+ "PRINT\n"
212
+ "# skips print of initial exchange and initial surface to the selected-output file\n"
213
+ " -selected_out false\n"
214
+ "EXCHANGE 1\n"
215
+ " -equil with solution 1\n"
216
+ " X 1.0\n"
217
+ "SURFACE 1\n"
218
+ " -equil solution 1\n"
219
+ "# assumes 1/10 of iron is HFO\n"
220
+ " SurfOH 0.07 600. 30.\n"
221
+ "END\n"
222
+ "SOLUTION 0 20 x precipitation\n"
223
+ " pH 4.6\n"
224
+ " pe 4.0 O2(g) -0.7\n"
225
+ " temp 25.\n"
226
+ " units mmol/kgw\n"
227
+ " Ca .191625\n"
228
+ " Mg .035797\n"
229
+ " Na .122668\n"
230
+ " Cl .133704\n"
231
+ " C .01096\n"
232
+ " S .235153 charge\n"
233
+ "EQUILIBRIUM_PHASES 0\n"
234
+ " Dolomite 0.0 1.6\n"
235
+ " Calcite 0.0 0.1\n"
236
+ " CO2(g) -1.5 10.\n"
237
+ "SAVE solution 0\n"
238
+ "END\n"
239
+ "PRINT\n"
240
+ " -selected_out true\n"
241
+ " -status false\n"
242
+ "ADVECTION\n"
243
+ " -cells 1\n"
244
+ " -shifts 200\n"
245
+ " -print_frequency 200\n"
246
+ "USER_GRAPH 1 Example 14\n"
247
+ " -headings PV As(ppb) Ca(M) Mg(M) Na(M) pH\n"
248
+ " -chart_title \"Chemical Evolution of the Central Oklahoma Aquifer\"\n"
249
+ " -axis_titles \"Pore volumes or shift number\" \"Log(Concentration, in ppb or molal)\" \"pH\"\n"
250
+ " -axis_scale x_axis 0 200\n"
251
+ " -axis_scale y_axis 1e-6 100 auto auto Log\n"
252
+ " 10 GRAPH_X STEP_NO\n"
253
+ " 20 GRAPH_Y TOT(\"As\") * 74.92e6, TOT(\"Ca\"), TOT(\"Mg\"), TOT(\"Na\")\n"
254
+ " 30 GRAPH_SY -LA(\"H+\")\n"
255
+ "END\n";
256
+
257
+ IPhreeqc obj;
258
+ for (int i = 0; i < 10; ++i)
259
+ {
260
+ ASSERT_TRUE(0 != obj.LoadDatabaseString(ex14));
261
+ }
262
+ }
263
+
264
+ TEST(TestIPhreeqc, TestLoadDatabaseMissingFile)
265
+ {
266
+ ASSERT_EQ(false, ::FileExists("missing.file"));
267
+
268
+ IPhreeqc obj;
269
+
270
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
271
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
272
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
273
+
274
+ const char expected[] =
275
+ "ERROR: LoadDatabase: Unable to open:\"missing.file\".\n";
276
+
277
+ const char* err = obj.GetErrorString();
278
+ ASSERT_EQ(std::string(expected), std::string(err));
279
+ }
280
+
281
+ TEST(TestIPhreeqc, TestSetErrorOn)
282
+ {
283
+ ASSERT_EQ(false, ::FileExists("missing.file"));
284
+
285
+ IPhreeqc obj;
286
+ ASSERT_EQ(true, obj.GetErrorOn()); // initial setting is true
287
+
288
+ obj.SetErrorOn(false);
289
+ ASSERT_EQ(false, obj.GetErrorOn());
290
+
291
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
292
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
293
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
294
+
295
+ const char expected[] = "GetErrorString: ErrorOn not set.\n";
296
+ const char* err = obj.GetErrorString();
297
+ ASSERT_EQ(std::string(expected), std::string(err));
298
+ }
299
+
300
+ TEST(TestIPhreeqc, TestSetErrorOn2)
301
+ {
302
+ ASSERT_EQ(false, ::FileExists("missing.file"));
303
+
304
+ IPhreeqc obj;
305
+
306
+ char ERR_FILENAME[80];
307
+ snprintf(ERR_FILENAME, sizeof(ERR_FILENAME), "error.%06d.out", ::rand());
308
+ if (::FileExists(ERR_FILENAME))
309
+ {
310
+ ::DeleteFile(ERR_FILENAME);
311
+ }
312
+ ASSERT_EQ(false, ::FileExists(ERR_FILENAME));
313
+
314
+ obj.SetErrorFileOn(true);
315
+ obj.SetErrorFileName(ERR_FILENAME);
316
+
317
+ ASSERT_EQ(true, obj.GetErrorOn()); // initial setting is true
318
+
319
+ obj.SetErrorOn(false);
320
+ ASSERT_EQ(false, obj.GetErrorOn());
321
+
322
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
323
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
324
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
325
+
326
+ ASSERT_EQ(false, ::FileExists(ERR_FILENAME));
327
+ }
328
+
329
+ TEST(TestIPhreeqc, TestSetErrorOnTakesPrecedence)
330
+ {
331
+ ASSERT_EQ(false, ::FileExists("missing.file"));
332
+
333
+ IPhreeqc obj;
334
+
335
+ char ERR_FILENAME[80];
336
+ snprintf(ERR_FILENAME, sizeof(ERR_FILENAME), "error.%06d.out", ::rand());
337
+ if (::FileExists(ERR_FILENAME))
338
+ {
339
+ ::DeleteFile(ERR_FILENAME);
340
+ }
341
+ ASSERT_EQ(false, ::FileExists(ERR_FILENAME));
342
+
343
+ obj.SetErrorFileOn(true);
344
+ obj.SetErrorFileName(ERR_FILENAME);
345
+
346
+ obj.SetErrorOn(false);
347
+ obj.SetErrorStringOn(false);
348
+
349
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
350
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
351
+ ASSERT_EQ(1, obj.LoadDatabase("missing.file"));
352
+
353
+ const char expected[] = "GetErrorString: ErrorOn not set.\n";
354
+ const char* err = obj.GetErrorString();
355
+ ASSERT_EQ(std::string(expected), std::string(err));
356
+
357
+ ASSERT_EQ(false, ::FileExists(ERR_FILENAME));
358
+ }
359
+
360
+ TEST(TestIPhreeqc, TestLoadDatabaseWithErrors)
361
+ {
362
+ #if defined(_WIN32)
363
+ int n0 = ::_fcloseall();
364
+ assert(n0 == 0);
365
+ #endif
366
+
367
+ IPhreeqc obj;
368
+
369
+ for (int i = 0; i < 10; ++i)
370
+ {
371
+ ASSERT_EQ(true, ::FileExists("missing_e.dat"));
372
+ ASSERT_TRUE(::FileSize("missing_e.dat") > 0);
373
+ ASSERT_EQ(6, obj.LoadDatabase("missing_e.dat"));
374
+
375
+ const char* expected =
376
+ "ERROR: Could not reduce equation to primary master species, CH4.\n"
377
+ "ERROR: Could not reduce equation to primary master species, Cu+.\n"
378
+ "ERROR: Could not reduce equation to primary master species, Fe+3.\n"
379
+ "ERROR: Could not reduce equation to primary master species, H2.\n"
380
+ "ERROR: Could not reduce equation to primary master species, Mn+3.\n"
381
+ "ERROR: Could not reduce equation to primary master species, NH4+.\n"
382
+ "ERROR: Could not reduce equation to primary master species, N2.\n"
383
+ "ERROR: Could not reduce equation to primary master species, NO2-.\n"
384
+ "ERROR: Could not reduce equation to primary master species, O2.\n"
385
+ "ERROR: Could not reduce equation to primary master species, HS-.\n"
386
+ "ERROR: Could not reduce equation to secondary master species, e-.\n"
387
+ "ERROR: Non-master species in secondary reaction, e-.\n"
388
+ "ERROR: No master species for element e.\n"
389
+ "ERROR: Could not find primary master species for e.\n"
390
+ "ERROR: No master species for element e.\n"
391
+ "ERROR: Could not reduce equation to secondary master species, Hausmannite.\n"
392
+ "ERROR: Could not reduce equation to secondary master species, Manganite.\n"
393
+ "ERROR: Could not reduce equation to secondary master species, Pyrite.\n"
394
+ "ERROR: Could not reduce equation to secondary master species, Pyrolusite.\n"
395
+ "ERROR: Could not reduce equation to secondary master species, Sulfur.\n"
396
+ "ERROR: e-, primary master species for E-, not defined.\n"
397
+ "ERROR: Calculations terminating due to input errors.\n";
398
+
399
+ const char* err = obj.GetErrorString();
400
+ ASSERT_EQ(std::string(expected), std::string(err));
401
+ }
402
+ #if defined(_WIN32)
403
+ int n = ::_fcloseall();
404
+ assert(n == 0);
405
+ #endif
406
+ }
407
+
408
+ TEST(TestIPhreeqc, TestRunAccumulated)
409
+ {
410
+ #if defined(_WIN32)
411
+ int n = ::_fcloseall();
412
+ assert(n == 0);
413
+ #endif
414
+
415
+ bool files_on = false;
416
+ IPhreeqc obj;
417
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
418
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 12"));
419
+ obj.SetOutputFileOn(files_on);
420
+ obj.SetErrorFileOn(files_on);
421
+ obj.SetLogFileOn(files_on);
422
+ obj.SetSelectedOutputFileOn(files_on);
423
+ obj.SetDumpFileOn(files_on);
424
+ ASSERT_EQ(0, obj.RunAccumulated());
425
+ }
426
+
427
+ TEST(TestIPhreeqc, TestRunAccumulatedWithDBKeyword)
428
+ {
429
+ IPhreeqc obj;
430
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
431
+
432
+ for (int i = 0; i < 10; ++i)
433
+ {
434
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("DATABASE wateq4f.dat"));
435
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
436
+ ASSERT_EQ(0, obj.RunAccumulated());
437
+
438
+ const char* warn = obj.GetWarningString();
439
+ const char expected[] = "WARNING: DATABASE keyword is ignored by IPhreeqc.\n";
440
+
441
+ ASSERT_EQ(std::string(expected), std::string(warn));
442
+ }
443
+ }
444
+
445
+ TEST(TestIPhreeqc, TestDatabaseNotFirstKeyword)
446
+ {
447
+ IPhreeqc obj;
448
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
449
+
450
+ for (int i = 0; i < 10; ++i)
451
+ {
452
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
453
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("DATABASE wateq4f.dat"));
454
+ ASSERT_EQ(2, obj.RunAccumulated());
455
+
456
+ const char expected[] =
457
+ "ERROR: DATABASE must be the first keyword in the input file.\n"
458
+ "ERROR: Calculations terminating due to input errors.\n";
459
+ const char* err = obj.GetErrorString();
460
+
461
+ ASSERT_EQ(std::string(expected), std::string(err));
462
+ }
463
+ }
464
+
465
+ TEST(TestIPhreeqc, TestRunWithErrors)
466
+ {
467
+ const char dump_file[] = "error.inp";
468
+ IPhreeqc obj;
469
+
470
+ FileTest dfile(dump_file);
471
+ ASSERT_TRUE(dfile.RemoveExisting());
472
+
473
+ bool files_on = false;
474
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
475
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
476
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" pH 7"));
477
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Na 1"));
478
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("PHASES"));
479
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+"));
480
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" H+ = H+"));
481
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 0"));
482
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("EQUILIBRIUM_PHASES"));
483
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+ -10 HCl 10"));
484
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("END"));
485
+
486
+ obj.SetOutputFileOn(files_on);
487
+ obj.SetErrorFileOn(files_on);
488
+ obj.SetLogFileOn(files_on);
489
+ obj.SetSelectedOutputFileOn(files_on);
490
+ obj.SetDumpFileOn(files_on);
491
+ ASSERT_EQ(1, obj.RunAccumulated());
492
+
493
+ const char expected[] =
494
+ "ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1\n";
495
+ const char* err = obj.GetErrorString();
496
+
497
+ ASSERT_EQ(std::string(expected), std::string(err));
498
+
499
+ ASSERT_TRUE(dfile.VerifyExists());
500
+ ASSERT_TRUE(dfile.Size() > 0);
501
+ }
502
+
503
+ TEST(TestIPhreeqc, TestRunFile)
504
+ {
505
+ const char dump_file[] = "error.inp";
506
+
507
+ FileTest dfile(dump_file);
508
+ ASSERT_TRUE(dfile.RemoveExisting());
509
+
510
+ IPhreeqc obj;
511
+
512
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
513
+ obj.SetOutputFileOn(false);
514
+ obj.SetErrorFileOn(false);
515
+ obj.SetLogFileOn(false);
516
+ obj.SetSelectedOutputFileOn(false);
517
+ obj.SetDumpFileOn(false);
518
+ ASSERT_EQ(1, obj.RunFile("conv_fail.in"));
519
+
520
+ const char expected[] =
521
+ "ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1\n";
522
+ const char* err = obj.GetErrorString();
523
+
524
+ ASSERT_EQ(std::string(expected), std::string(err));
525
+
526
+ // Note: should this file exist since GetDumpFileOn is false?
527
+ ASSERT_TRUE(dfile.VerifyExists());
528
+ ASSERT_TRUE(dfile.Size() > 0);
529
+ }
530
+
531
+ TEST(TestIPhreeqc, TestRunString)
532
+ {
533
+ const char input[] =
534
+ "TITLE Example 1.--Add uranium and speciate seawater.\n"
535
+ "SOLUTION 1 SEAWATER FROM NORDSTROM ET AL. (1979)\n"
536
+ " units ppm\n"
537
+ " pH 8.22\n"
538
+ " pe 8.451\n"
539
+ " density 1.023\n"
540
+ " temp 25.0\n"
541
+ " redox O(0)/O(-2)\n"
542
+ " Ca 412.3\n"
543
+ " Mg 1291.8\n"
544
+ " Na 10768.0\n"
545
+ " K 399.1\n"
546
+ " Fe 0.002\n"
547
+ " Mn 0.0002 pe\n"
548
+ " Si 4.28\n"
549
+ " Cl 19353.0\n"
550
+ " Alkalinity 141.682 as HCO3\n"
551
+ " S(6) 2712.0\n"
552
+ " N(5) 0.29 gfw 62.0\n"
553
+ " N(-3) 0.03 as NH4\n"
554
+ " U 3.3 ppb N(5)/N(-3)\n"
555
+ " O(0) 1.0 O2(g) -0.7\n"
556
+ "SOLUTION_MASTER_SPECIES\n"
557
+ " U U+4 0.0 238.0290 238.0290\n"
558
+ " U(4) U+4 0.0 238.0290\n"
559
+ " U(5) UO2+ 0.0 238.0290\n"
560
+ " U(6) UO2+2 0.0 238.0290\n"
561
+ "SOLUTION_SPECIES\n"
562
+ " #primary master species for U\n"
563
+ " #is also secondary master species for U(4)\n"
564
+ " U+4 = U+4\n"
565
+ " log_k 0.0\n"
566
+ " U+4 + 4 H2O = U(OH)4 + 4 H+\n"
567
+ " log_k -8.538\n"
568
+ " delta_h 24.760 kcal\n"
569
+ " U+4 + 5 H2O = U(OH)5- + 5 H+\n"
570
+ " log_k -13.147\n"
571
+ " delta_h 27.580 kcal\n"
572
+ " #secondary master species for U(5)\n"
573
+ " U+4 + 2 H2O = UO2+ + 4 H+ + e-\n"
574
+ " log_k -6.432\n"
575
+ " delta_h 31.130 kcal\n"
576
+ " #secondary master species for U(6)\n"
577
+ " U+4 + 2 H2O = UO2+2 + 4 H+ + 2 e-\n"
578
+ " log_k -9.217\n"
579
+ " delta_h 34.430 kcal\n"
580
+ " UO2+2 + H2O = UO2OH+ + H+\n"
581
+ " log_k -5.782\n"
582
+ " delta_h 11.015 kcal\n"
583
+ " 2UO2+2 + 2H2O = (UO2)2(OH)2+2 + 2H+\n"
584
+ " log_k -5.626\n"
585
+ " delta_h -36.04 kcal\n"
586
+ " 3UO2+2 + 5H2O = (UO2)3(OH)5+ + 5H+\n"
587
+ " log_k -15.641\n"
588
+ " delta_h -44.27 kcal\n"
589
+ " UO2+2 + CO3-2 = UO2CO3\n"
590
+ " log_k 10.064\n"
591
+ " delta_h 0.84 kcal\n"
592
+ " UO2+2 + 2CO3-2 = UO2(CO3)2-2\n"
593
+ " log_k 16.977\n"
594
+ " delta_h 3.48 kcal\n"
595
+ " UO2+2 + 3CO3-2 = UO2(CO3)3-4\n"
596
+ " log_k 21.397\n"
597
+ " delta_h -8.78 kcal\n"
598
+ "PHASES\n"
599
+ " Uraninite\n"
600
+ " UO2 + 4 H+ = U+4 + 2 H2O\n"
601
+ " log_k -3.490\n"
602
+ " delta_h -18.630 kcal\n"
603
+ "END\n"
604
+ "\n";
605
+
606
+ IPhreeqc obj;
607
+
608
+ char OUTPUT_FILE[80];
609
+ //snprintf(OUTPUT_FILE, sizeof(OUTPUT_FILE), "phreeqc.%lu.out", (unsigned long)obj.GetId());
610
+ snprintf(OUTPUT_FILE, sizeof(OUTPUT_FILE), "phreeqc.%lu.out", (unsigned long)obj.GetId());
611
+
612
+ FileTest ofile(OUTPUT_FILE);
613
+ ASSERT_TRUE(ofile.RemoveExisting());
614
+
615
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
616
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
617
+ obj.SetOutputFileOn(true);
618
+ obj.SetErrorFileOn(false);
619
+ obj.SetLogFileOn(false);
620
+ obj.SetSelectedOutputFileOn(false);
621
+ obj.SetDumpFileOn(false);
622
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
623
+ ASSERT_EQ(0, obj.RunString(input));
624
+
625
+ ASSERT_TRUE(ofile.VerifyExists());
626
+ ASSERT_TRUE(ofile.Size() > 0);
627
+ }
628
+
629
+ TEST(TestIPhreeqc, TestGetSelectedOutputRowCount)
630
+ {
631
+ IPhreeqc obj;
632
+
633
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
634
+
635
+ int max = 6;
636
+
637
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
638
+ ASSERT_EQ(VR_OK, EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
639
+ ASSERT_EQ(VR_OK, USER_PUNCH(obj, "Ca", max));
640
+
641
+ obj.SetOutputFileOn(false);
642
+ obj.SetErrorFileOn(false);
643
+ obj.SetLogFileOn(false);
644
+ obj.SetSelectedOutputFileOn(false);
645
+ obj.SetDumpFileOn(false);
646
+ ASSERT_EQ(0, obj.RunAccumulated());
647
+
648
+ ASSERT_EQ(3, obj.GetSelectedOutputRowCount()); // rows + header
649
+ }
650
+
651
+ TEST(TestIPhreeqc, TestGetSelectedOutputValue)
652
+ {
653
+ int col;
654
+
655
+ IPhreeqc obj;
656
+
657
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
658
+
659
+ int max = 6;
660
+
661
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
662
+ ASSERT_EQ(VR_OK, EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
663
+ ASSERT_EQ(VR_OK, USER_PUNCH(obj, "Ca", max));
664
+
665
+ obj.SetOutputFileOn(false);
666
+ obj.SetErrorFileOn(false);
667
+ obj.SetLogFileOn(false);
668
+ obj.SetSelectedOutputFileOn(false);
669
+ obj.SetDumpFileOn(false);
670
+ ASSERT_EQ(0, obj.RunAccumulated());
671
+
672
+ /*
673
+ EXPECTED selected.out:
674
+ sim state soln dist_x time step pH pe C Ca Na m_CO3-2 m_CaOH+ m_NaCO3- la_CO3-2 la_CaOH+ la_NaCO3- Calcite d_Calcite si_CO2(g) si_Siderite pressure total mol volume g_CO2(g) g_N2(g) k_Albite dk_Albite k_Pyrite dk_Pyrite s_CaSO4 s_SrSO4 1.name 1.type 1.moles 2.name 2.type 2.moles 3.name 3.type 3.moles 4.name 4.type 4.moles 5.name 5.type 5.moles 6.name 6.type 6.moles
675
+ 1 i_soln 1 -99 -99 -99 7 4 1.0000e-003 1.0000e-003 1.0000e-003 4.2975e-007 1.1819e-009 1.1881e-009 -6.4686e+000 -8.9530e+000 -8.9507e+000 0.0000e+000 0.0000e+000 -2.2870 -999.9990 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 Ca+2 aq 9.9178e-004 CaHCO3+ aq 7.5980e-006 CaCO3 aq 6.2155e-007 CaOH+ aq 1.1819e-009
676
+ 1 react 1 -99 0 1 7.86135 10.18 1.1556e-003 1.1556e-003 1.0000e-003 4.2718e-006 9.7385e-009 1.1620e-008 -5.4781e+000 -8.0388e+000 -7.9621e+000 9.8444e-003 -1.5555e-004 -3.0192 -999.9990 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 calcite equi 9.8444e-003 Ca+2 aq 1.1371e-003 CaHCO3+ aq 1.1598e-005 CaCO3 aq 6.8668e-006 CaOH+ aq 9.7385e-009
677
+ */
678
+
679
+
680
+ CVar v;
681
+
682
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(-1, 0, &v));
683
+ ASSERT_EQ(TT_ERROR, v.type);
684
+ ASSERT_EQ(VR_INVALIDROW, v.vresult);
685
+
686
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(obj.GetSelectedOutputRowCount(), 0, &v));
687
+ ASSERT_EQ(TT_ERROR, v.type);
688
+ ASSERT_EQ(VR_INVALIDROW, v.vresult);
689
+
690
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(0, -1, &v));
691
+ ASSERT_EQ(TT_ERROR, v.type);
692
+ ASSERT_EQ(VR_INVALIDCOL, v.vresult);
693
+
694
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(0, obj.GetSelectedOutputColumnCount(), &v));
695
+ ASSERT_EQ(TT_ERROR, v.type);
696
+ ASSERT_EQ(VR_INVALIDCOL, v.vresult);
697
+
698
+
699
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 0, &v));
700
+ ASSERT_EQ(TT_STRING, v.type);
701
+ ASSERT_EQ(std::string("sim"), std::string(v.sVal));
702
+
703
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 1, &v));
704
+ ASSERT_EQ(TT_STRING, v.type);
705
+ ASSERT_EQ(std::string("state"), std::string(v.sVal));
706
+
707
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 2, &v));
708
+ ASSERT_EQ(TT_STRING, v.type);
709
+ ASSERT_EQ(std::string("soln"), std::string(v.sVal));
710
+
711
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 3, &v));
712
+ ASSERT_EQ(TT_STRING, v.type);
713
+ ASSERT_EQ(std::string("dist_x"), std::string(v.sVal));
714
+
715
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 4, &v));
716
+ ASSERT_EQ(TT_STRING, v.type);
717
+ ASSERT_EQ(std::string("time"), std::string(v.sVal));
718
+
719
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 5, &v));
720
+ ASSERT_EQ(TT_STRING, v.type);
721
+ ASSERT_EQ(std::string("step"), std::string(v.sVal));
722
+
723
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 6, &v));
724
+ ASSERT_EQ(TT_STRING, v.type);
725
+ ASSERT_EQ(std::string("pH"), std::string(v.sVal));
726
+
727
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 7, &v));
728
+ ASSERT_EQ(TT_STRING, v.type);
729
+ ASSERT_EQ(std::string("pe"), std::string(v.sVal));
730
+
731
+ col = 7;
732
+
733
+ // -totals C Ca Na
734
+ ++col;
735
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
736
+ ASSERT_EQ(TT_STRING, v.type);
737
+ ASSERT_EQ(std::string("C(mol/kgw)"), std::string(v.sVal));
738
+ ++col;
739
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
740
+ ASSERT_EQ(TT_STRING, v.type);
741
+ ASSERT_EQ(std::string("Ca(mol/kgw)"), std::string(v.sVal));
742
+ ++col;
743
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
744
+ ASSERT_EQ(TT_STRING, v.type);
745
+ ASSERT_EQ(std::string("Na(mol/kgw)"), std::string(v.sVal));
746
+
747
+ // -molalities CO3-2 CaOH+ NaCO3-
748
+ ++col;
749
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
750
+ ASSERT_EQ(TT_STRING, v.type);
751
+ ASSERT_EQ(std::string("m_CO3-2(mol/kgw)"), std::string(v.sVal));
752
+ ++col;
753
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
754
+ ASSERT_EQ(TT_STRING, v.type);
755
+ ASSERT_EQ(std::string("m_CaOH+(mol/kgw)"), std::string(v.sVal));
756
+ ++col;
757
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
758
+ ASSERT_EQ(TT_STRING, v.type);
759
+ ASSERT_EQ(std::string("m_NaCO3-(mol/kgw)"), std::string(v.sVal));
760
+
761
+ // -activities CO3-2 CaOH+ NaCO3-
762
+ ++col;
763
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
764
+ ASSERT_EQ(TT_STRING, v.type);
765
+ ASSERT_EQ(std::string("la_CO3-2"), std::string(v.sVal));
766
+ ++col;
767
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
768
+ ASSERT_EQ(TT_STRING, v.type);
769
+ ASSERT_EQ(std::string("la_CaOH+"), std::string(v.sVal));
770
+ ++col;
771
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
772
+ ASSERT_EQ(TT_STRING, v.type);
773
+ ASSERT_EQ(std::string("la_NaCO3-"), std::string(v.sVal));
774
+
775
+ // -equilibrium_phases Calcite
776
+ ++col;
777
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
778
+ ASSERT_EQ(TT_STRING, v.type);
779
+ ASSERT_EQ(std::string("Calcite"), std::string(v.sVal));
780
+ ++col;
781
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
782
+ ASSERT_EQ(TT_STRING, v.type);
783
+ ASSERT_EQ(std::string("d_Calcite"), std::string(v.sVal));
784
+
785
+
786
+ // -saturation_indices CO2(g) Siderite
787
+ ++col;
788
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
789
+ ASSERT_EQ(TT_STRING, v.type);
790
+ ASSERT_EQ(std::string("si_CO2(g)"), std::string(v.sVal));
791
+ ++col;
792
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
793
+ ASSERT_EQ(TT_STRING, v.type);
794
+ ASSERT_EQ(std::string("si_Siderite"), std::string(v.sVal));
795
+
796
+ // -gases CO2(g) N2(g)
797
+ // pressure "total mol" volume g_CO2(g) g_N2(g)
798
+ ++col;
799
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
800
+ ASSERT_EQ(TT_STRING, v.type);
801
+ ASSERT_EQ(std::string("pressure"), std::string(v.sVal));
802
+ ++col;
803
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
804
+ ASSERT_EQ(TT_STRING, v.type);
805
+ ASSERT_EQ(std::string("total mol"), std::string(v.sVal));
806
+ ++col;
807
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
808
+ ASSERT_EQ(TT_STRING, v.type);
809
+ ASSERT_EQ(std::string("volume"), std::string(v.sVal));
810
+ ++col;
811
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
812
+ ASSERT_EQ(TT_STRING, v.type);
813
+ ASSERT_EQ(std::string("g_CO2(g)"), std::string(v.sVal));
814
+ ++col;
815
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
816
+ ASSERT_EQ(TT_STRING, v.type);
817
+ ASSERT_EQ(std::string("g_N2(g)"), std::string(v.sVal));
818
+
819
+ // -kinetic_reactants Albite Pyrite
820
+ // k_Albite dk_Albite k_Pyrite dk_Pyrite
821
+ ++col;
822
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
823
+ ASSERT_EQ(TT_STRING, v.type);
824
+ ASSERT_EQ(std::string("k_Albite"), std::string(v.sVal));
825
+ ++col;
826
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
827
+ ASSERT_EQ(TT_STRING, v.type);
828
+ ASSERT_EQ(std::string("dk_Albite"), std::string(v.sVal));
829
+ ++col;
830
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
831
+ ASSERT_EQ(TT_STRING, v.type);
832
+ ASSERT_EQ(std::string("k_Pyrite"), std::string(v.sVal));
833
+ ++col;
834
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
835
+ ASSERT_EQ(TT_STRING, v.type);
836
+ ASSERT_EQ(std::string("dk_Pyrite"), std::string(v.sVal));
837
+
838
+ // -solid_solutions CaSO4 SrSO4
839
+ // s_CaSO4 s_SrSO4
840
+ ++col;
841
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
842
+ ASSERT_EQ(TT_STRING, v.type);
843
+ ASSERT_EQ(std::string("s_CaSO4"), std::string(v.sVal));
844
+ ++col;
845
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col, &v));
846
+ ASSERT_EQ(TT_STRING, v.type);
847
+ ASSERT_EQ(std::string("s_SrSO4"), std::string(v.sVal));
848
+
849
+ for (int i = 0; i < max; ++i)
850
+ {
851
+ std::ostringstream oss1, oss2, oss3;
852
+
853
+ // 1.name
854
+ //
855
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col + 1 + (i * 3), &v));
856
+ ASSERT_EQ(TT_STRING, v.type);
857
+ oss1 << i + 1 << ".name";
858
+ ASSERT_EQ(oss1.str(), std::string(v.sVal));
859
+
860
+ // 1.type
861
+ //
862
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col + 2 + (i * 3), &v));
863
+ ASSERT_EQ(TT_STRING, v.type);
864
+ oss2 << i + 1 << ".type";
865
+ ASSERT_EQ(oss2.str(), std::string(v.sVal));
866
+
867
+ // 1.moles
868
+ //
869
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, col + 3 + (i * 3), &v));
870
+ ASSERT_EQ(TT_STRING, v.type);
871
+ oss3 << i + 1 << ".moles";
872
+ ASSERT_EQ(oss3.str(), std::string(v.sVal));
873
+ }
874
+
875
+ // sim
876
+ //
877
+ col = 0;
878
+ // i_soln
879
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
880
+ ASSERT_EQ(TT_LONG, v.type);
881
+ ASSERT_EQ(1L, v.lVal);
882
+ // react
883
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
884
+ ASSERT_EQ(TT_LONG, v.type);
885
+ ASSERT_EQ(1L, v.lVal);
886
+
887
+ // state
888
+ //
889
+ ++col;
890
+ // i_soln
891
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
892
+ ASSERT_EQ(TT_STRING, v.type);
893
+ ASSERT_EQ(std::string("i_soln"), std::string(v.sVal));
894
+ // react
895
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
896
+ ASSERT_EQ(TT_STRING, v.type);
897
+ ASSERT_EQ(std::string("react"), std::string(v.sVal));
898
+
899
+ // soln
900
+ //
901
+ ++col;
902
+ // i_soln
903
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
904
+ ASSERT_EQ(TT_LONG, v.type);
905
+ ASSERT_EQ(1L, v.lVal);
906
+ // react
907
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
908
+ ASSERT_EQ(TT_LONG, v.type);
909
+ ASSERT_EQ(1L, v.lVal);
910
+
911
+ // dist_x -- (always as double)
912
+ //
913
+ ++col;
914
+ // i_soln
915
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
916
+ ASSERT_EQ(TT_DOUBLE, v.type);
917
+ ASSERT_EQ(-99., v.dVal);
918
+ // react
919
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
920
+ ASSERT_EQ(TT_DOUBLE, v.type);
921
+ ASSERT_EQ(-99., v.dVal);
922
+
923
+
924
+ // time -- (always as double)
925
+ //
926
+ ++col;
927
+ // i_soln
928
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
929
+ ASSERT_EQ(TT_DOUBLE, v.type);
930
+ ASSERT_EQ(-99., v.dVal);
931
+ // react
932
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
933
+ ASSERT_EQ(TT_DOUBLE, v.type);
934
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -DBL_DIG));
935
+
936
+ // step
937
+ //
938
+ ++col;
939
+ // i_soln
940
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
941
+ ASSERT_EQ(TT_LONG, v.type);
942
+ ASSERT_EQ(-99L, v.lVal);
943
+ // react
944
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
945
+ ASSERT_EQ(TT_LONG, v.type);
946
+ ASSERT_EQ(1L, v.lVal);
947
+
948
+
949
+ // pH
950
+ //
951
+ ++col;
952
+ // i_soln
953
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
954
+ ASSERT_EQ(TT_DOUBLE, v.type);
955
+ ASSERT_NEAR(7.0, v.dVal, ::pow(10., -DBL_DIG));
956
+ // react
957
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
958
+ ASSERT_EQ(TT_DOUBLE, v.type);
959
+ ASSERT_NEAR(7.861354, v.dVal, ::pow(10., -6));
960
+
961
+ // pe
962
+ //
963
+ ++col;
964
+ // i_soln
965
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
966
+ ASSERT_EQ(TT_DOUBLE, v.type);
967
+ ASSERT_NEAR(4.0, v.dVal, ::pow(10., -DBL_DIG));
968
+ // react
969
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
970
+ ASSERT_EQ(TT_DOUBLE, v.type);
971
+ // COMMENT: {8/8/2013 12:26:01 AM} ASSERT_NEAR( 9.90855, v.dVal, ::pow(10., -1) );
972
+
973
+ //
974
+ // -totals C Ca Na
975
+ //
976
+
977
+ // C(mol/kgw)
978
+ //
979
+ ++col;
980
+ // i_soln
981
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
982
+ ASSERT_EQ(TT_DOUBLE, v.type);
983
+ ASSERT_NEAR(1.0000e-003, v.dVal, ::pow(10., -DBL_DIG));
984
+ // react
985
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
986
+ ASSERT_EQ(TT_DOUBLE, v.type);
987
+ ASSERT_NEAR(1.1556e-003, v.dVal, ::pow(10., -7));
988
+
989
+
990
+ // Ca(mol/kgw)
991
+ //
992
+ ++col;
993
+ // i_soln
994
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
995
+ ASSERT_EQ(TT_DOUBLE, v.type);
996
+ ASSERT_NEAR(1.0000e-003, v.dVal, ::pow(10., -DBL_DIG));
997
+ // react
998
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
999
+ ASSERT_EQ(TT_DOUBLE, v.type);
1000
+ ASSERT_NEAR(1.1556e-003, v.dVal, ::pow(10., -7));
1001
+
1002
+
1003
+ // Na(mol/kgw)
1004
+ //
1005
+ ++col;
1006
+ // i_soln
1007
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1008
+ ASSERT_EQ(TT_DOUBLE, v.type);
1009
+ ASSERT_NEAR(1.0000e-003, v.dVal, ::pow(10., -DBL_DIG));
1010
+ // react
1011
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1012
+ ASSERT_EQ(TT_DOUBLE, v.type);
1013
+ ASSERT_NEAR(1.0000e-003, v.dVal, ::pow(10., -7));
1014
+
1015
+ // -molalities CO3-2 CaOH+ NaCO3-
1016
+ col += 3;
1017
+
1018
+ // -activities CO3-2 CaOH+ NaCO3-
1019
+ col += 3;
1020
+
1021
+ // -equilibrium_phases Calcite
1022
+ col += 2;
1023
+
1024
+ // -saturation_indices CO2(g) Siderite
1025
+ col += 2;
1026
+
1027
+ // -gases CO2(g) N2(g)
1028
+ col += 5;
1029
+
1030
+ // -kinetic_reactants Albite Pyrite
1031
+ // k_Albite dk_Albite k_Pyrite dk_Pyrite
1032
+ col += 4;
1033
+
1034
+ // -solid_solutions CaSO4 SrSO4
1035
+ // s_CaSO4 s_SrSO4
1036
+ col += 2;
1037
+
1038
+
1039
+ // 1.name
1040
+ //
1041
+ ++col;
1042
+ // i_soln
1043
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1044
+ ASSERT_EQ(TT_STRING, v.type);
1045
+ ASSERT_EQ(std::string("Ca+2"), std::string(v.sVal));
1046
+ // react
1047
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1048
+ ASSERT_EQ(TT_STRING, v.type);
1049
+ ASSERT_EQ(std::string("Calcite"), std::string(v.sVal));
1050
+
1051
+ // 1.type
1052
+ //
1053
+ ++col;
1054
+ // i_soln
1055
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1056
+ ASSERT_EQ(TT_STRING, v.type);
1057
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1058
+ // react
1059
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1060
+ ASSERT_EQ(TT_STRING, v.type);
1061
+ ASSERT_EQ(std::string("equi"), std::string(v.sVal));
1062
+
1063
+ // 1.moles
1064
+ //
1065
+ ++col;
1066
+ // i_soln
1067
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1068
+ ASSERT_EQ(TT_DOUBLE, v.type);
1069
+ ASSERT_NEAR(9.9177923E-04, v.dVal, ::pow(10., -11));
1070
+ // react
1071
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1072
+ ASSERT_EQ(TT_DOUBLE, v.type);
1073
+ ASSERT_NEAR(9.8444477E-03, v.dVal, ::pow(10., -10));
1074
+
1075
+ // 2.name
1076
+ //
1077
+ ++col;
1078
+ // i_soln
1079
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1080
+ ASSERT_EQ(TT_STRING, v.type);
1081
+ ASSERT_EQ(std::string("CaHCO3+"), std::string(v.sVal));
1082
+ // react
1083
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1084
+ ASSERT_EQ(TT_STRING, v.type);
1085
+ ASSERT_EQ(std::string("Ca+2"), std::string(v.sVal));
1086
+
1087
+ // 2.type
1088
+ //
1089
+ ++col;
1090
+ // i_soln
1091
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1092
+ ASSERT_EQ(TT_STRING, v.type);
1093
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1094
+ // react
1095
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1096
+ ASSERT_EQ(TT_STRING, v.type);
1097
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1098
+
1099
+ // 2.moles
1100
+ //
1101
+ ++col;
1102
+ // i_soln
1103
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1104
+ ASSERT_EQ(TT_DOUBLE, v.type);
1105
+ ASSERT_NEAR(7.5980e-006, v.dVal, ::pow(10., -10));
1106
+ // react
1107
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1108
+ ASSERT_EQ(TT_DOUBLE, v.type);
1109
+ ASSERT_NEAR(1.1371e-003, v.dVal, ::pow(10., -7));
1110
+
1111
+
1112
+ // 3.name
1113
+ //
1114
+ ++col;
1115
+ // i_soln
1116
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1117
+ ASSERT_EQ(TT_STRING, v.type);
1118
+ ASSERT_EQ(std::string("CaCO3"), std::string(v.sVal));
1119
+ // react
1120
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1121
+ ASSERT_EQ(TT_STRING, v.type);
1122
+ ASSERT_EQ(std::string("CaHCO3+"), std::string(v.sVal));
1123
+
1124
+ // 3.type
1125
+ //
1126
+ ++col;
1127
+ // i_soln
1128
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1129
+ ASSERT_EQ(TT_STRING, v.type);
1130
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1131
+ // react
1132
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1133
+ ASSERT_EQ(TT_STRING, v.type);
1134
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1135
+
1136
+ // 3.moles
1137
+ //
1138
+ ++col;
1139
+ // i_soln
1140
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1141
+ ASSERT_EQ(TT_DOUBLE, v.type);
1142
+ ASSERT_NEAR(6.2155e-007, v.dVal, ::pow(10., -11));
1143
+ // react
1144
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1145
+ ASSERT_EQ(TT_DOUBLE, v.type);
1146
+ ASSERT_NEAR(1.1598e-005, v.dVal, ::pow(10., -9));
1147
+
1148
+
1149
+
1150
+ // 4.name
1151
+ //
1152
+ ++col;
1153
+ // i_soln
1154
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1155
+ ASSERT_EQ(TT_STRING, v.type);
1156
+ ASSERT_EQ(std::string("CaOH+"), std::string(v.sVal));
1157
+ // react
1158
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1159
+ ASSERT_EQ(TT_STRING, v.type);
1160
+ ASSERT_EQ(std::string("CaCO3"), std::string(v.sVal));
1161
+
1162
+ // 4.type
1163
+ //
1164
+ ++col;
1165
+ // i_soln
1166
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1167
+ ASSERT_EQ(TT_STRING, v.type);
1168
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1169
+ // react
1170
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1171
+ ASSERT_EQ(TT_STRING, v.type);
1172
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1173
+
1174
+ // 4.moles
1175
+ //
1176
+ ++col;
1177
+ // i_soln
1178
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1179
+ ASSERT_EQ(TT_DOUBLE, v.type);
1180
+ ASSERT_NEAR(1.1819e-009, v.dVal, ::pow(10., -13));
1181
+ // react
1182
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1183
+ ASSERT_EQ(TT_DOUBLE, v.type);
1184
+ ASSERT_NEAR(6.8668e-006, v.dVal, ::pow(10., -10));
1185
+
1186
+
1187
+ // 5.name
1188
+ //
1189
+ ++col;
1190
+ // i_soln
1191
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1192
+ ASSERT_EQ(TT_EMPTY, v.type);
1193
+ // react
1194
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1195
+ ASSERT_EQ(TT_STRING, v.type);
1196
+ ASSERT_EQ(std::string("CaOH+"), std::string(v.sVal));
1197
+
1198
+ // 5.type
1199
+ //
1200
+ ++col;
1201
+ // i_soln
1202
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1203
+ ASSERT_EQ(TT_EMPTY, v.type);
1204
+ // react
1205
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1206
+ ASSERT_EQ(TT_STRING, v.type);
1207
+ ASSERT_EQ(std::string("aq"), std::string(v.sVal));
1208
+
1209
+ // 5.moles
1210
+ //
1211
+ ++col;
1212
+ // i_soln
1213
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1214
+ ASSERT_EQ(TT_EMPTY, v.type);
1215
+ // react
1216
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1217
+ ASSERT_EQ(TT_DOUBLE, v.type);
1218
+ ASSERT_NEAR(9.7385e-009, v.dVal, ::pow(10., -13));
1219
+
1220
+
1221
+ // 6.name
1222
+ //
1223
+ ++col;
1224
+ // i_soln
1225
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1226
+ ASSERT_EQ(TT_EMPTY, v.type);
1227
+ // react
1228
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1229
+ ASSERT_EQ(TT_EMPTY, v.type);
1230
+
1231
+ // 6.type
1232
+ //
1233
+ ++col;
1234
+ // i_soln
1235
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1236
+ ASSERT_EQ(TT_EMPTY, v.type);
1237
+ // react
1238
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1239
+ ASSERT_EQ(TT_EMPTY, v.type);
1240
+
1241
+ // 6.moles
1242
+ //
1243
+ ++col;
1244
+ // i_soln
1245
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, col, &v));
1246
+ ASSERT_EQ(TT_EMPTY, v.type);
1247
+ // react
1248
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, col, &v));
1249
+ ASSERT_EQ(TT_EMPTY, v.type);
1250
+ }
1251
+
1252
+ TEST(TestIPhreeqc, TestGetSelectedOutputColumnCount)
1253
+ {
1254
+ IPhreeqc obj;
1255
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
1256
+ ASSERT_EQ(0, obj.GetSelectedOutputColumnCount());
1257
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1258
+ ASSERT_EQ(VR_OK, EQUILIBRIUM_PHASES(obj, "calcite", 1.0, 1.0));
1259
+ ASSERT_EQ(VR_OK, USER_PUNCH(obj, "Ca", 10));
1260
+ ASSERT_EQ(0, obj.RunAccumulated());
1261
+ ASSERT_EQ(62, obj.GetSelectedOutputColumnCount());
1262
+ }
1263
+
1264
+ TEST(TestIPhreeqc, TestAddError)
1265
+ {
1266
+ IPhreeqc obj;
1267
+
1268
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1269
+
1270
+ // make sure initialized to empty
1271
+ //
1272
+ const char* err = obj.GetErrorString();
1273
+ ASSERT_EQ(std::string(""), std::string(err));
1274
+
1275
+ // make sure initialized to empty
1276
+ //
1277
+ const char* expected = "TESTING AddError\n";
1278
+ ASSERT_EQ((size_t)1, obj.AddError(expected));
1279
+
1280
+ // check 1
1281
+ //
1282
+ err = obj.GetErrorString();
1283
+ ASSERT_EQ(std::string(expected), std::string(err));
1284
+
1285
+ // check increment
1286
+ //
1287
+ const char* expected2 = "XXXXXX\n";
1288
+ ASSERT_EQ((size_t)2, obj.AddError(expected2));
1289
+
1290
+ // check concatenation
1291
+ //
1292
+ err = obj.GetErrorString();
1293
+ ASSERT_EQ(std::string(expected) + std::string(expected2), std::string(err));
1294
+
1295
+
1296
+ // clear errors
1297
+ //
1298
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1299
+
1300
+ // make sure back to empty
1301
+ //
1302
+ err = obj.GetErrorString();
1303
+ ASSERT_EQ(std::string(""), std::string(err));
1304
+ }
1305
+
1306
+ TEST(TestIPhreeqc, TestAccumulateLine)
1307
+ {
1308
+ // TODO
1309
+ }
1310
+
1311
+ TEST(TestIPhreeqc, TestOutputErrorString)
1312
+ {
1313
+ // TODO
1314
+ }
1315
+
1316
+ TEST(TestIPhreeqc, TestRunWithCallback)
1317
+ {
1318
+ // TODO
1319
+ }
1320
+
1321
+ TEST(TestIPhreeqc, TestRunNoDatabaseLoaded)
1322
+ {
1323
+ IPhreeqc obj;
1324
+
1325
+ #if FIXME_PROTECTED
1326
+ obj.UnLoadDatabase();
1327
+ #endif
1328
+ obj.SetOutputFileOn(false);
1329
+ obj.SetErrorFileOn(false);
1330
+ obj.SetLogFileOn(false);
1331
+ obj.SetSelectedOutputFileOn(false);
1332
+ obj.SetDumpFileOn(false);
1333
+ ASSERT_EQ(1, obj.RunAccumulated());
1334
+
1335
+ const char expected[] =
1336
+ "ERROR: RunAccumulated: No database is loaded\n";
1337
+ const char* err = obj.GetErrorString();
1338
+
1339
+ ASSERT_EQ(std::string(expected), std::string(err));
1340
+ }
1341
+
1342
+ TEST(TestIPhreeqc, TestCase1)
1343
+ {
1344
+ // Case 1 (see do_run)
1345
+ // pr.punch == TRUE
1346
+ // punch.new_def == FALSE
1347
+ // output_isopen(OUTPUT_PUNCH) == FALSE
1348
+ // selected_output_on == TRUE
1349
+
1350
+ IPhreeqc obj;
1351
+
1352
+ char SELECTED_OUT[80];
1353
+ snprintf(SELECTED_OUT, sizeof(SELECTED_OUT), "selected_1.%lu.out", (unsigned long)obj.GetId());
1354
+
1355
+ // remove punch file if it exists
1356
+ FileTest sofile(SELECTED_OUT);
1357
+ ASSERT_TRUE(sofile.RemoveExisting());
1358
+
1359
+ // clear all flags
1360
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1361
+ #if FIXME_PROTECTED
1362
+ ASSERT_EQ(false, obj.PhreeqcPtr->SelectedOutput_map.size() > 0);
1363
+ ASSERT_EQ(TRUE, obj.PhreeqcPtr->pr.punch);
1364
+ #endif
1365
+
1366
+
1367
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1368
+ ASSERT_EQ(VR_OK, USER_PUNCH(obj, "Ca", 10));
1369
+ obj.SetOutputFileOn(false);
1370
+ obj.SetErrorFileOn(false);
1371
+ obj.SetLogFileOn(false);
1372
+ obj.SetSelectedOutputFileOn(true);
1373
+ obj.SetDumpFileOn(false);
1374
+ ASSERT_EQ(0, obj.RunAccumulated());
1375
+
1376
+ ASSERT_TRUE(sofile.VerifyExists());
1377
+ ASSERT_TRUE(sofile.Size() > 0);
1378
+ ASSERT_EQ(62, obj.GetSelectedOutputColumnCount());
1379
+
1380
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1381
+ obj.SetOutputFileOn(false);
1382
+ obj.SetErrorFileOn(false);
1383
+ obj.SetLogFileOn(false);
1384
+ obj.SetSelectedOutputFileOn(true);
1385
+ obj.SetDumpFileOn(false);
1386
+ ASSERT_EQ(0, obj.RunAccumulated());
1387
+
1388
+ ASSERT_TRUE(sofile.VerifyExists());
1389
+ ASSERT_TRUE(sofile.Size() > 0);
1390
+ ASSERT_EQ(62, obj.GetSelectedOutputColumnCount());
1391
+ }
1392
+
1393
+ TEST(TestIPhreeqc, TestCase2)
1394
+ {
1395
+ // Case 2 (see do_run)
1396
+ // pr.punch == TRUE
1397
+ // punch.new_def == TRUE
1398
+ // output_isopen(OUTPUT_PUNCH) == FALSE
1399
+ // selected_output_on == TRUE
1400
+
1401
+ IPhreeqc obj;
1402
+
1403
+ // remove punch files if they exists
1404
+ //
1405
+ FileTest sofile("selected.out");
1406
+ FileTest c2file("case2.punch");
1407
+ ASSERT_TRUE(sofile.RemoveExisting());
1408
+ ASSERT_TRUE(c2file.RemoveExisting());
1409
+
1410
+ // clear all flags
1411
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1412
+ #if FIXME_PROTECTED
1413
+ ASSERT_EQ(false, obj.PhreeqcPtr->SelectedOutput_map.size() > 0);
1414
+ ASSERT_EQ(TRUE, obj.PhreeqcPtr->pr.punch);
1415
+ #endif
1416
+
1417
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1418
+ ASSERT_EQ(VR_OK, USER_PUNCH(obj, "Ca", 10));
1419
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("-file case2.punch")); // force have_punch_name to TRUE (see read_selected_ouput)
1420
+ obj.SetOutputFileOn(false);
1421
+ obj.SetErrorFileOn(false);
1422
+ obj.SetLogFileOn(false);
1423
+ obj.SetSelectedOutputFileOn(true);
1424
+ obj.SetDumpFileOn(false);
1425
+ ASSERT_EQ(0, obj.RunAccumulated());
1426
+ ASSERT_TRUE(sofile.VerifyMissing());
1427
+ ASSERT_TRUE(c2file.VerifyExists());
1428
+ ASSERT_EQ(62, obj.GetSelectedOutputColumnCount());
1429
+
1430
+
1431
+ // remove punch files if they exist
1432
+ //
1433
+ ASSERT_TRUE(sofile.RemoveExisting());
1434
+ ASSERT_TRUE(c2file.RemoveExisting());
1435
+
1436
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1437
+ ASSERT_EQ(VR_OK, USER_PUNCH(obj, "Ca", 10));
1438
+ obj.SetOutputFileOn(false);
1439
+ obj.SetErrorFileOn(false);
1440
+ obj.SetLogFileOn(false);
1441
+ obj.SetSelectedOutputFileOn(true);
1442
+ obj.SetDumpFileOn(false);
1443
+ ASSERT_EQ(0, obj.RunAccumulated());
1444
+ ASSERT_TRUE(sofile.VerifyMissing());
1445
+ ASSERT_TRUE(c2file.VerifyExists());
1446
+ ASSERT_EQ(62, obj.GetSelectedOutputColumnCount());
1447
+ }
1448
+
1449
+ TEST(TestIPhreeqc, TestPrintSelectedOutputFalse)
1450
+ {
1451
+ IPhreeqc obj;
1452
+
1453
+ // remove punch files if they exists
1454
+ //
1455
+ if (::FileExists("selected.out"))
1456
+ {
1457
+ ::DeleteFile("selected.out");
1458
+ }
1459
+ ASSERT_EQ(false, ::FileExists("selected.out"));
1460
+
1461
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1462
+
1463
+ // add solution block
1464
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1465
+
1466
+ // add selected output block
1467
+ ASSERT_EQ(VR_OK, SELECTED_OUTPUT(obj));
1468
+
1469
+ // turn off selected output
1470
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("PRINT; -selected_output false \n"));
1471
+
1472
+ // run
1473
+ obj.SetOutputFileOn(false);
1474
+ obj.SetErrorFileOn(false);
1475
+ obj.SetLogFileOn(false);
1476
+ obj.SetSelectedOutputFileOn(true);
1477
+ obj.SetDumpFileOn(false);
1478
+ ASSERT_EQ(0, obj.RunAccumulated());
1479
+
1480
+ ASSERT_EQ(0, obj.GetSelectedOutputColumnCount());
1481
+ ASSERT_EQ(0, obj.GetSelectedOutputRowCount());
1482
+
1483
+
1484
+ // reset pr.punch to TRUE
1485
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1486
+
1487
+ // add solution block
1488
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1489
+
1490
+ // add selected output block
1491
+ ASSERT_EQ(VR_OK, SELECTED_OUTPUT(obj));
1492
+
1493
+ // run
1494
+ obj.SetOutputFileOn(false);
1495
+ obj.SetErrorFileOn(false);
1496
+ obj.SetLogFileOn(false);
1497
+ obj.SetSelectedOutputFileOn(true);
1498
+ obj.SetDumpFileOn(false);
1499
+ ASSERT_EQ(0, obj.RunAccumulated());
1500
+
1501
+ ASSERT_EQ(11, obj.GetSelectedOutputColumnCount());
1502
+ ASSERT_EQ(2, obj.GetSelectedOutputRowCount());
1503
+ }
1504
+
1505
+ TEST(TestIPhreeqc, TestOutputFileOnOff)
1506
+ {
1507
+ #if defined(_WIN32)
1508
+ int n = ::_fcloseall();
1509
+ ASSERT_EQ(0, n);
1510
+ #endif
1511
+
1512
+ bool onoff[5];
1513
+ onoff[0] = true; // output_file_on
1514
+ onoff[1] = false; // error_file_on
1515
+ onoff[2] = false; // log_file_on
1516
+ onoff[3] = false; // selected_output_file_on
1517
+ onoff[4] = false; // dump_file_on
1518
+ TestFileOnOff("phreeqc.%d.out", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1519
+ }
1520
+
1521
+ TEST(TestIPhreeqc, TestErrorFileOnOff)
1522
+ {
1523
+ bool onoff[5];
1524
+ onoff[0] = false; // output_file_on
1525
+ onoff[1] = true; // error_file_on
1526
+ onoff[2] = false; // log_file_on
1527
+ onoff[3] = false; // selected_output_file_on
1528
+ onoff[4] = false; // dump_file_on
1529
+ TestFileOnOff("phreeqc.%d.err", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1530
+ }
1531
+
1532
+ TEST(TestIPhreeqc, TestLogFileOnOff)
1533
+ {
1534
+ bool onoff[5];
1535
+ onoff[0] = false; // output_file_on
1536
+ onoff[1] = false; // error_file_on
1537
+ onoff[2] = true; // log_file_on
1538
+ onoff[3] = false; // selected_output_file_on
1539
+ onoff[4] = false; // dump_file_on
1540
+ TestFileOnOff("phreeqc.%d.log", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1541
+ }
1542
+
1543
+ TEST(TestIPhreeqc, TestDumpFileOnOff)
1544
+ {
1545
+ bool onoff[5];
1546
+ onoff[0] = false; // output_file_on
1547
+ onoff[1] = false; // error_file_on
1548
+ onoff[2] = false; // log_file_on
1549
+ onoff[3] = false; // selected_output_file_on
1550
+ onoff[4] = true; // dump_file_on
1551
+ TestFileOnOff("dump.%d.out", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1552
+ }
1553
+
1554
+ TEST(TestIPhreeqc, TestSelOutFileOnOff)
1555
+ {
1556
+ bool onoff[5];
1557
+ onoff[0] = false; // output_file_on
1558
+ onoff[1] = false; // error_file_on
1559
+ onoff[2] = false; // log_file_on
1560
+ onoff[3] = true; // selected_output_file_on
1561
+ onoff[4] = false; // dump_file_on
1562
+ TestFileOnOff("selected_1.%d.out", onoff[0], onoff[1], onoff[2], onoff[3], onoff[4]);
1563
+ }
1564
+
1565
+ void TestFileOnOff(const char* FILENAME_FORMAT, bool output_file_on, bool error_file_on, bool log_file_on, bool selected_output_file_on, bool dump_file_on)
1566
+ {
1567
+ IPhreeqc obj;
1568
+
1569
+ char FILENAME[80];
1570
+ snprintf(FILENAME, sizeof(FILENAME), FILENAME_FORMAT, obj.GetId());
1571
+
1572
+ // remove FILENAME if it exists
1573
+ //
1574
+ if (::FileExists(FILENAME))
1575
+ {
1576
+ ::DeleteFile(FILENAME);
1577
+ }
1578
+ ASSERT_EQ(false, ::FileExists(FILENAME));
1579
+
1580
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1581
+
1582
+ // add solution block
1583
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1584
+
1585
+ // add selected output block
1586
+ ASSERT_EQ(VR_OK, SELECTED_OUTPUT(obj));
1587
+
1588
+ // add dump block
1589
+ ASSERT_EQ(VR_OK, DUMP(obj));
1590
+
1591
+ // run all off
1592
+ obj.SetDumpFileOn(false);
1593
+ obj.SetErrorFileOn(false);
1594
+ obj.SetLogFileOn(false);
1595
+ obj.SetOutputFileOn(false);
1596
+ obj.SetSelectedOutputFileOn(false);
1597
+ ASSERT_EQ(0, obj.RunAccumulated());
1598
+ ASSERT_EQ(false, ::FileExists(FILENAME));
1599
+
1600
+
1601
+
1602
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1603
+
1604
+ // add solution block
1605
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1606
+
1607
+ // add selected output block
1608
+ ASSERT_EQ(VR_OK, SELECTED_OUTPUT(obj));
1609
+
1610
+ // add dump block
1611
+ ASSERT_EQ(VR_OK, DUMP(obj));
1612
+
1613
+ // run
1614
+ obj.SetDumpFileOn(dump_file_on);
1615
+ obj.SetErrorFileOn(error_file_on);
1616
+ obj.SetLogFileOn(log_file_on);
1617
+ obj.SetOutputFileOn(output_file_on);
1618
+ obj.SetSelectedOutputFileOn(selected_output_file_on);
1619
+ ASSERT_EQ(0, obj.RunAccumulated());
1620
+ ASSERT_EQ(true, ::FileExists(FILENAME));
1621
+ ASSERT_TRUE(::DeleteFile(FILENAME));
1622
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1623
+
1624
+ // add solution block
1625
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1626
+
1627
+ // add selected output block
1628
+ ASSERT_EQ(VR_OK, SELECTED_OUTPUT(obj));
1629
+
1630
+ // add dump block
1631
+ ASSERT_EQ(VR_OK, DUMP(obj));
1632
+
1633
+ // run
1634
+ obj.SetDumpFileOn(false);
1635
+ obj.SetErrorFileOn(false);
1636
+ obj.SetLogFileOn(false);
1637
+ obj.SetOutputFileOn(false);
1638
+ obj.SetSelectedOutputFileOn(false);
1639
+ ASSERT_EQ(0, obj.RunAccumulated());
1640
+ ASSERT_EQ(false, ::FileExists(FILENAME));
1641
+
1642
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1643
+
1644
+ // add solution block
1645
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1646
+
1647
+ // add selected output block
1648
+ ASSERT_EQ(VR_OK, SELECTED_OUTPUT(obj));
1649
+
1650
+ // add dump block
1651
+ ASSERT_EQ(VR_OK, DUMP(obj));
1652
+
1653
+ // run
1654
+ obj.SetDumpFileOn(dump_file_on);
1655
+ obj.SetErrorFileOn(error_file_on);
1656
+ obj.SetLogFileOn(log_file_on);
1657
+ obj.SetOutputFileOn(output_file_on);
1658
+ obj.SetSelectedOutputFileOn(selected_output_file_on);
1659
+ ASSERT_EQ(0, obj.RunAccumulated());
1660
+ ASSERT_EQ(true, ::FileExists(FILENAME));
1661
+ ASSERT_TRUE(::DeleteFile(FILENAME));
1662
+ }
1663
+
1664
+ VRESULT
1665
+ SOLUTION(IPhreeqc& obj, double C, double Ca, double Na)
1666
+ {
1667
+ std::ostringstream oss;
1668
+
1669
+ oss << "SOLUTION 1\n";
1670
+ oss << "C " << C << "\n";
1671
+ oss << "Ca " << Ca << "\n";
1672
+ oss << "Na " << Na << "\n";
1673
+
1674
+ return obj.AccumulateLine(oss.str().c_str());
1675
+ }
1676
+
1677
+ VRESULT
1678
+ EQUILIBRIUM_PHASES(IPhreeqc& obj, const char* phase, double si, double amount)
1679
+ {
1680
+ std::ostringstream oss;
1681
+
1682
+ oss << "EQUILIBRIUM_PHASES\n";
1683
+ oss << phase << " " << si << " " << amount << "\n";
1684
+ return obj.AccumulateLine(oss.str().c_str());
1685
+ }
1686
+
1687
+ VRESULT
1688
+ USER_PUNCH(IPhreeqc& obj, const char* element, int max)
1689
+ {
1690
+ std::ostringstream oss;
1691
+
1692
+ oss << "USER_PUNCH\n";
1693
+
1694
+ oss << "-head ";
1695
+ for (int i = 1; i <= max; ++i)
1696
+ {
1697
+ oss << i << ".name " << i << ".type " << i << ".moles ";
1698
+ }
1699
+ oss << "\n";
1700
+ oss << "-start" << "\n";
1701
+ oss << "10 n = sys(\"" << element << "\"" << ", count, names$, types$, moles)" << "\n";
1702
+ oss << "20 n = " << max << "\n";
1703
+ oss << "30 if count < " << max << " then n = count" << "\n";
1704
+ oss << "40 for i = 1 to n" << "\n";
1705
+ oss << "50 PUNCH names$(i), types$(i), moles(i)" << "\n";
1706
+ oss << "60 next i" << "\n";
1707
+ oss << "70 list" << "\n";
1708
+ oss << "-end" << "\n";
1709
+ oss << "SELECTED_OUTPUT" << "\n";
1710
+ oss << "-totals C Ca Na" << "\n";
1711
+ oss << "-molalities CO3-2 CaOH+ NaCO3-" << "\n";
1712
+ oss << "-activities CO3-2 CaOH+ NaCO3-" << "\n";
1713
+ oss << "-equilibrium_phases Calcite" << "\n";
1714
+ oss << "-saturation_indices CO2(g) Siderite" << "\n";
1715
+ oss << "-gases CO2(g) N2(g)" << "\n";
1716
+ oss << "-kinetic_reactants Albite Pyrite" << "\n";
1717
+ oss << "-solid_solutions CaSO4 SrSO4" << "\n";
1718
+
1719
+ return obj.AccumulateLine(oss.str().c_str());
1720
+ }
1721
+
1722
+ VRESULT
1723
+ USER_PUNCH_NEH(IPhreeqc& obj)
1724
+ {
1725
+ std::ostringstream oss;
1726
+
1727
+ oss << "USER_PUNCH\n";
1728
+
1729
+ oss << "-head head0 head1 head2\n";
1730
+ oss << "-start" << "\n";
1731
+ oss << "10 PUNCH \"have0\", \"have1\", \"have2\"" << "\n";
1732
+ oss << "20 PUNCH \"missing0\", \"missing1\", \"missing2\"" << "\n";
1733
+ oss << "-end" << "\n";
1734
+ oss << "SELECTED_OUTPUT" << "\n";
1735
+ oss << "-totals C Ca Na" << "\n";
1736
+ oss << "-molalities CO3-2 CaOH+ NaCO3-" << "\n";
1737
+ oss << "-activities CO3-2 CaOH+ NaCO3-" << "\n";
1738
+ oss << "-equilibrium_phases Calcite" << "\n";
1739
+ oss << "-saturation_indices CO2(g) Siderite" << "\n";
1740
+ oss << "-gases CO2(g) N2(g)" << "\n";
1741
+ oss << "-kinetic_reactants Albite Pyrite" << "\n";
1742
+ oss << "-solid_solutions CaSO4 SrSO4" << "\n";
1743
+
1744
+ return obj.AccumulateLine(oss.str().c_str());
1745
+ }
1746
+
1747
+ VRESULT
1748
+ SELECTED_OUTPUT(IPhreeqc& obj)
1749
+ {
1750
+ std::ostringstream oss;
1751
+
1752
+ oss << "SELECTED_OUTPUT" << "\n";
1753
+ oss << "-totals C Ca Na" << "\n";
1754
+
1755
+ return obj.AccumulateLine(oss.str().c_str());
1756
+ }
1757
+
1758
+ VRESULT
1759
+ DUMP(IPhreeqc& obj)
1760
+ {
1761
+ std::ostringstream oss;
1762
+ oss << "DUMP" << "\n";
1763
+ oss << "-solution 1" << "\n";
1764
+ return obj.AccumulateLine(oss.str().c_str());
1765
+ }
1766
+
1767
+ TEST(TestIPhreeqc, TestLongHeadings)
1768
+ {
1769
+ char long_header[] = "this_is_a_long_header_0123456789012345678901234567890123456789";
1770
+ char long_value[] = "this_is_a_long_value_01234567890123456789012345678901234567890";
1771
+
1772
+ IPhreeqc obj;
1773
+
1774
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1775
+
1776
+ std::ostringstream oss;
1777
+ oss << "SOLUTION" << "\n";
1778
+
1779
+ oss << "SELECTED_OUTPUT" << "\n";
1780
+ oss << "-reset false" << "\n";
1781
+
1782
+ oss << "USER_PUNCH" << "\n";
1783
+ oss << "-head " << long_header << "\n";
1784
+ oss << "-start" << "\n";
1785
+ oss << "10 PUNCH \"" << long_value << "\"\n";
1786
+ oss << "-end" << "\n";
1787
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(oss.str().c_str()));
1788
+
1789
+ // COMMENT: {10/30/2013 10:39:40 PM} //{{
1790
+ // COMMENT: {10/30/2013 10:39:40 PM} ASSERT_EQ( VR_OK, obj.AccumulateLine("END") );
1791
+ // COMMENT: {10/30/2013 10:39:40 PM} oss << "SELECTED_OUTPUT" << "\n";
1792
+ // COMMENT: {10/30/2013 10:39:40 PM} oss << "-reset false" << "\n";
1793
+ // COMMENT: {10/30/2013 10:39:40 PM}
1794
+ // COMMENT: {10/30/2013 10:39:40 PM} oss << "USER_PUNCH" << "\n";
1795
+ // COMMENT: {10/30/2013 10:39:40 PM} oss << "-head " << long_header << "\n";
1796
+ // COMMENT: {10/30/2013 10:39:40 PM} oss << "-start" << "\n";
1797
+ // COMMENT: {10/30/2013 10:39:40 PM} oss << "10 PUNCH \"" << long_value << "\"\n";
1798
+ // COMMENT: {10/30/2013 10:39:40 PM} oss << "-end" << "\n";
1799
+ // COMMENT: {10/30/2013 10:39:40 PM} ASSERT_EQ( VR_OK, obj.AccumulateLine(oss.str().c_str()) );
1800
+ // COMMENT: {10/30/2013 10:39:40 PM} //}}
1801
+
1802
+ obj.SetOutputFileOn(false);
1803
+ obj.SetErrorFileOn(false);
1804
+ obj.SetLogFileOn(false);
1805
+ obj.SetSelectedOutputFileOn(false);
1806
+ obj.SetDumpFileOn(false);
1807
+ ASSERT_EQ(0, obj.RunAccumulated());
1808
+
1809
+ ASSERT_EQ(2, obj.GetSelectedOutputRowCount());
1810
+ ASSERT_EQ(1, obj.GetSelectedOutputColumnCount());
1811
+
1812
+ CVar v;
1813
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, 0, &v));
1814
+ ASSERT_EQ(TT_STRING, v.type);
1815
+ ASSERT_EQ(std::string(long_header), std::string(v.sVal));
1816
+
1817
+ CVar v1;
1818
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 0, &v1));
1819
+ ASSERT_EQ(TT_STRING, v1.type);
1820
+ ASSERT_EQ(std::string(long_value), std::string(v1.sVal));
1821
+
1822
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(1, 1, &v1));
1823
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(2, 0, &v1));
1824
+ }
1825
+
1826
+ TEST(TestIPhreeqc, TestDatabaseKeyword)
1827
+ {
1828
+ IPhreeqc obj;
1829
+
1830
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1831
+ obj.SetOutputFileOn(false);
1832
+ obj.SetErrorFileOn(false);
1833
+ obj.SetLogFileOn(false);
1834
+ obj.SetSelectedOutputFileOn(false);
1835
+ obj.SetDumpFileOn(false);
1836
+ ASSERT_EQ(1, obj.RunFile("dump"));
1837
+
1838
+ const char* expected =
1839
+ "ERROR: Gas not found in PHASES database, Amm(g).\n"
1840
+ "ERROR: Calculations terminating due to input errors.\n";
1841
+
1842
+ const char* err = obj.GetErrorString();
1843
+ ASSERT_EQ(std::string(expected), std::string(err));
1844
+
1845
+ const char* exp_warn =
1846
+ "WARNING: DATABASE keyword is ignored by IPhreeqc.\n"
1847
+ "WARNING: Cell-lengths were read for 1 cells. Last value is used till cell 100.\n"
1848
+ "WARNING: No dispersivities were read; disp = 0 assumed.\n"
1849
+ "WARNING: Could not find element in database, Amm.\n"
1850
+ " Concentration is set to zero.\n";
1851
+
1852
+ const char* warn = obj.GetWarningString();
1853
+ ASSERT_EQ(std::string(exp_warn), std::string(warn));
1854
+ }
1855
+
1856
+ TEST(TestIPhreeqc, TestDumpString)
1857
+ {
1858
+ IPhreeqc obj;
1859
+
1860
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1861
+
1862
+ // add solution block
1863
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
1864
+
1865
+ // add dump block
1866
+ ASSERT_EQ(VR_OK, DUMP(obj));
1867
+
1868
+ // run
1869
+ obj.SetOutputFileOn(false);
1870
+ obj.SetErrorFileOn(false);
1871
+ obj.SetLogFileOn(false);
1872
+ obj.SetSelectedOutputFileOn(false);
1873
+ obj.SetDumpFileOn(false);
1874
+ obj.SetDumpStringOn(true);
1875
+ ASSERT_EQ(0, obj.RunAccumulated());
1876
+
1877
+ const char* dump_str = obj.GetDumpString();
1878
+
1879
+ ASSERT_TRUE(::strstr(dump_str, "SOLUTION_RAW") != NULL);
1880
+ ASSERT_TRUE(::strstr(dump_str, "-temp") != NULL);
1881
+ ASSERT_TRUE(::strstr(dump_str, "-total_h") != NULL);
1882
+ ASSERT_TRUE(::strstr(dump_str, "-total_o") != NULL);
1883
+ ASSERT_TRUE(::strstr(dump_str, "-cb") != NULL);
1884
+ ASSERT_TRUE(::strstr(dump_str, "-totals") != NULL);
1885
+ ASSERT_TRUE(::strstr(dump_str, " C(4) ") != NULL);
1886
+ ASSERT_TRUE(::strstr(dump_str, " Ca ") != NULL);
1887
+ ASSERT_TRUE(::strstr(dump_str, " H(0) ") != NULL);
1888
+ ASSERT_TRUE(::strstr(dump_str, " Na ") != NULL);
1889
+ ASSERT_TRUE(::strstr(dump_str, "-pH") != NULL);
1890
+ ASSERT_TRUE(::strstr(dump_str, "-pe") != NULL);
1891
+ ASSERT_TRUE(::strstr(dump_str, "-mu") != NULL);
1892
+ ASSERT_TRUE(::strstr(dump_str, "-ah2o") != NULL);
1893
+ ASSERT_TRUE(::strstr(dump_str, "-mass_water") != NULL);
1894
+ ASSERT_TRUE(::strstr(dump_str, "-total_alkalinity") != NULL);
1895
+ ASSERT_TRUE(::strstr(dump_str, "-activities") != NULL);
1896
+ ASSERT_TRUE(::strstr(dump_str, " C(-4) ") != NULL);
1897
+ ASSERT_TRUE(::strstr(dump_str, " C(4) ") != NULL);
1898
+ ASSERT_TRUE(::strstr(dump_str, " Ca ") != NULL);
1899
+ ASSERT_TRUE(::strstr(dump_str, " E ") != NULL);
1900
+ ASSERT_TRUE(::strstr(dump_str, " H(0) ") != NULL);
1901
+ ASSERT_TRUE(::strstr(dump_str, " Na ") != NULL);
1902
+ ASSERT_TRUE(::strstr(dump_str, " O(0) ") != NULL);
1903
+ ASSERT_TRUE(::strstr(dump_str, "-gammas") != NULL);
1904
+ ASSERT_TRUE(::strstr(dump_str, "USE mix none") != NULL);
1905
+ ASSERT_TRUE(::strstr(dump_str, "USE reaction none") != NULL);
1906
+ ASSERT_TRUE(::strstr(dump_str, "USE reaction_temperature none") != NULL);
1907
+ ASSERT_TRUE(::strstr(dump_str, "USE reaction_pressure none") != NULL);
1908
+ }
1909
+
1910
+ TEST(TestIPhreeqc, TestGetDumpStringLineCount)
1911
+ {
1912
+ IPhreeqc obj;
1913
+
1914
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1915
+
1916
+ // add solution block
1917
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
1918
+
1919
+ // add dump block
1920
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
1921
+
1922
+ // run
1923
+ ASSERT_EQ(false, obj.GetOutputFileOn());
1924
+ ASSERT_EQ(false, obj.GetErrorFileOn());
1925
+ ASSERT_EQ(false, obj.GetLogFileOn());
1926
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
1927
+ ASSERT_EQ(false, obj.GetDumpFileOn());
1928
+ ASSERT_EQ(false, obj.GetDumpStringOn());
1929
+ obj.SetDumpStringOn(true);
1930
+ ASSERT_EQ(true, obj.GetDumpStringOn());
1931
+ ASSERT_EQ(0, obj.RunAccumulated());
1932
+ ASSERT_EQ(35, obj.GetDumpStringLineCount());
1933
+ }
1934
+
1935
+ TEST(TestIPhreeqc, TestGetDumpStringLine)
1936
+ {
1937
+ IPhreeqc obj;
1938
+
1939
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
1940
+
1941
+ // add solution block
1942
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
1943
+
1944
+ // add dump block
1945
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
1946
+
1947
+ // run
1948
+ ASSERT_EQ(false, obj.GetOutputFileOn());
1949
+ ASSERT_EQ(false, obj.GetErrorFileOn());
1950
+ ASSERT_EQ(false, obj.GetLogFileOn());
1951
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
1952
+ ASSERT_EQ(false, obj.GetDumpFileOn());
1953
+ ASSERT_EQ(false, obj.GetDumpStringOn());
1954
+
1955
+ obj.SetDumpStringOn(true);
1956
+ ASSERT_EQ(true, obj.GetDumpStringOn());
1957
+ ASSERT_EQ(0, obj.RunAccumulated());
1958
+ ASSERT_EQ(35, obj.GetDumpStringLineCount());
1959
+
1960
+ int line = 0;
1961
+
1962
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("SOLUTION_RAW"));
1963
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-temp"));
1964
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-pressure"));
1965
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-potential"));
1966
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-total_h"));
1967
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-total_o"));
1968
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-cb"));
1969
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-density"));
1970
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-viscosity"));
1971
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-viscos_0"));
1972
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-totals"));
1973
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" C(4) "));
1974
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" Ca "));
1975
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" H(0) "));
1976
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" Na "));
1977
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-pH"));
1978
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-pe"));
1979
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-mu"));
1980
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-ah2o"));
1981
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-mass_water"));
1982
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-soln_vol"));
1983
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-total_alkalinity"));
1984
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-activities"));
1985
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" C(-4) "));
1986
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" C(4) "));
1987
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" Ca "));
1988
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" E "));
1989
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" H(0) "));
1990
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" Na "));
1991
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr(" O(0) "));
1992
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("-gammas"));
1993
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("USE mix none"));
1994
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("USE reaction none"));
1995
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("USE reaction_temperature none"));
1996
+ EXPECT_THAT(obj.GetDumpStringLine(line++), HasSubstr("USE reaction_pressure none"));
1997
+
1998
+ // remaining lines should be empty
1999
+ ASSERT_EQ(std::string(""), std::string(obj.GetDumpStringLine(line++)));
2000
+ ASSERT_EQ(std::string(""), std::string(obj.GetDumpStringLine(line++)));
2001
+ ASSERT_EQ(std::string(""), std::string(obj.GetDumpStringLine(line++)));
2002
+ ASSERT_EQ(std::string(""), std::string(obj.GetDumpStringLine(line++)));
2003
+
2004
+ // negative lines should be empty
2005
+ ASSERT_EQ(std::string(""), std::string(obj.GetDumpStringLine(-1)));
2006
+ ASSERT_EQ(std::string(""), std::string(obj.GetDumpStringLine(-2)));
2007
+ ASSERT_EQ(std::string(""), std::string(obj.GetDumpStringLine(-3)));
2008
+ ASSERT_EQ(std::string(""), std::string(obj.GetDumpStringLine(-4)));
2009
+ }
2010
+
2011
+ TEST(TestIPhreeqc, TestGetComponentCount)
2012
+ {
2013
+ IPhreeqc obj;
2014
+
2015
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2016
+
2017
+ // add solution block
2018
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2019
+
2020
+ // run
2021
+ ASSERT_EQ(false, obj.GetOutputFileOn());
2022
+ ASSERT_EQ(false, obj.GetErrorFileOn());
2023
+ ASSERT_EQ(false, obj.GetLogFileOn());
2024
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
2025
+ ASSERT_EQ(false, obj.GetDumpFileOn());
2026
+ ASSERT_EQ(false, obj.GetDumpStringOn());
2027
+ ASSERT_EQ(0, obj.RunAccumulated());
2028
+ ASSERT_EQ((size_t)3, obj.GetComponentCount());
2029
+ }
2030
+
2031
+ TEST(TestIPhreeqc, TestGetComponent)
2032
+ {
2033
+ IPhreeqc obj;
2034
+
2035
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2036
+
2037
+ // add solution block
2038
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2039
+
2040
+ // run
2041
+ ASSERT_EQ(false, obj.GetOutputFileOn());
2042
+ ASSERT_EQ(false, obj.GetErrorFileOn());
2043
+ ASSERT_EQ(false, obj.GetLogFileOn());
2044
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
2045
+ ASSERT_EQ(false, obj.GetDumpFileOn());
2046
+ ASSERT_EQ(false, obj.GetDumpStringOn());
2047
+ ASSERT_EQ(0, obj.RunAccumulated());
2048
+ ASSERT_EQ((size_t)3, obj.GetComponentCount());
2049
+
2050
+ ASSERT_EQ(std::string(""), std::string(obj.GetComponent(-2)));
2051
+ ASSERT_EQ(std::string(""), std::string(obj.GetComponent(-1)));
2052
+
2053
+ ASSERT_EQ(std::string("C"), std::string(obj.GetComponent(0)));
2054
+ ASSERT_EQ(std::string("Ca"), std::string(obj.GetComponent(1)));
2055
+ ASSERT_EQ(std::string("Na"), std::string(obj.GetComponent(2)));
2056
+
2057
+ ASSERT_EQ(std::string(""), std::string(obj.GetComponent(3)));
2058
+ ASSERT_EQ(std::string(""), std::string(obj.GetComponent(4)));
2059
+ ASSERT_EQ(std::string(""), std::string(obj.GetComponent(5)));
2060
+ }
2061
+
2062
+ TEST(TestIPhreeqc, TestListComponents)
2063
+ {
2064
+ IPhreeqc obj;
2065
+
2066
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2067
+
2068
+ // add solution block
2069
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2070
+
2071
+ // run
2072
+ ASSERT_EQ(false, obj.GetOutputFileOn());
2073
+ ASSERT_EQ(false, obj.GetErrorFileOn());
2074
+ ASSERT_EQ(false, obj.GetLogFileOn());
2075
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
2076
+ ASSERT_EQ(false, obj.GetDumpFileOn());
2077
+ ASSERT_EQ(false, obj.GetDumpStringOn());
2078
+ ASSERT_EQ(0, obj.RunAccumulated());
2079
+
2080
+ std::list< std::string > comps = obj.ListComponents();
2081
+ ASSERT_EQ((size_t)3, comps.size());
2082
+
2083
+ std::list< std::string >::iterator it = comps.begin();
2084
+ ASSERT_EQ(std::string("C"), std::string((*it++)));
2085
+ ASSERT_EQ(std::string("Ca"), std::string((*it++)));
2086
+ ASSERT_EQ(std::string("Na"), std::string((*it++)));
2087
+ }
2088
+
2089
+ TEST(TestIPhreeqc, TestSetDumpFileName)
2090
+ {
2091
+ char DUMP_FILENAME[80];
2092
+ snprintf(DUMP_FILENAME, sizeof(DUMP_FILENAME), "dump.%06d.out", ::rand());
2093
+ if (::FileExists(DUMP_FILENAME))
2094
+ {
2095
+ ::DeleteFile(DUMP_FILENAME);
2096
+ }
2097
+
2098
+ IPhreeqc obj;
2099
+
2100
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2101
+
2102
+ // add solution block
2103
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2104
+
2105
+ // add dump block
2106
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2107
+
2108
+ // run
2109
+ obj.SetOutputFileOn(false);
2110
+ obj.SetErrorFileOn(false);
2111
+ obj.SetLogFileOn(false);
2112
+ obj.SetSelectedOutputFileOn(false);
2113
+ obj.SetDumpStringOn(false);
2114
+ obj.SetDumpFileOn(true);
2115
+ obj.SetDumpFileName(DUMP_FILENAME);
2116
+
2117
+ ASSERT_EQ(0, obj.RunAccumulated());
2118
+
2119
+ ASSERT_EQ(true, ::FileExists(DUMP_FILENAME));
2120
+
2121
+ std::string lines[35];
2122
+ std::ifstream ifs(DUMP_FILENAME);
2123
+
2124
+ size_t i = 0;
2125
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
2126
+ {
2127
+ ++i;
2128
+ }
2129
+ ifs.close();
2130
+
2131
+ int line = 0;
2132
+ EXPECT_THAT(lines[line++], HasSubstr("SOLUTION_RAW"));
2133
+ EXPECT_THAT(lines[line++], HasSubstr("-temp"));
2134
+ EXPECT_THAT(lines[line++], HasSubstr("-pressure"));
2135
+ EXPECT_THAT(lines[line++], HasSubstr("-potential"));
2136
+ EXPECT_THAT(lines[line++], HasSubstr("-total_h"));
2137
+ EXPECT_THAT(lines[line++], HasSubstr("-total_o"));
2138
+ EXPECT_THAT(lines[line++], HasSubstr("-cb"));
2139
+ EXPECT_THAT(lines[line++], HasSubstr("-density"));
2140
+ EXPECT_THAT(lines[line++], HasSubstr("-viscosity"));
2141
+ EXPECT_THAT(lines[line++], HasSubstr("-viscos_0"));
2142
+ EXPECT_THAT(lines[line++], HasSubstr("-totals"));
2143
+ EXPECT_THAT(lines[line++], HasSubstr(" C(4) "));
2144
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca "));
2145
+ EXPECT_THAT(lines[line++], HasSubstr(" H(0) "));
2146
+ EXPECT_THAT(lines[line++], HasSubstr(" Na "));
2147
+ EXPECT_THAT(lines[line++], HasSubstr("-pH"));
2148
+ EXPECT_THAT(lines[line++], HasSubstr("-pe"));
2149
+ EXPECT_THAT(lines[line++], HasSubstr("-mu"));
2150
+ EXPECT_THAT(lines[line++], HasSubstr("-ah2o"));
2151
+ EXPECT_THAT(lines[line++], HasSubstr("-mass_water"));
2152
+ EXPECT_THAT(lines[line++], HasSubstr("-soln_vol"));
2153
+ EXPECT_THAT(lines[line++], HasSubstr("-total_alkalinity"));
2154
+ EXPECT_THAT(lines[line++], HasSubstr("-activities"));
2155
+ EXPECT_THAT(lines[line++], HasSubstr(" C(-4) "));
2156
+ EXPECT_THAT(lines[line++], HasSubstr(" C(4) "));
2157
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca "));
2158
+ EXPECT_THAT(lines[line++], HasSubstr(" E "));
2159
+ EXPECT_THAT(lines[line++], HasSubstr(" H(0) "));
2160
+ EXPECT_THAT(lines[line++], HasSubstr(" Na "));
2161
+ EXPECT_THAT(lines[line++], HasSubstr(" O(0) "));
2162
+ EXPECT_THAT(lines[line++], HasSubstr("-gammas"));
2163
+ EXPECT_THAT(lines[line++], HasSubstr("USE mix none"));
2164
+ EXPECT_THAT(lines[line++], HasSubstr("USE reaction none"));
2165
+ EXPECT_THAT(lines[line++], HasSubstr("USE reaction_temperature none"));
2166
+ EXPECT_THAT(lines[line++], HasSubstr("USE reaction_pressure none"));
2167
+
2168
+ if (::FileExists(DUMP_FILENAME))
2169
+ {
2170
+ ::DeleteFile(DUMP_FILENAME);
2171
+ }
2172
+ }
2173
+
2174
+ TEST(TestIPhreeqc, TestSetOutputFileName)
2175
+ {
2176
+ char OUTPUT_FILENAME[80];
2177
+ snprintf(OUTPUT_FILENAME, sizeof(OUTPUT_FILENAME), "output.%06d.out", ::rand());
2178
+ if (::FileExists(OUTPUT_FILENAME))
2179
+ {
2180
+ ::DeleteFile(OUTPUT_FILENAME);
2181
+ }
2182
+
2183
+ IPhreeqc obj;
2184
+
2185
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat.old"));
2186
+
2187
+ // add solution block
2188
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2189
+
2190
+ // add dump block
2191
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2192
+
2193
+ // run
2194
+ obj.SetOutputFileOn(true);
2195
+ obj.SetErrorFileOn(false);
2196
+ obj.SetLogFileOn(false);
2197
+ obj.SetSelectedOutputFileOn(false);
2198
+ obj.SetDumpStringOn(false);
2199
+ obj.SetDumpFileOn(false);
2200
+ obj.SetOutputFileName(OUTPUT_FILENAME);
2201
+
2202
+ ASSERT_EQ(0, obj.RunAccumulated());
2203
+
2204
+ ASSERT_EQ(true, ::FileExists(OUTPUT_FILENAME));
2205
+
2206
+ std::string lines[200];
2207
+ std::ifstream ifs(OUTPUT_FILENAME);
2208
+
2209
+ size_t i = 0;
2210
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
2211
+ {
2212
+ ++i;
2213
+ }
2214
+
2215
+ #ifndef TESTING
2216
+ ASSERT_EQ((size_t)100, i);
2217
+ #else
2218
+ ASSERT_EQ((size_t)96, i);
2219
+ #endif
2220
+
2221
+ int line = 0;
2222
+
2223
+ // it would be better to use:
2224
+ // ASSERT_THAT(lines[line++], StartsWith("------------------------------------"));
2225
+ // but seems to not work when BUILD_SHARED_LIBS is set gtest 1.8.1
2226
+ // see aa178fd6fac2d1c0a867385538071031e2ddedde of gtest branch
2227
+ //
2228
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------------"));
2229
+ EXPECT_THAT(lines[line++], HasSubstr("Reading input data for simulation 1."));
2230
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------------"));
2231
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2232
+ EXPECT_THAT(lines[line++], HasSubstr(" SOLUTION 1"));
2233
+ EXPECT_THAT(lines[line++], HasSubstr(" C 1"));
2234
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca 1"));
2235
+ EXPECT_THAT(lines[line++], HasSubstr(" Na 1"));
2236
+ EXPECT_THAT(lines[line++], HasSubstr(" DUMP"));
2237
+ EXPECT_THAT(lines[line++], HasSubstr(" -solution 1"));
2238
+ EXPECT_THAT(lines[line++], HasSubstr("-------------------------------------------"));
2239
+ EXPECT_THAT(lines[line++], HasSubstr("Beginning of initial solution calculations."));
2240
+ EXPECT_THAT(lines[line++], HasSubstr("-------------------------------------------"));
2241
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2242
+ EXPECT_THAT(lines[line++], HasSubstr("Initial solution 1. "));
2243
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2244
+ EXPECT_THAT(lines[line++], HasSubstr("-----------------------------Solution composition--------"));
2245
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2246
+ EXPECT_THAT(lines[line++], HasSubstr(" Elements Molality Moles"));
2247
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2248
+ EXPECT_THAT(lines[line++], HasSubstr(" C "));
2249
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca "));
2250
+ EXPECT_THAT(lines[line++], HasSubstr(" Na "));
2251
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2252
+ EXPECT_THAT(lines[line++], HasSubstr("----------------------------Description of solution------"));
2253
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2254
+ EXPECT_THAT(lines[line++], HasSubstr(" pH = "));
2255
+ EXPECT_THAT(lines[line++], HasSubstr(" pe = "));
2256
+ EXPECT_THAT(lines[line++], HasSubstr(" Activity of water = "));
2257
+ EXPECT_THAT(lines[line++], HasSubstr(" Ionic strength (mol/kgw) = "));
2258
+ EXPECT_THAT(lines[line++], HasSubstr(" Mass of water (kg) = "));
2259
+ EXPECT_THAT(lines[line++], HasSubstr(" Total alkalinity (eq/kg) = "));
2260
+ EXPECT_THAT(lines[line++], HasSubstr(" Total CO2 (mol/kg) = "));
2261
+ EXPECT_THAT(lines[line++], HasSubstr(" Temperature (°C) = "));
2262
+ EXPECT_THAT(lines[line++], HasSubstr(" Electrical balance (eq) = "));
2263
+ EXPECT_THAT(lines[line++], HasSubstr(" Percent error, 100*(Cat-|An|)/(Cat+|An|) = "));
2264
+ EXPECT_THAT(lines[line++], HasSubstr(" Iterations = "));
2265
+ EXPECT_THAT(lines[line++], HasSubstr(" Total H = "));
2266
+ EXPECT_THAT(lines[line++], HasSubstr(" Total O = "));
2267
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2268
+ EXPECT_THAT(lines[line++], HasSubstr("----------------------------Distribution of species----------------------------"));
2269
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2270
+ EXPECT_THAT(lines[line++], HasSubstr(" Log Log Log mole V"));
2271
+ EXPECT_THAT(lines[line++], HasSubstr(" Species Molality Activity Molality Activity Gamma cm³/mol"));
2272
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2273
+ EXPECT_THAT(lines[line++], HasSubstr(" OH- "));
2274
+ EXPECT_THAT(lines[line++], HasSubstr(" H+ "));
2275
+ EXPECT_THAT(lines[line++], HasSubstr(" H2O "));
2276
+ EXPECT_THAT(lines[line++], HasSubstr("C(-4) "));
2277
+ EXPECT_THAT(lines[line++], HasSubstr(" CH4 "));
2278
+ EXPECT_THAT(lines[line++], HasSubstr("C(4) "));
2279
+ EXPECT_THAT(lines[line++], HasSubstr(" HCO3- "));
2280
+ EXPECT_THAT(lines[line++], HasSubstr(" CO2 "));
2281
+ EXPECT_THAT(lines[line++], HasSubstr(" CaHCO3+ "));
2282
+ EXPECT_THAT(lines[line++], HasSubstr(" CaCO3 "));
2283
+ EXPECT_THAT(lines[line++], HasSubstr(" CO3-2 "));
2284
+ EXPECT_THAT(lines[line++], HasSubstr(" NaHCO3 "));
2285
+ EXPECT_THAT(lines[line++], HasSubstr(" NaCO3- "));
2286
+ EXPECT_THAT(lines[line++], HasSubstr("Ca "));
2287
+ EXPECT_THAT(lines[line++], HasSubstr(" Ca+2 "));
2288
+ EXPECT_THAT(lines[line++], HasSubstr(" CaHCO3+ "));
2289
+ EXPECT_THAT(lines[line++], HasSubstr(" CaCO3 "));
2290
+ EXPECT_THAT(lines[line++], HasSubstr(" CaOH+ "));
2291
+ EXPECT_THAT(lines[line++], HasSubstr("H(0) "));
2292
+ EXPECT_THAT(lines[line++], HasSubstr(" H2 "));
2293
+ EXPECT_THAT(lines[line++], HasSubstr("Na "));
2294
+ EXPECT_THAT(lines[line++], HasSubstr(" Na+ "));
2295
+ EXPECT_THAT(lines[line++], HasSubstr(" NaHCO3 "));
2296
+ EXPECT_THAT(lines[line++], HasSubstr(" NaCO3- "));
2297
+ EXPECT_THAT(lines[line++], HasSubstr(" NaOH "));
2298
+ EXPECT_THAT(lines[line++], HasSubstr("O(0) "));
2299
+ EXPECT_THAT(lines[line++], HasSubstr(" O2 "));
2300
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2301
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------Saturation indices-------------------------------"));
2302
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2303
+ EXPECT_THAT(lines[line++], HasSubstr(" Phase SI** log IAP log K(298 K, 1 atm)"));
2304
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2305
+ EXPECT_THAT(lines[line++], HasSubstr(" Aragonite"));
2306
+ EXPECT_THAT(lines[line++], HasSubstr(" Calcite"));
2307
+ EXPECT_THAT(lines[line++], HasSubstr(" CH4(g)"));
2308
+ EXPECT_THAT(lines[line++], HasSubstr(" CO2(g)"));
2309
+ EXPECT_THAT(lines[line++], HasSubstr(" H2(g)"));
2310
+ EXPECT_THAT(lines[line++], HasSubstr(" H2O(g)"));
2311
+ EXPECT_THAT(lines[line++], HasSubstr(" O2(g)"));
2312
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2313
+ EXPECT_THAT(lines[line++], HasSubstr("**For a gas, SI = log10(fugacity). Fugacity = pressure * phi / 1 atm."));
2314
+ EXPECT_THAT(lines[line++], HasSubstr(" For ideal gases, phi = 1."));
2315
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2316
+ EXPECT_THAT(lines[line++], HasSubstr("------------------"));
2317
+ EXPECT_THAT(lines[line++], HasSubstr("End of simulation."));
2318
+ EXPECT_THAT(lines[line++], HasSubstr("------------------"));
2319
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2320
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------------"));
2321
+ EXPECT_THAT(lines[line++], HasSubstr("Reading input data for simulation 2."));
2322
+ EXPECT_THAT(lines[line++], HasSubstr("------------------------------------"));
2323
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2324
+ #ifndef TESTING
2325
+ EXPECT_THAT(lines[line++], HasSubstr("----------------"));
2326
+ EXPECT_THAT(lines[line++], HasSubstr("End of Run after "));
2327
+ EXPECT_THAT(lines[line++], HasSubstr("----------------"));
2328
+ #endif
2329
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2330
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2331
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2332
+ EXPECT_THAT(lines[line++], HasSubstr(""));
2333
+
2334
+
2335
+ if (::FileExists(OUTPUT_FILENAME))
2336
+ {
2337
+ ::DeleteFile(OUTPUT_FILENAME);
2338
+ }
2339
+ }
2340
+
2341
+ TEST(TestIPhreeqc, TestOutputStringOnOff)
2342
+ {
2343
+ IPhreeqc obj;
2344
+ ASSERT_EQ(false, obj.GetOutputStringOn());
2345
+
2346
+ obj.SetOutputStringOn(true);
2347
+ ASSERT_EQ(true, obj.GetOutputStringOn());
2348
+
2349
+ obj.SetOutputStringOn(false);
2350
+ ASSERT_EQ(false, obj.GetOutputStringOn());
2351
+ }
2352
+
2353
+ TEST(TestIPhreeqc, TestGetOutputString)
2354
+ {
2355
+ char OUTPUT_FILENAME[80];
2356
+ snprintf(OUTPUT_FILENAME, sizeof(OUTPUT_FILENAME), "output.%06d.out", ::rand());
2357
+ if (::FileExists(OUTPUT_FILENAME))
2358
+ {
2359
+ ::DeleteFile(OUTPUT_FILENAME);
2360
+ }
2361
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILENAME));
2362
+
2363
+ IPhreeqc obj;
2364
+
2365
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2366
+
2367
+ // add solution block
2368
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2369
+
2370
+ // add dump block
2371
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2372
+
2373
+ // run
2374
+ obj.SetOutputFileOn(true);
2375
+ obj.SetOutputStringOn(true);
2376
+
2377
+ obj.SetErrorFileOn(false);
2378
+ obj.SetLogFileOn(false);
2379
+ obj.SetSelectedOutputFileOn(false);
2380
+ obj.SetDumpStringOn(false);
2381
+ obj.SetDumpFileOn(false);
2382
+ obj.SetOutputFileName(OUTPUT_FILENAME);
2383
+
2384
+ ASSERT_EQ(0, obj.RunAccumulated());
2385
+
2386
+ ASSERT_EQ(true, ::FileExists(OUTPUT_FILENAME));
2387
+
2388
+ {
2389
+ std::ifstream ifs(OUTPUT_FILENAME);
2390
+ std::string fline((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
2391
+
2392
+ std::string sline(obj.GetOutputString());
2393
+ ASSERT_TRUE(sline.size() > 0);
2394
+
2395
+ ASSERT_EQ(fline, sline);
2396
+ }
2397
+
2398
+ if (::FileExists(OUTPUT_FILENAME))
2399
+ {
2400
+ ::DeleteFile(OUTPUT_FILENAME);
2401
+ }
2402
+ }
2403
+
2404
+ TEST(TestIPhreeqc, TestGetOutputStringLineCount)
2405
+ {
2406
+ IPhreeqc obj;
2407
+ ASSERT_EQ(0, obj.GetOutputStringLineCount());
2408
+
2409
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat.old"));
2410
+
2411
+ ASSERT_EQ(0, obj.GetOutputStringLineCount());
2412
+
2413
+ // add solution block
2414
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2415
+
2416
+ // add dump block
2417
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2418
+
2419
+ // run
2420
+ obj.SetOutputStringOn(false);
2421
+ obj.SetOutputFileOn(false);
2422
+ obj.SetErrorFileOn(false);
2423
+ obj.SetLogFileOn(false);
2424
+ obj.SetSelectedOutputFileOn(false);
2425
+ obj.SetDumpStringOn(false);
2426
+ obj.SetDumpFileOn(false);
2427
+
2428
+ ASSERT_EQ(0, obj.RunAccumulated());
2429
+ ASSERT_EQ(0, obj.GetOutputStringLineCount());
2430
+
2431
+ // add solution block
2432
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2433
+
2434
+ // add dump block
2435
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2436
+
2437
+ obj.SetOutputStringOn(true);
2438
+
2439
+ ASSERT_EQ(0, obj.RunAccumulated());
2440
+ #ifndef TESTING
2441
+ ASSERT_EQ(100, obj.GetOutputStringLineCount());
2442
+ #else
2443
+ ASSERT_EQ(96, obj.GetOutputStringLineCount());
2444
+ #endif
2445
+
2446
+
2447
+ // add solution block
2448
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2449
+
2450
+ // add dump block
2451
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2452
+
2453
+ obj.SetOutputStringOn(false);
2454
+
2455
+ ASSERT_EQ(0, obj.RunAccumulated());
2456
+ ASSERT_EQ(0, obj.GetOutputStringLineCount());
2457
+ }
2458
+
2459
+ TEST(TestIPhreeqc, TestGetOutputStringLine)
2460
+ {
2461
+ IPhreeqc obj;
2462
+ ASSERT_EQ(0, obj.GetOutputStringLineCount());
2463
+
2464
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat.old"));
2465
+
2466
+ ASSERT_EQ(0, obj.GetOutputStringLineCount());
2467
+
2468
+ // add solution block
2469
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2470
+
2471
+ // add dump block
2472
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2473
+
2474
+ // run
2475
+ obj.SetOutputStringOn(false);
2476
+ obj.SetOutputFileOn(false);
2477
+ obj.SetErrorFileOn(false);
2478
+ obj.SetLogFileOn(false);
2479
+ obj.SetSelectedOutputFileOn(false);
2480
+ obj.SetDumpStringOn(false);
2481
+ obj.SetDumpFileOn(false);
2482
+
2483
+ ASSERT_EQ(0, obj.RunAccumulated());
2484
+ ASSERT_EQ(0, obj.GetOutputStringLineCount());
2485
+
2486
+ int line = 0;
2487
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(line++)));
2488
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(line++)));
2489
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(line++)));
2490
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(line++)));
2491
+
2492
+ // negative lines should be empty
2493
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(-1)));
2494
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(-2)));
2495
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(-3)));
2496
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(-4)));
2497
+
2498
+ // add solution block
2499
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2500
+
2501
+ // add dump block
2502
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2503
+
2504
+ obj.SetOutputStringOn(true);
2505
+
2506
+ ASSERT_EQ(0, obj.RunAccumulated());
2507
+ #ifndef TESTING
2508
+ ASSERT_EQ(100, obj.GetOutputStringLineCount());
2509
+ #else
2510
+ ASSERT_EQ(96, obj.GetOutputStringLineCount());
2511
+ #endif
2512
+
2513
+ ASSERT_EQ(std::string("------------------------------------"), std::string(obj.GetOutputStringLine(0)));
2514
+ ASSERT_EQ(std::string("Reading input data for simulation 1."), std::string(obj.GetOutputStringLine(1)));
2515
+ ASSERT_EQ(std::string("------------------------------------"), std::string(obj.GetOutputStringLine(2)));
2516
+ ASSERT_EQ(std::string("-----------------------------Solution composition------------------------------"), std::string(obj.GetOutputStringLine(16)));
2517
+ ASSERT_EQ(std::string("----------------------------Description of solution----------------------------"), std::string(obj.GetOutputStringLine(24)));
2518
+ ASSERT_EQ(std::string("----------------------------Distribution of species----------------------------"), std::string(obj.GetOutputStringLine(40)));
2519
+ ASSERT_EQ(std::string("------------------------------Saturation indices-------------------------------"), std::string(obj.GetOutputStringLine(73)));
2520
+ #ifndef TESTING
2521
+ ASSERT_EQ(std::string("End of Run"), std::string(obj.GetOutputStringLine(97)).substr(0, 10));
2522
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(100)));
2523
+ #else
2524
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(96)));
2525
+ #endif
2526
+
2527
+ // add solution block
2528
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2529
+
2530
+ // add dump block
2531
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2532
+
2533
+ obj.SetOutputStringOn(false);
2534
+
2535
+ ASSERT_EQ(0, obj.RunAccumulated());
2536
+ ASSERT_EQ(0, obj.GetOutputStringLineCount());
2537
+
2538
+ line = 0;
2539
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(line++)));
2540
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(line++)));
2541
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(line++)));
2542
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(line++)));
2543
+
2544
+ // negative lines should be empty
2545
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(-1)));
2546
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(-2)));
2547
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(-3)));
2548
+ ASSERT_EQ(std::string(""), std::string(obj.GetOutputStringLine(-4)));
2549
+ }
2550
+
2551
+ TEST(TestIPhreeqc, TestSetLogFileName)
2552
+ {
2553
+ char LOG_FILENAME[80];
2554
+ snprintf(LOG_FILENAME, sizeof(LOG_FILENAME), "log.%06d.out", ::rand());
2555
+ if (::FileExists(LOG_FILENAME))
2556
+ {
2557
+ ::DeleteFile(LOG_FILENAME);
2558
+ }
2559
+
2560
+ IPhreeqc obj;
2561
+
2562
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2563
+
2564
+ // add solution block
2565
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2566
+
2567
+ // add dump block
2568
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2569
+
2570
+ // add knobs
2571
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("KNOBS"));
2572
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("\t-logfile TRUE"));
2573
+
2574
+ // run
2575
+ obj.SetLogFileOn(true);
2576
+ obj.SetErrorFileOn(false);
2577
+ obj.SetOutputFileOn(false);
2578
+ obj.SetSelectedOutputFileOn(false);
2579
+ obj.SetDumpStringOn(false);
2580
+ obj.SetDumpFileOn(false);
2581
+ obj.SetLogFileName(LOG_FILENAME);
2582
+
2583
+ ASSERT_EQ(0, obj.RunAccumulated());
2584
+
2585
+ ASSERT_EQ(true, ::FileExists(LOG_FILENAME));
2586
+
2587
+ std::string lines[33];
2588
+ std::ifstream ifs(LOG_FILENAME);
2589
+
2590
+ size_t i = 0;
2591
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i]))
2592
+ {
2593
+ ++i;
2594
+ }
2595
+
2596
+ #ifndef TESTING
2597
+ ASSERT_EQ((size_t)25, i);
2598
+ #else
2599
+ ASSERT_EQ((size_t)21, i);
2600
+ #endif
2601
+
2602
+ int line = 0;
2603
+ ASSERT_EQ(std::string("-------------------------------------------"), lines[line++]);
2604
+ ASSERT_EQ(std::string("Beginning of initial solution calculations."), lines[line++]);
2605
+ ASSERT_EQ(std::string("-------------------------------------------"), lines[line++]);
2606
+ ASSERT_EQ(std::string(""), lines[line++]);
2607
+ ASSERT_EQ(std::string("Initial solution 1. "), lines[line++]);
2608
+ ASSERT_EQ(std::string(""), lines[line++]);
2609
+ ASSERT_EQ(std::string("Iterations in revise_guesses: 2"), lines[line++]);
2610
+ ASSERT_EQ(std::string(""), lines[line++]);
2611
+ ASSERT_EQ(std::string("Number of infeasible solutions: 0"), lines[line++]);
2612
+ ASSERT_EQ(std::string("Number of basis changes: 0"), lines[line++]);
2613
+ ASSERT_EQ(std::string(""), lines[line++]);
2614
+ ASSERT_EQ(std::string("Number of iterations: 8"), lines[line++]);
2615
+ ASSERT_EQ(std::string(""), lines[line++]);
2616
+ ASSERT_EQ(std::string("------------------"), lines[line++]);
2617
+ ASSERT_EQ(std::string("End of simulation."), lines[line++]);
2618
+ ASSERT_EQ(std::string("------------------"), lines[line++]);
2619
+ ASSERT_EQ(std::string(""), lines[line++]);
2620
+ ASSERT_EQ(std::string("------------------------------------"), lines[line++]);
2621
+ ASSERT_EQ(std::string("Reading input data for simulation 2."), lines[line++]);
2622
+ ASSERT_EQ(std::string("------------------------------------"), lines[line++]);
2623
+ ASSERT_EQ(std::string(""), lines[line++]);
2624
+ #ifndef TESTING
2625
+ line++;
2626
+ ASSERT_EQ(std::string("End of Run"), lines[line++].substr(0, 10));
2627
+ line++;
2628
+ #endif
2629
+ ASSERT_EQ(std::string(""), lines[line++]);
2630
+
2631
+ if (::FileExists(LOG_FILENAME))
2632
+ {
2633
+ ::DeleteFile(LOG_FILENAME);
2634
+ }
2635
+ }
2636
+
2637
+ TEST(TestIPhreeqc, TestLogStringOnOff)
2638
+ {
2639
+ IPhreeqc obj;
2640
+ ASSERT_EQ(false, obj.GetLogStringOn());
2641
+
2642
+ obj.SetLogStringOn(true);
2643
+ ASSERT_EQ(true, obj.GetLogStringOn());
2644
+
2645
+ obj.SetLogStringOn(false);
2646
+ ASSERT_EQ(false, obj.GetLogStringOn());
2647
+ }
2648
+
2649
+ TEST(TestIPhreeqc, TestGetLogString)
2650
+ {
2651
+ char LOG_FILENAME[80];
2652
+ snprintf(LOG_FILENAME, sizeof(LOG_FILENAME), "log.%06d.out", ::rand());
2653
+ if (::FileExists(LOG_FILENAME))
2654
+ {
2655
+ ::DeleteFile(LOG_FILENAME);
2656
+ }
2657
+ ASSERT_EQ(false, ::FileExists(LOG_FILENAME));
2658
+
2659
+ IPhreeqc obj;
2660
+
2661
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2662
+
2663
+ // add solution block
2664
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2665
+
2666
+ // add dump block
2667
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2668
+
2669
+ // add knobs
2670
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("KNOBS"));
2671
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("\t-logfile TRUE"));
2672
+
2673
+ // run
2674
+ obj.SetLogFileOn(true);
2675
+ obj.SetLogStringOn(true);
2676
+
2677
+ obj.SetDumpFileOn(false);
2678
+ obj.SetDumpStringOn(false);
2679
+ obj.SetErrorFileOn(false);
2680
+ obj.SetOutputFileOn(false);
2681
+ obj.SetOutputStringOn(false);
2682
+ obj.SetSelectedOutputFileOn(false);
2683
+
2684
+ obj.SetLogFileName(LOG_FILENAME);
2685
+
2686
+ ASSERT_EQ(0, obj.RunAccumulated());
2687
+
2688
+ ASSERT_EQ(true, ::FileExists(LOG_FILENAME));
2689
+
2690
+ {
2691
+ std::ifstream ifs(LOG_FILENAME);
2692
+ std::string fline((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
2693
+
2694
+ std::string sline(obj.GetLogString());
2695
+ ASSERT_TRUE(sline.size() > 0);
2696
+
2697
+ ASSERT_EQ(fline, sline);
2698
+ }
2699
+
2700
+ if (::FileExists(LOG_FILENAME))
2701
+ {
2702
+ ::DeleteFile(LOG_FILENAME);
2703
+ }
2704
+ }
2705
+
2706
+ TEST(TestIPhreeqc, TestGetLogStringLineCount)
2707
+ {
2708
+ IPhreeqc obj;
2709
+ ASSERT_EQ(0, obj.GetLogStringLineCount());
2710
+
2711
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2712
+
2713
+ ASSERT_EQ(0, obj.GetLogStringLineCount());
2714
+
2715
+ // add solution block
2716
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2717
+
2718
+ // add dump block
2719
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2720
+
2721
+ // add knobs
2722
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("KNOBS"));
2723
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("\t-logfile TRUE"));
2724
+
2725
+ // run
2726
+ obj.SetLogStringOn(false);
2727
+ obj.SetLogFileOn(false);
2728
+ obj.SetErrorFileOn(false);
2729
+ obj.SetOutputFileOn(false);
2730
+ obj.SetSelectedOutputFileOn(false);
2731
+ obj.SetDumpStringOn(false);
2732
+ obj.SetDumpFileOn(false);
2733
+
2734
+ ASSERT_EQ(0, obj.RunAccumulated());
2735
+ ASSERT_EQ(0, obj.GetLogStringLineCount());
2736
+
2737
+ // add solution block
2738
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2739
+
2740
+ // add dump block
2741
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2742
+
2743
+ // add knobs
2744
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("KNOBS"));
2745
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("\t-logfile TRUE"));
2746
+
2747
+ obj.SetLogStringOn(true);
2748
+
2749
+ ASSERT_EQ(0, obj.RunAccumulated());
2750
+ #ifndef TESTING
2751
+ ASSERT_EQ(29, obj.GetLogStringLineCount());
2752
+ #else
2753
+ ASSERT_EQ(25, obj.GetLogStringLineCount());
2754
+ #endif
2755
+
2756
+ // add solution block
2757
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2758
+
2759
+ // add dump block
2760
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2761
+
2762
+ // add knobs
2763
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("KNOBS"));
2764
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("\t-logfile TRUE"));
2765
+
2766
+ obj.SetLogStringOn(false);
2767
+
2768
+ ASSERT_EQ(0, obj.RunAccumulated());
2769
+ ASSERT_EQ(0, obj.GetLogStringLineCount());
2770
+ }
2771
+
2772
+ TEST(TestIPhreeqc, TestGetLogStringLine)
2773
+ {
2774
+ IPhreeqc obj;
2775
+ ASSERT_EQ(0, obj.GetLogStringLineCount());
2776
+
2777
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2778
+
2779
+ ASSERT_EQ(0, obj.GetLogStringLineCount());
2780
+
2781
+ // add solution block
2782
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2783
+
2784
+ // add dump block
2785
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2786
+
2787
+ // add knobs
2788
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("KNOBS"));
2789
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("\t-logfile TRUE"));
2790
+
2791
+ // run
2792
+ obj.SetOutputStringOn(false);
2793
+ obj.SetOutputFileOn(false);
2794
+ obj.SetErrorFileOn(false);
2795
+ obj.SetLogFileOn(false);
2796
+ obj.SetSelectedOutputFileOn(false);
2797
+ obj.SetDumpStringOn(false);
2798
+ obj.SetDumpFileOn(false);
2799
+
2800
+ ASSERT_EQ(0, obj.RunAccumulated());
2801
+ ASSERT_EQ(0, obj.GetLogStringLineCount());
2802
+
2803
+ int line = 0;
2804
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2805
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2806
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2807
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2808
+
2809
+ // negative lines should be empty
2810
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(-1)));
2811
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(-2)));
2812
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(-3)));
2813
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(-4)));
2814
+
2815
+ // add solution block
2816
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2817
+
2818
+ // add dump block
2819
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2820
+
2821
+ // add knobs
2822
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("KNOBS"));
2823
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("\t-logfile TRUE"));
2824
+
2825
+ obj.SetLogStringOn(true);
2826
+
2827
+ ASSERT_EQ(0, obj.RunAccumulated());
2828
+ #ifndef TESTING
2829
+ ASSERT_EQ(29, obj.GetLogStringLineCount());
2830
+ #else
2831
+ ASSERT_EQ(25, obj.GetLogStringLineCount());
2832
+ #endif
2833
+
2834
+ line = 0;
2835
+ ASSERT_EQ(std::string("------------------------------------"), std::string(obj.GetLogStringLine(line++)));
2836
+ ASSERT_EQ(std::string("Reading input data for simulation 1."), std::string(obj.GetLogStringLine(line++)));
2837
+ ASSERT_EQ(std::string("------------------------------------"), std::string(obj.GetLogStringLine(line++)));
2838
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2839
+ ASSERT_EQ(std::string("-------------------------------------------"), std::string(obj.GetLogStringLine(line++)));
2840
+ ASSERT_EQ(std::string("Beginning of initial solution calculations."), std::string(obj.GetLogStringLine(line++)));
2841
+ ASSERT_EQ(std::string("-------------------------------------------"), std::string(obj.GetLogStringLine(line++)));
2842
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2843
+ ASSERT_EQ(std::string("Initial solution 1. "), std::string(obj.GetLogStringLine(line++)));
2844
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2845
+ ASSERT_EQ(std::string("Iterations in revise_guesses: 2"), std::string(obj.GetLogStringLine(line++)));
2846
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2847
+ ASSERT_EQ(std::string("Number of infeasible solutions: 0"), std::string(obj.GetLogStringLine(line++)));
2848
+ ASSERT_EQ(std::string("Number of basis changes: 0"), std::string(obj.GetLogStringLine(line++)));
2849
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2850
+ ASSERT_EQ(std::string("Number of iterations: 8"), std::string(obj.GetLogStringLine(line++)));
2851
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2852
+ ASSERT_EQ(std::string("------------------"), std::string(obj.GetLogStringLine(line++)));
2853
+ ASSERT_EQ(std::string("End of simulation."), std::string(obj.GetLogStringLine(line++)));
2854
+ ASSERT_EQ(std::string("------------------"), std::string(obj.GetLogStringLine(line++)));
2855
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2856
+ ASSERT_EQ(std::string("------------------------------------"), std::string(obj.GetLogStringLine(line++)));
2857
+ ASSERT_EQ(std::string("Reading input data for simulation 2."), std::string(obj.GetLogStringLine(line++)));
2858
+ ASSERT_EQ(std::string("------------------------------------"), std::string(obj.GetLogStringLine(line++)));
2859
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2860
+ #ifndef TESTING
2861
+ ASSERT_EQ(std::string("----------"), std::string(obj.GetLogStringLine(line++)).substr(0, 10));
2862
+ ASSERT_EQ(std::string("End of Run"), std::string(obj.GetLogStringLine(line++)).substr(0, 10));
2863
+ ASSERT_EQ(std::string("----------"), std::string(obj.GetLogStringLine(line++)).substr(0, 10));
2864
+ #endif
2865
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2866
+
2867
+ // add solution block
2868
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
2869
+
2870
+ // add dump block
2871
+ ASSERT_EQ(VR_OK, ::DUMP(obj));
2872
+
2873
+ // add knobs
2874
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("KNOBS"));
2875
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("\t-logfile TRUE"));
2876
+
2877
+ obj.SetLogStringOn(false);
2878
+
2879
+ ASSERT_EQ(0, obj.RunAccumulated());
2880
+ ASSERT_EQ(0, obj.GetLogStringLineCount());
2881
+
2882
+ line = 0;
2883
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2884
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2885
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2886
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(line++)));
2887
+
2888
+ // negative lines should be empty
2889
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(-1)));
2890
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(-2)));
2891
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(-3)));
2892
+ ASSERT_EQ(std::string(""), std::string(obj.GetLogStringLine(-4)));
2893
+ }
2894
+
2895
+ TEST(TestIPhreeqc, TestSetErrorFileName)
2896
+ {
2897
+ char ERR_FILENAME[80];
2898
+ snprintf(ERR_FILENAME, sizeof(ERR_FILENAME), "error.%s.out", "TestIPhreeqc-TestSetErrorFileName");
2899
+ if (::FileExists(ERR_FILENAME))
2900
+ {
2901
+ ::DeleteFile(ERR_FILENAME);
2902
+ }
2903
+
2904
+ IPhreeqc obj;
2905
+
2906
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2907
+
2908
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
2909
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" pH 7"));
2910
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Na 1"));
2911
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("PHASES"));
2912
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+"));
2913
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" H+ = H+"));
2914
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 0"));
2915
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("EQUILIBRIUM_PHASES"));
2916
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+ -10 HCl 10"));
2917
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("END"));
2918
+
2919
+ // run
2920
+ obj.SetErrorFileOn(true);
2921
+ obj.SetLogFileOn(false);
2922
+ obj.SetOutputFileOn(false);
2923
+ obj.SetSelectedOutputFileOn(false);
2924
+ obj.SetDumpStringOn(false);
2925
+ obj.SetDumpFileOn(false);
2926
+ obj.SetErrorFileName(ERR_FILENAME);
2927
+
2928
+ ASSERT_EQ(1, obj.RunAccumulated());
2929
+
2930
+ ASSERT_EQ(true, ::FileExists(ERR_FILENAME));
2931
+
2932
+ std::string lines[100];
2933
+ {
2934
+ std::ifstream ifs(ERR_FILENAME);
2935
+
2936
+ size_t i = 0;
2937
+ while (i < sizeof(lines) / sizeof(lines[0]) && std::getline(ifs, lines[i % 100]))
2938
+ {
2939
+ ++i;
2940
+ }
2941
+
2942
+ ASSERT_EQ((size_t)90, i);
2943
+ }
2944
+
2945
+ ASSERT_EQ(std::string("WARNING: Maximum iterations exceeded, 100"), lines[0]);
2946
+ ASSERT_EQ(std::string("WARNING: Numerical method failed with this set of convergence parameters."), lines[2]);
2947
+ ASSERT_EQ(std::string("ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1"), lines[88]);
2948
+ ASSERT_EQ(std::string("Stopping."), lines[89]);
2949
+
2950
+ if (::FileExists(ERR_FILENAME))
2951
+ {
2952
+ ::DeleteFile(ERR_FILENAME);
2953
+ }
2954
+ }
2955
+
2956
+ TEST(TestIPhreeqc, TestErrorStringOnOff)
2957
+ {
2958
+ IPhreeqc obj;
2959
+ ASSERT_EQ(true, obj.GetErrorStringOn());
2960
+
2961
+ obj.SetErrorStringOn(false);
2962
+ ASSERT_EQ(false, obj.GetErrorStringOn());
2963
+
2964
+ obj.SetErrorStringOn(true);
2965
+ ASSERT_EQ(true, obj.GetErrorStringOn());
2966
+
2967
+ obj.SetErrorStringOn(false);
2968
+ ASSERT_EQ(false, obj.GetErrorStringOn());
2969
+ }
2970
+
2971
+ TEST(TestIPhreeqc, TestGetErrorString)
2972
+ {
2973
+ char ERR_FILENAME[80];
2974
+ snprintf(ERR_FILENAME, sizeof(ERR_FILENAME), "error.%06d.out", ::rand());
2975
+ if (::FileExists(ERR_FILENAME))
2976
+ {
2977
+ ::DeleteFile(ERR_FILENAME);
2978
+ }
2979
+ ASSERT_EQ(false, ::FileExists(ERR_FILENAME));
2980
+
2981
+ IPhreeqc obj;
2982
+
2983
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
2984
+
2985
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
2986
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" pH 7"));
2987
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Na 1"));
2988
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("PHASES"));
2989
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+"));
2990
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" H+ = H+"));
2991
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 0"));
2992
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("EQUILIBRIUM_PHASES"));
2993
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+ -10 HCl 10"));
2994
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("END"));
2995
+
2996
+ // run
2997
+ obj.SetErrorFileOn(true);
2998
+ obj.SetErrorStringOn(true);
2999
+
3000
+ obj.SetDumpFileOn(false);
3001
+ obj.SetDumpStringOn(false);
3002
+ obj.SetLogFileOn(false);
3003
+ obj.SetOutputFileOn(false);
3004
+ obj.SetOutputStringOn(false);
3005
+ obj.SetSelectedOutputFileOn(false);
3006
+
3007
+ obj.SetErrorFileName(ERR_FILENAME);
3008
+ ASSERT_EQ(std::string(ERR_FILENAME), std::string(obj.GetErrorFileName()));
3009
+
3010
+ ASSERT_EQ(1, obj.RunAccumulated());
3011
+
3012
+ ASSERT_EQ(std::string(ERR_FILENAME), std::string(obj.GetErrorFileName()));
3013
+
3014
+ ASSERT_EQ(true, ::FileExists(ERR_FILENAME));
3015
+
3016
+ {
3017
+ std::string fline("ERROR: Numerical method failed on all combinations of convergence parameters, cell/soln/mix 1\n");
3018
+
3019
+ std::string sline(obj.GetErrorString());
3020
+ ASSERT_TRUE(sline.size() > 0);
3021
+
3022
+ ASSERT_EQ(fline, sline);
3023
+ }
3024
+
3025
+ if (::FileExists(ERR_FILENAME))
3026
+ {
3027
+ ::DeleteFile(ERR_FILENAME);
3028
+ }
3029
+ }
3030
+
3031
+ TEST(TestIPhreeqc, TestGetErrorStringLineCount)
3032
+ {
3033
+ IPhreeqc obj;
3034
+
3035
+ ASSERT_EQ(0, obj.GetErrorStringLineCount());
3036
+
3037
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
3038
+
3039
+ ASSERT_EQ(0, obj.GetErrorStringLineCount());
3040
+
3041
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
3042
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" pH 7"));
3043
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Na 1"));
3044
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("PHASES"));
3045
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+"));
3046
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" H+ = H+"));
3047
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 0"));
3048
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("EQUILIBRIUM_PHASES"));
3049
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+ -10 HCl 10"));
3050
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("END"));
3051
+
3052
+ ASSERT_EQ(true, obj.GetErrorStringOn());
3053
+ ASSERT_EQ(1, obj.RunAccumulated());
3054
+ ASSERT_EQ(1, obj.GetErrorStringLineCount());
3055
+
3056
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
3057
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" pH 7"));
3058
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Na 1"));
3059
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("PHASES"));
3060
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+"));
3061
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" H+ = H+"));
3062
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 0"));
3063
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("EQUILIBRIUM_PHASES"));
3064
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+ -10 HCl 10"));
3065
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("END"));
3066
+
3067
+ obj.SetErrorStringOn(true);
3068
+ ASSERT_EQ(1, obj.RunAccumulated());
3069
+ ASSERT_EQ(1, obj.GetErrorStringLineCount());
3070
+
3071
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
3072
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" pH 7"));
3073
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Na 1"));
3074
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("PHASES"));
3075
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+"));
3076
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" H+ = H+"));
3077
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 0"));
3078
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("EQUILIBRIUM_PHASES"));
3079
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fix_H+ -10 HCl 10"));
3080
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("END"));
3081
+
3082
+ obj.SetErrorStringOn(false);
3083
+ ASSERT_EQ(1, obj.RunAccumulated());
3084
+ ASSERT_EQ(0, obj.GetErrorStringLineCount());
3085
+ }
3086
+
3087
+ TEST(TestIPhreeqc, TestSetSelectedOutputFileName)
3088
+ {
3089
+ char SELOUT_FILENAME[80];
3090
+ snprintf(SELOUT_FILENAME, sizeof(SELOUT_FILENAME), "selected_output.%06d.out", ::rand());
3091
+ if (::FileExists(SELOUT_FILENAME))
3092
+ {
3093
+ ::DeleteFile(SELOUT_FILENAME);
3094
+ }
3095
+
3096
+ IPhreeqc obj;
3097
+
3098
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3099
+
3100
+ int max = 6;
3101
+
3102
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
3103
+ ASSERT_EQ(VR_OK, ::EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
3104
+ ASSERT_EQ(VR_OK, ::USER_PUNCH(obj, "Ca", max));
3105
+
3106
+ ASSERT_EQ(false, obj.GetOutputFileOn());
3107
+ ASSERT_EQ(false, obj.GetErrorFileOn());
3108
+ ASSERT_EQ(false, obj.GetLogFileOn());
3109
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3110
+ ASSERT_EQ(false, obj.GetDumpFileOn());
3111
+ ASSERT_EQ(false, obj.GetDumpStringOn());
3112
+
3113
+ obj.SetSelectedOutputFileOn(true);
3114
+ obj.SetSelectedOutputFileName(SELOUT_FILENAME);
3115
+
3116
+ ASSERT_EQ(0, obj.RunAccumulated());
3117
+
3118
+ ASSERT_EQ(true, ::FileExists(SELOUT_FILENAME));
3119
+
3120
+ /*
3121
+ EXPECTED selected.out:
3122
+ sim state soln dist_x time step pH pe C Ca Na m_CO3-2 m_CaOH+ m_NaCO3- la_CO3-2 la_CaOH+ la_NaCO3- Calcite d_Calcite si_CO2(g) si_Siderite pressure total mol volume g_CO2(g) g_N2(g) k_Albite dk_Albite k_Pyrite dk_Pyrite s_CaSO4 s_SrSO4 1.name 1.type 1.moles 2.name 2.type 2.moles 3.name 3.type 3.moles 4.name 4.type 4.moles 5.name 5.type 5.moles 6.name 6.type 6.moles
3123
+ 1 i_soln 1 -99 -99 -99 7 4 1.0000e-003 1.0000e-003 1.0000e-003 4.2975e-007 1.1819e-009 1.1881e-009 -6.4686e+000 -8.9530e+000 -8.9507e+000 0.0000e+000 0.0000e+000 -2.2870 -999.9990 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 Ca+2 aq 9.9178e-004 CaHCO3+ aq 7.5980e-006 CaCO3 aq 6.2155e-007 CaOH+ aq 1.1819e-009
3124
+ 1 react 1 -99 0 1 7.86135 10.18 1.1556e-003 1.1556e-003 1.0000e-003 4.2718e-006 9.7385e-009 1.1620e-008 -5.4781e+000 -8.0388e+000 -7.9621e+000 9.8444e-003 -1.5555e-004 -3.0192 -999.9990 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 0.0000e+000 calcite equi 9.8444e-003 Ca+2 aq 1.1371e-003 CaHCO3+ aq 1.1598e-005 CaCO3 aq 6.8668e-006 CaOH+ aq 9.7385e-009
3125
+ */
3126
+
3127
+ if (::FileExists(SELOUT_FILENAME))
3128
+ {
3129
+ ::DeleteFile(SELOUT_FILENAME);
3130
+ }
3131
+ }
3132
+
3133
+ TEST(TestIPhreeqc, TestSelectedOutputStringOnOff)
3134
+ {
3135
+ IPhreeqc obj;
3136
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3137
+
3138
+ obj.SetSelectedOutputFileOn(true);
3139
+ ASSERT_EQ(true, obj.GetSelectedOutputFileOn());
3140
+
3141
+ obj.SetSelectedOutputFileOn(false);
3142
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3143
+ }
3144
+
3145
+ TEST(TestIPhreeqc, TestGetSelectedOutputString)
3146
+ {
3147
+ IPhreeqc obj;
3148
+
3149
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3150
+
3151
+ int max = 6;
3152
+
3153
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
3154
+ ASSERT_EQ(VR_OK, ::EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
3155
+ ASSERT_EQ(VR_OK, ::USER_PUNCH(obj, "Ca", max));
3156
+
3157
+ ASSERT_EQ(false, obj.GetOutputFileOn());
3158
+ ASSERT_EQ(false, obj.GetErrorFileOn());
3159
+ ASSERT_EQ(false, obj.GetLogFileOn());
3160
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3161
+ ASSERT_EQ(false, obj.GetDumpFileOn());
3162
+ ASSERT_EQ(false, obj.GetDumpStringOn());
3163
+
3164
+ obj.SetSelectedOutputStringOn(true);
3165
+
3166
+ ASSERT_EQ(0, obj.RunAccumulated());
3167
+
3168
+ std::string sline(obj.GetSelectedOutputString());
3169
+
3170
+ EXPECT_THAT(sline.c_str(), HasSubstr("sim\t"));
3171
+ EXPECT_THAT(sline.c_str(), HasSubstr("state\t"));
3172
+ EXPECT_THAT(sline.c_str(), HasSubstr("soln\t"));
3173
+ EXPECT_THAT(sline.c_str(), HasSubstr("dist_x\t"));
3174
+ EXPECT_THAT(sline.c_str(), HasSubstr("time\t"));
3175
+ EXPECT_THAT(sline.c_str(), HasSubstr("step\t"));
3176
+ EXPECT_THAT(sline.c_str(), HasSubstr("pH\t"));
3177
+ EXPECT_THAT(sline.c_str(), HasSubstr("pe\t"));
3178
+ EXPECT_THAT(sline.c_str(), HasSubstr("C\t"));
3179
+ EXPECT_THAT(sline.c_str(), HasSubstr("Ca\t"));
3180
+ EXPECT_THAT(sline.c_str(), HasSubstr("Na\t"));
3181
+ EXPECT_THAT(sline.c_str(), HasSubstr("m_CO3-2\t"));
3182
+ EXPECT_THAT(sline.c_str(), HasSubstr("m_CaOH+\t"));
3183
+ EXPECT_THAT(sline.c_str(), HasSubstr("m_NaCO3-\t"));
3184
+ EXPECT_THAT(sline.c_str(), HasSubstr("la_CO3-2\t"));
3185
+ EXPECT_THAT(sline.c_str(), HasSubstr("la_CaOH+\t"));
3186
+ EXPECT_THAT(sline.c_str(), HasSubstr("la_NaCO3-\t"));
3187
+ EXPECT_THAT(sline.c_str(), HasSubstr("Calcite\t"));
3188
+ EXPECT_THAT(sline.c_str(), HasSubstr("d_Calcite\t"));
3189
+ EXPECT_THAT(sline.c_str(), HasSubstr("si_CO2(g)\t"));
3190
+ EXPECT_THAT(sline.c_str(), HasSubstr("si_Siderite\t"));
3191
+ EXPECT_THAT(sline.c_str(), HasSubstr("pressure\t"));
3192
+ EXPECT_THAT(sline.c_str(), HasSubstr("total mol\t"));
3193
+ EXPECT_THAT(sline.c_str(), HasSubstr("volume\t"));
3194
+ EXPECT_THAT(sline.c_str(), HasSubstr("g_CO2(g)\t"));
3195
+ EXPECT_THAT(sline.c_str(), HasSubstr("g_N2(g)\t"));
3196
+ EXPECT_THAT(sline.c_str(), HasSubstr("k_Albite\t"));
3197
+ EXPECT_THAT(sline.c_str(), HasSubstr("dk_Albite\t"));
3198
+ EXPECT_THAT(sline.c_str(), HasSubstr("k_Pyrite\t"));
3199
+ EXPECT_THAT(sline.c_str(), HasSubstr("dk_Pyrite\t"));
3200
+ EXPECT_THAT(sline.c_str(), HasSubstr("s_CaSO4\t"));
3201
+ EXPECT_THAT(sline.c_str(), HasSubstr("s_SrSO4\t"));
3202
+ EXPECT_THAT(sline.c_str(), HasSubstr("1.name\t"));
3203
+ EXPECT_THAT(sline.c_str(), HasSubstr("1.type\t"));
3204
+ EXPECT_THAT(sline.c_str(), HasSubstr("1.moles\t"));
3205
+ EXPECT_THAT(sline.c_str(), HasSubstr("2.name\t"));
3206
+ EXPECT_THAT(sline.c_str(), HasSubstr("2.type\t"));
3207
+ EXPECT_THAT(sline.c_str(), HasSubstr("2.moles\t"));
3208
+ EXPECT_THAT(sline.c_str(), HasSubstr("3.name\t"));
3209
+ EXPECT_THAT(sline.c_str(), HasSubstr("3.type\t"));
3210
+ EXPECT_THAT(sline.c_str(), HasSubstr("3.moles\t"));
3211
+ EXPECT_THAT(sline.c_str(), HasSubstr("4.name\t"));
3212
+ EXPECT_THAT(sline.c_str(), HasSubstr("4.type\t"));
3213
+ EXPECT_THAT(sline.c_str(), HasSubstr("4.moles\t"));
3214
+ EXPECT_THAT(sline.c_str(), HasSubstr("5.name\t"));
3215
+ EXPECT_THAT(sline.c_str(), HasSubstr("5.type\t"));
3216
+ EXPECT_THAT(sline.c_str(), HasSubstr("5.moles\t"));
3217
+ EXPECT_THAT(sline.c_str(), HasSubstr("6.name\t"));
3218
+ EXPECT_THAT(sline.c_str(), HasSubstr("6.type\t"));
3219
+ EXPECT_THAT(sline.c_str(), HasSubstr("6.moles\t"));
3220
+ EXPECT_THAT(sline.c_str(), HasSubstr("\n"));
3221
+ EXPECT_THAT(sline.c_str(), HasSubstr("i_soln\t"));
3222
+ EXPECT_THAT(sline.c_str(), HasSubstr("react\t"));
3223
+ EXPECT_THAT(sline.c_str(), HasSubstr("Ca+2\t"));
3224
+ EXPECT_THAT(sline.c_str(), HasSubstr("aq\t"));
3225
+ EXPECT_THAT(sline.c_str(), HasSubstr("CaHCO3+\t"));
3226
+ EXPECT_THAT(sline.c_str(), HasSubstr("CaCO3\t"));
3227
+ EXPECT_THAT(sline.c_str(), HasSubstr("CaOH+\t"));
3228
+ EXPECT_THAT(sline.c_str(), HasSubstr("Calcite\t"));
3229
+ EXPECT_THAT(sline.c_str(), HasSubstr("equi\t"));
3230
+ }
3231
+
3232
+ TEST(TestIPhreeqc, TestGetSelectedOutputStringLineCount)
3233
+ {
3234
+ IPhreeqc obj;
3235
+
3236
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3237
+
3238
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3239
+
3240
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3241
+
3242
+ int max = 6;
3243
+
3244
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
3245
+ ASSERT_EQ(VR_OK, ::EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
3246
+ ASSERT_EQ(VR_OK, ::USER_PUNCH(obj, "Ca", max));
3247
+
3248
+ ASSERT_EQ(false, obj.GetOutputFileOn());
3249
+ ASSERT_EQ(false, obj.GetErrorFileOn());
3250
+ ASSERT_EQ(false, obj.GetLogFileOn());
3251
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3252
+ ASSERT_EQ(false, obj.GetDumpFileOn());
3253
+ ASSERT_EQ(false, obj.GetDumpStringOn());
3254
+
3255
+ ASSERT_EQ(false, obj.GetSelectedOutputStringOn());
3256
+ obj.SetSelectedOutputStringOn(true);
3257
+ ASSERT_EQ(true, obj.GetSelectedOutputStringOn());
3258
+
3259
+ ASSERT_EQ(0, obj.RunAccumulated());
3260
+
3261
+ ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount());
3262
+ }
3263
+
3264
+ TEST(TestIPhreeqc, TestGetSelectedOutputStringLineCountMultipleRuns)
3265
+ {
3266
+ IPhreeqc obj;
3267
+ int retval = 0;
3268
+
3269
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3270
+ ASSERT_EQ(false, obj.GetSelectedOutputStringOn());
3271
+ obj.SetSelectedOutputStringOn(true);
3272
+ ASSERT_EQ(true, obj.GetSelectedOutputStringOn());
3273
+
3274
+ retval = obj.RunString(R"(
3275
+ SOLUTION 1
3276
+ C 1
3277
+ Ca 1
3278
+ Na 1
3279
+
3280
+ EQUILIBRIUM_PHASES
3281
+ calcite 0 0.01
3282
+
3283
+ SELECTED_OUTPUT
3284
+ -totals C Ca Na
3285
+ )");
3286
+ ASSERT_EQ(0, retval);
3287
+
3288
+ ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount()); // header + i_soln + react
3289
+
3290
+ retval = obj.RunString(R"(
3291
+ SOLUTION 1
3292
+ C 2
3293
+ Ca 2
3294
+ Na 2
3295
+ )");
3296
+ ASSERT_EQ(0, retval);
3297
+
3298
+ ASSERT_EQ(2, obj.GetSelectedOutputStringLineCount()); // header + i_soln
3299
+ }
3300
+
3301
+ TEST(TestIPhreeqc, TestSelectedOutputFileMultipleRuns)
3302
+ {
3303
+ FileTest selout("TestSelectedOutputFileMultipleRuns.sel");
3304
+ ASSERT_TRUE(selout.RemoveExisting());
3305
+
3306
+ IPhreeqc obj;
3307
+ int retval = 0;
3308
+
3309
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3310
+
3311
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3312
+ obj.SetSelectedOutputFileOn(true);
3313
+ ASSERT_EQ(true, obj.GetSelectedOutputFileOn());
3314
+
3315
+ retval = obj.RunString(R"(
3316
+ SOLUTION 1
3317
+ C 1
3318
+ Ca 1
3319
+ Na 1
3320
+
3321
+ EQUILIBRIUM_PHASES
3322
+ calcite 0 0.01
3323
+
3324
+ SELECTED_OUTPUT
3325
+ -file TestSelectedOutputFileMultipleRuns.sel
3326
+ -totals C Ca Na
3327
+ )");
3328
+ ASSERT_EQ(0, retval);
3329
+
3330
+ ASSERT_EQ(3, selout.LineCount()); // header + i_soln + react
3331
+
3332
+ retval = obj.RunString(R"(
3333
+ SOLUTION 1
3334
+ C 2
3335
+ Ca 2
3336
+ Na 2
3337
+ )");
3338
+ ASSERT_EQ(0, retval);
3339
+
3340
+ ASSERT_EQ(2, selout.LineCount()); // header + i_soln
3341
+ }
3342
+
3343
+ TEST(TestIPhreeqc, TestGetSelectedOutputRowCountMultipleRuns)
3344
+ {
3345
+ IPhreeqc obj;
3346
+
3347
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3348
+
3349
+ obj.RunString(R"(
3350
+ SOLUTION 1
3351
+ C 1
3352
+ Ca 1
3353
+ Na 1
3354
+
3355
+ EQUILIBRIUM_PHASES
3356
+ calcite 0 0.01
3357
+
3358
+ SELECTED_OUTPUT
3359
+ -totals C Ca Na
3360
+ )");
3361
+
3362
+ ASSERT_EQ(3, obj.GetSelectedOutputRowCount()); // header + i_soln + react
3363
+
3364
+ obj.RunString(R"(
3365
+ SOLUTION 1
3366
+ C 2
3367
+ Ca 2
3368
+ Na 2
3369
+ )");
3370
+ ASSERT_EQ(2, obj.GetSelectedOutputRowCount()); // header + i_soln
3371
+ }
3372
+
3373
+ TEST(TestIPhreeqc, TestGetSelectedOutputStringLine)
3374
+ {
3375
+ IPhreeqc obj;
3376
+
3377
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3378
+
3379
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3380
+
3381
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3382
+
3383
+ int max = 6;
3384
+
3385
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
3386
+ ASSERT_EQ(VR_OK, ::EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
3387
+ ASSERT_EQ(VR_OK, ::USER_PUNCH(obj, "Ca", max));
3388
+
3389
+ ASSERT_EQ(false, obj.GetOutputFileOn());
3390
+ ASSERT_EQ(false, obj.GetErrorFileOn());
3391
+ ASSERT_EQ(false, obj.GetLogFileOn());
3392
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3393
+ ASSERT_EQ(false, obj.GetDumpFileOn());
3394
+ ASSERT_EQ(false, obj.GetDumpStringOn());
3395
+
3396
+ ASSERT_EQ(false, obj.GetSelectedOutputStringOn());
3397
+
3398
+ ASSERT_EQ(0, obj.RunAccumulated());
3399
+ ASSERT_EQ(0, obj.GetSelectedOutputStringLineCount());
3400
+
3401
+ int line = 0;
3402
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(line++)));
3403
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(line++)));
3404
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(line++)));
3405
+
3406
+ // negative lines should be empty
3407
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-1)));
3408
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-2)));
3409
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-3)));
3410
+
3411
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
3412
+ ASSERT_EQ(VR_OK, ::EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
3413
+ ASSERT_EQ(VR_OK, ::USER_PUNCH(obj, "Ca", max));
3414
+
3415
+ ASSERT_EQ(false, obj.GetSelectedOutputStringOn());
3416
+ obj.SetSelectedOutputStringOn(true);
3417
+ ASSERT_EQ(true, obj.GetSelectedOutputStringOn());
3418
+
3419
+ ASSERT_EQ(0, obj.RunAccumulated());
3420
+ ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount());
3421
+
3422
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "sim\t") != NULL);
3423
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "state\t") != NULL);
3424
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "soln\t") != NULL);
3425
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dist_x\t") != NULL);
3426
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "time\t") != NULL);
3427
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "step\t") != NULL);
3428
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pH\t") != NULL);
3429
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pe\t") != NULL);
3430
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "C\t") != NULL);
3431
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Ca\t") != NULL);
3432
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Na\t") != NULL);
3433
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "m_CO3-2\t") != NULL);
3434
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "m_CaOH+\t") != NULL);
3435
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "m_NaCO3-\t") != NULL);
3436
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "la_CO3-2\t") != NULL);
3437
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "la_CaOH+\t") != NULL);
3438
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "la_NaCO3-\t") != NULL);
3439
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Calcite\t") != NULL);
3440
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "d_Calcite\t") != NULL);
3441
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "si_CO2(g)\t") != NULL);
3442
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "si_Siderite\t") != NULL);
3443
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pressure\t") != NULL);
3444
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "total mol\t") != NULL);
3445
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "volume\t") != NULL);
3446
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "g_CO2(g)\t") != NULL);
3447
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "g_N2(g)\t") != NULL);
3448
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "k_Albite\t") != NULL);
3449
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dk_Albite\t") != NULL);
3450
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "k_Pyrite\t") != NULL);
3451
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dk_Pyrite\t") != NULL);
3452
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "s_CaSO4\t") != NULL);
3453
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "s_SrSO4\t") != NULL);
3454
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "1.name\t") != NULL);
3455
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "1.type\t") != NULL);
3456
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "1.moles\t") != NULL);
3457
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "2.name\t") != NULL);
3458
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "2.type\t") != NULL);
3459
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "2.moles\t") != NULL);
3460
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "3.name\t") != NULL);
3461
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "3.type\t") != NULL);
3462
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "3.moles\t") != NULL);
3463
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "4.name\t") != NULL);
3464
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "4.type\t") != NULL);
3465
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "4.moles\t") != NULL);
3466
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "5.name\t") != NULL);
3467
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "5.type\t") != NULL);
3468
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "5.moles\t") != NULL);
3469
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "6.name\t") != NULL);
3470
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "6.type\t") != NULL);
3471
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "6.moles\t") != NULL);
3472
+
3473
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "i_soln\t") != NULL);
3474
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "Ca+2\t") != NULL);
3475
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "aq\t") != NULL);
3476
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "CaHCO3+\t") != NULL);
3477
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "CaCO3\t") != NULL);
3478
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "CaOH+\t") != NULL);
3479
+
3480
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "react\t") != NULL);
3481
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "Calcite\t") != NULL);
3482
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "equi\t") != NULL);
3483
+
3484
+ // after obj.GetSelectedOutputStringLineCount() should be empty
3485
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(obj.GetSelectedOutputStringLineCount())));
3486
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(obj.GetSelectedOutputStringLineCount() + 1)));
3487
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(obj.GetSelectedOutputStringLineCount() + 2)));
3488
+
3489
+ // negative lines should be empty
3490
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-1)));
3491
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-2)));
3492
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-3)));
3493
+ }
3494
+
3495
+ TEST(TestIPhreeqc, TestGetSelectedOutputStringLineNotEnoughHeadings)
3496
+ {
3497
+ IPhreeqc obj;
3498
+
3499
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3500
+
3501
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3502
+
3503
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3504
+
3505
+ ASSERT_EQ(VR_OK, ::SOLUTION(obj, 1.0, 1.0, 1.0));
3506
+ ASSERT_EQ(VR_OK, ::EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
3507
+ ASSERT_EQ(VR_OK, ::USER_PUNCH_NEH(obj));
3508
+
3509
+ ASSERT_EQ(false, obj.GetOutputFileOn());
3510
+ ASSERT_EQ(false, obj.GetErrorFileOn());
3511
+ ASSERT_EQ(false, obj.GetLogFileOn());
3512
+ ASSERT_EQ(false, obj.GetSelectedOutputFileOn());
3513
+ ASSERT_EQ(false, obj.GetDumpFileOn());
3514
+ ASSERT_EQ(false, obj.GetDumpStringOn());
3515
+
3516
+ ASSERT_EQ(false, obj.GetSelectedOutputStringOn() != 0);
3517
+ obj.SetSelectedOutputStringOn(true);
3518
+
3519
+ ASSERT_EQ(0, obj.RunAccumulated());
3520
+ ASSERT_EQ(3, obj.GetSelectedOutputStringLineCount());
3521
+
3522
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "sim\t") != NULL);
3523
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "state\t") != NULL);
3524
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "soln\t") != NULL);
3525
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dist_x\t") != NULL);
3526
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "time\t") != NULL);
3527
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "step\t") != NULL);
3528
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pH\t") != NULL);
3529
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pe\t") != NULL);
3530
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "C\t") != NULL);
3531
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Ca\t") != NULL);
3532
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Na\t") != NULL);
3533
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "m_CO3-2\t") != NULL);
3534
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "m_CaOH+\t") != NULL);
3535
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "m_NaCO3-\t") != NULL);
3536
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "la_CO3-2\t") != NULL);
3537
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "la_CaOH+\t") != NULL);
3538
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "la_NaCO3-\t") != NULL);
3539
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Calcite\t") != NULL);
3540
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "d_Calcite\t") != NULL);
3541
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "si_CO2(g)\t") != NULL);
3542
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "si_Siderite\t") != NULL);
3543
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pressure\t") != NULL);
3544
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "total mol\t") != NULL);
3545
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "volume\t") != NULL);
3546
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "g_CO2(g)\t") != NULL);
3547
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "g_N2(g)\t") != NULL);
3548
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "k_Albite\t") != NULL);
3549
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dk_Albite\t") != NULL);
3550
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "k_Pyrite\t") != NULL);
3551
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dk_Pyrite\t") != NULL);
3552
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "s_CaSO4\t") != NULL);
3553
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "s_SrSO4\t") != NULL);
3554
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "head0\t") != NULL);
3555
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "head1\t") != NULL);
3556
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "head2\t") != NULL);
3557
+
3558
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "i_soln\t") != NULL);
3559
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "have0\t") != NULL);
3560
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "have1\t") != NULL);
3561
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "have2\t") != NULL);
3562
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "missing0\t") != NULL);
3563
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "missing2\t") != NULL);
3564
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "missing2\t") != NULL);
3565
+
3566
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "react\t") != NULL);
3567
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "have0\t") != NULL);
3568
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "have1\t") != NULL);
3569
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "have2\t") != NULL);
3570
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "missing0\t") != NULL);
3571
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "missing2\t") != NULL);
3572
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "missing2\t") != NULL);
3573
+
3574
+ // after obj.GetSelectedOutputStringLineCount() should be empty
3575
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(obj.GetSelectedOutputStringLineCount())));
3576
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(obj.GetSelectedOutputStringLineCount() + 1)));
3577
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(obj.GetSelectedOutputStringLineCount() + 2)));
3578
+
3579
+ // negative lines should be empty
3580
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-1)));
3581
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-2)));
3582
+ ASSERT_EQ(std::string(""), std::string(obj.GetSelectedOutputStringLine(-3)));
3583
+ }
3584
+
3585
+ TEST(TestIPhreeqc, TestLongUser_Punch)
3586
+ {
3587
+ // stream tests
3588
+ std::ostringstream oss;
3589
+ PHRQ_io::fpunchf_helper(&oss, "%2046.2046s", "TEST");
3590
+ ASSERT_EQ((size_t)2046, oss.str().size());
3591
+ std::string s0(oss.str());
3592
+ ASSERT_EQ(std::string("TEST"), trim(s0));
3593
+
3594
+ oss.clear(); oss.seekp(0);
3595
+ PHRQ_io::fpunchf_helper(&oss, "%2047.2047s", "TEST");
3596
+ ASSERT_EQ((size_t)2047, oss.str().size());
3597
+ std::string s1(oss.str());
3598
+ ASSERT_EQ(std::string("TEST"), trim(s1));
3599
+
3600
+ oss.clear(); oss.seekp(0);
3601
+ PHRQ_io::fpunchf_helper(&oss, "%2048.2048s", "TEST");
3602
+ ASSERT_EQ((size_t)2048, oss.str().size());
3603
+ std::string s2(oss.str());
3604
+ ASSERT_EQ(std::string("TEST"), trim(s2));
3605
+
3606
+ oss.clear(); oss.seekp(0);
3607
+ PHRQ_io::fpunchf_helper(&oss, "%2049.2049s", "TEST");
3608
+ ASSERT_EQ((size_t)2049, oss.str().size());
3609
+ std::string s3(oss.str());
3610
+ ASSERT_EQ(std::string("TEST"), trim(s3));
3611
+
3612
+ oss.clear(); oss.seekp(0);
3613
+ PHRQ_io::fpunchf_helper(&oss, "%2050.2050s", "TEST");
3614
+ ASSERT_EQ((size_t)2050, oss.str().size());
3615
+ std::string s4(oss.str());
3616
+ ASSERT_EQ(std::string("TEST"), trim(s4));
3617
+
3618
+
3619
+ // string tests
3620
+ std::string str;
3621
+ PHRQ_io::fpunchf_helper(&str, "%2046.2046s", "TEST");
3622
+ ASSERT_EQ((size_t)2046, str.size());
3623
+ ASSERT_EQ(std::string("TEST"), trim(str));
3624
+
3625
+ str.clear();
3626
+ PHRQ_io::fpunchf_helper(&str, "%2047.2047s", "TEST");
3627
+ ASSERT_EQ((size_t)2047, str.size());
3628
+ ASSERT_EQ(std::string("TEST"), trim(str));
3629
+
3630
+ str.clear();
3631
+ PHRQ_io::fpunchf_helper(&str, "%2048.2048s", "TEST");
3632
+ ASSERT_EQ((size_t)2048, str.size());
3633
+ ASSERT_EQ(std::string("TEST"), trim(str));
3634
+
3635
+ str.clear();
3636
+ PHRQ_io::fpunchf_helper(&str, "%2049.2049s", "TEST");
3637
+ ASSERT_EQ((size_t)2049, str.size());
3638
+ ASSERT_EQ(std::string("TEST"), trim(str));
3639
+
3640
+ str.clear();
3641
+ PHRQ_io::fpunchf_helper(&str, "%2050.2050s", "TEST");
3642
+ ASSERT_EQ((size_t)2050, str.size());
3643
+ ASSERT_EQ(std::string("TEST"), trim(str));
3644
+
3645
+ const char input[] =
3646
+ "PRINT\n"
3647
+ " -selected_output t\n"
3648
+ "SOLUTION\n"
3649
+ "SELECTED_OUTPUT\n"
3650
+ " -reset false\n"
3651
+ "USER_PUNCH\n"
3652
+ "1 REM 255 CHARACTER STRING\n"
3653
+ "10 temp$ = \"XXXXX123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345\"\n"
3654
+ "20 PUNCH temp$\n";
3655
+
3656
+ IPhreeqc obj;
3657
+ obj.SetSelectedOutputFileOn(true);
3658
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
3659
+ ASSERT_EQ(0, obj.RunString(input));
3660
+ }
3661
+
3662
+ TEST(TestIPhreeqc, TestBasicSURF)
3663
+ {
3664
+ IPhreeqc obj;
3665
+
3666
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
3667
+
3668
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SURFACE_MASTER_SPECIES"));
3669
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfa Surfa"));
3670
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfb Surfb"));
3671
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SURFACE_SPECIES"));
3672
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfa = Surfa"));
3673
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 0"));
3674
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfb = Surfb"));
3675
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 0"));
3676
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfa + Zn+2 = SurfaZn+2"));
3677
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 5."));
3678
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfb + Zn+2 = SurfbZn+2"));
3679
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 6."));
3680
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfa + Cu+2 = SurfaCu+2"));
3681
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 4.5"));
3682
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfb + Cu+2 = SurfbCu+2"));
3683
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" log_k 6.5"));
3684
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1"));
3685
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" pH 8"));
3686
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" units mol/kgw"));
3687
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fe(3) 1e-2"));
3688
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Zn 1e-4"));
3689
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Cu 1e-5"));
3690
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Na 1e-1"));
3691
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Cl 1e-1"));
3692
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("EQUILIBRIUM_PHASES 1"));
3693
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Fe(OH)3(a) 0 0"));
3694
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SELECTED_OUTPUT"));
3695
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("USER_PUNCH"));
3696
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" -headings Hfo-Zn Surfa-Zn Surfb-Zn Surfa-Cu Surfb-Cu"));
3697
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("-start"));
3698
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("10 PUNCH SURF(\"Zn\",\"Hfo\")"));
3699
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("20 PUNCH SURF(\"Zn\",\"Surfa\")"));
3700
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("30 PUNCH SURF(\"Zn\",\"Surfb\")"));
3701
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("40 PUNCH SURF(\"Cu\",\"Surfa\")"));
3702
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("50 PUNCH SURF(\"Cu\",\"Surfb\")"));
3703
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("-end"));
3704
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SURFACE 1"));
3705
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Hfo_sOH Fe(OH)3(a) equilibrium_phase 0.005 53300"));
3706
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Hfo_wOH Fe(OH)3(a) equilibrium_phase 0.2"));
3707
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfa 0.2 100. 2"));
3708
+ ASSERT_EQ(VR_OK, obj.AccumulateLine(" Surfb 0.1 100. 1"));
3709
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("END"));
3710
+
3711
+ obj.SetOutputStringOn(true);
3712
+ obj.SetOutputFileOn(false);
3713
+ obj.SetErrorFileOn(false);
3714
+ obj.SetLogFileOn(false);
3715
+ obj.SetSelectedOutputFileOn(false);
3716
+ obj.SetDumpStringOn(false);
3717
+ obj.SetDumpFileOn(false);
3718
+
3719
+ ASSERT_EQ(0, obj.RunAccumulated());
3720
+
3721
+ ASSERT_EQ(13, obj.GetSelectedOutputColumnCount());
3722
+ ASSERT_EQ(3, obj.GetSelectedOutputRowCount());
3723
+
3724
+ CVar v;
3725
+
3726
+ const int offset = 8;
3727
+
3728
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, offset + 0, &v));
3729
+ ASSERT_EQ(TT_STRING, v.type);
3730
+ ASSERT_EQ(std::string("Hfo-Zn"), std::string(v.sVal));
3731
+
3732
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, offset + 1, &v));
3733
+ ASSERT_EQ(TT_STRING, v.type);
3734
+ ASSERT_EQ(std::string("Surfa-Zn"), std::string(v.sVal));
3735
+
3736
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, offset + 2, &v));
3737
+ ASSERT_EQ(TT_STRING, v.type);
3738
+ ASSERT_EQ(std::string("Surfb-Zn"), std::string(v.sVal));
3739
+
3740
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, offset + 3, &v));
3741
+ ASSERT_EQ(TT_STRING, v.type);
3742
+ ASSERT_EQ(std::string("Surfa-Cu"), std::string(v.sVal));
3743
+
3744
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, offset + 4, &v));
3745
+ ASSERT_EQ(TT_STRING, v.type);
3746
+ ASSERT_EQ(std::string("Surfb-Cu"), std::string(v.sVal));
3747
+
3748
+
3749
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, offset + 0, &v));
3750
+ ASSERT_EQ(TT_DOUBLE, v.type);
3751
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3752
+
3753
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, offset + 1, &v));
3754
+ ASSERT_EQ(TT_DOUBLE, v.type);
3755
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3756
+
3757
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, offset + 2, &v));
3758
+ ASSERT_EQ(TT_DOUBLE, v.type);
3759
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3760
+
3761
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, offset + 3, &v));
3762
+ ASSERT_EQ(TT_DOUBLE, v.type);
3763
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3764
+
3765
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, offset + 4, &v));
3766
+ ASSERT_EQ(TT_DOUBLE, v.type);
3767
+ ASSERT_NEAR(0.0, v.dVal, ::pow(10., -FLT_DIG));
3768
+
3769
+
3770
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, offset + 0, &v));
3771
+ ASSERT_EQ(TT_DOUBLE, v.type);
3772
+ ASSERT_NEAR(6.3861e-005, v.dVal, ::pow(10., -FLT_DIG));
3773
+
3774
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, offset + 1, &v));
3775
+ ASSERT_EQ(TT_DOUBLE, v.type);
3776
+ ASSERT_NEAR(1.7868e-005, v.dVal, ::pow(10., -FLT_DIG));
3777
+
3778
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, offset + 2, &v));
3779
+ ASSERT_EQ(TT_DOUBLE, v.type);
3780
+ ASSERT_NEAR(1.8248e-005, v.dVal, ::pow(10., -FLT_DIG));
3781
+
3782
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, offset + 3, &v));
3783
+ ASSERT_EQ(TT_DOUBLE, v.type);
3784
+ ASSERT_NEAR(4.6216e-009, v.dVal, ::pow(10., -FLT_DIG));
3785
+
3786
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, offset + 4, &v));
3787
+ ASSERT_EQ(TT_DOUBLE, v.type);
3788
+ ASSERT_NEAR(4.7201e-008, v.dVal, ::pow(10., -FLT_DIG));
3789
+ }
3790
+
3791
+ #include <time.h>
3792
+ TEST(TestIPhreeqc, TestCErrorReporter)
3793
+ {
3794
+ IPhreeqc obj;
3795
+
3796
+ ASSERT_EQ(0, obj.LoadDatabase("llnl.dat"));
3797
+
3798
+ int max = 6;
3799
+
3800
+ ASSERT_EQ(VR_OK, SOLUTION(obj, 1.0, 1.0, 1.0));
3801
+ ASSERT_EQ(VR_OK, EQUILIBRIUM_PHASES(obj, "calcite", 0.0, 0.010));
3802
+ ASSERT_EQ(VR_OK, USER_PUNCH(obj, "Ca", max));
3803
+
3804
+ obj.SetOutputFileOn(0);
3805
+ obj.SetErrorFileOn(0);
3806
+ obj.SetLogFileOn(0);
3807
+ obj.SetSelectedOutputFileOn(0);
3808
+ obj.SetDumpFileOn(0);
3809
+ ASSERT_EQ(0, obj.RunAccumulated());
3810
+
3811
+ //clock_t t0 = clock();
3812
+ int nrows = obj.GetSelectedOutputRowCount();
3813
+ int ncols = obj.GetSelectedOutputColumnCount();
3814
+ CVar var;
3815
+ for (int c = 0; c < 4000; ++c)
3816
+ {
3817
+ for (int row = 0; row < nrows; ++row)
3818
+ {
3819
+ for (int col = 0; col < ncols; ++col)
3820
+ {
3821
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(row, col, &var));
3822
+ }
3823
+ }
3824
+ }
3825
+ //clock_t t = clock();
3826
+ //printf("\ntime = %g\n", double(t - t0));
3827
+ }
3828
+
3829
+ TEST(TestIPhreeqc, TestDelete)
3830
+ {
3831
+ const char input[] =
3832
+ "SOLUTION 1 # definition of initial condition 1\n"
3833
+ "COPY cell 1 7405 # copy cell 1 to placeholder cell with index larger than the number of cells in the model domain\n"
3834
+ "END\n"
3835
+ "DELETE # delete initial condition 1 to allow for a redefinition of all reactions\n"
3836
+ "-cell 1\n"
3837
+ "END\n"
3838
+ "# define other initial conditions and copy to another placeholder cell\n"
3839
+ "\n"
3840
+ "COPY cell 7405 1 # copy back from placeholder cell to domain cell 1\n"
3841
+ "END\n"
3842
+ "MIX 1 # mix according to initial moisture content\n"
3843
+ " 1 0.25\n"
3844
+ "END\n"
3845
+ "RUN_CELLS\n"
3846
+ "-cells 1\n"
3847
+ "-start_time 0\n"
3848
+ "-time_step 0\n"
3849
+ "DELETE # remove mix reaction in subsequent runs\n"
3850
+ "-mix 1\n"
3851
+ "END\n"
3852
+ "RUN_CELLS\n"
3853
+ "-cells 1\n";
3854
+
3855
+ IPhreeqc obj;
3856
+
3857
+ char OUTPUT_FILE[80];
3858
+ snprintf(OUTPUT_FILE, sizeof(OUTPUT_FILE), "phreeqc.%lu.out", (unsigned long)obj.GetId());
3859
+
3860
+ if (::FileExists(OUTPUT_FILE))
3861
+ {
3862
+ ASSERT_TRUE(::DeleteFile(OUTPUT_FILE));
3863
+ }
3864
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
3865
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
3866
+ obj.SetOutputFileOn(0);
3867
+ obj.SetErrorFileOn(0);
3868
+ obj.SetLogFileOn(0);
3869
+ obj.SetSelectedOutputFileOn(0);
3870
+ obj.SetDumpFileOn(0);
3871
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
3872
+ ASSERT_EQ(0, obj.RunString(input));
3873
+ ASSERT_EQ(false, ::FileExists(OUTPUT_FILE));
3874
+ if (::FileExists(OUTPUT_FILE))
3875
+ {
3876
+ ASSERT_TRUE(::DeleteFile(OUTPUT_FILE));
3877
+ }
3878
+ }
3879
+
3880
+ TEST(TestIPhreeqc, TestRunFileMultiPunchOn)
3881
+ {
3882
+ FileTest set1("multi_punch_1.sel");
3883
+ ASSERT_TRUE(set1.RemoveExisting());
3884
+
3885
+ FileTest set2("multi_punch_2.sel");
3886
+ ASSERT_TRUE(set2.RemoveExisting());
3887
+
3888
+ FileTest set3("multi_punch_3.sel");
3889
+ ASSERT_TRUE(set3.RemoveExisting());
3890
+
3891
+ IPhreeqc obj;
3892
+
3893
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
3894
+ obj.SetCurrentSelectedOutputUserNumber(1);
3895
+ obj.SetSelectedOutputFileOn(true);
3896
+ obj.SetCurrentSelectedOutputUserNumber(2);
3897
+ obj.SetSelectedOutputFileOn(true);
3898
+ obj.SetCurrentSelectedOutputUserNumber(3);
3899
+ obj.SetSelectedOutputFileOn(true);
3900
+ ASSERT_EQ(0, obj.RunFile("multi_punch"));
3901
+
3902
+ ASSERT_TRUE(set1.VerifyExists());
3903
+ ASSERT_TRUE(set2.VerifyExists());
3904
+ ASSERT_TRUE(set3.VerifyExists());
3905
+ }
3906
+
3907
+ TEST(TestIPhreeqc, TestRunFileMultiPunchOff)
3908
+ {
3909
+ FileTest set1("multi_punch_1.sel");
3910
+ ASSERT_TRUE(set1.RemoveExisting());
3911
+
3912
+ FileTest set2("multi_punch_2.sel");
3913
+ ASSERT_TRUE(set2.RemoveExisting());
3914
+
3915
+ FileTest set3("multi_punch_3.sel");
3916
+ ASSERT_TRUE(set3.RemoveExisting());
3917
+
3918
+ IPhreeqc obj;
3919
+
3920
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
3921
+ obj.SetOutputFileOn(false);
3922
+ obj.SetErrorFileOn(false);
3923
+ obj.SetLogFileOn(false);
3924
+ obj.SetSelectedOutputFileOn(false);
3925
+ obj.SetDumpFileOn(false);
3926
+ ASSERT_EQ(0, obj.RunFile("multi_punch"));
3927
+
3928
+ ASSERT_TRUE(set1.VerifyMissing());
3929
+ ASSERT_TRUE(set2.VerifyMissing());
3930
+ ASSERT_TRUE(set3.VerifyMissing());
3931
+ }
3932
+
3933
+ TEST(TestIPhreeqc, TestRunFileMultiPunchSet)
3934
+ {
3935
+ FileTest called("XXX.sel");
3936
+ ASSERT_TRUE(called.RemoveExisting());
3937
+
3938
+ FileTest set1("multi_punch_1.sel");
3939
+ ASSERT_TRUE(set1.RemoveExisting());
3940
+
3941
+ FileTest set2("multi_punch_2.sel");
3942
+ ASSERT_TRUE(set2.RemoveExisting());
3943
+
3944
+ FileTest set3("multi_punch_3.sel");
3945
+ ASSERT_TRUE(set3.RemoveExisting());
3946
+
3947
+ IPhreeqc obj;
3948
+
3949
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
3950
+
3951
+ obj.SetCurrentSelectedOutputUserNumber(1);
3952
+ obj.SetSelectedOutputFileOn(true);
3953
+ obj.SetCurrentSelectedOutputUserNumber(2);
3954
+ obj.SetSelectedOutputFileOn(true);
3955
+ obj.SetCurrentSelectedOutputUserNumber(3);
3956
+ obj.SetSelectedOutputFileOn(true);
3957
+
3958
+ obj.SetSelectedOutputFileName(called.GetName().c_str());
3959
+
3960
+ ASSERT_EQ(0, obj.RunFile("multi_punch"));
3961
+
3962
+ ASSERT_TRUE(called.VerifyMissing());
3963
+
3964
+ ASSERT_TRUE(set1.VerifyExists());
3965
+ ASSERT_TRUE(set2.VerifyExists());
3966
+ ASSERT_TRUE(set3.VerifyExists());
3967
+ }
3968
+
3969
+ TEST(TestIPhreeqc, TestRunFileMultiPunchNoSet)
3970
+ {
3971
+ IPhreeqc obj;
3972
+
3973
+ FileTest set("XXX.sel");
3974
+ ASSERT_TRUE(set.RemoveExisting());
3975
+
3976
+ #if FIXME_PROTECTED
3977
+ FileTest unset1(obj.sel_file_name(1));
3978
+ ASSERT_TRUE(unset1.RemoveExisting());
3979
+
3980
+ FileTest unset2(obj.sel_file_name(2));
3981
+ ASSERT_TRUE(unset2.RemoveExisting());
3982
+
3983
+ FileTest unset3(obj.sel_file_name(3));
3984
+ ASSERT_TRUE(unset3.RemoveExisting());
3985
+ #endif
3986
+
3987
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
3988
+
3989
+ obj.SetCurrentSelectedOutputUserNumber(1);
3990
+ obj.SetSelectedOutputFileOn(true);
3991
+ obj.SetCurrentSelectedOutputUserNumber(2);
3992
+ obj.SetSelectedOutputFileOn(true);
3993
+ obj.SetCurrentSelectedOutputUserNumber(3);
3994
+ obj.SetSelectedOutputFileOn(true);
3995
+
3996
+ obj.SetCurrentSelectedOutputUserNumber(1);
3997
+ obj.SetSelectedOutputFileName(set.GetName().c_str());
3998
+ ASSERT_EQ(0, obj.RunFile("multi_punch_no_set"));
3999
+
4000
+ ASSERT_TRUE(set.VerifyExists());
4001
+ #if FIXME_PROTECTED
4002
+ ASSERT_TRUE(!unset1.VerifyExists());
4003
+ ASSERT_TRUE(unset2.VerifyExists());
4004
+ ASSERT_TRUE(unset3.VerifyExists());
4005
+ #endif
4006
+ }
4007
+
4008
+ TEST(TestIPhreeqc, TestMultiPunchSelectedOutputStringOn)
4009
+ {
4010
+ IPhreeqc obj;
4011
+
4012
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4013
+ obj.SetSelectedOutputStringOn(true);
4014
+ ASSERT_EQ(0, obj.RunFile("multi_punch"));
4015
+
4016
+ ASSERT_EQ(6, obj.GetSelectedOutputStringLineCount());
4017
+
4018
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "sim\t") != NULL);
4019
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "state\t") != NULL);
4020
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "soln\t") != NULL);
4021
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dist_x\t") != NULL);
4022
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "time\t") != NULL);
4023
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "step\t") != NULL);
4024
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pH\t") != NULL);
4025
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pe\t") != NULL);
4026
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "reaction\t") != NULL);
4027
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "temp\t") != NULL);
4028
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Alk\t") != NULL);
4029
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "mu\t") != NULL);
4030
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "mass_H2O\t") != NULL);
4031
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "charge\t") != NULL);
4032
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pct_err\t") != NULL);
4033
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Na\t") != NULL);
4034
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "Ca\t") != NULL);
4035
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "m_Na+\t") != NULL);
4036
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "m_HCO3-\t") != NULL);
4037
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "la_Ca+2\t") != NULL);
4038
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "la_CO3-2\t") != NULL);
4039
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "CO2(g)\t") != NULL);
4040
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "d_CO2(g)\t") != NULL);
4041
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dolomite\t") != NULL);
4042
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "d_dolomite\t") != NULL);
4043
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "si_Halite\t") != NULL);
4044
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "pressure\t") != NULL);
4045
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "total mol\t") != NULL);
4046
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "volume\t") != NULL);
4047
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "g_N2(g)\t") != NULL);
4048
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "k_Calcite\t") != NULL);
4049
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "dk_Calcite\t") != NULL);
4050
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "s_Anhydrite\t") != NULL);
4051
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "s_Barite\t") != NULL);
4052
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "V_TOTAL_C\t") != NULL);
4053
+
4054
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), " 8\t") != NULL);
4055
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), " 10\t") != NULL);
4056
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(3), " 11\t") != NULL);
4057
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(4), " 12\t") != NULL);
4058
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(5), " 14\t") != NULL);
4059
+
4060
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(1), "react\t") != NULL);
4061
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "react\t") != NULL);
4062
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(3), "i_soln\t") != NULL);
4063
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(4), "i_soln\t") != NULL);
4064
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(5), "react\t") != NULL);
4065
+
4066
+ obj.SetCurrentSelectedOutputUserNumber(2);
4067
+ ASSERT_EQ(9, obj.GetSelectedOutputStringLineCount());
4068
+
4069
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "si_Halite\t") != NULL);
4070
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(0), "si_Calcite\t") != NULL);
4071
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "Dummy1\t") != NULL);
4072
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(2), "Dummy2\t") != NULL);
4073
+
4074
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(3), "Dummy1\t") != NULL);
4075
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(3), "Dummy2\t") != NULL);
4076
+
4077
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(4), "Dummy1\t") != NULL);
4078
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(4), "Dummy2\t") != NULL);
4079
+
4080
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(5), "Dummy1\t") != NULL);
4081
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(5), "Dummy2\t") != NULL);
4082
+
4083
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Sum_resid\t") != NULL);
4084
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Sum_Delta/U\t") != NULL);
4085
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "MaxFracErr\t") != NULL);
4086
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Soln_2\t") != NULL);
4087
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Soln_2_min\t") != NULL);
4088
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Soln_2_max\t") != NULL);
4089
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Soln_3\t") != NULL);
4090
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Soln_3_min\t") != NULL);
4091
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Soln_3_max\t") != NULL);
4092
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Halite\t") != NULL);
4093
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(6), "Halite_max\t") != NULL);
4094
+
4095
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(8), "Dummy1\t") != NULL);
4096
+ ASSERT_TRUE(::strstr(obj.GetSelectedOutputStringLine(8), "Dummy2\t") != NULL);
4097
+ }
4098
+
4099
+ TEST(TestIPhreeqc, TestMultiPunchCSelectedOutput)
4100
+ {
4101
+ CVar var;
4102
+ IPhreeqc obj;
4103
+
4104
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat.90a6449"));
4105
+ ASSERT_EQ(0, obj.RunFile("multi_punch"));
4106
+
4107
+ ASSERT_EQ(6, obj.GetSelectedOutputRowCount());
4108
+ ASSERT_EQ(35, obj.GetSelectedOutputColumnCount());
4109
+
4110
+ // headings
4111
+ int ncol = 0;
4112
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("sim"), std::string(var.sVal));
4113
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("state"), std::string(var.sVal));
4114
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("soln"), std::string(var.sVal));
4115
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("dist_x"), std::string(var.sVal));
4116
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("time"), std::string(var.sVal));
4117
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("step"), std::string(var.sVal));
4118
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("pH"), std::string(var.sVal));
4119
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("pe"), std::string(var.sVal));
4120
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("reaction"), std::string(var.sVal));
4121
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("temp(C)"), std::string(var.sVal));
4122
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Alk(eq/kgw)"), std::string(var.sVal));
4123
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("mu"), std::string(var.sVal));
4124
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("mass_H2O"), std::string(var.sVal));
4125
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("charge(eq)"), std::string(var.sVal));
4126
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("pct_err"), std::string(var.sVal));
4127
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Na(mol/kgw)"), std::string(var.sVal));
4128
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Ca(mol/kgw)"), std::string(var.sVal));
4129
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("m_Na+(mol/kgw)"), std::string(var.sVal));
4130
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("m_HCO3-(mol/kgw)"), std::string(var.sVal));
4131
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("la_Ca+2"), std::string(var.sVal));
4132
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("la_CO3-2"), std::string(var.sVal));
4133
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("CO2(g)"), std::string(var.sVal));
4134
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("d_CO2(g)"), std::string(var.sVal));
4135
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("dolomite"), std::string(var.sVal));
4136
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("d_dolomite"), std::string(var.sVal));
4137
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("si_Halite"), std::string(var.sVal));
4138
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("pressure"), std::string(var.sVal));
4139
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("total mol"), std::string(var.sVal));
4140
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("volume"), std::string(var.sVal));
4141
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("g_N2(g)"), std::string(var.sVal));
4142
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("k_Calcite"), std::string(var.sVal));
4143
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("dk_Calcite"), std::string(var.sVal));
4144
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("s_Anhydrite"), std::string(var.sVal));
4145
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("s_Barite"), std::string(var.sVal));
4146
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("V_TOTAL_C"), std::string(var.sVal));
4147
+
4148
+ // sim
4149
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 0, &var)); ASSERT_EQ((long)8, var.lVal);
4150
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 0, &var)); ASSERT_EQ((long)10, var.lVal);
4151
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 0, &var)); ASSERT_EQ((long)11, var.lVal);
4152
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 0, &var)); ASSERT_EQ((long)12, var.lVal);
4153
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 0, &var)); ASSERT_EQ((long)14, var.lVal);
4154
+
4155
+ // state
4156
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 1, &var)); ASSERT_EQ(std::string("react"), std::string(var.sVal));
4157
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 1, &var)); ASSERT_EQ(std::string("react"), std::string(var.sVal));
4158
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 1, &var)); ASSERT_EQ(std::string("i_soln"), std::string(var.sVal));
4159
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 1, &var)); ASSERT_EQ(std::string("i_soln"), std::string(var.sVal));
4160
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 1, &var)); ASSERT_EQ(std::string("react"), std::string(var.sVal));
4161
+
4162
+ // pH
4163
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 6, &var)); ASSERT_NEAR(7.30475, var.dVal, ::pow(10., -2));
4164
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 6, &var)); ASSERT_NEAR(7.29765, var.dVal, ::pow(10., -2));
4165
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 6, &var)); ASSERT_NEAR(6.99738, var.dVal, ::pow(10., -2));
4166
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 6, &var)); ASSERT_NEAR(6.99698, var.dVal, ::pow(10., -2));
4167
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 6, &var)); ASSERT_NEAR(7.2942, var.dVal, ::pow(10., -2));
4168
+
4169
+ // V_TOTAL_C
4170
+ #ifdef SKIP_TEST
4171
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 34, &var)); ASSERT_NEAR(4.3729e-003, var.dVal, ::pow(10., -6));
4172
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 34, &var)); ASSERT_NEAR(4.3090e-003, var.dVal, ::pow(10., -6));
4173
+ #endif
4174
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 34, &var)); ASSERT_NEAR(0.0000e+000, var.dVal, ::pow(10., -6));
4175
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 34, &var)); ASSERT_NEAR(0.0000e+000, var.dVal, ::pow(10., -6));
4176
+ #ifdef SKIP_TEST
4177
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 34, &var)); ASSERT_NEAR(4.2784e-003, var.dVal, ::pow(10., -6));
4178
+ #endif
4179
+
4180
+ // edge cases
4181
+ int r = obj.GetSelectedOutputRowCount();
4182
+ int c = obj.GetSelectedOutputColumnCount();
4183
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(-1, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4184
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(r, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4185
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(0, -1, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4186
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(0, c, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4187
+
4188
+
4189
+ obj.SetCurrentSelectedOutputUserNumber(2);
4190
+ ASSERT_EQ(7, obj.GetSelectedOutputRowCount());
4191
+ ASSERT_EQ(16, obj.GetSelectedOutputColumnCount());
4192
+
4193
+ // headings
4194
+ ncol = 0;
4195
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("si_Halite"), std::string(var.sVal));
4196
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("si_Calcite"), std::string(var.sVal));
4197
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("DUMMY_1"), std::string(var.sVal));
4198
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("DUMMY_2"), std::string(var.sVal));
4199
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Sum_resid"), std::string(var.sVal));
4200
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Sum_Delta/U"), std::string(var.sVal));
4201
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("MaxFracErr"), std::string(var.sVal));
4202
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2"), std::string(var.sVal));
4203
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2_min"), std::string(var.sVal));
4204
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2_max"), std::string(var.sVal));
4205
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3"), std::string(var.sVal));
4206
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3_min"), std::string(var.sVal));
4207
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3_max"), std::string(var.sVal));
4208
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Halite"), std::string(var.sVal));
4209
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Halite_min"), std::string(var.sVal));
4210
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Halite_max"), std::string(var.sVal));
4211
+
4212
+ // si_Halite
4213
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 0, &var)); ASSERT_NEAR(-7.70857, var.dVal, ::pow(10., -2));
4214
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 0, &var)); ASSERT_NEAR(-7.67087, var.dVal, ::pow(10., -2));
4215
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 0, &var)); ASSERT_NEAR(-7.6362, var.dVal, ::pow(10., -2));
4216
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 0, &var)); ASSERT_NEAR(-999.999, var.dVal, ::pow(10., -2));
4217
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 0, &var)); ASSERT_NEAR(-7.60092, var.dVal, ::pow(10., -2));
4218
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 0, &var)); ASSERT_NEAR(-7.60411, var.dVal, ::pow(10., -2));
4219
+
4220
+ // si_Calcite
4221
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 1, &var)); ASSERT_NEAR(0.702316, var.dVal, ::pow(10., -2));
4222
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 1, &var)); ASSERT_NEAR(0.695856, var.dVal, ::pow(10., -2));
4223
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 1, &var)); ASSERT_NEAR(0.689518, var.dVal, ::pow(10., -2));
4224
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 1, &var)); ASSERT_NEAR(-999.999, var.dVal, ::pow(10., -2));
4225
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 1, &var)); ASSERT_NEAR(-999.999, var.dVal, ::pow(10., -2));
4226
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 1, &var)); ASSERT_NEAR(0.683300, var.dVal, ::pow(10., -2));
4227
+
4228
+ // DUMMY_1
4229
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 2, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4230
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4231
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4232
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4233
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4234
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 2, &var)); ASSERT_EQ(std::string("Dummy1"), std::string(var.sVal));
4235
+
4236
+ // DUMMY_2
4237
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 3, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4238
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4239
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4240
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4241
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4242
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 3, &var)); ASSERT_EQ(std::string("Dummy2"), std::string(var.sVal));
4243
+
4244
+ // Sum_resid
4245
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4246
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4247
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4248
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4249
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 4, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4250
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 4, &var)); ASSERT_NEAR(4.12e-13, var.dVal, ::pow(10., log10(4.12e-13) - 2));
4251
+
4252
+ // Sum_Delta/U
4253
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4254
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4255
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4256
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4257
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 5, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4258
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 5, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4259
+
4260
+ // MaxFracErr
4261
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4262
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4263
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4264
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4265
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 6, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4266
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 6, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4267
+
4268
+ // Soln_2
4269
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4270
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4271
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4272
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4273
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 7, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4274
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 7, &var)); ASSERT_NEAR(1, var.dVal, ::pow(10., -3));
4275
+
4276
+ // Soln_2_min
4277
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4278
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4279
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4280
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4281
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 8, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4282
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 8, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4283
+
4284
+ // Soln_2_max
4285
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4286
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4287
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4288
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4289
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 9, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4290
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 9, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4291
+
4292
+ // Soln_3
4293
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4294
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4295
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4296
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4297
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 10, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4298
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 10, &var)); ASSERT_NEAR(1, var.dVal, ::pow(10., -3));
4299
+
4300
+ // Soln_3_min
4301
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4302
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4303
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4304
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4305
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 11, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4306
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 11, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4307
+
4308
+ // Soln_3_max
4309
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4310
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4311
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4312
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4313
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 12, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4314
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 12, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4315
+
4316
+ // Halite
4317
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4318
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4319
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4320
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4321
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 13, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4322
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 13, &var)); ASSERT_NEAR(0.001, var.dVal, ::pow(10., -3));
4323
+
4324
+ // Halite_min
4325
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4326
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4327
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4328
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4329
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 14, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4330
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 14, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4331
+
4332
+ // Halite_max
4333
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4334
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(2, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4335
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(3, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4336
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(4, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4337
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(5, 15, &var)); ASSERT_EQ(TT_EMPTY, var.type);
4338
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(6, 15, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4339
+
4340
+ // edge cases
4341
+ r = obj.GetSelectedOutputRowCount();
4342
+ c = obj.GetSelectedOutputColumnCount();
4343
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(-1, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4344
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(r, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4345
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(0, -1, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4346
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(0, c, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4347
+
4348
+ obj.SetCurrentSelectedOutputUserNumber(3);
4349
+ ASSERT_EQ(2, obj.GetSelectedOutputRowCount());
4350
+ ASSERT_EQ(12, obj.GetSelectedOutputColumnCount());
4351
+
4352
+ // headings
4353
+ ncol = 0;
4354
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Sum_resid"), std::string(var.sVal));
4355
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Sum_Delta/U"), std::string(var.sVal));
4356
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("MaxFracErr"), std::string(var.sVal));
4357
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2"), std::string(var.sVal));
4358
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2_min"), std::string(var.sVal));
4359
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_2_max"), std::string(var.sVal));
4360
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3"), std::string(var.sVal));
4361
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3_min"), std::string(var.sVal));
4362
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Soln_3_max"), std::string(var.sVal));
4363
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Halite"), std::string(var.sVal));
4364
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Halite_min"), std::string(var.sVal));
4365
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(0, ncol++, &var)); ASSERT_EQ(std::string("Halite_max"), std::string(var.sVal));
4366
+
4367
+ // Sum_resid
4368
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 0, &var)); ASSERT_NEAR(4.12e-13, var.dVal, ::pow(10., log10(4.12e-13) - 2));
4369
+
4370
+ // Sum_Delta/U
4371
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 1, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4372
+
4373
+ // MaxFracErr
4374
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 2, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4375
+
4376
+ // Soln_2
4377
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 3, &var)); ASSERT_NEAR(1, var.dVal, ::pow(10., -3));
4378
+
4379
+ // Soln_2_min
4380
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 4, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4381
+
4382
+ // Soln_2_max
4383
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 5, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4384
+
4385
+ // Soln_3
4386
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 6, &var)); ASSERT_NEAR(1, var.dVal, ::pow(10., -3));
4387
+
4388
+ // Soln_3_min
4389
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 7, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4390
+
4391
+ // Soln_3_max
4392
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 8, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4393
+
4394
+ // Halite
4395
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 9, &var)); ASSERT_NEAR(0.001, var.dVal, ::pow(10., -3));
4396
+
4397
+ // Halite_min
4398
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 10, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4399
+
4400
+ // Halite_max
4401
+ ASSERT_EQ(VR_OK, obj.GetSelectedOutputValue(1, 11, &var)); ASSERT_NEAR(0, var.dVal, ::pow(10., -3));
4402
+
4403
+
4404
+ // edge cases
4405
+ r = obj.GetSelectedOutputRowCount();
4406
+ c = obj.GetSelectedOutputColumnCount();
4407
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(-1, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4408
+ ASSERT_EQ(VR_INVALIDROW, obj.GetSelectedOutputValue(r, 0, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDROW, var.vresult);
4409
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(0, -1, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4410
+ ASSERT_EQ(VR_INVALIDCOL, obj.GetSelectedOutputValue(0, c, &var)); ASSERT_EQ(TT_ERROR, var.type); ASSERT_EQ(VR_INVALIDCOL, var.vresult);
4411
+
4412
+ ASSERT_EQ(VR_INVALIDARG, obj.SetCurrentSelectedOutputUserNumber(-1));
4413
+ ASSERT_EQ(VR_OK, obj.SetCurrentSelectedOutputUserNumber(0));
4414
+ }
4415
+
4416
+ TEST(TestIPhreeqc, TestGetSelectedOutputCount)
4417
+ {
4418
+ CVar var;
4419
+ IPhreeqc obj;
4420
+
4421
+ ASSERT_EQ(0, obj.GetSelectedOutputCount());
4422
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4423
+ ASSERT_EQ(0, obj.GetSelectedOutputCount());
4424
+ ASSERT_EQ(0, obj.RunFile("multi_punch"));
4425
+ ASSERT_EQ(3, obj.GetSelectedOutputCount());
4426
+ }
4427
+
4428
+ TEST(TestIPhreeqc, TestGetNthSelectedOutputUserNumber)
4429
+ {
4430
+ CVar var;
4431
+ IPhreeqc obj;
4432
+
4433
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4434
+ ASSERT_EQ(0, obj.RunFile("multi_punch"));
4435
+
4436
+ ASSERT_EQ(3, obj.GetSelectedOutputCount());
4437
+
4438
+ ASSERT_EQ(1, obj.GetNthSelectedOutputUserNumber(0));
4439
+ ASSERT_EQ(2, obj.GetNthSelectedOutputUserNumber(1));
4440
+ ASSERT_EQ(3, obj.GetNthSelectedOutputUserNumber(2));
4441
+
4442
+ // edge cases
4443
+ ASSERT_EQ((int)VR_INVALIDARG, obj.GetNthSelectedOutputUserNumber(-1));
4444
+ ASSERT_EQ((int)VR_INVALIDARG, obj.GetNthSelectedOutputUserNumber(4));
4445
+ }
4446
+
4447
+ TEST(TestIPhreeqc, TestGetCurrentSelectedOutputUserNumber)
4448
+ {
4449
+ IPhreeqc obj;
4450
+ ASSERT_EQ(1, obj.GetCurrentSelectedOutputUserNumber());
4451
+
4452
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4453
+ ASSERT_EQ(1, obj.GetCurrentSelectedOutputUserNumber());
4454
+ ASSERT_EQ(0, obj.RunFile("multi_punch"));
4455
+
4456
+ ASSERT_EQ(1, obj.GetCurrentSelectedOutputUserNumber());
4457
+ ASSERT_EQ(6, obj.GetSelectedOutputRowCount());
4458
+ ASSERT_EQ(35, obj.GetSelectedOutputColumnCount());
4459
+
4460
+ obj.SetCurrentSelectedOutputUserNumber(2);
4461
+ ASSERT_EQ(2, obj.GetCurrentSelectedOutputUserNumber());
4462
+ ASSERT_EQ(7, obj.GetSelectedOutputRowCount());
4463
+ ASSERT_EQ(16, obj.GetSelectedOutputColumnCount());
4464
+
4465
+ obj.SetCurrentSelectedOutputUserNumber(3);
4466
+ ASSERT_EQ(3, obj.GetCurrentSelectedOutputUserNumber());
4467
+ ASSERT_EQ(2, obj.GetSelectedOutputRowCount());
4468
+ ASSERT_EQ(12, obj.GetSelectedOutputColumnCount());
4469
+
4470
+ // edge cases
4471
+ ASSERT_EQ(VR_INVALIDARG, obj.SetCurrentSelectedOutputUserNumber(-1));
4472
+ ASSERT_EQ(3, obj.GetCurrentSelectedOutputUserNumber());
4473
+ ASSERT_EQ(VR_OK, obj.SetCurrentSelectedOutputUserNumber(0));
4474
+ ASSERT_EQ(0, obj.GetCurrentSelectedOutputUserNumber());
4475
+
4476
+ // unload database
4477
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4478
+ ASSERT_EQ(1, obj.GetCurrentSelectedOutputUserNumber());
4479
+ ASSERT_EQ(0, obj.GetSelectedOutputCount());
4480
+ }
4481
+
4482
+ TEST(TestIPhreeqc, TestMultiSetSelectedOutputFileName)
4483
+ {
4484
+ FileTest set1("state.sel");
4485
+ ASSERT_TRUE(set1.RemoveExisting());
4486
+
4487
+ FileTest set2("si.sel");
4488
+ ASSERT_TRUE(set2.RemoveExisting());
4489
+
4490
+ IPhreeqc obj;
4491
+
4492
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4493
+
4494
+ ASSERT_EQ(VR_OK, obj.SetCurrentSelectedOutputUserNumber(1));
4495
+ obj.SetSelectedOutputStringOn(true);
4496
+ obj.SetSelectedOutputFileOn(true);
4497
+ obj.SetSelectedOutputFileName(set1.GetName().c_str());
4498
+
4499
+ ASSERT_EQ(VR_OK, obj.SetCurrentSelectedOutputUserNumber(2));
4500
+ obj.SetSelectedOutputStringOn(true);
4501
+ obj.SetSelectedOutputFileOn(true);
4502
+ obj.SetSelectedOutputFileName(set2.GetName().c_str());
4503
+
4504
+ obj.AccumulateLine("TITLE Temperature dependence of solubility");
4505
+ obj.AccumulateLine(" of gypsum and anhydrite ");
4506
+ obj.AccumulateLine("SOLUTION 1 Pure water ");
4507
+ obj.AccumulateLine(" pH 7.0 ");
4508
+ obj.AccumulateLine(" temp 25.0 ");
4509
+ obj.AccumulateLine("EQUILIBRIUM_PHASES 1 ");
4510
+ obj.AccumulateLine(" Gypsum 0.0 1.0 ");
4511
+ obj.AccumulateLine(" Anhydrite 0.0 1.0 ");
4512
+ obj.AccumulateLine("REACTION_TEMPERATURE 1 ");
4513
+ obj.AccumulateLine(" 25.0 75.0 in 51 steps ");
4514
+ obj.AccumulateLine("SELECTED_OUTPUT 1 ");
4515
+ obj.AccumulateLine(" -temperature ");
4516
+ obj.AccumulateLine("SELECTED_OUTPUT 2 ");
4517
+ obj.AccumulateLine(" -si anhydrite gypsum ");
4518
+ obj.AccumulateLine("END ");
4519
+
4520
+ ASSERT_EQ(0, obj.RunAccumulated());
4521
+
4522
+ ASSERT_TRUE(set1.VerifyExists());
4523
+ ASSERT_TRUE(set2.VerifyExists());
4524
+ }
4525
+
4526
+ TEST(TestIPhreeqc, TestWissmeier20131203)
4527
+ {
4528
+ IPhreeqc obj;
4529
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4530
+
4531
+ obj.AccumulateLine("selected_output 1");
4532
+ obj.AccumulateLine("-totals O");
4533
+ obj.AccumulateLine("");
4534
+ obj.AccumulateLine("END");
4535
+ obj.AccumulateLine("selected_output 1");
4536
+ obj.AccumulateLine("-totals H");
4537
+ obj.AccumulateLine("");
4538
+ obj.AccumulateLine("solution");
4539
+ obj.AccumulateLine("END");
4540
+ obj.AccumulateLine("selected_output");
4541
+
4542
+ // original asserts here
4543
+ ASSERT_EQ(0, obj.RunAccumulated());
4544
+
4545
+ ASSERT_EQ(1, obj.GetSelectedOutputCount());
4546
+
4547
+ ASSERT_EQ(9, obj.GetSelectedOutputColumnCount());
4548
+ ASSERT_EQ(2, obj.GetSelectedOutputRowCount());
4549
+ }
4550
+
4551
+ TEST(TestIPhreeqc, TestWissmeier20131203_2)
4552
+ {
4553
+ IPhreeqc obj;
4554
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4555
+
4556
+ obj.AccumulateLine("selected_output 22");
4557
+ obj.AccumulateLine("-totals O");
4558
+ obj.AccumulateLine("");
4559
+ obj.AccumulateLine("END");
4560
+ obj.AccumulateLine("selected_output 22");
4561
+ obj.AccumulateLine("-totals H");
4562
+ obj.AccumulateLine("");
4563
+ obj.AccumulateLine("solution");
4564
+ obj.AccumulateLine("END");
4565
+ obj.AccumulateLine("selected_output 22");
4566
+
4567
+ // original asserts here
4568
+ ASSERT_EQ(0, obj.RunAccumulated());
4569
+
4570
+ ASSERT_EQ(1, obj.GetSelectedOutputCount());
4571
+
4572
+ ASSERT_EQ(VR_OK, obj.SetCurrentSelectedOutputUserNumber(22));
4573
+ ASSERT_EQ(1, obj.GetSelectedOutputColumnCount());
4574
+ ASSERT_EQ(2, obj.GetSelectedOutputRowCount());
4575
+ }
4576
+
4577
+ TEST(TestIPhreeqc, TestWissmeier20131203_3)
4578
+ {
4579
+ IPhreeqc obj;
4580
+
4581
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4582
+
4583
+ obj.AccumulateLine("selected_output 1");
4584
+ obj.AccumulateLine("-reset false");
4585
+ obj.AccumulateLine("-totals O");
4586
+ obj.AccumulateLine("");
4587
+ obj.AccumulateLine("END");
4588
+ obj.AccumulateLine("selected_output 1");
4589
+ obj.AccumulateLine("-reset false");
4590
+ obj.AccumulateLine("-totals H");
4591
+ obj.AccumulateLine("");
4592
+ obj.AccumulateLine("solution");
4593
+ obj.AccumulateLine("END");
4594
+ obj.AccumulateLine("selected_output");
4595
+ obj.AccumulateLine("-reset false");
4596
+
4597
+ // original asserts here
4598
+ ASSERT_EQ(0, obj.RunAccumulated());
4599
+
4600
+ ASSERT_EQ(1, obj.GetSelectedOutputCount());
4601
+
4602
+ ASSERT_EQ(1, obj.GetSelectedOutputColumnCount());
4603
+ ASSERT_EQ(2, obj.GetSelectedOutputRowCount());
4604
+ }
4605
+
4606
+ TEST(TestIPhreeqc, TestKinniburgh20140218)
4607
+ {
4608
+ IPhreeqc obj;
4609
+ ASSERT_EQ(0, obj.LoadDatabase("wateq4f.dat"));
4610
+ EXPECT_EQ(0, obj.RunFile("kinn20140218")) << obj.GetErrorString();
4611
+ std::string sline(obj.GetErrorString());
4612
+ std::cerr << sline;
4613
+ }
4614
+
4615
+ TEST(TestIPhreeqc, TestGetAccumulatedLines)
4616
+ {
4617
+ IPhreeqc obj;
4618
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 12"));
4619
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 13"));
4620
+
4621
+ for (int i = 0; i < 10; ++i)
4622
+ {
4623
+ ASSERT_EQ(1, obj.RunAccumulated());
4624
+ const char expected[] = "solution 12\nsolution 13\n";
4625
+ ASSERT_EQ(std::string(expected), obj.GetAccumulatedLines());
4626
+ }
4627
+
4628
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 22"));
4629
+ for (int i = 0; i < 10; ++i)
4630
+ {
4631
+ ASSERT_EQ(1, obj.RunAccumulated());
4632
+ const char expected[] = "solution 22\n";
4633
+ ASSERT_EQ(std::string(expected), obj.GetAccumulatedLines());
4634
+ }
4635
+ }
4636
+
4637
+ TEST(TestIPhreeqc, TestGetAccumulatedLinesAfterRunFile)
4638
+ {
4639
+ IPhreeqc obj;
4640
+ ASSERT_EQ(0, obj.LoadDatabase("wateq4f.dat"));
4641
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 12"));
4642
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 13"));
4643
+
4644
+ for (int i = 0; i < 10; ++i)
4645
+ {
4646
+ ASSERT_EQ(0, obj.RunFile("kinn20140218"));
4647
+ const char expected[] = "";
4648
+ ASSERT_EQ(std::string(expected), obj.GetAccumulatedLines());
4649
+ }
4650
+ }
4651
+
4652
+ TEST(TestIPhreeqc, TestGetAccumulatedLinesAfterRunString)
4653
+ {
4654
+ const char input[] =
4655
+ "TITLE Example 1.--Add uranium and speciate seawater.\n"
4656
+ "SOLUTION 1 SEAWATER FROM NORDSTROM ET AL. (1979)\n"
4657
+ " units ppm\n"
4658
+ " pH 8.22\n"
4659
+ " pe 8.451\n"
4660
+ " density 1.023\n"
4661
+ " temp 25.0\n"
4662
+ " redox O(0)/O(-2)\n"
4663
+ " Ca 412.3\n"
4664
+ " Mg 1291.8\n"
4665
+ " Na 10768.0\n"
4666
+ " K 399.1\n"
4667
+ " Fe 0.002\n"
4668
+ " Mn 0.0002 pe\n"
4669
+ " Si 4.28\n"
4670
+ " Cl 19353.0\n"
4671
+ " Alkalinity 141.682 as HCO3\n"
4672
+ " S(6) 2712.0\n"
4673
+ " N(5) 0.29 gfw 62.0\n"
4674
+ " N(-3) 0.03 as NH4\n"
4675
+ " U 3.3 ppb N(5)/N(-3)\n"
4676
+ " O(0) 1.0 O2(g) -0.7\n"
4677
+ "SOLUTION_MASTER_SPECIES\n"
4678
+ " U U+4 0.0 238.0290 238.0290\n"
4679
+ " U(4) U+4 0.0 238.0290\n"
4680
+ " U(5) UO2+ 0.0 238.0290\n"
4681
+ " U(6) UO2+2 0.0 238.0290\n"
4682
+ "SOLUTION_SPECIES\n"
4683
+ " #primary master species for U\n"
4684
+ " #is also secondary master species for U(4)\n"
4685
+ " U+4 = U+4\n"
4686
+ " log_k 0.0\n"
4687
+ " U+4 + 4 H2O = U(OH)4 + 4 H+\n"
4688
+ " log_k -8.538\n"
4689
+ " delta_h 24.760 kcal\n"
4690
+ " U+4 + 5 H2O = U(OH)5- + 5 H+\n"
4691
+ " log_k -13.147\n"
4692
+ " delta_h 27.580 kcal\n"
4693
+ " #secondary master species for U(5)\n"
4694
+ " U+4 + 2 H2O = UO2+ + 4 H+ + e-\n"
4695
+ " log_k -6.432\n"
4696
+ " delta_h 31.130 kcal\n"
4697
+ " #secondary master species for U(6)\n"
4698
+ " U+4 + 2 H2O = UO2+2 + 4 H+ + 2 e-\n"
4699
+ " log_k -9.217\n"
4700
+ " delta_h 34.430 kcal\n"
4701
+ " UO2+2 + H2O = UO2OH+ + H+\n"
4702
+ " log_k -5.782\n"
4703
+ " delta_h 11.015 kcal\n"
4704
+ " 2UO2+2 + 2H2O = (UO2)2(OH)2+2 + 2H+\n"
4705
+ " log_k -5.626\n"
4706
+ " delta_h -36.04 kcal\n"
4707
+ " 3UO2+2 + 5H2O = (UO2)3(OH)5+ + 5H+\n"
4708
+ " log_k -15.641\n"
4709
+ " delta_h -44.27 kcal\n"
4710
+ " UO2+2 + CO3-2 = UO2CO3\n"
4711
+ " log_k 10.064\n"
4712
+ " delta_h 0.84 kcal\n"
4713
+ " UO2+2 + 2CO3-2 = UO2(CO3)2-2\n"
4714
+ " log_k 16.977\n"
4715
+ " delta_h 3.48 kcal\n"
4716
+ " UO2+2 + 3CO3-2 = UO2(CO3)3-4\n"
4717
+ " log_k 21.397\n"
4718
+ " delta_h -8.78 kcal\n"
4719
+ "PHASES\n"
4720
+ " Uraninite\n"
4721
+ " UO2 + 4 H+ = U+4 + 2 H2O\n"
4722
+ " log_k -3.490\n"
4723
+ " delta_h -18.630 kcal\n"
4724
+ "END\n"
4725
+ "\n";
4726
+
4727
+ IPhreeqc obj;
4728
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4729
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 12"));
4730
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 13"));
4731
+
4732
+ for (int i = 0; i < 10; ++i)
4733
+ {
4734
+ ASSERT_EQ(0, obj.RunString(input));
4735
+ const char expected[] = "";
4736
+ ASSERT_EQ(std::string(expected), obj.GetAccumulatedLines());
4737
+ }
4738
+ }
4739
+
4740
+ TEST(TestIPhreeqc, TestPBasicStopThrow)
4741
+ {
4742
+ IPhreeqc obj;
4743
+
4744
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4745
+
4746
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("SOLUTION 1 # Mine water from Bain et al., 2001"));
4747
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("USER_PRINT"));
4748
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("10 print -(0.006^0.9)"));
4749
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("20 print TOTMOL(\"H\"), TOTMOLE(\"H\"), TOTMOLES(\"H\")"));
4750
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("110 print (-0.2)^3"));
4751
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("120 print (-0.2)^3.0"));
4752
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("130 print (-0.2)^-2"));
4753
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("140 print (-0.2)^-3"));
4754
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("150 print -0.2^2.2"));
4755
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("END"));
4756
+
4757
+ obj.SetOutputFileOn(true);
4758
+ ASSERT_EQ(5, obj.RunAccumulated());
4759
+ }
4760
+
4761
+ TEST(TestIPhreeqc, TestEx10)
4762
+ {
4763
+ const char input[] =
4764
+ "TITLE Example 10.--Solid solution of strontianite and aragonite.\n"
4765
+ "PHASES\n"
4766
+ " Strontianite\n"
4767
+ " SrCO3 = CO3-2 + Sr+2\n"
4768
+ " log_k -9.271\n"
4769
+ " Aragonite\n"
4770
+ " CaCO3 = CO3-2 + Ca+2\n"
4771
+ " log_k -8.336\n"
4772
+ "END\n"
4773
+ "SOLID_SOLUTIONS 1\n"
4774
+ " Ca(x)Sr(1-x)CO3 \n"
4775
+ " -comp1 Aragonite 0 \n"
4776
+ " -comp2 Strontianite 0 \n"
4777
+ " -Gugg_nondim 3.43 -1.82\n"
4778
+ "END\n"
4779
+ "SOLUTION 1\n"
4780
+ " -units mmol/kgw\n"
4781
+ " pH 5.93 charge\n"
4782
+ " Ca 3.932\n"
4783
+ " C 7.864\n"
4784
+ "EQUILIBRIUM_PHASES 1\n"
4785
+ " CO2(g) -0.01265 10\n"
4786
+ " Aragonite\n"
4787
+ "SAVE solution 1\n"
4788
+ "END\n"
4789
+ "#\n"
4790
+ "# Total of 0.00001 to 0.005 moles of SrCO3 added\n"
4791
+ "#\n"
4792
+ "USE solution 1\n"
4793
+ "USE solid_solution 1\n"
4794
+ "REACTION 1\n"
4795
+ " SrCO3 1.0\n"
4796
+ " .005 in 500 steps \n"
4797
+ "PRINT\n"
4798
+ " -reset false\n"
4799
+ " -echo true\n"
4800
+ " -user_print true\n"
4801
+ "USER_PRINT\n"
4802
+ "-start\n"
4803
+ " 10 sum = (S_S(\"Strontianite\") + S_S(\"Aragonite\"))\n"
4804
+ " 20 if sum = 0 THEN GOTO 110\n"
4805
+ " 30 xb = S_S(\"Strontianite\")/sum\n"
4806
+ " 40 xc = S_S(\"Aragonite\")/sum\n"
4807
+ " 50 PRINT \"Simulation number: \", SIM_NO\n"
4808
+ " 60 PRINT \"Reaction step number: \", STEP_NO\n"
4809
+ " 70 PRINT \"SrCO3 added: \", RXN\n"
4810
+ " 80 PRINT \"Log Sigma pi: \", LOG10 (ACT(\"CO3-2\") * (ACT(\"Ca+2\") + ACT(\"Sr+2\")))\n"
4811
+ " 90 PRINT \"XAragonite: \", xc\n"
4812
+ " 100 PRINT \"XStrontianite: \", xb\n"
4813
+ " 110 PRINT \"XCa: \", TOT(\"Ca\")/(TOT(\"Ca\") + TOT(\"Sr\"))\n"
4814
+ " 120 PRINT \"XSr: \", TOT(\"Sr\")/(TOT(\"Ca\") + TOT(\"Sr\"))\n"
4815
+ " 130 PRINT \"Misc 1: \", MISC1(\"Ca(x)Sr(1-x)CO3\")\n"
4816
+ " 140 PRINT \"Misc 2: \", MISC2(\"Ca(x)Sr(1-x)CO3\")\n"
4817
+ "-end\n"
4818
+ "SELECTED_OUTPUT\n"
4819
+ " -file ex10.sel\n"
4820
+ " -reset false\n"
4821
+ " -reaction true\n"
4822
+ "USER_PUNCH\n"
4823
+ "-head lg_SigmaPi X_Arag X_Stront X_Ca_aq X_Sr_aq mol_Misc1 mol_Misc2 \\n"
4824
+ " mol_Arag mol_Stront\n"
4825
+ "-start\n"
4826
+ " 10 sum = (S_S(\"Strontianite\") + S_S(\"Aragonite\"))\n"
4827
+ " 20 if sum = 0 THEN GOTO 60\n"
4828
+ " 30 xb = S_S(\"Strontianite\")/(S_S(\"Strontianite\") + S_S(\"Aragonite\"))\n"
4829
+ " 40 xc = S_S(\"Aragonite\")/(S_S(\"Strontianite\") + S_S(\"Aragonite\"))\n"
4830
+ " 50 REM Sigma Pi\n"
4831
+ " 60 PUNCH LOG10(ACT(\"CO3-2\") * (ACT(\"Ca+2\") + ACT(\"Sr+2\")))\n"
4832
+ " 70 PUNCH xc # Mole fraction aragonite\n"
4833
+ " 80 PUNCH xb # Mole fraction strontianite\n"
4834
+ " 90 PUNCH TOT(\"Ca\")/(TOT(\"Ca\") + TOT(\"Sr\")) # Mole aqueous calcium\n"
4835
+ " 100 PUNCH TOT(\"Sr\")/(TOT(\"Ca\") + TOT(\"Sr\")) # Mole aqueous strontium\n"
4836
+ " 110 x1 = MISC1(\"Ca(x)Sr(1-x)CO3\")\n"
4837
+ " 120 x2 = MISC2(\"Ca(x)Sr(1-x)CO3\")\n"
4838
+ " 130 if (xb < x1 OR xb > x2) THEN GOTO 250\n"
4839
+ " 140 nc = S_S(\"Aragonite\")\n"
4840
+ " 150 nb = S_S(\"Strontianite\")\n"
4841
+ " 160 mol2 = ((x1 - 1)/x1)*nb + nc\n"
4842
+ " 170 mol2 = mol2 / ( ((x1 -1)/x1)*x2 + (1 - x2))\n"
4843
+ " 180 mol1 = (nb - mol2*x2)/x1\n"
4844
+ " 190 REM # Moles of misc. end members if in gap\n"
4845
+ " 200 PUNCH mol1\n"
4846
+ " 210 PUNCH mol2\n"
4847
+ " 220 GOTO 300\n"
4848
+ " 250 REM # Moles of misc. end members if not in gap\n"
4849
+ " 260 PUNCH 1e-10\n"
4850
+ " 270 PUNCH 1e-10\n"
4851
+ " 300 PUNCH S_S(\"Aragonite\") # Moles aragonite\n"
4852
+ " 310 PUNCH S_S(\"Strontianite\") # Moles Strontianite\n"
4853
+ "-end\n"
4854
+ "USER_GRAPH Example 10\n"
4855
+ " -headings x_Aragonite x_Srontianite\n"
4856
+ " -chart_title \"Aragonite-Strontianite Solid Solution\"\n"
4857
+ " -axis_titles \"Log(SrCO3 added, in moles)\" \"Log(Mole fraction of component)\"\n"
4858
+ " -axis_scale x_axis -5 1 1 1\n"
4859
+ " -axis_scale y_axis -5 0.1 1 1\n"
4860
+ " -connect_simulations true\n"
4861
+ " -start\n"
4862
+ " 10 sum = (S_S(\"Strontianite\") + S_S(\"Aragonite\"))\n"
4863
+ " 20 IF sum = 0 THEN GOTO 70\n"
4864
+ " 30 xb = S_S(\"Strontianite\")/ sum\n"
4865
+ " 40 xc = S_S(\"Aragonite\")/ sum\n"
4866
+ " 50 PLOT_XY LOG10(RXN), LOG10(xc), line_w = 2, symbol_size = 0\n"
4867
+ " 60 PLOT_XY LOG10(RXN), LOG10(xb), line_w = 2, symbol_size = 0\n"
4868
+ " 70 rem\n"
4869
+ " -end\n"
4870
+ "END \n"
4871
+ "#\n"
4872
+ "# Total of 0.005 to 0.1 moles of SrCO3 added\n"
4873
+ "#\n"
4874
+ "USE solution 1\n"
4875
+ "USE solid_solution 1\n"
4876
+ "REACTION 1\n"
4877
+ " SrCO3 1.0\n"
4878
+ " .1 in 20 steps \n"
4879
+ "END \n"
4880
+ "#\n"
4881
+ "# Total of 0.1 to 10 moles of SrCO3 added\n"
4882
+ "#\n"
4883
+ "USE solution 1\n"
4884
+ "USE solid_solution 1\n"
4885
+ "REACTION 1\n"
4886
+ " SrCO3 1.0\n"
4887
+ " 10.0 in 100 steps \n"
4888
+ "END \n";
4889
+
4890
+ IPhreeqc obj;
4891
+ ASSERT_EQ(0, obj.LoadDatabase("phreeqc.dat"));
4892
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 12"));
4893
+ ASSERT_EQ(VR_OK, obj.AccumulateLine("solution 13"));
4894
+
4895
+ for (int i = 0; i < 10; ++i)
4896
+ {
4897
+ ASSERT_EQ(0, obj.RunString(input));
4898
+ const char expected[] = "";
4899
+ ASSERT_EQ(std::string(expected), obj.GetAccumulatedLines());
4900
+ }
4901
+ }