Program Listing for File TetMesh.h¶
↰ Return to documentation for file (include/gamer/TetMesh.h
)
/*
* ***************************************************************************
* This file is part of the GAMer software.
* Copyright (C) 2016-2018
* by Christopher Lee, John Moody, Rommie Amaro, J. Andrew McCammon,
* and Michael Holst
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* ***************************************************************************
*/
#pragma once
#include <sstream>
#include <memory>
#include <string>
#include <unordered_set>
#include <utility>
#include <gamer/gamer.h>
#define TETLIBRARY
#include <tetgen.h>
#include <casc/casc>
#include "gamer/Vertex.h"
#include "gamer/SurfaceMesh.h"
class tetgenio;
namespace gamer
{
struct TMGlobal
{
bool higher_order;
};
struct TMVertexProperties
{
double error;
TMVertexProperties() : error(-1) {}
TMVertexProperties(double error) : error(error) {}
};
struct TMVertex : Vertex, TMVertexProperties
{
TMVertex() : TMVertex(Vertex(), TMVertexProperties()) {}
template<typename ... Args>
TMVertex(Args && ... args) : TMVertex(Vertex(std::forward<Args>(args)...)) {}
TMVertex(Vertex v) : TMVertex(v, TMVertexProperties(-1)) {}
TMVertex(Vertex v, TMVertexProperties p) : Vertex(v), TMVertexProperties(p) {}
friend std::ostream &operator<<(std::ostream &output, const TMVertex &v)
{
output << "TMVertex(x:" << v[0]
<< ",y:" << v[1]
<< ",z:" << v[2]
<< ";m:" << v.marker
<< ";sel:" << v.selected
<< ";err:" << v.error
<< ")";
return output;
}
std::string to_string() const
{
std::ostringstream output;
output << *this;
return output.str();
}
};
struct TMEdge : Vertex
{
using Vertex::Vertex;
friend std::ostream &operator<<(std::ostream &output, const TMEdge &v)
{
output << "TMEdge(x:" << v[0]
<< ",y:" << v[1]
<< ",z:" << v[2]
<< ";m:" << v.marker
<< ";sel:" << v.selected
<< ")";
return output;
}
std::string to_string() const
{
std::ostringstream output;
output << *this;
return output.str();
}
};
struct TMFaceProperties
{
int marker;
bool selected;
};
struct TMFace : TMFaceProperties
{
TMFace() : TMFace(TMFaceProperties{-1, false}) {}
TMFace(int marker, bool selected) : TMFace(TMFaceProperties{marker, selected}) {}
TMFace(TMFaceProperties prop) : TMFaceProperties(prop) {}
friend std::ostream &operator<<(std::ostream &output, const TMFace &f)
{
output << "TMFace("
<< "m:" << f.marker
<< ";sel:" << f.selected << ")";
return output;
}
std::string to_string() const
{
std::ostringstream output;
output << *this;
return output.str();
}
};
struct TMCellProperties
{
int marker;
bool selected;
};
struct TMCell : casc::Orientable, TMCellProperties
{
TMCell() : TMCell(-1, false) {}
TMCell(int marker, bool selected) : TMCell(0, marker, selected) {}
TMCell(int orient, int marker, bool selected) : TMCell(Orientable{orient}, TMCellProperties{marker, selected}) {}
TMCell(Orientable orient, TMCellProperties prop)
: Orientable(orient), TMCellProperties(prop)
{}
friend std::ostream &operator<<(std::ostream &output, const TMCell &c)
{
output << "tetmesh::Cell("
<< "m:" << c.marker
<< ";sel:" << std::boolalpha << c.selected
<< ";o:" << c.orientation << ")";
return output;
}
std::string to_string() const
{
std::ostringstream output;
output << *this;
return output.str();
}
};
namespace tetmesh_detail{
struct tetmesh_traits
{
using KeyType = int;
using NodeTypes = util::type_holder<TMGlobal, TMVertex, TMEdge, TMFace, TMCell>;
using EdgeTypes = util::type_holder<casc::Orientable, casc::Orientable, casc::Orientable, casc::Orientable>;
};
} // end namespace tetmesh_detail
using TetMesh = casc::simplicial_complex<tetmesh_detail::tetmesh_traits>;
std::unique_ptr<TetMesh> tetgenioToTetMesh(tetgenio &tetio);
std::unique_ptr<TetMesh> makeTetMesh(
const std::vector<SurfaceMesh*> &surfmeshes,
std::string tetgen_params);
std::unique_ptr<SurfaceMesh> extractSurface(const TetMesh &mesh);
void smoothMesh(TetMesh &mesh);
void writeVTK(const std::string &filename, const TetMesh &mesh);
void writeOFF(const std::string &filename, const TetMesh &mesh);
void writeDolfin(const std::string &filename, const TetMesh &mesh);
void writeTriangle(const std::string &filename, const TetMesh &mesh);
//void writeMCSF(const std::string &filename, const TetMesh &mesh);
//void writeDiffPack
//void writeCARP
std::unique_ptr<TetMesh> readDolfin(const std::string &filename);
} // end namespace gamer