| normmh.c (d8e47b638cf8f604a99e9678e1df24f82d959cd7) | normmh.c (e91c04dfc8a52dee1965211bb1cc8e5bf775178f) |
|---|---|
| 1#include <../src/mat/impls/shell/shell.h> /*I "petscmat.h" I*/ 2 3typedef struct { 4 Mat A; 5 Mat D; /* local submatrix for diagonal part */ 6 Vec w; 7} Mat_NormalHermitian; 8 --- 114 unchanged lines hidden (view full) --- 123 Slow, nonscalable version 124*/ 125static PetscErrorCode MatGetDiagonal_NormalHermitian(Mat N, Vec v) 126{ 127 Mat_NormalHermitian *Na; 128 Mat A; 129 PetscInt i, j, rstart, rend, nnz; 130 const PetscInt *cols; | 1#include <../src/mat/impls/shell/shell.h> /*I "petscmat.h" I*/ 2 3typedef struct { 4 Mat A; 5 Mat D; /* local submatrix for diagonal part */ 6 Vec w; 7} Mat_NormalHermitian; 8 --- 114 unchanged lines hidden (view full) --- 123 Slow, nonscalable version 124*/ 125static PetscErrorCode MatGetDiagonal_NormalHermitian(Mat N, Vec v) 126{ 127 Mat_NormalHermitian *Na; 128 Mat A; 129 PetscInt i, j, rstart, rend, nnz; 130 const PetscInt *cols; |
| 131 PetscScalar *diag, *work, *values; | 131 PetscScalar *work, *values; |
| 132 const PetscScalar *mvalues; | 132 const PetscScalar *mvalues; |
| 133 PetscMPIInt iN; | |
| 134 135 PetscFunctionBegin; 136 PetscCall(MatShellGetContext(N, &Na)); 137 A = Na->A; | 133 134 PetscFunctionBegin; 135 PetscCall(MatShellGetContext(N, &Na)); 136 A = Na->A; |
| 138 PetscCall(PetscMalloc2(A->cmap->N, &diag, A->cmap->N, &work)); | 137 PetscCall(PetscMalloc1(A->cmap->N, &work)); |
| 139 PetscCall(PetscArrayzero(work, A->cmap->N)); 140 PetscCall(MatGetOwnershipRange(A, &rstart, &rend)); 141 for (i = rstart; i < rend; i++) { 142 PetscCall(MatGetRow(A, i, &nnz, &cols, &mvalues)); 143 for (j = 0; j < nnz; j++) work[cols[j]] += mvalues[j] * PetscConj(mvalues[j]); 144 PetscCall(MatRestoreRow(A, i, &nnz, &cols, &mvalues)); 145 } | 138 PetscCall(PetscArrayzero(work, A->cmap->N)); 139 PetscCall(MatGetOwnershipRange(A, &rstart, &rend)); 140 for (i = rstart; i < rend; i++) { 141 PetscCall(MatGetRow(A, i, &nnz, &cols, &mvalues)); 142 for (j = 0; j < nnz; j++) work[cols[j]] += mvalues[j] * PetscConj(mvalues[j]); 143 PetscCall(MatRestoreRow(A, i, &nnz, &cols, &mvalues)); 144 } |
| 146 PetscCall(PetscMPIIntCast(A->cmap->N, &iN)); 147 PetscCallMPI(MPIU_Allreduce(work, diag, iN, MPIU_SCALAR, MPIU_SUM, PetscObjectComm((PetscObject)N))); | 145 PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, work, A->cmap->N, MPIU_SCALAR, MPIU_SUM, PetscObjectComm((PetscObject)N))); |
| 148 rstart = N->cmap->rstart; 149 rend = N->cmap->rend; 150 PetscCall(VecGetArray(v, &values)); | 146 rstart = N->cmap->rstart; 147 rend = N->cmap->rend; 148 PetscCall(VecGetArray(v, &values)); |
| 151 PetscCall(PetscArraycpy(values, diag + rstart, rend - rstart)); | 149 PetscCall(PetscArraycpy(values, work + rstart, rend - rstart)); |
| 152 PetscCall(VecRestoreArray(v, &values)); | 150 PetscCall(VecRestoreArray(v, &values)); |
| 153 PetscCall(PetscFree2(diag, work)); | 151 PetscCall(PetscFree(work)); |
| 154 PetscFunctionReturn(PETSC_SUCCESS); 155} 156 157static PetscErrorCode MatGetDiagonalBlock_NormalHermitian(Mat N, Mat *D) 158{ 159 Mat_NormalHermitian *Na; 160 Mat M, A; 161 --- 175 unchanged lines hidden --- | 152 PetscFunctionReturn(PETSC_SUCCESS); 153} 154 155static PetscErrorCode MatGetDiagonalBlock_NormalHermitian(Mat N, Mat *D) 156{ 157 Mat_NormalHermitian *Na; 158 Mat M, A; 159 --- 175 unchanged lines hidden --- |