Actual source code: getcolv.c


  2: #include <petsc/private/matimpl.h>

  4: /*@
  5:    MatGetColumnVector - Gets the values from a given column of a matrix.

  7:    Not Collective

  9:    Input Parameters:
 10: +  A - the matrix
 11: .  yy - the vector
 12: -  col - the column requested (in global numbering)

 14:    Level: advanced

 16:    Notes:
 17:    If a Mat type does not implement the operation, each processor for which this is called
 18:    gets the values for its rows using MatGetRow().

 20:    The vector must have the same parallel row layout as the matrix.

 22:    Contributed by: Denis Vanderstraeten

 24: .seealso: MatGetRow(), MatGetDiagonal(), MatMult()

 26: @*/
 27: PetscErrorCode  MatGetColumnVector(Mat A,Vec yy,PetscInt col)
 28: {
 29:   PetscScalar       *y;
 30:   const PetscScalar *v;
 31:   PetscInt          i,j,nz,N,Rs,Re,rs,re;
 32:   const PetscInt    *idx;

 38:   MatGetSize(A,NULL,&N);
 40:   MatGetOwnershipRange(A,&Rs,&Re);
 41:   VecGetOwnershipRange(yy,&rs,&re);

 44:   if (A->ops->getcolumnvector) {
 45:     (*A->ops->getcolumnvector)(A,yy,col);
 46:   } else {
 47:     VecSet(yy,0.0);
 48:     VecGetArray(yy,&y);
 49:     /* TODO for general matrices */
 50:     for (i=Rs; i<Re; i++) {
 51:       MatGetRow(A,i,&nz,&idx,&v);
 52:       if (nz && idx[0] <= col) {
 53:         /*
 54:           Should use faster search here
 55:         */
 56:         for (j=0; j<nz; j++) {
 57:           if (idx[j] >= col) {
 58:             if (idx[j] == col) y[i-rs] = v[j];
 59:             break;
 60:           }
 61:         }
 62:       }
 63:       MatRestoreRow(A,i,&nz,&idx,&v);
 64:     }
 65:     VecRestoreArray(yy,&y);
 66:   }
 67:   return 0;
 68: }

 70: /*@
 71:    MatGetColumnNorms - Gets the norms of each column of a sparse or dense matrix.

 73:    Input Parameters:
 74: +  A - the matrix
 75: -  type - NORM_2, NORM_1 or NORM_INFINITY

 77:    Output Parameter:
 78: .  norms - an array as large as the TOTAL number of columns in the matrix

 80:    Level: intermediate

 82:    Notes:
 83:     Each process has ALL the column norms after the call. Because of the way this is computed each process gets all the values,
 84:     if each process wants only some of the values it should extract the ones it wants from the array.

 86: .seealso: NormType, MatNorm()

 88: @*/
 89: PetscErrorCode MatGetColumnNorms(Mat A,NormType type,PetscReal norms[])
 90: {
 91:   /* NOTE: MatGetColumnNorms() could simply be a macro that calls MatGetColumnReductions().
 92:    * I've kept this as a function because it allows slightly more in the way of error checking,
 93:    * erroring out if MatGetColumnNorms() is not called with a valid NormType. */

 95:   if (type == NORM_2 || type == NORM_1 || type == NORM_FROBENIUS || type == NORM_INFINITY || type == NORM_1_AND_2) {
 96:     MatGetColumnReductions(A,type,norms);
 97:   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
 98:   return 0;
 99: }

101: /*@
102:    MatGetColumnSumsRealPart - Gets the sums of the real part of each column of a sparse or dense matrix.

104:    Input Parameter:
105: .  A - the matrix

107:    Output Parameter:
108: .  sums - an array as large as the TOTAL number of columns in the matrix

110:    Level: intermediate

112:    Notes:
113:     Each process has ALL the column sums after the call. Because of the way this is computed each process gets all the values,
114:     if each process wants only some of the values it should extract the ones it wants from the array.

116: .seealso: MatGetColumnSumsImaginaryPart(), VecSum(), MatGetColumnMeans(), MatGetColumnNorms(), MatGetColumnReductions()

118: @*/
119: PetscErrorCode MatGetColumnSumsRealPart(Mat A,PetscReal sums[])
120: {
121:   MatGetColumnReductions(A,REDUCTION_SUM_REALPART,sums);
122:   return 0;
123: }

125: /*@
126:    MatGetColumnSumsImaginaryPart - Gets the sums of the imaginary part of each column of a sparse or dense matrix.

128:    Input Parameter:
129: .  A - the matrix

131:    Output Parameter:
132: .  sums - an array as large as the TOTAL number of columns in the matrix

134:    Level: intermediate

136:    Notes:
137:     Each process has ALL the column sums after the call. Because of the way this is computed each process gets all the values,
138:     if each process wants only some of the values it should extract the ones it wants from the array.

140: .seealso: MatGetColumnSumsRealPart(), VecSum(), MatGetColumnMeans(), MatGetColumnNorms(), MatGetColumnReductions()

142: @*/
143: PetscErrorCode MatGetColumnSumsImaginaryPart(Mat A,PetscReal sums[])
144: {
145:   MatGetColumnReductions(A,REDUCTION_SUM_IMAGINARYPART,sums);
146:   return 0;
147: }

149: /*@
150:    MatGetColumnSums - Gets the sums of each column of a sparse or dense matrix.

152:    Input Parameter:
153: .  A - the matrix

155:    Output Parameter:
156: .  sums - an array as large as the TOTAL number of columns in the matrix

158:    Level: intermediate

160:    Notes:
161:     Each process has ALL the column sums after the call. Because of the way this is computed each process gets all the values,
162:     if each process wants only some of the values it should extract the ones it wants from the array.

164: .seealso: VecSum(), MatGetColumnMeans(), MatGetColumnNorms(), MatGetColumnReductions()

166: @*/
167: PetscErrorCode MatGetColumnSums(Mat A,PetscScalar sums[])
168: {
169: #if defined(PETSC_USE_COMPLEX)
170:   PetscInt       i,n;
171:   PetscReal      *work;
172: #endif


175: #if !defined(PETSC_USE_COMPLEX)
176:   MatGetColumnSumsRealPart(A,sums);
177: #else
178:   MatGetSize(A,NULL,&n);
179:   PetscArrayzero(sums,n);
180:   PetscCalloc1(n,&work);
181:   MatGetColumnSumsRealPart(A,work);
182:   for (i=0; i<n; i++) sums[i] = work[i];
183:   MatGetColumnSumsImaginaryPart(A,work);
184:   for (i=0; i<n; i++) sums[i] += work[i]*PETSC_i;
185:   PetscFree(work);
186: #endif
187:   return 0;
188: }

190: /*@
191:    MatGetColumnMeansRealPart - Gets the arithmetic means of the real part of each column of a sparse or dense matrix.

193:    Input Parameter:
194: .  A - the matrix

196:    Output Parameter:
197: .  sums - an array as large as the TOTAL number of columns in the matrix

199:    Level: intermediate

201:    Notes:
202:     Each process has ALL the column means after the call. Because of the way this is computed each process gets all the values,
203:     if each process wants only some of the values it should extract the ones it wants from the array.

205: .seealso: MatGetColumnMeansImaginaryPart(), VecSum(), MatGetColumnSums(), MatGetColumnNorms(), MatGetColumnReductions()

207: @*/
208: PetscErrorCode MatGetColumnMeansRealPart(Mat A,PetscReal means[])
209: {
210:   MatGetColumnReductions(A,REDUCTION_MEAN_REALPART,means);
211:   return 0;
212: }

214: /*@
215:    MatGetColumnMeansImaginaryPart - Gets the arithmetic means of the imaginary part of each column of a sparse or dense matrix.

217:    Input Parameter:
218: .  A - the matrix

220:    Output Parameter:
221: .  sums - an array as large as the TOTAL number of columns in the matrix

223:    Level: intermediate

225:    Notes:
226:     Each process has ALL the column means after the call. Because of the way this is computed each process gets all the values,
227:     if each process wants only some of the values it should extract the ones it wants from the array.

229: .seealso: MatGetColumnMeansRealPart(), VecSum(), MatGetColumnSums(), MatGetColumnNorms(), MatGetColumnReductions()

231: @*/
232: PetscErrorCode MatGetColumnMeansImaginaryPart(Mat A,PetscReal means[])
233: {
234:   MatGetColumnReductions(A,REDUCTION_MEAN_IMAGINARYPART,means);
235:   return 0;
236: }

238: /*@
239:    MatGetColumnMeans - Gets the arithmetic means of each column of a sparse or dense matrix.

241:    Input Parameter:
242: .  A - the matrix

244:    Output Parameter:
245: .  means - an array as large as the TOTAL number of columns in the matrix

247:    Level: intermediate

249:    Notes:
250:     Each process has ALL the column means after the call. Because of the way this is computed each process gets all the values,
251:     if each process wants only some of the values it should extract the ones it wants from the array.

253: .seealso: VecSum(), MatGetColumnSums(), MatGetColumnNorms(), MatGetColumnReductions()

255: @*/
256: PetscErrorCode MatGetColumnMeans(Mat A,PetscScalar means[])
257: {
258: #if defined(PETSC_USE_COMPLEX)
259:   PetscInt       i,n;
260:   PetscReal      *work;
261: #endif


264: #if !defined(PETSC_USE_COMPLEX)
265:   MatGetColumnMeansRealPart(A,means);
266: #else
267:   MatGetSize(A,NULL,&n);
268:   PetscArrayzero(means,n);
269:   PetscCalloc1(n,&work);
270:   MatGetColumnMeansRealPart(A,work);
271:   for (i=0; i<n; i++) means[i] = work[i];
272:   MatGetColumnMeansImaginaryPart(A,work);
273:   for (i=0; i<n; i++) means[i] += work[i]*PETSC_i;
274:   PetscFree(work);
275: #endif
276:   return 0;
277: }

279: /*@
280:     MatGetColumnReductions - Gets the reductions of each column of a sparse or dense matrix.

282:   Input Parameters:
283: +  A - the matrix
284: -  type - A constant defined in NormType or ReductionType: NORM_2, NORM_1, NORM_INFINITY, REDUCTION_SUM_REALPART,
285:           REDUCTION_SUM_IMAGINARYPART, REDUCTION_MEAN_REALPART, REDUCTION_MEAN_IMAGINARYPART

287:   Output Parameter:
288: .  reductions - an array as large as the TOTAL number of columns in the matrix

290:    Level: developer

292:    Notes:
293:     Each process has ALL the column reductions after the call. Because of the way this is computed each process gets all the values,
294:     if each process wants only some of the values it should extract the ones it wants from the array.

296:   Developer Note:
297:     This routine is primarily intended as a back-end.
298:     MatGetColumnNorms(), MatGetColumnSums(), and MatGetColumnMeans() are implemented using this routine.

300: .seealso: ReductionType, NormType, MatGetColumnNorms(), MatGetColumnSums(), MatGetColumnMeans()

302: @*/
303: PetscErrorCode MatGetColumnReductions(Mat A,PetscInt type,PetscReal reductions[])
304: {
306:   if (A->ops->getcolumnreductions) {
307:     (*A->ops->getcolumnreductions)(A,type,reductions);
308:   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Not coded for this matrix type");
309:   return 0;
310: }