1292f8084SBarry Smith 2c6db04a5SJed Brown #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/ 3292f8084SBarry Smith 4d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Constant(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y) 5d71ae5a4SJacob Faibussowitsch { 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; 12*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 13292f8084SBarry Smith } 14292f8084SBarry Smith 15d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y) 16d71ae5a4SJacob Faibussowitsch { 17292f8084SBarry Smith PetscFunctionBegin; 189566063dSJacob Faibussowitsch PetscCall(VecSet(y, *((PetscScalar *)value))); 19*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20292f8084SBarry Smith } 21d71ae5a4SJacob Faibussowitsch PetscErrorCode PFView_Constant(void *value, PetscViewer viewer) 22d71ae5a4SJacob Faibussowitsch { 23ace3abfcSBarry Smith PetscBool iascii; 24292f8084SBarry Smith 25292f8084SBarry Smith PetscFunctionBegin; 269566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 27292f8084SBarry Smith if (iascii) { 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 } 34*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 35292f8084SBarry Smith } 36d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Constant(void *value) 37d71ae5a4SJacob Faibussowitsch { 38292f8084SBarry Smith PetscFunctionBegin; 399566063dSJacob Faibussowitsch PetscCall(PetscFree(value)); 40*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 41292f8084SBarry Smith } 42292f8084SBarry Smith 43d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems *PetscOptionsObject) 44d71ae5a4SJacob Faibussowitsch { 45292f8084SBarry Smith PetscScalar *value = (PetscScalar *)pf->data; 46292f8084SBarry Smith 47292f8084SBarry Smith PetscFunctionBegin; 48d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options"); 499566063dSJacob Faibussowitsch PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL)); 50d0609cedSBarry Smith PetscOptionsHeadEnd(); 51*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 52292f8084SBarry Smith } 53292f8084SBarry Smith 54d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PFCreate_Constant(PF pf, void *value) 55d71ae5a4SJacob Faibussowitsch { 56292f8084SBarry Smith PetscScalar *loc; 57292f8084SBarry Smith 58292f8084SBarry Smith PetscFunctionBegin; 599566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2, &loc)); 60f6e5521dSKarl Rupp if (value) loc[0] = *(PetscScalar *)value; 61f6e5521dSKarl Rupp else loc[0] = 0.0; 62292f8084SBarry Smith loc[1] = pf->dimout; 639566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc)); 64292f8084SBarry Smith 65292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Constant; 66*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 67292f8084SBarry Smith } 68292f8084SBarry Smith 695c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/ 706ac5842eSBarry Smith 71d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *)) 72d71ae5a4SJacob Faibussowitsch { 73292f8084SBarry Smith PetscFunctionBegin; 749566063dSJacob Faibussowitsch PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL)); 75*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 76292f8084SBarry Smith } 77292f8084SBarry Smith 78292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/ 79d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y) 80d71ae5a4SJacob Faibussowitsch { 81292f8084SBarry Smith PetscInt i; 82292f8084SBarry Smith 83292f8084SBarry Smith PetscFunctionBegin; 84292f8084SBarry Smith n *= *(PetscInt *)value; 85f6e5521dSKarl Rupp for (i = 0; i < n; i++) y[i] = x[i]; 86*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 87292f8084SBarry Smith } 88292f8084SBarry Smith 89d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y) 90d71ae5a4SJacob Faibussowitsch { 91292f8084SBarry Smith PetscFunctionBegin; 929566063dSJacob Faibussowitsch PetscCall(VecCopy(x, y)); 93*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 94292f8084SBarry Smith } 95d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer) 96d71ae5a4SJacob Faibussowitsch { 97ace3abfcSBarry Smith PetscBool iascii; 98292f8084SBarry Smith 99292f8084SBarry Smith PetscFunctionBegin; 1009566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 10148a46eb9SPierre Jolivet if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n")); 102*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 103292f8084SBarry Smith } 104d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Identity(void *value) 105d71ae5a4SJacob Faibussowitsch { 106292f8084SBarry Smith PetscFunctionBegin; 1079566063dSJacob Faibussowitsch PetscCall(PetscFree(value)); 108*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 109292f8084SBarry Smith } 110292f8084SBarry Smith 111d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PFCreate_Identity(PF pf, void *value) 112d71ae5a4SJacob Faibussowitsch { 113292f8084SBarry Smith PetscInt *loc; 114292f8084SBarry Smith 115292f8084SBarry Smith PetscFunctionBegin; 11608401ef6SPierre 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); 1179566063dSJacob Faibussowitsch PetscCall(PetscNew(&loc)); 118292f8084SBarry Smith loc[0] = pf->dimout; 1199566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc)); 120*3ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 121292f8084SBarry Smith } 122