xref: /petsc/src/vec/pf/impls/constant/const.c (revision 292f8084fb157dadf9a2ae26c5bd14368ed7ffcb)
1*292f8084SBarry Smith 
2*292f8084SBarry Smith #include "src/pf/pfimpl.h"            /*I "petscpf.h" I*/
3*292f8084SBarry Smith 
4*292f8084SBarry Smith #undef __FUNCT__
5*292f8084SBarry Smith #define __FUNCT__ "PFApply_Constant"
6*292f8084SBarry Smith PetscErrorCode PFApply_Constant(void *value,PetscInt n,PetscScalar *x,PetscScalar *y)
7*292f8084SBarry Smith {
8*292f8084SBarry Smith   PetscInt    i;
9*292f8084SBarry Smith   PetscScalar v = ((PetscScalar*)value)[0];
10*292f8084SBarry Smith 
11*292f8084SBarry Smith   PetscFunctionBegin;
12*292f8084SBarry Smith   n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]);
13*292f8084SBarry Smith   for (i=0; i<n; i++) {
14*292f8084SBarry Smith     y[i] = v;
15*292f8084SBarry Smith   }
16*292f8084SBarry Smith   PetscFunctionReturn(0);
17*292f8084SBarry Smith }
18*292f8084SBarry Smith 
19*292f8084SBarry Smith #undef __FUNCT__
20*292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Constant"
21*292f8084SBarry Smith PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y)
22*292f8084SBarry Smith {
23*292f8084SBarry Smith   PetscErrorCode ierr;
24*292f8084SBarry Smith   PetscFunctionBegin;
25*292f8084SBarry Smith   ierr = VecSet((PetscScalar*)value,y);CHKERRQ(ierr);
26*292f8084SBarry Smith   PetscFunctionReturn(0);
27*292f8084SBarry Smith }
28*292f8084SBarry Smith #undef __FUNCT__
29*292f8084SBarry Smith #define __FUNCT__ "PFView_Constant"
30*292f8084SBarry Smith PetscErrorCode PFView_Constant(void *value,PetscViewer viewer)
31*292f8084SBarry Smith {
32*292f8084SBarry Smith   PetscErrorCode ierr;
33*292f8084SBarry Smith   PetscTruth iascii;
34*292f8084SBarry Smith 
35*292f8084SBarry Smith   PetscFunctionBegin;
36*292f8084SBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
37*292f8084SBarry Smith   if (iascii) {
38*292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX)
39*292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);CHKERRQ(ierr);
40*292f8084SBarry Smith #else
41*292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));CHKERRQ(ierr);
42*292f8084SBarry Smith #endif
43*292f8084SBarry Smith   }
44*292f8084SBarry Smith   PetscFunctionReturn(0);
45*292f8084SBarry Smith }
46*292f8084SBarry Smith #undef __FUNCT__
47*292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Constant"
48*292f8084SBarry Smith PetscErrorCode PFDestroy_Constant(void *value)
49*292f8084SBarry Smith {
50*292f8084SBarry Smith   PetscErrorCode ierr;
51*292f8084SBarry Smith   PetscFunctionBegin;
52*292f8084SBarry Smith   ierr = PetscFree(value);CHKERRQ(ierr);
53*292f8084SBarry Smith   PetscFunctionReturn(0);
54*292f8084SBarry Smith }
55*292f8084SBarry Smith 
56*292f8084SBarry Smith #undef __FUNCT__
57*292f8084SBarry Smith #define __FUNCT__ "PFSetFromOptions_Constant"
58*292f8084SBarry Smith PetscErrorCode PFSetFromOptions_Constant(PF pf)
59*292f8084SBarry Smith {
60*292f8084SBarry Smith   PetscErrorCode ierr;
61*292f8084SBarry Smith   PetscScalar  *value = (PetscScalar *)pf->data;
62*292f8084SBarry Smith 
63*292f8084SBarry Smith   PetscFunctionBegin;
64*292f8084SBarry Smith   ierr = PetscOptionsHead("Constant function options");CHKERRQ(ierr);
65*292f8084SBarry Smith     ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);CHKERRQ(ierr);
66*292f8084SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
67*292f8084SBarry Smith   PetscFunctionReturn(0);
68*292f8084SBarry Smith }
69*292f8084SBarry Smith 
70*292f8084SBarry Smith EXTERN_C_BEGIN
71*292f8084SBarry Smith #undef __FUNCT__
72*292f8084SBarry Smith #define __FUNCT__ "PFCreate_Constant"
73*292f8084SBarry Smith PetscErrorCode PFCreate_Constant(PF pf,void *value)
74*292f8084SBarry Smith {
75*292f8084SBarry Smith   PetscErrorCode ierr;
76*292f8084SBarry Smith   PetscScalar *loc;
77*292f8084SBarry Smith 
78*292f8084SBarry Smith   PetscFunctionBegin;
79*292f8084SBarry Smith   ierr = PetscMalloc(2*sizeof(PetscScalar),&loc);CHKERRQ(ierr);
80*292f8084SBarry Smith   if (value) loc[0] = *(PetscScalar*)value; else loc[0] = 0.0;
81*292f8084SBarry Smith   loc[1] = pf->dimout;
82*292f8084SBarry Smith   ierr   = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr);
83*292f8084SBarry Smith 
84*292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Constant;
85*292f8084SBarry Smith   PetscFunctionReturn(0);
86*292f8084SBarry Smith }
87*292f8084SBarry Smith EXTERN_C_END
88*292f8084SBarry Smith 
89*292f8084SBarry Smith 
90*292f8084SBarry Smith typedef PetscErrorCode (*FCN)(void*,PetscInt,PetscScalar*,PetscScalar*); /* force argument to next function to not be extern C*/
91*292f8084SBarry Smith EXTERN_C_BEGIN
92*292f8084SBarry Smith #undef __FUNCT__
93*292f8084SBarry Smith #define __FUNCT__ "PFCreate_Quick"
94*292f8084SBarry Smith PetscErrorCode PFCreate_Quick(PF pf,void *function)
95*292f8084SBarry Smith {
96*292f8084SBarry Smith   PetscErrorCode ierr;
97*292f8084SBarry Smith 
98*292f8084SBarry Smith   PetscFunctionBegin;
99*292f8084SBarry Smith   ierr = PFSet(pf,(FCN)function,0,0,0,0);CHKERRQ(ierr);
100*292f8084SBarry Smith   PetscFunctionReturn(0);
101*292f8084SBarry Smith }
102*292f8084SBarry Smith EXTERN_C_END
103*292f8084SBarry Smith 
104*292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/
105*292f8084SBarry Smith #undef __FUNCT__
106*292f8084SBarry Smith #define __FUNCT__ "PFApply_Identity"
107*292f8084SBarry Smith PetscErrorCode PFApply_Identity(void *value,PetscInt n,PetscScalar *x,PetscScalar *y)
108*292f8084SBarry Smith {
109*292f8084SBarry Smith   PetscInt    i;
110*292f8084SBarry Smith 
111*292f8084SBarry Smith   PetscFunctionBegin;
112*292f8084SBarry Smith   n *= *(PetscInt*)value;
113*292f8084SBarry Smith   for (i=0; i<n; i++) {
114*292f8084SBarry Smith     y[i] = x[i];
115*292f8084SBarry Smith   }
116*292f8084SBarry Smith   PetscFunctionReturn(0);
117*292f8084SBarry Smith }
118*292f8084SBarry Smith 
119*292f8084SBarry Smith #undef __FUNCT__
120*292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Identity"
121*292f8084SBarry Smith PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y)
122*292f8084SBarry Smith {
123*292f8084SBarry Smith   PetscErrorCode ierr;
124*292f8084SBarry Smith   PetscFunctionBegin;
125*292f8084SBarry Smith   ierr = VecCopy(x,y);CHKERRQ(ierr);
126*292f8084SBarry Smith   PetscFunctionReturn(0);
127*292f8084SBarry Smith }
128*292f8084SBarry Smith #undef __FUNCT__
129*292f8084SBarry Smith #define __FUNCT__ "PFView_Identity"
130*292f8084SBarry Smith PetscErrorCode PFView_Identity(void *value,PetscViewer viewer)
131*292f8084SBarry Smith {
132*292f8084SBarry Smith   PetscErrorCode ierr;
133*292f8084SBarry Smith   PetscTruth iascii;
134*292f8084SBarry Smith 
135*292f8084SBarry Smith   PetscFunctionBegin;
136*292f8084SBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
137*292f8084SBarry Smith   if (iascii) {
138*292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr);
139*292f8084SBarry Smith   }
140*292f8084SBarry Smith   PetscFunctionReturn(0);
141*292f8084SBarry Smith }
142*292f8084SBarry Smith #undef __FUNCT__
143*292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Identity"
144*292f8084SBarry Smith PetscErrorCode PFDestroy_Identity(void *value)
145*292f8084SBarry Smith {
146*292f8084SBarry Smith   PetscErrorCode ierr;
147*292f8084SBarry Smith   PetscFunctionBegin;
148*292f8084SBarry Smith   ierr = PetscFree(value);CHKERRQ(ierr);
149*292f8084SBarry Smith   PetscFunctionReturn(0);
150*292f8084SBarry Smith }
151*292f8084SBarry Smith 
152*292f8084SBarry Smith EXTERN_C_BEGIN
153*292f8084SBarry Smith #undef __FUNCT__
154*292f8084SBarry Smith #define __FUNCT__ "PFCreate_Identity"
155*292f8084SBarry Smith PetscErrorCode PFCreate_Identity(PF pf,void *value)
156*292f8084SBarry Smith {
157*292f8084SBarry Smith   PetscErrorCode ierr;
158*292f8084SBarry Smith   PetscInt *loc;
159*292f8084SBarry Smith 
160*292f8084SBarry Smith   PetscFunctionBegin;
161*292f8084SBarry Smith   if (pf->dimout != pf->dimin) {
162*292f8084SBarry Smith     SETERRQ2(1,"Input dimension must match output dimension for Identity function, dimin = %d dimout = %d\n",pf->dimin,pf->dimout);
163*292f8084SBarry Smith   }
164*292f8084SBarry Smith   ierr = PetscMalloc(sizeof(PetscInt),&loc);CHKERRQ(ierr);
165*292f8084SBarry Smith   loc[0] = pf->dimout;
166*292f8084SBarry Smith   ierr   = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr);
167*292f8084SBarry Smith   PetscFunctionReturn(0);
168*292f8084SBarry Smith }
169*292f8084SBarry Smith EXTERN_C_END
170