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