OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
fe2fluidmaterial.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 - 2013 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 
35 #include "fe2fluidmaterial.h"
36 #include "stokesflow.h"
37 #include "oofemtxtdatareader.h"
38 #include "domain.h"
39 #include "gausspoint.h"
40 #include "contextioerr.h"
41 #include "util.h"
42 #include "classfactory.h"
43 #include "dynamicinputrecord.h"
44 #include "mathfem.h"
45 
46 #include <sstream>
47 
48 //#define DEBUG_TANGENT
49 #define DEBUG_ERR ( 1e-6 )
50 
51 namespace oofem {
52 REGISTER_Material(FE2FluidMaterial);
53 
54 int FE2FluidMaterial :: n = 1;
55 
57 {
58  TimeStep *rveTStep = this->rve->giveCurrentStep(); // Should i create a new one if it is empty?
59  rveTStep->setNumber( tStep->giveNumber() );
60  rveTStep->setTime( tStep->giveTargetTime() );
61  rveTStep->setTimeIncrement( tStep->giveTimeIncrement() );
62 }
63 
65 {
66  double r_vol;
67  this->computeDeviatoricStressVector(answer, r_vol, gp, eps, 0.0, tStep);
68  if ( gp->giveMaterialMode() == _2dFlow ) {
69  r_vol += eps.at(1) + eps.at(2);
70  } else {
71  r_vol += eps.at(1) + eps.at(2) + eps.at(3);
72  }
73 
74  if ( r_vol > 1e-9 ) {
75  OOFEM_ERROR("RVE seems to be compressible;"
76  " extended macro-formulation which doesn't assume incompressibility is required");
77  }
78 }
79 
80 void FE2FluidMaterial :: computeDeviatoricStressVector(FloatArray &stress_dev, double &r_vol, GaussPoint *gp, const FloatArray &eps, double pressure, TimeStep *tStep)
81 {
82  FE2FluidMaterialStatus *ms = static_cast< FE2FluidMaterialStatus * >( this->giveStatus(gp) );
83 
84  ms->setTimeStep(tStep);
85 
87 
88  // Set input
90  bc->setPrescribedPressure(pressure);
91  // Solve subscale problem
93 
94  bc->computeFields(stress_dev, r_vol, tStep);
95 
96  ms->letDeviatoricStressVectorBe(stress_dev);
98  ms->letPressureBe(pressure);
99  ms->markOldTangents(); // Mark this so that tangents are reevaluated if they are needed.
100  // One could also just compute them here, but you don't actually need them if the problem has converged, so this method saves on that iteration.
101  // Computing the tangents are often *more* expensive than computeFields, so this is well worth the time it saves
102  // All the tangents are computed in one go, because they are almost always all needed, and doing so saves time.
103 }
104 
106 {
107  FE2FluidMaterialStatus *ms = static_cast< FE2FluidMaterialStatus * >( this->giveStatus(gp) );
108  ms->computeTangents(tStep);
109  if ( mode == TangentStiffness ) {
110  answer = ms->giveDeviatoricTangent();
111  } else {
112  OOFEM_ERROR("Mode not implemented");
113  }
114 }
115 
117  MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
118 {
119  FE2FluidMaterialStatus *ms = static_cast< FE2FluidMaterialStatus * >( this->giveStatus(gp) );
120  ms->computeTangents(tStep);
121  if ( mode == TangentStiffness ) {
122  dsdd = ms->giveDeviatoricTangent();
123  dsdp = ms->giveDeviatoricPressureTangent();
124  dedd = ms->giveVolumetricDeviatoricTangent();
125  dedp = ms->giveVolumetricPressureTangent();
126 #if 0
127  // Numerical ATS for debugging
128  FloatMatrix numericalATS(6, 6);
129  FloatArray dsig;
130  FloatArray tempStrain(6);
131 
132  tempStrain.zero();
133  FloatArray sig, strain, sigPert;
134  double epspvol;
135  computeDeviatoricStressVector(sig, epspvol, gp, tempStrain, 0., tStep);
136  double h = 0.001; // Linear problem, size of this doesn't matter.
137  for ( int k = 1; k <= 6; ++k ) {
138  strain = tempStrain;
139  strain.at(k) += h;
140  double tmp = strain.at(1) + strain.at(2) + strain.at(3);
141  strain.at(1) -= tmp/3.0;
142  strain.at(2) -= tmp/3.0;
143  strain.at(3) -= tmp/3.0;
144  strain.printYourself();
145  computeDeviatoricStressVector(sigPert, epspvol, gp, strain, 0., tStep);
146  sigPert.printYourself();
147  dsig.beDifferenceOf(sigPert, sig);
148  numericalATS.setColumn(dsig, k);
149  }
150  numericalATS.times(1. / h);
151 
152  printf("Analytical deviatoric tangent = ");
153  dsdd.printYourself();
154  printf("Numerical deviatoric tangent = ");
155  numericalATS.printYourself();
156  numericalATS.subtract(dsdd);
157  double norm = numericalATS.computeFrobeniusNorm();
158  if ( norm > dsdd.computeFrobeniusNorm() * DEBUG_ERR && norm > 0.0 ) {
159  OOFEM_ERROR("Error in deviatoric tangent");
160  }
161 #endif
162 #if 0
163  // Numerical ATS for debugging
164  FloatArray strain(3);
165  strain.zero();
166  FloatArray sig, sigh;
167  double epspvol, pressure = 0.0;
168  double h = 1.00; // Linear problem, size of this doesn't matter.
169  computeDeviatoricStressVector(sig, epspvol, gp, strain, pressure, tStep);
170  computeDeviatoricStressVector(sigh, epspvol, gp, strain, pressure + h, tStep);
171 
172  FloatArray dsigh;
173  dsigh.beDifferenceOf(sigh, sig);
174  dsigh.times(1 / h);
175 
176  printf("Analytical deviatoric pressure tangent = ");
177  dsdp.printYourself();
178  printf("Numerical deviatoric pressure tangent = ");
179  dsigh.printYourself();
180  dsigh.subtract(dsdp);
181  double norm = dsigh.computeNorm();
182  if ( norm > dsdp.computeNorm() * DEBUG_ERR && norm > 0.0 ) {
183  OOFEM_ERROR("Error in deviatoric pressure tangent");
184  }
185 #endif
186 #if 0
187  // Numerical ATS for debugging
188  FloatArray tempStrain(3);
189  tempStrain.zero();
190  FloatArray sig, strain;
191  double epspvol, epspvol11, epspvol22, epspvol12, pressure = 0.0;
192  double h = 1.0; // Linear problem, size of this doesn't matter.
193 
194  computeDeviatoricStressVector(sig, epspvol, gp, tempStrain, pressure, tStep);
195  strain = tempStrain;
196  strain.at(1) += h;
197  computeDeviatoricStressVector(sig, epspvol11, gp, strain, pressure, tStep);
198  strain = tempStrain;
199  strain.at(2) += h;
200  computeDeviatoricStressVector(sig, epspvol22, gp, strain, pressure, tStep);
201  strain = tempStrain;
202  strain.at(3) += h;
203  computeDeviatoricStressVector(sig, epspvol12, gp, strain, pressure, tStep);
204 
205  FloatArray dvol(3);
206  dvol.at(1) = ( epspvol11 - epspvol ) / h;
207  dvol.at(2) = ( epspvol22 - epspvol ) / h;
208  dvol.at(3) = ( epspvol12 - epspvol ) / h;
209  dvol.at(1) += 1.0;
210  dvol.at(2) += 1.0;
211 
212  printf("Analytical volumetric deviatoric tangent = ");
213  dedd.printYourself();
214  printf("Numerical volumetric deviatoric tangent = ");
215  dvol.printYourself();
216  dvol.subtract(dedd);
217  double norm = dvol.computeNorm();
218  if ( norm > dedd.computeNorm() * DEBUG_ERR && norm > 0.0 ) {
219  OOFEM_ERROR("Error in volumetric deviatoric tangent");
220  }
221 #endif
222 #if 0
223  // Numerical ATS for debugging
224  FloatArray strain(3);
225  strain.zero();
226  FloatArray sig;
227  double epspvol, epspvolh, pressure = 0.0;
228  double h = 1.0; // Linear problem, size of this doesn't matter.
229 
230  computeDeviatoricStressVector(sig, epspvol, gp, strain, pressure, tStep);
231  computeDeviatoricStressVector(sig, epspvolh, gp, strain, pressure + h, tStep);
232 
233  double dvol = -( epspvolh - epspvol ) / h;
234 
235  printf("Analytical volumetric pressure tangent = %e\n", dedp);
236  printf("Numerical volumetric pressure tangent = %e\n", dvol);
237 
238  double norm = fabs(dvol - dedp);
239  if ( norm > fabs(dedp) * DEBUG_ERR && norm > 0.0 ) {
240  OOFEM_ERROR("Error in volumetric pressure tangent");
241  }
242 #endif
243  } else {
244  OOFEM_ERROR("Mode not implemented");
245  }
246 }
247 
249 {
250  IRResultType result;
251  IR_GIVE_FIELD(ir, this->inputfile, _IFT_FE2FluidMaterial_fileName);
253 }
254 
256 {
258  input.setField(this->inputfile, _IFT_FE2FluidMaterial_fileName);
259 }
260 
261 
263 {
264  FE2FluidMaterialStatus *status = static_cast< FE2FluidMaterialStatus * >( this->giveStatus(gp) );
265  if ( type == IST_VOFFraction ) {
266  answer = FloatArray{status->giveVOFFraction()};
267  return true;
268  } else if ( type == IST_Pressure ) {
269  answer = FloatArray{status->givePressure()};
270  return true;
271  } else if ( type == IST_Undefined ) {
272 #if 0
273  // Numerical ATS for debugging
274  FloatArray strain(3);
275  strain.zero();
276  FloatArray sig;
277  double epspvol, epspvolh, pressure = 0.0;
278  double h = 1.0; // Linear problem, size of this doesn't matter.
279 
280  computeDeviatoricStressVector(sig, epspvol, gp, strain, pressure, tStep);
281  computeDeviatoricStressVector(sig, epspvolh, gp, strain, pressure + h, tStep);
282 
283  double dvol = - ( epspvolh - epspvol ) / h;
284 
285 
286  printf("Analytical volumetric pressure tangent = %f\n", status->giveVolumetricPressureTangent());
287  printf("Numerical volumetric pressure tangent = %f\n", dvol);
288 
289  double norm = fabs(dvol - status->giveVolumetricPressureTangent());
290  if ( norm > fabs(status->giveVolumetricPressureTangent()) * DEBUG_ERR && norm > 0.0 ) {
291  OOFEM_ERROR("Error in volumetric pressure tangent");
292  }
293 #endif
294  answer = FloatArray{status->giveVolumetricPressureTangent()};
295  return true;
296  } else {
297  return FluidDynamicMaterial :: giveIPValue(answer, gp, type, tStep);
298  }
299 }
300 
301 
303 {
304  return new FE2FluidMaterialStatus(n++, this->giveDomain(), gp, this->inputfile);
305 }
306 
308 {
309  return true;
310 }
311 
312 FE2FluidMaterialStatus :: FE2FluidMaterialStatus(int n, Domain *d, GaussPoint *gp, const std :: string &inputfile) :
314 {
315  //this->strainVector.resize(size);
316  //this->strainVector.zero();
317  //this->tempStrainVector = this->strainVector;
318  this->voffraction = 0.0;
319  this->oldTangents = true;
320 
321  if ( !this->createRVE(n, gp, inputfile) ) {
322  OOFEM_ERROR("Couldn't create RVE");
323  }
324 }
325 
327 {
328 }
329 
330 // Uses an input file for now, should eventually create the RVE itself.
331 bool FE2FluidMaterialStatus :: createRVE(int n, GaussPoint *gp, const std :: string &inputfile)
332 {
333  OOFEMTXTDataReader dr( inputfile.c_str() );
334  EngngModel *em = InstanciateProblem(dr, _processor, 0); // Everything but nrsolver is updated.
335  dr.finish();
336  em->setProblemScale(microScale);
337  em->checkProblemConsistency();
338  em->initMetaStepAttributes( em->giveMetaStep(1) );
339  em->giveNextStep(); // Makes sure there is a timestep (which we will modify before solving a step)
340  em->init();
341 
342  this->rve.reset( em );
343 
344  std :: ostringstream name;
345  name << this->rve->giveOutputBaseFileName() << "-gp" << n;
346  if ( this->domain->giveEngngModel()->isParallel() && this->domain->giveEngngModel()->giveNumberOfProcesses() > 1 ) {
347  name << "." << this->domain->giveEngngModel()->giveRank();
348  }
349 
350  this->rve->letOutputBaseFileNameBe( name.str() );
351 
352  this->bc = dynamic_cast< MixedGradientPressureBC * >( this->rve->giveDomain(1)->giveBc(1) );
353  if ( !this->bc ) {
354  OOFEM_ERROR("RVE doesn't have necessary boundary condition; should have MixedGradientPressure as first b.c. (in first domain)");
355  }
356 
357  return true;
358 }
359 
361 {
363 }
364 
366 {
367  double fluid_area = this->rve->giveDomain(1)->giveSize();
368  double total_area = this->bc->domainSize();
369  this->voffraction = fluid_area / total_area;
371 
372  this->rve->updateYourself(tStep);
373  this->rve->terminate(tStep);
374 }
375 
377 {
379 }
380 
382 {
383  contextIOResultType iores;
384  if ( ( iores = FluidDynamicMaterialStatus :: saveContext(stream, mode, obj) ) != CIO_OK ) {
385  THROW_CIOERR(iores);
386  }
387 
388  return this->rve->saveContext(stream, mode);
389 }
390 
392 {
393  contextIOResultType iores;
394  if ( ( iores = FluidDynamicMaterialStatus :: restoreContext(stream, mode, obj) ) != CIO_OK ) {
395  THROW_CIOERR(iores);
396  }
397  this->markOldTangents();
398 
399  return this->rve->restoreContext(stream, mode);
400 }
401 
403 
405 {
406  if ( !tStep->isTheCurrentTimeStep() ) {
407  OOFEM_ERROR("Only current timestep supported.");
408  }
409 
410  if ( this->oldTangents ) {
415  tStep);
416  }
417 
418  this->oldTangents = false;
419 }
420 
422 {
423  FE2FluidMaterialStatus *status = static_cast< FE2FluidMaterialStatus * >( this->giveStatus(gp) );
424  status->computeTangents(tStep);
425  const FloatMatrix &t = status->giveDeviatoricTangent();
426  // Project against the normalized I_dev
427  double v;
428  if ( gp->giveMaterialMode() == _3dFlow ) {
429  v = ( t.at(1, 1) * 2. - t.at(1, 2) - t.at(1, 3) ) / 3. +
430  ( -t.at(2, 1) + t.at(2, 2) * 2. - t.at(2, 3) ) / 3. +
431  ( -t.at(3, 1) - t.at(3, 2) + t.at(3, 3) * 2. ) / 3. +
432  4. * ( t.at(4, 4) + t.at(5, 5) + t.at(6, 6) );
433  v /= 16.;
434  } else {
435  v = ( t.at(1, 1) * 2. - t.at(1, 2) ) / 3. +
436  ( -t.at(2, 1) + t.at(2, 2) * 2. ) / 3. +
437  4. * t.at(3, 3);
438  v *= 9. / 56.;
439  }
440 
441  return v;
442 }
443 } // end namespace oofem
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
void setField(int item, InputFieldType id)
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Definition: gausspoint.h:191
virtual void updateYourself(TimeStep *)
Update equilibrium history variables according to temp-variables.
Definition: matstatus.h:108
void subtract(const FloatArray &src)
Subtracts array src to receiver.
Definition: floatarray.C:258
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
FE2FluidMaterialStatus(int n, Domain *d, GaussPoint *gp, const std::string &inputfile)
Creates new material status.
GaussPoint * gp
Associated integration point.
Class and object Domain.
Definition: domain.h:115
Domain * domain
Link to domain object, useful for communicating with other FEM components.
Definition: femcmpnn.h:82
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
virtual double giveEffectiveViscosity(GaussPoint *gp, TimeStep *tStep)
Gives the effective viscosity for the given integration point.
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
Definition: datastream.h:54
void computeTangents(TimeStep *tStep)
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver&#39;s output to given stream.
MixedGradientPressureBC * bc
Boundary condition in RVE that performs the computational homogenization.
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
virtual void computeFields(FloatArray &stressDev, double &vol, TimeStep *tStep)=0
Computes the homogenized fields through sensitivity analysis.
double domainSize()
Computes the size (including pores) by surface integral over the domain.
void setTimeStep(TimeStep *tStep)
Copies time step data to RVE.
void letDeviatoricStrainRateVectorBe(FloatArray v)
virtual void giveDeviatoricStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the deviatoric stiffness; .
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
Definition: domain.C:433
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
double giveTargetTime()
Returns target time.
Definition: timestep.h:146
bool isParallel() const
Returns true if receiver in parallel mode.
Definition: engngm.h:1056
void setTime(double newt)
Sets target and intrinsic time to be equal.
Definition: timestep.h:154
void setTimeIncrement(double newDt)
Sets solution step time increment.
Definition: timestep.h:152
int giveNumberOfProcesses() const
Returns the number of collaborating processes.
Definition: engngm.h:1060
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.
Definition: material.C:110
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Print receiver&#39;s output to given stream.
virtual void giveStiffnessMatrices(FloatMatrix &dsdd, FloatArray &dsdp, FloatArray &dedd, double &dedp, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
Computes the 4 tangents of the compressible material response in 3D.
MatResponseMode
Describes the character of characteristic material matrix.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
#define THROW_CIOERR(e)
Definition: contextioerr.h:61
void beDifferenceOf(const FloatArray &a, const FloatArray &b)
Sets receiver to be a - b.
Definition: floatarray.C:341
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
double giveTimeIncrement()
Returns solution step associated time increment.
Definition: timestep.h:150
FloatArray & giveVolumetricDeviatoricTangent()
void letDeviatoricStressVectorBe(FloatArray v)
Sets the deviatoric stress.
virtual void setPrescribedPressure(double p)=0
Set prescribed pressure.
EngngModel * InstanciateProblem(DataReader &dr, problemMode mode, int contextFlag, EngngModel *_master, bool parallelFlag)
Instanciates the new problem.
Definition: util.C:45
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
This class implements a transport material status information.
int giveNumber()
Returns receiver&#39;s number.
Definition: timestep.h:129
std::unique_ptr< EngngModel > rve
The subscale flow.
#define OOFEM_ERROR(...)
Definition: error.h:61
void times(double f)
Multiplies receiver by factor f.
Definition: floatmatrix.C:1594
virtual ~FE2FluidMaterialStatus()
Destructor.
double at(int i, int j) const
Coefficient access function.
Definition: floatmatrix.h:176
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
MixedGradientPressureBC * giveBC()
Class representing material status for the subscale fluid, i.e an Representative Volume Element (RVE)...
FloatArray & giveDeviatoricPressureTangent()
void subtract(const FloatMatrix &a)
Subtracts matrix from the receiver.
Definition: floatmatrix.C:1084
Abstract base class representing a material status information.
Definition: matstatus.h:84
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
Class representing vector of real numbers.
Definition: floatarray.h:82
virtual void computeDeviatoricStressVector(FloatArray &stress_dev, double &r_vol, GaussPoint *gp, const FloatArray &eps, double pressure, TimeStep *tStep)
Computes the deviatoric stress vector and volumetric strain rate from given deviatoric strain and pre...
bool isTheCurrentTimeStep()
Check if receiver is current solution step.
Definition: timestep.C:155
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
double computeFrobeniusNorm() const
Computes the Frobenius norm of the receiver.
Definition: floatmatrix.C:1613
IRResultType
Type defining the return values of InputRecord reading operations.
Definition: irresulttype.h:47
#define _IFT_FE2FluidMaterial_fileName
double norm(const FloatArray &x)
Definition: floatarray.C:985
double computeNorm() const
Computes the norm (or length) of the vector.
Definition: floatarray.C:840
Class representing the general Input Record.
Definition: inputrecord.h:101
virtual void printYourself() const
Print receiver on stdout.
Definition: floatarray.C:747
bool createRVE(int n, GaussPoint *gp, const std::string &inputfile)
Creates/Initiates the RVE problem.
virtual int checkConsistency()
Allows programmer to test some internal data, before computation begins.
void zero()
Zeroes all coefficients of receiver.
Definition: floatarray.C:658
int giveRank() const
Returns domain rank in a group of collaborating processes (0..groupSize-1)
Definition: engngm.h:1058
void setColumn(const FloatArray &src, int c)
Sets the values of the matrix in specified column.
Definition: floatmatrix.C:648
Class representing the a dynamic Input Record.
void times(double s)
Multiplies receiver with scalar.
Definition: floatarray.C:818
void printYourself() const
Prints matrix to stdout. Useful for debugging.
Definition: floatmatrix.C:1458
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
Definition: contextmode.h:43
Domain * giveDomain() const
Definition: femcmpnn.h:100
#define DEBUG_ERR
virtual void computeTangents(FloatMatrix &Ed, FloatArray &Ep, FloatArray &Cd, double &Cp, TimeStep *tStep)=0
Computes the macroscopic tangents through sensitivity analysis.
virtual void solveYourselfAt(TimeStep *tStep)
Solves problem for given time step.
Definition: engngm.h:451
REGISTER_Material(DummyMaterial)
Abstract base class representing the "problem" under consideration.
Definition: engngm.h:181
virtual TimeStep * giveCurrentStep(bool force=false)
Returns current time step.
Definition: engngm.h:683
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Class representing the implementation of plain text date reader.
the oofem namespace is to define a context or scope in which all oofem names are defined.
#define IR_GIVE_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:69
General class for boundary condition that prolongates macroscopic fields to incompressible flow...
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
Definition: material.C:89
Class representing integration point in finite element program.
Definition: gausspoint.h:93
virtual void setPrescribedDeviatoricGradientFromVoigt(const FloatArray &ddev)=0
Sets the prescribed tensor from the matrix from given Voigt notation.
Class representing solution step.
Definition: timestep.h:80
void setNumber(int i)
Set receiver&#39;s number.
Definition: timestep.h:131
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
virtual void giveInputRecord(DynamicInputRecord &input)
Setups the input record string of receiver.

This page is part of the OOFEM documentation. Copyright (c) 2011 Borek Patzak
Project e-mail: info@oofem.org
Generated at Tue Jan 2 2018 20:07:28 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011