/***********************************************************************************************

  IF_NET.. (project with Eleni on STDP + freq-dependent synapses)

MEMORY MANAGEMENT
***********************************************************************************************/
//int allocate_mem()
//int deallocate_mem()

int allocate_mem() {
INT i, j, k;
int error = 0;

    printf("Allocating memory...\n"); fflush(NULL);
  raster = fopen("raster.x","w");                // Open output file.
  sample = fopen("sample.x","w");                // Open output file.
 
  to         = calloc(N, sizeof(double));         // Dynamic allocation of data structures..
  if (to == NULL) error = 1;
  to_old     = calloc(N, sizeof(double));         // Dynamic allocation of data structures..  
  if (to_old == NULL) error = 1;
  u          = calloc(N, sizeof(double));         // Dynamic allocation of data structures..
  if (u == NULL) error = 1;
  w          = calloc(N, sizeof(double));         // Dynamic allocation of data structures..
  if (w == NULL) error = 1;
  Ge         = calloc(N, sizeof(double));         // Dynamic allocation of data structures..
  if (Ge == NULL) error = 1;
  Iext       = calloc(N, sizeof(double));         // Dynamic allocation of data structures..  
  if (Iext == NULL) error = 1;
  r1         = calloc(N, sizeof(double));         // Dynamic allocation of data structures..  
  if (r1 == NULL) error = 1;
  r2         = calloc(N, sizeof(double));         // Dynamic allocation of data structures..  
  if (r2 == NULL) error = 1;
  o1         = calloc(N, sizeof(double));         // Dynamic allocation of data structures..  
  if (o1 == NULL) error = 1;
  o2         = calloc(N, sizeof(double));         // Dynamic allocation of data structures..  
  if (o2 == NULL) error = 1;
  spiked     = calloc(N, sizeof(INT));
  if (spiked == NULL) error = 1;
  rates         = calloc(N, sizeof(double));
  if (rates == NULL) error = 1;
  mu         = calloc(N, sizeof(double));
  if (mu == NULL) error = 1;
 
  
  Gr          = calloc(N, sizeof(double*));         // Dynamic allocation of data structures..  
  if (Gr == NULL) error = 1;
  Gu         = calloc(N, sizeof(double*));         // Dynamic allocation of data structures..      
  if (Gu == NULL) error = 1;
  for (i=0; i<N; i++) {
   Gr[i]       = calloc(N, sizeof(double));         // Dynamic allocation of data structures..  
   if (Gr[i] == NULL) error = 1;
   Gu[i]      = calloc(N, sizeof(double));         // Dynamic allocation of data structures..       
   if (Gu[i] == NULL) error = 1;
   }
   
   if (error) printf("Unable to allocate memory!\n\n"); 
   else printf("Done!\n\n");
return error;
} // end allocate_mem()




void deallocate_mem() {
INT i, j, k;

   printf("Deallocating the memory...\n");
   for(i=0;i<N;i++) {     // The allocated memory is set free.
    free(CC[i]); 
    free(W[i]); 
    free(Gr[i]); 
    free(Gu[i]); 
   }           
    
	free(Gr);  free(Gu);		// The allocated memory is set free.
	free(CC);  free(W);         // The allocated memory is set free.
	free(Ge); free(Iext);		// The allocated memory is set free.
	free(to); free(to_old);		// The allocated memory is set free.
	free(w); free(u);			// The allocated memory is set free.
	free(r1); free(r2); free(o1); free(o2);
	free(spiked); free(mu); free(rates);

    // The files that were previously opened are now closed.
    fclose(raster); fclose(sample);
	printf("Done!\n\n\n\n");
return;
} // end deallocate_mem()