71 int components = (
ndim * (
ndim + 1 ) ) / 2;
72 for (
int i = 1; i <= components; ++i ) {
80void FluidMaterialEvaluator :: solveYourself()
87 OOFEM_ERROR(
"1d flow not supported (should be added)")
89 }
else if (
ndim == 2 ) {
95 int components = (
ndim * (
ndim + 1 ) ) / 2;
101 gps.emplace_back( std::make_unique<GaussPoint>(
nullptr, i,
FloatArray(), 1, mode) );
109 this->
outfile.open( outname.c_str() );
111 this->
timer.startTimer(EngngModelTimer :: EMTT_AnalysisTimer);
118 double strainVolC = 0.;
121 for (
int istep = 1; istep <= this->
numberOfSteps; ++istep ) {
122 this->
timer.startTimer(EngngModelTimer :: EMTT_SolutionStepTimer);
129 double pressure = 0.;
131 for (
int j = 1; j <=
eControl.giveSize(); ++j ) {
136 for (
int j = 1; j <=
sControl.giveSize(); ++j ) {
147 for (
int iter = 1; iter < maxiter; iter++ ) {
155 stressDev = val.first;
156 strainVol = val.second;
159 stressDev = val.first;
160 strainVol = val.second;
163 for (
int j = 1; j <=
sControl.giveSize(); ++j ) {
164 res.
at(j) = stressDevC.at(j) - stressDev.
at(
sControl.at(j) );
168 resVol = strainVolC - strainVol;
171 OOFEM_LOG_RELEVANT(
"Time step: %d, Material %d, Iteration: %d, Residual = %e, Resvol = %e\n", istep, imat, iter,
norm(res), resVol );
191 for (
int i = 1; i <= this->
ndim; ++i ) {
192 for (
int j = 1; j <= this->
ndim; ++j ) {
203 for (
int j = 1; j <=
sControl.giveSize(); ++j ) {
204 strainDev.at(
sControl.at(j) ) += deltaStrain.
at(j);
208 pressure -= resVol/dedp;
220 this->
timer.stopTimer(EngngModelTimer :: EMTT_SolutionStepTimer);
225 this->
timer.stopTimer(EngngModelTimer :: EMTT_AnalysisTimer);
229int FluidMaterialEvaluator :: checkConsistency()
238 return EngngModel :: checkConsistency();
241void FluidMaterialEvaluator :: doStepOutput(
TimeStep *tStep)
247 for (
int var: this->
vars ) {
258 for (
int j = 1; j <= this->
vars.giveSize(); ++j ) {
#define REGISTER_EngngModel(class)
Material * giveMaterial(int n)
int giveNumberOfMaterialModels() const
Returns number of material models in domain.
Function * giveFunction(int n)
int giveNumberOfTimeStepWhenIcApply()
Returns the time step number, when initial conditions should apply.
std::string giveOutputBaseFileName()
EngngModel(int i, EngngModel *_master=NULL)
std ::unique_ptr< TimeStep > previousStep
Previous time step.
int ndomains
Number of receiver domains.
int numberOfSteps
Total number of time steps.
Domain * giveDomain(int n)
std ::unique_ptr< TimeStep > currentStep
Current time step.
EngngModelTimer timer
E-model timer.
double computeNorm() const
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void beSubMatrixOf(const FloatMatrix &src, Index topRow, Index bottomRow, Index topCol, Index bottomCol)
double computeFrobeniusNorm() const
double at(std::size_t i, std::size_t j) const
bool solveForRhs(const FloatArray &b, FloatArray &answer, bool transpose=false)
const FloatArrayF< 6 > & giveDeviatoricStrainRateVector() const
void letDeviatoricStrainRateVectorBe(const FloatArrayF< 6 > &v)
virtual Tangents< 6 > computeTangents3D(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
virtual std::pair< FloatArrayF< 3 >, double > computeDeviatoricStress2D(const FloatArrayF< 3 > &eps, double pressure, GaussPoint *gp, TimeStep *tStep) const
int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep) override
virtual std::pair< FloatArrayF< 6 >, double > computeDeviatoricStress3D(const FloatArrayF< 6 > &eps, double pressure, GaussPoint *gp, TimeStep *tStep) const
virtual Tangents< 3 > computeTangents2D(MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) const
IntArray cmpntFunctions
Number of spatial dimensions.
double deltaT
Time increment.
TimeStep * giveNextStep() override
Returns next time step (next to current step) of receiver.
IntArray sControl
Time function controlling the volumetric/pressure part.
void doStepOutput(TimeStep *tStep) override
int volFunction
Time functions controlling each component of the deviatoric part of the stress.
std::vector< std ::unique_ptr< GaussPoint > > gps
virtual double evaluateAtTime(double t)
void updateYourself(TimeStep *tStep)
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
#define OOFEM_WARNING(...)
#define _IFT_FluidMaterialEvaluator_componentFunctions
Integer list of time functions for each component.
#define _IFT_FluidMaterialEvaluator_volFunction
Integer of time function for volumetric part.
#define _IFT_FluidMaterialEvaluator_stressControl
Integer list of the stress components which are controlled.
#define _IFT_FluidMaterialEvaluator_nDimensions
Number of dimensions (2 or 3).
#define _IFT_FluidMaterialEvaluator_deltat
#define _IFT_FluidMaterialEvaluator_outputVariables
Variables (from integration point) to be written.
#define _IFT_FluidMaterialEvaluator_numberOfTimeSteps
#define _IFT_FluidMaterialEvaluator_pressureControl
Bool(Integer) determining if pressure or volumetric strain-rate is controlled.
#define OOFEM_LOG_RELEVANT(...)
const char * __InternalStateTypeToString(InternalStateType _value)
double norm(const FloatArray &x)