Actual source code: ex256.c

  1: static char help[] = "Test some operations of SeqDense matrices with an LDA larger than M.\n";

  3: #include <petscmat.h>

  5: int main(int argc, char **argv)
  6: {
  7:   Mat          A, B;
  8:   PetscScalar *a, *b;
  9:   PetscInt     n = 4, lda = 5, i;

 11:   PetscFunctionBeginUser;
 12:   PetscCall(PetscInitialize(&argc, &argv, 0, help));
 13:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
 14:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-lda", &lda, NULL));
 15:   PetscCheck(lda >= n, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "lda %" PetscInt_FMT " < n %" PetscInt_FMT, lda, n);

 17:   /*
 18:    * Create two identical matrices (MatDuplicate does not preserve lda)
 19:    */
 20:   PetscCall(PetscCalloc2(lda * n, &a, lda * n, &b));
 21:   for (i = 0; i < n; i++) {
 22:     a[i + i * lda] = 1.0 + 2.0 * PETSC_i;
 23:     if (i > 0) a[i + (i - 1) * lda] = 3.0 - 0.5 * PETSC_i;
 24:     b[i + i * lda] = 1.0 + 2.0 * PETSC_i;
 25:     if (i > 0) b[i + (i - 1) * lda] = 3.0 - 0.5 * PETSC_i;
 26:   }
 27:   PetscCall(MatCreate(PETSC_COMM_SELF, &A));
 28:   PetscCall(MatSetSizes(A, n, n, n, n));
 29:   PetscCall(MatSetType(A, MATSEQDENSE));
 30:   PetscCall(MatSeqDenseSetPreallocation(A, a));
 31:   PetscCall(MatDenseSetLDA(A, lda));

 33:   PetscCall(MatCreate(PETSC_COMM_SELF, &B));
 34:   PetscCall(MatSetSizes(B, n, n, n, n));
 35:   PetscCall(MatSetType(B, MATSEQDENSE));
 36:   PetscCall(MatSeqDenseSetPreallocation(B, b));
 37:   PetscCall(MatDenseSetLDA(B, lda));

 39:   PetscCall(MatView(A, NULL));
 40:   PetscCall(MatConjugate(A));
 41:   PetscCall(MatView(A, NULL));
 42:   PetscCall(MatRealPart(A));
 43:   PetscCall(MatView(A, NULL));
 44:   PetscCall(MatImaginaryPart(B));
 45:   PetscCall(MatView(B, NULL));

 47:   PetscCall(PetscFree2(a, b));
 48:   PetscCall(MatDestroy(&A));
 49:   PetscCall(MatDestroy(&B));
 50:   PetscCall(PetscFinalize());
 51:   return 0;
 52: }

 54: /*TEST

 56:    build:
 57:      requires: complex

 59:    test:

 61: TEST*/