59void TransportExternalForceAssembler :: vectorFromElement(
FloatArray &vec,
Element &element,
TimeStep *tStep, ValueModeType mode)
const
69MidpointLhsAssembler :: MidpointLhsAssembler(
bool lumped,
double alpha) :
86 static_cast< TransportElement *
>( &el )->computeIntSourceLHSMatrix(answer, tStep);
111 EngngModel :: initializeFrom(ir);
139 UnknownsField = std::make_unique<DofDistributedPrimaryField>(
this, 1, FT_TransportProblemUnknowns, 1);
141 UnknownsField = std::make_unique<PrimaryField>(
this, 1, FT_TransportProblemUnknowns, 1);
145 StationaryTransportProblem :: initializeFrom(ir);
153double NonStationaryTransportProblem :: giveUnknownComponent(ValueModeType mode,
TimeStep *tStep,
Domain *d,
Dof *dof)
158 if (mode == VM_TotalIntrinsic) mode = VM_Total;
163 OOFEM_ERROR(
"Dof unknowns dictionary does not contain unknown of value mode (%s)", __ValueModeTypeToString(mode));
171 if (mode == VM_TotalIntrinsic) {
188NonStationaryTransportProblem :: giveSolutionStepWhenIcApply(
bool force)
190 if (
master && (!force)) {
191 return master->giveSolutionStepWhenIcApply();
204NonStationaryTransportProblem :: giveDtFunction()
215NonStationaryTransportProblem :: giveDeltaT(
int n)
229NonStationaryTransportProblem :: giveDiscreteTime(
int iStep)
231 if ( ( iStep > 0 ) && ( iStep <=
discreteTimes.giveSize() ) ) {
235 if ( ( iStep == 0 ) && ( iStep <=
discreteTimes.giveSize() ) ) {
244NonStationaryTransportProblem :: giveNextStep()
247 double totalTime = this->
initT;
248 double intrinsicTime;
254 counter =
currentStep->giveSolutionStateCounter() + 1;
261 currentStep = std::make_unique<TimeStep>(istep,
this, 1, totalTime, this->
giveDeltaT ( istep ), counter);
270void NonStationaryTransportProblem :: solveYourselfAt(
TimeStep *tStep)
318 OOFEM_LOG_INFO(
"Assembling conductivity and capacity matrices\n");
369 for (
int i = 1; i <= neq; i++ ) {
389NonStationaryTransportProblem :: updateYourself(
TimeStep *tStep)
392 EngngModel :: updateYourself(tStep);
395#ifdef __CEMHYD_MODULE
397 for (
int i = 1; i <= domain->giveNumberOfElements(); ++i ) {
407 for (
int i = 1; i <= domain->giveNumberOfMaterialModels(); i++ ) {
421NonStationaryTransportProblem :: copyUnknownsInDictionary(ValueModeType mode,
TimeStep *fromTime,
TimeStep *toTime)
426 for (
Dof *dof: *node ) {
427 double val = dof->giveUnknown(mode, fromTime);
428 dof->updateUnknownsDictionary(toTime, mode, val);
435NonStationaryTransportProblem :: updateInternalState(
TimeStep *tStep)
446 for (
auto &elem : domain->giveElements() ) {
447 elem->updateInternalState(tStep);
459 EngngModel :: saveContext(stream, mode);
467 EngngModel :: restoreContext(stream, mode);
473NonStationaryTransportProblem :: checkConsistency()
482 OOFEM_WARNING(
"Element %d has no TransportElement base", elem->giveLabel());
487 EngngModel :: checkConsistency();
494NonStationaryTransportProblem :: updateDomainLinks()
496 EngngModel :: updateDomainLinks();
501NonStationaryTransportProblem :: giveUnknownDictHashIndx(ValueModeType mode,
TimeStep *tStep)
503 if ( mode == VM_Total ) {
505 }
else if ( mode == VM_RhsTotal ) {
508 OOFEM_ERROR(
"ValueModeType %s undefined", __ValueModeTypeToString(mode));
514NonStationaryTransportProblem :: assembleAlgorithmicPartOfRhs(
FloatArray &answer,
525 for (
int i = 1; i <= nelem; i++ ) {
552NonStationaryTransportProblem :: applyIC(
TimeStep *_stepWhenIcApply)
564 solutionVector =
UnknownsField->giveSolutionVector(_stepWhenIcApply);
565 solutionVector->
resize(neq);
566 solutionVector->
zero();
570 for (
Dof *dof: *node ) {
573 if ( !dof->isPrimaryDof() ) {
577 int jj = dof->__giveEquationNumber();
579 val = dof->giveUnknown(VM_Total, _stepWhenIcApply);
580 solutionVector->
at(jj) = val;
583 dof->updateUnknownsDictionary(_stepWhenIcApply, VM_Total, val);
596#ifdef __CEMHYD_MODULE
643 for (
int ielem = 1; ielem <= nelem; ielem++ ) {
665#ifdef __CEMHYD_MODULE
668NonStationaryTransportProblem :: averageOverElements(
TimeStep *tStep)
671 Domain *domain = this->giveDomain(1);
677 for (
GaussPoint *gp: *elem->giveDefaultIntegrationRulePtr() ) {
678 elem->giveIPValue(vecTemperature, gp, IST_Temperature, tStep);
#define REGISTER_EngngModel(class)
virtual void storeWeightTemperatureProductVolume(Element *element, TimeStep *tStep)
Store temperatures multiplied with volume around GPs - need before temperature averaging.
int initMaterial(Element *element) override
virtual void clearWeightTemperatureProductVolume(Element *element)
Clear temperatures multiplied with volume around GPs - need before temperature averaging.
virtual void averageTemperature()
Perform averaging on a master CemhydMatStatus.
DofIDItem giveDofID() const
virtual int __giveEquationNumber() const =0
virtual void giveUnknowns(FloatArray &masterUnknowns, ValueModeType mode, TimeStep *tStep)
std ::vector< std ::unique_ptr< Material > > & giveMaterials()
int giveNumberOfElements() const
Returns number of elements in domain.
std ::vector< std ::unique_ptr< DofManager > > & giveDofManagers()
Element * giveElement(int n)
std ::vector< std ::unique_ptr< Element > > & giveElements()
virtual void giveElementDofIDMask(IntArray &answer) const
virtual void giveCharacteristicMatrix(FloatMatrix &answer, CharType type, TimeStep *tStep)
virtual void updateYourself(TimeStep *tStep)
void computeVectorOfPrescribed(ValueModeType u, TimeStep *tStep, FloatArray &answer)
void giveLocationArray(IntArray &locationArray, const UnknownNumberingScheme &s, IntArray *dofIds=NULL) const
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
elementParallelMode giveParallelMode() const
int giveNumberOfTimeStepWhenIcApply()
Returns the time step number, when initial conditions should apply.
void assembleVectorFromDofManagers(FloatArray &answer, TimeStep *tStep, const VectorAssembler &va, ValueModeType mode, const UnknownNumberingScheme &s, Domain *domain, FloatArray *eNorms=NULL)
std ::vector< std ::unique_ptr< Domain > > domainList
List of problem domains.
virtual int giveNumberOfDomainEquations(int di, const UnknownNumberingScheme &num)
void assembleVectorFromElements(FloatArray &answer, TimeStep *tStep, const VectorAssembler &va, ValueModeType mode, const UnknownNumberingScheme &s, Domain *domain, FloatArray *eNorms=NULL)
std ::unique_ptr< TimeStep > previousStep
Previous time step.
MetaStep * giveCurrentMetaStep()
Returns current meta step.
Domain * giveDomain(int n)
std ::unique_ptr< TimeStep > currentStep
Current time step.
EngngModel * master
Master e-model; if defined receiver is in maintained (slave) mode.
virtual int giveNumberOfFirstStep(bool force=false)
std ::unique_ptr< TimeStep > stepWhenIcApply
Solution step when IC (initial conditions) apply.
bool containsOnlyZeroes() const
void assemble(const FloatArray &fe, const IntArray &loc)
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
void add(const FloatMatrix &a)
bool isNotEmpty() const
Tests for empty matrix.
FloatArray discreteTimes
Specified times where the problem is solved.
virtual void assembleDirichletBcRhsVector(FloatArray &answer, TimeStep *tStep, ValueModeType mode, const UnknownNumberingScheme &s, Domain *d)
int requiresUnknownsDictionaryUpdate() override
Allows to change number of equations during solution.
int giveUnknownDictHashIndx(ValueModeType mode, TimeStep *tStep) override
double deltaT
Length of time step.
Function * giveDtFunction()
StateCounterType internalVarUpdateStamp
std ::unique_ptr< SparseLinearSystemNM > linSolver
double giveDiscreteTime(int n)
TimeStep * giveSolutionStepWhenIcApply(bool force=false) override
LinSystSolverType solverType
double initT
Initial time from which the computation runs. Default is zero.
int lumpedCapacityStab
If set then stabilization using lumped capacity will be used.
NumericalMethod * giveNumericalMethod(MetaStep *mStep) override
Returns reference to receiver's numerical method.
int dtFunction
Associated time function for time step increment.
virtual void copyUnknownsInDictionary(ValueModeType mode, TimeStep *fromTime, TimeStep *toTime)
virtual void updateInternalState(TimeStep *tStep)
bool changingProblemSize
Determines if there are change in the problem size (no application/removal of Dirichlet boundary cond...
virtual void assembleAlgorithmicPartOfRhs(FloatArray &rhs, const UnknownNumberingScheme &s, TimeStep *tStep)
virtual void applyIC(TimeStep *tStep)
FloatArray bcRhs
Right hand side vector from boundary conditions.
SparseMtrxType sparseMtrxType
StationaryTransportProblem(int i, EngngModel *_master)
std ::unique_ptr< PrimaryField > UnknownsField
This field stores solution vector. For fixed size of problem, the PrimaryField is used,...
std ::unique_ptr< SparseMtrx > conductivityMatrix
void incrementStateCounter()
Updates solution state counter.
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.
StateCounterType giveSolutionStateCounter()
Material * giveMaterial() override
void updateInternalState(TimeStep *tStep) override
virtual void computeInternalSourceRhsVectorAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
virtual void computeBCVectorAt(FloatArray &answer, TimeStep *tStep, ValueModeType mode)
#define _IFT_EngngModel_lstype
#define OOFEM_WARNING(...)
#define OOFEM_LOG_INFO(...)
#define OOFEM_LOG_RELEVANT(...)
@ Element_remote
Element in active domain is only mirror of some remote element.
FloatArrayF< N > assemble(const FloatArrayF< M > &x, int const (&c)[M])
Assemble components into zero matrix.
long StateCounterType
StateCounterType type used to indicate solution state.
ClassFactory & classFactory
#define _IFT_NonStationaryTransportProblem_deltatfunction
#define _IFT_NonStationaryTransportProblem_initt
#define _IFT_NonStationaryTransportProblem_prescribedtimes
#define _IFT_NonStationaryTransportProblem_deltat
#define _IFT_NonStationaryTransportProblem_changingproblemsize
#define _IFT_NonStationaryTransportProblem_alpha
#define _IFT_NonStationaryTransportProblem_lumpedcapa
#define VERBOSE_PRINT0(str, number)