1 #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/
2
PFApply_Constant(void * value,PetscInt n,const PetscScalar * x,PetscScalar * y)3 static PetscErrorCode PFApply_Constant(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
4 {
5 PetscInt i;
6 PetscScalar v = ((PetscScalar *)value)[0];
7
8 PetscFunctionBegin;
9 n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]);
10 for (i = 0; i < n; i++) y[i] = v;
11 PetscFunctionReturn(PETSC_SUCCESS);
12 }
13
PFApplyVec_Constant(void * value,Vec x,Vec y)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 }
20
PFView_Constant(void * value,PetscViewer viewer)21 static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer)
22 {
23 PetscBool isascii;
24
25 PetscFunctionBegin;
26 PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
27 if (isascii) {
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
PFDestroy_Constant(void * value)37 static PetscErrorCode PFDestroy_Constant(void *value)
38 {
39 PetscFunctionBegin;
40 PetscCall(PetscFree(value));
41 PetscFunctionReturn(PETSC_SUCCESS);
42 }
43
PFSetFromOptions_Constant(PF pf,PetscOptionItems PetscOptionsObject)44 static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems PetscOptionsObject)
45 {
46 PetscScalar *value = (PetscScalar *)pf->data;
47
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 }
54
PFCreate_Constant(PF pf,void * value)55 PETSC_INTERN PetscErrorCode PFCreate_Constant(PF pf, void *value)
56 {
57 PetscScalar *loc;
58
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));
65
66 pf->ops->setfromoptions = PFSetFromOptions_Constant;
67 PetscFunctionReturn(PETSC_SUCCESS);
68 }
69
70 /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/
71
PFCreate_Quick(PF pf,PetscErrorCode (* function)(void *,PetscInt,const PetscScalar *,PetscScalar *))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 }
78
PFApply_Identity(void * value,PetscInt n,const PetscScalar * x,PetscScalar * y)79 static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
80 {
81 PetscInt i;
82
83 PetscFunctionBegin;
84 n *= *(PetscInt *)value;
85 for (i = 0; i < n; i++) y[i] = x[i];
86 PetscFunctionReturn(PETSC_SUCCESS);
87 }
88
PFApplyVec_Identity(void * value,Vec x,Vec y)89 static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
90 {
91 PetscFunctionBegin;
92 (void)value;
93 PetscCall(VecCopy(x, y));
94 PetscFunctionReturn(PETSC_SUCCESS);
95 }
96
PFView_Identity(void * value,PetscViewer viewer)97 static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
98 {
99 PetscBool isascii;
100
101 PetscFunctionBegin;
102 (void)value;
103 PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
104 if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n"));
105 PetscFunctionReturn(PETSC_SUCCESS);
106 }
107
PFDestroy_Identity(void * value)108 static PetscErrorCode PFDestroy_Identity(void *value)
109 {
110 PetscFunctionBegin;
111 PetscCall(PetscFree(value));
112 PetscFunctionReturn(PETSC_SUCCESS);
113 }
114
PFCreate_Identity(PF pf,void * value)115 PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
116 {
117 PetscInt *loc;
118
119 PetscFunctionBegin;
120 (void)value;
121 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);
122 PetscCall(PetscNew(&loc));
123 loc[0] = pf->dimout;
124 PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc));
125 PetscFunctionReturn(PETSC_SUCCESS);
126 }
127