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: PetscScalar v = ((PetscScalar *)value)[0];
7: PetscFunctionBegin;
8: n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]);
9: for (PetscInt i = 0; i < n; i++) y[i] = v;
10: PetscFunctionReturn(PETSC_SUCCESS);
11: }
13: static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y)
14: {
15: PetscFunctionBegin;
16: PetscCall(VecSet(y, *((PetscScalar *)value)));
17: PetscFunctionReturn(PETSC_SUCCESS);
18: }
20: static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer)
21: {
22: PetscBool isascii;
24: PetscFunctionBegin;
25: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
26: if (isascii) {
27: #if !defined(PETSC_USE_COMPLEX)
28: PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value));
29: #else
30: PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value)));
31: #endif
32: }
33: PetscFunctionReturn(PETSC_SUCCESS);
34: }
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_INTERN 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_INTERN 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: static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
79: {
80: PetscFunctionBegin;
81: n *= *(PetscInt *)value;
82: for (PetscInt i = 0; i < n; i++) y[i] = x[i];
83: PetscFunctionReturn(PETSC_SUCCESS);
84: }
86: static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
87: {
88: PetscFunctionBegin;
89: (void)value;
90: PetscCall(VecCopy(x, y));
91: PetscFunctionReturn(PETSC_SUCCESS);
92: }
94: static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
95: {
96: PetscBool isascii;
98: PetscFunctionBegin;
99: (void)value;
100: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
101: if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n"));
102: PetscFunctionReturn(PETSC_SUCCESS);
103: }
105: static PetscErrorCode PFDestroy_Identity(void *value)
106: {
107: PetscFunctionBegin;
108: PetscCall(PetscFree(value));
109: PetscFunctionReturn(PETSC_SUCCESS);
110: }
112: PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
113: {
114: PetscInt *loc;
116: PetscFunctionBegin;
117: (void)value;
118: 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);
119: PetscCall(PetscNew(&loc));
120: loc[0] = pf->dimout;
121: PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc));
122: PetscFunctionReturn(PETSC_SUCCESS);
123: }