123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- function leap_days()
- {
- local ld=0
- local frstYYYY=$(date -ud "$1" +%Y)
- local lastYYYY=$(date -ud "$2" +%Y)
- set +e
-
- $(date -ud "${frstYYYY}-02-29" > /dev/null 2>&1) \
- && (( $(date -ud "$1" +%s) < $(date -ud "${frstYYYY}-03-01" +%s) )) \
- && (( $(date -ud "$2" +%s) > $(date -ud "${lastYYYY}-02-28" +%s) )) \
- && (( ld++ ))
-
- for (( y=(( ${frstYYYY}+1 )); y<=(( ${lastYYYY}-1 )); y++ ))
- do
- $(date -ud "$y-02-29" > /dev/null 2>&1) && (( ld++ ))
- done
-
-
- (( $lastYYYY > $frstYYYY )) \
- && $(date -ud "${lastYYYY}-02-29" > /dev/null 2>&1) \
- && (( $(date -ud "$1" +%s) < $(date -ud "${frstYYYY}-03-01" +%s) )) \
- && (( $(date -ud "$2" +%s) > $(date -ud "${lastYYYY}-02-28" +%s) )) \
- && (( ld++ ))
- set -e
- echo "$ld"
- }
- [[ $@ == *verbose* ]] && set -x
- module load ${module_list}
- export LD_LIBRARY_PATH=${LD_LIBRARY_PATH:+${LD_LIBRARY_PATH}:}"${extralibs_list}"
- mkdir -p "${run_dir:?}"
- cp -u xios_config/*xml "${run_dir}"
- cp -u namelists/* "${run_dir}"
- cd "${run_dir}"
- cp -u "${nem_exe_file:?}" .
- cp -u "${xio_exe_file:?}" .
- [[ ! -f EMPave_old.dat ]] && echo " 0 0.0000000000000000E+00 0.0000000000000000E+00" > EMPave_old.dat
- for file in "${ic_files[@]}"; do
- [[ ! -e ${file#*> } ]] && ln -sf $(sed 's/ *=> */ /' <<< "${ini_data_dir}/${ic_subdir}/${nem_grid}/$file")
- done
- for file in "${forcing_files[@]}"; do
- [[ ! -e ${file#*> } || "$file" == \** ]] && ln -sf $(sed 's/ *=> */ /' <<< "${ini_data_dir}/${forcing_subdir}/${nem_forcing_set}/$file")
- done
- for file in "${shared_files[@]}"; do
- [[ ! -e ${file#*> } ]] && ln -sf $(sed 's/ *=> */ /' <<< "${shared_dir}/$file")
- done
- run_start_date=$(date -uR -d "${run_start_date}")
- run_end_date="${run_start_date} + ${run_duration:?}"
- run_end_date=$(date -uR -d "${run_end_date}")
- run_start_epoch=$(date -u -d"${run_start_date}" +%s)
- run_end_epoch=$(date -u -d"${run_end_date}" +%s)
- for (( ; run_num_legs>0 ; run_num_legs-- ))
- do
-
-
-
-
-
- [[ -r "${info_file:?}" ]] && source "${info_file:?}"
- leg_start_date=${leg_end_date:-$run_start_date}
- leg_number=$((${leg_number:=0}+1))
- leg_start_epoch=$(date -u -d "${leg_start_date}" +%s)
- leg_end_epoch=$(date -u -d "${leg_start_date:?} + ${rst_freq:=$run_duration}" +%s)
- leg_end_date=$(date -uR -d@"${leg_end_epoch}")
- leg_length_sec=$(( leg_end_epoch - leg_start_epoch ))
- leg_start_sec=$(( leg_start_epoch - run_start_epoch ))
- leg_end_sec=$(( leg_end_epoch - run_start_epoch ))
- leg_start_date_yyyymmdd=$(date -u -d "${leg_start_date}" +%Y%m%d)
-
- leg_length_sec=$(( leg_length_sec - $(leap_days "${leg_start_date}" "${leg_end_date}")*24*3600 ))
- leg_start_sec=$(( leg_start_sec - $(leap_days "${run_start_date}" "${leg_start_date}")*24*3600 ))
- leg_end_sec=$(( leg_end_sec - $(leap_days "${run_start_date}" "${leg_end_date}")*24*3600 ))
- (( leg_number > 1 )) && leg_is_restart=true || leg_is_restart=false
-
-
-
- (( leg_end_epoch > run_end_epoch )) && leg_end_date=${run_end_epoch}
-
-
-
- if (( leg_start_epoch >= run_end_epoch ))
- then
- echo "Leg start date equal to or after end of simulation."
- echo "Nothing left to do. Cleaning and exiting."
- for (( n=0 ; n<nem_numproc ; n++ ))
- do
- np=$(printf %04d ${n})
- rm -f "restart_oce_${np}.nc"
- rm -f "restart_ice_${np}.nc"
- done
- exit 0
- fi
-
-
-
- source build_namelist_cfg.sh > namelist_cfg
-
-
-
- ns=$(printf %08d $(( leg_start_sec / nem_time_step_sec - nem_restart_offset )))
- if ((leg_start_sec > 0 )); then
- for (( n=0 ; n<nem_numproc ; n++ ))
- do
- np=$(printf %04d ${n})
- [[ -f "${exp_name:?}_${ns}_restart_oce_${np}.nc" ]] || { echo "Error: restart file not found." ; exit 2 ; }
- ln -fs "${exp_name:?}_${ns}_restart_oce_${np}.nc" "restart_oce_${np}.nc"
- [[ -f "${exp_name:?}_${ns}_restart_ice_${np}.nc" ]] || { echo "Error: restart file not found." ; exit 2 ; }
- ln -fs "${exp_name:?}_${ns}_restart_ice_${np}.nc" "restart_ice_${np}.nc"
- done
- fi
-
- [[ $@ == *preponly* ]] && exit 0
-
-
-
- time_begin=$(date +%s)
- mpirun -np "${xio_numproc:?}" "${xio_exe_file:?}" : -np "${nem_numproc:?}" "${nem_exe_file:?}"
- time_end=$(date +%s)
- formatted_leg_number=$(printf %03d $((leg_number)))
-
-
-
- outdir="${archive_dir:?}/output/${formatted_leg_number}"
- mkdir -p "${outdir}"
- shopt -s nullglob
- for v in grid_U grid_V grid_W grid_T icemod icemoa SBC SBC_scalar scalar
- do
- for f in ${exp_name}_??_????????_????????_${v}_????.nc
- do
- mv "$f" "$outdir/"
- done
- for f in ${exp_name}_??_????????_????????_${v}.nc
- do
- mv "$f" "$outdir/"
- done
- for f in ${exp_name}_??_${v}.nc
- do
- mv "$f" "$outdir/"
- done
- done
-
-
-
- outdir="$archive_dir/restart/${formatted_leg_number}"
- mkdir -p "${outdir}"
- for f in ${exp_name}_${ns}_restart_???_????.nc
- do
- [ -f "$f" ] && mv "$f" "${outdir}"
- done
-
-
-
- outdir="$archive_dir/log/${formatted_leg_number}"
- mkdir -p "${outdir}"
- for f in ocean.output time.step solver.stat ; do mv "${f}" "${outdir}"; done
- shopt -u nullglob
-
-
-
-
- tr=$(date -d "0 -$time_begin sec + $time_end sec" +%T)
- current_date=$(date +'%F %T')
- {
- echo "#"
- echo "# Finished leg at ${current_date} after ${tr} (hh:mm:ss)"
- echo "leg_number=${leg_number}"
- echo "leg_start_date=\"${leg_start_date}\""
- echo "leg_end_date=\"${leg_end_date}\""
- } | tee -a "${info_file}"
- done
- cd - >/dev/null
- [[ $@ == *noresubmit* ]] && exit 0
- if (( leg_end_epoch < run_end_epoch )) ;
- then
- echo "Leg end earlier than end of simulation."
- echo "Submitting another job."
-
- if [[ "$@" == *local* ]]
- then
- exec "$0" "$@"
- elif [[ "${submit_command}" == *sbatch* ]]
- then
- "${submit_command}" "$0" "$@" | awk '{print $4}' >> "${run_dir}"/.coral_jobs
- else
- "${submit_command}" -v PBS_OPTIONS="$@" "$0" | tee -a coral_jobs
- sleep 2
- jobid=`cat coral_jobs`
- rm -f coral_jobs
- jobid=${jobid%.*}
- echo "${jobid}" >> "${run_dir}"/.coral_jobs
- fi
- else
- echo "Nothing left to do. Cleaning and exiting."
- for (( n=0 ; n<nem_numproc ; n++ ))
- do
- np=$(printf %04d ${n})
- rm -f "restart_oce_${np}.nc"
- rm -f "restart_ice_${np}.nc"
- done
- fi
- exit 0
|