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