next up previous contents
Next: LEÇON: L'interpreteur DBI Up: Aide à la réalisation Previous: L'instruction "adaptmesh"

Casting de u au format DBI

Evidement il est beaucoup plus difficile de faire "adaptmesh(u)" ou u est un résultat du solveur car il n'est pas au format des fonctions de DBI.

L'idée de base est qu'il faut neutraliser l'évaluation de u(x,y) comme une fonction2 et qu'il faut utiliser à la place par exemple

	float operator ()(float x, float y) { return interpole(t,val,x,y);}
où val est les tableau de valeurs sur la triangulation t.

On définit donc une classe dérivée de CVirt2:

class CTab: public CVirt2 {// fonction tableau
public: 
	triangulation *t;
	float* val;         // les valeurs sur la triangulation
	CTab(triangulation* tt, float* vval) : t(tt), val(vval) {}
	float operator ()(float x, float y) { return interpole(t,val,x,y);}
	float valeur(int i) { return val[i];}
};
et on rajoute un champs
     CTab *f2;
dans la classe Isolve qui sert à définir l'instruction solve.

La lecture de solve(u) se fait comme suit:

 case solve:
    nextSym();
    match(lpar);
    match(iden);
    if (curIden->type != Iden::inconnu)  erreur("Can't redefine a function");
    curIden->type = Iden::fonction2;
    CTab *f = new CTab (&t, 0); // On cr\'ee la fonction
    curIden->f2 = f;
    res = new Isolve(f,an.x->storage, an.y->storage, an.ng->storage);
    match(rpar);
 break;

A l'execution de Isolve on aura

void Isolve::execute()
{ 
  solvepde();// Resout l'EDP. Toutes les donn\'ees sont dans des fichiers.  
  float* resultat = new float[t.np];
  ... // lecture du fichier "sol.dta"
  f2->val = reusltat;
  equpot(t.ng,temp,20, 2); // trace la solution ancien style.
}

Pour un tracé "nouveau style" de la solution par un ordre Gfem, on ne peut pas faire "plot(u(0.0,0.0))" car ceci donne des valeurs à x,y et d'un autre coté on ne peut pas appeler u sans paramètre; on rappelle que les fonctions sans paramètres formels ne sont pas définis dans Gfem, ce qui est évidement une lacune. On rappelle aussi que toutes les fonctions sont implicitement fonction de x,y,ref, après que buildmesh ait été effectué.

Un pis-aller consiste à faire

... solve(u);
fonction uu(w) uu = u(x,y);
plot(uu(1));



Olivier Pironneau
Mon May 17 17:14:42 METDST 1999