# Time-stamp: </home/wrf/c/2018/connect2018/fns, Sat, 19 May 2018, 18:53:44 EDT, w540, wrf, W. Randolph Franklin, http://wrfranklin.org/>

# These are zsh functions, which assume the multios option is set.

# connect is the main function; see the HTML doc.

function connect() {
   connect2 $* 2>>! stats 2> /dev/tty }

function do1024() {
   date
   time connect 1024 1088 1088 6 < binvol/p1024  >! /tmp/p1024.out
   date }

function do1024b() {
   date
   time connect 1024 1088 1088 26 < binvol/p1024  >! /tmp/p1024.out
   date }

function do512() {
   time gunzip < binvol/p512.gz | connect 512 544 544 6 | time gzip >! /tmp/p512.out.gz}

function do512r() {
   gunzip < binvol/p512r.gz | connect 544 544 512 6 | gzip >! /tmp/p512r.out.gz}

function do26() {
   gunzip < binvol/p512.gz | connect 512 544 544 26 >! /tmp/out26 }

function do26r() {
   gunzip < binvol/p512r.gz | connect 544 544 512 26 >! /tmp/out26r }

function do26rr() {
   gunzip < binvol/p512rr.gz | connect 544 512 544 26 >! /tmp/out26rr }

function rota() {
   gunzip < binvol/p512.gz | rotatexyz2 | gzip >! binvol/p512r.gz}

function rotb() {
   gunzip < binvol/p512r.gz | rotateyzx2 | gzip >! binvol/p512rr.gz}

function rotc() {
   gunzip < binvol/p512rr.gz | rotatezxy2 | gzip >! binvol/p512rrr.gz}

# Process an output file to extract a list of component counts,
# volumes, and areas.

function procout() {
   tail +2 | cut -f 1 | cut -d' ' -f 2-3 | sort -nr | uniq -c}


# Do a random case

function dorand1() {
   local n
   let n="$1*$1*$1/8+1"
   head -c $n /dev/urandom | connect2 $1 $1 $1 $2 1 >>! pgen/$2/$1 2>> stats
}

# Do $1 repetitions of $2x$2x$2  with $3 connectivity

function dorand() {
echo Do $1 repetitions of ${2}x${2}x${2}  with $3 connectivity
repeat $1
dorand1 $2 $3
end
}


# Do $1 repetitions of $2x$2x$2  with $3 connectivity and $4/256
# of the voxels empty.

function dorandf() {
   echo Do $1 repetitions of ${2}x${2}x${2}  with $3 connectivity and $4/256
   echo of the voxels empty.
   mkdir -p Results/Random/pgen/$2/$3
   repeat $1
      dorandf1 $2 $3 $4
      end
}

# Do 1 rep of $1x$1x$1 with $2 connectivity and ($3+1)/256 of the
# voxels 0.

function dorandf1() {
   echo Doing 1 rep of $1x$1x$1 with $2 connectivity and ($3+1)/256 of the
   echo voxels 0.
   local n
   let n="$1*$1*$1"
   mkdir -p Results/Random/pgen/$1/$2
   head -c $n /dev/urandom | threshhold $3  | char2bit | connect2 $1 $1 $1 $2 1 >>! Results/Random/pgen/$1/$2/$3 2>> stats
}


# Find mean and stdev of numbers in file $1/$2/$3.  Append this
# line to file $1/$2/mean:
#           $3  $1**3*$3/256/mean mean stdev  
# Run from Results/Random/pgen/.  The numbers are the numbers of components.
# The intent is that the expression be the component volume.
# Called from means2.

function means() {
   let a=$1'**'3'*('$3'+1)/256'
   echo -n $3 ' ' >>! $1/$2/mean
   awk -v a=$a '{ s+= $1; ss+=$1*$1 }; END { m=s/NR; std=sqrt(ss/NR-m*m);  print a/m, m, std }' $1/$2/$3 >>! $1/$2/mean
}

# Find means and stdevs of the contents of each numerical file in $1/$2/.
# Write to $1/$2/mean; each line is:
#	filename  mean stdev
# Called from means3.

function means2() {
   echo means2 $1 $2 $PWD
   cd $1/$2
   local a
   a=([0-9]*)
   echo $a
   rm -f mean
   cd ../..
   for i in $a
      do
      means $1 $2 $i
      done
   cat $1/$2/mean
}

