Compare commits
11 commits
main
...
tests/Grav
Author | SHA1 | Date | |
---|---|---|---|
78d747d5aa | |||
21723980c2 | |||
3e81a3bd10 | |||
a12e1a5ab4 | |||
bd0e5f9ffc | |||
fdaf5e9086 | |||
1ca9b4fb09 | |||
78e1b4cacf | |||
b0c106bd8b | |||
9d6f8f9de2 | |||
928ea5eee8 |
4 changed files with 59 additions and 25 deletions
|
@ -237,6 +237,7 @@ def progress_bar_from_logfile(filename:str, desc:str="", verbose:int=1, **kwargs
|
||||||
k=0
|
k=0
|
||||||
limit=600
|
limit=600
|
||||||
update_interval=0.2
|
update_interval=0.2
|
||||||
|
sleep(2) # Wait for the process to be launched, and for the previous log file to be overwritten if necessary.
|
||||||
wait_until_file_exists(filename, verbose=verbose, limit=limit)
|
wait_until_file_exists(filename, verbose=verbose, limit=limit)
|
||||||
current_operation, total_operations = get_progress_from_logfile(filename)
|
current_operation, total_operations = get_progress_from_logfile(filename)
|
||||||
previous_operation = 0
|
previous_operation = 0
|
||||||
|
@ -265,4 +266,4 @@ def progress_bar_from_logfile(filename:str, desc:str="", verbose:int=1, **kwargs
|
||||||
if k*update_interval >= limit:
|
if k*update_interval >= limit:
|
||||||
print_message(f"Progress bar timed out after {limit} seconds.", 3, "low level", verbose=verbose)
|
print_message(f"Progress bar timed out after {limit} seconds.", 3, "low level", verbose=verbose)
|
||||||
|
|
||||||
return
|
return
|
|
@ -47,6 +47,15 @@ def register_arguments_card(parser:ArgumentParser):
|
||||||
parser.add_argument("--OutputFCsDensity", type=str, default=None, help="Output FCs density file.")
|
parser.add_argument("--OutputFCsDensity", type=str, default=None, help="Output FCs density file.")
|
||||||
parser.add_argument("--OutputFCsSnapshot", type=str, default=None, help="Output FCs snapshot file.")
|
parser.add_argument("--OutputFCsSnapshot", type=str, default=None, help="Output FCs snapshot file.")
|
||||||
parser.add_argument("--OutputRngStateLPT", type=str, default=None, help="Output RNG state file.")
|
parser.add_argument("--OutputRngStateLPT", type=str, default=None, help="Output RNG state file.")
|
||||||
|
## Tests with phiBCs and density
|
||||||
|
parser.add_argument("--WriteGravPot", type=bool, default=False, help="Write gravitational potential.")
|
||||||
|
parser.add_argument("--OutputGravitationalPotentialBase", type=str, default=None, help="Output gravitational potential base.")
|
||||||
|
parser.add_argument("--MeshGravPot", type=int, default=None, help="Mesh for gravitational potential.")
|
||||||
|
parser.add_argument("--WriteDensity", type=bool, default=False, help="Write density.")
|
||||||
|
parser.add_argument("--OutputDensityBase", type=str, default=None, help="Output density base.")
|
||||||
|
parser.add_argument("--MeshDensity", type=int, default=None, help="Mesh for density.")
|
||||||
|
parser.add_argument("--LoadPhiBCs", type=bool, default=False, help="Load phiBCs.")
|
||||||
|
parser.add_argument("--InputPhiBCsBase", type=str, default=None, help="Input phiBCs file base.")
|
||||||
|
|
||||||
|
|
||||||
def register_arguments_card_for_ICs(parser:ArgumentParser):
|
def register_arguments_card_for_ICs(parser:ArgumentParser):
|
||||||
|
@ -118,6 +127,16 @@ def parse_arguments_card(parsed_args):
|
||||||
OutputFCsDensity=parsed_args.OutputFCsDensity,
|
OutputFCsDensity=parsed_args.OutputFCsDensity,
|
||||||
OutputFCsSnapshot=parsed_args.OutputFCsSnapshot,
|
OutputFCsSnapshot=parsed_args.OutputFCsSnapshot,
|
||||||
OutputRngStateLPT=parsed_args.OutputRngStateLPT,
|
OutputRngStateLPT=parsed_args.OutputRngStateLPT,
|
||||||
|
## Tests with phiBCs and density
|
||||||
|
WriteGravPot=parsed_args.WriteGravPot,
|
||||||
|
OutputGravitationalPotentialBase=parsed_args.OutputGravitationalPotentialBase,
|
||||||
|
MeshGravPot=parsed_args.MeshGravPot,
|
||||||
|
WriteDensity=parsed_args.WriteDensity,
|
||||||
|
OutputDensityBase=parsed_args.OutputDensityBase,
|
||||||
|
MeshDensity=parsed_args.MeshDensity,
|
||||||
|
LoadPhiBCs=parsed_args.LoadPhiBCs,
|
||||||
|
InputPhiBCsBase=parsed_args.InputPhiBCsBase,
|
||||||
|
## Cosmological parameters
|
||||||
h=cosmo_dict["h"],
|
h=cosmo_dict["h"],
|
||||||
Omega_m=cosmo_dict["Omega_m"],
|
Omega_m=cosmo_dict["Omega_m"],
|
||||||
Omega_b=cosmo_dict["Omega_b"],
|
Omega_b=cosmo_dict["Omega_b"],
|
||||||
|
@ -203,6 +222,17 @@ def parse_arguments_card(parsed_args):
|
||||||
card_dict["OutputFCsSnapshot"] = main_dict["resultdir"]+"final_particles_"+main_dict["simname"]+".gadget3"
|
card_dict["OutputFCsSnapshot"] = main_dict["resultdir"]+"final_particles_"+main_dict["simname"]+".gadget3"
|
||||||
if card_dict["OutputRngStateLPT"] is None:
|
if card_dict["OutputRngStateLPT"] is None:
|
||||||
card_dict["OutputRngStateLPT"] = main_dict["workdir"]+"rng_state.h5"
|
card_dict["OutputRngStateLPT"] = main_dict["workdir"]+"rng_state.h5"
|
||||||
|
## Tests with phiBCs and density
|
||||||
|
if card_dict["OutputGravitationalPotentialBase"] is None:
|
||||||
|
card_dict["OutputGravitationalPotentialBase"] = main_dict["workdir"]+"gravpot_"+main_dict["simname"]
|
||||||
|
if card_dict["MeshGravPot"] is None:
|
||||||
|
card_dict["MeshGravPot"] = card_dict["N_PM_mesh"]
|
||||||
|
if card_dict["OutputDensityBase"] is None:
|
||||||
|
card_dict["OutputDensityBase"] = main_dict["workdir"]+"density_"+main_dict["simname"]
|
||||||
|
if card_dict["MeshDensity"] is None:
|
||||||
|
card_dict["MeshDensity"] = card_dict["N_PM_mesh"]
|
||||||
|
if card_dict["InputPhiBCsBase"] is None:
|
||||||
|
card_dict["InputPhiBCsBase"] = main_dict["workdir"]+"gravpot_tCOLA"
|
||||||
|
|
||||||
return card_dict
|
return card_dict
|
||||||
|
|
||||||
|
@ -321,6 +351,16 @@ def create_parameter_card_dict(
|
||||||
OutputFCsDensity:str = 'fcs_density.h5',
|
OutputFCsDensity:str = 'fcs_density.h5',
|
||||||
OutputFCsSnapshot:str = 'fcs_particles.gadget3',
|
OutputFCsSnapshot:str = 'fcs_particles.gadget3',
|
||||||
|
|
||||||
|
## Tests with phiBCs and density
|
||||||
|
WriteGravPot:bool = True,
|
||||||
|
OutputGravitationalPotentialBase:str = 'gravitational_potential.h5',
|
||||||
|
MeshGravPot:int = 128,
|
||||||
|
WriteDensity:bool = False,
|
||||||
|
OutputDensityBase:str = 'density.h5',
|
||||||
|
MeshDensity:int = 128,
|
||||||
|
LoadPhiBCs:bool = False,
|
||||||
|
InputPhiBCsBase:str = 'gravitational_potential.h5',
|
||||||
|
|
||||||
## Cosmological parameters
|
## Cosmological parameters
|
||||||
h:float = 0.6732,
|
h:float = 0.6732,
|
||||||
Omega_m:float = 0.302,
|
Omega_m:float = 0.302,
|
||||||
|
@ -381,6 +421,17 @@ def create_parameter_card_dict(
|
||||||
OutputLPTPotential1=OutputLPTPotential1,
|
OutputLPTPotential1=OutputLPTPotential1,
|
||||||
OutputLPTPotential2=OutputLPTPotential2,
|
OutputLPTPotential2=OutputLPTPotential2,
|
||||||
OutputTilesBase=OutputTilesBase,
|
OutputTilesBase=OutputTilesBase,
|
||||||
|
|
||||||
|
# Tests with phiBCs and density
|
||||||
|
WriteGravPot=int(WriteGravPot),
|
||||||
|
OutputGravitationalPotentialBase=OutputGravitationalPotentialBase,
|
||||||
|
MeshGravPot=MeshGravPot,
|
||||||
|
WriteDensity=int(WriteDensity),
|
||||||
|
OutputDensityBase=OutputDensityBase,
|
||||||
|
MeshDensity=MeshDensity,
|
||||||
|
LoadPhiBCs=int(LoadPhiBCs),
|
||||||
|
InputPhiBCsBase=InputPhiBCsBase,
|
||||||
|
|
||||||
h=h,
|
h=h,
|
||||||
Omega_m=Omega_m,
|
Omega_m=Omega_m,
|
||||||
Omega_b=Omega_b,
|
Omega_b=Omega_b,
|
||||||
|
|
19
scola.py
19
scola.py
|
@ -1,5 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
def main_scola(parsed_args):
|
def main_scola(parsed_args):
|
||||||
from args_main import parse_arguments_main
|
from args_main import parse_arguments_main
|
||||||
from low_level import print_starting_module, print_message, print_ending_module, progress_bar_from_logfile, wait_until_file_exists
|
from low_level import print_starting_module, print_message, print_ending_module, progress_bar_from_logfile, wait_until_file_exists
|
||||||
|
@ -52,16 +50,14 @@ def main_scola(parsed_args):
|
||||||
print_message("sCOLA finished.", 1, "scola", verbose=parsed_args.verbose)
|
print_message("sCOLA finished.", 1, "scola", verbose=parsed_args.verbose)
|
||||||
|
|
||||||
elif parsed_args.execution == "slurm":
|
elif parsed_args.execution == "slurm":
|
||||||
from slurm_submission import create_slurm_script, parse_arguments_slurm, limit_slurm_arrays
|
from slurm_submission import create_slurm_script, parse_arguments_slurm
|
||||||
from args_main import parse_arguments_main
|
from args_main import parse_arguments_main
|
||||||
from parameters_card import parse_arguments_card
|
|
||||||
import os
|
import os
|
||||||
print_message("Running scola in slurm mode.", 1, "scola", verbose=parsed_args.verbose)
|
print_message("Running scola in slurm mode.", 1, "scola", verbose=parsed_args.verbose)
|
||||||
slurm_dict=parse_arguments_slurm(parsed_args)
|
slurm_dict=parse_arguments_slurm(parsed_args)
|
||||||
main_dict=parse_arguments_main(parsed_args)
|
main_dict=parse_arguments_main(parsed_args)
|
||||||
card_dict=parse_arguments_card(parsed_args)
|
|
||||||
|
|
||||||
if (have_no_tiles(parsed_args) or parsed_args.force) and card_dict["N_tiles"]**3 < limit_slurm_arrays :
|
if have_no_tiles(parsed_args) or parsed_args.force:
|
||||||
## Submit all boxes
|
## Submit all boxes
|
||||||
print_message("Submitting all boxes.", 2, "scola", verbose=parsed_args.verbose)
|
print_message("Submitting all boxes.", 2, "scola", verbose=parsed_args.verbose)
|
||||||
slurm_script = slurm_dict["scripts"]+"scola_"+main_dict["simname"]+".sh"
|
slurm_script = slurm_dict["scripts"]+"scola_"+main_dict["simname"]+".sh"
|
||||||
|
@ -97,7 +93,6 @@ def main_scola(parsed_args):
|
||||||
|
|
||||||
else:
|
else:
|
||||||
## Submit missing boxes
|
## Submit missing boxes
|
||||||
from time import sleep
|
|
||||||
missing_tiles_arrays = get_missing_tiles_arrays(parsed_args)
|
missing_tiles_arrays = get_missing_tiles_arrays(parsed_args)
|
||||||
print_message(f"Submitting missing boxes: {missing_tiles_arrays}.", 2, "scola", verbose=parsed_args.verbose)
|
print_message(f"Submitting missing boxes: {missing_tiles_arrays}.", 2, "scola", verbose=parsed_args.verbose)
|
||||||
|
|
||||||
|
@ -132,7 +127,6 @@ def main_scola(parsed_args):
|
||||||
subprocess.run(command_args)
|
subprocess.run(command_args)
|
||||||
|
|
||||||
print_message("sCOLA job submitted.", 2, "scola", verbose=parsed_args.verbose)
|
print_message("sCOLA job submitted.", 2, "scola", verbose=parsed_args.verbose)
|
||||||
sleep((missing_tiles[1]-missing_tiles[0])*1.0) # Sleep for a bit to avoid overloading the scheduler
|
|
||||||
|
|
||||||
os.remove(slurm_script) # Remove the script after submission (because it is specific to the missing tiles)
|
os.remove(slurm_script) # Remove the script after submission (because it is specific to the missing tiles)
|
||||||
|
|
||||||
|
@ -230,23 +224,16 @@ def have_no_tiles(parsed_args):
|
||||||
def get_missing_tiles_arrays(parsed_args):
|
def get_missing_tiles_arrays(parsed_args):
|
||||||
from os.path import isfile
|
from os.path import isfile
|
||||||
from parameters_card import parse_arguments_card
|
from parameters_card import parse_arguments_card
|
||||||
from slurm_submission import limit_slurm_arrays
|
|
||||||
|
|
||||||
card_dict = parse_arguments_card(parsed_args)
|
card_dict = parse_arguments_card(parsed_args)
|
||||||
nboxes_tot = int(parsed_args.N_tiles**3)
|
nboxes_tot = int(parsed_args.N_tiles**3)
|
||||||
missing_tiles_arrays = []
|
missing_tiles_arrays = []
|
||||||
in_sequence_of_missing = False
|
in_sequence_of_missing = False
|
||||||
len_sequence_of_missing = 0
|
|
||||||
for b in range(1,nboxes_tot+1):
|
for b in range(1,nboxes_tot+1):
|
||||||
if not isfile(card_dict["OutputTilesBase"]+str(b)+".h5"):
|
if not isfile(card_dict["OutputTilesBase"]+str(b)+".h5"):
|
||||||
len_sequence_of_missing += 1
|
|
||||||
if not in_sequence_of_missing:
|
if not in_sequence_of_missing:
|
||||||
missing_tiles_arrays.append([b])
|
missing_tiles_arrays.append([b])
|
||||||
in_sequence_of_missing = True
|
in_sequence_of_missing = True
|
||||||
len_sequence_of_missing = 1
|
|
||||||
if b%limit_slurm_arrays==limit_slurm_arrays-1:
|
|
||||||
missing_tiles_arrays[-1].append(b)
|
|
||||||
in_sequence_of_missing = False
|
|
||||||
elif in_sequence_of_missing:
|
elif in_sequence_of_missing:
|
||||||
missing_tiles_arrays[-1].append(b-1)
|
missing_tiles_arrays[-1].append(b-1)
|
||||||
in_sequence_of_missing = False
|
in_sequence_of_missing = False
|
||||||
|
@ -287,4 +274,4 @@ if __name__ == "__main__":
|
||||||
if parsed_args.execution == "slurm":
|
if parsed_args.execution == "slurm":
|
||||||
for b in range(1,nboxes_tot+1):
|
for b in range(1,nboxes_tot+1):
|
||||||
wait_until_file_exists(f"{card_dict['OutputTilesBase']}{b}.h5", verbose=parsed_args.verbose, limit=5*60)
|
wait_until_file_exists(f"{card_dict['OutputTilesBase']}{b}.h5", verbose=parsed_args.verbose, limit=5*60)
|
||||||
main_post_scola(parsed_args)
|
main_post_scola(parsed_args)
|
|
@ -2,7 +2,6 @@ from argparse import ArgumentParser
|
||||||
from args_main import parse_arguments_main
|
from args_main import parse_arguments_main
|
||||||
|
|
||||||
path_to_monofonic_binary = "/home/aubin/monofonic/build/monofonIC"
|
path_to_monofonic_binary = "/home/aubin/monofonic/build/monofonIC"
|
||||||
limit_slurm_arrays=799
|
|
||||||
|
|
||||||
def register_arguments_slurm(parser:ArgumentParser):
|
def register_arguments_slurm(parser:ArgumentParser):
|
||||||
"""
|
"""
|
||||||
|
@ -134,16 +133,12 @@ def create_slurm_script(slurm_template:str,
|
||||||
- simbelmyne
|
- simbelmyne
|
||||||
- scola
|
- scola
|
||||||
"""
|
"""
|
||||||
index_sub=0
|
|
||||||
|
|
||||||
if array is not None and job != "scola":
|
if array is not None and job != "scola":
|
||||||
raise ValueError(f"Array job range provided for job type {job}.")
|
raise ValueError(f"Array job range provided for job type {job}.")
|
||||||
if array is None and job == "scola":
|
if array is None and job == "scola":
|
||||||
raise ValueError(f"Array job range not provided for job type {job}.")
|
raise ValueError(f"Array job range not provided for job type {job}.")
|
||||||
else:
|
|
||||||
index_sub=array[0]//limit_slurm_arrays
|
|
||||||
array=(array[0]%limit_slurm_arrays, array[1]%limit_slurm_arrays)
|
|
||||||
|
|
||||||
from os.path import isfile
|
from os.path import isfile
|
||||||
if not isfile(slurm_template):
|
if not isfile(slurm_template):
|
||||||
raise FileNotFoundError(f"SLURM template {slurm_template} does not exist.")
|
raise FileNotFoundError(f"SLURM template {slurm_template} does not exist.")
|
||||||
|
@ -160,7 +155,7 @@ def create_slurm_script(slurm_template:str,
|
||||||
case "simbelmyne":
|
case "simbelmyne":
|
||||||
command_line = f"{job} {job_config_file} {job_log}"
|
command_line = f"{job} {job_config_file} {job_log}"
|
||||||
case "scola":
|
case "scola":
|
||||||
command_line = f"{job} {job_config_file} {job_log} "+f"-b $(({index_sub*limit_slurm_arrays} + $SLURM_ARRAY_TASK_ID))"
|
command_line = f"{job} {job_config_file} {job_log} "+"-b ${SLURM_ARRAY_TASK_ID}"
|
||||||
case _:
|
case _:
|
||||||
raise ValueError(f"Job type {job} not recognized.")
|
raise ValueError(f"Job type {job} not recognized.")
|
||||||
|
|
||||||
|
@ -168,7 +163,7 @@ def create_slurm_script(slurm_template:str,
|
||||||
with open(slurm_script, "w") as f:
|
with open(slurm_script, "w") as f:
|
||||||
for line in template:
|
for line in template:
|
||||||
if job_name is not None and "--job-name" in line:
|
if job_name is not None and "--job-name" in line:
|
||||||
line = f"#SBATCH --job-name={index_sub if index_sub!=0 else ''}{job_name}\n"
|
line = f"#SBATCH --job-name={job_name}\n"
|
||||||
if array is not None and "--array" in line:
|
if array is not None and "--array" in line:
|
||||||
line = f"#SBATCH --array={array[0]}-{array[1]}\n"
|
line = f"#SBATCH --array={array[0]}-{array[1]}\n"
|
||||||
if array is not None and ("--output" in line or "--error" in line):
|
if array is not None and ("--output" in line or "--error" in line):
|
||||||
|
|
Loading…
Add table
Reference in a new issue