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
4: int PFApply_Constant(void *value,int n,PetscScalar *x,PetscScalar *y)
5: {
6: int i;
7: PetscScalar v = ((PetscScalar*)value)[0];
10: n *= (int) PetscRealPart(((PetscScalar*)value)[1]);
11: for (i=0; i<n; i++) {
12: y[i] = v;
13: }
14: return(0);
15: }
17: int PFApplyVec_Constant(void *value,Vec x,Vec y)
18: {
21: VecSet((PetscScalar*)value,y);
22: return(0);
23: }
24: int PFView_Constant(void *value,PetscViewer viewer)
25: {
26: int ierr;
27: PetscTruth isascii;
30: PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);
31: if (isascii) {
32: #if !defined(PETSC_USE_COMPLEX)
33: PetscViewerASCIIPrintf(viewer,"Constant = %gn",*(double*)value);
34: #else
35: PetscViewerASCIIPrintf(viewer,"Constant = %g + %gin",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));
36: #endif
37: }
38: return(0);
39: }
40: int PFDestroy_Constant(void *value)
41: {
44: PetscFree(value);
45: return(0);
46: }
48: int PFSetFromOptions_Constant(PF pf)
49: {
50: int ierr;
51: PetscScalar *value = (PetscScalar *)pf->data;
54: PetscOptionsHead("Constant function options");
55: PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);
56: PetscOptionsTail();
57: return(0);
58: }
60: EXTERN_C_BEGIN
61: int PFCreate_Constant(PF pf,void *value)
62: {
63: int ierr;
64: PetscScalar *loc;
67: PetscMalloc(2*sizeof(PetscScalar),&loc);
68: if (value) loc[0] = *(PetscScalar*)value; else loc[0] = 0.0;
69: loc[1] = pf->dimout;
70: ierr = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);
72: pf->ops->setfromoptions = PFSetFromOptions_Constant;
73: return(0);
74: }
75: EXTERN_C_END
77: EXTERN_C_BEGIN
78: int PFCreate_Quick(PF pf,void *function)
79: {
80: int ierr;
84: PFSet(pf,(int (*)(void*,int,PetscScalar*,PetscScalar*))function,0,0,0,0);
85: return(0);
86: }
87: EXTERN_C_END
89: /* -------------------------------------------------------------------------------------------------------------------*/
90: int PFApply_Identity(void *value,int n,PetscScalar *x,PetscScalar *y)
91: {
92: int i;
95: n *= *(int*)value;
96: for (i=0; i<n; i++) {
97: y[i] = x[i];
98: }
99: return(0);
100: }
102: int PFApplyVec_Identity(void *value,Vec x,Vec y)
103: {
106: VecCopy(x,y);
107: return(0);
108: }
109: int PFView_Identity(void *value,PetscViewer viewer)
110: {
111: int ierr;
112: PetscTruth isascii;
115: PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);
116: if (isascii) {
117: PetscViewerASCIIPrintf(viewer,"Identity functionn");
118: }
119: return(0);
120: }
121: int PFDestroy_Identity(void *value)
122: {
125: PetscFree(value);
126: return(0);
127: }
129: EXTERN_C_BEGIN
130: int PFCreate_Identity(PF pf,void *value)
131: {
132: int ierr,*loc;
135: if (pf->dimout != pf->dimin) {
136: SETERRQ2(1,"Input dimension must match output dimension for Identity function, dimin = %d dimout = %dn",pf->dimin,pf->dimout);
137: }
138: PetscMalloc(sizeof(int),&loc);
139: loc[0] = pf->dimout;
140: ierr = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);
141: return(0);
142: }
143: EXTERN_C_END