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.