#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<unistd.h>
#include<errno.h>
#include<sys/syscall.h>




#define SIZE 99
#define MAXDROP 17000


int rndm();
void fillzero(int grid[SIZE][SIZE]);
void rndmfill(int grid[SIZE][SIZE]);
void drop(int grid[SIZE][SIZE]);
void display(int grid[SIZE][SIZE],FILE *f);
void testavalanche(int grid[SIZE][SIZE],int x,int y);

int dropcount=0;
int mid;

main(){
	int grid[SIZE][SIZE];
	int i;
	
	FILE *f;
	f=fopen("data.dat","w");

	srand(time(NULL));	/****Set the seed***/

	fillzero(grid);
	drop(grid);
	display(grid,f);
}



int rndm(){
	//Generate random number between 1 and 3
	int rn;
	rn=rand() / (((double)RAND_MAX + 1)/4);
	return rn;
}


void fillzero(int grid[SIZE][SIZE]){
	int i,j;
	//Initialize grid
	for(i=0;i<SIZE;i++){
		for(j=0;j<SIZE;j++){
			grid[i][j]=0;
		}
	}
	return;
}


void rndmfill(int grid[SIZE][SIZE]){
	int i,j;
	//Fill randomly with cells getting from 0 grains to 3 grains
	for(i=0;i<SIZE;i++){
		for(j=0;j<SIZE;j++){
			grid[i][j]=rndm();
		}
	}
	return;
}


void drop(int grid[SIZE][SIZE]){
	int m;
	if(SIZE%2==0){
		m=SIZE/2;
		mid=m+1;
	}
	
	else{
		m=(SIZE+1)/2;
		mid=m;
	}
	
	if(dropcount<=MAXDROP){
		grid[m][m]=grid[m][m]+1;
		dropcount=dropcount+1;
		testavalanche(grid,m,m);
	}
	else
		return;
}

void testavalanche(int grid[SIZE][SIZE],int x,int y){
	//recursively search for critical heights
	if((x<0 || x>SIZE) || (y<0 || y>SIZE)){  /***let sand flow out of boundaries***/
		drop(grid);
	}
	else{
		if(grid[x][y]<=3){
			drop(grid);
		}
		else{
			grid[x][y]=grid[x][y]-4;

			grid[x+1][y]++;
			testavalanche(grid,x+1,y);

			grid[x-1][y]++;
			testavalanche(grid,x-1,y);

			grid[x][y+1]++;
			testavalanche(grid,x,y+1);

			grid[x][y-1]++;
			testavalanche(grid,x,y-1);
		}
	}
}


void display(int grid[SIZE][SIZE],FILE *f){
	int i,j;

	for(i=0;i<SIZE;i++){
		for(j=0;j<SIZE;j++){
			fprintf(f,"%d  %d  %d\n",i,j,grid[i][j]);
		}
	}
	fclose(f);
	
	FILE *g;
	g=fopen("plot.gp","w");
	fprintf(g,"#!/usr/bin/gnuplot\n");
	fprintf(g,"set hidden3d\n");
	fprintf(g,"set dgrid3d %d,%d,10\n",mid,mid);
	fprintf(g,"set con base\nunset surf\nsplot 'data.dat' w l\npause -1 'Hit any key to continue'\n");
	fclose(g);
	
	int rc1;
	rc1 = syscall(SYS_chmod, "plot.gp", 0700);
	if (rc1 == -1)
		fprintf(stderr, "chmod failed, errno = %d\n", errno);
          
     

	int rc2;
	//rc2 = system("/home/sambit/imp/IISER/SEM4/CompPhys/compphys/plot.gp");
	rc2 = system("plot.gp");
	if (rc2 == -1)
		fprintf(stderr, "System call failed, errno = %d\n", errno);
	
	/*****
	int rc3;
	rc3 = system("rm plot.gp | rm a.out");
	if (rc3 == -1)
		fprintf(stderr, "System call failed, errno = %d\n", errno);
	******/
	
	return;
}
