On doit rajouter
![]()
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;