OOFEM  2.4
OOFEM.org - Object Oriented Finite Element Solver
enrichmentitem.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 "xfemmanager.h"
36 #include "floatmatrix.h"
37 #include "enrichmentitem.h"
38 #include "element.h"
39 #include "enrichmentfunction.h"
40 #include "cltypes.h"
41 #include "connectivitytable.h"
42 #include "classfactory.h"
43 #include "fracturemanager.h"
44 #include "mathfem.h"
45 #include "feinterpol.h"
46 #include "masterdof.h"
47 #include "propagationlaw.h"
48 #include "dynamicinputrecord.h"
49 #include "XFEMDebugTools.h"
50 #include "xfemtolerances.h"
51 #include "spatiallocalizer.h"
52 #include "gausspoint.h"
55 #include "engngm.h"
56 
57 #include <algorithm>
58 #include <limits>
59 #include <sstream>
60 #include <string>
61 
62 
63 namespace oofem {
64 const double EnrichmentItem :: mLevelSetTol = 1.0e-12;
65 const double EnrichmentItem :: mLevelSetRelTol = 1.0e-3;
66 
67 
68 EnrichmentItem :: EnrichmentItem(int n, XfemManager *xMan, Domain *aDomain) : FEMComponent(n, aDomain),
69  mpEnrichmentFunc(NULL),
70  mpEnrichmentFrontStart(NULL),
71  mpEnrichmentFrontEnd(NULL),
72  mEnrFrontIndex(0),
73  mpPropagationLaw(NULL),
74  mPropLawIndex(0),
75  mInheritBoundaryConditions(false),
76  mInheritOrderedBoundaryConditions(false),
77  startOfDofIdPool(-1),
78  endOfDofIdPool(-1),
79  mpEnrichesDofsWithIdArray(),
80  mLevelSetsNeedUpdate(true),
81  mLevelSetTol2(1.0e-12)
82 {}
83 
85 {
86  delete mpEnrichmentFunc;
88  delete mpEnrichmentFrontEnd;
89  delete mpPropagationLaw;
90 }
91 
93 {
94  IRResultType result; // Required by IR_GIVE_FIELD macro
95 
96  mEnrFrontIndex = 0;
98 
99 
100  mPropLawIndex = 0;
102 
105  }
108  }
109 
110  return IRRT_OK;
111 }
112 
113 
114 int
116 {
117  return this->giveEnrichesDofsWithIdArray()->giveSize() * this->giveNumberOfEnrDofs();
118 }
119 
120 int
122 {
123  int numEnrDofs = mpEnrichmentFunc->giveNumberOfDofs();
124 
125  if ( mpEnrichmentFrontStart != NULL ) {
126  numEnrDofs = max( numEnrDofs, mpEnrichmentFrontStart->giveMaxNumEnrichments() );
127  }
128 
129  if ( mpEnrichmentFrontEnd != NULL ) {
130  numEnrDofs = max( numEnrDofs, mpEnrichmentFrontEnd->giveMaxNumEnrichments() );
131  }
132 
133  return numEnrDofs;
134 }
135 
137 {
138  for ( int i = 1; i <= element->giveNumberOfDofManagers(); i++ ) {
139  if ( this->isDofManEnriched( * ( element->giveDofManager(i) ) ) ) {
140  return true;
141  }
142  }
143 
144  return false;
145 }
146 
148 {
149  int nodeInd = iDMan.giveGlobalNumber();
150  auto res = mNodeEnrMarkerMap.find(nodeInd);
151 
152  if ( res != mNodeEnrMarkerMap.end() ) {
153  switch ( res->second ) {
154  case NodeEnr_NONE:
155  return 0;
156 
157  break;
158  case NodeEnr_BULK:
159  return 1;
160 
161  break;
162  case NodeEnr_START_TIP:
164 
165  break;
166  case NodeEnr_END_TIP:
168 
169  break;
172 
173  break;
174  }
175  }
176 
177  return 0;
178 }
179 
181 {
182  return false;
183 }
184 
186 {
187  if ( mpPropagationLaw == NULL ) {
188  return false;
189  }
190 
192 }
193 
194 void
196 {
197  // Gives an array containing the dofId's that
198  // are candidates for enrichment. At the moment,
199  // regular dofs are considered as candidates. In
200  // the future, we may also consider enriching
201  // enriched dofs from other enrichment items.
202  const IntArray *enrichesDofsWithIdArray = this->giveEnrichesDofsWithIdArray();
203 
204  // Number of candidates for enrichment
205  int numEnrCand = enrichesDofsWithIdArray->giveSize();
206 
207  // Number of active enrichment functions
208  int numEnrFunc = this->giveNumDofManEnrichments(iDMan);
209 
210  // Go through the list of dofs that the EI supports
211  // and compare with the available dofs in the dofMan.
212  int count = 0;
213 
214  for ( int i = 1; i <= numEnrFunc; i++ ) {
215  for ( int j = 1; j <= numEnrCand; j++ ) {
216  if ( iDMan.hasDofID( ( DofIDItem ) enrichesDofsWithIdArray->at(j) ) ) {
217  count++;
218  }
219  }
220  }
221 
222  oDofIdArray.resize(count);
223  for ( int i = 1; i <= count; i++ ) {
224  oDofIdArray.at(i) = this->giveStartOfDofIdPool() + i - 1;
225  }
226 }
227 
228 void
230 {
231  // Returns an array containing the dof Id's of the new enrichment dofs pertinent to the ei.
232  // Note: the dof managers may not support these dofs/all potential dof id's
233  const IntArray *enrichesDofsWithIdArray = this->giveEnrichesDofsWithIdArray();
234  int eiEnrSize = enrichesDofsWithIdArray->giveSize(); // Not necessarily true: for example, we may add 8 enrichments (4 in x and 4 in y) at a crack tip where we enrich D_u and D_v. /ES
235 
236  answer.resize(eiEnrSize);
237  for ( int i = 1; i <= eiEnrSize; i++ ) {
238  answer.at(i) = this->giveStartOfDofIdPool() + i - 1;
239  }
240 }
241 
243  answer.clear();
244  for ( int i = this->giveStartOfDofIdPool(); i <= this->giveEndOfDofIdPool(); i++ ) {
245  answer.followedBy(i);
246  }
247 }
248 
249 bool EnrichmentItem :: evalLevelSetNormalInNode(double &oLevelSet, int iNodeInd, const FloatArray &iGlobalCoord) const
250 {
251  auto res = mLevelSetNormalDirMap.find(iNodeInd);
252  if ( res != mLevelSetNormalDirMap.end() ) {
253  oLevelSet = res->second;
254  return true;
255  } else {
256  oLevelSet = 0.0;
257  return false;
258  }
259 }
260 
261 bool EnrichmentItem :: evalLevelSetTangInNode(double &oLevelSet, int iNodeInd, const FloatArray &iGlobalCoord) const
262 {
263  auto res = mLevelSetTangDirMap.find(iNodeInd);
264  if ( res != mLevelSetTangDirMap.end() ) {
265  oLevelSet = res->second;
266  return true;
267  } else {
268  oLevelSet = 0.0;
269  return false;
270  }
271 }
272 
273 bool EnrichmentItem :: evalNodeEnrMarkerInNode(double &oNodeEnrMarker, int iNodeInd) const
274 {
275  auto res = mNodeEnrMarkerMap.find(iNodeInd);
276  if ( res != mNodeEnrMarkerMap.end() ) {
277  oNodeEnrMarker = double( res->second );
278  return true;
279  } else {
280  oNodeEnrMarker = 0.0;
281  return false;
282  }
283 }
284 
286 {
287  // Creates new dofs due to the enrichment and appends them to the dof managers
288 
289  int nrDofMan = this->giveDomain()->giveNumberOfDofManagers();
290  IntArray EnrDofIdArray;
291 
293 
294  //int bcIndex = -1;
295  int icIndex = -1;
296 
297  // Create new dofs
298  for ( int i = 1; i <= nrDofMan; i++ ) {
299  DofManager *dMan = this->giveDomain()->giveDofManager(i);
300 
301  if ( isDofManEnriched(* dMan) ) {
302  //printf("dofMan %i is enriched \n", dMan->giveNumber());
303  computeEnrichedDofManDofIdArray(EnrDofIdArray, * dMan);
304 
305  // Collect boundary condition ID of existing dofs
306  IntArray bcIndexArray;
307  for ( Dof *dof: *dMan ) {
308  bcIndexArray.followedBy(dof->giveBcId());
309  }
310 
311  bool foundBC = false;
312  IntArray nonZeroBC;
313  if ( !bcIndexArray.containsOnlyZeroes() ) {
314  // BC is found on dofs
315  foundBC = true;
316  nonZeroBC.findNonzeros(bcIndexArray);
317  }
318 
319  int iDof(1);
320  for ( auto &dofid: EnrDofIdArray ) {
321  if ( !dMan->hasDofID( ( DofIDItem ) ( dofid ) ) ) {
323 
324  if ( foundBC ) {
325  // Append dof with BC
328  // Assume order type of new dofs are the same as original
329  dMan->appendDof( new MasterDof(dMan, bcIndexArray.at(iDof), icIndex, ( DofIDItem ) dofid) );
330  } else {
331  // Append enriched dofs with same BC
332  dMan->appendDof( new MasterDof(dMan, bcIndexArray.at(nonZeroBC.at(1)), icIndex, ( DofIDItem ) dofid) );
333  }
334  } else {
335  // No BC found, append enriched dof without BC
336  dMan->appendDof( new MasterDof(dMan, ( DofIDItem ) dofid) );
337  }
338  } else {
339  // Append enriched dof without BC
340  dMan->appendDof( new MasterDof(dMan, ( DofIDItem ) dofid) );
341  }
342  }
343  iDof++;
344  }
345  }
346  }
347 
348  // Remove old dofs
349  int poolStart = giveStartOfDofIdPool();
350  int poolEnd = giveEndOfDofIdPool();
351 
352  for ( int i = 1; i <= nrDofMan; i++ ) {
353  DofManager *dMan = this->giveDomain()->giveDofManager(i);
354 
355  computeEnrichedDofManDofIdArray(EnrDofIdArray, * dMan);
356  std :: vector< DofIDItem >dofsToRemove;
357  for ( Dof *dof: *dMan ) {
358  DofIDItem dofID = dof->giveDofID();
359 
360  if ( dofID >= DofIDItem(poolStart) && dofID <= DofIDItem(poolEnd) ) {
361  bool dofIsInIdArray = false;
362  for ( int k = 1; k <= EnrDofIdArray.giveSize(); k++ ) {
363  if ( dofID == DofIDItem( EnrDofIdArray.at(k) ) ) {
364  dofIsInIdArray = true;
365  break;
366  }
367  }
368 
369  if ( !dofIsInIdArray ) {
370  dofsToRemove.push_back(dofID);
371  }
372 
373 
374  if(mEIDofIdArray.findFirstIndexOf(dofID) == 0 && dofIsInIdArray) {
375  mEIDofIdArray.followedBy(dofID);
376  }
377  }
378  }
379 
380  for ( size_t j = 0; j < dofsToRemove.size(); j++ ) {
381  dMan->removeDof(dofsToRemove [ j ]);
382  }
383  }
384 }
385 
386 
387 double EnrichmentItem :: calcXiZeroLevel(const double &iQ1, const double &iQ2)
388 {
389  double xi = 0.0;
390 
391  if ( fabs(iQ1 - iQ2) > mLevelSetTol ) {
392  xi = ( iQ1 + iQ2 ) / ( iQ1 - iQ2 );
393  }
394 
395  if ( xi < -1.0 ) {
396  xi = -1.0;
397  }
398 
399  if ( xi > 1.0 ) {
400  xi = 1.0;
401  }
402 
403  return xi;
404 }
405 
406 void EnrichmentItem :: calcPolarCoord(double &oR, double &oTheta, const FloatArray &iOrigin, const FloatArray &iPos, const FloatArray &iN, const FloatArray &iT, const EfInput &iEfInput, bool iFlipTangent)
407 {
408  FloatArray q = {
409  iPos.at(1) - iOrigin.at(1), iPos.at(2) - iOrigin.at(2)
410  };
411 
412  const double tol = 1.0e-20;
413 
414  // Compute polar coordinates
415  oR = iOrigin.distance(iPos);
416 
417  if ( oR > tol ) {
418  q.times(1.0 / oR);
419  }
420 
421  const double pi = M_PI;
422 
423  // if( q.dotProduct(iT) > 0.0 ) {
424  // oTheta = asin( q.dotProduct(iN) );
425  // } else {
426  // if ( q.dotProduct(iN) > 0.0 ) {
427  // oTheta = pi - asin( q.dotProduct(iN) );
428  // } else {
429  // oTheta = -pi - asin( q.dotProduct(iN) );
430  // }
431  // }
432 
433 
434  const double tol_q = 1.0e-3;
435  double phi = iEfInput.mLevelSet;
436 
437  if ( iFlipTangent ) {
438  phi *= -1.0;
439  }
440 
441  double phi_r = 0.0;
442  if ( oR > tol ) {
443  phi_r = fabs(phi / oR);
444  }
445 
446  if ( phi_r > 1.0 - XfemTolerances :: giveApproxZero() ) {
447  phi_r = 1.0 - XfemTolerances :: giveApproxZero();
448  }
449 
450  if ( iEfInput.mArcPos < tol_q || iEfInput.mArcPos > ( 1.0 - tol_q ) ) {
451  double q_dot_n = q.dotProduct(iN);
452  if ( q_dot_n > 1.0 - XfemTolerances :: giveApproxZero() ) {
453  q_dot_n = 1.0 - XfemTolerances :: giveApproxZero();
454  }
455 
456  oTheta = asin(q_dot_n);
457  } else {
458  if ( phi > 0.0 ) {
459  oTheta = pi - asin( fabs(phi_r) );
460  } else {
461  oTheta = -pi + asin( fabs(phi_r) );
462  }
463  }
464 }
465 
467 {
468  if(mpPropagationLaw != NULL) {
469  delete mpPropagationLaw;
470  }
471 
472  mpPropagationLaw = ipPropagationLaw;
473  mPropLawIndex = 1;
474 }
475 
477 {
478  //iExpMod.outputXFEM(*this);
479 }
480 
481 void EnrichmentItem :: setEnrichmentFrontStart(EnrichmentFront *ipEnrichmentFrontStart, bool iDeleteOld)
482 {
483  if(iDeleteOld) {
484  delete mpEnrichmentFrontStart;
485  }
486 
487  mpEnrichmentFrontStart = ipEnrichmentFrontStart;
488 }
489 
490 void EnrichmentItem :: setEnrichmentFrontEnd(EnrichmentFront *ipEnrichmentFrontEnd, bool iDeleteOld)
491 {
492  if(iDeleteOld) {
493  delete mpEnrichmentFrontEnd;
494  }
495 
496  mpEnrichmentFrontEnd = ipEnrichmentFrontEnd;
497 }
498 
500 {
501  double tol = 1.0e-9;
503 
504  Element *tipEl = localizer->giveElementContainingPoint(iTipInfo.mGlobalCoord);
505  if ( tipEl != NULL ) {
506  // Check if the candidate tip is located on the current crack
507  FloatArray N;
508  FloatArray locCoord;
509  tipEl->computeLocalCoordinates(locCoord, iTipInfo.mGlobalCoord);
510  FEInterpolation *interp = tipEl->giveInterpolation();
511  interp->evalN( N, locCoord, FEIElementGeometryWrapper(tipEl) );
512 
513  double normalSignDist;
514  evalLevelSetNormal( normalSignDist, iTipInfo.mGlobalCoord, N, tipEl->giveDofManArray() );
515 
516  double tangSignDist;
517  evalLevelSetTangential( tangSignDist, iTipInfo.mGlobalCoord, N, tipEl->giveDofManArray() );
518 
519  if ( fabs(normalSignDist) < tol && tangSignDist > tol ) {
520  return true;
521  }
522  }
523 
524  return false;
525 }
526 } // end namespace oofem
void setPropagationLaw(PropagationLaw *ipPropagationLaw)
The base class for all spatial localizers.
virtual int giveDofPoolSize() const
bool isElementEnriched(const Element *element) const
void setEnrichmentFrontStart(EnrichmentFront *ipEnrichmentFrontStart, bool iDeleteOld=true)
#define _IFT_EnrichmentItem_front
bool evalNodeEnrMarkerInNode(double &oNodeEnrMarker, int iNodeInd) const
virtual void evalN(FloatArray &answer, const FloatArray &lcoords, const FEICellGeometry &cellgeo)=0
Evaluates the array of interpolation functions (shape functions) at given point.
Class and object Domain.
Definition: domain.h:115
std::unordered_map< int, NodeEnrichmentType > mNodeEnrMarkerMap
bool isDofManEnriched(const DofManager &iDMan) const
EnrichmentItem(int n, XfemManager *xm, Domain *aDomain)
Constructor / destructor.
virtual int giveMaxNumEnrichments() const =0
static double giveApproxZero()
virtual void computeEnrichedDofManDofIdArray(IntArray &oDofIdArray, DofManager &iDMan)
Compute Id&#39;s of enriched dofs for a given DofManager.
int giveGlobalNumber() const
Definition: dofmanager.h:501
int giveNumberOfDofManagers() const
Returns number of dof managers in domain.
Definition: domain.h:432
#define _IFT_EnrichmentItem_inheritbc
double & at(int i)
Coefficient access function.
Definition: floatarray.h:131
int max(int i, int j)
Returns bigger value form two given decimals.
Definition: mathfem.h:71
TipInfo gathers useful information about a crack tip, like its position and tangent direction...
Definition: tipinfo.h:24
int giveEndOfDofIdPool() const
int mPropLawIndex
mPropLawIndex: nonzero if a propagation law is present, zero otherwise.
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
Updates the geometry of evolving XFEM interfaces.
Abstract base class for all finite elements.
Definition: element.h:145
Base class for dof managers.
Definition: dofmanager.h:113
static const double mLevelSetRelTol
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
void findNonzeros(const IntArray &logical)
Finds all indices where the input array is nonzero.
Definition: intarray.C:206
Class implementing an array of integers.
Definition: intarray.h:61
int & at(int i)
Coefficient access function.
Definition: intarray.h:103
void setEnrichmentFrontEnd(EnrichmentFront *ipEnrichmentFrontEnd, bool iDeleteOld=true)
virtual int giveNumberOfDofManagers() const
Definition: element.h:656
virtual void createEnrichedDofs()
virtual FEInterpolation * giveInterpolation() const
Definition: element.h:629
bool containsOnlyZeroes() const
Checks if receiver is all zero.
Definition: intarray.C:172
Base abstract class representing cross section in finite element mesh.
Definition: crosssection.h:107
int giveNumDofManEnrichments(const DofManager &iDMan) const
int giveNumberOfEnrDofs() const
double distance(const FloatArray &x) const
Computes the distance between position represented by receiver and position given as parameter...
Definition: floatarray.C:489
Class representing a general abstraction for finite element interpolation class.
Definition: feinterpol.h:132
std::unordered_map< int, double > mLevelSetTangDirMap
Class representing "master" degree of freedom.
Definition: masterdof.h:92
const IntArray & giveDofManArray() const
Definition: element.h:592
#define M_PI
Definition: mathfem.h:52
double dotProduct(const FloatArray &x) const
Computes the dot product (or inner product) of receiver and argument.
Definition: floatarray.C:463
bool mInheritBoundaryConditions
If newly created enriched dofs should inherit boundary conditions from the node they are introduced i...
void clear()
Clears the array (zero size).
Definition: intarray.h:177
DofIDItem
Type representing particular dof type.
Definition: dofiditem.h:86
Class EnrichmentFront: describes the edge or tip of an XFEM enrichment.
#define _IFT_EnrichmentItem_propagationlaw
SpatialLocalizer * giveSpatialLocalizer()
Returns receiver&#39;s associated spatial localizer.
Definition: domain.C:1184
virtual void givePotentialEIDofIdArray(IntArray &answer) const
bool evalLevelSetNormalInNode(double &oLevelSet, int iNodeInd, const FloatArray &iGlobalCoord) const
Wrapper around element definition to provide FEICellGeometry interface.
Definition: feinterpol.h:95
int giveStartOfDofIdPool() const
std::unordered_map< int, double > mLevelSetNormalDirMap
#define N(p, q)
Definition: mdm.C:367
void resize(int n)
Checks size of receiver towards requested bounds.
Definition: intarray.C:124
virtual Element * giveElementContainingPoint(const FloatArray &coords, const IntArray *regionList=NULL)=0
Returns the element, containing given point and belonging to one of the region in region list...
const IntArray * giveEnrichesDofsWithIdArray() const
bool evalLevelSetTangInNode(double &oLevelSet, int iNodeInd, const FloatArray &iGlobalCoord) const
Class representing vector of real numbers.
Definition: floatarray.h:82
bool hasDofID(DofIDItem id) const
Checks if receiver contains dof with given ID.
Definition: dofmanager.C:166
PropagationLaw * mpPropagationLaw
This class manages the xfem part.
Definition: xfemmanager.h:109
IRResultType
Type defining the return values of InputRecord reading operations.
Definition: irresulttype.h:47
EnrichmentFront * mpEnrichmentFrontStart
EnrichmentFunction * mpEnrichmentFunc
virtual void evalLevelSetTangential(double &oLevelSet, const FloatArray &iGlobalCoord, const FloatArray &iN, const IntArray &iNodeInd) const =0
Evaluate the tangential direction level set in the point iGlobalCoord.
Class representing the general Input Record.
Definition: inputrecord.h:101
void followedBy(const IntArray &b, int allocChunk=0)
Appends array b at the end of receiver.
Definition: intarray.C:145
virtual bool hasPropagation() const =0
EnrichmentFront * mpEnrichmentFrontEnd
static void calcPolarCoord(double &oR, double &oTheta, const FloatArray &iOrigin, const FloatArray &iPos, const FloatArray &iN, const FloatArray &iT, const EfInput &iEfInput, bool iFlipTangent)
int mEnrFrontIndex
mEnrFrontIndex: nonzero if an enrichment front is present, zero otherwise.
void times(double s)
Multiplies receiver with scalar.
Definition: floatarray.C:818
virtual bool computeLocalCoordinates(FloatArray &answer, const FloatArray &gcoords)
Computes the element local coordinates from given global coordinates.
Definition: element.C:1222
bool tipIsTouchingEI(const TipInfo &iTipInfo)
Domain * giveDomain() const
Definition: femcmpnn.h:100
static double calcXiZeroLevel(const double &iQ1, const double &iQ2)
virtual bool isMaterialModified(GaussPoint &iGP, Element &iEl, CrossSection *&opCS) const
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Macro facilitating the use of input record reading methods.
Definition: inputrecord.h:78
#define _IFT_EnrichmentItem_inheritorderedbc
virtual bool hasPropagatingFronts() const
int giveSize() const
Definition: intarray.h:203
FloatArray mGlobalCoord
Definition: tipinfo.h:30
the oofem namespace is to define a context or scope in which all oofem names are defined.
DofManager * giveDofManager(int i) const
Definition: element.C:514
static const double mLevelSetTol
Abstract class Dof represents Degree Of Freedom in finite element mesh.
Definition: dof.h:93
virtual void callGnuplotExportModule(GnuplotExportModule &iExpMod, TimeStep *tStep)
DofManager * giveDofManager(int n)
Service for accessing particular domain dof manager.
Definition: domain.C:314
virtual void giveEIDofIdArray(IntArray &answer) const
(Under development) The Gnuplot export module enables OOFEM to export some data in a format that can ...
Class representing integration point in finite element program.
Definition: gausspoint.h:93
virtual void evalLevelSetNormal(double &oLevelSet, const FloatArray &iGlobalCoord, const FloatArray &iN, const IntArray &iNodeInd) const =0
Evaluate the normal direction level set in the point iGlobalCoord.
Class representing solution step.
Definition: timestep.h:80
The top abstract class of all classes constituting the finite element mesh.
Definition: femcmpnn.h:76
int findFirstIndexOf(int value) const
Finds index of first occurrence of given value in array.
Definition: intarray.C:331
virtual int giveNumEnrichments(const DofManager &iDMan) const =0

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