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; 123ba16761SJacob 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))); 193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 20292f8084SBarry Smith } 21*da8c939bSJacob Faibussowitsch 22*da8c939bSJacob Faibussowitsch static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer) 23d71ae5a4SJacob Faibussowitsch { 24ace3abfcSBarry Smith PetscBool iascii; 25292f8084SBarry Smith 26292f8084SBarry Smith PetscFunctionBegin; 279566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 28292f8084SBarry Smith if (iascii) { 29292f8084SBarry Smith #if !defined(PETSC_USE_COMPLEX) 309566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value)); 31292f8084SBarry Smith #else 322a3335c0SJose E. Roman PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value))); 33292f8084SBarry Smith #endif 34292f8084SBarry Smith } 353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 36292f8084SBarry Smith } 37*da8c939bSJacob Faibussowitsch 38d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Constant(void *value) 39d71ae5a4SJacob Faibussowitsch { 40292f8084SBarry Smith PetscFunctionBegin; 419566063dSJacob Faibussowitsch PetscCall(PetscFree(value)); 423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 43292f8084SBarry Smith } 44292f8084SBarry Smith 45d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems *PetscOptionsObject) 46d71ae5a4SJacob Faibussowitsch { 47292f8084SBarry Smith PetscScalar *value = (PetscScalar *)pf->data; 48292f8084SBarry Smith 49292f8084SBarry Smith PetscFunctionBegin; 50d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options"); 519566063dSJacob Faibussowitsch PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL)); 52d0609cedSBarry Smith PetscOptionsHeadEnd(); 533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 54292f8084SBarry Smith } 55292f8084SBarry Smith 56*da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Constant(PF pf, void *value) 57d71ae5a4SJacob Faibussowitsch { 58292f8084SBarry Smith PetscScalar *loc; 59292f8084SBarry Smith 60292f8084SBarry Smith PetscFunctionBegin; 619566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2, &loc)); 62f6e5521dSKarl Rupp if (value) loc[0] = *(PetscScalar *)value; 63f6e5521dSKarl Rupp else loc[0] = 0.0; 64292f8084SBarry Smith loc[1] = pf->dimout; 659566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc)); 66292f8084SBarry Smith 67292f8084SBarry Smith pf->ops->setfromoptions = PFSetFromOptions_Constant; 683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 69292f8084SBarry Smith } 70292f8084SBarry Smith 715c8f6a95SKarl Rupp /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/ 726ac5842eSBarry Smith 73*da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *)) 74d71ae5a4SJacob Faibussowitsch { 75292f8084SBarry Smith PetscFunctionBegin; 769566063dSJacob Faibussowitsch PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL)); 773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 78292f8084SBarry Smith } 79292f8084SBarry Smith 80292f8084SBarry Smith /* -------------------------------------------------------------------------------------------------------------------*/ 81d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y) 82d71ae5a4SJacob Faibussowitsch { 83292f8084SBarry Smith PetscInt i; 84292f8084SBarry Smith 85292f8084SBarry Smith PetscFunctionBegin; 86292f8084SBarry Smith n *= *(PetscInt *)value; 87f6e5521dSKarl Rupp for (i = 0; i < n; i++) y[i] = x[i]; 883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 89292f8084SBarry Smith } 90292f8084SBarry Smith 91d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y) 92d71ae5a4SJacob Faibussowitsch { 93292f8084SBarry Smith PetscFunctionBegin; 94*da8c939bSJacob Faibussowitsch (void)value; 959566063dSJacob Faibussowitsch PetscCall(VecCopy(x, y)); 963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 97292f8084SBarry Smith } 98*da8c939bSJacob Faibussowitsch 99d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer) 100d71ae5a4SJacob Faibussowitsch { 101ace3abfcSBarry Smith PetscBool iascii; 102292f8084SBarry Smith 103292f8084SBarry Smith PetscFunctionBegin; 104*da8c939bSJacob Faibussowitsch (void)value; 1059566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii)); 10648a46eb9SPierre Jolivet if (iascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n")); 1073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 108292f8084SBarry Smith } 109*da8c939bSJacob Faibussowitsch 110d71ae5a4SJacob Faibussowitsch static PetscErrorCode PFDestroy_Identity(void *value) 111d71ae5a4SJacob Faibussowitsch { 112292f8084SBarry Smith PetscFunctionBegin; 1139566063dSJacob Faibussowitsch PetscCall(PetscFree(value)); 1143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 115292f8084SBarry Smith } 116292f8084SBarry Smith 117*da8c939bSJacob Faibussowitsch PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value) 118d71ae5a4SJacob Faibussowitsch { 119292f8084SBarry Smith PetscInt *loc; 120292f8084SBarry Smith 121292f8084SBarry Smith PetscFunctionBegin; 122*da8c939bSJacob Faibussowitsch (void)value; 12308401ef6SPierre 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); 1249566063dSJacob Faibussowitsch PetscCall(PetscNew(&loc)); 125292f8084SBarry Smith loc[0] = pf->dimout; 1269566063dSJacob Faibussowitsch PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc)); 1273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 128292f8084SBarry Smith } 129