OOFEM 3.0
Loading...
Searching...
No Matches
staggeredproblem.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#include "staggeredproblem.h"
36#include "oofemcfg.h"
37#include "engngm.h"
38#include "timestep.h"
39#include "function.h"
40#include "metastep.h"
41#include "exportmodulemanager.h"
42#include "mathfem.h"
43#include "oofemtxtdatareader.h"
44#include "util.h"
45#include "verbose.h"
46#include "classfactory.h"
47#include "domain.h"
48
49#include <stdlib.h>
50
51#ifdef __OOFEG
52 #include "oofeggraphiccontext.h"
53#endif
54
55namespace oofem {
57
58StaggeredProblem :: StaggeredProblem(int i, EngngModel *_master) : EngngModel(i, _master),
59 adaptiveStepLength(false),
60 minStepLength(0.),
61 maxStepLength(0.),
62 reqIterations(0.),
67{
68 ndomains = 1; // domain is needed to store the time step function
69
70 dtFunction = 0;
71 stepMultiplier = 1.;
73}
74
75StaggeredProblem :: ~StaggeredProblem()
76{}
77
79int
80StaggeredProblem :: instanciateYourself(DataReader &dr, InputRecord &ir, const char *dataOutputFileName, const char *desc)
81{
82 int result;
83 result = EngngModel :: instanciateYourself(dr, ir, dataOutputFileName, desc);
84 // instanciate slave problems
85 result &= this->instanciateSlaveProblems();
86 return result;
87}
88
89int
90StaggeredProblem :: instanciateSlaveProblems()
91{
92 //first instantiate master problem if defined
93 //EngngModel *timeDefProb = NULL;
94 emodelList.resize( inputStreamNames.size() );
95 if ( timeDefinedByProb ) {
97 std :: unique_ptr< EngngModel >prob( InstanciateProblem(dr, this->pMode, this->contextOutputMode, this) );
98 //timeDefProb = prob.get();
99 emodelList [ timeDefinedByProb - 1 ] = std :: move(prob);
100 }
101
102 for ( int i = 1; i <= ( int ) inputStreamNames.size(); i++ ) {
103 if ( i == timeDefinedByProb ) {
104 continue;
105 }
106
108 //the slave problem dictating time needs to have attribute master=NULL, other problems point to the dictating slave
109 std :: unique_ptr< EngngModel >prob( InstanciateProblem(dr, this->pMode, this->contextOutputMode, this) );
110 emodelList [ i - 1 ] = std :: move(prob);
111 }
112
113 return 1;
114}
115
116
117void
118StaggeredProblem :: initializeFrom(InputRecord &ir)
119{
121 if ( numberOfSteps <= 0 ) {
122 throw ValueInputException(ir, _IFT_EngngModel_nsteps, "nsteps must be > 0");
123 }
125 EngngModel :: initializeFrom(ir);
127 dtFunction = 0;
129 EngngModel :: initializeFrom(ir);
131 dtFunction = 0;
132 } else if ( ir.hasField(_IFT_StaggeredProblem_dtf) ) {
134 } else {
136 }
137
139 adaptiveStepLength = true;
140 this->minStepLength = 0.;
142 this->maxStepLength = 1.e32;
144 this->reqIterations = 1;
146 this->endOfTimeOfInterest = 1.e32;
148 this->adaptiveStepSince = 0.;
150 }
151
152
154 if ( stepMultiplier < 0 ) {
155 throw ValueInputException(ir, _IFT_StaggeredProblem_stepmultiplier, "stepMultiplier must be > 0");
156 }
157
158 // timeLag = 0.;
159 // IR_GIVE_OPTIONAL_FIELD(ir, timeLag, _IFT_StaggeredProblem_timeLag);
160
161 inputStreamNames.resize(2);
163 inputStreamNames.resize(3);
164 }
165
170 }
171
172
173 renumberFlag = true; // The staggered problem itself should always try to check if the sub-problems needs renumbering.
174
175 coupledModels.resize(3);
177
178
179 if ( dtFunction < 1 ) {
180 ndomains = 0;
181 domainNeqs.clear();
182 domainPrescribedNeqs.clear();
183 domainList.clear();
184 }
185
187
188 if ( suppressOutput ) {
189 printf("Suppressing output.\n");
190 } else {
191
192 if ( ( outputStream = fopen(this->dataOutputFileName.c_str(), "w") ) == NULL ) {
193 throw ValueInputException(ir, "None", "can't open output file: " + this->dataOutputFileName);
194 }
195
196 fprintf(outputStream, "%s", PRG_HEADER);
197 fprintf(outputStream, "\nStarting analysis on: %s\n", ctime(& this->startTime) );
198 fprintf(outputStream, "%s\n", simulationDescription.c_str());
199
200#ifdef __MPI_PARALLEL_MODE
201 if ( this->isParallel() ) {
202 fprintf(outputStream, "Problem rank is %d/%d on %s\n\n", this->rank, this->numProcs, this->processor_name);
203 }
204#endif
205 }
206}
207
208
209void
210StaggeredProblem :: updateAttributes(MetaStep *mStep)
211{
212 auto &ir = mStep->giveAttributesRecord();
213
214 EngngModel :: updateAttributes(mStep);
215
216 // update attributes of slaves
217 for ( auto &emodel: emodelList ) {
218 emodel->updateAttributes(mStep);
219 }
220
221 if ( !timeDefinedByProb ) {
222 if ( ir.hasField(_IFT_StaggeredProblem_deltat) ) {
226 if ( stepMultiplier < 0 ) {
227 OOFEM_ERROR("stepMultiplier must be > 0")
228 }
229 } else if ( ir.hasField(_IFT_StaggeredProblem_prescribedtimes) ) {
231 }
232 }
233}
234
235Function *StaggeredProblem :: giveDtFunction()
236// Returns the load-time function of the receiver.
237{
238 if ( !dtFunction ) {
239 return NULL;
240 }
241
242 return giveDomain(1)->giveFunction(dtFunction);
243}
244
245double
246StaggeredProblem :: giveDeltaT(int n)
247{
248 if ( giveDtFunction() ) {
249 return giveDtFunction()->evaluateAtTime(n);
250 }
251
252 //in the first step the time increment is taken as the initial, user-specified value
253 if ( stepMultiplier != 1 && currentStep ) {
254 if ( currentStep->giveNumber() >= 2 ) {
255 return ( currentStep->giveTargetTime() * ( stepMultiplier ) );
256 }
257 }
258
259 if ( discreteTimes.giveSize() > 0 ) {
260 return this->giveDiscreteTime(n) - this->giveDiscreteTime(n - 1);
261 }
262
263 if ( adaptiveStepLength ) {
264 EngngModel *sp;
265 int nite = 1;
266 double adjustedDeltaT = deltaT;
267
268 if ( currentStep != NULL ) {
269 if ( currentStep->giveNumber() != 0 ) {
270 // return prescribed deltaT for times until time = adaptiveStepSince
271 // can be used for consecutive force loading applied in a specified number of steps
272 if ( !( currentStep->giveTargetTime() > this->adaptiveStepSince ) ) {
273 return adjustedDeltaT;
274 }
275
276 for ( int i = 1; i <= this->giveNumberOfSlaveProblems(); i++ ) {
277 sp = this->giveSlaveProblem(i);
278 nite = max(sp->giveCurrentNumberOfIterations(), nite);
279 }
280
281 if ( nite > reqIterations ) {
282 adjustedDeltaT = this->prevStepLength * reqIterations / nite;
283 } else {
284 adjustedDeltaT = this->prevStepLength * sqrt( sqrt( ( double ) reqIterations / ( double ) nite ) );
285 }
286
287 if ( adjustedDeltaT > maxStepLength ) {
288 adjustedDeltaT = maxStepLength;
289 }
290
291 if ( adjustedDeltaT < minStepLength ) {
292 adjustedDeltaT = minStepLength;
293 }
294 }
295 }
296
297 this->currentStepLength = adjustedDeltaT;
298
299 return adjustedDeltaT;
300 }
301
302 return deltaT;
303}
304
305double
306StaggeredProblem :: giveDiscreteTime(int iStep)
307{
308 if ( ( iStep > 0 ) && ( iStep <= discreteTimes.giveSize() ) ) {
309 return ( discreteTimes.at(iStep) );
310 }
311
312 if ( ( iStep == 0 ) && ( iStep <= discreteTimes.giveSize() ) ) {
313 return ( 0.0 );
314 }
315
316 OOFEM_ERROR("invalid iStep");
317}
318
319TimeStep *
320StaggeredProblem :: giveCurrentStep(bool force)
321{
322 if ( timeDefinedByProb ) {
323 return emodelList [ timeDefinedByProb - 1 ].get()->giveCurrentStep(true);
324 } else {
325 return EngngModel :: giveCurrentStep();
326 }
327}
328
329TimeStep *
330StaggeredProblem :: givePreviousStep(bool force)
331{
332 if ( timeDefinedByProb ) {
333 return emodelList [ timeDefinedByProb - 1 ].get()->givePreviousStep(true);
334 } else {
335 return EngngModel :: givePreviousStep();
336 }
337}
338
339TimeStep *
340StaggeredProblem :: giveSolutionStepWhenIcApply(bool force)
341{
342 if ( timeDefinedByProb ) {
343 return emodelList [ timeDefinedByProb - 1 ].get()->giveSolutionStepWhenIcApply(true);
344 } else {
345 if ( !stepWhenIcApply ) {
346 int nFirst = giveNumberOfFirstStep();
347 //stepWhenIcApply = std::make_unique<TimeStep>(giveNumberOfTimeStepWhenIcApply(), this, 0, -giveDeltaT(nFirst), giveDeltaT(nFirst), 0); //previous version for [-dt, 0]
348 stepWhenIcApply = std::make_unique<TimeStep>(giveNumberOfTimeStepWhenIcApply(), this, 0, 0., giveDeltaT(nFirst), 0); //now go from [0, dt]
349 }
350
351 return stepWhenIcApply.get();
352 }
353}
354
355
357StaggeredProblem :: giveTimeControl(){
358 if ( !timeDefinedByProb ) {
359 return this;
360 } else { //time dictated by slave problem
362 }
363}
364
365
366int
367StaggeredProblem :: giveNumberOfFirstStep(bool force)
368{
369 if ( timeDefinedByProb && !force) {
370 return emodelList [ timeDefinedByProb - 1 ].get()->giveNumberOfFirstStep(true);
371 } else {
372 return EngngModel :: giveNumberOfFirstStep(force);
373 }
374}
375
376
377TimeStep *
378StaggeredProblem :: giveNextStep()
379{
380 int istep = this->giveNumberOfFirstStep();
381 double totalTime = 0;
382 StateCounterType counter = 1;
383
384 if ( !currentStep ) {
385 // first step -> generate initial step
386 currentStep = std::make_unique<TimeStep>( *giveSolutionStepWhenIcApply() );
387 }
388
389 double dt = this->giveDeltaT(currentStep->giveNumber()+1);
390 istep = currentStep->giveNumber() + 1;
391 totalTime = currentStep->giveTargetTime() + this->giveDeltaT(istep);
392 counter = currentStep->giveSolutionStateCounter() + 1;
393 previousStep = std :: move(currentStep);
394 currentStep = std::make_unique<TimeStep>(*previousStep, dt);
395
396 if ( ( totalTime >= this->endOfTimeOfInterest ) && this->adaptiveStepLength ) {
397 totalTime = this->endOfTimeOfInterest;
398 OOFEM_LOG_INFO("\n==================================================================\n");
399 OOFEM_LOG_INFO( "\nAdjusting time step length to: %lf \n\n", totalTime - previousStep->giveTargetTime() );
400 currentStep = std::make_unique<TimeStep>(istep, this, 1, totalTime, totalTime - previousStep->giveTargetTime(), counter);
401 this->numberOfSteps = istep;
402 } else {
403 if ( this->adaptiveStepLength ) {
404 OOFEM_LOG_INFO("\n==================================================================\n");
405 OOFEM_LOG_INFO( "\nAdjusting time step length to: %lf \n\n", totalTime - previousStep->giveTargetTime() );
406 }
407 currentStep = std::make_unique<TimeStep>(istep, this, 1, totalTime, totalTime - previousStep->giveTargetTime(), counter);
408 }
409
410 // time and dt variables are set eq to 0 for statics - has no meaning
411 return currentStep.get();
412}
413
414
415void
416StaggeredProblem :: solveYourself()
417{
418 EngngModel *sp;
419 sp = giveTimeControl();
420
421 int smstep = 1, sjstep = 1;
422 this->timer.startTimer(EngngModelTimer :: EMTT_AnalysisTimer);
423
424 if ( sp->giveCurrentStep() ) {
425 smstep = sp->giveCurrentStep()->giveMetaStepNumber();
426 sjstep = sp->giveMetaStep(smstep)->giveStepRelativeNumber( sp->giveCurrentStep()->giveNumber() ) + 1;
427 }
428
429 for ( int imstep = smstep; imstep <= sp->giveNumberOfMetaSteps(); imstep++ ) { //loop over meta steps
430 MetaStep *activeMStep = sp->giveMetaStep(imstep);
431 // update state according to new meta step in all slaves
432 this->initMetaStepAttributes(activeMStep);
433
434 int nTimeSteps = activeMStep->giveNumberOfSteps();
435 for ( int jstep = sjstep; jstep <= nTimeSteps; jstep++ ) { //loop over time steps
436 this->timer.startTimer(EngngModelTimer :: EMTT_SolutionStepTimer);
437 this->timer.initTimer(EngngModelTimer :: EMTT_NetComputationalStepTimer);
439 sp->giveNextStep();
440
441 // renumber equations if necessary. Ensure to call forceEquationNumbering() for staggered problems
442 if ( this->requiresEquationRenumbering( sp->giveCurrentStep() ) ) {
444 }
445
446 this->initializeYourself( sp->giveCurrentStep() );
447 this->solveYourselfAt( sp->giveCurrentStep() );
448 this->updateYourself( sp->giveCurrentStep() );
449 this->timer.stopTimer(EngngModelTimer :: EMTT_SolutionStepTimer);
450 double _steptime = this->timer.getUtime(EngngModelTimer :: EMTT_SolutionStepTimer);
451 sp->giveCurrentStep()->solutionTime = _steptime;
452
453 this->terminate( sp->giveCurrentStep() );
454
455 OOFEM_LOG_INFO("EngngModel info: user time consumed by solution step %d: %.2fs\n",
456 sp->giveCurrentStep()->giveNumber(), _steptime);
457
458 if(!suppressOutput) {
459 fprintf(this->giveOutputStream(), "\nUser time consumed by solution step %d: %.3f [s]\n\n",
460 sp->giveCurrentStep()->giveNumber(), _steptime);
461 }
462
463#ifdef __MPI_PARALLEL_MODE
464 if ( loadBalancingFlag ) {
465 this->balanceLoad( sp->giveCurrentStep() );
466 }
467
468#endif
469
470 if ( ( sp->giveCurrentStep()->giveTargetTime() >= this->endOfTimeOfInterest ) && this->adaptiveStepLength ) {
471 break;
472 }
473 }
474 }
475}
476
477void
478StaggeredProblem :: solveYourselfAt(TimeStep *tStep)
479{
480#ifdef VERBOSE
481 OOFEM_LOG_RELEVANT("Solving [step number %5d, time %e]\n", tStep->giveNumber(), tStep->giveTargetTime());
482#endif
483 for ( auto &emodel: emodelList ) {
484 emodel->solveYourselfAt(tStep);
485 }
486
487 tStep->incrementStateCounter();
488}
489
490int
491StaggeredProblem :: forceEquationNumbering()
492{
493 int neqs = 0;
494 for ( auto &emodel: emodelList ) {
495 // renumber equations if necessary
496 if ( emodel->requiresEquationRenumbering( emodel->giveCurrentStep() ) ) {
497 neqs += emodel->forceEquationNumbering();
498 }
499 }
500
501 return neqs;
502}
503
504void
505StaggeredProblem :: updateYourself(TimeStep *tStep)
506{
507 if ( adaptiveStepLength ) {
508 this->prevStepLength = this->currentStepLength;
509 }
510
511 for ( auto &emodel: emodelList ) {
512 emodel->updateYourself(tStep);
513 }
514
515 EngngModel :: updateYourself(tStep);
516}
517
518void
519StaggeredProblem :: terminate(TimeStep *tStep)
520{
521 for ( auto &emodel: emodelList ) {
522 emodel->terminate(tStep);
523 }
524}
525
526void
527StaggeredProblem :: doStepOutput(TimeStep *tStep)
528{
529 for ( auto &emodel: emodelList ) {
530 emodel->giveExportModuleManager()->doOutput(tStep);
531 }
532}
533
534
535void
536StaggeredProblem :: printOutputAt(FILE *file, TimeStep *tStep)
537{
538 // Subproblems handle the output themselves.
539}
540
541
542void
543StaggeredProblem :: saveContext(DataStream &stream, ContextMode mode)
544{
545 EngngModel :: saveContext(stream, mode);
546 for ( auto &emodel: emodelList ) {
547 emodel->saveContext(stream, mode);
548 }
549}
550
551
552void
553StaggeredProblem :: restoreContext(DataStream &stream, ContextMode mode)
554{
555 EngngModel :: restoreContext(stream, mode);
556 for ( auto &emodel: this->emodelList ) {
557 emodel->restoreContext(stream, mode);
558 }
559}
560
561
563StaggeredProblem :: giveSlaveProblem(int i)
564{
565 if ( ( i > 0 ) && ( i <= this->giveNumberOfSlaveProblems() ) ) {
566 return this->emodelList [ i - 1 ].get();
567 } else {
568 OOFEM_ERROR("Undefined problem");
569 }
570
571 // return NULL;
572}
573
574
575int
576StaggeredProblem :: checkProblemConsistency()
577{
578 // check internal consistency
579 // if success returns nonzero
580 int result = 1;
581 for ( auto &emodel: emodelList ) {
582 result &= emodel->checkProblemConsistency();
583 }
584
585# ifdef VERBOSE
586 if ( result ) {
587 OOFEM_LOG_DEBUG("Consistency check: OK\n");
588 } else {
589 VERBOSE_PRINTS("Consistency check", "failed")
590 exit(1);
591 }
592
593# endif
594
595 return result;
596}
597
598void
599StaggeredProblem :: updateDomainLinks()
600{
601 for ( auto &emodel: emodelList ) {
602 emodel->updateDomainLinks();
603 }
604}
605
606void
607StaggeredProblem :: setRenumberFlag()
608{
609 for ( auto &emodel: emodelList ) {
610 emodel->setRenumberFlag();
611 }
612}
613
614#ifdef __OOFEG
615void StaggeredProblem :: drawYourself(oofegGraphicContext &gc)
616{
617 int ap = gc.getActiveProblemIndx();
618 if ( ( ap > 0 ) && ( ap <= giveNumberOfSlaveProblems() ) ) {
619 this->giveSlaveProblem(ap)->drawYourself(gc);
620 }
621}
622
623void StaggeredProblem :: drawElements(oofegGraphicContext &gc)
624{
625 int ap = gc.getActiveProblemIndx();
626 if ( ( ap > 0 ) && ( ap <= giveNumberOfSlaveProblems() ) ) {
627 this->giveSlaveProblem(ap)->drawElements(gc);
628 }
629}
630
631void StaggeredProblem :: drawNodes(oofegGraphicContext &gc)
632{
633 int ap = gc.getActiveProblemIndx();
634 if ( ( ap > 0 ) && ( ap <= giveNumberOfSlaveProblems() ) ) {
635 this->giveSlaveProblem(ap)->drawNodes(gc);
636 }
637}
638#endif
639} // end namespace oofem
#define REGISTER_EngngModel(class)
int giveNumberOfTimeStepWhenIcApply()
Returns the time step number, when initial conditions should apply.
Definition engngm.h:787
std ::vector< std ::unique_ptr< Domain > > domainList
List of problem domains.
Definition engngm.h:217
virtual void preInitializeNextStep()
Does a pre-initialization of the next time step (implement if necessarry).
Definition engngm.h:749
int numProcs
Total number of collaborating processes.
Definition engngm.h:291
virtual int giveCurrentNumberOfIterations()
Definition engngm.h:579
virtual void balanceLoad(TimeStep *tStep)
Definition engngm.C:2238
int rank
Domain rank in a group of collaborating processes (0..groupSize-1).
Definition engngm.h:289
virtual TimeStep * giveCurrentStep(bool force=false)
Definition engngm.h:717
std::string dataOutputFileName
Path to output stream.
Definition engngm.h:248
std::string simulationDescription
Definition engngm.h:339
virtual TimeStep * giveNextStep()
Returns next time step (next to current step) of receiver.
Definition engngm.h:747
bool renumberFlag
Renumbering flag (renumbers equations after each step, necessary if Dirichlet BCs change).
Definition engngm.h:229
EngngModel(int i, EngngModel *_master=NULL)
Definition engngm.C:99
std ::unique_ptr< TimeStep > previousStep
Previous time step.
Definition engngm.h:243
char processor_name[PROCESSOR_NAME_LENGTH]
Processor name.
Definition engngm.h:296
int ndomains
Number of receiver domains.
Definition engngm.h:215
int numberOfSteps
Total number of time steps.
Definition engngm.h:219
Domain * giveDomain(int n)
Definition engngm.C:1936
std ::unique_ptr< TimeStep > currentStep
Current time step.
Definition engngm.h:241
bool loadBalancingFlag
If set to true, load balancing is active.
Definition engngm.h:307
FILE * giveOutputStream()
Returns file descriptor of output file.
Definition engngm.C:1994
time_t startTime
Solution start time.
Definition engngm.h:271
MetaStep * giveMetaStep(int i)
Returns the i-th meta step.
Definition engngm.h:773
EngngModelTimer timer
E-model timer.
Definition engngm.h:279
problemMode pMode
Domain mode.
Definition engngm.h:267
ContextOutputMode contextOutputMode
Domain context output mode.
Definition engngm.h:256
void initMetaStepAttributes(MetaStep *mStep)
Definition engngm.h:677
int giveNumberOfMetaSteps()
Return number of meta steps.
Definition engngm.h:771
bool suppressOutput
Flag for suppressing output to file.
Definition engngm.h:337
FILE * outputStream
Output stream.
Definition engngm.h:252
bool isParallel() const
Returns true if receiver in parallel mode.
Definition engngm.h:1152
std ::unique_ptr< TimeStep > stepWhenIcApply
Solution step when IC (initial conditions) apply.
Definition engngm.h:239
virtual bool requiresEquationRenumbering(TimeStep *tStep)
Definition engngm.h:915
IntArray domainPrescribedNeqs
Number of prescribed equations per domain.
Definition engngm.h:227
IntArray domainNeqs
Number of equations per domain.
Definition engngm.h:225
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
int giveStepRelativeNumber(int stepNumber)
Returns the step relative number to receiver.
Definition metastep.h:134
int giveNumberOfSteps()
Returns number of Steps it represent.
Definition metastep.h:118
InputRecord & giveAttributesRecord()
Returns e-model attributes.
Definition metastep.h:122
double minStepLength
adaptive time step length - minimum
int forceEquationNumbering() override
std ::vector< std ::string > inputStreamNames
int dtFunction
Associated time function for time step increment.
EngngModel * giveSlaveProblem(int i) override
Returns i-th slave problem.
IntArray coupledModels
List of slave models to which this model is coupled.
int timeDefinedByProb
Optional parameter which specify problems to define load time functions.
double reqIterations
adaptive time step length - required (=optimum) number of iterations
void updateYourself(TimeStep *tStep) override
void solveYourselfAt(TimeStep *tStep) override
double maxStepLength
adaptive time step length - maximum
FloatArray discreteTimes
Specified times where the problem is solved.
int giveNumberOfSlaveProblems() override
Returns number of slave problems.
int giveNumberOfFirstStep(bool force=false) override
void initializeYourself(TimeStep *tStep) override
double adaptiveStepSince
adaptive time step length applies after prescribed time
void terminate(TimeStep *tStep) override
std ::vector< std ::unique_ptr< EngngModel > > emodelList
List of engineering models to solve sequentially.
TimeStep * giveSolutionStepWhenIcApply(bool force=false) override
int giveMetaStepNumber()
Returns receiver's meta step number.
Definition timestep.h:150
void incrementStateCounter()
Updates solution state counter.
Definition timestep.h:213
double giveTargetTime()
Returns target time.
Definition timestep.h:164
int giveNumber()
Returns receiver's number.
Definition timestep.h:144
double solutionTime
time step solution time in seconds
Definition timestep.h:122
#define _IFT_EngngModel_nsteps
Definition engngm.h:78
#define _IFT_EngngModel_suppressOutput
Definition engngm.h:94
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
#define OOFEM_LOG_INFO(...)
Definition logger.h:143
#define OOFEM_LOG_RELEVANT(...)
Definition logger.h:142
#define OOFEM_LOG_DEBUG(...)
Definition logger.h:144
long ContextMode
Definition contextmode.h:43
long StateCounterType
StateCounterType type used to indicate solution state.
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
std::unique_ptr< EngngModel > InstanciateProblem(DataReader &dr, problemMode mode, int contextFlag, EngngModel *_master, bool parallelFlag)
Definition util.C:153
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
OOFEM_EXPORT const char * PRG_HEADER
Definition oofemcfg.C:22
#define _IFT_StaggeredProblem_prob1
#define _IFT_StaggeredProblem_coupling
#define _IFT_StaggeredProblem_deltat
#define _IFT_StaggeredProblem_maxsteplength
#define _IFT_StaggeredProblem_stepmultiplier
#define _IFT_StaggeredProblem_minsteplength
#define _IFT_StaggeredProblem_reqiterations
#define _IFT_StaggeredProblem_adaptiveStepLength
#define _IFT_StaggeredProblem_endoftimeofinterest
#define _IFT_StaggeredProblem_timeDefinedByProb
#define _IFT_StaggeredProblem_prescribedtimes
#define _IFT_StaggeredProblem_prob3
#define _IFT_StaggeredProblem_adaptivestepsince
#define _IFT_StaggeredProblem_prob2
#define _IFT_StaggeredProblem_dtf
#define VERBOSE_PRINTS(str, str1)
Definition verbose.h:55

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011