#include "macrodef.h" #include "bssn_rhs.h" #include "share_func.h" #include "tool.h" #include // 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) ] #ifndef BSSN_KERNEL_FINE_TIMING #define BSSN_KERNEL_FINE_TIMING 0 #endif #if BSSN_KERNEL_FINE_TIMING namespace rhs_kernel_timing { enum Bucket { KB_SETUP_DERIVS = 0, KB_GEOM_GAMMA, KB_RICCI_METRIC, KB_CHI_LAPSE, KB_AIJ_TRK_GAUGE, KB_KO_CONSTRAINT, KB_COUNT }; static double local_bucket_seconds[KB_COUNT]; static const char *bucket_labels[KB_COUNT] = { "setup_derivs", "geom_gamma", "ricci_metric", "chi_lapse", "aij_trk_gauge", "ko_constraint" }; static inline double now_seconds() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return double(ts.tv_sec) + 1.0e-9 * double(ts.tv_nsec); } } extern "C" void f_bssn_rhs_kernel_timing_reset() { for (int i = 0; i < rhs_kernel_timing::KB_COUNT; ++i) rhs_kernel_timing::local_bucket_seconds[i] = 0.0; } extern "C" int f_bssn_rhs_kernel_timing_bucket_count() { return rhs_kernel_timing::KB_COUNT; } extern "C" const double *f_bssn_rhs_kernel_timing_local_seconds() { return rhs_kernel_timing::local_bucket_seconds; } extern "C" const char *f_bssn_rhs_kernel_timing_label(int bucket_index) { if (bucket_index < 0 || bucket_index >= rhs_kernel_timing::KB_COUNT) return "unknown"; return rhs_kernel_timing::bucket_labels[bucket_index]; } #define RHS_KERNEL_TIMER_DECL(var_name) const double var_name = rhs_kernel_timing::now_seconds() #define RHS_KERNEL_TIMER_ADD(bucket_name, var_name) \ rhs_kernel_timing::local_bucket_seconds[int(rhs_kernel_timing::bucket_name)] += \ rhs_kernel_timing::now_seconds() - (var_name) #else extern "C" void f_bssn_rhs_kernel_timing_reset() {} extern "C" int f_bssn_rhs_kernel_timing_bucket_count() { return 0; } extern "C" const double *f_bssn_rhs_kernel_timing_local_seconds() { return 0; } extern "C" const char *f_bssn_rhs_kernel_timing_label(int) { return "disabled"; } #define RHS_KERNEL_TIMER_DECL(var_name) #define RHS_KERNEL_TIMER_ADD(bucket_name, var_name) #endif // 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 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], S[all]; double f[all], fxx[all], fxy[all], fxz[all], fyy[all], fyz[all], fzz[all]; double 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]; RHS_KERNEL_TIMER_DECL(timer_setup_derivs); // 1ms // for(int i=0;i 1) for(int i=0;i 1) for (int i=0;i 1) for(int i=0;i