Per risolvere il simulatore non esegue operazioni tra matrici (addizione, prodotto tra matrice e vettore, prodotto di una matrice per uno scalare e prodotto tra matrici), se avessi usato questo metodo, la sua complessità sarebbe . Ho sfruttato il fatto che gli elementi della matrice sono per la maggior parte nulli.
La funzione è la seguente:
float **coefficient_matrix(int Dx, int Dy, double Dt, Matrice *D) { float **A; int k; int dim = D -> r * D -> c; 1 if ((A = (float **)malloc(dim * sizeof(float *))) == NULL) 2 exit(1); 3 for (k = 0; k < dim; k++) 4 if ((A[k] = (float *)calloc(dim, sizeof(float))) == NULL) { 5 printf(``the memory is below to run fick.\n''); 6 exit(1); 7 } 8 for (k = 0; k < dim; k++) { 9 A[k][k] = 2*(1 + Lx(k) + Ly(k)); /* 2(1 + Lx + Ly) */ 10 if (k - 1 >= 0 && (k-1)%D->c != D->c - 1) 11 A[k][k-1] = -1 * Lx(k); /* -Lx */ 12 if (k + 1 < dim && (k+1)%D->c != 0) 13 A[k][k+1] = -1 * Lx(k); /* -Lx */ 14 if (k - D->c >= 0) 15 A[k][k - D->c] = -1 * Ly(k); /* -Ly */ 16 if (k + D->c < dim) 17 A[k][k+D->c] = -1 * Ly(k); /* -Ly */ 18 } 19 return A; 20}Dopo la dichiarazione di alcune variabili locali, nelle linee 1-7 si riserva la memoria per la matrice dinamica A. Usando la funzione calloc() la memoria viene automaticamente inizializzata a zero. Dato che la matrice ha al più cinque elementi diversi da zero per ogni riga, il ciclo (linee 8-18) ha il compito di scrivere tali valori. Le istruzioni if all' interno del ciclo garantiscono che l' area in esame non venga considerata cilindrica, cioè eliminano la possibilità che una zona situata al margine sia influenzata dalla concentrazione della zona del margine opposto.
La funzione ha complessità dove è il numero di righe della matrice.