1 #line 1 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
6 namespace commodconverter {
10 : cyclus::Facility(ctx) {
11 cyclus::Warn<cyclus::EXPERIMENTAL_WARNING>(
"the CommodConverter is experimental.");
20 "<element name=\"in_commod\">\n"
21 " <data type=\"string\" />\n"
23 "<element name=\"out_commod\">\n"
24 " <data type=\"string\" />\n"
27 " <element name=\"in_recipe\">\n"
28 " <data type=\"string\" />\n"
32 " <element name=\"out_recipe\">\n"
33 " <data type=\"string\" />\n"
37 " <element name=\"process_time\">\n"
38 " <data type=\"int\" />\n"
42 " <element name=\"max_inv_size\">\n"
43 " <data type=\"double\" />\n"
49 #line 17 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
54 bool parsed_ok = reader.parse(
55 "{\"vars\":{\"in_commod\":{\"doc\":\"commodity accepted by"
57 "facility\",\"type\":\"std::string\",\"tooltip\":\"input co"
58 "mmodity\",\"index\":0},\"out_commod\":{\"doc\":\"commodity"
60 "facility\",\"type\":\"std::string\",\"tooltip\":\"output c"
61 "ommodity\",\"index\":1},\"in_recipe\":{\"default\":\"\",\"do"
62 "c\":\"recipe accepted by this "
63 "facility\",\"type\":\"std::string\",\"tooltip\":\"input re"
64 "cipe\",\"index\":2},\"out_recipe\":{\"default\":\"\",\"doc\":"
65 "\"recipe to be generated by this "
66 "facility\",\"type\":\"std::string\",\"tooltip\":\"output r"
67 "ecipe\",\"index\":3},\"process_time\":{\"default\":0,\"doc"
68 "\":\"the time it takes to convert a received "
70 "(timesteps).\",\"type\":\"int\",\"tooltip\":\"process time"
71 " (timesteps)\",\"index\":4},\"max_inv_size\":{\"default\""
72 ":1e+299,\"doc\":\"the amount of material that can be "
73 "in storage at one time "
74 "(kg).\",\"type\":\"double\",\"tooltip\":\"maximum "
75 "inventory size (kg)\",\"index\":5}},\"doc\":\"A "
76 "commodconverter facility converts from one "
77 "commodity to another, with an optional delay.\"}", root);
79 throw cyclus::ValueError(
"failed to parse annotations for commodconverter::CommodConverter.");
83 #line 19 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
87 #line 21 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
90 cyclus::Inventories invs;
93 #line 23 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
96 cyclus::Facility::InfileToDb(tree, di);
97 tree = tree->SubTree(
"config/*");
98 cyclus::InfileTree* sub;
101 in_commod = cyclus::Query<std::string>(tree,
"in_commod");
102 out_commod = cyclus::Query<std::string>(tree,
"out_commod");
103 in_recipe = cyclus::OptionalQuery<std::string>(tree,
"in_recipe",
"");
104 out_recipe = cyclus::OptionalQuery<std::string>(tree,
"out_recipe",
"");
105 process_time = cyclus::OptionalQuery<int>(tree,
"process_time", 0);
106 max_inv_size = cyclus::OptionalQuery<double>(tree,
"max_inv_size", 1e+299);
109 ->AddVal(
"out_commod", out_commod)
110 ->AddVal(
"in_recipe", in_recipe)
111 ->AddVal(
"out_recipe", out_recipe)
112 ->AddVal(
"process_time", process_time)
113 ->AddVal(
"max_inv_size", max_inv_size)
116 #line 25 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
128 #line 27 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
135 #line 29 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
145 #line 34 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
147 cyclus::toolkit::CommodityProducer::Copy(m);
152 cyclus::QueryResult qr = b->Query(
"Info", NULL);
153 in_commod = qr.GetVal<std::string>(
"in_commod");
154 out_commod = qr.GetVal<std::string>(
"out_commod");
155 in_recipe = qr.GetVal<std::string>(
"in_recipe");
156 out_recipe = qr.GetVal<std::string>(
"out_recipe");
159 #line 42 "/Users/khuff/repos/cyclus/commodconverter/src/commodconverter.cc"
161 using cyclus::toolkit::Commodity;
162 Commodity commod = Commodity(out_commod);
163 cyclus::toolkit::CommodityProducer::Add(commod);
164 cyclus::toolkit::CommodityProducer::SetCapacity(commod,
capacity);
165 cyclus::toolkit::CommodityProducer::SetCost(commod,
cost);
170 Facility::EnterNotify();
172 using cyclus::toolkit::Commodity;
174 cyclus::toolkit::CommodityProducer::Add(commod);
175 cyclus::toolkit::CommodityProducer::SetCapacity(commod,
capacity);
176 cyclus::toolkit::CommodityProducer::SetCost(commod,
cost);
181 std::stringstream ss;
183 if (cyclus::toolkit::CommodityProducer::
184 Produces(cyclus::toolkit::Commodity(
out_commod_()))){
189 ss << cyclus::Facility::str();
190 ss <<
" has facility parameters {" <<
"\n"
191 <<
" Input Commodity = " <<
in_commod_() <<
",\n"
192 <<
" Output Commodity = " <<
out_commod_() <<
",\n"
194 <<
" Capacity = " <<
capacity_() <<
",\n"
195 <<
" commod producer members: " <<
" produces "
197 <<
" capacity: " << cyclus::toolkit::CommodityProducer::Capacity(
out_commod_())
198 <<
" cost: " << cyclus::toolkit::CommodityProducer::Cost(
out_commod_())
205 LOG(cyclus::LEV_INFO3,
"ComCnv") << prototype() <<
" is ticking {";
206 LOG(cyclus::LEV_INFO3,
"ComCnv") <<
"}";
211 LOG(cyclus::LEV_INFO3,
"ComCnv") << prototype() <<
" is tocking {";
216 LOG(cyclus::LEV_INFO3,
"ComCnv") <<
"}";
220 std::set<cyclus::RequestPortfolio<cyclus::Material>::Ptr>
222 using cyclus::CapacityConstraint;
223 using cyclus::Material;
224 using cyclus::RequestPortfolio;
225 using cyclus::Request;
227 std::set<RequestPortfolio<Material>::Ptr> ports;
229 RequestPortfolio<Material>::Ptr port(
new RequestPortfolio<Material>());
231 double amt = mat->quantity();
233 if (amt > cyclus::eps()) {
247 const std::vector< std::pair<cyclus::Trade<cyclus::Material>,
248 cyclus::Material::Ptr> >& responses) {
249 std::vector< std::pair<cyclus::Trade<cyclus::Material>,
250 cyclus::Material::Ptr> >::const_iterator it;
251 for (it = responses.begin(); it != responses.end(); ++it) {
257 std::set<cyclus::BidPortfolio<cyclus::Material>::Ptr>
260 using cyclus::BidPortfolio;
261 using cyclus::Material;
263 std::set<BidPortfolio<Material>::Ptr> ports;
265 std::set<std::string>::const_iterator it;
266 BidPortfolio<Material>::Ptr port =
GetBids_(commod_requests,
269 if (!port->bids().empty()) {
279 const std::vector< cyclus::Trade<cyclus::Material> >& trades,
280 std::vector<std::pair<cyclus::Trade<cyclus::Material>,
281 cyclus::Material::Ptr> >& responses) {
282 using cyclus::Material;
286 std::vector< Trade<Material> >::const_iterator it;
287 for (it = trades.begin(); it != trades.end(); ++it) {
288 std::string commodity = it->request->commodity();
289 double qty = it->amt;
293 responses.push_back(std::make_pair(*it, response));
294 LOG(cyclus::LEV_INFO5,
"ComCnv") << prototype()
295 <<
" just received an order"
296 <<
" for " << it->amt
297 <<
" of " << commodity;
306 LOG(cyclus::LEV_INFO5,
"ComCnv") << prototype() <<
" is initially holding "
311 }
catch (cyclus::Error& e) {
312 e.msg(Agent::InformErrorMsg(e.msg()));
316 LOG(cyclus::LEV_INFO5,
"ComCnv") << prototype() <<
" added " << mat->quantity()
318 <<
" to its inventory, which is holding "
326 LOG(cyclus::LEV_INFO5,
"ComCnv") << prototype()
331 return cyclus::Material::CreateUntracked(qty,
332 context()->GetRecipe(in_recipe));
337 cyclus::CommodMap<cyclus::Material>::type& commod_requests,
339 cyclus::toolkit::ResourceBuff* buffer) {
341 using cyclus::BidPortfolio;
342 using cyclus::CapacityConstraint;
343 using cyclus::Composition;
344 using cyclus::Converter;
345 using cyclus::Material;
346 using cyclus::Request;
347 using cyclus::ResCast;
348 using cyclus::toolkit::ResourceBuff;
350 BidPortfolio<Material>::Ptr port(
new BidPortfolio<Material>());
352 if (commod_requests.count(commod) > 0 && buffer->quantity() > 0) {
353 std::vector<Request<Material>*>& requests = commod_requests.at(commod);
356 Material::Ptr back = ResCast<Material>(buffer->Pop(ResourceBuff::BACK));
357 Composition::Ptr comp = back->comp();
360 std::vector<Request<Material>*>::iterator it;
361 for (it = requests.begin(); it != requests.end(); ++it) {
362 Request<Material>* req = *it;
363 double qty = std::min(req->target()->quantity(), buffer->quantity());
364 Material::Ptr offer = Material::CreateUntracked(qty, comp);
365 port->AddBid(req, offer,
this);
378 cyclus::toolkit::ResourceBuff* buffer) {
379 using cyclus::Material;
380 using cyclus::ResCast;
382 std::vector<Material::Ptr> manifest;
385 manifest = ResCast<Material>(buffer->PopQty(qty));
386 }
catch(cyclus::Error& e) {
387 e.msg(Agent::InformErrorMsg(e.msg()));
391 Material::Ptr response = manifest[0];
392 crctx_.RemoveRsrc(response);
393 for (
int i = 1; i < manifest.size(); i++) {
394 crctx_.RemoveRsrc(manifest[i]);
395 response->Absorb(manifest[i]);
402 LOG(cyclus::LEV_DEBUG2,
"ComCnv") <<
"CommodConverter " << prototype()
403 <<
" added resources to processing";
407 }
catch (cyclus::Error& e) {
408 e.msg(Agent::InformErrorMsg(e.msg()));
416 using cyclus::Material;
417 using cyclus::ResCast;
418 LOG(cyclus::LEV_DEBUG2,
"ComCnv") <<
"CommodConverter " << prototype()
419 <<
" removed a resource from processing.";
424 Material::Ptr mat = ResCast<Material>(
processing.find(
ready())->second.Pop());
427 mat->Transmute(context()->GetRecipe(
out_recipe));
433 }
catch (cyclus::Error& e) {
434 e.msg(Agent::InformErrorMsg(e.msg()));
double current_capacity() const
current maximum amount that can be added to processing
cyclus::BidPortfolio< cyclus::Material >::Ptr GetBids_(cyclus::CommodMap< cyclus::Material >::type &commod_requests, std::string commod, cyclus::toolkit::ResourceBuff *buffer)
gathers information about bids
virtual void Snapshot(cyclus::DbInit di)
virtual void InfileToDb(cyclus::InfileTree *tree, cyclus::DbInit di)
virtual void InitFrom(commodconverter::CommodConverter *m)
The Prime Directive Generates code that handles all input file reading and restart operations (e...
cyclus::toolkit::ResourceBuff inventory
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 of out_commod and out_recipe
virtual std::string schema()
int process_time_() const
cyclus::toolkit::CommodityRecipeContext crctx_
cyclus::Material::Ptr TradeResponse_(double qty, cyclus::toolkit::ResourceBuff *buffer)
suggests, based on the buffer, a material response to an offer
std::string out_commod_() const
virtual std::set< cyclus::RequestPortfolio< cyclus::Material >::Ptr > GetMatlRequests()
The CommodConverter request Materials of its given commodity.
cyclus::Agent * ConstructCommodConverter(cyclus::Context *ctx)
void Convert_()
Convert one ready resource in processing.
virtual void AcceptMatlTrades(const std::vector< std::pair< cyclus::Trade< cyclus::Material >, cyclus::Material::Ptr > > &responses)
The CommodConverter place accepted trade Materials in their Inventory.
virtual std::set< cyclus::BidPortfolio< cyclus::Material >::Ptr > GetMatlBids(cyclus::CommodMap< cyclus::Material >::type &commod_requests)
Responds to each request for this facility's commodity.
virtual cyclus::Agent * Clone()
void BeginProcessing_()
Move all unprocessed inventory to processing.
virtual std::string str()
A verbose printer for the CommodConverter.
virtual void Tock()
The handleTick function specific to the CommodConverter.
void AddMat_(cyclus::Material::Ptr mat)
adds a material into the incoming commodity inventory
int ready()
returns the time key for ready materials
virtual void InitInv(cyclus::Inventories &inv)
cyclus::Material::Ptr Request_()
generates a request for this facility given its current state.
CommodConverter(cyclus::Context *ctx)
Constructor for CommodConverter Class.
std::string in_commod_() const
cyclus::toolkit::ResourceBuff stocks
This Facility is intended to convert a resource from one commodity to another.
virtual Json::Value annotations()
virtual void Tick()
The handleTick function specific to the CommodConverter.
std::map< int, cyclus::toolkit::ResourceBuff > processing
map from ready time to resource buffers
virtual cyclus::Inventories SnapshotInv()
virtual void EnterNotify()