1c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/
2292f8084SBarry Smith
PFApply_Constant(void * value,PetscInt n,const PetscScalar * x,PetscScalar * y)3d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Constant(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y)
4d71ae5a4SJacob Faibussowitsch {
5292f8084SBarry Smith PetscInt i;
6292f8084SBarry Smith PetscScalar v = ((PetscScalar *)value)[0];
7292f8084SBarry Smith
8292f8084SBarry Smith PetscFunctionBegin;
9292f8084SBarry Smith n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]);
10f6e5521dSKarl Rupp for (i = 0; i < n; i++) y[i] = v;
113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
12292f8084SBarry Smith }
13292f8084SBarry Smith
PFApplyVec_Constant(void * value,Vec x,Vec y)14d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y)
15d71ae5a4SJacob Faibussowitsch {
16292f8084SBarry Smith PetscFunctionBegin;
179566063dSJacob Faibussowitsch PetscCall(VecSet(y, *((PetscScalar *)value)));
183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
19292f8084SBarry Smith }
20da8c939bSJacob Faibussowitsch
PFView_Constant(void * value,PetscViewer viewer)21da8c939bSJacob Faibussowitsch static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer)
22d71ae5a4SJacob Faibussowitsch {
23*9f196a02SMartin Diehl PetscBool isascii;
24292f8084SBarry Smith
25292f8084SBarry Smith PetscFunctionBegin;
26*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
27*9f196a02SMartin Diehl if (isascii) {
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 }
343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
35292f8084SBarry Smith }
36da8c939bSJacob Faibussowitsch
PFDestroy_Constant(void * value)37d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Constant(void *value)
38d71ae5a4SJacob Faibussowitsch {
39292f8084SBarry Smith PetscFunctionBegin;
409566063dSJacob Faibussowitsch PetscCall(PetscFree(value));
413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
42292f8084SBarry Smith }
43292f8084SBarry Smith
PFSetFromOptions_Constant(PF pf,PetscOptionItems PetscOptionsObject)44ce78bad3SBarry Smith static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems PetscOptionsObject)
45d71ae5a4SJacob Faibussowitsch {
46292f8084SBarry Smith PetscScalar *value = (PetscScalar *)pf->data;
47292f8084SBarry Smith
48292f8084SBarry Smith PetscFunctionBegin;
49d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options");
509566063dSJacob Faibussowitsch PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL));
51d0609cedSBarry Smith PetscOptionsHeadEnd();
523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
53292f8084SBarry Smith }
54292f8084SBarry Smith
PFCreate_Constant(PF pf,void * value)55da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Constant(PF pf, void *value)
56d71ae5a4SJacob Faibussowitsch {
57292f8084SBarry Smith PetscScalar *loc;
58292f8084SBarry Smith
59292f8084SBarry Smith PetscFunctionBegin;
609566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2, &loc));
61f6e5521dSKarl Rupp if (value) loc[0] = *(PetscScalar *)value;
62f6e5521dSKarl Rupp else loc[0] = 0.0;
63292f8084SBarry Smith loc[1] = pf->dimout;
649566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc));
65292f8084SBarry Smith
66292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Constant;
673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
68292f8084SBarry Smith }
69292f8084SBarry Smith
705c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/
716ac5842eSBarry Smith
PFCreate_Quick(PF pf,PetscErrorCode (* function)(void *,PetscInt,const PetscScalar *,PetscScalar *))72da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *))
73d71ae5a4SJacob Faibussowitsch {
74292f8084SBarry Smith PetscFunctionBegin;
759566063dSJacob Faibussowitsch PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL));
763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
77292f8084SBarry Smith }
78292f8084SBarry Smith
PFApply_Identity(void * value,PetscInt n,const PetscScalar * x,PetscScalar * y)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];
863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
87292f8084SBarry Smith }
88292f8084SBarry Smith
PFApplyVec_Identity(void * value,Vec x,Vec y)89d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y)
90d71ae5a4SJacob Faibussowitsch {
91292f8084SBarry Smith PetscFunctionBegin;
92da8c939bSJacob Faibussowitsch (void)value;
939566063dSJacob Faibussowitsch PetscCall(VecCopy(x, y));
943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
95292f8084SBarry Smith }
96da8c939bSJacob Faibussowitsch
PFView_Identity(void * value,PetscViewer viewer)97d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer)
98d71ae5a4SJacob Faibussowitsch {
99*9f196a02SMartin Diehl PetscBool isascii;
100292f8084SBarry Smith
101292f8084SBarry Smith PetscFunctionBegin;
102da8c939bSJacob Faibussowitsch (void)value;
103*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
104*9f196a02SMartin Diehl if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n"));
1053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
106292f8084SBarry Smith }
107da8c939bSJacob Faibussowitsch
PFDestroy_Identity(void * value)108d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Identity(void *value)
109d71ae5a4SJacob Faibussowitsch {
110292f8084SBarry Smith PetscFunctionBegin;
1119566063dSJacob Faibussowitsch PetscCall(PetscFree(value));
1123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
113292f8084SBarry Smith }
114292f8084SBarry Smith
PFCreate_Identity(PF pf,void * value)115da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value)
116d71ae5a4SJacob Faibussowitsch {
117292f8084SBarry Smith PetscInt *loc;
118292f8084SBarry Smith
119292f8084SBarry Smith PetscFunctionBegin;
120da8c939bSJacob Faibussowitsch (void)value;
12108401ef6SPierre 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);
1229566063dSJacob Faibussowitsch PetscCall(PetscNew(&loc));
123292f8084SBarry Smith loc[0] = pf->dimout;
1249566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc));
1253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
126292f8084SBarry Smith }
127