9 #ifndef TEMPUS_CONVERGENCE_TEST_UTILS_HPP
10 #define TEMPUS_CONVERGENCE_TEST_UTILS_HPP
13 #include "Teuchos_as.hpp"
23 template<
class Scalar>
28 void setData(std::vector<Scalar>& x, std::vector<Scalar>& y);
37 std::vector<Scalar>
x_;
38 std::vector<Scalar>
y_;
46 template<
class Scalar>
49 isInitialized_ =
false;
52 template<
class Scalar>
54 std::vector<Scalar>& x, std::vector<Scalar>& y)
59 isInitialized_ =
true;
63 template<
class Scalar>
65 std::vector<Scalar>& x, std::vector<Scalar>& y)
67 TEUCHOS_TEST_FOR_EXCEPTION(x.size() != y.size(), std::logic_error,
68 "x and y data are note the same size for linear regression\n");
69 TEUCHOS_TEST_FOR_EXCEPTION(x.size() < 2, std::logic_error,
70 "Not enough data points for linear regression!\n");
71 int N = Teuchos::as<int>(x.size());
75 for (
int i=1; i<N ; ++i) {
80 TEUCHOS_TEST_FOR_EXCEPT(numUnique==1);
83 template<
class Scalar>
86 TEUCHOS_TEST_FOR_EXCEPT(!isInitialized_);
90 template<
class Scalar>
93 TEUCHOS_TEST_FOR_EXCEPT(!isInitialized_);
97 template<
class Scalar>
100 TEUCHOS_TEST_FOR_EXCEPT(!isInitialized_);
101 typedef Teuchos::ScalarTraits<Scalar> ST;
103 int N = Teuchos::as<int>(x_.size());
105 Scalar sum1 = ST::zero();
106 Scalar sum2 = ST::zero();
107 for (
int i=0 ; i<N ; ++i) {
111 sum1 *= Scalar(-2*ST::one());
112 sum2 *= Scalar(-2*ST::one());
114 Scalar sum3 = ST::zero();
115 Scalar sum4 = ST::zero();
116 for (
int i=0 ; i<N ; ++i) {
117 for (
int j=0 ; j<N ; ++j) {
122 sum3 *= Scalar(2*ST::one()/Scalar(N));
123 sum4 *= Scalar(2*ST::one()/Scalar(N));
125 slope_ = ( sum3 + sum1 ) / ( sum4 + sum2 );
127 yIntercept_ = ST::zero();
128 for (
int i=0 ; i<N ; ++i ) {
129 yIntercept_ += y_[i]-slope_*x_[i];
131 yIntercept_ *= Scalar(ST::one()/Scalar(N));
135 template<
class Scalar>
137 std::vector<Scalar>& x, std::vector<Scalar>& y)
144 template<
class Scalar>
146 std::vector<Scalar>& x, std::vector<Scalar>& y,
147 Scalar & slope, Scalar & yIntercept)
156 template<
class Scalar>
158 std::vector<Scalar>& x, std::vector<Scalar>& y)
160 TEUCHOS_TEST_FOR_EXCEPT(x.size() != y.size());
161 int N = Teuchos::as<int>(x.size());
162 std::vector<Scalar> xlog;
163 std::vector<Scalar> ylog;
165 for (
int i=0 ; i<N ; ++i) {
166 xlog.push_back(log(x[i]));
167 ylog.push_back(log(y[i]));
175 template<
class Scalar>
178 Teuchos::RCP<LinearRegression<Scalar> > lr =
183 template<
class Scalar>
185 const std::string filename,
187 std::vector<Scalar> & StepSize,
188 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> & solutions,
189 std::vector<Scalar> & xErrorNorm,
191 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> & solutionsDot,
192 std::vector<Scalar> & xDotErrorNorm,
194 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> & solutionsDotDot,
195 std::vector<Scalar> & xDotDotErrorNorm,
196 Scalar & xDotDotSlope)
198 Scalar order = stepper->getOrder();
199 int lastElem = solutions.size()-1;
200 std::vector<Scalar> dt;
202 auto ref_solution = solutions[lastElem];
203 for (std::size_t i=0; i < lastElem; ++i) {
204 dt.push_back(StepSize[i]);
205 auto tmp = solutions[i];
206 Thyra::Vp_StV(tmp.ptr(), -1.0, *ref_solution);
207 Scalar L2norm = Thyra::norm_2(*tmp);
208 xErrorNorm.push_back(L2norm);
210 xSlope = computeLinearRegressionLogLog<Scalar>(dt, xErrorNorm);
212 if (!solutionsDot.empty()) {
213 auto ref_solutionDot = solutionsDot[lastElem];
214 for (std::size_t i=0; i < lastElem; ++i) {
215 auto tmp = solutionsDot[i];
216 Thyra::Vp_StV(tmp.ptr(), -1.0, *ref_solutionDot);
217 Scalar L2norm = Thyra::norm_2(*tmp);
218 xDotErrorNorm.push_back(L2norm);
220 xDotSlope = computeLinearRegressionLogLog<Scalar>(dt, xDotErrorNorm);
223 if (!solutionsDotDot.empty()) {
224 auto ref_solutionDotDot = solutionsDotDot[solutions.size()-1];
225 for (std::size_t i=0; i < lastElem; ++i) {
226 auto tmp = solutionsDotDot[i];
227 Thyra::Vp_StV(tmp.ptr(), -1.0, *ref_solutionDotDot);
228 Scalar L2norm = Thyra::norm_2(*tmp);
229 xDotDotErrorNorm.push_back(L2norm);
231 xDotDotSlope = computeLinearRegressionLogLog<Scalar>(dt, xDotDotErrorNorm);
234 std::cout <<
" Stepper = " << stepper->description() << std::endl;
235 std::cout <<
" =================================" << std::endl;
236 std::cout <<
" Expected Order = " << order << std::endl;
237 std::cout <<
" x Order = " << xSlope << std::endl;
238 if (!solutionsDot.empty())
239 std::cout<<
" xDot Order = " << xDotSlope << std::endl;
240 if (!solutionsDotDot.empty())
241 std::cout<<
" xDotDot Order = " << xDotDotSlope << std::endl;
242 std::cout <<
" =================================" << std::endl;
244 std::ofstream ftmp(filename);
246 for (
int n=0; n<lastElem; n++) {
247 factor = 0.8*(pow(dt[n]/dt[0], order));
249 <<
" " << xErrorNorm[n] <<
" " << factor*xErrorNorm[0];
250 if (xDotErrorNorm.size() == lastElem)
251 ftmp <<
" "<< xDotErrorNorm[n] <<
" " << factor*xDotErrorNorm[0];
252 if (xDotDotErrorNorm.size() == lastElem)
253 ftmp <<
" "<< xDotDotErrorNorm[n] <<
" " << factor*xDotDotErrorNorm[0];
259 template<
class Scalar>
261 const std::string filename,
263 std::vector<Scalar> & StepSize,
264 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> & solutions,
265 std::vector<Scalar> & xErrorNorm,
267 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> & solutionsDot,
268 std::vector<Scalar> & xDotErrorNorm,
271 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> solutionsDotDot;
272 std::vector<Scalar> xDotDotErrorNorm;
273 Scalar xDotDotSlope = Scalar(0.0);
275 solutions, xErrorNorm, xSlope,
276 solutionsDot, xDotErrorNorm, xDotSlope,
277 solutionsDotDot, xDotDotErrorNorm, xDotDotSlope);
280 template<
class Scalar>
282 const std::string filename,
284 std::vector<Scalar> & StepSize,
285 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> & solutions,
286 std::vector<Scalar> & xErrorNorm,
289 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> solutionsDot;
290 std::vector<Scalar> xDotErrorNorm;
291 Scalar xDotSlope = Scalar(0.0);
292 std::vector<Teuchos::RCP<Thyra::VectorBase<Scalar>>> solutionsDotDot;
293 std::vector<Scalar> xDotDotErrorNorm;
294 Scalar xDotDotSlope = Scalar(0.0);
296 solutions, xErrorNorm, xSlope,
297 solutionsDot, xDotErrorNorm, xDotSlope,
298 solutionsDotDot, xDotDotErrorNorm, xDotDotSlope);
301 template<
class Scalar>
303 const std::string filename,
306 std::ofstream ftmp(filename);
307 Teuchos::RCP<const Thyra::VectorBase<Scalar> > x;
308 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xDot;
309 Teuchos::RCP<const Thyra::VectorBase<Scalar> > xDotDot;
311 Teuchos::RCP<const Tempus::SolutionState<Scalar> > solutionState =
312 (*solutionHistory)[i];
313 Scalar time = solutionState->getTime();
314 x = solutionState->getX();
315 xDot = solutionState->getXDot();
316 xDotDot = solutionState->getXDotDot();
317 int J = x->space()->dim();
320 for (
int j=0; j<J; j++) ftmp <<
" " << get_ele(*x, j);
321 if (xDot != Teuchos::null)
322 for (
int j=0; j<J; j++) ftmp <<
" " << get_ele(*xDot, j);
323 if (xDotDot != Teuchos::null)
324 for (
int j=0; j<J; j++) ftmp <<
" " << get_ele(*xDotDot, j);
330 template<
class Scalar>
332 const std::string filename,
335 Teuchos::RCP<const Tempus::SolutionHistory<Scalar> > sh(
solutionHistory);
341 #endif // TEMPUS_CONVERGENCE_TEST_UTILS_HPP