xref: /petsc/src/vec/pf/impls/constant/const.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
1292f8084SBarry Smith 
2c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h>            /*I "petscpf.h" I*/
3292f8084SBarry Smith 
4e0877f53SBarry Smith static PetscErrorCode PFApply_Constant(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
5292f8084SBarry Smith {
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;
12292f8084SBarry Smith   PetscFunctionReturn(0);
13292f8084SBarry Smith }
14292f8084SBarry Smith 
15e0877f53SBarry Smith static PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y)
16292f8084SBarry Smith {
17292f8084SBarry Smith   PetscErrorCode ierr;
185fd66863SKarl Rupp 
19292f8084SBarry Smith   PetscFunctionBegin;
202dcb1b2aSMatthew Knepley   ierr = VecSet(y,*((PetscScalar*)value));CHKERRQ(ierr);
21292f8084SBarry Smith   PetscFunctionReturn(0);
22292f8084SBarry Smith }
23292f8084SBarry Smith PetscErrorCode PFView_Constant(void *value,PetscViewer viewer)
24292f8084SBarry Smith {
25292f8084SBarry Smith   PetscErrorCode ierr;
26ace3abfcSBarry Smith   PetscBool      iascii;
27292f8084SBarry Smith 
28292f8084SBarry Smith   PetscFunctionBegin;
29251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
30292f8084SBarry Smith   if (iascii) {
31292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX)
32292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);CHKERRQ(ierr);
33292f8084SBarry Smith #else
34292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));CHKERRQ(ierr);
35292f8084SBarry Smith #endif
36292f8084SBarry Smith   }
37292f8084SBarry Smith   PetscFunctionReturn(0);
38292f8084SBarry Smith }
39e0877f53SBarry Smith static PetscErrorCode PFDestroy_Constant(void *value)
40292f8084SBarry Smith {
41292f8084SBarry Smith   PetscErrorCode ierr;
425fd66863SKarl Rupp 
43292f8084SBarry Smith   PetscFunctionBegin;
44292f8084SBarry Smith   ierr = PetscFree(value);CHKERRQ(ierr);
45292f8084SBarry Smith   PetscFunctionReturn(0);
46292f8084SBarry Smith }
47292f8084SBarry Smith 
48e0877f53SBarry Smith static PetscErrorCode PFSetFromOptions_Constant(PetscOptionItems *PetscOptionsObject,PF pf)
49292f8084SBarry Smith {
50292f8084SBarry Smith   PetscErrorCode ierr;
51292f8084SBarry Smith   PetscScalar    *value = (PetscScalar*)pf->data;
52292f8084SBarry Smith 
53292f8084SBarry Smith   PetscFunctionBegin;
54e55864a3SBarry Smith   ierr = PetscOptionsHead(PetscOptionsObject,"Constant function options");CHKERRQ(ierr);
554c8fdceaSLisandro Dalcin   ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,NULL);CHKERRQ(ierr);
56292f8084SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
57292f8084SBarry Smith   PetscFunctionReturn(0);
58292f8084SBarry Smith }
59292f8084SBarry Smith 
608cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PFCreate_Constant(PF pf,void *value)
61292f8084SBarry Smith {
62292f8084SBarry Smith   PetscErrorCode ierr;
63292f8084SBarry Smith   PetscScalar    *loc;
64292f8084SBarry Smith 
65292f8084SBarry Smith   PetscFunctionBegin;
66785e854fSJed Brown   ierr = PetscMalloc1(2,&loc);CHKERRQ(ierr);
67f6e5521dSKarl Rupp   if (value) loc[0] = *(PetscScalar*)value;
68f6e5521dSKarl Rupp   else loc[0] = 0.0;
69292f8084SBarry Smith   loc[1] = pf->dimout;
70292f8084SBarry Smith   ierr   = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr);
71292f8084SBarry Smith 
72292f8084SBarry Smith   pf->ops->setfromoptions = PFSetFromOptions_Constant;
73292f8084SBarry Smith   PetscFunctionReturn(0);
74292f8084SBarry Smith }
75292f8084SBarry Smith 
765c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*);  force argument to next function to not be extern C*/
776ac5842eSBarry Smith 
788cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PFCreate_Quick(PF pf,PetscErrorCode (*function)(void*,PetscInt,const PetscScalar*,PetscScalar*))
79292f8084SBarry Smith {
80292f8084SBarry Smith   PetscErrorCode ierr;
81292f8084SBarry Smith 
82292f8084SBarry Smith   PetscFunctionBegin;
834c8fdceaSLisandro Dalcin   ierr = PFSet(pf,function,NULL,NULL,NULL,NULL);CHKERRQ(ierr);
84292f8084SBarry Smith   PetscFunctionReturn(0);
85292f8084SBarry Smith }
86292f8084SBarry Smith 
87292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/
88e0877f53SBarry Smith static PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
89292f8084SBarry Smith {
90292f8084SBarry Smith   PetscInt i;
91292f8084SBarry Smith 
92292f8084SBarry Smith   PetscFunctionBegin;
93292f8084SBarry Smith   n *= *(PetscInt*)value;
94f6e5521dSKarl Rupp   for (i=0; i<n; i++) y[i] = x[i];
95292f8084SBarry Smith   PetscFunctionReturn(0);
96292f8084SBarry Smith }
97292f8084SBarry Smith 
98e0877f53SBarry Smith static PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y)
99292f8084SBarry Smith {
100292f8084SBarry Smith   PetscErrorCode ierr;
1015fd66863SKarl Rupp 
102292f8084SBarry Smith   PetscFunctionBegin;
103292f8084SBarry Smith   ierr = VecCopy(x,y);CHKERRQ(ierr);
104292f8084SBarry Smith   PetscFunctionReturn(0);
105292f8084SBarry Smith }
106e0877f53SBarry Smith static PetscErrorCode PFView_Identity(void *value,PetscViewer viewer)
107292f8084SBarry Smith {
108292f8084SBarry Smith   PetscErrorCode ierr;
109ace3abfcSBarry Smith   PetscBool      iascii;
110292f8084SBarry Smith 
111292f8084SBarry Smith   PetscFunctionBegin;
112251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
113292f8084SBarry Smith   if (iascii) {
114292f8084SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr);
115292f8084SBarry Smith   }
116292f8084SBarry Smith   PetscFunctionReturn(0);
117292f8084SBarry Smith }
118e0877f53SBarry Smith static PetscErrorCode PFDestroy_Identity(void *value)
119292f8084SBarry Smith {
120292f8084SBarry Smith   PetscErrorCode ierr;
1215fd66863SKarl Rupp 
122292f8084SBarry Smith   PetscFunctionBegin;
123292f8084SBarry Smith   ierr = PetscFree(value);CHKERRQ(ierr);
124292f8084SBarry Smith   PetscFunctionReturn(0);
125292f8084SBarry Smith }
126292f8084SBarry Smith 
1278cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf,void *value)
128292f8084SBarry Smith {
129292f8084SBarry Smith   PetscErrorCode ierr;
130292f8084SBarry Smith   PetscInt       *loc;
131292f8084SBarry Smith 
132292f8084SBarry Smith   PetscFunctionBegin;
133*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(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);
13495dccacaSBarry Smith   ierr   = PetscNew(&loc);CHKERRQ(ierr);
135292f8084SBarry Smith   loc[0] = pf->dimout;
136292f8084SBarry Smith   ierr   = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr);
137292f8084SBarry Smith   PetscFunctionReturn(0);
138292f8084SBarry Smith }
139