Attention l'utilisation des matrices morses de GetFem sous python peut amener, ds certaines circonstences, une augmentation de la mémoire utilisée. Au sein d'une boucle, un produit matrice vecteur "Av" : A.mult(v) fait augmenter régulièrement l'utilisation de la mémoire vive (RAM) au cours des itérations de la boucle ! Solution : Transformer les gf.Spmat en matrice morse scipy : import scipy.sparse as spsp # pour manipuler en stockage morse des matrices sz = A.size() [Ndiag,Indices] = A.csc_ind() ; VA = A.csc_val() A = spsp.csc_matrix((VA,Indices,Ndiag),shape=(sz[0],sz[1])) A._mul_vector(v) ====================================================================== ====================================================================== ====================================================================== Modification : pour conserver la 3ieme composante des points d'un maillage 2D créé par gmsh et lu par "m = gf.Mesh('import','gmsh',file)" (mode python) On commente la ligne 316 du fichier "src/getfem_import.cc" associé à la fonction "import_gmsh_msh_file" utilise pas MESH ds python. Cor ---> ligne 316 : /* maybe_remove_last_dimension(m); */ ====================================================================== ====================================================================== ====================================================================== A.csc_val() ----------- Suite à l'utilisation de la commande suivante : A.csc_val() # A matrice stockée morse (spmat sous getfem) on ne récupère pas l'ensemble des valeurs ... CORRECTION - Fichier : interface/src/gf_spmat_get.cc Bug ---> ligne 125 : for (unsigned i=0; i < M.nc+1; ++i) { w[i] = M.pr[i]; } Cor ---> ligne 125 : for (unsigned i=0; i < nz; ++i) { w[i] = M.pr[i]; } Extrait de code : --------------- template static void gf_spmat_get_data(gmm::csc_matrix_ref M, getfemint::mexargs_out& out, int which) { size_type nz = M.jc[M.nc]; if (which == 0) { iarray w = out.pop().create_iarray_h(unsigned(M.nc+1)); for (unsigned i=0; i < M.nc+1; ++i) { w[i] = M.jc[i] + config::base_index(); } if (out.remaining()) { w = out.pop().create_iarray_h(unsigned(nz)); for (unsigned i=0; i < nz; ++i) { w[i] = M.ir[i] + config::base_index(); } } } else { garray w = out.pop().create_array_h(unsigned(nz), T()); /* for (unsigned i=0; i < M.nc+1; ++i) { w[i] = M.pr[i]; } */ for (unsigned i=0; i < nz; ++i) { w[i] = M.pr[i]; } } }