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