3 using cyclus::Material;
4 using cyclus::Composition;
5 using cyclus::toolkit::ResBuf;
6 using cyclus::toolkit::MatVec;
7 using cyclus::KeyError;
8 using cyclus::ValueError;
14 : cyclus::Facility(ctx),
31 #pragma cyclus def clone cycamore::Reactor 33 #pragma cyclus def schema cycamore::Reactor 35 #pragma cyclus def annotations cycamore::Reactor 37 #pragma cyclus def infiletodb cycamore::Reactor 39 #pragma cyclus def snapshot cycamore::Reactor 41 #pragma cyclus def snapshotinv cycamore::Reactor 43 #pragma cyclus def initinv cycamore::Reactor 46 #pragma cyclus impl initfromcopy cycamore::Reactor 47 cyclus::toolkit::CommodityProducer::Copy(m);
51 #pragma cyclus impl initfromdb cycamore::Reactor 53 namespace tk = cyclus::toolkit;
54 tk::CommodityProducer::Add(tk::Commodity(
power_name),
65 cyclus::Facility::EnterNotify();
84 ss <<
"prototype '" << prototype() <<
"' has " 86 <<
" recipe_change_commods vals, expected " << n <<
"\n";
90 <<
" recipe_change_in vals, expected " << n <<
"\n";
94 <<
" recipe_change_out vals, expected " << n <<
"\n";
100 <<
" pref_change_commods vals, expected " << n <<
"\n";
104 <<
" pref_change_values vals, expected " << n <<
"\n";
107 if (ss.str().size() > 0) {
108 throw cyclus::ValueError(ss.str());
114 return core.count() == 0 &&
spent.count() == 0;
128 if (context()->time() == exit_time() + 1) {
136 while (
core.count() > 0) {
165 int t = context()->time();
202 using cyclus::RequestPortfolio;
204 std::set<RequestPortfolio<Material>::Ptr> ports;
211 if (exit_time() != -1) {
214 int t_left = exit_time() - context()->time() + 1;
216 double n_cycles_left =
static_cast<double>(t_left - t_left_cycle) /
218 n_cycles_left = ceil(n_cycles_left);
220 n_assem_order = std::min(n_assem_order, n_need);
223 if (n_assem_order == 0) {
229 for (
int i = 0; i < n_assem_order; i++) {
230 RequestPortfolio<Material>::Ptr port(
new RequestPortfolio<Material>());
231 std::vector<Request<Material>*> mreqs;
235 Composition::Ptr recipe = context()->GetRecipe(
fuel_inrecipes[j]);
236 m = Material::CreateUntracked(
assem_size, recipe);
238 Request<Material>* r = port->AddRequest(m,
this, commod, pref,
true);
242 std::vector<double>::iterator result;
244 int max_index = std::distance(
fuel_prefs.begin(), result);
246 cyclus::toolkit::RecordTimeSeries<double>(
"demand"+
fuel_incommods[max_index],
this,
249 port->AddMutualReqs(mreqs);
257 const std::vector<cyclus::Trade<Material> >& trades,
258 std::vector<std::pair<cyclus::Trade<Material>, Material::Ptr> >&
262 std::map<std::string, MatVec> mats =
PopSpent();
263 for (
int i = 0; i < trades.size(); i++) {
264 std::string commod = trades[i].request->commodity();
265 Material::Ptr m = mats[commod].back();
266 mats[commod].pop_back();
267 responses.push_back(std::make_pair(trades[i], m));
274 std::pair<cyclus::Trade<Material>, Material::Ptr> >& responses) {
275 std::vector<std::pair<cyclus::Trade<cyclus::Material>,
276 cyclus::Material::Ptr> >::const_iterator trade;
278 std::stringstream ss;
281 ss << nload <<
" assemblies";
285 for (trade = responses.begin(); trade != responses.end(); ++trade) {
286 std::string commod = trade->first.request->commodity();
287 Material::Ptr m = trade->second;
299 cyclus::CommodMap<Material>::type& commod_requests) {
300 using cyclus::BidPortfolio;
301 std::set<BidPortfolio<Material>::Ptr> ports;
303 bool gotmats =
false;
304 std::map<std::string, MatVec> all_mats;
312 std::set<std::string>::iterator it;
315 std::vector<Request<Material>*>& reqs = commod_requests[commod];
316 if (reqs.size() == 0) {
318 }
else if (!gotmats) {
322 MatVec mats = all_mats[commod];
323 if (mats.size() == 0) {
327 BidPortfolio<Material>::Ptr port(
new BidPortfolio<Material>());
329 for (
int j = 0; j < reqs.size(); j++) {
330 Request<Material>* req = reqs[j];
332 for (
int k = 0; k < mats.size(); k++) {
333 Material::Ptr m = mats[k];
334 tot_bid += m->quantity();
335 port->AddBid(req, m,
this,
true);
336 if (tot_bid >= req->target()->quantity()) {
343 for (
int j = 0; j < mats.size(); j++) {
344 tot_qty += mats[j]->quantity();
347 cyclus::CapacityConstraint<Material> cc(tot_qty);
348 port->AddConstraint(cc);
369 Record(
"CYCLE_START",
"");
372 if (cycle_step >= 0 && cycle_step <
cycle_time &&
374 cyclus::toolkit::RecordTimeSeries<cyclus::toolkit::POWER>(
this,
power_cap);
375 cyclus::toolkit::RecordTimeSeries<double>(
"supplyPOWER",
this,
power_cap);
378 cyclus::toolkit::RecordTimeSeries<cyclus::toolkit::POWER>(
this, 0);
379 cyclus::toolkit::RecordTimeSeries<double>(
"supplyPOWER",
this, 0);
393 MatVec old =
core.PopN(std::min(n_assem,
core.count()));
395 if (
core.count() > old.size()) {
400 std::stringstream ss;
401 ss << old.size() <<
" assemblies";
402 Record(
"TRANSMUTE", ss.str());
404 for (
int i = 0; i < old.size(); i++) {
410 std::map<std::string, MatVec> mapped;
413 for (
int i = 0; i < mats.size(); i++) {
415 mapped[commod].push_back(mats[i]);
423 Record(
"DISCHARGE",
"failed");
427 std::stringstream ss;
428 ss << npop <<
" assemblies";
429 Record(
"DISCHARGE", ss.str());
432 std::map<std::string, MatVec> spent_mats;
436 double tot_spent = 0;
437 for (
int j = 0; j<mats.size(); j++){
438 Material::Ptr m = mats[j];
439 tot_spent += m->quantity();
441 cyclus::toolkit::RecordTimeSeries<double>(
"supply"+fuel_outcommods[i],
this, tot_spent);
453 std::stringstream ss;
454 ss << n <<
" assemblies";
461 if (i >= fuel_incommods.size()) {
462 throw KeyError(
"cycamore::Reactor - no incommod for material object");
464 return fuel_incommods[i];
469 if (i >= fuel_outcommods.size()) {
470 throw KeyError(
"cycamore::Reactor - no outcommod for material object");
472 return fuel_outcommods[i];
478 throw KeyError(
"cycamore::Reactor - no inrecipe for material object");
486 throw KeyError(
"cycamore::Reactor - no outrecipe for material object");
500 for (
int i = 0; i < fuel_incommods.size(); i++) {
501 if (fuel_incommods[i] == incommod) {
507 "cycamore::Reactor - received unsupported incommod material");
512 std::map<std::string, MatVec> mapped;
513 for (
int i = 0; i < mats.size(); i++) {
515 mapped[commod].push_back(mats[i]);
519 std::map<std::string, MatVec>::iterator it;
520 for (it = mapped.begin(); it != mapped.end(); ++it) {
521 std::reverse(it->second.begin(), it->second.end());
528 std::map<std::string, MatVec>::iterator it;
529 for (it = leftover.begin(); it != leftover.end(); ++it) {
531 std::reverse(it->second.begin(), it->second.end());
532 spent.Push(it->second);
548 ->NewDatum(
"ReactorSideProducts")
549 ->AddVal(
"AgentId",
id())
550 ->AddVal(
"Time", context()->time())
552 ->AddVal(
"Value", value)
560 ->NewDatum(
"ReactorEvents")
561 ->AddVal(
"AgentId",
id())
562 ->AddVal(
"Time", context()->time())
563 ->AddVal(
"Event", name)
564 ->AddVal(
"Value", val)
571 ->NewDatum(
"AgentPosition")
572 ->AddVal(
"Spec", specification)
573 ->AddVal(
"Prototype", this->prototype())
574 ->AddVal(
"AgentId",
id())
std::set< std::string > uniq_outcommods_
double fuel_pref(cyclus::Material::Ptr m)
std::map< std::string, cyclus::toolkit::MatVec > PeekSpent()
Returns all spent assemblies indexed by outcommod without removing them from the spent fuel buffer...
std::vector< std::string > recipe_change_out
std::map< std::string, cyclus::toolkit::MatVec > PopSpent()
Returns all spent assemblies indexed by outcommod - removing them from the spent fuel buffer...
std::string fuel_outrecipe(cyclus::Material::Ptr m)
std::vector< std::string > fuel_outrecipes
void Transmute()
Transmute the batch that is about to be discharged from the core to its fully burnt state as defined ...
std::vector< std::string > recipe_change_in
std::vector< double > pref_change_values
Reactor(cyclus::Context *ctx)
cyclus::Agent * ConstructReactor(cyclus::Context *ctx)
virtual void EnterNotify()
std::vector< std::string > side_products
void Load()
Top up core inventory as much as possible.
bool Discharge()
Discharge a batch from the core if there is room in the spent fuel inventory.
std::vector< std::string > fuel_incommods
std::map< int, int > res_indexes
void PushSpent(std::map< std::string, cyclus::toolkit::MatVec > leftover)
Complement of PopSpent - must be called with all materials passed that were not traded away to other ...
std::vector< std::string > fuel_inrecipes
std::vector< int > recipe_change_times
cycamore::GrowthRegion string
std::vector< double > fuel_prefs
cyclus::toolkit::ResBuf< cyclus::Material > fresh
virtual std::set< cyclus::RequestPortfolio< cyclus::Material >::Ptr > GetMatlRequests()
virtual bool CheckDecommissionCondition()
std::vector< double > side_product_quantity
virtual std::set< cyclus::BidPortfolio< cyclus::Material >::Ptr > GetMatlBids(cyclus::CommodMap< cyclus::Material >::type &commod_requests)
std::string fuel_inrecipe(cyclus::Material::Ptr m)
virtual void GetMatlTrades(const std::vector< cyclus::Trade< cyclus::Material > > &trades, std::vector< std::pair< cyclus::Trade< cyclus::Material >, cyclus::Material::Ptr > > &responses)
cyclus::toolkit::ResBuf< cyclus::Material > core
cyclus::toolkit::Position coordinates
std::vector< std::string > pref_change_commods
cyclus::toolkit::ResBuf< cyclus::Material > spent
std::string fuel_outcommod(cyclus::Material::Ptr m)
std::vector< int > pref_change_times
void Record(std::string name, std::string val)
Records a reactor event to the output db with the given name and note val.
virtual void AcceptMatlTrades(const std::vector< std::pair< cyclus::Trade< cyclus::Material >, cyclus::Material::Ptr > > &responses)
std::vector< std::string > recipe_change_commods
std::string fuel_incommod(cyclus::Material::Ptr m)
void index_res(cyclus::Resource::Ptr m, std::string incommod)
Store fuel info index for the given resource received on incommod.
std::vector< std::string > fuel_outcommods
void RecordPosition()
Records an agent's latitude and longitude to the output db.
virtual void InitFrom(cycamore::Reactor *m)
void RecordSideProduct(bool produce)
Records production of side products from the reactor.