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

259 lines
5.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 _3DTOOLS2MSH_H
#define _3DTOOLS2MSH_H
#include "iostream"
#include "fstream"
#include "sstream"
#include "string.h"
#include "iomanip"
#define MESH "-M"
#define VALUE "-V"
#define OUTFILE "-G"
#define FILTER "-F"
using namespace std;
string& replace_all(string& str,const string& old_value,const string& new_value,int &num) //替换str中所有lod_value为new_value,返回被替换的lod_value的个数
{
int count = 0;
for(string::size_type pos(0);pos!=string::npos;pos+=new_value.length()){
if((pos=str.find(old_value,pos))!=string::npos){
str.replace(pos,old_value.length(),new_value);
count++;
}
else break;
}
num = count;
return str;
}
int typeget(char *str, const char* str2,string &str3)//提出头端的子句
{
char* strp = strstr(str, str2); // 从字符串str中查找str2
if (strp == NULL)
{
return 0; // 如果没有找到,返回
}
string temp = str;
str3=temp.substr(strlen(str2));//提出除str2外的子句
return 1;
}
int nameget(char *str, const char* str2,string &str3)//提出尾端的子句
{
char* strp = strstr(str, str2); // 从字符串str中查找str2
if (strp == NULL)
{
return 0; // 如果没有找到,返回
}
string temp = str;
str3=temp.substr(0,strlen(str)-strlen(str2));//提出除str2外的子句
return 1;
}
struct NODE
{
double x,y,z;
};
struct CUBE
{
int index[8];
double phys;
};
class _3dtools2msh
{
public:
_3dtools2msh();
~_3dtools2msh();
int meshin(string);
int physin(string);
int findindex();
int mshout(string,double);
private:
double xst,yst,zst;
int xnum,ynum,znum;
double xinter,yinter,zinter;
NODE* node;
CUBE* cube;
int nodenum;
int cubenum;
};
_3dtools2msh::_3dtools2msh()
{
node = NULL;
cube = NULL;
}
_3dtools2msh::~_3dtools2msh()
{
if(node!=NULL) delete[] node;
if(cube!=NULL) delete[] cube;
}
int _3dtools2msh::meshin(string filename)
{
stringstream stemp;
string temp;
int space_num;
int xnum_t,ynum_t,znum_t;
const char* meshname = filename.c_str();
ifstream inmesh;
inmesh.open(meshname);
if (!inmesh)
{
cout<<filename<<" not found!"<<endl;
return 1;
}
else
{
inmesh>>ynum>>xnum>>znum>>yst>>xst>>zst;
inmesh>>temp;
replace_all(temp,"*"," ",space_num);
stemp.clear();
stemp.str(temp);
stemp>>ynum_t>>yinter;
if (ynum!=ynum_t)
{
cout<<"syntax error: "<<filename<<endl;
return 1;
}
inmesh>>temp;
replace_all(temp,"*"," ",space_num);
stemp.clear();
stemp.str(temp);
stemp>>xnum_t>>xinter;
if (xnum!=xnum_t)
{
cout<<"syntax error: "<<filename<<endl;
return 1;
}
inmesh>>temp;
replace_all(temp,"*"," ",space_num);
stemp.clear();
stemp.str(temp);
stemp>>znum_t>>zinter;
if (znum!=znum_t)
{
cout<<"syntax error: "<<filename<<endl;
return 1;
}
inmesh.close();
nodenum = (xnum+1)*(ynum+1)*(znum+1);
node = new NODE [nodenum];
for (int i = 0; i < nodenum; i++)
{
node[i].z = zst + zinter*(i%(znum+1));
node[i].y = yst + yinter*((i/(znum+1))%(ynum+1));
node[i].x = xst + xinter*(i/((znum+1)*(ynum+1)));
}
return 0;
}
}
int _3dtools2msh::physin(string filename)
{
cubenum = xnum*ynum*znum;
cube = new CUBE [cubenum];
for (int i = 0; i < cubenum; i++)
{
cube[i].phys = 0.0;
}
const char* cubename = filename.c_str();
ifstream incube;
incube.open(cubename);
if (!incube)
{
cout<<filename<<" not found!"<<endl;
return 1;
}
else
{
for (int i = 0; i < cubenum; i++)
{
incube>>cube[i].phys;
}
incube.close();
return 0;
}
}
int _3dtools2msh::findindex()
{
for (int i = 0; i < xnum; i++)
{
for (int j = 0; j < ynum; j++)
{
for (int k = 0; k < znum; k++)
{
cube[k+j*znum+i*ynum*znum].index[0]=k+j*(znum+1)+i*(ynum+1)*(znum+1);
cube[k+j*znum+i*ynum*znum].index[1]=k+j*(znum+1)+i*(ynum+1)*(znum+1)+znum+1;
cube[k+j*znum+i*ynum*znum].index[2]=k+j*(znum+1)+i*(ynum+1)*(znum+1)+znum+1+(ynum+1)*(znum+1);
cube[k+j*znum+i*ynum*znum].index[3]=k+j*(znum+1)+i*(ynum+1)*(znum+1)+(ynum+1)*(znum+1);
cube[k+j*znum+i*ynum*znum].index[4]=k+j*(znum+1)+i*(ynum+1)*(znum+1)+1;
cube[k+j*znum+i*ynum*znum].index[5]=k+j*(znum+1)+i*(ynum+1)*(znum+1)+1+znum+1;
cube[k+j*znum+i*ynum*znum].index[6]=k+j*(znum+1)+i*(ynum+1)*(znum+1)+1+znum+1+(ynum+1)*(znum+1);
cube[k+j*znum+i*ynum*znum].index[7]=k+j*(znum+1)+i*(ynum+1)*(znum+1)+1+(ynum+1)*(znum+1);
}
}
}
return 0;
}
int _3dtools2msh::mshout(string filename,double filter)
{
const char* mshname = filename.c_str();
ofstream outmsh;
outmsh.open(mshname);
if (!outmsh)
{
cout<<"fail to create "<<filename<<endl;
return 1;
}
else
{
outmsh<<"$MeshFormat"<<endl<<"2.2 0 8"<<endl<<"$EndMeshFormat"<<endl<<"$Nodes"<<endl<<nodenum<<endl;
for (int i = 0; i < nodenum; i++)
{
outmsh<<i<<" "<<setprecision(16)<<node[i].x<<" "<<node[i].y<<" "<<node[i].z<<endl;
}
outmsh<<"$EndNodes"<<endl<<"$Elements"<<endl<<cubenum<<endl;
for (int i = 0; i < cubenum; i++)
{
outmsh<<i<<" 5 2 5 1 "<<cube[i].index[0]<<" "
<<cube[i].index[1]<<" "
<<cube[i].index[2]<<" "
<<cube[i].index[3]<<" "
<<cube[i].index[4]<<" "
<<cube[i].index[5]<<" "
<<cube[i].index[6]<<" "
<<cube[i].index[7]<<endl;
}
int eleNum = 0;
for (int i = 0; i < cubenum; i++)
{
if (cube[i].phys != filter)
{
eleNum++;
}
}
outmsh<<"$EndElements"<<endl<<"$ElementData"<<endl;
outmsh<<1<<endl<<"\"Recovered model\""<<endl<<1<<endl<<0.0<<endl<<3<<endl<<0<<endl<<1<<endl<<eleNum<<endl;
for (int i = 0; i < cubenum; i++)
{
if (cube[i].phys != filter)
{
outmsh<<i<<" "<<setprecision(16)<<cube[i].phys<<endl;
}
}
outmsh<<"$EndElementData";
outmsh.close();
return 0;
}
}
#endif