69#ifdef __MPI_PARALLEL_MODE
78#define _IFT_EngngModel_nsteps "nsteps"
79#define _IFT_EngngModel_contextoutputstep "contextoutputstep"
80#define _IFT_EngngModel_renumberFlag "renumber"
81#define _IFT_EngngModel_profileOpt "profileopt"
82#define _IFT_EngngModel_nmsteps "nmsteps"
83#define _IFT_EngngModel_nonLinFormulation "nonlinform"
84#define _IFT_EngngModel_eetype "eetype"
85#define _IFT_EngngModel_parallelflag "parallelflag"
86#define _IFT_EngngModel_loadBalancingFlag "lbflag"
87#define _IFT_EngngModel_forceloadBalancingFlag "forcelb1"
88#define _IFT_EngngModel_initialGuess "initialguess"
89#define _IFT_EngngModel_referenceFile "referencefile"
91#define _IFT_EngngModel_lstype "lstype"
92#define _IFT_EngngModel_smtype "smtype"
94#define _IFT_EngngModel_suppressOutput "suppress_output"
107class MaterialInterface;
109class NumericalMethod;
110class InitModuleManager;
111class ExportModuleManager;
115class LoadBalancerMonitor;
116class oofegGraphicContext;
117class ProblemCommunicator;
118class ProcessCommunicatorBuff;
119class CommunicatorBuff;
120class ProcessCommunicator;
121class UnknownNumberingScheme;
294#ifdef __MPI_PARALLEL_MODE
304 std::unique_ptr<LoadBalancer>
lb;
305 std::unique_ptr<LoadBalancerMonitor>
lbm;
328 std :: map< std :: string, std::unique_ptr< Variable > > variableMap;
329 std :: vector < std :: unique_ptr< Term > > termList;
330 std :: vector < std :: unique_ptr< Integral > > integralList;
381 FILE *giveOutputStream();
398 void letOutputBaseFileNameBe(
const std :: string &src);
424 double giveDeltaT(){
return this->timeStepController->giveDeltaT();}
426 void setDeltaT(
double dT){
return this->timeStepController->setDeltaT(dT);}
438 void setParallelMode(
bool newParallelFlag);
456 double giveSolutionStepTime();
460 void giveAnalysisTime(
int &rhrs,
int &rmin,
int &rsec,
int &uhrs,
int &umin,
int &usec);
464 void terminateAnalysis();
473 virtual void solveYourself();
489 virtual void terminate(
TimeStep *tStep);
495 virtual void doStepOutput(
TimeStep *tStep);
505 virtual void updateYourself(
TimeStep *tStep);
515 virtual void initializeYourself(
TimeStep *tStep);
574 int exchangeRemoteElementData(
int ExchangeTag);
581#ifdef __MPI_PARALLEL_MODE
635 void initializeCommMaps(
bool forceInit =
false);
641 virtual int instanciateYourself(
DataReader &dr,
InputRecord &ir,
const char *outFileName,
const char *desc);
648 void Instanciate_init();
660 virtual int instanciateDefaultMetaStep(
InputRecord &ir);
671 virtual void updateAttributes(
MetaStep *mStep);
678 this->timeStepController->initMetaStepAttributes(mStep);
711 virtual void updateDomainLinks();
718 if (
master && (!force)) {
719 return master->giveCurrentStep();
739 if (
master && (!force)) {
740 return master->givePreviousStep();
754 if (
master && (!force)) {
755 return master->giveSolutionStepWhenIcApply();
764 if (
master && (!force)) {
765 return master->giveNumberOfFirstStep();
778 if (
master && (!force)) {
779 return master->giveNumberOfSteps();
827 std :: string giveContextFileName(
int tStepNumber,
int stepVersion)
const;
833 std :: string giveDomainFileName(
int domainNum,
int domainSerNum)
const;
869 virtual void initStepIncrements();
878 virtual int forceEquationNumbering(
int i);
888 virtual int forceEquationNumbering();
947 virtual void initParallelContexts();
1042 std :: vector < std :: unique_ptr< Integral > > & giveIntegralList() {
1043 return this->integralList;
1045 void addIntegral (std :: unique_ptr< Integral > obj) {
1046 integralList.push_back(std::move(obj));
1049 void py_addIntegral(Integral *obj) {
1050 std::size_t size = integralList.size();
1051 integralList.resize(size+1);
1052 integralList[size].reset(obj);
1054 const Variable* giveVariableByName (std::string name) {
1055 if(variableMap.find(name)==variableMap.end())
OOFEM_ERROR(
"Unknown MPM variable '%s'",name.c_str());
1056 return variableMap[name].get();
1059 const Term* giveTerm (
int indx) {
1061 if(indx<1 || (
int)termList.size()<indx)
OOFEM_ERROR(
"MPM term number %d outside of valid range 1..%d",indx,(
int)termList.size());
1062 return termList[indx-1].get();
1066 int instanciateMPM (DataReader &dr, InputRecord &ir);
1096 virtual int checkProblemConsistency();
1101 virtual void init();
1106 virtual void postInitialize();
1112 virtual void printOutputAt(FILE *file,
TimeStep *tStep);
1121 void outputNodes(FILE *file,
Domain &domain,
TimeStep *tStep,
int setNum);
1129 void outputElements(FILE *file,
Domain &domain,
TimeStep *tStep,
int setNum);
1133 void printYourself();
1143 virtual void printDofOutputAt(FILE *stream,
Dof *iDof,
TimeStep *tStep);
1196#ifdef __MPI_PARALLEL_MODE
1204 virtual void balanceLoad(
TimeStep *tStep);
1211 void initParallel();
1229#ifdef _PYBIND_BINDINGS
1230 void setNumberOfDomains(
const int& i) {this->ndomains=i;}
1231 const int& getNumberOfDomains()
const {
return this->ndomains;}
1235 std :: string
errorInfo(
const char *func)
const;
FieldManager * giveFieldManager()
FieldManager fieldManager
Common fieldManager providing shared field register for the problem.
int giveNumberOfTimeStepWhenIcApply()
Returns the time step number, when initial conditions should apply.
EngngModelContext * context
Context.
int giveContextOutputStep() const
virtual void showSparseMtrxStructure(int type, oofegGraphicContext &gc, TimeStep *tStep)
int parallelFlag
Flag indicating that the receiver runs in parallel.
problemScale giveProblemScale() const
Returns scale in multiscale simulation.
std::unique_ptr< LoadBalancer > lb
Load Balancer.
virtual int giveNewPrescribedEquationNumber(int domain, DofIDItem)
std ::vector< std ::unique_ptr< Domain > > domainList
List of problem domains.
enum fMode nonLinFormulation
Type of non linear formulation (total or updated formulation).
void setContextOutputMode(ContextOutputMode contextMode)
std::unique_ptr< TimeStepController > timeStepController
Time Step controller is responsible for collecting data from analysis, elements, and materials,...
void setProblemMode(problemMode pmode)
virtual EngngModel * giveSlaveProblem(int i)
Returns i-th slave problem.
virtual void preInitializeNextStep()
Does a pre-initialization of the next time step (implement if necessarry).
virtual LoadBalancer * giveLoadBalancer()
bool force_load_rebalance_in_first_step
Debug flag forcing load balancing after first step.
EngngModel(const EngngModel &)=delete
double giveDeltaT()
Returns time step size from the time step controlelr.
int numberOfEquations
Total number of equation in current time step.
virtual void setRenumberFlag()
Sets the renumber flag to true.
int numProcs
Total number of collaborating processes.
virtual int giveCurrentNumberOfIterations()
int rank
Domain rank in a group of collaborating processes (0..groupSize-1).
MPI_Comm comm
Communication object for this engineering model.
virtual TimeStep * giveCurrentStep(bool force=false)
std::string giveOutputBaseFileName()
int giveNumberOfProcesses() const
Returns the number of collaborating processes.
std::string dataOutputFileName
Path to output stream.
virtual FieldPtr giveField(FieldType key, TimeStep *)
virtual LoadBalancerMonitor * giveLoadBalancerMonitor()
int giveRank() const
Returns domain rank in a group of collaborating processes (0..groupSize-1).
void setNumberOfEquations(int id, int neq)
TimeStepController * giveTimeStepController()
Returns the time step controller.
ExportModuleManager * giveExportModuleManager()
Returns receiver's export module manager.
ProblemCommunicator * communicator
Communicator.
std::string simulationDescription
virtual TimeStep * giveNextStep()
Returns next time step (next to current step) of receiver.
EngngModel * giveEngngModel()
Returns reference to itself -> required by communicator.h.
virtual double giveUnknownComponent(ValueModeType, TimeStep *, Domain *, Dof *)
EngngModelContext * giveContext()
Context requesting service.
bool renumberFlag
Renumbering flag (renumbers equations after each step, necessary if Dirichlet BCs change).
@ IG_None
No special treatment for new iterations. Probably means ending up using for all free dofs.
@ IG_Tangent
Solves an approximated tangent problem from the last iteration. Useful for changing Dirichlet boundar...
EngngModel * giveMasterEngngModel()
Returns the master engnmodel.
EngngModel(int i, EngngModel *_master=NULL)
std ::unique_ptr< TimeStep > previousStep
Previous time step.
int giveNumberOfDomains()
Returns number of domains in problem.
virtual void adaptTimeStep(double nIter)
ContextOutputMode giveContextOutputMode() const
std::string coreOutputFileName
String with core output file name.
virtual NumericalMethod * giveNumericalMethod(MetaStep *mStep)
Returns reference to receiver's numerical method.
int equationNumberingCompleted
Equation numbering completed flag.
bool profileOpt
Profile optimized numbering flag (using Sloan's algorithm).
char processor_name[PROCESSOR_NAME_LENGTH]
Processor name.
virtual void updateDofUnknownsDictionary(DofManager *, TimeStep *)
std::string referenceFileName
String with reference file name.
int ndomains
Number of receiver domains.
virtual void solveYourselfAt(TimeStep *tStep)
ProblemCommunicator * nonlocCommunicator
NonLocal Communicator. Necessary when nonlocal constitutive models are used.
void setUDContextOutputMode(int cStep)
int numberOfSteps
Total number of time steps.
virtual int initializeAdaptive(int tStepNumber)
virtual int checkConsistency()
Domain * giveDomain(int n)
std ::unique_ptr< TimeStep > currentStep
Current time step.
const time_t & giveStartTime()
int nonlocalExt
Flag indicating if nonlocal extension active, which will cause data to be sent between shared element...
virtual void resetRenumberFlag()
Sets the renumber flag to false.
@ EngngModel_Unknown_Mode
bool loadBalancingFlag
If set to true, load balancing is active.
void setDomain(int i, Domain *ptr, bool iDeallocateOld=true)
virtual ErrorEstimator * giveDomainErrorEstimator(int n)
int giveNumberOfSteps(bool force=false)
time_t startTime
Solution start time.
virtual double giveLoadLevel()
Returns the current load level.
MetaStep * giveMetaStep(int i)
Returns the i-th meta step.
EngngModelTimer timer
E-model timer.
@ InternalForcesExchangeTag
@ RemoteElementExchangeTag
InitModuleManager initModuleManager
Initialization module manager.
std ::vector< ParallelContext > parallelContextList
List where parallel contexts are stored.
virtual double giveEigenValue(int eigNum)
Only relevant for eigen value analysis. Otherwise returns zero.
virtual double giveVariableScale(VarScaleType varId)
Returns the scale factor for given variable type.
virtual MaterialInterface * giveMaterialInterface(int n)
std ::vector< MetaStep > metaStepList
List of problem metasteps.
EngngModel & operator=(const EngngModel &)=delete
problemMode pMode
Domain mode.
void setProblemScale(problemScale pscale)
virtual TimeStep * givePreviousStep(bool force=false)
int nMetaSteps
Number of meta steps.
virtual int giveNumberOfSlaveProblems()
Returns number of slave problems.
virtual fMode giveFormulation()
bool giveSuppressOutput() const
void setDeltaT(double dT)
Returns time step size through the time step controlelr.
CommunicatorBuff * commBuff
Common Communicator buffer.
std::string giveReferenceFileName()
EngngModelTimer * giveTimer()
Returns reference to receiver timer (EngngModelTimer).
const std::string & giveDescription() const
ExportModuleManager exportModuleManager
Export module manager.
virtual int giveNewEquationNumber(int domain, DofIDItem)
ContextOutputMode contextOutputMode
Domain context output mode.
EngngModel * master
Master e-model; if defined receiver is in maintained (slave) mode.
virtual int useNonlocalStiffnessOption()
Returns nonzero if nonlocal stiffness option activated.
ProblemCommunicator * giveProblemCommunicator(EngngModelCommType t)
MPI_Comm giveParallelComm()
Returns the communication object of reciever.
virtual void unpackMigratingData(TimeStep *tStep)
std::unique_ptr< LoadBalancerMonitor > lbm
void initMetaStepAttributes(MetaStep *mStep)
virtual int requiresUnknownsDictionaryUpdate()
virtual void restartYourself(TimeStep *tS)
virtual TimeStep * giveSolutionStepWhenIcApply(bool force=false)
virtual int giveUnknownDictHashIndx(ValueModeType mode, TimeStep *tStep)
virtual bool giveEquationScalingFlag()
Returns the Equation scaling flag, which is used to indicate that governing equation(s) are scaled,...
int giveNumberOfMetaSteps()
Return number of meta steps.
virtual double giveEndOfTimeOfInterest()
Returns end of time interest (time corresponding to end of time integration).
bool suppressOutput
Flag for suppressing output to file.
MonitorManager monitorManager
Monitor manager.
FILE * outputStream
Output stream.
virtual int giveNumberOfFirstStep(bool force=false)
virtual bool isElementActivated(Element *e)
virtual void setActiveVector(int i)
Only relevant for eigen value analysis. Otherwise does noting.
virtual double giveInitialTime()
return time at the begining of analysis
virtual const char * giveClassName() const =0
Returns class name of the receiver.
bool isParallel() const
Returns true if receiver in parallel mode.
virtual double giveFinalTime()
std ::unique_ptr< TimeStep > stepWhenIcApply
Solution step when IC (initial conditions) apply.
problemMode giveProblemMode() const
Returns domain mode.
virtual bool requiresEquationRenumbering(TimeStep *tStep)
IntArray domainPrescribedNeqs
Number of prescribed equations per domain.
virtual bool isElementActivated(int elemNum)
std::unique_ptr< ErrorEstimator > defaultErrEstimator
Error estimator. Useful for adaptivity, or simply printing errors output.
int numberOfPrescribedEquations
Total number or prescribed equations in current time step.
virtual void packMigratingData(TimeStep *tStep)
problemScale pScale
Multiscale mode.
virtual bool newDofHandling()
virtual int estimateMaxPackSize(IntArray &commMap, DataStream &buff, int packUnpackType)
IntArray domainNeqs
Number of equations per domain.
std::string errorInfo(const char *func)
VarScaleType
Type determining the scale corresponding to particular variable.
FieldType
Physical type of field.
FloatArrayF< N > assemble(const FloatArrayF< M > &x, int const (&c)[M])
Assemble components into zero matrix.
@ COM_UserDefined
Input attribute of domain (each n-th step).
std::shared_ptr< Field > FieldPtr
problemScale
Corresponds to macro- and micro-problem in multiscale simulations.
oofem::oofegGraphicContext gc[OOFEG_LAST_LAYER]
#define PROCESSOR_NAME_LENGTH
Helper struct to pass array and numbering scheme as a single argument.
const UnknownNumberingScheme * numbering