Markort

AcadEx: Gas Atoms Random Pos - ITA

Jan 20th, 2013 (edited)
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.48 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #define ATOM 500
  6. #define RMAX 1
  7.  
  8. double getDouble (char*,int,int);
  9. void genCoor (double pos[ATOM][3]);
  10. void fillPrintDist (double pos[ATOM][3],double*);
  11.  
  12. int main () {
  13.   /*dichiarazione variabili*/
  14.   double pos[ATOM][3], R1, R2, distance[ATOM];
  15.   int min, max, i, j;
  16.   /*inizializzazione seme*/
  17.   srand48(time(0));
  18.   /*intro*/
  19.   printf("Data una sfera di raggio R=%d e 500 atomi di un gas perfetto, questo programma calcola quale frazione di atomi si trova nella corona sferica inclusa tra due sfere di raggio R1 e R2, tali che R1<R2<R.\n",RMAX);
  20.   /*acquisisco raggi*/
  21.   do {
  22.     R1 = getDouble("Inserire R1",0,RMAX);
  23.     R2 = getDouble("Inserire R2",0,RMAX);
  24.     if (R1>R2) printf("Errore: R1 deve essere minore di R2.\n");
  25.   } while (R1>R2);
  26.   /*genero coordinate*/
  27.   genCoor(pos);
  28.   /*riempio distance e scrivo su file*/
  29.   fillPrintDist(pos,distance);
  30.   /*cerco min e max*/
  31.   min = max = 0;
  32.   for (i=0;i<ATOM;i++) {
  33.     if (*(distance+min)<*(distance+i)) min=i;
  34.     if (*(distance+max)>*(distance+i)) max=i;
  35.   }
  36.   printf("Atomo a minima distanza: x=%lf y=%lf z=%lf.\n",*(*(pos+min)),*(*(pos+min)+1),*(*(pos+min)+2));
  37.   printf("Atomo a massima distanza: x=%lf y=%lf z=%lf.\n",*(*(pos+max)),*(*(pos+max)+1),*(*(pos+max)+2));
  38.   /*calcolo frazione*/
  39.   j = 0;
  40.   for (i=0;i<ATOM;i++) {
  41.     if (*(distance+i)<R2 && *(distance+i)>R1) j++;
  42.   }
  43.   printf("Frazione di atomi compresi nella corona sferica: %d/%d.\n",j,500);
  44.  
  45.   exit(0);
  46. }/*fine main*/
  47.  
  48. void fillPrintDist (double pos[ATOM][3], double* distance) {
  49.   FILE *fp;
  50.   int i, j;
  51.   double d;
  52.   if ( (fp=fopen("distanze.dat","w"))==NULL ) {
  53.     printf("Impossibile aprire il file ''distanze.dat''. Il programma verrà terminato.\n");
  54.     exit(EXIT_FAILURE);
  55.   }
  56.   d=0;
  57.   for (i=0;i<ATOM;i++) {
  58.     for (j=0;j<3;j++) {
  59.       d+= pow(*(*(pos+i)+j),2);
  60.     }
  61.     *(distance+i) = sqrt(d);
  62.     fprintf(fp,"ATOMO#%d: %lf\n",i,*(distance+i));
  63.   }
  64. }/*fine fillPrintDist*/
  65.  
  66. double getDouble (char* mess, int min, int max) {
  67.   double out;
  68.   do {
  69.     printf("%s tra %d e %d: ",mess, min, max);
  70.     scanf("%lf",&out);
  71.   } while (out<min || out>max);
  72.   return out;
  73. }/*fine getdouble*/
  74.  
  75. void genCoor (double pos[ATOM][3]) {
  76.   int i, j;
  77.   double d;
  78.   for (i=0;i<ATOM;i++) {
  79.     do {
  80.       d=0;
  81.       for (j=0;j<3;j++) {
  82.     *(*(pos+i)+j) = (double)lrand48()/RAND_MAX;
  83.     d += pow(*(*(pos+i)+j),2);
  84.       }
  85.     } while (sqrt(d)>RMAX);
  86.   }
  87. }/*fine gencoor*/
Add Comment
Please, Sign In to add comment