9 #ifndef Tempus_TimeEventRangeIndex_impl_hpp
10 #define Tempus_TimeEventRangeIndex_impl_hpp
14 template <
class Scalar>
16 : start_(0), stop_(0), stride_(1), numEvents_(1)
19 std::ostringstream oss;
26 template <
class Scalar>
28 int stride, std::string name)
29 : start_(0), stop_(0), stride_(1), numEvents_(1)
33 std::ostringstream oss;
34 oss <<
"TimeEventRangeIndex (" << start <<
"; " << stop <<
"; " << stride
45 template <
class Scalar>
55 template <
class Scalar>
66 template <
class Scalar>
73 else if (stride_ > (stop_ - start_)) {
74 stride_ = stop_ - start_;
79 template <
class Scalar>
82 if (stride_ == 0 || start_ == stop_)
85 numEvents_ = int((stop_ - start_) / stride_) + 1;
88 template <
class Scalar>
91 const int indexOfLast = start_ + (numEvents_ - 1) * stride_;
92 if (index < start_ || index > indexOfLast)
return false;
93 if ((index - start_) % stride_ == 0)
return true;
98 template <
class Scalar>
101 return indexOfNextEvent(index) - index;
104 template <
class Scalar>
108 if (index < start_)
return start_;
110 const int indexOfLast = start_ + (numEvents_ - 1) * stride_;
112 if (index >= indexOfLast)
return this->getDefaultIndex();
115 if (isIndex(index))
return index + stride_;
117 const int numStrides = (index - start_) / stride_ + 1;
118 const Scalar indexOfNext = start_ + numStrides * stride_;
122 template <
class Scalar>
126 if (index1 > index2) {
133 const Scalar indexOfLast = start_ + (numEvents_ - 1) * stride_;
134 if (index2 < start_ || indexOfLast < index1)
return false;
136 const int strideJustBeforeIndex1 = std::min(
137 int(numEvents_ - 1), std::max(
int(0),
int((index1 - start_) / stride_)));
139 const int strideJustAfterIndex2 = std::max(
140 int(0), std::min(
int(numEvents_ - 1),
int((index2 - start_) / stride_)));
142 for (
int i = strideJustBeforeIndex1; i <= strideJustAfterIndex2; i++) {
143 const int indexEvent = start_ + i * stride_;
144 if (index1 < indexEvent && indexEvent <= index2)
return true;
150 template <
class Scalar>
154 auto l_out = Teuchos::fancyOStream(out.
getOStream());
156 l_out->setOutputToRootOnly(0);
158 *l_out <<
"TimeEventRangeIndex:"
160 <<
" name = " << this->getName() <<
"\n"
161 <<
" Type = " << this->getType() <<
"\n"
162 <<
" start_ = " << start_ <<
"\n"
163 <<
" stop_ = " << stop_ <<
"\n"
164 <<
" stride_ = " << stride_ <<
"\n"
165 <<
" numEvents_ = " << numEvents_ << std::endl;
168 template <
class Scalar>
173 Teuchos::parameterList(
"Time Event Range Index");
176 pl->
set(
"Name", this->getName());
177 pl->
set(
"Type",
"Range Index");
179 pl->
set(
"Start Index", getIndexStart(),
"Start of Index range");
180 pl->
set(
"Stop Index", getIndexStop(),
"Stop of Index range");
181 pl->
set(
"Stride Index", getIndexStride(),
"Stride of Index range");
189 template <
class Scalar>
194 if (pl == Teuchos::null)
return teri;
197 pl->
get<std::string>(
"Type",
"Range Index") !=
"Range Index",
199 "Error - Time Event Type != 'Range Index'. (='" +
200 pl->
get<std::string>(
"Type") +
"')\n");
204 teri->setName(pl->
get(
"Name",
"From createTimeEventRangeIndex"));
205 teri->setIndexStart(pl->
get(
"Start Index", teri->getIndexStart()));
206 teri->setIndexStop(pl->
get(
"Stop Index", teri->getIndexStop()));
207 teri->setIndexStride(pl->
get(
"Stride Index", teri->getIndexStride()));
213 #endif // Tempus_TimeEventRangeIndex_impl_hpp
virtual void setIndexStart(int start)
Set the start of the index range.
TimeEventRangeIndex specifies a start, stop and stride index.
virtual void setType(std::string s)
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel) const
Describe member data.
virtual void setName(std::string name)
Set the name of the TimeEvent.
T & get(const std::string &name, T def_value)
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
int start_
Start of index range.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
int stride_
Stride of index range.
virtual int indexToNextEvent(int index) const
How many indices until the next event.
void validateParametersAndSetDefaults(ParameterList const &validParamList, int const depth=1000)
virtual void setIndexStride(int stride)
Set the stride of the index range.
virtual void setNumEvents()
Set the number of events from start_, stop_ and stride_.
virtual void setIndexStop(int stop)
Set the stop of the index range.
int stop_
Stop of index range.
RCP< std::basic_ostream< char_type, traits_type > > getOStream()
TimeEventRangeIndex()
Default constructor.
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
Return a valid ParameterList with current settings.
ParameterList & setName(const std::string &name)
virtual bool eventInRangeIndex(int index1, int index2) const
Test if an event occurs within the index range.
virtual int indexOfNextEvent(int index) const
Return the index of the next event following the input index.
virtual bool isIndex(int index) const
Test if index is a time event.
Teuchos::RCP< TimeEventRangeIndex< Scalar > > createTimeEventRangeIndex(Teuchos::RCP< Teuchos::ParameterList > pList)
Nonmember Constructor via ParameterList.
virtual void setIndexRange(int start, int stop, int stride)
Set the range of event indices.