1292f8084SBarry Smith 2c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/ 3292f8084SBarry Smith 4e0877f53SBarry Smith static PetscErrorCode PFApply_Constant(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y) 5292f8084SBarry Smith { 6292f8084SBarry Smith PetscInt i; 7292f8084SBarry Smith PetscScalar v = ((PetscScalar*)value)[0]; 8292f8084SBarry Smith 9292f8084SBarry Smith PetscFunctionBegin; 10292f8084SBarry Smith n *= (PetscInt) PetscRealPart(((PetscScalar*)value)[1]); 11f6e5521dSKarl Rupp for (i=0; i<n; i++) y[i] = v; 12292f8084SBarry Smith PetscFunctionReturn(0); 13292f8084SBarry Smith } 14292f8084SBarry Smith 15e0877f53SBarry Smith static PetscErrorCode PFApplyVec_Constant(void *value,Vec x,Vec y) 16292f8084SBarry Smith { 17292f8084SBarry Smith PetscErrorCode ierr; 185fd66863SKarl Rupp 19292f8084SBarry Smith PetscFunctionBegin; 202dcb1b2aSMatthew Knepley ierr = VecSet(y,*((PetscScalar*)value));CHKERRQ(ierr); 21292f8084SBarry Smith PetscFunctionReturn(0); 22292f8084SBarry Smith } 23292f8084SBarry Smith PetscErrorCode PFView_Constant(void *value,PetscViewer viewer) 24292f8084SBarry Smith { 25292f8084SBarry Smith PetscErrorCode ierr; 26ace3abfcSBarry Smith PetscBool iascii; 27292f8084SBarry Smith 28292f8084SBarry Smith PetscFunctionBegin; 29251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 30292f8084SBarry Smith if (iascii) { 31292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX) 32292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g\n",*(double*)value);CHKERRQ(ierr); 33292f8084SBarry Smith #else 34292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Constant = %g + %gi\n",PetscRealPart(*(PetscScalar*)value),PetscImaginaryPart(*(PetscScalar*)value));CHKERRQ(ierr); 35292f8084SBarry Smith #endif 36292f8084SBarry Smith } 37292f8084SBarry Smith PetscFunctionReturn(0); 38292f8084SBarry Smith } 39e0877f53SBarry Smith static PetscErrorCode PFDestroy_Constant(void *value) 40292f8084SBarry Smith { 41292f8084SBarry Smith PetscErrorCode ierr; 425fd66863SKarl Rupp 43292f8084SBarry Smith PetscFunctionBegin; 44292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 45292f8084SBarry Smith PetscFunctionReturn(0); 46292f8084SBarry Smith } 47292f8084SBarry Smith 48e0877f53SBarry Smith static PetscErrorCode PFSetFromOptions_Constant(PetscOptionItems *PetscOptionsObject,PF pf) 49292f8084SBarry Smith { 50292f8084SBarry Smith PetscErrorCode ierr; 51292f8084SBarry Smith PetscScalar *value = (PetscScalar*)pf->data; 52292f8084SBarry Smith 53292f8084SBarry Smith PetscFunctionBegin; 54e55864a3SBarry Smith ierr = PetscOptionsHead(PetscOptionsObject,"Constant function options");CHKERRQ(ierr); 55*4c8fdceaSLisandro Dalcin ierr = PetscOptionsScalar("-pf_constant","The constant value","None",*value,value,NULL);CHKERRQ(ierr); 56292f8084SBarry Smith ierr = PetscOptionsTail();CHKERRQ(ierr); 57292f8084SBarry Smith PetscFunctionReturn(0); 58292f8084SBarry Smith } 59292f8084SBarry Smith 608cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PFCreate_Constant(PF pf,void *value) 61292f8084SBarry Smith { 62292f8084SBarry Smith PetscErrorCode ierr; 63292f8084SBarry Smith PetscScalar *loc; 64292f8084SBarry Smith 65292f8084SBarry Smith PetscFunctionBegin; 66785e854fSJed Brown ierr = PetscMalloc1(2,&loc);CHKERRQ(ierr); 67f6e5521dSKarl Rupp if (value) loc[0] = *(PetscScalar*)value; 68f6e5521dSKarl Rupp else loc[0] = 0.0; 69292f8084SBarry Smith loc[1] = pf->dimout; 70292f8084SBarry Smith ierr = PFSet(pf,PFApply_Constant,PFApplyVec_Constant,PFView_Constant,PFDestroy_Constant,loc);CHKERRQ(ierr); 71292f8084SBarry Smith 72292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Constant; 73292f8084SBarry Smith PetscFunctionReturn(0); 74292f8084SBarry Smith } 75292f8084SBarry Smith 765c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/ 776ac5842eSBarry Smith 788cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PFCreate_Quick(PF pf,PetscErrorCode (*function)(void*,PetscInt,const PetscScalar*,PetscScalar*)) 79292f8084SBarry Smith { 80292f8084SBarry Smith PetscErrorCode ierr; 81292f8084SBarry Smith 82292f8084SBarry Smith PetscFunctionBegin; 83*4c8fdceaSLisandro Dalcin ierr = PFSet(pf,function,NULL,NULL,NULL,NULL);CHKERRQ(ierr); 84292f8084SBarry Smith PetscFunctionReturn(0); 85292f8084SBarry Smith } 86292f8084SBarry Smith 87292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/ 88e0877f53SBarry Smith static PetscErrorCode PFApply_Identity(void *value,PetscInt n,const PetscScalar *x,PetscScalar *y) 89292f8084SBarry Smith { 90292f8084SBarry Smith PetscInt i; 91292f8084SBarry Smith 92292f8084SBarry Smith PetscFunctionBegin; 93292f8084SBarry Smith n *= *(PetscInt*)value; 94f6e5521dSKarl Rupp for (i=0; i<n; i++) y[i] = x[i]; 95292f8084SBarry Smith PetscFunctionReturn(0); 96292f8084SBarry Smith } 97292f8084SBarry Smith 98e0877f53SBarry Smith static PetscErrorCode PFApplyVec_Identity(void *value,Vec x,Vec y) 99292f8084SBarry Smith { 100292f8084SBarry Smith PetscErrorCode ierr; 1015fd66863SKarl Rupp 102292f8084SBarry Smith PetscFunctionBegin; 103292f8084SBarry Smith ierr = VecCopy(x,y);CHKERRQ(ierr); 104292f8084SBarry Smith PetscFunctionReturn(0); 105292f8084SBarry Smith } 106e0877f53SBarry Smith static PetscErrorCode PFView_Identity(void *value,PetscViewer viewer) 107292f8084SBarry Smith { 108292f8084SBarry Smith PetscErrorCode ierr; 109ace3abfcSBarry Smith PetscBool iascii; 110292f8084SBarry Smith 111292f8084SBarry Smith PetscFunctionBegin; 112251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 113292f8084SBarry Smith if (iascii) { 114292f8084SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Identity function\n");CHKERRQ(ierr); 115292f8084SBarry Smith } 116292f8084SBarry Smith PetscFunctionReturn(0); 117292f8084SBarry Smith } 118e0877f53SBarry Smith static PetscErrorCode PFDestroy_Identity(void *value) 119292f8084SBarry Smith { 120292f8084SBarry Smith PetscErrorCode ierr; 1215fd66863SKarl Rupp 122292f8084SBarry Smith PetscFunctionBegin; 123292f8084SBarry Smith ierr = PetscFree(value);CHKERRQ(ierr); 124292f8084SBarry Smith PetscFunctionReturn(0); 125292f8084SBarry Smith } 126292f8084SBarry Smith 1278cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf,void *value) 128292f8084SBarry Smith { 129292f8084SBarry Smith PetscErrorCode ierr; 130292f8084SBarry Smith PetscInt *loc; 131292f8084SBarry Smith 132292f8084SBarry Smith PetscFunctionBegin; 133f6e5521dSKarl 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); 13495dccacaSBarry Smith ierr = PetscNew(&loc);CHKERRQ(ierr); 135292f8084SBarry Smith loc[0] = pf->dimout; 136292f8084SBarry Smith ierr = PFSet(pf,PFApply_Identity,PFApplyVec_Identity,PFView_Identity,PFDestroy_Identity,loc);CHKERRQ(ierr); 137292f8084SBarry Smith PetscFunctionReturn(0); 138292f8084SBarry Smith } 139