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: }