IFEM  90A354
ASMs3D.h
Go to the documentation of this file.
1 // $Id$
2 //==============================================================================
12 //==============================================================================
13 
14 #ifndef _ASM_S3D_H
15 #define _ASM_S3D_H
16 
17 #include "ASMstruct.h"
18 #include "ASM3D.h"
19 #include "BasisFunctionCache.h"
20 #include "Interface.h"
21 #include "ThreadGroups.h"
22 
23 namespace utl {
24  class Point;
25 }
26 
27 namespace Go {
28  class SplineSurface;
29  class SplineVolume;
30 }
31 
32 
38 class ASMs3D : public ASMstruct, public ASM3D
39 {
41  struct IJK
42  {
43  int I;
44  int J;
45  int K;
46  };
47 
48  typedef std::vector<IJK> IndexVec;
49 
51  struct Edge
52  {
53  int icnod;
54  int incr;
55 
57  Edge() { icnod = incr = 0; }
59  int next();
60  };
61 
63  struct Face
64  {
65  int isnod;
66  int incrI;
67  int incrJ;
68  int nnodI;
69  int indxI;
70 
72  Face() { isnod = incrI = incrJ = nnodI = 0; indxI = 1; }
74  int next();
75  };
76 
77 protected:
80  {
81  public:
84  BasisFunctionCache(const ASMs3D& pch);
85 
89  BasisFunctionCache(const BasisFunctionCache& cache, int b);
90 
92  virtual ~BasisFunctionCache() = default;
93 
95  const std::array<size_t,3>& noElms() const { return nel; }
96 
97  protected:
99  bool internalInit() override;
100 
105  BasisFunctionVals calculatePt(size_t el, size_t gp, bool reduced) const override;
106 
108  void calculateAll() override;
109 
114  size_t index(size_t el, size_t gp, bool reduced) const override;
115 
117  virtual void setupParameters();
118 
120  bool setupQuadrature();
121 
122  const ASMs3D& patch;
123 
124  std::array<size_t,3> nel{};
125 
126  private:
129  std::array<size_t,3> elmIndex(size_t el) const;
130  };
131 
132 public:
134  struct BlockNodes
135  {
136  int ibnod[8];
137  Edge edges[12];
138  Face faces[6];
139  int iinod;
140  int inc[3];
141  int nnodI;
142  int nnodJ;
143  int indxI;
144  int indxJ;
145 
148  {
149  memset(ibnod,0,8*sizeof(int));
150  iinod = inc[0] = inc[1] = inc[2] = nnodI = nnodJ = 0;
151  indxI = indxJ = 1;
152  }
154  int next();
155  };
156 
157 private:
158  typedef std::pair<int,int> Ipair;
159 
162  {
163  Go::SplineSurface* surf;
164  int dof;
165  int code;
166  std::vector<Ipair> nodes;
167 
169  DirichletFace(Go::SplineSurface* ss = nullptr, int d = 0, int c = 0)
170  : surf(ss), dof(d), code(c) {}
171  };
172 
173 public:
176  {
177  protected:
178  const ASMs3D& myPatch;
179  public:
181  explicit InterfaceChecker(const ASMs3D& pch) : myPatch(pch) {}
183  virtual ~InterfaceChecker() {}
188  virtual short int hasContribution(int, int I, int J, int K) const;
189  };
190 
192  explicit ASMs3D(unsigned char n_f = 3);
194  ASMs3D(const ASMs3D& patch, unsigned char n_f);
196  ASMs3D(const ASMs3D& patch);
198  virtual ~ASMs3D() {}
199 
202  virtual Go::SplineSurface* getBoundary(int dir, int = 1);
204  virtual Go::SplineVolume* getBasis(int basis = 1);
206  virtual const Go::SplineVolume* getBasis(int basis = 1) const;
208  virtual void copyParameterDomain(const ASMbase* other);
209 
210  // Methods for model generation
211  // ============================
212 
214  virtual bool read(std::istream&);
216  virtual bool write(std::ostream&, int) const;
217 
221  virtual bool generateFEMTopology();
222 
226  virtual void clear(bool retainGeometry = false);
227 
233  virtual bool addXElms(short int dim, short int item,
234  size_t nXn, IntVec& nodes);
235 
240  virtual size_t getNodeIndex(int globalNum, bool noAddedNodes = false) const;
244  virtual int getNodeID(size_t inod, bool noAddedNodes = false) const;
245 
252  virtual bool getElementCoordinates(Matrix& X, int iel,
253  bool forceItg = false) const;
254 
259  virtual void getNodalCoordinates(Matrix& X, bool geo = false) const;
260 
263  virtual Vec3 getCoord(size_t inod) const;
264 
266  virtual Vec3 getElementCenter(int iel) const;
267 
270  virtual bool updateCoords(const Vector& displ);
271 
278  virtual void getBoundaryNodes(int lIndex, IntVec& nodes,
279  int basis, int thick = 1,
280  int = 0, bool local = false) const;
287  virtual void getBoundary1Nodes(int lEdge, IntVec& nodes, int basis, int = 0,
288  bool local = false, bool open = false) const;
289 
295  virtual int getCorner(int I, int J, int K, int basis) const;
296 
309  bool assignNodeNumbers(BlockNodes& nodes, int basis = 0);
310 
313  virtual bool checkRightHandSystem();
314 
318  virtual bool refine(int dir, const RealArray& xi);
322  virtual bool uniformRefine(int dir, int nInsert);
328  virtual bool raiseOrder(int ru, int rv, int rw, bool setOrder = false);
329 
331  virtual bool createProjectionBasis(bool init);
332 
334  virtual bool separateProjectionBasis() const;
335 
336 
337  // Various methods for preprocessing of boundary conditions and patch topology
338  // ===========================================================================
339 
346  virtual void constrainFace(int dir, bool open, int dof,
347  int code = 0, char basis = 1);
356  virtual size_t constrainFaceLocal(int dir, bool open, int dof, int code = 0,
357  bool project = false, char T1 = '\0');
358 
365  virtual void constrainEdge(int lEdge, bool open, int dof,
366  int code = 0, char basis = 1);
367 
383  virtual void constrainLine(int fdir, int ldir, double xi, int dof,
384  int code = 0, char basis = 1);
385 
397  virtual void constrainCorner(int I, int J, int K, int dof,
398  int code = 0, char basis = 1);
411  virtual void constrainNode(double xi, double eta, double zeta, int dof,
412  int code = 0);
413 
427  virtual bool connectPatch(int face, ASM3D& neighbor, int nface, int norient,
428  int = 0, bool coordCheck = true, int thick = 1);
429 
434  virtual void closeBoundaries(int dir, int basis, int master);
435 
441  virtual bool collapseFace(int face, int edge = 0, int basis = 1);
442 
451  virtual bool addRigidCpl(int lindx, int ldim, int basis,
452  int& gMaster, const Vec3& Xmaster, bool extraPt);
453 
456  virtual void setNodeNumbers(const IntVec& nodes);
457 
463  virtual bool updateDirichlet(const std::map<int,RealFunc*>& func,
464  const std::map<int,VecFunc*>& vfunc, double time,
465  const std::map<int,int>* g2l = nullptr);
466 
467 
468  // Methods for integration of finite element quantities.
469  // These are the main computational methods of the ASM class hierarchy.
470  // ====================================================================
471 
476  virtual bool integrate(Integrand& integrand,
477  GlobalIntegral& glbInt, const TimeDomain& time);
478 
484  virtual bool integrate(Integrand& integrand, int lIndex,
485  GlobalIntegral& glbInt, const TimeDomain& time);
486 
492  virtual bool integrateEdge(Integrand& integrand, int lEdge,
493  GlobalIntegral& glbInt, const TimeDomain& time);
494 
495 protected:
501  bool integrate(Integrand& integrand, GlobalIntegral& glbInt,
502  const TimeDomain& time, const Real3DMat& itgPts);
503 
509  bool integrate(Integrand& integrand, GlobalIntegral& glbInt,
510  const TimeDomain& time, const ASM::InterfaceChecker& iChk);
511 
512 public:
513 
514  // Post-processing methods
515  // =======================
516 
523  virtual int evalPoint(const double* xi, double* param, Vec3& X) const;
524 
528  virtual int findElementContaining(const double* param) const;
529 
534  virtual double findPoint(Vec3& X, double* param) const;
535 
540  virtual bool getGridParameters(RealArray& prm, int dir, int nSegSpan) const;
541 
546  virtual bool tesselate(ElementBlock& grid, const int* npe) const;
547 
554  virtual bool evalSolution(Matrix& sField, const Vector& locSol,
555  const int* npe, int n_f, bool piola) const;
556 
569  virtual bool evalSolution(Matrix& sField, const Vector& locSol,
570  const RealArray* gpar, bool regular = true,
571  int deriv = 0, int = 0) const;
572 
578  virtual bool evalProjSolution(Matrix& sField, const Vector& locSol,
579  const int* npe, int n_f) const;
580 
586  virtual bool evaluate(const ASMbase* basis, const Vector& locVec,
587  RealArray& vec, int basisNum) const;
588 
593  virtual bool evaluate(const Field* field, RealArray& vec, int basisNum) const;
594 
600  virtual bool evaluate(const FunctionBase* func, RealArray& vec,
601  int basisNum, double time) const;
602 
617  virtual bool evalSolution(Matrix& sField, const IntegrandBase& integrand,
618  const int* npe = nullptr, char project = 0) const;
619 
620 private:
623  Go::SplineVolume* projectSolution(const IntegrandBase& integrand) const;
624 
626  Go::SplineVolume* projectSolutionLocal(const IntegrandBase&) const;
627 
630  Go::SplineVolume* projectSolutionLocalApprox(const IntegrandBase&) const;
631 
633  Go::SplineVolume* projectSolutionLeastSquare(const IntegrandBase&) const;
634 
635 public:
638  virtual Go::GeomObject* evalSolution(const IntegrandBase& integrand) const;
639 
653  virtual bool evalSolution(Matrix& sField, const IntegrandBase& integrand,
654  const RealArray* gpar, bool regular = true) const;
655 
656 protected:
657 
658  // Internal utility methods
659  // ========================
660 
664  virtual void findBoundaryElms(IntVec& elms, int lIndex, int = 0) const;
665 
671  virtual bool assembleL2matrices(SystemMatrix& A, SystemVector& B,
672  const L2Integrand& integrand,
673  bool continuous) const;
674 
685  bool connectBasis(int face, ASMs3D& neighbor, int nface, int norient,
686  int basis = 1, int slave = 0, int master = 0,
687  bool coordCheck = true, int thick = 1);
688 
694  void getGaussPointParameters(RealArray& uGP, int dir,
695  int nGauss, const double* xi) const;
696 
701  bool getGrevilleParameters(RealArray& prm, int dir, int basisNum = 1) const;
702 
706  bool getQuasiInterplParameters(RealArray& prm, int dir) const;
707 
713  bool getElementCoordinatesPrm(Matrix& X, double u, double v, double w) const;
714 
717  double getParametricVolume(int iel) const;
721  double getParametricArea(int iel, int dir) const;
722 
726  virtual void getElementBorders(int iel, double* u) const;
727 
735  void getElementBorders(int i1, int i2, int i3,
736  double* u, double* v, double* w) const;
737 
745  double getElementCorners(int i1, int i2, int i3, std::vector<Vec3>& XC,
746  RealArray* uC = nullptr) const;
752  void getCornerPoints(int i1, int i2, int i3,
753  std::vector<utl::Point>& XC) const;
754 
761  void generateThreadGroups(size_t strip1, size_t strip2, size_t strip3,
762  bool silence, bool ignoreGlobalLM);
763 
770  void generateThreadGroups(size_t strip1, size_t strip2, size_t strip3,
771  char lIndex, bool silence, bool);
772 
774  virtual void changeNumThreads();
775 
777  virtual int getFirstItgElmNode() const { return 0; }
779  virtual int getLastItgElmNode() const;
780 
781 public:
786  virtual void generateThreadGroups(const Integrand& integrand, bool silence,
787  bool ignoreGlobalLM);
788 
792  virtual void generateThreadGroups(char lIndex, bool silence, bool);
793 
795  virtual void generateThreadGroupsFromElms(const IntVec& elms);
796 
798  virtual void generateProjThreadGroupsFromElms(const IntVec& elms);
799 
801  static void scatterInd(int n1, int n2, int n3, int p1, int p2, int p3,
802  const int* start, IntVec& index);
803 
808  virtual bool getOrder(int& p1, int& p2, int& p3) const;
809 
815  virtual bool getSize(int& n1, int& n2, int& n3, int basis = 0) const;
816 
821  virtual bool getNoStructElms(int& n1, int& n2, int& n3) const;
822 
826  virtual void getElmConnectivities(IntMat& neigh,
827  int basis = ASM::INTEGRATION_BASIS) const;
828 
830  virtual IntMat getElmNodes(int basis) const;
831 
833  virtual size_t getNoBoundaryElms(char lIndex, char ldim) const;
834 
836  virtual size_t getNoNodes(int basis = 0) const;
838  virtual size_t getNoProjectionNodes() const;
839 
843  virtual bool getParameterDomain(Real2DMat& u, IntVec* corners) const;
844 
850  virtual void evaluateBasis(double u, double v, double w, Vector& N) const;
851 
859  void extractBasis(double u, double v, double w, Vector& N, Matrix& dNdu,
860  bool fromRight = true) const;
869  void extractBasis(double u, double v, double w, Vector& N,
870  Matrix& dNdu, Matrix3D& d2Ndu2,
871  bool fromRight = true) const;
880  void extractBasis(double u, double v, double w, int dir, int p, Vector& dN,
881  bool fromRight = true) const;
882 
885  virtual Field* getProjectedField(const Vector& coefs) const;
886 
889  virtual Fields* getProjectedFields(const Vector& coefs, size_t = 0) const;
890 
891 private:
894  int coeffInd(size_t inod) const;
895 
902  int findStartNode(int& n1, int& n2, int& n3, char basis) const;
903 
909  bool getFaceSize(int& n1, int& n2, int basis, int face) const;
910 
912  static void createMNPC(const Go::SplineVolume* svol, IntMat& MNPC);
913 
914 protected:
915  std::shared_ptr<Go::SplineVolume> svol;
916  bool swapW;
917 
918  const IndexVec& nodeInd;
920 
921  std::map<size_t,size_t> xnMap;
922  std::map<size_t,size_t> nxMap;
923 
925  std::vector<DirichletFace> dirich;
926 
930  std::map<char,ThreadGroups> threadGroupsFace;
931 
933  std::vector<std::unique_ptr<BasisFunctionCache>> myCache;
934 };
935 
936 #endif
Abstract interface for 3D patches.
std::vector< int > IntVec
General integer vector.
Definition: ASMbase.h:25
std::vector< IntVec > IntMat
General 2D integer matrix.
Definition: ASMbase.h:26
Base class for structured spline-based FE assembly drivers.
Basis function cache.
static SystemMatrix * K
Pointer to coefficient matrix A.
Definition: EigSolver.C:91
std::vector< RealArray > Real2DMat
A real-valued two-dimensional array without algebraic operations.
Definition: ImmersedBoundaries.h:34
std::vector< Real > RealArray
A real-valued array without algebraic operations.
Definition: ImmersedBoundaries.h:29
std::vector< Real2DMat > Real3DMat
A real-valued three-dimensional array without algebraic operations.
Definition: ImmersedBoundaries.h:36
Representation of domain interfaces.
Threading group partitioning.
static const double T1[2]
1-point rule coordinates.
Definition: TriangleQuadrature.C:19
Abstract interface for 3D spline patches.
Definition: ASM3D.h:33
Base class to check for internal boundary integrand contributions.
Definition: Interface.h:40
Base class for spline-based finite element (FE) assembly drivers.
Definition: ASMbase.h:70
const IntMat & MNPC
Matrix of Nodal Point Correspondance.
Definition: ASMbase.h:1040
int nGauss
Numerical integration scheme for this patch.
Definition: ASMbase.h:1064
Implementation of basis function cache.
Definition: ASMs3D.h:80
std::array< size_t, 3 > elmIndex(size_t el) const
Obtain structured element indices.
Definition: ASMs3D.C:4066
bool setupQuadrature()
Configure quadratures.
Definition: ASMs3D.C:3983
const std::array< size_t, 3 > & noElms() const
Returns number of elements in each direction.
Definition: ASMs3D.h:95
virtual void setupParameters()
Setup integration point parameters.
Definition: ASMs3D.C:4015
BasisFunctionVals calculatePt(size_t el, size_t gp, bool reduced) const override
Calculates basis function info in a single integration point.
Definition: ASMs3D.C:4026
virtual ~BasisFunctionCache()=default
Empty destructor.
size_t index(size_t el, size_t gp, bool reduced) const override
Obtain global integration point index.
Definition: ASMs3D.C:4055
bool internalInit() override
Implementation specific initialization.
Definition: ASMs3D.C:3970
std::array< size_t, 3 > nel
Number of elements in each direction.
Definition: ASMs3D.h:124
const ASMs3D & patch
Reference to patch cache is for.
Definition: ASMs3D.h:122
void calculateAll() override
Calculates basis function info in all integration points.
Definition: ASMs3D.C:4072
Base class that checks if an element has interface contributions.
Definition: ASMs3D.h:176
InterfaceChecker(const ASMs3D &pch)
The constructor initialises the reference to current patch.
Definition: ASMs3D.h:181
virtual ~InterfaceChecker()
Empty destructor.
Definition: ASMs3D.h:183
const ASMs3D & myPatch
Reference to the patch being integrated.
Definition: ASMs3D.h:178
virtual short int hasContribution(int, int I, int J, int K) const
Returns non-zero if the specified element have contributions.
Definition: ASMs3D.C:3699
Driver for assembly of structured 3D spline FE models.
Definition: ASMs3D.h:39
double getParametricVolume(int iel) const
Returns the volume in the parameter space for an element.
Definition: ASMs3D.C:1507
virtual bool checkRightHandSystem()
Checks that the patch is modelled in a right-hand-side system.
Definition: ASMs3D.C:302
virtual Vec3 getCoord(size_t inod) const
Returns the global coordinates for the given node.
Definition: ASMs3D.C:1594
virtual bool getElementCoordinates(Matrix &X, int iel, bool forceItg=false) const
Returns a matrix with nodal coordinates for an element.
Definition: ASMs3D.C:1616
virtual void generateThreadGroupsFromElms(const IntVec &elms)
Generates element groups from a partition.
Definition: ASMs3D.C:3917
virtual bool generateFEMTopology()
Generates the finite element topology data for the patch.
Definition: ASMs3D.C:422
void getGaussPointParameters(RealArray &uGP, int dir, int nGauss, const double *xi) const
Extracts parameter values of the Gauss points in one direction.
Definition: ASMs3D.C:1957
bool connectBasis(int face, ASMs3D &neighbor, int nface, int norient, int basis=1, int slave=0, int master=0, bool coordCheck=true, int thick=1)
Connects all matching nodes on two adjacent boundary faces.
Definition: ASMs3D.C:712
bool swapW
Has the w-parameter direction been swapped?
Definition: ASMs3D.h:916
virtual bool integrate(Integrand &integrand, GlobalIntegral &glbInt, const TimeDomain &time)
Evaluates an integral over the interior patch domain.
Definition: ASMs3D.C:2047
virtual size_t getNoProjectionNodes() const
Returns the number of projection nodes for this patch.
Definition: ASMs3D.C:3799
std::pair< int, int > Ipair
Convenience type.
Definition: ASMs3D.h:158
virtual bool evalProjSolution(Matrix &sField, const Vector &locSol, const int *npe, int n_f) const
Evaluates the projected solution field at all visualization points.
Definition: ASMs3D.C:3254
virtual bool getParameterDomain(Real2DMat &u, IntVec *corners) const
Returns parameter values and node numbers of the domain corners.
Definition: ASMs3D.C:1932
virtual double findPoint(Vec3 &X, double *param) const
Searches for the specified Cartesian point in the patch.
Definition: ASMs3D.C:3011
std::vector< IJK > IndexVec
Node index container.
Definition: ASMs3D.h:48
double getElementCorners(int i1, int i2, int i3, std::vector< Vec3 > &XC, RealArray *uC=nullptr) const
Computes the element corner coordinates.
Definition: ASMs3D.C:1995
virtual bool createProjectionBasis(bool init)
Creates a separate projection basis for this patch.
Definition: ASMs3D.C:409
static void scatterInd(int n1, int n2, int n3, int p1, int p2, int p3, const int *start, IntVec &index)
Auxilliary function for computation of basis function indices.
Definition: ASMs3D.C:3119
virtual ~ASMs3D()
Empty destructor.
Definition: ASMs3D.h:198
virtual bool getNoStructElms(int &n1, int &n2, int &n3) const
Returns the number of elements in each parameter direction.
Definition: ASMs3D.C:3649
virtual bool uniformRefine(int dir, int nInsert)
Refines the parametrization by inserting extra knots uniformly.
Definition: ASMs3D.C:350
virtual bool write(std::ostream &, int) const
Writes the geometry of the SplineVolume object to given stream.
Definition: ASMs3D.C:152
virtual void constrainLine(int fdir, int ldir, double xi, int dof, int code=0, char basis=1)
Constrains all DOFs along a line on a given boundary face.
Definition: ASMs3D.C:1314
virtual void clear(bool retainGeometry=false)
Clears the contents of the patch, making it empty.
Definition: ASMs3D.C:165
virtual bool updateCoords(const Vector &displ)
Updates the nodal coordinates for this patch.
Definition: ASMs3D.C:1717
void getCornerPoints(int i1, int i2, int i3, std::vector< utl::Point > &XC) const
Computes the element corner coordinates and parameters.
Definition: ASMs3D.C:2034
virtual void generateProjThreadGroupsFromElms(const IntVec &elms)
Generate element groups from a partition.
Definition: ASMs3D.C:3935
virtual Field * getProjectedField(const Vector &coefs) const
Returns a field using the projection basis.
Definition: ASMs3D.C:3771
virtual bool connectPatch(int face, ASM3D &neighbor, int nface, int norient, int=0, bool coordCheck=true, int thick=1)
Connects all matching nodes on two adjacent boundary faces.
Definition: ASMs3D.C:691
bool getFaceSize(int &n1, int &n2, int basis, int face) const
Find local sizes for a given face.
Definition: ASMs3D.C:3754
virtual void setNodeNumbers(const IntVec &nodes)
Sets the global node numbers for this patch.
Definition: ASMs3D.C:1423
virtual bool collapseFace(int face, int edge=0, int basis=1)
Collapses a degenerated face into a single node or edge.
Definition: ASMs3D.C:839
Go::SplineVolume * projectSolutionLocal(const IntegrandBase &) const
Projects the secondary solution using Quasi-Interpolation.
Definition: ASMs3Drecovery.C:395
virtual bool integrateEdge(Integrand &integrand, int lEdge, GlobalIntegral &glbInt, const TimeDomain &time)
Evaluates a boundary integral over a patch edge.
Definition: ASMs3D.C:2791
virtual bool separateProjectionBasis() const
Checks if a separate projection basis is used for this patch.
Definition: ASMs3D.C:391
virtual size_t constrainFaceLocal(int dir, bool open, int dof, int code=0, bool project=false, char T1='\0')
Constrains all DOFs in local directions on a given boundary face.
Definition: ASMs3D.C:1109
bool getElementCoordinatesPrm(Matrix &X, double u, double v, double w) const
Returns a matrix with nodal coordinates for element spanning given parameters.
Definition: ASMs3D.C:1657
ASMs3D(unsigned char n_f=3)
Default constructor.
Definition: ASMs3D.C:43
virtual size_t getNodeIndex(int globalNum, bool noAddedNodes=false) const
Returns local 1-based index of the node with given global number.
Definition: ASMs3D.C:264
Go::SplineVolume * projectSolutionLeastSquare(const IntegrandBase &) const
Projects the secondary solution using Least-Square Approximation.
Definition: ASMs3Drecovery.C:344
virtual void copyParameterDomain(const ASMbase *other)
Copies the parameter domain from the other patch.
Definition: ASMs3D.C:106
virtual int getCorner(int I, int J, int K, int basis) const
Returns the node index for a given corner.
Definition: ASMs3D.C:3737
virtual bool read(std::istream &)
Creates an instance by reading the given input stream.
Definition: ASMs3D.C:116
virtual int getLastItgElmNode() const
Returns 0-based index of last node on integration basis.
Definition: ASMs3D.C:3643
bool getQuasiInterplParameters(RealArray &prm, int dir) const
Calculates parameter values for the Quasi-Interpolation points.
Definition: ASMs3Drecovery.C:43
static void createMNPC(const Go::SplineVolume *svol, IntMat &MNPC)
Creates matrix of nodal point correspondance for a spline surface.
Definition: ASMs3D.C:3857
virtual void getNodalCoordinates(Matrix &X, bool geo=false) const
Returns a matrix with all nodal coordinates within the patch.
Definition: ASMs3D.C:1696
int findStartNode(int &n1, int &n2, int &n3, char basis) const
Find the start node and size for a basis.
Definition: ASMs3D.C:994
void extractBasis(double u, double v, double w, Vector &N, Matrix &dNdu, bool fromRight=true) const
Establishes matrices with basis functions and 1st derivatives.
Definition: ASMs3D.C:3667
virtual size_t getNoBoundaryElms(char lIndex, char ldim) const
Returns the number of elements on a boundary.
Definition: ASMs3D.C:1902
virtual bool addRigidCpl(int lindx, int ldim, int basis, int &gMaster, const Vec3 &Xmaster, bool extraPt)
Adds MPCs representing a rigid coupling to this patch.
Definition: ASMs3D.C:3941
virtual int evalPoint(const double *xi, double *param, Vec3 &X) const
Evaluates the geometry at a specified point.
Definition: ASMs3D.C:2979
virtual bool evaluate(const ASMbase *basis, const Vector &locVec, RealArray &vec, int basisNum) const
Evaluates and interpolates a field over a given geometry.
Definition: ASMs3Drecovery.C:64
virtual void changeNumThreads()
Hook for changing number of threads.
Definition: ASMs3D.C:3560
virtual bool refine(int dir, const RealArray &xi)
Refines the parametrization by inserting extra knots.
Definition: ASMs3D.C:323
virtual bool tesselate(ElementBlock &grid, const int *npe) const
Creates a hexahedron element model of this patch for visualization.
Definition: ASMs3D.C:3061
virtual void findBoundaryElms(IntVec &elms, int lIndex, int=0) const
Finds the patch-local element numbers on a patch boundary.
Definition: ASMs3D.C:3885
std::vector< DirichletFace > dirich
Inhomogeneous Dirichlet boundary condition data.
Definition: ASMs3D.h:925
virtual void constrainNode(double xi, double eta, double zeta, int dof, int code=0)
Constrains a node identified by three relative parameter values.
Definition: ASMs3D.C:1400
virtual bool raiseOrder(int ru, int rv, int rw, bool setOrder=false)
Raises the order of the SplineVolume object for this patch.
Definition: ASMs3D.C:375
virtual void constrainCorner(int I, int J, int K, int dof, int code=0, char basis=1)
Constrains a corner node identified by the three parameter indices.
Definition: ASMs3D.C:1389
virtual void evaluateBasis(double u, double v, double w, Vector &N) const
Evaluates the basis functions at the specified point.
Definition: ASMs3D.C:3659
void generateThreadGroups(size_t strip1, size_t strip2, size_t strip3, bool silence, bool ignoreGlobalLM)
Generates element groups for multi-threading of interior integrals.
Definition: ASMs3D.C:3481
double getParametricArea(int iel, int dir) const
Returns boundary face area in the parameter space for an element.
Definition: ASMs3D.C:1537
virtual bool addXElms(short int dim, short int item, size_t nXn, IntVec &nodes)
Adds extraordinary elements associated with a patch boundary.
Definition: ASMs3D.C:190
std::map< size_t, size_t > xnMap
Node index map used by getCoord()
Definition: ASMs3D.h:921
virtual void constrainEdge(int lEdge, bool open, int dof, int code=0, char basis=1)
Constrains all DOFs on a given boundary edge.
Definition: ASMs3D.C:1304
virtual int findElementContaining(const double *param) const
Returns the element that contains a specified spatial point.
Definition: ASMs3D.C:2995
std::shared_ptr< Go::SplineVolume > svol
The actual spline volume object.
Definition: ASMs3D.h:915
virtual void getElementBorders(int iel, double *u) const
Computes the element border parameters.
Definition: ASMs3D.C:1965
virtual bool assembleL2matrices(SystemMatrix &A, SystemVector &B, const L2Integrand &integrand, bool continuous) const
Assembles L2-projection matrices for the secondary solution.
Definition: ASMs3Drecovery.C:157
virtual bool getGridParameters(RealArray &prm, int dir, int nSegSpan) const
Calculates parameter values for visualization nodal points.
Definition: ASMs3D.C:3025
virtual int getFirstItgElmNode() const
Returns 0-based index of first node on integration basis.
Definition: ASMs3D.h:777
virtual void getBoundary1Nodes(int lEdge, IntVec &nodes, int basis, int=0, bool local=false, bool open=false) const
Finds the global (or patch-local) node numbers on a patch boundary.
Definition: ASMs3D.C:1806
virtual Go::SplineSurface * getBoundary(int dir, int=1)
Returns the spline surface representing a boundary of this patch.
Definition: ASMs3D.C:72
virtual Fields * getProjectedFields(const Vector &coefs, size_t=0) const
Returns a field using the projection basis.
Definition: ASMs3D.C:3783
bool getGrevilleParameters(RealArray &prm, int dir, int basisNum=1) const
Calculates parameter values for the Greville points.
Definition: ASMs3Drecovery.C:29
bool assignNodeNumbers(BlockNodes &nodes, int basis=0)
Assigns new global node numbers for all nodes of the patch.
Definition: ASMs3D.C:552
const IndexVec & nodeInd
IJK-triplets for the control points (nodes)
Definition: ASMs3D.h:918
ThreadGroups threadGroupsVol
Element groups for multi-threaded volume assembly.
Definition: ASMs3D.h:928
virtual bool updateDirichlet(const std::map< int, RealFunc * > &func, const std::map< int, VecFunc * > &vfunc, double time, const std::map< int, int > *g2l=nullptr)
Updates the time-dependent in-homogeneous Dirichlet coefficients.
Definition: ASMs3D.C:1444
virtual Go::SplineVolume * getBasis(int basis=1)
Returns the spline volume representing a basis of this patch.
Definition: ASMs3D.C:100
int coeffInd(size_t inod) const
Returns an index into the internal coefficient array for a node.
Definition: ASMs3D.C:1576
virtual int getNodeID(size_t inod, bool noAddedNodes=false) const
Returns the global node number for the given node.
Definition: ASMs3D.C:277
virtual void closeBoundaries(int dir, int basis, int master)
Makes two opposite boundary faces periodic.
Definition: ASMs3D.C:804
virtual void constrainFace(int dir, bool open, int dof, int code=0, char basis=1)
Constrains all DOFs on a given boundary face.
Definition: ASMs3D.C:1014
Go::SplineVolume * projectSolution(const IntegrandBase &integrand) const
Projects the secondary solution field onto the primary basis.
Definition: ASMs3Drecovery.C:111
std::map< size_t, size_t > nxMap
Node index map used by getNodeID()
Definition: ASMs3D.h:922
virtual IntMat getElmNodes(int basis) const
Returns the matrix of nodal point correspondance for given basis.
Definition: ASMs3D.C:3849
std::vector< std::unique_ptr< BasisFunctionCache > > myCache
Basis function cache.
Definition: ASMs3D.h:933
Go::SplineVolume * projectSolutionLocalApprox(const IntegrandBase &) const
Projects the secondary solution using Variation Diminishing Spline Approximation.
Definition: ASMs3Drecovery.C:427
virtual size_t getNoNodes(int basis=0) const
Returns the total number of nodes in this patch.
Definition: ASMs3D.C:292
virtual Vec3 getElementCenter(int iel) const
Returns the coordinate of the element center.
Definition: ASMs3D.C:1738
virtual bool getOrder(int &p1, int &p2, int &p3) const
Returns the polynomial order in each parameter direction.
Definition: ASMs3D.C:1874
IndexVec myNodeInd
The actual IJK-triplet container.
Definition: ASMs3D.h:919
std::map< char, ThreadGroups > threadGroupsFace
Element groups for multi-threaded face assembly.
Definition: ASMs3D.h:930
virtual bool getSize(int &n1, int &n2, int &n3, int basis=0) const
Returns the number of nodal points in each parameter direction.
Definition: ASMs3D.C:1888
virtual void getBoundaryNodes(int lIndex, IntVec &nodes, int basis, int thick=1, int=0, bool local=false) const
Finds the global (or patch-local) node numbers on a patch boundary.
Definition: ASMs3D.C:1746
virtual void getElmConnectivities(IntMat &neigh, int basis=ASM::INTEGRATION_BASIS) const
Calculates the matrix of element neighbour connectivities.
Definition: ASMs3D.C:3809
Base class for structured spline-based FE assembly drivers.
Definition: ASMstruct.h:32
virtual bool evalSolution(Matrix &sField, const Vector &locSol, const int *npe, int n_f=0, bool piola=false) const
Evaluates the primary solution field at all visualization points.
Definition: ASMbase.C:1735
BasisFunctionCache()
Default constructor.
Definition: BasisFunctionCache.C:22
Class for storage of a standard FE grid block.
Definition: ElementBlock.h:27
Interface class for scalar fields.
Definition: Field.h:30
Base class for vector fields.
Definition: Fields.h:35
Base class for unary spatial functions of arbitrary result type.
Definition: Function.h:147
Abstract base class representing a system level integrated quantity.
Definition: GlobalIntegral.h:29
Base class representing a system level integrated quantity.
Definition: IntegrandBase.h:42
Abstract base class representing a system level integrated quantity.
Definition: Integrand.h:44
Abstract class for evaluating integrand or function.
Definition: GlbL2projector.h:39
Base class for representing a system matrix on different formats.
Definition: SystemMatrix.h:220
Base class for representing a system vector on different formats.
Definition: SystemMatrix.h:32
Class containing threading group partitioning.
Definition: ThreadGroups.h:26
Simple class for representing a point in 3D space.
Definition: Vec3.h:27
A vector class with some added algebraic operations.
Definition: matrix.h:64
@ INTEGRATION_BASIS
Integration basis.
Definition: ASMenums.h:58
Go::SplineCurve * project(const Go::SplineCurve *curve, const FunctionBase &f, int nComp=1, Real time=Real(0))
Projects a spatial function onto a spline curve.
Definition: SplineUtils.C:204
General utility classes and functions.
Definition: SIMoptions.h:22
Struct with data for definition of global node numbers of a patch.
Definition: ASMs3D.h:135
int nnodJ
Number of nodes in parameter direction J.
Definition: ASMs3D.h:142
int inc[3]
Increment in global node numbering in each direction.
Definition: ASMs3D.h:140
Edge edges[12]
Edge nodes.
Definition: ASMs3D.h:137
int next()
Returns iinod which then is incremented.
Definition: ASMs3D.C:532
int iinod
Global node number of the first interior node.
Definition: ASMs3D.h:139
int indxI
Running node index in the local I-direction.
Definition: ASMs3D.h:143
int nnodI
Number of nodes in parameter direction I.
Definition: ASMs3D.h:141
int ibnod[8]
Vertex nodes.
Definition: ASMs3D.h:136
Face faces[6]
Face nodes.
Definition: ASMs3D.h:138
BlockNodes()
Default constructor.
Definition: ASMs3D.h:147
int indxJ
Running node index in the local J-direction.
Definition: ASMs3D.h:144
Struct representing an inhomogeneous Dirichlet boundary condition.
Definition: ASMs3D.h:162
DirichletFace(Go::SplineSurface *ss=nullptr, int d=0, int c=0)
Default constructor.
Definition: ASMs3D.h:169
std::vector< Ipair > nodes
Nodes subjected to projection on the boundary.
Definition: ASMs3D.h:166
Go::SplineSurface * surf
Pointer to spline surface for the boundary.
Definition: ASMs3D.h:163
int code
Inhomogeneous Dirichlet condition code.
Definition: ASMs3D.h:165
int dof
Local DOF to constrain along the boundary.
Definition: ASMs3D.h:164
Struct for edge node definitions.
Definition: ASMs3D.h:52
int incr
Increment in the global numbering along the edge.
Definition: ASMs3D.h:54
Edge()
Default constructor.
Definition: ASMs3D.h:57
int icnod
Global node number of first interior point along the edge.
Definition: ASMs3D.h:53
int next()
Returns icnod which then is incremented.
Definition: ASMs3D.C:508
Struct for face node definitions.
Definition: ASMs3D.h:64
int incrJ
Increment in global numbering in the J-direction on the face.
Definition: ASMs3D.h:67
int indxI
Running node index in the local I-direction.
Definition: ASMs3D.h:69
int nnodI
Number of nodes in the local I-direction on the face.
Definition: ASMs3D.h:68
Face()
Default constructor.
Definition: ASMs3D.h:72
int next()
Returns isnod which then is incremented.
Definition: ASMs3D.C:517
int incrI
Increment in global numbering in the I-direction on the face.
Definition: ASMs3D.h:66
int isnod
Global node number of the first interior point on the face.
Definition: ASMs3D.h:65
Struct for nodal point data.
Definition: ASMs3D.h:42
int I
Index in first parameter direction.
Definition: ASMs3D.h:43
int J
Index in second parameter direction.
Definition: ASMs3D.h:44
int K
Index in third parameter direction.
Definition: ASMs3D.h:45
Struct holding basis function values and derivatives.
Definition: BasisFunctionVals.h:25
Struct representing the time domain.
Definition: TimeDomain.h:23