https://mooseframework.inl.gov
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 
12 #include "ReactionNetworkUtils.h"
13 
14 #include <cmath>
15 
16 TEST(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
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 
60 TEST(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 
93 TEST(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 
139 TEST(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 
171 TEST(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 
222 TEST(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 }
OStreamProxy err
TEST(ReactionNetworkParserUtilsTest, simple)
KOKKOS_INLINE_FUNCTION const T * find(const T &target, const T *const begin, const T *const end)
std::string reaction(const DenseMatrix< Real > &stoi, unsigned row, const std::vector< std::string > &names, Real stoi_tol=1.0E-6, int precision=4)
Returns a nicely formatted string corresponding to the reaction defined by the given row of the stoic...
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.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void ErrorVector unsigned int