OOFEM 3.0
Loading...
Searching...
No Matches
structuralslipfe2material.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
36#include "gausspoint.h"
37#include "engngm.h"
38#include "oofemtxtdatareader.h"
39#include "floatmatrix.h"
40#include "floatarray.h"
41#include "dynamicinputrecord.h"
42#include "classfactory.h"
43#include "util.h"
44#include "contextioerr.h"
47#include "exportmodulemanager.h"
48#include "vtkxmlexportmodule.h"
49#include "nummet.h"
54#include "mathfem.h"
55
56#include "dynamicdatareader.h"
57
58#include <sstream>
59
60namespace oofem {
62
63StructuralSlipFE2Material :: StructuralSlipFE2Material(int n, Domain *d) : StructuralFE2Material(n, d)
64{}
65
66
67void
86
87
88void
101
102
103std::unique_ptr<MaterialStatus>
104StructuralSlipFE2Material :: CreateStatus(GaussPoint *gp) const
105{
106 int rank = -1;
107 auto emodel = this->domain->giveEngngModel();
108 if ( emodel->isParallel() && emodel->giveNumberOfProcesses() > 1 ) {
109 rank = emodel->giveRank();
110 }
111
112 if ( !(outputSelected.giveSize()==0) ) {
113 std::vector<GaussPoint*> gpArray;
114 gpArray.resize(outputSelected.giveSize()/2);
115 for (int i = 1; i <= outputSelected.giveSize()/2; i++) {
116 GaussPoint* gpOut = domain->giveGlobalElement(outputSelected.at(i*2-1))->giveIntegrationRule(0)->getIntegrationPoint(outputSelected.at(i*2) - 1);
117 gpArray[i - 1] = gpOut;
118 }
119
120 if ( std::find(gpArray.begin(), gpArray.end(), gp) != gpArray.end() ) {
121 int nel = gp->giveElement()->giveGlobalNumber();
122 int gpn = gp->giveNumber();
123 return std::make_unique<StructuralSlipFE2MaterialStatus>(rank, gp, this->inputfile, nel, gpn);
124 } else {
125 return std::make_unique<StructuralSlipFE2MaterialStatus>(rank, gp, this->inputfile, 1, 1);
126 }
127 } else if ( allGPRes ) {
128 int nel = gp->giveElement()->giveGlobalNumber();
129 int gpn = gp->giveNumber();
130 return std::make_unique<StructuralSlipFE2MaterialStatus>(rank, gp, this->inputfile, nel, gpn);
131 } else {
132 return std::make_unique<StructuralSlipFE2MaterialStatus>(rank, gp, this->inputfile, 1, 1);
133 }
134
135}
136
139{
140 if (useExtStiff) {
141 auto status = static_cast<StructuralSlipFE2MaterialStatus*>(this->giveStatus(gp));
142 FloatMatrixF<3,3> answer;
143 answer = this->givendStressdEpsTangent;
144 status->setdStressdEpsTangent(answer);
145 return answer;
146 } else if (useNumTangent) {
148 } else {
149 auto status = static_cast<StructuralSlipFE2MaterialStatus*>(this->giveStatus(gp));
150 FloatMatrix tangent;
151 status->computeTangent(tStep); //implemented by BC
152 tangent.beSubMatrixOf(status->givedStressdEpsTangent(), {1,2,3}, {1,2,3});
153 FloatMatrixF<3,3> answer;
154 answer = tangent;
155 return answer;
156
157 }
158}
159
160
162{
163 auto ms = static_cast<StructuralSlipFE2MaterialStatus*>( this->giveStatus(gp) );
164
165 ms->setTimeStep(tStep);
166 ms->giveBC()->setDispGradient(strain);
167 // Solve subscale problem
168 ms->giveRVE()->solveYourselfAt(tStep);
169 // Post-process the stress
170 FloatArray stress;
171 ms->giveBC()->computeStress(stress, tStep);
172
173 FloatArrayF<6> updateStress;
174 updateStress = {stress[0], stress[1], 0., 0., 0., 0.5*(stress[2]+stress[3])};
175
176 FloatArrayF<6> updateStrain;
177 updateStrain = {strain[0], strain[1], 0., 0., 0., strain[2]};
178
179 FloatArrayF<3> answer;
180 answer = {stress[0], stress[1], 0.5*(stress[2]+stress[3])};
181
182 // Update the material status variables
183 ms->letTempStressVectorBe(updateStress);
184 ms->letTempStrainVectorBe(updateStrain);
185 ms->markOldTangent(); // Mark this so that tangent is reevaluated if they are needed.
186
187 return answer;
188}
189
190
191void StructuralSlipFE2Material::giveHomogenizedFields( FloatArray &stress, FloatArray &bStress, FloatArray &rStress, const FloatArray &strain, const FloatArray &slip, const FloatArray &slipGradient, GaussPoint *gp, TimeStep *tStep )
192{
194
195 ms->setTimeStep(tStep);
196 //Set input
197 ms->giveBC()->setDispGradient(strain);
198 ms->giveBC()->setSlipField(slip);
199 ms->giveBC()->setSlipGradient(slipGradient);
200// Solve subscale problem
201// OOFEM_LOG_INFO("Solving subscale problem at element %d, gp %d.\n Applied strain is %10.6e, %10.6e, %10.6e \n Applied slip is %10.6e, %10.6e \n Applied slip gradient is %10.6e, %10.6e, %10.6e, %10.6e \n", gp->giveElement()->giveGlobalNumber(), gp->giveNumber(), strain.at(1), strain.at(2), strain.at(3), slip.at(1), slip.at(2), slipGradient.at(1), slipGradient.at(2), slipGradient.at(3), slipGradient.at(4) );
202 ms->giveRVE()->solveYourselfAt(tStep);
203// OOFEM_LOG_INFO("Solution of RVE problem @ element %d, gp %d OK. \n", gp->giveElement()->giveGlobalNumber(), gp->giveNumber() );
204 //Homogenize fields
205 FloatArray stress4;
206 ms->giveBC()->computeStress(stress4, tStep);
207 ms->giveBC()->computeTransferStress(bStress, tStep);
208 ms->giveBC()->computeReinfStress(rStress, tStep);
209// OOFEM_LOG_INFO("Stress is %10.6e, %10.6e, %10.6e \n Transfer stress is %10.6e, %10.6e \n Reinforcement membrane stress is %10.6e, %10.6e, %10.6e, %10.6e \n", stress4.at(1), stress4.at(2), stress4.at(3), bStress.at(1), bStress.at(2), rStress.at(1), rStress.at(2), rStress.at(3), rStress.at(4) );
210
211 if (stress4.giveSize() == 4 ) {
212 stress = {stress4[0], stress4[1], 0.5*(stress4[2]+stress4[3])};
213 } else {
214 OOFEM_ERROR("Only 2D plane stress mode supported");
215 }
216
217 // Update the material status variables
218 ms->letTempStressVectorBe(stress);
219 ms->letTempStrainVectorBe(strain);
221 ms->letTempSlipVectorBe(slip);
222 ms->letTempReinfStressVectorBe(rStress);
223 ms->letTempSlipGradVectorBe(slipGradient);
224 ms->markOldTangent(); // Mark this so that tangent is reevaluated if they are needed.
225}
226
227
228void StructuralSlipFE2Material::giveSensitivities( FloatMatrix &dStressdEps, FloatMatrix &dStressdS, FloatMatrix &dStressdG, FloatMatrix &dBStressdEps, FloatMatrix &dBStressdS,
229 FloatMatrix &dBStressdG, FloatMatrix &dRStressdEps, FloatMatrix &dRStressdS, FloatMatrix &dRStressdG, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep )
230{
231 if ( useNumTangent ) {
232 //Numerical tangent
234 double h = 1.0e-9;
235
236 //get current values from material status
237 const FloatArray &epsRed = status->giveTempStrainVector();
238 const FloatArray &slipRed = status->giveTempSlipVector();
239 const FloatArray &slipGradRed = status->giveTempSlipGradVector();
240
241 FloatArray eps;
242 if ( epsRed.giveSize() != 3 ) {
243 eps = { epsRed[0], epsRed[1], epsRed[5] };
244 } else {
245 eps = epsRed;
246 }
247 FloatArray slip=slipRed;
248 FloatArray slipGrad=slipGradRed;
249
250 int dim1 = eps.giveSize();
251 int dim2 = slip.giveSize();
252 int dim3 = slipGrad.giveSize();
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();
262
263 FloatArray sig, sigPert, epsPert;
264 FloatArray bsig, bsigPert, slipPert;
265 FloatArray rsig, rsigPert, slipGradPert;
266
267 for(int i = 1; i <= dim1; i++) {
268 // Add a small perturbation to the strain
269 epsPert = eps;
270 epsPert.at(i) += h;
271
272 giveHomogenizedFields( sigPert, bsigPert, rsigPert, epsPert, slip, slipGrad, gp, tStep );
273 dStressdEps.setColumn( sigPert, i);
274 dBStressdEps.setColumn( bsigPert, i);
275 dRStressdEps.setColumn( rsigPert, i);
276 }
277
278 for(int i = 1; i <= dim2; i++) {
279 // Add a small perturbation to the slip
280 slipPert = slip;
281 slipPert.at(i) += h;
282
283 giveHomogenizedFields( sigPert, bsigPert, rsigPert, eps, slipPert, slipGrad, gp, tStep );
284 dStressdS.setColumn( sigPert, i );
285 dBStressdS.setColumn( bsigPert, i);
286 dRStressdS.setColumn( rsigPert, i);
287 }
288
289 for(int i = 1; i <= dim3; i++) {
290 // Add a small perturbation to slip gradient
291 slipGradPert = slipGrad;
292 slipGradPert.at(i) += h;
293
294 giveHomogenizedFields( sigPert, bsigPert, rsigPert, eps, slip, slipGradPert, gp, tStep );
295 dStressdG.setColumn( sigPert, i);
296 dBStressdG.setColumn( bsigPert, i);
297 dRStressdG.setColumn( rsigPert, i);
298 }
299
300 giveHomogenizedFields( sig, bsig, rsig, eps, slip, slipGrad, gp, tStep);
301
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;
306 }
307 for(int j = 1; j <= dim2; j++) {
308 dBStressdEps.at(j,i) -= bsig.at(j);
309 dBStressdEps.at(j,i) /= h;
310 }
311 for(int j = 1; j <= dim3; j++) {
312 dRStressdEps.at(j,i) -= rsig.at(j);
313 dRStressdEps.at(j,i) /= h;
314 }
315 }
316
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;
321 }
322 for(int j = 1; j <= dim2; j++) {
323 dBStressdS.at(j,i) -= bsig.at(j);
324 dBStressdS.at(j,i) /= h;
325 }
326 for(int j = 1; j <= dim3; j++) {
327 dRStressdS.at(j,i) -= rsig.at(j);
328 dRStressdS.at(j,i) /= h;
329 }
330 }
331
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;
336 }
337 for(int j = 1; j <= dim2; j++) {
338 dBStressdG.at(j,i) -= bsig.at(j);
339 dBStressdG.at(j,i) /= h;
340 }
341 for(int j = 1; j <= dim3; j++) {
342 dRStressdG.at(j,i) -= rsig.at(j);
343 dRStressdG.at(j,i) /= h;
344 }
345 }
346
347 status->setdStressdEpsTangent(dStressdEps);
348 status->setdBStressdEpsTangent(dBStressdEps);
349 status->setdRStressdEpsTangent(dRStressdEps);
350 status->setdStressdSTangent(dStressdS);
351 status->setdBStressdSTangent(dBStressdS);
352 status->setdRStressdSTangent(dRStressdS);
353 status->setdStressdGTangent(dStressdG);
354 status->setdBStressdGTangent(dBStressdG);
355 status->setdRStressdGTangent(dRStressdG);
356
357 } else if ( useExtStiff) {
359
360 dStressdEps = this->givendStressdEpsTangent;
361 dBStressdEps = this->givendBStressdEpsTangent;
362 dRStressdEps = this->givendRStressdEpsTangent;
363 dStressdS = this->givendStressdSTangent;
364 dBStressdS = this->givendBStressdSTangent;
365 dRStressdS = this->givendRStressdSTangent;
366 dStressdG = this->givendStressdGTangent;
367 dBStressdG = this->givendBStressdGTangent;
368 dRStressdG = this->givendRStressdGTangent;
369
370 ms->setdStressdEpsTangent(dStressdEps);
371 ms->setdBStressdEpsTangent(dBStressdEps);
372 ms->setdRStressdEpsTangent(dRStressdEps);
373 ms->setdStressdSTangent(dStressdS);
374 ms->setdBStressdSTangent(dBStressdS);
375 ms->setdRStressdSTangent(dRStressdS);
376 ms->setdStressdGTangent(dStressdG);
377 ms->setdBStressdGTangent(dBStressdG);
378 ms->setdRStressdGTangent(dRStressdG);
379 } else {
380 OOFEM_ERROR("Exact tangent not implemented. Either use_num_tangent or use_ext_stiffness");
381 }
382}
383
384//=============================================================================
385
386
387StructuralSlipFE2MaterialStatus :: StructuralSlipFE2MaterialStatus( int rank, GaussPoint * g, const std :: string & inputfile, int el, int gp ) :
389 mInputFile(inputfile)
390{
391 if ( !this->createRVE(inputfile, rank, el, gp) ) {
392 OOFEM_ERROR("Couldn't create RVE");
393 }
394 stressVector.resize(6);
395 strainVector.resize(6);
396 tempStressVector.resize(6);
397 tempStrainVector.resize(6);
398
399 //this is now hardcoded for 2d plane stress
400 slipVector.resize(2);
401 bStressVector.resize(2);
402 tempSlipVector.resize(2);
403 tempBStressVector.resize(2);
404
405 slipGradVector.resize(4);
406 rStressVector.resize(4);
407 tempSlipGradVector.resize(4);
408 tempRStressVector.resize(4);
409}
410
411
413{
414 this->bc = dynamic_cast< PrescribedDispSlipHomogenization * >( this->rve->giveDomain(1)->giveBc(1) );
415 return this->bc;
416}
417
418
419bool StructuralSlipFE2MaterialStatus :: createRVE(const std :: string &inputfile, int rank, int el, int gp)
420{
421 OOFEMTXTDataReader dr( inputfile );
422 this->rve = InstanciateProblem(dr, _processor, 0); // Everything but nrsolver is updated.
423 dr.finish();
424 this->rve->setProblemScale(microScale);
425 this->rve->checkProblemConsistency();
426 this->rve->initMetaStepAttributes( this->rve->giveMetaStep(1) );
427 this->rve->giveNextStep(); // Makes sure there is a timestep (which we will modify before solving a step)
428 this->rve->init();
429
430 std :: ostringstream name;
431 name << this->rve->giveOutputBaseFileName() << "_el" << el << "_gp" << gp;
432 if ( rank >= 0 ) {
433 name << "." << rank;
434 }
435
436 this->rve->letOutputBaseFileNameBe( name.str() );
437
438 bc = this->giveBC();
439 if ( !bc ) {
440 OOFEM_ERROR("RVE doesn't have necessary boundary condition; should have a type of PrescribedDispSlipHomogenization as first b.c.");
441 }
442
443 return true;
444}
445
446void StructuralSlipFE2MaterialStatus :: setTimeStep(TimeStep *tStep)
447{
448 TimeStep *rveTStep = this->rve->giveCurrentStep(); // Should i create a new one if it is empty?
449 rveTStep->setNumber( tStep->giveNumber() );
450 rveTStep->setTime( tStep->giveTargetTime() );
451 rveTStep->setTimeIncrement( tStep->giveTimeIncrement() );
452}
453
454void StructuralSlipFE2MaterialStatus :: initTempStatus()
455{
456 StructuralMaterialStatus :: initTempStatus();
457
458 // see if vectors describing reached equilibrium are defined
459 if ( this->giveSlipVector().giveSize() == 0 ) {
460 slipVector.resize(2);
461 }
462
463 if ( this->giveTransferStressVector().giveSize() == 0) {
464 bStressVector.resize(2);
465 }
466
467 if (this->giveSlipGradVector().giveSize() == 0) {
468 slipGradVector.resize(4);
469 }
470
471 if (this->giveReinfStressVector().giveSize() == 0) {
472 rStressVector.resize(4);
473 }
474
475 // reset temp vars.
480}
481
482
483void StructuralSlipFE2MaterialStatus :: computeTangent(TimeStep *tStep)
484{
485 if ( !tStep->isTheCurrentTimeStep() ) {
486 OOFEM_ERROR("Only current timestep supported.");
487 }
488
489 if ( this->olddSdETangent ) {
490 bc->computeTangent(this->givedStressdEpsTangent(), tStep);
491 }
492
493 this->olddSdETangent = false;
494}
495
496void StructuralSlipFE2MaterialStatus :: updateYourself(TimeStep *tStep)
497{
498 StructuralMaterialStatus :: updateYourself(tStep);
499 this->rve->updateYourself(tStep);
500 this->rve->terminate(tStep);
501
506}
507
509{
510 this->olddSdETangent = true;
511 this->olddBSdETangent = true;
512 this->olddRSdETangent = true;
513 this->olddSdSTangent = true;
514 this->olddBSdSTangent = true;
515 this->olddRSdSTangent = true;
516 this->olddSdGTangent = true;
517 this->olddBSdGTangent = true;
518 this->olddRSdGTangent = true;
519}
520
521} // end namespace oofem
#define REGISTER_Material(class)
void setField(int item, InputFieldType id)
int giveGlobalNumber() const
Definition element.h:1129
virtual void solveYourselfAt(TimeStep *tStep)
Definition engngm.h:484
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition femcmpnn.h:79
double & at(Index i)
Definition floatarray.h:202
Index giveSize() const
Returns the size of receiver.
Definition floatarray.h:261
void resize(Index rows, Index cols)
Definition floatmatrix.C:79
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.
Definition gausspoint.h:183
Element * giveElement()
Returns corresponding element to receiver.
Definition gausspoint.h:187
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Definition material.C:206
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
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)
PrescribedDispSlipHomogenization * giveBC()
void setdRStressdGTangent(const FloatMatrix &iTangent)
void setdStressdEpsTangent(const FloatMatrix &iTangent)
void setdRStressdSTangent(const FloatMatrix &iTangent)
void setdStressdGTangent(const FloatMatrix &iTangent)
std ::unique_ptr< EngngModel > rve
The RVE.
FloatMatrix & givedStressdEpsTangent()
Setters and getters.
void setdBStressdEpsTangent(const FloatMatrix &iTangent)
PrescribedDispSlipHomogenization * bc
Boundary condition in RVE that performs the computational homogenization.
void setdStressdSTangent(const FloatMatrix &iTangent)
void setdBStressdGTangent(const FloatMatrix &iTangent)
void setdRStressdEpsTangent(const FloatMatrix &iTangent)
bool createRVE(const std ::string &inputfile, int rank, int el, int gp)
virtual void giveHomogenizedFields(FloatArray &stress, FloatArray &bStress, FloatArray &rStress, const FloatArray &strain, const FloatArray &slip, const FloatArray &slipGradient, GaussPoint *gp, TimeStep *tStep)
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)
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.
double giveTimeIncrement()
Returns solution step associated time increment.
Definition timestep.h:168
void setNumber(int i)
Set receiver's number.
Definition timestep.h:146
double giveTargetTime()
Returns target time.
Definition timestep.h:164
void setTimeIncrement(double newDt)
Sets solution step time increment.
Definition timestep.h:170
int giveNumber()
Returns receiver's number.
Definition timestep.h:144
bool isTheCurrentTimeStep()
Definition timestep.C:164
void setTime(double newt)
Sets target and intrinsic time to be equal.
Definition timestep.h:172
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
std::unique_ptr< EngngModel > InstanciateProblem(DataReader &dr, problemMode mode, int contextFlag, EngngModel *_master, bool parallelFlag)
Definition util.C:153
@ _processor
Definition problemmode.h:40
@ microScale
Definition problemmode.h:47
#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

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011