ESScript  Revision_4488
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 #include "finley/Mesh.h"
22 #include "finley/Finley.h"
23 #include "finley/Assemble.h"
24 #include "esysUtils/Esys_MPI.h"
25 
26 #include "FinleyError.h"
27 #include "FinleyAdapterException.h"
28 
29 #include <pasowrap/SystemMatrixAdapter.h>
30 #include <pasowrap/TransportProblemAdapter.h>
31 #include "escript/AbstractContinuousDomain.h"
32 #include "escript/FunctionSpace.h"
33 #include "escript/FunctionSpaceFactory.h"
34 
35 #include <boost/shared_ptr.hpp>
36 #include <boost/python/dict.hpp>
37 #include <boost/python/extract.hpp>
38 
39 #include <map>
40 #include <vector>
41 #include <string>
42 #include <sstream>
43 
44 namespace finley {
45 
46 // These are friends implemented in MeshAdapterFactory.cpp
47 // They are only fwd declared here so that vis.studio will accept the freind decls
49 escript::Domain_ptr brick(int n0,int n1,int n2,int order,
50  double l0,double l1,double l2,
51  int periodic0,int periodic1,
52  int periodic2,
53  int integrationOrder,
54  int reducedIntegrationOrder,
55  int useElementsOnFace,
56  int useFullElementOrder,
57  int optimize,
58  const std::vector<double>& points,
59  const std::vector<int>& tags,
60  const std::map<std::string, int>& tagnamestonums
61  );
62 
64 escript::Domain_ptr rectangle(int n0,int n1,int order,
65  double l0, double l1,
66  int periodic0,int periodic1,
67  int integrationOrder,
68  int reducedIntegrationOrder,
69  int useElementsOnFace,
70  int useFullElementOrder,
71  int optimize,
72  const std::vector<double>& points,
73  const std::vector<int>& tags,
74  const std::map<std::string, int>& tagnamestonums);
75 
76 }
77 
78 
79 
80 namespace finley {
81 
83 {
84  void operator()(void const *ptr) const
85  {
86  }
87 };
88 
89 
96 
97  public:
98 
99  //
100  // Codes for function space types supported
101  static const int DegreesOfFreedom;
102  static const int ReducedDegreesOfFreedom;
103  static const int Nodes;
104  static const int ReducedNodes;
105  static const int Elements;
106  static const int ReducedElements;
107  static const int FaceElements;
108  static const int ReducedFaceElements;
109  static const int Points;
110  static const int ContactElementsZero;
111  static const int ReducedContactElementsZero;
112  static const int ContactElementsOne;
113  static const int ReducedContactElementsOne;
114 
134  MeshAdapter(Finley_Mesh* finleyMesh=0);
135 
141  MeshAdapter(const MeshAdapter& in);
142 
150  ~MeshAdapter();
151 
157  virtual int getMPISize() const;
164  virtual int getMPIRank() const;
165 
172  virtual void MPIBarrier() const;
173 
180  virtual bool onMasterProcessor() const;
181 
183 #ifdef ESYS_MPI
184  MPI_Comm
185 #else
186  unsigned int
187 #endif
188  getMPIComm() const;
189 
196  void write(const std::string& fileName) const;
197 
203  void Print_Mesh_Info(const bool full=false) const;
204 
211  void dump(const std::string& fileName) const;
212 
218  Finley_Mesh* getFinley_Mesh() const;
219 
227  int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
228 
235  const int* borrowSampleReferenceIDs(int functionSpaceType) const;
236 
243  virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
244 
250  virtual std::string getDescription() const;
251 
257  virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
258 
265 
271  virtual int getContinuousFunctionCode() const;
272 
278  virtual int getReducedContinuousFunctionCode() const;
279 
285  virtual int getFunctionCode() const;
286 
292  virtual int getReducedFunctionCode() const;
293 
299  virtual int getFunctionOnBoundaryCode() const;
300 
306  virtual int getReducedFunctionOnBoundaryCode() const;
307 
313  virtual int getFunctionOnContactZeroCode() const;
314 
320  virtual int getReducedFunctionOnContactZeroCode() const;
321 
327  virtual int getFunctionOnContactOneCode() const;
328 
334  virtual int getReducedFunctionOnContactOneCode() const;
335 
341  virtual int getSolutionCode() const;
342 
348  virtual int getReducedSolutionCode() const;
349 
355  virtual int getDiracDeltaFunctionsCode() const;
356 
361  typedef std::map<int, std::string> FunctionSpaceNamesMapType;
362 
367  virtual int getDim() const;
368 
378  virtual StatusType getStatus() const;
379 
380 
386  virtual int getNumDataPointsGlobal() const;
387 
394  virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
395 
402  virtual void setToX(escript::Data& arg) const;
403 
411  virtual void setTagMap(const std::string& name, int tag);
412 
419  virtual int getTag(const std::string& name) const;
420 
427  virtual bool isValidTagName(const std::string& name) const;
428 
434  virtual std::string showTagNames() const;
435 
441  virtual void setNewX(const escript::Data& arg);
442 
448  virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
449 
450 
452  virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
453 
455  virtual signed char preferredInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
456 
457 
458 
464  bool
465  commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
466 
473  virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
474 
480  virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
481 
488  virtual void setToNormal(escript::Data& out) const;
489 
496  virtual void setToSize(escript::Data& out) const;
497 
504  virtual void setToGradient(escript::Data& grad,const escript::Data& arg) const;
505 
512  virtual void setToIntegrals(std::vector<double>& integrals,const escript::Data& arg) const;
513 
524  virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
525 
536  virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
537 
544  virtual bool isCellOriented(int functionSpaceCode) const;
545 
546 
548  virtual bool ownSample(int fs_code, index_t id) const;
549 
555  // vtkObject createVtkObject(int functionSpaceCode) const;
556 
562  virtual void addPDEToSystem(
564  const escript::Data& A, const escript::Data& B, const escript::Data& C,
565  const escript::Data& D, const escript::Data& X, const escript::Data& Y,
566  const escript::Data& d, const escript::Data& y,
567  const escript::Data& d_contact, const escript::Data& y_contact,
568  const escript::Data& d_dirac, const escript::Data& y_dirac) const;
574  virtual void addPDEToLumpedSystem(
575  escript::Data& mat,
576  const escript::Data& D,
577  const escript::Data& d,
578  const escript::Data& d_dirac,
579  const bool useHRZ) const;
580 
586  virtual void addPDEToRHS(escript::Data& rhs,
587  const escript::Data& X, const escript::Data& Y,
588  const escript::Data& y, const escript::Data& y_contact, const escript::Data& y_dirac) const;
595  virtual void addPDEToTransportProblem(
597  const escript::Data& M,
598  const escript::Data& A, const escript::Data& B, const escript::Data& C,const escript::Data& D,
599  const escript::Data& X,const escript::Data& Y,
600  const escript::Data& d, const escript::Data& y,
601  const escript::Data& d_contact,const escript::Data& y_contact, const escript::Data& d_dirac,const escript::Data& y_dirac) const;
602 
603 
610  const int row_blocksize,
611  const escript::FunctionSpace& row_functionspace,
612  const int column_blocksize,
613  const escript::FunctionSpace& column_functionspace,
614  const int type) const;
623  const int blocksize,
624  const escript::FunctionSpace& functionspace,
625  const int type) const;
626 
631  virtual escript::Data getX() const;
632 
637  virtual escript::Data getNormal() const;
638 
643  virtual escript::Data getSize() const;
644 
649  virtual bool operator==(const escript::AbstractDomain& other) const;
651  virtual bool operator!=(const escript::AbstractDomain& other) const;
652 
659  virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
660 
666  virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
667 
669  virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
670 
671 
676  virtual
677  bool canTag(int functionSpaceCode) const;
678 
684  virtual
685  int getApproximationOrder(const int functionSpaceCode) const;
686 
688  bool supportsContactElements() const;
689 
690 
691  private:
692 
700  void addDiracPoints( const std::vector<double>& points, const std::vector<int>& tags) const;
701 // FINLEY_DLL_API
702 // void addDiracPoint( const boost::python::list& points, const int tag=-1) const;
703 // FINLEY_DLL_API
704 // void addDiracPointWithTagName( const boost::python::list& points, const std::string& tag) const;
705 
706  protected:
707 
708  private:
709  //
710  // pointer to the externally created finley mesh
711  boost::shared_ptr<Finley_Mesh> m_finleyMesh;
712 
713  // This is only provided so that the friends below can add tags during construction
714  // do not use for any other purpose
715  boost::shared_ptr<Finley_Mesh> getMesh()
716  {
717  return m_finleyMesh;
718  }
719 
721 
722  friend escript::Domain_ptr finley::brick(int n0,int n1,int n2,int order,
723  double l0,double l1,double l2,
724  int periodic0,int periodic1,
725  int periodic2,
726  int integrationOrder,
727  int reducedIntegrationOrder,
728  int useElementsOnFace,
729  int useFullElementOrder,
730  int optimize,
731  const std::vector<double>& points,
732  const std::vector<int>& tags,
733  const std::map<std::string, int>& tagnamestonums
734  );
735 
736 
737 friend escript::Domain_ptr finley::rectangle(int n0,int n1,int order,
738  double l0, double l1,
739  int periodic0,int periodic1,
740  int integrationOrder,
741  int reducedIntegrationOrder,
742  int useElementsOnFace,
743  int useFullElementOrder,
744  int optimize,
745  const std::vector<double>& points,
746  const std::vector<int>& tags,
747  const std::map<std::string, int>& tagnamestonums);
748 };
749 
750 // Do not use this class. It is a convenience wrapper for the dataexporter.
752  public:
754  index_t reducedOrder);
756 
757  Finley_ReferenceElementSet* getElementSet() const { return m_refSet; }
758 
759  private:
761 };
762 
763 
764 } // end of namespace
765 
766 #endif