1 #include <../src/vec/pf/pfimpl.h> /*I "petscpf.h" I*/ 2 3 static PetscErrorCode PFApply_Constant(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y) 4 { 5 PetscInt i; 6 PetscScalar v = ((PetscScalar *)value)[0]; 7 8 PetscFunctionBegin; 9 n *= (PetscInt)PetscRealPart(((PetscScalar *)value)[1]); 10 for (i = 0; i < n; i++) y[i] = v; 11 PetscFunctionReturn(PETSC_SUCCESS); 12 } 13 14 static PetscErrorCode PFApplyVec_Constant(void *value, Vec x, Vec y) 15 { 16 PetscFunctionBegin; 17 PetscCall(VecSet(y, *((PetscScalar *)value))); 18 PetscFunctionReturn(PETSC_SUCCESS); 19 } 20 21 static PetscErrorCode PFView_Constant(void *value, PetscViewer viewer) 22 { 23 PetscBool isascii; 24 25 PetscFunctionBegin; 26 PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 27 if (isascii) { 28 #if !defined(PETSC_USE_COMPLEX) 29 PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g\n", *(double *)value)); 30 #else 31 PetscCall(PetscViewerASCIIPrintf(viewer, "Constant = %g + %gi\n", (double)PetscRealPart(*(PetscScalar *)value), (double)PetscImaginaryPart(*(PetscScalar *)value))); 32 #endif 33 } 34 PetscFunctionReturn(PETSC_SUCCESS); 35 } 36 37 static PetscErrorCode PFDestroy_Constant(void *value) 38 { 39 PetscFunctionBegin; 40 PetscCall(PetscFree(value)); 41 PetscFunctionReturn(PETSC_SUCCESS); 42 } 43 44 static PetscErrorCode PFSetFromOptions_Constant(PF pf, PetscOptionItems PetscOptionsObject) 45 { 46 PetscScalar *value = (PetscScalar *)pf->data; 47 48 PetscFunctionBegin; 49 PetscOptionsHeadBegin(PetscOptionsObject, "Constant function options"); 50 PetscCall(PetscOptionsScalar("-pf_constant", "The constant value", "None", *value, value, NULL)); 51 PetscOptionsHeadEnd(); 52 PetscFunctionReturn(PETSC_SUCCESS); 53 } 54 55 PETSC_INTERN PetscErrorCode PFCreate_Constant(PF pf, void *value) 56 { 57 PetscScalar *loc; 58 59 PetscFunctionBegin; 60 PetscCall(PetscMalloc1(2, &loc)); 61 if (value) loc[0] = *(PetscScalar *)value; 62 else loc[0] = 0.0; 63 loc[1] = pf->dimout; 64 PetscCall(PFSet(pf, PFApply_Constant, PFApplyVec_Constant, PFView_Constant, PFDestroy_Constant, loc)); 65 66 pf->ops->setfromoptions = PFSetFromOptions_Constant; 67 PetscFunctionReturn(PETSC_SUCCESS); 68 } 69 70 /*typedef PetscErrorCode (*FCN)(void*,PetscInt,const PetscScalar*,PetscScalar*); force argument to next function to not be extern C*/ 71 72 PETSC_INTERN PetscErrorCode PFCreate_Quick(PF pf, PetscErrorCode (*function)(void *, PetscInt, const PetscScalar *, PetscScalar *)) 73 { 74 PetscFunctionBegin; 75 PetscCall(PFSet(pf, function, NULL, NULL, NULL, NULL)); 76 PetscFunctionReturn(PETSC_SUCCESS); 77 } 78 79 static PetscErrorCode PFApply_Identity(void *value, PetscInt n, const PetscScalar *x, PetscScalar *y) 80 { 81 PetscInt i; 82 83 PetscFunctionBegin; 84 n *= *(PetscInt *)value; 85 for (i = 0; i < n; i++) y[i] = x[i]; 86 PetscFunctionReturn(PETSC_SUCCESS); 87 } 88 89 static PetscErrorCode PFApplyVec_Identity(void *value, Vec x, Vec y) 90 { 91 PetscFunctionBegin; 92 (void)value; 93 PetscCall(VecCopy(x, y)); 94 PetscFunctionReturn(PETSC_SUCCESS); 95 } 96 97 static PetscErrorCode PFView_Identity(void *value, PetscViewer viewer) 98 { 99 PetscBool isascii; 100 101 PetscFunctionBegin; 102 (void)value; 103 PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 104 if (isascii) PetscCall(PetscViewerASCIIPrintf(viewer, "Identity function\n")); 105 PetscFunctionReturn(PETSC_SUCCESS); 106 } 107 108 static PetscErrorCode PFDestroy_Identity(void *value) 109 { 110 PetscFunctionBegin; 111 PetscCall(PetscFree(value)); 112 PetscFunctionReturn(PETSC_SUCCESS); 113 } 114 115 PETSC_INTERN PetscErrorCode PFCreate_Identity(PF pf, void *value) 116 { 117 PetscInt *loc; 118 119 PetscFunctionBegin; 120 (void)value; 121 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); 122 PetscCall(PetscNew(&loc)); 123 loc[0] = pf->dimout; 124 PetscCall(PFSet(pf, PFApply_Identity, PFApplyVec_Identity, PFView_Identity, PFDestroy_Identity, loc)); 125 PetscFunctionReturn(PETSC_SUCCESS); 126 } 127