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 "Tensor.h"
21
22using TensorVec = std::vector<Tensor>;
23
24namespace Go {
25 class SplineCurve;
26}
27
28
34class ASMs1D : public ASMstruct, public ASMunstruct, public ASM1D
35{
36public:
38 ASMs1D(unsigned char n_s = 1, unsigned char n_f = 1);
40 ASMs1D(const ASMs1D& patch, unsigned char n_f = 0);
42 virtual ~ASMs1D() {}
43
45 Go::SplineCurve* getCurve() const { return curv.get(); }
46
47
48 // Methods for model generation
49 // ============================
50
52 virtual bool read(std::istream&);
54 virtual bool write(std::ostream&, int = 0) const;
55
59 virtual bool generateFEMTopology();
60
63 virtual bool generateOrientedFEModel(const Vec3& Zaxis);
64
67 void applyTwist(const RealFunc& twist);
68
72 virtual void clear(bool retainGeometry = false);
73
75 virtual int getSize(int = 0) const;
76
79 virtual Vec3 getCoord(size_t inod) const;
80
83 const Tensor& getRotation(size_t inod) const;
84
89 virtual bool getElementCoordinates(Matrix& X, int iel, bool = false) const;
90
91private:
96 bool getElementCoordinates(Matrix& X, const IntVec& mnpc,
97 const Go::SplineCurve* crv) const;
98
99public:
103 virtual void getNodalCoordinates(Matrix& X, bool = false) const;
104
107 virtual bool updateCoords(const Vector& displ);
108
112 bool updateRotations(const Vector& displ, bool reInit = false);
115
117 virtual Vec3 getElementCenter(int iel) const;
118
124 virtual void getBoundaryNodes(int lIndex, IntVec& nodes,
125 int, int thick, int, bool local) const;
126
130 virtual std::pair<size_t,double> findClosestNode(const Vec3& X) const;
131
139 std::pair<int,double> findElement(const Vec3& X) const;
140
143 virtual bool refine(const LR::RefineData& prm, Vectors&);
144
147 virtual bool refine(const RealArray& xi);
150 virtual bool uniformRefine(int nInsert);
153 virtual bool raiseOrder(int ru);
154
156 virtual bool createProjectionBasis(bool init);
157
158
159 // Various methods for preprocessing of boundary conditions and patch topology
160 // ===========================================================================
161
173 virtual int constrainNode(double xi, int dof, int code);
178 virtual size_t constrainEndLocal(int dir, int dof, int code);
179
185 virtual bool connectPatch(int vertex, ASM1D& neighbor, int nvertex,
186 int thick = 1);
187
191 virtual void closeBoundaries(int, int basis, int master);
192
193
194 // Methods for integration of finite element quantities.
195 // These are the main computational methods of the ASM class hierarchy.
196 // ====================================================================
197
202 virtual bool integrate(Integrand& integrand,
203 GlobalIntegral& glbInt, const TimeDomain& time);
204
210 virtual bool integrate(Integrand& integrand, int lIndex,
211 GlobalIntegral& glbInt, const TimeDomain& time);
212
213
214 // Post-processing methods
215 // =======================
216
223 virtual int evalPoint(const double* xi, double* param, Vec3& X) const;
224
228 virtual int findElementContaining(const double* param) const;
229
234 virtual double findPoint(Vec3& X, double* param) const;
235
240 virtual bool tesselate(ElementBlock& grid, const int* npe) const;
241
246 virtual bool getSolution(Matrix& sField, const Vector& locSol,
247 const IntVec& nodes) const;
248
253 virtual bool evalSolution(Matrix& sField, const Vector& locSol,
254 const int* npe, int, bool) const;
255
261 virtual bool evalSolution(Matrix& sField, const Vector& locSol,
262 const RealArray* gpar, bool = true,
263 int deriv = 0, int = 0) const;
264
269 virtual bool evalProjSolution(Matrix& sField, const Vector& locSol,
270 const int* npe, int) const;
271
272 using ASMbase::evaluate;
277 virtual bool evaluate(const FunctionBase* func, RealArray& vec,
278 int, double time) const;
279
293 virtual bool evalSolution(Matrix& sField, const IntegrandBase& integrand,
294 const int* npe = nullptr, char project = 0) const;
295
298 Go::SplineCurve* projectSolution(const IntegrandBase& integrand) const;
301 virtual Go::GeomObject* evalSolution(const IntegrandBase& integrand) const;
302
305 virtual Fields* getProjectedFields(const Vector& coefs, size_t = 0) const;
306
314 virtual bool evalSolution(Matrix& sField, const IntegrandBase& integrand,
315 const RealArray* gpar, bool = true) const;
316
320 virtual bool getGridParameters(RealArray& prm, int nSegSpan) const;
321
325 virtual void evaluateBasis(double u, double, double, Vector& N) const;
329 void extractBasis(double u, Vector& N) const;
334 void extractBasis(double u, Vector& N, Matrix& dNdu) const;
340 void extractBasis(double u, Vector& N, Matrix& dNdu, Matrix3D& d2Ndu2) const;
348 void extractBasis(double u, Vector& N, Matrix& dNdu,
349 Matrix3D& d2Ndu2, Matrix4D& d3Ndu3) const;
350
351protected:
352
353 // Internal utility methods
354 // ========================
355
359 virtual void findBoundaryElms(IntVec& elms, int lIndex, int = 0) const;
360
366 virtual bool assembleL2matrices(SystemMatrix& A, SystemVector& B,
367 const L2Integrand& integrand,
368 bool continuous) const;
369
372 virtual bool initLocalElementAxes(const Vec3& Zaxis);
373
379 bool connectBasis(ASMs1D& neighbor, int slave, int master, int thick = 1);
380
383 bool getGrevilleParameters(RealArray& prm) const;
384
386 double getKnotSpan(int i) const;
387
391 virtual void getElementBorders(int iel, double* u) const;
392
397 double getElementEnds(int i, std::vector<Vec3>& XC) const;
398
402 bool getElementNodalRotations(TensorVec& T, size_t iel) const;
403
405 Tensor getLocal2Global(double u) const;
406
407public:
409 static void scatterInd(int p1, int start, IntVec& index);
410
415 virtual bool getOrder(int& p1, int& p2, int& p3) const;
416
422 virtual bool getSize(int& n1, int& n2, int& n3, int basis) const;
423
428 virtual bool getNoStructElms(int& n1, int& n2, int& n3) const;
429
431 virtual size_t getNoNodes(int basis = 0) const;
433 virtual size_t getNoProjectionNodes() const;
434
438 virtual bool getParameterDomain(Real2DMat& u, IntVec* corners) const;
439
443 virtual void getElmConnectivities(IntMat& neigh,
444 int basis = ASM::INTEGRATION_BASIS) const;
445
447 virtual IntMat getElmNodes(int basis) const;
448
449private:
451 static void createMNPC(const Go::SplineCurve* crv, IntMat& MNPC);
452
453protected:
454 std::shared_ptr<Go::SplineCurve> curv;
455 std::shared_ptr<Go::SplineCurve> proj;
456
457 std::map<size_t,size_t> xnMap;
458 std::map<size_t,size_t> nxMap;
459
462
465
469
470private:
471 bool updatedT;
472};
473
474#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:22
Base class for structured spline-based FE assembly drivers.
Abstract interface for unstructured FE assembly drivers.
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:32
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:1064
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:1841
Driver for assembly of structured 1D spline FE models.
Definition ASMs1D.h:35
virtual bool getNoStructElms(int &n1, int &n2, int &n3) const
Returns the number of elements in each parameter direction.
Definition ASMs1D.C:1877
const Tensor & getRotation(size_t inod) const
Returns the current rotation tensor for the given node.
Definition ASMs1D.C:624
virtual size_t getNoProjectionNodes() const
Returns the number of projection nodes for this patch.
Definition ASMs1D.C:931
virtual bool write(std::ostream &, int=0) const
Writes the geometry of the SplineCurve object to given stream.
Definition ASMs1D.C:116
virtual std::pair< size_t, double > findClosestNode(const Vec3 &X) const
Finds the node that is closest to the given point.
Definition ASMs1D.C:811
static void scatterInd(int p1, int start, IntVec &index)
Auxilliary function for computation of basis function indices.
Definition ASMs1D.C:1476
std::map< size_t, size_t > nxMap
Node index map used by getNodeID()
Definition ASMs1D.h:458
virtual int constrainNode(double xi, int dof, int code)
Constrains a node identified by a relative parameter value.
Definition ASMs1D.C:493
virtual bool evalSolution(Matrix &sField, const Vector &locSol, const int *npe, int, bool) const
Evaluates the primary solution field at all visualization points.
Definition ASMs1D.C:1505
bool connectBasis(ASMs1D &neighbor, int slave, int master, int thick=1)
Connects matching nodes on two adjacent vertices.
Definition ASMs1D.C:457
bool getGrevilleParameters(RealArray &prm) const
Calculates parameter values for the Greville points.
Definition ASMs1D.C:1425
IntVec projMLGE
Matrix of Local to Global Element numbers for projection.
Definition ASMs1D.h:461
virtual void getElmConnectivities(IntMat &neigh, int basis=ASM::INTEGRATION_BASIS) const
Calculates the matrix of element neighbour connectivities.
Definition ASMs1D.C:1919
virtual IntMat getElmNodes(int basis) const
Returns the matrix of nodal point correspondance for given basis.
Definition ASMs1D.C:1938
TensorVec prevT
Nodal rotation tensors of last converged configuration.
Definition ASMs1D.h:468
virtual int findElementContaining(const double *param) const
Returns the element that contains a specified spatial point.
Definition ASMs1D.C:1385
bool getElementNodalRotations(TensorVec &T, size_t iel) const
Returns nodal rotation matrices for an element, if any.
Definition ASMs1D.C:676
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:775
virtual bool generateOrientedFEModel(const Vec3 &Zaxis)
Generates a beam finite element model for the patch.
Definition ASMs1D.C:295
virtual int getSize(int=0) const
Returns the number of nodal points in the patch.
Definition ASMs1D.C:923
virtual bool tesselate(ElementBlock &grid, const int *npe) const
Creates a line element model of this patch for visualization.
Definition ASMs1D.C:1439
virtual bool getSolution(Matrix &sField, const Vector &locSol, const IntVec &nodes) const
Extract the primary solution field at the specified nodes.
Definition ASMs1D.C:1483
TensorVec myCS
The actual element coordinate systems.
Definition ASMs1D.h:466
double getKnotSpan(int i) const
Returns the parametric length on the i'th knot-span.
Definition ASMs1D.C:600
virtual bool generateFEMTopology()
Generates the finite element topology data for the patch.
Definition ASMs1D.C:281
Tensor getLocal2Global(double u) const
Returns the local-to-global transformation at a parametric point.
Definition ASMs1D.C:559
virtual size_t constrainEndLocal(int dir, int dof, int code)
Constrains all DOFs in local directions at a given end point.
Definition ASMs1D.C:507
virtual void clear(bool retainGeometry=false)
Clears the contents of the patch, making it empty.
Definition ASMs1D.C:127
virtual bool updateCoords(const Vector &displ)
Updates the nodal coordinates for this patch.
Definition ASMs1D.C:709
std::shared_ptr< Go::SplineCurve > curv
The actual spline curve object.
Definition ASMs1D.h:454
virtual bool integrate(Integrand &integrand, GlobalIntegral &glbInt, const TimeDomain &time)
Evaluates an integral over the interior patch domain.
Definition ASMs1D.C:1059
virtual Vec3 getElementCenter(int iel) const
Returns the coordinate of the element center.
Definition ASMs1D.C:762
virtual bool refine(const LR::RefineData &prm, Vectors &)
Refines the mesh adaptively.
Definition ASMs1D.C:153
static void createMNPC(const Go::SplineCurve *crv, IntMat &MNPC)
Creates matrix of nodal point correspondance for a spline curve.
Definition ASMs1D.C:1946
void updateRotations()
Updates the previous nodal rotations for this patch at convergence.
Definition ASMs1D.h:114
virtual bool getParameterDomain(Real2DMat &u, IntVec *corners) const
Returns parameter values and node numbers of the domain corners.
Definition ASMs1D.C:939
TensorVec myT
The actual nodal rotation tensors.
Definition ASMs1D.h:467
virtual bool createProjectionBasis(bool init)
Creates a separate projection basis for this patch.
Definition ASMs1D.C:266
void extractBasis(double u, Vector &N) const
Establishes the vector with basis function values.
Definition ASMs1D.C:1004
virtual bool connectPatch(int vertex, ASM1D &neighbor, int nvertex, int thick=1)
Connects matching nodes on two adjacent vertices.
Definition ASMs1D.C:441
IntMat projMNPC
Matrix of Nodal Point Correspondance for projection.
Definition ASMs1D.h:460
virtual bool getOrder(int &p1, int &p2, int &p3) const
Returns the polynomial order in each parameter direction.
Definition ASMs1D.C:905
double getElementEnds(int i, std::vector< Vec3 > &XC) const
Computes the element end coordinates.
Definition ASMs1D.C:967
virtual bool getElementCoordinates(Matrix &X, int iel, bool=false) const
Returns a matrix with nodal coordinates for an element.
Definition ASMs1D.C:634
virtual bool initLocalElementAxes(const Vec3 &Zaxis)
Initializes the local element axes for a patch of beam elements.
Definition ASMs1D.C:399
std::pair< int, double > findElement(const Vec3 &X) const
Finds the element that contains the given point.
Definition ASMs1D.C:849
virtual Fields * getProjectedFields(const Vector &coefs, size_t=0) const
Returns a field using the projection basis.
Definition ASMs1D.C:1903
virtual double findPoint(Vec3 &X, double *param) const
Searches for the specified Cartesian point in the patch.
Definition ASMs1D.C:793
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:1575
virtual void getNodalCoordinates(Matrix &X, bool=false) const
Returns a matrix with all nodal coordinates within the patch.
Definition ASMs1D.C:700
virtual void getElementBorders(int iel, double *u) const
Computes the element border parameters.
Definition ASMs1D.C:956
std::map< size_t, size_t > xnMap
Node index map used by getCoord()
Definition ASMs1D.h:457
virtual int evalPoint(const double *xi, double *param, Vec3 &X) const
Evaluates the geometry at a specified point.
Definition ASMs1D.C:1372
Go::SplineCurve * getCurve() const
Returns the spline curve representing the geometry of this patch.
Definition ASMs1D.h:45
virtual void closeBoundaries(int, int basis, int master)
Makes the two end vertices of the curve periodic.
Definition ASMs1D.C:485
virtual void findBoundaryElms(IntVec &elms, int lIndex, int=0) const
Finds the path-local element numbers on a patch boundary.
Definition ASMs1D.C:1932
virtual bool evaluate(const FunctionBase *func, RealArray &vec, int, double time) const
Evaluates and interpolates a function over a given geometry.
Definition ASMs1D.C:1886
virtual ~ASMs1D()
Empty destructor.
Definition ASMs1D.h:42
virtual void evaluateBasis(double u, double, double, Vector &N) const
Evaluates the basis functions at the specified point.
Definition ASMs1D.C:998
const TensorVec & nodalT
Nodal rotation tensors (for 3D beams)
Definition ASMs1D.h:464
virtual bool uniformRefine(int nInsert)
Refines the parametrization by inserting extra knots uniformly.
Definition ASMs1D.C:219
bool updatedT
If true, nodal rotation matrices have been updated.
Definition ASMs1D.h:471
Go::SplineCurve * projectSolution(const IntegrandBase &integrand) const
Projects the secondary solution field onto the primary basis.
Definition ASMs1D.C:1656
virtual size_t getNoNodes(int basis=0) const
Returns the total number of nodes in this patch.
Definition ASMs1D.C:143
std::shared_ptr< Go::SplineCurve > proj
Spline curve for projection basis.
Definition ASMs1D.h:455
virtual bool raiseOrder(int ru)
Raises the order of the SplineCurve object for this patch.
Definition ASMs1D.C:244
virtual bool getGridParameters(RealArray &prm, int nSegSpan) const
Calculates parameter values for visualization nodal points.
Definition ASMs1D.C:1391
void applyTwist(const RealFunc &twist)
Applies a twist angle to the beam transformation matrices.
Definition ASMs1D.C:420
virtual bool assembleL2matrices(SystemMatrix &A, SystemVector &B, const L2Integrand &integrand, bool continuous) const
Assembles L2-projection matrices for the secondary solution.
Definition ASMs1D.C:1778
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:610
const TensorVec & elmCS
Element coordinate systems (for 3D beams)
Definition ASMs1D.h:463
Base class for structured spline-based FE assembly drivers.
Definition ASMstruct.h:32
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:40
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
A struct of data to control the mesh refinement.
Definition ASMunstruct.h:44
Struct representing the time domain.
Definition TimeDomain.h:23