Actual source code: const.c
2: #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/
6: PetscErrorCode PFApply_Constant(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
7: {
8: PetscInt i;
9: PetscScalar v = ((PetscScalar*)value)[0];
12: n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]);
13: for (i=0; i<n; i++) {
14: y[i] = v;
15: }
16: return(0);
17: }
21: PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y)
22: {
25: VecSet(y,*((PetscScalar*)value));
26: return(0);
27: }
30: PetscErrorCode PFView_Constant(void *value,PetscViewer viewer)
31: {
33: PetscBool iascii;
36: PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
37: if (iascii) {
38: #if !defined(PETSC_USE_COMPLEX)
39: PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);
40: #else
41: PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));
42: #endif
43: }
44: return(0);
45: }
48: PetscErrorCode PFDestroy_Constant(void *value)
49: {
52: PetscFree(value);
53: return(0);
54: }
58: PetscErrorCode PFSetFromOptions_Constant(PF pf)
59: {
61: PetscScalar *value = (PetscScalar *)pf->data;
64: PetscOptionsHead("Constant function options");
65: PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);
66: PetscOptionsTail();
67: return(0);
68: }
73: PetscErrorCode PFCreate_Constant(PF pf,void *value)
74: {
76: PetscScalar *loc;
79: PetscMalloc(2*sizeof(PetscScalar),&loc);
80: if (value) loc[0] = *(PetscScalar*)value; else loc[0] = 0.0;
81: loc[1] = pf->dimout;
82: PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);
84: pf->ops->setfromoptions = PFSetFromOptions_Constant;
85: return(0);
86: }
94: PetscErrorCode PFCreate_Quick(PF pf,void *function)
95: {
99: PFSet(pf,(FCN)function,0,0,0,0);
100: return(0);
101: }
104: /* -------------------------------------------------------------------------------------------------------------------*/
107: PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
108: {
109: PetscInt i;
112: n *= *(PetscInt*)value;
113: for (i=0; i<n; i++) {
114: y[i] = x[i];
115: }
116: return(0);
117: }
121: PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y)
122: {
125: VecCopy(x,y);
126: return(0);
127: }
130: PetscErrorCode PFView_Identity(void *value,PetscViewer viewer)
131: {
133: PetscBool iascii;
136: PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
137: if (iascii) {
138: PetscViewerASCIIPrintf(viewer,"Identity function\n");
139: }
140: return(0);
141: }
144: PetscErrorCode PFDestroy_Identity(void *value)
145: {
148: PetscFree(value);
149: return(0);
150: }
155: PetscErrorCode PFCreate_Identity(PF pf,void *value)
156: {
158: PetscInt *loc;
161: if (pf->dimout != pf->dimin) {
162: 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);
163: }
164: PetscMalloc(sizeof(PetscInt),&loc);
165: loc[0] = pf->dimout;
166: PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);
167: return(0);
168: }