Skip to content
Snippets Groups Projects
Forked from gmsh / gmsh
10787 commits behind the upstream repository.
  • Nicolas Marsic's avatar
    1aec02c9
    ** ReferenceSpace: · 1aec02c9
    Nicolas Marsic authored
        -- Add Point Mapping from ABC space to XYZ space
        -- Handle Elements with no Face
    
    ** LineBasis:
        -- Works again
    
    ** Jacobian and GroupOfJacobian:
        -- Computes Good Jacobian from Basis ReferenceSpace
    
    ** Formulation:
        -- Addapted for good Jacobian
    
    ** TermProjection:
        -- Addapted to compute function to project at good point (see ReferenceSpace ABCtoXYZ mapping)
    
    ** Laplace, Poisson, SteadyWave:
        -- Passed with all basis
    
    ** WARNING:
        -- Tet Basis NOT Retested (but seems to work)
        -- FunctionSpace::getDof doesn't work if wrong element type (because of basis implication)
        -- SystemAbstract::fixCoef doesn't work anymore (see above)
        -- Problem with cureved Element (getTypeForMSH gives HO element for FunctionSpace::getDof)
    1aec02c9
    History
    ** ReferenceSpace:
    Nicolas Marsic authored
        -- Add Point Mapping from ABC space to XYZ space
        -- Handle Elements with no Face
    
    ** LineBasis:
        -- Works again
    
    ** Jacobian and GroupOfJacobian:
        -- Computes Good Jacobian from Basis ReferenceSpace
    
    ** Formulation:
        -- Addapted for good Jacobian
    
    ** TermProjection:
        -- Addapted to compute function to project at good point (see ReferenceSpace ABCtoXYZ mapping)
    
    ** Laplace, Poisson, SteadyWave:
        -- Passed with all basis
    
    ** WARNING:
        -- Tet Basis NOT Retested (but seems to work)
        -- FunctionSpace::getDof doesn't work if wrong element type (because of basis implication)
        -- SystemAbstract::fixCoef doesn't work anymore (see above)
        -- Problem with cureved Element (getTypeForMSH gives HO element for FunctionSpace::getDof)
Basis.h 8.59 KiB
#ifndef _BASIS_H_
#define _BASIS_H_

#include <string>
#include "MElement.h"
#include "ReferenceSpace.h"

/**
   @interface Basis
   @brief Common Interface of all Basis

   This class is the @em common @em interface for all Basis.@n

   A Basis is @em set of @em linearly @em independent Polynomial%s
   (or Vector%s of Polynomial%s).@n

   @note
   The returned matrices are the result of the evaluation
   of the basis functions (at @c N points).@n

   The @c i-th row of these matrices is always refering to the
   @c i-th function of the basis.@n

   Depending on the nature of the returned value
   (@em scalar or @em vector), the columns are organized
   diferently.

   For @em scalar values, we have:
   @li The @c j-th column of the @c i-th row is
   the evaluation of the @c i-th function at the @c j-th point

   For @em vectorial values, we have:
   @li The @c j-th column of the @c i-th row is
   the @em first @em coordinate of
   the evaluation of the @c i-th function at the @c 3 @c x @c j-th point

   @li The @c (@c j-th @c + @c 1 @c ) column of the @c i-th row is
   the @em second @em coordinate of
   the evaluation of the @c i-th function at the @c 3 @c x @c j-th point

   @li The @c (@c j-th @c + @c 2 @c ) column of the @c i-th row is
   the @em third @em coordinate of
   the evaluation of the @c i-th function at the @c 3 @c x @c j-th point
 */

class Basis{
 protected:
  ReferenceSpace* refSpace;
  size_t         nRefSpace;

  bool scalar;
  bool local;

  size_t order;
  size_t type;
  size_t dim;

  size_t nVertex;
  size_t nEdge;
  size_t nFace;
  size_t nCell;

  size_t nFunction;

 public:
  // Destructor //
  virtual ~Basis(void);

  // Scalar & Local //
  bool isScalar(void) const;
  bool isLocal(void) const;

  // Type of Basis //
  size_t getOrder(void) const;
  size_t getType(void) const;
  size_t getDim(void) const;

  // Number of Functions //
  size_t getNVertexBased(void) const;
  size_t getNEdgeBased(void) const;
  size_t getNFaceBased(void) const;
  size_t getNCellBased(void) const;
  size_t getNFunction(void) const;

  // Reference Element //
  const ReferenceSpace& getReferenceSpace(void) const;

  // Direct Access to Evaluated Functions //
  virtual void getFunctions(fullMatrix<double>& retValues,
                            const MElement& element,
                            double u, double v, double w) const = 0;

  virtual void getFunctions(fullMatrix<double>& retValues,
                            size_t orientation,
                            double u, double v, double w) const = 0;

  // Precompute Functions //
  virtual void preEvaluateFunctions(const fullMatrix<double>& point) const = 0;
  virtual void preEvaluateDerivatives(const fullMatrix<double>& point) const = 0;

  // Access to Precomputed Functions //
  virtual const fullMatrix<double>&
    getPreEvaluatedFunctions(const MElement& element) const = 0;

  virtual const fullMatrix<double>&
    getPreEvaluatedDerivatives(const MElement& element) const = 0;

  virtual const fullMatrix<double>&
    getPreEvaluatedFunctions(size_t orientation) const = 0;

  virtual const fullMatrix<double>&
    getPreEvaluatedDerivatives(size_t orientation) const = 0;

  virtual std::string toString(void) const = 0;

 protected:
  // 'Constructor' //
  Basis(void);
};


/**
   @internal
   @fn Basis::Basis

   Instantiate a new Basis
   @endinternal
   **

   @fn Basis::~Basis

   Deletes this Basis
   **

   @fn Basis::isScalar
   @return Returns:
   @li @c true, if this is a
   @em scalar Basis
   @li @c false, if this is a
   @em vectorial Basis

   @note
   Scalar basis are sets of
   Polynomial%s@n
   Vectorial basis are sets of
   Vector%s of Polynomial%s
   **

   @fn Basis::isLocal
   @return Returns:
   @li @c true, if this is a
   @em Local Basis
   @li @c false, if this is a
   @em Global Basis
   **

   @fn Basis::getOrder
   @return Returns the @em polynomial @em order of the Basis
   **

   @fn Basis::getType
   @return Returns the @em type of the Basis:
   @li 0 for 0-form
   @li 1 for 1-form
   @li 2 for 2-form
   @li 3 for 3-form
   **

   @fn Basis::getDim
   @return Returns the @em dimension
   (@c 1D, @c 2D or @c 3D) of the Basis
   **

   @fn Basis::getNVertexBased
   @return Returns the number of @em Vertex
   @em Based functions of this Basis
   **

   @fn Basis::getNEdgeBased
   @return Returns the number of @em Edge
   @em Based functions of this Basis
   **

   @fn Basis::getNFaceBased
   @return Returns the number of @em Face
   @em Based functions of this Basis
   **

   @fn Basis::getNCellBased
   @return Returns the number of @em Cell
   @em Based functions of this Basis
   **

   @fn Basis::getNFunction
   @return Returns the number of Polynomial%s
   (or Vector%s of Polynomial%s) Functions
   in this Basis
   **

   @fn Basis::getNOrientation
   @return Returns the number of
   @em orientation of this Basis
   Reference Space
   **

   @fn Basis::getOrientation
   @param element A MElement
   @return Returns a number
   (from 0 to Basis::getNOrientation() - 1)
   charaterizing the @em orientation
   of the given element
   **

   @fn Basis::getFunctions(size_t, double, double, double) const
   @param orientation A natural number defining the reference space @em orientation
   @param u A @c u coordinate in the reference space of this Basis
   @param v A @c v coordinate in the reference space of this Basis
   @param w A @c w coordinate in the reference space of this Basis
   @return Instanciates a new fullMatrix<double> with the @em evaluation
   of every basis function at the given coordinates, and for the
   given orientation

   @warning
   The Instanciated Matrix must be deleted by the @em calling function
   **

   @fn Basis::getFunctions(const MElement&, double, double, double) const
   @param element A MElement
   @param u A @c u coordinate in the reference space of this Basis
   @param v A @c v coordinate in the reference space of this Basis
   @param w A @c w coordinate in the reference space of this Basis
   @return Same as Basis::getFunction(Basis::getOrientation(@c element),
   @c u, @c u, @c w)
   **

   @fn Basis::preEvaluateFunctions
   @param point A Matrix with points coordinate
   (each line is a point and got 3 coordinates, @em i.e. 3 rows)
   @return Pre Evaluates every basis function at the given points
   **

   @fn Basis::preEvaluateDerivatives
   @param point A Matrix with points coordinate
   (each line is a point and got 3 coordinates, @em i.e. 3 rows)
   @return Pre Evaluates every basis function @em derivative at the given points

   @note
   @li For 0-Form it computes the @em gradient
   @li For 1-Form it computes the @em curl
   @li For 2-Form it computes the @em divergence
   @li For 3-Form it computes the @em ???
   @todo What is the derivative of a 3-Form
   (does it exists -- discontinous field nope ?) ?
   **

   @fn Basis::getPreEvaluatedFunctions(size_t) const
   @param orientation A natural number defining the reference space @em orientation
   @return Returns a Matrix with the PreEvaluated basis functions
   (see Basis::preEvaluateFunctions()), with the given @em orientation

   @note
   If no PreEvaluation has been done before calling this function,
   an Exception is thrown
   **

   @fn Basis::getPreEvaluatedDerivatives(size_t) const
   @param orientation A natural number defining the reference space @em orientation
   @return Returns a Matrix with the PreEvaluated basis functions @em derivatives
   (see Basis::preEvaluateDerivatives()), with the given @em orientation

   @note
   If no PreEvaluation of the gradient has been done before calling this function,
   an Exception is thrown
   **

   @fn Basis::getPreEvaluatedFunctions(const MElement&) const
   @return Same as Basis::getPreEvaluatedFunctions(Basis::getOrientation(@c element))
   **

   @fn Basis::getPreEvaluatedDerivatives(const MElement&) const
   @return Same as Basis::getPreEvaluatedDerivatives(Basis::getOrientation(@c element))
*/

//////////////////////
// Inline Functions //
//////////////////////

inline bool Basis::isScalar(void) const{
  return scalar;
}

inline bool Basis::isLocal(void) const{
  return local;
}

inline size_t Basis::getOrder(void) const{
  return order;
}

inline size_t Basis::getType(void) const{
  return type;
}

inline size_t Basis::getDim(void) const{
  return dim;
}

inline size_t Basis::getNVertexBased(void) const{
  return nVertex;
}

inline size_t Basis::getNEdgeBased(void) const{
  return nEdge;
}

inline size_t Basis::getNFaceBased(void) const{
  return nFace;
}

inline size_t Basis::getNCellBased(void) const{
  return nCell;
}

inline size_t Basis::getNFunction(void) const{
  return nFunction;
}

inline const ReferenceSpace& Basis::getReferenceSpace(void) const{
  return *refSpace;
}

#endif