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
90: typedef int (*FCN)(void*,int,PetscScalar*,PetscScalar*); /* force argument to next function to not be extern C*/
91: EXTERN_C_BEGIN
94: int PFCreate_Quick(PF pf,void *function)
95: {
96: int ierr;
100: PFSet(pf,(FCN)function,0,0,0,0);
101: return(0);
102: }
103: EXTERN_C_END
105: /* -------------------------------------------------------------------------------------------------------------------*/
108: int PFApply_Identity(void *value,int n,PetscScalar *x,PetscScalar *y)
109: {
110: int i;
113: n *= *(int*)value;
114: for (i=0; i<n; i++) {
115: y[i] = x[i];
116: }
117: return(0);
118: }
122: int PFApplyVec_Identity(void *value,Vec x,Vec y)
123: {
126: VecCopy(x,y);
127: return(0);
128: }
131: int PFView_Identity(void *value,PetscViewer viewer)
132: {
133: int ierr;
134: PetscTruth isascii;
137: PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);
138: if (isascii) {
139: PetscViewerASCIIPrintf(viewer,"Identity function\n");
140: }
141: return(0);
142: }
145: int PFDestroy_Identity(void *value)
146: {
149: PetscFree(value);
150: return(0);
151: }
153: EXTERN_C_BEGIN
156: int PFCreate_Identity(PF pf,void *value)
157: {
158: int ierr,*loc;
161: if (pf->dimout != pf->dimin) {
162: SETERRQ2(1,"Input dimension must match output dimension for Identity function, dimin = %d dimout = %d\n",pf->dimin,pf->dimout);
163: }
164: PetscMalloc(sizeof(int),&loc);
165: loc[0] = pf->dimout;
166: PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);
167: return(0);
168: }
169: EXTERN_C_END