Bon je me lance en C++:
- car apr�s l'objectif de mon stage est de modifier une librairie �crite en C++ donc autant m'y habituer (m�me si Python est tr�s attractif)
- m�me si ce n'est pas un langage de script mais de compilation, en lan�ant le build and Run je peux voir imm�diatement ce qui se passe en affichant au fur et � mesure du d�vellopement les variables que j'utilise.
Je souhaite d�velloper l' algorithme FMM pour calculer le potentiel en un point g�n�r� par des charhes ponctuels. En gros je veux refaire ceci: www.umiacs.umd.edu/~ramani/fmm/files/fmmdemo.jar mais sans la partie graphique (pas besoin de l'animation je veux juste faire les calculs). Pour ceux qui voudraient une id�e plus pr�cise de l'algo, je m'appuie sur le document suivant (je garderas toutes les notations de ce doc): http://www.umiacs.umd.edu/labs/cvl/p...M_tutorial.pdf.
Je proc�derait par essai erreur donc toutes vos remarques me seront utiles au cours du d�vellopement!
Voici le d�but de mon code:
1) Je cr�e une distribution uniforme de N Particules dans le carr�
2) On veut calculer le potentiel en la cible y_j par calcul directe. On consid�re tout le long de l'algo un potentiel en 1/r (on parle du Kernel) (ie) le potentiel en un point y arbitraire g�n�r� par toutes les sources x_i est $\phi(y_j)=\sum_{i=1}^n 1/\|y-x_i\|$ (peut on mettre du latex dans le forum ?)
Remarques: On aura diff�rent moyen (de qualit� croissante: rapidit�/pr�cision) de calculer le potentiel en chacune des charges:
Code : S�lectionner tout - Visualiser dans une fen�tre � part
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 #include<iostream> #include <ctime> #include<cstdlib> #include<cmath> using namespace std; int main() { srand(time(0)); int N = 10; //Nombre particules int threshold = 5; int P=5; //ordre du dévelopement double x[N],y[N],m[N],p_dir[N]; // Création d'une distribution de 10 Particules au sein du cube [0,1]x[0,1] for( int i=0; i<N; i++ ) { x[i] = rand()/(1.+RAND_MAX); y[i] = rand()/(1.+RAND_MAX); m[i] = 1.0/N; cout<<x[i]<<" "<<m[i]<<endl; } //Calcul directe du potentiel en la cible y_j: $\phi(y_j)=\sup_{i=1}^n 1/\|y-x_i\|$ double dx,dy,dz;//Représente la distance entre le centre et la particule concernée double r; for( int j=0; j<N; j++ ) { for( int i=0; i<N; i++ ) { if (i==j) continue; dx = x[i]-x[j]; dy = y[i]-y[j]; r = sqrt(dx*dx+dy*dy+dz*dz); p_dir[j] += m[i] / r; } cout<<"Le potentiel par calcul directe est p["<<j<<"]: "<<p_dir[j]<<endl; }
*calcul directe
* Middleman
* PreFmm/ Middleman am�lior�
* SLFMM
*MLFMM
et pour chacunes de ces m�thodes on utilise les m�mes types de calculs:
* calcul directe, Expansion multipolaire (d�velopement en s�rie enti�re), op�rateur de translation... Je pensais donc mettre ces derni�res en fonctions, car r�utilis�s souvents.
Donc je pensais mettre chaque m�thode dans une fonction.
Partager