/[escript]/trunk/finley/src/CPPAdapter/MeshAdapter.h
ViewVC logotype

Diff of /trunk/finley/src/CPPAdapter/MeshAdapter.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1204 by gross, Sat Jun 23 11:43:12 2007 UTC revision 3259 by jfenwick, Mon Oct 11 01:48:14 2010 UTC
# Line 1  Line 1 
1  // $Id$  
2  /*  /*******************************************************
3   ************************************************************  *
4   *          Copyright 2006 by ACcESS MNRF                   *  * Copyright (c) 2003-2010 by University of Queensland
5   *                                                          *  * Earth Systems Science Computational Center (ESSCC)
6   *              http://www.access.edu.au                    *  * http://www.uq.edu.au/esscc
7   *       Primary Business: Queensland, Australia            *  *
8   *  Licensed under the Open Software License version 3.0    *  * Primary Business: Queensland, Australia
9   *     http://www.opensource.org/licenses/osl-3.0.php       *  * Licensed under the Open Software License version 3.0
10   *                                                          *  * http://www.opensource.org/licenses/osl-3.0.php
11   ************************************************************  *
12  */  *******************************************************/
13                                                                              
14    
15  #if !defined finley_MeshAdapter_20040526_H  #if !defined finley_MeshAdapter_20040526_H
16  #define finley_MeshAdapter_20040526_H  #define finley_MeshAdapter_20040526_H
17  #include "system_dep.h"  #include "system_dep.h"
18    
19  extern "C" {  extern "C" {
20  #include "../Mesh.h"  #include "finley/Mesh.h"
21  #include "../Finley.h"  #include "finley/Finley.h"
22  #include "../Assemble.h"  #include "finley/Assemble.h"
23  #include "paso/SystemMatrix.h"  #include "paso/SystemMatrix.h"
24    #include "paso/Transport.h"
25    #include "esysUtils/Esys_MPI.h"
26  }  }
27    
28  #include "FinleyError.h"  #include "FinleyError.h"
29  #include "FinleyAdapterException.h"  #include "FinleyAdapterException.h"
30    
31  #include "SystemMatrixAdapter.h"  #include "SystemMatrixAdapter.h"
32    #include "TransportProblemAdapter.h"
33  #include "escript/AbstractContinuousDomain.h"  #include "escript/AbstractContinuousDomain.h"
34  #include "escript/FunctionSpace.h"  #include "escript/FunctionSpace.h"
35  #include "escript/FunctionSpaceFactory.h"  #include "escript/FunctionSpaceFactory.h"
# Line 39  extern "C" { Line 43  extern "C" {
43  #include <string>  #include <string>
44  #include <sstream>  #include <sstream>
45    
 //  
 // forward declarations  
 class Data;  
   
 //using namespace escript;  
   
