Advertisement
Guest User

Decadimento particellare relativistico (corretto)

a guest
Nov 19th, 2017
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.86 KB | None | 0 0
  1. // Coded by Hashbang
  2. /*
  3. 1
  4. VALORI DI RIFERIMENTO:
  5. Muoni:
  6.     tempo decadimento:      2.2 (10^-6 s)
  7.     spessore atmosfera:     70000 (metri)
  8.     velocità:               0.999c
  9. */
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <pthread.h>
  13. #include <math.h>
  14. #include <time.h>
  15.  
  16. #define C 299792458
  17.  
  18. long double input(long double min, long double max);
  19. long double motoUnifAcc(long double a, long double v, long double t);
  20. long double motoUniforme(long double v, long double t);
  21. long double randExp(long double tau);
  22. long double dilatazioneTempo(long double tau, long double beta);
  23. // thread
  24. void *parallela(void *parametri);
  25. void *status_thread;
  26.  
  27. long long int contaParticelle0 = 0;
  28. long long int contaParticelle1 = 0;
  29.  
  30. // argomenti passati al thread
  31. struct struttura{
  32.     long long int N;
  33.     long double tau;
  34.     long double beta;
  35.     long double D;
  36. };
  37.  
  38. int main(){
  39.     long long int N, i, contaParticelle = 0;
  40.     long double tau0, beta, D, tau, t_vita, Dx;
  41.     long double frazione;
  42.     // ho un dualcore --> inizializzo solo un thread
  43.     pthread_t thread_1;
  44.    
  45.     printf("\nQuesto programma simula il decadimento di N particelle che si muovono a velocita' relativistiche.\n\n");
  46.    
  47.     printf("Inserisci il numero di particelle: ");
  48.     // N sempre pari --> meno cazzi per dividere il calcolo
  49.     N = input(1,1E15);
  50.     if(N%2 != 0){
  51.         --N;
  52.     }
  53.  
  54.     printf("Inserisci la vita media delle particelle (in microsecondi): ");
  55.     tau0 = input(1,1E12) * 1E-6;
  56.  
  57.     printf("Inserisci la velocita' delle particelle (frazione di c): ");
  58.     beta = input(0,1);
  59.  
  60.     printf("Inserisci la distanza che le particelle devono percorrere (in metri): ");
  61.     D = input(0,1E12);
  62.    
  63.     printf("\nCalcolo...\n");
  64.    
  65.     tau = dilatazioneTempo(tau0,beta);
  66.    
  67.     // passo gli argomenti alla struttura degli argomenti del thread
  68.     struct struttura argomenti_thread;
  69.     argomenti_thread.N = N;
  70.     argomenti_thread.tau = tau;
  71.     argomenti_thread.beta = beta;
  72.     argomenti_thread.D = D;
  73.    
  74.     // esecuzione parallela al main e controllo
  75.     int errore = pthread_create(&thread_1,NULL,parallela,&argomenti_thread);
  76.     if(errore){
  77.         printf("\nNon posso creare il thread per l'errore %d\n\n",errore);
  78.         exit(1);
  79.     }
  80.    
  81.     srand48(time(0));
  82.    
  83.     // esecuzione del main
  84.     for(i=0; i<N/2; i++){
  85.         t_vita = randExp(tau);
  86.         Dx = motoUniforme(beta*C,t_vita);
  87.         if(Dx > D){
  88.             contaParticelle0++;
  89.         }
  90.     }
  91.    
  92.     pthread_join(thread_1,status_thread);
  93.    
  94.     contaParticelle = contaParticelle0 + contaParticelle1;
  95.     frazione = (long double)contaParticelle / (long double)N;
  96.    
  97.     printf("\nIl %.5llf%% delle particelle hanno superato %.2llf metri.\n\n",frazione*100,D);
  98.    
  99.     return 0;
  100. }
  101.  
  102. void *parallela(void *parametri){
  103.     long long int i;
  104.     long double t_vita, Dx;
  105.    
  106.     srand48(time(0));
  107.    
  108.     struct struttura* dati = (struct struttura *) parametri;
  109.    
  110.     for(i=0; i<(dati->N)/2; i++){
  111.         t_vita = randExp(dati->tau);
  112.         Dx = motoUniforme(dati->beta*C,t_vita);
  113.         if(Dx > dati->D){
  114.             contaParticelle1++;
  115.         }
  116.     }
  117.    
  118.     pthread_exit((void *)&status_thread);
  119. }
  120.  
  121. long double input(long double min, long double max){
  122.     // prende un numero da tastiera che sia compreso in [min, max[
  123.     long double x;
  124.    
  125.     do {
  126.         scanf("%llf",&x);
  127.         if(!(min <= x && x < max)){
  128.             printf("Il numero deve essere compreso tra %.3llf e %.3llf.\nRiprova: ",min,max);
  129.         }
  130.     }while(!(min <= x && x < max));
  131.    
  132.     return x;
  133. }
  134.  
  135. long double motoUnifAcc(long double a, long double v, long double t){
  136.     return v*t+0.5*a*t*t;
  137. }
  138.  
  139. long double motoUniforme(long double v, long double t){
  140.     return motoUnifAcc(0,v,t);
  141. }
  142.  
  143. long double randExp(long double tau){
  144.     // genera un numero casuale secondo la distribuzione e^-(t/tau)
  145.     long double G = ((long double)lrand48()+1)/((long double)RAND_MAX+1);
  146.     return -tau*log(G);
  147. }
  148.  
  149. long double dilatazioneTempo(long double tau, long double beta){
  150.     return tau/sqrt(1-beta*beta);
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement