xref: /petsc/src/vec/pf/impls/constant/const.c (revision 7c4f633dc6bb6149cca88d301ead35a99e103cbb)
10c735eedSKris Buschelman #define PETSCVEC_DLL
2292f8084SBarry Smith 
3*7c4f633dSBarry Smith #include "../src/vec/pf/pfimpl.h"            /*I "petscpf.h" I*/
4292f8084SBarry Smith 
5292f8084SBarry Smith #undef __FUNCT__
6292f8084SBarry Smith #define __FUNCT__ "PFApply_Constant"
7292f8084SBarry Smith PetscErrorCode PFApply_Constant(void *value,PetscInt n,PetscScalar *x,PetscScalar *y)
8292f8084SBarry Smith {
9292f8084SBarry Smith   PetscInt    i;
10292f8084SBarry Smith   PetscScalar v = ((PetscScalar*)value)[0];
11292f8084SBarry Smith 
12292f8084SBarry Smith   PetscFunctionBegin;
13292f8084SBarry Smith   n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]);
14292f8084SBarry Smith   for (i=0; i<n; i++) {
15292f8084SBarry Smith     y[i] = v;
16292f8084SBarry Smith   }
17292f8084SBarry Smith   PetscFunctionReturn(0);
18292f8084SBarry Smith }
19292f8084SBarry Smith 
20292f8084SBarry Smith #undef __FUNCT__
21292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Constant"
22292f8084SBarry Smith PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y)
23292f8084SBarry Smith {
24292f8084SBarry Smith   PetscErrorCode ierr;
25292f8084SBarry Smith   PetscFunctionBegin;
262dcb1b2aSMatthew Knepley   ierr = VecSet(y,*((PetscScalar*)value));CHKERRQ(ierr);
27292f8084SBarry Smith   PetscFunctionReturn(0);
28292f8084SBarry Smith }
29292f8084SBarry Smith #undef __FUNCT__
30292f8084SBarry Smith #define __FUNCT__ "PFView_Constant"
31292f8084SBarry Smith PetscErrorCode PFView_Constant(void *value,PetscViewer viewer)
32292f8084SBarry Smith {
33292f8084SBarry Smith   PetscErrorCode ierr;
34292f8084SBarry Smith   PetscTruth     iascii;
35292f8084SBarry Smith 
36292f8084SBarry Smith   PetscFunctionBegin;
37292f8084SBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
38292f8084SBarry Smith   if (iascii) {
39292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX)
40292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);CHKERRQ(ierr);
41292f8084SBarry Smith #else
42292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));CHKERRQ(ierr);
43292f8084SBarry Smith #endif
44292f8084SBarry Smith   }
45292f8084SBarry Smith   PetscFunctionReturn(0);
46292f8084SBarry Smith }
47292f8084SBarry Smith #undef __FUNCT__
48292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Constant"
49292f8084SBarry Smith PetscErrorCode PFDestroy_Constant(void *value)
50292f8084SBarry Smith {
51292f8084SBarry Smith   PetscErrorCode ierr;
52292f8084SBarry Smith   PetscFunctionBegin;
53292f8084SBarry Smith   ierr = PetscFree(value);CHKERRQ(ierr);
54292f8084SBarry Smith   PetscFunctionReturn(0);
55292f8084SBarry Smith }
56292f8084SBarry Smith 
57292f8084SBarry Smith #undef __FUNCT__
58292f8084SBarry Smith #define __FUNCT__ "PFSetFromOptions_Constant"
59292f8084SBarry Smith PetscErrorCode PFSetFromOptions_Constant(PF pf)
60292f8084SBarry Smith {
61292f8084SBarry Smith   PetscErrorCode ierr;
62292f8084SBarry Smith   PetscScalar    *value = (PetscScalar *)pf->data;
63292f8084SBarry Smith 
64292f8084SBarry Smith   PetscFunctionBegin;
65292f8084SBarry Smith   ierr = PetscOptionsHead("Constant function options");CHKERRQ(ierr);
66292f8084SBarry Smith     ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);CHKERRQ(ierr);
67292f8084SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
68292f8084SBarry Smith   PetscFunctionReturn(0);
69292f8084SBarry Smith }
70292f8084SBarry Smith 
71292f8084SBarry Smith EXTERN_C_BEGIN
72292f8084SBarry Smith #undef __FUNCT__
73292f8084SBarry Smith #define __FUNCT__ "PFCreate_Constant"
740c735eedSKris Buschelman PetscErrorCode PETSCVEC_DLLEXPORT PFCreate_Constant(PF pf,void *value)
75292f8084SBarry Smith {
76292f8084SBarry Smith   PetscErrorCode ierr;
77292f8084SBarry Smith   PetscScalar    *loc;
78292f8084SBarry Smith 
79292f8084SBarry Smith   PetscFunctionBegin;
80292f8084SBarry Smith   ierr = PetscMalloc(2*sizeof(PetscScalar),&loc);CHKERRQ(ierr);
81292f8084SBarry Smith   if (value) loc[0] = *(PetscScalar*)value; else loc[0] = 0.0;
82292f8084SBarry Smith   loc[1] = pf->dimout;
83292f8084SBarry Smith   ierr   = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr);
84292f8084SBarry Smith 
85292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Constant;
86292f8084SBarry Smith   PetscFunctionReturn(0);
87292f8084SBarry Smith }
88292f8084SBarry Smith EXTERN_C_END
89292f8084SBarry Smith 
90292f8084SBarry Smith 
91292f8084SBarry Smith typedef PetscErrorCode (*FCN)(void*,PetscInt,PetscScalar*,PetscScalar*); /* force argument to next function to not be extern C*/
92292f8084SBarry Smith EXTERN_C_BEGIN
93292f8084SBarry Smith #undef __FUNCT__
94292f8084SBarry Smith #define __FUNCT__ "PFCreate_Quick"
950c735eedSKris Buschelman PetscErrorCode PETSCVEC_DLLEXPORT PFCreate_Quick(PF pf,void *function)
96292f8084SBarry Smith {
97292f8084SBarry Smith   PetscErrorCode ierr;
98292f8084SBarry Smith 
99292f8084SBarry Smith   PetscFunctionBegin;
100292f8084SBarry Smith   ierr = PFSet(pf,(FCN)function,0,0,0,0);CHKERRQ(ierr);
101292f8084SBarry Smith   PetscFunctionReturn(0);
102292f8084SBarry Smith }
103292f8084SBarry Smith EXTERN_C_END
104292f8084SBarry Smith 
105292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/
106292f8084SBarry Smith #undef __FUNCT__
107292f8084SBarry Smith #define __FUNCT__ "PFApply_Identity"
108292f8084SBarry Smith PetscErrorCode PFApply_Identity(void *value,PetscInt n,PetscScalar *x,PetscScalar *y)
109292f8084SBarry Smith {
110292f8084SBarry Smith   PetscInt    i;
111292f8084SBarry Smith 
112292f8084SBarry Smith   PetscFunctionBegin;
113292f8084SBarry Smith   n *= *(PetscInt*)value;
114292f8084SBarry Smith   for (i=0; i<n; i++) {
115292f8084SBarry Smith     y[i] = x[i];
116292f8084SBarry Smith   }
117292f8084SBarry Smith   PetscFunctionReturn(0);
118292f8084SBarry Smith }
119292f8084SBarry Smith 
120292f8084SBarry Smith #undef __FUNCT__
121292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Identity"
122292f8084SBarry Smith PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y)
123292f8084SBarry Smith {
124292f8084SBarry Smith   PetscErrorCode ierr;
125292f8084SBarry Smith   PetscFunctionBegin;
126292f8084SBarry Smith   ierr = VecCopy(x,y);CHKERRQ(ierr);
127292f8084SBarry Smith   PetscFunctionReturn(0);
128292f8084SBarry Smith }
129292f8084SBarry Smith #undef __FUNCT__
130292f8084SBarry Smith #define __FUNCT__ "PFView_Identity"
131292f8084SBarry Smith PetscErrorCode PFView_Identity(void *value,PetscViewer viewer)
132292f8084SBarry Smith {
133292f8084SBarry Smith   PetscErrorCode ierr;
134292f8084SBarry Smith   PetscTruth     iascii;
135292f8084SBarry Smith 
136292f8084SBarry Smith   PetscFunctionBegin;
137292f8084SBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
138292f8084SBarry Smith   if (iascii) {
139292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr);
140292f8084SBarry Smith   }
141292f8084SBarry Smith   PetscFunctionReturn(0);
142292f8084SBarry Smith }
143292f8084SBarry Smith #undef __FUNCT__
144292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Identity"
145292f8084SBarry Smith PetscErrorCode PFDestroy_Identity(void *value)
146292f8084SBarry Smith {
147292f8084SBarry Smith   PetscErrorCode ierr;
148292f8084SBarry Smith   PetscFunctionBegin;
149292f8084SBarry Smith   ierr = PetscFree(value);CHKERRQ(ierr);
150292f8084SBarry Smith   PetscFunctionReturn(0);
151292f8084SBarry Smith }
152292f8084SBarry Smith 
153292f8084SBarry Smith EXTERN_C_BEGIN
154292f8084SBarry Smith #undef __FUNCT__
155292f8084SBarry Smith #define __FUNCT__ "PFCreate_Identity"
1560c735eedSKris Buschelman PetscErrorCode PETSCVEC_DLLEXPORT PFCreate_Identity(PF pf,void *value)
157292f8084SBarry Smith {
158292f8084SBarry Smith   PetscErrorCode ierr;
159292f8084SBarry Smith   PetscInt       *loc;
160292f8084SBarry Smith 
161292f8084SBarry Smith   PetscFunctionBegin;
162292f8084SBarry Smith   if (pf->dimout != pf->dimin) {
16377431f27SBarry Smith     SETERRQ2(PETSC_ERR_ARG_SIZ,"Input dimension must match output dimension for Identity function, dimin = %D dimout = %D\n",pf->dimin,pf->dimout);
164292f8084SBarry Smith   }
165292f8084SBarry Smith   ierr = PetscMalloc(sizeof(PetscInt),&loc);CHKERRQ(ierr);
166292f8084SBarry Smith   loc[0] = pf->dimout;
167292f8084SBarry Smith   ierr   = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr);
168292f8084SBarry Smith   PetscFunctionReturn(0);
169292f8084SBarry Smith }
170292f8084SBarry Smith EXTERN_C_END
171