xref: /petsc/src/vec/pf/impls/constant/const.c (revision da8c939b118068a1ceac5e4b3ba271c87cfc5bc7)
1292f8084SBarry Smith 
2c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/
3292f8084SBarry Smith 
4d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Constant(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
5d71ae5a4SJacob Faibussowitsch {
6292f8084SBarry Smith   PetscInt    i;
7292f8084SBarry Smith   PetscScalar v = ((PetscScalar *)value)[0];
8292f8084SBarry Smith 
9292f8084SBarry Smith   PetscFunctionBegin;
10292f8084SBarry Smith   n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]);
11f6e5521dSKarl Rupp   for (i = 0; i < n; i++) y[i] = v;
123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13292f8084SBarry Smith }
14292f8084SBarry Smith 
15d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y)
16d71ae5a4SJacob Faibussowitsch {
17292f8084SBarry Smith   PetscFunctionBegin;
189566063dSJacob Faibussowitsch   PetscCall(VecSet(y, *((PetscScalar *)value)));
193ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20292f8084SBarry Smith }
21*da8c939bSJacob Faibussowitsch 
22*da8c939bSJacob Faibussowitsch static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer)
23d71ae5a4SJacob Faibussowitsch {
24ace3abfcSBarry Smith   PetscBool iascii;
25292f8084SBarry Smith 
26292f8084SBarry Smith   PetscFunctionBegin;
279566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
28292f8084SBarry Smith   if (iascii) {
29292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX)
309566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value));
31292f8084SBarry Smith #else
322a3335c0SJose E. Roman     PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value)));
33292f8084SBarry Smith #endif
34292f8084SBarry Smith   }
353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
36292f8084SBarry Smith }
37*da8c939bSJacob Faibussowitsch 
38d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Constant(void *value)
39d71ae5a4SJacob Faibussowitsch {
40292f8084SBarry Smith   PetscFunctionBegin;
419566063dSJacob Faibussowitsch   PetscCall(PetscFree(value));
423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
43292f8084SBarry Smith }
44292f8084SBarry Smith 
45d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems *PetscOptionsObject)
46d71ae5a4SJacob Faibussowitsch {
47292f8084SBarry Smith   PetscScalar *value = (PetscScalar *)pf->data;
48292f8084SBarry Smith 
49292f8084SBarry Smith   PetscFunctionBegin;
50d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options");
519566063dSJacob Faibussowitsch   PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL));
52d0609cedSBarry Smith   PetscOptionsHeadEnd();
533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
54292f8084SBarry Smith }
55292f8084SBarry Smith 
56*da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Constant(PF pf, void *value)
57d71ae5a4SJacob Faibussowitsch {
58292f8084SBarry Smith   PetscScalar *loc;
59292f8084SBarry Smith 
60292f8084SBarry Smith   PetscFunctionBegin;
619566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(2, &loc));
62f6e5521dSKarl Rupp   if (value) loc[0] = *(PetscScalar *)value;
63f6e5521dSKarl Rupp   else loc[0] = 0.0;
64292f8084SBarry Smith   loc[1] = pf->dimout;
659566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc));
66292f8084SBarry Smith 
67292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Constant;
683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
69292f8084SBarry Smith }
70292f8084SBarry Smith 
715c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*);  force argument to next function to not be extern C*/
726ac5842eSBarry Smith 
73*da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *))
74d71ae5a4SJacob Faibussowitsch {
75292f8084SBarry Smith   PetscFunctionBegin;
769566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL));
773ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
78292f8084SBarry Smith }
79292f8084SBarry Smith 
80292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/
81d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
82d71ae5a4SJacob Faibussowitsch {
83292f8084SBarry Smith   PetscInt i;
84292f8084SBarry Smith 
85292f8084SBarry Smith   PetscFunctionBegin;
86292f8084SBarry Smith   n *= *(PetscInt *)value;
87f6e5521dSKarl Rupp   for (i = 0; i < n; i++) y[i] = x[i];
883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
89292f8084SBarry Smith }
90292f8084SBarry Smith 
91d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
92d71ae5a4SJacob Faibussowitsch {
93292f8084SBarry Smith   PetscFunctionBegin;
94*da8c939bSJacob Faibussowitsch   (void)value;
959566063dSJacob Faibussowitsch   PetscCall(VecCopy(x, y));
963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
97292f8084SBarry Smith }
98*da8c939bSJacob Faibussowitsch 
99d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
100d71ae5a4SJacob Faibussowitsch {
101ace3abfcSBarry Smith   PetscBool iascii;
102292f8084SBarry Smith 
103292f8084SBarry Smith   PetscFunctionBegin;
104*da8c939bSJacob Faibussowitsch   (void)value;
1059566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
10648a46eb9SPierre Jolivet   if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n"));
1073ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
108292f8084SBarry Smith }
109*da8c939bSJacob Faibussowitsch 
110d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Identity(void *value)
111d71ae5a4SJacob Faibussowitsch {
112292f8084SBarry Smith   PetscFunctionBegin;
1139566063dSJacob Faibussowitsch   PetscCall(PetscFree(value));
1143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
115292f8084SBarry Smith }
116292f8084SBarry Smith 
117*da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
118d71ae5a4SJacob Faibussowitsch {
119292f8084SBarry Smith   PetscInt *loc;
120292f8084SBarry Smith 
121292f8084SBarry Smith   PetscFunctionBegin;
122*da8c939bSJacob Faibussowitsch   (void)value;
12308401ef6SPierre Jolivet   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);
1249566063dSJacob Faibussowitsch   PetscCall(PetscNew(&loc));
125292f8084SBarry Smith   loc[0] = pf->dimout;
1269566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc));
1273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
128292f8084SBarry Smith }
129