@@ -181,6 +181,97 @@ archive_suspect_md_restart_if_present() {
181181 return 0
182182}
183183
184+ md_nc_frame_count () {
185+ local nc_file=$1
186+
187+ [[ -s " $nc_file " ]] || return 1
188+ command -v ncdump > /dev/null 2>&1 || return 1
189+
190+ ncdump -h " $nc_file " 2> /dev/null | awk '
191+ /frame[[:space:]]*=[[:space:]]*UNLIMITED/ {
192+ s=$0
193+ sub(/^.*\(/, "", s)
194+ sub(/[[:space:]]+currently\).*$/, "", s)
195+ if (s ~ /^[0-9]+$/) {
196+ print s
197+ found=1
198+ exit
199+ }
200+ }
201+ END { if (!found) exit 1 }
202+ '
203+ }
204+
205+ md_nc_has_zero_frames () {
206+ local nc_file=$1
207+ local frames
208+
209+ frames=$( md_nc_frame_count " $nc_file " 2> /dev/null) || return 1
210+ [[ $frames =~ ^[0-9]+$ ]] || return 1
211+ (( frames == 0 ))
212+ }
213+
214+ archive_zero_frame_md_trajectory_if_present () {
215+ local nc_file=$1
216+ local retry_count=${2:- }
217+ local stem out_file
218+
219+ [[ -n $nc_file && -s " $nc_file " ]] || return 1
220+ md_nc_has_zero_frames " $nc_file " || return 1
221+
222+ stem=${nc_file% .nc}
223+ out_file=" ${stem} .out"
224+ if [[ -s " $out_file " ]] && md_out_has_completion_marker " $out_file " ; then
225+ return 1
226+ fi
227+
228+ retry_count=$( retry_count_for_template " mdin-template" " $retry_count " )
229+ archive_failed_job_files " $retry_count " \
230+ " $out_file " \
231+ " $nc_file " \
232+ " ${stem} .log" \
233+ " ${stem} .mden" \
234+ " ${stem} .mdinfo"
235+ echo " [INFO] Archived zero-frame MD trajectory $nc_file before restart."
236+ return 0
237+ }
238+
239+ cleanup_zero_frame_md_trajectories () {
240+ local retry_count=${1:- }
241+ local pattern nc_file seen_files=" "
242+ local patterns=(" md-*.nc" " md[0-9]*.nc" )
243+
244+ if [[ -n ${ZSH_VERSION-} ]]; then
245+ setopt local_options null_glob
246+ for pattern in " ${patterns[@]} " ; do
247+ for nc_file in ${~pattern} ; do
248+ case " $seen_files " in
249+ * " $nc_file " * ) continue ;;
250+ esac
251+ seen_files=" ${seen_files}${nc_file} "
252+ archive_zero_frame_md_trajectory_if_present " $nc_file " " $retry_count " || true
253+ done
254+ done
255+ return 0
256+ fi
257+
258+ local nullglob_was_on=0
259+ shopt -q nullglob && nullglob_was_on=1
260+ shopt -s nullglob
261+ for pattern in " ${patterns[@]} " ; do
262+ for nc_file in $pattern ; do
263+ case " $seen_files " in
264+ * " $nc_file " * ) continue ;;
265+ esac
266+ seen_files=" ${seen_files}${nc_file} "
267+ archive_zero_frame_md_trajectory_if_present " $nc_file " " $retry_count " || true
268+ done
269+ done
270+ if [[ $nullglob_was_on -eq 0 ]]; then
271+ shopt -u nullglob
272+ fi
273+ }
274+
184275cleanup_suspect_md_resume_state () {
185276 local retry_count=${1:- }
186277 local resume_mode=${2:- strict}
0 commit comments