54int RVEStokesFlow :: n = 1;
56RVEStokesFlowMaterialStatus :: RVEStokesFlowMaterialStatus(
int n,
int rank,
GaussPoint *g,
const std :: string &inputfile) :
59 OOFEM_LOG_INFO(
"************************** Instanciating microproblem from file %s\n", inputfile.c_str() );
71 std :: ostringstream name;
72 name << this->
rve->giveOutputBaseFileName() <<
"-gp" << n;
76 this->
rve->letOutputBaseFileNameBe( name.str() );
79 this->
rve->checkProblemConsistency();
80 this->
rve->initMetaStepAttributes( this->
rve->giveMetaStep(1) );
81 this->
rve->giveNextStep();
84 OOFEM_LOG_INFO(
"************************** Microproblem at %p instanciated \n",
rve.get());
88void RVEStokesFlowMaterialStatus :: setTimeStep(
TimeStep *tStep)
97RVEStokesFlowMaterialStatus :: initTempStatus()
99 TransportMaterialStatus :: initTempStatus();
103RVEStokesFlowMaterialStatus :: updateYourself(
TimeStep *tStep)
105 TransportMaterialStatus :: updateYourself(tStep);
108 this->
rve->updateYourself(tStep);
109 this->
rve->terminate(tStep);
116 TransportMaterialStatus :: saveContext(stream, mode);
123 TransportMaterialStatus :: restoreContext(stream, mode);
145 answer = status->giveFlux();
147 case IST_PressureGradient:
148 answer = status->giveGradient();
150 case IST_TangentNorm:
156 const auto &temp = status->giveTangentMatrix();
157 answer = {temp(0,0), temp(0,1), temp(0,2), temp(1,0), temp(1,1), temp(1,2), temp(2,0), temp(2,1), temp(2,2)};
161 return TransportMaterial :: giveIPValue(answer, gp, type, tStep);
171 OOFEM_LOG_DEBUG(
"\n****** Enter giveFluxVector ********************** Element number %u, Gauss point %u\n",
177 OOFEM_LOG_DEBUG(
"Solve RVE problem for macroscale pressure gradient gradP=[%f, %f, %f]\n ", grad[0], grad[1], grad[2] );
180 rveE->applyPressureGradient(grad);
181 status->setTimeStep(tStep);
182 rveE->solveYourselfAt(rveE->giveCurrentStep());
184 rveE->computeSeepage(answer, tStep);
187 OOFEM_LOG_DEBUG(
"Pressure gradient gradP=[%f %f] yields velocity vector [%f %f]\n", grad.
at(1), grad.
at(2), answer.
at(1), answer.
at(2) );
189 status->setTempGradient(grad);
190 status->setTempFlux(answer);
191 status->oldTangent =
true;
193 OOFEM_LOG_DEBUG(
"****** Exit giveFluxVector **************************************** \n");
201 OOFEM_LOG_DEBUG(
"\n****** Enter giveDeviatoricStiffnessMatrix **********************\n");
205 if ( status->oldTangent ) {
208 status->giveRVE()->computeTangent(answer, tStep);
210 #pragma GCC diagnostic push
212 #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
213 status->letTempTangentMatrixBe(answer);
214 #pragma GCC diagnostic pop
215 status->oldTangent =
false;
218 return status->giveTempTangentMatrix();
221 OOFEM_LOG_DEBUG(
"****** Exit giveDeviatoricStiffnessMatrix **************************************** \n");
225std::unique_ptr<MaterialStatus>
229 if ( this->
domain->giveEngngModel()->isParallel() && this->domain->giveEngngModel()->giveNumberOfProcesses() > 1 ) {
230 rank = this->
domain->giveEngngModel()->giveRank();
232 return std::make_unique<RVEStokesFlowMaterialStatus>(
n++, rank, gp, this->
rveFilename);
#define REGISTER_Material(class)
int giveGlobalNumber() const
Domain * domain
Link to domain object, useful for communicating with other FEM components.
double & at(std::size_t i)
void resizeWithValues(Index s, std::size_t allocChunk=0)
void resizeWithData(Index, Index)
int giveNumber()
Returns number of receiver.
Element * giveElement()
Returns corresponding element to receiver.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
FloatMatrixF< 3, 3 > temp_TangentMatrix
FloatMatrixF< 3, 3 > tangentMatrix
StokesFlowVelocityHomogenization * giveRVE()
std ::unique_ptr< StokesFlowVelocityHomogenization > rve
double giveTimeIncrement()
Returns solution step associated time increment.
void setNumber(int i)
Set receiver's number.
double giveTargetTime()
Returns target time.
void setTimeIncrement(double newDt)
Sets solution step time increment.
int giveNumber()
Returns receiver's number.
void setTime(double newt)
Sets target and intrinsic time to be equal.
TransportMaterialStatus(GaussPoint *g)
TransportMaterial(int n, Domain *d)
#define OOFEM_LOG_INFO(...)
#define OOFEM_LOG_DEBUG(...)
double frobeniusNorm(const FloatMatrixF< N, N > &mat)
std::unique_ptr< EngngModel > InstanciateProblem(DataReader &dr, problemMode mode, int contextFlag, EngngModel *_master, bool parallelFlag)
#define _IFT_RVEStokesFlow_fileName