escript  Revision_
finley/src/CPPAdapter/MeshAdapter.h
Go to the documentation of this file.
1 
2 /*****************************************************************************
3 *
4 * Copyright (c) 2003-2016 by The University of Queensland
5 * http://www.uq.edu.au
6 *
7 * Primary Business: Queensland, Australia
8 * Licensed under the Apache License, version 2.0
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Development until 2012 by Earth Systems Science Computational Center (ESSCC)
12 * Development 2012-2013 by School of Earth Sciences
13 * Development from 2014 by Centre for Geoscience Computing (GeoComp)
14 *
15 *****************************************************************************/
16 
17 
18 #if !defined finley_MeshAdapter_20040526_H
19 #define finley_MeshAdapter_20040526_H
20 #include "system_dep.h"
21 
22 #include "finley/Mesh.h"
23 #include "finley/Finley.h"
24 #include "finley/Assemble.h"
25 #include "FinleyAdapterException.h"
26 
27 #include <pasowrap/SystemMatrixAdapter.h>
28 #include <pasowrap/TransportProblemAdapter.h>
29 #include "escript/AbstractContinuousDomain.h"
30 #include "escript/FunctionSpace.h"
31 #include "escript/FunctionSpaceFactory.h"
32 
33 #include <boost/shared_ptr.hpp>
34 #include <boost/python/dict.hpp>
35 #include <boost/python/extract.hpp>
36 
37 #include <map>
38 #include <vector>
39 #include <string>
40 #include <sstream>
41 
42 namespace finley {
43 
44 // These are friends implemented in MeshAdapterFactory.cpp
45 // They are only fwd declared here so that vis.studio will accept the friend
46 // decls
49  int order, double l0, double l1, double l2,
50  bool periodic0, bool periodic1, bool periodic2,
51  int integrationOrder, int reducedIntegrationOrder,
52  bool useElementsOnFace, bool useFullElementOrder,
53  bool optimize, const std::vector<double>& points,
54  const std::vector<int>& tags,
55  const std::map<std::string, int>& tagNamesToNums
56  );
57 
60  int order, double l0, double l1,
61  bool periodic0, bool periodic1,
62  int integrationOrder, int reducedIntegrationOrder,
63  bool useElementsOnFace, bool useFullElementOrder,
64  bool optimize, const std::vector<double>& points,
65  const std::vector<int>& tags,
66  const std::map<std::string, int>& tagNamesToNums
67  );
68 
69 struct null_deleter { void operator()(void const *ptr) const {} };
70 
71 
77 {
78 public:
79  //
80  // Codes for function space types supported
81  static const int DegreesOfFreedom;
82  static const int ReducedDegreesOfFreedom;
83  static const int Nodes;
84  static const int ReducedNodes;
85  static const int Elements;
86  static const int ReducedElements;
87  static const int FaceElements;
88  static const int ReducedFaceElements;
89  static const int Points;
90  static const int ContactElementsZero;
91  static const int ReducedContactElementsZero;
92  static const int ContactElementsOne;
93  static const int ReducedContactElementsOne;
94 
113  MeshAdapter(Mesh* finleyMesh=NULL);
114 
119  MeshAdapter(const MeshAdapter& in);
120 
127  ~MeshAdapter();
128 
133  virtual int getMPISize() const;
139  virtual int getMPIRank() const;
140 
146  virtual void MPIBarrier() const;
147 
153  virtual bool onMasterProcessor() const;
154 
155  MPI_Comm getMPIComm() const;
156 
162  void write(const std::string& fileName) const;
163 
168  void Print_Mesh_Info(bool full=false) const;
169 
175  void dump(const std::string& fileName) const;
176 
181  Mesh* getFinley_Mesh() const;
182 
189  int getTagFromSampleNo(int functionSpaceType, index_t sampleNo) const;
190 
196  const index_t* borrowSampleReferenceIDs(int functionSpaceType) const;
197 
203  virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
204 
209  virtual std::string getDescription() const;
210 
215  virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
216 
221  void setFunctionSpaceTypeNames();
222 
227  virtual int getContinuousFunctionCode() const;
228 
233  virtual int getReducedContinuousFunctionCode() const;
234 
239  virtual int getFunctionCode() const;
240 
245  virtual int getReducedFunctionCode() const;
246 
251  virtual int getFunctionOnBoundaryCode() const;
252 
257  virtual int getReducedFunctionOnBoundaryCode() const;
258 
263  virtual int getFunctionOnContactZeroCode() const;
264 
269  virtual int getReducedFunctionOnContactZeroCode() const;
270 
275  virtual int getFunctionOnContactOneCode() const;
276 
281  virtual int getReducedFunctionOnContactOneCode() const;
282 
287  virtual int getSolutionCode() const;
288 
293  virtual int getReducedSolutionCode() const;
294 
299  virtual int getDiracDeltaFunctionsCode() const;
300 
304  typedef std::map<int, std::string> FunctionSpaceNamesMapType;
305 
309  virtual int getDim() const;
310 
319  virtual StatusType getStatus() const;
320 
321 
326  virtual dim_t getNumDataPointsGlobal() const;
327 
333  virtual std::pair<int,dim_t> getDataShape(int functionSpaceCode) const;
334 
340  virtual void setToX(escript::Data& arg) const;
341 
348  virtual void setTagMap(const std::string& name, int tag);
349 
355  virtual int getTag(const std::string& name) const;
356 
362  virtual bool isValidTagName(const std::string& name) const;
363 
368  virtual std::string showTagNames() const;
369 
374  virtual void setNewX(const escript::Data& arg);
375 
380  virtual void interpolateOnDomain(escript::Data& target, const escript::Data& source) const;
381 
382  virtual bool probeInterpolationOnDomain(int functionSpaceType_source, int functionSpaceType_target) const;
383 
384  virtual signed char preferredInterpolationOnDomain(int functionSpaceType_source, int functionSpaceType_target) const;
385 
386 
391  bool commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
392 
398  virtual void interpolateAcross(escript::Data& target, const escript::Data& source) const;
399 
404  virtual bool probeInterpolationAcross(int functionSpaceType_source, const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
405 
411  virtual void setToNormal(escript::Data& out) const;
412 
418  virtual void setToSize(escript::Data& out) const;
419 
425  virtual void setToGradient(escript::Data& grad, const escript::Data& arg) const;
426 
432  virtual void setToIntegrals(std::vector<double>& integrals, const escript::Data& arg) const;
433 
441  virtual int getSystemMatrixTypeId(const boost::python::object& options) const;
442 
452  virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
453 
459  virtual bool isCellOriented(int functionSpaceCode) const;
460 
461 
462  virtual bool ownSample(int fsCode, index_t id) const;
463 
469  // vtkObject createVtkObject(int functionSpaceCode) const;
470 
475  virtual void addPDEToSystem(
477  const escript::Data& A, const escript::Data& B, const escript::Data& C,
478  const escript::Data& D, const escript::Data& X, const escript::Data& Y,
479  const escript::Data& d, const escript::Data& y,
480  const escript::Data& d_contact, const escript::Data& y_contact,
481  const escript::Data& d_dirac, const escript::Data& y_dirac) const;
486  virtual void addPDEToLumpedSystem(
487  escript::Data& mat,
488  const escript::Data& D,
489  const escript::Data& d,
490  const escript::Data& d_dirac,
491  const bool useHRZ) const;
492 
497  virtual void addPDEToRHS(escript::Data& rhs,
498  const escript::Data& X, const escript::Data& Y,
499  const escript::Data& y, const escript::Data& y_contact, const escript::Data& y_dirac) const;
500 
505  virtual void addPDEToTransportProblem(
507  const escript::Data& M,
508  const escript::Data& A, const escript::Data& B, const escript::Data& C,const escript::Data& D,
509  const escript::Data& X,const escript::Data& Y,
510  const escript::Data& d, const escript::Data& y,
511  const escript::Data& d_contact,const escript::Data& y_contact, const escript::Data& d_dirac,const escript::Data& y_dirac) const;
512 
517  escript::ASM_ptr newSystemMatrix(
518  const int row_blocksize,
519  const escript::FunctionSpace& row_functionspace,
520  const int column_blocksize,
521  const escript::FunctionSpace& column_functionspace,
522  const int type) const;
523 
529  escript::ATP_ptr newTransportProblem(
530  const int blocksize,
531  const escript::FunctionSpace& functionspace,
532  const int type) const;
533 
537  virtual escript::Data getX() const;
538 
542  virtual escript::Data getNormal() const;
543 
547  virtual escript::Data getSize() const;
548 
552  virtual bool operator==(const escript::AbstractDomain& other) const;
553  virtual bool operator!=(const escript::AbstractDomain& other) const;
554 
560  virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
561 
566  virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
567 
568  virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
569 
573  virtual
574  bool canTag(int functionSpaceCode) const;
575 
580  virtual
581  int getApproximationOrder(const int functionSpaceCode) const;
582 
583  bool supportsContactElements() const;
584 
585  virtual escript::Data randomFill(const escript::DataTypes::ShapeType& shape,
586  const escript::FunctionSpace& what, long seed, const boost::python::tuple& filter) const;
587 
588 
589 private:
590 
597  void addDiracPoints(const std::vector<double>& points, const std::vector<int>& tags) const;
598 // void addDiracPoint( const boost::python::list& points, const int tag=-1) const;
599 // void addDiracPointWithTagName( const boost::python::list& points, const std::string& tag) const;
600 
601  //
602  // pointer to the externally created finley mesh
603  boost::shared_ptr<Mesh> m_finleyMesh;
604 
605  // This is only provided so that the friends below can add tags during construction
606  // do not use for any other purpose
607  boost::shared_ptr<Mesh> getMesh()
608  {
609  return m_finleyMesh;
610  }
611 
612  static FunctionSpaceNamesMapType m_functionSpaceTypeNames;
613 
615  dim_t n0, dim_t n1, dim_t n2, int order,
616  double l0, double l1, double l2,
617  bool periodic0, bool periodic1, bool periodic2,
618  int integrationOrder,
619  int reducedIntegrationOrder,
620  bool useElementsOnFace,
621  bool useFullElementOrder,
622  bool optimize,
623  const std::vector<double>& points,
624  const std::vector<int>& tags,
625  const std::map<std::string, int>& tagNamesToNums);
626 
627 
629  dim_t n0, dim_t n1, int order,
630  double l0, double l1,
631  bool periodic0, bool periodic1,
632  int integrationOrder,
633  int reducedIntegrationOrder,
634  bool useElementsOnFace,
635  bool useFullElementOrder,
636  bool optimize,
637  const std::vector<double>& points,
638  const std::vector<int>& tags,
639  const std::map<std::string, int>& tagNamesToNums);
640 
641  friend escript::Domain_ptr readMesh_driver(const boost::python::list& args);
642 
644  const std::string& fileName,
645  int integrationOrder,
646  int reducedIntegrationOrder,
647  bool optimize,
648  const std::vector<double>& points,
649  const std::vector<int>& tags);
650 
651  friend escript::Domain_ptr readGmsh_driver(const boost::python::list& args);
652 
654  const std::string& fileName,
655  int numDim,
656  int integrationOrder,
657  int reducedIntegrationOrder,
658  bool optimize,
659  bool useMacroElements,
660  const std::vector<double>& points,
661  const std::vector<int>& tags);
662 };
663 
664 
665 } // end of namespace
666 
667 #endif
668 
AbstractContinuousDomain, base class for continuous domains.
Definition: AbstractContinuousDomain.h:46
static const int ReducedFaceElements
Definition: finley/src/CPPAdapter/MeshAdapter.h:88
Definition: FunctionSpace.h:34
static const int ReducedDegreesOfFreedom
Definition: finley/src/CPPAdapter/MeshAdapter.h:82
bool probeInterpolationAcross(int fsType_source, const escript::AbstractDomain &domain, int fsType_target, int dim)
Definition: CrossDomainCoupler.cpp:36
static FunctionSpaceNamesMapType m_functionSpaceTypeNames
Definition: finley/src/CPPAdapter/MeshAdapter.h:612
boost::shared_ptr< AbstractDomain > Domain_ptr
Definition: AbstractDomain.h:36
static const int Nodes
Definition: finley/src/CPPAdapter/MeshAdapter.h:83
Definition: finley/src/CPPAdapter/MeshAdapter.h:69
Domain_ptr readMesh_driver(const boost::python::list &args)
Python driver for readMesh()
Definition: finley/src/CPPAdapter/MeshAdapterFactory.cpp:531
static const int ContactElementsOne
Definition: finley/src/CPPAdapter/MeshAdapter.h:92
static const int Elements
Definition: finley/src/CPPAdapter/MeshAdapter.h:85
std::vector< int > ShapeType
The shape of a single datapoint.
Definition: DataTypes.h:38
static dim_t M
Definition: SparseMatrix_saveHB.cpp:37
implements the AbstractContinuousDomain interface for the Finley library.
Definition: finley/src/CPPAdapter/MeshAdapter.h:76
Definition: finley/src/Assemble.h:32
static const int ReducedElements
Definition: finley/src/CPPAdapter/MeshAdapter.h:86
static const int ContactElementsZero
Definition: finley/src/CPPAdapter/MeshAdapter.h:90
boost::shared_ptr< AbstractTransportProblem > ATP_ptr
Definition: AbstractTransportProblem.h:162
int MPI_Comm
Definition: Esys_MPI.h:38
Domain_ptr readGmsh(esysUtils::JMPI &info, const std::string &fileName, int numDim, int integrationOrder, int reducedIntegrationOrder, bool optimize, bool useMacroElements, const std::vector< double > &points, const std::vector< int > &tags)
Definition: finley/src/CPPAdapter/MeshAdapterFactory.cpp:611
boost::shared_ptr< Mesh > getMesh()
Definition: finley/src/CPPAdapter/MeshAdapter.h:607
Domain_ptr readGmsh_driver(const boost::python::list &args)
Python driver for readGMesh()
Definition: finley/src/CPPAdapter/MeshAdapterFactory.cpp:629
double l2(dim_t n, const double *x, const esysUtils::JMPI &mpiinfo)
returns the global L2 norm of x
Definition: PasoUtil.cpp:484
boost::shared_ptr< Mesh > m_finleyMesh
Definition: finley/src/CPPAdapter/MeshAdapter.h:603
int StatusType
Definition: AbstractDomain.h:48
escript::Domain_ptr rectangle(esysUtils::JMPI &p, dim_t n0, dim_t n1, int order, double l0, double l1, bool periodic0, bool periodic1, int integrationOrder, int reducedIntegrationOrder, bool useElementsOnFace, bool useFullElementOrder, bool optimize, const std::vector< double > &points, const std::vector< int > &tags, const std::map< std::string, int > &tagNamesToNums)
Creates a rectangular mesh with n0 x n1 elements over the brick [0,l0] x [0,l1].
Definition: finley/src/CPPAdapter/MeshAdapterFactory.cpp:823
Data represents a collection of datapoints.
Definition: Data.h:68
int getTag(unsigned char sourcex, unsigned char sourcey, unsigned char sourcez, unsigned char targetx, unsigned char targety, unsigned char targetz)
Definition: blocktools.cpp:412
static const int ReducedContactElementsOne
Definition: finley/src/CPPAdapter/MeshAdapter.h:93
int index_t
Definition: types.h:24
static const int ReducedContactElementsZero
Definition: finley/src/CPPAdapter/MeshAdapter.h:91
static const int ReducedNodes
Definition: finley/src/CPPAdapter/MeshAdapter.h:84
static const int FaceElements
Definition: finley/src/CPPAdapter/MeshAdapter.h:87
Give a short description of what AbstractTransportProblem does.
Definition: AbstractTransportProblem.h:45
#define FINLEY_DLL_API
Definition: finley/src/CPPAdapter/system_dep.h:31
index_t dim_t
Definition: types.h:27
static const int Points
Definition: finley/src/CPPAdapter/MeshAdapter.h:89
Base class for escript system matrices.
Definition: AbstractSystemMatrix.h:37
escript::Domain_ptr brick(esysUtils::JMPI &p, dim_t n0, dim_t n1, dim_t n2, int order, double l0, double l1, double l2, bool periodic0, bool periodic1, bool periodic2, int integrationOrder, int reducedIntegrationOrder, bool useElementsOnFace, bool useFullElementOrder, bool optimize, const std::vector< double > &points, const std::vector< int > &tags, const std::map< std::string, int > &tagNamesToNums)
Creates a rectangular mesh with n0 x n1 x n2 elements over the brick [0,l0] x [0,l1] x [0...
Definition: finley/src/CPPAdapter/MeshAdapterFactory.cpp:710
static const int DegreesOfFreedom
Definition: finley/src/CPPAdapter/MeshAdapter.h:81
boost::shared_ptr< AbstractSystemMatrix > ASM_ptr
Definition: AbstractSystemMatrix.h:170
Base class for all escript domains.
Definition: AbstractDomain.h:45
void operator()(void const *ptr) const
Definition: finley/src/CPPAdapter/MeshAdapter.h:69
boost::shared_ptr< JMPI_ > JMPI
Definition: Esys_MPI.h:79
Domain_ptr readMesh(esysUtils::JMPI &info, const std::string &fileName, int integrationOrder, int reducedIntegrationOrder, bool optimize, const std::vector< double > &points, const std::vector< int > &tags)
Definition: finley/src/CPPAdapter/MeshAdapterFactory.cpp:513
Definition: finley/src/Mesh.h:78
std::map< int, std::string > FunctionSpaceNamesMapType
Definition: finley/src/CPPAdapter/MeshAdapter.h:304