OOFEM 3.0
Loading...
Searching...
No Matches
transienttransportproblem.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
36#include "timestep.h"
38#include "maskedprimaryfield.h"
39#include "intvarfield.h"
41#include "classfactory.h"
42#include "datastream.h"
43#include "contextioerr.h"
44#include "nrsolver.h"
46#include "function.h"
47#include "dofmanager.h"
48#include "assemblercallback.h"
49// Temporary:
51#include "boundarycondition.h"
52#include "activebc.h"
53#include "outputmanager.h"
54
55namespace oofem {
57
58TransientTransportProblem :: TransientTransportProblem(int i, EngngModel *master) : EngngModel(i, master)
59{
60 ndomains = 1;
61}
62
63
64NumericalMethod *TransientTransportProblem :: giveNumericalMethod(MetaStep *mStep)
65{
66 if ( !nMethod ) {
67 nMethod = std::make_unique<NRSolver>(this->giveDomain(1), this);
68 }
69 return nMethod.get();
70}
71
72
73void
74TransientTransportProblem :: initializeFrom(InputRecord &ir)
75{
76 EngngModel :: initializeFrom(ir);
77
78 int val = SMT_Skyline;
80 this->sparseMtrxType = ( SparseMtrxType ) val;
81
83
86 }
87
88 prescribedTimes.clear();
89 dtFunction = 0;
94 } else {
96 }
97
99
101
102 field = std::make_unique<DofDistributedPrimaryField>(this, 1, FT_TransportProblemUnknowns, 2, this->alpha);
103
104 // read field export flag
105 exportFields.clear();
107 if ( exportFields.giveSize() ) {
108 FieldManager *fm = this->giveContext()->giveFieldManager();
109 for ( int i = 1; i <= exportFields.giveSize(); i++ ) {
110 if ( exportFields.at(i) == FT_Temperature ) {
111 FieldPtr _temperatureField( new MaskedPrimaryField ( ( FieldType ) exportFields.at(i), this->field.get(), {T_f} ) );
112 fm->registerField( _temperatureField, ( FieldType ) exportFields.at(i) );
113 } else if ( exportFields.at(i) == FT_HumidityConcentration ) {
114 FieldPtr _concentrationField( new MaskedPrimaryField ( ( FieldType ) exportFields.at(i), this->field.get(), {C_1} ) );
115 fm->registerField( _concentrationField, ( FieldType ) exportFields.at(i) );
116 }
117 }
118 }
119
120// InternalVariableField(IST_HydrationDegree, FT_Unknown, MMA_ClosestPoint, this->giveDomain(1));
121}
122
123
124double TransientTransportProblem :: giveUnknownComponent(ValueModeType mode, TimeStep *tStep, Domain *d, Dof *dof)
125{
126 return this->field->giveUnknownValue(dof, mode, tStep);
127}
128
129
130double
131TransientTransportProblem :: giveDeltaT(int n)
132{
133 if ( this->dtFunction ) {
134 return this->giveDomain(1)->giveFunction(this->dtFunction)->evaluateAtTime(n);
135 } else if ( this->prescribedTimes.giveSize() > 0 ) {
136 return this->giveDiscreteTime(n) - this->giveDiscreteTime(n - 1);
137 } else {
138 return this->deltaT;
139 }
140}
141
142double
143TransientTransportProblem :: giveDiscreteTime(int iStep)
144{
145 if ( iStep > 0 && iStep <= this->prescribedTimes.giveSize() ) {
146 return ( this->prescribedTimes.at(iStep) );
147 } else if ( iStep == 0 ) {
148 return initT;
149 }
150
151 OOFEM_ERROR("invalid iStep");
152}
153
154
155TimeStep *TransientTransportProblem :: giveNextStep()
156{
157 if ( !currentStep ) {
158 // first step -> generate initial step
159 currentStep = std::make_unique<TimeStep>( *giveSolutionStepWhenIcApply() );
160 }
161
162 double dt = this->giveDeltaT(currentStep->giveNumber()+1);
163 previousStep = std :: move(currentStep);
164 currentStep = std::make_unique<TimeStep>(*previousStep, dt);
165 currentStep->setIntrinsicTime(previousStep->giveTargetTime() + alpha * dt);
166 return currentStep.get();
167}
168
169
170TimeStep *TransientTransportProblem :: giveSolutionStepWhenIcApply(bool force)
171{
172 if ( master && (!force)) {
173 return master->giveSolutionStepWhenIcApply();
174 } else {
175 if ( !stepWhenIcApply ) {
176 double dt = this->giveDeltaT(1);
177 stepWhenIcApply = std::make_unique<TimeStep>(giveNumberOfTimeStepWhenIcApply(), this, 0, this->initT, dt, 0);
178 // The initial step goes from [-dt, 0], so the intrinsic time is at: -deltaT + alpha*dt
179 stepWhenIcApply->setIntrinsicTime(-dt + alpha * dt);
180 }
181
182 return stepWhenIcApply.get();
183 }
184}
185
186
187void TransientTransportProblem :: solveYourselfAt(TimeStep *tStep)
188{
189 OOFEM_LOG_INFO( "\nSolving [step number %5d, time %e]\n", tStep->giveNumber(), tStep->giveTargetTime() );
190
191 Domain *d = this->giveDomain(1);
193
194 if ( tStep->isTheFirstStep() ) {
195 this->applyIC();
196 }
197
198 field->advanceSolution(tStep);
199 field->initialize(VM_Total, tStep, solution, EModelDefaultEquationNumbering());
200
201 if ( !effectiveMatrix ) {
202 effectiveMatrix = classFactory.createSparseMtrx(sparseMtrxType);
203 effectiveMatrix->buildInternalStructure( this, 1, EModelDefaultEquationNumbering() );
204 }
205
206 OOFEM_LOG_INFO("Assembling external forces\n");
207 FloatArray externalForces(neq);
208 externalForces.zero();
209 this->assembleVector( externalForces, tStep, ExternalForceAssembler(), VM_Total, EModelDefaultEquationNumbering(), d );
211
212 // set-up numerical method
214 OOFEM_LOG_INFO("Solving for %d unknowns...\n", neq);
215
216 internalForces.resize(neq);
217
218 FloatArray incrementOfSolution;
219 double loadLevel;
220 int currentIterations;
221 this->updateInternalRHS(this->internalForces, tStep, this->giveDomain(1), &this->eNorm);
222 this->nMethod->solve(*this->effectiveMatrix,
223 externalForces,
224 nullptr, // ignore
225 this->solution,
226 incrementOfSolution,
227 this->internalForces,
228 this->eNorm,
229 loadLevel, // ignore
230 SparseNonLinearSystemNM :: rlm_total, // ignore
231 currentIterations, // ignore
232 tStep);
233}
234
235
236void
237TransientTransportProblem :: updateSolution(FloatArray &solutionVector, TimeStep *tStep, Domain *d)
238{
240 this->field->update(VM_Total, tStep, solutionVector, EModelDefaultEquationNumbering());
243 this->field->applyBoundaryCondition(tStep);
244}
245
246
247void
248TransientTransportProblem :: updateInternalRHS(FloatArray &answer, TimeStep *tStep, Domain *d, FloatArray *eNorm)
249{
250 // F_eff = F(T^(k)) + C * dT/dt^(k)
251 answer.zero();
252 this->assembleVector(answer, tStep, InternalForceAssembler(), VM_Total, EModelDefaultEquationNumbering(), d, eNorm);
254 if ( lumped ) {
255 // Note, inertia contribution cannot be computed on element level when lumped mass matrices are used.
256 FloatArray oldSolution, vel;
257 this->field->initialize(VM_Total, tStep->givePreviousStep(), oldSolution, EModelDefaultEquationNumbering());
258 vel.beDifferenceOf(solution, oldSolution);
259 vel.times( 1./tStep->giveTimeIncrement() );
260 FloatArray capacityDiag(vel.giveSize());
261 this->assembleVector( capacityDiag, tStep, LumpedMassVectorAssembler(), VM_Total, EModelDefaultEquationNumbering(), d );
262 for ( int i = 0; i < vel.giveSize(); ++i ) {
263 answer[i] += capacityDiag[i] * vel[i];
264 }
265 } else {
266 FloatArray tmp;
267 this->assembleVector(answer, tStep, InertiaForceAssembler(), VM_Total, EModelDefaultEquationNumbering(), d, & tmp);
268 eNorm->add(tmp);
269 }
270}
271
272
273void
274TransientTransportProblem :: updateMatrix(SparseMtrx &mat, TimeStep *tStep, Domain *d)
275{
276 // K_eff = (a*K + C/dt)
277 if ( !this->keepTangent || !this->hasTangent ) {
278 mat.zero();
279 this->assemble(mat, tStep, EffectiveTangentAssembler(TangentStiffness, lumped, this->alpha, 1./tStep->giveTimeIncrement()),
281 this->hasTangent = true;
282 }
283}
284
285
286void
287TransientTransportProblem :: updateComponent(TimeStep *tStep, NumericalCmpn cmpn, Domain *d)
288{
289 // F(T) + C*dT/dt = Q, F(T)=(K_c+K_h)*T-R_q-R_h
290 // Linearized:
291 // F(T^(k)) + K*a*dT_1 = Q - C * dT/dt^(k) - C/dt * dT_1
292 // Rearranged
293 // (a*K + C/dt) * dT_1 = Q - (F(T^(k)) + C * dT/dt^(k))
294 // K_eff * dT_1 = Q - F_eff
295 // Update:
296 // T_1 += dT_1
297
299 this->field->update(VM_Total, tStep, solution, EModelDefaultEquationNumbering());
302 this->field->applyBoundaryCondition(tStep);
303
304 if ( cmpn == InternalRhs ) {
305 // F_eff = F(T^(k)) + C * dT/dt^(k)
306 this->internalForces.zero();
307 this->assembleVector(this->internalForces, tStep, InternalForceAssembler(), VM_Total,
310 if ( lumped ) {
311 // Note, inertia contribution cannot be computed on element level when lumped mass matrices are used.
312 FloatArray oldSolution, vel;
313 this->field->initialize(VM_Total, tStep->givePreviousStep(), oldSolution, EModelDefaultEquationNumbering());
314 vel.beDifferenceOf(solution, oldSolution);
315 vel.times( 1./tStep->giveTimeIncrement() );
316 FloatArray capacityDiag(vel.giveSize());
317 this->assembleVector( capacityDiag, tStep, LumpedMassVectorAssembler(), VM_Total, EModelDefaultEquationNumbering(), d );
318 for ( int i = 0; i < vel.giveSize(); ++i ) {
319 this->internalForces[i] += capacityDiag[i] * vel[i];
320 }
321 } else {
322 FloatArray tmp;
323 this->assembleVector(this->internalForces, tStep, InertiaForceAssembler(), VM_Total,
325 this->eNorm.add(tmp);
326 }
327
328 } else if ( cmpn == NonLinearLhs ) {
329 // K_eff = (a*K + C/dt)
330 if ( !this->keepTangent || !this->hasTangent ) {
331 this->effectiveMatrix->zero();
332 this->assemble( *effectiveMatrix, tStep, EffectiveTangentAssembler(TangentStiffness, lumped, this->alpha, 1./tStep->giveTimeIncrement()),
334 this->hasTangent = true;
335 }
336 } else {
337 OOFEM_ERROR("Unknown component");
338 }
339}
340
341
342void
343TransientTransportProblem :: applyIC()
344{
345 Domain *domain = this->giveDomain(1);
346 OOFEM_LOG_INFO("Applying initial conditions\n");
347
348 this->field->applyDefaultInitialCondition();
349
350 // set initial field IP values (needed by some nonlinear materials)
352 for ( auto &elem : domain->giveElements() ) {
353 TransportElement *element = static_cast< TransportElement * >( elem.get() );
354 element->updateInternalState(s);
355 element->updateYourself(s);
356 }
357}
358
359
360bool
361TransientTransportProblem :: requiresEquationRenumbering(TimeStep *tStep)
362{
364 if ( tStep->isTheFirstStep() ) {
365 return true;
366 }
367 // Check if Dirichlet b.c.s has changed.
368 Domain *d = this->giveDomain(1);
369 for ( auto &gbc : d->giveBcs() ) {
370 ActiveBoundaryCondition *active_bc = dynamic_cast< ActiveBoundaryCondition * >(gbc.get());
371 BoundaryCondition *bc = dynamic_cast< BoundaryCondition * >(gbc.get());
372 // We only need to consider Dirichlet b.c.s
373 if ( bc || ( active_bc && ( active_bc->requiresActiveDofs() || active_bc->giveNumberOfInternalDofManagers() ) ) ) {
374 // Check of the dirichlet b.c. has changed in the last step (if so we need to renumber)
375 if ( gbc->isImposed(tStep) != gbc->isImposed(tStep->givePreviousStep()) ) {
376 return true;
377 }
378 }
379 }
380 return false;
381}
382
383int
384TransientTransportProblem :: forceEquationNumbering()
385{
386 this->effectiveMatrix = nullptr;
387 return EngngModel :: forceEquationNumbering();
388}
389
390
391void
392TransientTransportProblem :: printOutputAt(FILE *file, TimeStep *tStep)
393{
394 if ( !this->giveDomain(1)->giveOutputManager()->testTimeStepOutput(tStep) ) {
395 return; // Do not print even Solution step header
396 }
397
398 EngngModel :: printOutputAt(file, tStep);
399
400 // computes and prints reaction forces in all supported or restrained dofs
401 fprintf(file, "\n\n\tR E A C T I O N S O U T P U T:\n\t_______________________________\n\n\n");
402
403 IntArray restrDofMans, restrDofs, eqn;
404 int di=1;
405 //from StructuralEngngModel :: buildReactionTable(dofManMap, dofidMap, eqnMap, tStep, 1);
406 // determine number of restrained dofs
407 Domain *domain = this->giveDomain(di);
409 int ndofMan = domain->giveNumberOfDofManagers();
410 int rindex, count = 0;
411
412 // initialize corresponding dofManagers and dofs for each restrained dof
413 restrDofMans.resize(numRestrDofs);
414 restrDofs.resize(numRestrDofs);
415 eqn.resize(numRestrDofs);
416
417 for ( int i = 1; i <= ndofMan; i++ ) {
418 DofManager *inode = domain->giveDofManager(i);
419 for ( Dof *jdof: *inode ) {
420 if ( jdof->isPrimaryDof() && ( jdof->hasBc(tStep) ) ) { // skip slave dofs
421 rindex = jdof->__givePrescribedEquationNumber();
422 if ( rindex ) {
423 count++;
424 restrDofMans.at(count) = i;
425 restrDofs.at(count) = jdof->giveDofID();
426 eqn.at(count) = rindex;
427 } else {
428 // NullDof has no equation number and no prescribed equation number
429 //_error("No prescribed equation number assigned to supported DOF");
430 }
431 }
432 }
433 }
434 // Trim to size.
435 restrDofMans.resizeWithValues(count);
436 restrDofs.resizeWithValues(count);
437 eqn.resizeWithValues(count);
438
439 //restrDofMans.printYourself();
440 //restrDofs.printYourself();
441 //eqn.printYourself();
442
443 //from StructuralEngngModel :: computeReaction()
444 FloatArray internal, external;
446 internal.zero();
447
448 // Add internal forces
449 this->assembleVector( internal, tStep, InternalForceAssembler(), VM_Total,
451 // Subtract external loading
452 external.resize(internal.giveSize());
453 this->assembleVector( external, tStep, ExternalForceAssembler(), VM_Total, EModelDefaultPrescribedEquationNumbering(), this->giveDomain(di), &this->eNorm );
454
455 internal.subtract(external);
456 //internal.printYourself();
457
458 //
459 // loop over reactions and print them
460 //
461 for ( int i = 1; i <= restrDofMans.giveSize(); i++ ) {
462 if ( domain->giveOutputManager()->testDofManOutput(restrDofMans.at(i), tStep) ) {
463 fprintf(file, "\tNode %8d iDof %2d reaction % .4e [bc-id: %d]\n",
464 domain->giveDofManager( restrDofMans.at(i) )->giveLabel(),
465 restrDofs.at(i), internal.at( eqn.at(i) ),
466 domain->giveDofManager( restrDofMans.at(i) )->giveDofWithID( restrDofs.at(i) )->giveBcId() );
467 }
468 }
469
470}
471
472
473void
474TransientTransportProblem :: updateYourself(TimeStep *tStep)
475{
476 EngngModel :: updateYourself(tStep);
477}
478
479void
480TransientTransportProblem :: saveContext(DataStream &stream, ContextMode mode)
481{
482 EngngModel :: saveContext(stream, mode);
483 field->saveContext(stream);
484}
485
486
487void
488TransientTransportProblem :: restoreContext(DataStream &stream, ContextMode mode)
489{
490 EngngModel :: restoreContext(stream, mode);
491 field->restoreContext(stream);
492}
493
494
495int
496TransientTransportProblem :: giveUnknownDictHashIndx(ValueModeType mode, TimeStep *tStep)
497{
498 return tStep->giveNumber() % 2;
499}
500
501
502int
503TransientTransportProblem :: requiresUnknownsDictionaryUpdate()
504{
505 return true;
506}
507
508int
509TransientTransportProblem :: checkConsistency()
510{
511 // check for proper element type
512 for ( auto &elem : this->giveDomain(1)->giveElements() ) {
513 if ( !dynamic_cast< TransportElement * >( elem.get() ) ) {
514 OOFEM_WARNING("Element %d has no TransportElement base", elem->giveLabel());
515 return 0;
516 }
517 }
518
519 return EngngModel :: checkConsistency();
520}
521
522
523void
524TransientTransportProblem :: updateDomainLinks()
525{
526 EngngModel :: updateDomainLinks();
527 this->giveNumericalMethod( this->giveCurrentMetaStep() )->setDomain( this->giveDomain(1) );
528}
529
530
532{
533 /* Note: the current implementation uses MaskedPrimaryField, that is automatically updated with the model progress,
534 so the returned field always refers to active solution step.
535 */
536
537 if ( tStep != this->giveCurrentStep()) {
538 OOFEM_ERROR("Unable to return field representation for non-current time step");
539 }
540 if ( key == FT_Temperature ) {
541 return std::make_shared<MaskedPrimaryField>( key, this->field.get(), IntArray{T_f} );
542 } else if ( key == FT_HumidityConcentration ) {
543 return std::make_shared<MaskedPrimaryField>( key, this->field.get(), IntArray{C_1} );
544 } else if ( key == FT_VOF ) {
545 return this->giveContext()->giveFieldManager()->giveField(key);
546 } else {
547 return FieldPtr();
548 }
549}
550
551
552} // end namespace oofem
#define REGISTER_EngngModel(class)
virtual bool requiresActiveDofs()
Definition activebc.h:151
int giveLabel() const
Definition dofmanager.h:516
Dof * giveDofWithID(int dofID) const
Definition dofmanager.C:127
virtual int giveBcId()=0
OutputManager * giveOutputManager()
Definition domain.C:1544
int giveNumberOfDofManagers() const
Returns number of dof managers in domain.
Definition domain.h:461
std ::vector< std ::unique_ptr< GeneralBoundaryCondition > > & giveBcs()
Definition domain.h:349
DofManager * giveDofManager(int n)
Definition domain.C:317
std ::vector< std ::unique_ptr< Element > > & giveElements()
Definition domain.h:294
virtual void updateYourself(TimeStep *tStep)
Definition element.C:824
FieldManager * giveFieldManager()
Definition engngm.h:141
int giveNumberOfTimeStepWhenIcApply()
Returns the time step number, when initial conditions should apply.
Definition engngm.h:787
virtual TimeStep * giveCurrentStep(bool force=false)
Definition engngm.h:717
virtual int giveNumberOfDomainEquations(int di, const UnknownNumberingScheme &num)
Definition engngm.C:452
EngngModelContext * giveContext()
Context requesting service.
Definition engngm.h:1174
EngngModel(int i, EngngModel *_master=NULL)
Definition engngm.C:99
std ::unique_ptr< TimeStep > previousStep
Previous time step.
Definition engngm.h:243
MetaStep * giveCurrentMetaStep()
Returns current meta step.
Definition engngm.C:1900
int ndomains
Number of receiver domains.
Definition engngm.h:215
Domain * giveDomain(int n)
Definition engngm.C:1936
std ::unique_ptr< TimeStep > currentStep
Current time step.
Definition engngm.h:241
@ InternalForcesExchangeTag
Definition engngm.h:321
EngngModel * master
Master e-model; if defined receiver is in maintained (slave) mode.
Definition engngm.h:274
int updateSharedDofManagers(FloatArray &answer, const UnknownNumberingScheme &s, int ExchangeTag)
Definition engngm.C:2162
std ::unique_ptr< TimeStep > stepWhenIcApply
Solution step when IC (initial conditions) apply.
Definition engngm.h:239
void assembleVector(FloatArray &answer, TimeStep *tStep, const VectorAssembler &va, ValueModeType mode, const UnknownNumberingScheme &s, Domain *domain, FloatArray *eNorms=NULL)
Definition engngm.C:1106
void registerField(FieldPtr eField, FieldType key)
FieldPtr giveField(FieldType key)
void resize(Index s)
Definition floatarray.C:94
double & at(Index i)
Definition floatarray.h:202
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Definition floatarray.C:403
void zero()
Zeroes all coefficients of receiver.
Definition floatarray.C:683
void subtract(const FloatArray &src)
Definition floatarray.C:320
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.
void resizeWithValues(int n, int allocChunk=0)
Definition intarray.C:64
void resize(int n)
Definition intarray.C:73
int & at(std::size_t i)
Definition intarray.h:104
int giveSize() const
Definition intarray.h:211
int testDofManOutput(int, TimeStep *)
virtual void zero()=0
Zeroes the receiver.
double giveTimeIncrement()
Returns solution step associated time increment.
Definition timestep.h:168
double giveTargetTime()
Returns target time.
Definition timestep.h:164
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
NumericalMethod * giveNumericalMethod(MetaStep *mStep) override
Returns reference to receiver's numerical method.
std ::unique_ptr< DofDistributedPrimaryField > field
FieldPtr giveField(FieldType key, TimeStep *tStep) override
double initT
Initial time from which the computation runs. Default is zero.
TimeStep * giveSolutionStepWhenIcApply(bool force=false) override
std ::unique_ptr< SparseMtrx > effectiveMatrix
void updateInternalRHS(FloatArray &answer, TimeStep *tStep, Domain *d, FloatArray *eNorm) override
std ::unique_ptr< SparseNonLinearSystemNM > nMethod
Numerical method used to solve the problem.
void updateInternalState(TimeStep *tStep) override
#define _IFT_EngngModel_smtype
Definition engngm.h:92
#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 IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
#define OOFEM_LOG_INFO(...)
Definition logger.h:143
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
#define _IFT_TransientTransportProblem_exportFields
Fields to export for staggered problems.
#define _IFT_TransientTransportProblem_initt
Initial time.
#define _IFT_TransientTransportProblem_lumped
Use of lumped "mass" matrix.
#define _IFT_TransientTransportProblem_deltaT
Fixed timestep.
#define _IFT_TransientTransportProblem_keepTangent
Fixes the tangent to be reused on each step.
#define _IFT_TransientTransportProblem_prescribedTimes
Discrete times for each time step.
#define _IFT_TransientTransportProblem_alpha
Defines the time discretization of the value: .
#define _IFT_TransientTransportProblem_dtFunction
Function that determines size of time step.

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