40 #include "../InputModules/InputGmsh.h" 53 "Writes Gmsh msh file.");
61 elmMap[it.second] = it.first;
85 cout <<
"OutputGmsh: Writing file..." << endl;
88 std::unordered_map<int, vector<int> > orderingMap;
96 <<
"$EndMeshFormat" << endl;
98 int id =
m_mesh->m_vertexSet.size();
99 vector<ElementSharedPtr> toComplete;
101 int order =
m_config[
"order"].as<
int>();
107 cout <<
"Making mesh of order " << order << endl;
114 for (
int i = 0; i <
m_mesh->m_element[
m_mesh->m_expDim].size(); ++i)
117 if (e->GetMaxOrder() > order)
119 order = e->GetMaxOrder();
127 cout <<
"Mesh order of " << order <<
" detected" << endl;
133 for (
auto &eIt :
m_mesh->m_edgeSet)
135 m_mesh->m_vertexSet.insert(eIt->m_edgeNodes.begin(),
136 eIt->m_edgeNodes.end());
139 for (
auto &fIt :
m_mesh->m_faceSet)
141 m_mesh->m_vertexSet.insert(fIt->m_faceNodes.begin(),
142 fIt->m_faceNodes.end());
146 for (
int d = 1; d <= 3; ++d)
148 for (
int i = 0; i <
m_mesh->m_element[d].size(); ++i)
151 vector<NodeSharedPtr> volList = e->GetVolumeNodes();
152 m_mesh->m_vertexSet.insert(volList.begin(), volList.end());
157 map<int, NodeSharedPtr> tmp;
158 for (
const auto &it :
m_mesh->m_vertexSet)
160 tmp[it->GetID() + 1] = it;
168 m_mshFile << it.first <<
" " << scientific << setprecision(10)
169 << it.second->m_x <<
" " << it.second->m_y <<
" " 170 << it.second->m_z << endl;
182 for (
int d = 1; d <= 3; ++d)
184 for (
int i = 0; i <
m_mesh->m_element[d].size(); ++i, ++id)
189 int elmtType =
elmMap[e->GetConf()];
190 m_mshFile <<
id <<
" " << elmtType <<
" ";
194 vector<int> tags = e->GetTagList();
196 if (tags.size() == 1)
198 tags.push_back(tags[0]);
204 for (
int j = 0; j < tags.size(); ++j)
211 vector<NodeSharedPtr> nodeList = e->GetVertexList();
212 vector<EdgeSharedPtr> edgeList = e->GetEdgeList();
213 vector<FaceSharedPtr> faceList = e->GetFaceList();
214 vector<NodeSharedPtr> volList = e->GetVolumeNodes();
218 for (
int j = 0; j < nodeList.size(); ++j)
220 tags.push_back(nodeList[j]->m_id);
224 for (
int j = 0; j < edgeList.size(); ++j)
226 nodeList = edgeList[j]->m_edgeNodes;
230 for (
int k = 0; k < nodeList.size(); ++k)
232 tags.push_back(nodeList[k]->m_id);
237 for (
int k = nodeList.size() - 1; k >= 0; --k)
239 tags.push_back(nodeList[k]->m_id);
245 for (
int j = 0; j < faceList.size(); ++j)
247 nodeList = faceList[j]->m_faceNodes;
248 int nFaceVerts = faceList[j]->m_vertexList.size();
249 vector<int> faceIds(nFaceVerts), volFaceIds(nFaceVerts);
251 for (
int k = 0; k < nFaceVerts; ++k)
253 faceIds [k] = faceList[j]->m_vertexList[k]->m_id;
255 e->GetVertexList()[e->GetFaceVertex(j, k)]->m_id;
261 hoTri.
Align(volFaceIds);
262 for (
int k = 0; k < hoTri.
surfVerts.size(); ++k)
264 tags.push_back(hoTri.
surfVerts[k]->m_id);
270 hoQuad.
Align(volFaceIds);
272 for (
int k = 0; k < hoQuad.
surfVerts.size(); ++k)
274 tags.push_back(hoQuad.
surfVerts[k]->m_id);
280 for (
int j = 0; j < volList.size(); ++j)
282 tags.push_back(volList[j]->m_id);
287 auto oIt = orderingMap.find(elmtType);
290 if (oIt == orderingMap.end())
293 vector<int> inv(tags.size());
295 ASSERTL1(tags.size() == reordering.size(),
296 "Reordering map size not equal to element tags 1.");
298 for (
int j = 0; j < tags.size(); ++j)
300 inv[reordering[j]] = j;
303 oIt = orderingMap.insert(make_pair(elmtType, inv)).first;
306 ASSERTL1(tags.size() == oIt->second.size(),
307 "Reordering map size not equal to element tags 2.");
310 for (
int j = 0; j < tags.size(); ++j)
312 m_mshFile << tags[oIt->second[j]] + 1 <<
" ";
io::filtering_ostream m_mshFile
Output stream.
void Align(std::vector< int > vertId)
Align this surface to a given vertex ID.
NEKMESHUTILS_EXPORT void OpenStream()
Open a file for output.
std::vector< T > surfVerts
The quadrilateral surface vertices – templated so that this can either be nodes or IDs...
Abstract base class for output modules.
std::vector< T > surfVerts
The triangle surface vertices – templated so that this can either be nodes or IDs.
MeshSharedPtr m_mesh
Mesh object.
std::shared_ptr< Mesh > MeshSharedPtr
Shared pointer to a mesh.
1D Evenly-spaced points using Lagrange polynomial
std::pair< ModuleType, std::string > ModuleKey
std::unordered_map< NekMeshUtils::ElmtConfig, unsigned int, ElmtConfigHash > elmMap
std::shared_ptr< Element > ElementSharedPtr
Represents a command-line configuration option.
std::map< std::string, ConfigOption > m_config
List of configuration values.
void Align(std::vector< int > vertId)
Align this surface to a given vertex ID.
A lightweight struct for dealing with high-order triangle alignment.
A lightweight struct for dealing with high-order quadrilateral alignment.
virtual void Process()
Write mesh to output file.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
std::pair< ModuleType, std::string > ModuleKey
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
ModuleFactory & GetModuleFactory()