70 StructuralFE2Material :: initializeFrom(ir);
91 StructuralFE2Material :: giveInputRecord(input);
103std::unique_ptr<MaterialStatus>
104StructuralSlipFE2Material :: CreateStatus(
GaussPoint *gp)
const
107 auto emodel = this->
domain->giveEngngModel();
108 if ( emodel->isParallel() && emodel->giveNumberOfProcesses() > 1 ) {
109 rank = emodel->giveRank();
113 std::vector<GaussPoint*> gpArray;
117 gpArray[i - 1] = gpOut;
120 if ( std::find(gpArray.begin(), gpArray.end(), gp) != gpArray.end() ) {
123 return std::make_unique<StructuralSlipFE2MaterialStatus>(rank, gp, this->
inputfile, nel, gpn);
125 return std::make_unique<StructuralSlipFE2MaterialStatus>(rank, gp, this->
inputfile, 1, 1);
130 return std::make_unique<StructuralSlipFE2MaterialStatus>(rank, gp, this->
inputfile, nel, gpn);
132 return std::make_unique<StructuralSlipFE2MaterialStatus>(rank, gp, this->
inputfile, 1, 1);
144 status->setdStressdEpsTangent(answer);
151 status->computeTangent(tStep);
152 tangent.
beSubMatrixOf(status->givedStressdEpsTangent(), {1,2,3}, {1,2,3});
166 ms->giveBC()->setDispGradient(strain);
168 ms->giveRVE()->solveYourselfAt(tStep);
171 ms->giveBC()->computeStress(stress, tStep);
174 updateStress = {stress[0], stress[1], 0., 0., 0., 0.5*(stress[2]+stress[3])};
177 updateStrain = {strain[0], strain[1], 0., 0., 0., strain[2]};
180 answer = {stress[0], stress[1], 0.5*(stress[2]+stress[3])};
183 ms->letTempStressVectorBe(updateStress);
184 ms->letTempStrainVectorBe(updateStrain);
185 ms->markOldTangent();
212 stress = {stress4[0], stress4[1], 0.5*(stress4[2]+stress4[3])};
214 OOFEM_ERROR(
"Only 2D plane stress mode supported");
243 eps = { epsRed[0], epsRed[1], epsRed[5] };
253 dStressdEps.
resize(dim1,dim1); dStressdEps.
zero();
254 dBStressdEps.
resize(dim2,dim1); dBStressdEps.
zero();
255 dRStressdEps.
resize(dim3,dim1); dRStressdEps.
zero();
256 dStressdS.
resize(dim1,dim2); dStressdS.
zero();
257 dBStressdS.
resize(dim2,dim2); dBStressdS.
zero();
258 dRStressdS.
resize(dim3,dim2); dRStressdS.
zero();
259 dStressdG.
resize(dim1,dim3); dStressdG.
zero();
260 dBStressdG.
resize(dim2,dim3); dBStressdG.
zero();
261 dRStressdG.
resize(dim3,dim3); dRStressdG.
zero();
267 for(
int i = 1; i <= dim1; i++) {
278 for(
int i = 1; i <= dim2; i++) {
289 for(
int i = 1; i <= dim3; i++) {
291 slipGradPert = slipGrad;
292 slipGradPert.
at(i) += h;
302 for(
int i = 1; i <= dim1; i++) {
303 for(
int j = 1; j <= dim1; j++) {
304 dStressdEps.
at(j,i) -= sig.
at(j);
305 dStressdEps.
at(j,i) /= h;
307 for(
int j = 1; j <= dim2; j++) {
308 dBStressdEps.
at(j,i) -= bsig.
at(j);
309 dBStressdEps.
at(j,i) /= h;
311 for(
int j = 1; j <= dim3; j++) {
312 dRStressdEps.
at(j,i) -= rsig.
at(j);
313 dRStressdEps.
at(j,i) /= h;
317 for(
int i = 1; i <= dim2; i++) {
318 for(
int j = 1; j <= dim1; j++) {
319 dStressdS.
at(j,i) -= sig.
at(j);
320 dStressdS.
at(j,i) /= h;
322 for(
int j = 1; j <= dim2; j++) {
323 dBStressdS.
at(j,i) -= bsig.
at(j);
324 dBStressdS.
at(j,i) /= h;
326 for(
int j = 1; j <= dim3; j++) {
327 dRStressdS.
at(j,i) -= rsig.
at(j);
328 dRStressdS.
at(j,i) /= h;
332 for(
int i = 1; i <= dim3; i++) {
333 for(
int j = 1; j <= dim1; j++) {
334 dStressdG.
at(j,i) -= sig.
at(j);
335 dStressdG.
at(j,i) /= h;
337 for(
int j = 1; j <= dim2; j++) {
338 dBStressdG.
at(j,i) -= bsig.
at(j);
339 dBStressdG.
at(j,i) /= h;
341 for(
int j = 1; j <= dim3; j++) {
342 dRStressdG.
at(j,i) -= rsig.
at(j);
343 dRStressdG.
at(j,i) /= h;
380 OOFEM_ERROR(
"Exact tangent not implemented. Either use_num_tangent or use_ext_stiffness");
387StructuralSlipFE2MaterialStatus :: StructuralSlipFE2MaterialStatus(
int rank,
GaussPoint * g,
const std :: string & inputfile,
int el,
int gp ) :
419bool StructuralSlipFE2MaterialStatus :: createRVE(
const std :: string &inputfile,
int rank,
int el,
int gp)
425 this->
rve->checkProblemConsistency();
426 this->
rve->initMetaStepAttributes( this->
rve->giveMetaStep(1) );
427 this->
rve->giveNextStep();
430 std :: ostringstream name;
431 name << this->
rve->giveOutputBaseFileName() <<
"_el" << el <<
"_gp" <<
gp;
436 this->
rve->letOutputBaseFileNameBe( name.str() );
440 OOFEM_ERROR(
"RVE doesn't have necessary boundary condition; should have a type of PrescribedDispSlipHomogenization as first b.c.");
446void StructuralSlipFE2MaterialStatus :: setTimeStep(
TimeStep *tStep)
454void StructuralSlipFE2MaterialStatus :: initTempStatus()
456 StructuralMaterialStatus :: initTempStatus();
483void StructuralSlipFE2MaterialStatus :: computeTangent(
TimeStep *tStep)
496void StructuralSlipFE2MaterialStatus :: updateYourself(
TimeStep *tStep)
498 StructuralMaterialStatus :: updateYourself(tStep);
499 this->
rve->updateYourself(tStep);
500 this->
rve->terminate(tStep);
#define REGISTER_Material(class)
int giveGlobalNumber() const
virtual void solveYourselfAt(TimeStep *tStep)
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Index giveSize() const
Returns the size of receiver.
void resize(Index rows, Index cols)
void beSubMatrixOf(const FloatMatrix &src, Index topRow, Index bottomRow, Index topCol, Index bottomCol)
void setColumn(const FloatArray &src, int c)
void zero()
Zeroes all coefficient of receiver.
double at(std::size_t i, std::size_t j) const
int giveNumber()
Returns number of receiver.
Element * giveElement()
Returns corresponding element to receiver.
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void setSlipGradient(const FloatArray &t)
virtual void setDispGradient(const FloatArray &t)
virtual void setSlipField(const FloatArray &t)
virtual void computeStress(FloatArray &stress, TimeStep *tStep)=0
virtual void computeTransferStress(FloatArray &bStress, TimeStep *tStep)=0
virtual void computeReinfStress(FloatArray &rStress, TimeStep *tStep)=0
FloatMatrixF< 3, 3 > givePlaneStressStiffMtrx(MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep) const override
StructuralFE2Material(int n, Domain *d)
StructuralMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralMaterialStatus with IntegrationPoint g.
FloatArray tempStrainVector
Temporary strain vector in reduced form (to find balanced state).
FloatArray tempStressVector
Temporary stress vector in reduced form (increments are used mainly in nonlinear analysis).
FloatArray stressVector
Equilibrated stress vector in reduced form.
const FloatArray & giveTempStrainVector() const
Returns the const pointer to receiver's temporary strain vector.
FloatArray strainVector
Equilibrated strain vector in reduced form.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
void letTempStrainVectorBe(const FloatArray &v)
Assigns tempStrainVector to given vector v.
void setdBStressdSTangent(const FloatMatrix &iTangent)
const FloatArray & giveSlipVector() const
PrescribedDispSlipHomogenization * giveBC()
FloatArray tempRStressVector
void setdRStressdGTangent(const FloatMatrix &iTangent)
const FloatArray & giveTempSlipVector() const
FloatArray slipGradVector
const FloatArray & giveSlipGradVector() const
void setdStressdEpsTangent(const FloatMatrix &iTangent)
void setdRStressdSTangent(const FloatMatrix &iTangent)
void setTimeStep(TimeStep *tStep)
void letTempReinfStressVectorBe(const FloatArray &v)
FloatArray tempBStressVector
FloatArray tempSlipVector
FloatArray tempSlipGradVector
const FloatArray & giveReinfStressVector() const
const FloatArray & giveTempSlipGradVector() const
void setdStressdGTangent(const FloatMatrix &iTangent)
std ::unique_ptr< EngngModel > rve
The RVE.
FloatMatrix & givedStressdEpsTangent()
Setters and getters.
void setdBStressdEpsTangent(const FloatMatrix &iTangent)
EngngModel * giveRVE() const
PrescribedDispSlipHomogenization * bc
Boundary condition in RVE that performs the computational homogenization.
void setdStressdSTangent(const FloatMatrix &iTangent)
void setdBStressdGTangent(const FloatMatrix &iTangent)
const FloatArray & giveTransferStressVector() const
void setdRStressdEpsTangent(const FloatMatrix &iTangent)
bool createRVE(const std ::string &inputfile, int rank, int el, int gp)
void letTempSlipGradVectorBe(const FloatArray &v)
void letTempSlipVectorBe(const FloatArray &v)
void letTempTransferStressVectorBe(const FloatArray &v)
FloatMatrix givendBStressdEpsTangent
FloatMatrix givendBStressdGTangent
FloatMatrix givendStressdSTangent
FloatMatrix givendRStressdSTangent
virtual void giveHomogenizedFields(FloatArray &stress, FloatArray &bStress, FloatArray &rStress, const FloatArray &strain, const FloatArray &slip, const FloatArray &slipGradient, GaussPoint *gp, TimeStep *tStep)
FloatMatrix givendRStressdEpsTangent
virtual void giveSensitivities(FloatMatrix &dStressdEps, FloatMatrix &dStressdS, FloatMatrix &dStressdG, FloatMatrix &dBStressdEps, FloatMatrix &dBStressdS, FloatMatrix &dBStressdG, FloatMatrix &dRStressdEps, FloatMatrix &dRStressdS, FloatMatrix &dRStressdG, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
FloatMatrix givendStressdGTangent
FloatMatrix givendStressdEpsTangent
FloatMatrix givendRStressdGTangent
FloatMatrixF< 3, 3 > givePlaneStressStiffMtrx(MatResponseMode mmode, GaussPoint *gp, TimeStep *tStep) const override
FloatArrayF< 3 > giveRealStressVector_PlaneStress(const FloatArrayF< 3 > &strain, GaussPoint *gp, TimeStep *tStep) const override
Default implementation relies on giveRealStressVector_StressControl.
FloatMatrix givendBStressdSTangent
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.
bool isTheCurrentTimeStep()
void setTime(double newt)
Sets target and intrinsic time to be equal.
std::unique_ptr< EngngModel > InstanciateProblem(DataReader &dr, problemMode mode, int contextFlag, EngngModel *_master, bool parallelFlag)
#define _IFT_StructuralSlipFE2Material_dStressdG
#define _IFT_StructuralSlipFE2Material_dBStressdEps
#define _IFT_StructuralSlipFE2Material_dStressdS
#define _IFT_StructuralSlipFE2Material_allGPResults
#define _IFT_StructuralSlipFE2Material_outputSelectedResults
#define _IFT_StructuralSlipFE2Material_dStressdEps
#define _IFT_StructuralSlipFE2Material_dBStressdG
#define _IFT_StructuralSlipFE2Material_dRStressdEps
#define _IFT_StructuralSlipFE2Material_useExternalStiffness
#define _IFT_StructuralSlipFE2Material_dRStressdG
#define _IFT_StructuralSlipFE2Material_dRStressdS
#define _IFT_StructuralSlipFE2Material_dBStressdS