#include "../include/bssn_rhs_compute.h" // 0-based i,j,k // #define IDX_F(i,j,k,nx,ny) ((i) + (j)*(nx) + (k)*(nx)*(ny)) // ex(1)=nx, ex(2)=ny, ex(3)=nz // 用法:a[ IDX_F(i,j,k,nx,ny) ] // C function that calculates the right-hand side for BSSN equations int f_compute_rhs_bssn(int *ex, double &T, double *X, double *Y, double *Z, double *chi, double *trK, double *dxx, double *gxy, double *gxz, double *dyy, double *gyz, double *dzz, double *Axx, double *Axy, double *Axz, double *Ayy, double *Ayz, double *Azz, double *Gamx, double *Gamy, double *Gamz, double *Lap, double *betax, double *betay, double *betaz, double *dtSfx, double *dtSfy, double *dtSfz, double *chi_rhs, double *trK_rhs, double *gxx_rhs, double *gxy_rhs, double *gxz_rhs, double *gyy_rhs, double *gyz_rhs, double *gzz_rhs, double *Axx_rhs, double *Axy_rhs, double *Axz_rhs, double *Ayy_rhs, double *Ayz_rhs, double *Azz_rhs, double *Gamx_rhs, double *Gamy_rhs, double *Gamz_rhs, double *Lap_rhs, double *betax_rhs, double *betay_rhs, double *betaz_rhs, double *dtSfx_rhs, double *dtSfy_rhs, double *dtSfz_rhs, double *rho, double *Sx, double *Sy, double *Sz, double *Sxx, double *Sxy, double *Sxz, double *Syy, double *Syz, double *Szz, double *Gamxxx, double *Gamxxy, double *Gamxxz, double *Gamxyy, double *Gamxyz, double *Gamxzz, double *Gamyxx, double *Gamyxy, double *Gamyxz, double *Gamyyy, double *Gamyyz, double *Gamyzz, double *Gamzxx, double *Gamzxy, double *Gamzxz, double *Gamzyy, double *Gamzyz, double *Gamzzz, double *Rxx, double *Rxy, double *Rxz, double *Ryy, double *Ryz, double *Rzz, double *ham_Res, double *movx_Res, double *movy_Res, double *movz_Res, double *Gmx_Res, double *Gmy_Res, double *Gmz_Res, int &Symmetry, int &Lev, double &eps, int &co ) // return gont { // double t0 = omp_get_wtime(); int nx = ex[0], ny = ex[1], nz=ex[2]; int all = nx*ny*nz; // printf("nx=%d ny=%d nz=%d all=%d\n", nx, ny, nz, all); // temp variable double gxx[all],gyy[all],gzz[all]; double chix[all],chiy[all],chiz[all]; double gxxx[all],gxyx[all],gxzx[all],gyyx[all],gyzx[all],gzzx[all]; double gxxy[all],gxyy[all],gxzy[all],gyyy[all],gyzy[all],gzzy[all]; double gxxz[all],gxyz[all],gxzz[all],gyyz[all],gyzz[all],gzzz[all]; double Lapx[all], Lapy[all], Lapz[all]; double betaxx[all], betaxy[all], betaxz[all]; double betayx[all], betayy[all], betayz[all]; double betazx[all], betazy[all], betazz[all]; double Gamxx[all],Gamxy[all],Gamxz[all]; double Gamyx[all],Gamyy[all],Gamyz[all]; double Gamzx[all],Gamzy[all],Gamzz[all]; double Kx[all], Ky[all], Kz[all], div_beta[all], S[all]; double f[all], fxx[all], fxy[all], fxz[all], fyy[all], fyz[all], fzz[all]; double Gamxa[all], Gamya[all], Gamza[all], alpn1[all], chin1[all]; double gupxx[all], gupxy[all], gupxz[all]; double gupyy[all], gupyz[all], gupzz[all]; double SSS[3],AAS[3],ASA[3],SAA[3],ASS[3],SAS[3],SSA[3]; double dX, dY, dZ, PI; const double ZEO = 0.0, ONE = 1.0, TWO = 2.0, FOUR = 4.0; const double EIGHT = 8.0, HALF = 0.5, THR = 3.0; const double SYM = 1.0, ANTI = -1.0; const double FF = 0.75, eta = 2.0; const double F1o3 = 1.0/3.0, F2o3 = 2.0/3.0, F3o2 = 1.5, F1o6 = 1.0/6.0; const double F16 = 16.0, F8 = 8.0; const int NO_SYMM = 0, EQ_SYMM = 1; const double F1o4 = 2.5e-1; // 1/4 const double F30 = 30.0; const double F1o12 = ONE / 12.0; const double F1o144 = ONE / 144.0; const int ex1 = ex[0], ex2 = ex[1], ex3 = ex[2]; #if (GAUGE == 2 || GAUGE == 3 || GAUGE == 4 || GAUGE == 5) double reta[all]; /* 使用时:reta[idx],其中 idx = i + nx*(j + ny*k) (Fortran列主序) */ #endif PI = acos(-1.0); dX = X[1] - X[0]; dY = Y[1] - Y[0]; dZ = Z[1] - Z[0]; /* 系数:按 Fortran 原式 */ const double Sdxdx = ONE / (dX * dX); const double Sdydy = ONE / (dY * dY); const double Sdzdz = ONE / (dZ * dZ); const double Fdxdx = F1o12 / (dX * dX); const double Fdydy = F1o12 / (dY * dY); const double Fdzdz = F1o12 / (dZ * dZ); const double Sdxdy = F1o4 / (dX * dY); const double Sdxdz = F1o4 / (dX * dZ); const double Sdydz = F1o4 / (dY * dZ); const double Fdxdy = F1o144 / (dX * dY); const double Fdxdz = F1o144 / (dX * dZ); const double Fdydz = F1o144 / (dY * dZ); int iminF = 1, jminF = 1, kminF = 1; if (Symmetry > NO_SYMM && fabs(Z[0]) < dZ) kminF = -1; if (Symmetry > EQ_SYMM && fabs(X[0]) < dX) iminF = -1; if (Symmetry > EQ_SYMM && fabs(Y[0]) < dY) jminF = -1; // fh: (ex1+2)*(ex2+2)*(ex3+2) because ord=2 const size_t nx1 = (size_t)ex1 + 2; const size_t ny1 = (size_t)ex2 + 2; const size_t nz1 = (size_t)ex3 + 2; const size_t fh_size = nx1 * ny1 * nz1; static double *fh = NULL; static size_t cap = 0; if (fh_size > cap) { free(fh); fh = (double*)aligned_alloc(64, fh_size * sizeof(double)); cap = fh_size; } // double *fh = (double*)malloc(fh_size * sizeof(double)); if (!fh) return 1; #pragma omp parallel { int tid = omp_get_thread_num(); // 当前线程号(从 0 开始) int nthr = omp_get_num_threads(); // 当前并行区里的总线程数 int local = all / nthr; int start = tid * local; int end = (tid == nthr - 1) ? all : start + local; // 1ms // for(int i=start;i0){ if(tid==24){ kodis(ex,X,Y,Z,chi,chi_rhs,SSS,Symmetry,eps); }else if(tid==25){ kodis(ex,X,Y,Z,trK,trK_rhs,SSS,Symmetry,eps); }else if(tid==26){ kodis(ex,X,Y,Z,dxx,gxx_rhs,SSS,Symmetry,eps); }else if(tid==27){ kodis(ex,X,Y,Z,gxy,gxy_rhs,AAS,Symmetry,eps); }else if(tid==28){ kodis(ex,X,Y,Z,gxz,gxz_rhs,ASA,Symmetry,eps); }else if(tid==29){ kodis(ex,X,Y,Z,dyy,gyy_rhs,SSS,Symmetry,eps); }else if(tid==30){ kodis(ex,X,Y,Z,gyz,gyz_rhs,SAA,Symmetry,eps); }else if(tid==31){ kodis(ex,X,Y,Z,dzz,gzz_rhs,SSS,Symmetry,eps); }else if(tid==32){ kodis(ex,X,Y,Z,Axx,Axx_rhs,SSS,Symmetry,eps); }else if(tid==33){ kodis(ex,X,Y,Z,Axy,Axy_rhs,AAS,Symmetry,eps); }else if(tid==34){ kodis(ex,X,Y,Z,Axz,Axz_rhs,ASA,Symmetry,eps); }else if(tid==35){ kodis(ex,X,Y,Z,Ayy,Ayy_rhs,SSS,Symmetry,eps); }else if(tid==36){ kodis(ex,X,Y,Z,Ayz,Ayz_rhs,SAA,Symmetry,eps); }else if(tid==37){ kodis(ex,X,Y,Z,Azz,Azz_rhs,SSS,Symmetry,eps); }else if(tid==38){ kodis(ex,X,Y,Z,Gamx,Gamx_rhs,ASS,Symmetry,eps); }else if(tid==39){ kodis(ex,X,Y,Z,Gamy,Gamy_rhs,SAS,Symmetry,eps); }else if(tid==40){ kodis(ex,X,Y,Z,dtSfz,dtSfz_rhs,SSA,Symmetry,eps); }else if(tid==41){ kodis(ex,X,Y,Z,dtSfy,dtSfy_rhs,SAS,Symmetry,eps); }else if(tid==42){ kodis(ex,X,Y,Z,dtSfx,dtSfx_rhs,ASS,Symmetry,eps); }else if(tid==43){ kodis(ex,X,Y,Z,betaz,betaz_rhs,SSA,Symmetry,eps); }else if(tid==44){ kodis(ex,X,Y,Z,betay,betay_rhs,SAS,Symmetry,eps); }else if(tid==45){ kodis(ex,X,Y,Z,betax,betax_rhs,ASS,Symmetry,eps); }else if(tid==46){ kodis(ex,X,Y,Z,Lap,Lap_rhs,SSS,Symmetry,eps); }else if(tid==47){ kodis(ex,X,Y,Z,Gamz,Gamz_rhs,SSA,Symmetry,eps); } } // 2ms // if(co==0){ for (int i=start;i