# (Re)Do all the means.  Do in Results/Random/pgen.

function means3() {
   local a
   a=([0-9]*)
   local n
   for n in $a
      do
      cd $n
      local b
      b=([0-9]*)
      cd ..
      local c
      for c in $b
         do
         means2 $n $c
	 done
      done  
}



# Do $1 reps on a $2 cube with $3 connectivity for many fill factors.
# E.g. do2 10 100 6
# Do in dir connect.

function do2() {
   for i in 0 1 5 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250
   do
      dorandf $1 $2 $3 $i
      done 
}


function do3() {
   for i in  190 200 210 220 230 240 250
   do
      dorandf 1 150 6 $i
      done 
}


function do4() {
   for i in 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250
   do
      dorandf 1 200 6 $i
      done 
}

function do5() {
   for i in  0 1 5 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160
   do
      dorandf 1 $1 26 $i
      done 
}


function dob3thresh() {
   threshhold 41 < /s/B3.RECON | char2bit >! /g/b3-41
}

function dob3a() {
   gunzip < binvol/b3.gz | \
   connect 765 800 800 6 1 >! Results/b3/run1 2 >> stats }


# Work on the blacklayer_rect.tif file from Sharad Seth 10/99.

function doblack10() {
   connect 1 1857 1911 6 < binvol/black_r10 >! Results/Black_r10/comps 2>> stats }

function doblack5() {
   connect 1 3714 3822  6 < binvol/black_r5 >! Results/Black_r5/comps 2>> stats }

function doblack() {
   gunzip < binvol/black.gz | \
   connect 1  18573 19110  6  2>> stats | \
   gzip -v >! /tmp/Results-black-comps.gz }
#   gzip -v > Results/black/comps.gz }

function reduceblack() {
   tifftopnm blacklayer_rect.tif | pbmreduce $1 | pnminvert | pnmnoraw >! black_r$1.pbm
}

function pbm2bit() {
   tail +3 Overflow/black_r$1.pbm | tr -d '
' | char2bit >! binvol/black_r$1
}


function black1() {
   tifftopnm Overflow/blacklayer_rect.tif | \
   pnminvert | \
   pnmnoraw | \
   tail +3 | \
   tr -d '
' | \
  char2bit >! /h//black
}

# yl zl nyz
# E.g. 1000 1000 1000
# 5000 5000 2000

function compblack() {
  gunzip < Results/black/comps.gz | \
  tail +4 | \
  comp2pgm 0 $1 $2 $3 | \
  ppmtogif >! Results/black/c$1_$2_$3.gif
}


# Extract periodic slides from the p512 data as pbm files.

function extractslices() {
   pushd /tmp
   mkfifo p p1 p2 p3 p4 p5 p6 p7 p8 p0 pa pb
   cat < p > p0 > p1 > p2 > p3 > p4 >p5 >p6 > p7 >p8  >p9 >pa > pb &
   cd ~/c/connect
   gunzip < binvol/p512.gz | bit2char > /tmp/p &
   char2pbm 0 < /tmp/p0 >! 0.pbm &
   char2pbm 50 < /tmp/p1 >! 50.pbm &
   char2pbm 100 < /tmp/p9 >! 100.pbm &
   char2pbm 150 < /tmp/p2 >! 150.pbm &
   char2pbm 200 < /tmp/p3 >! 200.pbm &
   char2pbm 250 < /tmp/p4 >! 250.pbm &
   char2pbm 300 < /tmp/p5 >! 300.pbm &
   char2pbm 350 < /tmp/p6 >! 350.pbm &
   char2pbm 400 < /tmp/pa >! 400.pbm &
   char2pbm 450 < /tmp/p7 >! 450.pbm &
   char2pbm 500 < /tmp/p8 >! 500.pbm &
   char2pbm 511 < /tmp/pb >! 511.pbm &
   cd /tmp
   rm -f  p p1 p2 p3 p4 p5 p6 p7 p8 p0 pa pb
   popd
}

# Extract periodic slides from the p512r data as gif files.

