Itasca C++ Interface
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
izone.h
Go to the documentation of this file.
1 // izone.h
2 #pragma once
3 
9 #include "module/interface/dim.h"
10 #include "utility/interface/igroup.h"
12 #include "base/src/farray.h"
13 
14 namespace itasca {
15  class IThing;
16  class IFish;
17 }
18 namespace itascaxd {
19  class Parse;
20  class IRange;
21 }
22 namespace models {
23  class ConstitutiveModel;
24 }
25 namespace fish {
26  class File;
27  class IParameter;
28 }
29 namespace zone {
30  using namespace itasca;
31  using namespace itascaxd;
32 
33  static const quint32 ulNumZoneType = dimval(2,5); // number of zone types: 2 in 2D, 5 in 3D
34  static const quint32 numTperOv_ = dimval(2,5); // number of tets/triangles per zone: 2 in 2D, 5 in 3D
35  static const quint32 numGPperZ_ = dimval(4,8); // max number of gridpoints per zone in 2D/3D
36  static const quint32 numGPperT_ = dimval(3,4); // number of gridpoint per triangle (2D) / tetra (3D)
37  static const quint32 numAdjZones_ = dimval(4,6); // max number of adjoint zones to a zone in 2D/3D
38  static const quint32 numFacesZ_ = dimval(4,6); // max number of faces per zones in 2D/3D; in 2D a face is the edge of a quad or triangle
39  static const quint32 numGPperFace_ = dimval(2,4); // max number of gripoints per face in 2D/3D; in 2D a face is the edge of a quad or triangle
40  static const quint32 minGPperFace_ = dimval(2,3); // min number of GP that define face in 2D/3D
41  static const quint32 numEdgeZ_ = dimval(4,12); // max number of edges per zone in 2D/3D
42 
43  class IGp;
44  class IFace;
45  class ITet;
46  class IHysDamp;
47  class IThermZone;
48  class IFluidZone;
49  class IDynZone;
50 
54 #ifdef THREED
55  struct FaceID {
56  quint64 id1_ = 0;
57  quint64 id2_ = 0;
58  quint64 id3_ = 0;
59  quint64 id4_ = 0;
60  inline bool operator==(const FaceID &id) const { return id1_==id.id1_ && id2_==id.id2_ && id3_==id.id3_ && id4_==id.id4_; }
61  inline bool operator!=(const FaceID &id) const { return !operator==(id); }
62  inline bool operator<(const FaceID &id) const {
63  if (id1_<id.id1_) return true; if (id1_>id.id1_) return false;
64  if (id2_<id.id2_) return true; if (id2_>id.id2_) return false;
65  if (id3_<id.id3_) return true; if (id3_>id.id3_) return false;
66  if (id4_<id.id4_) return true; return false;
67  }
68  inline quint64 &operator[](quint32 index) {
69  switch (index) {
70  case 0: return id1_;
71  case 1: return id2_;
72  case 2: return id3_;
73  case 3: return id4_;
74  }
75  return id1_;
76  }
77  inline quint64 operator[](quint32 index) const {
78  switch (index) {
79  case 0: return id1_;
80  case 1: return id2_;
81  case 2: return id3_;
82  case 3: return id4_;
83  }
84  return id1_;
85  }
86  };
87 #else
88  struct FaceID {
89  quint64 id1_ = 0;
90  quint64 id2_ = 0;
91  inline bool operator==(const FaceID &id) const { return id1_==id.id1_ && id2_==id.id2_; }
92  inline bool operator!=(const FaceID &id) const { return !operator==(id); }
93  inline bool operator<(const FaceID &id) const {
94  if (id1_<id.id1_) return true; if (id1_>id.id1_) return false;
95  if (id2_<id.id2_) return true; return false;
96  }
97  inline quint64 &operator[](quint32 index) {
98  switch (index) {
99  case 0: return id1_;
100  case 1: return id2_;
101  }
102  return id1_;
103  }
104  inline quint64 operator[](quint32 index) const {
105  switch (index) {
106  case 0: return id1_;
107  case 1: return id2_;
108  }
109  return id1_;
110 }
111  };
112 #endif
113 
116  class IZone : public models::IGenericZone {
117  public:
119  inline static const TType type_ = 0x4c815bf8;
120  enum class Change { MechNull, AddToList, RemoveFromList, FlNull, ThNull };
122  enum class Code {
123 #ifdef THREED
124  Brick=0,
125  Wedge,
126  Pyramid,
127  DBrick,
128  Tetra
129 #else
130  Quad = 0,
131  Tria
132 #endif
133  };
134 
136  virtual const IThing * getIThing() const=0;
138  virtual IThing * getIThing()=0;
141  virtual const IZone * getNext() const=0;
144  virtual IZone * getNext()=0;
146  virtual quint32 getNumGp() const=0;
149  virtual const IGp * getGp(quint32 index) const=0;
152  virtual quint32 getFaceSize(quint32 face) const=0;
156  virtual const IGp * getFaceGp(quint32 face,quint32 index) const=0;
160  virtual quint32 getFaceGpIndex(quint32 face,quint32 index) const=0;
164  virtual quint32 getEdgeGpIndex(quint32 edge, quint32 index) const=0;
165 
166  virtual FaceID getFaceID(quint32 side) const=0;
167 
171  //virtual quint32 getFaceOnEdge(quint32 edge, quint32 index) const=0;
172 
175  virtual DVect getFaceNormal(quint32 face) const=0;
178  virtual DVect getFaceCentroid(quint32 face) const=0;
181  virtual const IZone * getJoin(quint32 face) const=0;
182  // Face Group support
184  virtual const IGroup * getFaceGroup(quint32 side,const ISlotID &slot=ISlotID((uint)0)) const=0;
188  virtual QString getFaceGroupName(quint32 side,const ISlotID &slot=ISlotID()) const=0;
191  virtual bool addFaceGroup(quint32 side,const IGroupID &group)=0;
193  virtual bool removeFaceGroup(quint32 side,const IGroupID &group)=0;
196  virtual uint isFaceInGroup(quint32 side,const FArray<IGroupID> &ids,TType type=0,bool only=false) const=0;
198  virtual uint getFaceGroupList(quint32 side,FArray<IGroupID> *list) const=0;
200  virtual void copyFaceGroups(quint32 side,const IThing *t)=0;
203  virtual uint getFaceExtraSize(quint32 side) const=0;
205  virtual const fish::IParameter *getFaceExtra(quint32 side,uint index) const=0;
208  virtual void setFaceExtra(quint32 side,uint index,const fish::IParameter &p)=0;
210  virtual bool getFaceHidden(quint32 side) const=0;
212  virtual bool setFaceHidden(quint32 side,bool b)=0;
214  virtual bool getFaceSelected(quint32 side) const=0;
216  virtual bool setFaceSelected(quint32 side,bool b)=0;
218  virtual bool isFaceInRange(quint32 side,const IRange *range) const=0;
220  virtual double getDensity() const=0;
222  virtual void setDensity(const double &d)=0;
224  virtual bool isMechanicalNull() const=0;
226  virtual bool isThermalNull() const = 0;
228  virtual bool isFluidNull() const = 0;
230  virtual Code getCode() const=0;
233  virtual double getAspectTest() const=0;
236  virtual double getAspectTetTest() const=0;
238  virtual void copyState(const IZone *zone)=0;
239 #ifdef THREED
240  virtual QString getFlowModel() const=0;
243  virtual DVect getThermalFlux() const=0; // jkf: should be const
244 #endif
245  virtual int getFace(const std::array<quint64,minGPperFace_> &uid) const=0;
250  virtual bool getFaceNormalArea(int iFace,DVect *dvNorm,double *dArea) const=0;
263  enum class StrainMode { ShearRate=1, ShearInc=2, VolRate=3, VolInc=4, FullRate=5, FullInc=6, FullRotRate=7, FullRotInc=8 };
264  virtual double getSSR(StrainMode mode,SymTensor *fsr) const=0;
265  virtual SymTensor getTetStrainRate(int overlay,int number) const=0;
266  virtual SymTensor getTetStrainIncrement(int overlay,int number) const=0;
267  virtual SymTensor getStrainRate() const=0;
268  virtual SymTensor getStrainIncrement() const=0;
270  virtual bool getIsDegenerate(QString &sErr) const =0;
272  virtual bool getSupports2Overlays(QString &sErr) =0;
274  virtual const ITet * getOverlay(quint32 ov) const=0;
276  virtual ITet * getOverlay(quint32 ov)=0;
277 #ifdef THREED
278  virtual const IHysDamp * getHysDamp() const=0;
281  virtual IHysDamp * getHysDamp() =0;
282  virtual IHysDamp * setHysDamp() =0;
283 
284 #endif
285  virtual int initializeModels()=0;
288  virtual bool getHasALiveMechModel() const=0;
290  virtual bool getHasALiveFluidModel() const=0;
292  virtual bool getHasALiveThermModel() const=0;
294  virtual QString getModelName() const=0;
295  virtual const models::ConstitutiveModel *getModel() const=0;
298  virtual void setModelName(const QString &qs) =0;
300  virtual double getSmallestNormalizedTetVolume() const=0;
301 #ifdef THREED
302  virtual double getQualityTest(int iTestNum) const=0;
308  virtual double getPlanarity() const=0;
309 #endif
310  virtual int getNumTets() const =0;
313  virtual double getOrthoTest() const=0;
315  virtual double getVolumeTest() const=0;
317  virtual double getZoneCondition(int i=0) const=0;
318 #ifdef TWOD
319  virtual bool getBadZoneExtruder() const=0;
321 #endif
322  virtual double getAvePP() const=0;
326  virtual QVariant getProperty(const QString &sc) const =0;
327  virtual QVariant getProperty(uint index) const=0;
330  virtual bool setProperty(const QString &sc,const QVariant &v) =0;
331  virtual bool setProperty(int index,const QVariant &v) =0;
334  virtual double getVolumeD(bool deformed) const=0;
336  virtual DVect getCentroid() const=0;
338  virtual SymTensor getAveStress(bool effective=false) const=0;
339 #ifdef THREED
340  virtual double getAvgTemp() const=0;
343  virtual DVect getFlowVector() const=0;
344 #endif
345  virtual uint getAvgState(int *piNum, bool bAvgKeyword, bool noPast=false) const=0;
353  virtual QString getStateName(quint32 bit) const=0;
362  virtual void setStress(const double &val,quint32 pn)=0;
364  virtual void setStress(const SymTensor &sym)=0;
367  virtual void setState(quint32 state)=0;
372  virtual void getTetGridPoints(int iOverlay, int iTet, IGp *gplist[]) =0;
373 #ifdef THREED
374  virtual const IThermZone * getIThermZone() const=0;
377  virtual IThermZone * getIThermZone() =0;
378 #endif
379  virtual QStringList getPropertyNames() const=0;
383  virtual quint32 getPropertyIndex(const QString &sc) const=0;
386  virtual QString getPropertyName(quint32 index) const=0;
389  virtual bool getBit(int bit) const=0;
394  virtual void setBit(int bit,bool b) const=0;
397  virtual QVariant getValue(int index) const=0;
401  virtual void setValue(int index,const QVariant &v) const=0;
402 #ifdef THREED
403  virtual const IFluidZone * getIFluidZone() const=0;
406  virtual IFluidZone * getIFluidZone() =0;
408  virtual const IDynZone * getIDynZone() const=0;
410  virtual IDynZone * getIDynZone() =0;
411 #endif
412  virtual IZone * getLinkZone(quint32 index)=0;
415  virtual const IZone * getLinkZone(quint32 index) const=0;
416  virtual quint32 getLinkIndex(quint32 index) const=0;
420 
425  virtual bool fishIO(bool save,fish::File *pnt)=0;
430  virtual double getStressStrengthRatio(const SymTensor &s) const=0;
435  //virtual QString applyBoundaryCondition(quint32 face,QString item,QString options,const double &val)=0;
436 
438  virtual double getWPVol() const =0;
440  virtual void setWPVol(const double &dwpv)=0;
442  virtual double getWPShear() const=0;
444  virtual void setWPShear(const double &dwps)=0;
446  virtual double getWPTotal() const=0;
448  virtual double getWEVol() const =0;
450  virtual void setWEVol(const double &dwpv)=0;
452  virtual double getWEShear() const=0;
454  virtual void setWEShear(const double &dwps)=0;
456  virtual double getWETotal() const=0;
457 #ifdef THREED
458  virtual void setFluidModel(const QString &name)=0;
462  virtual QString getFluidModel(bool exception=true)const=0;
464  virtual QStringList getFluidProperties()const=0;
466  virtual double getFluidProp(const QString &name,bool exception=true) const =0;
467  virtual int getFluidPropIndex(const QString &name) const=0;
468  virtual double getFluidProp(uint index) const=0;
470  virtual void setFluidProp(const QString &name, const double &val)=0;
471  virtual void setFluidProp(int index, const double &val)=0;
474  virtual void setThermModel(const QString &name)=0;
476  virtual QStringList getThermProperties() const=0;
478  virtual QString getThermModel(bool exception=true)const=0;
480  virtual double getThermProp(const QString &name,bool exception=true) const =0;
481  virtual int getThermPropIndex(const QString &name) const=0;
482  virtual double getThermProp(uint index) const=0;
484  virtual void setThermProp(const QString &name, const double &val)=0;
485  virtual void setThermProp(int index, const double &val)=0;
486 #endif
487  virtual bool invalidZone(bool mech=true,bool therm=false,bool fluid=false,bool orVal=false) const=0;
501  virtual bool isInZn(const DVect &dv,const double &relTol=1.0e-5, bool use2=false) const=0; // use same default epsilon factor as ZoneList::zoneIn function
502  virtual bool checkZoneForPlot(bool removeHidden,bool showSelected,bool hideMech,bool hideTherm,bool hideFluid) const=0;
503 
504  struct FaceCheckInput {
505  quint32 side_ = 0;
506  bool internalFaces_ = false; // Show ALL faces, not just surface faces.
507  int bit_ = 0; // Used to check if a zone is in or out of the range of zones being considered (only if internalFace_ is false).
508  bool zoneFace_ = false; // If true, then being used for plot of faces (as opposed to a plot of zones).
509  bool onlySelectedFaces_ = false; // Only show selected faces (ignored if zoneFace_ is false).
510  };
511  struct FaceCheckOutput { // Filled out only if return value is true.
512  bool selected_ = false; // True if zone or face is selected (based on zoneFace_ flag).
513  quint64 id_ = 0; // ID number of zones
514  FArray<DVect> vertices_; // Vertices of zone face.
515 
516  };
517  virtual bool checkFaceForPlot(const FaceCheckInput &inp,FaceCheckOutput *outp) const=0;
518  virtual bool checkFaceForPlotFace(quint32 side,quint64 *id,FArray<DVect> *vertices,bool excludeSelected=true) const=0;
519  virtual bool checkFaceForPlotFaceSelected(quint32 side,quint64 *id,FArray<DVect> *vertices) const=0;
520  virtual void fillZoneVertices(FArray<DVect> *vertices) const=0;
521  virtual void fillAllZoneFaces(FArray<FArray<DVect>> *allVertices,bool *selected,quint64 *id) const=0;
522  virtual int findFaceNormal(const DVect &v) const=0;
523  virtual double getMultiplier() const=0;
524  virtual bool CMSupportsHysDamp()const {return false;} ;
525  };
526 } // namespace zone
527 // EoF
constexpr const U & dimval(const T &, const U &val3)
Returns the first argument in a 2D compile, and the second in a 3D compile.
Definition: dim.h:179
Interface to a group object.
Definition: igroup.h:9
Definition: iparameter.h:16
Interface to a filter, used as the main method for filtering objects.
Definition: irange.h:31
namespace Itasca
Definition: basememory.cpp:9
Base class for items that will be stored in containers.
Definition: ithing.h:31
DIM - Provides code portability between 2D and 3D codes.
Definition: izone.h:88
StrainMode
Definition: izone.h:263
Generic base class for the zone interface made available to the constitutive model system.
The Constitutive Model interface library.
Definition: conmodel.cpp:7
An array class that attempts to minimize unnecessary heap access.
Definition: izone.h:504
Interface to provide access to a zone.
Definition: izone.h:116
Definition: izone.h:511
Definition: igroup.h:91
unsigned int TType
class type indicator
Definition: basedef.h:41
A symmetric 2nd order tensor.
Definition: symtensor.h:19
The base class for constitutive model plug-ins.
Definition: conmodel.h:32
Interface to access dynamic zone data.
Definition: idynzone.h:12
Interface to access fluid zone data.
Definition: ifluidzone.h:13
Itasca Library standard namespace, specific to 2D or 3D.
Definition: icontactmodule.h:4
Interface to provide access to a gridpoint.
Definition: igp.h:64
An array class that attempts to minimize unnecessary heap access.
Definition: farray.h:27
Generic base class for the zone interface made available to the constitutive model system.
Definition: igenericzone.h:22
DVect3 DVect
Vector of doubles, either 2D or 3D.
Definition: dim.h:145
Code
Possible Zone types code.
Definition: izone.h:122
Definition: igroup.h:51
Interface to hysteretic damping.
Definition: ihysdamp.h:12
Interface to one of the tetrahedra used to implement mixed-discretization in a zone.
Definition: itet.h:26
Interface to access zone thermal data.
Definition: ithermzone.h:13