Actual source code: const.c


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

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

  9:   n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]);
 10:   for (i = 0; i < n; i++) y[i] = v;
 11:   return 0;
 12: }

 14: static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y)
 15: {
 16:   VecSet(y, *((PetscScalar *)value));
 17:   return 0;
 18: }
 19: PetscErrorCode PFView_Constant(void *value, PetscViewer viewer)
 20: {
 21:   PetscBool iascii;

 23:   PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii);
 24:   if (iascii) {
 25: #if !defined(PETSC_USE_COMPLEX)
 26:     PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value);
 27: #else
 28:     PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value));
 29: #endif
 30:   }
 31:   return 0;
 32: }
 33: static PetscErrorCode PFDestroy_Constant(void *value)
 34: {
 35:   PetscFree(value);
 36:   return 0;
 37: }

 39: static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems *PetscOptionsObject)
 40: {
 41:   PetscScalar *value = (PetscScalar *)pf->data;

 43:   PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options");
 44:   PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL);
 45:   PetscOptionsHeadEnd();
 46:   return 0;
 47: }

 49: PETSC_EXTERN PetscErrorCode PFCreate_Constant(PF pf, void *value)
 50: {
 51:   PetscScalar *loc;

 53:   PetscMalloc1(2, &loc);
 54:   if (value) loc[0] = *(PetscScalar *)value;
 55:   else loc[0] = 0.0;
 56:   loc[1] = pf->dimout;
 57:   PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc);

 59:   pf->ops->setfromoptions = PFSetFromOptions_Constant;
 60:   return 0;
 61: }

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

 65: PETSC_EXTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *))
 66: {
 67:   PFSet(pf, function, NULL, NULL, NULL, NULL);
 68:   return 0;
 69: }

 71: /* -------------------------------------------------------------------------------------------------------------------*/
 72: static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
 73: {
 74:   PetscInt i;

 76:   n *= *(PetscInt *)value;
 77:   for (i = 0; i < n; i++) y[i] = x[i];
 78:   return 0;
 79: }

 81: static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
 82: {
 83:   VecCopy(x, y);
 84:   return 0;
 85: }
 86: static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
 87: {
 88:   PetscBool iascii;

 90:   PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii);
 91:   if (iascii) PetscViewerASCIIPrintf(viewer, "Identity function\n");
 92:   return 0;
 93: }
 94: static PetscErrorCode PFDestroy_Identity(void *value)
 95: {
 96:   PetscFree(value);
 97:   return 0;
 98: }

100: PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
101: {
102:   PetscInt *loc;

105:   PetscNew(&loc);
106:   loc[0] = pf->dimout;
107:   PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc);
108:   return 0;
109: }