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(PetscOptionItems *PetscOptionsObject,VecTagger tagger)
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: PetscOptionsHead(PetscOptionsObject,headstring);
30: PetscOptionsScalarArray("-vec_tagger_box","lower and upper bounds of the box",funcstring,inBoxVals,&nvals,&set);
31: PetscOptionsTail();
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: PetscNewLog(tagger,&smpl);
111: tagger->data = smpl;
112: return 0;
113: }