#include "macrodef.h" #include "bssn_rhs.h" #include "share_func.h" #include "tool.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 { 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] = { 1.0, 1.0, 1.0}; double AAS[3] = {-1.0, -1.0, 1.0}; double ASA[3] = {-1.0, 1.0, -1.0}; double SAA[3] = { 1.0, -1.0, -1.0}; double ASS[3] = {-1.0, 1.0, 1.0}; double SAS[3] = { 1.0, -1.0, 1.0}; double SSA[3] = { 1.0, 1.0, -1.0}; 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; #if (GAUGE == 2 || GAUGE == 3 || GAUGE == 4 || GAUGE == 5 || GAUGE == 6 || GAUGE == 7) double reta[all]; /* 使用时:reta[idx],其中 idx = i + nx*(j + ny*k) (Fortran列主序) */ #endif #if (GAUGE == 6 || GAUGE == 7) int BHN = 0; double Porg[9] = {0.0}; double Mass[3] = {0.0}; extern "C" { #ifdef fortran1 void getpbh(int &, double *, double *); #elif defined(fortran2) void GETPBH(int &, double *, double *); #else void getpbh_(int &, double *, double *); #endif } #ifdef fortran1 getpbh(BHN, Porg, Mass); #elif defined(fortran2) GETPBH(BHN, Porg, Mass); #else getpbh_(BHN, Porg, Mass); #endif #endif PI = acos(-1.0); dX = X[1] - X[0]; dY = Y[1] - Y[0]; dZ = Z[1] - Z[0]; // 1ms // for(int i=0;i 1) for(int i=0;i 1) for (int i=0;i0){ kodis(ex,X,Y,Z,chi,chi_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,trK,trK_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,dxx,gxx_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,gxy,gxy_rhs,AAS,Symmetry,eps); kodis(ex,X,Y,Z,gxz,gxz_rhs,ASA,Symmetry,eps); kodis(ex,X,Y,Z,dyy,gyy_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,gyz,gyz_rhs,SAA,Symmetry,eps); kodis(ex,X,Y,Z,dzz,gzz_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,Axx,Axx_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,dtSfz,dtSfz_rhs,SSA,Symmetry,eps); kodis(ex,X,Y,Z,Axy,Axy_rhs,AAS,Symmetry,eps); kodis(ex,X,Y,Z,dtSfy,dtSfy_rhs,SAS,Symmetry,eps); kodis(ex,X,Y,Z,Axz,Axz_rhs,ASA,Symmetry,eps); kodis(ex,X,Y,Z,dtSfx,dtSfx_rhs,ASS,Symmetry,eps); kodis(ex,X,Y,Z,Ayy,Ayy_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,betaz,betaz_rhs,SSA,Symmetry,eps); kodis(ex,X,Y,Z,Ayz,Ayz_rhs,SAA,Symmetry,eps); kodis(ex,X,Y,Z,betay,betay_rhs,SAS,Symmetry,eps); kodis(ex,X,Y,Z,Azz,Azz_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,betax,betax_rhs,ASS,Symmetry,eps); kodis(ex,X,Y,Z,Gamx,Gamx_rhs,ASS,Symmetry,eps); kodis(ex,X,Y,Z,Lap,Lap_rhs,SSS,Symmetry,eps); kodis(ex,X,Y,Z,Gamy,Gamy_rhs,SAS,Symmetry,eps); kodis(ex,X,Y,Z,Gamz,Gamz_rhs,SSA,Symmetry,eps); } // 2ms // if(co==0){ for (int i=0;i