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 ?)

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;
    }
Remarques: On aura diff�rent moyen (de qualit� croissante: rapidit�/pr�cision) de calculer le potentiel en chacune des charges:
*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.