Compare commits
14 Commits
gpu-maybe-
...
cjy-falcon
| Author | SHA1 | Date | |
|---|---|---|---|
| e4c10eca0f | |||
| 4430d04ee7 | |||
| 74ba5feb86 | |||
| 6f28111a43 | |||
| f638cbc4e8 | |||
| 59a216ad93 | |||
| 52beb4d153 | |||
| ba61702fc0 | |||
| fcd98649f6 | |||
| a5c8188305 | |||
| 383e936e88 | |||
| 531b31e8db | |||
| 30b778daa3 | |||
| db9383e439 |
@@ -31,7 +31,7 @@ GPU_Part = 0.0
|
||||
## Setting the physical system and numerical method
|
||||
|
||||
Symmetry = "equatorial-symmetry" ## Symmetry of System: choose equatorial-symmetry、no-symmetry、octant-symmetry
|
||||
Equation_Class = "BSSN" ## Evolution Equation: choose "BSSN", "BSSN-EScalar", "BSSN-EM", "Z4C"
|
||||
Equation_Class = "BSSN-EScalar" ## Evolution Equation: choose "BSSN", "BSSN-EScalar", "BSSN-EM", "Z4C"
|
||||
## If "BSSN-EScalar" is chosen, it is necessary to set other parameters below
|
||||
Initial_Data_Method = "Ansorg-TwoPuncture" ## initial data method: choose "Ansorg-TwoPuncture", "Lousto-Analytical", "Cao-Analytical", "KerrSchild-Analytical"
|
||||
Time_Evolution_Method = "runge-kutta-45" ## time evolution method: choose "runge-kutta-45"
|
||||
@@ -158,7 +158,7 @@ Detector_Rmax = 160.0 ## farest dector distance
|
||||
|
||||
## Setting the apprent horizon
|
||||
|
||||
AHF_Find = "yes" ## whether to find the apparent horizon: choose "yes" or "no"
|
||||
AHF_Find = "no" ## whether to find the apparent horizon: choose "yes" or "no"
|
||||
|
||||
AHF_Find_Every = 24
|
||||
AHF_Dump_Time = 20.0
|
||||
|
||||
@@ -1,100 +0,0 @@
|
||||
##################################################################
|
||||
##
|
||||
## AMSS-NCKU Plot-Only Restart Script
|
||||
## Author: Xiaoqu / Claude
|
||||
## 2026/05/12
|
||||
##
|
||||
## This script checks for existing output data from AMSS_NCKU_Program.py.
|
||||
## If data exists, it skips all computation and goes directly to plotting,
|
||||
## saving time when plotting was interrupted.
|
||||
## If no data is found, it exits with a message.
|
||||
##
|
||||
##################################################################
|
||||
|
||||
## Guard against re-execution by multiprocessing child processes.
|
||||
if __name__ != '__main__':
|
||||
import sys as _sys
|
||||
_sys.exit(0)
|
||||
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
import AMSS_NCKU_Input as input_data
|
||||
|
||||
##################################################################
|
||||
|
||||
## Construct paths from input configuration
|
||||
File_directory = os.path.join(input_data.File_directory)
|
||||
output_directory = os.path.join(File_directory, "AMSS_NCKU_output")
|
||||
binary_results_directory = os.path.join(output_directory, input_data.Output_directory)
|
||||
figure_directory = os.path.join(File_directory, "figure")
|
||||
|
||||
##################################################################
|
||||
|
||||
## Check whether the required output data files exist
|
||||
|
||||
required_files = [
|
||||
os.path.join(binary_results_directory, "bssn_BH.dat"),
|
||||
os.path.join(binary_results_directory, "bssn_ADMQs.dat"),
|
||||
os.path.join(binary_results_directory, "bssn_psi4.dat"),
|
||||
os.path.join(binary_results_directory, "bssn_constraint.dat"),
|
||||
]
|
||||
|
||||
missing_files = [f for f in required_files if not os.path.exists(f)]
|
||||
|
||||
if missing_files:
|
||||
print(" No existing AMSS_NCKU_Program.py output data found. ")
|
||||
print(" The following required files are missing: ")
|
||||
for f in missing_files:
|
||||
print(f" {f}")
|
||||
print()
|
||||
print(" Please run AMSS_NCKU_Program.py first to generate the simulation data. ")
|
||||
print(" Exiting. ")
|
||||
sys.exit(1)
|
||||
|
||||
print(" Found existing AMSS_NCKU_Program.py output data. " )
|
||||
print(" Skipping all computation and going directly to plotting. " )
|
||||
print()
|
||||
|
||||
## Ensure the figure directory exists (it should, but be safe)
|
||||
os.makedirs(figure_directory, exist_ok=True)
|
||||
|
||||
##################################################################
|
||||
|
||||
## Plot the AMSS-NCKU program results
|
||||
|
||||
import plot_xiaoqu
|
||||
import plot_GW_strain_amplitude_xiaoqu
|
||||
from parallel_plot_helper import run_plot_tasks_parallel
|
||||
|
||||
plot_tasks = []
|
||||
|
||||
## Plot black hole trajectory
|
||||
plot_tasks.append((plot_xiaoqu.generate_puncture_orbit_plot, (binary_results_directory, figure_directory)))
|
||||
plot_tasks.append((plot_xiaoqu.generate_puncture_orbit_plot3D, (binary_results_directory, figure_directory)))
|
||||
|
||||
## Plot black hole separation vs. time
|
||||
plot_tasks.append((plot_xiaoqu.generate_puncture_distence_plot, (binary_results_directory, figure_directory)))
|
||||
|
||||
## Plot gravitational waveforms (psi4 and strain amplitude)
|
||||
for i in range(input_data.Detector_Number):
|
||||
plot_tasks.append((plot_xiaoqu.generate_gravitational_wave_psi4_plot, (binary_results_directory, figure_directory, i)))
|
||||
plot_tasks.append((plot_GW_strain_amplitude_xiaoqu.generate_gravitational_wave_amplitude_plot, (binary_results_directory, figure_directory, i)))
|
||||
|
||||
## Plot ADM mass evolution
|
||||
for i in range(input_data.Detector_Number):
|
||||
plot_tasks.append((plot_xiaoqu.generate_ADMmass_plot, (binary_results_directory, figure_directory, i)))
|
||||
|
||||
## Plot Hamiltonian constraint violation over time
|
||||
for i in range(input_data.grid_level):
|
||||
plot_tasks.append((plot_xiaoqu.generate_constraint_check_plot, (binary_results_directory, figure_directory, i)))
|
||||
|
||||
run_plot_tasks_parallel(plot_tasks)
|
||||
|
||||
## Plot stored binary data (runs serially, not in the parallel pool)
|
||||
plot_xiaoqu.generate_binary_data_plot(binary_results_directory, figure_directory)
|
||||
|
||||
print()
|
||||
print(" Plotting completed successfully. ")
|
||||
print()
|
||||
@@ -198,16 +198,16 @@ int main(int argc, char *argv[])
|
||||
if (myrank == 0)
|
||||
{
|
||||
string out_dir;
|
||||
string filename;
|
||||
map<string, string>::iterator iter;
|
||||
iter = parameters::str_par.find("output dir");
|
||||
if (iter != parameters::str_par.end())
|
||||
{
|
||||
out_dir = iter->second;
|
||||
}
|
||||
filename = out_dir + "/setting.par";
|
||||
ofstream setfile;
|
||||
setfile.open(filename.c_str(), ios::trunc);
|
||||
char filename[50];
|
||||
map<string, string>::iterator iter;
|
||||
iter = parameters::str_par.find("output dir");
|
||||
if (iter != parameters::str_par.end())
|
||||
{
|
||||
out_dir = iter->second;
|
||||
}
|
||||
sprintf(filename, "%s/setting.par", out_dir.c_str());
|
||||
ofstream setfile;
|
||||
setfile.open(filename, ios::trunc);
|
||||
|
||||
if (!setfile.good())
|
||||
{
|
||||
@@ -484,11 +484,7 @@ int main(int argc, char *argv[])
|
||||
cout << endl;
|
||||
}
|
||||
|
||||
// Let the process teardown reclaim the simulation object. Some derived
|
||||
// equation classes keep MPI/CUDA-backed state whose destructor ordering
|
||||
// is fragile at program shutdown.
|
||||
if (getenv("AMSS_DELETE_ADM_ON_EXIT"))
|
||||
delete ADM;
|
||||
delete ADM;
|
||||
|
||||
//=======================caculation done=============================================================
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -102,16 +102,6 @@ public:
|
||||
//-1: means no dumy dimension at all; 0: means rho; 1: means sigma
|
||||
};
|
||||
|
||||
// Thread-safe search result (no pointers to shared mutable state)
|
||||
struct PointSearchResult
|
||||
{
|
||||
bool found;
|
||||
Block *Bg;
|
||||
double gx, gy, gz; // global Cartesian coordinates
|
||||
double lx, ly, lz; // local coordinates within the found block
|
||||
int ssst; // source shell-patch type (-1 = Cartesian)
|
||||
};
|
||||
|
||||
int myrank;
|
||||
int shape[dim]; // for (rho, sigma, R), for rho and sigma means number of points for every pi/2
|
||||
double Rrange[2]; // for Rmin and Rmax
|
||||
@@ -185,12 +175,6 @@ public:
|
||||
MyList<Patch> *Pp, double CDH[dim], MyList<pointstru> *pss);
|
||||
bool prolongpointstru(MyList<pointstru> *&psul, bool ssyn, int tsst, MyList<ss_patch> *sPp, double DH[dim],
|
||||
MyList<Patch> *Pp, double CDH[dim], double x, double y, double z, int Symmetry, int rank_in);
|
||||
// Read-only point search — thread-safe (no shared mutable state modified)
|
||||
PointSearchResult prolongpointstru_search(bool ssyn, int tsst, MyList<ss_patch> *sPp, double DH[dim],
|
||||
MyList<Patch> *Pp, double CDH[dim], double x, double y, double z,
|
||||
int Symmetry, int rank_in);
|
||||
// Append a search result to a linked list — use inside omp critical section
|
||||
void prolongpointstru_append(MyList<pointstru> *&psul, const PointSearchResult &sr, int tsst);
|
||||
void setupintintstuff(int cpusize, MyList<Patch> *CPatL, int Symmetry);
|
||||
void intertransfer(MyList<pointstru> **src, MyList<pointstru> **dst,
|
||||
MyList<var> *VarList1 /* source */, MyList<var> *VarList2 /*target */,
|
||||
@@ -211,11 +195,11 @@ public:
|
||||
bool Interp_One_Point(MyList<var> *VarList,
|
||||
double *XX, /*input global Cartesian coordinate*/
|
||||
double *Shellf, int Symmetry);
|
||||
void write_Pablo_file_ss(int *ext, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax,
|
||||
char *filename, int sst);
|
||||
double L2Norm(var *vf);
|
||||
void L2Norm7(var **vf, double *norms);
|
||||
void Find_Maximum(MyList<var> *VarList, double *XX, double *Shellf);
|
||||
};
|
||||
void write_Pablo_file_ss(int *ext, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax,
|
||||
char *filename, int sst);
|
||||
double L2Norm(var *vf);
|
||||
void L2Norm7(var **vf, double *norms);
|
||||
void Find_Maximum(MyList<var> *VarList, double *XX, double *Shellf);
|
||||
};
|
||||
|
||||
#endif /* SHELLPATCH_H */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -54,17 +54,21 @@ public:
|
||||
void Interp_Constraint();
|
||||
void Constraint_Out();
|
||||
|
||||
protected:
|
||||
var *Sphio, *Spio;
|
||||
var *Sphi0, *Spi0;
|
||||
protected:
|
||||
var *Sphio, *Spio;
|
||||
var *Sphi0, *Spi0;
|
||||
var *Sphi, *Spi;
|
||||
var *Sphi1, *Spi1;
|
||||
var *Sphi_rhs, *Spi_rhs;
|
||||
|
||||
var *Cons_fR;
|
||||
|
||||
monitor *MaxScalar_Monitor;
|
||||
};
|
||||
|
||||
var *Cons_fR;
|
||||
|
||||
MyList<var> *BSSNStateList, *BSSNSynchList_pre, *BSSNSynchList_cor;
|
||||
MyList<var> *ScalarSynchList_pre, *ScalarSynchList_cor;
|
||||
Parallel::SyncCache *sync_cache_scalar_pre, *sync_cache_scalar_cor;
|
||||
|
||||
monitor *MaxScalar_Monitor;
|
||||
};
|
||||
|
||||
#endif /* BSSNESCALAR_CLASS_H */
|
||||
|
||||
|
||||
@@ -3,11 +3,143 @@
|
||||
!! note that the potential for scalar field in F(R) gravity
|
||||
!! is defined in the file Set_Rho_ADM.f90
|
||||
|
||||
#include "macrodef.fh"
|
||||
|
||||
! rhs for scalar and GR variables
|
||||
! here we consider vacuum spacetime only
|
||||
function compute_rhs_bssn_escalar(ex, T,X, Y, Z, &
|
||||
#include "macrodef.fh"
|
||||
|
||||
! scalar RHS and stress-energy only; BSSN RHS can be supplied by CUDA.
|
||||
function compute_rhs_bssn_escalar_matter(ex, T, X, Y, Z, &
|
||||
chi , trK , &
|
||||
dxx , gxy , gxz , dyy , gyz , dzz, &
|
||||
Axx , Axy , Axz , Ayy , Ayz , Azz, &
|
||||
Gamx , Gamy , Gamz , &
|
||||
Lap , betax , betay , betaz , &
|
||||
dtSfx , dtSfy , dtSfz , &
|
||||
Sphi , Spi , &
|
||||
Sphi_rhs , Spi_rhs , &
|
||||
rho,Sx,Sy,Sz,Sxx,Sxy,Sxz,Syy,Syz,Szz, &
|
||||
Symmetry,Lev,eps) result(gont)
|
||||
implicit none
|
||||
|
||||
integer,intent(in ):: ex(1:3), Symmetry,Lev
|
||||
real*8, intent(in ):: T
|
||||
real*8, intent(in ):: X(1:ex(1)),Y(1:ex(2)),Z(1:ex(3))
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(inout) :: chi,dxx,dyy,dzz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(in ) :: trK
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(in ) :: gxy,gxz,gyz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(in ) :: Axx,Axy,Axz,Ayy,Ayz,Azz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(in ) :: Gamx,Gamy,Gamz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(inout) :: Lap, betax, betay, betaz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(in ) :: dtSfx, dtSfy, dtSfz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(in ) :: Sphi,Spi
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(out) :: Sphi_rhs,Spi_rhs
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(inout) :: rho,Sx,Sy,Sz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)),intent(inout) :: Sxx,Sxy,Sxz,Syy,Syz,Szz
|
||||
real*8,intent(in) :: eps
|
||||
integer::gont
|
||||
|
||||
real*8, dimension(ex(1),ex(2),ex(3)) :: gxx,gyy,gzz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)) :: chix,chiy,chiz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)) :: Lapx,Lapy,Lapz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)) :: Kx,Ky,Kz,S
|
||||
real*8, dimension(ex(1),ex(2),ex(3)) :: f,fxx,fxy,fxz,fyy,fyz,fzz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)) :: alpn1,chin1
|
||||
real*8, dimension(ex(1),ex(2),ex(3)) :: gupxx,gupxy,gupxz
|
||||
real*8, dimension(ex(1),ex(2),ex(3)) :: gupyy,gupyz,gupzz
|
||||
|
||||
real*8 :: dX
|
||||
real*8, parameter :: ZEO=0.d0, ONE = 1.D0, TWO = 2.D0, HALF = 0.5D0
|
||||
real*8, parameter :: SYM = 1.D0
|
||||
|
||||
dX = sum(chi)+sum(trK)+sum(dxx)+sum(gxy)+sum(gxz)+sum(dyy)+sum(gyz)+sum(dzz) &
|
||||
+sum(Gamx)+sum(Gamy)+sum(Gamz) &
|
||||
+sum(Lap)+sum(Sphi)+sum(Spi)
|
||||
if(dX.ne.dX) then
|
||||
if(sum(chi).ne.sum(chi))write(*,*)"bssn_escalar_matter: find NaN in chi"
|
||||
if(sum(trK).ne.sum(trK))write(*,*)"bssn_escalar_matter: find NaN in trk"
|
||||
if(sum(dxx).ne.sum(dxx))write(*,*)"bssn_escalar_matter: find NaN in dxx"
|
||||
if(sum(gxy).ne.sum(gxy))write(*,*)"bssn_escalar_matter: find NaN in gxy"
|
||||
if(sum(gxz).ne.sum(gxz))write(*,*)"bssn_escalar_matter: find NaN in gxz"
|
||||
if(sum(dyy).ne.sum(dyy))write(*,*)"bssn_escalar_matter: find NaN in dyy"
|
||||
if(sum(gyz).ne.sum(gyz))write(*,*)"bssn_escalar_matter: find NaN in gyz"
|
||||
if(sum(dzz).ne.sum(dzz))write(*,*)"bssn_escalar_matter: find NaN in dzz"
|
||||
if(sum(Gamx).ne.sum(Gamx))write(*,*)"bssn_escalar_matter: find NaN in Gamx"
|
||||
if(sum(Gamy).ne.sum(Gamy))write(*,*)"bssn_escalar_matter: find NaN in Gamy"
|
||||
if(sum(Gamz).ne.sum(Gamz))write(*,*)"bssn_escalar_matter: find NaN in Gamz"
|
||||
if(sum(Lap).ne.sum(Lap))write(*,*)"bssn_escalar_matter: find NaN in Lap"
|
||||
if(sum(Sphi).ne.sum(Sphi))write(*,*)"bssn_escalar_matter: find NaN in Sphi"
|
||||
if(sum(Spi).ne.sum(Spi))write(*,*)"bssn_escalar_matter: find NaN in Spi"
|
||||
gont = 1
|
||||
return
|
||||
endif
|
||||
|
||||
alpn1 = Lap + ONE
|
||||
chin1 = chi + ONE
|
||||
gxx = dxx + ONE
|
||||
gyy = dyy + ONE
|
||||
gzz = dzz + ONE
|
||||
|
||||
call fderivs(ex,chi,chix,chiy,chiz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
|
||||
call fderivs(ex,Lap,Lapx,Lapy,Lapz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
|
||||
|
||||
gupzz = gxx * gyy * gzz + gxy * gyz * gxz + gxz * gxy * gyz - &
|
||||
gxz * gyy * gxz - gxy * gxy * gzz - gxx * gyz * gyz
|
||||
gupxx = ( gyy * gzz - gyz * gyz ) / gupzz
|
||||
gupxy = - ( gxy * gzz - gyz * gxz ) / gupzz
|
||||
gupxz = ( gxy * gyz - gyy * gxz ) / gupzz
|
||||
gupyy = ( gxx * gzz - gxz * gxz ) / gupzz
|
||||
gupyz = - ( gxx * gyz - gxy * gxz ) / gupzz
|
||||
gupzz = ( gxx * gyy - gxy * gxy ) / gupzz
|
||||
|
||||
#if 1
|
||||
Sphi_rhs = alpn1 * Spi
|
||||
call fderivs(ex,Sphi,Kx,Ky,Kz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
|
||||
call fdderivs(ex,Sphi,fxx,fxy,fxz,fyy,fyz,fzz,X,Y,Z,SYM,SYM,SYM,Symmetry,Lev)
|
||||
Spi_rhs = gupxx * fxx + gupyy * fyy + gupzz * fzz + &
|
||||
( gupxy * fxy + gupxz * fxz + gupyz * fyz ) * TWO - &
|
||||
((Gamx+(gupxx*chix+gupxy*chiy+gupxz*chiz)/TWO/chin1)*Kx &
|
||||
+ (Gamy+(gupxy*chix+gupyy*chiy+gupyz*chiz)/TWO/chin1)*Ky &
|
||||
+ (Gamz+(gupxz*chix+gupyz*chiy+gupzz*chiz)/TWO/chin1)*Kz)
|
||||
Spi_rhs = Spi_rhs*alpn1 + &
|
||||
(gupxx*Lapx*Kx + gupxy*Lapx*Ky + gupxz*Lapx*Kz &
|
||||
+gupxy*Lapy*Kx + gupyy*Lapy*Ky + gupyz*Lapy*Kz &
|
||||
+gupxz*Lapz*Kx + gupyz*Lapz*Ky + gupzz*Lapz*Kz)
|
||||
|
||||
call frpotential(ex,Sphi,f,S)
|
||||
Spi_rhs = Spi_rhs*chin1 + alpn1*(trK*Spi - S)
|
||||
rho = chin1*((gupxx * Kx * Kx + gupyy * Ky * Ky + gupzz * Kz * Kz)/TWO + &
|
||||
gupxy * Kx * Ky + gupxz * Kx * Kz + gupyz * Ky * Kz ) &
|
||||
+ Spi*Spi/TWO+f
|
||||
Sx = -Spi*Kx
|
||||
Sy = -Spi*Ky
|
||||
Sz = -Spi*Kz
|
||||
f = (rho - Spi*Spi)/chin1
|
||||
Sxx = Kx*Kx-f*gxx
|
||||
Sxy = Kx*Ky-f*gxy
|
||||
Sxz = Kx*Kz-f*gxz
|
||||
Syy = Ky*Ky-f*gyy
|
||||
Syz = Ky*Kz-f*gyz
|
||||
Szz = Kz*Kz-f*gzz
|
||||
#else
|
||||
Sphi_rhs = ZEO
|
||||
Spi_rhs = ZEO
|
||||
rho = ZEO
|
||||
Sx = ZEO
|
||||
Sy = ZEO
|
||||
Sz = ZEO
|
||||
Sxx = ZEO
|
||||
Sxy = ZEO
|
||||
Sxz = ZEO
|
||||
Syy = ZEO
|
||||
Syz = ZEO
|
||||
Szz = ZEO
|
||||
#endif
|
||||
|
||||
gont = 0
|
||||
return
|
||||
end function compute_rhs_bssn_escalar_matter
|
||||
|
||||
! rhs for scalar and GR variables
|
||||
! here we consider vacuum spacetime only
|
||||
function compute_rhs_bssn_escalar(ex, T,X, Y, Z, &
|
||||
chi , trK , &
|
||||
dxx , gxy , gxz , dyy , gyz , dzz, &
|
||||
Axx , Axy , Axz , Ayy , Ayz , Azz, &
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -144,7 +144,7 @@ public:
|
||||
bssn_class(double Couranti, double StartTimei, double TotalTimei, double DumpTimei, double d2DumpTimei, double CheckTimei, double AnasTimei,
|
||||
int Symmetryi, int checkruni, char *checkfilenamei, double numepssi, double numepsbi, double numepshi,
|
||||
int a_levi, int maxli, int decni, double maxrexi, double drexi);
|
||||
virtual ~bssn_class();
|
||||
~bssn_class();
|
||||
|
||||
void Evolve(int Steps);
|
||||
void RecursiveStep(int lev);
|
||||
@@ -178,14 +178,17 @@ public:
|
||||
virtual void Initialize();
|
||||
virtual void Read_Ansorg();
|
||||
virtual void Read_Pablo() {};
|
||||
virtual void Compute_Psi4(int lev);
|
||||
virtual void Step(int lev, int YN);
|
||||
virtual void Interp_Constraint(bool infg);
|
||||
virtual void Constraint_Out();
|
||||
virtual void Compute_Constraint();
|
||||
|
||||
#ifdef With_AHF
|
||||
protected:
|
||||
virtual void Compute_Psi4(int lev);
|
||||
virtual void Step(int lev, int YN);
|
||||
virtual void Interp_Constraint(bool infg);
|
||||
virtual void Constraint_Out();
|
||||
virtual void Compute_Constraint();
|
||||
|
||||
protected:
|
||||
void Initialize_Level_Runtime();
|
||||
|
||||
#ifdef With_AHF
|
||||
protected:
|
||||
MyList<var> *AHList, *AHDList, *GaugeList;
|
||||
int AHfindevery;
|
||||
double AHdumptime;
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
|
||||
#ifndef BSSN_GPU_H_
|
||||
#define BSSN_GPU_H_
|
||||
#include "bssn_macro.h"
|
||||
#include "macrodef.h"
|
||||
|
||||
#define DEVICE_ID 0
|
||||
// #define DEVICE_ID_BY_MPI_RANK
|
||||
#define GRID_DIM 256
|
||||
#define BLOCK_DIM 128
|
||||
|
||||
#define _FH2_(i, j, k) fh[(i) + (j) * _1D_SIZE[2] + (k) * _2D_SIZE[2]]
|
||||
#define _FH3_(i, j, k) fh[(i) + (j) * _1D_SIZE[3] + (k) * _2D_SIZE[3]]
|
||||
#define pow2(x) ((x) * (x))
|
||||
#define TimeBetween(a, b) ((b.tv_sec - a.tv_sec) + (b.tv_usec - a.tv_usec) / 1000000.0f)
|
||||
#define M_ metac.
|
||||
#define Mh_ meta->
|
||||
#define Ms_ metassc.
|
||||
#define Msh_ metass->
|
||||
|
||||
// #define TIMING
|
||||
|
||||
#define RHS_SS_PARA int calledby, int mpi_rank, int *ex, double &T, double *crho, double *sigma, double *R, double *X, double *Y, double *Z, double *drhodx, double *drhody, double *drhodz, double *dsigmadx, double *dsigmady, double *dsigmadz, double *dRdx, double *dRdy, double *dRdz, double *drhodxx, double *drhodxy, double *drhodxz, double *drhodyy, double *drhodyz, double *drhodzz, double *dsigmadxx, double *dsigmadxy, double *dsigmadxz, double *dsigmadyy, double *dsigmadyz, double *dsigmadzz, double *dRdxx, double *dRdxy, double *dRdxz, double *dRdyy, double *dRdyz, double *dRdzz, 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 &sst, int &co
|
||||
|
||||
/** main function */
|
||||
int gpu_rhs(int calledby, int mpi_rank, 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);
|
||||
|
||||
int gpu_rhs_ss(RHS_SS_PARA);
|
||||
|
||||
#define Z4C_SS_PARA int calledby, int mpi_rank, int *ex, double &T, double *crho, double *sigma, double *R, double *X, double *Y, double *Z, double *drhodx, double *drhody, double *drhodz, double *dsigmadx, double *dsigmady, double *dsigmadz, double *dRdx, double *dRdy, double *dRdz, double *drhodxx, double *drhodxy, double *drhodxz, double *drhodyy, double *drhodyz, double *drhodzz, double *dsigmadxx, double *dsigmadxy, double *dsigmadxz, double *dsigmadyy, double *dsigmadyz, double *dsigmadzz, double *dRdxx, double *dRdxy, double *dRdxz, double *dRdyy, double *dRdyz, double *dRdzz, 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 *TZ, 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 *TZ_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 &sst, int &co
|
||||
|
||||
int gpu_rhs_z4c_ss(Z4C_SS_PARA);
|
||||
|
||||
#endif
|
||||
@@ -20,14 +20,12 @@ using namespace std;
|
||||
|
||||
__device__ volatile unsigned int global_count = 0;
|
||||
|
||||
#ifdef RESULT_CHECK
|
||||
void compare_result_gpu(int ftag1,double * datac,int data_num){
|
||||
double * data = (double*)malloc(sizeof(double)*data_num);
|
||||
cudaMemcpy(data, datac, data_num * sizeof(double), cudaMemcpyDeviceToHost);
|
||||
compare_result(ftag1,data,data_num);
|
||||
free(data);
|
||||
}
|
||||
#endif
|
||||
|
||||
__global__ void sub_symmetry_bd_ss_partF(int ord, double * func, double *funcc)
|
||||
{
|
||||
@@ -155,11 +153,11 @@ __global__ void sub_symmetry_bd_ss_partJ(int ord,double * func, double * funcc,d
|
||||
|
||||
inline void sub_symmetry_bd_ss(int ord,double * func, double * funcc,double * SoA){
|
||||
sub_symmetry_bd_ss_partF<<<GRID_DIM,BLOCK_DIM>>>(ord,func,funcc);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
sub_symmetry_bd_ss_partI<<<GRID_DIM,BLOCK_DIM>>>(ord,func,funcc,SoA[0]);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
sub_symmetry_bd_ss_partJ<<<GRID_DIM,BLOCK_DIM>>>(ord,func,funcc,SoA[1]);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
}
|
||||
|
||||
__global__ void sub_fderivs_shc_part1(double *fx,double *fy,double *fz){
|
||||
@@ -249,13 +247,13 @@ inline void sub_fderivs_shc(int& sst,double * f,double * fh,double *fx,double *f
|
||||
//cudaMemset(Msh_ gy,0,h_3D_SIZE[0] * sizeof(double));
|
||||
//cudaMemset(Msh_ gz,0,h_3D_SIZE[0] * sizeof(double));
|
||||
sub_symmetry_bd_ss(2,f,fh,SoA1);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
//compare_result_gpu(0,fh,h_3D_SIZE[2]);
|
||||
sub_fderivs_sh<<<GRID_DIM,BLOCK_DIM>>>(fh,Msh_ gx,Msh_ gy,Msh_ gz);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
sub_fderivs_shc_part1<<<GRID_DIM,BLOCK_DIM>>>(fx,fy,fz);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
//compare_result_gpu(1,fx,h_3D_SIZE[0]);
|
||||
//compare_result_gpu(2,fy,h_3D_SIZE[0]);
|
||||
//compare_result_gpu(3,fz,h_3D_SIZE[0]);
|
||||
@@ -453,17 +451,17 @@ inline void sub_fdderivs_shc(int& sst,double * f,double * fh,
|
||||
|
||||
//fderivs_sh
|
||||
sub_symmetry_bd_ss(2,f,fh,SoA1);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
//compare_result_gpu(1,fh,h_3D_SIZE[2]);
|
||||
sub_fderivs_sh<<<GRID_DIM,BLOCK_DIM>>>(fh,Msh_ gx,Msh_ gy,Msh_ gz);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
//fdderivs_sh
|
||||
sub_symmetry_bd_ss(2,f,fh,SoA1);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
//compare_result_gpu(21,fh,h_3D_SIZE[2]);
|
||||
sub_fdderivs_sh<<<GRID_DIM,BLOCK_DIM>>>(fh,Msh_ gxx,Msh_ gxy,Msh_ gxz,Msh_ gyy,Msh_ gyz,Msh_ gzz);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
/*compare_result_gpu(11,Msh_ gx,h_3D_SIZE[0]);
|
||||
compare_result_gpu(12,Msh_ gy,h_3D_SIZE[0]);
|
||||
compare_result_gpu(13,Msh_ gz,h_3D_SIZE[0]);
|
||||
@@ -474,7 +472,7 @@ inline void sub_fdderivs_shc(int& sst,double * f,double * fh,
|
||||
compare_result_gpu(5,Msh_ gyz,h_3D_SIZE[0]);
|
||||
compare_result_gpu(6,Msh_ gzz,h_3D_SIZE[0]);*/
|
||||
sub_fdderivs_shc_part1<<<GRID_DIM,BLOCK_DIM>>>(fxx,fxy,fxz,fyy,fyz,fzz);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
/*compare_result_gpu(1,fxx,h_3D_SIZE[0]);
|
||||
compare_result_gpu(2,fxy,h_3D_SIZE[0]);
|
||||
compare_result_gpu(3,fxz,h_3D_SIZE[0]);
|
||||
@@ -498,9 +496,9 @@ __global__ void computeRicci_ss_part1(double * dst)
|
||||
inline void computeRicci_ss(int &sst,double * src,double* dst,double * SoA, Meta* meta)
|
||||
{
|
||||
sub_fdderivs_shc(sst,src,Mh_ fh,Mh_ fxx,Mh_ fxy,Mh_ fxz,Mh_ fyy,Mh_ fyz,Mh_ fzz,SoA);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
computeRicci_ss_part1<<<GRID_DIM,BLOCK_DIM>>>(dst);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
}
|
||||
__global__ void sub_lopsided_ss_part1(double * dst)
|
||||
@@ -518,9 +516,9 @@ __global__ void sub_lopsided_ss_part1(double * dst)
|
||||
inline void sub_lopsided_ss(int& sst,double *src,double* dst,double *SoA)
|
||||
{
|
||||
sub_fderivs_shc(sst,src,Mh_ fh,Mh_ fxx,Mh_ fxy,Mh_ fxz,SoA);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
sub_lopsided_ss_part1<<<GRID_DIM,BLOCK_DIM>>>(dst);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
}
|
||||
|
||||
__global__ void sub_kodis_sh_part1(double *f,double *fh,double *f_rhs)
|
||||
@@ -592,11 +590,11 @@ inline void sub_kodis_ss(int &sst,double *f,double *fh,double *f_rhs,double *SoA
|
||||
}
|
||||
//compare_result_gpu(10,f,h_3D_SIZE[0]);
|
||||
sub_symmetry_bd_ss(3,f,fh,SoA1);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
//compare_result_gpu(0,fh,h_3D_SIZE[3]);
|
||||
|
||||
sub_kodis_sh_part1<<<GRID_DIM,BLOCK_DIM>>>(f,fh,f_rhs);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
//compare_result_gpu(1,f_rhs,h_3D_SIZE[0]);
|
||||
}
|
||||
|
||||
@@ -1701,7 +1699,7 @@ void destroy_meta(Meta *meta,Metass *metass)
|
||||
if(Msh_ gzz) cudaFree(Msh_ gzz);
|
||||
|
||||
#if (GAUGE == 2 || GAUGE == 3 || GAUGE == 4 || GAUGE == 5 || GAUGE == 6 || GAUGE == 7)
|
||||
if(Mh_ reta) cudaFree(Mh_ reta);
|
||||
if(Mh_ reta) CUDA_SAFE_CALL(cudaFree(Mh_ reta));
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1897,7 +1895,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
|
||||
//1.2 local Data
|
||||
cudaMalloc((void**)&(Mh_ gxx), matrix_size * sizeof(double));
|
||||
cudaMalloc((void**)&(Mh_ gyy), matrix_size * sizeof(double));
|
||||
CUDA_SAFE_CALL( cudaMalloc((void**)&(Mh_ gyy), matrix_size * sizeof(double)));
|
||||
cudaMalloc((void**)&(Mh_ gzz), matrix_size * sizeof(double));
|
||||
cudaMalloc((void**)&(Mh_ chix), matrix_size * sizeof(double));
|
||||
cudaMalloc((void**)&(Mh_ chiy), matrix_size * sizeof(double));
|
||||
@@ -2162,7 +2160,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
|
||||
double tmp_con2 = 1/Mass[0] - tmp_con;
|
||||
cudaMemcpyToSymbol(C1, &tmp_con2, sizeof(double));
|
||||
tmp_con2 = 1/Mass[1] - tmp_con;
|
||||
double tmp_con2 = 1/Mass[1] - tmp_con;
|
||||
cudaMemcpyToSymbol(C2, &tmp_con2, sizeof(double));
|
||||
|
||||
|
||||
@@ -2235,7 +2233,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
if((sst == 2 || sst == 4) && abs[1] < dYh)
|
||||
{
|
||||
ijkmin_h[1] = -2;
|
||||
ijkmin3_h[1] = -3;
|
||||
ijkmin_h[1] = -3;
|
||||
}
|
||||
if((sst == 3 || sst == 5) && abs_Y_ex2 < dYh)
|
||||
{
|
||||
@@ -2289,13 +2287,13 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
|
||||
|
||||
#ifdef TIMING1
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
gettimeofday(&tv2, NULL);
|
||||
cout<<"TIME USED"<<TimeBetween(tv1, tv2)<<endl;
|
||||
#endif
|
||||
//cout<<"GPU meta data ready.\n";
|
||||
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
|
||||
//-------------get device info-------------------------------------
|
||||
@@ -2308,7 +2306,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
//sub_enforce_ga(matrix_size);
|
||||
//4.1-----compute rhs---------
|
||||
compute_rhs_ss_part1<<<GRID_DIM,BLOCK_DIM>>>();
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
sub_fderivs_shc(sst,Mh_ betax,Mh_ fh,Mh_ betaxx,Mh_ betaxy,Mh_ betaxz,ass);
|
||||
sub_fderivs_shc(sst,Mh_ betay,Mh_ fh,Mh_ betayx,Mh_ betayy,Mh_ betayz,sas);
|
||||
@@ -2324,7 +2322,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
sub_fderivs_shc(sst,Mh_ gyz,Mh_ fh,Mh_ gyzx,Mh_ gyzy,Mh_ gyzz, saa);
|
||||
|
||||
compute_rhs_ss_part2<<<GRID_DIM,BLOCK_DIM>>>();
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
sub_fdderivs_shc(sst,Mh_ betax,Mh_ fh,Mh_ gxxx,Mh_ gxyx,Mh_ gxzx,Mh_ gyyx,Mh_ gyzx,Mh_ gzzx,ass);
|
||||
sub_fdderivs_shc(sst,Mh_ betay,Mh_ fh,Mh_ gxxy,Mh_ gxyy,Mh_ gxzy,Mh_ gyyy,Mh_ gyzy,Mh_ gzzy,sas);
|
||||
@@ -2334,7 +2332,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
sub_fderivs_shc( sst,Mh_ Gamz, Mh_ fh,Mh_ Gamzx, Mh_ Gamzy, Mh_ Gamzz,ssa);
|
||||
|
||||
compute_rhs_ss_part3<<<GRID_DIM,BLOCK_DIM>>>();
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
computeRicci_ss(sst,Mh_ dxx,Mh_ Rxx,sss, meta);
|
||||
computeRicci_ss(sst,Mh_ dyy,Mh_ Ryy,sss, meta);
|
||||
@@ -2342,25 +2340,25 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
computeRicci_ss(sst,Mh_ gxy,Mh_ Rxy,aas, meta);
|
||||
computeRicci_ss(sst,Mh_ gxz,Mh_ Rxz,asa, meta);
|
||||
computeRicci_ss(sst,Mh_ gyz,Mh_ Ryz,saa, meta);
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
compute_rhs_ss_part4<<<GRID_DIM,BLOCK_DIM>>>();
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
sub_fdderivs_shc(sst,Mh_ chi,Mh_ fh,Mh_ fxx,Mh_ fxy,Mh_ fxz,Mh_ fyy,Mh_ fyz,Mh_ fzz,sss);
|
||||
|
||||
//cudaDeviceSynchronize();
|
||||
//cudaThreadSynchronize();
|
||||
//compare_result_gpu(0,Mh_ chi,h_3D_SIZE[0]);
|
||||
//compare_result_gpu(1,Mh_ chi,h_3D_SIZE[0]);
|
||||
//compare_result_gpu(2,Mh_ fyz,h_3D_SIZE[0]);
|
||||
|
||||
compute_rhs_ss_part5<<<GRID_DIM,BLOCK_DIM>>>();
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
sub_fdderivs_shc(sst,Mh_ Lap,Mh_ fh,Mh_ fxx,Mh_ fxy,Mh_ fxz,Mh_ fyy,Mh_ fyz,Mh_ fzz,sss);
|
||||
|
||||
compute_rhs_ss_part6<<<GRID_DIM,BLOCK_DIM>>>();
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
#if (GAUGE == 2 || GAUGE == 3 || GAUGE == 4 || GAUGE == 5)
|
||||
sub_fderivs_shc(sst,Mh_ chi,Mh_ fh, Mh_ dtSfx_rhs, Mh_ dtSfy_rhs, Mh_ dtSfz_rhs,sss);
|
||||
@@ -2425,7 +2423,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
}
|
||||
if(co == 0){
|
||||
compute_rhs_ss_part7<<<GRID_DIM,BLOCK_DIM>>>();
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
|
||||
sub_fderivs_shc(sst,Mh_ Axx,Mh_ fh,Mh_ gxxx,Mh_ gxxy,Mh_ gxxz,sss);
|
||||
sub_fderivs_shc(sst,Mh_ Axy,Mh_ fh,Mh_ gxyx,Mh_ gxyy,Mh_ gxyz,aas);
|
||||
@@ -2434,7 +2432,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
sub_fderivs_shc(sst,Mh_ Ayz,Mh_ fh,Mh_ gyzx,Mh_ gyzy,Mh_ gyzz,saa);
|
||||
sub_fderivs_shc(sst,Mh_ Azz,Mh_ fh,Mh_ gzzx,Mh_ gzzy,Mh_ gzzz,sss);
|
||||
compute_rhs_ss_part8<<<GRID_DIM,BLOCK_DIM>>>();
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
}
|
||||
|
||||
#if (ABV == 1)
|
||||
@@ -2514,7 +2512,7 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
//test kodis
|
||||
//sub_kodis_sh(sst,Msh_ drhodx,Mh_ fh2,Msh_ drhody,sss);
|
||||
#ifdef TIMING
|
||||
cudaDeviceSynchronize();
|
||||
cudaThreadSynchronize();
|
||||
gettimeofday(&tv2, NULL);
|
||||
cout<<"MPI rank is: "<<mpi_rank<<" GPU TIME is"<<TimeBetween(tv1, tv2)<<" (s)."<<endl;
|
||||
#endif
|
||||
@@ -2524,55 +2522,4 @@ int gpu_rhs_ss(RHS_SS_PARA)
|
||||
return 0;//TODO return
|
||||
}
|
||||
|
||||
#if (ABEtype == 2)
|
||||
// Z4C Shell GPU: calls BSSN gpu_rhs_ss with trKd=trK+2*TZ, then applies
|
||||
// TZ_rhs = alpn1*Hcon/2 and constraint damping on CPU.
|
||||
int gpu_rhs_z4c_ss(Z4C_SS_PARA)
|
||||
{
|
||||
int matrix_size = ex[0] * ex[1] * ex[2];
|
||||
double k1 = 0.02, k2 = 0.0;
|
||||
|
||||
double *trKd_host = new double[matrix_size];
|
||||
for (int _i = 0; _i < matrix_size; _i++)
|
||||
trKd_host[_i] = trK[_i] + 2.0 * TZ[_i];
|
||||
|
||||
int result = gpu_rhs_ss(calledby, mpi_rank,
|
||||
ex, T, crho, sigma, R, X, Y, Z,
|
||||
drhodx, drhody, drhodz, dsigmadx, dsigmady, dsigmadz,
|
||||
dRdx, dRdy, dRdz,
|
||||
drhodxx, drhodxy, drhodxz, drhodyy, drhodyz, drhodzz,
|
||||
dsigmadxx, dsigmadxy, dsigmadxz, dsigmadyy, dsigmadyz, dsigmadzz,
|
||||
dRdxx, dRdxy, dRdxz, dRdyy, dRdyz, dRdzz,
|
||||
chi, trKd_host, dxx, gxy, gxz, dyy, gyz, dzz,
|
||||
Axx, Axy, Axz, Ayy, Ayz, Azz,
|
||||
Gamx, Gamy, Gamz,
|
||||
Lap, betax, betay, betaz,
|
||||
dtSfx, dtSfy, dtSfz,
|
||||
chi_rhs, trK_rhs,
|
||||
gxx_rhs, gxy_rhs, gxz_rhs, gyy_rhs, gyz_rhs, gzz_rhs,
|
||||
Axx_rhs, Axy_rhs, Axz_rhs, Ayy_rhs, Ayz_rhs, Azz_rhs,
|
||||
Gamx_rhs, Gamy_rhs, Gamz_rhs,
|
||||
Lap_rhs, betax_rhs, betay_rhs, betaz_rhs,
|
||||
dtSfx_rhs, dtSfy_rhs, dtSfz_rhs,
|
||||
rho, Sx, Sy, Sz, Sxx, Sxy, Sxz, Syy, Syz, Szz,
|
||||
Gamxxx, Gamxxy, Gamxxz, Gamxyy, Gamxyz, Gamxzz,
|
||||
Gamyxx, Gamyxy, Gamyxz, Gamyyy, Gamyyz, Gamyzz,
|
||||
Gamzxx, Gamzxy, Gamzxz, Gamzyy, Gamzyz, Gamzzz,
|
||||
Rxx, Rxy, Rxz, Ryy, Ryz, Rzz,
|
||||
ham_Res, movx_Res, movy_Res, movz_Res,
|
||||
Gmx_Res, Gmy_Res, Gmz_Res,
|
||||
Symmetry, Lev, eps, sst, co);
|
||||
delete[] trKd_host;
|
||||
if (result != 0) return result;
|
||||
|
||||
for (int _i = 0; _i < matrix_size; _i++) {
|
||||
double alp = Lap[_i] + 1.0;
|
||||
TZ_rhs[_i] = alp * ham_Res[_i] * 0.5;
|
||||
TZ_rhs[_i] -= alp * (2.0 + k2) * k1 * TZ[_i];
|
||||
trK_rhs[_i] += alp * k1 * (1.0 - k2) * TZ[_i];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
#endif // ABEtype == 2
|
||||
|
||||
#endif //WithShell
|
||||
|
||||
@@ -5,8 +5,9 @@
|
||||
#ifdef fortran1
|
||||
#define f_compute_rhs_bssn compute_rhs_bssn
|
||||
#define f_compute_rhs_bssn_ss compute_rhs_bssn_ss
|
||||
#define f_compute_rhs_bssn_escalar compute_rhs_bssn_escalar
|
||||
#define f_compute_rhs_bssn_escalar_ss compute_rhs_bssn_escalar_ss
|
||||
#define f_compute_rhs_bssn_escalar compute_rhs_bssn_escalar
|
||||
#define f_compute_rhs_bssn_escalar_matter compute_rhs_bssn_escalar_matter
|
||||
#define f_compute_rhs_bssn_escalar_ss compute_rhs_bssn_escalar_ss
|
||||
#define f_compute_rhs_Z4c compute_rhs_z4c
|
||||
#define f_compute_rhs_Z4cnot compute_rhs_z4cnot
|
||||
#define f_compute_rhs_Z4c_ss compute_rhs_z4c_ss
|
||||
@@ -15,8 +16,9 @@
|
||||
#ifdef fortran2
|
||||
#define f_compute_rhs_bssn COMPUTE_RHS_BSSN
|
||||
#define f_compute_rhs_bssn_ss COMPUTE_RHS_BSSN_SS
|
||||
#define f_compute_rhs_bssn_escalar COMPUTE_RHS_BSSN_ESCALAR
|
||||
#define f_compute_rhs_bssn_escalar_ss COMPUTE_RHS_BSSN_ESCALAR_SS
|
||||
#define f_compute_rhs_bssn_escalar COMPUTE_RHS_BSSN_ESCALAR
|
||||
#define f_compute_rhs_bssn_escalar_matter COMPUTE_RHS_BSSN_ESCALAR_MATTER
|
||||
#define f_compute_rhs_bssn_escalar_ss COMPUTE_RHS_BSSN_ESCALAR_SS
|
||||
#define f_compute_rhs_Z4c COMPUTE_RHS_Z4C
|
||||
#define f_compute_rhs_Z4cnot COMPUTE_RHS_Z4CNOT
|
||||
#define f_compute_rhs_Z4c_ss COMPUTE_RHS_Z4C_SS
|
||||
@@ -25,8 +27,9 @@
|
||||
#ifdef fortran3
|
||||
#define f_compute_rhs_bssn compute_rhs_bssn_
|
||||
#define f_compute_rhs_bssn_ss compute_rhs_bssn_ss_
|
||||
#define f_compute_rhs_bssn_escalar compute_rhs_bssn_escalar_
|
||||
#define f_compute_rhs_bssn_escalar_ss compute_rhs_bssn_escalar_ss_
|
||||
#define f_compute_rhs_bssn_escalar compute_rhs_bssn_escalar_
|
||||
#define f_compute_rhs_bssn_escalar_matter compute_rhs_bssn_escalar_matter_
|
||||
#define f_compute_rhs_bssn_escalar_ss compute_rhs_bssn_escalar_ss_
|
||||
#define f_compute_rhs_Z4c compute_rhs_z4c_
|
||||
#define f_compute_rhs_Z4cnot compute_rhs_z4cnot_
|
||||
#define f_compute_rhs_Z4c_ss compute_rhs_z4c_ss_
|
||||
@@ -96,10 +99,24 @@ extern "C"
|
||||
int &, int &, double &, int &, int &);
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
int f_compute_rhs_bssn_escalar(int *, double &, double *, double *, double *, // ex,T,X,Y,Z
|
||||
double *, double *, // chi, trK
|
||||
extern "C"
|
||||
{
|
||||
int f_compute_rhs_bssn_escalar_matter(int *, double &, double *, double *, double *, // ex,T,X,Y,Z
|
||||
double *, double *, // chi, trK
|
||||
double *, double *, double *, double *, double *, double *, // gij
|
||||
double *, double *, double *, double *, double *, double *, // Aij
|
||||
double *, double *, double *, // Gam
|
||||
double *, double *, double *, double *, double *, double *, double *, // Gauge
|
||||
double *, double *, // Sphi, Spi
|
||||
double *, double *, // Sphi, Spi rhs
|
||||
double *, double *, double *, double *, double *, double *, double *, double *, double *, double *, // stress-energy
|
||||
int &, int &, double &);
|
||||
}
|
||||
|
||||
extern "C"
|
||||
{
|
||||
int f_compute_rhs_bssn_escalar(int *, double &, double *, double *, double *, // ex,T,X,Y,Z
|
||||
double *, double *, // chi, trK
|
||||
double *, double *, double *, double *, double *, double *, // gij
|
||||
double *, double *, double *, double *, double *, double *, // Aij
|
||||
double *, double *, double *, // Gam
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,9 +7,6 @@ extern "C" {
|
||||
|
||||
enum {
|
||||
BSSN_CUDA_STATE_COUNT = 24,
|
||||
BSSN_ESCALAR_CUDA_STATE_COUNT = 26,
|
||||
BSSN_EM_CUDA_STATE_COUNT = 32,
|
||||
BSSN_EM_CUDA_SOURCE_COUNT = 4,
|
||||
BSSN_CUDA_MATTER_COUNT = 10
|
||||
};
|
||||
|
||||
@@ -58,53 +55,116 @@ int bssn_cuda_rk4_substep(void *block_tag,
|
||||
int &apply_enforce_ga,
|
||||
double &chitiny);
|
||||
|
||||
int bssn_escalar_cuda_rk4_substep(void *block_tag,
|
||||
int *ex, double *X, double *Y, double *Z,
|
||||
double **state_host_in,
|
||||
double **state_host_out,
|
||||
const double *propspeed,
|
||||
const double *soa_flat,
|
||||
const double *bbox,
|
||||
double &dT,
|
||||
double &T,
|
||||
int &RK4,
|
||||
int &apply_bam_bc,
|
||||
int &Symmetry,
|
||||
int &Lev,
|
||||
double &eps,
|
||||
int &co,
|
||||
int &keep_resident_state,
|
||||
int &apply_enforce_ga,
|
||||
double &chitiny);
|
||||
int bssn_cuda_compute_escalar_matter(void *block_tag,
|
||||
int *ex, double *X, double *Y, double *Z,
|
||||
double **state_host_in,
|
||||
double *Sphi_host,
|
||||
double *Spi_host,
|
||||
double *Sphi_rhs_host,
|
||||
double *Spi_rhs_host,
|
||||
double a2,
|
||||
int &Symmetry,
|
||||
int &Lev,
|
||||
double &eps,
|
||||
int &co,
|
||||
int &apply_enforce_ga);
|
||||
|
||||
int bssn_escalar_cuda_compute_constraints(int *ex, double *X, double *Y, double *Z,
|
||||
double **state_host_in,
|
||||
double **constraint_host_out,
|
||||
int &Symmetry,
|
||||
int &Lev,
|
||||
double &eps);
|
||||
int bssn_cuda_escalar_finalize_scalar_fields(void *block_tag,
|
||||
int *ex, double *X, double *Y, double *Z,
|
||||
double *Sphi_out_host,
|
||||
double *Spi_out_host,
|
||||
const double *propspeed,
|
||||
const double *soa_flat,
|
||||
const double *bbox,
|
||||
double &dT,
|
||||
int &RK4,
|
||||
int &apply_bam_bc,
|
||||
int &Symmetry,
|
||||
int &Lev,
|
||||
double &eps,
|
||||
int &precor);
|
||||
|
||||
int bssn_em_cuda_rk4_substep(void *block_tag,
|
||||
int *ex, double *X, double *Y, double *Z,
|
||||
double **state_host_in,
|
||||
double **state_host_out,
|
||||
double **source_host,
|
||||
const double *propspeed,
|
||||
const double *soa_flat,
|
||||
const double *bbox,
|
||||
double &dT,
|
||||
double &T,
|
||||
int &RK4,
|
||||
int &apply_bam_bc,
|
||||
int &Symmetry,
|
||||
int &Lev,
|
||||
double &eps,
|
||||
int &co,
|
||||
int &keep_resident_state,
|
||||
int &apply_enforce_ga,
|
||||
double &chitiny);
|
||||
int bssn_cuda_escalar_has_resident_fields(void *block_tag,
|
||||
double *Sphi_host,
|
||||
double *Spi_host);
|
||||
|
||||
int bssn_em_cuda_resident_zero_fast_state(void *block_tag);
|
||||
int bssn_cuda_escalar_has_any_resident_fields(void *block_tag);
|
||||
|
||||
int bssn_cuda_escalar_download_fields_if_present(void *block_tag,
|
||||
int *ex,
|
||||
double *Sphi_host,
|
||||
double *Spi_host);
|
||||
|
||||
int bssn_cuda_pack_escalar_batch_to_host_buffer(void *block_tag,
|
||||
double **scalar_host_key,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int bssn_cuda_unpack_escalar_batch_from_host_buffer(void *block_tag,
|
||||
double **scalar_host_key,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int bssn_cuda_pack_escalar_batch_to_device_buffer(void *block_tag,
|
||||
double **scalar_host_key,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int bssn_cuda_unpack_escalar_batch_from_device_buffer(void *block_tag,
|
||||
double **scalar_host_key,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int bssn_cuda_restrict_escalar_batch_to_host_buffer(void *block_tag,
|
||||
double **scalar_host_key,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int fi0, int fj0, int fk0,
|
||||
const double *scalar_soa);
|
||||
|
||||
int bssn_cuda_prolong_escalar_batch_to_host_buffer(void *block_tag,
|
||||
double **scalar_host_key,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int ii0, int jj0, int kk0,
|
||||
int lbc_i, int lbc_j, int lbc_k,
|
||||
const double *scalar_soa);
|
||||
|
||||
int bssn_cuda_restrict_escalar_batch_to_device_buffer(void *block_tag,
|
||||
double **scalar_host_key,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int fi0, int fj0, int fk0,
|
||||
const double *scalar_soa);
|
||||
|
||||
int bssn_cuda_prolong_escalar_batch_to_device_buffer(void *block_tag,
|
||||
double **scalar_host_key,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int ii0, int jj0, int kk0,
|
||||
int lbc_i, int lbc_j, int lbc_k,
|
||||
const double *scalar_soa);
|
||||
|
||||
int bssn_cuda_prepare_escalar_inter_time_level(void *block_tag,
|
||||
int *ex,
|
||||
double **src1_host_key,
|
||||
double **src2_host_key,
|
||||
double **src3_host_key,
|
||||
double **dst_host_key,
|
||||
int source_count,
|
||||
int tindex);
|
||||
|
||||
int bssn_cuda_copy_state_region_to_host(void *block_tag,
|
||||
int state_index,
|
||||
@@ -124,37 +184,13 @@ int bssn_cuda_download_resident_state(void *block_tag,
|
||||
int *ex,
|
||||
double **state_host_out);
|
||||
|
||||
int bssn_escalar_cuda_download_resident_state(void *block_tag,
|
||||
int *ex,
|
||||
double **state_host_out);
|
||||
|
||||
int bssn_cuda_upload_resident_state_count(void *block_tag,
|
||||
int *ex,
|
||||
double **state_host_in,
|
||||
int state_count);
|
||||
|
||||
int bssn_escalar_cuda_upload_resident_state(void *block_tag,
|
||||
int *ex,
|
||||
double **state_host_in);
|
||||
|
||||
int bssn_cuda_keep_only_resident_state_count(void *block_tag,
|
||||
int *ex,
|
||||
double **state_host_key,
|
||||
int state_count);
|
||||
|
||||
int bssn_escalar_cuda_keep_only_resident_state(void *block_tag,
|
||||
int *ex,
|
||||
double **state_host_key);
|
||||
|
||||
int bssn_cuda_download_resident_state_count_if_present(void *block_tag,
|
||||
int *ex,
|
||||
double **state_host_out,
|
||||
int state_count);
|
||||
|
||||
int bssn_cuda_download_resident_state_if_present(void *block_tag,
|
||||
int *ex,
|
||||
double **state_host_out);
|
||||
|
||||
int bssn_cuda_resident_state_matches(void *block_tag,
|
||||
double **state_host_key);
|
||||
|
||||
int bssn_cuda_download_constraint_outputs(int *ex,
|
||||
double **constraint_host_out);
|
||||
|
||||
@@ -181,7 +217,6 @@ int bssn_cuda_interp_state_point3(void *block_tag,
|
||||
double pz,
|
||||
int ordn,
|
||||
int symmetry,
|
||||
double **state_host_key,
|
||||
const double *soa3,
|
||||
double *out3);
|
||||
|
||||
@@ -211,15 +246,6 @@ int bssn_cuda_unpack_state_region_from_host_buffer(void *block_tag,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int bssn_cuda_unpack_state_region_from_host_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
int state_index,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int bssn_cuda_pack_state_batch_to_host_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *host_buffer,
|
||||
@@ -250,8 +276,44 @@ int bssn_cuda_unpack_state_batch_from_host_buffer_for_host_views(void *block_tag
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int bssn_cuda_restrict_state_batch_to_host_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int fi0, int fj0, int fk0,
|
||||
const double *state_soa);
|
||||
|
||||
int bssn_cuda_restrict_state_batch_to_host_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int fi0, int fj0, int fk0,
|
||||
const double *state_soa);
|
||||
|
||||
int bssn_cuda_prolong_state_batch_to_host_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int ii0, int jj0, int kk0,
|
||||
int lbc_i, int lbc_j, int lbc_k,
|
||||
const double *state_soa);
|
||||
|
||||
int bssn_cuda_prolong_state_batch_to_host_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int ii0, int jj0, int kk0,
|
||||
int lbc_i, int lbc_j, int lbc_k,
|
||||
const double *state_soa);
|
||||
|
||||
int bssn_cuda_pack_state_batch_to_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
@@ -390,7 +452,6 @@ int bssn_cuda_upload_state_subset(void *block_tag,
|
||||
|
||||
int bssn_cuda_prepare_inter_time_level(void *block_tag,
|
||||
int *ex,
|
||||
int state_count,
|
||||
double **src1_host_key,
|
||||
double **src2_host_key,
|
||||
double **src3_host_key,
|
||||
@@ -404,10 +465,6 @@ void bssn_cuda_release_step_ctx(void *block_tag);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
// C++-only helpers declared for derived equation classes (Z4C, etc.)
|
||||
// Defined in bssn_class.C. Requires MyList, Patch, var from including TU.
|
||||
bool bssn_cuda_use_resident_sync(int lev);
|
||||
void bssn_cuda_download_level_state_if_present(MyList<Patch> *PatL, MyList<var> *vars, int myrank);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@@ -76,11 +76,8 @@ checkpoint::checkpoint(bool checked, const char fname[], int myrank) : filename(
|
||||
|
||||
I_Print = (myrank == 0);
|
||||
|
||||
size_t filename_len = out_dir.size() + strlen(fname) + 32;
|
||||
#ifdef CHECKDETAIL
|
||||
filename_len += 32;
|
||||
#endif
|
||||
filename = new char[filename_len];
|
||||
int i = strlen(fname);
|
||||
filename = new char[i+30];
|
||||
// cout << filename << endl;
|
||||
// cout << i << endl;
|
||||
|
||||
@@ -103,12 +100,12 @@ checkpoint::checkpoint(bool checked, const char fname[], int myrank) : filename(
|
||||
cout << " checkpoint class created " << endl;
|
||||
}
|
||||
}
|
||||
checkpoint::~checkpoint()
|
||||
{
|
||||
CheckList->clearList();
|
||||
if (filename)
|
||||
delete[] filename;
|
||||
}
|
||||
checkpoint::~checkpoint()
|
||||
{
|
||||
CheckList->clearList();
|
||||
if (I_Print)
|
||||
delete[] filename;
|
||||
}
|
||||
|
||||
void checkpoint::addvariable(var *VV)
|
||||
{
|
||||
@@ -139,7 +136,7 @@ void checkpoint::writecheck_cgh(double time, cgh *GH)
|
||||
if (I_Print)
|
||||
{
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_cgh.CHK", filename);
|
||||
|
||||
outfile.open(fname, ios::out | ios::trunc);
|
||||
@@ -198,7 +195,7 @@ void checkpoint::readcheck_cgh(double &time, cgh *GH, int myrank, int nprocs, in
|
||||
int DIM = dim;
|
||||
ifstream infile;
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_cgh.CHK", filename);
|
||||
|
||||
infile.open(fname);
|
||||
@@ -300,7 +297,7 @@ void checkpoint::writecheck_sh(double time, ShellPatch *SH)
|
||||
|
||||
if (I_Print)
|
||||
{
|
||||
char fname[4096];
|
||||
char fname[50];
|
||||
sprintf(fname, "%s_sh.CHK", filename);
|
||||
|
||||
outfile.open(fname, ios::out | ios::trunc);
|
||||
@@ -338,7 +335,7 @@ void checkpoint::readcheck_sh(ShellPatch *SH, int myrank)
|
||||
int DIM = dim;
|
||||
ifstream infile;
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_sh.CHK", filename);
|
||||
|
||||
infile.open(fname);
|
||||
@@ -393,7 +390,7 @@ void checkpoint::write_Black_Hole_position(int BH_num_input, int BH_num, double
|
||||
|
||||
if (I_Print)
|
||||
{
|
||||
char fname[4096];
|
||||
char fname[50];
|
||||
sprintf(fname, "%s_BHp.CHK", filename);
|
||||
|
||||
outfile.open(fname, ios::out | ios::trunc);
|
||||
@@ -420,7 +417,7 @@ void checkpoint::read_Black_Hole_position(int &BH_num_input, int &BH_num, double
|
||||
{
|
||||
ifstream infile;
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_BHp.CHK", filename);
|
||||
|
||||
infile.open(fname);
|
||||
@@ -464,7 +461,7 @@ void checkpoint::write_bssn(double LastDump, double Last2dDump, double LastAnas)
|
||||
|
||||
if (I_Print)
|
||||
{
|
||||
char fname[4096];
|
||||
char fname[50];
|
||||
sprintf(fname, "%s_bssn.CHK", filename);
|
||||
|
||||
outfile.open(fname, ios::out | ios::trunc);
|
||||
@@ -484,7 +481,7 @@ void checkpoint::read_bssn(double &LastDump, double &Last2dDump, double &LastAna
|
||||
{
|
||||
ifstream infile;
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_bssn.CHK", filename);
|
||||
|
||||
infile.open(fname);
|
||||
@@ -509,7 +506,7 @@ void checkpoint::write_bssn(double LastDump, double Last2dDump, double LastAnas)
|
||||
ofstream outfile;
|
||||
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_bssn.CHK", filename);
|
||||
|
||||
outfile.open(fname, ios::out | ios::trunc);
|
||||
@@ -530,7 +527,7 @@ void checkpoint::read_bssn(double &LastDump, double &Last2dDump, double &LastAna
|
||||
{
|
||||
ifstream infile;
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_bssn.CHK", filename);
|
||||
|
||||
infile.open(fname);
|
||||
@@ -554,7 +551,7 @@ void checkpoint::write_Black_Hole_position(int BH_num_input, int BH_num, double
|
||||
ofstream outfile;
|
||||
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_BHp.CHK", filename);
|
||||
|
||||
outfile.open(fname, ios::out | ios::trunc);
|
||||
@@ -584,7 +581,7 @@ void checkpoint::read_Black_Hole_position(int &BH_num_input, int &BH_num, double
|
||||
{
|
||||
ifstream infile;
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_BHp.CHK", filename);
|
||||
|
||||
infile.open(fname);
|
||||
@@ -631,7 +628,7 @@ void checkpoint::writecheck_cgh(double time, cgh *GH)
|
||||
ofstream outfile;
|
||||
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_cgh.CHK", filename);
|
||||
|
||||
outfile.open(fname, ios::out | ios::trunc);
|
||||
@@ -741,7 +738,7 @@ void checkpoint::readcheck_cgh(double &time, cgh *GH, int myrank, int nprocs, in
|
||||
int DIM = dim;
|
||||
ifstream infile;
|
||||
// char fname[50];
|
||||
char fname[4096];
|
||||
char fname[50+50];
|
||||
sprintf(fname, "%s_cgh.CHK", filename);
|
||||
|
||||
infile.open(fname);
|
||||
|
||||
@@ -1,412 +0,0 @@
|
||||
#ifndef AMSS_NCKU_FD_CUDA_HELPERS_CUH
|
||||
#define AMSS_NCKU_FD_CUDA_HELPERS_CUH
|
||||
|
||||
#ifndef ghost_width
|
||||
#error "ghost_width must be defined before including fd_cuda_helpers.cuh"
|
||||
#endif
|
||||
|
||||
#if ghost_width < 2 || ghost_width > 5
|
||||
#error "CUDA finite-difference helpers support ghost_width 2..5"
|
||||
#endif
|
||||
|
||||
#define AMSS_FD_CENTER_RADIUS (ghost_width - 1)
|
||||
#define AMSS_FD_LK_RADIUS (ghost_width)
|
||||
|
||||
__device__ __forceinline__ int fd_axis_radius(int qF, int qminF, int qmaxF)
|
||||
{
|
||||
#if AMSS_FD_CENTER_RADIUS >= 4
|
||||
if (qF - 4 >= qminF && qF + 4 <= qmaxF) return 4;
|
||||
#endif
|
||||
#if AMSS_FD_CENTER_RADIUS >= 3
|
||||
if (qF - 3 >= qminF && qF + 3 <= qmaxF) return 3;
|
||||
#endif
|
||||
#if AMSS_FD_CENTER_RADIUS >= 2
|
||||
if (qF - 2 >= qminF && qF + 2 <= qmaxF) return 2;
|
||||
#endif
|
||||
if (qF - 1 >= qminF && qF + 1 <= qmaxF) return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__device__ __forceinline__ int fd_common_radius(int iF, int jF, int kF,
|
||||
int iminF, int jminF, int kminF,
|
||||
int imaxF, int jmaxF, int kmaxF)
|
||||
{
|
||||
int r = fd_axis_radius(iF, iminF, imaxF);
|
||||
const int ry = fd_axis_radius(jF, jminF, jmaxF);
|
||||
const int rz = fd_axis_radius(kF, kminF, kmaxF);
|
||||
if (ry < r) r = ry;
|
||||
if (rz < r) r = rz;
|
||||
return r;
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_first_coef(int r, int off)
|
||||
{
|
||||
switch (r) {
|
||||
case 1:
|
||||
if (off == -1) return -1.0;
|
||||
if (off == 1) return 1.0;
|
||||
return 0.0;
|
||||
case 2:
|
||||
if (off == -2) return 1.0;
|
||||
if (off == -1) return -8.0;
|
||||
if (off == 1) return 8.0;
|
||||
if (off == 2) return -1.0;
|
||||
return 0.0;
|
||||
case 3:
|
||||
if (off == -3) return -1.0;
|
||||
if (off == -2) return 9.0;
|
||||
if (off == -1) return -45.0;
|
||||
if (off == 1) return 45.0;
|
||||
if (off == 2) return -9.0;
|
||||
if (off == 3) return 1.0;
|
||||
return 0.0;
|
||||
case 4:
|
||||
if (off == -4) return 3.0;
|
||||
if (off == -3) return -32.0;
|
||||
if (off == -2) return 168.0;
|
||||
if (off == -1) return -672.0;
|
||||
if (off == 1) return 672.0;
|
||||
if (off == 2) return -168.0;
|
||||
if (off == 3) return 32.0;
|
||||
if (off == 4) return -3.0;
|
||||
return 0.0;
|
||||
default:
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_second_coef(int r, int off)
|
||||
{
|
||||
switch (r) {
|
||||
case 1:
|
||||
if (off == -1) return 1.0;
|
||||
if (off == 0) return -2.0;
|
||||
if (off == 1) return 1.0;
|
||||
return 0.0;
|
||||
case 2:
|
||||
if (off == -2) return -1.0;
|
||||
if (off == -1) return 16.0;
|
||||
if (off == 0) return -30.0;
|
||||
if (off == 1) return 16.0;
|
||||
if (off == 2) return -1.0;
|
||||
return 0.0;
|
||||
case 3:
|
||||
if (off == -3) return 2.0;
|
||||
if (off == -2) return -27.0;
|
||||
if (off == -1) return 270.0;
|
||||
if (off == 0) return -490.0;
|
||||
if (off == 1) return 270.0;
|
||||
if (off == 2) return -27.0;
|
||||
if (off == 3) return 2.0;
|
||||
return 0.0;
|
||||
case 4:
|
||||
if (off == -4) return -9.0;
|
||||
if (off == -3) return 128.0;
|
||||
if (off == -2) return -1008.0;
|
||||
if (off == -1) return 8064.0;
|
||||
if (off == 0) return -14350.0;
|
||||
if (off == 1) return 8064.0;
|
||||
if (off == 2) return -1008.0;
|
||||
if (off == 3) return 128.0;
|
||||
if (off == 4) return -9.0;
|
||||
return 0.0;
|
||||
default:
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_first_denom(int r)
|
||||
{
|
||||
return (r == 4) ? 840.0 : ((r == 3) ? 60.0 : ((r == 2) ? 12.0 : 2.0));
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_second_denom(int r)
|
||||
{
|
||||
return (r == 4) ? 5040.0 : ((r == 3) ? 180.0 : ((r == 2) ? 12.0 : 1.0));
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_fetch_axis(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int axis, int off,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
if (axis == 0) iF += off;
|
||||
else if (axis == 1) jF += off;
|
||||
else kF += off;
|
||||
return fetch_sym_ord2_direct(src, iF, jF, kF, SoA0, SoA1, SoA2);
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_fetch_axis2(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int axis_a, int off_a,
|
||||
int axis_b, int off_b,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
if (axis_a == 0) iF += off_a;
|
||||
else if (axis_a == 1) jF += off_a;
|
||||
else kF += off_a;
|
||||
if (axis_b == 0) iF += off_b;
|
||||
else if (axis_b == 1) jF += off_b;
|
||||
else kF += off_b;
|
||||
return fetch_sym_ord2_direct(src, iF, jF, kF, SoA0, SoA1, SoA2);
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_first_axis_radius(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int axis, int r, double h,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
if (r <= 0) return 0.0;
|
||||
double s = 0.0;
|
||||
#pragma unroll
|
||||
for (int off = -4; off <= 4; ++off) {
|
||||
const double c = fd_first_coef(r, off);
|
||||
if (c != 0.0) {
|
||||
s += c * fd_fetch_axis(src, iF, jF, kF, axis, off, SoA0, SoA1, SoA2);
|
||||
}
|
||||
}
|
||||
return s / (fd_first_denom(r) * h);
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_second_axis_radius(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int axis, int r, double h,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
if (r <= 0) return 0.0;
|
||||
double s = 0.0;
|
||||
#pragma unroll
|
||||
for (int off = -4; off <= 4; ++off) {
|
||||
const double c = fd_second_coef(r, off);
|
||||
if (c != 0.0) {
|
||||
s += c * fd_fetch_axis(src, iF, jF, kF, axis, off, SoA0, SoA1, SoA2);
|
||||
}
|
||||
}
|
||||
return s / (fd_second_denom(r) * h * h);
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_mixed_axis_radius(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int axis_a, int r_a, double h_a,
|
||||
int axis_b, int r_b, double h_b,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
if (r_a <= 0 || r_b <= 0) return 0.0;
|
||||
double s = 0.0;
|
||||
#pragma unroll
|
||||
for (int off_a = -4; off_a <= 4; ++off_a) {
|
||||
const double ca = fd_first_coef(r_a, off_a);
|
||||
if (ca == 0.0) continue;
|
||||
#pragma unroll
|
||||
for (int off_b = -4; off_b <= 4; ++off_b) {
|
||||
const double cb = fd_first_coef(r_b, off_b);
|
||||
if (cb != 0.0) {
|
||||
s += ca * cb * fd_fetch_axis2(src, iF, jF, kF, axis_a, off_a,
|
||||
axis_b, off_b, SoA0, SoA1, SoA2);
|
||||
}
|
||||
}
|
||||
}
|
||||
return s / (fd_first_denom(r_a) * fd_first_denom(r_b) * h_a * h_b);
|
||||
}
|
||||
|
||||
__device__ __forceinline__ void fd_compute_first3(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int iminF, int jminF, int kminF,
|
||||
int imaxF, int jmaxF, int kmaxF,
|
||||
int SoA0, int SoA1, int SoA2,
|
||||
double &fx, double &fy, double &fz)
|
||||
{
|
||||
#if ghost_width == 3
|
||||
const int r = fd_common_radius(iF, jF, kF, iminF, jminF, kminF, imaxF, jmaxF, kmaxF);
|
||||
fx = fd_first_axis_radius(src, iF, jF, kF, 0, r, d_gp.dX, SoA0, SoA1, SoA2);
|
||||
fy = fd_first_axis_radius(src, iF, jF, kF, 1, r, d_gp.dY, SoA0, SoA1, SoA2);
|
||||
fz = fd_first_axis_radius(src, iF, jF, kF, 2, r, d_gp.dZ, SoA0, SoA1, SoA2);
|
||||
#else
|
||||
fx = fd_first_axis_radius(src, iF, jF, kF, 0, fd_axis_radius(iF, iminF, imaxF),
|
||||
d_gp.dX, SoA0, SoA1, SoA2);
|
||||
fy = fd_first_axis_radius(src, iF, jF, kF, 1, fd_axis_radius(jF, jminF, jmaxF),
|
||||
d_gp.dY, SoA0, SoA1, SoA2);
|
||||
fz = fd_first_axis_radius(src, iF, jF, kF, 2, fd_axis_radius(kF, kminF, kmaxF),
|
||||
d_gp.dZ, SoA0, SoA1, SoA2);
|
||||
#endif
|
||||
}
|
||||
|
||||
__device__ __forceinline__ void fd_compute_second6(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int iminF, int jminF, int kminF,
|
||||
int imaxF, int jmaxF, int kmaxF,
|
||||
int SoA0, int SoA1, int SoA2,
|
||||
double &fxx, double &fxy, double &fxz,
|
||||
double &fyy, double &fyz, double &fzz)
|
||||
{
|
||||
#if ghost_width == 3
|
||||
const int r = fd_common_radius(iF, jF, kF, iminF, jminF, kminF, imaxF, jmaxF, kmaxF);
|
||||
const int rx = r, ry = r, rz = r;
|
||||
#else
|
||||
const int rx = fd_axis_radius(iF, iminF, imaxF);
|
||||
const int ry = fd_axis_radius(jF, jminF, jmaxF);
|
||||
const int rz = fd_axis_radius(kF, kminF, kmaxF);
|
||||
#endif
|
||||
fxx = fd_second_axis_radius(src, iF, jF, kF, 0, rx, d_gp.dX, SoA0, SoA1, SoA2);
|
||||
fyy = fd_second_axis_radius(src, iF, jF, kF, 1, ry, d_gp.dY, SoA0, SoA1, SoA2);
|
||||
fzz = fd_second_axis_radius(src, iF, jF, kF, 2, rz, d_gp.dZ, SoA0, SoA1, SoA2);
|
||||
fxy = fd_mixed_axis_radius(src, iF, jF, kF, 0, rx, d_gp.dX, 1, ry, d_gp.dY, SoA0, SoA1, SoA2);
|
||||
fxz = fd_mixed_axis_radius(src, iF, jF, kF, 0, rx, d_gp.dX, 2, rz, d_gp.dZ, SoA0, SoA1, SoA2);
|
||||
fyz = fd_mixed_axis_radius(src, iF, jF, kF, 1, ry, d_gp.dY, 2, rz, d_gp.dZ, SoA0, SoA1, SoA2);
|
||||
}
|
||||
|
||||
__device__ __forceinline__ bool fd_lop_fits(int qF, int qminF, int qmaxF,
|
||||
int dir, int lo, int hi)
|
||||
{
|
||||
for (int off = lo; off <= hi; ++off) {
|
||||
const int q = qF + dir * off;
|
||||
if (q < qminF || q > qmaxF) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_lop_fetch_sum(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int axis, int dir,
|
||||
const double *coef,
|
||||
int lo, int hi,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
double s = 0.0;
|
||||
for (int off = lo; off <= hi; ++off) {
|
||||
const double c = coef[off - lo];
|
||||
if (c != 0.0) {
|
||||
s += c * fd_fetch_axis(src, iF, jF, kF, axis, dir * off, SoA0, SoA1, SoA2);
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_lopsided_axis(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int axis, double speed,
|
||||
int qF, int qminF, int qmaxF,
|
||||
double h,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
if (speed == 0.0) return 0.0;
|
||||
const int dir = (speed > 0.0) ? 1 : -1;
|
||||
const double mag = (speed > 0.0) ? speed : -speed;
|
||||
|
||||
#if ghost_width == 2
|
||||
if (fd_lop_fits(qF, qminF, qmaxF, dir, 0, 2)) {
|
||||
const double c[] = {-3.0, 4.0, -1.0};
|
||||
return mag * fd_lop_fetch_sum(src, iF, jF, kF, axis, dir, c, 0, 2, SoA0, SoA1, SoA2) / (2.0 * h);
|
||||
}
|
||||
if (fd_lop_fits(qF, qminF, qmaxF, dir, 0, 1)) {
|
||||
const double c[] = {-1.0, 1.0};
|
||||
return mag * fd_lop_fetch_sum(src, iF, jF, kF, axis, dir, c, 0, 1, SoA0, SoA1, SoA2) / (2.0 * h);
|
||||
}
|
||||
return 0.0;
|
||||
#elif ghost_width == 3
|
||||
if (fd_lop_fits(qF, qminF, qmaxF, dir, -1, 3)) {
|
||||
const double c[] = {-3.0, -10.0, 18.0, -6.0, 1.0};
|
||||
return mag * fd_lop_fetch_sum(src, iF, jF, kF, axis, dir, c, -1, 3, SoA0, SoA1, SoA2) / (12.0 * h);
|
||||
}
|
||||
const int r = fd_axis_radius(qF, qminF, qmaxF);
|
||||
return speed * fd_first_axis_radius(src, iF, jF, kF, axis, r, h, SoA0, SoA1, SoA2);
|
||||
#elif ghost_width == 4
|
||||
if (fd_lop_fits(qF, qminF, qmaxF, dir, -2, 4)) {
|
||||
const double c[] = {2.0, -24.0, -35.0, 80.0, -30.0, 8.0, -1.0};
|
||||
return mag * fd_lop_fetch_sum(src, iF, jF, kF, axis, dir, c, -2, 4, SoA0, SoA1, SoA2) / (60.0 * h);
|
||||
}
|
||||
if (fd_lop_fits(qF, qminF, qmaxF, dir, -1, 5)) {
|
||||
const double c[] = {-10.0, -77.0, 150.0, -100.0, 50.0, -15.0, 2.0};
|
||||
return mag * fd_lop_fetch_sum(src, iF, jF, kF, axis, dir, c, -1, 5, SoA0, SoA1, SoA2) / (60.0 * h);
|
||||
}
|
||||
const int r = fd_axis_radius(qF, qminF, qmaxF);
|
||||
return speed * fd_first_axis_radius(src, iF, jF, kF, axis, r, h, SoA0, SoA1, SoA2);
|
||||
#else
|
||||
if (fd_lop_fits(qF, qminF, qmaxF, dir, -3, 5)) {
|
||||
const double c[] = {-5.0, 60.0, -420.0, -378.0, 1050.0, -420.0, 140.0, -30.0, 3.0};
|
||||
return mag * fd_lop_fetch_sum(src, iF, jF, kF, axis, dir, c, -3, 5, SoA0, SoA1, SoA2) / (840.0 * h);
|
||||
}
|
||||
const int r = fd_axis_radius(qF, qminF, qmaxF);
|
||||
return speed * fd_first_axis_radius(src, iF, jF, kF, axis, r, h, SoA0, SoA1, SoA2);
|
||||
#endif
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_ko_coef(int r, int off)
|
||||
{
|
||||
const int a = off < 0 ? -off : off;
|
||||
if (r == 2) {
|
||||
if (a == 0) return 6.0;
|
||||
if (a == 1) return -4.0;
|
||||
if (a == 2) return 1.0;
|
||||
} else if (r == 3) {
|
||||
if (a == 0) return -20.0;
|
||||
if (a == 1) return 15.0;
|
||||
if (a == 2) return -6.0;
|
||||
if (a == 3) return 1.0;
|
||||
} else if (r == 4) {
|
||||
if (a == 0) return 70.0;
|
||||
if (a == 1) return -56.0;
|
||||
if (a == 2) return 28.0;
|
||||
if (a == 3) return -8.0;
|
||||
if (a == 4) return 1.0;
|
||||
} else if (r == 5) {
|
||||
if (a == 0) return -252.0;
|
||||
if (a == 1) return 210.0;
|
||||
if (a == 2) return -120.0;
|
||||
if (a == 3) return 45.0;
|
||||
if (a == 4) return -10.0;
|
||||
if (a == 5) return 1.0;
|
||||
}
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_ko_axis(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int axis, int r,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
double s = 0.0;
|
||||
#pragma unroll
|
||||
for (int off = -5; off <= 5; ++off) {
|
||||
if (off < -r || off > r) continue;
|
||||
const double c = fd_ko_coef(r, off);
|
||||
if (c != 0.0) {
|
||||
s += c * fd_fetch_axis(src, iF, jF, kF, axis, off, SoA0, SoA1, SoA2);
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
__device__ __forceinline__ double fd_ko_term(const double *src,
|
||||
int iF, int jF, int kF,
|
||||
int iminF, int jminF, int kminF,
|
||||
int imaxF, int jmaxF, int kmaxF,
|
||||
double eps_val,
|
||||
int SoA0, int SoA1, int SoA2)
|
||||
{
|
||||
const int r = AMSS_FD_LK_RADIUS;
|
||||
if (eps_val <= 0.0) return 0.0;
|
||||
#if ghost_width >= 4
|
||||
if (iF - r <= iminF || iF + r >= imaxF ||
|
||||
jF - r <= jminF || jF + r >= jmaxF ||
|
||||
kF - r <= kminF || kF + r >= kmaxF) {
|
||||
return 0.0;
|
||||
}
|
||||
#else
|
||||
if (iF - r < iminF || iF + r > imaxF ||
|
||||
jF - r < jminF || jF + r > jmaxF ||
|
||||
kF - r < kminF || kF + r > kmaxF) {
|
||||
return 0.0;
|
||||
}
|
||||
#endif
|
||||
double cof = 1.0;
|
||||
#pragma unroll
|
||||
for (int n = 0; n < 2 * r; ++n) cof *= 2.0;
|
||||
const double sign = (r & 1) ? 1.0 : -1.0;
|
||||
const double dx = fd_ko_axis(src, iF, jF, kF, 0, r, SoA0, SoA1, SoA2);
|
||||
const double dy = fd_ko_axis(src, iF, jF, kF, 1, r, SoA0, SoA1, SoA2);
|
||||
const double dz = fd_ko_axis(src, iF, jF, kF, 2, r, SoA0, SoA1, SoA2);
|
||||
return sign * eps_val * (dx / d_gp.dX + dy / d_gp.dY + dz / d_gp.dZ) / cof;
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,6 +1,6 @@
|
||||
#ifndef GPU_MEM_H_
|
||||
#define GPU_MEM_H_
|
||||
#include "macrodef.h"
|
||||
#include "macrodef.fh"
|
||||
|
||||
#ifdef WithShell
|
||||
struct Metass
|
||||
@@ -48,8 +48,6 @@ struct Meta
|
||||
double * Gamx_rhs,*Gamy_rhs,*Gamz_rhs;//out
|
||||
double * Lap_rhs, *betax_rhs, *betay_rhs, *betaz_rhs;//out
|
||||
double * dtSfx_rhs,*dtSfy_rhs,*dtSfz_rhs;//out
|
||||
double * TZ; //in (Z4C)
|
||||
double * TZ_rhs; //out (Z4C)
|
||||
double * rho,*Sx,*Sy,*Sz ; //in
|
||||
double * Sxx,*Sxy,*Sxz,*Syy,*Syz,*Szz; //in
|
||||
|
||||
@@ -134,8 +132,6 @@ __constant__ double SYM = 1.0;
|
||||
__constant__ double ANTI = -1.0;
|
||||
__constant__ double FF = 0.75;
|
||||
__constant__ double eta = 2.0;
|
||||
__constant__ double kappa1_c = 0.02;
|
||||
__constant__ double kappa2_c = 0.0;
|
||||
__constant__ double F1o3;
|
||||
__constant__ double F2o3;
|
||||
__constant__ double F3o2 = 1.5;
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
#define ABV 0
|
||||
|
||||
#define EScalar_CC 2
|
||||
#define EScalar_CC 2
|
||||
|
||||
#if 0
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
#define GaussInt
|
||||
|
||||
#define ABEtype 0
|
||||
#define ABEtype 1
|
||||
|
||||
//#define With_AHF
|
||||
#define Psi4type 0
|
||||
@@ -167,3 +167,4 @@
|
||||
#define TINY 1e-10
|
||||
|
||||
#endif /* MICRODEF_H */
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@ f90appflags = -O3 -xHost -fp-model fast=2 -fma -ipo \
|
||||
endif
|
||||
|
||||
TP_OPTFLAGS = -O3 -xHost -fp-model fast=2 -fma -ipo \
|
||||
-fprofile-instr-use=$(TP_PROFDATA) \
|
||||
-Dfortran3 -Dnewc $(MKL_INC)
|
||||
else
|
||||
## NVHPC defaults: mpicc/mpicxx/mpifort wrappers
|
||||
@@ -56,26 +57,18 @@ endif
|
||||
.C.o:
|
||||
${CXX} $(CXXAPPFLAGS) -c $< $(filein) -o $@
|
||||
|
||||
# ShellPatch.C uses OpenMP for setupintintstuff search loops
|
||||
ShellPatch.o: ShellPatch.C
|
||||
${CXX} $(CXXAPPFLAGS) $(OMP_FLAG) -c $< $(filein) -o $@
|
||||
|
||||
.for.o:
|
||||
$(f77) -c $< -o $@
|
||||
|
||||
.cu.o:
|
||||
$(Cu) $(CUDA_APP_FLAGS) -c $< -o $@ $(CUDA_LIB_PATH)
|
||||
|
||||
# CUDA rewrite of BSSN RHS (drop-in replacement for bssn_rhs_c + stencil helpers)
|
||||
bssn_rhs_cuda.o: bssn_rhs_cuda.cu bssn_rhs.h macrodef.h fd_cuda_helpers.cuh
|
||||
$(Cu) $(CUDA_APP_FLAGS) -c $< -o $@ $(CUDA_LIB_PATH)
|
||||
|
||||
# CUDA rewrite of BSSN Shell-Patch RHS (drop-in replacement for bssn_rhs_ss)
|
||||
bssn_gpu_rhs_ss.o: bssn_gpu_rhs_ss.cu bssn_gpu.h gpu_rhsSS_mem.h bssn_macro.h macrodef.fh
|
||||
$(Cu) $(CUDA_APP_FLAGS) -c $< -o $@ $(CUDA_LIB_PATH)
|
||||
.cu.o:
|
||||
$(Cu) $(CUDA_APP_FLAGS) -c $< -o $@ $(CUDA_LIB_PATH)
|
||||
|
||||
# CUDA rewrite of BSSN RHS (drop-in replacement for bssn_rhs_c + stencil helpers)
|
||||
bssn_rhs_cuda.o: bssn_rhs_cuda.cu bssn_rhs.h macrodef.h
|
||||
$(Cu) $(CUDA_APP_FLAGS) -c $< -o $@ $(CUDA_LIB_PATH)
|
||||
|
||||
# CUDA rewrite of Z4C Cartesian RHS
|
||||
z4c_rhs_cuda.o: z4c_rhs_cuda.cu z4c_rhs_cuda.h bssn_rhs.h macrodef.h ricci_gamma.h fd_cuda_helpers.cuh
|
||||
z4c_rhs_cuda.o: z4c_rhs_cuda.cu z4c_rhs_cuda.h bssn_rhs.h macrodef.h ricci_gamma.h
|
||||
$(Cu) $(CUDA_APP_FLAGS) -c $< -o $@ $(CUDA_LIB_PATH)
|
||||
|
||||
# C rewrite of BSSN RHS kernel and helpers
|
||||
@@ -131,7 +124,7 @@ else
|
||||
CFILES_CPU = bssn_rhs_c.o fderivs_c.o fdderivs_c.o kodiss_c.o lopsided_c.o lopsided_kodis_c.o
|
||||
endif
|
||||
|
||||
CFILES_CUDA_BSSN = bssn_rhs_cuda.o bssn_gpu_rhs_ss.o
|
||||
CFILES_CUDA_BSSN = bssn_rhs_cuda.o
|
||||
|
||||
ifeq ($(USE_CUDA_BSSN),1)
|
||||
CFILES = $(CFILES_CUDA_BSSN)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
## Toolchain selection
|
||||
## nvhpc : NVIDIA HPC SDK + CUDA-aware MPI (default)
|
||||
## intel : Intel oneAPI toolchain (legacy path)
|
||||
TOOLCHAIN ?= intel
|
||||
TOOLCHAIN ?= nvhpc
|
||||
|
||||
## PGO build mode switch (ABE only; TwoPunctureABE always uses opt flags)
|
||||
## opt : (default) maximum performance with PGO profile-guided optimization
|
||||
@@ -88,4 +88,4 @@ endif
|
||||
|
||||
Cu = $(NVHPC_ROOT)/compilers/bin/nvcc
|
||||
CUDA_LIB_PATH = -L$(CUDA_HOME)/lib64 -I$(CUDA_HOME)/include
|
||||
CUDA_APP_FLAGS = -c -g -O3 --ptxas-options=-v -Dfortran3 -Dnewc -arch=$(CUDA_ARCH)
|
||||
CUDA_APP_FLAGS = -c -g -O3 --ptxas-options=-v -Dfortran3 -Dnewc -arch=$(CUDA_ARCH)
|
||||
@@ -1,8 +1,7 @@
|
||||
|
||||
#ifdef newc
|
||||
#include <cstdio>
|
||||
#include <sstream>
|
||||
using namespace std;
|
||||
#ifdef newc
|
||||
#include <cstdio>
|
||||
using namespace std;
|
||||
#else
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
@@ -78,17 +77,16 @@ monitor::monitor(const char fname[], int myrank, string head)
|
||||
parameters::str_par.insert(map<string, string>::value_type("output dir", out_dir));
|
||||
}
|
||||
// considering checkpoint run
|
||||
string filename = out_dir + "/" + fname;
|
||||
int i = 1;
|
||||
while ((access(filename.c_str(), F_OK)) != -1)
|
||||
{
|
||||
stringstream ss;
|
||||
ss << out_dir << "/" << i << "_" << fname;
|
||||
filename = ss.str();
|
||||
i++;
|
||||
}
|
||||
|
||||
outfile.open(filename.c_str(), ios::trunc);
|
||||
char filename[50];
|
||||
sprintf(filename, "%s/%s", out_dir.c_str(), fname);
|
||||
int i = 1;
|
||||
while ((access(filename, F_OK)) != -1)
|
||||
{
|
||||
sprintf(filename, "%s/%d_%s", out_dir.c_str(), i, fname);
|
||||
i++;
|
||||
}
|
||||
|
||||
outfile.open(filename, ios::trunc);
|
||||
|
||||
time_t tnow;
|
||||
time(&tnow);
|
||||
@@ -109,17 +107,16 @@ monitor::monitor(const char fname[], int myrank, const int out_rank, string head
|
||||
if (I_Print)
|
||||
{
|
||||
// considering checkpoint run
|
||||
string filename = out_dir + "/" + fname;
|
||||
int i = 1;
|
||||
while ((access(filename.c_str(), F_OK)) != -1)
|
||||
{
|
||||
stringstream ss;
|
||||
ss << out_dir << "/" << i << "_" << fname;
|
||||
filename = ss.str();
|
||||
i++;
|
||||
}
|
||||
|
||||
outfile.open(filename.c_str(), ios::trunc);
|
||||
char filename[50];
|
||||
sprintf(filename, "%s/%s", out_dir.c_str(), fname);
|
||||
int i = 1;
|
||||
while ((access(filename, F_OK)) != -1)
|
||||
{
|
||||
sprintf(filename, "%s/%d_%s", out_dir.c_str(), i, fname);
|
||||
i++;
|
||||
}
|
||||
|
||||
outfile.open(filename, ios::trunc);
|
||||
|
||||
time_t tnow;
|
||||
time(&tnow);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -53,6 +53,14 @@ int z4c_cuda_pack_state_batch_to_host_buffer(void *block_tag,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int z4c_cuda_pack_state_batch_to_host_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int z4c_cuda_unpack_state_batch_from_host_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *host_buffer,
|
||||
@@ -60,6 +68,14 @@ int z4c_cuda_unpack_state_batch_from_host_buffer(void *block_tag,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int z4c_cuda_unpack_state_batch_from_host_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *host_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int z4c_cuda_pack_state_batch_to_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
@@ -67,6 +83,14 @@ int z4c_cuda_pack_state_batch_to_device_buffer(void *block_tag,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int z4c_cuda_pack_state_batch_to_device_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int z4c_cuda_unpack_state_batch_from_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
@@ -74,6 +98,78 @@ int z4c_cuda_unpack_state_batch_from_device_buffer(void *block_tag,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int z4c_cuda_unpack_state_batch_from_device_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int i0, int j0, int k0,
|
||||
int sx, int sy, int sz);
|
||||
|
||||
int z4c_cuda_pack_state_segments_to_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int segment_count,
|
||||
const int *segment_meta);
|
||||
|
||||
int z4c_cuda_pack_state_segments_to_device_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int segment_count,
|
||||
const int *segment_meta);
|
||||
|
||||
int z4c_cuda_unpack_state_segments_from_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int segment_count,
|
||||
const int *segment_meta);
|
||||
|
||||
int z4c_cuda_unpack_state_segments_from_device_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int segment_count,
|
||||
const int *segment_meta);
|
||||
|
||||
int z4c_cuda_restrict_state_segments_to_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int segment_count,
|
||||
const int *segment_meta,
|
||||
const double *state_soa);
|
||||
|
||||
int z4c_cuda_restrict_state_segments_to_device_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int segment_count,
|
||||
const int *segment_meta,
|
||||
const double *state_soa);
|
||||
|
||||
int z4c_cuda_prolong_state_segments_to_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int segment_count,
|
||||
const int *segment_meta,
|
||||
const double *state_soa);
|
||||
|
||||
int z4c_cuda_prolong_state_segments_to_device_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int segment_count,
|
||||
const int *segment_meta,
|
||||
const double *state_soa);
|
||||
|
||||
int z4c_cuda_restrict_state_batch_to_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
@@ -82,6 +178,15 @@ int z4c_cuda_restrict_state_batch_to_device_buffer(void *block_tag,
|
||||
int fi0, int fj0, int fk0,
|
||||
const double *state_soa);
|
||||
|
||||
int z4c_cuda_restrict_state_batch_to_device_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int fi0, int fj0, int fk0,
|
||||
const double *state_soa);
|
||||
|
||||
int z4c_cuda_prolong_state_batch_to_device_buffer(void *block_tag,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
@@ -91,6 +196,16 @@ int z4c_cuda_prolong_state_batch_to_device_buffer(void *block_tag,
|
||||
int lbc_i, int lbc_j, int lbc_k,
|
||||
const double *state_soa);
|
||||
|
||||
int z4c_cuda_prolong_state_batch_to_device_buffer_for_host_views(void *block_tag,
|
||||
double **state_host_key,
|
||||
int state_count,
|
||||
double *device_buffer,
|
||||
int *ex,
|
||||
int sx, int sy, int sz,
|
||||
int ii0, int jj0, int kk0,
|
||||
int lbc_i, int lbc_j, int lbc_k,
|
||||
const double *state_soa);
|
||||
|
||||
int z4c_cuda_download_state_subset(void *block_tag,
|
||||
int *ex,
|
||||
int subset_count,
|
||||
@@ -103,7 +218,36 @@ int z4c_cuda_upload_state_subset(void *block_tag,
|
||||
const int *state_indices,
|
||||
double **state_host_in);
|
||||
|
||||
int z4c_cuda_compute_constraints_resident(void *block_tag,
|
||||
int *ex, double *X, double *Y, double *Z,
|
||||
int Symmetry, double eps, int co,
|
||||
double **constraint_host_out);
|
||||
|
||||
int z4c_cuda_interp_state_point3(void *block_tag,
|
||||
int *ex,
|
||||
int state0,
|
||||
int state1,
|
||||
int state2,
|
||||
double x0,
|
||||
double y0,
|
||||
double z0,
|
||||
double dx,
|
||||
double dy,
|
||||
double dz,
|
||||
double px,
|
||||
double py,
|
||||
double pz,
|
||||
int ordn,
|
||||
int symmetry,
|
||||
const double *soa3,
|
||||
double *out3);
|
||||
|
||||
int z4c_cuda_download_constraint_outputs(int *ex,
|
||||
double **constraint_host_out);
|
||||
|
||||
int z4c_cuda_has_resident_state(void *block_tag);
|
||||
int z4c_cuda_resident_state_matches(void *block_tag,
|
||||
double **state_host_key);
|
||||
|
||||
void z4c_cuda_release_step_ctx(void *block_tag);
|
||||
|
||||
|
||||
@@ -138,58 +138,25 @@ def _stop_cuda_mps(runtime_env):
|
||||
|
||||
def _gpu_runtime_env():
|
||||
runtime_env = os.environ.copy()
|
||||
finite_difference = str(getattr(input_data, "Finite_Diffenence_Method", "4th-order")).strip()
|
||||
|
||||
defaults = {
|
||||
"AMSS_EVOLVE_TIMING": "1",
|
||||
"AMSS_ESCALAR_STEP_TIMING": "0",
|
||||
"AMSS_INTERP_FAST": "1",
|
||||
"AMSS_INTERP_GPU": "1",
|
||||
"AMSS_ANALYSIS_MAP_EVERY": "1000000",
|
||||
"AMSS_CUDA_AWARE_MPI": "1",
|
||||
"AMSS_CUDA_KEEP_RESIDENT_AFTER_STEP": "1",
|
||||
"AMSS_CUDA_Z4C_KEEP_RESIDENT_AFTER_STEP": "1",
|
||||
"AMSS_CUDA_KEEP_ALL_LEVELS": "1",
|
||||
"AMSS_CUDA_ESCALAR_KEEP_RESIDENT_AFTER_STEP": "1",
|
||||
"AMSS_CUDA_ESCALAR_KEEP_ALL_LEVELS": "1",
|
||||
"AMSS_CUDA_EM_CACHE_SOURCES": "1",
|
||||
"AMSS_CUDA_EM_ZERO_FASTPATH": "1",
|
||||
"AMSS_EM_ZERO_ANALYSIS_FASTPATH": "1",
|
||||
"AMSS_EM_ZERO_RESIDENT_DOWNLOAD_FASTPATH": "1",
|
||||
"AMSS_CUDA_AMR_HOST_STAGED": "1",
|
||||
"AMSS_CUDA_AMR_RESTRICT_DEVICE": "0",
|
||||
"AMSS_CUDA_Z4C_AMR_DEVICE": "0",
|
||||
"AMSS_CUDA_AMR_RESTRICT_DEVICE": "1",
|
||||
"AMSS_CUDA_AMR_RESTRICT_BATCH": "0",
|
||||
"AMSS_CUDA_DEVICE_SEGMENT_BATCH": "0",
|
||||
"AMSS_CUDA_UNCACHED_DEVICE_BUFFERS": "1",
|
||||
"AMSS_SHELL_FAST_INTERP": "0",
|
||||
"AMSS_SHELL_PARALLEL_INTERP": "0",
|
||||
"AMSS_SHELL_CUDA_INTERP": "0",
|
||||
"AMSS_CUDA_PIN_ESCALAR_TRANSFERS": "0",
|
||||
"AMSS_ESCALAR_GPU_RK": "0",
|
||||
}
|
||||
if finite_difference in ("2nd-order", "8th-order"):
|
||||
defaults.update({
|
||||
"AMSS_INTERP_FAST": "0",
|
||||
"AMSS_INTERP_GPU": "0",
|
||||
"AMSS_CUDA_AWARE_MPI": "0",
|
||||
})
|
||||
if finite_difference == "8th-order" and getattr(input_data, "Equation_Class", "") == "BSSN-EM":
|
||||
defaults.update({
|
||||
"AMSS_CUDA_AMR_RESTRICT_DEVICE": "1",
|
||||
"AMSS_CUDA_AMR_RESTRICT_BATCH": "1",
|
||||
"AMSS_CUDA_DEVICE_SEGMENT_BATCH": "1",
|
||||
})
|
||||
if getattr(input_data, "basic_grid_set", "") == "Shell-Patch":
|
||||
defaults.update({
|
||||
"AMSS_CUDA_AWARE_MPI": "0",
|
||||
"AMSS_SHELL_FAST_INTERP": "1",
|
||||
"AMSS_SHELL_PARALLEL_INTERP": "1",
|
||||
"AMSS_SHELL_INTERP_THREADS": "16",
|
||||
})
|
||||
if getattr(input_data, "Equation_Class", "") in ("BSSN", "BSSN-EScalar", "Z4C"):
|
||||
defaults["AMSS_CUDA_AMR_RESTRICT_DEVICE"] = "1"
|
||||
if getattr(input_data, "Equation_Class", "") == "Z4C":
|
||||
defaults.update({
|
||||
"AMSS_Z4C_CUDA_RESIDENT": "1",
|
||||
"AMSS_CONSTRAINT_OUT_EVERY": "1000000",
|
||||
})
|
||||
defaults["AMSS_CUDA_Z4C_KEEP_RESIDENT_AFTER_STEP"] = "0"
|
||||
defaults["AMSS_CUDA_KEEP_ALL_LEVELS"] = "0"
|
||||
for key, value in defaults.items():
|
||||
runtime_env.setdefault(key, value)
|
||||
|
||||
@@ -301,58 +268,29 @@ def run_ABE():
|
||||
mpi_env = None
|
||||
started_mps = False
|
||||
|
||||
mpi_processes = int(input_data.MPI_processes)
|
||||
if (input_data.GPU_Calculation == "yes" and
|
||||
getattr(input_data, "Equation_Class", "") == "Z4C"):
|
||||
z4c_env_np = os.environ.get("AMSS_Z4C_GPU_MPI_PROCESSES")
|
||||
if z4c_env_np and int(z4c_env_np) > 0:
|
||||
mpi_processes = int(z4c_env_np)
|
||||
elif mpi_processes < 4:
|
||||
mpi_processes = 4
|
||||
if (input_data.GPU_Calculation == "yes" and
|
||||
getattr(input_data, "basic_grid_set", "") == "Shell-Patch"):
|
||||
shell_env_np = os.environ.get("AMSS_SHELL_GPU_MPI_PROCESSES")
|
||||
if shell_env_np and int(shell_env_np) > 0:
|
||||
mpi_processes = int(shell_env_np)
|
||||
elif mpi_processes < 4:
|
||||
mpi_processes = 4
|
||||
|
||||
if (input_data.GPU_Calculation == "no"):
|
||||
mpi_command = NUMACTL_CPU_BIND + " mpirun -np " + str(mpi_processes) + " ./ABE"
|
||||
mpi_command = NUMACTL_CPU_BIND + " mpirun -np " + str(input_data.MPI_processes) + " ./ABE"
|
||||
#mpi_command = " mpirun -np " + str(input_data.MPI_processes) + " ./ABE"
|
||||
mpi_command_outfile = "ABE_out.log"
|
||||
elif (input_data.GPU_Calculation == "yes"):
|
||||
mpi_command = NUMACTL_CPU_BIND + " I_MPI_OFFLOAD=1 I_MPI_OFFLOAD_IPC=0 mpirun -np " + str(mpi_processes) + " ./ABE_CUDA"
|
||||
mpi_command = NUMACTL_CPU_BIND + " mpirun -np " + str(input_data.MPI_processes) + " ./ABE_CUDA"
|
||||
mpi_command_outfile = "ABEGPU_out.log"
|
||||
mpi_env = _gpu_runtime_env()
|
||||
started_mps = _start_cuda_mps_if_requested(mpi_env)
|
||||
print(" GPU optimized runtime switches:")
|
||||
print(f" MPI processes={mpi_processes}")
|
||||
print(f" AMSS_INTERP_FAST={mpi_env.get('AMSS_INTERP_FAST', '')}")
|
||||
print(f" AMSS_INTERP_GPU={mpi_env.get('AMSS_INTERP_GPU', '')}")
|
||||
print(f" AMSS_ANALYSIS_MAP_EVERY={mpi_env.get('AMSS_ANALYSIS_MAP_EVERY', '')}")
|
||||
print(f" AMSS_EVOLVE_TIMING={mpi_env.get('AMSS_EVOLVE_TIMING', '')}")
|
||||
print(f" AMSS_ESCALAR_STEP_TIMING={mpi_env.get('AMSS_ESCALAR_STEP_TIMING', '')}")
|
||||
print(f" AMSS_CUDA_AWARE_MPI={mpi_env.get('AMSS_CUDA_AWARE_MPI', '')}")
|
||||
print(f" AMSS_CUDA_KEEP_RESIDENT_AFTER_STEP={mpi_env.get('AMSS_CUDA_KEEP_RESIDENT_AFTER_STEP', '')}")
|
||||
print(f" AMSS_CUDA_Z4C_KEEP_RESIDENT_AFTER_STEP={mpi_env.get('AMSS_CUDA_Z4C_KEEP_RESIDENT_AFTER_STEP', '')}")
|
||||
print(f" AMSS_CUDA_KEEP_ALL_LEVELS={mpi_env.get('AMSS_CUDA_KEEP_ALL_LEVELS', '')}")
|
||||
print(f" AMSS_CUDA_ESCALAR_KEEP_RESIDENT_AFTER_STEP={mpi_env.get('AMSS_CUDA_ESCALAR_KEEP_RESIDENT_AFTER_STEP', '')}")
|
||||
print(f" AMSS_CUDA_ESCALAR_KEEP_ALL_LEVELS={mpi_env.get('AMSS_CUDA_ESCALAR_KEEP_ALL_LEVELS', '')}")
|
||||
print(f" AMSS_CUDA_EM_CACHE_SOURCES={mpi_env.get('AMSS_CUDA_EM_CACHE_SOURCES', '')}")
|
||||
print(f" AMSS_CUDA_EM_ZERO_FASTPATH={mpi_env.get('AMSS_CUDA_EM_ZERO_FASTPATH', '')}")
|
||||
print(f" AMSS_EM_ZERO_ANALYSIS_FASTPATH={mpi_env.get('AMSS_EM_ZERO_ANALYSIS_FASTPATH', '')}")
|
||||
print(f" AMSS_EM_ZERO_RESIDENT_DOWNLOAD_FASTPATH={mpi_env.get('AMSS_EM_ZERO_RESIDENT_DOWNLOAD_FASTPATH', '')}")
|
||||
print(f" AMSS_CUDA_AMR_HOST_STAGED={mpi_env.get('AMSS_CUDA_AMR_HOST_STAGED', '')}")
|
||||
print(f" AMSS_CUDA_Z4C_AMR_DEVICE={mpi_env.get('AMSS_CUDA_Z4C_AMR_DEVICE', '')}")
|
||||
print(f" AMSS_CUDA_AMR_RESTRICT_DEVICE={mpi_env.get('AMSS_CUDA_AMR_RESTRICT_DEVICE', '')}")
|
||||
print(f" AMSS_CUDA_AMR_RESTRICT_BATCH={mpi_env.get('AMSS_CUDA_AMR_RESTRICT_BATCH', '')}")
|
||||
print(f" AMSS_CUDA_DEVICE_SEGMENT_BATCH={mpi_env.get('AMSS_CUDA_DEVICE_SEGMENT_BATCH', '')}")
|
||||
print(f" AMSS_CUDA_UNCACHED_DEVICE_BUFFERS={mpi_env.get('AMSS_CUDA_UNCACHED_DEVICE_BUFFERS', '')}")
|
||||
print(f" AMSS_SHELL_FAST_INTERP={mpi_env.get('AMSS_SHELL_FAST_INTERP', '')}")
|
||||
print(f" AMSS_SHELL_PARALLEL_INTERP={mpi_env.get('AMSS_SHELL_PARALLEL_INTERP', '')}")
|
||||
print(f" AMSS_SHELL_CUDA_INTERP={mpi_env.get('AMSS_SHELL_CUDA_INTERP', '')}")
|
||||
print(f" AMSS_SHELL_INTERP_THREADS={mpi_env.get('AMSS_SHELL_INTERP_THREADS', '')}")
|
||||
print(f" AMSS_Z4C_CUDA_RESIDENT={mpi_env.get('AMSS_Z4C_CUDA_RESIDENT', '')}")
|
||||
print(f" AMSS_CONSTRAINT_OUT_EVERY={mpi_env.get('AMSS_CONSTRAINT_OUT_EVERY', '')}")
|
||||
print(f" AMSS_CUDA_PIN_ESCALAR_TRANSFERS={mpi_env.get('AMSS_CUDA_PIN_ESCALAR_TRANSFERS', '')}")
|
||||
print(f" AMSS_ESCALAR_GPU_RK={mpi_env.get('AMSS_ESCALAR_GPU_RK', '')}")
|
||||
if "CUDA_MPS_PIPE_DIRECTORY" in mpi_env:
|
||||
print(f" CUDA_MPS_PIPE_DIRECTORY={mpi_env['CUDA_MPS_PIPE_DIRECTORY']}")
|
||||
|
||||
|
||||
@@ -808,10 +808,10 @@ def generate_ADMmass_plot( outdir, figure_outdir, detector_number_i ):
|
||||
|
||||
## Plot constraint violation for each grid level
|
||||
|
||||
def generate_constraint_check_plot( outdir, figure_outdir, input_level_number ):
|
||||
|
||||
# path to data file
|
||||
file0 = os.path.join(outdir, "bssn_constraint.dat")
|
||||
def generate_constraint_check_plot( outdir, figure_outdir, input_level_number ):
|
||||
|
||||
# path to data file
|
||||
file0 = os.path.join(outdir, "bssn_constraint.dat")
|
||||
|
||||
if ( input_level_number == 0 ):
|
||||
print( )
|
||||
@@ -819,26 +819,13 @@ def generate_constraint_check_plot( outdir, figure_outdir, input_level_number ):
|
||||
print( )
|
||||
print( " corresponding data file = ", file0 )
|
||||
print( )
|
||||
|
||||
print( " Begin the constraint violation plot for grid level number = ", input_level_number )
|
||||
|
||||
if (not os.path.exists(file0)) or os.path.getsize(file0) == 0:
|
||||
if ( input_level_number == 0 ):
|
||||
print( " Constraint data file is empty; skip constraint violation plots" )
|
||||
print( )
|
||||
return
|
||||
|
||||
# load the full data file (assumed whitespace-separated floats)
|
||||
data = numpy.loadtxt(file0)
|
||||
data = numpy.atleast_2d(data)
|
||||
|
||||
if data.shape[1] < 8:
|
||||
if ( input_level_number == 0 ):
|
||||
print( " Constraint data file has insufficient columns; skip constraint violation plots" )
|
||||
print( )
|
||||
return
|
||||
|
||||
# extract columns from the constraint data file
|
||||
|
||||
print( " Begin the constraint violation plot for grid level number = ", input_level_number )
|
||||
|
||||
# load the full data file (assumed whitespace-separated floats)
|
||||
data = numpy.loadtxt(file0)
|
||||
|
||||
# extract columns from the constraint data file
|
||||
time = data[:,0]
|
||||
Constraint_H = data[:,1]
|
||||
Constraint_Px = data[:,2]
|
||||
|
||||
Reference in New Issue
Block a user