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) {
29 "Error in reading time data");
33 std::string delimiter) {
37 PetscBool arg_found = PETSC_FALSE;
38 char time_file_name[255] = {
'\0'};
43 time_file_name, 255, &arg_found);
45 fileName = std::string(time_file_name);
50 arg_found = PETSC_TRUE;
54 "*** ERROR %s (time_data FILE NEEDED)",
fileName.c_str());
57 "The %s file not provided. Loading scaled with time.",
63 std::ifstream in_file_stream(
fileName);
66 "*** ERROR data file < %s > open unsuccessful",
fileName.c_str());
69 <<
"*** Warning data file " <<
fileName
70 <<
" open unsuccessful. Using linear time scaling.";
75 in_file_stream.seekg(0);
77 double time = 0.0, value = 0.0;
80 std::regex rgx(delimiter.c_str());
81 std::sregex_token_iterator end;
82 while (std::getline(in_file_stream, line)) {
83 std::sregex_token_iterator iter(line.begin(), line.end(), rgx, -1);
85 auto value_str = ++iter;
86 if (time_str == end || value_str == end) {
88 "*** ERROR read data file error (check input time data file) ");
90 time = std::stod(time_str->str());
91 value = std::stod(value_str->str());
94 in_file_stream.close();
96 if (in_file_stream.is_open()) {
98 "*** ERROR file close unsuccessful");
113 auto it =
tSeries.lower_bound(time);
115 return (--it)->second;
126 double t = (time - lower.first) / (upper.first - lower.first);
127 double scale1 = upper.second;
128 double scale0 = lower.second;
129 return scale0 +
t * (scale1 - scale0);
138template <
int SPACE_DIM>
140 bool error_if_file_not_given)
141 : readFile(0),
debug(0), nAme(name),
142 errorIfFileNotGiven(error_if_file_not_given) {
146template <
int SPACE_DIM>
148 bool error_if_file_not_given)
149 : readFile(0),
debug(0), errorIfFileNotGiven(error_if_file_not_given) {
150 nAme = name + std::to_string(ms_id);
157 char time_file_name[255];
158 PetscBool flg = PETSC_FALSE;
161 time_file_name, 255, &flg);
164 if (errorIfFileNotGiven)
166 "*** ERROR %s (time_data FILE NEEDED)", nAme.c_str());
170 FILE *time_data = fopen(time_file_name,
"r");
171 if (time_data == NULL) {
173 "*** ERROR data file < %s > open unsuccessful", time_file_name);
177 (tSeries[no1])(
i) = 0.;
178 while (!feof(time_data)) {
181 fscanf(time_data,
"%lf %lf %lf %lf", &no1, &no2(0), &no2(1), &no2(2));
188 "*** ERROR read data file error (check input time data file) "
192 (tSeries[no1])(
i) = no2(
i);
194 int r = fclose(time_data);
197 for (
auto &[ts, vec] : tSeries) {
199 "** read vector %3.2e time %3.2e %3.2e %3.2e", ts,
200 vec(0), vec(1), vec(2));
206 "*** ERROR file close unsuccessful");
211 scalingMethod = [
this](
double time) {
212 return this->getVectorFromData(time);
218template <
int SPACE_DIM>
221 return scalingMethod(time);
224template <
int SPACE_DIM>
235 double t0 = 0, t1,
dt;
236 for (
auto &[ts, vec] : tSeries) {
240 acc(
I) = acc0(
I) + ((vec(
I) - acc0(
I)) / (t1 - t0)) *
dt;
#define MOFEM_TAG_AND_LOG_C(channel, severity, tag, format,...)
Tag and log in channel.
#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 THROW_MESSAGE(msg)
Throw MoFEM exception.
FTensor::Index< 'n', SPACE_DIM > n
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_CHANNEL(channel)
Set and reset channel.
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 IntegrationType I
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 fileName, 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)