OOFEM 3.0
Loading...
Searching...
No Matches
staticstructural.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
38#include "dofmanager.h"
39#include "set.h"
40#include "timestep.h"
41#include "sparsemtrx.h"
42#include "nummet.h"
43#include "nrsolver.h"
44#include "staggeredsolver.h"
46#include "primaryfield.h"
48#include "verbose.h"
49#include "error.h"
51#include "boundarycondition.h"
52#include "activebc.h"
53#include "datastream.h"
54#include "contextioerr.h"
55#include "classfactory.h"
56#include "assemblercallback.h"
57#include "maskedprimaryfield.h"
58
59
60#ifdef __MPI_PARALLEL_MODE
61 #include "problemcomm.h"
62 #include "communicator.h"
63#endif
64
65namespace oofem {
67
68StaticStructural :: StaticStructural(int i, EngngModel *master) : StructuralEngngModel(i, master),
70 eNorm(),
72 solverType(),
73 stiffMode(TangentStiffness),
74 loadLevel(0.),
75 deltaT(1.),
77{
78 ndomains = 1;
79}
80
81
82StaticStructural :: ~StaticStructural()
83{
84}
85
86
87NumericalMethod *StaticStructural :: giveNumericalMethod(MetaStep *mStep)
88{
89 if ( !nMethod ) {
90 nMethod = classFactory.createNonLinearSolver(this->solverType.c_str(), this->giveDomain(1), this);
91 if ( !nMethod ) {
92 OOFEM_ERROR("Failed to create solver (%s).", this->solverType.c_str());
93 }
94 }
95 return nMethod.get();
96}
97
98int
99StaticStructural :: giveUnknownDictHashIndx(ValueModeType mode, TimeStep *tStep)
100{
101 return tStep->giveNumber() % 2;
102}
103
104void
105StaticStructural :: initializeFrom(InputRecord &ir)
106{
107 StructuralEngngModel :: initializeFrom(ir);
108
109 int val = SMT_Skyline;
112
113 prescribedTimes.clear();
115 if ( prescribedTimes.giveSize() > 0 ) {
116 numberOfSteps = prescribedTimes.giveSize();
117 } else {
118 this->deltaT = 1.0;
120 }
121
122 this->solverType = "nrsolver";
124 nMethod = nullptr;
125
126 int tmp = TangentStiffness; // Default TangentStiffness
128 this->stiffMode = (MatResponseMode)tmp;
129
130 int _val = IG_Tangent;
132 this->initialGuessType = ( InitialGuess ) _val;
133
135
136#ifdef __MPI_PARALLEL_MODE
138 if ( isParallel() ) {
139 delete communicator;
140 delete commBuff;
142 communicator = new NodeCommunicator(this, commBuff, this->giveRank(),
143 this->giveNumberOfProcesses());
144
146 nonlocalExt = 1;
148 this->giveNumberOfProcesses());
149 }
150 }
151
152#endif
153
154 this->field = std::make_unique<DofDistributedPrimaryField>(this, 1, FT_Displacements, 0);
155}
156
157
158void
159StaticStructural :: updateAttributes(MetaStep *mStep)
160{
161 MetaStep *mStep1 = this->giveMetaStep( mStep->giveNumber() ); //this line ensures correct input file in staggered problem
162 auto &ir = mStep1->giveAttributesRecord();
163
164 int val = SMT_Skyline;
167
168 prescribedTimes.clear();
169
170 std :: string s = "nrsolver";
172 if ( s.compare(this->solverType) ) {
173 this->solverType = s;
174 nMethod = nullptr;
175 }
176
177 int tmp = TangentStiffness; // Default TangentStiffness
179 this->stiffMode = (MatResponseMode)tmp;
180
181 int _val = IG_Tangent;
183 this->initialGuessType = ( InitialGuess ) _val;
184
186
187 EngngModel :: updateAttributes(mStep1);
188}
189
190
191
192double StaticStructural :: giveEndOfTimeOfInterest()
193{
194 if ( this->prescribedTimes.giveSize() > 0 )
195 return prescribedTimes.at(prescribedTimes.giveSize());
196 else
197 return this->deltaT * this->giveNumberOfSteps();
198}
199
200
201void StaticStructural :: solveYourself()
202{
204#ifdef __MPI_PARALLEL_MODE
205 if ( this->isParallel() ) {
206 #ifdef __VERBOSE_PARALLEL
207 // force equation numbering before setting up comm maps
208 OOFEM_LOG_INFO( "[process rank %d] neq is %d\n", this->giveRank(), this->giveNumberOfDomainEquations(1, EModelDefaultEquationNumbering()) );
209 #endif
210
211 // set up communication patterns
212 // needed only for correct shared rection computation
213 communicator->setUpCommunicationMaps(this, true);
214 if ( nonlocalExt ) {
215 nonlocCommunicator->setUpCommunicationMaps(this, true);
216 }
217 }
218#endif
219
220 StructuralEngngModel :: solveYourself();
221}
222
223
224void StaticStructural :: solveYourselfAt(TimeStep *tStep)
225{
226 int di = 1;
228
229 this->field->advanceSolution(tStep);
230 this->field->initialize(VM_Total, tStep, this->solution, EModelDefaultEquationNumbering() );
231 // contact
232 this->initForNewIteration(this->giveDomain(1),tStep,0, {});
233 //
234 this->solution_old = this->solution;
235 //
236 if ( !this->stiffnessMatrix ) {
237 this->stiffnessMatrix = classFactory.createSparseMtrx(sparseMtrxType);
238 if ( !this->stiffnessMatrix ) {
239 OOFEM_ERROR("Couldn't create requested sparse matrix of type %d", sparseMtrxType);
240 }
241
242 this->stiffnessMatrix->buildInternalStructure( this, di, EModelDefaultEquationNumbering() );
243 }
244 this->internalForces.resize(neq);
245
246 FloatArray incrementOfSolution(neq);
247 if ( this->initialGuessType == IG_Tangent ) {
248
249 if ( this->giveProblemScale() == macroScale ) {
250 OOFEM_LOG_RELEVANT("Computing initial guess\n");
251 }
252
253 FloatArray extrapolatedForces(neq);
254#if 1
255 this->assembleExtrapolatedForces( extrapolatedForces, tStep, TangentStiffnessMatrix, this->giveDomain(di) );
256#else
258 FloatArray incrementOfPrescribed;
259 this->field->initialize(VM_Incremental, tStep, incrementOfPrescribed, EModelDefaultEquationNumbering() );
260 this->assembleVector(extrapolatedForces, tStep, MatrixProductAssembler(TangentAssembler(TangentStiffness), incrementOfPrescribed),
261 VM_Unknown, EModelDefaultEquationNumbering(), this->giveDomain(di) );
262#endif
263 extrapolatedForces.negated();
265 //this->assembleVector(extrapolatedForces, tStep, LinearizedDilationForceAssembler(), VM_Incremental, EModelDefaultEquationNumbering(), this->giveDomain(di) );
266#if 0
267 // Some debug stuff:
268 extrapolatedForces.printYourself("extrapolatedForces");
269 this->internalForces.zero();
271 this->internalForces.printYourself("internal forces");
272#endif
273 if ( extrapolatedForces.computeNorm() > 0. ) {
274
275 if( this->giveProblemScale() == macroScale ) {
276 OOFEM_LOG_RELEVANT("Computing old tangent\n");
277 }
278
279 this->updateMatrix(*stiffnessMatrix, tStep, this->giveDomain(di));
280 SparseLinearSystemNM *linSolver = nMethod->giveLinearSolver();
281
282 if( this->giveProblemScale() == macroScale ) {
283 OOFEM_LOG_RELEVANT("Solving for increment\n");
284 }
285
286 linSolver->solve(*stiffnessMatrix, extrapolatedForces, incrementOfSolution);
287
288 if( this->giveProblemScale() == macroScale ) {
289 OOFEM_LOG_RELEVANT("Initial guess found\n");
290 }
291
292 this->solution.add(incrementOfSolution);
293 this->updateSolution(solution, tStep, this->giveDomain(di));
294 // needed in contact
295 this->initForNewIteration(this->giveDomain(di), tStep, 0, this->solution);
296
297 }
298 } else if ( this->initialGuessType != IG_None ) {
299 OOFEM_ERROR("Initial guess type: %d not supported", initialGuessType);
300 } else {
301 incrementOfSolution.zero();
302 }
303
304 // Build initial/external load
305 externalForces.resize(neq);
306 externalForces.zero();
307 this->assembleVector(externalForces, tStep, ExternalForceAssembler(), VM_Total,
310
311 // Build reference load (for CALM solver)
312 if ( this->nMethod->referenceLoad() ) {
313 // This check is pretty much only here as to avoid unnecessarily trying to integrate all the loads.
314 referenceForces.resize(neq);
315 referenceForces.zero();
316
320 }
321
322 if ( this->giveProblemScale() == macroScale ) {
323 OOFEM_LOG_INFO("\nStaticStructural :: solveYourselfAt - Solving Metastep %d, Step %d, Starting Time %e, Time Increment %e, Final Time %e, (neq = %d)\n",tStep->giveMetaStepNumber(), tStep->giveNumber(), tStep->giveIntrinsicTime() - tStep->giveTimeIncrement(), tStep->giveTimeIncrement(), tStep->giveIntrinsicTime(), neq);
324 }
325
326 int currentIterations;
327 ConvergedReason status;
328 if ( this->nMethod->referenceLoad() ) {
329 status = this->nMethod->solve(*this->stiffnessMatrix,
332 this->solution,
333 incrementOfSolution,
334 this->internalForces,
335 this->eNorm,
336 loadLevel,
337 SparseNonLinearSystemNM :: rlm_total,
338 currentIterations,
339 tStep);
340 } else {
341 status = this->nMethod->solve(*this->stiffnessMatrix,
343 nullptr,
344 this->solution,
345 incrementOfSolution,
346 this->internalForces,
347 this->eNorm,
348 loadLevel, // Only relevant for incrementalBCLoadVector?
349 SparseNonLinearSystemNM :: rlm_total,
350 currentIterations,
351 tStep);
352 }
353 if (status != CR_CONVERGED) {
354 OOFEM_WARNING("No success in solving problem at step %d", tStep->giveNumber());
355 }
356 tStep->numberOfIterations = currentIterations;
357 tStep->convergedReason = status;
358}
359
360void StaticStructural :: terminate(TimeStep *tStep)
361{
363 // Propagate cracks and recompute time step
366 } else {
367 // Propagate cracks at the end of the time step
370 }
371}
372
373
374void StaticStructural :: restartYourself(TimeStep *tStep)
375{
376 this->solution = this->solution_old;
377 this->field->update(VM_Total, tStep, this->solution_old, EModelDefaultEquationNumbering());
378}
379
380
381double StaticStructural :: giveUnknownComponent(ValueModeType mode, TimeStep *tStep, Domain *d, Dof *dof)
382{
383 if (mode == VM_Residual) {
384 // evaluate the residual of momentum balance for specific unknown
385 // evaluate the residual of momentum balance for specific unknown
386 int eq = dof->__giveEquationNumber();
387 if (eq && internalForces.isNotEmpty()) {
388 double ans = loadLevel*referenceForces.at(eq)-internalForces.at(eq);
389 if (externalForces.isNotEmpty()) {
390 ans += externalForces.at(eq);
391 }
392 return ans;
393 } else {
394 return 0.;
395 }
396 } else {
397 return this->field->giveUnknownValue(dof, mode, tStep);
398 }
399}
400
401
402void StaticStructural :: updateSolution(FloatArray &solutionVector, TimeStep *tStep, Domain *d)
403{
404 this->field->update(VM_Total, tStep, solutionVector, EModelDefaultEquationNumbering());
405}
406
407
408void StaticStructural :: updateInternalRHS(FloatArray &answer, TimeStep *tStep, Domain *d, FloatArray *eNorm)
409{
410 answer.zero();
411 this->assembleVector(answer, tStep, InternalForceAssembler(), VM_Total, EModelDefaultEquationNumbering(), d, eNorm);
413}
414
415
416void StaticStructural :: updateMatrix(SparseMtrx &mat, TimeStep *tStep, Domain *d)
417{
418 mat.zero();
420}
421
422
423void StaticStructural :: updateComponent(TimeStep *tStep, NumericalCmpn cmpn, Domain *d)
424{
425 if ( cmpn == InternalRhs ) {
426 // Updates the solution in case it has changed
427 this->field->update(VM_Total, tStep, this->solution, EModelDefaultEquationNumbering());
428
429 this->internalForces.zero();
430 this->assembleVector(this->internalForces, tStep, InternalForceAssembler(), VM_Total,
433
434 internalVarUpdateStamp = tStep->giveSolutionStateCounter(); // Hack for linearstatic
435 } else if ( cmpn == NonLinearLhs ) {
436 this->stiffnessMatrix->zero();
438 } else {
439 OOFEM_ERROR("Unknown component");
440 }
441}
442
443
444void
445StaticStructural :: computeExternalLoadReactionContribution(FloatArray &reactions, TimeStep *tStep, int di)
446{
447 if ( ( di == 1 ) && ( tStep == this->giveCurrentStep() ) ) {
449 reactions.zero();
450 this->assembleVector( reactions, tStep, ReferenceForceAssembler(), VM_Total,
452 reactions.times(loadLevel);
453 this->assembleVector( reactions, tStep, ExternalForceAssembler(), VM_Total,
455 } else {
456 OOFEM_ERROR("unable to respond due to invalid solution step or domain");
457 }
458}
459
460
461
462void StaticStructural :: saveContext(DataStream &stream, ContextMode mode)
463{
464 StructuralEngngModel :: saveContext(stream, mode);
465 this->field->saveContext(stream);
466}
467
468
469void StaticStructural :: restoreContext(DataStream &stream, ContextMode mode)
470{
471 StructuralEngngModel :: restoreContext(stream, mode);
472 this->field->restoreContext(stream);
473}
474
475
476void
477StaticStructural :: updateDomainLinks()
478{
479 EngngModel :: updateDomainLinks();
480 this->giveNumericalMethod( this->giveCurrentMetaStep() )->setDomain( this->giveDomain(1) );
481}
482
483
484int
485StaticStructural :: forceEquationNumbering()
486{
487 stiffnessMatrix = nullptr;
489}
490
491
492bool
493StaticStructural :: requiresEquationRenumbering(TimeStep *tStep)
494{
495 if ( tStep->isTheFirstStep() ) {
496 return true;
497 }
498 // Check if Dirichlet b.c.s has changed.
499 Domain *d = this->giveDomain(1);
500 for ( auto &gbc : d->giveBcs() ) {
501 ActiveBoundaryCondition *active_bc = dynamic_cast< ActiveBoundaryCondition * >(gbc.get());
502 BoundaryCondition *bc = dynamic_cast< BoundaryCondition * >(gbc.get());
503 // We only need to consider Dirichlet b.c.s
504 if ( bc || ( active_bc && ( active_bc->requiresActiveDofs() || active_bc->giveNumberOfInternalDofManagers() ) ) ) {
505 // Check of the dirichlet b.c. has changed in the last step (if so we need to renumber)
506 if ( gbc->isImposed(tStep) != gbc->isImposed(tStep->givePreviousStep()) ) {
507 return true;
508 }
509 }
510 }
511 return false;
512}
513
514int
515StaticStructural :: estimateMaxPackSize(IntArray &commMap, DataStream &buff, int packUnpackType)
516{
517 int count = 0, pcount = 0;
518 Domain *domain = this->giveDomain(1);
519
520 if ( packUnpackType == 0 ) {
521 for ( int map: commMap ) {
522 DofManager *dman = domain->giveDofManager( map );
523 for ( auto &dof: *dman ) {
524 if ( dof->isPrimaryDof() && dof->__giveEquationNumber() > 0 ) {
525 count++;
526 } else {
527 pcount++;
528 }
529 }
530 }
531
532 // --------------------------------------------------------------------------------
533 // only pcount is relevant here, since only prescribed components are exchanged !!!!
534 // --------------------------------------------------------------------------------
535
536 return ( buff.givePackSizeOfDouble(1) * pcount );
537 } else if ( packUnpackType == 1 ) {
538 for ( int map: commMap ) {
539 count += domain->giveElement( map )->estimatePackSize(buff);
540 }
541
542 return count;
543 }
544
545 return 0;
546}
547
548
551 if ( tStep != this->giveCurrentStep() ) {
552 OOFEM_ERROR("Unable to return field representation for non-current time step");
553 }
554 if ( key == FT_Displacements ) {
555 FieldPtr _ptr ( new MaskedPrimaryField ( key, this->field.get(), {D_u, D_v, D_w} ) );
556 return _ptr;
557 } else {
558 return FieldPtr();
559 }
560}
561
562} // end namespace oofem
#define REGISTER_EngngModel(class)
virtual bool requiresActiveDofs()
Definition activebc.h:151
virtual int givePackSizeOfDouble(std::size_t count)=0
virtual int __giveEquationNumber() const =0
std ::vector< std ::unique_ptr< GeneralBoundaryCondition > > & giveBcs()
Definition domain.h:349
DofManager * giveDofManager(int n)
Definition domain.C:317
Element * giveElement(int n)
Definition domain.C:165
int estimatePackSize(DataStream &buff)
Definition element.C:1748
virtual int forceEquationNumbering()
Definition engngm.C:534
problemScale giveProblemScale() const
Returns scale in multiscale simulation.
Definition engngm.h:447
virtual int giveNumberOfDomainEquations(int di, const UnknownNumberingScheme &num)
Definition engngm.C:452
int giveNumberOfProcesses() const
Returns the number of collaborating processes.
Definition engngm.h:1156
void assembleVectorFromElements(FloatArray &answer, TimeStep *tStep, const VectorAssembler &va, ValueModeType mode, const UnknownNumberingScheme &s, Domain *domain, FloatArray *eNorms=NULL)
Definition engngm.C:1351
int giveRank() const
Returns domain rank in a group of collaborating processes (0..groupSize-1).
Definition engngm.h:1154
ProblemCommunicator * communicator
Communicator.
Definition engngm.h:315
@ IG_None
No special treatment for new iterations. Probably means ending up using for all free dofs.
Definition engngm.h:208
@ IG_Tangent
Solves an approximated tangent problem from the last iteration. Useful for changing Dirichlet boundar...
Definition engngm.h:209
virtual void initForNewIteration(Domain *d, TimeStep *tStep, int iterationNumber, const FloatArray &solution)
Definition engngm.C:1728
MetaStep * giveCurrentMetaStep()
Returns current meta step.
Definition engngm.C:1900
int ndomains
Number of receiver domains.
Definition engngm.h:215
ProblemCommunicator * nonlocCommunicator
NonLocal Communicator. Necessary when nonlocal constitutive models are used.
Definition engngm.h:318
int numberOfSteps
Total number of time steps.
Definition engngm.h:219
Domain * giveDomain(int n)
Definition engngm.C:1936
int nonlocalExt
Flag indicating if nonlocal extension active, which will cause data to be sent between shared element...
Definition engngm.h:293
int giveNumberOfSteps(bool force=false)
Definition engngm.h:777
MetaStep * giveMetaStep(int i)
Returns the i-th meta step.
Definition engngm.h:773
@ InternalForcesExchangeTag
Definition engngm.h:321
CommunicatorBuff * commBuff
Common Communicator buffer.
Definition engngm.h:313
EngngModel * master
Master e-model; if defined receiver is in maintained (slave) mode.
Definition engngm.h:274
bool isParallel() const
Returns true if receiver in parallel mode.
Definition engngm.h:1152
int updateSharedDofManagers(FloatArray &answer, const UnknownNumberingScheme &s, int ExchangeTag)
Definition engngm.C:2162
void assembleExtrapolatedForces(FloatArray &answer, TimeStep *tStep, CharType type, Domain *domain)
Definition engngm.C:1536
void assembleVector(FloatArray &answer, TimeStep *tStep, const VectorAssembler &va, ValueModeType mode, const UnknownNumberingScheme &s, Domain *domain, FloatArray *eNorms=NULL)
Definition engngm.C:1106
double computeNorm() const
Definition floatarray.C:861
void resize(Index s)
Definition floatarray.C:94
virtual void printYourself() const
Definition floatarray.C:762
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void times(double s)
Definition floatarray.C:834
virtual int giveNumberOfInternalDofManagers()
Gives the number of internal dof managers.
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
int giveNumber()
Returns receiver's number.
Definition metastep.h:116
InputRecord & giveAttributesRecord()
Returns e-model attributes.
Definition metastep.h:122
virtual ConvergedReason solve(SparseMtrx &A, FloatArray &b, FloatArray &x)=0
virtual void zero()=0
Zeroes the receiver.
void updateMatrix(SparseMtrx &mat, TimeStep *tStep, Domain *d) override
NumericalMethod * giveNumericalMethod(MetaStep *mStep) override
Returns reference to receiver's numerical method.
FieldPtr giveField(FieldType key, TimeStep *) override
std ::unique_ptr< SparseMtrx > stiffnessMatrix
virtual TimeStep * giveCurrentStep(bool force=false) override
std ::unique_ptr< SparseNonLinearSystemNM > nMethod
std ::unique_ptr< DofDistributedPrimaryField > field
SparseMtrxType sparseMtrxType
void updateSolution(FloatArray &solutionVector, TimeStep *tStep, Domain *d) override
StateCounterType internalVarUpdateStamp
void terminate(TimeStep *tStep) override
StructuralEngngModel(int i, EngngModel *master=nullptr)
Creates new StructuralEngngModel with number i, associated to domain d.
int giveMetaStepNumber()
Returns receiver's meta step number.
Definition timestep.h:150
ConvergedReason convergedReason
Status of solution step (Converged,.
Definition timestep.h:120
double giveTimeIncrement()
Returns solution step associated time increment.
Definition timestep.h:168
int numberOfIterations
Number of itarations needed to achieve convergence.
Definition timestep.h:116
int giveNumber()
Returns receiver's number.
Definition timestep.h:144
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
Definition timestep.C:132
bool isTheFirstStep()
Definition timestep.C:148
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
Definition timestep.h:166
StateCounterType giveSolutionStateCounter()
Definition timestep.h:211
void propagateXfemInterfaces(TimeStep *tStep, StructuralEngngModel &ioEngngModel, bool iRecomputeStepAfterCrackProp)
#define _IFT_EngngModel_smtype
Definition engngm.h:92
#define _IFT_EngngModel_initialGuess
Definition engngm.h:88
#define OOFEM_WARNING(...)
Definition error.h:80
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define OOFEM_LOG_INFO(...)
Definition logger.h:143
#define OOFEM_LOG_RELEVANT(...)
Definition logger.h:142
long ContextMode
Definition contextmode.h:43
FieldType
Physical type of field.
Definition field.h:64
FloatArrayF< N > assemble(const FloatArrayF< M > &x, int const (&c)[M])
Assemble components into zero matrix.
@ SMT_Skyline
Symmetric skyline.
ClassFactory & classFactory
std::shared_ptr< Field > FieldPtr
Definition field.h:78
@ NonLinearLhs
@ InternalRhs
@ macroScale
Definition problemmode.h:46
#define _IFT_StaticStructural_stiffmode
#define _IFT_StaticStructural_prescribedTimes
#define _IFT_StaticStructural_nonlocalExtension
#define _IFT_StaticStructural_recomputeaftercrackpropagation
#define _IFT_StaticStructural_deltat
#define _IFT_StaticStructural_solvertype

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