1c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/ 2292f8084SBarry Smith 3d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Constant(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y) 4d71ae5a4SJacob Faibussowitsch { 5292f8084SBarry Smith PetscInt i; 6292f8084SBarry Smith PetscScalar v = ((PetscScalar *)value)[0]; 7292f8084SBarry Smith 8292f8084SBarry Smith PetscFunctionBegin; 9292f8084SBarry Smith n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]); 10f6e5521dSKarl Rupp for (i = 0; i < n; i++) y[i] = v; 113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12292f8084SBarry Smith } 13292f8084SBarry Smith 14d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y) 15d71ae5a4SJacob Faibussowitsch { 16292f8084SBarry Smith PetscFunctionBegin; 179566063dSJacob Faibussowitsch PetscCall(VecSet(y, *((PetscScalar *)value))); 183ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 19292f8084SBarry Smith } 20da8c939bSJacob Faibussowitsch 21da8c939bSJacob Faibussowitsch static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer) 22d71ae5a4SJacob Faibussowitsch { 23*9f196a02SMartin Diehl PetscBool isascii; 24292f8084SBarry Smith 25292f8084SBarry Smith PetscFunctionBegin; 26*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 27*9f196a02SMartin Diehl if (isascii) { 28292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX) 299566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value)); 30292f8084SBarry Smith #else 312a3335c0SJose E. Roman PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value))); 32292f8084SBarry Smith #endif 33292f8084SBarry Smith } 343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35292f8084SBarry Smith } 36da8c939bSJacob Faibussowitsch 37d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Constant(void *value) 38d71ae5a4SJacob Faibussowitsch { 39292f8084SBarry Smith PetscFunctionBegin; 409566063dSJacob Faibussowitsch PetscCall(PetscFree(value)); 413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 42292f8084SBarry Smith } 43292f8084SBarry Smith 44ce78bad3SBarry Smith static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems PetscOptionsObject) 45d71ae5a4SJacob Faibussowitsch { 46292f8084SBarry Smith PetscScalar *value = (PetscScalar *)pf->data; 47292f8084SBarry Smith 48292f8084SBarry Smith PetscFunctionBegin; 49d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options"); 509566063dSJacob Faibussowitsch PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL)); 51d0609cedSBarry Smith PetscOptionsHeadEnd(); 523ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 53292f8084SBarry Smith } 54292f8084SBarry Smith 55da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Constant(PF pf, void *value) 56d71ae5a4SJacob Faibussowitsch { 57292f8084SBarry Smith PetscScalar *loc; 58292f8084SBarry Smith 59292f8084SBarry Smith PetscFunctionBegin; 609566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2, &loc)); 61f6e5521dSKarl Rupp if (value) loc[0] = *(PetscScalar *)value; 62f6e5521dSKarl Rupp else loc[0] = 0.0; 63292f8084SBarry Smith loc[1] = pf->dimout; 649566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc)); 65292f8084SBarry Smith 66292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Constant; 673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 68292f8084SBarry Smith } 69292f8084SBarry Smith 705c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/ 716ac5842eSBarry Smith 72da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *)) 73d71ae5a4SJacob Faibussowitsch { 74292f8084SBarry Smith PetscFunctionBegin; 759566063dSJacob Faibussowitsch PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL)); 763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 77292f8084SBarry Smith } 78292f8084SBarry Smith 79292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/ 80d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y) 81d71ae5a4SJacob Faibussowitsch { 82292f8084SBarry Smith PetscInt i; 83292f8084SBarry Smith 84292f8084SBarry Smith PetscFunctionBegin; 85292f8084SBarry Smith n *= *(PetscInt *)value; 86f6e5521dSKarl Rupp for (i = 0; i < n; i++) y[i] = x[i]; 873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 88292f8084SBarry Smith } 89292f8084SBarry Smith 90d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y) 91d71ae5a4SJacob Faibussowitsch { 92292f8084SBarry Smith PetscFunctionBegin; 93da8c939bSJacob Faibussowitsch (void)value; 949566063dSJacob Faibussowitsch PetscCall(VecCopy(x, y)); 953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 96292f8084SBarry Smith } 97da8c939bSJacob Faibussowitsch 98d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer) 99d71ae5a4SJacob Faibussowitsch { 100*9f196a02SMartin Diehl PetscBool isascii; 101292f8084SBarry Smith 102292f8084SBarry Smith PetscFunctionBegin; 103da8c939bSJacob Faibussowitsch (void)value; 104*9f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 105*9f196a02SMartin Diehl if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n")); 1063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 107292f8084SBarry Smith } 108da8c939bSJacob Faibussowitsch 109d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Identity(void *value) 110d71ae5a4SJacob Faibussowitsch { 111292f8084SBarry Smith PetscFunctionBegin; 1129566063dSJacob Faibussowitsch PetscCall(PetscFree(value)); 1133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 114292f8084SBarry Smith } 115292f8084SBarry Smith 116da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value) 117d71ae5a4SJacob Faibussowitsch { 118292f8084SBarry Smith PetscInt *loc; 119292f8084SBarry Smith 120292f8084SBarry Smith PetscFunctionBegin; 121da8c939bSJacob Faibussowitsch (void)value; 12208401ef6SPierre Jolivet PetscCheck(pf->dimout == pf->dimin, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Input dimension must match output dimension for Identity function, dimin = %" PetscInt_FMT " dimout = %" PetscInt_FMT, pf->dimin, pf->dimout); 1239566063dSJacob Faibussowitsch PetscCall(PetscNew(&loc)); 124292f8084SBarry Smith loc[0] = pf->dimout; 1259566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc)); 1263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 127292f8084SBarry Smith } 128