Escript  Revision_4320
finley/src/CPPAdapter/MeshAdapter.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2013 by University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Open Software License version 3.0
9 * http://www.opensource.org/licenses/osl-3.0.php
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development since 2012 by School of Earth Sciences
13 *
14 *****************************************************************************/
15 
16 
17 #if !defined finley_MeshAdapter_20040526_H
18 #define finley_MeshAdapter_20040526_H
19 #include "system_dep.h"
20 
21 extern "C" {
22 #include "finley/Mesh.h"
23 #include "finley/Finley.h"
24 #include "finley/Assemble.h"
25 #include "esysUtils/Esys_MPI.h"
26 }
27 
28 #include "FinleyError.h"
29 #include "FinleyAdapterException.h"
30 
31 #include <pasowrap/SystemMatrixAdapter.h>
32 #include <pasowrap/TransportProblemAdapter.h>
33 #include "escript/AbstractContinuousDomain.h"
34 #include "escript/FunctionSpace.h"
35 #include "escript/FunctionSpaceFactory.h"
36 
37 #include <boost/shared_ptr.hpp>
38 #include <boost/python/dict.hpp>
39 #include <boost/python/extract.hpp>
40 
41 #include <map>
42 #include <vector>
43 #include <string>
44 #include <sstream>
45 
46 namespace finley {
47 
48 // These are friends implemented in MeshAdapterFactory.cpp
49 // They are only fwd declared here so that vis.studio will accept the freind decls
51 escript::Domain_ptr brick(int n0,int n1,int n2,int order,
52  double l0,double l1,double l2,
53  int periodic0,int periodic1,
54  int periodic2,
55  int integrationOrder,
56  int reducedIntegrationOrder,
57  int useElementsOnFace,
58  int useFullElementOrder,
59  int optimize,
60  const std::vector<double>& points,
61  const std::vector<int>& tags,
62  const std::map<std::string, int>& tagnamestonums
63  );
64 
66 escript::Domain_ptr rectangle(int n0,int n1,int order,
67  double l0, double l1,
68  int periodic0,int periodic1,
69  int integrationOrder,
70  int reducedIntegrationOrder,
71  int useElementsOnFace,
72  int useFullElementOrder,
73  int optimize,
74  const std::vector<double>& points,
75  const std::vector<int>& tags,
76  const std::map<std::string, int>& tagnamestonums);
77 
78 }
79 
80 
81 
82 namespace finley {
83 
85 {
86  void operator()(void const *ptr) const
87  {
88  }
89 };
90 
91 
98 
99  public:
100 
101  //
102  // Codes for function space types supported
103  static const int DegreesOfFreedom;
104  static const int ReducedDegreesOfFreedom;
105  static const int Nodes;
106  static const int ReducedNodes;
107  static const int Elements;
108  static const int ReducedElements;
109  static const int FaceElements;
110  static const int ReducedFaceElements;
111  static const int Points;
112  static const int ContactElementsZero;
113  static const int ReducedContactElementsZero;
114  static const int ContactElementsOne;
115  static const int ReducedContactElementsOne;
116 
136  MeshAdapter(Finley_Mesh* finleyMesh=0);
137 
143  MeshAdapter(const MeshAdapter& in);
144 
152  ~MeshAdapter();
153 
159  virtual int getMPISize() const;
166  virtual int getMPIRank() const;
167 
174  virtual void MPIBarrier() const;
175 
182  virtual bool onMasterProcessor() const;
183 
185 #ifdef ESYS_MPI
186  MPI_Comm
187 #else
188  unsigned int
189 #endif
190  getMPIComm() const;
191 
198  void write(const std::string& fileName) const;
199 
205  void Print_Mesh_Info(const bool full=false) const;
206 
213  void dump(const std::string& fileName) const;
214 
220  Finley_Mesh* getFinley_Mesh() const;
221 
229  int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
230 
237  const int* borrowSampleReferenceIDs(int functionSpaceType) const;
238 
245  virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
246 
252  virtual std::string getDescription() const;
253 
259  virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
260 
267 
273  virtual int getContinuousFunctionCode() const;
274 
280  virtual int getReducedContinuousFunctionCode() const;
281 
287  virtual int getFunctionCode() const;
288 
294  virtual int getReducedFunctionCode() const;
295 
301  virtual int getFunctionOnBoundaryCode() const;
302 
308  virtual int getReducedFunctionOnBoundaryCode() const;
309 
315  virtual int getFunctionOnContactZeroCode() const;
316 
322  virtual int getReducedFunctionOnContactZeroCode() const;
323 
329  virtual int getFunctionOnContactOneCode() const;
330 
336  virtual int getReducedFunctionOnContactOneCode() const;
337 
343  virtual int getSolutionCode() const;
344 
350  virtual int getReducedSolutionCode() const;
351 
357  virtual int getDiracDeltaFunctionsCode() const;
358 
363  typedef std::map<int, std::string> FunctionSpaceNamesMapType;
364 
369  virtual int getDim() const;
370 
380  virtual StatusType getStatus() const;
381 
382 
388  virtual int getNumDataPointsGlobal() const;
389 
396  virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
397 
404  virtual void setToX(escript::Data& arg) const;
405 
413  virtual void setTagMap(const std::string& name, int tag);
414 
421  virtual int getTag(const std::string& name) const;
422 
429  virtual bool isValidTagName(const std::string& name) const;
430 
436  virtual std::string showTagNames() const;
437 
443  virtual void setNewX(const escript::Data& arg);
444 
450  virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
451 
452 
454  virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
455 
457  virtual signed char preferredInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
458 
459 
460 
466  bool
467  commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
468 
475  virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
476 
482  virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
483 
490  virtual void setToNormal(escript::Data& out) const;
491 
498  virtual void setToSize(escript::Data& out) const;
499 
506  virtual void setToGradient(escript::Data& grad,const escript::Data& arg) const;
507 
514  virtual void setToIntegrals(std::vector<double>& integrals,const escript::Data& arg) const;
515 
526  virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
527 
538  virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
539 
546  virtual bool isCellOriented(int functionSpaceCode) const;
547 
548 
550  virtual bool ownSample(int fs_code, index_t id) const;
551 
557  // vtkObject createVtkObject(int functionSpaceCode) const;
558 
564  virtual void addPDEToSystem(
566  const escript::Data& A, const escript::Data& B, const escript::Data& C,
567  const escript::Data& D, const escript::Data& X, const escript::Data& Y,
568  const escript::Data& d, const escript::Data& y,
569  const escript::Data& d_contact, const escript::Data& y_contact,
570  const escript::Data& d_dirac, const escript::Data& y_dirac) const;
576  virtual void addPDEToLumpedSystem(
577  escript::Data& mat,
578  const escript::Data& D,
579  const escript::Data& d,
580  const escript::Data& d_dirac,
581  const bool useHRZ) const;
582 
588  virtual void addPDEToRHS(escript::Data& rhs,
589  const escript::Data& X, const escript::Data& Y,
590  const escript::Data& y, const escript::Data& y_contact, const escript::Data& y_dirac) const;
597  virtual void addPDEToTransportProblem(
599  const escript::Data& M,
600  const escript::Data& A, const escript::Data& B, const escript::Data& C,const escript::Data& D,
601  const escript::Data& X,const escript::Data& Y,
602  const escript::Data& d, const escript::Data& y,
603  const escript::Data& d_contact,const escript::Data& y_contact, const escript::Data& d_dirac,const escript::Data& y_dirac) const;
604 
605 
612  const int row_blocksize,
613  const escript::FunctionSpace& row_functionspace,
614  const int column_blocksize,
615  const escript::FunctionSpace& column_functionspace,
616  const int type) const;
625  const int blocksize,
626  const escript::FunctionSpace& functionspace,
627  const int type) const;
628 
633  virtual escript::Data getX() const;
634 
639  virtual escript::Data getNormal() const;
640 
645  virtual escript::Data getSize() const;
646 
651  virtual bool operator==(const escript::AbstractDomain& other) const;
653  virtual bool operator!=(const escript::AbstractDomain& other) const;
654 
661  virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
662 
668  virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
669 
671  virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
672 
673 
678  virtual
679  bool canTag(int functionSpaceCode) const;
680 
686  virtual
687  int getApproximationOrder(const int functionSpaceCode) const;
688 
690  bool supportsContactElements() const;
691 
692 
693  private:
694 
702  void addDiracPoints( const std::vector<double>& points, const std::vector<int>& tags) const;
703 // FINLEY_DLL_API
704 // void addDiracPoint( const boost::python::list& points, const int tag=-1) const;
705 // FINLEY_DLL_API
706 // void addDiracPointWithTagName( const boost::python::list& points, const std::string& tag) const;
707 
708  protected:
709 
710  private:
711  void extractArgsFromDict(const boost::python::dict& arg, int& numData,
712  char**& names, escriptDataC*& data,
713  escriptDataC**& dataPtr) const;
714 
715  //
716  // pointer to the externally created finley mesh
717  boost::shared_ptr<Finley_Mesh> m_finleyMesh;
718 
719  // This is only provided so that the friends below can add tags during construction
720  // do not use for any other purpose
721  boost::shared_ptr<Finley_Mesh> getMesh()
722  {
723  return m_finleyMesh;
724  }
725 
727 
728  friend escript::Domain_ptr finley::brick(int n0,int n1,int n2,int order,
729  double l0,double l1,double l2,
730  int periodic0,int periodic1,
731  int periodic2,
732  int integrationOrder,
733  int reducedIntegrationOrder,
734  int useElementsOnFace,
735  int useFullElementOrder,
736  int optimize,
737  const std::vector<double>& points,
738  const std::vector<int>& tags,
739  const std::map<std::string, int>& tagnamestonums
740  );
741 
742 
743 friend escript::Domain_ptr finley::rectangle(int n0,int n1,int order,
744  double l0, double l1,
745  int periodic0,int periodic1,
746  int integrationOrder,
747  int reducedIntegrationOrder,
748  int useElementsOnFace,
749  int useFullElementOrder,
750  int optimize,
751  const std::vector<double>& points,
752  const std::vector<int>& tags,
753  const std::map<std::string, int>& tagnamestonums);
754 };
755 
756 // Do not use this class. It is a convenience wrapper for the dataexporter.
758  public:
760  index_t reducedOrder);
762 
763  Finley_ReferenceElementSet* getElementSet() const { return m_refSet; }
764 
765  private:
767 };
768 
769 
770 } // end of namespace
771 
772 #endif