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;
10 using cyclus::CompMap;
15 : cyclus::Facility(ctx),
21 cyclus::Inventories invs;
27 leftover.Push(invs[
"leftover-inv-name"]);
28 invs[
"feed-inv-name"] =
feed.PopNRes(
feed.count());
29 feed.Push(invs[
"feed-inv-name"]);
31 std::map<std::string, ResBuf<Material> >::iterator it;
33 invs[it->first] = it->second.PopNRes(it->second.count());
34 it->second.Push(invs[it->first]);
41 leftover.Push(inv[
"leftover-inv-name"]);
42 feed.Push(inv[
"feed-inv-name"]);
44 cyclus::Inventories::iterator it;
45 for (it = inv.begin(); it != inv.end(); ++it) {
50 typedef std::pair<double, std::map<int, double> >
Stream;
51 typedef std::map<std::string, Stream>
StreamSet;
54 cyclus::Facility::EnterNotify();
55 std::map<int, double> efficiency_;
57 StreamSet::iterator it;
58 std::map<int, double>::iterator it2;
62 Stream stream = it->second;
63 double cap = stream.first;
68 for (it2 = stream.second.begin(); it2 != stream.second.end(); it2++) {
69 efficiency_[it2->first] += it2->second;
74 std::vector<int> eff_pb_;
75 for (it2 = efficiency_.begin(); it2 != efficiency_.end(); it2++) {
76 if (it2->second > 1) {
77 eff_pb_.push_back(it2->first);
81 if (eff_pb_.size() > 0) {
83 ss <<
"In " << prototype() <<
", ";
84 ss <<
"the following nuclide(s) have a cumulative separation efficiency " 86 for (
int i = 0; i < eff_pb_.size(); i++) {
87 ss <<
"\n " << eff_pb_[i];
88 if (i < eff_pb_.size() - 1) {
95 throw cyclus::ValueError(ss.str());
106 using cyclus::toolkit::RecordTimeSeries;
107 if (
feed.count() == 0) {
111 Material::Ptr mat =
feed.Pop(pop_qty, cyclus::eps_rsrc());
112 double orig_qty = mat->quantity();
114 StreamSet::iterator it;
116 std::map<std::string, Material::Ptr> stagedsep;
117 Record(
"Separating", orig_qty,
"feed");
119 Stream info = it->second;
122 double frac =
streambufs[name].space() / stagedsep[name]->quantity();
123 if (frac < maxfrac) {
128 std::map<std::string, Material::Ptr>::iterator itf;
129 for (itf = stagedsep.begin(); itf != stagedsep.end(); ++itf) {
131 Material::Ptr m = itf->second;
132 if (m->quantity() > 0) {
133 double qty = m->quantity();
134 if (m->quantity() > mat->quantity()) {
135 qty = mat->quantity();
138 mat->ExtractComp(qty * maxfrac, m->comp()));
139 Record(
"Separated", qty * maxfrac, name);
141 cyclus::toolkit::RecordTimeSeries<double>(
"supply"+name,
this,
146 if (mat->quantity() > 0) {
153 feed.Push(mat->ExtractQty((1 - maxfrac) * orig_qty));
154 if (mat->quantity() > 0) {
159 cyclus::toolkit::RecordTimeSeries<double>(
"supply"+
leftover_commod,
this,
166 Material::Ptr
SepMaterial(std::map<int, double> effs, Material::Ptr mat) {
167 CompMap cm = mat->comp()->mass();
168 cyclus::compmath::Normalize(&cm, mat->quantity());
172 CompMap::iterator it;
173 for (it = cm.begin(); it != cm.end(); ++it) {
175 int elem = (nuc / 10000000) * 10000000;
177 if (effs.count(nuc) > 0) {
179 }
else if (effs.count(elem) > 0) {
185 double qty = it->second;
186 double sepqty = qty * eff;
187 sepcomp[nuc] = sepqty;
191 Composition::Ptr c = Composition::CreateFromMass(sepcomp);
192 return Material::CreateUntracked(tot_qty, c);
195 std::set<cyclus::RequestPortfolio<Material>::Ptr>
197 using cyclus::RequestPortfolio;
198 using cyclus::toolkit::RecordTimeSeries;
199 std::set<RequestPortfolio<Material>::Ptr> ports;
201 int t = context()->time();
202 int t_exit = exit_time();
205 std::vector<double>::iterator result;
208 cyclus::toolkit::RecordTimeSeries<double>(
"demand"+
feed_commods[maxindx],
210 if (t_exit >= 0 && (
feed.quantity() >= (t_exit - t) *
throughput)) {
212 }
else if (
feed.space() < cyclus::eps_rsrc()) {
216 bool exclusive =
false;
217 RequestPortfolio<Material>::Ptr port(
new RequestPortfolio<Material>());
219 Material::Ptr m = cyclus::NewBlankMaterial(
feed.space());
221 Composition::Ptr c = context()->GetRecipe(
feed_recipe);
222 m = Material::CreateUntracked(
feed.space(), c);
225 std::vector<cyclus::Request<Material>*> reqs;
226 for (
int i = 0; i < feed_commods.size(); i++) {
229 reqs.push_back(port->AddRequest(m,
this, commod, pref, exclusive));
231 port->AddMutualReqs(reqs);
238 const std::vector<cyclus::Trade<Material> >& trades,
239 std::vector<std::pair<cyclus::Trade<Material>, Material::Ptr> >&
243 std::vector<cyclus::Trade<cyclus::Material> >::const_iterator it;
244 for (
int i = 0; i < trades.size(); i++) {
245 std::string commod = trades[i].request->commodity();
246 if (commod == leftover_commod) {
247 double amt = std::min(
leftover.quantity(), trades[i].amt);
248 Material::Ptr m =
leftover.Pop(amt, cyclus::eps_rsrc());
249 responses.push_back(std::make_pair(trades[i], m));
251 double amt = std::min(
streambufs[commod].quantity(), trades[i].amt);
252 Material::Ptr m =
streambufs[commod].Pop(amt, cyclus::eps_rsrc());
253 responses.push_back(std::make_pair(trades[i], m));
255 throw ValueError(
"invalid commodity " + commod +
256 " on trade matched to prototype " + prototype());
262 const std::vector<std::pair<cyclus::Trade<Material>, Material::Ptr> >&
264 std::vector<std::pair<cyclus::Trade<cyclus::Material>,
265 cyclus::Material::Ptr> >::const_iterator trade;
267 for (trade = responses.begin(); trade != responses.end(); ++trade) {
268 feed.Push(trade->second);
273 cyclus::CommodMap<Material>::type& commod_requests) {
274 using cyclus::BidPortfolio;
275 bool exclusive =
false;
276 std::set<BidPortfolio<Material>::Ptr> ports;
279 std::map<std::string, ResBuf<Material> >::iterator it;
282 std::vector<Request<Material>*>& reqs = commod_requests[commod];
283 if (reqs.size() == 0) {
285 }
else if (
streambufs[commod].quantity() < cyclus::eps_rsrc()) {
292 BidPortfolio<Material>::Ptr port(
new BidPortfolio<Material>());
294 for (
int j = 0; j < reqs.size(); j++) {
295 Request<Material>* req = reqs[j];
297 for (
int k = 0; k < mats.size(); k++) {
298 Material::Ptr m = mats[k];
299 tot_bid += m->quantity();
303 if (m->quantity() > cyclus::eps_rsrc()) {
304 port->AddBid(req, m,
this, exclusive);
307 if (tot_bid >= req->target()->quantity()) {
313 double tot_qty =
streambufs[commod].quantity();
314 cyclus::CapacityConstraint<Material> cc(tot_qty);
315 port->AddConstraint(cc);
320 std::vector<Request<Material>*>& reqs = commod_requests[
leftover_commod];
321 if (reqs.size() > 0 &&
leftover.quantity() >= cyclus::eps_rsrc()) {
325 BidPortfolio<Material>::Ptr port(
new BidPortfolio<Material>());
327 for (
int j = 0; j < reqs.size(); j++) {
328 Request<Material>* req = reqs[j];
330 for (
int k = 0; k < mats.size(); k++) {
331 Material::Ptr m = mats[k];
332 tot_bid += m->quantity();
336 if (m->quantity() > cyclus::eps_rsrc()) {
337 port->AddBid(req, m,
this, exclusive);
340 if (tot_bid >= req->target()->quantity()) {
346 cyclus::CapacityConstraint<Material> cc(
leftover.quantity());
347 port->AddConstraint(cc);
361 std::map<std::string, ResBuf<Material> >::iterator it;
363 if (it->second.count() > 0) {
374 ->NewDatum(
"AgentPosition")
375 ->AddVal(
"Spec", specification)
376 ->AddVal(
"Prototype", this->prototype())
377 ->AddVal(
"AgentId",
id())
385 ->NewDatum(
"SeparationEvents")
386 ->AddVal(
"AgentId",
id())
387 ->AddVal(
"Time", context()->time())
388 ->AddVal(
"Event", name)
389 ->AddVal(
"Value", val)
390 ->AddVal(
"Type", type)
cyclus::toolkit::ResBuf< cyclus::Material > leftover
virtual bool CheckDecommissionCondition()
virtual cyclus::Inventories SnapshotInv()
void Record(std::string name, double val, std::string type)
void RecordPosition()
Records an agent's latitude and longitude to the output db.
cyclus::Agent * ConstructSeparations(cyclus::Context *ctx)
std::map< std::string, cyclus::toolkit::ResBuf< cyclus::Material > > streambufs
cycamore::GrowthRegion string
virtual void AcceptMatlTrades(const std::vector< std::pair< cyclus::Trade< cyclus::Material >, cyclus::Material::Ptr > > &responses)
virtual std::set< cyclus::RequestPortfolio< cyclus::Material >::Ptr > GetMatlRequests()
std::map< std::string, std::pair< double, std::map< int, double > > > streams_
virtual std::set< cyclus::BidPortfolio< cyclus::Material >::Ptr > GetMatlBids(cyclus::CommodMap< cyclus::Material >::type &commod_requests)
cyclus::toolkit::ResBuf< cyclus::Material > feed
virtual void EnterNotify()
std::string leftover_commod
virtual void InitInv(cyclus::Inventories &inv)
cyclus::toolkit::Position coordinates
std::pair< double, std::map< int, double > > Stream
std::vector< double > feed_commod_prefs
Separations(cyclus::Context *ctx)
std::vector< std::string > feed_commods
virtual void GetMatlTrades(const std::vector< cyclus::Trade< cyclus::Material > > &trades, std::vector< std::pair< cyclus::Trade< cyclus::Material >, cyclus::Material::Ptr > > &responses)
Material::Ptr SepMaterial(std::map< int, double > effs, Material::Ptr mat)
std::map< std::string, Stream > StreamSet