Compare commits

..

11 commits

4 changed files with 59 additions and 25 deletions

View file

@ -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

View file

@ -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,

View file

@ -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)

View file

@ -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):