13 #ifndef mutil_fd_testsuite_hpp
14 #define mutil_fd_testsuite_hpp
34 template<
typename itn__,
typename ite__,
typename data__>
35 int calculate_order(itn__ itn, ite__ iteb, ite__ itee,
const data__ &refrat);
44 template<
typename itn__,
typename ite__,
typename data__>
47 ite__ ite(iteb), itep(iteb);
49 for (++ite; ite!=itee; ++ite, ++itep, ++itn)
50 (*itn)=std::log(std::abs((*itep)/(*ite)))/std::log(refrat);
55 template<
typename data__>
101 std::vector<data__> dx(1); dx[0]=
static_cast<data__
>(1.0);
102 d1_driver(
"*** 1st Derivative, 1st Order Left Uniform Spacing ***", dx, d1o1_type(d1o1_type::LEFT));
103 d1_driver(
"*** 1st Derivative, 1st Order Right Uniform Spacing ***", dx, d1o1_type(d1o1_type::RIGHT));
105 std::vector<data__> dx_factor(2); dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(1.0);
106 d1_driver(
"*** 1st Derivative, 1st Order Left Uniform Spacing ***", dx_factor, d1o1_type(d1o1_type::LEFT));
107 d1_driver(
"*** 1st Derivative, 1st Order Right Uniform Spacing ***", dx_factor, d1o1_type(d1o1_type::RIGHT));
108 dx_factor[0]=
static_cast<data__
>(0.95); dx_factor[1]=
static_cast<data__
>(1.00);
109 d1_driver(
"*** 1st Derivative, 1st Order Left Mildly Non-Uniform Spacing ***", dx_factor, d1o1_type(d1o1_type::LEFT));
110 dx_factor[0]=
static_cast<data__
>(1.00); dx_factor[1]=
static_cast<data__
>(0.95);
111 d1_driver(
"*** 1st Derivative, 1st Order Right Mildly Non-Uniform Spacing ***", dx_factor, d1o1_type(d1o1_type::RIGHT));
112 dx_factor[0]=
static_cast<data__
>(0.1); dx_factor[1]=
static_cast<data__
>(1.00);
113 d1_driver(
"*** 1st Derivative, 1st Order Left Extremely Non-Uniform Spacing ***", dx_factor, d1o1_type(d1o1_type::LEFT));
114 dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(0.1);
115 d1_driver(
"*** 1st Derivative, 1st Order Right Extremely Non-Uniform Spacing ***", dx_factor, d1o1_type(d1o1_type::RIGHT));
122 std::vector<data__> dx(1); dx[0]=
static_cast<data__
>(1.0);
123 d1_driver(
"*** 1st Derivative, 2nd Order Center Uniform Spacing ***", dx, d1o2_type(d1o2_type::CENTER));
124 d1_driver(
"*** 1st Derivative, 2nd Order Left Uniform Spacing ***", dx, d1o2_type(d1o2_type::LEFT));
125 d1_driver(
"*** 1st Derivative, 2nd Order Right Uniform Spacing ***", dx, d1o2_type(d1o2_type::RIGHT));
127 std::vector<data__> dx_factor(3); dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(1.0);
128 d1_driver(
"*** 1st Derivative, 2nd Order Center Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::CENTER));
129 d1_driver(
"*** 1st Derivative, 2nd Order Left Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::LEFT));
130 d1_driver(
"*** 1st Derivative, 2nd Order Right Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::RIGHT));
131 dx_factor[0]=
static_cast<data__
>(0.95); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(1.05);
132 d1_driver(
"*** 1st Derivative, 2nd Order Center Mildly Non-Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::CENTER));
133 dx_factor[0]=
static_cast<data__
>(1.025); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(1.00);
134 d1_driver(
"*** 1st Derivative, 2nd Order Left Mildly Non-Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::LEFT));
135 dx_factor[0]=
static_cast<data__
>(1.00); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(1.025);
136 d1_driver(
"*** 1st Derivative, 2nd Order Right Mildly Non-Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::RIGHT));
137 dx_factor[0]=
static_cast<data__
>(0.1); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(1.8);
138 d1_driver(
"*** 1st Derivative, 2nd Order Center Extremely Non-Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::CENTER));
139 dx_factor[0]=
static_cast<data__
>(0.95); dx_factor[1]=
static_cast<data__
>(0.1); dx_factor[2]=
static_cast<data__
>(1.00);
140 d1_driver(
"*** 1st Derivative, 2nd Order Left Extremely Non-Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::LEFT));
141 dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(0.1); dx_factor[2]=
static_cast<data__
>(0.95);
142 d1_driver(
"*** 1st Derivative, 2nd Order Right Extremely Non-Uniform Spacing ***", dx_factor, d1o2_type(d1o2_type::RIGHT));
149 std::vector<data__> dx(1); dx[0]=
static_cast<data__
>(1.0);
150 d1_driver(
"*** 1st Derivative, 3rd Order Left Uniform Spacing ***", dx, d1o3_type(d1o3_type::LEFT));
151 d1_driver(
"*** 1st Derivative, 3rd Order Left-Biased Uniform Spacing ***", dx, d1o3_type(d1o3_type::LEFT_BIASED));
152 d1_driver(
"*** 1st Derivative, 3rd Order Right-Biased Uniform Spacing ***", dx, d1o3_type(d1o3_type::RIGHT_BIASED));
153 d1_driver(
"*** 1st Derivative, 3rd Order Right Uniform Spacing ***", dx, d1o3_type(d1o3_type::RIGHT));
155 std::vector<data__> dx_factor(4); dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(1.0); dx_factor[3]=
static_cast<data__
>(1.0);
156 d1_driver(
"*** 1st Derivative, 3rd Order Left Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::LEFT));
157 d1_driver(
"*** 1st Derivative, 3rd Order Left-Biased Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::LEFT_BIASED));
158 d1_driver(
"*** 1st Derivative, 3rd Order Right-Biased Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::RIGHT_BIASED));
159 d1_driver(
"*** 1st Derivative, 3rd Order Right Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::RIGHT));
160 dx_factor[0]=
static_cast<data__
>(2.95/3); dx_factor[1]=
static_cast<data__
>(1.025); dx_factor[2]=
static_cast<data__
>(0.95); dx_factor[3]=
static_cast<data__
>(1.00);
161 d1_driver(
"*** 1st Derivative, 3rd Order Left Mildly Non-Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::RIGHT_BIASED));
162 dx_factor[0]=
static_cast<data__
>(2.95/3); dx_factor[1]=
static_cast<data__
>(1.025); dx_factor[2]=
static_cast<data__
>(1.00); dx_factor[3]=
static_cast<data__
>(0.95);
163 d1_driver(
"*** 1st Derivative, 3rd Order Left-Biased Mildly Non-Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::LEFT_BIASED));
164 dx_factor[0]=
static_cast<data__
>(0.95); dx_factor[1]=
static_cast<data__
>(1.00); dx_factor[2]=
static_cast<data__
>(1.025); dx_factor[3]=
static_cast<data__
>(2.95/3);
165 d1_driver(
"*** 1st Derivative, 3rd Order Right-Biased Mildly Non-Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::RIGHT_BIASED));
166 dx_factor[0]=
static_cast<data__
>(1.00); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(1.025); dx_factor[3]=
static_cast<data__
>(2.95/3);
167 d1_driver(
"*** 1st Derivative, 3rd Order Right Mildly Non-Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::RIGHT));
168 dx_factor[0]=
static_cast<data__
>(1.2); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(0.1); dx_factor[3]=
static_cast<data__
>(1.00);
169 d1_driver(
"*** 1st Derivative, 3rd Order Left Extremely Non-Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::LEFT));
170 dx_factor[0]=
static_cast<data__
>(1.2); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(1.0); dx_factor[3]=
static_cast<data__
>(0.1);
171 d1_driver(
"*** 1st Derivative, 3rd Order Left-Biased Extremely Non-Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::LEFT_BIASED));
172 dx_factor[0]=
static_cast<data__
>(0.1); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(0.95); dx_factor[3]=
static_cast<data__
>(1.2);
173 d1_driver(
"*** 1st Derivative, 3rd Order Right-Biased Extremely Non-Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::RIGHT_BIASED));
174 dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(0.1); dx_factor[2]=
static_cast<data__
>(0.95); dx_factor[3]=
static_cast<data__
>(1.2);
175 d1_driver(
"*** 1st Derivative, 3rd Order Right Extremely Non-Uniform Spacing ***", dx_factor, d1o3_type(d1o3_type::RIGHT));
182 std::vector<data__> dx(1); dx[0]=
static_cast<data__
>(1.0);
183 d1_driver(
"*** 2nd Derivative, 1st Order Center Uniform Spacing ***", dx, d2o1_type(d2o1_type::CENTER));
184 d1_driver(
"*** 2nd Derivative, 1st Order Left Uniform Spacing ***", dx, d2o1_type(d2o1_type::LEFT));
185 d1_driver(
"*** 2nd Derivative, 1st Order Right Uniform Spacing ***", dx, d2o1_type(d2o1_type::RIGHT));
187 std::vector<data__> dx_factor(3); dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(1.0);
188 d1_driver(
"*** 2nd Derivative, 1st Order Center Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::CENTER));
189 d1_driver(
"*** 2nd Derivative, 1st Order Left Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::LEFT));
190 d1_driver(
"*** 2nd Derivative, 1st Order Right Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::RIGHT));
191 dx_factor[0]=
static_cast<data__
>(0.95); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(1.05);
192 d1_driver(
"*** 2nd Derivative, 1st Order Center Mildly Non-Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::CENTER));
193 dx_factor[0]=
static_cast<data__
>(1.025); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(1.00);
194 d1_driver(
"*** 2nd Derivative, 1st Order Left Mildly Non-Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::LEFT));
195 dx_factor[0]=
static_cast<data__
>(1.00); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(1.025);
196 d1_driver(
"*** 2nd Derivative, 1st Order Right Mildly Non-Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::RIGHT));
197 dx_factor[0]=
static_cast<data__
>(0.1); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(1.8);
198 d1_driver(
"*** 2nd Derivative, 1st Order Center Extremely Non-Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::CENTER));
199 dx_factor[0]=
static_cast<data__
>(0.95); dx_factor[1]=
static_cast<data__
>(0.1); dx_factor[2]=
static_cast<data__
>(1.00);
200 d1_driver(
"*** 2nd Derivative, 1st Order Left Extremely Non-Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::LEFT));
201 dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(0.1); dx_factor[2]=
static_cast<data__
>(0.95);
202 d1_driver(
"*** 2nd Derivative, 1st Order Right Extremely Non-Uniform Spacing ***", dx_factor, d2o1_type(d2o1_type::RIGHT));
209 std::vector<data__> dx(1); dx[0]=
static_cast<data__
>(1.0);
210 d1_driver(
"*** 2nd Derivative, 2nd Order Left Uniform Spacing ***", dx, d2o2_type(d2o2_type::LEFT));
211 d1_driver(
"*** 2nd Derivative, 2nd Order Left-Biased Uniform Spacing ***", dx, d2o2_type(d2o2_type::LEFT_BIASED));
212 d1_driver(
"*** 2nd Derivative, 2nd Order Right-Biased Uniform Spacing ***", dx, d2o2_type(d2o2_type::RIGHT_BIASED));
213 d1_driver(
"*** 2nd Derivative, 2nd Order Right Uniform Spacing ***", dx, d2o2_type(d2o2_type::RIGHT));
215 std::vector<data__> dx_factor(4); dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(1.0); dx_factor[3]=
static_cast<data__
>(1.0);
216 d1_driver(
"*** 2nd Derivative, 2nd Order Left Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::LEFT));
217 d1_driver(
"*** 2nd Derivative, 2nd Order Left-Biased Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::LEFT_BIASED));
218 d1_driver(
"*** 2nd Derivative, 2nd Order Right-Biased Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::RIGHT_BIASED));
219 d1_driver(
"*** 2nd Derivative, 2nd Order Right Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::RIGHT));
220 dx_factor[0]=
static_cast<data__
>(2.95/3); dx_factor[1]=
static_cast<data__
>(1.025); dx_factor[2]=
static_cast<data__
>(0.95); dx_factor[3]=
static_cast<data__
>(1.00);
221 d1_driver(
"*** 2nd Derivative, 2nd Order Left Mildly Non-Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::LEFT));
222 dx_factor[0]=
static_cast<data__
>(2.95/3); dx_factor[1]=
static_cast<data__
>(1.025); dx_factor[2]=
static_cast<data__
>(1.00); dx_factor[3]=
static_cast<data__
>(0.95);
223 d1_driver(
"*** 2nd Derivative, 2nd Order Left-Biased Mildly Non-Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::LEFT_BIASED));
224 dx_factor[0]=
static_cast<data__
>(0.95); dx_factor[1]=
static_cast<data__
>(1.00); dx_factor[2]=
static_cast<data__
>(1.025); dx_factor[3]=
static_cast<data__
>(2.95/3);
225 d1_driver(
"*** 2nd Derivative, 2nd Order Right-Biased Mildly Non-Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::RIGHT_BIASED));
226 dx_factor[0]=
static_cast<data__
>(1.00); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(1.025); dx_factor[3]=
static_cast<data__
>(2.95/3);
227 d1_driver(
"*** 2nd Derivative, 2nd Order Right Mildly Non-Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::RIGHT));
228 dx_factor[0]=
static_cast<data__
>(1.2); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(0.1); dx_factor[3]=
static_cast<data__
>(1.00);
229 d1_driver(
"*** 2nd Derivative, 2nd Order Left Extremely Non-Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::LEFT));
230 dx_factor[0]=
static_cast<data__
>(1.2); dx_factor[1]=
static_cast<data__
>(0.95); dx_factor[2]=
static_cast<data__
>(1.0); dx_factor[3]=
static_cast<data__
>(0.1);
231 d1_driver(
"*** 2nd Derivative, 2nd Order Left-Biased Extremely Non-Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::LEFT_BIASED));
232 dx_factor[0]=
static_cast<data__
>(0.1); dx_factor[1]=
static_cast<data__
>(1.0); dx_factor[2]=
static_cast<data__
>(0.95); dx_factor[3]=
static_cast<data__
>(1.2);
233 d1_driver(
"*** 2nd Derivative, 2nd Order Right-Biased Extremely Non-Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::RIGHT_BIASED));
234 dx_factor[0]=
static_cast<data__
>(1.0); dx_factor[1]=
static_cast<data__
>(0.1); dx_factor[2]=
static_cast<data__
>(0.95); dx_factor[3]=
static_cast<data__
>(1.2);
235 d1_driver(
"*** 2nd Derivative, 2nd Order Right Extremely Non-Uniform Spacing ***", dx_factor, d2o2_type(d2o2_type::RIGHT));
238 template<
typename d1__>
239 void d1_driver(
const std::string &str,
const std::vector<data__> &dx_factor,
const d1__ &dop)
241 const size_t nnodes(dop.number_nodes());
242 const size_t nref(5);
243 const data__ x0(0.5), rrat(3.0), dx0(0.5);
247 std::vector<data__> phi(nref);
248 std::vector<data__> phi_err(nref);
249 std::vector<data__> phi_te(nref);
250 std::vector<data__> dx(nref);
251 std::vector<data__> ord(nref);
252 std::vector<data__> x(nnodes);
253 std::vector<data__> dx_term(nnodes);
254 std::vector<std::ptrdiff_t> ind(nnodes);
258 if (dx_factor.size() == 1)
261 for (
size_t i=0; i<nnodes; ++i)
262 dx_term[i]=static_cast<data__>(1.0);
268 for (
size_t i=1; i<dx_factor.size(); ++i)
270 if (dx_factor[i]!=dx_factor[i-1])
276 ind0=dop.index(ind.begin());
278 for (c=0; c<nref; ++c)
280 dx[c]=dx0*std::pow(rrat,-static_cast<int>(c));
281 for (
size_t i=0; i<nnodes; ++i)
283 x[i]=x0+ind[i]*dx[c]*dx_term[i];
284 phi[i]=std::exp(x[i]);
287 TEST_ASSERT(x0==x[ind0]);
289 if (dx_factor.size() == 1)
292 dop.evaluate(d, phi.begin(), dx[c]);
293 tertn=dop.truncation_error(phi_te[c], std::exp(x[ind0]), dx[c]);
297 phi_te[c]*=std::exp(x[ind0]);
302 dop.evaluate(d, phi.begin(), x.begin());
303 dop.truncation_error(phi_te[c], std::exp(x[ind0]), x.begin());
305 phi_err[c]=std::exp(x[ind0])-d;
310 if (
typeid(data__)==
typeid(float))
313 if (std::abs(phi_te[(nref-1)/2])<5e-3)
319 TEST_ASSERT_DELTA_MSG(ord[(nref-1)/2], dop.order(uniform),
static_cast<data__
>(5.0e-1), str.c_str());
324 TEST_ASSERT_DELTA_MSG(ord[nref-1], dop.order(uniform),
static_cast<data__
>(5.0e-2), str.c_str());
int calculate_order(itn__ itn, ite__ iteb, ite__ itee, const data__ &refrat)
Definition: fd_test_suite.hpp:45
void d1o3_test()
Definition: fd_test_suite.hpp:145
~fd_test_suite()
Definition: fd_test_suite.hpp:92
Definition: fd_test_suite.hpp:56
void d1o1_test()
Definition: fd_test_suite.hpp:97
void d1_driver(const std::string &str, const std::vector< data__ > &dx_factor, const d1__ &dop)
Definition: fd_test_suite.hpp:239
void d2o2_test()
Definition: fd_test_suite.hpp:205
int calculate_order(itn__ itn, ite__ iteb, ite__ itee, const data__ &refrat)
Definition: fd_test_suite.hpp:45
void d1o2_test()
Definition: fd_test_suite.hpp:118
Definition: fd_test_suite.hpp:30
fd_test_suite()
Definition: fd_test_suite.hpp:87
void AddTests(const float &)
Definition: fd_test_suite.hpp:59
void AddTests(const long double &)
Definition: fd_test_suite.hpp:77
void AddTests(const double &)
Definition: fd_test_suite.hpp:68
void d2o1_test()
Definition: fd_test_suite.hpp:178