23 :
TimeScale(file_name, defaultDelimiter, error_if_file_not_given) {}
26 bool error_if_file_not_given)
27 : fileName(file_name), errorIfFileNotGiven(error_if_file_not_given) {
33 PetscBool arg_found = PETSC_FALSE;
34 char time_file_name[255] = {
'\0'};
36 time_file_name, 255, &arg_found);
38 fileName = std::string(time_file_name);
42 "*** ERROR %s (time_data FILE NEEDED)",
fileName.c_str());
45 "The %s file not provided. Loading scaled with time.",
51 std::ifstream in_file_stream(
fileName);
54 "*** ERROR data file < %s > open unsuccessful",
fileName.c_str());
57 <<
"*** Warning data file " <<
fileName
58 <<
" open unsuccessful. Using linear time scaling.";
61 in_file_stream.seekg(0);
63 double time = 0.0, value = 0.0;
66 std::regex rgx(delimiter.c_str());
67 std::sregex_token_iterator end;
68 while (std::getline(in_file_stream, line)) {
69 std::sregex_token_iterator iter(line.begin(), line.end(), rgx, -1);
71 auto value_str = ++iter;
72 if (time_str == end || value_str == end) {
74 "*** ERROR read data file error (check input time data file) ");
76 time = std::stod(time_str->str());
77 value = std::stod(value_str->str());
80 in_file_stream.close();
82 if (in_file_stream.is_open()) {
84 "*** ERROR file close unsuccessful");
99 auto it =
tSeries.lower_bound(time);
101 return (--it)->second;
112 double t = (time - lower.first) / (upper.first - lower.first);
113 double scale1 = upper.second;
114 double scale0 = lower.second;
115 return scale0 +
t * (scale1 - scale0);
124template <
int SPACE_DIM>
126 bool error_if_file_not_given)
127 : readFile(0),
debug(0), nAme(name),
128 errorIfFileNotGiven(error_if_file_not_given) {
132template <
int SPACE_DIM>
134 bool error_if_file_not_given) : readFile(0),
debug(0),
135 errorIfFileNotGiven(error_if_file_not_given) {
136 nAme = name + std::to_string(ms_id);
140template <
int SPACE_DIM>
145 char time_file_name[255];
146 PetscBool flg = PETSC_FALSE;
149 time_file_name, 255, &flg);
152 if (errorIfFileNotGiven)
154 "*** ERROR %s (time_data FILE NEEDED)", nAme.c_str());
158 FILE *time_data = fopen(time_file_name,
"r");
159 if (time_data == NULL) {
161 "*** ERROR data file < %s > open unsuccessful", time_file_name);
168 while (!feof(time_data)) {
170 fscanf(time_data,
"%lf %lf %lf %lf", &no1, &no2(0), &no2(1), &no2(2));
177 "*** ERROR read data file error (check input time data file) "
183 int r = fclose(time_data);
186 for (
auto &[ts, vec] : tSeries) {
187 PetscPrintf(PETSC_COMM_WORLD,
188 "** read vector %3.2e time %3.2e %3.2e %3.2e\n",
189 ts, vec(0), vec(1), vec(2));
193 SETERRQ(PETSC_COMM_SELF, 1,
"*** ERROR file close unsuccessful");
198 scalingMethod = [
this](
double time) {
199 return this->getVectorFromData(time);
206template <
int SPACE_DIM>
209 return scalingMethod(time);
212template <
int SPACE_DIM>
225 double t0 = 0, t1,
dt;
226 for (
auto &[ts, vec] : tSeries) {
230 acc(
i) = acc0(
i) + ((vec(
i) - acc0(
i)) / (t1 - t0)) *
dt;
#define MOFEM_LOG_C(channel, severity, format,...)
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define THROW_MESSAGE(msg)
Throw MoFEM exception.
FTensor::Index< 'n', SPACE_DIM > n
#define MOFEM_LOG(channel, severity)
Log.
FTensor::Index< 'i', SPACE_DIM > i
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
constexpr double t
plate stiffness
virtual double getScale(const double time)
Get scaling at given time.
Force scale operator for reading two columns.
double getLinearScale(const double time)
Returns the value of time.
double getScale(const double time)
Get scaling at a given time.
double getScaleFromData(const double time)
Get scaling at a given time when the scalar values have been provided. Uses linear interpolation on t...
TimeScale(std::string file_name="", bool error_if_file_not_given=false)
TimeScale constructor.
static const std::string defaultDelimiter
comma or space
std::function< double(double)> scalingMethod
MoFEMErrorCode timeData(std::string delimiter)
std::map< double, double > tSeries
Force scale operator for reading four columns (time and vector)
TimeScaleVector(std::string name="-time_vector_file", bool error_if_file_not_given=false)
MoFEMErrorCode timeData()
virtual FTensor::Tensor1< double, SPACE_DIM > getVector(const double time)
virtual FTensor::Tensor1< double, SPACE_DIM > getVectorFromData(const double time)