57 NonStationaryTransportProblem :: initializeFrom(ir);
76NLTransientTransportProblem :: giveNextStep()
79 NonStationaryTransportProblem :: giveNextStep();
86void NLTransientTransportProblem :: solveYourselfAt(
TimeStep *tStep)
93 double solutionErr, incrementErr;
109 OOFEM_LOG_INFO(
"Assembling conductivity and capacity matrices\n");
149 OOFEM_LOG_INFO(
"Time Iter ResidNorm IncrNorm\n__________________________________________________________\n");
195 solutionVector->
add(solutionVectorIncrement);
198 incrementErr = solutionVectorIncrement.
computeNorm();
208 if ( nite >=
nsmax ) {
211 }
while ( ( fabs(solutionErr) >
rtol ) || ( fabs(incrementErr) >
rtol ) );
215double NLTransientTransportProblem :: giveUnknownComponent(ValueModeType mode,
TimeStep *tStep,
Domain *d,
Dof *dof)
220 if ( mode == VM_Incremental ) {
222 }
else if ( mode == VM_TotalIntrinsic ) {
229 OOFEM_ERROR(
"Dof unknowns dictionary does not contain unknown of value mode (%s)", __ValueModeTypeToString(mode) );
240 if ( ( t >= pStep->
giveTargetTime() ) && ( t <= cStep->giveTargetTime() ) ) {
243 double rtdt =
UnknownsField->giveUnknownValue(dof, VM_Total, cStep);
244 double rt =
UnknownsField->giveUnknownValue(dof, VM_Total, pStep);
245 double psi = ( t - pStep->
giveTargetTime() ) / cStep->giveTimeIncrement();
246 if ( mode == VM_Velocity ) {
247 return ( rtdt - rt ) / cStep->giveTimeIncrement();
248 }
else if ( mode == VM_TotalIntrinsic ) {
250 return this->
alpha * rtdt + ( 1. - this->
alpha ) * rt;
251 }
else if ( mode == VM_Total ) {
252 return psi * rtdt + ( 1. - psi ) * rt;
253 }
else if ( mode == VM_Incremental ) {
257 return ( rtdt - rt );
260 OOFEM_ERROR(
"Unknown mode %s is undefined for this problem", __ValueModeTypeToString(mode) );
271NLTransientTransportProblem :: applyIC(
TimeStep *_stepWhenIcApply)
275 NonStationaryTransportProblem :: applyIC(_stepWhenIcApply);
286NLTransientTransportProblem :: createPreviousSolutionInDofUnknownsDictionary(
TimeStep *tStep)
291 for (
auto &node : domain->giveDofManagers() ) {
292 for (
Dof *dof: *node ) {
293 double val = dof->giveUnknown(VM_Total, tStep);
303NLTransientTransportProblem :: updateYourself(
TimeStep *tStep)
310 NonStationaryTransportProblem :: updateYourself(tStep);
316NLTransientTransportProblem :: giveUnknownDictHashIndx(ValueModeType mode,
TimeStep *tStep)
318 if ( mode == VM_Total ) {
319 if ( tStep->
giveNumber() == this->giveCurrentStep()->giveNumber() ) {
321 }
else if ( tStep->
giveNumber() == this->giveCurrentStep()->giveNumber() - 1 ) {
324 OOFEM_ERROR(
"No history available at TimeStep %d = %f, called from TimeStep %d = %f", tStep->
giveNumber(), tStep->
giveTargetTime(), this->giveCurrentStep()->giveNumber(), this->giveCurrentStep()->giveTargetTime() );
327 OOFEM_ERROR(
"ValueModeType %s undefined", __ValueModeTypeToString(mode));
335 for (
Dof *dof: *inode ) {
336 int eqNum = dof->__giveEquationNumber();
338 if ( dof->hasBc(tStep) ) {
339 val = dof->giveBcValue(VM_Total, tStep);
342 val = vect->
at(eqNum);
346 dof->updateUnknownsDictionary(tStep, VM_Total, val);
352NLTransientTransportProblem :: updateInternalState(
TimeStep *tStep)
356 for (
auto &dman : domain->giveDofManagers() ) {
362 for (
auto &elem : domain->giveElements() ) {
363 elem->updateInternalState(tStep);
369NLTransientTransportProblem :: assembleAlgorithmicPartOfRhs(
FloatArray &answer,
386 for (
int i = 1; i <= nelem; i++ ) {
410 if ( ( t >= pStep->
giveTargetTime() ) && ( t <= cStep->giveTargetTime() ) ) {
431 for (
int j = 1; j <= size; j++ ) {
433 for (
int k = 1; k <= size; k++ ) {
434 s += charMtrxCap.
at(j, k);
435 charMtrxCap.
at(j, k) = 0.0;
438 charMtrxCap.
at(j, j) = s;
#define REGISTER_EngngModel(class)
DofIDItem giveDofID() const
virtual int __giveEquationNumber() const =0
virtual void giveUnknowns(FloatArray &masterUnknowns, ValueModeType mode, TimeStep *tStep)
int giveNumberOfElements() const
Returns number of elements in domain.
Element * giveElement(int n)
std ::vector< std ::unique_ptr< Element > > & giveElements()
virtual void giveCharacteristicMatrix(FloatMatrix &answer, CharType type, TimeStep *tStep)
virtual bool isActivated(TimeStep *tStep)
virtual void updateYourself(TimeStep *tStep)
void giveLocationArray(IntArray &locationArray, const UnknownNumberingScheme &s, IntArray *dofIds=NULL) const
void computeVectorOf(ValueModeType u, TimeStep *tStep, FloatArray &answer)
elementParallelMode giveParallelMode() const
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 TimeStep * giveCurrentStep(bool force=false)
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.
virtual TimeStep * givePreviousStep(bool force=false)
std ::unique_ptr< TimeStep > stepWhenIcApply
Solution step when IC (initial conditions) apply.
double computeNorm() const
void assemble(const FloatArray &fe, const IntArray &loc)
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
void zero()
Zeroes all coefficients of receiver.
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
void add(const FloatArray &src)
int giveNumberOfRows() const
Returns number of rows of receiver.
double at(std::size_t i, std::size_t j) const
void applyIC(TimeStep *tStep) override
void updateDofUnknownsDictionary(DofManager *dman, TimeStep *tStep) override
void updateInternalState(TimeStep *tStep) override
int giveUnknownDictHashIndx(ValueModeType mode, TimeStep *tStep) override
void assembleAlgorithmicPartOfRhs(FloatArray &rhs, const UnknownNumberingScheme &s, TimeStep *tStep) override
int requiresUnknownsDictionaryUpdate() override
Allows to change number of equations during solution.
NonStationaryTransportProblem(int i, EngngModel *_master)
std ::unique_ptr< SparseLinearSystemNM > linSolver
int lumpedCapacityStab
If set then stabilization using lumped capacity will be used.
NumericalMethod * giveNumericalMethod(MetaStep *mStep) override
Returns reference to receiver's numerical method.
virtual void copyUnknownsInDictionary(ValueModeType mode, TimeStep *fromTime, TimeStep *toTime)
bool changingProblemSize
Determines if there are change in the problem size (no application/removal of Dirichlet boundary cond...
SparseMtrxType sparseMtrxType
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 setIntrinsicTime(double newt)
Sets only intrinsic time.
int giveMetaStepNumber()
Returns receiver's meta step number.
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.
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
StateCounterType giveSolutionStateCounter()
void updateInternalState(TimeStep *tStep) override
#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.
ClassFactory & classFactory
#define _IFT_NLTransientTransportProblem_rtol
#define _IFT_NLTransientTransportProblem_manrmsteps
#define _IFT_NLTransientTransportProblem_nsmax