204 lines
4.6 KiB
C
204 lines
4.6 KiB
C
|
#ifndef _TETGEN2GMSH_H
|
|||
|
#define _TETGEN2GMSH_H
|
|||
|
#include "data_func.h"
|
|||
|
|
|||
|
class tetgen2gmsh
|
|||
|
{
|
|||
|
public:
|
|||
|
tetgen2gmsh();
|
|||
|
~tetgen2gmsh();
|
|||
|
|
|||
|
int call_back(string,string);//<2F><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
|||
|
int read_tetgen(string);//<2F><>ȡtetgen<65>ļ<EFBFBD>
|
|||
|
int write_gmsh(string);//д<><D0B4>gmsh(.msh)<29>ļ<EFBFBD>
|
|||
|
private:
|
|||
|
int node_sum;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
vertex *vert;
|
|||
|
int edge_sum;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
edge *edg;
|
|||
|
int face_sum;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
face *fac;
|
|||
|
int tetra_sum;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
tetra *tet;
|
|||
|
|
|||
|
string tetgen_name;//tetgen<65>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
string gmsh_name;//gmsh<73>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
};
|
|||
|
|
|||
|
tetgen2gmsh::tetgen2gmsh()//<2F><>ʼ<EFBFBD><CABC>ָ<EFBFBD><D6B8>
|
|||
|
{
|
|||
|
vert=NULL;
|
|||
|
edg=NULL;
|
|||
|
fac=NULL;
|
|||
|
tet=NULL;
|
|||
|
}
|
|||
|
|
|||
|
tetgen2gmsh::~tetgen2gmsh()//<2F><><EFBFBD>ٶ<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
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)//<2F><>ȡtetgen<65>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.node/.edge/.face/.ele<6C>ļ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD>ע<EFBFBD>⽫<EFBFBD><E2BDAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>1<EFBFBD><31>ʼ
|
|||
|
{
|
|||
|
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)//д<><D0B4>gmsh<73>ļ<EFBFBD>
|
|||
|
{
|
|||
|
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
|