1*292f8084SBarry Smith 2*292f8084SBarry Smith #include "src/pf/pfimpl.h" /*I "petscpf.h" I*/ 3*292f8084SBarry Smith 4*292f8084SBarry Smith #undef __FUNCT__ 5*292f8084SBarry Smith #define __FUNCT__ "PFApply_Constant" 6*292f8084SBarry Smith PetscErrorCode PFApply_Constant(void *value,PetscInt n,PetscScalar *x,PetscScalar *y) 7*292f8084SBarry Smith { 8*292f8084SBarry Smith PetscInt i; 9*292f8084SBarry Smith PetscScalar v = ((PetscScalar*)value)[0]; 10*292f8084SBarry Smith 11*292f8084SBarry Smith PetscFunctionBegin; 12*292f8084SBarry Smith n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]); 13*292f8084SBarry Smith for (i=0; i<n; i++) { 14*292f8084SBarry Smith y[i] = v; 15*292f8084SBarry Smith } 16*292f8084SBarry Smith PetscFunctionReturn(0); 17*292f8084SBarry Smith } 18*292f8084SBarry Smith 19*292f8084SBarry Smith #undef __FUNCT__ 20*292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Constant" 21*292f8084SBarry Smith PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y) 22*292f8084SBarry Smith { 23*292f8084SBarry Smith PetscErrorCode ierr; 24*292f8084SBarry Smith PetscFunctionBegin; 25*292f8084SBarry Smith ierr = VecSet((PetscScalar*)value,y);CHKERRQ(ierr); 26*292f8084SBarry Smith PetscFunctionReturn(0); 27*292f8084SBarry Smith } 28*292f8084SBarry Smith #undef __FUNCT__ 29*292f8084SBarry Smith #define __FUNCT__ "PFView_Constant" 30*292f8084SBarry Smith PetscErrorCode PFView_Constant(void *value,PetscViewer viewer) 31*292f8084SBarry Smith { 32*292f8084SBarry Smith PetscErrorCode ierr; 33*292f8084SBarry Smith PetscTruth iascii; 34*292f8084SBarry Smith 35*292f8084SBarry Smith PetscFunctionBegin; 36*292f8084SBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 37*292f8084SBarry Smith if (iascii) { 38*292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX) 39*292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);CHKERRQ(ierr); 40*292f8084SBarry Smith #else 41*292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));CHKERRQ(ierr); 42*292f8084SBarry Smith #endif 43*292f8084SBarry Smith } 44*292f8084SBarry Smith PetscFunctionReturn(0); 45*292f8084SBarry Smith } 46*292f8084SBarry Smith #undef __FUNCT__ 47*292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Constant" 48*292f8084SBarry Smith PetscErrorCode PFDestroy_Constant(void *value) 49*292f8084SBarry Smith { 50*292f8084SBarry Smith PetscErrorCode ierr; 51*292f8084SBarry Smith PetscFunctionBegin; 52*292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 53*292f8084SBarry Smith PetscFunctionReturn(0); 54*292f8084SBarry Smith } 55*292f8084SBarry Smith 56*292f8084SBarry Smith #undef __FUNCT__ 57*292f8084SBarry Smith #define __FUNCT__ "PFSetFromOptions_Constant" 58*292f8084SBarry Smith PetscErrorCode PFSetFromOptions_Constant(PF pf) 59*292f8084SBarry Smith { 60*292f8084SBarry Smith PetscErrorCode ierr; 61*292f8084SBarry Smith PetscScalar *value = (PetscScalar *)pf->data; 62*292f8084SBarry Smith 63*292f8084SBarry Smith PetscFunctionBegin; 64*292f8084SBarry Smith ierr = PetscOptionsHead("Constant function options");CHKERRQ(ierr); 65*292f8084SBarry Smith ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);CHKERRQ(ierr); 66*292f8084SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 67*292f8084SBarry Smith PetscFunctionReturn(0); 68*292f8084SBarry Smith } 69*292f8084SBarry Smith 70*292f8084SBarry Smith EXTERN_C_BEGIN 71*292f8084SBarry Smith #undef __FUNCT__ 72*292f8084SBarry Smith #define __FUNCT__ "PFCreate_Constant" 73*292f8084SBarry Smith PetscErrorCode PFCreate_Constant(PF pf,void *value) 74*292f8084SBarry Smith { 75*292f8084SBarry Smith PetscErrorCode ierr; 76*292f8084SBarry Smith PetscScalar *loc; 77*292f8084SBarry Smith 78*292f8084SBarry Smith PetscFunctionBegin; 79*292f8084SBarry Smith ierr = PetscMalloc(2*sizeof(PetscScalar),&loc);CHKERRQ(ierr); 80*292f8084SBarry Smith if (value) loc[0] = *(PetscScalar*)value; else loc[0] = 0.0; 81*292f8084SBarry Smith loc[1] = pf->dimout; 82*292f8084SBarry Smith ierr = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr); 83*292f8084SBarry Smith 84*292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Constant; 85*292f8084SBarry Smith PetscFunctionReturn(0); 86*292f8084SBarry Smith } 87*292f8084SBarry Smith EXTERN_C_END 88*292f8084SBarry Smith 89*292f8084SBarry Smith 90*292f8084SBarry Smith typedef PetscErrorCode (*FCN)(void*,PetscInt,PetscScalar*,PetscScalar*); /* force argument to next function to not be extern C*/ 91*292f8084SBarry Smith EXTERN_C_BEGIN 92*292f8084SBarry Smith #undef __FUNCT__ 93*292f8084SBarry Smith #define __FUNCT__ "PFCreate_Quick" 94*292f8084SBarry Smith PetscErrorCode PFCreate_Quick(PF pf,void *function) 95*292f8084SBarry Smith { 96*292f8084SBarry Smith PetscErrorCode ierr; 97*292f8084SBarry Smith 98*292f8084SBarry Smith PetscFunctionBegin; 99*292f8084SBarry Smith ierr = PFSet(pf,(FCN)function,0,0,0,0);CHKERRQ(ierr); 100*292f8084SBarry Smith PetscFunctionReturn(0); 101*292f8084SBarry Smith } 102*292f8084SBarry Smith EXTERN_C_END 103*292f8084SBarry Smith 104*292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/ 105*292f8084SBarry Smith #undef __FUNCT__ 106*292f8084SBarry Smith #define __FUNCT__ "PFApply_Identity" 107*292f8084SBarry Smith PetscErrorCode PFApply_Identity(void *value,PetscInt n,PetscScalar *x,PetscScalar *y) 108*292f8084SBarry Smith { 109*292f8084SBarry Smith PetscInt i; 110*292f8084SBarry Smith 111*292f8084SBarry Smith PetscFunctionBegin; 112*292f8084SBarry Smith n *= *(PetscInt*)value; 113*292f8084SBarry Smith for (i=0; i<n; i++) { 114*292f8084SBarry Smith y[i] = x[i]; 115*292f8084SBarry Smith } 116*292f8084SBarry Smith PetscFunctionReturn(0); 117*292f8084SBarry Smith } 118*292f8084SBarry Smith 119*292f8084SBarry Smith #undef __FUNCT__ 120*292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Identity" 121*292f8084SBarry Smith PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y) 122*292f8084SBarry Smith { 123*292f8084SBarry Smith PetscErrorCode ierr; 124*292f8084SBarry Smith PetscFunctionBegin; 125*292f8084SBarry Smith ierr = VecCopy(x,y);CHKERRQ(ierr); 126*292f8084SBarry Smith PetscFunctionReturn(0); 127*292f8084SBarry Smith } 128*292f8084SBarry Smith #undef __FUNCT__ 129*292f8084SBarry Smith #define __FUNCT__ "PFView_Identity" 130*292f8084SBarry Smith PetscErrorCode PFView_Identity(void *value,PetscViewer viewer) 131*292f8084SBarry Smith { 132*292f8084SBarry Smith PetscErrorCode ierr; 133*292f8084SBarry Smith PetscTruth iascii; 134*292f8084SBarry Smith 135*292f8084SBarry Smith PetscFunctionBegin; 136*292f8084SBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 137*292f8084SBarry Smith if (iascii) { 138*292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr); 139*292f8084SBarry Smith } 140*292f8084SBarry Smith PetscFunctionReturn(0); 141*292f8084SBarry Smith } 142*292f8084SBarry Smith #undef __FUNCT__ 143*292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Identity" 144*292f8084SBarry Smith PetscErrorCode PFDestroy_Identity(void *value) 145*292f8084SBarry Smith { 146*292f8084SBarry Smith PetscErrorCode ierr; 147*292f8084SBarry Smith PetscFunctionBegin; 148*292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 149*292f8084SBarry Smith PetscFunctionReturn(0); 150*292f8084SBarry Smith } 151*292f8084SBarry Smith 152*292f8084SBarry Smith EXTERN_C_BEGIN 153*292f8084SBarry Smith #undef __FUNCT__ 154*292f8084SBarry Smith #define __FUNCT__ "PFCreate_Identity" 155*292f8084SBarry Smith PetscErrorCode PFCreate_Identity(PF pf,void *value) 156*292f8084SBarry Smith { 157*292f8084SBarry Smith PetscErrorCode ierr; 158*292f8084SBarry Smith PetscInt *loc; 159*292f8084SBarry Smith 160*292f8084SBarry Smith PetscFunctionBegin; 161*292f8084SBarry Smith if (pf->dimout != pf->dimin) { 162*292f8084SBarry Smith SETERRQ2(1,"Input dimension must match output dimension for Identity function, dimin = %d dimout = %d\n",pf->dimin,pf->dimout); 163*292f8084SBarry Smith } 164*292f8084SBarry Smith ierr = PetscMalloc(sizeof(PetscInt),&loc);CHKERRQ(ierr); 165*292f8084SBarry Smith loc[0] = pf->dimout; 166*292f8084SBarry Smith ierr = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr); 167*292f8084SBarry Smith PetscFunctionReturn(0); 168*292f8084SBarry Smith } 169*292f8084SBarry Smith EXTERN_C_END 170