xref: /petsc/src/vec/pf/impls/constant/const.c (revision 3ba1676111f5c958fe6c2729b46ca4d523958bb3)
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;
12*3ba16761SJacob 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)));
19*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20292f8084SBarry Smith }
21d71ae5a4SJacob Faibussowitsch PetscErrorCode PFView_Constant(void *value, PetscViewer viewer)
22d71ae5a4SJacob Faibussowitsch {
23ace3abfcSBarry Smith   PetscBool iascii;
24292f8084SBarry Smith 
25292f8084SBarry Smith   PetscFunctionBegin;
269566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
27292f8084SBarry Smith   if (iascii) {
28292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX)
299566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value));
30292f8084SBarry Smith #else
312a3335c0SJose E. Roman     PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value)));
32292f8084SBarry Smith #endif
33292f8084SBarry Smith   }
34*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
35292f8084SBarry Smith }
36d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Constant(void *value)
37d71ae5a4SJacob Faibussowitsch {
38292f8084SBarry Smith   PetscFunctionBegin;
399566063dSJacob Faibussowitsch   PetscCall(PetscFree(value));
40*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
41292f8084SBarry Smith }
42292f8084SBarry Smith 
43d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems *PetscOptionsObject)
44d71ae5a4SJacob Faibussowitsch {
45292f8084SBarry Smith   PetscScalar *value = (PetscScalar *)pf->data;
46292f8084SBarry Smith 
47292f8084SBarry Smith   PetscFunctionBegin;
48d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options");
499566063dSJacob Faibussowitsch   PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL));
50d0609cedSBarry Smith   PetscOptionsHeadEnd();
51*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
52292f8084SBarry Smith }
53292f8084SBarry Smith 
54d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PFCreate_Constant(PF pf, void *value)
55d71ae5a4SJacob Faibussowitsch {
56292f8084SBarry Smith   PetscScalar *loc;
57292f8084SBarry Smith 
58292f8084SBarry Smith   PetscFunctionBegin;
599566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(2, &loc));
60f6e5521dSKarl Rupp   if (value) loc[0] = *(PetscScalar *)value;
61f6e5521dSKarl Rupp   else loc[0] = 0.0;
62292f8084SBarry Smith   loc[1] = pf->dimout;
639566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc));
64292f8084SBarry Smith 
65292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Constant;
66*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
67292f8084SBarry Smith }
68292f8084SBarry Smith 
695c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*);  force argument to next function to not be extern C*/
706ac5842eSBarry Smith 
71d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *))
72d71ae5a4SJacob Faibussowitsch {
73292f8084SBarry Smith   PetscFunctionBegin;
749566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL));
75*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
76292f8084SBarry Smith }
77292f8084SBarry Smith 
78292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/
79d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
80d71ae5a4SJacob Faibussowitsch {
81292f8084SBarry Smith   PetscInt i;
82292f8084SBarry Smith 
83292f8084SBarry Smith   PetscFunctionBegin;
84292f8084SBarry Smith   n *= *(PetscInt *)value;
85f6e5521dSKarl Rupp   for (i = 0; i < n; i++) y[i] = x[i];
86*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
87292f8084SBarry Smith }
88292f8084SBarry Smith 
89d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
90d71ae5a4SJacob Faibussowitsch {
91292f8084SBarry Smith   PetscFunctionBegin;
929566063dSJacob Faibussowitsch   PetscCall(VecCopy(x, y));
93*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
94292f8084SBarry Smith }
95d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
96d71ae5a4SJacob Faibussowitsch {
97ace3abfcSBarry Smith   PetscBool iascii;
98292f8084SBarry Smith 
99292f8084SBarry Smith   PetscFunctionBegin;
1009566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
10148a46eb9SPierre Jolivet   if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n"));
102*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
103292f8084SBarry Smith }
104d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Identity(void *value)
105d71ae5a4SJacob Faibussowitsch {
106292f8084SBarry Smith   PetscFunctionBegin;
1079566063dSJacob Faibussowitsch   PetscCall(PetscFree(value));
108*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
109292f8084SBarry Smith }
110292f8084SBarry Smith 
111d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
112d71ae5a4SJacob Faibussowitsch {
113292f8084SBarry Smith   PetscInt *loc;
114292f8084SBarry Smith 
115292f8084SBarry Smith   PetscFunctionBegin;
11608401ef6SPierre 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);
1179566063dSJacob Faibussowitsch   PetscCall(PetscNew(&loc));
118292f8084SBarry Smith   loc[0] = pf->dimout;
1199566063dSJacob Faibussowitsch   PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc));
120*3ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
121292f8084SBarry Smith }
122