Actual source code: const.c
1: /*$Id: const.c,v 1.20 2001/08/07 03:05:08 balay Exp $*/
2: #include src/pf/pfimpl.h
6: int PFApply_Constant(void *value,int n,PetscScalar *x,PetscScalar *y)
7: {
8: int i;
9: PetscScalar v = ((PetscScalar*)value)[0];
12: n *= (int) PetscRealPart(((PetscScalar*)value)[1]);
13: for (i=0; i<n; i++) {
14: y[i] = v;
15: }
16: return(0);
17: }
21: int PFApplyVec_Constant(void *value,Vec x,Vec y)
22: {
25: VecSet((PetscScalar*)value,y);
26: return(0);
27: }
30: int PFView_Constant(void *value,PetscViewer viewer)
31: {
32: int ierr;
33: PetscTruth isascii;
36: PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);
37: if (isascii) {
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: int PFDestroy_Constant(void *value)
49: {
52: PetscFree(value);
53: return(0);
54: }
58: int PFSetFromOptions_Constant(PF pf)
59: {
60: int ierr;
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: }
70: EXTERN_C_BEGIN
73: int PFCreate_Constant(PF pf,void *value)
74: {
75: int ierr;
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: }
87: EXTERN_C_END
89: EXTERN_C_BEGIN
92: int PFCreate_Quick(PF pf,void *function)
93: {
94: int ierr;
98: PFSet(pf,(int (*)(void*,int,PetscScalar*,PetscScalar*))function,0,0,0,0);
99: return(0);
100: }
101: EXTERN_C_END
103: /* -------------------------------------------------------------------------------------------------------------------*/
106: int PFApply_Identity(void *value,int n,PetscScalar *x,PetscScalar *y)
107: {
108: int i;
111: n *= *(int*)value;
112: for (i=0; i<n; i++) {
113: y[i] = x[i];
114: }
115: return(0);
116: }
120: int PFApplyVec_Identity(void *value,Vec x,Vec y)
121: {
124: VecCopy(x,y);
125: return(0);
126: }
129: int PFView_Identity(void *value,PetscViewer viewer)
130: {
131: int ierr;
132: PetscTruth isascii;
135: PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);
136: if (isascii) {
137: PetscViewerASCIIPrintf(viewer,"Identity function\n");
138: }
139: return(0);
140: }
143: int PFDestroy_Identity(void *value)
144: {
147: PetscFree(value);
148: return(0);
149: }
151: EXTERN_C_BEGIN
154: int PFCreate_Identity(PF pf,void *value)
155: {
156: int ierr,*loc;
159: if (pf->dimout != pf->dimin) {
160: SETERRQ2(1,"Input dimension must match output dimension for Identity function, dimin = %d dimout = %d\n",pf->dimin,pf->dimout);
161: }
162: PetscMalloc(sizeof(int),&loc);
163: loc[0] = pf->dimout;
164: PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);
165: return(0);
166: }
167: EXTERN_C_END