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: PetscFunctionBegin;
10: n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]);
11: for (i = 0; i < n; i++) y[i] = v;
12: PetscFunctionReturn(PETSC_SUCCESS);
13: }
15: static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y)
16: {
17: PetscFunctionBegin;
18: PetscCall(VecSet(y, *((PetscScalar *)value)));
19: PetscFunctionReturn(PETSC_SUCCESS);
20: }
21: 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: }
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_EXTERN 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_EXTERN 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: /* -------------------------------------------------------------------------------------------------------------------*/
79: static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
80: {
81: PetscInt i;
83: PetscFunctionBegin;
84: n *= *(PetscInt *)value;
85: for (i = 0; i < n; i++) y[i] = x[i];
86: PetscFunctionReturn(PETSC_SUCCESS);
87: }
89: static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
90: {
91: PetscFunctionBegin;
92: PetscCall(VecCopy(x, y));
93: PetscFunctionReturn(PETSC_SUCCESS);
94: }
95: static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
96: {
97: PetscBool iascii;
99: PetscFunctionBegin;
100: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
101: if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n"));
102: PetscFunctionReturn(PETSC_SUCCESS);
103: }
104: static PetscErrorCode PFDestroy_Identity(void *value)
105: {
106: PetscFunctionBegin;
107: PetscCall(PetscFree(value));
108: PetscFunctionReturn(PETSC_SUCCESS);
109: }
111: PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
112: {
113: PetscInt *loc;
115: PetscFunctionBegin;
116: 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);
117: PetscCall(PetscNew(&loc));
118: loc[0] = pf->dimout;
119: PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc));
120: PetscFunctionReturn(PETSC_SUCCESS);
121: }