function extractslicesr() {
   pushd /tmp
   mkfifo p p1 p2 p3 p4 p5 p6 p7 p8 p9 p0 pa pb
   cat < p > p0 > p1 > p2 > p3 > p4 >p5 >p6 > p7 >p8  >p9 >pa > pb &
   cd ~/c/connect
   gunzip < binvol/p512r.gz | bit2char > /tmp/p &
   char2pbm 544 544 512 0 < /tmp/p0 | ppmtogif >! slices/rot1/0.gif &
   char2pbm 544 544 512 50 < /tmp/p1 | ppmtogif >! slices/rot1/50.gif &
   char2pbm 544 544 512 100 < /tmp/p2 | ppmtogif >! slices/rot1/100.gif &
   char2pbm 544 544 512 150 < /tmp/p3 | ppmtogif >! slices/rot1/150.gif &
   char2pbm 544 544 512 200 < /tmp/p4 | ppmtogif >! slices/rot1/200.gif &
   char2pbm 544 544 512 250 < /tmp/p5 | ppmtogif >! slices/rot1/250.gif &
   char2pbm 544 544 512 300 < /tmp/p6 | ppmtogif >! slices/rot1/300.gif &
   char2pbm 544 544 512 350 < /tmp/p7 | ppmtogif >! slices/rot1/350.gif &
   char2pbm 544 544 512 400 < /tmp/p8 | ppmtogif >! slices/rot1/400.gif &
   char2pbm 544 544 512 450 < /tmp/p9 | ppmtogif >! slices/rot1/450.gif &
   char2pbm 544 544 512 500 < /tmp/pa | ppmtogif >! slices/rot1/500.gif &
   char2pbm 544 544 512 543 < /tmp/pb | ppmtogif >! slices/rot1/543.gif &
   cd /tmp
   rm -f  p p1 p2 p3 p4 p5 p6 p7 p8 p0 pa pb
   popd
}

# Extract periodic slides from the p512rr data as gif files.

function extractslicesrr() {
   pushd /tmp
   mkfifo p p1 p2 p3 p4 p5 p6 p7 p8 p9 p0 pa pb
   cat < p > p0 > p1 > p2 > p3 > p4 >p5 >p6 > p7 >p8  >p9 >pa > pb &
   cd ~/c/connect
   gunzip < binvol/p512rr.gz | bit2char > /tmp/p &
   char2pbm 544 512 544 0 < /tmp/p0 | ppmtogif >! slices/rot2/0.gif &
   char2pbm 544 512 544 50 < /tmp/p1 | ppmtogif >! slices/rot2/50.gif &
   char2pbm 544 512 544 100 < /tmp/p2 | ppmtogif >! slices/rot2/100.gif &
   char2pbm 544 512 544 150 < /tmp/p3 | ppmtogif >! slices/rot2/150.gif &
   char2pbm 544 512 544 200 < /tmp/p4 | ppmtogif >! slices/rot2/200.gif &
   char2pbm 544 512 544 250 < /tmp/p5 | ppmtogif >! slices/rot2/250.gif &
   char2pbm 544 512 544 300 < /tmp/p6 | ppmtogif >! slices/rot2/300.gif &
   char2pbm 544 512 544 350 < /tmp/p7 | ppmtogif >! slices/rot2/350.gif &
   char2pbm 544 512 544 400 < /tmp/p8 | ppmtogif >! slices/rot2/400.gif &
   char2pbm 544 512 544 450 < /tmp/p9 | ppmtogif >! slices/rot2/450.gif &
   char2pbm 544 512 544 500 < /tmp/pa | ppmtogif >! slices/rot2/500.gif &
   char2pbm 544 512 544 543 < /tmp/pb | ppmtogif >! slices/rot2/543.gif &
   cd /tmp
   rm -f  p p1 p2 p3 p4 p5 p6 p7 p8 p0 pa pb
   popd
}

# Convert the gifs in slices/rot1 to labeled ps files.
function ygif2ps() {
 for f in 0 50 100 150 200 250 300 350 400 450 500 543
 do
	convert -label y=$f $f.gif $f.ps
 done
}


# Find the size of the compressed p512 ascii file.

function calcp512ascigzipsize() {
   pushd ~/c/connect
   gunzip < binvol/p512.gz | bit2char | gzip | wc
}

function test2018() {
echo compare 2018 and 2007 executable on p1024 data
   time connect2 1024 1088 1088 6 < /ds/binvol/p1024  >! /tmp/p1024.out
   time connect2-2007 1024 1088 1088 6 < /ds/binvol/p1024  >! /tmp/p1024a.out
   }
   
