5#include <boost/lexical_cast.hpp>
13 : cyclus::Facility(ctx),
14 capacity(std::numeric_limits<double>::max()),
15 keep_packaging(true) {
16 SetMaxInventorySize(std::numeric_limits<double>::max());}
21#pragma cyclus def schema cycamore::Sink
23#pragma cyclus def annotations cycamore::Sink
25#pragma cyclus def infiletodb cycamore::Sink
27#pragma cyclus def snapshot cycamore::Sink
29#pragma cyclus def snapshotinv cycamore::Sink
31#pragma cyclus def initinv cycamore::Sink
33#pragma cyclus def clone cycamore::Sink
35#pragma cyclus def initfromdb cycamore::Sink
37#pragma cyclus def initfromcopy cycamore::Sink
40void Sink::EnterNotify() {
41 cyclus::Facility::EnterNotify();
42 LOG(cyclus::LEV_INFO4,
"SnkFac") <<
" using random behavior " << random_size_type;
44 inventory.keep_packaging(keep_packaging);
46 if (in_commod_prefs.size() == 0) {
47 for (
int i = 0; i < in_commods.size(); ++i) {
48 in_commod_prefs.push_back(cyclus::kDefaultPref);
50 }
else if (in_commod_prefs.size() != in_commods.size()) {
52 ss <<
"in_commod_prefs has " << in_commod_prefs.size()
53 <<
" values, expected " << in_commods.size();
54 throw cyclus::ValueError(ss.str());
61 if (random_size_type !=
"None") {
62 LOG(cyclus::LEV_INFO4,
"SnkFac") <<
"Sink " << this->id()
63 <<
" is using random behavior "
65 <<
" for determining request size.";
67 if (random_frequency_type !=
"None") {
68 LOG(cyclus::LEV_INFO4,
"SnkFac") <<
"Sink " << this->id()
69 <<
" is using random behavior "
70 << random_frequency_type
71 <<
" for determining request frequency.";
78std::string Sink::str() {
82 ss << cyclus::Facility::str();
85 msg +=
"accepts commodities ";
86 for (vector<string>::iterator commod = in_commods.begin();
87 commod != in_commods.end();
89 msg += (commod == in_commods.begin() ?
"{" :
", ");
92 msg +=
"} until its inventory is full at ";
93 ss << msg << inventory.capacity() <<
" kg.";
98std::set<cyclus::RequestPortfolio<cyclus::Material>::Ptr>
99Sink::GetMatlRequests() {
100 using cyclus::Material;
101 using cyclus::RequestPortfolio;
102 using cyclus::Request;
103 using cyclus::Composition;
105 std::set<RequestPortfolio<Material>::Ptr> ports;
106 RequestPortfolio<Material>::Ptr port(
new RequestPortfolio<Material>());
110 if (requestAmt > SpaceAvailable()) {
114 if (recipe_name.empty()) {
115 mat = cyclus::NewBlankMaterial(requestAmt);
117 Composition::Ptr rec = this->context()->GetRecipe(recipe_name);
118 mat = cyclus::Material::CreateUntracked(requestAmt, rec);
121 if (requestAmt > cyclus::eps()) {
122 std::vector<Request<Material>*> mutuals;
123 for (
int i = 0; i < in_commods.size(); i++) {
124 mutuals.push_back(port->AddRequest(mat,
this, in_commods[i], in_commod_prefs[i]));
127 port->AddMutualReqs(mutuals);
134std::set<cyclus::RequestPortfolio<cyclus::Product>::Ptr>
135Sink::GetGenRsrcRequests() {
136 using cyclus::CapacityConstraint;
137 using cyclus::Product;
138 using cyclus::RequestPortfolio;
140 std::set<RequestPortfolio<Product>::Ptr> ports;
141 RequestPortfolio<Product>::Ptr
142 port(
new RequestPortfolio<Product>());
144 if (requestAmt > cyclus::eps()) {
145 CapacityConstraint<Product> cc(requestAmt);
146 port->AddConstraint(cc);
148 std::vector<std::string>::const_iterator it;
149 for (it = in_commods.begin(); it != in_commods.end(); ++it) {
150 std::string quality =
"";
151 Product::Ptr rsrc = Product::CreateUntracked(requestAmt, quality);
152 port->AddRequest(rsrc,
this, *it);
161void Sink::AcceptMatlTrades(
162 const std::vector< std::pair<cyclus::Trade<cyclus::Material>,
163 cyclus::Material::Ptr> >& responses) {
164 std::vector< std::pair<cyclus::Trade<cyclus::Material>,
165 cyclus::Material::Ptr> >::const_iterator it;
166 for (it = responses.begin(); it != responses.end(); ++it) {
167 inventory.Push(it->second);
172void Sink::AcceptGenRsrcTrades(
173 const std::vector< std::pair<cyclus::Trade<cyclus::Product>,
174 cyclus::Product::Ptr> >& responses) {
175 std::vector< std::pair<cyclus::Trade<cyclus::Product>,
176 cyclus::Product::Ptr> >::const_iterator it;
177 for (it = responses.begin(); it != responses.end(); ++it) {
178 inventory.Push(it->second);
186 LOG(cyclus::LEV_INFO3,
"SnkFac") <<
"Sink " << this->id() <<
" is ticking {";
188 if (nextBuyTime == -1) {
191 else if (nextBuyTime == context()->time()) {
195 LOG(cyclus::LEV_INFO4,
"SnkFac") <<
"Sink " << this->id()
196 <<
" has reached buying time. The next buy time will be time step " << nextBuyTime;
203 if (requestAmt > cyclus::eps()) {
204 LOG(cyclus::LEV_INFO4,
"SnkFac") <<
"Sink " << this->id()
205 <<
" has request amount " << requestAmt
206 <<
" kg of " << in_commods[0] <<
".";
207 for (vector<string>::iterator commod = in_commods.begin();
208 commod != in_commods.end();
210 LOG(cyclus::LEV_INFO4,
"SnkFac") <<
"Sink " << this->id()
211 <<
" will request " << requestAmt
212 <<
" kg of " << *commod <<
".";
213 cyclus::toolkit::RecordTimeSeries<double>(
"demand"+*commod,
this,
217 LOG(cyclus::LEV_INFO3,
"SnkFac") <<
"}";
222 LOG(cyclus::LEV_INFO3,
"SnkFac") << prototype() <<
" is tocking {";
227 LOG(cyclus::LEV_INFO4,
"SnkFac") <<
"Sink " << this->id()
228 <<
" is holding " << inventory.quantity()
229 <<
" units of material at the close of timestep "
230 << context()->time() <<
".";
231 LOG(cyclus::LEV_INFO3,
"SnkFac") <<
"}";
234void Sink::SetRequestAmt() {
235 double amt = SpaceAvailable();
236 if (amt < cyclus::eps()) {
240 if (random_size_type ==
"None") {
243 else if (random_size_type ==
"UniformReal") {
244 requestAmt = context()->random_uniform_real(0, amt);
246 else if (random_size_type ==
"NormalReal") {
247 requestAmt = context()->random_normal_real(amt * random_size_mean,
248 amt * random_size_stddev,
257void Sink::SetNextBuyTime() {
258 if (random_frequency_type ==
"None") {
261 else if (random_frequency_type ==
"UniformInt") {
262 nextBuyTime = context()->time() + context()->random_uniform_int(random_frequency_min, random_frequency_max);
264 else if (random_frequency_type ==
"NormalInt") {
265 nextBuyTime = context()->time() + context()->random_normal_int(random_frequency_mean, random_frequency_stddev, random_frequency_min, random_frequency_max);
274extern "C" cyclus::Agent*
ConstructSink(cyclus::Context* ctx) {
275 return new Sink(ctx);
Sink(cyclus::Context *ctx)
cyclus::Agent * ConstructSink(cyclus::Context *ctx)