10c735eedSKris Buschelman #define PETSCVEC_DLL 2292f8084SBarry Smith 37c4f633dSBarry Smith #include "../src/vec/pf/pfimpl.h" /*I "petscpf.h" I*/ 4292f8084SBarry Smith 5292f8084SBarry Smith #undef __FUNCT__ 6292f8084SBarry Smith #define __FUNCT__ "PFApply_Constant" 7*dd394643SJed Brown PetscErrorCode PFApply_Constant(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y) 8292f8084SBarry Smith { 9292f8084SBarry Smith PetscInt i; 10292f8084SBarry Smith PetscScalar v = ((PetscScalar*)value)[0]; 11292f8084SBarry Smith 12292f8084SBarry Smith PetscFunctionBegin; 13292f8084SBarry Smith n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]); 14292f8084SBarry Smith for (i=0; i<n; i++) { 15292f8084SBarry Smith y[i] = v; 16292f8084SBarry Smith } 17292f8084SBarry Smith PetscFunctionReturn(0); 18292f8084SBarry Smith } 19292f8084SBarry Smith 20292f8084SBarry Smith #undef __FUNCT__ 21292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Constant" 22292f8084SBarry Smith PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y) 23292f8084SBarry Smith { 24292f8084SBarry Smith PetscErrorCode ierr; 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; 34292f8084SBarry Smith PetscTruth iascii; 35292f8084SBarry Smith 36292f8084SBarry Smith PetscFunctionBegin; 372692d6eeSBarry Smith ierr = PetscTypeCompare((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; 52292f8084SBarry Smith PetscFunctionBegin; 53292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 54292f8084SBarry Smith PetscFunctionReturn(0); 55292f8084SBarry Smith } 56292f8084SBarry Smith 57292f8084SBarry Smith #undef __FUNCT__ 58292f8084SBarry Smith #define __FUNCT__ "PFSetFromOptions_Constant" 59292f8084SBarry Smith PetscErrorCode PFSetFromOptions_Constant(PF pf) 60292f8084SBarry Smith { 61292f8084SBarry Smith PetscErrorCode ierr; 62292f8084SBarry Smith PetscScalar *value = (PetscScalar *)pf->data; 63292f8084SBarry Smith 64292f8084SBarry Smith PetscFunctionBegin; 65292f8084SBarry Smith ierr = PetscOptionsHead("Constant function options");CHKERRQ(ierr); 66292f8084SBarry Smith ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,0);CHKERRQ(ierr); 67292f8084SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 68292f8084SBarry Smith PetscFunctionReturn(0); 69292f8084SBarry Smith } 70292f8084SBarry Smith 71292f8084SBarry Smith EXTERN_C_BEGIN 72292f8084SBarry Smith #undef __FUNCT__ 73292f8084SBarry Smith #define __FUNCT__ "PFCreate_Constant" 740c735eedSKris Buschelman PetscErrorCode PETSCVEC_DLLEXPORT PFCreate_Constant(PF pf,void *value) 75292f8084SBarry Smith { 76292f8084SBarry Smith PetscErrorCode ierr; 77292f8084SBarry Smith PetscScalar *loc; 78292f8084SBarry Smith 79292f8084SBarry Smith PetscFunctionBegin; 80292f8084SBarry Smith ierr = PetscMalloc(2*sizeof(PetscScalar),&loc);CHKERRQ(ierr); 81292f8084SBarry Smith if (value) loc[0] = *(PetscScalar*)value; 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 91*dd394643SJed Brown 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" 950c735eedSKris Buschelman PetscErrorCode PETSCVEC_DLLEXPORT PFCreate_Quick(PF pf,void *function) 96292f8084SBarry Smith { 97292f8084SBarry Smith PetscErrorCode ierr; 98292f8084SBarry Smith 99292f8084SBarry Smith PetscFunctionBegin; 100292f8084SBarry Smith ierr = PFSet(pf,(FCN)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" 108*dd394643SJed 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; 114292f8084SBarry Smith for (i=0; i<n; i++) { 115292f8084SBarry Smith y[i] = x[i]; 116292f8084SBarry Smith } 117292f8084SBarry Smith PetscFunctionReturn(0); 118292f8084SBarry Smith } 119292f8084SBarry Smith 120292f8084SBarry Smith #undef __FUNCT__ 121292f8084SBarry Smith #define __FUNCT__ "PFApplyVec_Identity" 122292f8084SBarry Smith PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y) 123292f8084SBarry Smith { 124292f8084SBarry Smith PetscErrorCode ierr; 125292f8084SBarry Smith PetscFunctionBegin; 126292f8084SBarry Smith ierr = VecCopy(x,y);CHKERRQ(ierr); 127292f8084SBarry Smith PetscFunctionReturn(0); 128292f8084SBarry Smith } 129292f8084SBarry Smith #undef __FUNCT__ 130292f8084SBarry Smith #define __FUNCT__ "PFView_Identity" 131292f8084SBarry Smith PetscErrorCode PFView_Identity(void *value,PetscViewer viewer) 132292f8084SBarry Smith { 133292f8084SBarry Smith PetscErrorCode ierr; 134292f8084SBarry Smith PetscTruth iascii; 135292f8084SBarry Smith 136292f8084SBarry Smith PetscFunctionBegin; 1372692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 138292f8084SBarry Smith if (iascii) { 139292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr); 140292f8084SBarry Smith } 141292f8084SBarry Smith PetscFunctionReturn(0); 142292f8084SBarry Smith } 143292f8084SBarry Smith #undef __FUNCT__ 144292f8084SBarry Smith #define __FUNCT__ "PFDestroy_Identity" 145292f8084SBarry Smith PetscErrorCode PFDestroy_Identity(void *value) 146292f8084SBarry Smith { 147292f8084SBarry Smith PetscErrorCode ierr; 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" 1560c735eedSKris Buschelman PetscErrorCode PETSCVEC_DLLEXPORT PFCreate_Identity(PF pf,void *value) 157292f8084SBarry Smith { 158292f8084SBarry Smith PetscErrorCode ierr; 159292f8084SBarry Smith PetscInt *loc; 160292f8084SBarry Smith 161292f8084SBarry Smith PetscFunctionBegin; 162292f8084SBarry Smith if (pf->dimout != pf->dimin) { 163e32f2f54SBarry 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); 164292f8084SBarry Smith } 165292f8084SBarry Smith ierr = PetscMalloc(sizeof(PetscInt),&loc);CHKERRQ(ierr); 166292f8084SBarry Smith loc[0] = pf->dimout; 167292f8084SBarry Smith ierr = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr); 168292f8084SBarry Smith PetscFunctionReturn(0); 169292f8084SBarry Smith } 170292f8084SBarry Smith EXTERN_C_END 171