CYCAMORE
Loading...
Searching...
No Matches
build/cycamore/separations_tests.cc
Go to the documentation of this file.
1#include "separations.h"
2
3#include <gtest/gtest.h>
4#include <sstream>
5#include "cyclus.h"
6
7using pyne::nucname::id;
8using cyclus::Composition;
9using cyclus::CompMap;
10using cyclus::Material;
11using cyclus::QueryResult;
12using cyclus::Cond;
13using cyclus::toolkit::MatQuery;
14
15namespace cycamore {
16
17TEST(SeparationsTests, SepMaterial) {
18 CompMap comp;
19 comp[id("U235")] = 10;
20 comp[id("U238")] = 90;
21 comp[id("Pu239")] = 1;
22 comp[id("Pu240")] = 2;
23 comp[id("Am241")] = 3;
24 comp[id("Am242")] = 2.8;
25 double qty = 100;
26 Composition::Ptr c = Composition::CreateFromMass(comp);
27 Material::Ptr mat = Material::CreateUntracked(qty, c);
28
29 std::map<int, double> effs;
30 effs[id("U")] = .7;
31 effs[id("Pu")] = .4;
32 effs[id("Am241")] = .4;
33
34 Material::Ptr sep = SepMaterial(effs, mat);
35 MatQuery mqorig(mat);
36 MatQuery mqsep(sep);
37
38 EXPECT_DOUBLE_EQ(effs[id("U")] * mqorig.mass("U235"), mqsep.mass("U235"));
39 EXPECT_DOUBLE_EQ(effs[id("U")] * mqorig.mass("U238"), mqsep.mass("U238"));
40 EXPECT_DOUBLE_EQ(effs[id("Pu")] * mqorig.mass("Pu239"), mqsep.mass("Pu239"));
41 EXPECT_DOUBLE_EQ(effs[id("Pu")] * mqorig.mass("Pu240"), mqsep.mass("Pu240"));
42 EXPECT_DOUBLE_EQ(effs[id("Am241")] * mqorig.mass("Am241"), mqsep.mass("Am241"));
43 EXPECT_DOUBLE_EQ(0, mqsep.mass("Am242"));
44}
45
46
47// Check that cumulative separations efficiency for a single nuclide of less than or equal to one does not trigger an error.
48TEST(SeparationsTests, SeparationEfficiency) {
49
50 int simdur = 2;
51 std::string config =
52 "<streams>"
53 " <item>"
54 " <commod>stream1</commod>"
55 " <info>"
56 " <buf_size>-1</buf_size>"
57 " <efficiencies>"
58 " <item><comp>Pu239</comp> <eff>.2</eff></item>"
59 " </efficiencies>"
60 " </info>"
61 " </item>"
62 " <item>"
63 " <commod>stream1</commod>"
64 " <info>"
65 " <buf_size>-1</buf_size>"
66 " <efficiencies>"
67 " <item><comp>Pu239</comp> <eff>.1</eff></item>"
68 " </efficiencies>"
69 " </info>"
70 " </item>"
71 " <item>"
72 " <commod>stream1</commod>"
73 " <info>"
74 " <buf_size>-1</buf_size>"
75 " <efficiencies>"
76 " <item><comp>Pu239</comp> <eff>.5</eff></item>"
77 " </efficiencies>"
78 " </info>"
79 " </item>"
80 "</streams>"
81 ""
82 "<leftover_commod>waste</leftover_commod>"
83 "<throughput>100</throughput>"
84 "<feedbuf_size>100</feedbuf_size>"
85 "<feed_commods> <val>feed</val> </feed_commods>"
86 ;
87
88
89 cyclus::MockSim sim1(cyclus::AgentSpec(":cycamore:Separations"), config, simdur);
90
91 EXPECT_NO_THROW(sim1.Run()) << "Cumulative separation efficiency smaler than 1 is throwing an error but should not.";
92
93
94 config =
95 "<streams>"
96 " <item>"
97 " <commod>stream1</commod>"
98 " <info>"
99 " <buf_size>-1</buf_size>"
100 " <efficiencies>"
101 " <item><comp>U</comp> <eff>0.1</eff></item>"
102 " <item><comp>Pu239</comp> <eff>.2</eff></item>"
103 " </efficiencies>"
104 " </info>"
105 " </item>"
106 " <item>"
107 " <commod>stream1</commod>"
108 " <info>"
109 " <buf_size>-1</buf_size>"
110 " <efficiencies>"
111 " <item><comp>U</comp> <eff>0.2</eff></item>"
112 " <item><comp>Pu239</comp> <eff>.1</eff></item>"
113 " </efficiencies>"
114 " </info>"
115 " </item>"
116 " <item>"
117 " <commod>stream1</commod>"
118 " <info>"
119 " <buf_size>-1</buf_size>"
120 " <efficiencies>"
121 " <item><comp>U</comp> <eff>0.7</eff></item>"
122 " <item><comp>Pu239</comp> <eff>.5</eff></item>"
123 " </efficiencies>"
124 " </info>"
125 " </item>"
126 "</streams>"
127 ""
128 "<leftover_commod>waste</leftover_commod>"
129 "<throughput>100</throughput>"
130 "<feedbuf_size>100</feedbuf_size>"
131 "<feed_commods> <val>feed</val> </feed_commods>"
132 ;
133
134
135 cyclus::MockSim sim2(cyclus::AgentSpec(":cycamore:Separations"), config, simdur);
136
137 EXPECT_NO_THROW(sim2.Run()) << "Cumulative separation efficiency of 1 is throwing an error but should not.";
138}
139
140// Check that an error is correctly thrown when separations efficiency of greater than one.
141TEST(SeparationsTests, SeparationEfficiencyThrowing) {
142 int simdur = 2;
143
144 // Check that single separations efficiency for a single nuclide of greater than one does not trigger an error.
145 std::string config =
146 "<streams>"
147 " <item>"
148 " <commod>stream1</commod>"
149 " <info>"
150 " <buf_size>-1</buf_size>"
151 " <efficiencies>"
152 " <item><comp>U</comp> <eff>1.6</eff></item>"
153 " <item><comp>Pu239</comp> <eff>.7</eff></item>"
154 " </efficiencies>"
155 " </info>"
156 " </item>"
157 "</streams>"
158 ""
159 "<leftover_commod>waste</leftover_commod>"
160 "<throughput>100</throughput>"
161 "<feedbuf_size>100</feedbuf_size>"
162 "<feed_commods> <val>feed</val> </feed_commods>"
163 ;
164
165 cyclus::MockSim sim1(cyclus::AgentSpec(":cycamore:Separations"), config, simdur);
166
167 EXPECT_THROW(sim1.Run(), cyclus::ValueError) << "Direct separation efficiency greater than 1 is not throwing an error but should.";
168
169// Check if a cumulative separation efficiency greater than 1 for a unique nuclide throw an error as expected.
170 config =
171 "<streams>"
172 " <item>"
173 " <commod>stream1</commod>"
174 " <info>"
175 " <buf_size>-1</buf_size>"
176 " <efficiencies>"
177 " <item><comp>U</comp> <eff>0.6</eff></item>"
178 " <item><comp>Pu239</comp> <eff>.7</eff></item>"
179 " </efficiencies>"
180 " </info>"
181 " </item>"
182 " <item>"
183 " <commod>stream2</commod>"
184 " <info>"
185 " <buf_size>-1</buf_size>"
186 " <efficiencies>"
187 " <item><comp>U</comp> <eff>0.1</eff></item>"
188 " <item><comp>Pu239</comp> <eff>.7</eff></item>"
189 " </efficiencies>"
190 " </info>"
191 " </item>"
192 "</streams>"
193 ""
194 "<leftover_commod>waste</leftover_commod>"
195 "<throughput>100</throughput>"
196 "<feedbuf_size>100</feedbuf_size>"
197 "<feed_commods> <val>feed</val> </feed_commods>"
198 ;
199
200 cyclus::MockSim sim2(cyclus::AgentSpec(":cycamore:Separations"), config, simdur);
201
202 EXPECT_THROW(sim2.Run(), cyclus::ValueError) << "Single cumulative separation efficiency greater than 1 is not throwing an error but should.";
203// Check if a cumulative separation efficiency greater than 1 for multiple nuclides throw an error as expected.
204 config =
205 "<streams>"
206 " <item>"
207 " <commod>stream1</commod>"
208 " <info>"
209 " <buf_size>-1</buf_size>"
210 " <efficiencies>"
211 " <item><comp>U</comp> <eff>0.6</eff></item>"
212 " <item><comp>Pu239</comp> <eff>.7</eff></item>"
213 " </efficiencies>"
214 " </info>"
215 " </item>"
216 " <item>"
217 " <commod>stream2</commod>"
218 " <info>"
219 " <buf_size>-1</buf_size>"
220 " <efficiencies>"
221 " <item><comp>U</comp> <eff>0.6</eff></item>"
222 " <item><comp>Pu239</comp> <eff>.7</eff></item>"
223 " </efficiencies>"
224 " </info>"
225 " </item>"
226 "</streams>"
227 ""
228 "<leftover_commod>waste</leftover_commod>"
229 "<throughput>100</throughput>"
230 "<feedbuf_size>100</feedbuf_size>"
231 "<feed_commods> <val>feed</val> </feed_commods>"
232 ;
233
234 cyclus::MockSim sim3(cyclus::AgentSpec(":cycamore:Separations"), config, simdur);
235
236 EXPECT_THROW(sim3.Run(), cyclus::ValueError) << "Multiple cumulative separation efficiencies greater than 1 are not throwing an error but should.";
237}
238
239TEST(SeparationsTests, SepMixElemAndNuclide) {
240 std::string config =
241 "<streams>"
242 " <item>"
243 " <commod>stream1</commod>"
244 " <info>"
245 " <buf_size>-1</buf_size>"
246 " <efficiencies>"
247 " <item><comp>U</comp> <eff>0.6</eff></item>"
248 " <item><comp>Pu239</comp> <eff>.7</eff></item>"
249 " </efficiencies>"
250 " </info>"
251 " </item>"
252 "</streams>"
253 ""
254 "<leftover_commod>waste</leftover_commod>"
255 "<throughput>100</throughput>"
256 "<feedbuf_size>100</feedbuf_size>"
257 "<feed_commods> <val>feed</val> </feed_commods>"
258 ;
259
260 CompMap m;
261 m[id("u235")] = 0.08;
262 m[id("u238")] = 0.9;
263 m[id("Pu239")] = .01;
264 m[id("Pu240")] = .01;
265 Composition::Ptr c = Composition::CreateFromMass(m);
266
267 int simdur = 2;
268 cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Separations"), config, simdur);
269 sim.AddSource("feed").recipe("recipe1").Finalize();
270 sim.AddSink("stream1").capacity(100).Finalize();
271 sim.AddRecipe("recipe1", c);
272 int id = sim.Run();
273
274 std::vector<Cond> conds;
275 conds.push_back(Cond("SenderId", "==", id));
276 int resid = sim.db().Query("Transactions", &conds).GetVal<int>("ResourceId");
277 MatQuery mq (sim.GetMaterial(resid));
278 EXPECT_DOUBLE_EQ(m[922350000]*0.6*100, mq.mass("U235"));
279 EXPECT_DOUBLE_EQ(m[922380000]*0.6*100, mq.mass("U238"));
280 EXPECT_DOUBLE_EQ(m[942390000]*0.7*100, mq.mass("Pu239"));
281 EXPECT_DOUBLE_EQ(0, mq.mass("Pu240"));
282}
283
284TEST(SeparationsTests, Retire) {
285 std::string config =
286 "<streams>"
287 " <item>"
288 " <commod>stream1</commod>"
289 " <info>"
290 " <buf_size>-1</buf_size>"
291 " <efficiencies>"
292 " <item><comp>U235</comp> <eff>1.0</eff></item>"
293 " </efficiencies>"
294 " </info>"
295 " </item>"
296 "</streams>"
297 ""
298 "<leftover_commod>waste</leftover_commod>"
299 "<throughput>100</throughput>"
300 "<feedbuf_size>100</feedbuf_size>"
301 "<feed_commods> <val>feed</val> </feed_commods>"
302 ;
303
304 CompMap m;
305 m[id("u235")] = 0.1;
306 m[id("u238")] = 0.9;
307 Composition::Ptr c = Composition::CreateFromMass(m);
308
309 int simdur = 5;
310 int life = 2;
311
312 cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Separations"),
313 config, simdur, life);
314 sim.AddSource("feed").recipe("recipe1").Finalize();
315 sim.AddSink("stream1").capacity(100).Finalize();
316 sim.AddSink("waste").capacity(70).Finalize();
317 sim.AddRecipe("recipe1", c);
318 int id = sim.Run();
319
320 // Separations should stop requesting material at its lifetime
321 // (it is smart enough to not request material on its last timestep because
322 // it knows it won't be able to process it)
323 std::vector<Cond> conds;
324 conds.push_back(Cond("ReceiverId", "==", id));
325 QueryResult qr = sim.db().Query("Transactions", &conds);
326 EXPECT_EQ(life - 1, qr.rows.size())
327 << "failed to stop ordering near retirement";
328
329 // Separations should discharge all material before decomissioning
330 conds.clear();
331 conds.push_back(Cond("SenderId", "==", id));
332 qr = sim.db().Query("Transactions", &conds);
333 double tot_mat = 0;
334 for (int i = 0; i < qr.rows.size(); i++) {
335 Material::Ptr m = sim.GetMaterial(qr.GetVal<int>("ResourceId", i));
336 tot_mat += m->quantity();
337 }
338 EXPECT_EQ(100, tot_mat)
339 << "total material traded away does not equal total material separated";
340 EXPECT_EQ(3.0, qr.rows.size())
341 << "failed to discharge all material before decomissioning";
342 }
343
344 TEST(SeparationsTests, PositionInitialize) {
345 std::string config =
346 "<streams>"
347 " <item>"
348 " <commod>stream1</commod>"
349 " <info>"
350 " <buf_size>-1</buf_size>"
351 " <efficiencies>"
352 " <item><comp>U</comp> <eff>0.6</eff></item>"
353 " <item><comp>Pu239</comp> <eff>.7</eff></item>"
354 " </efficiencies>"
355 " </info>"
356 " </item>"
357 "</streams>"
358 ""
359 "<leftover_commod>waste</leftover_commod>"
360 "<throughput>100</throughput>"
361 "<feedbuf_size>100</feedbuf_size>"
362 "<feed_commods> <val>feed</val> </feed_commods>";
363 CompMap m;
364 m[id("u235")] = 0.08;
365 m[id("u238")] = 0.9;
366 m[id("Pu239")] = .01;
367 m[id("Pu240")] = .01;
368 Composition::Ptr c = Composition::CreateFromMass(m);
369
370 int simdur = 2;
371 cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Separations"), config, simdur);
372 sim.AddSource("feed").recipe("recipe1").Finalize();
373 sim.AddSink("stream1").capacity(100).Finalize();
374 sim.AddRecipe("recipe1", c);
375 int id = sim.Run();
376
377 QueryResult qr = sim.db().Query("AgentPosition", NULL);
378 EXPECT_EQ(qr.GetVal<double>("Latitude"), 0.0);
379 EXPECT_EQ(qr.GetVal<double>("Longitude"), 0.0);
380 }
381
382 TEST(SeparationsTests, PositionInitialize2) {
383 std::string config =
384 "<streams>"
385 " <item>"
386 " <commod>stream1</commod>"
387 " <info>"
388 " <buf_size>-1</buf_size>"
389 " <efficiencies>"
390 " <item><comp>U</comp> <eff>0.6</eff></item>"
391 " <item><comp>Pu239</comp> <eff>.7</eff></item>"
392 " </efficiencies>"
393 " </info>"
394 " </item>"
395 "</streams>"
396 ""
397 "<leftover_commod>waste</leftover_commod>"
398 "<throughput>100</throughput>"
399 "<feedbuf_size>100</feedbuf_size>"
400 "<feed_commods> <val>feed</val> </feed_commods>"
401 "<latitude>10.0</latitude> "
402 "<longitude>15.0</longitude> ";
403 CompMap m;
404 m[id("u235")] = 0.08;
405 m[id("u238")] = 0.9;
406 m[id("Pu239")] = .01;
407 m[id("Pu240")] = .01;
408 Composition::Ptr c = Composition::CreateFromMass(m);
409
410 int simdur = 2;
411 cyclus::MockSim sim(cyclus::AgentSpec(":cycamore:Separations"), config, simdur);
412 sim.AddSource("feed").recipe("recipe1").Finalize();
413 sim.AddSink("stream1").capacity(100).Finalize();
414 sim.AddRecipe("recipe1", c);
415 int id = sim.Run();
416
417 QueryResult qr = sim.db().Query("AgentPosition", NULL);
418 EXPECT_EQ(qr.GetVal<double>("Latitude"), 10.0);
419 EXPECT_EQ(qr.GetVal<double>("Longitude"), 15.0);
420 }
421} // namespace cycamore
422
Material::Ptr SepMaterial(std::map< int, double > effs, Material::Ptr mat)
TEST(MixerTests, MultipleFissStreams)