Actual source code: const.c

petsc-3.7.3 2016-08-01
Report Typos and Errors
  2: #include <../src/vec/pf/pfimpl.h>            /*I "petscpf.h" I*/

  6: static 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++) y[i] = v;
 14:   return(0);
 15: }

 19: static PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y)
 20: {

 24:   VecSet(y,*((PetscScalar*)value));
 25:   return(0);
 26: }
 29: PetscErrorCode PFView_Constant(void *value,PetscViewer viewer)
 30: {
 32:   PetscBool      iascii;

 35:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
 36:   if (iascii) {
 37: #if !defined(PETSC_USE_COMPLEX)
 38:     PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);
 39: #else
 40:     PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));
 41: #endif
 42:   }
 43:   return(0);
 44: }
 47: static PetscErrorCode PFDestroy_Constant(void *value)
 48: {

 52:   PetscFree(value);
 53:   return(0);
 54: }

 58: static PetscErrorCode PFSetFromOptions_Constant(PetscOptionItems *PetscOptionsObject,PF pf)
 59: {
 61:   PetscScalar    *value = (PetscScalar*)pf->data;

 64:   PetscOptionsHead(PetscOptionsObject,"Constant function options");
 65:   PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);
 66:   PetscOptionsTail();
 67:   return(0);
 68: }

 72: PETSC_EXTERN PetscErrorCode PFCreate_Constant(PF pf,void *value)
 73: {
 75:   PetscScalar    *loc;

 78:   PetscMalloc1(2,&loc);
 79:   if (value) loc[0] = *(PetscScalar*)value;
 80:   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: }

 88: /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*);  force argument to next function to not be extern C*/

 92: PETSC_EXTERN PetscErrorCode PFCreate_Quick(PF pf,PetscErrorCode (*function)(void*,PetscInt,const PetscScalar*,PetscScalar*))
 93: {

 97:   PFSet(pf,function,0,0,0,0);
 98:   return(0);
 99: }

101: /* -------------------------------------------------------------------------------------------------------------------*/
104: static PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y)
105: {
106:   PetscInt i;

109:   n *= *(PetscInt*)value;
110:   for (i=0; i<n; i++) y[i] = x[i];
111:   return(0);
112: }

116: static PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y)
117: {

121:   VecCopy(x,y);
122:   return(0);
123: }
126: static PetscErrorCode PFView_Identity(void *value,PetscViewer viewer)
127: {
129:   PetscBool      iascii;

132:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
133:   if (iascii) {
134:     PetscViewerASCIIPrintf(viewer,"Identity function\n");
135:   }
136:   return(0);
137: }
140: static PetscErrorCode PFDestroy_Identity(void *value)
141: {

145:   PetscFree(value);
146:   return(0);
147: }

151: PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf,void *value)
152: {
154:   PetscInt       *loc;

157:   if (pf->dimout != pf->dimin) 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);
158:   PetscMalloc(sizeof(PetscInt),&loc);
159:   loc[0] = pf->dimout;
160:   PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);
161:   return(0);
162: }