xref: /petsc/src/vec/pf/impls/constant/const.c (revision 5fd668637986a8d8518383a9159eebc368e1d5b4)
1292f8084SBarry Smith 
2c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h>            /*I "petscpf.h" I*/
3292f8084SBarry Smith 
4292f8084SBarry Smith #undef __FUNCT__
5292f8084SBarry Smith #define __FUNCT__ "PFApply_Constant"
6dd394643SJed Brown PetscErrorCode PFApply_Constant(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
7292f8084SBarry Smith {
8292f8084SBarry Smith   PetscInt    i;
9292f8084SBarry Smith   PetscScalar v = ((PetscScalar*)value)[0];
10292f8084SBarry Smith 
11292f8084SBarry Smith   PetscFunctionBegin;
12292f8084SBarry Smith   n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]);
13292f8084SBarry Smith   for (i=0; i<n; i++) {
14292f8084SBarry Smith     y[i] = v;
15292f8084SBarry Smith   }
16292f8084SBarry Smith   PetscFunctionReturn(0);
17292f8084SBarry Smith }
18292f8084SBarry Smith 
19292f8084SBarry Smith #undef __FUNCT__
20292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Constant"
21292f8084SBarry Smith PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y)
22292f8084SBarry Smith {
23292f8084SBarry Smith   PetscErrorCode ierr;
24*5fd66863SKarl Rupp 
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;
34ace3abfcSBarry Smith   PetscBool      iascii;
35292f8084SBarry Smith 
36292f8084SBarry Smith   PetscFunctionBegin;
37251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&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;
52*5fd66863SKarl Rupp 
53292f8084SBarry Smith   PetscFunctionBegin;
54292f8084SBarry Smith   ierr = PetscFree(value);CHKERRQ(ierr);
55292f8084SBarry Smith   PetscFunctionReturn(0);
56292f8084SBarry Smith }
57292f8084SBarry Smith 
58292f8084SBarry Smith #undef __FUNCT__
59292f8084SBarry Smith #define __FUNCT__ "PFSetFromOptions_Constant"
60292f8084SBarry Smith PetscErrorCode PFSetFromOptions_Constant(PF pf)
61292f8084SBarry Smith {
62292f8084SBarry Smith   PetscErrorCode ierr;
63292f8084SBarry Smith   PetscScalar    *value = (PetscScalar *)pf->data;
64292f8084SBarry Smith 
65292f8084SBarry Smith   PetscFunctionBegin;
66292f8084SBarry Smith   ierr = PetscOptionsHead("Constant function options");CHKERRQ(ierr);
67292f8084SBarry Smith     ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);CHKERRQ(ierr);
68292f8084SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
69292f8084SBarry Smith   PetscFunctionReturn(0);
70292f8084SBarry Smith }
71292f8084SBarry Smith 
72292f8084SBarry Smith EXTERN_C_BEGIN
73292f8084SBarry Smith #undef __FUNCT__
74292f8084SBarry Smith #define __FUNCT__ "PFCreate_Constant"
757087cfbeSBarry Smith PetscErrorCode  PFCreate_Constant(PF pf,void *value)
76292f8084SBarry Smith {
77292f8084SBarry Smith   PetscErrorCode ierr;
78292f8084SBarry Smith   PetscScalar    *loc;
79292f8084SBarry Smith 
80292f8084SBarry Smith   PetscFunctionBegin;
81292f8084SBarry Smith   ierr = PetscMalloc(2*sizeof(PetscScalar),&loc);CHKERRQ(ierr);
82292f8084SBarry Smith   if (value) loc[0] = *(PetscScalar*)value; else loc[0] = 0.0;
83292f8084SBarry Smith   loc[1] = pf->dimout;
84292f8084SBarry Smith   ierr   = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr);
85292f8084SBarry Smith 
86292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Constant;
87292f8084SBarry Smith   PetscFunctionReturn(0);
88292f8084SBarry Smith }
89292f8084SBarry Smith EXTERN_C_END
90292f8084SBarry Smith 
91292f8084SBarry Smith 
925c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*);  force argument to next function to not be extern C*/
93292f8084SBarry Smith EXTERN_C_BEGIN
94292f8084SBarry Smith #undef __FUNCT__
95292f8084SBarry Smith #define __FUNCT__ "PFCreate_Quick"
965c8f6a95SKarl Rupp PetscErrorCode  PFCreate_Quick(PF pf,PetscErrorCode (*function)(void*,PetscInt,const PetscScalar*,PetscScalar*))
97292f8084SBarry Smith {
98292f8084SBarry Smith   PetscErrorCode ierr;
99292f8084SBarry Smith 
100292f8084SBarry Smith   PetscFunctionBegin;
1015c8f6a95SKarl Rupp   ierr = PFSet(pf,function,0,0,0,0);CHKERRQ(ierr);
102292f8084SBarry Smith   PetscFunctionReturn(0);
103292f8084SBarry Smith }
104292f8084SBarry Smith EXTERN_C_END
105292f8084SBarry Smith 
106292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/
107292f8084SBarry Smith #undef __FUNCT__
108292f8084SBarry Smith #define __FUNCT__ "PFApply_Identity"
109dd394643SJed Brown PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
110292f8084SBarry Smith {
111292f8084SBarry Smith   PetscInt    i;
112292f8084SBarry Smith 
113292f8084SBarry Smith   PetscFunctionBegin;
114292f8084SBarry Smith   n *= *(PetscInt*)value;
115292f8084SBarry Smith   for (i=0; i<n; i++) {
116292f8084SBarry Smith     y[i] = x[i];
117292f8084SBarry Smith   }
118292f8084SBarry Smith   PetscFunctionReturn(0);
119292f8084SBarry Smith }
120292f8084SBarry Smith 
121292f8084SBarry Smith #undef __FUNCT__
122292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Identity"
123292f8084SBarry Smith PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y)
124292f8084SBarry Smith {
125292f8084SBarry Smith   PetscErrorCode ierr;
126*5fd66863SKarl Rupp 
127292f8084SBarry Smith   PetscFunctionBegin;
128292f8084SBarry Smith   ierr = VecCopy(x,y);CHKERRQ(ierr);
129292f8084SBarry Smith   PetscFunctionReturn(0);
130292f8084SBarry Smith }
131292f8084SBarry Smith #undef __FUNCT__
132292f8084SBarry Smith #define __FUNCT__ "PFView_Identity"
133292f8084SBarry Smith PetscErrorCode PFView_Identity(void *value,PetscViewer viewer)
134292f8084SBarry Smith {
135292f8084SBarry Smith   PetscErrorCode ierr;
136ace3abfcSBarry Smith   PetscBool      iascii;
137292f8084SBarry Smith 
138292f8084SBarry Smith   PetscFunctionBegin;
139251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
140292f8084SBarry Smith   if (iascii) {
141292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr);
142292f8084SBarry Smith   }
143292f8084SBarry Smith   PetscFunctionReturn(0);
144292f8084SBarry Smith }
145292f8084SBarry Smith #undef __FUNCT__
146292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Identity"
147292f8084SBarry Smith PetscErrorCode PFDestroy_Identity(void *value)
148292f8084SBarry Smith {
149292f8084SBarry Smith   PetscErrorCode ierr;
150*5fd66863SKarl Rupp 
151292f8084SBarry Smith   PetscFunctionBegin;
152292f8084SBarry Smith   ierr = PetscFree(value);CHKERRQ(ierr);
153292f8084SBarry Smith   PetscFunctionReturn(0);
154292f8084SBarry Smith }
155292f8084SBarry Smith 
156292f8084SBarry Smith EXTERN_C_BEGIN
157292f8084SBarry Smith #undef __FUNCT__
158292f8084SBarry Smith #define __FUNCT__ "PFCreate_Identity"
1597087cfbeSBarry Smith PetscErrorCode  PFCreate_Identity(PF pf,void *value)
160292f8084SBarry Smith {
161292f8084SBarry Smith   PetscErrorCode ierr;
162292f8084SBarry Smith   PetscInt       *loc;
163292f8084SBarry Smith 
164292f8084SBarry Smith   PetscFunctionBegin;
165292f8084SBarry Smith   if (pf->dimout != pf->dimin) {
166e32f2f54SBarry Smith     SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Input dimension must match output dimension for Identity function, dimin = %D dimout = %D\n",pf->dimin,pf->dimout);
167292f8084SBarry Smith   }
168292f8084SBarry Smith   ierr = PetscMalloc(sizeof(PetscInt),&loc);CHKERRQ(ierr);
169292f8084SBarry Smith   loc[0] = pf->dimout;
170292f8084SBarry Smith   ierr   = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr);
171292f8084SBarry Smith   PetscFunctionReturn(0);
172292f8084SBarry Smith }
173292f8084SBarry Smith EXTERN_C_END
174