gctl_toolkits/archive/tetgen2gmsh/tetgen2gmsh.h
2024-09-10 20:25:18 +08:00

204 lines
4.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _TETGEN2GMSH_H
#define _TETGEN2GMSH_H
#include "data_func.h"
class tetgen2gmsh
{
public:
tetgen2gmsh();
~tetgen2gmsh();
int call_back(string,string);//响应函数
int read_tetgen(string);//读取tetgen文件
int write_gmsh(string);//写入gmsh(.msh)文件
private:
int node_sum;//顶点数量与指针
vertex *vert;
int edge_sum;//边数量与指针
edge *edg;
int face_sum;//面数量与指针
face *fac;
int tetra_sum;//四面体数量与指针
tetra *tet;
string tetgen_name;//tetgen文件名
string gmsh_name;//gmsh文件名
};
tetgen2gmsh::tetgen2gmsh()//初始化指针
{
vert=NULL;
edg=NULL;
fac=NULL;
tet=NULL;
}
tetgen2gmsh::~tetgen2gmsh()//销毁动态数组
{
if(vert!=NULL) delete []vert;
if(edg!=NULL) delete []edg;
if(fac!=NULL) delete []fac;
if(tet!=NULL) delete []tet;
}
int tetgen2gmsh::call_back(string tetgen_name,string gmsh_name)
{
if(access((tetgen_name + ".node").c_str(),F_OK)||access((tetgen_name + ".edge").c_str(),F_OK)
||access((tetgen_name + ".face").c_str(),F_OK)||access((tetgen_name + ".ele").c_str(),F_OK))
{
cout<<"tetgen files are incomplete..."<<endl;
return 0;
}
read_tetgen(tetgen_name);
write_gmsh(gmsh_name);
return 0;
}
int tetgen2gmsh::read_tetgen(string filename)//读取tetgen文件包括.node/.edge/.face/.ele文件,这个地方注意将点索引号置为从1开始
{
int first_no;
double temp;
string nodename,elename,facename,edgename;
nodename = filename + ".node";
elename = filename + ".ele";
facename = filename + ".face";
edgename = filename + ".edge";
const char* nodename_c = nodename.c_str();
const char* elename_c = elename.c_str();
const char* facename_c = facename.c_str();
const char* edgename_c = edgename.c_str();
ifstream node_in(nodename_c);
ifstream ele_in(elename_c);
ifstream face_in(facename_c);
ifstream edge_in(edgename_c);
node_in>>node_sum>>temp>>temp>>temp>>first_no;
node_in.seekg(-1,ios::cur);
vert = new vertex [node_sum];
if(first_no==1)
{
for(int i=0;i<node_sum;i++)
{
node_in>>vert[i].No>>vert[i].vt.x>>vert[i].vt.y>>vert[i].vt.z>>temp;
}
}
else
{
for(int i=0;i<node_sum;i++)
{
node_in>>vert[i].No>>vert[i].vt.x>>vert[i].vt.y>>vert[i].vt.z;
vert[i].No+=1;
}
}
edge_in>>edge_sum>>temp;
edg = new edge [edge_sum];
if(first_no==1)
{
for(int i=0;i<edge_sum;i++)
{
edge_in>>edg[i].No>>edg[i].ver[0]>>edg[i].ver[1]>>temp;
}
}
else
{
for(int i=0;i<edge_sum;i++)
{
edge_in>>edg[i].No>>edg[i].ver[0]>>edg[i].ver[1]>>temp;
edg[i].ver[0]+=1;
edg[i].ver[1]+=1;
}
}
face_in>>face_sum>>temp;
fac = new face [face_sum];
if(first_no==1)
{
for(int i=0;i<face_sum;i++)
{
face_in>>fac[i].No>>fac[i].ver[0]>>fac[i].ver[1]>>fac[i].ver[2]>>temp;
}
}
else
{
for(int i=0;i<face_sum;i++)
{
face_in>>fac[i].No>>fac[i].ver[0]>>fac[i].ver[1]>>fac[i].ver[2]>>temp;
fac[i].ver[0]+=1;
fac[i].ver[1]+=1;
fac[i].ver[2]+=1;
}
}
ele_in>>tetra_sum>>temp>>temp;
tet = new tetra [tetra_sum];
if(first_no==1)
{
for(int i=0;i<tetra_sum;i++)
{
ele_in>>tet[i].No>>tet[i].ver[0]>>tet[i].ver[1]>>tet[i].ver[2]>>tet[i].ver[3];
}
}
else
{
for(int i=0;i<tetra_sum;i++)
{
ele_in>>tet[i].No>>tet[i].ver[0]>>tet[i].ver[1]>>tet[i].ver[2]>>tet[i].ver[3];
tet[i].ver[0]+=1;
tet[i].ver[1]+=1;
tet[i].ver[2]+=1;
tet[i].ver[3]+=1;
}
}
node_in.close();
ele_in.close();
face_in.close();
edge_in.close();
return 0;
}
int tetgen2gmsh::write_gmsh(string filename)//写入gmsh文件
{
int count = 1;
string outname = filename + ".msh";
const char* outname_c = outname.c_str();
ofstream msh_out(outname_c);
if(!msh_out)
{
cout<<"Can not create "<<outname;
return 1;
}
else
{
msh_out<<"$MeshFormat"<<endl<<"2.2 0 8"<<endl<<"$EndMeshFormat"<<endl<<"$Nodes"<<endl<<node_sum<<endl;
for(int i=0;i<node_sum;i++)
{
msh_out<<vert[i].No<<" "<<setprecision(16)<<vert[i].vt.x<<" "<<vert[i].vt.y<<" "<<vert[i].vt.z<<endl;
}
msh_out<<"$EndNodes"<<endl<<"$Elements"<<endl<<edge_sum+face_sum+tetra_sum<<endl;
for(int i=0;i<edge_sum;i++)
{
msh_out<<count<<" 1 2 0 1 "<<edg[i].ver[0]<<" "<<edg[i].ver[1]<<endl;
count++;
}
for(int i=0;i<face_sum;i++)
{
msh_out<<count<<" 2 2 0 14 "<<fac[i].ver[0]<<" "<<fac[i].ver[1]<<" "<<fac[i].ver[2]<<endl;
count++;
}
for(int i=0;i<tetra_sum;i++)
{
msh_out<<count<<" 4 2 0 26 "<<tet[i].ver[0]<<" "<<tet[i].ver[1]<<" "<<tet[i].ver[2]<<" "<<tet[i].ver[3]<<endl;
count++;
}
msh_out<<"$EndElements"<<endl;
}
msh_out.close();
return 0;
}
#endif