1 #include <gtest/gtest.h> 5 #include "facility_tests.h" 6 #include "toolkit/mat_query.h" 7 #include "agent_tests.h" 8 #include "resource_helpers.h" 9 #include "infile_tree.h" 14 using cyclus::QueryResult;
16 using cyclus::CompMap;
17 using cyclus::toolkit::MatQuery;
18 using pyne::nucname::id;
19 using cyclus::Material;
26 return Composition::CreateFromMass(m);
32 return Composition::CreateFromMass(m);
38 return Composition::CreateFromMass(m);
40 Composition::Ptr
c_leu() {
44 return Composition::CreateFromMass(m);
46 Composition::Ptr
c_heu() {
50 return Composition::CreateFromMass(m);
54 TEST_F(EnrichmentTest, RequestQty) {
59 " <feed_commod>natu</feed_commod> " 60 " <feed_recipe>natu1</feed_recipe> " 61 " <product_commod>enr_u</product_commod> " 62 " <tails_commod>tails</tails_commod> " 63 " <max_feed_inventory>1.0</max_feed_inventory> " 64 " <tails_assay>0.003</tails_assay> ";
67 cyclus::MockSim sim(cyclus::AgentSpec
68 (
":cycamore:Enrichment"), config, simdur);
69 sim.AddRecipe(
"natu1",
c_natu1());
77 std::vector<Cond> conds;
78 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"natu")));
79 QueryResult qr = sim.db().Query(
"Transactions", &conds);
80 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
84 EXPECT_EQ(1.0, qr.rows.size());
85 EXPECT_NEAR(1.0, m->quantity(), 1e-10) <<
86 "matched trade provides the wrong quantity of material";
90 TEST_F(EnrichmentTest, CheckSWUConstraint) {
97 " <feed_commod>natu</feed_commod> " 98 " <feed_recipe>natu1</feed_recipe> " 99 " <product_commod>enr_u</product_commod> " 100 " <tails_commod>tails</tails_commod> " 101 " <tails_assay>0.003</tails_assay> " 102 " <initial_feed>1000</initial_feed> " 103 " <swu_capacity>195</swu_capacity> ";
107 cyclus::MockSim sim(cyclus::AgentSpec
108 (
":cycamore:Enrichment"), config, simdur);
110 sim.AddRecipe(
"natu1",
c_natu1());
111 sim.AddRecipe(
"heu",
c_heu());
120 std::vector<Cond> conds;
121 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"enr_u")));
122 QueryResult qr = sim.db().Query(
"Transactions", &conds);
123 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
125 EXPECT_EQ(1.0, qr.rows.size());
126 EXPECT_NEAR(5.0, m->quantity(), 0.1) <<
127 "traded quantity exceeds SWU constraint";
131 TEST_F(EnrichmentTest, CheckCapConstraint) {
136 " <feed_commod>natu</feed_commod> " 137 " <feed_recipe>natu1</feed_recipe> " 138 " <product_commod>enr_u</product_commod> " 139 " <tails_commod>tails</tails_commod> " 140 " <tails_assay>0.003</tails_assay> " 141 " <initial_feed>243</initial_feed> ";
145 cyclus::MockSim sim(cyclus::AgentSpec
146 (
":cycamore:Enrichment"), config, simdur);
149 sim.AddRecipe(
"natu1",
c_natu1());
150 sim.AddRecipe(
"heu",
c_heu());
159 std::vector<Cond> conds;
160 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"enr_u")));
161 QueryResult qr = sim.db().Query(
"Transactions", &conds);
162 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
164 EXPECT_EQ(1.0, qr.rows.size());
165 EXPECT_LE(m->quantity(), 5.0) <<
166 "traded quantity exceeds capacity constraint";
170 TEST_F(EnrichmentTest, RequestEnrich) {
175 " <feed_commod>natu</feed_commod> " 176 " <feed_recipe>natu1</feed_recipe> " 177 " <product_commod>enr_u</product_commod> " 178 " <tails_commod>tails</tails_commod> " 179 " <tails_assay>0.003</tails_assay> " 180 " <max_enrich>0.19</max_enrich> ";
183 cyclus::MockSim sim(cyclus::AgentSpec
184 (
":cycamore:Enrichment"), config, simdur);
185 sim.AddRecipe(
"natu1",
c_natu1());
186 sim.AddRecipe(
"leu",
c_leu());
187 sim.AddRecipe(
"heu",
c_heu());
189 sim.AddSource(
"natu")
202 std::vector<Cond> conds;
203 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"enr_u")));
204 QueryResult qr = sim.db().Query(
"Transactions", &conds);
205 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
209 EXPECT_EQ(1.0, qr.rows.size());
210 EXPECT_NEAR(1.0, m->quantity(), 0.01) <<
211 "Not providing the requested quantity" ;
213 CompMap got = m->comp()->mass();
214 CompMap want =
c_leu()->mass();
215 cyclus::compmath::Normalize(&got);
216 cyclus::compmath::Normalize(&want);
218 CompMap::iterator it;
219 for (it = want.begin(); it != want.end(); ++it) {
220 EXPECT_DOUBLE_EQ(it->second, got[it->first]) <<
221 "nuclide qty off: " << pyne::nucname::name(it->first);
226 TEST_F(EnrichmentTest, TradeTails) {
230 " <feed_commod>natu</feed_commod> " 231 " <feed_recipe>natu1</feed_recipe> " 232 " <product_commod>enr_u</product_commod> " 233 " <tails_commod>tails</tails_commod> " 234 " <tails_assay>0.003</tails_assay> ";
238 cyclus::MockSim sim(cyclus::AgentSpec
239 (
":cycamore:Enrichment"), config, simdur);
240 sim.AddRecipe(
"natu1",
c_natu1());
241 sim.AddRecipe(
"leu",
c_leu());
243 sim.AddSource(
"natu")
254 std::vector<Cond> conds;
255 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"tails")));
256 QueryResult qr = sim.db().Query(
"Transactions", &conds);
259 EXPECT_EQ(1, qr.rows.size());
263 TEST_F(EnrichmentTest, TailsQty) {
268 " <feed_commod>natu</feed_commod> " 269 " <feed_recipe>natu1</feed_recipe> " 270 " <product_commod>enr_u</product_commod> " 271 " <tails_commod>tails</tails_commod> " 272 " <tails_assay>0.003</tails_assay> ";
276 cyclus::MockSim sim(cyclus::AgentSpec
277 (
":cycamore:Enrichment"), config, simdur);
278 sim.AddRecipe(
"natu1",
c_natu1());
279 sim.AddRecipe(
"leu",
c_leu());
281 sim.AddSource(
"natu")
297 std::vector<Cond> conds;
298 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"tails")));
299 QueryResult qr = sim.db().Query(
"Transactions", &conds);
300 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
304 EXPECT_EQ(2, qr.rows.size());
306 cyclus::SqlStatement::Ptr stmt = sim.db().db().Prepare(
307 "SELECT SUM(r.Quantity) FROM Transactions AS t" 308 " INNER JOIN Resources AS r ON r.ResourceId = t.ResourceId" 309 " WHERE t.Commodity = ?;" 312 stmt->BindText(1,
"tails");
314 EXPECT_NEAR(8.25,stmt->GetDouble(0), 0.01) <<
315 "Not providing the requested quantity" ;
319 TEST_F(EnrichmentTest, BidPrefs) {
324 " <feed_commod>natu</feed_commod> " 325 " <feed_recipe>natu1</feed_recipe> " 326 " <product_commod>enr_u</product_commod> " 327 " <tails_commod>tails</tails_commod> " 328 " <tails_assay>0.003</tails_assay> " 329 " <max_feed_inventory>1.0</max_feed_inventory> ";
332 cyclus::MockSim sim(cyclus::AgentSpec
333 (
":cycamore:Enrichment"), config, simdur);
334 sim.AddRecipe(
"natu1",
c_natu1());
335 sim.AddRecipe(
"natu2",
c_natu2());
337 sim.AddSource(
"natu")
342 sim.AddSource(
"natu")
349 std::vector<Cond> conds;
350 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"natu")));
351 QueryResult qr = sim.db().Query(
"Transactions", &conds);
354 EXPECT_EQ(1, qr.rows.size());
356 Material::Ptr m = sim.GetMaterial(qr.GetVal<
int>(
"ResourceId"));
357 CompMap got = m->comp()->mass();
358 CompMap want =
c_natu2()->mass();
359 cyclus::compmath::Normalize(&got);
360 cyclus::compmath::Normalize(&want);
362 CompMap::iterator it;
363 for (it = want.begin(); it != want.end(); ++it) {
364 EXPECT_DOUBLE_EQ(it->second, got[it->first]) <<
365 "nuclide qty off: " << pyne::nucname::name(it->first);
370 TEST_F(EnrichmentTest, NoBidPrefs) {
375 " <feed_commod>natu</feed_commod> " 376 " <feed_recipe>natu1</feed_recipe> " 377 " <product_commod>enr_u</product_commod> " 378 " <tails_commod>tails</tails_commod> " 379 " <tails_assay>0.003</tails_assay> " 380 " <max_feed_inventory>2.0</max_feed_inventory> " 381 " <order_prefs>0</order_prefs> ";
384 cyclus::MockSim sim(cyclus::AgentSpec
385 (
":cycamore:Enrichment"), config, simdur);
386 sim.AddRecipe(
"natu1",
c_natu1());
387 sim.AddRecipe(
"natu2",
c_natu2());
389 sim.AddSource(
"natu")
394 sim.AddSource(
"natu")
401 std::vector<Cond> conds;
402 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"natu")));
403 QueryResult qr = sim.db().Query(
"Transactions", &conds);
406 EXPECT_EQ(2, qr.rows.size());
410 TEST_F(EnrichmentTest, ZeroU235) {
414 " <feed_commod>natu</feed_commod> " 415 " <feed_recipe>natu1</feed_recipe> " 416 " <product_commod>enr_u</product_commod> " 417 " <tails_commod>tails</tails_commod> " 418 " <tails_assay>0.003</tails_assay> " 419 " <max_feed_inventory>1.0</max_feed_inventory> ";
422 cyclus::MockSim sim(cyclus::AgentSpec
423 (
":cycamore:Enrichment"), config, simdur);
424 sim.AddRecipe(
"no_u235",
c_nou235());
425 sim.AddRecipe(
"natu1",
c_natu1());
427 sim.AddSource(
"natu")
434 std::vector<Cond> conds;
435 conds.push_back(Cond(
"Commodity",
"==",
std::string(
"natu")));
437 EXPECT_THROW(sim.db().Query(
"Transactions", &conds),
443 cyclus::Env::SetNucDataPath();
444 cyclus::Context* ctx =
tc_.get();
458 cyclus::Context* ctx =
tc_.get();
470 recipe = cyclus::Composition::CreateFromMass(v);
495 return cyclus::Material::CreateUntracked(qty,
510 cyclus::Material::Ptr
516 cyclus::Material::Ptr
522 TEST_F(EnrichmentTest, Request) {
527 EXPECT_DOUBLE_EQ(mat->quantity(), req);
534 EXPECT_DOUBLE_EQ(mat->quantity(), req);
541 EXPECT_DOUBLE_EQ(mat->quantity(), req);
546 TEST_F(EnrichmentTest, ValidReq) {
548 using cyclus::CompMap;
549 using cyclus::Composition;
550 using cyclus::Material;
556 Material::Ptr mat = Material::CreateUntracked
557 (qty,Composition::CreateFromAtom(v1));
563 mat = Material::CreateUntracked(qty, Composition::CreateFromAtom(v2));
570 mat = Material::CreateUntracked(qty, Composition::CreateFromAtom(v3));
575 TEST_F(EnrichmentTest, ConstraintConverters) {
578 using cyclus::CompMap;
579 using cyclus::Material;
580 using cyclus::toolkit::MatQuery;
581 using cyclus::Composition;
582 using cyclus::toolkit::Assays;
583 using cyclus::toolkit::UraniumAssayMass;
584 using cyclus::toolkit::SwuRequired;
585 using cyclus::toolkit::FeedQty;
586 using cyclus::toolkit::MatQuery;
587 cyclus::Env::SetNucDataPath();
590 double product_assay = 0.05;
592 v[922350000] = product_assay;
593 v[922380000] = 1 - product_assay;
595 Material::Ptr target = Material::CreateUntracked(
596 qty, Composition::CreateFromMass(v));
598 std::set<cyclus::Nuc> nucs;
599 nucs.insert(922350000);
600 nucs.insert(922380000);
603 double mass_frac = mq.mass_frac(nucs);
608 Material::Ptr offer =
DoOffer(target);
610 EXPECT_NEAR(swuc.convert(target), swuc.convert(offer), 0.001);
611 EXPECT_NEAR(natuc.convert(target) * mass_frac, natuc.convert(offer), 0.001);
615 TEST_F(EnrichmentTest, Enrich) {
620 using cyclus::CompMap;
621 using cyclus::Material;
622 using cyclus::toolkit::MatQuery;
623 using cyclus::Composition;
624 using cyclus::toolkit::Assays;
625 using cyclus::toolkit::UraniumAssayMass;
626 using cyclus::toolkit::SwuRequired;
627 using cyclus::toolkit::FeedQty;
630 double product_assay = 0.05;
632 v[922350000] = product_assay;
633 v[922380000] = 1 - product_assay;
635 Material::Ptr target = cyclus::Material::CreateUntracked(
636 qty + 10, cyclus::Composition::CreateFromMass(v));
639 double swu_req = SwuRequired(qty, assays);
640 double natu_req = FeedQty(qty, assays);
641 double tails_qty = TailsQty(qty, assays);
643 double swu_cap = swu_req * 5;
649 Material::Ptr response;
650 EXPECT_NO_THROW(response =
DoEnrich(target, qty));
653 MatQuery q(response);
654 EXPECT_EQ(response->quantity(), qty);
655 EXPECT_EQ(q.mass_frac(922350000), product_assay);
656 EXPECT_EQ(q.mass_frac(922380000), 1 - product_assay);
660 EXPECT_THROW(response =
DoEnrich(target, qty), cyclus::Error);
664 TEST_F(EnrichmentTest, Response) {
673 using cyclus::CompMap;
674 using cyclus::Material;
675 using cyclus::Request;
677 using cyclus::toolkit::Assays;
678 using cyclus::toolkit::FeedQty;
679 using cyclus::toolkit::SwuRequired;
680 using cyclus::toolkit::UraniumAssayMass;
683 std::vector< cyclus::Trade<cyclus::Material> > trades;
684 std::vector<std::pair<cyclus::Trade<cyclus::Material>,
685 cyclus::Material::Ptr> > responses;
688 double trade_qty = qty / 3;
689 double product_assay = 0.05;
692 v[922350000] = product_assay;
693 v[922380000] = 1 - product_assay;
695 Material::Ptr target = cyclus::Material::CreateUntracked(
696 qty + 10, cyclus::Composition::CreateFromMass(v));
699 double swu_req = SwuRequired(qty, assays);
700 double natu_req = FeedQty(qty, assays);
712 Request<Material>* req =
714 Bid<Material>* bid = Bid<Material>::Create(req, target,
src_facility);
715 Trade<Material> trade(req, bid, trade_qty);
716 trades.push_back(trade);
721 trades.push_back(trade);
724 EXPECT_EQ(responses.size(), 2);
728 TEST_F(EnrichmentTest, PositionInitialize) {
732 " <feed_commod>natu</feed_commod> " 733 " <feed_recipe>natu1</feed_recipe> " 734 " <product_commod>enr_u</product_commod> " 735 " <tails_commod>tails</tails_commod> " 736 " <max_feed_inventory>1.0</max_feed_inventory> " 737 " <tails_assay>0.003</tails_assay> ";
740 cyclus::MockSim sim(cyclus::AgentSpec
741 (
":cycamore:Enrichment"), config, simdur);
742 sim.AddRecipe(
"natu1",
c_natu1());
744 sim.AddSource(
"natu")
750 QueryResult qr = sim.db().Query(
"AgentPosition", NULL);
751 EXPECT_EQ(qr.GetVal<
double>(
"Latitude"), 0.0);
752 EXPECT_EQ(qr.GetVal<
double>(
"Longitude"), 0.0);
755 TEST_F(EnrichmentTest, PositionInitialize2) {
760 " <feed_commod>natu</feed_commod> " 761 " <feed_recipe>natu1</feed_recipe> " 762 " <product_commod>enr_u</product_commod> " 763 " <tails_commod>tails</tails_commod> " 764 " <max_feed_inventory>1.0</max_feed_inventory> " 765 " <tails_assay>0.003</tails_assay> " 766 " <latitude>50.0</latitude> " 767 " <longitude>35.0</longitude> ";
770 cyclus::MockSim sim(cyclus::AgentSpec
771 (
":cycamore:Enrichment"), config, simdur);
772 sim.AddRecipe(
"natu1",
c_natu1());
774 sim.AddSource(
"natu")
780 QueryResult qr = sim.db().Query(
"AgentPosition", NULL);
781 EXPECT_EQ(qr.GetVal<
double>(
"Latitude"), 50.0);
782 EXPECT_EQ(qr.GetVal<
double>(
"Longitude"), 35.0);
794 #ifndef CYCLUS_AGENT_TESTS_CONNECTED 797 #define CYCLUS_AGENT_TESTS_CONNECTED cyclus_agent_tests_connected 798 #endif // CYCLUS_AGENT_TESTS_CONNECTED
Enrichment * src_facility
cyclus::Material::Ptr Offer_(cyclus::Material::Ptr req)
Generates a material offer for a given request.
cyclus::Material::Ptr DoRequest()
Composition::Ptr c_natu2()
void SetMaxInventorySize(double size)
cyclus::Material::Ptr DoOffer(cyclus::Material::Ptr mat)
bool ValidReq(const cyclus::Material::Ptr mat)
Determines if a particular material is a valid request to respond to.
cyclus::Material::Ptr Request_()
generates a request for this facility given its current state.
const cyclus::toolkit::ResBuf< cyclus::Material > & Tails() const
static int cyclus_agent_tests_connected
cyclus::Material::Ptr Enrich_(cyclus::Material::Ptr mat, double qty)
cycamore::GrowthRegion string
void SwuCapacity(double capacity)
cyclus::Agent * EnrichmentConstructor(cyclus::Context *ctx)
Composition::Ptr c_nou235()
cyclus::Material::Ptr GetMat(double qty)
std::string product_commod
void AddMat_(cyclus::Material::Ptr mat)
adds a material into the natural uranium inventory
The Enrichment facility is a simple Agent that enriches natural uranium in a Cyclus simulation...
INSTANTIATE_TEST_CASE_P(EnrichmentFac, FacilityTests, Values(&EnrichmentConstructor))
void DoAddMat(cyclus::Material::Ptr mat)
virtual void GetMatlTrades(const std::vector< cyclus::Trade< cyclus::Material > > &trades, std::vector< std::pair< cyclus::Trade< cyclus::Material >, cyclus::Material::Ptr > > &responses)
respond to each trade with a material enriched to the appropriate level given this facility's invento...
cyclus::Material::Ptr DoEnrich(cyclus::Material::Ptr mat, double qty)
std::string product_commod
Composition::Ptr c_natu1()
cyclus::Composition::Ptr recipe
TEST_F(EnrichmentTest, RequestQty)