From ae7b77e44cef3b7cd3d912f72ba4cce702997853 Mon Sep 17 00:00:00 2001 From: CGH0S7 <776459475@qq.com> Date: Tue, 20 Jan 2026 00:31:40 +0800 Subject: [PATCH] Setup GW150914-mini test case for laptop development - Add AMSS_NCKU_Input_Mini.py with reduced grid resolution and MPI processes - Add AMSS_NCKU_MiniProgram.py launcher with automatic configuration swapping - Update makefile_and_run.py to reduce build jobs and remove CPU binding for laptop - Update .gitignore to exclude GW150914-mini output directory --- .gitignore | 1 + AMSS_NCKU_Input_Mini.py | 232 +++++++++++++++++++++++++++++++++++++++ AMSS_NCKU_MiniProgram.py | 224 +++++++++++++++++++++++++++++++++++++ makefile_and_run.py | 5 +- 4 files changed, 460 insertions(+), 2 deletions(-) create mode 100644 AMSS_NCKU_Input_Mini.py create mode 100644 AMSS_NCKU_MiniProgram.py diff --git a/.gitignore b/.gitignore index 063cdec..d56e4db 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ __pycache__ GW150914 GW150914-origin +GW150914-mini docs *.tmp diff --git a/AMSS_NCKU_Input_Mini.py b/AMSS_NCKU_Input_Mini.py new file mode 100644 index 0000000..765472f --- /dev/null +++ b/AMSS_NCKU_Input_Mini.py @@ -0,0 +1,232 @@ + +################################################# +## +## This file provides the input parameters required for numerical relativity. +## XIAOQU +## 2024/03/19 --- 2025/09/14 +## Modified for GW150914-mini test case +## +################################################# + +import numpy + +################################################# + +## Setting MPI processes and the output file directory + +File_directory = "GW150914-mini" ## output file directory +Output_directory = "binary_output" ## binary data file directory + ## The file directory name should not be too long +MPI_processes = 4 ## number of mpi processes used in the simulation (Reduced for laptop) + +GPU_Calculation = "no" ## Use GPU or not + ## (prefer "no" in the current version, because the GPU part may have bugs when integrated in this Python interface) +CPU_Part = 1.0 +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" + ## 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" +Finite_Diffenence_Method = "4th-order" ## finite-difference method: choose "2nd-order", "4th-order", "6th-order", "8th-order" + +################################################# + + +################################################# + +## Setting the time evolutionary information + +Start_Evolution_Time = 0.0 ## start evolution time t0 +Final_Evolution_Time = 100.0 ## final evolution time t1 (Reduced for quick test) +Check_Time = 10.0 +Dump_Time = 10.0 ## time inteval dT for dumping binary data +D2_Dump_Time = 10.0 ## dump the ascii data for 2d surface after dT' +Analysis_Time = 1.0 ## dump the puncture position and GW psi4 after dT" +Evolution_Step_Number = 10000000 ## stop the calculation after the maximal step number +Courant_Factor = 0.5 ## Courant Factor +Dissipation = 0.15 ## Kreiss-Oliger Dissipation Strength + +################################################# + + +################################################# + +## Setting the grid structure + +basic_grid_set = "Patch" ## grid structure: choose "Patch" or "Shell-Patch" +grid_center_set = "Cell" ## grid center: chose "Cell" or "Vertex" + +grid_level = 7 ## total number of AMR grid levels (Reduced from 9) +static_grid_level = 4 ## number of AMR static grid levels (Reduced from 5) +moving_grid_level = grid_level - static_grid_level ## number of AMR moving grid levels + +analysis_level = 0 +refinement_level = 3 ## time refinement start from this grid level + +largest_box_xyz_max = [320.0, 320.0, 320.0] ## scale of the largest box + ## not ne cess ary to be cubic for "Patch" grid s tructure + ## need to be a cubic box for "Shell-Patch" grid structure +largest_box_xyz_min = - numpy.array(largest_box_xyz_max) + +static_grid_number = 48 ## grid points of each static AMR grid (in x direction) (Reduced from 96) + ## (grid points in y and z directions are automatically adjusted) +moving_grid_number = 24 ## grid points of each moving AMR grid (Reduced from 48) +shell_grid_number = [32, 32, 100] ## grid points of Shell-Patch grid + ## in (phi, theta, r) direction +devide_factor = 2.0 ## resolution between different grid levels dh0/dh1, only support 2.0 now + + +static_grid_type = 'Linear' ## AMR static grid structure , only supports "Linear" +moving_grid_type = 'Linear' ## AMR moving grid structure , only supports "Linear" + +quarter_sphere_number = 48 ## grid number of 1/4 s pher ical surface (Reduced from 96) + ## (which is needed for evaluating the spherical surface integral) + +################################################# + + +################################################# + +## Setting the puncture information + +puncture_number = 2 + +position_BH = numpy.zeros( (puncture_number, 3) ) +parameter_BH = numpy.zeros( (puncture_number, 3) ) +dimensionless_spin_BH = numpy.zeros( (puncture_number, 3) ) +momentum_BH = numpy.zeros( (puncture_number, 3) ) + +puncture_data_set = "Manually" ## Method to give Puncture’s positions and momentum + ## choose "Manually" or "Automatically-BBH" + ## Prefer to choose "Manually", because "Automatically-BBH" is developing now + +## initial orbital distance and ellipticity for BBHs system +## ( needed for "Automatically-BBH" case , not affect the "Manually" case ) +Distance = 10.0 +e0 = 0.0 + +## black hole parameter (M Q* a*) +parameter_BH[0] = [ 36.0/(36.0+29.0), 0.0, +0.31 ] +parameter_BH[1] = [ 29.0/(36.0+29.0), 0.0, -0.46 ] +## dimensionless spin in each direction +dimensionless_spin_BH[0] = [ 0.0, 0.0, +0.31 ] +dimensionless_spin_BH[1] = [ 0.0, 0.0, -0.46 ] + +## use Brugmann's convention +## -----0-----> y +## - + + +#--------------------------------------------- + +## If puncture_data_set is chosen to be "Manually", it is necessary to set the position and momentum of each puncture manually + +## initial position for each puncture +position_BH[0] = [ 0.0, 10.0*29.0/(36.0+29.0), 0.0 ] +position_BH[1] = [ 0.0, -10.0*36.0/(36.0+29.0), 0.0 ] + +## initial mumentum for each puncture +## (needed for "Manually" case, does not affect the "Automatically-BBH" case) +momentum_BH[0] = [ -0.09530152296974252, -0.00084541526517121, 0.0 ] +momentum_BH[1] = [ +0.09530152296974252, +0.00084541526517121, 0.0 ] + + +################################################# + + +################################################# + +## Setting the gravitational wave information + +GW_L_max = 4 ## maximal L number in gravitational wave +GW_M_max = 4 ## maximal M number in gravitational wave +Detector_Number = 12 ## number of dector +Detector_Rmin = 50.0 ## nearest dector distance +Detector_Rmax = 160.0 ## farest dector distance + +################################################# + + +################################################# + +## Setting the apprent horizon + +AHF_Find = "no" ## whether to find the apparent horizon: choose "yes" or "no" + +AHF_Find_Every = 24 +AHF_Dump_Time = 20.0 + +################################################# + + +################################################# + +## Other parameters (testing) +## Only influence the Equation_Class = "BSSN-EScalar" case + +FR_a2 = 3.0 ## f(R) = R + a2 * R^2 +FR_l2 = 10000.0 +FR_phi0 = 0.00005 +FR_r0 = 120.0 +FR_sigma0 = 8.0 +FR_Choice = 2 ## Choice options: 1 2 3 4 5 + ## 1: phi(r) = phi0 * Exp(-(r-r0)**2/sigma0) + ## V(r) = 0 + ## 2: phi(r) = phi0 * a2^2/(1+a2^2) + ## V(r) = Exp(-8*Sqrt(PI/3)*phi(r)) * (1-Exp(4*Sqrt(PI/3)*phi(r)))**2 / (32*PI*a2) + ## 3: Schrodinger-Newton gived by system phi(r) + ## V(r) = Exp(-8*Sqrt(PI/3)*phi(r)) * (1-Exp(4*Sqrt(PI/3)*phi(r)))**2 / (32*PI*a2) + ## 4: phi(r) = phi0 * 0.5 * ( tanh((r+r0)/sigma0) - tanh((r-r0)/sigma0) ) + ## V(r) = 0 + ## f(R) = R + a2*R^2 with a2 = +oo + ## 5: phi(r) = phi0 * Exp(-(r-r0)**2/sigma) + ## V(r) = 0 + +################################################# + + +################################################# + +## Other parameters (testing) +## (please do not change if not necessary) + +boundary_choice = "BAM-choice" ## Sommerfeld boundary condition : choose "BAM-choice" or "Shibata-choice" + ## prefer "BAM-choice" + +gauge_choice = 0 ## gauge choice + ## 0: B^i gauge + ## 1: David's puncture gauge + ## 2: MB B^i gauge + ## 3: RIT B^i gauge + ## 4: MB beta gauge + ## 5: RIT beta gauge + ## 6: MGB1 B^i gauge + ## 7: MGB2 B^i gauge + ## prefer 0 or 1 + +tetrad_type = 2 ## tetradtype + ## v:r; u: phi; w: theta + ## v^a = (x,y,z) + ## 0: orthonormal order: v,u,w + ## v^a = (x,y,z) + ## m = (phi - i theta)/sqrt(2) + ## following Frans, Eq.(8) of PRD 75, 124018(2007) + ## 1: orthonormal order: w,u,v + ## m = (theta + i phi)/sqrt(2) + ## following Sperhake, Eq.(3.2) of PRD 85, 124062(2012) + ## 2: orthonormal order: v,u,w + ## v_a = (x,y,z) + ## m = (phi - i theta)/sqrt(2) + ## following Frans, Eq.(8) of PRD 75, 124018(2007) + ## this version recommend set to 2 + ## prefer 2 + +################################################# diff --git a/AMSS_NCKU_MiniProgram.py b/AMSS_NCKU_MiniProgram.py new file mode 100644 index 0000000..9d8e3da --- /dev/null +++ b/AMSS_NCKU_MiniProgram.py @@ -0,0 +1,224 @@ +################################################################## +## +## AMSS-NCKU Numerical Relativity Mini Test Program +## Author: Assistant (based on Xiaoqu's code) +## 2026/01/20 +## +## This script runs a scaled-down version of the GW150914 test case +## suitable for laptop testing. +## +################################################################## + +import os +import shutil +import sys +import time + +# --- Context Manager for Input File Swapping --- +class InputFileSwapper: + def __init__(self, mini_file="AMSS_NCKU_Input_Mini.py", target_file="AMSS_NCKU_Input.py"): + self.mini_file = mini_file + self.target_file = target_file + self.backup_file = target_file + ".bak" + self.swapped = False + + def __enter__(self): + print(f"[MiniProgram] Swapping {self.target_file} with {self.mini_file}...") + if os.path.exists(self.target_file): + shutil.move(self.target_file, self.backup_file) + shutil.copy(self.mini_file, self.target_file) + self.swapped = True + return self + + def __exit__(self, exc_type, exc_value, traceback): + if self.swapped: + print(f"[MiniProgram] Restoring original {self.target_file}...") + os.remove(self.target_file) + if os.path.exists(self.backup_file): + shutil.move(self.backup_file, self.target_file) + +def main(): + # Use the swapper to ensure all imported modules see the mini configuration + with InputFileSwapper(): + + # Import modules AFTER swapping input file + try: + import AMSS_NCKU_Input as input_data + import print_information + import setup + import numerical_grid + import generate_macrodef + import makefile_and_run + import generate_TwoPuncture_input + import renew_puncture_parameter + import plot_xiaoqu + import plot_GW_strain_amplitude_xiaoqu + except ImportError as e: + print(f"Error importing modules: {e}") + return + + print_information.print_program_introduction() + + print("\n" + "#"*60) + print(" RUNNING MINI TEST CASE: GW150914-mini") + print("#"*60 + "\n") + + # --- Directory Setup --- + File_directory = os.path.join(input_data.File_directory) + + if os.path.exists(File_directory): + print(f" Output directory '{File_directory}' exists. Removing for mini test...") + shutil.rmtree(File_directory, ignore_errors=True) + + os.mkdir(File_directory) + shutil.copy("AMSS_NCKU_Input.py", File_directory) # Copies the current (mini) input + + output_directory = os.path.join(File_directory, "AMSS_NCKU_output") + os.mkdir(output_directory) + + binary_results_directory = os.path.join(output_directory, input_data.Output_directory) + os.mkdir(binary_results_directory) + + figure_directory = os.path.join(File_directory, "figure") + os.mkdir(figure_directory) + + print(" Output directories generated.\n") + + # --- Setup and Input Generation --- + setup.print_input_data(File_directory) + setup.generate_AMSSNCKU_input() + setup.print_puncture_information() + + print("\n Generating AMSS-NCKU input parfile...") + numerical_grid.append_AMSSNCKU_cgh_input() + + print("\n Plotting initial grid...") + numerical_grid.plot_initial_grid() + + print("\n Generating macro files...") + generate_macrodef.generate_macrodef_h() + generate_macrodef.generate_macrodef_fh() + + # --- Compilation Preparation --- + print("\n Preparing to compile and run...") + + AMSS_NCKU_source_path = "AMSS_NCKU_source" + AMSS_NCKU_source_copy = os.path.join(File_directory, "AMSS_NCKU_source_copy") + + if not os.path.exists(AMSS_NCKU_source_path): + print(" Error: AMSS_NCKU_source not found! Please run in the project root.") + return + + shutil.copytree(AMSS_NCKU_source_path, AMSS_NCKU_source_copy) + + macrodef_h_path = os.path.join(File_directory, "macrodef.h") + macrodef_fh_path = os.path.join(File_directory, "macrodef.fh") + + shutil.copy2(macrodef_h_path, AMSS_NCKU_source_copy) + shutil.copy2(macrodef_fh_path, AMSS_NCKU_source_copy) + + # --- Compilation --- + cwd = os.getcwd() + os.chdir(AMSS_NCKU_source_copy) + + print(" Compiling ABE...") + makefile_and_run.makefile_ABE() + + if (input_data.Initial_Data_Method == "Ansorg-TwoPuncture" ): + print(" Compiling TwoPunctureABE...") + makefile_and_run.makefile_TwoPunctureABE() + + os.chdir(cwd) + + # --- Copy Executables --- + if (input_data.GPU_Calculation == "no"): + ABE_file = os.path.join(AMSS_NCKU_source_copy, "ABE") + else: + ABE_file = os.path.join(AMSS_NCKU_source_copy, "ABEGPU") + + if not os.path.exists(ABE_file): + print(" Error: ABE executable compilation failed.") + return + + shutil.copy2(ABE_file, output_directory) + + TwoPuncture_file = os.path.join(AMSS_NCKU_source_copy, "TwoPunctureABE") + if (input_data.Initial_Data_Method == "Ansorg-TwoPuncture" ): + if not os.path.exists(TwoPuncture_file): + print(" Error: TwoPunctureABE compilation failed.") + return + shutil.copy2(TwoPuncture_file, output_directory) + + # --- Execution --- + start_time = time.time() + + if (input_data.Initial_Data_Method == "Ansorg-TwoPuncture" ): + print("\n Generating TwoPuncture input...") + generate_TwoPuncture_input.generate_AMSSNCKU_TwoPuncture_input() + + AMSS_NCKU_TwoPuncture_inputfile = 'AMSS-NCKU-TwoPuncture.input' + AMSS_NCKU_TwoPuncture_inputfile_path = os.path.join( File_directory, AMSS_NCKU_TwoPuncture_inputfile ) + shutil.copy2( AMSS_NCKU_TwoPuncture_inputfile_path, os.path.join(output_directory, 'TwoPunctureinput.par') ) + + print(" Running TwoPunctureABE...") + os.chdir(output_directory) + makefile_and_run.run_TwoPunctureABE() + os.chdir(cwd) + + # Update Puncture Parameter + renew_puncture_parameter.append_AMSSNCKU_BSSN_input(File_directory, output_directory) + + AMSS_NCKU_inputfile = 'AMSS-NCKU.input' + AMSS_NCKU_inputfile_path = os.path.join(File_directory, AMSS_NCKU_inputfile) + shutil.copy2( AMSS_NCKU_inputfile_path, os.path.join(output_directory, 'input.par') ) + + print("\n Input files ready. Launching ABE...") + + os.chdir(output_directory) + makefile_and_run.run_ABE() + os.chdir(cwd) + + end_time = time.time() + elapsed_time = end_time - start_time + + # --- Post-processing --- + print("\n Copying output files for inspection...") + AMSS_NCKU_error_file_path = os.path.join(binary_results_directory, "setting.par") + if os.path.exists(AMSS_NCKU_error_file_path): + shutil.copy( AMSS_NCKU_error_file_path, os.path.join(output_directory, "AMSSNCKU_setting_parameter") ) + + AMSS_NCKU_error_file_path = os.path.join(binary_results_directory, "Error.log") + if os.path.exists(AMSS_NCKU_error_file_path): + shutil.copy( AMSS_NCKU_error_file_path, os.path.join(output_directory, "Error.log") ) + + for fname in ["bssn_BH.dat", "bssn_ADMQs.dat", "bssn_psi4.dat", "bssn_constraint.dat"]: + fpath = os.path.join(binary_results_directory, fname) + if os.path.exists(fpath): + shutil.copy(fpath, os.path.join(output_directory, fname)) + + # --- Plotting --- + print("\n Plotting results...") + try: + plot_xiaoqu.generate_puncture_orbit_plot( binary_results_directory, figure_directory ) + plot_xiaoqu.generate_puncture_orbit_plot3D( binary_results_directory, figure_directory ) + plot_xiaoqu.generate_puncture_distence_plot( binary_results_directory, figure_directory ) + + for i in range(input_data.Detector_Number): + plot_xiaoqu.generate_gravitational_wave_psi4_plot( binary_results_directory, figure_directory, i ) + plot_GW_strain_amplitude_xiaoqu.generate_gravitational_wave_amplitude_plot( binary_results_directory, figure_directory, i ) + + for i in range(input_data.Detector_Number): + plot_xiaoqu.generate_ADMmass_plot( binary_results_directory, figure_directory, i ) + + for i in range(input_data.grid_level): + plot_xiaoqu.generate_constraint_check_plot( binary_results_directory, figure_directory, i ) + + plot_xiaoqu.generate_binary_data_plot( binary_results_directory, figure_directory ) + except Exception as e: + print(f"Warning: Plotting failed: {e}") + + print(f"\n Program Cost = {elapsed_time:.2f} Seconds \n") + print(" AMSS-NCKU-Python simulation finished (Mini Test).\n") + +if __name__ == "__main__": + main() diff --git a/makefile_and_run.py b/makefile_and_run.py index 6140f99..728f3ec 100755 --- a/makefile_and_run.py +++ b/makefile_and_run.py @@ -15,12 +15,13 @@ import subprocess ## taskset ensures all child processes inherit the CPU affinity mask ## This forces make and all compiler processes to use only nohz_full cores (4-55, 60-111) ## Format: taskset -c 4-55,60-111 ensures processes only run on these cores -NUMACTL_CPU_BIND = "taskset -c 4-55,60-111" +#NUMACTL_CPU_BIND = "taskset -c 4-55,60-111" +NUMACTL_CPU_BIND = "" ## Build parallelism configuration ## Use nohz_full cores (4-55, 60-111) for compilation: 52 + 52 = 104 cores ## Set make -j to utilize available cores for faster builds -BUILD_JOBS = 104 +BUILD_JOBS = 14 ##################################################################