PetscMatTools.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef _PETSCMATTOOLS_HPP_
00037 #define _PETSCMATTOOLS_HPP_
00038
00039 #include "UblasMatrixInclude.hpp"
00040 #include "PetscTools.hpp"
00041 #include <vector>
00042 #include <petscvec.h>
00043 #include <petscmat.h>
00044
00048 class PetscMatTools
00049 {
00050 public:
00051
00060 static void SetElement(Mat matrix, PetscInt row, PetscInt col, double value);
00061
00070 static void AddToElement(Mat matrix, PetscInt row, PetscInt col, double value);
00071
00077 static void Finalise(Mat matrix);
00078
00085 static void SwitchWriteMode(Mat matrix);
00086
00092 static void Display(Mat matrix);
00093
00103 static void SetRow(Mat matrix, PetscInt row, double value);
00104
00114 static void ZeroRowsWithValueOnDiagonal(Mat matrix, std::vector<unsigned>& rRows, double diagonalValue);
00115
00125 static void ZeroRowsAndColumnsWithValueOnDiagonal(Mat matrix, std::vector<unsigned> rowColIndices, double diagonalValue);
00126
00137 static void ZeroColumn(Mat matrix, PetscInt col);
00138
00143 static void Zero(Mat matrix);
00144
00149 static unsigned GetSize(Mat matrix);
00150
00158 static void GetOwnershipRange(Mat matrix, PetscInt& lo, PetscInt& hi);
00159
00168 static double GetElement(Mat matrix, PetscInt row, PetscInt col);
00169
00176 static void SetOption(Mat matrix, MatOption option);
00177
00185 static Vec GetMatrixRowDistributed(Mat matrix, unsigned rowIndex);
00186
00194 static bool CheckEquality(const Mat mat1, const Mat mat2, double tol=1e-10);
00195
00210 static bool CheckSymmetry(const Mat matrix, double tol=1e-10);
00211
00224 static void TurnOffVariableAllocationError(Mat matrix);
00225
00236 template<size_t MATRIX_SIZE>
00237 static void AddMultipleValues(Mat matrix, unsigned* matrixRowAndColIndices, c_matrix<double, MATRIX_SIZE, MATRIX_SIZE>& rSmallMatrix)
00238 {
00239 PetscInt matrix_row_indices[MATRIX_SIZE];
00240 PetscInt num_rows_owned = 0;
00241 PetscInt global_row;
00242 PetscInt lo, hi;
00243 GetOwnershipRange(matrix, lo, hi);
00244
00245 for (unsigned row = 0; row<MATRIX_SIZE; row++)
00246 {
00247 global_row = matrixRowAndColIndices[row];
00248 if (global_row >= lo && global_row < hi)
00249 {
00250 matrix_row_indices[num_rows_owned++] = global_row;
00251 }
00252 }
00253
00254 if ( num_rows_owned == MATRIX_SIZE)
00255 {
00256 MatSetValues(matrix,
00257 num_rows_owned,
00258 matrix_row_indices,
00259 MATRIX_SIZE,
00260 (PetscInt*) matrixRowAndColIndices,
00261 rSmallMatrix.data(),
00262 ADD_VALUES);
00263 }
00264 else
00265 {
00266
00267
00268 double values[MATRIX_SIZE*MATRIX_SIZE];
00269 unsigned num_values_owned = 0;
00270 for (unsigned row = 0; row < MATRIX_SIZE; row++)
00271 {
00272 global_row = matrixRowAndColIndices[row];
00273 if (global_row >= lo && global_row < hi)
00274 {
00275 for (unsigned col = 0; col < MATRIX_SIZE; col++)
00276 {
00277 values[num_values_owned++] = rSmallMatrix(row, col);
00278 }
00279 }
00280 }
00281
00282 MatSetValues(matrix,
00283 num_rows_owned,
00284 matrix_row_indices,
00285 MATRIX_SIZE,
00286 (PetscInt*) matrixRowAndColIndices,
00287 values,
00288 ADD_VALUES);
00289 }
00290 }
00291 };
00292
00293 #endif //_PETSCMATTOOLS_HPP_