v0.14.0
scaling_method.cpp
Go to the documentation of this file.
1 /** \file scaling_method.cpp
2 
3  \brief Testing interface for reading and writing CSV files containing time
4  series data.
5 
6 */
7 
8 #include <MoFEM.hpp>
9 using namespace MoFEM;
10 
11 static char help[] = "...\n\n";
12 
13 int main(int argc, char *argv[]) {
14 
15  MoFEM::Core::Initialize(&argc, &argv, (char *)0, help);
16  const std::string delimiter = "(\\s*,\\s*|\\s+)"; // comma or space
17  std::string file_name = "scalar_data.csv";
18  std::vector<double> scalar_values = {1.1, 2.4, 3.6, 4.1, 3.1,
19  5.1, 9.1, 10.5, 11.2, 15.3};
20  try {
21  auto time_scale = std::make_shared<TimeScale>(file_name, delimiter);
22  auto time_scale_linear_scaling = std::make_shared<TimeScale>();
23  for (int i = 1; i <= scalar_values.size(); i++) {
24  if (std::fabs(time_scale->getScale(double(i)) - scalar_values[i - 1]) >
25  std::numeric_limits<double>::epsilon()) {
26  SETERRQ2(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
27  "Validation for data scaling from csv "
28  "failed for time: %f value: %f",
29  double(i), time_scale->getScale(i));
30  }
31  }
32  double time1 = 3.0;
33  double time0 = 2.0;
34  double scale1 = scalar_values[2];
35  double scale0 = scalar_values[1];
36  double input_time = 2.5;
37  double interp_t = (input_time - time0) / (time1 - time0);
38  double expected_scale = scale0 + (scale1 - scale0) * interp_t;
39  double actual_scale = time_scale->getScale(2.5);
40  if (std::fabs(expected_scale - actual_scale) >
41  std::numeric_limits<double>::epsilon()) {
42  SETERRQ2(
43  PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
44  "Validation for data scaling from csv failed for time: %f value: %f",
45  2.5, time_scale->getScale(2.5));
46  }
47  double time_out_of_range_1 = 11.0;
48  double time_out_of_range_2 = -1.0;
49  if (std::fabs(time_scale->getScale(time_out_of_range_2)) >
50  std::numeric_limits<double>::epsilon()) {
51  SETERRQ2(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
52  "Validation for data scaling from csv failed for time: %f "
53  "value: %f",
54  -1.0, time_scale->getScale(-1.0));
55  }
56  if (std::fabs(time_scale->getScale(time_out_of_range_1) - 15.3) >
57  std::numeric_limits<double>::epsilon()) {
58  SETERRQ2(
59  PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
60  "Validation for data scaling from csv failed for time: %f value: %f",
61  11.0, time_scale->getScale(11.0));
62  }
63  for (int i = 1; i <= scalar_values.size(); i++) {
64  if (std::fabs(time_scale_linear_scaling->getScale(double(i)) -
65  double(i)) > std::numeric_limits<double>::epsilon()) {
66  SETERRQ2(PETSC_COMM_SELF, MOFEM_ATOM_TEST_INVALID,
67  "Validation for linear scaling from csv failed for time: %f "
68  "value: %f",
69  double(i), time_scale->getScale(i));
70  }
71  }
72  }
74 
76 
77  return 0;
78 }
MoFEM.hpp
MoFEM::CoreTmp< 0 >::Finalize
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Definition: Core.cpp:112
MoFEM
implementation of Data Operators for Forces and Sources
Definition: Common.hpp:10
i
FTensor::Index< 'i', SPACE_DIM > i
Definition: hcurl_divergence_operator_2d.cpp:27
help
static char help[]
Definition: scaling_method.cpp:11
MoFEM::CoreTmp< 0 >::Initialize
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
Definition: Core.cpp:72
CATCH_ERRORS
#define CATCH_ERRORS
Catch errors.
Definition: definitions.h:385
MOFEM_ATOM_TEST_INVALID
@ MOFEM_ATOM_TEST_INVALID
Definition: definitions.h:40
main
int main(int argc, char *argv[])
Definition: scaling_method.cpp:13