Skip to content
Snippets Groups Projects
Select Git revision
  • 30965a9700675dd7cda0947e442b598385818ee0
  • master default
  • cgnsUnstructured
  • partitioning
  • poppler
  • HighOrderBLCurving
  • 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
  • gmsh_2_8_6
26 results

gmshFace.cpp

Blame
  • Forked from gmsh / gmsh
    Source project has a limited visibility.
    Cell.h 5.18 KiB
    // Gmsh - Copyright (C) 1997-2016 C. Geuzaine, J.-F. Remacle
    //
    // See the LICENSE.txt file for license information. Please report all
    // bugs and problems to the public mailing list <gmsh@onelab.info>.
    //
    // Contributed by Matti Pellikka <matti.pellikka@microsoft.com>.
    
    #ifndef _CELL_H_
    #define _CELL_H_
    
    #include <map>
    #include <vector>
    #include "MElement.h"
    
    class Cell;
    
    class Less_Cell {
    public:
      bool operator()(const Cell* c1, const Cell* c2) const;
    };
    
    // Class to save cell boundary orientation information
    class BdInfo {
     private:
      signed char _ori[2];
    
     public:
      BdInfo(int ori) { _ori[0] = ori; _ori[1] = 0; }
    
      int get() const { return _ori[0]; }
      void reset() { _ori[0] = _ori[1]; }
      void init() { _ori[1] = _ori[0]; }
      void set(int ori) { _ori[0] = ori; }
      int geto() const { return _ori[1]; }
    
    };
    
    
    // Class representing an elementary cell of a cell complex.
    class Cell {
    
     protected:
    
      static int _globalNum;
    
      int _num;
      char _domain;
    
      // whether this cell a combinded cell of elementary cells
      bool _combined;
      // for some algorithms to omit this cell
      bool _immune;
    
      // list of cells on the boundary and on the coboundary of this cell
      std::map<Cell*, BdInfo, Less_Cell> _bd;
      std::map<Cell*, BdInfo, Less_Cell> _cbd;
    
      Cell() {}
    
     private:
    
      char _dim;
      std::vector<MVertex*> _v;
      // sorted vertices of this cell (used for ordering of the cells)
      std::vector<char> _si;
    
      inline bool _sortVertexIndices();
    
     public:
    
      static std::pair<Cell*, bool> createCell(MElement* element, int domain);
      static std::pair<Cell*, bool> createCell(Cell* parent, int i);
    
      Cell(MElement* element, int domain);
      Cell(Cell* parent, int i);
    
      virtual ~Cell(){}
    
      int getDomain() const { return _domain; }
      void setDomain(int domain) { _domain = domain; }
      int getNum() const { return _num; }
      void setNum(int num) { _num = num; };
      int getTypeMSH() const;
      virtual int getDim() const { return _dim; }
      bool inSubdomain() const { return _domain ? true : false; }
      void getMeshVertices(std::vector<MVertex*>& v) const { v = _v; }
    
      void setImmune(bool immune) { _immune = immune; };
      bool getImmune() const { return _immune; };
    
      int getNumSortedVertices() const { return _si.size(); }
      inline int getSortedVertex(int vertex) const;
      int getNumVertices() const { return _v.size(); }
      MVertex* getMeshVertex(int vertex) const { return _v.at(vertex); }
    
      void findBdElement(int i, std::vector<MVertex*>& vertices) const;
      int getNumBdElements() const;
      int findBdCellOrientation(Cell* cell, int i) const;
    
      void increaseGlobalNum() { _globalNum++; }
    
      // save/restore the original boundary information of the cell
      void saveCellBoundary();
      void restoreCellBoundary();
    
      // true if this cell has given vertex
      virtual bool hasVertex(int vertex) const;
    
      // (co)boundary cell iterator
      typedef std::map<Cell*, BdInfo, Less_Cell>::iterator biter;
    
      // iterators to (first/last (co)boundary cells of this cell
      // (orig: to original (co)boundary cells of this cell)
      biter firstBoundary(bool orig=false);
      biter lastBoundary();
      biter firstCoboundary(bool orig=false);
      biter lastCoboundary();
    
      int getBoundarySize(bool orig=false);
      int getCoboundarySize(bool orig=false);
    
      // get the (orig: original) cell boundary
      void getBoundary(std::map<Cell*, short int, Less_Cell>& boundary,
                       bool orig=false);
      void getCoboundary(std::map<Cell*, short int, Less_Cell>& coboundary,
                         bool orig=false);
    
      // add (co)boundary cell
      // (other: reciprocally also add this cell from the other cell's (co)boundary)
      void addBoundaryCell(int orientation, Cell* cell, bool other);
      void addCoboundaryCell(int orientation, Cell* cell, bool other);
    
      // remove (co)boundary cell
      // (other: reciprocally also revove this cell from the other cell's (co)boundary)
      void removeBoundaryCell(Cell* cell, bool other);
      void removeCoboundaryCell(Cell* cell, bool other);
    
      // true if has given cell on (orig: original) (co)boundary
      bool hasBoundary(Cell* cell, bool orig=false);
      bool hasCoboundary(Cell* cell, bool orig=false);
    
      // print cell debug info
      virtual void printCell();
      virtual void printBoundary();
      virtual void printCoboundary();
    
      // tools for combined cells
      bool isCombined() const { return _combined; }
    
      typedef std::map<Cell*, int, Less_Cell>::iterator citer;
      virtual void getCells(std::map<Cell*, int, Less_Cell>& cells) {
        cells.clear();
        cells[this] = 1;
      }
      virtual int getNumCells() const { return 1; }
    
      bool operator==(const Cell& c2) const {
        return (this->getNum() == c2.getNum());
      }
    
    };
    
    
    // A cell that is a combination of cells of same dimension
    class CombinedCell : public Cell{
    
     private:
      // list of cells this cell is a combination of
      std::map< Cell*, int, Less_Cell > _cells;
    
     public:
    
      CombinedCell(Cell* c1, Cell* c2, bool orMatch, bool co=false);
      CombinedCell(std::vector<Cell*>& cells);
      ~CombinedCell() {}
    
      int getDim() const { return _cells.begin()->first->getDim(); }
      void getCells(std::map< Cell*, int, Less_Cell >& cells) { cells = _cells; }
      int getNumCells() const {return _cells.size();}
      bool hasVertex(int vertex) const;
    
      bool operator==(const Cell& c2) const {
        return (this->getNum() == c2.getNum());
      }
    };
    
    
    #endif