1292f8084SBarry Smith 2c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/ 3292f8084SBarry Smith 4292f8084SBarry Smith #undef __FUNCT__ 5292f8084SBarry Smith #define __FUNCT__ "PFApply_Constant" 6dd394643SJed Brown PetscErrorCode PFApply_Constant(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y) 7292f8084SBarry Smith { 8292f8084SBarry Smith PetscInt i; 9292f8084SBarry Smith PetscScalar v = ((PetscScalar*)value)[0]; 10292f8084SBarry Smith 11292f8084SBarry Smith PetscFunctionBegin; 12292f8084SBarry Smith n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]); 13292f8084SBarry Smith for (i=0; i<n; i++) { 14292f8084SBarry Smith y[i] = v; 15292f8084SBarry Smith } 16292f8084SBarry Smith PetscFunctionReturn(0); 17292f8084SBarry Smith } 18292f8084SBarry Smith 19292f8084SBarry Smith #undef __FUNCT__ 20292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Constant" 21292f8084SBarry Smith PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y) 22292f8084SBarry Smith { 23292f8084SBarry Smith PetscErrorCode ierr; 24*5fd66863SKarl Rupp 25292f8084SBarry Smith PetscFunctionBegin; 262dcb1b2aSMatthew Knepley ierr = VecSet(y,*((PetscScalar*)value));CHKERRQ(ierr); 27292f8084SBarry Smith PetscFunctionReturn(0); 28292f8084SBarry Smith } 29292f8084SBarry Smith #undef __FUNCT__ 30292f8084SBarry Smith #define __FUNCT__ "PFView_Constant" 31292f8084SBarry Smith PetscErrorCode PFView_Constant(void *value,PetscViewer viewer) 32292f8084SBarry Smith { 33292f8084SBarry Smith PetscErrorCode ierr; 34ace3abfcSBarry Smith PetscBool iascii; 35292f8084SBarry Smith 36292f8084SBarry Smith PetscFunctionBegin; 37251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 38292f8084SBarry Smith if (iascii) { 39292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX) 40292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);CHKERRQ(ierr); 41292f8084SBarry Smith #else 42292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));CHKERRQ(ierr); 43292f8084SBarry Smith #endif 44292f8084SBarry Smith } 45292f8084SBarry Smith PetscFunctionReturn(0); 46292f8084SBarry Smith } 47292f8084SBarry Smith #undef __FUNCT__ 48292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Constant" 49292f8084SBarry Smith PetscErrorCode PFDestroy_Constant(void *value) 50292f8084SBarry Smith { 51292f8084SBarry Smith PetscErrorCode ierr; 52*5fd66863SKarl Rupp 53292f8084SBarry Smith PetscFunctionBegin; 54292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 55292f8084SBarry Smith PetscFunctionReturn(0); 56292f8084SBarry Smith } 57292f8084SBarry Smith 58292f8084SBarry Smith #undef __FUNCT__ 59292f8084SBarry Smith #define __FUNCT__ "PFSetFromOptions_Constant" 60292f8084SBarry Smith PetscErrorCode PFSetFromOptions_Constant(PF pf) 61292f8084SBarry Smith { 62292f8084SBarry Smith PetscErrorCode ierr; 63292f8084SBarry Smith PetscScalar *value = (PetscScalar *)pf->data; 64292f8084SBarry Smith 65292f8084SBarry Smith PetscFunctionBegin; 66292f8084SBarry Smith ierr = PetscOptionsHead("Constant function options");CHKERRQ(ierr); 67292f8084SBarry Smith ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);CHKERRQ(ierr); 68292f8084SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 69292f8084SBarry Smith PetscFunctionReturn(0); 70292f8084SBarry Smith } 71292f8084SBarry Smith 72292f8084SBarry Smith EXTERN_C_BEGIN 73292f8084SBarry Smith #undef __FUNCT__ 74292f8084SBarry Smith #define __FUNCT__ "PFCreate_Constant" 757087cfbeSBarry Smith PetscErrorCode PFCreate_Constant(PF pf,void *value) 76292f8084SBarry Smith { 77292f8084SBarry Smith PetscErrorCode ierr; 78292f8084SBarry Smith PetscScalar *loc; 79292f8084SBarry Smith 80292f8084SBarry Smith PetscFunctionBegin; 81292f8084SBarry Smith ierr = PetscMalloc(2*sizeof(PetscScalar),&loc);CHKERRQ(ierr); 82292f8084SBarry Smith if (value) loc[0] = *(PetscScalar*)value; else loc[0] = 0.0; 83292f8084SBarry Smith loc[1] = pf->dimout; 84292f8084SBarry Smith ierr = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr); 85292f8084SBarry Smith 86292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Constant; 87292f8084SBarry Smith PetscFunctionReturn(0); 88292f8084SBarry Smith } 89292f8084SBarry Smith EXTERN_C_END 90292f8084SBarry Smith 91292f8084SBarry Smith 925c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/ 93292f8084SBarry Smith EXTERN_C_BEGIN 94292f8084SBarry Smith #undef __FUNCT__ 95292f8084SBarry Smith #define __FUNCT__ "PFCreate_Quick" 965c8f6a95SKarl Rupp PetscErrorCode PFCreate_Quick(PF pf,PetscErrorCode (*function)(void*,PetscInt,const PetscScalar*,PetscScalar*)) 97292f8084SBarry Smith { 98292f8084SBarry Smith PetscErrorCode ierr; 99292f8084SBarry Smith 100292f8084SBarry Smith PetscFunctionBegin; 1015c8f6a95SKarl Rupp ierr = PFSet(pf,function,0,0,0,0);CHKERRQ(ierr); 102292f8084SBarry Smith PetscFunctionReturn(0); 103292f8084SBarry Smith } 104292f8084SBarry Smith EXTERN_C_END 105292f8084SBarry Smith 106292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/ 107292f8084SBarry Smith #undef __FUNCT__ 108292f8084SBarry Smith #define __FUNCT__ "PFApply_Identity" 109dd394643SJed Brown PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y) 110292f8084SBarry Smith { 111292f8084SBarry Smith PetscInt i; 112292f8084SBarry Smith 113292f8084SBarry Smith PetscFunctionBegin; 114292f8084SBarry Smith n *= *(PetscInt*)value; 115292f8084SBarry Smith for (i=0; i<n; i++) { 116292f8084SBarry Smith y[i] = x[i]; 117292f8084SBarry Smith } 118292f8084SBarry Smith PetscFunctionReturn(0); 119292f8084SBarry Smith } 120292f8084SBarry Smith 121292f8084SBarry Smith #undef __FUNCT__ 122292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Identity" 123292f8084SBarry Smith PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y) 124292f8084SBarry Smith { 125292f8084SBarry Smith PetscErrorCode ierr; 126*5fd66863SKarl Rupp 127292f8084SBarry Smith PetscFunctionBegin; 128292f8084SBarry Smith ierr = VecCopy(x,y);CHKERRQ(ierr); 129292f8084SBarry Smith PetscFunctionReturn(0); 130292f8084SBarry Smith } 131292f8084SBarry Smith #undef __FUNCT__ 132292f8084SBarry Smith #define __FUNCT__ "PFView_Identity" 133292f8084SBarry Smith PetscErrorCode PFView_Identity(void *value,PetscViewer viewer) 134292f8084SBarry Smith { 135292f8084SBarry Smith PetscErrorCode ierr; 136ace3abfcSBarry Smith PetscBool iascii; 137292f8084SBarry Smith 138292f8084SBarry Smith PetscFunctionBegin; 139251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 140292f8084SBarry Smith if (iascii) { 141292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr); 142292f8084SBarry Smith } 143292f8084SBarry Smith PetscFunctionReturn(0); 144292f8084SBarry Smith } 145292f8084SBarry Smith #undef __FUNCT__ 146292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Identity" 147292f8084SBarry Smith PetscErrorCode PFDestroy_Identity(void *value) 148292f8084SBarry Smith { 149292f8084SBarry Smith PetscErrorCode ierr; 150*5fd66863SKarl Rupp 151292f8084SBarry Smith PetscFunctionBegin; 152292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 153292f8084SBarry Smith PetscFunctionReturn(0); 154292f8084SBarry Smith } 155292f8084SBarry Smith 156292f8084SBarry Smith EXTERN_C_BEGIN 157292f8084SBarry Smith #undef __FUNCT__ 158292f8084SBarry Smith #define __FUNCT__ "PFCreate_Identity" 1597087cfbeSBarry Smith PetscErrorCode PFCreate_Identity(PF pf,void *value) 160292f8084SBarry Smith { 161292f8084SBarry Smith PetscErrorCode ierr; 162292f8084SBarry Smith PetscInt *loc; 163292f8084SBarry Smith 164292f8084SBarry Smith PetscFunctionBegin; 165292f8084SBarry Smith if (pf->dimout != pf->dimin) { 166e32f2f54SBarry Smith 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); 167292f8084SBarry Smith } 168292f8084SBarry Smith ierr = PetscMalloc(sizeof(PetscInt),&loc);CHKERRQ(ierr); 169292f8084SBarry Smith loc[0] = pf->dimout; 170292f8084SBarry Smith ierr = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr); 171292f8084SBarry Smith PetscFunctionReturn(0); 172292f8084SBarry Smith } 173292f8084SBarry Smith EXTERN_C_END 174