]> SALOME platform Git repositories - tools/solverlab.git/commitdiff
Salome HOME
Added a function getArray to retrieve the list of matrix coeffcients
authormichael <michael@is242589.intra.cea.fr>
Mon, 13 Sep 2021 11:38:52 +0000 (13:38 +0200)
committermichael <michael@is242589.intra.cea.fr>
Mon, 13 Sep 2021 11:38:52 +0000 (13:38 +0200)
CDMATH/base/inc/GenericMatrix.hxx
CDMATH/base/src/Matrix.cxx
CDMATH/linearsolver/inc/SparseMatrixPetsc.hxx
CDMATH/linearsolver/src/SparseMatrixPetsc.cxx

index 52f3db950263889f2b1d95f8d338756605489d71..36cf74584745717052ae8613631ed405428a9de4 100755 (executable)
@@ -47,6 +47,9 @@ class GenericMatrix
 
     virtual double operator ()( int i, int j ) const = 0;
 
+       //returns the array of matrix coefficients
+    virtual std::vector< double > getArray() = 0;
+
     virtual bool isSymmetric(double tol=1e-6) const ;
 
     bool isSquare() const ;
index 20dfed68f0ca1bafb7f8bdcfb6b85e0855d2eff9..dd37b6d0571e175679c7fae40300cb55135838f3 100755 (executable)
@@ -80,11 +80,9 @@ Matrix::min() const
 }
 
 std::vector< double > 
-Matrix::getArray() 
+Matrix::getArray()
 {
-       int numberOfRows  =getNumberOfRows();
-       int numberOfColums=getNumberOfColumns();
-       int size=_numberOfRows*numberOfColums;
+       int size=_numberOfRows*_numberOfColumns;
        
        vector< double >  result(size); 
        double* values = result.data();
index 37449c4b592ef548b4102d96ed74276bbf6fe6fd..9bb804970ab82f301c7f3bcc79a8b6603624f4d5 100755 (executable)
@@ -10,6 +10,7 @@
 
 #include <iostream>
 #include <vector>
+#include <cstring>
 
 #include "MEDCouplingUMesh.hxx"
 #include "Vector.hxx"
@@ -101,10 +102,14 @@ public:
        friend SparseMatrixPetsc operator*(const SparseMatrixPetsc& M, const SparseMatrixPetsc& N) ;
 
        void viewMatrix() const ;
+       //Save matrix coefficients into a file in ascii or binary mode
+       void saveMatrix(std::string filename, bool binaryMode=false) const ;
        double getMatrixCoeff(int i, int j) const;    
 
        bool containsPetscMatrix() const;
        Mat getPetscMatrix() const;
+       //returns the array of matrix coefficients
+       std::vector< double > getArray();
     
     void diagonalShift(double lambda);
     void zeroEntries();//sets the matrix coefficients to zero
index 58ab952b2b19cd64b0da2ada78d857f6a254d8a6..d9cd0f934f32e0b9dff1de06c58599d2331ff84c 100755 (executable)
@@ -8,8 +8,6 @@
 #include "SparseMatrixPetsc.hxx"
 #include "CdmathException.hxx"
 
-#include <cstring>
-
 using namespace std;
 
 //----------------------------------------------------------------------
@@ -415,6 +413,32 @@ SparseMatrixPetsc::viewMatrix() const
 
        MatView(_mat,PETSC_VIEWER_STDOUT_SELF);
 }
+
+void 
+SparseMatrixPetsc::saveMatrix(string filename, bool binaryMode) const
+{
+    MatAssemblyBegin(_mat, MAT_FINAL_ASSEMBLY);
+       MatAssemblyEnd(_mat, MAT_FINAL_ASSEMBLY);
+
+       PetscViewer fileViewer;
+       PetscViewerCreate(PETSC_COMM_WORLD,&fileViewer);
+    PetscViewerFileSetMode(fileViewer,FILE_MODE_WRITE);
+    PetscViewerFileSetName(fileViewer,filename.c_str());
+
+       if( binaryMode)
+       {
+               PetscViewerSetType(fileViewer, PETSCVIEWERBINARY);              
+               PetscViewerASCIIOpen(PETSC_COMM_WORLD, filename.c_str(), &fileViewer);
+       }
+       else
+       {
+               PetscViewerSetType(fileViewer, PETSCVIEWERASCII);               
+               PetscViewerBinaryOpen(PETSC_COMM_WORLD, filename.c_str(), FILE_MODE_WRITE, &fileViewer);
+       }
+     
+       MatView(_mat,fileViewer);
+}
+
 double
 SparseMatrixPetsc::getMatrixCoeff(int i, int j) const 
 {
@@ -427,6 +451,29 @@ SparseMatrixPetsc::getMatrixCoeff(int i, int j) const
        return res;
 }
 
+std::vector< double > 
+SparseMatrixPetsc::getArray()
+{
+       int size=_numberOfRows*_numberOfColumns;
+       
+       vector< double >  result(size); 
+       double* values = result.data();
+       
+       int * idxm = new int[_numberOfRows];
+       int * idxn = new int[_numberOfColumns];
+    for (int i=0;i<_numberOfRows;i++) 
+               idxm[i]=i;
+    for (int i=0;i<_numberOfColumns;i++) 
+               idxn[i]=i;
+       
+       MatAssemblyBegin(_mat, MAT_FINAL_ASSEMBLY);
+       MatAssemblyEnd(_mat, MAT_FINAL_ASSEMBLY);
+
+       MatGetValues(_mat,_numberOfRows, idxm,_numberOfColumns, idxn,values);
+
+       return result;
+}
+
 void 
 SparseMatrixPetsc::diagonalShift(double lambda)
 {