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