#ifndef _TETRA_G_H #define _TETRA_G_H #include "Data_Func.h" #include "res_reg.h" class Tetra_G { public: Tetra_G(); ~Tetra_G(); int info_taker_run(int,string,string,string);//读入必要参数 int info_taker_run(int,string,double*,string,double *);//读入必要参数 int info_taker_run(int,string,double*,string); int info_taker_run(int,string,string,string,double *); int readnode(string);//读取.node文件并保存至结构体vertex int readele(string);//读取.ele文件并保存至结构体tetrahedron int readele(string,double *);//读取.ele文件并保存至结构体tetrahedron int readmsh(string,double *);//读取.msh文件 int field_reader(int,string);//读取观测面信息保存至结构体point3d int manual_input(int,double *);//手工输入计算信息保存至结构体field_point,只适用于水平观测面 int cal_tetra_info();//计算四面体属性 double cal_tetra_gc(point3d);//计算四面体网络在单个观测点的重力异常值 int cal_tetra_ggc(point3d,double &,double &,double &); double cal_tetra_gs(point3d,sphere_point);//计算四面体网络在单个观测点的重力异常值 int cal_tetra_ggs(point3d,sphere_point,double &,double &,double &); int cal_total_g(int,string);//计算所有四面体重力异常,并利用res_reg类进行保存 private: double once_time;//一次四面体到计算值的所用时间 clock_t start,finish; //info_taker_run string nodename; string elename; string mshname; //readnode&&readmsh int vertex_sum; vertex *vert; int edge_sum; edge *edg; int face_sum; face *fac; //readele&&readmsh int tetra_sum; tetra *tet; //readmsh int element_sum; //field_reader&&manual_input int fie_sum; point3d *fie; sphere_point *s_point; //cal_total_g double *_Obdata; double *_Obdata2; double *_Obdata3; }; /************************************************************************/ Tetra_G::Tetra_G() { once_time=2e-7;//通过实验计算得到单次计算耗时 vert = NULL; edg = NULL; fac = NULL; tet = NULL; fie = NULL; s_point = NULL; _Obdata = NULL; _Obdata2 = NULL; _Obdata3 = NULL; } Tetra_G::~Tetra_G() { if(tet!=NULL) { for(int i=0;i>vertex_sum>>temp>>temp>>temp>>first_No; nodein.seekg(-1,ios::cur); vert = new vertex [vertex_sum]; if(first_No==1) { for(int i=0;i>vert[i].No>>vert[i].vt.x>>vert[i].vt.y>>vert[i].vt.z; vert[i].No = i; } finish=clock(); cout<<(double)(finish-start)/CLOCKS_PER_SEC<<" s"<>vert[i].No>>vert[i].vt.x>>vert[i].vt.y>>vert[i].vt.z; } finish=clock(); cout<<(double)(finish-start)/CLOCKS_PER_SEC<<" s"<>tetra_sum>>vertex_num>>attribute_sum>>first_No; elein.seekg(-1,ios::cur); tet = new tetra [tetra_sum]; if(first_No==1) { for(int i=0;i>tet[i].No>>tet[i].ver[0]>>tet[i].ver[1]>>tet[i].ver[2]>>tet[i].ver[3]; for(int j=0;j>tet[i].attribute[j]; } tet[i].No = i; tet[i].ver[0] -= 1; tet[i].ver[1] -= 1; tet[i].ver[2] -= 1; tet[i].ver[3] -= 1; } finish=clock(); cout<<(double)(finish-start)/CLOCKS_PER_SEC<<" s"<>tet[i].No>>tet[i].ver[0]>>tet[i].ver[1]>>tet[i].ver[2]>>tet[i].ver[3]; for(int j=0;j>tet[i].attribute[j]; } } finish=clock(); cout<<(double)(finish-start)/CLOCKS_PER_SEC<<" s"<>tetra_sum>>vertex_num>>attribute_sum>>first_No; elein.seekg(-1,ios::cur); tet = new tetra [tetra_sum]; if(first_No==1) { for(int i=0;i>tet[i].No>>tet[i].ver[0]>>tet[i].ver[1]>>tet[i].ver[2]>>tet[i].ver[3]; tet[i].No = i; tet[i].ver[0] -= 1; tet[i].ver[1] -= 1; tet[i].ver[2] -= 1; tet[i].ver[3] -= 1; } finish=clock(); cout<<(double)(finish-start)/CLOCKS_PER_SEC<<" s"<>tet[i].No>>tet[i].ver[0]>>tet[i].ver[1]>>tet[i].ver[2]>>tet[i].ver[3]; } finish=clock(); cout<<(double)(finish-start)/CLOCKS_PER_SEC<<" s"<>version>>format>>precision; } else if(temp=="$Nodes")//读入node信息 { getline(mshin,temp); stemp.clear(); stemp.str(temp); stemp>>vertex_sum; vert = new vertex [vertex_sum]; for(int i=0;i>vert[i].No>>vert[i].vt.x>>vert[i].vt.y>>vert[i].vt.z; vert[i].No-=1;//.msh文件中点的编号是从1开始的 } } else if(temp=="$Elements")//读入元素信息,保存到相应的链表 { getline(mshin,temp); stemp.clear(); stemp.str(temp); stemp>>element_sum; for(int i=0;i>element_order>>element_type; if(element_type==4)//四面体元素 { stemp>>itemp>>itemp>>itemp>>T1.ver[0]>>T1.ver[1]>>T1.ver[2]>>T1.ver[3]; T1.ver[0]-=1; T1.ver[1]-=1; T1.ver[2]-=1; T1.ver[3]-=1; TetList.push_back(T1); } else if(element_type==1)//边元素 { stemp>>itemp>>itemp>>itemp>>E1.ver[0]>>E1.ver[1]; E1.ver[0]-=1; E1.ver[1]-=1; EdgList.push_back(E1); } else if(element_type==2)//三角形元素 { stemp>>itemp>>itemp>>itemp>>F1.ver[0]>>F1.ver[1]>>F1.ver[2]; F1.ver[0]-=1; F1.ver[1]-=1; F1.ver[2]-=1; FacList.push_back(F1); } else continue; } } } mshin.close(); tetra_sum = TetList.size(); edge_sum = EdgList.size(); face_sum = FacList.size(); tet = new tetra [tetra_sum]; edg = new edge [edge_sum]; fac = new face [face_sum]; count=0; for(it=TetList.begin();it!=TetList.end();++it) { T1 = *it; T1.No = count; tet[count] = T1; count++; } TetList.clear(); count=0; for(ie=EdgList.begin();ie!=EdgList.end();++ie) { E1 = *ie; E1.No = count; edg[count] = E1; count++; } EdgList.clear(); count=0; for(ifac=FacList.begin();ifac!=FacList.end();++ifac) { F1 = *ifac; F1.No = count; fac[count] = F1; count++; } FacList.clear(); for(int i=0;i>fie_sum; fie = new point3d [fie_sum]; if(cal_type==1||cal_type==2) { for(int i=0;i>fie[i].x>>fie[i].y>>fie[i].z; } } else { s_point = new sphere_point [fie_sum]; for(int i=0;i>s_point[i].phi>>s_point[i].thet>>s_point[i].radius; fie[i]=SCS2CCS(s_point[i]); } } finish=clock(); cout<<(double)(finish-start)/CLOCKS_PER_SEC<<" s"<90||_ob[3]<-180||_ob[5]>180||_ob[6]<=0) { cout<<"coordinate out of range! function fail..."; return 1; } s_point = new sphere_point [fie_sum]; for(int i=0;i