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]); 13*f6e5521dSKarl Rupp for (i=0; i<n; i++) y[i] = v; 14292f8084SBarry Smith PetscFunctionReturn(0); 15292f8084SBarry Smith } 16292f8084SBarry Smith 17292f8084SBarry Smith #undef __FUNCT__ 18292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Constant" 19292f8084SBarry Smith PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y) 20292f8084SBarry Smith { 21292f8084SBarry Smith PetscErrorCode ierr; 225fd66863SKarl Rupp 23292f8084SBarry Smith PetscFunctionBegin; 242dcb1b2aSMatthew Knepley ierr = VecSet(y,*((PetscScalar*)value));CHKERRQ(ierr); 25292f8084SBarry Smith PetscFunctionReturn(0); 26292f8084SBarry Smith } 27292f8084SBarry Smith #undef __FUNCT__ 28292f8084SBarry Smith #define __FUNCT__ "PFView_Constant" 29292f8084SBarry Smith PetscErrorCode PFView_Constant(void *value,PetscViewer viewer) 30292f8084SBarry Smith { 31292f8084SBarry Smith PetscErrorCode ierr; 32ace3abfcSBarry Smith PetscBool iascii; 33292f8084SBarry Smith 34292f8084SBarry Smith PetscFunctionBegin; 35251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 36292f8084SBarry Smith if (iascii) { 37292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX) 38292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);CHKERRQ(ierr); 39292f8084SBarry Smith #else 40292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));CHKERRQ(ierr); 41292f8084SBarry Smith #endif 42292f8084SBarry Smith } 43292f8084SBarry Smith PetscFunctionReturn(0); 44292f8084SBarry Smith } 45292f8084SBarry Smith #undef __FUNCT__ 46292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Constant" 47292f8084SBarry Smith PetscErrorCode PFDestroy_Constant(void *value) 48292f8084SBarry Smith { 49292f8084SBarry Smith PetscErrorCode ierr; 505fd66863SKarl Rupp 51292f8084SBarry Smith PetscFunctionBegin; 52292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 53292f8084SBarry Smith PetscFunctionReturn(0); 54292f8084SBarry Smith } 55292f8084SBarry Smith 56292f8084SBarry Smith #undef __FUNCT__ 57292f8084SBarry Smith #define __FUNCT__ "PFSetFromOptions_Constant" 58292f8084SBarry Smith PetscErrorCode PFSetFromOptions_Constant(PF pf) 59292f8084SBarry Smith { 60292f8084SBarry Smith PetscErrorCode ierr; 61292f8084SBarry Smith PetscScalar *value = (PetscScalar*)pf->data; 62292f8084SBarry Smith 63292f8084SBarry Smith PetscFunctionBegin; 64292f8084SBarry Smith ierr = PetscOptionsHead("Constant function options");CHKERRQ(ierr); 65292f8084SBarry Smith ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);CHKERRQ(ierr); 66292f8084SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 67292f8084SBarry Smith PetscFunctionReturn(0); 68292f8084SBarry Smith } 69292f8084SBarry Smith 70292f8084SBarry Smith EXTERN_C_BEGIN 71292f8084SBarry Smith #undef __FUNCT__ 72292f8084SBarry Smith #define __FUNCT__ "PFCreate_Constant" 737087cfbeSBarry Smith PetscErrorCode PFCreate_Constant(PF pf,void *value) 74292f8084SBarry Smith { 75292f8084SBarry Smith PetscErrorCode ierr; 76292f8084SBarry Smith PetscScalar *loc; 77292f8084SBarry Smith 78292f8084SBarry Smith PetscFunctionBegin; 79292f8084SBarry Smith ierr = PetscMalloc(2*sizeof(PetscScalar),&loc);CHKERRQ(ierr); 80*f6e5521dSKarl Rupp if (value) loc[0] = *(PetscScalar*)value; 81*f6e5521dSKarl Rupp else loc[0] = 0.0; 82292f8084SBarry Smith loc[1] = pf->dimout; 83292f8084SBarry Smith ierr = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr); 84292f8084SBarry Smith 85292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Constant; 86292f8084SBarry Smith PetscFunctionReturn(0); 87292f8084SBarry Smith } 88292f8084SBarry Smith EXTERN_C_END 89292f8084SBarry Smith 90292f8084SBarry Smith 915c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/ 92292f8084SBarry Smith EXTERN_C_BEGIN 93292f8084SBarry Smith #undef __FUNCT__ 94292f8084SBarry Smith #define __FUNCT__ "PFCreate_Quick" 955c8f6a95SKarl Rupp PetscErrorCode PFCreate_Quick(PF pf,PetscErrorCode (*function)(void*,PetscInt,const PetscScalar*,PetscScalar*)) 96292f8084SBarry Smith { 97292f8084SBarry Smith PetscErrorCode ierr; 98292f8084SBarry Smith 99292f8084SBarry Smith PetscFunctionBegin; 1005c8f6a95SKarl Rupp ierr = PFSet(pf,function,0,0,0,0);CHKERRQ(ierr); 101292f8084SBarry Smith PetscFunctionReturn(0); 102292f8084SBarry Smith } 103292f8084SBarry Smith EXTERN_C_END 104292f8084SBarry Smith 105292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/ 106292f8084SBarry Smith #undef __FUNCT__ 107292f8084SBarry Smith #define __FUNCT__ "PFApply_Identity" 108dd394643SJed Brown PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y) 109292f8084SBarry Smith { 110292f8084SBarry Smith PetscInt i; 111292f8084SBarry Smith 112292f8084SBarry Smith PetscFunctionBegin; 113292f8084SBarry Smith n *= *(PetscInt*)value; 114*f6e5521dSKarl Rupp for (i=0; i<n; i++) y[i] = x[i]; 115292f8084SBarry Smith PetscFunctionReturn(0); 116292f8084SBarry Smith } 117292f8084SBarry Smith 118292f8084SBarry Smith #undef __FUNCT__ 119292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Identity" 120292f8084SBarry Smith PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y) 121292f8084SBarry Smith { 122292f8084SBarry Smith PetscErrorCode ierr; 1235fd66863SKarl Rupp 124292f8084SBarry Smith PetscFunctionBegin; 125292f8084SBarry Smith ierr = VecCopy(x,y);CHKERRQ(ierr); 126292f8084SBarry Smith PetscFunctionReturn(0); 127292f8084SBarry Smith } 128292f8084SBarry Smith #undef __FUNCT__ 129292f8084SBarry Smith #define __FUNCT__ "PFView_Identity" 130292f8084SBarry Smith PetscErrorCode PFView_Identity(void *value,PetscViewer viewer) 131292f8084SBarry Smith { 132292f8084SBarry Smith PetscErrorCode ierr; 133ace3abfcSBarry Smith PetscBool iascii; 134292f8084SBarry Smith 135292f8084SBarry Smith PetscFunctionBegin; 136251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 137292f8084SBarry Smith if (iascii) { 138292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr); 139292f8084SBarry Smith } 140292f8084SBarry Smith PetscFunctionReturn(0); 141292f8084SBarry Smith } 142292f8084SBarry Smith #undef __FUNCT__ 143292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Identity" 144292f8084SBarry Smith PetscErrorCode PFDestroy_Identity(void *value) 145292f8084SBarry Smith { 146292f8084SBarry Smith PetscErrorCode ierr; 1475fd66863SKarl Rupp 148292f8084SBarry Smith PetscFunctionBegin; 149292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 150292f8084SBarry Smith PetscFunctionReturn(0); 151292f8084SBarry Smith } 152292f8084SBarry Smith 153292f8084SBarry Smith EXTERN_C_BEGIN 154292f8084SBarry Smith #undef __FUNCT__ 155292f8084SBarry Smith #define __FUNCT__ "PFCreate_Identity" 1567087cfbeSBarry Smith PetscErrorCode PFCreate_Identity(PF pf,void *value) 157292f8084SBarry Smith { 158292f8084SBarry Smith PetscErrorCode ierr; 159292f8084SBarry Smith PetscInt *loc; 160292f8084SBarry Smith 161292f8084SBarry Smith PetscFunctionBegin; 162*f6e5521dSKarl Rupp 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); 163292f8084SBarry Smith ierr = PetscMalloc(sizeof(PetscInt),&loc);CHKERRQ(ierr); 164292f8084SBarry Smith loc[0] = pf->dimout; 165292f8084SBarry Smith ierr = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr); 166292f8084SBarry Smith PetscFunctionReturn(0); 167292f8084SBarry Smith } 168292f8084SBarry Smith EXTERN_C_END 169