| 1 | #! /usr/bin/env bash | 
| 2 |  | 
| 3 | # $Header: $ | 
| 4 | # $Name:  $ | 
| 5 | #set -x | 
| 6 |  | 
| 7 | comp_1fld() | 
| 8 | { | 
| 9 | # comp_1fld select_string select_var print_var file_1 file_2 | 
| 10 | echo ' ' >> $logfil | 
| 11 | uu="$1$2" | 
| 12 | egrep "${uu}" $4 | sed 's/.*=//' | nl > tmp1.txt | 
| 13 | egrep "${uu}" $5 | sed 's/.*=//' | nl > tmp2.txt | 
| 14 | if test -s tmp1.txt ; then nl1=`sed -n '$=' tmp1.txt` ; else nl1=0 ; fi | 
| 15 | if test -s tmp2.txt ; then nl2=`sed -n '$=' tmp2.txt` ; else nl2=0 ; fi | 
| 16 | if [ $nl1 -ne $nl2 ] ; then | 
| 17 | cmp=0 | 
| 18 | echo $cmp $3 ' ; nb output:' $nl1 $nl2 | 
| 19 | echo $cmp $3 ' ; nb output:' $nl1 $nl2 >> $logfil | 
| 20 | rm -f tmp1.txt tmp2.txt | 
| 21 | elif [ $nl1 -le 1 ] ; then | 
| 22 | cmp=16 | 
| 23 | echo '--' $3 ' ; not enough output:' $nl1 $nl2 | 
| 24 | echo '--' $3 ' ; not enough output:' $nl1 $nl2 >> $logfil | 
| 25 | rm -f tmp1.txt tmp2.txt | 
| 26 | else | 
| 27 | join tmp1.txt tmp2.txt > tmp3.txt | 
| 28 | cmp=`$compex < tmp3.txt 2> tmp4.txt` | 
| 29 | err=`egrep -c ' error ' tmp4.txt` | 
| 30 | if [ $err -ge 1 ] ; then | 
| 31 | echo $cmp $3 ':' $compex 'gives' $err 'error(s)' | 
| 32 | echo $cmp $3 ':' $compex 'gives' $err 'error(s)' >> $logfil | 
| 33 | cmp=0 | 
| 34 | elif test -s tmp4.txt ; then | 
| 35 | cat tmp4.txt | 
| 36 | echo $cmp $3 ' <- set to 0' | 
| 37 | echo $cmp $3 ' <- set to 0' >> $logfil | 
| 38 | cmp=0 | 
| 39 | else | 
| 40 | printf '%2i %s\n' $cmp $3 | 
| 41 | printf '%2i %s\n' $cmp $3 >> $logfil | 
| 42 | fi | 
| 43 | if test -f cmpnum.log | 
| 44 | then cat cmpnum.log >> $logfil ; rm -f cmpnum.log ; fi | 
| 45 | rm -f tmp1.txt tmp2.txt tmp3.txt tmp4.txt | 
| 46 | fi | 
| 47 | if [ $cmp -lt $gMin ] ; then gMin=$cmp ; fi | 
| 48 | } | 
| 49 |  | 
| 50 | kAd=0 | 
| 51 | if [ $# -ge 3 ]  ; then | 
| 52 | if test $3 = 'AD' ; then | 
| 53 | kAd=1 ; fil1=$1 ; fil2=$2 ; shift | 
| 54 | fi | 
| 55 | fi | 
| 56 | case $# in | 
| 57 | 2|3) ;; | 
| 58 | *) echo "Usage: `basename $0` outp_file_1 outp_file_2 [AD][D,nh,ad,tl,S,I,L,#]" | 
| 59 | echo " compare output from DEBUG_STATS (=D) or from [AD] MONITOR, with:" | 
| 60 | echo "   nh (+cg3d) ; ad= Adj.Grad ; tl= Tang.Lin ; S= SeaIce only ;" | 
| 61 | echo "   E= exf ; I= ThSI ; L= land ; M= StreamIce ; # = number of pTrac" | 
| 62 | exit ;; | 
| 63 | esac | 
| 64 | if test $kAd = 0 ; then fil1=$1 ; fil2=$2 ; fi | 
| 65 | flag=0 | 
| 66 | if test $# = 3 ; then flag=$3 ; fi | 
| 67 | logfil=comp_res.log | 
| 68 |  | 
| 69 | echo 'flag=' $flag ' ; file_1 file_2 =' $fil1 $fil2 | 
| 70 |  | 
| 71 | #platform=`uname -i` | 
| 72 | platform=`uname -m` | 
| 73 | exDir=`echo $HOME/mitgcm/bin` | 
| 74 | compex=`ls $exDir/cmpnum.$platform 2>/dev/null` | 
| 75 | if test x$compex = x | 
| 76 | then compex=`ls $exDir/cmpnum 2>/dev/null` ; fi | 
| 77 | if test x$compex = x | 
| 78 | then echo "executable: $exDir/cmpnum not found" ; exit ; fi | 
| 79 | #echo $compex | 
| 80 | if test -x $compex | 
| 81 | then echo ' use executable:' $compex | 
| 82 | else echo "executable: $compex not found" ; exit | 
| 83 | fi | 
| 84 |  | 
| 85 | echo 'flag=' $flag ' ; file_1 file_2 =' $fil1 $fil2 > $logfil | 
| 86 | echo ' use executable:' $compex >> $logfil | 
| 87 |  | 
| 88 | listA='eta uvel vvel wvel theta salt' | 
| 89 | listB='u v w W' | 
| 90 | listC='pe_b ke_max ke_mean vort_r_min vort_r_max vort_a_sd vort_p_sd cg2d' | 
| 91 | if test $flag = 'nh'; then listC=$listC' cg3d' ; flag=0; fi | 
| 92 |  | 
| 93 | listS='_min _max _mean _sd _del2' | 
| 94 |  | 
| 95 | listDy='EtaN Uvel Vvel Wvel Theta Salt Gu Gv Gt Gs GuNm1 GvNm1 GtNm1 GsNm1 cg2d_b cg2d_x' | 
| 96 | #listDy='Gu Gv cg2d_b' | 
| 97 | listDb=' min max mean S.D.' | 
| 98 |  | 
| 99 | listE='ustress vstress hflux sflux uwind vwind wspeed atemp aqh precip swflux lwflux swdown lwdown' | 
| 100 | if test $kAd = 0 ; then listE="$listE evap" ; fi | 
| 101 |  | 
| 102 | listSI='uice vice area heff hsnow' | 
| 103 |  | 
| 104 | listI='Ice_Area IceH_ave IceH_max SnwH_ave Tsrf_ave Tic1_ave Tic2_ave' | 
| 105 | listH='_S _N' | 
| 106 |  | 
| 107 | listL='SnwH_ave TotEnerg Tsrf_ave Tgr1_ave Tgr2_ave grdW_ave' | 
| 108 | listZ='_S _T _N' | 
| 109 |  | 
| 110 | listAD='Cost AdGrd FDGrd' | 
| 111 | #- with old ADM output: | 
| 112 | #listAD='cost grad' | 
| 113 | listTL='tlCst tlGrd fwGrd' | 
| 114 |  | 
| 115 | gMin=16; | 
| 116 |  | 
| 117 | if test $flag = 0 | 
| 118 | then | 
| 119 | zz='MON dynstat_' | 
| 120 | if test $kAd = 1 ; then zz='MON ad_dynstat_' ; fi | 
| 121 | for yy in $listA | 
| 122 | do | 
| 123 | for ss in $listS | 
| 124 | do | 
| 125 | xx=${yy}$ss | 
| 126 | if test $kAd = 1 ; then xx='ad'$xx ; fi | 
| 127 | comp_1fld "$zz" $xx $xx $fil1 $fil2 | 
| 128 | done | 
| 129 | done | 
| 130 | fi | 
| 131 |  | 
| 132 | if test $flag = 0 -a $kAd = 0 | 
| 133 | then | 
| 134 | zz='MON advcfl_' | 
| 135 | for yy in $listB | 
| 136 | do | 
| 137 | xx='CFL_'$yy | 
| 138 | comp_1fld "$zz" $yy $xx $fil1 $fil2 | 
| 139 | done | 
| 140 | fi | 
| 141 |  | 
| 142 | if test $flag = 0 -a $kAd = 0 | 
| 143 | then | 
| 144 | for xx in $listC | 
| 145 | do | 
| 146 | #  echo ' ' >> $logfil | 
| 147 | zz='MON ' | 
| 148 | if test $xx = cg2d -o $xx = cg3d ; then zz=$xx; yy=_init_res ; else yy=$xx ; fi | 
| 149 | #echo $yy | 
| 150 | comp_1fld "$zz" $yy $xx $fil1 $fil2 | 
| 151 | done | 
| 152 | fi | 
| 153 |  | 
| 154 | if test $flag = 'D' | 
| 155 | then | 
| 156 | for yy in $listDy | 
| 157 | do | 
| 158 | for xx in $listDb | 
| 159 | do | 
| 160 | zz=${yy}' .*'$xx | 
| 161 | comp_1fld "$zz" '=' "${yy}[${xx}]" $fil1 $fil2 | 
| 162 | done | 
| 163 | done | 
| 164 | echo 'Minimum match= ' $gMin | 
| 165 | exit | 
| 166 | fi | 
| 167 |  | 
| 168 | if test $flag = 'E' -a $kAd = 0 | 
| 169 | then | 
| 170 | zz='MON exf_' | 
| 171 | for yy in $listE | 
| 172 | do | 
| 173 | for ss in $listS | 
| 174 | do | 
| 175 | xx=${yy}$ss | 
| 176 | comp_1fld "$zz" $xx $xx $fil1 $fil2 | 
| 177 | done | 
| 178 | done | 
| 179 | echo 'Minimum match= ' $gMin | 
| 180 | exit | 
| 181 | fi | 
| 182 | if test $flag = 'E' -a $kAd = 1 | 
| 183 | then | 
| 184 | zz='MON ad_exf_' | 
| 185 | for yy in $listE | 
| 186 | do | 
| 187 | for ss in $listS | 
| 188 | do | 
| 189 | xx='ad'${yy}$ss | 
| 190 | comp_1fld "$zz" $xx $xx $fil1 $fil2 | 
| 191 | done | 
| 192 | done | 
| 193 | echo 'Minimum match= ' $gMin | 
| 194 | exit | 
| 195 | fi | 
| 196 |  | 
| 197 | if test $flag = 'S' | 
| 198 | then | 
| 199 | zz='MON seaice_' | 
| 200 | for yy in $listSI | 
| 201 | do | 
| 202 | for ss in $listS | 
| 203 | do | 
| 204 | xx=${yy}$ss | 
| 205 | comp_1fld "$zz" $xx $xx $fil1 $fil2 | 
| 206 | done | 
| 207 | done | 
| 208 | echo 'Minimum match= ' $gMin | 
| 209 | exit | 
| 210 | fi | 
| 211 |  | 
| 212 | if test $flag = 'I' | 
| 213 | then | 
| 214 | zz='MON thSI_' | 
| 215 | for yy in $listI | 
| 216 | do | 
| 217 | for ss in $listH | 
| 218 | do | 
| 219 | xx=${yy}$ss | 
| 220 | comp_1fld "$zz" $xx $xx $fil1 $fil2 | 
| 221 | done | 
| 222 | done | 
| 223 | echo 'Minimum match= ' $gMin | 
| 224 | exit | 
| 225 | fi | 
| 226 |  | 
| 227 | if test $flag = 'L' | 
| 228 | then | 
| 229 | zz='MON land_' | 
| 230 | for yy in $listL | 
| 231 | do | 
| 232 | for ss in $listZ | 
| 233 | do | 
| 234 | xx=${yy}$ss | 
| 235 | comp_1fld "$zz" $xx $xx $fil1 $fil2 | 
| 236 | done | 
| 237 | done | 
| 238 | echo 'Minimum match= ' $gMin | 
| 239 | exit | 
| 240 | fi | 
| 241 |  | 
| 242 | if test $flag = 'M' | 
| 243 | then | 
| 244 | listM='StrmIc' | 
| 245 | zz='STREAMICE_' | 
| 246 | listN='FP_ERR' | 
| 247 | for yy in $listM | 
| 248 | do | 
| 249 | for ss in $listN | 
| 250 | do | 
| 251 | xx=$ss | 
| 252 | comp_1fld "$zz" $xx $yy $fil1 $fil2 | 
| 253 | done | 
| 254 | done | 
| 255 | echo 'Minimum match= ' $gMin | 
| 256 | exit | 
| 257 | fi | 
| 258 |  | 
| 259 | if test $flag = 'ad' | 
| 260 | then | 
| 261 | zz='  ADM  ' | 
| 262 | #- with old ADM output: | 
| 263 | # zz='  ADM  precision_derivative_' | 
| 264 | echo $fil1 ' output ADM:' | 
| 265 | grep "$zz" $fil1 | sed "s/.*$zz/ /" | 
| 266 | echo $fil2 ' output ADM:' | 
| 267 | grep "$zz" $fil2 | sed "s/.*$zz/ /" | 
| 268 | for yy in $listAD | 
| 269 | do | 
| 270 | case $yy in | 
| 271 | 'Cost') xx='ref_cost_function' ;; | 
| 272 | 'AdGrd') xx='adjoint_gradient' ;; | 
| 273 | 'FDGrd') xx='finite-diff_grad' ;; | 
| 274 | *) xx=$yy ;; | 
| 275 | esac | 
| 276 | for ss in 'result' | 
| 277 | do | 
| 278 | comp_1fld "$zz" $xx $yy $fil1 $fil2 | 
| 279 | done | 
| 280 | done | 
| 281 | echo 'Minimum match= ' $gMin | 
| 282 | exit | 
| 283 | fi | 
| 284 |  | 
| 285 | if test $flag = 'tl' | 
| 286 | then | 
| 287 | zz='  TLM  ' | 
| 288 | echo $fil1 ' output TLM:' | 
| 289 | grep "$zz" $fil1 | sed "s/.*$zz/ /" | 
| 290 | echo $fil2 ' output TLM:' | 
| 291 | grep "$zz" $fil2 | sed "s/.*$zz/ /" | 
| 292 | for yy in $listTL | 
| 293 | do | 
| 294 | case $yy in | 
| 295 | 'tlCst') xx='ref_cost_function' ;; | 
| 296 | 'tlGrd') xx='tangent-lin_grad' ;; | 
| 297 | 'fwGrd') xx='finite-diff_grad' ;; | 
| 298 | *) xx=$yy ;; | 
| 299 | esac | 
| 300 | for ss in 'result' | 
| 301 | do | 
| 302 | comp_1fld "$zz" $xx $yy $fil1 $fil2 | 
| 303 | done | 
| 304 | done | 
| 305 | echo 'Minimum match= ' $gMin | 
| 306 | exit | 
| 307 | fi | 
| 308 |  | 
| 309 | if [ $flag -ge 1 -a $flag -le 9 ] | 
| 310 | then | 
| 311 | zz='MON trcstat_' | 
| 312 | if test $kAd = 1 ; then zz='MON ad_trcstat_' ; fi | 
| 313 | it=1 | 
| 314 | while [ $it -le $flag ] | 
| 315 | do | 
| 316 | yy='ptracer0'$it | 
| 317 | if test $kAd = 1 ; then yy='ad'$yy ; fi | 
| 318 | for ss in $listS | 
| 319 | do | 
| 320 | xx=${yy}$ss | 
| 321 | comp_1fld "$zz" $xx $xx $fil1 $fil2 | 
| 322 | done | 
| 323 | it=`expr $it + 1` | 
| 324 | done | 
| 325 | fi | 
| 326 |  | 
| 327 | echo 'Minimum match= ' $gMin | 
| 328 | exit |