1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
|
#include <iostream>
#include <cmath>
#include <fstream>
#include"Coordonnee.h"
#include"List_define.h"
using namespace std;
//Creation et initialisation du tableau d'etat (en mode global) dont les valeurs permettrons d'influancer le comportement du programme (toutes les cases sont a 0 lors de l'initialisation):
int tableau_etat[9]; //Caracterisation de chacun des emplacement memoire:
//Case 0: Une variable est dans un domaine interdit;
//Case 1: Met fin a la boucle 0;
//Case 2: Met fin a la boucle 1;
//Case 3: Met fin a la boucle 2;
//Case 4: Numero de la boucle en cours d'execution(0,1,2);
//Case 5: La condition 1 est validee;
//Case 6: La condition 2 est validee
//Case 7: Met fin a la boucle 3;
//Case 8: Indique si la fonction brassage_boucle a ete appelee
//Marge epsilon pour la comparaison de 2 reels
double epsilon_test=0.1;
double pi=3.141592;
int main()
{
// Declaration des variables (Dans le système SI):
//Constantes:
double c=3*pow(10.,11.);
//Parametres
double lambda=0.1;
double k=(2*pi)/lambda;
double f=c/lambda;
double A=1.; //Amplitude des sources
int N_sources_total=100; //nombre de sources
int N_coordonnee=3*N_sources_total; //Nombre total de coordonnees
double n=0.1; //iteration sur la distance pour le test
double n_source=0.1; //iteration sur la distance pour les sources
double n_phase=pi/2; //Iteration sur la phase
double temps=1.; //iteration sur le temps
double r1=1.;
double r2=2.;
double a=0.2;
double a_int=a/2.;
double erreur_sur_r1=0.2; //Approximation sur r1 du resultat final
double erreur_sur_a=0.2; //Approximation sur a du resultat final
double margeder1=erreur_sur_r1 ;
double margedea=erreur_sur_a*N_sources_total*A;
double z=0.0;
for(int i=0;i<9;i++)
{
tableau_etat[i]=0;
}
//Ouverture du fichier texte ou seront stocke les resutats:
ofstream fichier;
fichier.open("Resultat_de_la_simulation.txt");
//On fait varier le nombre de sources entre 0 et N_sources:
for(int N=9;N<N_coordonnee;N=N+3)
{
cout<<"Loading("<<((N*100)/N_coordonnee)<<" %) --> Nombre de Sources"<<endl;
//Definition de la taille des tableaux
int N_source =N/3;
cout<<"Definition de la taille des tableaux"<<endl;
coord_source *T1;
coordonnee *T2;
coordonnee *T3;
phase *T4;
T1=new coord_source[N];
T2=new coordonnee[3];
T3=new coordonnee[3];
T4=new phase[N_source];
for (int i=0;i<N;i=i+3)
{
T1[i]=coord_source(1,r2);
T1[i+1]=coord_source(2,r2);
T1[i+2]=coord_source(3,r2);
}
T2[0]=coordonnee(r1,r1+100);
T2[1]=coordonnee(sqrt(pow(r1,2)-pow(T2[0].coord,2)),r1+100);
T2[2]=coordonnee(sqrt(pow(r1,2)-pow(T2[0].coord,2)-pow(T2[1].coord,2)),sqrt(pow(r1,2)-pow(T2[0].coord,2)-pow(T2[1].coord,2)));
T3[0]=coordonnee(a_int,a_int+100);
T3[1]=coordonnee(sqrt(pow(a_int,2)-pow(T3[0].coord,2)),a_int+100);
T3[2]=coordonnee(sqrt(pow(a_int,2)-pow(T3[0].coord,2)-pow(T3[1].coord,2)),sqrt(pow(a_int,2)-pow(T3[0].coord,2)-pow(T3[1].coord,2)));
for (int i=0;i<N_source;i++)
{
T4[i]=phase();
}
cout<<"Done"<<endl;
//Variables utiles pour construire le loading des combinaisons de sources
int num_comb3=1;
double exposant_source_pour_loading=0;
for(double i=1;i<=N_source;i++)
{exposant_source_pour_loading+=i;}
//Combinaison de chaque coordonnees et Verification avec les conditions initiales:
do{
TE_num_boucle_en_execution=0; //On indique que l'on est dans la boucle 0
fonction_brassage_boucle(T1,N-1,n_source); // On remonte dans l'arborescence et on ajoute +1 à l'iteration d'une coordonnee de la meme maniere que des boucles imbriquées
if(TE_appel_fonction_brassage==0) //Pour eviter de faire 2 iteration a la suite ( il y a une iteration dans fontion_brassage_boucle)
{
T1[N-1].iteration(n_source,N-1,T1); //On rajoute +1 a la coordonnee la plus basse dans l'arbre des combinaisons
}
else{TE_appel_fonction_brassage=0;}
cout<<endl;
cout<<"Combinaison de source --> Loading( "<<((num_comb3*100.)/(pow(((2*pi*r2)/n_source),exposant_source_pour_loading)))<<" %) & Nbre de source="<<N_source<<endl;
num_comb3++;
//On saute la combinaison si un point est dans un domaine interdit
if(TE_valeur_interdite==1)
{
TE_valeur_interdite=0;
}
else //On ne fait la suite de la simulation que si aucune des valeurs n'est dans un domaine interdit
{
//Variables utiles pour construire le loading des combinaisons de phases
int num_comb4=1;
double exposant_phase_pour_loading=0;
for(double i=1;i<=N_source;i++)
{exposant_phase_pour_loading+=i;}
//Iteration sur la phase
do{
TE_num_boucle_en_execution=3; //on indique que l'on passe dans la boucle 4
fonction_brassage_boucle(T4,N_source-1,n_phase);
if(TE_appel_fonction_brassage==0) //Pour eviter de faire 2 iteration a la suite ( il y a une iteration dans fontion_brassage_boucle)
{
T4[N_source-1].iteration(n_phase); //On rajoute +1 a la coordonnee la plus basse dans l'arbre des combinaisons
}
else{TE_appel_fonction_brassage=0;}
cout<<endl;
cout<<"Combinaison de phase --> Loading( "<<(num_comb4*100)/(pow((2*pi)/n_phase,exposant_phase_pour_loading))<<" %) & Nbre de source="<<N_source<<endl;
//cout<<"Combinaison de phase --> Loading( "<<(num_comb4*n_phase*100)/(pow((2*pi*r2),exposant_phase_pour_loading))<<" %) & Nbre de source="<<N_source<<endl;
num_comb4++;
//Iteration des conditions sur le temps pour qu'elles soient vraient pour tout t:
bool flag_boucle_test_temp=1;
int t=0;
do
{
cout<<"Test sur le temps: Loading("<<(t)*100./5.<<" %)"<<endl;
//Condition 1
int num_comb1=1; //Variable qui indiquera quelle combinaison le programme est en train de tester
//Debut boucle de test:
bool flag_boucle_2=1; //Permet de simuler un break
do{
//On indique que l'on passe dans la boucle 1
TE_num_boucle_en_execution=1;
fonction_brassage_boucle(T2,2,n);
if(TE_appel_fonction_brassage==0) //Pour eviter de faire 2 iteration a la suite ( il y a une iteration dans fontion_brassage_boucle)
{
T2[2].iteration(n); //On rajoute +1 a la coordonnee la plus basse dans l'arbre des combinaisons
}
else{TE_appel_fonction_brassage=0;}
//On saute la combinaison si un point est dans un domaine interdit
if(TE_valeur_interdite==1)
{
TE_valeur_interdite=0;
}
else //On ne fait la suite de la simulation que si aucune des valeurs n'est dans un domaine interdit
{
//Iteration sur la phase
//Calcul de z=Somme des sources en un point de l'espace (x,y,z):
//double z=0.0;
z=0.0;
for(int j=0;j<N;j=j+3)
{
z+=A*cos((2*pi*f*t)-(k)*(sqrt(pow(T1[j].coord-T2[0].coord,2)+pow(T1[j+1].coord-T2[1].coord,2)+pow(T1[j+2].coord-T2[2].coord,2)))+T4[j/3].phase1);
cout << T1[j].coord<<" "<<T2[0].coord<<" "<<T1[j+1].coord<<" "<<T2[1].coord<<" "<<T1[j+2].coord<<" "<<T2[2].coord<<" "<< j << endl;
}
//Test sur la condition 1:
if(z>=(-margeder1) && z<=margeder1)
{
TE_validation_condition_1=1;
//Afichage de l'avancement du teste de la condition 1
cout<<"Condition 1 --> Loading( "<<(int)((num_comb1*100)/pow((2*r1)/n,3*N))<<" %)"<<endl;
num_comb1++;
}
else
{
TE_validation_condition_1=0;
if (num_comb1!=1)
{
cout<<"Condition 1 --> Echec sur une valeur --> Arret du test"<<endl;
}
flag_boucle_2=0;
}
cout<<"Test Condition 1 --> Done"<<endl;
}
}while(TE_casse_boucle_2==0 && flag_boucle_2==1);
//Remise a 0 du casse-boucle 2
TE_casse_boucle_2=0;
//Condition 2 :
int num_comb2=1; //Variable qui indiquera quelle combinaison le programme est en train de tester
//On indique que l'on passe dans la boucle 2
TE_num_boucle_en_execution=2;
//Debut boucle de test
bool flag_boucle_3=1;
do{
if (TE_validation_condition_1==0)
{
cout<<"Saut de la condition 2 car la condition 1 n'a pas ete validee"<<endl;
flag_boucle_3=0;
}
else //Permet de sauter la condition 2 si la condition 1 n'est pas respectee
{
T3[2].iteration(n);
fonction_brassage_boucle(T3,2,n);
//On saute la combinaison si un point est dans un domaine interdit
if(TE_valeur_interdite==1)
{
TE_valeur_interdite=0;
}
else
{
//Calcul de z=Somme des sources en un point de l'espace (x,y,z):
double z=0;
for(int j=0;j<N;j=j+3)
{
z+=A*cos((2*pi*f*t)-(k)*(sqrt(pow(T1[j].coord-T3[0].coord,2)+pow(T1[j+1].coord-T3[1].coord,2)+pow(T1[j+2].coord-T3[2].coord,2)))+T4[j/3].phase1);
}
//Test sur la condition 2:
if(z>=N*A-margedea && z<=N*A)
{
TE_validation_condition_2=1;
//Affichage du numero de la combinaison testee
cout<<"Condition 2 --> Loading( "<<(int)(num_comb2/pow((2*a_int)/n,3*N))<<" %)"<<endl;
num_comb2++;
}
else
{
TE_validation_condition_2=0;
if (num_comb2!=1)
{
cout<<"Condition 2 --> Echec sur une valeur --> Arret du test"<<endl;
}
flag_boucle_3=0;
}
cout<<"Test Condition 2--> Done"<<endl;
}
}
}while(TE_casse_boucle_3==0 && flag_boucle_3==1);
//Remise a 0 du casse-boucle 3
TE_casse_boucle_3=0;
//Reinitialisation de T2 et T3:
cout<<"Reinitialisation des Tableaux"<<endl;
T2[0]=coordonnee(r1,r1+100);
T2[1]=coordonnee(sqrt(pow(r1,2)-pow(T2[0].coord,2)),r1+100);
T2[2]=coordonnee(sqrt(pow(r1,2)-pow(T2[0].coord,2)-pow(T2[1].coord,2)),sqrt(pow(r1,2)-pow(T2[0].coord,2)-pow(T2[1].coord,2)));
T3[0]=coordonnee(a_int,a_int+100);
T3[1]=coordonnee(sqrt(pow(a_int,2)-pow(T3[0].coord,2)),a_int+100);
T3[2]=coordonnee(sqrt(pow(a_int,2)-pow(T3[0].coord,2)-pow(T3[1].coord,2)),sqrt(pow(a_int,2)-pow(T3[0].coord,2)-pow(T3[1].coord,2)));
//Condition sur t pour continuer a iterer: que la cominaison respecte les conditions pour tout t
if(TE_validation_condition_1==0 || TE_validation_condition_2==0)
{
cout<<" ---> NON"<<endl;
flag_boucle_test_temp=0;
}
t++;
}while(t!=6 && flag_boucle_test_temp==1); //on fait une iteration jusqu a t=5 et tant que le flag n est pas egal a 0
//Enrengistrement des potentiels resultats et remise a zero des cases du tableau d'etat correspondant a la validation des conditions 1 et 2:
//cout<<"Enrengistrement des potentiels resultats";
if(TE_validation_condition_1==1 && TE_validation_condition_2==1)
{
cout<<" ---> OUI"<<endl;
fichier<<endl;
fichier<< "Combinaison de coordonnees de source valide: "<<endl;
for(int j=0;j<N;j++)
{
fichier<<"Source numero "<<j<<": "<<T1[j].coord<<" "<<T1[j+1].coord<<" "<<T1[j+2].coord<<" et de phase:"<<T4[j].phase1<<endl;
}
}
//Remise a zero des conditions 1 et 2 pour une nouvelle combinaison des sources
TE_validation_condition_1=0;
TE_validation_condition_2=0;
}while(TE_casse_boucle_4==0);
TE_casse_boucle_4=0;
}
}while(TE_casse_boucle_1==0);
//Remise a 0 du casse-boucle 1
TE_casse_boucle_1=0;
//Destruction des anciens tableaux pour qu'ils soient reconstruit lors de la prochaine iteration
delete[] T1;
delete[] T2;
delete[] T3;
delete[] T4;
}
//Fermeure de la Simulation
cout<<"Fin du Programme de Simulation"<<endl;
fichier.close();
return 0;
} |
Partager