Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F97956833
Exercice1_Ancarola.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Jan 7, 23:27
Size
3 KB
Mime Type
text/x-c++
Expires
Thu, Jan 9, 23:27 (2 d)
Engine
blob
Format
Raw Data
Handle
23454534
Attached To
rSTICAZZI yearII_reports
Exercice1_Ancarola.cpp
View Options
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>
#include "ConfigFile.tpp" // Fichier .tpp car inclut un template
using namespace std;
class Engine
{
private:
double t, tfin, dt; // Temps courant, temps final et pas de temps
unsigned int nsteps; // Nombre d'iterations
double G; // Constante gravitationnelle
double mT, mL, zT, zL; // Masses et positions de la Terre et de la Lune
double m, R; // Masse et rayon du projectile
double z0, v0; // Position et vitesse initiales du projectile
double z, v; // Position et vitesse du projectile au cours du temps
double rho0, lambda; // Parametres de la densite de l'air
double Cx; // Coefficient de trainee aerodynamique
unsigned int sampling; // Nombre d'iterations entre chaque ecriture des diagnostics
unsigned int last; // Nombre d'iterations depuis la derniere ecriture des diagnostics
ofstream *outputFile; // Pointeur vers le fichier de sortie
// Ecriture des diagnostics
void printOut(bool force)
{
// Ecriture tous les [sampling] pas de temps, sauf si force est vrai
if((!force && last>=sampling) || (force && last!=1))
{
*outputFile << t << " " << z << " " << v << endl;
last = 1;
}
else
{
last++;
}
}
double g(double z, double M)
{
return G * M / (z * z);
}
double density(double z)
{
return rho0 * exp( -(z - z0) / lambda);
}
double friction(double v, double z)
{
return density(z) * M_PI * R * R * Cx * 0.5 * v * v;
}
// Iteration temporelle
void step()
{
cout << "Current data: z = " << z << ", v = " << v << endl;
double a = g(zL - z, mL) - g(z, mT) - friction(v, z) / m;
z += dt * v;
v += dt * a;
}
public:
// Constructeur
Engine(int argc, char* argv[]) {
string inputPath("configuration.in"); // Fichier d'input par defaut
if(argc>1) // Fichier d'input specifie par l'utilisateur ("./Exercice1 config_perso.in")
inputPath = argv[1];
ConfigFile configFile(inputPath); // Les parametres sont lus et stockes dans une "map" de strings.
for(int i(2); i<argc; ++i) // Input complementaires ("./Exercice1 config_perso.in input_scan=[valeur]")
configFile.process(argv[i]);
// Stockage des parametres de simulation dans les attributs de la classe
tfin = configFile.get<double>("tfin");
nsteps = configFile.get<unsigned int>("nsteps");
dt = tfin / nsteps;
G = configFile.get<double>("G");
mT = configFile.get<double>("mT");
mL = configFile.get<double>("mL");
zT = configFile.get<double>("zT");
zL = configFile.get<double>("zL");
m = configFile.get<double>("m");
R = configFile.get<double>("R");
z0 = configFile.get<double>("z0");
v0 = configFile.get<double>("v0");
rho0 = configFile.get<double>("rho0");
lambda = configFile.get<double>("lambda");
Cx = configFile.get<double>("Cx");
sampling = configFile.get<unsigned int>("sampling");
// Ouverture du fichier de sortie
outputFile = new ofstream(configFile.get<string>("output").c_str());
outputFile->precision(15); // Les nombres seront ecrits avec 15 decimales
};
// Destructeur
~Engine()
{
outputFile->close();
delete outputFile;
};
// Simulation complete
void run()
{
t = 0;
z = z0;
v = v0;
last = 0;
printOut(true);
for(unsigned int i(0); i<nsteps; ++i)
{
step();
t += dt;
printOut(false);
}
printOut(true);
};
};
int main(int argc, char* argv[])
{
Engine engine(argc, argv);
engine.run();
cout << "Fin de la simulation." << endl;
return 0;
}
Event Timeline
Log In to Comment