The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use blib ;

use PDL;

use PDL::Graphics::TriD;

# $PDL::Graphics::TriD::verbose=1;

$offs = 0.0;

$tc = 0.2;
$fc = $tc * 0.4;
$sc = $tc * 3.2;;
$fric = 0.02;
$bc = 1-$fric*$tc;

$size = 80 ;

$a = zeroes(float(),$size,$size);

$b = ((rvals $a) < $size/2)->float;

$c = (rvals ($size,$size,{Centre=>[$size/3,$size/3]}))->float ;
$c2 = (rvals ($size,$size,{Centre=>[$size/3,$size/2]}))->float ;

# $sdiv = 12/$size;
$sdiv = 20/$size;

$a .= exp(-($sdiv*$c) ** 2)->float;
$a -= exp(-($sdiv*$c2) ** 2)->float;
$a *= $b;

if(0) {
	$a->set(8,8,0.3);
	$a->set(8,9,0.5);
	$a->set(9,8,0.5);
	$a->set(9,9,1);
	$a->set(10,8,0.3);
	$a->set(10,9,0.5);
	$a->set(8,10,0.3);
	$a->set(9,10,0.5);
	$a->set(10,10,0.3);
}


$asl1 = $a->slice("0:-3,1:-2");
$asl2 = $a->slice("1:-2,0:-3");
$asl3 = $a->slice("2:-1,1:-2");
$asl4 = $a->slice("1:-2,2:-1");

$ach = $a->slice("1:-2,1:-2");
$bch = $b->slice("1:-2,1:-2");

$s = $ach * 0;

$round = 0;

$win = PDL::Graphics::TriD::get_current_window();
# points3d([SURF2D,$a]);
$g = PDL::Graphics::TriD::get_current_graph();

keeptwiddling3d(1);

$surf = new PDL::Graphics::TriD::SLattice_S([$a]);

if(0) {
	$g->add_dataseries($surf,"surf");
	$g->bind_default("surf");
	$g->scalethings();
	$g->PDL::Graphics::TriD::Object::changed();
	$win->add_object($g);
	$win->twiddle();
} else {
	$win->add_object($surf);
}

$a->set(0,0,$offs);
$a->set(1,0,-$offs);
# $as = $a->slice("");
# $as->doflow(1);
while(1) {

	$aav = ($asl1 + $asl2 + $asl3 + $asl4)/4;

	$da = ($aav - $ach) * $fc;
	$da *= $bch;

	$s += $da;
	$s *= $bc;

	$ach += $s * $sc;

	print $round,"\n";

	if($round % 5 == 0) {
		if(0) {
			$surf->data_changed();
	#		$g->data_changed();
			$g->PDL::Graphics::TriD::Object::changed();
			$win->changed();
			$win->twiddle(1);
		} else {
			imag3d([$a],{KeepTwiddling => 0});
		}
	}
	$round++;
}