76 EngngModel :: initializeFrom(ir);
102 field = std::make_unique<DofDistributedPrimaryField>(
this, 1, FT_TransportProblemUnknowns, 2, this->
alpha);
113 }
else if (
exportFields.at(i) == FT_HumidityConcentration ) {
124double TransientTransportProblem :: giveUnknownComponent(ValueModeType mode,
TimeStep *tStep,
Domain *d,
Dof *dof)
126 return this->
field->giveUnknownValue(dof, mode, tStep);
131TransientTransportProblem :: giveDeltaT(
int n)
143TransientTransportProblem :: giveDiscreteTime(
int iStep)
147 }
else if ( iStep == 0 ) {
155TimeStep *TransientTransportProblem :: giveNextStep()
170TimeStep *TransientTransportProblem :: giveSolutionStepWhenIcApply(
bool force)
172 if (
master && (!force)) {
173 return master->giveSolutionStepWhenIcApply();
187void TransientTransportProblem :: solveYourselfAt(
TimeStep *tStep)
198 field->advanceSolution(tStep);
208 externalForces.
zero();
220 int currentIterations;
230 SparseNonLinearSystemNM :: rlm_total,
243 this->
field->applyBoundaryCondition(tStep);
262 for (
int i = 0; i < vel.
giveSize(); ++i ) {
263 answer[i] += capacityDiag[i] * vel[i];
302 this->
field->applyBoundaryCondition(tStep);
318 for (
int i = 0; i < vel.
giveSize(); ++i ) {
325 this->
eNorm.add(tmp);
343TransientTransportProblem :: applyIC()
348 this->
field->applyDefaultInitialCondition();
361TransientTransportProblem :: requiresEquationRenumbering(
TimeStep *tStep)
369 for (
auto &gbc : d->
giveBcs() ) {
384TransientTransportProblem :: forceEquationNumbering()
387 return EngngModel :: forceEquationNumbering();
392TransientTransportProblem :: printOutputAt(FILE *file,
TimeStep *tStep)
394 if ( !this->
giveDomain(1)->giveOutputManager()->testTimeStepOutput(tStep) ) {
398 EngngModel :: printOutputAt(file, tStep);
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");
403 IntArray restrDofMans, restrDofs, eqn;
410 int rindex, count = 0;
413 restrDofMans.
resize(numRestrDofs);
414 restrDofs.
resize(numRestrDofs);
417 for (
int i = 1; i <= ndofMan; i++ ) {
419 for (
Dof *jdof: *inode ) {
420 if ( jdof->isPrimaryDof() && ( jdof->hasBc(tStep) ) ) {
421 rindex = jdof->__givePrescribedEquationNumber();
424 restrDofMans.
at(count) = i;
425 restrDofs.
at(count) = jdof->giveDofID();
426 eqn.
at(count) = rindex;
461 for (
int i = 1; i <= restrDofMans.
giveSize(); i++ ) {
463 fprintf(file,
"\tNode %8d iDof %2d reaction % .4e [bc-id: %d]\n",
465 restrDofs.
at(i), internal.
at( eqn.
at(i) ),
474TransientTransportProblem :: updateYourself(
TimeStep *tStep)
476 EngngModel :: updateYourself(tStep);
482 EngngModel :: saveContext(stream, mode);
483 field->saveContext(stream);
490 EngngModel :: restoreContext(stream, mode);
491 field->restoreContext(stream);
496TransientTransportProblem :: giveUnknownDictHashIndx(ValueModeType mode,
TimeStep *tStep)
503TransientTransportProblem :: requiresUnknownsDictionaryUpdate()
509TransientTransportProblem :: checkConsistency()
512 for (
auto &elem : this->
giveDomain(1)->giveElements() ) {
514 OOFEM_WARNING(
"Element %d has no TransportElement base", elem->giveLabel());
519 return EngngModel :: checkConsistency();
524TransientTransportProblem :: updateDomainLinks()
526 EngngModel :: updateDomainLinks();
538 OOFEM_ERROR(
"Unable to return field representation for non-current time step");
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 ) {
#define REGISTER_EngngModel(class)
virtual bool requiresActiveDofs()
Dof * giveDofWithID(int dofID) const
OutputManager * giveOutputManager()
int giveNumberOfDofManagers() const
Returns number of dof managers in domain.
std ::vector< std ::unique_ptr< GeneralBoundaryCondition > > & giveBcs()
DofManager * giveDofManager(int n)
std ::vector< std ::unique_ptr< Element > > & giveElements()
virtual void updateYourself(TimeStep *tStep)
FieldManager * giveFieldManager()
int giveNumberOfTimeStepWhenIcApply()
Returns the time step number, when initial conditions should apply.
virtual TimeStep * giveCurrentStep(bool force=false)
virtual int giveNumberOfDomainEquations(int di, const UnknownNumberingScheme &num)
EngngModelContext * giveContext()
Context requesting service.
EngngModel(int i, EngngModel *_master=NULL)
std ::unique_ptr< TimeStep > previousStep
Previous time step.
MetaStep * giveCurrentMetaStep()
Returns current meta step.
int ndomains
Number of receiver domains.
Domain * giveDomain(int n)
std ::unique_ptr< TimeStep > currentStep
Current time step.
@ InternalForcesExchangeTag
EngngModel * master
Master e-model; if defined receiver is in maintained (slave) mode.
int updateSharedDofManagers(FloatArray &answer, const UnknownNumberingScheme &s, int ExchangeTag)
std ::unique_ptr< TimeStep > stepWhenIcApply
Solution step when IC (initial conditions) apply.
void assembleVector(FloatArray &answer, TimeStep *tStep, const VectorAssembler &va, ValueModeType mode, const UnknownNumberingScheme &s, Domain *domain, FloatArray *eNorms=NULL)
void registerField(FieldPtr eField, FieldType key)
FieldPtr giveField(FieldType key)
Index giveSize() const
Returns the size of receiver.
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
void zero()
Zeroes all coefficients of receiver.
void subtract(const FloatArray &src)
virtual int giveNumberOfInternalDofManagers()
Gives the number of internal dof managers.
void resizeWithValues(int n, int allocChunk=0)
int testDofManOutput(int, TimeStep *)
virtual void zero()=0
Zeroes the receiver.
double giveTimeIncrement()
Returns solution step associated time increment.
double giveTargetTime()
Returns target time.
int giveNumber()
Returns receiver's number.
TimeStep * givePreviousStep()
Returns pointer to previous solution step.
FloatArray internalForces
NumericalMethod * giveNumericalMethod(MetaStep *mStep) override
Returns reference to receiver's numerical method.
SparseMtrxType sparseMtrxType
FloatArray prescribedTimes
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
double giveDiscreteTime(int iStep)
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
#define OOFEM_WARNING(...)
#define OOFEM_LOG_INFO(...)
FieldType
Physical type of field.
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
#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.