14 inline double pow2(
const double a);
15 inline arma::vec pow2(
const arma::vec& a);
16 inline double pow3(
const double a);
17 inline double pow4(
const double a);
18 inline double pow5(
const double a);
19 inline double pow6(
const double a);
21 inline arma::vec cubeRoot(
const arma::vec& input);
23 inline arma::vec centerDifference(
const arma::vec& input);
25 inline arma::vec centerDifference(
const arma::subview_col<arma::mat::elem_type>& input);
27 inline arma::vec centerSum(
const arma::vec& input);
29 inline arma::vec centerSum(
const arma::subview_col<arma::mat::elem_type>& input);
31 inline arma::vec centerAverage(
const arma::vec& input);
33 inline arma::vec centerAverage(
const arma::subview_col<arma::mat::elem_type>& input);
35 inline arma::vec weightedAverage(
const arma::vec& weightA,
const arma::vec& weightB,
const arma::vec& A,
const arma::vec& B);
37 inline double weightedAverage(
const double weightA,
const double weightB,
const double A,
const double B);
39 inline bool isRelativeDifferenceWithinTolerance(
40 const double oldValue,
41 const double newValue,
42 const double tolerance);
44 inline bool areRelativeDifferencesWithinTolerance(
45 const arma::vec& oldValues,
46 const arma::vec& newValues,
47 const double tolerance);
49 inline double convertBurialToStandardDefinition(
51 const double innerDiameter,
52 const arma::rowvec& width);
54 inline double convertBurialToStandardDefinition(
56 const double innerDiameter,
57 const arma::subview_row<arma::mat::elem_type>& width);
59 inline arma::vec convertBurialToStandardDefinition(
60 const arma::vec& burial,
61 const arma::vec& innerDiameter,
62 const arma::colvec& width);
64 inline arma::vec convertBurialToStandardDefinition(
65 const arma::vec& burial,
66 const arma::vec& innerDiameter,
67 const arma::mat& width);
69 inline arma::vec smooth(
const arma::vec& x,
const double smoothness);
71 inline arma::vec smoothTransition(
const arma::vec& firstPart,
const arma::vec& lastPart,
double smoothness = 1.0,
const double timeStep = 60);
73 inline arma::vec createSmoothTransient(
74 const double initialValue,
75 const double finalValue,
77 const double smoothness,
78 const arma::uword dt);
80 inline arma::vec findLogSpacedConcentricShellWidths(
81 const double innerRadius,
82 const double outerRadius,
83 const arma::uword nShells);
85 inline arma::cube loadCubeFromFile(
const std::string& filename,
const arma::file_type& fileType = arma::csv_ascii);
86 inline arma::mat loadMatFromFile(
const std::string& filename,
const arma::file_type& fileType = arma::csv_ascii);
87 inline arma::vec loadVecFromFile(
const std::string& filename,
const arma::file_type& fileType = arma::csv_ascii);
90 inline double utils::pow2(
const double a)
95 inline arma::vec utils::pow2(
const arma::vec& a)
100 inline double utils::pow3(
const double a)
105 inline double utils::pow4(
const double a)
110 inline double utils::pow5(
const double a)
115 inline double utils::pow6(
const double a)
120 inline arma::vec utils::cubeRoot(
const arma::vec& input)
122 arma::vec cubed = arma::zeros<arma::vec>(input.n_elem);
123 for (arma::uword i = 0; i < input.n_elem; i++)
125 cubed(i) = std::cbrt(input(i));
130 arma::vec utils::centerDifference(
const arma::vec& input)
132 return input(arma::span(1, input.n_elem - 1)) - input(arma::span(0, input.n_elem - 2));
135 arma::vec utils::centerDifference(
const arma::subview_col<arma::mat::elem_type>& input)
137 return input.rows(1, input.n_elem - 1) - input.rows(0, input.n_elem - 2);
140 arma::vec utils::centerSum(
const arma::vec& input)
142 return input(arma::span(1, input.n_elem - 1)) + input(arma::span(0, input.n_elem - 2));
145 arma::vec utils::centerSum(
const arma::subview_col<arma::mat::elem_type>& input)
147 return input.rows(1, input.n_elem - 1) + input.rows(0, input.n_elem - 2);
150 arma::vec utils::centerAverage(
const arma::vec& input)
152 return centerSum(input)/2.0;
155 arma::vec utils::centerAverage(
const arma::subview_col<arma::mat::elem_type>& input)
157 return centerSum(input)/2.0;
160 double utils::weightedAverage(
const double weightA,
const double weightB,
const double A,
const double B)
162 if (std::round(weightA + weightB) == 0)
164 throw std::invalid_argument(
"utils::weightedAverage(): both weights are zero");
167 return (A*weightA + B*weightB)/(weightA + weightB);
170 arma::vec utils::weightedAverage(
const arma::vec& weightA,
const arma::vec& weightB,
const arma::vec& A,
const arma::vec& B)
172 if (!arma::all((weightA + weightB) != 0))
174 throw std::invalid_argument(
"utils::weightedAverage(): both weights are zero");
177 return (A % weightA + B % weightB)/(weightA + weightB);
180 bool utils::isRelativeDifferenceWithinTolerance(
181 const double oldValue,
182 const double newValue,
183 const double tolerance)
185 double relativeDifference;
188 relativeDifference = std::abs(newValue - oldValue)/std::abs(oldValue);
190 else if (newValue != 0)
192 relativeDifference = std::abs(newValue - oldValue)/std::abs(newValue);
199 return relativeDifference < tolerance;
202 bool utils::areRelativeDifferencesWithinTolerance(
203 const arma::vec& oldValues,
204 const arma::vec& newValues,
205 const double tolerance)
207 for (arma::uword i = 0; i < oldValues.n_elem; i++)
209 double relativeDifference;
210 if (oldValues(i) != 0)
212 relativeDifference = std::abs(newValues(i) - oldValues(i))/std::abs(oldValues(i));
214 else if (newValues(i) != 0)
216 relativeDifference = std::abs(newValues(i) - oldValues(i))/std::abs(newValues(i));
224 if (relativeDifference > tolerance)
233 double utils::convertBurialToStandardDefinition(
235 const double innerDiameter,
236 const arma::rowvec& width)
238 return burial + innerDiameter/2.0 + arma::sum(width);
241 double utils::convertBurialToStandardDefinition(
243 const double innerDiameter,
244 const arma::subview_row<arma::mat::elem_type>& width)
246 return burial + innerDiameter/2.0 + arma::sum(width);
249 arma::vec utils::convertBurialToStandardDefinition(
250 const arma::vec& burial,
251 const arma::vec& innerDiameter,
252 const arma::colvec& width)
254 return burial + innerDiameter/2.0 + arma::sum(width);
257 arma::vec utils::convertBurialToStandardDefinition(
258 const arma::vec& burial,
259 const arma::vec& innerDiameter,
260 const arma::mat& width)
265 arma::vec convertedBurial = arma::zeros<arma::vec>(burial.n_elem);
266 for (arma::uword i = 0; i < burial.n_elem; i++)
268 convertedBurial(i) = convertBurialToStandardDefinition(burial(i), innerDiameter(i), width.row(i));
271 return convertedBurial;
274 arma::vec utils::smooth(
const arma::vec& x,
const double smoothness)
276 return 0.5 + 0.5*tanh((x - 0.5)/smoothness);
279 arma::vec utils::smoothTransition(
280 const arma::vec& firstPart,
281 const arma::vec& lastPart,
283 const double timeStep)
295 arma::uword m = firstPart.n_elem;
296 arma::uword n = lastPart.n_elem;
300 smoothness *= 60.0/timeStep;
302 arma::vec f = arma::join_cols(
304 arma::zeros<arma::vec>(n) + firstPart(m-1)
306 arma::vec g = arma::join_cols(
307 arma::zeros<arma::vec>(m) + lastPart(0),
311 arma::vec x = arma::linspace(-
int(m)+1, n, m+n);
312 arma::vec s = smooth(x, smoothness);
314 arma::vec h = (1-s) % f + s % g;
319 arma::vec utils::createSmoothTransient(
320 const double initialValue,
321 const double finalValue,
323 const double smoothness,
324 const arma::uword dt)
329 std::cout <<
"n (" << n <<
") should be divisible by 2!" << std::endl;
331 arma::vec a = arma::zeros<arma::vec>(n/2) + initialValue;
332 arma::vec b = arma::zeros<arma::vec>(n/2) + finalValue;
333 return smoothTransition(a, b, smoothness, dt);
336 arma::vec utils::findLogSpacedConcentricShellWidths(
337 const double innerRadius,
338 const double outerRadius,
339 const arma::uword nShells)
341 arma::vec logSpacedLayerRadii = arma::logspace(log10(innerRadius), log10(outerRadius), nShells+1);
342 arma::vec logSpacedLayerWidths = arma::zeros<arma::vec>(nShells);
343 for (arma::uword i = 0; i < nShells; i++)
345 logSpacedLayerWidths(i) = logSpacedLayerRadii(i+1) - logSpacedLayerRadii(i);
348 return logSpacedLayerWidths;
351 arma::cube utils::loadCubeFromFile(
const std::string& filename,
const arma::file_type& fileType)
354 if (!c.load(filename, fileType))
356 throw std::runtime_error(
"Couldn't load file \"" + filename +
"\"");
362 arma::mat utils::loadMatFromFile(
const std::string& filename,
const arma::file_type& fileType)
365 if (!m.load(filename, fileType))
367 throw std::runtime_error(
"Couldn't load file \"" + filename +
"\"");
373 arma::vec utils::loadVecFromFile(
const std::string& filename,
const arma::file_type& fileType)
376 if (!v.load(filename, fileType))
378 throw std::runtime_error(
"Couldn't load file \"" + filename +
"\"");