Advertisement
Markort

AcadEx: Gas Atoms Random Pos v2 - ITA

Jan 20th, 2013 (edited)
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.74 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #define ATOM 100000
  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], Vsfera, VR1, VR2;
  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 %d 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,ATOM);
  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.   Vsfera = 4./3 * RMAX*RMAX*RMAX * M_PI;
  44.   VR1 = 4./3 * R1*R1*R1 * M_PI;
  45.   VR2 = 4./3 * R2*R2*R2 * M_PI;
  46.   printf("Frazione di atomi compresi nella corona sferica: %d/%d.\nArea della corona (stimata attraverso la frazione): %lf.\nArea della corona di preciso: %lf.\n",j,ATOM,((double)j/ATOM)*Vsfera,VR2-VR1);
  47.  
  48.   exit(0);
  49. }/*fine main*/
  50.  
  51. void fillPrintDist (double pos[ATOM][3], double* distance) {
  52.   FILE *fp;
  53.   int i, j;
  54.   double d;
  55.   if ( (fp=fopen("distanze.dat","w"))==NULL ) {
  56.     printf("Impossibile aprire il file ''distanze.dat''. Il programma verrà terminato.\n");
  57.     exit(EXIT_FAILURE);
  58.   }
  59.   for (i=0;i<ATOM;i++) {
  60.     d=0;
  61.     for (j=0;j<3;j++) {
  62.       d+= pow(*(*(pos+i)+j),2);
  63.     }
  64.     *(distance+i) = sqrt(d);
  65.     fprintf(fp,"ATOMO#%d: %lf\n",i,*(distance+i));
  66.   }
  67. }/*fine fillPrintDist*/
  68.  
  69. double getDouble (char* mess, int min, int max) {
  70.   double out;
  71.   do {
  72.     printf("%s tra %d e %d: ",mess, min, max);
  73.     scanf("%lf",&out);
  74.   } while (out<min || out>max);
  75.   return out;
  76. }/*fine getdouble*/
  77.  
  78. void genCoor (double pos[ATOM][3]) {
  79.   int i, j;
  80.   double d;
  81.   for (i=0;i<ATOM;i++) {
  82.     do {
  83.       d=0;
  84.       for (j=0;j<3;j++) {
  85.     *(*(pos+i)+j) = (double)lrand48()/RAND_MAX;
  86.     d += pow(*(*(pos+i)+j),2);
  87.       }
  88.     } while (sqrt(d)>RMAX);
  89.   }
  90. }/*fine gencoor*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement