Actual source code: const.c

  1: #include <../src/vec/pf/pfimpl.h>

  3: static PetscErrorCode PFApply_Constant(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
  4: {
  5:   PetscScalar v = ((PetscScalar *)value)[0];

  7:   PetscFunctionBegin;
  8:   n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]);
  9:   for (PetscInt i = 0; i < n; i++) y[i] = v;
 10:   PetscFunctionReturn(PETSC_SUCCESS);
 11: }

 13: static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y)
 14: {
 15:   PetscFunctionBegin;
 16:   PetscCall(VecSet(y, *((PetscScalar *)value)));
 17:   PetscFunctionReturn(PETSC_SUCCESS);
 18: }

 20: static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer)
 21: {
 22:   PetscBool isascii;

 24:   PetscFunctionBegin;
 25:   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
 26:   if (isascii) {
 27: #if !defined(PETSC_USE_COMPLEX)
 28:     PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value));
 29: #else
 30:     PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value)));
 31: #endif
 32:   }
 33:   PetscFunctionReturn(PETSC_SUCCESS);
 34: }

 36: static PetscErrorCode PFDestroy_Constant(void *value)
 37: {
 38:   PetscFunctionBegin;
 39:   PetscCall(PetscFree(value));
 40:   PetscFunctionReturn(PETSC_SUCCESS);
 41: }

 43: static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems PetscOptionsObject)
 44: {
 45:   PetscScalar *value = (PetscScalar *)pf->data;

 47:   PetscFunctionBegin;
 48:   PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options");
 49:   PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL));
 50:   PetscOptionsHeadEnd();
 51:   PetscFunctionReturn(PETSC_SUCCESS);
 52: }

 54: PETSC_INTERN PetscErrorCode PFCreate_Constant(PF pf, void *value)
 55: {
 56:   PetscScalar *loc;

 58:   PetscFunctionBegin;
 59:   PetscCall(PetscMalloc1(2, &loc));
 60:   if (value) loc[0] = *(PetscScalar *)value;
 61:   else loc[0] = 0.0;
 62:   loc[1] = pf->dimout;
 63:   PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc));

 65:   pf->ops->setfromoptions = PFSetFromOptions_Constant;
 66:   PetscFunctionReturn(PETSC_SUCCESS);
 67: }

 69: /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*);  force argument to next function to not be extern C*/

 71: PETSC_INTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *))
 72: {
 73:   PetscFunctionBegin;
 74:   PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL));
 75:   PetscFunctionReturn(PETSC_SUCCESS);
 76: }

 78: static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
 79: {
 80:   PetscFunctionBegin;
 81:   n *= *(PetscInt *)value;
 82:   for (PetscInt i = 0; i < n; i++) y[i] = x[i];
 83:   PetscFunctionReturn(PETSC_SUCCESS);
 84: }

 86: static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
 87: {
 88:   PetscFunctionBegin;
 89:   (void)value;
 90:   PetscCall(VecCopy(x, y));
 91:   PetscFunctionReturn(PETSC_SUCCESS);
 92: }

 94: static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
 95: {
 96:   PetscBool isascii;

 98:   PetscFunctionBegin;
 99:   (void)value;
100:   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
101:   if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n"));
102:   PetscFunctionReturn(PETSC_SUCCESS);
103: }

105: static PetscErrorCode PFDestroy_Identity(void *value)
106: {
107:   PetscFunctionBegin;
108:   PetscCall(PetscFree(value));
109:   PetscFunctionReturn(PETSC_SUCCESS);
110: }

112: PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
113: {
114:   PetscInt *loc;

116:   PetscFunctionBegin;
117:   (void)value;
118:   PetscCheck(pf->dimout == pf->dimin, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Input dimension must match output dimension for Identity function, dimin = %" PetscInt_FMT " dimout = %" PetscInt_FMT, pf->dimin, pf->dimout);
119:   PetscCall(PetscNew(&loc));
120:   loc[0] = pf->dimout;
121:   PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc));
122:   PetscFunctionReturn(PETSC_SUCCESS);
123: }