https://mooseframework.inl.gov
Loading...
Searching...
No Matches
ReactionNetworkParserUtilsTest.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#include "gtest/gtest.h"
11
13
14#include <cmath>
15
16TEST(ReactionNetworkParserUtilsTest, simple)
17{
18 // Simple
19 auto reaction = ReactionNetworkUtils::parseReactionNetwork("A -> B", false)[0];
20 EXPECT_EQ(reaction.getSpecies()[0], "A");
21 EXPECT_EQ(reaction.getSpecies()[1], "B");
22 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
23 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
24 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], 1);
25 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 1);
26 EXPECT_EQ(reaction.hasMetaData("this"), false);
27 try
28 {
29 reaction.getMetaData("this");
30 FAIL();
31 }
32 catch (const std::exception & err)
33 {
34 std::size_t pos =
35 std::string(err.what()).find("MetaData item 'this' was not found in reaction");
36 ASSERT_TRUE(pos != std::string::npos);
37 }
38
39 // With charge
40 reaction = ReactionNetworkUtils::parseReactionNetwork("A+ -> B-", false)[0];
41 EXPECT_EQ(reaction.getSpecies()[0], "A+");
42 EXPECT_EQ(reaction.getSpecies()[1], "B-");
43 EXPECT_EQ(reaction.getReactantSpecies()[0], "A+");
44 EXPECT_EQ(reaction.getProductSpecies()[0], "B-");
45 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], 1);
46 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 1);
47 EXPECT_EQ(reaction.hasMetaData("this"), false);
48
49 // With state
50 reaction = ReactionNetworkUtils::parseReactionNetwork("A(aq)+ -> B(gas)-", false)[0];
51 EXPECT_EQ(reaction.getSpecies()[0], "A(aq)+");
52 EXPECT_EQ(reaction.getSpecies()[1], "B(gas)-");
53 EXPECT_EQ(reaction.getReactantSpecies()[0], "A(aq)+");
54 EXPECT_EQ(reaction.getProductSpecies()[0], "B(gas)-");
55 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], 1);
56 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 1);
57 EXPECT_EQ(reaction.hasMetaData("this"), false);
58}
59
60TEST(ReactionNetworkParserUtilsTest, minus_sign)
61{
62 // Simple
63 auto reaction = ReactionNetworkUtils::parseReactionNetwork("-A -> -B", false)[0];
64 EXPECT_EQ(reaction.getSpecies()[0], "A");
65 EXPECT_EQ(reaction.getSpecies()[1], "B");
66 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
67 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
68 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -1);
69 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], -1);
70 EXPECT_EQ(reaction.hasMetaData("this"), false);
71
72 // With charge
73 reaction = ReactionNetworkUtils::parseReactionNetwork("-A+ -> -B-", false)[0];
74 EXPECT_EQ(reaction.getSpecies()[0], "A+");
75 EXPECT_EQ(reaction.getSpecies()[1], "B-");
76 EXPECT_EQ(reaction.getReactantSpecies()[0], "A+");
77 EXPECT_EQ(reaction.getProductSpecies()[0], "B-");
78 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -1);
79 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], -1);
80 EXPECT_EQ(reaction.hasMetaData("this"), false);
81
82 // With state
83 reaction = ReactionNetworkUtils::parseReactionNetwork("-A(aq)+ -> -B(gas)-", false)[0];
84 EXPECT_EQ(reaction.getSpecies()[0], "A(aq)+");
85 EXPECT_EQ(reaction.getSpecies()[1], "B(gas)-");
86 EXPECT_EQ(reaction.getReactantSpecies()[0], "A(aq)+");
87 EXPECT_EQ(reaction.getProductSpecies()[0], "B(gas)-");
88 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -1);
89 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], -1);
90 EXPECT_EQ(reaction.hasMetaData("this"), false);
91}
92
93TEST(ReactionNetworkParserUtilsTest, two_terms)
94{
95 // Simple
96 auto reaction = ReactionNetworkUtils::parseReactionNetwork("-A + C -> -B", false)[0];
97 EXPECT_EQ(reaction.getSpecies()[0], "A");
98 EXPECT_EQ(reaction.getSpecies()[1], "C");
99 EXPECT_EQ(reaction.getSpecies()[2], "B");
100 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
101 EXPECT_EQ(reaction.getReactantSpecies()[1], "C");
102 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
103 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -1);
104 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 1);
105 EXPECT_EQ(reaction.getStoichiometricCoefficients()[2], -1);
106 EXPECT_EQ(reaction.hasMetaData("this"), false);
107
108 // Coefficient
109 reaction = ReactionNetworkUtils::parseReactionNetwork("-10A + 3.4C -> -2.1111111B", false)[0];
110 EXPECT_EQ(reaction.getSpecies()[0], "A");
111 EXPECT_EQ(reaction.getSpecies()[1], "C");
112 EXPECT_EQ(reaction.getSpecies()[2], "B");
113 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
114 EXPECT_EQ(reaction.getReactantSpecies()[1], "C");
115 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
116 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -10);
117 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 3.4);
118 EXPECT_EQ(reaction.getStoichiometricCoefficients()[2], -2.1111111);
119 EXPECT_EQ(reaction.hasMetaData("this"), false);
120
121 // Two products
122 reaction =
123 ReactionNetworkUtils::parseReactionNetwork("-10A + 3.4C -> -2.1111111B + 24D", false)[0];
124 EXPECT_EQ(reaction.getSpecies()[0], "A");
125 EXPECT_EQ(reaction.getSpecies()[1], "C");
126 EXPECT_EQ(reaction.getSpecies()[2], "B");
127 EXPECT_EQ(reaction.getSpecies()[3], "D");
128 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
129 EXPECT_EQ(reaction.getReactantSpecies()[1], "C");
130 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
131 EXPECT_EQ(reaction.getProductSpecies()[1], "D");
132 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -10);
133 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 3.4);
134 EXPECT_EQ(reaction.getStoichiometricCoefficients()[2], -2.1111111);
135 EXPECT_EQ(reaction.getStoichiometricCoefficients()[3], 24);
136 EXPECT_EQ(reaction.hasMetaData("this"), false);
137}
138
139TEST(ReactionNetworkParserUtilsTest, multiple_reactions)
140{
141 // Simple
142 auto reactions =
143 ReactionNetworkUtils::parseReactionNetwork("-A + C -> -B\nD(aq) + E+ -> F - 1.1G", false);
144 auto reaction = reactions[0];
145 EXPECT_EQ(reaction.getSpecies()[0], "A");
146 EXPECT_EQ(reaction.getSpecies()[1], "C");
147 EXPECT_EQ(reaction.getSpecies()[2], "B");
148 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
149 EXPECT_EQ(reaction.getReactantSpecies()[1], "C");
150 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
151 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -1);
152 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 1);
153 EXPECT_EQ(reaction.getStoichiometricCoefficients()[2], -1);
154 EXPECT_EQ(reaction.hasMetaData("this"), false);
155 auto reaction2 = reactions[1];
156 EXPECT_EQ(reaction2.getSpecies()[0], "D(aq)");
157 EXPECT_EQ(reaction2.getSpecies()[1], "E+");
158 EXPECT_EQ(reaction2.getSpecies()[2], "F");
159 EXPECT_EQ(reaction2.getSpecies()[3], "G");
160 EXPECT_EQ(reaction2.getReactantSpecies()[0], "D(aq)");
161 EXPECT_EQ(reaction2.getReactantSpecies()[1], "E+");
162 EXPECT_EQ(reaction2.getProductSpecies()[0], "F");
163 EXPECT_EQ(reaction2.getProductSpecies()[1], "G");
164 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[0], 1);
165 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[1], 1);
166 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[2], 1);
167 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[3], -1.1);
168 EXPECT_EQ(reaction2.hasMetaData("this"), false);
169}
170
171TEST(ReactionNetworkParserUtilsTest, non_unique_species)
172{
173 // Simple
175 "A - A + A -> -B\nD(aq) + E+ -> F + 2.1F - 1.1G", false);
176 auto reaction = reactions[0];
177 EXPECT_EQ(reaction.getSpecies()[0], "A");
178 EXPECT_EQ(reaction.getSpecies()[1], "A");
179 EXPECT_EQ(reaction.getSpecies()[2], "A");
180 EXPECT_EQ(reaction.getSpecies()[3], "B");
181 EXPECT_EQ(reaction.getUniqueSpecies()[0], "A");
182 EXPECT_EQ(reaction.getUniqueSpecies()[1], "B");
183 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
184 EXPECT_EQ(reaction.getUniqueReactantSpecies()[0], "A");
185 EXPECT_EQ(reaction.getUniqueReactantSpecies().size(), (unsigned int)1);
186 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
187 EXPECT_EQ(reaction.getUniqueProductSpecies()[0], "B");
188 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], 1);
189 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], -1);
190 EXPECT_EQ(reaction.getStoichiometricCoefficients()[3], -1);
191 EXPECT_EQ(reaction.getUniqueStoichiometricCoefficients()["A"], -1);
192 EXPECT_EQ(reaction.getUniqueStoichiometricCoefficients()["B"], -1);
193 EXPECT_EQ(reaction.hasMetaData("this"), false);
194 auto reaction2 = reactions[1];
195 EXPECT_EQ(reaction2.getSpecies()[0], "D(aq)");
196 EXPECT_EQ(reaction2.getSpecies()[1], "E+");
197 EXPECT_EQ(reaction2.getSpecies()[2], "F");
198 EXPECT_EQ(reaction2.getSpecies()[3], "F");
199 EXPECT_EQ(reaction2.getSpecies()[4], "G");
200 EXPECT_EQ(reaction2.getUniqueSpecies()[0], "D(aq)");
201 EXPECT_EQ(reaction2.getUniqueSpecies()[1], "E+");
202 EXPECT_EQ(reaction2.getUniqueSpecies()[2], "F");
203 EXPECT_EQ(reaction2.getUniqueSpecies()[3], "G");
204 EXPECT_EQ(reaction2.getReactantSpecies()[0], "D(aq)");
205 EXPECT_EQ(reaction2.getReactantSpecies()[1], "E+");
206 EXPECT_EQ(reaction2.getProductSpecies()[0], "F");
207 EXPECT_EQ(reaction2.getProductSpecies()[2], "G");
208 EXPECT_EQ(reaction2.getUniqueProductSpecies()[0], "F");
209 EXPECT_EQ(reaction2.getUniqueProductSpecies()[1], "G");
210 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[0], 1);
211 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[1], 1);
212 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[2], 1);
213 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[3], 2.1);
214 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[4], -1.1);
215 EXPECT_EQ(reaction2.getUniqueStoichiometricCoefficients()["D(aq)"], -1);
216 EXPECT_EQ(reaction2.getUniqueStoichiometricCoefficients()["E+"], -1);
217 EXPECT_EQ(reaction2.getUniqueStoichiometricCoefficients()["F"], 3.1);
218 EXPECT_EQ(reaction2.getUniqueStoichiometricCoefficients()["G"], -1.1);
219 EXPECT_EQ(reaction2.hasMetaData("this"), false);
220}
221
222TEST(ReactionNetworkParserUtilsTest, metadata)
223{
224 // One double term
226 "-10A + 3.4C -> -2.1111111B + 24D [k=2.1]", false)[0];
227 EXPECT_EQ(reaction.getSpecies()[0], "A");
228 EXPECT_EQ(reaction.getSpecies()[1], "C");
229 EXPECT_EQ(reaction.getSpecies()[2], "B");
230 EXPECT_EQ(reaction.getSpecies()[3], "D");
231 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
232 EXPECT_EQ(reaction.getReactantSpecies()[1], "C");
233 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
234 EXPECT_EQ(reaction.getProductSpecies()[1], "D");
235 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -10);
236 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 3.4);
237 EXPECT_EQ(reaction.getStoichiometricCoefficients()[2], -2.1111111);
238 EXPECT_EQ(reaction.getStoichiometricCoefficients()[3], 24);
239 EXPECT_EQ(reaction.hasMetaData("this"), false);
240 EXPECT_EQ(reaction.hasMetaData<Real>("k"), true);
241 EXPECT_EQ(reaction.hasMetaData("k"), true);
242 EXPECT_EQ(reaction.getMetaData("k"), "2.1");
243
244 // Two double terms (one negative) and a space in there
246 "-10A + 3.4C -> -2.1111111B + 24D [k=2.1, Q=-2]", false)[0];
247 EXPECT_EQ(reaction.getSpecies()[0], "A");
248 EXPECT_EQ(reaction.getSpecies()[1], "C");
249 EXPECT_EQ(reaction.getSpecies()[2], "B");
250 EXPECT_EQ(reaction.getSpecies()[3], "D");
251 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
252 EXPECT_EQ(reaction.getReactantSpecies()[1], "C");
253 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
254 EXPECT_EQ(reaction.getProductSpecies()[1], "D");
255 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -10);
256 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 3.4);
257 EXPECT_EQ(reaction.getStoichiometricCoefficients()[2], -2.1111111);
258 EXPECT_EQ(reaction.getStoichiometricCoefficients()[3], 24);
259 EXPECT_EQ(reaction.hasMetaData("this"), false);
260 EXPECT_EQ(reaction.hasMetaData<Real>("k"), true);
261 EXPECT_EQ(reaction.hasMetaData("k"), true);
262 EXPECT_EQ(reaction.getMetaData("k"), "2.1");
263 EXPECT_EQ(reaction.hasMetaData<Real>("Q"), true);
264 EXPECT_EQ(reaction.hasMetaData("Q"), true);
265 EXPECT_EQ(reaction.getMetaData("Q"), "-2");
266
267 // One string metadata
269 "-10A + 3.4C -> -2.1111111B + 24D [k=2.1, Q=-2, P=there]", false)[0];
270 EXPECT_EQ(reaction.getSpecies()[0], "A");
271 EXPECT_EQ(reaction.getSpecies()[1], "C");
272 EXPECT_EQ(reaction.getSpecies()[2], "B");
273 EXPECT_EQ(reaction.getSpecies()[3], "D");
274 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
275 EXPECT_EQ(reaction.getReactantSpecies()[1], "C");
276 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
277 EXPECT_EQ(reaction.getProductSpecies()[1], "D");
278 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -10);
279 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 3.4);
280 EXPECT_EQ(reaction.getStoichiometricCoefficients()[2], -2.1111111);
281 EXPECT_EQ(reaction.getStoichiometricCoefficients()[3], 24);
282 EXPECT_EQ(reaction.hasMetaData("this"), false);
283 EXPECT_EQ(reaction.hasMetaData<Real>("k"), true);
284 EXPECT_EQ(reaction.hasMetaData("k"), true);
285 EXPECT_EQ(reaction.getMetaData("k"), "2.1");
286 EXPECT_EQ(reaction.hasMetaData<Real>("Q"), true);
287 EXPECT_EQ(reaction.hasMetaData("Q"), true);
288 EXPECT_EQ(reaction.getMetaData("Q"), "-2");
289 EXPECT_EQ(reaction.hasMetaData<Real>("P"), false);
290 EXPECT_EQ(reaction.hasMetaData("P"), true);
291 EXPECT_EQ(reaction.getMetaData("P"), "there");
292
293 // Two reactions
295 "-A + C -> -B [K=23,Q=2]\nD(aq) + E+ -> F - 1.1G[S12=meta,log34=three]", false);
296 reaction = reactions[0];
297 EXPECT_EQ(reaction.getSpecies()[0], "A");
298 EXPECT_EQ(reaction.getSpecies()[1], "C");
299 EXPECT_EQ(reaction.getSpecies()[2], "B");
300 EXPECT_EQ(reaction.getReactantSpecies()[0], "A");
301 EXPECT_EQ(reaction.getReactantSpecies()[1], "C");
302 EXPECT_EQ(reaction.getProductSpecies()[0], "B");
303 EXPECT_EQ(reaction.getStoichiometricCoefficients()[0], -1);
304 EXPECT_EQ(reaction.getStoichiometricCoefficients()[1], 1);
305 EXPECT_EQ(reaction.getStoichiometricCoefficients()[2], -1);
306 EXPECT_EQ(reaction.hasMetaData("this"), false);
307 auto reaction2 = reactions[1];
308 EXPECT_EQ(reaction2.getSpecies()[0], "D(aq)");
309 EXPECT_EQ(reaction2.getSpecies()[1], "E+");
310 EXPECT_EQ(reaction2.getSpecies()[2], "F");
311 EXPECT_EQ(reaction2.getSpecies()[3], "G");
312 EXPECT_EQ(reaction2.getReactantSpecies()[0], "D(aq)");
313 EXPECT_EQ(reaction2.getReactantSpecies()[1], "E+");
314 EXPECT_EQ(reaction2.getProductSpecies()[0], "F");
315 EXPECT_EQ(reaction2.getProductSpecies()[1], "G");
316 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[0], 1);
317 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[1], 1);
318 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[2], 1);
319 EXPECT_EQ(reaction2.getStoichiometricCoefficients()[3], -1.1);
320 EXPECT_EQ(reaction2.hasMetaData("this"), false);
321}
TEST(ReactionNetworkParserUtilsTest, simple)
std::vector< Reaction > parseReactionNetwork(const std::string &reaction_network_string, bool output_to_cout)
Parses the reaction network from a string form to a vector a Reaction.