Advertisement
Guest User

Untitled

a guest
Sep 2nd, 2014
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.24 KB | None | 0 0
  1. #include <iostream>
  2. #include "petscmat.h"  
  3. #include "petscviewer.h"
  4.  
  5. // Compiling with: mpic++ -g3 -Wall -I ~/software/petsc/include -I ~/software/petsc/arch-linux2-c-debug/include -L ~/software/petsc/arch-linux2-c-debug/lib -lpetsc test.cpp
  6. // Running without mpirun.
  7.  
  8. int main(int argc, char **args)
  9. {
  10.   PetscInitialize(&argc, &args, "", NULL);
  11.  
  12.   PetscErrorCode ierr = 0;
  13.   int num_rows = 10;
  14.   Mat matrix;
  15.   Vec vector;
  16.  
  17.   // Create dense matrix, but code should work for sparse, too (I hope).
  18.   ierr = MatCreateDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, num_rows, 4, NULL, &matrix); CHKERRQ(ierr);
  19.   ierr = MatAssemblyBegin(matrix, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
  20.   ierr = MatAssemblyEnd(matrix, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
  21.  
  22.   ierr = VecCreate(PETSC_COMM_WORLD, &vector); CHKERRQ(ierr);
  23.   ierr = VecSetSizes(vector, PETSC_DECIDE, num_rows); CHKERRQ(ierr);
  24.   ierr = VecSetFromOptions(vector); CHKERRQ(ierr);
  25.  
  26.   // Init vector with 0, 1, ... , num_rows-1
  27.   PetscScalar *a;
  28.   PetscInt range_start, range_end, pos = 0;
  29.   VecGetOwnershipRange(vector, &range_start, &range_end);
  30.   ierr = VecGetArray(vector, &a); CHKERRQ(ierr);
  31.   for (PetscInt i = range_start; i < range_end; i++) {
  32.     a[pos] = pos + range_start;
  33.     pos++;
  34.   }
  35.   VecRestoreArray(vector, &a);
  36.   // VecAssemblyBegin(vector); VecAssemblyEnd(vector);  I don't think it's needed here, changes nothing.
  37.   ierr = VecView(vector, PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr);
  38.  
  39.   PetscInt irow[num_rows];
  40.   const PetscInt col = 2;
  41.   const PetscScalar *vec;
  42.  
  43.   for (int i = 0; i < num_rows; i++) {
  44.     irow[i] = i;
  45.   }
  46.   ierr = VecGetArrayRead(vector, &vec); CHKERRQ(ierr);
  47.   // MatSetValuesLocal(Mat mat,PetscInt nrow,const PetscInt irow[],PetscInt ncol,const PetscInt icol[],const PetscScalar y[],InsertMode addv)
  48.   ierr = MatSetValuesLocal(matrix, num_rows, irow, 1, &col, vec, INSERT_VALUES); CHKERRQ(ierr);
  49.   // Works fine with MatSetValues
  50.   ierr = VecRestoreArrayRead(vector, &vec); CHKERRQ(ierr);
  51.   ierr = MatAssemblyBegin(matrix, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
  52.   ierr = MatAssemblyEnd(matrix, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
  53.  
  54.   ierr = MatView(matrix, PETSC_VIEWER_STDOUT_WORLD); CHKERRQ(ierr);
  55.  
  56.   PetscFinalize();  
  57.   return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement