Advertisement
avskyRB

RndWalk-Main.cxx

Sep 2nd, 2014
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.80 KB | None | 0 0
  1. #include "Vettore.h"
  2. #include <iostream>
  3. #include <vector>
  4. #include <stdlib.h>
  5.  
  6. int main(int argc, char* argv[])
  7. {
  8.   if(argc != 4)
  9.   {
  10.     std::cerr << "Random walk di n particelle in 2D " << std::endl;
  11.     std::cerr << "Le particelle diffondono dall'origine in maniera casuale " << std::endl;
  12.     std::cerr << "con un passo dettato dal loro libero cammino medio."       << std::endl;
  13.     std::cerr << "La simulazione di interrompe quando una particella "       << std::endl;
  14.     std::cerr << "raggiunge la distanza massima di deriva "                  << std::endl;
  15.     std::cerr << "Utilizzo: " << argv[0] << " nP L dM "  << std::endl;
  16.     std::cerr << "  nP   Numero particelle "          << std::endl;
  17.     std::cerr << "   L   Libero cammino medio in cm"  << std::endl;
  18.     std::cerr << "  dM   Distanza massima in cm    "  << std::endl;
  19.     return 1;
  20.   }
  21.  
  22.   // Lettura da linea di comando
  23.   int nPart    = atoi(argv[1]);
  24.   int lambda   = atoi(argv[2]);
  25.   int goal     = atoi(argv[3]);
  26.  
  27.   // Creazione di un vector di Vettore
  28.   std::vector<Vettore> particelle;  
  29.  
  30.   // Inizializzazione di nPart elementi con il costruttore di Vettore senza parametri
  31.   particelle.assign(nPart, Vettore());
  32.   double mediax, mediay, mediaz;
  33.   mediax = mediay = mediaz = 0;
  34.  
  35.   // Loop fino a quando un particella non supera la distanza massaime
  36.   bool theEnd = false;
  37.   for(int i=0; theEnd==false; i++)
  38.   {
  39.     // Loop sulle particelle
  40.     for(int j=0; j < particelle.size(); j++)
  41.     {
  42.       // Vettore spostamento random per particella i-esima
  43.       float dx = (0.5 - drand48()) * lambda * 2;
  44.       float dy = (0.5 - drand48()) * lambda * 2;
  45.       float dz = (0.5 - drand48()) * lambda * 2;
  46.       Vettore delta(dx,dy,dz);
  47.  
  48.       // Aggiornamento posizione particella i-esima
  49.       particelle[j] = particelle[j] + delta;
  50.  
  51.       // test di uscita dal loop
  52.       if(particelle[j].modulo() > goal)
  53.         theEnd = true;
  54.     }
  55.    
  56.     // Stampa ogni 100 iterazioni
  57.     if(i%100==0)
  58.     {
  59.       // Calcolo baricentro
  60.       for(int j=0; j<particelle.size(); j++)
  61.       {
  62.         mediax = mediax + particelle[j].x();
  63.         mediay = mediay + particelle[j].y();
  64.         mediaz = mediaz + particelle[j].z();
  65.       }
  66.      
  67.       mediax = mediax/particelle.size();
  68.       mediay = mediay/particelle.size();
  69.       mediaz = mediaz/particelle.size();
  70.      
  71.       Vettore baricentro(mediax, mediay, mediaz);    
  72.  
  73.       std::cout << " Loop number " << i;
  74.       std::cout << " Baricentro " << baricentro.modulo() << std::endl;
  75.     }
  76.     // Alla fine, stampa posizione di tutte le particelle
  77.     if(theEnd)
  78.     {
  79.       std::cout << " Loop number " << i << std::endl;
  80.       for(int j=0; j < particelle.size(); j++)
  81.         std::cout << particelle[j] << std::endl;
  82.       break;
  83.     }  
  84.   }  
  85.  
  86.   return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement