gctl_toolkits/archive/TetraGM/Data_Func.h

281 lines
5.5 KiB
C
Raw Normal View History

2024-09-10 20:25:18 +08:00
#ifndef _DATA_FUNC_H
#define _DATA_FUNC_H
#include <iostream>
#include <fstream>
#include <sstream>
#include <string.h>
#include <cmath>
#include <iomanip>
#include <ctime>
#include <list>
#include <omp.h>
#include <map>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#define G0 6.67191e-3
#define pi 3.1415926535897932384626433832795
#define T0 50000
#define DBL_MAX 1e+36
using namespace std;
// ∏¡øΩ·ππ”Î∫Ø ˝
struct point3d //∂®“ ∏¡øΩ·ππÃÂ
{
double x,y,z;
};
point3d operator -(point3d a, point3d b)//÷ÿ‘ÿºı∫≈≤Ÿ◊˜∑˚◊˜”√”⁄ ∏¡ø
{
point3d m;
m.x=a.x-b.x;
m.y=a.y-b.y;
m.z=a.z-b.z;
return m;
}
point3d operator *(int sign,point3d b)//÷ÿ‘ÿ≥À∫≈≤Ÿ◊˜∑˚◊˜”√”⁄ ∏¡ø
{
point3d m;
m.x=sign*b.x;
m.y=sign*b.y;
m.z=sign*b.z;
return m;
}
bool operator ==(point3d a, point3d b)//÷ÿ‘ÿ¬flº≠µ»≤Ÿ◊˜∑˚◊˜”√”⁄ ∏¡ø
{
if(a.x==b.x&&a.y==b.y&&a.z==b.z)
{
return 1;
}
else return 0;
}
point3d point3d_martix(point3d a,double *m)//∂®“ ∏¡ø«∞≥Àæÿ’Û
{
point3d v;
double ma[3][3];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
ma[i][j] = *(m+i*3+j);
}
}
v.x = a.x*ma[0][0]+a.y*ma[1][0]+a.z*ma[2][0];
v.y = a.x*ma[0][1]+a.y*ma[1][1]+a.z*ma[2][1];
v.z = a.x*ma[0][2]+a.y*ma[1][2]+a.z*ma[2][2];
return v;
}
point3d martix_point3d(point3d a,double *m)//∂®“ ∏¡ø∫Û≥Àæÿ’Û
{
point3d v;
double ma[3][3];
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
ma[i][j] = *(m+i*3+j);
}
}
v.x = a.x*ma[0][0]+a.y*ma[0][1]+a.z*ma[0][2];
v.y = a.x*ma[1][0]+a.y*ma[1][1]+a.z*ma[1][2];
v.z = a.x*ma[2][0]+a.y*ma[2][1]+a.z*ma[2][2];
return v;
}
double dot(point3d a, point3d b)//∂®“ ∏¡øµ„≥À
{
return a.x*b.x+a.y*b.y+a.z*b.z;
}
point3d cross(point3d a,point3d b)//∂®“ ∏¡ø≤Ê≥À
{
point3d v;
v.x = a.y*b.z-a.z*b.y;
v.y = a.z*b.x-a.x*b.z;
v.z = a.x*b.y-a.y*b.x;
return v;
}
double* kron_v(point3d a,point3d b)//∂®“ ∏¡ø’≈¡øª˝
{
double t[3][3];
t[0][0]=a.x*b.x; t[0][1]=a.x*b.y; t[0][2]=a.x*b.z;
t[1][0]=a.y*b.x; t[1][1]=a.y*b.y; t[1][2]=a.y*b.z;
t[2][0]=a.z*b.x; t[2][1]=a.z*b.y; t[2][2]=a.z*b.z;
return t[0];
}
double L_point3d(point3d v)//«Û ∏¡øæ‡◊¯±Í‘≠µ„懿Î
{
return sqrt(v.x*v.x+v.y*v.y+v.z*v.z);
}
double Dis_point3d(point3d a,point3d b)//«Û¡Ω∏ˆ ∏¡ø÷’∂À懿Î
{
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)+pow(a.z-b.z,2));
}
point3d nor_point3d(point3d v)//º∆À„“ª∏ˆ ∏¡øµƒµ•Œª ∏¡ø
{
double Length;
point3d nor_v;
Length = sqrt(v.x*v.x+v.y*v.y+v.z*v.z);
nor_v.x = v.x/Length;
nor_v.y = v.y/Length;
nor_v.z = v.z/Length;
return nor_v;
}
//æÿ’Û∫Ø ˝
double *martix_martix(double *a,double *b)//æÿÛœ‡≥Àa*b
{
double m[3][3],t[3][3],r[3][3];
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
t[i][j] = *(a+i*3+j);
r[i][j] = *(b+i*3+j);
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
m[i][j] = t[i][0]*r[0][j]+t[i][1]*r[1][j]+t[i][2]*r[2][j];
}
}
return m[0];
}
double *martix_T(double *a)//æÿ’Û◊™÷√
{
double m[3][3],r[3][3];
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
r[i][j] = *(a+i*3+j);
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
m[i][j] = r[j][i];
}
}
return m[0];
}
// ˝æ›Ω·ππ”Î≤Ÿ◊˜
////////////////////////////////////////////////////////////////////////
struct F//√Ê’≈¡øª˝
{
double kron[3][3];
};
struct E//±fl’≈¡øª˝
{
double kron[3][3];
};
struct tetra //∂®“ÂÀƒ√ÊÃÂΩ·ππÃÂ
{
int No;//Àƒ√ÊÖÚ∫≈
int ver[4];//œ‡”¶Àƒ√ÊÃÂ∂•µ„–Ú∫≈
int ordered_ver[4][3];//≈≈–Ú∫ÛµƒÀƒ∏ˆ√ʵƒµ„À˜“˝∫≈
double *attribute;//Àƒ√Êàٖ‘÷∏’Î
F F_kron[4];//Àƒ√ÊÃÂ√Ê’≈¡øª˝
E E_kron[6];//Àƒ√Êñfl’≈¡øª˝
double E_len[6];//Àƒ√Êñfl≥§∂»
};
typedef list<tetra> tetra_list;
struct vertex //∂®“Â∂•µ„Ω·ππÃÂ
{
int No;//∂•µ„–Ú∫≈
point3d vt;;//∂•µ„◊¯±Í
};
struct edge
{
int No;
int ver[2];
int nature;
double length;
double E[3][3];
};
typedef list<edge> edge_list;
struct face
{
int No;
int ver[3];
int nature;
double F[3][3];
};
typedef list<face> face_list;
struct sphere_point//«Ú◊¯±Íµ„Ω·ππÃÂ
{
double phi,thet,radius;
};
point3d SCS2CCS(sphere_point p1)//«Ú◊¯±Í◊™÷±Ω«◊¯±Í
{
point3d v;
v.x = p1.radius*sin((0.5-p1.thet/180.0)*pi)*cos((2.0+p1.phi/180.0)*pi);
v.y = p1.radius*sin((0.5-p1.thet/180.0)*pi)*sin((2.0+p1.phi/180.0)*pi);
v.z = p1.radius*cos((0.5-p1.thet/180.0)*pi);
return v;
}
void find_left(int &L1,int &L2,int e,int e2)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(i!=j&&i!=e&&i!=e2&&j!=e&&j!=e2&&i<j)
{
L1=i;
L2=j;
}
}
}
}
int re_order(point3d refer,point3d point1,point3d &point2,point3d &point3)
{
point3d v12=point2-point1;
point3d v23=point3-point2;
point3d v_ref=refer-point1;
point3d v_nor = cross(v12,v23);
if(dot(v_ref,v_nor)>0)
{
point3d temp;
temp=point2;point2=point3;point3=temp;
return 1;
}
else return 0;
}
void re_order2(point3d v1,point3d v2,point3d &ref1,point3d &ref2)
{
point3d v12=v2-v1;
point3d v1ref1=ref1-v1;
point3d v1ref2=ref2-v1;
point3d nor_v121ref1=cross(v12,v1ref1);
if(dot(nor_v121ref1,v1ref2)>0)
{
point3d temp;
temp=ref1;ref1=ref2;ref2=temp;
}
}
#endif