Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Vettore.h"
- #include <iostream>
- #include <vector>
- #include <stdlib.h>
- int main(int argc, char* argv[])
- {
- if(argc != 4)
- {
- std::cerr << "Random walk di n particelle in 2D " << std::endl;
- std::cerr << "Le particelle diffondono dall'origine in maniera casuale " << std::endl;
- std::cerr << "con un passo dettato dal loro libero cammino medio." << std::endl;
- std::cerr << "La simulazione di interrompe quando una particella " << std::endl;
- std::cerr << "raggiunge la distanza massima di deriva " << std::endl;
- std::cerr << "Utilizzo: " << argv[0] << " nP L dM " << std::endl;
- std::cerr << " nP Numero particelle " << std::endl;
- std::cerr << " L Libero cammino medio in cm" << std::endl;
- std::cerr << " dM Distanza massima in cm " << std::endl;
- return 1;
- }
- // Lettura da linea di comando
- int nPart = atoi(argv[1]);
- int lambda = atoi(argv[2]);
- int goal = atoi(argv[3]);
- // Creazione di un vector di Vettore
- std::vector<Vettore> particelle;
- // Inizializzazione di nPart elementi con il costruttore di Vettore senza parametri
- particelle.assign(nPart, Vettore());
- double mediax, mediay, mediaz;
- mediax = mediay = mediaz = 0;
- // Loop fino a quando un particella non supera la distanza massaime
- bool theEnd = false;
- for(int i=0; theEnd==false; i++)
- {
- // Loop sulle particelle
- for(int j=0; j < particelle.size(); j++)
- {
- // Vettore spostamento random per particella i-esima
- float dx = (0.5 - drand48()) * lambda * 2;
- float dy = (0.5 - drand48()) * lambda * 2;
- float dz = (0.5 - drand48()) * lambda * 2;
- Vettore delta(dx,dy,dz);
- // Aggiornamento posizione particella i-esima
- particelle[j] = particelle[j] + delta;
- // test di uscita dal loop
- if(particelle[j].modulo() > goal)
- theEnd = true;
- }
- // Stampa ogni 100 iterazioni
- if(i%100==0)
- {
- // Calcolo baricentro
- for(int j=0; j<particelle.size(); j++)
- {
- mediax = mediax + particelle[j].x();
- mediay = mediay + particelle[j].y();
- mediaz = mediaz + particelle[j].z();
- }
- mediax = mediax/particelle.size();
- mediay = mediay/particelle.size();
- mediaz = mediaz/particelle.size();
- Vettore baricentro(mediax, mediay, mediaz);
- std::cout << " Loop number " << i;
- std::cout << " Baricentro " << baricentro.modulo() << std::endl;
- }
- // Alla fine, stampa posizione di tutte le particelle
- if(theEnd)
- {
- std::cout << " Loop number " << i << std::endl;
- for(int j=0; j < particelle.size(); j++)
- std::cout << particelle[j] << std::endl;
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement