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