;test the cache sub-system
;

set t11 = 1000
set t12 = 248  set t22 = 1000
set t13 = 40   set t23 = 120   set t33 = 80

; first test if there is enough room
set total = ( 4*2*power2($t11-1)+4k)                                         ;1d
set total = ( $total + 4*4*power2($t12-1)*power2($t22-1) +4k )               ;2d
set total = ( $total + 4*8*power2($t13-1)*power2($t23-1)*power2($t33-1) +4k) ;3d
set total = ( $total + 4*power2($t13-1)*power2($t23-1)*power2($t33-1) +4k)   ;newfilec
set total = ($total /1k)   ; in ko

; this will be precise only if txx values are slightly smaller than power of 2

; change direc if you want to work on a different directory
set direc = "/usr/tmp"
print ("Be carefull that this test will create large temporary files on";$direc)
print ("for a total of about" ; int($total) ; "ko")
print "Please make sure that this space is available !"

; create dummy file_names
set i = ( int($random*100000) )
set file1 = ($direc // "/gifa" // $i )
set file2 = ($direc // "/gifa" // $i+1 )
set file3 = ($direc // "/gifa" // $i+2 )
set file4 = ($direc // "/gifa" // $i+3 )
set file5 = ($direc // "/gifa" // $i+4 )
set file6 = ($direc // "/gifa" // $i+5 )
set file7 = ($direc // "/gifa" // $i+6 )

;
dim 1 chsize $t11 one mult 100 sin 0 write $file1
dim 2 chsize $t12 $t22 one mult 1000 sin 0 f12 write $file2
dim 3 chsize $t13 $t23 $t33 one mult 10000 sin 0 f123 write $file3

report (1 == 1) "Write"

;======read test====
;
; read back
dim 1 chsize 512 zero
read $file1
max
set ok = ($si1_1d == $t11 & abs($max[1]-100)<1 & abs($max[2]) < 1)

dim 2 chsize 100 100 zero
read $file2
max
set ok = ($ok & ($si1_2d*$si2_2d) == ($t12*$t22) & abs($max[1]-1000)<1 & abs($max[2]) < 1)

dim 3 chsize 10 10 10 zero
read $file3
max
set ok = ($ok & ($si1_3d*$si2_3d*$si3_3d) == ($t13*$t23*$t33))
set ok = ($ok & abs($max[1]-10000)<1 & abs($max[2]) < 1)

report $ok "Read"

=skip_read

join $file3
join $file1
join $file2
listfilec
dataset

report ($c_sizef1*$c_sizef2 == $t12*$t22) "Join"

set pi_2 = (2*atan(1))
; sqrt(2)/2 = cos(pi_2 / 2) is equal to 0.7071 ! , its square is 0.5 !!
; result are tested at 1.4%, this is because the number of points

; ==========test getc 1d-1d
join $file1
set td = (2*int($t11/4) +1)     set tf = ($t11-10)
set test = (100*cos($pi_2*$tf/$t11))
dim 1 getc $td $tf
set ok = ($si1_1d == ( $tf - $td +1))
max
set ok = ($ok & abs($max[1]-70.71) < 1 & abs($max[2]-$test)<1 )
report $ok "Getc 1d - 1d"
set okok = $ok

; ==========test getc 2d-1d
join $file2
set td = 1     set tf = $t12
set test = (1000*cos($pi_2*$tf/$t12))
dim 1 getc f1 1  $td $tf
set ok = ($si1_1d == ( $tf - $td +1))
max
set ok = ($ok & abs($max[1]-1000) < 1 & abs($max[2]-$test)< 1 )

set td = (2*int($t22/4) +1)     set tf = ($t22-10)
set test = (707.1*cos($pi_2*$tf/$t22))
getc f2 ($t12/2) $td $tf
set ok = ($ok & $si1_1d == ( $tf - $td +1))
max
set ok = ($ok & abs($max[1]-500) < 10 & abs($max[2]-$test)<10 )

report $ok "Getc 2d - 1d"
set okok = ($okok & $ok)

; ==========test getc 3d-1d
join $file3
set td = 1     set tf = $t13
set test = (10000*cos($pi_2*$tf/$t13))
dim 1 getc f1 1 1 $td $tf
set ok = ($si1_1d == ( $tf - $td +1))
max
set ok = ($ok & abs($max[1]-10000) < 1 & abs($max[2]-$test)< 1 )

set td = (2*int($t23/4) +1)     set tf = ($t23-10)
set test = (7071*cos($pi_2*$tf/$t23))
getc f2 ($t13/2) 1 $td $tf
set ok = ($ok & $si1_1d == ( $tf - $td +1))
max
set ok = ($ok & abs($max[1]-5000) < 100 & abs($max[2]-$test)<100 )

set td = (2*int($t33/4) +1)     set tf = ($t33-10)
set test = (5000*cos($pi_2*$tf/$t33))
getc f3 ($t13/2) ($t23/2) $td $tf
set ok = ($ok & $si1_1d == ( $tf - $td +1))
max
set ok = ($ok & abs($max[1]-5000*0.7071) < 100 & abs($max[2]-$test)<100 )

report $ok "Getc 3d - 1d"
set okok = ($okok & $ok)

; ==========test getc 2d-2d
join $file2
set td1 = (2*int($t12/4) +1)     set tf1 = ($t12-10)
set td2 = (2*int($t22/4) +1)     set tf2 = ($t22-10)
set test = (1000*cos($pi_2*$tf1/$t12)*cos($pi_2*$tf2/$t22))
dim 2 getc $td1 $td2 $tf1 $tf2
set ok = ($si1_2d == ( $tf1 - $td1 +1) & $si2_2d == ( $tf2 - $td2 +1))
max
set ok = ($ok & abs($max[1]-500) < 10 & abs($max[2]-$test)< 10 )

report $ok "Getc 2d - 2d"
set okok = ($okok & $ok)

; ==========test getc 3d-2d
join $file3
set td1 = 1     set tf1 = $t23
set td2 = 1     set tf2 = $t33
set test = (10000*cos($pi_2*$tf1/$t23)*cos($pi_2*$tf2/$t33))
dim 2 getc f1 1 $td1 $td2 $tf1 $tf2
set ok = ($si1_2d == ( $tf1 - $td1 +1) & $si2_2d == ( $tf2 - $td2 +1))
max
set ok = ($ok & abs($max[1]-10000) < 1 & abs($max[2]-$test)< 1 )

set td1 = (2*int($t13/4) +1)     set tf1 = ($t13-10)
set td2 = (2*int($t33/4) +1)     set tf2 = ($t33-10)
set test = (10000*cos($pi_2*$tf1/$t13)*cos($pi_2*$tf2/$t33))
dim 2 getc f2 1 $td1 $td2 $tf1 $tf2
set ok = ($ok & $si1_2d == ( $tf1 - $td1 +1) & $si2_2d == ( $tf2 - $td2 +1))
max
set ok = ($ok & abs($max[1]-5000) < 200 & abs($max[2]-$test)< 100 )

set td1 = (2*int($t13/4) +1)     set tf1 = ($t13-10)
set td2 = (2*int($t23/4) +1)     set tf2 = ($t23-10)
set test = (7071*cos($pi_2*$tf1/$t13)*cos($pi_2*$tf2/$t23))
dim 2 getc f3 ($t33/2) $td1 $td2 $tf1 $tf2
set ok = ($ok & $si1_2d == ( $tf1 - $td1 +1) & $si2_2d == ( $tf2 - $td2 +1))
max
set ok = ($ok & abs($max[1]-5000*0.7071) < 100 & abs($max[2]-$test)< 100 )

report $ok "Getc 3d - 2d"
set okok = ($okok & $ok)

; ==========test getc 3d-3d
join $file3
set td1 = (2*int($t13/4) +1)     set tf1 = ($t13-10)
set td2 = (2*int($t23/4) +1)     set tf2 = ($t23-10)
set td3 = (2*int($t33/4) +1)     set tf3 = ($t33-10)
set test = (10000*cos($pi_2*$tf1/$t13)*cos($pi_2*$tf2/$t23)*cos($pi_2*$tf3/$t33))
dim 3 getc $td1 $td2 $td3 $tf1 $tf2 $tf3
set ok = ($si1_3d == ( $tf1 - $td1 +1) & $si2_3d == ( $tf2 - $td2 +1) & $si3_3d == ( $tf3 - $td3 +1))
max
set ok = ($ok & abs($max[1]-5000*0.7071) < 200 & abs($max[2]-$test)< 100 )

report $ok "Getc 3d - 3d"
set okok = ($okok & $ok)

report $okok "Getc"


; make zero files to put in
dim 1 chsize $t11		zero write $file4
dim 2 chsize $t12 $t22		zero write $file5
dim 3 chsize $t13 $t23 $t33	zero write $file6

;=========================
; ==========test putc 1d
join $file4
set td = 1     set tf = ($t11/2)
dim 1 chsize $tf one
putc $td $tf
flush
zero
getc %%
max
set ok = ($max[1] == 1.0 & abs($max[2]) < 1.0e-6)
getc ($tf+1) %
max
set ok = ($ok & abs($max[1]) < 1.0e-6 & abs($max[2]) < 1.0e-6)
report $ok "Putc 1d - 1d"
set okok = $ok

; ==========test putc 2d-1d
join $file5
set td = 1     set tf = ($t12/2)
dim 1 chsize $tf one
putc f1 1  $td $tf
flush
zero
getc f1 1 %%
max
set ok = ($max[1] == 1.0 & abs($max[2]) < 1.0e-6)
getc f1 1 ($tf+1) %
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

set td = 1     set tf = ($t22/2)
dim 1 chsize $tf one
putc f2 ($t12/2 +1)  $td $tf
flush
zero
getc f2 ($t12/2 +1) %%
max
set ok = ($ok & $max[1] == 1.0 & $max[2] < 1.0e-6)
getc f2 ($t12/2 +1) ($tf+1) %
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

report $ok "Putc 2d - 1d"
set okok = ($okok & $ok)


; ==========test putc 3d-1d
join $file6
set td = 1     set tf = ($t13/2)
dim 1 chsize $tf one
putc f1 1 1 $td $tf
flush
zero
getc f1 1 1 %%
max
set ok = ($max[1] == 1.0 & abs($max[2]) < 1.0e-6)
getc f1 1 1 ($tf+1) %
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

set td = 1     set tf = ($t23/2)
dim 1 chsize $tf one
putc f2 1 ($t13/2+1) $td $tf
flush
zero
getc f2 1 ($t13/2+1) %%
max
set ok = ($ok & $max[1] == 1.0 & $max[2] < 1.0e-6)
getc f2 1 ($t13/2+1) ($tf+1) %
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

set td = 1     set tf = ($t33/2)
dim 1 chsize $tf one
putc f3 ($t13/2+1) ($t23/2+1) $td $tf
flush
zero
getc f3 ($t13/2+1) ($t23/2+1) %%
max
set ok = ($ok & $max[1] == 1.0 & $max[2] < 1.0e-6)
getc f3 ($t13/2+1)  ($t23/2+1) ($tf+1) %
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

report $ok "Putc 3d - 1d"
set okok = ($okok & $ok)

; ==========test putc 2d-2d
join $file5
set td1 = 1     set tf1 = ($t12/2)
set td2 = 1     set tf2 = ($t22/2)
dim 2 chsize $tf1 $tf2 one
putc $td1 $td2 $tf1 $tf2
flush
zero
getc %%
max
set ok = ($max[1] == 1.0 & $max[2] < 1.0e-6)
getc ($tf1+1) ($tf2+1) %%
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

report $ok "Putc 2d - 2d"
set okok = ($okok & $ok)

; ==========test putc 3d-2d
join $file6
set td1 = 1     set tf1 = ($t23/2)
set td2 = 1     set tf2 = ($t33/2)
dim 2 chsize $tf1 $tf2 one
putc f1 1 $td1 $td2 $tf1 $tf2
flush
zero
getc f1 1 %%
max
set ok = ($max[1] == 1.0 & $max[2] < 1.0e-6)
getc f1 1 ($tf1+1) ($tf2+1) %%
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

set td1 = 1     set tf1 = ($t13/2)
set td2 = 1     set tf2 = ($t33/2)
dim 2 chsize $tf1 $tf2 one
putc f2 ($t23/2+1) $td1 $td2 $tf1 $tf2
flush
zero
getc f2 ($t23/2+1) %%
max
set ok = ($ok & $max[1] == 1.0 & $max[2] < 1.0e-6)
getc f2 ($t23/2+1) ($tf1+1) ($tf2+1) %%
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

set td1 = 1     set tf1 = ($t13/2)
set td2 = 1     set tf2 = ($t23/2)
dim 2 chsize $tf1 $tf2 one
putc f3 ($t33/2+1) $td1 $td2 $tf1 $tf2
flush
zero
getc f3 ($t33/2+1) %%
max
set ok = ($ok & $max[1] == 1.0 & $max[2] < 1.0e-6)
getc f3 ($t33/2+1) ($tf1+1) ($tf2+1) %%
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

report $ok "Putc 3d - 2d"
set okok = ($okok & $ok)

; ==========test putc 3d-3d
join $file6
set td1 = 1     set tf1 = ($t13/2)
set td2 = 1     set tf2 = ($t23/2)
set td3 = 1     set tf3 = ($t33/2)
dim 3 chsize $tf1 $tf2 $tf3 one
putc $td1 $td2 $td3 $tf1 $tf2 $tf3
flush
zero
getc  %%
max
set ok = ($max[1] == 1.0 & $max[2] < 1.0e-6)
getc ($tf1+1) ($tf2+1) ($tf3+1) %%
max
set ok = ($ok & $max[1] < 1.0e-6 & $max[2] < 1.0e-6)

report $ok "Putc 3d - 3d"
set okok = ($okok & $ok)

report $okok "Putc"

;=========================
; ======== newfilec et proc2d

newfilec $file7 3d ($t13/4) 0.1 1.1 2.1 ($t23/4) 0.2 1.2 2.2 ($t33/4) 0.3 1.3 2.3 10.1 0


set ok = ($c_dim == 3 & abs($c_offsf1-0.1)<1.0e-6 & abs($c_offsf2-0.2)<1.0e-6 & abs($c_offsf3-0.3)<1.0e-6)
set ok = ($ok & abs($c_specwf1-1.1)<1.0e-6 & abs($c_specwf2-1.2)<1.0e-6 & abs($c_specwf3-1.3)<1.0e-6 )
set ok = ($ok & abs($c_freq1-2.1)<1.0e-6 & abs($c_freq2-2.2)<1.0e-6 & abs($c_freq3-2.3)<1.0e-6)
set ok = ($ok & abs($c_sizef1-$t13/2)<1.0e-6 & abs($c_sizef2-$t23/2)<1.0e-6 & abs($c_sizef3-$t33/2)<1.0e-6)
set ok = ($ok & $c_type == 0 & abs($c_freq-10.1)<1.0e-6 )

dim 1 chsize  ($t23/4)
for i = 1 to ($t13/4)
	for j = 1 to ($t33/4)
		one mult ($i+$j) putc f2 $i $j 1 ($t23/4)
	endfor
endfor
disjoin
join $file7

dim 2
getc f2 ($t23/8) 1 1 ($t13/4) ($t33/4)
max
set ok = ($max[1] == ($t13/4 + $t33/4) & $max[2] == 2 )

disjoin

report $ok newfilec

sh ('/bin/rm' ; $file7)

;======= disjoin
join $file4 disjoin
join $file5 disjoin
join $file6 disjoin
join $file1 disjoin
join $file2 disjoin
join $file3 disjoin

report (!$c_joined) "Disjoin"

; remove files
sh ("rm -f " ; $file1 ; $file2 ; $file3)

;=============proc2d ====

../macro/proc2d $file5 $file7 f2 'chsize (%/2) mult -1'

flushcache

read $file5 chsize % (%/2) add $file7 max

report ($max[1] == 0 & $max[2] == 0) proc2d

; ================ Getheader, Putheader

join $file7

putheader Type 12
set ok = ($c_header == 12)
getheader Dim
set ok = ($c_header == 2)
getheader Type
set ok = ($ok & $c_header == 12)
putheader Coucou "You can even put string in there"
getheader Coucou
set ok = ($ok & $c_header s=  "You can even put string in there")
putheader "2nd example" "Parameters can be anything"
getheader "2nd example"
set ok = ($ok & $c_header s=  "Parameters can be anything")
Disjoin

join $file7
getheader Type
set ok = ($ok & $c_header == 12)
Disjoin

report $ok "Getheader, Putheader"

; ================ addc

dim 1 chsize $t11		one write $file4
one mult 2
addc $file4
max
set ok = ($max[1] == 3.0)

dim 2 chsize $t12 $t22		one mult 10  write $file5
one mult 4
addc $file5
max
set ok = ($ok & $max[1] == 14.0)

dim 3 chsize $t13 $t23 $t33	one mult 100 write $file6
one mult 6
addc $file6
max
set ok = ($ok & $max[1] == 106.0)

report $ok Addc

sh ("/bin/rm -f"; $file4; $file5; $file6; $file7)

exit

