Confrontando il lato destro della (
) e
il lato destro dell' equazione (
) del metodo
implicito si ha che sono uguali a meno di
. Detto questo
risulta semplice unire in una sola funzione il calcolo del lato destro
delle due modalità operative. La funzione, lavorando in modalità
implicita, restituisce un vettore
dato da
. Questo sarà il vettore di termini noti del sistema
.
float *calculate_b(int Dx, int Dy, double Dt,
Matrice *D, Matrice *C) {
int k;
float *b;
1 if ((b = (float *)malloc(D->r*D->c * sizeof(float))) == NULL)
2 exit(1);
3 for (k = 0; k < (D -> r * D -> c); k++) {
4 b[k] = ((implicit+1) - 2*Lx(k) - 2*Ly(k))* C->m[k];
/* (2-2Lx-2Ly)C(k) implicit */
/* (1-2Lx-2Ly)C(k) explicit */
5 if ((k-1)%D->c != D->c - 1)
6 b[k] += Lx(k) * C->m[k - 1]; /* LxC(k-1) */
7 if ((k+1)%D->c != 0)
8 b[k] += Lx(k) * C->m[k + 1]; /* LxC(k+1) */
9 if (k - D->c >= 0)
10 b[k] += Ly(k) * C->m[k - D->c]; /* LyC(k-N) */
11 if (k + D->c < D -> r * D -> c)
12 b[k] += Ly(k) * C->m[k + D->c]; /* LyC(k+N) */
13 }
14 return b;
15}
Nelle linee 1-2 si riserva la memoria per il vettore
, nel for (linee 3-13) si scrivono gli elementi del vettore. Nella riga 4
è presente la variabile globale implicit che assume il valore
se si sta utilizzando la modalità implicita, 0 altrimenti. Le
istruzioni if hanno la stesso scopo di quelle della funzione coefficient_matrix(). La sua complessità è
.