46  namespace finley {  namespace finley {
47    
48  struct null_deleter  struct null_deleter
# Line 91  class MeshAdapter : public escript::Abst Line 89  class MeshAdapter : public escript::Abst
89    
90       Description:       Description:
91       Constructor for MeshAdapter. The pointer passed to MeshAdapter       Constructor for MeshAdapter. The pointer passed to MeshAdapter
92       is deleted using a call to Finley_Mesh_deallocate in the       is deleted using a call to Finley_Mesh_free in the
93       MeshAdapter destructor.       MeshAdapter destructor.
94    
95       Throws:       Throws:
# Line 100  class MeshAdapter : public escript::Abst Line 98  class MeshAdapter : public escript::Abst
98       \param finleyMesh Input - A pointer to the externally constructed       \param finleyMesh Input - A pointer to the externally constructed
99                                 finley mesh.The pointer passed to MeshAdapter                                 finley mesh.The pointer passed to MeshAdapter
100                                 is deleted using a call to                                 is deleted using a call to
101                                 Finley_Mesh_deallocate in the MeshAdapter                                 Finley_Mesh_free in the MeshAdapter
102                                 destructor.                                 destructor.
103    */    */
104    FINLEY_DLL_API    FINLEY_DLL_API
# Line 116  class MeshAdapter : public escript::Abst Line 114  class MeshAdapter : public escript::Abst
114    /**    /**
115       \brief       \brief
116       Destructor for MeshAdapter. As specified in the constructor       Destructor for MeshAdapter. As specified in the constructor
117       this calls Finley_Mesh_deallocate for the pointer given to the       this calls Finley_Mesh_free for the pointer given to the
118       constructor.       constructor.
119    */    */
120    FINLEY_DLL_API    FINLEY_DLL_API
# Line 124  class MeshAdapter : public escript::Abst Line 122  class MeshAdapter : public escript::Abst
122    
123    /**    /**
124       \brief       \brief
125       return this as an AbstractContinuousDomain.       return the number of processors used for this domain
126    */    */
127    inline const AbstractContinuousDomain& asAbstractContinuousDomain() const    FINLEY_DLL_API
128    {    virtual int getMPISize() const;
129       return *(static_cast<const AbstractContinuousDomain*>(this));    /**
130    }       \brief
131         return the number MPI rank of this processor
132      */
133    
134      FINLEY_DLL_API
135      virtual int getMPIRank() const;
136    
137    /**    /**
138       \brief       \brief
139       return this as an AbstractDomain.       If compiled for MPI then execute an MPI_Barrier, else do nothing
140    */    */
141    inline const AbstractDomain& asAbstractDomain() const  
142    {    FINLEY_DLL_API
143       return *(static_cast<const AbstractDomain*>(this));    virtual void MPIBarrier() const;
144    }  
145      /**
146         \brief
147         Return true if on MPI processor 0, else false
148      */
149    
150      FINLEY_DLL_API
151      virtual bool onMasterProcessor() const;
152    
153      FINLEY_DLL_API
154    #ifdef ESYS_MPI
155      MPI_Comm
156    #else
157      unsigned int
158    #endif
159      getMPIComm() const;
160    
161    /**    /**
162       \brief       \brief
# Line 150  class MeshAdapter : public escript::Abst Line 168  class MeshAdapter : public escript::Abst
168    
169    /**    /**
170       \brief       \brief
171         \param full
172      */
173      FINLEY_DLL_API
174      void Print_Mesh_Info(const bool full=false) const;
175    
176      /**
177         \brief
178         dumps the mesh to a file with the given name.
179         \param fileName Input - The name of the file
180      */
181      FINLEY_DLL_API
182      void dump(const std::string& fileName) const;
183    
184      /**
185         \brief
186       return the pointer to the underlying finley mesh structure       return the pointer to the underlying finley mesh structure
187    */    */
188    FINLEY_DLL_API    FINLEY_DLL_API
# Line 170  class MeshAdapter : public escript::Abst Line 203  class MeshAdapter : public escript::Abst
203       \param functionSpaceType Input - The function space type.       \param functionSpaceType Input - The function space type.
204    */    */
205    FINLEY_DLL_API    FINLEY_DLL_API
206    int* borrowSampleReferenceIDs(int functionSpaceType) const;    const int* borrowSampleReferenceIDs(int functionSpaceType) const;
207    
208    /**    /**
209       \brief       \brief
# Line 306  class MeshAdapter : public escript::Abst Line 339  class MeshAdapter : public escript::Abst
339    
340    /**    /**
341       \brief       \brief
342          Returns a status indicator of the domain. The status identifier should be unique over
343          the live time if the object but may be updated if changes to the domain happen, e.g.
344          modifications to its geometry.
345    
346         This has to be implemented by the actual Domain adapter.
347      */
348      FINLEY_DLL_API
349      virtual StatusType getStatus() const;
350    
351    
352      /**
353         \brief
354         Return the number of data points summed across all MPI processes
355      */
356      FINLEY_DLL_API
357      virtual int getNumDataPointsGlobal() const;
358    
359      /**
360         \brief
361       Return the number of data points per sample, and the number of samples as a pair.       Return the number of data points per sample, and the number of samples as a pair.
362       \param functionSpaceCode Input -       \param functionSpaceCode Input -
363    */    */
# Line 365  class MeshAdapter : public escript::Abst Line 417  class MeshAdapter : public escript::Abst
417    */    */
418    FINLEY_DLL_API    FINLEY_DLL_API
419    virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;    virtual void interpolateOnDomain(escript::Data& target,const escript::Data& source) const;
420    
421    
422    FINLEY_DLL_API    FINLEY_DLL_API
423    virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;    virtual bool probeInterpolationOnDomain(int functionSpaceType_source,int functionSpaceType_target) const;
424    
425    /**    /**
426        \brief given a vector of FunctionSpace typecodes, pass back a code which then can all be interpolated to.
427        \return true is result is valid, false if not
428      */
429      FINLEY_DLL_API
430      bool
431      commonFunctionSpace(const std::vector<int>& fs, int& resultcode) const;
432    
433      /**
434       \brief       \brief
435       interpolates data given on source onto target where source and target are given on different domains.       interpolates data given on source onto target where source and target are given on different domains.
436       has to be implemented by the actual Domain adapter.       has to be implemented by the actual Domain adapter.
437    */    */
438    FINLEY_DLL_API    FINLEY_DLL_API
439    virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;    virtual void interpolateACross(escript::Data& target, const escript::Data& source) const;
440    
441      /**
442      \brief determines whether interpolation from source to target is possible.
443      Must be implemented by the actual Domain adapter
444      */
445    FINLEY_DLL_API    FINLEY_DLL_API
446    virtual bool probeInterpolationACross(int functionSpaceType_source,const AbstractDomain& targetDomain, int functionSpaceType_target) const;    virtual bool probeInterpolationACross(int functionSpaceType_source,const escript::AbstractDomain& targetDomain, int functionSpaceType_target) const;
447    
448    /**    /**
449       \brief       \brief
# Line 412  class MeshAdapter : public escript::Abst Line 479  class MeshAdapter : public escript::Abst
479    
480    /**    /**
481       \brief       \brief
482       return the identifier of the matrix type to be used for the global stiffness matrix when a particular solver, package       return the identifier of the matrix type to be used for the global stiffness matrix when a particular solver, package, perconditioner,
483         and symmetric matrix is used.
484         \param solver
485         \param preconditioner
486         \param package
487         \param symmetry
488      */
489      FINLEY_DLL_API
490      virtual int getSystemMatrixTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
491    
492      /**
493         \brief
494         return the identifier of the transport problem type to be used when a particular solver, perconditioner, package
495       and symmetric matrix is used.       and symmetric matrix is used.
496       \param solver       \param solver
497         \param preconditioner
498         \param package
499       \param symmetry       \param symmetry
500    */    */
501    FINLEY_DLL_API    FINLEY_DLL_API
502    virtual int getSystemMatrixTypeId(const int solver, const int package, const bool symmetry) const;    virtual int getTransportTypeId(const int solver, const int preconditioner, const int package, const bool symmetry) const;
503    
504    /**    /**
505       \brief       \brief
# Line 445  class MeshAdapter : public escript::Abst Line 526  class MeshAdapter : public escript::Abst
526       This has to be implemented by the actual Domain adapter.       This has to be implemented by the actual Domain adapter.
527    */    */
528    FINLEY_DLL_API    FINLEY_DLL_API
529    virtual void saveVTK(const std::string& filename,const boost::python::dict& arg) const;    virtual void saveVTK(const std::string& filename,const boost::python::dict& arg,  const std::string& metadata, const std::string& metadata_schema) const;
530    
531      FINLEY_DLL_API
532      virtual bool ownSample(int fs_code, index_t id) const;
533    
534    /**    /**
535       \brief       \brief
# Line 483  class MeshAdapter : public escript::Abst Line 567  class MeshAdapter : public escript::Abst
567    virtual void addPDEToRHS(escript::Data& rhs,    virtual void addPDEToRHS(escript::Data& rhs,
568                       const escript::Data& X, const escript::Data& Y,                       const escript::Data& X, const escript::Data& Y,
569                       const escript::Data& y, const escript::Data& y_contact) const;                       const escript::Data& y, const escript::Data& y_contact) const;
570      /**
571         \brief
572         adds a PDE onto a transport problem
573      */
574    
575      FINLEY_DLL_API
576      virtual void addPDEToTransportProblem(
577                         TransportProblemAdapter& tp, escript::Data& source,
578                         const escript::Data& M,
579                         const escript::Data& A, const escript::Data& B, const escript::Data& C,const  escript::Data& D,
580                         const  escript::Data& X,const  escript::Data& Y,
581                         const escript::Data& d, const escript::Data& y,
582                         const escript::Data& d_contact,const escript::Data& y_contact) const;
583    
584    
585    /**    /**
586       \brief       \brief
587      creates a SystemMatrixAdapter stiffness matrix an initializes it with zeros:      creates a SystemMatrixAdapter stiffness matrix and initializes it with zeros:
588    */    */
589    FINLEY_DLL_API    FINLEY_DLL_API
590    SystemMatrixAdapter newSystemMatrix(    escript::ASM_ptr newSystemMatrix(
591                        const int row_blocksize,                        const int row_blocksize,
592                        const escript::FunctionSpace& row_functionspace,                        const escript::FunctionSpace& row_functionspace,
593                        const int column_blocksize,                        const int column_blocksize,
594                        const escript::FunctionSpace& column_functionspace,                        const escript::FunctionSpace& column_functionspace,
595                        const int type) const;                        const int type) const;
596      /**
597       \brief
598        creates a TransportProblemAdapter
599    
600      */
601    
602      FINLEY_DLL_API
603      escript::ATP_ptr newTransportProblem(
604                          const bool useBackwardEuler,
605                          const int blocksize,
606                          const escript::FunctionSpace& functionspace,
607                          const int type) const;
608    
609    /**    /**
610       \brief returns locations in the FEM nodes       \brief returns locations in the FEM nodes
# Line 518  class MeshAdapter : public escript::Abst Line 628  class MeshAdapter : public escript::Abst
628       \brief comparison operators       \brief comparison operators
629    */    */
630    FINLEY_DLL_API    FINLEY_DLL_API
631    virtual bool operator==(const AbstractDomain& other) const;    virtual bool operator==(const escript::AbstractDomain& other) const;
632    FINLEY_DLL_API    FINLEY_DLL_API
633    virtual bool operator!=(const AbstractDomain& other) const;    virtual bool operator!=(const escript::AbstractDomain& other) const;
634    
635    /**    /**
636       \brief assigns new tag newTag to all samples of functionspace with a positive       \brief assigns new tag newTag to all samples of functionspace with a positive
# Line 530  class MeshAdapter : public escript::Abst Line 640  class MeshAdapter : public escript::Abst
640    FINLEY_DLL_API    FINLEY_DLL_API
641    virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;    virtual void setTags(const int functionSpaceType, const int newTag, const escript::Data& mask) const;
642    
643      /**
644          \brief
645              return the number of tags in use and a pointer to an array with the number of tags in use
646      */
647      FINLEY_DLL_API
648      virtual int getNumberOfTagsInUse(int functionSpaceCode) const;
649    
650      FINLEY_DLL_API
651      virtual const int* borrowListOfTagsInUse(int functionSpaceCode) const;
652    
653    
654      /**
655         \brief Checks if this domain allows tags for the specified functionSpaceCode.
656      */
657      FINLEY_DLL_API
658      virtual
659      bool canTag(int functionSpaceCode) const;
660    
661       /**
662       \brief returns the approximation order used for a function space functionSpaceCode
663       */
664    
665      FINLEY_DLL_API
666      virtual
667      int getApproximationOrder(const int functionSpaceCode) const;
668    
669      FINLEY_DLL_API
670      bool supportsContactElements() const;
671    
672    
673   protected:   protected:
674    
675   private:   private:
676      void extractArgsFromDict(const boost::python::dict& arg, int& numData,
677                                 char**& names, escriptDataC*& data,
678                                 escriptDataC**& dataPtr) const;
679    
680    //    //
681    // pointer to the externally created finley mesh    // pointer to the externally created finley mesh
# Line 542  class MeshAdapter : public escript::Abst Line 685  class MeshAdapter : public escript::Abst
685    
686  };  };
687    
688    // Do not use this class. It is a convenience wrapper for the dataexporter.
689    class FINLEY_DLL_API ReferenceElementSetWrapper {
690     public:
691      ReferenceElementSetWrapper(Finley_ElementTypeId id, index_t order,
692                                 index_t reducedOrder);
693      ~ReferenceElementSetWrapper();
694    
695      Finley_ReferenceElementSet* getElementSet() const { return m_refSet; }
696    
697     private:
698      Finley_ReferenceElementSet* m_refSet;
699    };
700    
701    
702  } // end of namespace  } // end of namespace
703    
704  #endif  #endif

Legend:
Removed from v.1204  
changed lines
  Added in v.3259

  ViewVC Help
Powered by ViewVC 1.1.26