Actual source code: const.c

  2: #include <../src/vec/pf/pfimpl.h>            /*I "petscpf.h" I*/

  6: PetscErrorCode PFApply_Constant(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
  7: {
  8:   PetscInt    i;
  9:   PetscScalar v = ((PetscScalar*)value)[0];

 12:   n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]);
 13:   for (i=0; i<n; i++) {
 14:     y[i] = v;
 15:   }
 16:   return(0);
 17: }

 21: PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y)
 22: {
 25:   VecSet(y,*((PetscScalar*)value));
 26:   return(0);
 27: }
 30: PetscErrorCode PFView_Constant(void *value,PetscViewer viewer)
 31: {
 33:   PetscBool      iascii;

 36:   PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
 37:   if (iascii) {
 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: PetscErrorCode PFDestroy_Constant(void *value)
 49: {
 52:   PetscFree(value);
 53:   return(0);
 54: }

 58: PetscErrorCode PFSetFromOptions_Constant(PF pf)
 59: {
 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: }

 73: PetscErrorCode  PFCreate_Constant(PF pf,void *value)
 74: {
 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: }


 94: PetscErrorCode  PFCreate_Quick(PF pf,void *function)
 95: {

 99:   PFSet(pf,(FCN)function,0,0,0,0);
100:   return(0);
101: }

104: /* -------------------------------------------------------------------------------------------------------------------*/
107: PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
108: {
109:   PetscInt    i;

112:   n *= *(PetscInt*)value;
113:   for (i=0; i<n; i++) {
114:     y[i] = x[i];
115:   }
116:   return(0);
117: }

121: PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y)
122: {
125:   VecCopy(x,y);
126:   return(0);
127: }
130: PetscErrorCode PFView_Identity(void *value,PetscViewer viewer)
131: {
133:   PetscBool      iascii;

136:   PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
137:   if (iascii) {
138:     PetscViewerASCIIPrintf(viewer,"Identity function\n");
139:   }
140:   return(0);
141: }
144: PetscErrorCode PFDestroy_Identity(void *value)
145: {
148:   PetscFree(value);
149:   return(0);
150: }

155: PetscErrorCode  PFCreate_Identity(PF pf,void *value)
156: {
158:   PetscInt       *loc;

161:   if (pf->dimout != pf->dimin) {
162:     SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Input dimension must match output dimension for Identity function, dimin = %D dimout = %D\n",pf->dimin,pf->dimout);
163:   }
164:   PetscMalloc(sizeof(PetscInt),&loc);
165:   loc[0] = pf->dimout;
166:   PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);
167:   return(0);
168: }