Skip to content
Snippets Groups Projects
job_scan_pipeline.sh 3.79 KiB
Newer Older
#! /bin/bash
#This script automatizes the launch of multiple job with possible chain dependency. 
SUBMIT=0   #to submit or not (use it to try first the file generation)
EXECPATH=gyacomo23_sp #path to the executable, will be renamed gyacomo in each subdir
Npp=1  #distribution of the processes (product must be 48 for one node usage)
Npy=12 #distribution of the processes (product must be 48 for one node usage)
Npz=4  #distribution of the processes (product must be 48 for one node usage)
Tm_=200    #maximal simulation time
runtime=10 #runtime asked to Marconi in hours
# program runtime in seconds -10% to have time to stop
RT_gyaco=$((3600 * runtime * 9 / 10))
# runtime to ask, in minutes
RT_slurm=$((60 * runtime))
# Number of time to continue the run (chain dep) N=0 means only one run
Ncont=0
# Hermite Laguerre resolution (the rest is taken from the fort_00.90 present in the current dir)
P=2
J=1
# Scan parameter names
P_1="delta"
P_2="kappa"
# Scan values
#A_1=(-0.3 -0.2 -0.1 0.0 0.1 0.2 0.3)
#A_2=(1.0 1.25 1.5 1.75 2.0)
A_1=(-0.3)
A_2=(1.0)
# find the lines where the parameters are found
L_1=$(grep -wn "$P_1" fort_00.90 | cut -d: -f1)
L_2=$(grep -wn "$P_2" fort_00.90 | cut -d: -f1)
# Check if the params exist
if [ ! -n "$L_1" ] || [ ! -n "$L_2" ] ; then
    echo "One of the parameter is not found in fort_00.90 -> quit"
    exit 1  # Exit the script with a non-zero status code
else
    echo "Scan over $P_1 (line $L_1) and $P_2 (line $L_2)"
fi
# Check the mpi distribution
Nptot=$((Npp * Npy * Npz))
# Check if the product is divisible by 48
if [ $((Nptot % 48)) -eq 0 ]; then
    Nnodes=$((Nptot / 48)) 
else
    echo "the distriubtion is not optimized for 48 processes"
    exit 1
fi
# loop over the indices
for i in "${!A_1[@]}"
do
	for j in "${!A_2[@]}" 
    do
        # Setup sim directory
        mkdir -p ${P_1}_${A_1[i]}_${P_2}_${A_2[j]}
        cd ${P_1}_${A_1[i]}_${P_2}_${A_2[j]}
        # Create new submit file from older one
        awk -v "P_=$P" -v "J_=$J" \
            -v "P1=${P_1}" -v "A1=${A_1[i]}" \
            -v "P2=${P_2}" -v "A2=${A_2[j]}" \
            -v "TR=$RT_slurm" -v "MPI=$MPIDISTR" \
            -v "np=$Npp" -v "ny=$Npy" -v "nz=$Npz" -v "Nnod=$Nnodes" '{
             if (NR == 2) print "#SBATCH --job-name=" P_ "_" J_ "_" P1 "_" A1 "_" P2 "_" A2; 
        else if (NR == 3) print "#SBATCH --time="TR;
        else if (NR == 4) print "#SBATCH --nodes="Nnod;
        else if (NR == 13)print "srun --cpu-bind=cores ./gyacomo " np " " ny " " nz " 0";
        else print $0}' ../submit_00.cmd > submit_00.cmd
        # Create new fort file from older one
        awk -v "P_=$P" -v "J_=$J" \
            -v "P1=${P_1}" -v "A1=${A_1[i]}" -v "L1=${L_1}" \
            -v "P2=${P_2}" -v "A2=${A_2[j]}" -v "L2=${L_2}" \
            -v "TM=$Tm_" -v "TR=$RT_gyaco" '{ 
             if (NR == 04) print "  tmax        = "TM;
        else if (NR == 05) print "  maxruntime  = "TR;
        else if (NR == 09) print "  pmax        = "P_;
        else if (NR == 10) print "  jmax        = "J_;
        else if (NR == L1) print "  "P1"        = "A1" ! Scanned";
        else if (NR == L2) print "  "P2"        = "A2" ! Scanned";
        else print $0}' ../fort_00.90 > fort_00.90
        cp ../$EXECPATH gyacomo
        if [ $SUBMIT -gt 0 ] ; then
            # Submit the job and display the msg
            submess=$(sbatch submit_00.cmd)
            jobid=${submess##* }
            echo $jobid
            # Save the jobid in jobid_00.txt
            echo $jobid > jobid_00.txt
            # Continue the job up to Ncontinue
            if [ $Ncont -gt 0 ]
            then
                a=0
                while [ $a -lt $Ncont ]
                do
                    sh ../continue.sh $a
                a=`expr $a + 1`
                done
            fi
        fi
        # Back in the previous directory
        cd ..
    done
done