IFEM  90A354
ASMu2Dmx.h
Go to the documentation of this file.
1 // $Id$
2 //==============================================================================
12 //==============================================================================
13 
14 #ifndef _ASM_U2D_MX_H
15 #define _ASM_U2D_MX_H
16 
17 #include "ASMu2D.h"
18 #include "ASMmxBase.h"
19 
20 
31 class ASMu2Dmx : public ASMu2D, private ASMmxBase
32 {
33 public:
35  ASMu2Dmx(unsigned char n_s, const CharVec& n_f);
37  ASMu2Dmx(const ASMu2Dmx& patch, const CharVec& n_f = CharVec(2,0));
39  virtual ~ASMu2Dmx() {}
40 
42  virtual const LR::LRSplineSurface* getBasis(int basis = 1) const;
44  virtual LR::LRSplineSurface* getBasis(int basis = 1);
45 
46  // Methods for model generation
47  // ============================
48 
50  virtual bool readBasis(std::istream& is, size_t basis);
51 
55  virtual bool generateFEMTopology();
56 
60  virtual void clear(bool retainGeometry);
61 
63  virtual size_t getNoBasis() const { return m_basis.size(); }
65  virtual size_t getNoNodes(int basis) const;
67  virtual unsigned char getNoFields(int basis) const;
70  virtual unsigned char getNodalDOFs(size_t inod) const;
73  virtual char getNodeType(size_t inod) const;
76  virtual Vec3 getCoord(size_t inod) const;
77 
79  virtual void initMADOF(const int* sysMadof);
80 
81  // Methods for integration of finite element quantities.
82  // These are the main computational methods of the ASM class hierarchy.
83  // ====================================================================
84 
89  virtual bool integrate(Integrand& integrand,
90  GlobalIntegral& glbInt, const TimeDomain& time);
91 
97  virtual bool integrate(Integrand& integrand, int lIndex,
98  GlobalIntegral& glbInt, const TimeDomain& time);
99 
105  virtual bool integrate(Integrand& integrand, GlobalIntegral& glbInt,
106  const TimeDomain& time,
107  const ASM::InterfaceChecker& iChk);
108 
109 
110  // Post-processing methods
111  // =======================
112 
117  virtual bool getSolution(Matrix& sField, const Vector& locSol,
118  const IntVec& nodes) const;
119 
120  using ASMu2D::evalSolution;
133  virtual bool evalSolution(Matrix& sField, const Vector& locSol,
134  const RealArray* gpar, bool,
135  int deriv, int nf) const;
136 
148  virtual bool evalSolutionPiola(Matrix& sField, const Vector& locSol,
149  const RealArray* gpar, bool regular) const;
150 
163  virtual bool evalSolution(Matrix& sField, const IntegrandBase& integrand,
164  const RealArray* gpar, bool) const;
165 
170  virtual void extractNodeVec(const RealArray& globVec, RealArray& nodeVec,
171  unsigned char, int basis) const;
172 
177  virtual bool injectNodeVec(const RealArray& nodeVec, RealArray& globVec,
178  unsigned char, int basis) const;
179 
181  virtual size_t getNoRefineNodes() const;
182 
184  virtual size_t getNoRefineElms() const;
185 
186  using ASMu2D::refine;
190  virtual bool refine(const LR::RefineData& prm, Vectors& sol);
191 
195  virtual void storeMesh(const std::string& fName, int fType) const;
196 
205  virtual bool connectPatch(int edge, ASM2D& neighbor, int nedge, bool revers,
206  int basis, bool coordCheck, int thick);
207 
215  virtual void getBoundaryNodes(int lIndex, IntVec& nodes,
216  int basis, int thick, int orient, bool local) const;
217 
222  virtual void remapErrors(RealArray& errors,
223  const RealArray& origErr, bool elemErrors) const;
224 
226  virtual bool separateProjectionBasis() const;
227 
229  bool usePiola() const { return piola; }
230 
231 private:
236  void getElementsAt(const RealArray& param,
237  std::vector<int>& elms,
238  std::vector<size_t>* sizes = nullptr) const;
239 
240 protected:
246  void generateThreadGroups(const Integrand& integrand, bool silence,
247  bool ignoreGlobalLM);
248 
249 private:
250  using SplinePtr = std::shared_ptr<LR::LRSplineSurface>;
251 
252  std::vector<SplinePtr> m_basis;
253  LR::LRSplineSurface* threadBasis;
254 };
255 
256 #endif
std::vector< int > IntVec
General integer vector.
Definition: ASMbase.h:25
Base class for spline-based mixed finite element assembly drivers.
Driver for assembly of unstructured 2D spline FE models.
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
Abstract interface for 2D spline patches.
Definition: ASM2D.h:33
std::vector< unsigned char > CharVec
Convenience type.
Definition: ASM2D.h:42
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
Base class to check for internal boundary integrand contributions.
Definition: Interface.h:40
unsigned char nf
Number of primary solution fields (1 or larger)
Definition: ASMbase.h:1033
Base class for spline-based mixed finite element assembly drivers.
Definition: ASMmxBase.h:35
bool piola
True if last used integrand was Piola mapped.
Definition: ASMmxBase.h:81
Driver for assembly of unstructured 2D spline FE models.
Definition: ASMu2D.h:50
virtual bool integrate(Integrand &integrand, GlobalIntegral &glbInt, const TimeDomain &time)=0
Evaluates an integral over the interior patch domain.
virtual bool refine(const LR::RefineData &prm, Vectors &sol)
Refines the mesh adaptively.
Definition: ASMLRSpline.C:219
void generateThreadGroups(const Integrand &integrand, bool silence, bool ignoreGlobalLM)
Generates element groups for multi-threading of interior integrals.
Definition: ASMu2D.C:2646
Driver for assembly of unstructured 2D spline mixed FE models.
Definition: ASMu2Dmx.h:32
virtual bool separateProjectionBasis() const
Checks if a separate projection basis is used for this patch.
Definition: ASMu2Dmx.C:1369
virtual void getBoundaryNodes(int lIndex, IntVec &nodes, int basis, int thick, int orient, bool local) const
Finds the global (or patch-local) node numbers on a patch boundary.
Definition: ASMu2Dmx.C:1267
bool usePiola() const
Returns true if the last passed integrand used Piola mapping.
Definition: ASMu2Dmx.h:229
virtual bool generateFEMTopology()
Generates the finite element topology data for the patch.
Definition: ASMu2Dmx.C:187
virtual bool refine(int dir, const RealArray &xi, double scale)
Refines the parametrization by inserting extra tensor knots.
Definition: ASMu2D.C:303
virtual bool connectPatch(int edge, ASM2D &neighbor, int nedge, bool revers, int basis, bool coordCheck, int thick)
Connects all matching nodes on two adjacent boundary edges.
Definition: ASMu2Dmx.C:1251
virtual void extractNodeVec(const RealArray &globVec, RealArray &nodeVec, unsigned char, int basis) const
Extracts nodal results for this patch from the global vector.
Definition: ASMu2Dmx.C:165
virtual unsigned char getNoFields(int basis) const
Returns the number of solution fields.
Definition: ASMu2Dmx.C:120
virtual void clear(bool retainGeometry)
Clears the contents of the patch, making it empty.
Definition: ASMu2Dmx.C:96
virtual Vec3 getCoord(size_t inod) const
Returns the global coordinates for the given node.
Definition: ASMu2Dmx.C:1180
std::shared_ptr< LR::LRSplineSurface > SplinePtr
Pointer to spline.
Definition: ASMu2Dmx.h:250
virtual void remapErrors(RealArray &errors, const RealArray &origErr, bool elemErrors) const
Remaps element-wise errors from geometry mesh to refinement mesh.
Definition: ASMu2Dmx.C:1278
virtual bool getSolution(Matrix &sField, const Vector &locSol, const IntVec &nodes) const
Extracts the primary solution field at the specified nodes.
Definition: ASMu2Dmx.C:180
virtual size_t getNoRefineElms() const
Returns the number of refinement elements for this patch.
Definition: ASMu2Dmx.C:1299
virtual void storeMesh(const std::string &fName, int fType) const
Stores the mesh basis to encapsulated postscript files.
Definition: ASMu2Dmx.C:1305
void generateThreadGroups(const Integrand &integrand, bool silence, bool ignoreGlobalLM)
Generates element groups for multi-threading of interior integrals.
Definition: ASMu2D.C:2646
virtual void initMADOF(const int *sysMadof)
Initializes the patch level MADOF array for mixed problems.
Definition: ASMu2Dmx.C:159
virtual bool evalSolutionPiola(Matrix &sField, const Vector &locSol, const RealArray *gpar, bool regular) const
Evaluates the primary solution field at the given points with Piola mapping.
Definition: ASMu2Dmx.C:914
virtual bool readBasis(std::istream &is, size_t basis)
Reads a basis from the given input stream.
Definition: ASMu2Dmx.C:76
virtual bool evalSolution(Matrix &sField, const Vector &locSol, const int *npe, int n_f, bool piola) const
Evaluates the primary solution field at all visualization points.
Definition: ASMu2D.C:2052
virtual size_t getNoRefineNodes() const
Returns the number of refinement nodes for this patch.
Definition: ASMu2Dmx.C:1293
virtual char getNodeType(size_t inod) const
Returns the classification of a node.
Definition: ASMu2Dmx.C:144
virtual bool injectNodeVec(const RealArray &nodeVec, RealArray &globVec, unsigned char, int basis) const
Injects nodal results for this patch into a global vector.
Definition: ASMu2Dmx.C:172
virtual ~ASMu2Dmx()
Empty destructor.
Definition: ASMu2Dmx.h:39
virtual size_t getNoNodes(int basis) const
Returns the total number of nodes in this patch.
Definition: ASMu2Dmx.C:111
std::vector< SplinePtr > m_basis
All bases.
Definition: ASMu2Dmx.h:252
virtual size_t getNoBasis() const
Returns the number of bases.
Definition: ASMu2Dmx.h:63
virtual unsigned char getNodalDOFs(size_t inod) const
Returns the number of DOFs per node.
Definition: ASMu2Dmx.C:132
LR::LRSplineSurface * threadBasis
Basis for thread groups.
Definition: ASMu2Dmx.h:253
ASMu2Dmx(unsigned char n_s, const CharVec &n_f)
The constructor initializes the dimension of each basis.
Definition: ASMu2Dmx.C:41
void getElementsAt(const RealArray &param, std::vector< int > &elms, std::vector< size_t > *sizes=nullptr) const
Finds the elements and associted sizes at given parametric point.
Definition: ASMu2Dmx.C:1346
virtual const LR::LRSplineSurface * getBasis(int basis=1) const
Returns the spline surface representing a basis of this patch.
Definition: ASMu2Dmx.C:58
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
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
A struct of data to control the mesh refinement.
Definition: ASMunstruct.h:44
Struct representing the time domain.
Definition: TimeDomain.h:23