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: PetscFree(smpl->box);
10: PetscFree(tagger->data);
11: return 0;
12: }
14: PetscErrorCode VecTaggerSetFromOptions_Simple(VecTagger tagger, PetscOptionItems *PetscOptionsObject)
15: {
16: PetscInt nvals, bs;
17: char headstring[BUFSIZ];
18: char funcstring[BUFSIZ];
19: const char *name;
20: PetscBool set;
21: PetscScalar *inBoxVals;
23: PetscObjectGetType((PetscObject)tagger, &name);
24: VecTaggerGetBlockSize(tagger, &bs);
25: nvals = 2 * bs;
26: PetscMalloc1(nvals, &inBoxVals);
27: PetscSNPrintf(headstring, BUFSIZ, "VecTagger %s options", name);
28: PetscSNPrintf(funcstring, BUFSIZ, "VecTagger%sSetBox()", name);
29: PetscOptionsHeadBegin(PetscOptionsObject, headstring);
30: PetscOptionsScalarArray("-vec_tagger_box", "lower and upper bounds of the box", funcstring, inBoxVals, &nvals, &set);
31: PetscOptionsHeadEnd();
32: if (set) {
34: VecTaggerSetBox_Simple(tagger, (VecTaggerBox *)inBoxVals);
35: }
36: PetscFree(inBoxVals);
37: return 0;
38: }
40: PetscErrorCode VecTaggerSetUp_Simple(VecTagger tagger)
41: {
42: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
45: return 0;
46: }
48: PetscErrorCode VecTaggerView_Simple(VecTagger tagger, PetscViewer viewer)
49: {
50: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
51: PetscBool iascii;
53: PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &iascii);
54: if (iascii) {
55: PetscInt bs, i;
56: const char *name;
58: PetscObjectGetType((PetscObject)tagger, &name);
59: VecTaggerGetBlockSize(tagger, &bs);
60: PetscViewerASCIIPrintf(viewer, " %s box=[", name);
61: for (i = 0; i < bs; i++) {
62: if (i) PetscViewerASCIIPrintf(viewer, "; ");
63: #if !defined(PETSC_USE_COMPLEX)
64: PetscViewerASCIIPrintf(viewer, "%g,%g", (double)smpl->box[i].min, (double)smpl->box[i].max);
65: #else
66: 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));
67: #endif
68: }
69: PetscViewerASCIIPrintf(viewer, "]\n");
70: }
71: return 0;
72: }
74: PetscErrorCode VecTaggerSetBox_Simple(VecTagger tagger, VecTaggerBox *box)
75: {
76: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
80: if (box != smpl->box) {
81: PetscInt bs, i;
83: VecTaggerGetBlockSize(tagger, &bs);
84: PetscFree(smpl->box);
85: PetscMalloc1(bs, &(smpl->box));
86: for (i = 0; i < bs; i++) smpl->box[i] = box[i];
87: }
88: return 0;
89: }
91: PetscErrorCode VecTaggerGetBox_Simple(VecTagger tagger, const VecTaggerBox **box)
92: {
93: VecTagger_Simple *smpl = (VecTagger_Simple *)tagger->data;
97: *box = smpl->box;
98: return 0;
99: }
101: PetscErrorCode VecTaggerCreate_Simple(VecTagger tagger)
102: {
103: VecTagger_Simple *smpl;
105: tagger->ops->destroy = VecTaggerDestroy_Simple;
106: tagger->ops->setfromoptions = VecTaggerSetFromOptions_Simple;
107: tagger->ops->setup = VecTaggerSetUp_Simple;
108: tagger->ops->view = VecTaggerView_Simple;
109: tagger->ops->computeis = VecTaggerComputeIS_FromBoxes;
110: PetscNew(&smpl);
111: tagger->data = smpl;
112: return 0;
113: }