next up previous contents
Next: Modification dans Laplace::solvgradconj Up: Directives pour cet Previous: Dans P1::intgrad2

Changement dans Laplace::derivener

On doit rajouter
displaymath789
Le calcul de I[k] se fait exactement comme le calcul de l'intégrale sur Omega de f wk qui est déja fait au debut de la fonction. Il suffit de recopier et de remplacer rhs[] par a * sol[]

Le calcul de J[k] est plus compliqué. Il faut impérativement garder en mémoire qu'on ne peut faire O(N*N) opérations donc pas de double boucles imbriquées. Le principe de base est l'assemblage: plutot que de faire une boucle sur k puis une boucle sur les arêtes frontieres (faisable car il n'y a que 2 arêtes qui contribue a J[k] pour un cas donne') on échange l'ordre des boucles et on fait une boucle sur les arêtes puis une boucles sur les k qui donnes des contributions non nulles a J dues a l'arête. Pour que ca marche il faut initialiser a zéro le tableau J. Pour faire une boucle sur les arêtes, on fait

 for(int l=0; l<g->nt; l++)
  for(int iloc=0; iloc<3; iloc++)
  {  Vertex* vi = g->t[l].v[iloc];
     Vertex* vj = g->t[l].v[(iloc+1)%3];
     if(vi.where && vj.where)
     {  // on est sur une ar\^ete du bord, calculer so longeur
        // mettre ici la suite
     
     }
  }

Donc le calcul de la contribution sur l'arête a l'integrale se fait par

  float Ik = (neuman[g->no(vi)] + neumann[g->no(vj)]) * longeur/4;

car wk vaut 1/2 au milieu de l'arête. Enfin cette contribution ira dans les seuls indice k pour lesquels wk est non nul au milieu de l'arête c'est a dire i et j.

  
  I[g->no(vi)] += Ik;
  I[g->no(vj)] += Ik;



Pironneau Olivier
Jeudi 12 mars 1998 16:24:39