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

281 lines
5.5 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 _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