198 const Array<Scalar>& time_vec
199 ,
const Array<RCP<
const Thyra::VectorBase<Scalar> > >& x_vec
200 ,
const Array<RCP<
const Thyra::VectorBase<Scalar> > >& xdot_vec
203#ifdef HAVE_RYTHMOS_DEBUG
205 assertTimePointsAreSorted(time_vec);
206 int tsize = Teuchos::as<int>(time_vec.size());
207 TEUCHOS_TEST_FOR_EXCEPTION(
208 tsize == 0, std::logic_error,
209 "Error, time_vec is empty!"
211 TEUCHOS_TEST_FOR_EXCEPTION(
212 Teuchos::as<int>(x_vec.size()) != tsize, std::logic_error,
213 "Error, size of x_vec = " << x_vec.size() <<
" != " << tsize <<
" = size of time_vec!\n"
215 TEUCHOS_TEST_FOR_EXCEPTION(
216 Teuchos::as<int>(xdot_vec.size()) != tsize, std::logic_error,
217 "Error, size of xdot_vec = " << x_vec.size() <<
" != " << tsize <<
" = size of time_vec!\n"
219 for (
int i=0; i<tsize ; ++i) {
220 TEUCHOS_TEST_FOR_EXCEPTION(
221 x_vec[i] == Teuchos::null, std::logic_error,
222 "Error, x_vec[" << i <<
"] == null!\n"
229 assertNoTimePointsInsideCurrentTimeRange(*
this,time_vec);
231 RCP<Teuchos::FancyOStream> out = this->getOStream();
232 Teuchos::OSTab ostab(out,1,
"IB::addPoints");
233 if ( Teuchos::as<int>(this->getVerbLevel()) >= Teuchos::as<int>(Teuchos::VERB_HIGH) ) {
234 *out <<
"time_vec = " << std::endl;
235 for (Teuchos::Ordinal i=0 ; i<time_vec.size() ; ++i) {
236 *out <<
"time_vec[" << i <<
"] = " << time_vec[i] << std::endl;
238 *out <<
"x_vec = " << std::endl;
239 for (Teuchos::Ordinal i=0 ; i<x_vec.size() ; ++i) {
240 *out <<
"x_vec[" << i <<
"] = " << std::endl;
241 x_vec[i]->describe(*out,Teuchos::VERB_EXTREME);
243 *out <<
"xdot_vec = " << std::endl;
244 for (Teuchos::Ordinal i=0 ; i<xdot_vec.size() ; ++i) {
245 if (!is_null(xdot_vec[i])) {
246 *out <<
"xdot_vec[" << i <<
"] = " << std::endl;
247 xdot_vec[i]->describe(*out,Teuchos::VERB_EXTREME);
251 typename DataStore<Scalar>::DataStoreList_t input_data_list;
252 vectorToDataStoreList<Scalar>(time_vec,x_vec,xdot_vec,&input_data_list);
254 if (Teuchos::as<int>(data_vec_->size()+input_data_list.size()) > storage_limit_) {
255 if (policy_ == BUFFER_POLICY_STATIC) {
256 TEUCHOS_TEST_FOR_EXCEPTION(
257 true, std::logic_error,
258 "Error, buffer would be over-full and buffer policy is BUFFER_POLICY_STATIC, these points can not be added\n"
260 }
else if (policy_ == BUFFER_POLICY_KEEP_NEWEST) {
261 if (input_data_list.front() > data_vec_->back()) {
264 int num_extra_points = input_data_list.size()-(storage_limit_-data_vec_->size());
265#ifdef HAVE_RYTHMOS_DEBUG
266 TEUCHOS_TEST_FOR_EXCEPTION( num_extra_points <= 0, std::logic_error,
267 "Error! Buffer policy is keep newest and input data size = " << input_data_list.size() <<
", storage limit = " << storage_limit_ <<
", and data_vec size = " << data_vec_->size() <<
". Somehow number of points to delete = " << num_extra_points <<
" <= 0!"
270 typename DataStore<Scalar>::DataStoreVector_t::iterator
271 data_it = data_vec_->begin();
272 for (
int i=0 ; i < num_extra_points ; ++i) {
275 if ( Teuchos::as<int>(this->getVerbLevel()) >= Teuchos::as<int>(Teuchos::VERB_HIGH) ) {
276 *out <<
"Removing " << num_extra_points
277 <<
" from beginning of data_vec to make room for new points." << std::endl;
279 data_vec_->erase(data_vec_->begin(),data_it);
280 }
else if (input_data_list.back() < data_vec_->front()) {
283 int num_extra_points = input_data_list.size()-(storage_limit_-data_vec_->size());
284#ifdef HAVE_RYTHMOS_DEBUG
285 TEUCHOS_TEST_FOR_EXCEPTION( num_extra_points <= 0, std::logic_error,
286 "Error! Buffer policy is keep newest and input data size = " << input_data_list.size() <<
", storage limit = " << storage_limit_ <<
", and data_vec size = " << data_vec_->size() <<
". Somehow number of points to delete = " << num_extra_points <<
" <= 0!"
289 typename DataStore<Scalar>::DataStoreVector_t::iterator
290 data_it = data_vec_->end();
291 for (
int i=0 ; i < num_extra_points ; ++i) {
294 if ( Teuchos::as<int>(this->getVerbLevel()) >= Teuchos::as<int>(Teuchos::VERB_HIGH) ) {
295 *out <<
"Removing " << num_extra_points
296 <<
" from end of data_vec to make room for new points." << std::endl;
298 data_vec_->erase(data_it,data_vec_->end());
301 TEUCHOS_TEST_FOR_EXCEPTION(
302 true, std::logic_error,
303 "Error, incoming points are on both sides of TimeRange, I don't know which points are newest in this case.\n"
308 TEUCHOS_TEST_FOR_EXCEPTION(
309 true, std::logic_error,
310 "Error, unknown buffer policy.\n"
315 std::list<DataStore<Scalar> > internal_input_data_list;
316 typename DataStore<Scalar>::DataStoreList_t::iterator it_list;
317 for (it_list = input_data_list.begin() ; it_list != input_data_list.end() ; it_list++) {
318 RCP<DataStore<Scalar> > ds_clone = it_list->clone();
319 internal_input_data_list.push_back(*ds_clone);
322 data_vec_->insert(data_vec_->end(),internal_input_data_list.begin(),internal_input_data_list.end());
324 std::sort(data_vec_->begin(),data_vec_->end());
325 if ( Teuchos::as<int>(this->getVerbLevel()) >= Teuchos::as<int>(Teuchos::VERB_HIGH) ) {
326 *out <<
"data_vec at end of addPoints:" << std::endl;
327 for (Teuchos::Ordinal i=0 ; i<data_vec_->size() ; ++i) {
328 *out <<
"data_vec[" << i <<
"] = " << std::endl;
329 (*data_vec_)[i].describe(*out,Teuchos::VERB_EXTREME);
337 const Array<Scalar>& time_vec
338 ,Array<RCP<
const Thyra::VectorBase<Scalar> > >* x_vec
339 ,Array<RCP<
const Thyra::VectorBase<Scalar> > >* xdot_vec
340 ,Array<ScalarMag>* accuracy_vec
343 RCP<Teuchos::FancyOStream> out = this->getOStream();
344 Teuchos::OSTab ostab(out,1,
"IB::getPoints");
345 typename DataStore<Scalar>::DataStoreVector_t data_out;
346 interpolate<Scalar>(*interpolator_, data_vec_, time_vec, &data_out);
347 Array<Scalar> time_out_vec;
348 dataStoreVectorToVector<Scalar>(data_out, &time_out_vec, x_vec, xdot_vec, accuracy_vec);
349 TEUCHOS_TEST_FOR_EXCEPTION(
350 (time_vec.size() != time_out_vec.size()), std::logic_error,
351 "Error, number of time points returned from interpolator = " <<
352 time_out_vec.size() <<
" != " << time_vec.size() <<
353 " = number of time points requested\n"
355 if ( Teuchos::as<int>(this->getVerbLevel()) >= Teuchos::as<int>(Teuchos::VERB_HIGH) ) {
356 *out <<
"Conversion of DataStoreVector to Vector successful" << std::endl;
395 typedef Teuchos::ScalarTraits<Scalar> ST;
396 int N = time_vec.size();
397#ifdef HAVE_RYTHMOS_DEBUG
399 TimeRange<Scalar> range = this->getTimeRange();
400 for (
int i=0; i<N ; ++i) {
401 TEUCHOS_TEST_FOR_EXCEPTION(
402 (range.lower() <= time_vec[i]) && (time_vec[i] <= range.upper()),
404 "Error, time_vec[" << i <<
"] = " << time_vec[i] <<
405 "is not in range of this interpolation buffer = [" <<
406 range.lower() <<
"," << range.upper() <<
"]!\n"
410 RCP<Thyra::VectorBase<Scalar> > vec_temp;
411 ScalarMag z = ST::zero();
412 for (
int i=0; i<N ; ++i) {
413 DataStore<Scalar> ds_temp(time_vec[i],vec_temp,vec_temp,z);
414 typename DataStore<Scalar>::DataStoreVector_t::iterator
415 data_it = std::find(data_vec_->begin(),data_vec_->end(),ds_temp);
416 TEUCHOS_TEST_FOR_EXCEPTION(
417 data_it == data_vec_->end(), std::logic_error,
418 "Error, time_vec[" << i <<
"] = " << time_vec[i] <<
"is not a node in the interpolation buffer!\n"
420 data_vec_->erase(data_it);