3 #include <gtest/gtest.h> 7 using pyne::nucname::id;
8 using cyclus::Composition;
10 using cyclus::Material;
11 using cyclus::QueryResult;
13 using cyclus::toolkit::MatQuery;
16 namespace fuelfabtests {
18 Composition::Ptr
c_uox() {
22 return Composition::CreateFromMass(m);
25 Composition::Ptr
c_mox() {
30 return Composition::CreateFromMass(m);
33 Composition::Ptr
c_natu() {
37 return Composition::CreateFromMass(m);
46 return Composition::CreateFromMass(m);
55 return Composition::CreateFromMass(m);
64 return Composition::CreateFromMass(m);
71 return Composition::CreateFromAtom(m);
75 cyclus::Env::SetNucDataPath();
78 Composition::Ptr c = Composition::CreateFromMass(m);
80 EXPECT_DOUBLE_EQ(1.0, w);
84 c = Composition::CreateFromMass(m);
86 EXPECT_DOUBLE_EQ(0.0, w);
90 c = Composition::CreateFromMass(m);
92 EXPECT_DOUBLE_EQ(1.0, w);
96 c = Composition::CreateFromMass(m);
98 EXPECT_DOUBLE_EQ(0.0, w);
103 c = Composition::CreateFromAtom(m);
105 EXPECT_DOUBLE_EQ(0.5, w) <<
"might be using mass-fractions instead of atom";
110 c = Composition::CreateFromAtom(m);
112 EXPECT_DOUBLE_EQ(0.5, w) <<
"might be using mass-fractions instead of atom";
118 c = Composition::CreateFromAtom(m);
120 double w_fast =
CosiWeight(c,
"fission_spectrum_ave");
121 EXPECT_GT(w_therm, w_fast);
124 TEST(FuelFabTests, CosiWeight_Mixed) {
125 cyclus::Env::SetNucDataPath();
130 double fiss_frac =
HighFrac(w_fill, w_target, w_fiss);
131 double fill_frac =
LowFrac(w_fill, w_target, w_fiss);
137 Material::Ptr m1 = Material::CreateUntracked(fiss_frac,
c_pustream());
138 Material::Ptr m2 = Material::CreateUntracked(fill_frac,
c_natu());
140 double got =
CosiWeight(m1->comp(),
"thermal");
141 EXPECT_LT(std::abs((w_target-got)/w_target), 0.00001) <<
"mixed composition not within 0.001% of target";
145 cyclus::Env::SetNucDataPath();
150 EXPECT_THROW(
HighFrac(w_fiss, w_target, w_fill), cyclus::ValueError);
151 EXPECT_THROW(
HighFrac(w_target, w_fill, w_fiss), cyclus::ValueError);
152 EXPECT_THROW(
HighFrac(w_target, w_fiss, w_fill), cyclus::ValueError);
154 double f =
HighFrac(w_fill, w_target, w_fiss);
155 EXPECT_DOUBLE_EQ((w_target-w_fill)/(w_fiss-w_fill), f);
159 cyclus::Env::SetNucDataPath();
164 EXPECT_THROW(
LowFrac(w_fiss, w_target, w_fill), cyclus::ValueError);
165 EXPECT_THROW(
LowFrac(w_target, w_fill, w_fiss), cyclus::ValueError);
166 EXPECT_THROW(
LowFrac(w_target, w_fiss, w_fill), cyclus::ValueError);
168 double f =
LowFrac(w_fill, w_target, w_fiss);
169 EXPECT_DOUBLE_EQ((w_fiss-w_target)/(w_fiss-w_fill), f);
173 cyclus::Env::SetNucDataPath();
178 EXPECT_EQ(
true,
ValidWeights(w_fill, w_target, w_fiss));
179 EXPECT_EQ(
false,
ValidWeights(w_fiss, w_target, w_fill));
180 EXPECT_EQ(
false,
ValidWeights(w_target, w_fill, w_fiss));
181 EXPECT_EQ(
false,
ValidWeights(w_fiss, w_fill, w_target));
182 EXPECT_EQ(
false,
ValidWeights(w_target, w_fiss, w_fill));
183 EXPECT_EQ(
false,
ValidWeights(w_fill, w_fiss, w_target));
187 TEST(FuelFabTests, FissRecipe) {
189 "<fill_commods> <val>dummy</val> </fill_commods>" 190 "<fill_recipe>natu</fill_recipe>" 191 "<fill_size>1</fill_size>" 193 "<fiss_commods> <val>stream1</val> <val>stream2</val> <val>stream3</val> </fiss_commods>" 194 "<fiss_size>2.5</fiss_size>" 195 "<fiss_recipe>spentuox</fiss_recipe>" 197 "<outcommod>dummyout</outcommod>" 198 "<spectrum>thermal</spectrum>" 199 "<throughput>0</throughput>" 203 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
204 sim.AddSource(
"stream1").Finalize();
206 sim.AddRecipe(
"natu",
c_natu());
209 int resid = sim.db().Query(
"Transactions", NULL).GetVal<
int>(
"ResourceId");
210 CompMap got = sim.GetMaterial(resid)->comp()->mass();
212 cyclus::compmath::Normalize(&got);
213 cyclus::compmath::Normalize(&want);
214 CompMap::iterator it;
215 for (it = want.begin(); it != want.end(); ++it) {
216 EXPECT_DOUBLE_EQ(it->second, got[it->first]) <<
"nuclide qty off: " << pyne::nucname::name(it->first);
222 TEST(FuelFabTests, MultipleFissStreams) {
224 "<fill_commods> <val>dummy</val> </fill_commods>" 225 "<fill_recipe>natu</fill_recipe>" 226 "<fill_size>1</fill_size>" 228 "<fiss_commods> <val>stream1</val> <val>stream2</val> <val>stream3</val> </fiss_commods>" 229 "<fiss_size>2.5</fiss_size>" 231 "<outcommod>dummyout</outcommod>" 232 "<spectrum>thermal</spectrum>" 233 "<throughput>0</throughput>" 237 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
238 sim.AddSource(
"stream1").recipe(
"spentuox").capacity(1).Finalize();
239 sim.AddSource(
"stream2").recipe(
"spentuox").capacity(1).Finalize();
240 sim.AddSource(
"stream3").recipe(
"spentuox").capacity(1).Finalize();
242 sim.AddRecipe(
"natu",
c_natu());
245 QueryResult qr = sim.db().Query(
"Transactions", NULL);
246 EXPECT_EQ(3, qr.rows.size());
248 std::vector<Cond> conds;
249 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"stream1")));
250 qr = sim.db().Query(
"Transactions", &conds);
251 EXPECT_EQ(1, qr.rows.size());
253 conds[0] = Cond(
"Commodity",
"==",
std::string(
"stream2"));
254 qr = sim.db().Query(
"Transactions", &conds);
255 EXPECT_EQ(1, qr.rows.size());
257 conds[0] = Cond(
"Commodity",
"==",
std::string(
"stream3"));
258 qr = sim.db().Query(
"Transactions", &conds);
259 EXPECT_EQ(1, qr.rows.size());
263 TEST(FuelFabTests, FissStreamPrefs) {
265 "<fill_commods> <val>dummy</val> </fill_commods>" 266 "<fill_recipe>natu</fill_recipe>" 267 "<fill_size>1</fill_size>" 269 "<fiss_commods> <val>stream1</val> <val>stream2</val> <val>stream3</val> </fiss_commods>" 270 "<fiss_commod_prefs> <val>1.0</val> <val>0.1</val> <val>2.0</val> </fiss_commod_prefs>" 271 "<fiss_size>1.5</fiss_size>" 273 "<outcommod>dummyout</outcommod>" 274 "<spectrum>thermal</spectrum>" 275 "<throughput>0</throughput>" 279 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
280 sim.AddSource(
"stream1").recipe(
"spentuox").capacity(1).Finalize();
281 sim.AddSource(
"stream2").recipe(
"spentuox").capacity(1).Finalize();
282 sim.AddSource(
"stream3").recipe(
"spentuox").capacity(1).Finalize();
284 sim.AddRecipe(
"natu",
c_natu());
287 std::vector<Cond> conds;
288 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"stream1")));
289 QueryResult qr = sim.db().Query(
"Transactions", &conds);
290 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
291 EXPECT_DOUBLE_EQ(0.5, m->quantity());
293 conds[0] = Cond(
"Commodity",
"==",
std::string(
"stream2"));
294 qr = sim.db().Query(
"Transactions", &conds);
295 EXPECT_EQ(0, qr.rows.size());
297 conds[0] = Cond(
"Commodity",
"==",
std::string(
"stream3"));
298 qr = sim.db().Query(
"Transactions", &conds);
299 m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
300 EXPECT_DOUBLE_EQ(1.0, m->quantity());
304 TEST(FuelFabTests, ZeroThroughput) {
306 "<fill_commods> <val>natu</val> </fill_commods>" 307 "<fill_recipe>natu</fill_recipe>" 308 "<fill_size>3.9</fill_size>" 310 "<fiss_commods> <val>spentuox</val> </fiss_commods>" 311 "<fiss_recipe>spentuox</fiss_recipe>" 312 "<fiss_size>3.5</fiss_size>" 314 "<topup_commod>uox</topup_commod>" 315 "<topup_recipe>uox</topup_recipe>" 316 "<topup_size>3.3</topup_size>" 318 "<outcommod>dummyout</outcommod>" 319 "<spectrum>thermal</spectrum>" 320 "<throughput>0</throughput>" 324 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
325 sim.AddSource(
"uox").capacity(1).Finalize();
326 sim.AddSource(
"spentuox").capacity(1).Finalize();
327 sim.AddSource(
"natu").capacity(1).Finalize();
328 sim.AddRecipe(
"uox",
c_uox());
330 sim.AddRecipe(
"natu",
c_natu());
331 EXPECT_NO_THROW(sim.Run());
337 TEST(FuelFabTests, FillAllInventories) {
339 "<fill_commods> <val>natu</val> </fill_commods>" 340 "<fill_recipe>natu</fill_recipe>" 341 "<fill_size>3.9</fill_size>" 343 "<fiss_commods> <val>spentuox</val> </fiss_commods>" 344 "<fiss_recipe>spentuox</fiss_recipe>" 345 "<fiss_size>3.5</fiss_size>" 347 "<topup_commod>uox</topup_commod>" 348 "<topup_recipe>uox</topup_recipe>" 349 "<topup_size>3.3</topup_size>" 351 "<outcommod>dummyout</outcommod>" 352 "<spectrum>thermal</spectrum>" 353 "<throughput>1</throughput>" 357 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
358 sim.AddSource(
"uox").capacity(1).Finalize();
359 sim.AddSource(
"spentuox").capacity(1).Finalize();
360 sim.AddSource(
"natu").capacity(1).Finalize();
361 sim.AddRecipe(
"uox",
c_uox());
363 sim.AddRecipe(
"natu",
c_natu());
366 cyclus::SqlStatement::Ptr stmt = sim.db().db().Prepare(
367 "SELECT SUM(r.Quantity) FROM Transactions AS t" 368 " INNER JOIN Resources AS r ON r.ResourceId = t.ResourceId" 369 " WHERE t.Commodity = ?;" 372 stmt->BindText(1,
"natu");
374 EXPECT_DOUBLE_EQ(3.9, stmt->GetDouble(0));
376 stmt->BindText(1,
"spentuox");
378 EXPECT_DOUBLE_EQ(3.5, stmt->GetDouble(0));
380 stmt->BindText(1,
"uox");
382 EXPECT_DOUBLE_EQ(3.3, stmt->GetDouble(0));
387 TEST(FuelFabTests, ProvideStraightFiss_WithZeroFill) {
389 "<fill_commods> <val>nothing</val> </fill_commods>" 390 "<fill_recipe>natu</fill_recipe>" 391 "<fill_size>100</fill_size>" 393 "<fiss_commods> <val>anything</val> </fiss_commods>" 394 "<fiss_recipe>spentuox</fiss_recipe>" 395 "<fiss_size>100</fiss_size>" 397 "<outcommod>recyclefuel</outcommod>" 398 "<spectrum>thermal</spectrum>" 399 "<throughput>100</throughput>" 402 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
403 sim.AddSource(
"anything").Finalize();
404 sim.AddSink(
"recyclefuel").recipe(
"spentuox").capacity(100).Finalize();
405 sim.AddRecipe(
"uox",
c_uox());
407 sim.AddRecipe(
"natu",
c_natu());
410 std::vector<Cond> conds;
411 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
412 QueryResult qr = sim.db().Query(
"Transactions", NULL);
414 EXPECT_EQ(6, qr.rows.size());
417 TEST(FuelFabTests, ProvideStraightFill_ZeroFiss) {
419 "<fill_commods> <val>anything</val> </fill_commods>" 420 "<fill_recipe>natu</fill_recipe>" 421 "<fill_size>100</fill_size>" 423 "<fiss_commods> <val>nothing</val> </fiss_commods>" 424 "<fiss_recipe>spentuox</fiss_recipe>" 425 "<fiss_size>100</fiss_size>" 427 "<outcommod>recyclefuel</outcommod>" 428 "<spectrum>thermal</spectrum>" 429 "<throughput>100</throughput>" 432 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
433 sim.AddSource(
"anything").Finalize();
434 sim.AddSink(
"recyclefuel").recipe(
"natu").capacity(100).Finalize();
435 sim.AddRecipe(
"uox",
c_uox());
437 sim.AddRecipe(
"natu",
c_natu());
440 std::vector<Cond> conds;
441 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
442 QueryResult qr = sim.db().Query(
"Transactions", NULL);
444 EXPECT_EQ(6, qr.rows.size());
449 TEST(FuelFabTests, ThroughputLimit) {
451 "<fill_commods> <val>anything</val> </fill_commods>" 452 "<fill_recipe>natu</fill_recipe>" 453 "<fill_size>100</fill_size>" 455 "<fiss_commods> <val>anything</val> </fiss_commods>" 456 "<fiss_recipe>pustream</fiss_recipe>" 457 "<fiss_size>100</fiss_size>" 459 "<outcommod>recyclefuel</outcommod>" 460 "<spectrum>thermal</spectrum>" 461 "<throughput>3</throughput>" 463 double throughput = 3;
466 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
467 sim.AddSource(
"anything").lifetime(1).Finalize();
468 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(2*throughput).Finalize();
469 sim.AddRecipe(
"uox",
c_uox());
471 sim.AddRecipe(
"natu",
c_natu());
474 QueryResult qr = sim.db().Query(
"Transactions", NULL);
475 EXPECT_LT(2, qr.rows.size());
477 cyclus::SqlStatement::Ptr stmt = sim.db().db().Prepare(
478 "SELECT SUM(r.Quantity) FROM Transactions AS t" 479 " INNER JOIN Resources AS r ON r.ResourceId = t.ResourceId" 480 " WHERE t.Commodity = 'recyclefuel';" 484 EXPECT_DOUBLE_EQ(throughput * (simdur-1), stmt->GetDouble(0));
486 stmt = sim.db().db().Prepare(
487 "SELECT COUNT(*) FROM Transactions WHERE Commodity = 'recyclefuel';" 491 EXPECT_DOUBLE_EQ(simdur-1, stmt->GetDouble(0));
495 TEST(FuelFabTests, CorrectMixing) {
497 "<fill_commods> <val>natu</val> </fill_commods>" 498 "<fill_recipe>natu</fill_recipe>" 499 "<fill_size>100</fill_size>" 501 "<fiss_commods> <val>pustream</val> </fiss_commods>" 502 "<fiss_recipe>pustream</fiss_recipe>" 503 "<fiss_size>100</fiss_size>" 505 "<outcommod>recyclefuel</outcommod>" 506 "<spectrum>thermal</spectrum>" 507 "<throughput>100</throughput>" 510 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
511 sim.AddSource(
"pustream").Finalize();
512 sim.AddSource(
"natu").Finalize();
513 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(10).lifetime(2).Finalize();
514 sim.AddRecipe(
"uox",
c_uox());
516 sim.AddRecipe(
"natu",
c_natu());
519 std::vector<Cond> conds;
520 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
521 QueryResult qr = sim.db().Query(
"Transactions", &conds);
522 EXPECT_EQ(1, qr.rows.size());
524 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
525 double got =
CosiWeight(m->comp(),
"thermal");
527 EXPECT_LT(std::abs((w_target-got)/w_target), 0.00001) <<
"mixed composition not within 0.001% of target";
529 conds.push_back(Cond(
"Time",
"==", 2));
532 conds[0] = Cond(
"Commodity",
"==",
std::string(
"natu"));
533 qr = sim.db().Query(
"Transactions", &conds);
534 m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
535 EXPECT_NEAR(9.7463873197, m->quantity(), 1e-6) <<
"mixed wrong amount of Nat. U stream";
537 conds[0] = Cond(
"Commodity",
"==",
std::string(
"pustream"));
538 qr = sim.db().Query(
"Transactions", &conds);
539 m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
540 EXPECT_NEAR(0.25361268029, m->quantity(), 1e-6) <<
"mixed wrong amount of Pu stream";
545 TEST(FuelFabTests, FillConstrained) {
546 cyclus::Env::SetNucDataPath();
548 "<fill_commods> <val>natu</val> </fill_commods>" 549 "<fill_recipe>natu</fill_recipe>" 550 "<fill_size>1</fill_size>" 552 "<fiss_commods> <val>pustream</val> </fiss_commods>" 553 "<fiss_recipe>pustream</fiss_recipe>" 554 "<fiss_size>10000</fiss_size>" 556 "<outcommod>recyclefuel</outcommod>" 557 "<spectrum>thermal</spectrum>" 558 "<throughput>10000</throughput>" 566 double fiss_frac =
HighFrac(w_fill, w_target, w_fiss);
567 double fill_frac =
LowFrac(w_fill, w_target, w_fiss);
570 double max_provide = fillinv / fill_frac;
572 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
573 sim.AddSource(
"pustream").lifetime(1).Finalize();
574 sim.AddSource(
"natu").lifetime(1).Finalize();
575 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(2 * max_provide).Finalize();
576 sim.AddRecipe(
"uox",
c_uox());
578 sim.AddRecipe(
"natu",
c_natu());
581 std::vector<Cond> conds;
582 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
583 QueryResult qr = sim.db().Query(
"Transactions", &conds);
584 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
586 EXPECT_NEAR(max_provide, m->quantity(), 1e-10) <<
"matched trade uses more fill than available";
591 TEST(FuelFabTests, FissConstrained) {
592 cyclus::Env::SetNucDataPath();
594 "<fill_commods> <val>natu</val> </fill_commods>" 595 "<fill_recipe>natu</fill_recipe>" 596 "<fill_size>10000</fill_size>" 598 "<fiss_commods> <val>pustream</val> </fiss_commods>" 599 "<fiss_recipe>pustream</fiss_recipe>" 600 "<fiss_size>1</fiss_size>" 602 "<outcommod>recyclefuel</outcommod>" 603 "<spectrum>thermal</spectrum>" 604 "<throughput>10000</throughput>" 612 double fiss_frac =
HighFrac(w_fill, w_target, w_fiss);
613 double fill_frac =
LowFrac(w_fill, w_target, w_fiss);
616 double max_provide = fissinv / fiss_frac;
618 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
619 sim.AddSource(
"pustream").lifetime(1).Finalize();
620 sim.AddSource(
"natu").lifetime(1).Finalize();
621 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(2 * max_provide).Finalize();
622 sim.AddRecipe(
"uox",
c_uox());
624 sim.AddRecipe(
"natu",
c_natu());
627 std::vector<Cond> conds;
628 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
629 QueryResult qr = sim.db().Query(
"Transactions", &conds);
630 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
632 EXPECT_NEAR(max_provide, m->quantity(), 1e-10) <<
"matched trade uses more fill than available";
636 TEST(FuelFabTests, SwapTopup) {
638 "<fill_commods> <val>natu</val> </fill_commods>" 639 "<fill_recipe>natu</fill_recipe>" 640 "<fill_size>10000</fill_size>" 642 "<fiss_commods> <val>pustreambad</val> </fiss_commods>" 643 "<fiss_recipe>pustreambad</fiss_recipe>" 644 "<fiss_size>10000</fiss_size>" 646 "<topup_commod>pustream</topup_commod>" 647 "<topup_recipe>pustream</topup_recipe>" 648 "<topup_size>10000</topup_size>" 650 "<outcommod>recyclefuel</outcommod>" 651 "<spectrum>thermal</spectrum>" 652 "<throughput>10000</throughput>" 655 double sink_cap = 10;
657 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
658 sim.AddSource(
"pustream").Finalize();
659 sim.AddSource(
"pustreambad").Finalize();
660 sim.AddSource(
"natu").Finalize();
661 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(sink_cap).lifetime(2).Finalize();
662 sim.AddRecipe(
"uox",
c_uox());
665 sim.AddRecipe(
"natu",
c_natu());
668 std::vector<Cond> conds;
669 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
670 QueryResult qr = sim.db().Query(
"Transactions", &conds);
671 ASSERT_EQ(1, qr.rows.size()) <<
"failed to meet fuel request";
672 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
673 EXPECT_NEAR(sink_cap, m->quantity(), 1e-10) <<
"supplied fuel was constrained too much";
675 conds[0] = Cond(
"Commodity",
"==",
std::string(
"natu"));
676 conds.push_back(Cond(
"Time",
"==", 2));
677 qr = sim.db().Query(
"Transactions", &conds);
678 ASSERT_EQ(0, qr.rows.size()) <<
"failed to swith to topup - used fill - uh oh";
680 conds[0] = Cond(
"Commodity",
"==",
std::string(
"pustream"));
681 conds.push_back(Cond(
"Time",
"==", 2));
682 qr = sim.db().Query(
"Transactions", &conds);
683 ASSERT_EQ(1, qr.rows.size()) <<
"didn't get more topup after supposedly using it - why?";
686 TEST(FuelFabTests, SwapTopup_ZeroFill) {
688 "<fill_commods> <val>natu</val> </fill_commods>" 689 "<fill_recipe>natu</fill_recipe>" 690 "<fill_size>0</fill_size>" 692 "<fiss_commods> <val>pustreambad</val> </fiss_commods>" 693 "<fiss_recipe>pustreambad</fiss_recipe>" 694 "<fiss_size>10000</fiss_size>" 696 "<topup_commod>pustream</topup_commod>" 697 "<topup_recipe>pustream</topup_recipe>" 698 "<topup_size>10000</topup_size>" 700 "<outcommod>recyclefuel</outcommod>" 701 "<spectrum>thermal</spectrum>" 702 "<throughput>10000</throughput>" 705 double sink_cap = 10;
707 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
708 sim.AddSource(
"pustream").Finalize();
709 sim.AddSource(
"pustreambad").Finalize();
710 sim.AddSource(
"natu").Finalize();
711 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(sink_cap).lifetime(2).Finalize();
712 sim.AddRecipe(
"uox",
c_uox());
715 sim.AddRecipe(
"natu",
c_natu());
718 std::vector<Cond> conds;
719 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
720 QueryResult qr = sim.db().Query(
"Transactions", &conds);
721 ASSERT_EQ(1, qr.rows.size()) <<
"failed to meet fuel request";
722 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
723 EXPECT_NEAR(sink_cap, m->quantity(), 1e-10) <<
"supplied fuel was constrained too much";
725 conds[0] = Cond(
"Commodity",
"==",
std::string(
"pustream"));
726 conds.push_back(Cond(
"Time",
"==", 2));
727 qr = sim.db().Query(
"Transactions", &conds);
728 ASSERT_EQ(1, qr.rows.size()) <<
"failed to use topup - why?";
730 conds[0] = Cond(
"Commodity",
"==",
std::string(
"pustreambad"));
731 conds.push_back(Cond(
"Time",
"==", 2));
732 qr = sim.db().Query(
"Transactions", &conds);
733 ASSERT_EQ(1, qr.rows.size()) <<
"failed to use fiss - why?";
741 TEST(FuelFabTests, SwapTopup_TopupConstrained) {
742 cyclus::Env::SetNucDataPath();
744 "<fill_commods> <val>natu</val> </fill_commods>" 745 "<fill_recipe>natu</fill_recipe>" 746 "<fill_size>10000</fill_size>" 748 "<fiss_commods> <val>pustreambad</val> </fiss_commods>" 749 "<fiss_recipe>pustreambad</fiss_recipe>" 750 "<fiss_size>10000</fiss_size>" 752 "<topup_commod>pustream</topup_commod>" 753 "<topup_recipe>pustream</topup_recipe>" 754 "<topup_size>1</topup_size>" 756 "<outcommod>recyclefuel</outcommod>" 757 "<spectrum>thermal</spectrum>" 758 "<throughput>10000</throughput>" 767 double topup_frac =
HighFrac(w_fiss, w_target, w_topup);
768 double fiss_frac =
LowFrac(w_fiss, w_target, w_topup);
771 double max_provide = topupinv / topup_frac;
773 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
774 sim.AddSource(
"pustream").Finalize();
775 sim.AddSource(
"pustreambad").Finalize();
776 sim.AddSource(
"natu").Finalize();
777 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(2 * max_provide).Finalize();
778 sim.AddRecipe(
"uox",
c_uox());
781 sim.AddRecipe(
"natu",
c_natu());
784 std::vector<Cond> conds;
785 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
786 QueryResult qr = sim.db().Query(
"Transactions", &conds);
787 ASSERT_EQ(1, qr.rows.size()) <<
"failed to meet fuel request";
788 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
790 EXPECT_NEAR(max_provide, m->quantity(), 1e-10) <<
"matched trade uses more fiss than available";
796 TEST(FuelFabTests, SwapTopup_FissConstrained) {
797 cyclus::Env::SetNucDataPath();
799 "<fill_commods> <val>natu</val> </fill_commods>" 800 "<fill_recipe>natu</fill_recipe>" 801 "<fill_size>0</fill_size>" 803 "<fiss_commods> <val>pustreambad</val> </fiss_commods>" 804 "<fiss_recipe>pustreambad</fiss_recipe>" 805 "<fiss_size>1</fiss_size>" 807 "<topup_commod>pustream</topup_commod>" 808 "<topup_recipe>pustream</topup_recipe>" 809 "<topup_size>10000</topup_size>" 811 "<outcommod>recyclefuel</outcommod>" 812 "<spectrum>thermal</spectrum>" 813 "<throughput>10000</throughput>" 822 double topup_frac =
HighFrac(w_fiss, w_target, w_topup);
823 double fiss_frac =
LowFrac(w_fiss, w_target, w_topup);
826 double max_provide = fissinv / fiss_frac;
828 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
829 sim.AddSource(
"pustream").Finalize();
830 sim.AddSource(
"pustreambad").Finalize();
831 sim.AddSource(
"natu").Finalize();
832 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(2 * max_provide).Finalize();
833 sim.AddRecipe(
"uox",
c_uox());
836 sim.AddRecipe(
"natu",
c_natu());
839 std::vector<Cond> conds;
840 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"recyclefuel")));
841 QueryResult qr = sim.db().Query(
"Transactions", &conds);
842 ASSERT_EQ(1, qr.rows.size()) <<
"failed to meet fuel request";
843 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
845 EXPECT_NEAR(max_provide, m->quantity(), 1e-10) <<
"matched trade uses more fiss than available";
856 TEST(FuelFabTests, HomogenousBuffers) {
858 "<fill_commods> <val>natu</val> </fill_commods>" 859 "<fill_recipe>natu</fill_recipe>" 860 "<fill_size>40</fill_size>" 862 "<fiss_commods> <val>stream1</val> </fiss_commods>" 863 "<fiss_size>4</fiss_size>" 864 "<fiss_recipe>spentuox</fiss_recipe>" 866 "<outcommod>out</outcommod>" 867 "<spectrum>thermal</spectrum>" 868 "<throughput>1e10</throughput>" 877 Composition::Ptr c = Composition::CreateFromMass(m);
880 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
881 sim.AddSource(
"stream1").start(0).lifetime(1).capacity(.01).recipe(
"special").Finalize();
882 sim.AddSource(
"stream1").start(1).lifetime(1).capacity(3.98).recipe(
"natu").Finalize();
883 sim.AddSource(
"natu").lifetime(1).Finalize();
884 sim.AddSink(
"out").start(2).capacity(4).lifetime(1).recipe(
"uox").Finalize();
885 sim.AddSink(
"out").start(2).capacity(4).lifetime(1).recipe(
"uox").Finalize();
886 sim.AddRecipe(
"uox",
c_uox());
888 sim.AddRecipe(
"natu",
c_natu());
889 sim.AddRecipe(
"special", c);
890 ASSERT_NO_THROW(sim.Run());
894 TEST(FuelFabTests, PositionInitialize) {
895 cyclus::Env::SetNucDataPath();
897 "<fill_commods> <val>natu</val> </fill_commods>" 898 "<fill_recipe>natu</fill_recipe>" 899 "<fill_size>0</fill_size>" 901 "<fiss_commods> <val>pustreambad</val> </fiss_commods>" 902 "<fiss_recipe>pustreambad</fiss_recipe>" 903 "<fiss_size>1</fiss_size>" 905 "<topup_commod>pustream</topup_commod>" 906 "<topup_recipe>pustream</topup_recipe>" 907 "<topup_size>10000</topup_size>" 909 "<outcommod>recyclefuel</outcommod>" 910 "<spectrum>thermal</spectrum>" 911 "<throughput>10000</throughput>";
918 double fiss_frac =
HighFrac(w_fill, w_target, w_fiss);
919 double fill_frac =
LowFrac(w_fill, w_target, w_fiss);
922 double max_provide = fillinv / fill_frac;
924 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
925 sim.AddSource(
"pustream").Finalize();
926 sim.AddSource(
"pustreambad").Finalize();
927 sim.AddSource(
"natu").Finalize();
928 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(2 * max_provide).Finalize();
929 sim.AddRecipe(
"uox",
c_uox());
932 sim.AddRecipe(
"natu",
c_natu());
935 QueryResult qr = sim.db().Query(
"AgentPosition", NULL);
936 EXPECT_EQ(qr.GetVal<
double>(
"Latitude"), 0.0);
937 EXPECT_EQ(qr.GetVal<
double>(
"Longitude"), 0.0);
940 TEST(FuelFabTests, PositionInitialize2) {
941 cyclus::Env::SetNucDataPath();
943 "<fill_commods> <val>natu</val> </fill_commods>" 944 "<fill_recipe>natu</fill_recipe>" 945 "<fill_size>0</fill_size>" 947 "<fiss_commods> <val>pustreambad</val> </fiss_commods>" 948 "<fiss_recipe>pustreambad</fiss_recipe>" 949 "<fiss_size>1</fiss_size>" 951 "<topup_commod>pustream</topup_commod>" 952 "<topup_recipe>pustream</topup_recipe>" 953 "<topup_size>10000</topup_size>" 955 "<outcommod>recyclefuel</outcommod>" 956 "<spectrum>thermal</spectrum>" 957 "<throughput>10000</throughput>" 958 "<latitude>-90.0</latitude> " 959 "<longitude>-120.0</longitude> " 967 double fiss_frac =
HighFrac(w_fill, w_target, w_fiss);
968 double fill_frac =
LowFrac(w_fill, w_target, w_fiss);
971 double max_provide = fillinv / fill_frac;
973 cyclus::MockSim sim(cyclus::AgentSpec(
":cycamore:FuelFab"), config, simdur);
974 sim.AddSource(
"pustream").Finalize();
975 sim.AddSource(
"pustreambad").Finalize();
976 sim.AddSource(
"natu").Finalize();
977 sim.AddSink(
"recyclefuel").recipe(
"uox").capacity(2 * max_provide).Finalize();
978 sim.AddRecipe(
"uox",
c_uox());
981 sim.AddRecipe(
"natu",
c_natu());
984 QueryResult qr = sim.db().Query(
"AgentPosition", NULL);
985 EXPECT_EQ(qr.GetVal<
double>(
"Latitude"), -90.0);
986 EXPECT_EQ(qr.GetVal<
double>(
"Longitude"), -120.0);
Composition::Ptr c_pustreamlow()
double HighFrac(double w_low, double w_target, double w_high, double eps)
Composition::Ptr c_pustream()
double AtomToMassFrac(double atomfrac, Composition::Ptr c1, Composition::Ptr c2)
double CosiWeight(cyclus::Composition::Ptr c, const std::string &spectrum)
cycamore::GrowthRegion string
Composition::Ptr c_water()
bool ValidWeights(double w_low, double w_target, double w_high)
Composition::Ptr c_natu()
Composition::Ptr c_pustreambad()
double LowFrac(double w_low, double w_target, double w_high, double eps)
TEST(FuelFabTests, CosiWeight)