OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
assemblercallback.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 "assemblercallback.h"
36 #include "floatarray.h"
37 #include "floatmatrix.h"
38 #include "element.h"
39 #include "dofmanager.h"
40 #include "activebc.h"
41 
42 #include "nodalload.h"
43 #include "bodyload.h"
44 #include "boundaryload.h"
45 
46 namespace oofem {
47 
48 void VectorAssembler :: vectorFromElement(FloatArray& vec, Element& element, TimeStep* tStep, ValueModeType mode) const { vec.clear(); }
49 
50 void VectorAssembler :: vectorFromLoad(FloatArray& vec, Element& element, BodyLoad* load, TimeStep* tStep, ValueModeType mode) const { vec.clear(); }
51 
52 void VectorAssembler :: vectorFromSurfaceLoad(FloatArray& vec, Element& element, SurfaceLoad* load, int boundary, TimeStep* tStep, ValueModeType mode) const { vec.clear(); }
53 
54 void VectorAssembler :: vectorFromEdgeLoad(FloatArray& vec, Element& element, EdgeLoad* load, int edge, TimeStep* tStep, ValueModeType mode) const { vec.clear(); }
55 
56 void VectorAssembler :: vectorFromNodeLoad(FloatArray& vec, DofManager& dman, NodalLoad* load, TimeStep* tStep, ValueModeType mode) const { vec.clear(); }
57 
59 
61 {
62  element.giveLocationArray(loc, s, dofIds);
63 }
64 
65 void VectorAssembler :: locationFromElementNodes(IntArray& loc, Element& element, const IntArray& bNodes, const UnknownNumberingScheme& s, IntArray* dofIds) const
66 {
67  element.giveBoundaryLocationArray(loc, bNodes, s, dofIds);
68 }
69 
70 void MatrixAssembler :: matrixFromElement(FloatMatrix& mat, Element& element, TimeStep* tStep) const { mat.clear(); }
71 
72 void MatrixAssembler :: matrixFromLoad(FloatMatrix& mat, Element& element, BodyLoad* load, TimeStep* tStep) const { mat.clear(); }
73 
74 void MatrixAssembler :: matrixFromSurfaceLoad(FloatMatrix& mat, Element& element, SurfaceLoad* load, int boundary, TimeStep* tStep) const { mat.clear(); }
75 
76 void MatrixAssembler :: matrixFromEdgeLoad(FloatMatrix& mat, Element& element, EdgeLoad* load, int edge, TimeStep* tStep) const { mat.clear(); }
77 
79 
81 {
82  element.giveLocationArray(loc, s, dofIds);
83 }
84 
85 void MatrixAssembler :: locationFromElementNodes(IntArray& loc, Element& element, const IntArray& bNodes, const UnknownNumberingScheme& s, IntArray* dofIds) const
86 {
87  element.giveBoundaryLocationArray(loc, bNodes, s, dofIds);
88 }
89 
90 
92 {
93  FloatMatrix mat;
94  this->mAssem.matrixFromElement(mat, element, tStep);
95  vec.beProductOf(mat, this->vec);
96 }
97 
99 {
100  FloatMatrix mat;
101  this->mAssem.matrixFromLoad(mat, element, load, tStep);
102  vec.beProductOf(mat, this->vec);
103 }
104 
105 void MatrixProductAssembler :: vectorFromSurfaceLoad(FloatArray& vec, Element& element, SurfaceLoad* load, int boundary, TimeStep* tStep, ValueModeType mode) const
106 {
107  FloatMatrix mat;
108  this->mAssem.matrixFromSurfaceLoad(mat, element, load, boundary, tStep);
109  vec.beProductOf(mat, this->vec);
110 }
111 
113 {
114  FloatMatrix mat;
115  this->mAssem.matrixFromEdgeLoad(mat, element, load, edge, tStep); // ??????
116  vec.beProductOf(mat, this->vec);
117 }
118 
119 
121 {
122  element.giveCharacteristicVector(vec, InternalForcesVector, mode, tStep);
123  //element.computeInternalForces(vec, tStep);
124 }
125 
127 {
128  element.computeLoadVector(vec, load, InternalForcesVector, mode, tStep);
129  //element.computeInternalForcesFromLoad(vec, load, tStep);
130 }
131 
132 void InternalForceAssembler :: vectorFromSurfaceLoad(FloatArray& vec, Element& element, SurfaceLoad* load, int boundary, TimeStep* tStep, ValueModeType mode) const
133 {
134  element.computeBoundarySurfaceLoadVector(vec, load, boundary, InternalForcesVector, mode, tStep);
135  //element.computeInternalForcesFromBoundaryLoad(vec, load, boundary, tStep);
136 }
137 
139 {
140  element.computeBoundaryEdgeLoadVector(vec, load, edge, InternalForcesVector, mode, tStep);
141  //element.computeInternalForcesFromEdgeLoad(vec, load, edge, tStep);
142 }
143 
145 {
146  bc.assembleVector(answer, tStep, InternalForcesVector, mode, s, eNorms);
147  //bc.assembleInternalForces(answer, tStep, s, eNorms);
148 }
149 
150 
152 {
154  element.giveCharacteristicVector(vec, ExternalForcesVector, mode, tStep);
155 }
156 
158 {
159  if ( ! load->reference )
160  element.computeLoadVector(vec, load, ExternalForcesVector, mode, tStep);
161  //element.computeExternalForcesFromLoad(vec, load, tStep);
162 }
163 
164 void ExternalForceAssembler :: vectorFromSurfaceLoad(FloatArray& vec, Element& element, SurfaceLoad* load, int boundary, TimeStep* tStep, ValueModeType mode) const
165 {
166  if ( ! load->reference )
167  element.computeBoundarySurfaceLoadVector(vec, load, boundary, ExternalForcesVector, mode, tStep);
168  //element.computeExternalForcesFromSurfaceLoad(vec, load, boundary, tStep);
169 }
170 
172 {
173  if ( ! load->reference )
174  element.computeBoundaryEdgeLoadVector(vec, load, edge, ExternalForcesVector, mode, tStep);
175  //element.computeExternalForcesFromEdgeLoad(vec, load, edge, tStep);
176 }
177 
179 {
180  if ( ! load->reference )
181  dman.computeLoadVector(vec, load, ExternalForcesVector, tStep, mode);
182  //dman.computeExternalForcesFromLoad(vec, load, tStep);
183 }
184 
186 {
187  bc.assembleVector(answer, tStep, ExternalForcesVector, mode, s, eNorms);
188  //bc.assembleExternalForces(answer, tStep, s, eNorms);
189 }
190 
191 
193 {
194  if ( load->reference )
195  element.computeLoadVector(vec, load, ExternalForcesVector, mode, tStep);
196  //element.computeExternalForcesFromLoad(vec, load, tStep);
197 }
198 
199 
200 void ReferenceForceAssembler :: vectorFromSurfaceLoad(FloatArray& vec, Element& element, SurfaceLoad* load, int boundary, TimeStep* tStep, ValueModeType mode) const
201 {
202  if ( load->reference )
203  element.computeBoundarySurfaceLoadVector(vec, load, boundary, ExternalForcesVector, mode, tStep);
204  //element.computeExternalForcesFromBoundaryLoad(vec, load, boundary, tStep);
205 }
206 
208 {
209  if ( load->reference )
210  element.computeBoundaryEdgeLoadVector(vec, load, edge, ExternalForcesVector, mode, tStep);
211  //element.computeExternalForcesFromEdgeLoad(vec, load, edge, tStep);
212 }
213 
215 {
216  if ( load->reference )
217  dman.computeLoadVector(vec, load, ExternalForcesVector, tStep, mode);
218  //dman.computeExternalForcesFromLoad(vec, load, tStep);
219 }
220 
221 
223 {
224  element.giveCharacteristicVector(vec, LumpedMassMatrix, mode, tStep);
225  //element.computeLumpedMassMatrix(vec, tStep);
226 }
227 
228 
230 {
231  element.giveCharacteristicVector(vec, InertiaForcesVector, mode, tStep);
232  //element.computeInertiaForces(vec, tStep);
233 }
234 
235 
237 {
238  if ( this->rmode == TangentStiffness ) {
239  element.giveCharacteristicMatrix(mat, TangentStiffnessMatrix, tStep);
240  } else if ( this->rmode == ElasticStiffness ) {
241  element.giveCharacteristicMatrix(mat, ElasticStiffnessMatrix, tStep);
242  } else if ( this->rmode == SecantStiffness ) {
243  element.giveCharacteristicMatrix(mat, SecantStiffnessMatrix, tStep);
244  }
245  //element.computeTangentMatrix(mat, this->rmode, tStep);
246 }
247 
248 void TangentAssembler :: matrixFromLoad(FloatMatrix& mat, Element& element, BodyLoad* load, TimeStep* tStep) const
249 {
250  mat.clear();
251  //element.computeTangentFromLoad(mat, load, this->rmode, tStep);
252 }
253 
254 void TangentAssembler :: matrixFromSurfaceLoad(FloatMatrix& mat, Element& element, SurfaceLoad* load, int boundary, TimeStep* tStep) const
255 {
256  element.computeTangentFromSurfaceLoad(mat, load, boundary, this->rmode, tStep);
257 }
258 
259 void TangentAssembler :: matrixFromEdgeLoad(FloatMatrix& mat, Element& element, EdgeLoad* load, int edge, TimeStep* tStep) const
260 {
261  //mat.clear();
262  element.computeTangentFromEdgeLoad(mat, load, edge, this->rmode, tStep);
263 }
264 
266 {
267  bc.assemble(k, tStep, TangentStiffnessMatrix, s_r, s_c);
268 }
269 
270 
271 
273 {
274  element.giveCharacteristicMatrix(mat, MassMatrix, tStep);
275  //element.computeMassMatrix(mat, tStep);
276 }
277 
278 
279 
281  MatrixAssembler(), rmode(mode), lumped(lumped), k(k), m(m)
282 {}
283 
285 {
286  FloatMatrix massMatrix;
287 
288  if ( this->rmode == TangentStiffness ) {
289  el.giveCharacteristicMatrix(answer, TangentStiffnessMatrix, tStep);
290  } else if ( this->rmode == ElasticStiffness ) {
291  el.giveCharacteristicMatrix(answer, ElasticStiffnessMatrix, tStep);
292  } else if ( this->rmode == SecantStiffness ) {
293  el.giveCharacteristicMatrix(answer, SecantStiffnessMatrix, tStep);
294  }
295  //element.computeTangentMatrix(answer, this->rmode, tStep);
296  answer.times(this->k);
297 
298  el.giveCharacteristicMatrix(massMatrix, this->lumped ? LumpedMassMatrix : MassMatrix, tStep);
299  answer.add(this->m, massMatrix);
300 }
301 
303 {
304  mat.clear();
305  //element.computeTangentFromLoad(mat, load, this->rmode, tStep);
306  //mat.times(this->k);
307 }
308 
309 void EffectiveTangentAssembler :: matrixFromSurfaceLoad(FloatMatrix& mat, Element& element, SurfaceLoad* load, int boundary, TimeStep* tStep) const
310 {
311  element.computeTangentFromSurfaceLoad(mat, load, boundary, this->rmode, tStep);
312  mat.times(this->k);
313 }
314 
316 {
317  mat.clear();
318  //element.computeTangentFromEdgeLoad(mat, load, edge, this->rmode, tStep);
319  //mat.times(this->k);
320 }
321 
323 {
324  // TODO: Crucial part to add: We have to support a scaling factor for this method to support effective tangents.
325  bc.assemble(k, tStep, TangentStiffnessMatrix, s_r, s_c, this->k);
326 }
327 
328 
329 }
Class implementing a concentrated load (force, moment,...) that acts directly on a dof manager (node ...
Definition: nodalload.h:67
virtual void computeBoundaryEdgeLoadVector(FloatArray &answer, BoundaryLoad *load, int edge, CharType type, ValueModeType mode, TimeStep *tStep, bool global=true)
Computes the contribution of the given load at the given boundary edge.
Definition: element.C:618
virtual void vectorFromElement(FloatArray &vec, Element &element, TimeStep *tStep, ValueModeType mode) const
EffectiveTangentAssembler(MatResponseMode mode, bool lumped, double k, double m)
virtual void matrixFromEdgeLoad(FloatMatrix &mat, Element &element, EdgeLoad *load, int edge, TimeStep *tStep) const
virtual void vectorFromElement(FloatArray &vec, Element &element, TimeStep *tStep, ValueModeType mode) const
virtual void vectorFromEdgeLoad(FloatArray &vec, Element &element, EdgeLoad *load, int edge, TimeStep *tStep, ValueModeType mode) const
virtual void vectorFromElement(FloatArray &vec, Element &element, TimeStep *tStep, ValueModeType mode) const
virtual void matrixFromEdgeLoad(FloatMatrix &mat, Element &element, EdgeLoad *load, int edge, TimeStep *tStep) const
virtual void matrixFromLoad(FloatMatrix &mat, Element &element, BodyLoad *load, TimeStep *tStep) const
virtual void matrixFromSurfaceLoad(FloatMatrix &mat, Element &element, SurfaceLoad *load, int boundary, TimeStep *tStep) const
virtual void vectorFromEdgeLoad(FloatArray &vec, Element &element, EdgeLoad *load, int edge, TimeStep *tStep, ValueModeType mode) const
Base class for all matrices stored in sparse format.
Definition: sparsemtrx.h:60
virtual void computeLoadVector(FloatArray &answer, Load *load, CharType type, TimeStep *tStep, ValueModeType mode)
Computes the load vector for given load.
Definition: dofmanager.C:97
bool reference
Definition: load.h:100
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
Definition: valuemodetype.h:78
Class implementing element body load, acting over whole element volume (e.g., the dead weight)...
Definition: bodyload.h:49
virtual void locationFromElement(IntArray &loc, Element &element, const UnknownNumberingScheme &s, IntArray *dofIds=nullptr) const
virtual void vectorFromSurfaceLoad(FloatArray &vec, Element &element, SurfaceLoad *load, int boundary, TimeStep *tStep, ValueModeType mode) const
void clear()
Clears receiver (zero size).
Definition: floatarray.h:206
virtual void matrixFromElement(FloatMatrix &mat, Element &element, TimeStep *tStep) const
virtual void computeTangentFromEdgeLoad(FloatMatrix &answer, EdgeLoad *load, int boundary, MatResponseMode rmode, TimeStep *tStep)
Computes the tangent contribution of the given load at the given boundary.
Definition: element.C:612
virtual void assemble(SparseMtrx &answer, TimeStep *tStep, CharType type, const UnknownNumberingScheme &r_s, const UnknownNumberingScheme &c_s, double scale=1.0)
Assembles B.C.
Definition: activebc.h:109
Abstract base class for all finite elements.
Definition: element.h:145
Base class for dof managers.
Definition: dofmanager.h:113
virtual void giveCharacteristicMatrix(FloatMatrix &answer, CharType type, TimeStep *tStep)
Computes characteristic matrix of receiver of requested type in given time step.
Definition: element.C:569
Class implementing an array of integers.
Definition: intarray.h:61
MatResponseMode
Describes the character of characteristic material matrix.
virtual void computeLoadVector(FloatArray &answer, BodyLoad *load, CharType type, ValueModeType mode, TimeStep *tStep)
Computes the contribution of the given body load (volumetric).
Definition: element.C:590
virtual void assembleFromActiveBC(FloatArray &answer, ActiveBoundaryCondition &bc, TimeStep *tStep, ValueModeType mode, const UnknownNumberingScheme &s, FloatArray *eNorms) const
virtual void vectorFromElement(FloatArray &vec, Element &element, TimeStep *tStep, ValueModeType mode) const
Callback class for assembling specific types of matrices.
virtual void vectorFromLoad(FloatArray &vec, Element &element, BodyLoad *load, TimeStep *tStep, ValueModeType mode) const
virtual void vectorFromSurfaceLoad(FloatArray &vec, Element &element, SurfaceLoad *load, int boundary, TimeStep *tStep, ValueModeType mode) const
virtual void assembleFromActiveBC(SparseMtrx &k, ActiveBoundaryCondition &bc, TimeStep *tStep, const UnknownNumberingScheme &s_r, const UnknownNumberingScheme &s_c) const
virtual void vectorFromLoad(FloatArray &vec, Element &element, BodyLoad *load, TimeStep *tStep, ValueModeType mode) const
virtual void assembleFromActiveBC(SparseMtrx &k, ActiveBoundaryCondition &bc, TimeStep *tStep, const UnknownNumberingScheme &s_r, const UnknownNumberingScheme &s_c) const
void giveLocationArray(IntArray &locationArray, const UnknownNumberingScheme &s, IntArray *dofIds=NULL) const
Returns the location array (array of code numbers) of receiver for given numbering scheme...
Definition: element.C:390
void times(double f)
Multiplies receiver by factor f.
Definition: floatmatrix.C:1594
Abstract base class allowing to control the way, how equations are assigned to individual DOFs...
virtual void matrixFromSurfaceLoad(FloatMatrix &mat, Element &element, SurfaceLoad *load, int boundary, TimeStep *tStep) const
virtual void matrixFromSurfaceLoad(FloatMatrix &mat, Element &element, SurfaceLoad *load, int boundary, TimeStep *tStep) const
virtual void vectorFromElement(FloatArray &vec, Element &element, TimeStep *tStep, ValueModeType mode) const
Abstract base class representing an edge load (force, momentum, ...) that acts directly on a edge bou...
Definition: boundaryload.h:200
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
Definition: floatarray.C:676
virtual void assembleFromActiveBC(FloatArray &answer, ActiveBoundaryCondition &bc, TimeStep *tStep, ValueModeType mode, const UnknownNumberingScheme &s, FloatArray *eNorms) const
Abstract base class for all active boundary conditions.
Definition: activebc.h:63
virtual void matrixFromElement(FloatMatrix &mat, Element &element, TimeStep *tStep) const
virtual void vectorFromEdgeLoad(FloatArray &vec, Element &element, EdgeLoad *load, int edge, TimeStep *tStep, ValueModeType mode) const
virtual void matrixFromElement(FloatMatrix &mat, Element &element, TimeStep *tStep) const
virtual void vectorFromNodeLoad(FloatArray &vec, DofManager &dman, NodalLoad *load, TimeStep *tStep, ValueModeType mode) const
virtual void locationFromElement(IntArray &loc, Element &element, const UnknownNumberingScheme &s, IntArray *dofIds=nullptr) const
Default implementation takes all the DOF IDs.
Class representing vector of real numbers.
Definition: floatarray.h:82
Abstract base class representing a surface load (force, momentum, ...) that acts directly on a surfac...
Definition: boundaryload.h:218
Implementation of matrix containing floating point numbers.
Definition: floatmatrix.h:94
virtual void assembleFromActiveBC(FloatArray &answer, ActiveBoundaryCondition &bc, TimeStep *tStep, ValueModeType mode, const UnknownNumberingScheme &s, FloatArray *eNorms) const
virtual void locationFromElementNodes(IntArray &loc, Element &element, const IntArray &bNodes, const UnknownNumberingScheme &s, IntArray *dofIds=nullptr) const
virtual void vectorFromSurfaceLoad(FloatArray &vec, Element &element, SurfaceLoad *load, int boundary, TimeStep *tStep, ValueModeType mode) const
virtual void vectorFromEdgeLoad(FloatArray &vec, Element &element, EdgeLoad *load, int edge, TimeStep *tStep, ValueModeType mode) const
virtual void vectorFromLoad(FloatArray &vec, Element &element, BodyLoad *load, TimeStep *tStep, ValueModeType mode) const
void add(const FloatMatrix &a)
Adds matrix to the receiver.
Definition: floatmatrix.C:1023
virtual void vectorFromEdgeLoad(FloatArray &vec, Element &element, EdgeLoad *load, int edge, TimeStep *tStep, ValueModeType mode) const
virtual void matrixFromEdgeLoad(FloatMatrix &mat, Element &element, EdgeLoad *load, int edge, TimeStep *tStep) const
virtual void giveBoundaryLocationArray(IntArray &locationArray, const IntArray &bNodes, const UnknownNumberingScheme &s, IntArray *dofIds=NULL)
Returns the location array for the boundary of the element.
Definition: element.C:446
virtual void matrixFromLoad(FloatMatrix &mat, Element &element, BodyLoad *load, TimeStep *tStep) const
virtual void vectorFromLoad(FloatArray &vec, Element &element, BodyLoad *load, TimeStep *tStep, ValueModeType mode) const
virtual void matrixFromElement(FloatMatrix &mat, Element &element, TimeStep *tStep) const
virtual void assembleFromActiveBC(SparseMtrx &k, ActiveBoundaryCondition &bc, TimeStep *tStep, const UnknownNumberingScheme &s_r, const UnknownNumberingScheme &s_c) const
virtual void giveCharacteristicVector(FloatArray &answer, CharType type, ValueModeType mode, TimeStep *tStep)
Computes characteristic vector of receiver of requested type in given time step.
Definition: element.C:580
virtual void vectorFromElement(FloatArray &vec, Element &element, TimeStep *tStep, ValueModeType mode) const
the oofem namespace is to define a context or scope in which all oofem names are defined.
void clear()
Sets size of receiver to be an empty matrix. It will have zero rows and zero columns size...
Definition: floatmatrix.h:516
virtual void vectorFromNodeLoad(FloatArray &vec, DofManager &dman, NodalLoad *load, TimeStep *tStep, ValueModeType mode) const
virtual void computeBoundarySurfaceLoadVector(FloatArray &answer, BoundaryLoad *load, int boundary, CharType type, ValueModeType mode, TimeStep *tStep, bool global=true)
Computes the contribution of the given load at the given boundary surface in global coordinate system...
Definition: element.C:598
virtual void matrixFromLoad(FloatMatrix &mat, Element &element, BodyLoad *load, TimeStep *tStep) const
virtual void vectorFromNodeLoad(FloatArray &vec, DofManager &dman, NodalLoad *load, TimeStep *tStep, ValueModeType mode) const
virtual void assembleVector(FloatArray &answer, TimeStep *tStep, CharType type, ValueModeType mode, const UnknownNumberingScheme &s, FloatArray *eNorms=NULL)
Assembles B.C.
Definition: activebc.h:122
virtual void computeTangentFromSurfaceLoad(FloatMatrix &answer, SurfaceLoad *load, int boundary, MatResponseMode rmode, TimeStep *tStep)
Computes the tangent contribution of the given load at the given boundary.
Definition: element.C:606
virtual void vectorFromSurfaceLoad(FloatArray &vec, Element &element, SurfaceLoad *load, int boundary, TimeStep *tStep, ValueModeType mode) const
Class representing solution step.
Definition: timestep.h:80
virtual void vectorFromSurfaceLoad(FloatArray &vec, Element &element, SurfaceLoad *load, int boundary, TimeStep *tStep, ValueModeType mode) const
virtual void vectorFromLoad(FloatArray &vec, Element &element, BodyLoad *load, TimeStep *tStep, ValueModeType mode) const
virtual void locationFromElementNodes(IntArray &loc, Element &element, const IntArray &bNodes, const UnknownNumberingScheme &s, IntArray *dofIds=nullptr) const
Default implementation takes all the DOF IDs.

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:27 for OOFEM by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2011