1 |
jmc |
1.1 |
#! /usr/bin/env bash |
2 |
|
|
|
3 |
|
|
# $Header: /u/gcmpack/MITgcm_contrib/jmc_script/tst_2+2,v 1.2 2007/11/28 22:54:46 jmc Exp $ |
4 |
|
|
# $Name: $ |
5 |
|
|
|
6 |
|
|
rnp_loc() |
7 |
|
|
{ |
8 |
|
|
# rnp_loc arg_1 arg_2 |
9 |
|
|
# rename files with prefix = 'arg_1' to files with prefix = 'arg_2' |
10 |
|
|
echo ' rnp_loc:' $1 $2 |
11 |
|
|
# rnp -s $1 $2 |
12 |
|
|
listY=`ls -1 $1*` |
13 |
|
|
for yy in $listY |
14 |
|
|
do |
15 |
|
|
zz=`echo $yy | sed "s/^$1/$2/"` |
16 |
|
|
mv $yy $zz |
17 |
|
|
done |
18 |
|
|
} |
19 |
|
|
|
20 |
|
|
#--------------------------- |
21 |
|
|
|
22 |
|
|
#- default: |
23 |
|
|
Nit=2 |
24 |
|
|
prt=1 # 1 = print some informations ; 2 = print more informations |
25 |
|
|
action=1 |
26 |
|
|
cmd='mv -f' |
27 |
|
|
tmpDir='temp_tst' |
28 |
|
|
|
29 |
|
|
#- executable: |
30 |
|
|
mpi=0 |
31 |
|
|
if [ $mpi -ge 1 ] |
32 |
|
|
then gcmExc=run_ifc_mpi |
33 |
|
|
else gcmExc=mitgcmuv |
34 |
|
|
fi |
35 |
|
|
|
36 |
|
|
#- exit status: |
37 |
|
|
# 0 -> test is successful |
38 |
|
|
# 1 -> fail in 1rst run |
39 |
|
|
# 2 -> fail in 2nd run |
40 |
|
|
# 3 -> fail in 3rd run |
41 |
|
|
# 4 -> pickup*.data (written at the end of 2+2 & 4 it run) are different |
42 |
|
|
# 5 -> pickup*.meta (written at the end of 2+2 & 4 it run) are different |
43 |
|
|
# 6 -> missing 'data.tst' file (removed or not yet generated ?) |
44 |
|
|
# 7 -> missing standard output from previous run |
45 |
|
|
# 8 -> missing information (in standard output of previous run) about pickup |
46 |
|
|
# 9 -> error in argument list |
47 |
|
|
|
48 |
|
|
nArg=$# |
49 |
|
|
if [ $nArg -ge 3 ] |
50 |
|
|
then |
51 |
|
|
if test $2 = '-exe' ; then gcmExc=$3 ; nArg=`expr $nArg - 2` ; fi |
52 |
|
|
if test $1 = '-exe' ; then gcmExc=$2 ; shift ; shift ; nArg=$# ; fi |
53 |
|
|
fi |
54 |
|
|
|
55 |
|
|
case $nArg in |
56 |
|
|
1) ;; |
57 |
|
|
*) echo "Usage: `basename $0` flag [-exe EXECUTABLE]" |
58 |
|
|
echo " Check restart: compare 1 run of 2 x $Nit it long" |
59 |
|
|
echo " with 2 consecutive runs of $Nit it long each" |
60 |
|
|
echo " where: flag = 0 -> prepare (from a previous run) pickup & data files" |
61 |
|
|
echo " flag = 1 -> do the 3 runs (with EXECUTABLE, default=mitgcmuv)" |
62 |
|
|
echo " flag = 2 -> compare std_outp" |
63 |
|
|
echo " flag = 3 -> compare pickup files" |
64 |
|
|
echo " flag = 4 -> clean-up output files" |
65 |
|
|
echo " flag = All -> do 0,1,2,3,4 sequentially" |
66 |
|
|
exit 9 ;; |
67 |
|
|
esac |
68 |
|
|
flag=$1 |
69 |
|
|
|
70 |
|
|
#========================= |
71 |
|
|
|
72 |
|
|
if test $flag = '0' -o $flag = 'All' ; then |
73 |
|
|
#---------------------------------------------------------------------- |
74 |
|
|
# last pickup written (from previous run): |
75 |
|
|
if [ $mpi -ge 1 ] |
76 |
|
|
then outpRun='STDOUT.0000' |
77 |
|
|
else outpRun='output.txt' |
78 |
|
|
fi |
79 |
|
|
if test -r $outpRun |
80 |
|
|
then |
81 |
|
|
# grep ' %CHECKPOINT ' $outpRun | tail -1 |
82 |
|
|
lastPick=`grep ' %CHECKPOINT ' $outpRun | sed 's/^.*%CHECKPOINT //' | tail -1` |
83 |
|
|
if test "x$lastPick" = x |
84 |
|
|
then |
85 |
|
|
echo "no pickup information written in '$outpRun' from previous run" |
86 |
|
|
exit 8 |
87 |
|
|
else |
88 |
|
|
iter=`echo $lastPick | awk '{print $1}'` |
89 |
|
|
zz=`echo $lastPick | awk '{print $2}'` |
90 |
|
|
echo "from previous run std.outp, lastPick='$lastPick' ; iter='$iter' ; zz='$zz'" |
91 |
|
|
fi |
92 |
|
|
else |
93 |
|
|
echo "no standard output file '$outpRun' from previous run" |
94 |
|
|
exit 7 |
95 |
|
|
fi |
96 |
|
|
|
97 |
|
|
#- rename pickup (if needed) |
98 |
|
|
sufx=`printf "%10.10i\n" $iter` |
99 |
|
|
if test $zz = $sufx |
100 |
|
|
then |
101 |
|
|
echo "no need to change pickup sufix" |
102 |
|
|
else |
103 |
|
|
# echo "rename pickup sufix: $zz -> $sufx" |
104 |
|
|
listP=`ls pickup*.${zz}* 2> /dev/null | sed 's/\..*//g' | uniq` |
105 |
|
|
if test "x$listP" = x |
106 |
|
|
then echo ' rename' $zz '->' $sufx ': no file to rename' |
107 |
|
|
else |
108 |
|
|
if [ $prt -ge 1 ] ; then echo ' rename' $zz '->' $sufx 'for all:' $listP ; fi |
109 |
|
|
for yy in $listP |
110 |
|
|
do |
111 |
|
|
listF=`ls -1 $yy.${zz}*` |
112 |
|
|
for xx in $listF |
113 |
|
|
do |
114 |
|
|
new=`echo $xx | sed "s/^$yy\.$zz/$yy\.$sufx/"` |
115 |
|
|
if [ $prt -ge 2 ] ; then echo ' '$cmd $xx $new ; fi |
116 |
|
|
if test $action = 1 ; then $cmd $xx $new ; fi |
117 |
|
|
done |
118 |
|
|
done |
119 |
|
|
fi |
120 |
|
|
fi |
121 |
|
|
#------------------------- |
122 |
|
|
echo "prepare parameter file 'data.tst' :" |
123 |
|
|
cp -p -f data data.tst |
124 |
|
|
listOut='startTime endTime nIter0 nTimeSteps nEndIter chkPtFreq pChkPtFreq globalFiles' |
125 |
|
|
listOut=$listOut' useSingleCpuIO pickupSuff usePickupBeforeC54 mdsioLocalDir' |
126 |
|
|
#- comment out (in data.tst) all parameters from list: 'listOut' |
127 |
|
|
for yy in $listOut |
128 |
|
|
do |
129 |
|
|
if [ $prt -ge 2 ] ; then echo -n ' commenting out:' $yy ; fi |
130 |
|
|
nn=`grep -i -c "^ *$yy *=" data.tst` |
131 |
|
|
if [ $nn -ge 1 ] |
132 |
|
|
then |
133 |
|
|
listN=`grep -i -n "^ *$yy *=" data.tst | sed 's/:.*$//'` |
134 |
|
|
if [ $prt -ge 2 ] ; then echo " : found on line: $listN" ; fi |
135 |
|
|
for ll in $listN |
136 |
|
|
do |
137 |
|
|
sed "$ll s/^./#&/" data.tst > data.tmp_$$ |
138 |
|
|
# diff data.tmp_$$ data.tst |
139 |
|
|
mv -f data.tmp_$$ data.tst |
140 |
|
|
done |
141 |
|
|
else if [ $prt -ge 2 ] ; then echo ' : not found' ; fi |
142 |
|
|
fi |
143 |
|
|
done |
144 |
|
|
if [ $prt -ge 2 ] ; then echo ' ' ; fi |
145 |
|
|
# add nIter0 & nTimeSteps in namelist "PARM03": |
146 |
|
|
Dbl=`expr $Nit \* 2` |
147 |
|
|
sed "/^ *\&PARM03/a \ nTimeSteps=$Dbl," data.tst > data.tmp_$$ |
148 |
|
|
mv -f data.tmp_$$ data.tst |
149 |
|
|
sed "/^ *\&PARM03/a \ nIter0=$iter," data.tst > data.tmp_$$ |
150 |
|
|
mv -f data.tmp_$$ data.tst |
151 |
|
|
echo "prepare file 'data.tst' : done" |
152 |
|
|
if [ $prt -ge 1 ] ; then |
153 |
|
|
echo ' diff data.tst data' ; diff data.tst data ; echo ' ' ; |
154 |
|
|
fi |
155 |
|
|
#---- clean up current dir: move output to temp_tst dir: |
156 |
|
|
if test $action = 1 ; then |
157 |
|
|
rm -rf $tmpDir |
158 |
|
|
mkdir $tmpDir |
159 |
|
|
mv -f *.data $tmpDir |
160 |
|
|
mv -f *.meta $tmpDir |
161 |
|
|
mv -f *.txt $tmpDir |
162 |
|
|
listS=`ls $tmpDir/pickup*.${sufx}* 2> /dev/null | head -1` |
163 |
|
|
if test "x$listS" != x ; then mv $tmpDir/pickup*.${sufx}* . ; fi |
164 |
|
|
#- move main parameter file "data": |
165 |
|
|
mv -f data $tmpDir |
166 |
|
|
#- do not deal with MNC pickup at all: |
167 |
|
|
cp -p -f data.pkg data.tmp_$$ |
168 |
|
|
mv -f data.pkg $tmpDir |
169 |
|
|
mv -f data.tmp_$$ data.pkg |
170 |
|
|
yy='useMNC' |
171 |
|
|
if [ $prt -ge 2 ] ; then echo -n " commenting out: $yy in data.pkg" ; fi |
172 |
|
|
nn=`grep -i -c "^ *$yy *=" data.pkg` |
173 |
|
|
if [ $nn -ge 1 ] |
174 |
|
|
then |
175 |
|
|
listN=`grep -i -n "^ *$yy *=" data.pkg | sed 's/:.*$//'` |
176 |
|
|
if [ $prt -ge 2 ] ; then echo " : found on line: $listN" ; fi |
177 |
|
|
for ll in $listN |
178 |
|
|
do |
179 |
|
|
sed "$ll s/^./#&/" data.pkg > data.tmp_$$ |
180 |
|
|
if [ $prt -ge 1 ] ; then echo ' changes in data.pkg' |
181 |
|
|
diff data.tmp_$$ data.pkg ; echo ' ' ; fi |
182 |
|
|
mv -f data.tmp_$$ data.pkg |
183 |
|
|
done |
184 |
|
|
else if [ $prt -ge 2 ] ; then echo ' : not found' ; echo ' ' ; fi |
185 |
|
|
fi |
186 |
|
|
fi |
187 |
|
|
#---------------------------------------------------------------------- |
188 |
|
|
fi |
189 |
|
|
|
190 |
|
|
#========================= |
191 |
|
|
|
192 |
|
|
if test -r data.tst ; then |
193 |
|
|
#- extract length of runs & starting iter number from file "data.tst" |
194 |
|
|
num0=`sed -n 's/^ nIter0=//p' data.tst | sed 's/,//g' | sed 's/ //g'` |
195 |
|
|
Dbl=`sed -n 's/^ nTimeSteps=//p' data.tst | sed 's/,//g'` |
196 |
|
|
Nit=`expr $Dbl / 2` |
197 |
|
|
# Nit = Nb of iter of 2nd & 3rd run (1rst one is 2 x Nit iter long) |
198 |
|
|
else |
199 |
|
|
echo '=> Need a readable "data.tst" file for the 2 x Nit iterations run' |
200 |
|
|
exit 6 |
201 |
|
|
fi |
202 |
|
|
|
203 |
|
|
#- dir where to put the results : |
204 |
|
|
dir1=res_2it |
205 |
|
|
dir2=res_1iA |
206 |
|
|
dir3=res_1iB |
207 |
|
|
|
208 |
|
|
#--------------------------- |
209 |
|
|
num1=`expr $num0 + $Nit` |
210 |
|
|
num2=`expr $num0 + $Dbl` |
211 |
|
|
num0c=`printf "%10.10i\n" $num0` |
212 |
|
|
num1c=`printf "%10.10i\n" $num1` |
213 |
|
|
num2c=`printf "%10.10i\n" $num2` |
214 |
|
|
echo " start-end iter: $num0 , $num1 , $num2" |
215 |
|
|
echo " sufix: '$num0c' '$num1c' '$num2c'" |
216 |
|
|
echo ' gcmExc='$gcmExc |
217 |
|
|
#exit |
218 |
|
|
#--------------------------- |
219 |
|
|
|
220 |
|
|
if test $flag = '1' -o $flag = 'All' ; then |
221 |
|
|
#---------------------------------------------------------------------- |
222 |
|
|
#- check at the end of each run for pickup with prefix: |
223 |
|
|
pref='pickup' |
224 |
|
|
offLine=`grep -i -c '^ *useOffLine *= *\.TRUE\.' data.pkg` |
225 |
|
|
if [ $offLine -ge 1 ] ; then pref='pickup_ptracers' ; fi |
226 |
|
|
#--------------------------- |
227 |
|
|
if test -d $dir1 -o -d $dir2 -o -d $dir3 |
228 |
|
|
then echo -n 'remove dir: ' |
229 |
|
|
if test -d $dir1 ; then echo -n $dir1 ' , ' ; rm -r $dir1 ; fi |
230 |
|
|
if test -d $dir2 ; then echo -n $dir2 ' , ' ; rm -r $dir2 ; fi |
231 |
|
|
if test -d $dir3 ; then echo -n $dir3 ' , ' ; rm -r $dir3 ; fi |
232 |
|
|
echo ' ' |
233 |
|
|
fi |
234 |
|
|
mkdir $dir1 $dir2 $dir3 |
235 |
|
|
rm -f STDERR.0000 |
236 |
|
|
|
237 |
|
|
#--- 1rst run ( 2 x Nit iter ) |
238 |
|
|
cp -p data.tst data |
239 |
|
|
echo '==> START RUN 2 x' $Nit 'it' |
240 |
|
|
if [ $mpi -ge 1 ] |
241 |
|
|
then ./$gcmExc std_outp.2it > TTT.out.2it 2>&1 |
242 |
|
|
else ./$gcmExc > std_outp.2it |
243 |
|
|
fi |
244 |
|
|
mv STDERR.0000 std__err.2it |
245 |
|
|
out=`egrep -c 'STOP ABNORMAL END' std_outp.2it` |
246 |
|
|
if test $out != 0 |
247 |
|
|
then echo "==> RUN 2 x $Nit it : ABNORMAL END => exit" ; exit 1 ; fi |
248 |
|
|
if test -f $pref.ckptA.001.001.data |
249 |
|
|
then echo "==> END RUN 2 x $Nit it" |
250 |
|
|
else echo "==> RUN 2 x $Nit it STOP without writing $pref => exit" ; exit 1 ; fi |
251 |
|
|
listP=`ls pickup*.ckptA* | sed 's/\..*//g' | uniq` |
252 |
|
|
echo ' listP=' $listP |
253 |
|
|
for xx in $listP |
254 |
|
|
do |
255 |
|
|
rnp_loc $xx.ckptA $xx.$num2c |
256 |
|
|
done |
257 |
|
|
mv *.0??.0??.* $dir1 |
258 |
|
|
txtF=`ls -1 *.txt 2> /dev/null` |
259 |
|
|
mv R?.data R?.meta DR?.data DR?.meta $txtF $dir1 |
260 |
|
|
listS=`ls $dir1/pickup*.${num0c}* 2> /dev/null | head -1` |
261 |
|
|
if test "x$listS" != x ; then mv $dir1/pickup*.${num0c}* . ; fi |
262 |
|
|
#--- 2nd run ( Nit iter , restart from same Iter = num0 as 1rst run ) |
263 |
|
|
sed "s/^ nTimeSteps=$Dbl/ nTimeSteps=$Nit/g" data.tst > data |
264 |
|
|
echo '==> START RUN 1iA' |
265 |
|
|
if [ $mpi -ge 1 ] |
266 |
|
|
then ./$gcmExc std_outp.1iA > TTT.out.1iA 2>&1 |
267 |
|
|
else ./$gcmExc > std_outp.1iA |
268 |
|
|
fi |
269 |
|
|
mv STDERR.0000 std__err.1iA |
270 |
|
|
out=`egrep -c 'STOP ABNORMAL END' std_outp.1iA` |
271 |
|
|
if test $out != 0 |
272 |
|
|
then echo "==> RUN 1iA : ABNORMAL END => exit" ; exit 2 ; fi |
273 |
|
|
if test -f $pref.ckptA.001.001.data |
274 |
|
|
then echo "==> END RUN 1iA" |
275 |
|
|
else echo "==> RUN 1iA STOP without writing $pref => exit" ; exit 2 ; fi |
276 |
|
|
for xx in $listP |
277 |
|
|
do |
278 |
|
|
rnp_loc $xx.ckptA $xx.$num1c |
279 |
|
|
done |
280 |
|
|
mv *.0??.0??.* $dir2 |
281 |
|
|
txtF=`ls -1 *.txt 2> /dev/null` |
282 |
|
|
mv R?.data R?.meta DR?.data DR?.meta $txtF $dir2 |
283 |
|
|
listS=`ls $dir2/pickup*.${num0c}* 2> /dev/null | head -1` |
284 |
|
|
if test "x$listS" != x ; then mv $dir2/pickup*.${num0c}* . ; fi |
285 |
|
|
#--- 3rd run ( Nit iter , restart from 2nd ) |
286 |
|
|
ln -s $dir2/pickup*.$num1c.* . |
287 |
|
|
sed "s/^ nIter0=$num0/ nIter0=$num1/g" data > data.tmp |
288 |
|
|
mv -f data.tmp data |
289 |
|
|
echo '==> START RUN 1iB' |
290 |
|
|
if [ $mpi -ge 1 ] |
291 |
|
|
then ./$gcmExc std_outp.1iB > TTT.out.1iB 2>&1 |
292 |
|
|
else ./$gcmExc > std_outp.1iB |
293 |
|
|
fi |
294 |
|
|
mv STDERR.0000 std__err.1iB |
295 |
|
|
out=`egrep -c 'STOP ABNORMAL END' std_outp.1iB` |
296 |
|
|
if test $out != 0 |
297 |
|
|
then echo "==> RUN 1iB : ABNORMAL END => exit" ; exit 3 ; fi |
298 |
|
|
if test -f $pref.ckptA.001.001.data |
299 |
|
|
then echo "==> END RUN 1iB" |
300 |
|
|
else echo "==> RUN 1iB STOP without writing $pref => exit" ; exit 3 ; fi |
301 |
|
|
for xx in $listP |
302 |
|
|
do |
303 |
|
|
rnp_loc $xx.ckptA $xx.$num2c |
304 |
|
|
done |
305 |
|
|
mv *.0??.0??.* $dir3 |
306 |
|
|
txtF=`ls -1 *.txt 2> /dev/null` |
307 |
|
|
mv R?.data R?.meta DR?.data DR?.meta $txtF $dir3 |
308 |
|
|
listS=`ls $dir3/pickup*.${num0c}* 2> /dev/null | head -1` |
309 |
|
|
if test "x$listS" != x ; then mv $dir3/pickup*.${num0c}* . ; fi |
310 |
|
|
rm $dir3/pickup*.$num1c.* |
311 |
|
|
rm data |
312 |
|
|
#---------------------------------------------------------------------- |
313 |
|
|
fi |
314 |
|
|
|
315 |
|
|
if test $flag = '2' -o $flag = 'All' ; then |
316 |
|
|
#---------------------------------------------------------------------- |
317 |
|
|
echo ' ' ; echo '== compare cg2d_init_res :' |
318 |
|
|
echo ' run 1iA:' |
319 |
|
|
grep "cg2d_init_res" std_outp.1iA \ |
320 |
|
|
| sed 's/.* cg2d_init_res =//' |
321 |
|
|
echo ' run 1iB:' |
322 |
|
|
grep "cg2d_init_res" std_outp.1iB \ |
323 |
|
|
| sed 's/.* cg2d_init_res =//' |
324 |
|
|
echo ' run 2it:' |
325 |
|
|
grep "cg2d_init_res" std_outp.2it \ |
326 |
|
|
| sed 's/.* cg2d_init_res =//' |
327 |
|
|
#---------------------------------------------------------------------- |
328 |
|
|
fi |
329 |
|
|
|
330 |
|
|
if test $flag = '3' -o $flag = 'All' ; then |
331 |
|
|
#---------------------------------------------------------------------- |
332 |
|
|
echo ' ' |
333 |
|
|
echo "== diff pickup files : end of 1rst run (2x$Nit it) & end of 3rd run (2nd $Nit it)" |
334 |
|
|
listP=`( cd $dir1 ; ls pickup*.$num2c* | sed 's/\..*//g' | uniq )` |
335 |
|
|
chkmeta='Y' |
336 |
|
|
for yy in $listP |
337 |
|
|
do |
338 |
|
|
listY=`(cd $dir1 ; ls $yy.$num2c.*.data | sed "s/$yy\.$num2c\.//" | sed "s/\.data//")` |
339 |
|
|
zz=$yy.$num2c |
340 |
|
|
echo '--> file='$zz', listY='$listY |
341 |
|
|
for xx in $listY |
342 |
|
|
do |
343 |
|
|
echo ' diff' $dir1/$zz.$xx.data $dir3 |
344 |
|
|
diff $dir1/$zz.$xx.data $dir3 |
345 |
|
|
out=$? |
346 |
|
|
if test $out != 0 ; then |
347 |
|
|
echo 'Diff outp=' $out ' ==> stop' |
348 |
|
|
exit 4 |
349 |
|
|
fi |
350 |
|
|
if test $chkmeta = 'Y' -a -f $dir1/$zz.$xx.meta ; then |
351 |
|
|
echo ' diff' $dir1/$zz.$xx.meta $dir3 |
352 |
|
|
diff $dir1/$zz.$xx.meta $dir3 |
353 |
|
|
out=$? |
354 |
|
|
if test $out != 0 ; then |
355 |
|
|
echo 'Diff outp=' $out ' ==> stop' |
356 |
|
|
exit 5 |
357 |
|
|
fi |
358 |
|
|
fi |
359 |
|
|
done |
360 |
|
|
done |
361 |
|
|
#---------------------------------------------------------------------- |
362 |
|
|
fi |
363 |
|
|
|
364 |
|
|
if test $flag = '4' -o $flag = 'All' ; then |
365 |
|
|
#------------- |
366 |
|
|
echo ' ' |
367 |
|
|
echo "== clean-up and reset :" |
368 |
|
|
echo '--> remove output dir and output files:' |
369 |
|
|
echo ' rm -rf' $dir1 $dir2 $dir3 |
370 |
|
|
rm -rf $dir1 $dir2 $dir3 |
371 |
|
|
echo ' rm -f' std_????.?i? |
372 |
|
|
rm -f std_????.?i? |
373 |
|
|
echo ' rm -f' data.pkg data.tst |
374 |
|
|
rm -f data.pkg data.tst |
375 |
|
|
#- move back files from temp_tst dir: |
376 |
|
|
if test -d $tmpDir ; then |
377 |
|
|
echo "--> move back files from 'temp_tst' dir." |
378 |
|
|
cd $tmpDir ; mv -f * .. ; cd .. |
379 |
|
|
rmdir $tmpDir |
380 |
|
|
fi |
381 |
|
|
#------------- |
382 |
|
|
fi |
383 |
|
|
exit 0 |