13 #include "libmesh/auto_ptr.h"
22 _series.push_back(libmesh_make_unique<Legendre>());
31 const std::vector<std::size_t> & orders,
32 std::vector<MooseEnum> series_types,
33 const std::string & who_is_using_me)
38 " calling CSBI::CSBI(...): Incorrect number of 'orders' specified for "
39 "'FunctionSeries'! Check that 'orders' is the correct length and no invalid "
40 "enumerations are specified for the series.");
51 std::vector<std::vector<Real>> single_series_basis_evaluation;
53 single_series_basis_evaluation.push_back(series->getAllGeneration());
60 const std::vector<std::vector<Real>> & single_series_basis_evaluations)
69 if (single_series_basis_evaluations.size() == 1)
70 for (std::size_t i = 0; i <
_series[0]->getNumberOfTerms(); ++i, ++term)
71 save(term, single_series_basis_evaluations[0][i]);
73 if (single_series_basis_evaluations.size() == 2)
74 for (std::size_t i = 0; i <
_series[0]->getNumberOfTerms(); ++i)
76 f1 = single_series_basis_evaluations[0][i];
77 for (std::size_t j = 0; j <
_series[1]->getNumberOfTerms(); ++j, ++term)
79 f2 = single_series_basis_evaluations[1][j];
84 if (single_series_basis_evaluations.size() == 3)
85 for (std::size_t i = 0; i <
_series[0]->getNumberOfTerms(); ++i)
87 f1 = single_series_basis_evaluations[0][i];
88 for (std::size_t j = 0; j <
_series[1]->getNumberOfTerms(); ++j)
90 f2 = single_series_basis_evaluations[1][j];
91 for (std::size_t k = 0; k <
_series[2]->getNumberOfTerms(); ++k, ++term)
93 f3 = single_series_basis_evaluations[2][k];
94 save(term, f1 * f2 * f3);
108 std::vector<std::vector<Real>> single_series_basis_evaluation;
110 single_series_basis_evaluation.push_back(series->getAllExpansion());
115 const std::vector<Real> &
120 return function_limits;
126 Real function_volume = 1.0;
129 function_volume *= series->getStandardizedFunctionVolume();
131 return function_volume;
137 std::vector<Real> function_limits;
141 std::vector<Real> local_limits = series->getStandardizedFunctionLimits();
142 for (
auto & limit : local_limits)
143 function_limits.push_back(limit);
146 return function_limits;
151 const std::vector<Real> & coefficients)
const
154 std::ostringstream formatted, domains, orders;
155 std::size_t term = 0;
157 stream <<
"---------------- Coefficients ----------------\n"
158 <<
" == Subindices ==\n";
162 orders <<
" Orders: " << std::setw(3) <<
_series[0]->getOrder(0) <<
"\n";
163 domains <<
" == Index == " << std::setw(3) <<
_series[0]->_domains[0]
164 <<
" === Value ===\n"
165 <<
"----------------------------------------------\n";
167 for (std::size_t i = 0; i <
_series[0]->getNumberOfTerms(); ++i, ++term)
168 formatted <<
" " << std::setw(4) << term
169 <<
" " << std::setw(3) << i
170 <<
" " << std::setw(12) << coefficients[term] <<
"\n";
174 orders <<
" Orders: " << std::setw(3) <<
_series[0]->getOrder(0)
175 <<
" " << std::setw(3) <<
_series[1]->getOrder(0) <<
"\n";
176 domains <<
" == Index == " << std::setw(3) <<
_series[0]->_domains[0]
177 <<
" " << std::setw(3) <<
_series[1]->_domains[0]
178 <<
" === Value ===\n"
179 <<
"----------------------------------------------\n";
181 for (std::size_t i = 0; i <
_series[0]->getNumberOfTerms(); ++i)
183 for (std::size_t j = 0; j <
_series[1]->getNumberOfTerms(); ++j, ++term)
184 formatted <<
" " << std::setw(4) << term
185 <<
" " << std::setw(3) << i
186 <<
" " << std::setw(3) << j
187 <<
" " << std::setw(12) << coefficients[term] <<
"\n";
192 orders <<
" Orders: " << std::setw(3) <<
_series[0]->getOrder(0)
193 <<
" " << std::setw(3) <<
_series[1]->getOrder(0)
194 <<
" " << std::setw(3) <<
_series[2]->getOrder(0) <<
"\n";
195 domains <<
" == Index == " << std::setw(3) <<
_series[0]->_domains[0]
196 <<
" " << std::setw(3) <<
_series[1]->_domains[0]
197 <<
" " << std::setw(3) <<
_series[2]->_domains[0]
198 <<
" === Value ===\n"
199 <<
"----------------------------------------------\n";
201 for (std::size_t i = 0; i <
_series[0]->getNumberOfTerms(); ++i)
203 for (std::size_t j = 0; j <
_series[1]->getNumberOfTerms(); ++j)
205 for (std::size_t k = 0; k <
_series[2]->getNumberOfTerms(); ++k, ++term)
206 formatted <<
" " << std::setw(4) << term
207 <<
" " << std::setw(3) << i
208 <<
" " << std::setw(3) << j
209 <<
" " << std::setw(3) << k
210 <<
" " << std::setw(12) << coefficients[term] <<
"\n";
216 stream << orders.str() << domains.str() << formatted.str();
227 if (series->isCacheInvalid())
241 if (!series->isInPhysicalBounds(point))
250 unsigned int number_of_terms = 1;
254 number_of_terms *= series->getNumberOfTerms();
269 if (orders.size() !=
_series.size())
271 " calling CSBI::setOrder(): Mismatch between the orders provided and the number of "
272 "series in the functional basis!");
275 for (std::size_t i = 0; i <
_series.size(); ++i)
295 series->setLocation(point);