ESScript  Revision_
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 "FinleyAdapterException.h"
25 
26 #include <pasowrap/SystemMatrixAdapter.h>
27 #include <pasowrap/TransportProblemAdapter.h>
28 #include "escript/AbstractContinuousDomain.h"
29 #include "escript/FunctionSpace.h"
30 #include "escript/FunctionSpaceFactory.h"
31 
32 #include <boost/shared_ptr.hpp>
33 #include <boost/python/dict.hpp>
34 #include <boost/python/extract.hpp>
35 
36 #include <map>
37 #include <vector>
38 #include <string>
39 #include <sstream>
40 
41 namespace finley {
42 
43 // These are friends implemented in MeshAdapterFactory.cpp
44 // They are only fwd declared here so that vis.studio will accept the friend
45 // decls
47 escript::Domain_ptr brick(int n0, int n1, int n2, int order,
48  double l0, double l1, double l2,
49  bool periodic0, bool periodic1, bool periodic2,
50  int integrationOrder, int reducedIntegrationOrder,
51  bool useElementsOnFace, bool useFullElementOrder,
52  bool optimize, const std::vector<double>& points,
53  const std::vector<int>& tags,
54  const std::map<std::string, int>& tagnamestonums);
55 
57 escript::Domain_ptr rectangle(int n0, int n1, int order,
58  double l0, double l1,
59  bool periodic0, bool periodic1,
60  int integrationOrder, int reducedIntegrationOrder,
61  bool useElementsOnFace, bool useFullElementOrder,
62  bool optimize, const std::vector<double>& points,
63  const std::vector<int>& tags,
64  const std::map<std::string, int>& tagnamestonums);
65 
67 {
68  void operator()(void const *ptr) const
69  {
70  }
71 };
72 
73 
79 class MeshAdapter : public escript::AbstractContinuousDomain {
80 
81  public:
82 
83  //
84  // Codes for function space types supported
85  static const int DegreesOfFreedom;
86  static const int ReducedDegreesOfFreedom;
87  static const int Nodes;
88  static const int ReducedNodes;
89  static const int Elements;
90  static const int ReducedElements;
91  static const int FaceElements;
92  static const int ReducedFaceElements;
93  static const int Points;
94  static const int ContactElementsZero;
95  static const int ReducedContactElementsZero;
96  static const int ContactElementsOne;
97  static const int ReducedContactElementsOne;
98 
118  MeshAdapter(Mesh* finleyMesh=0);
119 
125  MeshAdapter(const MeshAdapter& in);
126 
134  ~MeshAdapter();
135 
141  virtual int getMPISize() const;
148  virtual int getMPIRank() const;
149 
156  virtual void MPIBarrier() const;
157 
164  virtual bool onMasterProcessor() const;
165 
167 #ifdef ESYS_MPI
168  MPI_Comm
169 #else
170  unsigned int
171 #endif
172  getMPIComm() const;
173 
180  void write(const std::string& fileName) const;
181 
187  void Print_Mesh_Info(const bool full=false) const;
188 
195  void dump(const std::string& fileName) const;
196 
202  Mesh* getFinley_Mesh() const;
203 
211  int getTagFromSampleNo(int functionSpaceType, int sampleNo) const;
212 
219  const int* borrowSampleReferenceIDs(int functionSpaceType) const;
220 
227  virtual bool isValidFunctionSpaceType(int functionSpaceType) const;
228 
234  virtual std::string getDescription() const;
235 
241  virtual std::string functionSpaceTypeAsString(int functionSpaceType) const;
242 
249 
255  virtual int getContinuousFunctionCode() const;
256 
262  virtual int getReducedContinuousFunctionCode() const;
263 
269  virtual int getFunctionCode() const;
270 
276  virtual int getReducedFunctionCode() const;
277 
283  virtual int getFunctionOnBoundaryCode() const;
284 
290  virtual int getReducedFunctionOnBoundaryCode() const;
291 
297  virtual int getFunctionOnContactZeroCode() const;
298 
304  virtual int getReducedFunctionOnContactZeroCode() const;
305 
311  virtual int getFunctionOnContactOneCode() const;
312 
318  virtual int getReducedFunctionOnContactOneCode() const;
319 
325  virtual int getSolutionCode() const;
326 
332  virtual int getReducedSolutionCode() const;
333 
339  virtual int getDiracDeltaFunctionsCode() const;
340 
345  typedef std::map<int, std::string> FunctionSpaceNamesMapType;
346 
351  virtual int getDim() const;
352 
362  virtual StatusType getStatus() const;
363 
364 
370  virtual int getNumDataPointsGlobal() const;
371 
378  virtual std::pair<int,int> getDataShape(int functionSpaceCode) const;
379 
386  virtual void setToX(escript::Data& arg) const;
387 
395  virtual void setTagMap(const std::string& name, int tag);
396 
403  virtual int getTag(const std::string& name) const;
404 
411  virtual bool isValidTagName(const std::string& name) const;
412 
418  virtual std::string showTagNames() const;
419 
425  virtual void setNewX(const escript::Data& arg);
426 
432  virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
433 
434 
436  virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
437 
439  virtual signed char preferredInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
440 
441 
442 
448  bool
449  commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
450 
457  virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
458 
464  virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
465 
472  virtual void setToNormal(escript::Data& out) const;
473 
480  virtual void setToSize(escript::Data& out) const;
481 
488  virtual void setToGradient(escript::Data& grad,const escript::Data& arg) const;
489 
496  virtual void setToIntegrals(std::vector<double>& integrals,const escript::Data& arg) const;
497 
508  virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
509 
520  virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
521 
528  virtual bool isCellOriented(int functionSpaceCode) const;
529 
530 
532  virtual bool ownSample(int fs_code, index_t id) const;
533 
539  // vtkObject createVtkObject(int functionSpaceCode) const;
540 
546  virtual void addPDEToSystem(
547  escript::AbstractSystemMatrix& mat, escript::Data& rhs,
548  const escript::Data& A, const escript::Data& B, const escript::Data& C,
549  const escript::Data& D, const escript::Data& X, const escript::Data& Y,
550  const escript::Data& d, const escript::Data& y,
551  const escript::Data& d_contact, const escript::Data& y_contact,
552  const escript::Data& d_dirac, const escript::Data& y_dirac) const;
558  virtual void addPDEToLumpedSystem(
559  escript::Data& mat,
560  const escript::Data& D,
561  const escript::Data& d,
562  const escript::Data& d_dirac,
563  const bool useHRZ) const;
564 
570  virtual void addPDEToRHS(escript::Data& rhs,
571  const escript::Data& X, const escript::Data& Y,
572  const escript::Data& y, const escript::Data& y_contact, const escript::Data& y_dirac) const;
579  virtual void addPDEToTransportProblem(
580  escript::AbstractTransportProblem& tp, escript::Data& source,
581  const escript::Data& M,
582  const escript::Data& A, const escript::Data& B, const escript::Data& C,const escript::Data& D,
583  const escript::Data& X,const escript::Data& Y,
584  const escript::Data& d, const escript::Data& y,
585  const escript::Data& d_contact,const escript::Data& y_contact, const escript::Data& d_dirac,const escript::Data& y_dirac) const;
586 
587 
593  escript::ASM_ptr newSystemMatrix(
594  const int row_blocksize,
595  const escript::FunctionSpace& row_functionspace,
596  const int column_blocksize,
597  const escript::FunctionSpace& column_functionspace,
598  const int type) const;
606  escript::ATP_ptr newTransportProblem(
607  const int blocksize,
608  const escript::FunctionSpace& functionspace,
609  const int type) const;
610 
615  virtual escript::Data getX() const;
616 
621  virtual escript::Data getNormal() const;
622 
627  virtual escript::Data getSize() const;
628 
633  virtual bool operator==(const escript::AbstractDomain& other) const;
635  virtual bool operator!=(const escript::AbstractDomain& other) const;
636 
643  virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
644 
650  virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
651 
653  virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
654 
655 
660  virtual
661  bool canTag(int functionSpaceCode) const;
662 
668  virtual
669  int getApproximationOrder(const int functionSpaceCode) const;
670 
672  bool supportsContactElements() const;
673 
674 
675  private:
676 
684  void addDiracPoints( const std::vector<double>& points, const std::vector<int>& tags) const;
685 // FINLEY_DLL_API
686 // void addDiracPoint( const boost::python::list& points, const int tag=-1) const;
687 // FINLEY_DLL_API
688 // void addDiracPointWithTagName( const boost::python::list& points, const std::string& tag) const;
689 
690  protected:
691 
692  private:
693  //
694  // pointer to the externally created finley mesh
695  boost::shared_ptr<Mesh> m_finleyMesh;
696 
697  // This is only provided so that the friends below can add tags during construction
698  // do not use for any other purpose
699  boost::shared_ptr<Mesh> getMesh()
700  {
701  return m_finleyMesh;
702  }
703 
705 
706  friend escript::Domain_ptr brick(int n0, int n1, int n2, int order,
707  double l0, double l1, double l2,
708  bool periodic0, bool periodic1, bool periodic2,
709  int integrationOrder,
710  int reducedIntegrationOrder,
711  bool useElementsOnFace,
712  bool useFullElementOrder,
713  bool optimize,
714  const std::vector<double>& points,
715  const std::vector<int>& tags,
716  const std::map<std::string, int>& tagnamestonums);
717 
718 
719  friend escript::Domain_ptr rectangle(int n0, int n1, int order,
720  double l0, double l1,
721  bool periodic0, bool periodic1,
722  int integrationOrder,
723  int reducedIntegrationOrder,
724  bool useElementsOnFace,
725  bool useFullElementOrder,
726  bool optimize,
727  const std::vector<double>& points,
728  const std::vector<int>& tags,
729  const std::map<std::string, int>& tagnamestonums);
730 };
731 
732 
733 } // end of namespace
734 
735 #endif
736