Actual source code: simple.c
2: #include <petsc/private/vecimpl.h>
3: #include "../src/vec/vec/utils/tagger/impls/simple.h"
5: PetscErrorCode VecTaggerDestroy_Simple(VecTagger tagger)
6: {
7: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
9: PetscFunctionBegin;
10: PetscCall(PetscFree(smpl->box));
11: PetscCall(PetscFree(tagger->data));
12: PetscFunctionReturn(PETSC_SUCCESS);
13: }
15: PetscErrorCode VecTaggerSetFromOptions_Simple(VecTagger tagger, PetscOptionItems *PetscOptionsObject)
16: {
17: PetscInt nvals, bs;
18: char headstring[BUFSIZ];
19: char funcstring[BUFSIZ];
20: const char *name;
21: PetscBool set;
22: PetscScalar *inBoxVals;
24: PetscFunctionBegin;
25: PetscCall(PetscObjectGetType((PetscObject)tagger, &name));
26: PetscCall(VecTaggerGetBlockSize(tagger, &bs));
27: nvals = 2 * bs;
28: PetscCall(PetscMalloc1(nvals, &inBoxVals));
29: PetscCall(PetscSNPrintf(headstring, BUFSIZ, "VecTagger %s options", name));
30: PetscCall(PetscSNPrintf(funcstring, BUFSIZ, "VecTagger%sSetBox()", name));
31: PetscOptionsHeadBegin(PetscOptionsObject, headstring);
32: PetscCall(PetscOptionsScalarArray("-vec_tagger_box", "lower and upper bounds of the box", funcstring, inBoxVals, &nvals, &set));
33: PetscOptionsHeadEnd();
34: if (set) {
35: PetscCheck(nvals == 2 * bs, PetscObjectComm((PetscObject)tagger), PETSC_ERR_ARG_INCOMP, "Expect array of %" PetscInt_FMT " values for -vec_tagger_box, got %" PetscInt_FMT, 2 * bs, nvals);
36: PetscCall(VecTaggerSetBox_Simple(tagger, (VecTaggerBox *)inBoxVals));
37: }
38: PetscCall(PetscFree(inBoxVals));
39: PetscFunctionReturn(PETSC_SUCCESS);
40: }
42: PetscErrorCode VecTaggerSetUp_Simple(VecTagger tagger)
43: {
44: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
46: PetscFunctionBegin;
47: PetscCheck(smpl->box, PetscObjectComm((PetscObject)tagger), PETSC_ERR_ARG_WRONGSTATE, "Must set a box before calling setup.");
48: PetscFunctionReturn(PETSC_SUCCESS);
49: }
51: PetscErrorCode VecTaggerView_Simple(VecTagger tagger, PetscViewer viewer)
52: {
53: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
54: PetscBool iascii;
56: PetscFunctionBegin;
57: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii));
58: if (iascii) {
59: PetscInt bs, i;
60: const char *name;
62: PetscCall(PetscObjectGetType((PetscObject)tagger, &name));
63: PetscCall(VecTaggerGetBlockSize(tagger, &bs));
64: PetscCall(PetscViewerASCIIPrintf(viewer, " %s box=[", name));
65: for (i = 0; i < bs; i++) {
66: if (i) PetscCall(PetscViewerASCIIPrintf(viewer, "; "));
67: #if !defined(PETSC_USE_COMPLEX)
68: PetscCall(PetscViewerASCIIPrintf(viewer, "%g,%g", (double)smpl->box[i].min, (double)smpl->box[i].max));
69: #else
70: PetscCall(PetscViewerASCIIPrintf(viewer, "%g+%gi,%g+%gi", (double)PetscRealPart(smpl->box[i].min), (double)PetscImaginaryPart(smpl->box[i].min), (double)PetscRealPart(smpl->box[i].max), (double)PetscImaginaryPart(smpl->box[i].max)));
71: #endif
72: }
73: PetscCall(PetscViewerASCIIPrintf(viewer, "]\n"));
74: }
75: PetscFunctionReturn(PETSC_SUCCESS);
76: }
78: PetscErrorCode VecTaggerSetBox_Simple(VecTagger tagger, VecTaggerBox *box)
79: {
80: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
82: PetscFunctionBegin;
85: if (box != smpl->box) {
86: PetscInt bs, i;
88: PetscCall(VecTaggerGetBlockSize(tagger, &bs));
89: PetscCall(PetscFree(smpl->box));
90: PetscCall(PetscMalloc1(bs, &(smpl->box)));
91: for (i = 0; i < bs; i++) smpl->box[i] = box[i];
92: }
93: PetscFunctionReturn(PETSC_SUCCESS);
94: }
96: PetscErrorCode VecTaggerGetBox_Simple(VecTagger tagger, const VecTaggerBox **box)
97: {
98: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
100: PetscFunctionBegin;
103: *box = smpl->box;
104: PetscFunctionReturn(PETSC_SUCCESS);
105: }
107: PetscErrorCode VecTaggerCreate_Simple(VecTagger tagger)
108: {
109: VecTagger_Simple *smpl;
111: PetscFunctionBegin;
112: tagger->ops->destroy = VecTaggerDestroy_Simple;
113: tagger->ops->setfromoptions = VecTaggerSetFromOptions_Simple;
114: tagger->ops->setup = VecTaggerSetUp_Simple;
115: tagger->ops->view = VecTaggerView_Simple;
116: tagger->ops->computeis = VecTaggerComputeIS_FromBoxes;
117: PetscCall(PetscNew(&smpl));
118: tagger->data = smpl;
119: PetscFunctionReturn(PETSC_SUCCESS);
120: }