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:   PetscInt    i;
  6:   PetscScalar v = ((PetscScalar *)value)[0];
  8:   PetscFunctionBegin;
  9:   n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]);
 10:   for (i = 0; i < n; i++) y[i] = v;
 11:   PetscFunctionReturn(PETSC_SUCCESS);
 12: }
 14: static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y)
 15: {
 16:   PetscFunctionBegin;
 17:   PetscCall(VecSet(y, *((PetscScalar *)value)));
 18:   PetscFunctionReturn(PETSC_SUCCESS);
 19: }
 21: static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer)
 22: {
 23:   PetscBool iascii;
 25:   PetscFunctionBegin;
 26:   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
 27:   if (iascii) {
 28: #if !defined(PETSC_USE_COMPLEX)
 29:     PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value));
 30: #else
 31:     PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value)));
 32: #endif
 33:   }
 34:   PetscFunctionReturn(PETSC_SUCCESS);
 35: }
 37: static PetscErrorCode PFDestroy_Constant(void *value)
 38: {
 39:   PetscFunctionBegin;
 40:   PetscCall(PetscFree(value));
 41:   PetscFunctionReturn(PETSC_SUCCESS);
 42: }
 44: static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems *PetscOptionsObject)
 45: {
 46:   PetscScalar *value = (PetscScalar *)pf->data;
 48:   PetscFunctionBegin;
 49:   PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options");
 50:   PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL));
 51:   PetscOptionsHeadEnd();
 52:   PetscFunctionReturn(PETSC_SUCCESS);
 53: }
 55: PETSC_INTERN PetscErrorCode PFCreate_Constant(PF pf, void *value)
 56: {
 57:   PetscScalar *loc;
 59:   PetscFunctionBegin;
 60:   PetscCall(PetscMalloc1(2, &loc));
 61:   if (value) loc[0] = *(PetscScalar *)value;
 62:   else loc[0] = 0.0;
 63:   loc[1] = pf->dimout;
 64:   PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc));
 66:   pf->ops->setfromoptions = PFSetFromOptions_Constant;
 67:   PetscFunctionReturn(PETSC_SUCCESS);
 68: }
 70: /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*);  force argument to next function to not be extern C*/
 72: PETSC_INTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *))
 73: {
 74:   PetscFunctionBegin;
 75:   PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL));
 76:   PetscFunctionReturn(PETSC_SUCCESS);
 77: }
 79: /* -------------------------------------------------------------------------------------------------------------------*/
 80: static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
 81: {
 82:   PetscInt i;
 84:   PetscFunctionBegin;
 85:   n *= *(PetscInt *)value;
 86:   for (i = 0; i < n; i++) y[i] = x[i];
 87:   PetscFunctionReturn(PETSC_SUCCESS);
 88: }
 90: static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
 91: {
 92:   PetscFunctionBegin;
 93:   (void)value;
 94:   PetscCall(VecCopy(x, y));
 95:   PetscFunctionReturn(PETSC_SUCCESS);
 96: }
 98: static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
 99: {
100:   PetscBool iascii;
102:   PetscFunctionBegin;
103:   (void)value;
104:   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
105:   if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n"));
106:   PetscFunctionReturn(PETSC_SUCCESS);
107: }
109: static PetscErrorCode PFDestroy_Identity(void *value)
110: {
111:   PetscFunctionBegin;
112:   PetscCall(PetscFree(value));
113:   PetscFunctionReturn(PETSC_SUCCESS);
114: }
116: PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
117: {
118:   PetscInt *loc;
120:   PetscFunctionBegin;
121:   (void)value;
122:   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);
123:   PetscCall(PetscNew(&loc));
124:   loc[0] = pf->dimout;
125:   PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc));
126:   PetscFunctionReturn(PETSC_SUCCESS);
127: }