Hinamarth

Particles and atoms crashes

Dec 10th, 2011
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.01 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4.  
  5. int crash(double, double, double, int, double[], int[]);
  6.  
  7. int crash(double k, double x, double P, int i, double cento[], int cento_particles[]){
  8.   int tof;
  9.   double l=(x/k), y;
  10.   y=l;
  11.   for(l=(x/k); l<x; l=l+y){
  12.     if(((double)lrand48()/RAND_MAX)<P){
  13.       if(l<100){
  14.     cento[i]=1;
  15.       }
  16.       cento_particles[i]=1;
  17.       return tof=1;
  18.     }
  19.   }
  20.   return tof=0;
  21. }
  22.  
  23. main(){
  24.   int N, i, tof, cont=0, cont_cento=0, cento_particles[10000], cont_cp=0;
  25.   double x, k, P, cento[10000];
  26.   FILE *fp;
  27.   srand48(time(0));
  28.   printf("Dato un mezzo i cui atomi sono distanti l'uno dall'altro in media l=x/k, e dove x è la larghezza del mezzo, e dato un fascio di particelle che attraversa il suddetto mezzo, sappiamo che ogni singola particella ha una certa probabilità di passare attraverso l'oggetto.\n");
  29.   printf("Questo discorso può essere esteso a tutto il fascio e si avranno particelle che continuano il loro percorso e particelle che urtano elasticamente gli atomi e che quindi tornano indietro.\n");
  30.   printf("Il programma calcolerà la frazione di particelle che riesce a continuare il proprio percorso, e per farlo è necessario che tu inserisca i seguenti valori:\n");
  31.   printf("Inserisci il numero N di particelle del fascio strettamente compreso tra 0 e 10000:\n N = ");
  32.   scanf("%d", &N);
  33.   while(N<=0 || N>=10000){
  34.     printf("Il valore di N è sbagliato! Reimmettilo!\n N = ");
  35.     scanf("%d", &N);
  36.   }
  37.   printf("Inserisci lo spessore x del mezzo strettamente compreso tra 0 e 3:\n x = ");
  38.   scanf("%lf", &x);
  39.   while(x<=0 || x>=3){
  40.     printf("Il valore di x è sbagliato! Reimmettilo!\n x = ");
  41.     scanf("%lf", &x);
  42.   }
  43.   printf("Inserisci il fattore k compreso positivo e minore uguale a 10000:\n k = ");
  44.   scanf("%lf", &k);
  45.   while(k<=0 || k>10000){
  46.     printf("Il valore di k è sbagliato! Reimmettilo!\n k = ");
  47.     scanf("%lf",&k);
  48.   }
  49.   printf("Inserisci la probabilità d'urto P strettamente compresa tra 0 e 0.15:\n P = ");
  50.   scanf("%lf", &P);
  51.   while(P<=0 || P>=0.15){
  52.     printf("Il valore di P è sbagliato! Reimmettilo!\n P = ");
  53.     scanf("%lf", &P);
  54.   }
  55.   for(i=0; i<N; i++){
  56.     cento[i]=0;
  57.     cento_particles[i]=0;
  58.   }
  59.  
  60.   for(i=0; i<N; i++){
  61.     tof=crash(k, x, P, i, cento, cento_particles);
  62.     if(tof==0){
  63.       cont++;
  64.     }
  65.     if(cento[i]==0){
  66.       cont_cento++;
  67.     }
  68.   }
  69.   if((fp=fopen("particles.dat", "w"))==NULL){
  70.     printf("Errore nell'apretura del file particles.dat\n");
  71.     exit(EXIT_FAILURE);
  72.   }
  73.   fp=fopen("particles.dat", "w");
  74.   fprintf(fp, "Le prime 100 particelle che hanno rimbalzato sono:\n");
  75.   for(i=0; i<N; i++){
  76.     if(cont_cp<=100){
  77.       if(cento_particles[i]==1){
  78.     fprintf(fp, "%d \n", i);
  79.       }
  80.     }
  81.     cont_cp++;
  82.   }
  83.   printf("Sono riuscite a passare %d particelle, cioè %g di N.\n", cont, ((double)cont/N));
  84.   printf("\n");
  85.   printf("Sono riuscite a superare i primi 100 passi %d particelle, cioè %g di N.\n", cont_cento, ((double)cont_cento/N));
  86.   printf("\n");
  87. }
  88.  
  89.  
Advertisement
Add Comment
Please, Sign In to add comment