Skip to content
Snippets Groups Projects
Select Git revision
  • 77e5e7bb9eb0e585d8ed35b94dd29510e4aa819a
  • master default
  • library-names
  • fix_script_header
  • fix_libdir
  • fix_cmake_hdf5
  • partition
  • cgnsUnstructured
  • partitioning
  • HighOrderBLCurving
  • gmsh_3_0_5
  • gmsh_3_0_4
  • gmsh_3_0_3
  • gmsh_3_0_2
  • gmsh_3_0_1
  • gmsh_3_0_0
  • gmsh_2_16_0
  • gmsh_2_15_0
  • gmsh_2_14_1
  • gmsh_2_14_0
  • gmsh_2_13_2
  • gmsh_2_13_1
  • gmsh_2_12_0
  • gmsh_2_11_0
  • gmsh_2_10_1
  • gmsh_2_10_0
  • gmsh_2_9_3
  • gmsh_2_9_2
  • gmsh_2_9_1
  • gmsh_2_9_0
30 results

Callbacks.cpp

Blame
  • Forked from gmsh / gmsh
    Source project has a limited visibility.
    FuncSpaceData.cpp 4.42 KiB
    // Gmsh - Copyright (C) 1997-2012 C. Geuzaine, J.-B-> Remacle
    //
    // See the LICENSE.txt file for license information. Please report all
    // bugs and problems to the public mailing list <gmsh@onelab.info>.
    
    #include "FuncSpaceData.h"
    #include "MElement.h"
    
    FuncSpaceData::FuncSpaceData(const FuncSpaceData &fsd,
                                 int order,
                                 const bool *serendip) :
      _tag(fsd._tag), _spaceOrder(order),
      _serendipity(serendip ? *serendip : fsd._serendipity),
      _nij(0), _nk(_spaceOrder), _pyramidalSpace(fsd._pyramidalSpace)
    {}
    
    FuncSpaceData::FuncSpaceData(const FuncSpaceData &fsd,
                                 int nij, int nk,
                                 const bool *serendip) :
      _tag(fsd._tag), _spaceOrder(fsd._pyramidalSpace ? nij+nk : std::max(nij, nk)),
      _serendipity(serendip ? *serendip : fsd._serendipity),
      _nij(nij), _nk(nk), _pyramidalSpace(fsd._pyramidalSpace)
    {}
    
    FuncSpaceData::FuncSpaceData(const MElement *el, const bool *serendip) :
      _tag(el->getTypeForMSH()), _spaceOrder(el->getPolynomialOrder()),
      _serendipity(serendip ? *serendip : el->getIsOnlySerendipity()),
      _nij(0), _nk(_spaceOrder), _pyramidalSpace(el->getType() == TYPE_PYR)
    {}
    
    FuncSpaceData::FuncSpaceData(const MElement *el, int order, const bool *serendip) :
      _tag(el->getTypeForMSH()), _spaceOrder(order),
      _serendipity(serendip ? *serendip : el->getIsOnlySerendipity()),
      _nij(0), _nk(_spaceOrder), _pyramidalSpace(el->getType() == TYPE_PYR)
    {}
    
    FuncSpaceData::FuncSpaceData(const MElement *el, bool pyr, int nij, int nk,
                                 const bool *serendip) :
      _tag(el->getTypeForMSH()), _spaceOrder(pyr ? nij+nk : std::max(nij, nk)),
      _serendipity(serendip ? *serendip : el->getIsOnlySerendipity()),
      _nij(nij), _nk(nk), _pyramidalSpace(pyr)
    {
      if (el->getType() != TYPE_PYR)
        Msg::Error("Creation of pyramidal space data for a non-pyramid element !");
    }
    
    FuncSpaceData::FuncSpaceData(int tag, const bool *serendip) :
      _tag(tag), _spaceOrder(ElementType::OrderFromTag(tag)),
      _serendipity(serendip ? *serendip : ElementType::SerendipityFromTag(_tag) > 1),
      _nij(0), _nk(_spaceOrder),
      _pyramidalSpace(ElementType::ParentTypeFromTag(tag) == TYPE_PYR)
    {}
    
    FuncSpaceData::FuncSpaceData(bool isTag, int tagOrType, int order,
                                 const bool *serendip, bool elemIsSerendip) :
      _tag(isTag ? tagOrType : ElementType::getTag(tagOrType, order, elemIsSerendip)),
      _spaceOrder(order),
      _serendipity(serendip ? *serendip : ElementType::SerendipityFromTag(_tag) > 1),
      _nij(0), _nk(_spaceOrder),
      _pyramidalSpace(isTag ?
          ElementType::ParentTypeFromTag(tagOrType) == TYPE_PYR :
          tagOrType == TYPE_PYR)
    {}
    
    FuncSpaceData::FuncSpaceData(bool isTag, int tagOrType, bool pyr, int nij,
                                 int nk, const bool *serendip, bool elemIsSerendip) :
      _tag(isTag ? tagOrType :
           ElementType::getTag(tagOrType, pyr ? nij+nk : std::max(nij, nk), elemIsSerendip)),
      _spaceOrder(pyr ? nij+nk : std::max(nij, nk)),
      _serendipity(serendip ? *serendip : ElementType::SerendipityFromTag(_tag) > 1),
      _nij(nij), _nk(nk), _pyramidalSpace(pyr)
    {
      if (ElementType::ParentTypeFromTag(_tag) != TYPE_PYR)
        Msg::Error("Creation of pyramidal space data for a non-pyramid element!");
    }
    
    void FuncSpaceData::getOrderForBezier(int order[3], int exponentZ) const
    {
      if (_pyramidalSpace && exponentZ < 0) {
        Msg::Error("getOrderForBezier needs third exponent for pyramidal space!");
        order[0] = order[1] = order[2] = -1;
        return;
      }
      if (elementType() == TYPE_PYR) {
        if (_pyramidalSpace) {
          order[0] = order[1] = _nij + exponentZ;
          order[2] = _nk;
        }
        else {
          order[0] = order[1] = _nij;
          order[2] = _nk;
        }
      }
      else
        order[0] = order[1] = order[2] = _spaceOrder;
    }
    
    FuncSpaceData FuncSpaceData::getForPrimaryElement() const
    {
      int type = elementType();
      int primTag = ElementType::getTag(type, 1, elementIsOnlySerendipity());
    
      if (primTag == _tag) return *this;
    
      if (type == TYPE_PYR)
        return FuncSpaceData(true, primTag, _pyramidalSpace, _nij, _nk, &_serendipity);
      else
        return FuncSpaceData(true, primTag, _spaceOrder, &_serendipity);
    }
    
    FuncSpaceData FuncSpaceData::getForNonSerendipitySpace() const
    {
      if (!_serendipity) return *this;
    
      int type = elementType();
      bool serendip = false;
      if (type == TYPE_PYR)
        return FuncSpaceData(true, _tag, _pyramidalSpace, _nij, _nk, &serendip);
      else
        return FuncSpaceData(true, _tag, _spaceOrder, &serendip);
    }