IFEM  90A354
ASMs1D.h
Go to the documentation of this file.
1 // $Id$
2 //==============================================================================
12 //==============================================================================
13 
14 #ifndef _ASM_S1D_H
15 #define _ASM_S1D_H
16 
17 #include "ASMstruct.h"
18 #include "ASMunstruct.h"
19 #include "ASM1D.h"
20 #include "ASMutils.h"
21 #include "Tensor.h"
22 
23 using TensorVec = std::vector<Tensor>;
24 
25 namespace Go {
26  class SplineCurve;
27 }
28 
29 
35 class ASMs1D : public ASMstruct, public ASMunstruct, public ASM1D
36 {
37 public:
39  ASMs1D(unsigned char n_s = 1, unsigned char n_f = 1);
41  ASMs1D(const ASMs1D& patch, unsigned char n_f = 0);
43  virtual ~ASMs1D() {}
44 
46  Go::SplineCurve* getCurve() const { return curv.get(); }
47 
48 
49  // Methods for model generation
50  // ============================
51 
53  virtual bool read(std::istream&);
55  virtual bool write(std::ostream&, int = 0) const;
56 
60  virtual bool generateFEMTopology();
61 
64  virtual bool generateOrientedFEModel(const Vec3& Zaxis);
65 
68  void applyTwist(const RealFunc& twist);
69 
73  virtual void clear(bool retainGeometry = false);
74 
76  virtual int getSize(int = 0) const;
77 
80  virtual Vec3 getCoord(size_t inod) const;
81 
84  const Tensor& getRotation(size_t inod) const;
85 
90  virtual bool getElementCoordinates(Matrix& X, int iel, bool = false) const;
91 
92 private:
97  bool getElementCoordinates(Matrix& X, const IntVec& mnpc,
98  const Go::SplineCurve* crv) const;
99 
100 public:
104  virtual void getNodalCoordinates(Matrix& X, bool = false) const;
105 
108  virtual bool updateCoords(const Vector& displ);
109 
113  bool updateRotations(const Vector& displ, bool reInit = false);
115  void updateRotations() { prevT = myT; }
116 
118  virtual Vec3 getElementCenter(int iel) const;
119 
125  virtual void getBoundaryNodes(int lIndex, IntVec& nodes,
126  int, int thick, int, bool local) const;
127 
129  virtual int getNodeSetIdx(const std::string& setName) const;
131  virtual const IntVec& getNodeSet(int iset) const;
133  virtual bool isInNodeSet(int iset, int inod) const;
135  virtual int parseNodeSet(const std::string& setName, const char* cset);
136 
140  virtual std::pair<size_t,double> findClosestNode(const Vec3& X) const;
141 
149  std::pair<int,double> findElement(const Vec3& X) const;
150 
153  virtual bool refine(const LR::RefineData& prm, Vectors&);
154 
157  virtual bool refine(const RealArray& xi);
160  virtual bool uniformRefine(int nInsert);
163  virtual bool raiseOrder(int ru);
164 
166  virtual bool createProjectionBasis(bool init);
167 
168 
169  // Various methods for preprocessing of boundary conditions and patch topology
170  // ===========================================================================
171 
183  virtual int constrainNode(double xi, int dof, int code);
188  virtual size_t constrainEndLocal(int dir, int dof, int code);
189 
195  virtual bool connectPatch(int vertex, ASM1D& neighbor, int nvertex,
196  int thick = 1);
197 
201  virtual void closeBoundaries(int, int basis, int master);
202 
203 
204  // Methods for integration of finite element quantities.
205  // These are the main computational methods of the ASM class hierarchy.
206  // ====================================================================
207 
212  virtual bool integrate(Integrand& integrand,
213  GlobalIntegral& glbInt, const TimeDomain& time);
214 
220  virtual bool integrate(Integrand& integrand, int lIndex,
221  GlobalIntegral& glbInt, const TimeDomain& time);
222 
223 
224  // Post-processing methods
225  // =======================
226 
233  virtual int evalPoint(const double* xi, double* param, Vec3& X) const;
234 
238  virtual int findElementContaining(const double* param) const;
239 
244  virtual double findPoint(Vec3& X, double* param) const;
245 
250  virtual bool tesselate(ElementBlock& grid, const int* npe) const;
251 
256  virtual bool getSolution(Matrix& sField, const Vector& locSol,
257  const IntVec& nodes) const;
258 
263  virtual bool evalSolution(Matrix& sField, const Vector& locSol,
264  const int* npe, int, bool) const;
265 
271  virtual bool evalSolution(Matrix& sField, const Vector& locSol,
272  const RealArray* gpar, bool = true,
273  int deriv = 0, int = 0) const;
274 
279  virtual bool evalProjSolution(Matrix& sField, const Vector& locSol,
280  const int* npe, int) const;
281 
282  using ASMbase::evaluate;
287  virtual bool evaluate(const FunctionBase* func, RealArray& vec,
288  int, double time) const;
289 
303  virtual bool evalSolution(Matrix& sField, const IntegrandBase& integrand,
304  const int* npe = nullptr, char project = 0) const;
305 
308  Go::SplineCurve* projectSolution(const IntegrandBase& integrand) const;
311  virtual Go::GeomObject* evalSolution(const IntegrandBase& integrand) const;
312 
315  virtual Fields* getProjectedFields(const Vector& coefs, size_t = 0) const;
316 
324  virtual bool evalSolution(Matrix& sField, const IntegrandBase& integrand,
325  const RealArray* gpar, bool = true) const;
326 
330  virtual bool getGridParameters(RealArray& prm, int nSegSpan) const;
331 
335  virtual void evaluateBasis(double u, double, double, Vector& N) const;
339  void extractBasis(double u, Vector& N) const;
344  void extractBasis(double u, Vector& N, Matrix& dNdu) const;
350  void extractBasis(double u, Vector& N, Matrix& dNdu, Matrix3D& d2Ndu2) const;
358  void extractBasis(double u, Vector& N, Matrix& dNdu,
359  Matrix3D& d2Ndu2, Matrix4D& d3Ndu3) const;
360 
361 protected:
362 
363  // Internal utility methods
364  // ========================
365 
369  virtual void findBoundaryElms(IntVec& elms, int lIndex, int = 0) const;
370 
376  virtual bool assembleL2matrices(SystemMatrix& A, SystemVector& B,
377  const L2Integrand& integrand,
378  bool continuous) const;
379 
382  virtual bool initLocalElementAxes(const Vec3& Zaxis);
383 
389  bool connectBasis(ASMs1D& neighbor, int slave, int master, int thick = 1);
390 
393  bool getGrevilleParameters(RealArray& prm) const;
394 
396  double getKnotSpan(int i) const;
397 
401  virtual void getElementBorders(int iel, double* u) const;
402 
407  double getElementEnds(int i, std::vector<Vec3>& XC) const;
408 
412  bool getElementNodalRotations(TensorVec& T, size_t iel) const;
413 
415  Tensor getLocal2Global(double u) const;
416 
417 public:
419  static void scatterInd(int p1, int start, IntVec& index);
420 
425  virtual bool getOrder(int& p1, int& p2, int& p3) const;
426 
432  virtual bool getSize(int& n1, int& n2, int& n3, int basis) const;
433 
438  virtual bool getNoStructElms(int& n1, int& n2, int& n3) const;
439 
441  virtual size_t getNoNodes(int basis = 0) const;
443  virtual size_t getNoProjectionNodes() const;
444 
448  virtual bool getParameterDomain(Real2DMat& u, IntVec* corners) const;
449 
453  virtual void getElmConnectivities(IntMat& neigh,
454  int basis = ASM::INTEGRATION_BASIS) const;
455 
457  virtual IntMat getElmNodes(int basis) const;
458 
459 private:
461  static void createMNPC(const Go::SplineCurve* crv, IntMat& MNPC);
462 
463 protected:
464  std::shared_ptr<Go::SplineCurve> curv;
465  std::shared_ptr<Go::SplineCurve> proj;
466 
467  std::map<size_t,size_t> xnMap;
468  std::map<size_t,size_t> nxMap;
469 
472 
473  const TensorVec& elmCS;
474  const TensorVec& nodalT;
475 
479 
480  std::vector<ASM::NodeSet> nodeSets;
481 
482 private:
483  bool updatedT;
484 };
485 
486 #endif
Abstract interface for 1D patches.
std::vector< int > IntVec
General integer vector.
Definition: ASMbase.h:25
std::vector< IntVec > IntMat
General 2D integer matrix.
Definition: ASMbase.h:26
std::vector< Tensor > TensorVec
An array of non-symmetric tensors.
Definition: ASMs1D.h:23
Base class for structured spline-based FE assembly drivers.
Abstract interface for unstructured FE assembly drivers.
Various utilities for assembly scope.
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< Vector > Vectors
An array of real-valued vectors with algebraic operations.
Definition: MatVec.h:37
Representation of second-order tensors with some basic operations.
Abstract interface for 1D spline patches.
Definition: ASM1D.h:31
const IntMat & MNPC
Matrix of Nodal Point Correspondance.
Definition: ASMbase.h:1040
virtual bool evaluate(const ASMbase *basis, const Vector &locVec, RealArray &vec, int basisNum=1) const
Evaluates and interpolates a field over a given geometry.
Definition: ASMbase.C:1779
Driver for assembly of structured 1D spline FE models.
Definition: ASMs1D.h:36
virtual bool getNoStructElms(int &n1, int &n2, int &n3) const
Returns the number of elements in each parameter direction.
Definition: ASMs1D.C:1928
const Tensor & getRotation(size_t inod) const
Returns the current rotation tensor for the given node.
Definition: ASMs1D.C:684
virtual size_t getNoProjectionNodes() const
Returns the number of projection nodes for this patch.
Definition: ASMs1D.C:991
virtual int getNodeSetIdx(const std::string &setName) const
Returns (1-based) index of a predefined node set in the patch.
Definition: ASMs1D.C:431
virtual bool write(std::ostream &, int=0) const
Writes the geometry of the SplineCurve object to given stream.
Definition: ASMs1D.C:106
virtual std::pair< size_t, double > findClosestNode(const Vec3 &X) const
Finds the node that is closest to the given point.
Definition: ASMs1D.C:871
static void scatterInd(int p1, int start, IntVec &index)
Auxilliary function for computation of basis function indices.
Definition: ASMs1D.C:1536
std::map< size_t, size_t > nxMap
Node index map used by getNodeID()
Definition: ASMs1D.h:468
virtual int constrainNode(double xi, int dof, int code)
Constrains a node identified by a relative parameter value.
Definition: ASMs1D.C:553
bool connectBasis(ASMs1D &neighbor, int slave, int master, int thick=1)
Connects matching nodes on two adjacent vertices.
Definition: ASMs1D.C:517
bool getGrevilleParameters(RealArray &prm) const
Calculates parameter values for the Greville points.
Definition: ASMs1D.C:1485
IntVec projMLGE
Matrix of Local to Global Element numbers for projection.
Definition: ASMs1D.h:471
virtual void getElmConnectivities(IntMat &neigh, int basis=ASM::INTEGRATION_BASIS) const
Calculates the matrix of element neighbour connectivities.
Definition: ASMs1D.C:1970
virtual IntMat getElmNodes(int basis) const
Returns the matrix of nodal point correspondance for given basis.
Definition: ASMs1D.C:1989
TensorVec prevT
Nodal rotation tensors of last converged configuration.
Definition: ASMs1D.h:478
virtual int findElementContaining(const double *param) const
Returns the element that contains a specified spatial point.
Definition: ASMs1D.C:1445
bool getElementNodalRotations(TensorVec &T, size_t iel) const
Returns nodal rotation matrices for an element, if any.
Definition: ASMs1D.C:736
virtual void getBoundaryNodes(int lIndex, IntVec &nodes, int, int thick, int, bool local) const
Finds the global (or patch-local) node number on a patch end.
Definition: ASMs1D.C:835
virtual bool generateOrientedFEModel(const Vec3 &Zaxis)
Generates a beam finite element model for the patch.
Definition: ASMs1D.C:285
virtual int getSize(int=0) const
Returns the number of nodal points in the patch.
Definition: ASMs1D.C:983
virtual bool tesselate(ElementBlock &grid, const int *npe) const
Creates a line element model of this patch for visualization.
Definition: ASMs1D.C:1499
virtual bool getSolution(Matrix &sField, const Vector &locSol, const IntVec &nodes) const
Extract the primary solution field at the specified nodes.
Definition: ASMs1D.C:1543
TensorVec myCS
The actual element coordinate systems.
Definition: ASMs1D.h:476
double getKnotSpan(int i) const
Returns the parametric length on the i'th knot-span.
Definition: ASMs1D.C:660
virtual bool generateFEMTopology()
Generates the finite element topology data for the patch.
Definition: ASMs1D.C:271
virtual bool isInNodeSet(int iset, int inod) const
Checks if node inod is within predefined node set iset.
Definition: ASMs1D.C:458
Tensor getLocal2Global(double u) const
Returns the local-to-global transformation at a parametric point.
Definition: ASMs1D.C:619
virtual size_t constrainEndLocal(int dir, int dof, int code)
Constrains all DOFs in local directions at a given end point.
Definition: ASMs1D.C:567
virtual void clear(bool retainGeometry=false)
Clears the contents of the patch, making it empty.
Definition: ASMs1D.C:117
virtual bool updateCoords(const Vector &displ)
Updates the nodal coordinates for this patch.
Definition: ASMs1D.C:769
std::shared_ptr< Go::SplineCurve > curv
The actual spline curve object.
Definition: ASMs1D.h:464
virtual bool integrate(Integrand &integrand, GlobalIntegral &glbInt, const TimeDomain &time)
Evaluates an integral over the interior patch domain.
Definition: ASMs1D.C:1119
virtual Vec3 getElementCenter(int iel) const
Returns the coordinate of the element center.
Definition: ASMs1D.C:822
virtual bool refine(const LR::RefineData &prm, Vectors &)
Refines the mesh adaptively.
Definition: ASMs1D.C:143
static void createMNPC(const Go::SplineCurve *crv, IntMat &MNPC)
Creates matrix of nodal point correspondance for a spline curve.
Definition: ASMs1D.C:1997
void updateRotations()
Updates the previous nodal rotations for this patch at convergence.
Definition: ASMs1D.h:115
virtual bool getParameterDomain(Real2DMat &u, IntVec *corners) const
Returns parameter values and node numbers of the domain corners.
Definition: ASMs1D.C:999
TensorVec myT
The actual nodal rotation tensors.
Definition: ASMs1D.h:477
virtual bool createProjectionBasis(bool init)
Creates a separate projection basis for this patch.
Definition: ASMs1D.C:256
void extractBasis(double u, Vector &N) const
Establishes the vector with basis function values.
Definition: ASMs1D.C:1064
virtual bool connectPatch(int vertex, ASM1D &neighbor, int nvertex, int thick=1)
Connects matching nodes on two adjacent vertices.
Definition: ASMs1D.C:501
IntMat projMNPC
Matrix of Nodal Point Correspondance for projection.
Definition: ASMs1D.h:470
virtual bool getOrder(int &p1, int &p2, int &p3) const
Returns the polynomial order in each parameter direction.
Definition: ASMs1D.C:965
Go::SplineCurve * getCurve() const
Returns the spline curve representing the geometry of this patch.
Definition: ASMs1D.h:46
double getElementEnds(int i, std::vector< Vec3 > &XC) const
Computes the element end coordinates.
Definition: ASMs1D.C:1027
virtual bool getElementCoordinates(Matrix &X, int iel, bool=false) const
Returns a matrix with nodal coordinates for an element.
Definition: ASMs1D.C:694
virtual bool initLocalElementAxes(const Vec3 &Zaxis)
Initializes the local element axes for a patch of beam elements.
Definition: ASMs1D.C:389
std::pair< int, double > findElement(const Vec3 &X) const
Finds the element that contains the given point.
Definition: ASMs1D.C:909
virtual int parseNodeSet(const std::string &setName, const char *cset)
Defines a node set by parsing a list of node numbers.
Definition: ASMs1D.C:470
virtual Fields * getProjectedFields(const Vector &coefs, size_t=0) const
Returns a field using the projection basis.
Definition: ASMs1D.C:1954
virtual double findPoint(Vec3 &X, double *param) const
Searches for the specified Cartesian point in the patch.
Definition: ASMs1D.C:853
std::vector< ASM::NodeSet > nodeSets
Node sets for Dirichlet BCs.
Definition: ASMs1D.h:480
virtual bool evalProjSolution(Matrix &sField, const Vector &locSol, const int *npe, int) const
Evaluates the projected solution field at all visualization points.
Definition: ASMs1D.C:1635
virtual void getNodalCoordinates(Matrix &X, bool=false) const
Returns a matrix with all nodal coordinates within the patch.
Definition: ASMs1D.C:760
virtual void getElementBorders(int iel, double *u) const
Computes the element border parameters.
Definition: ASMs1D.C:1016
std::map< size_t, size_t > xnMap
Node index map used by getCoord()
Definition: ASMs1D.h:467
virtual int evalPoint(const double *xi, double *param, Vec3 &X) const
Evaluates the geometry at a specified point.
Definition: ASMs1D.C:1432
virtual void closeBoundaries(int, int basis, int master)
Makes the two end vertices of the curve periodic.
Definition: ASMs1D.C:545
virtual void findBoundaryElms(IntVec &elms, int lIndex, int=0) const
Finds the path-local element numbers on a patch boundary.
Definition: ASMs1D.C:1983
virtual ~ASMs1D()
Empty destructor.
Definition: ASMs1D.h:43
virtual void evaluateBasis(double u, double, double, Vector &N) const
Evaluates the basis functions at the specified point.
Definition: ASMs1D.C:1058
const TensorVec & nodalT
Nodal rotation tensors (for 3D beams)
Definition: ASMs1D.h:474
virtual bool uniformRefine(int nInsert)
Refines the parametrization by inserting extra knots uniformly.
Definition: ASMs1D.C:209
bool updatedT
If true, nodal rotation matrices have been updated.
Definition: ASMs1D.h:483
Go::SplineCurve * projectSolution(const IntegrandBase &integrand) const
Projects the secondary solution field onto the primary basis.
Definition: ASMs1D.C:1716
virtual size_t getNoNodes(int basis=0) const
Returns the total number of nodes in this patch.
Definition: ASMs1D.C:133
virtual const IntVec & getNodeSet(int iset) const
Returns an indexed pre-defined node set.
Definition: ASMs1D.C:444
std::shared_ptr< Go::SplineCurve > proj
Spline curve for projection basis.
Definition: ASMs1D.h:465
ASMs1D(unsigned char n_s=1, unsigned char n_f=1)
Default constructor.
Definition: ASMs1D.C:39
virtual bool evaluate(const ASMbase *basis, const Vector &locVec, RealArray &vec, int basisNum=1) const
Evaluates and interpolates a field over a given geometry.
Definition: ASMbase.C:1779
virtual bool raiseOrder(int ru)
Raises the order of the SplineCurve object for this patch.
Definition: ASMs1D.C:234
virtual bool getGridParameters(RealArray &prm, int nSegSpan) const
Calculates parameter values for visualization nodal points.
Definition: ASMs1D.C:1451
void applyTwist(const RealFunc &twist)
Applies a twist angle to the beam transformation matrices.
Definition: ASMs1D.C:410
virtual bool assembleL2matrices(SystemMatrix &A, SystemVector &B, const L2Integrand &integrand, bool continuous) const
Assembles L2-projection matrices for the secondary solution.
Definition: ASMs1D.C:1838
virtual bool read(std::istream &)
Creates an instance by reading the given input stream.
Definition: ASMs1D.C:62
virtual Vec3 getCoord(size_t inod) const
Returns the global coordinates for the given node.
Definition: ASMs1D.C:670
const TensorVec & elmCS
Element coordinate systems (for 3D beams)
Definition: ASMs1D.h:473
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
Abstract interface for unstructured spline patches.
Definition: ASMunstruct.h:64
Class for storage of a standard FE grid block.
Definition: ElementBlock.h:27
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
Scalar-valued unary function of a spatial point.
Definition: Function.h:193
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
Simple class for representing a non-symmetric second-order tensor.
Definition: Tensor.h:28
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
A struct of data to control the mesh refinement.
Definition: ASMunstruct.h:44
Struct representing the time domain.
Definition: TimeDomain.h:23