Exemple #1
0
test_list.c
#include "list.h"
#include <stdio.h>
#include <stdlib.h>
int main (){
char ans[2];
int num;
struct node *head = NULL;
do {
do {
printf("Enter a number: ");
scanf("%d", &num);
head = push(head, num);//Can change to append
printf("Do you want another num (y or n): ");
scanf("%1s",ans);
} while(ans[0] == 'y');
printf("Sort ascending or descending (a or d)? ");
scanf("%1s",ans);
if(ans[0] == 'a') head=sort_ascending(head);
else if(ans[0] == 'd') head=sort_descending(head);
print(head, length(head));
printf("Do you want to do this again (y or n)? ");
scanf("%1s",ans);
if(ans[0] == 'y') head = clear(head);
} while(ans[0] == 'y');
return 0;
}
Exemple #2
0
void test(){
	LL tab1 = NULL;
	int tab[N]={12,2,0,3,55,88,42,26,17,8};
	int i;
	for (i=9;i>=0;i--){
		add_queue(&tab1,tab[i]);
	}
	display_size(tab1);
	printf("\n");
	print_inc(tab1);
	printf("\n");

	printf("Valeur max de la liste: %d\n", maximum(tab1));
	printf("\n");
	printf("Valeur min de la liste: %d\n", minimum(tab1));
	printf("\n");

	printf("Tri de la liste: \n");
	sort_ascending(tab1);
	printf("\n");

	if(delete_list(tab1)==NULL){
        printf("Linked list has been deleted.\n");
    }
}
Exemple #3
0
int main (){
 char ans[2];
 int num;
 struct node *head = NULL;
 struct node * tail = NULL;
 do {
 do {
	 
 printf("Enter a number: ");

 scanf("%d", &num);
//  printf("hi");
 head = push(head, num);//Can change to append
 //printf("%d", length(head));
 printf("Do you want another num (y or n): ");
 scanf("%1s",ans);
 } while(ans[0] == 'y');
//head = insert_middle(head, 1, 4);
//printf("4 was inserted into index 1 \n");
//head = remove_node(head, 3);
//printf("all 3's were removed from the list \n");
 printf("Sort ascending or descending (a or d)? ");
 scanf("%1s",ans);
 if(ans[0] == 'a') head=sort_ascending(head);
 else if(ans[0] == 'd') head=sort_descending(head);
//head = insert_middle(head, 3, 1);
 print(head, length(head));
 printf("Do you want to do this again (y or n)? ");
 scanf("%1s",ans);
 if(ans[0] == 'y') head = clear(head);
 //print(head, length(head));

// printf("%d", length(head));

 } while(ans[0] == 'y');
 return 0;
}
void NEKTAR_MEX::MEX_init (int *map, int n, int *AdjacentPartitions, int NAdjacentPartitions, MPI_Comm comm_in){

/*  
n   - [INPUT] integer - length of array "map", number of degrees of freedom processed in this partition
map - [INPUT] - array of integers - global IDs of degrees of fredom processed in this partition
AdjacentPartitions - [INPUT] - array of integers -  list of possible adjacent partitions
NAdjacentPartitions - [INPUT] integer - number of possible adjacent partitions
comm - [INPUT] - communicator
*/

/* at the beginning we assume that NAdjacentPartitions can be greater or equall to the 
    actuall number of partition to communicate with */



  int *partner_map_size;
  int **partners_map;
  int *shared_dof;
  int i,j,k,ii,jj,partner;

  comm = comm_in;
  MPI_Comm_rank(comm,&my_rank);

#ifdef MEX_REPORT
  static int FLAG_INIT = 0;
#endif

  
  MPI_Request *request_recv_tmp, *request_send_tmp;
  //fprintf(stderr,"my_rank = %d, NAdjacentPartitions = %d\n",my_rank,NAdjacentPartitions);

  request_recv_tmp = new MPI_Request[NAdjacentPartitions];
  request_send_tmp = new MPI_Request[NAdjacentPartitions];

  partner_map_size  = new int[NAdjacentPartitions];
  shared_dof = new int[NAdjacentPartitions];

  
  for (i = 0; i < NAdjacentPartitions; ++i)
	  MPI_Irecv(&partner_map_size[i],1,MPI_INT,AdjacentPartitions[i],AdjacentPartitions[i],comm,&request_recv_tmp[i]);

  for (i = 0; i < NAdjacentPartitions; ++i)
	  MPI_Isend(&n,1,MPI_INT,AdjacentPartitions[i],my_rank,comm,&request_send_tmp[i]);


  MPI_Waitall(NAdjacentPartitions,request_recv_tmp,MPI_STATUS_IGNORE);
  MPI_Waitall(NAdjacentPartitions,request_send_tmp,MPI_STATUS_IGNORE);

 //allocate memory for incomming messages


  partners_map  = new int*[NAdjacentPartitions];
  for (i = 0; i < NAdjacentPartitions; i++)
      partners_map[i] = new int[partner_map_size[i]];


  //get partners map
  for (i = 0; i < NAdjacentPartitions; ++i)
	  MPI_Irecv(partners_map[i],partner_map_size[i],MPI_INT,AdjacentPartitions[i],AdjacentPartitions[i],comm,&request_recv_tmp[i]);

  //send local map to partners
  for (i = 0; i < NAdjacentPartitions; ++i)
	  MPI_Isend(map,n,MPI_INT,AdjacentPartitions[i],my_rank,comm,&request_send_tmp[i]);
  
  MPI_Waitall(NAdjacentPartitions,request_recv_tmp,MPI_STATUS_IGNORE);
  MPI_Waitall(NAdjacentPartitions,request_send_tmp,MPI_STATUS_IGNORE);


  // compare local map and partners map
  
  for (partner = 0; partner < NAdjacentPartitions; ++partner){
      shared_dof[partner] = 0;
      for (i = 0; i < n; ++i){
	  for (j = 0; j < partner_map_size[partner]; ++j){
	      if (map[i] == partners_map[partner][j]){
		  shared_dof[partner]++;
		  break;
	      }
	  }
      }
  }

  
  /* calculate the number of partitions to communicate with */
  for (partner = 0, Npartners = 0; partner < NAdjacentPartitions; ++partner){
    if (shared_dof[partner] > 0) 
      Npartners++;
  }

  delete[] request_recv_tmp;
  delete[] request_send_tmp;

  request_recv = (MPI_Request *) malloc(Npartners*sizeof(MPI_Request));
  request_send = (MPI_Request *) malloc(Npartners*sizeof(MPI_Request));

  for (i = 0; i < Npartners; ++i){
    request_recv[i] = MPI_REQUEST_NULL;
    request_send[i] = MPI_REQUEST_NULL;
  }

#if (defined (__bg__) || defined (__blrts__) )
  posix_memalign((void**)&partner_list,16, Npartners*sizeof(int));   
  posix_memalign((void**)&message_size,16, Npartners*sizeof(int));   
#else
  partner_list = (int *) malloc(Npartners*sizeof(int));
  message_size = (int *) malloc(Npartners*sizeof(int));
#endif

  for (partner = 0, i = 0; partner < NAdjacentPartitions; ++partner){
     if (shared_dof[partner] > 0){
         partner_list[i] = AdjacentPartitions[partner];
         message_size[i] = shared_dof[partner];
         i++;
     }
   }

   /* 
     the "partner_list" now can be sorted with respect to topology and message size
  */
  
  int *pivot, *message_size_tmp, *partner_map_tmp;

#if (defined (__bg__) || defined (__blrts__) )
  posix_memalign((void**)&my_coord,16, 4*sizeof(int));
  posix_memalign((void**)&partners_coordinates,16, Npartners*4*sizeof(int));
  get_rank_coordinates(my_coord); 
  get_partners_coordinates(Npartners,partner_list,my_coord,partners_coordinates,comm);
  posix_memalign((void**)&pivot,16, Npartners*sizeof(int));
  posix_memalign((void**)&message_size_tmp,16, Npartners*sizeof(int));
  posix_memalign((void**)&partner_map_tmp,16, Npartners*sizeof(int));
#else
  pivot            = (int *) malloc( Npartners*sizeof(int));
  message_size_tmp = (int *) malloc( Npartners*sizeof(int)); 
  partner_map_tmp  = (int *) malloc( Npartners*sizeof(int));
#endif  


   /* initialize pivot to default values */
   for (i = 0; i < Npartners;  ++i)
       pivot[i] = i;

#if (defined (__bg__) || defined (__blrts__) )
   reorder_partner_list_2(Npartners,partners_coordinates,my_coord,partner_list,message_size,pivot);
   free(partners_coordinates); 
#else
    sort_ascending(Npartners,partner_list,message_size,pivot);
#endif


   
   MPI_Barrier(comm);
   //if (my_rank == 0)
   //    fprintf(stderr,"MEX: sort_ascending - done\n");
      

   for (i = 0; i < Npartners;  ++i)
     message_size_tmp[pivot[i]] = message_size[i];

   memcpy(message_size,message_size_tmp,Npartners*sizeof(int));
  

   /* 
   map partner_list to AdjacentPartitions 
   partner_map_tmp  will store the index of partner_list[i] in AdjacentPartitions 
   */

   for (i = 0; i < Npartners;  ++i){
     for (j = 0; j < NAdjacentPartitions;  ++j){
        if (AdjacentPartitions[j] == partner_list[i]){
            partner_map_tmp[i] = j;
            break;
        }
     }
   }
 
   free(pivot);
   free(message_size_tmp);

   MPI_Barrier(comm);
   //if (my_rank == 0)
   //    fprintf(stderr,"MEX: partners reordering - done\n");

#if (defined (__bg__) || defined (__blrts__) )
   posix_memalign((void**)&message_send_map,16, Npartners*sizeof(int*));   
   for (i = 0; i < Npartners; ++i){
     posix_memalign((void**)&message_send_map[i],16, message_size[i]*sizeof(int));   
     memset(message_send_map[i],'\0',message_size[i]*sizeof(int));
   }

   posix_memalign((void**)&message_recv_map,16, Npartners*sizeof(int*));   
   for (i = 0; i < Npartners; ++i){
     posix_memalign((void**)&message_recv_map[i],16, message_size[i]*sizeof(int));   
     memset(message_recv_map[i],'\0',message_size[i]*sizeof(int));
   }

   posix_memalign((void**)&send_buffer,16, Npartners*sizeof(double*));
   for (i = 0; i < Npartners; ++i){
     posix_memalign((void**)&send_buffer[i],16, message_size[i]*sizeof(double));
     memset(send_buffer[i],'\0',message_size[i]*sizeof(double));
   }

   posix_memalign((void**)&recv_buffer,16, Npartners*sizeof(double*));
   for (i = 0; i < Npartners; ++i){
     posix_memalign((void**)&recv_buffer[i],16, message_size[i]*sizeof(double));
     memset(recv_buffer[i],'\0',message_size[i]*sizeof(double));
   }
#else
   
   message_send_map = (int **) malloc(Npartners*sizeof(int*));
   for (i = 0; i < Npartners; ++i){
     message_send_map[i] = (int *) malloc(message_size[i]*sizeof(int));
     memset(message_send_map[i],'\0',message_size[i]*sizeof(int));
   }

   message_recv_map = (int **) malloc(Npartners*sizeof(int*));
   for (i = 0; i < Npartners; ++i){
     message_recv_map[i]  = (int *) malloc(message_size[i]*sizeof(int)); 
     memset(message_recv_map[i],'\0',message_size[i]*sizeof(int));
   }

   send_buffer = (double **) malloc(Npartners*sizeof(double*));
   for (i = 0; i < Npartners; ++i){
     send_buffer[i] = (double *) malloc(message_size[i]*sizeof(double));
     memset(send_buffer[i],'\0',message_size[i]*sizeof(double));
   }
   recv_buffer = (double **) malloc(Npartners*sizeof(double*));
   for (i = 0; i < Npartners; ++i){
     recv_buffer[i] =  (double *) malloc(message_size[i]*sizeof(double));
     memset(recv_buffer[i],'\0',message_size[i]*sizeof(double));
   }
#endif

   /* to support unsorted list of degrees of freedom 
      two maps are created 
      it is possible to check if the two maps are identical 
      so only one will be kept and pointers 
      message_send_map[k]    and    message_recv_map[k]
      will be the same - this will help to save some memory
   */

   MPI_Barrier(comm);
   //if (my_rank == 0)
   //    fprintf(stderr,"MEX: file = %s, line = %d\n",__FILE__,__LINE__);

  double map_time_start = MPI_Wtime();

#ifdef TEST_OMP
#pragma omp parallel private(partner, i, ii, j, jj)
{  
   #pragma omp for schedule(dynamic)
   for (k = 0; k < Npartners; ++k){

     partner = partner_map_tmp[k];

     for (i = 0, ii=0; i < n; ++i){
           for (j = 0; j < partner_map_size[partner]; ++j){
             if (map[i] == partners_map[partner][j]){
                 message_send_map[k][ii] = i;
                 ii++;
                 break;
             }
           }
         }
        for (j = 0, jj = 0; j < partner_map_size[partner]; ++j){
          for (i = 0; i < n; ++i){
             if (map[i] == partners_map[partner][j]){
                message_recv_map[k][jj] = i;
                jj++;
                break;
             }
          }
        }
   }
}
#else
   for (k = 0; k < Npartners; ++k){ 
     partner = partner_map_tmp[k];
        for (i = 0, ii=0; i < n; ++i){
           for (j = 0; j < partner_map_size[partner]; ++j){
             if (map[i] == partners_map[partner][j]){
                 message_send_map[k][ii] = i;
                 ii++;
                 break;
             }
           }
        }
        for (j = 0, jj = 0; j < partner_map_size[partner]; ++j){
          for (i = 0; i < n; ++i){
             if (map[i] == partners_map[partner][j]){
                message_recv_map[k][jj] = i;
                jj++;
                break;
             }
          }
        }
   }
#endif 

   MPI_Barrier(comm);
   //if (my_rank == 0)
   //    fprintf(stderr,"MEX: file = %s, line = %d map_time = %f\n",__FILE__,__LINE__,MPI_Wtime() - map_time_start);
 
   free(partner_map_tmp);

/*

   for (partner = 0, k = 0; partner < NAdjacentPartitions; ++partner){
      
     if (shared_dof[partner] == 0) continue;

     for (i = 0, ii=0; i < n; ++i){
	   for (j = 0; j < partner_map_size[partner]; ++j){
 	     if (map[i] == partners_map[partner][j]){
		 message_send_map[k][ii] = i;
		 ii++;
		 break;
	     }
	   }
	 }

        for (j = 0, jj = 0; j < partner_map_size[partner]; ++j){
          for (i = 0; i < n; ++i){
             if (map[i] == partners_map[partner][j]){
                message_recv_map[k][jj] = i;
		jj++;
                break;
	     }
	  }
	}
        k++;
   }
*/

#ifdef MEX_REPORT
 //print report to file
  FILE *pFile;
  char fname[128];
  sprintf(fname,"report_gs_init.%d.%d",FLAG_INIT,my_rank);
  pFile = fopen(fname,"w");
  for (i = 0; i < NAdjacentPartitions; ++i){
	  if (shared_dof[i] > 0)
		  fprintf(pFile,"%d  %d\n",AdjacentPartitions[i],shared_dof[i]);
  }
  fprintf(pFile,"-1 -1 \n");
  
  fprintf(pFile,"**\n");
  for (partner = 0; partner < Npartners; ++partner){
	  fprintf(pFile,"will send to partner %d array of size %d\n",partner_list[partner],message_size[partner]);
	  for (i = 0; i < message_size[partner]; ++i)
           fprintf(pFile,"%d  ", message_send_map[partner][i]);
      fprintf(pFile,"\n");
  }
  fprintf(pFile,"**\n");
  for (partner = 0; partner < Npartners; ++partner){
	  fprintf(pFile,"will recv from partner %d array of size %d\n",partner_list[partner],message_size[partner]);
	  for (i = 0; i < message_size[partner]; ++i)
           fprintf(pFile,"%d  ", message_recv_map[partner][i]);
      fprintf(pFile,"\n");
  }
  fprintf(pFile,"**\n");
  fprintf(pFile,"My d.o.f are:\n");
  for (i = 0; i < n; ++i)
    fprintf(pFile,"%d  ",map[i]);
  fprintf(pFile,"\n");


  fclose(pFile);
  FLAG_INIT++;
#endif

  delete[] shared_dof;
  delete[] partner_map_size;
  for (i = 0; i < NAdjacentPartitions; i++)
	  delete partners_map[i];
  delete[] partners_map;
}