1
2 #include <petsc/private/vecimpl.h> /*I "petscvec.h" I*/
3 #include "../src/vec/vec/utils/tagger/impls/simple.h"
4
VecTaggerDestroy_Simple(VecTagger tagger)5 PetscErrorCode VecTaggerDestroy_Simple(VecTagger tagger)
6 {
7 VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;
8 PetscErrorCode ierr;
9
10 PetscFunctionBegin;
11 ierr = PetscFree (smpl->box);CHKERRQ(ierr);
12 ierr = PetscFree (tagger->data);CHKERRQ(ierr);
13 PetscFunctionReturn(0);
14 }
15
VecTaggerSetFromOptions_Simple(PetscOptionItems * PetscOptionsObject,VecTagger tagger)16 PetscErrorCode VecTaggerSetFromOptions_Simple(PetscOptionItems *PetscOptionsObject,VecTagger tagger)
17 {
18 PetscInt nvals, bs;
19 char headstring[BUFSIZ];
20 char funcstring[BUFSIZ];
21 const char *name;
22 PetscBool set;
23 PetscScalar *inBoxVals;
24 PetscErrorCode ierr;
25
26 PetscFunctionBegin;
27 ierr = PetscObjectGetType((PetscObject)tagger,&name);CHKERRQ(ierr);
28 ierr = VecTaggerGetBlockSize(tagger,&bs);CHKERRQ(ierr);
29 nvals = 2 * bs;
30 ierr = PetscMalloc1(nvals,&inBoxVals);CHKERRQ(ierr);
31 ierr = PetscSNPrintf(headstring,BUFSIZ,"VecTagger %s options",name);CHKERRQ(ierr);
32 ierr = PetscSNPrintf(funcstring,BUFSIZ,"VecTagger%sSetBox()",name);CHKERRQ(ierr);
33 ierr = PetscOptionsHead(PetscOptionsObject,headstring);CHKERRQ(ierr);
34 ierr = PetscOptionsScalarArray("-vec_tagger_box","lower and upper bounds of the box",funcstring,inBoxVals,&nvals,&set);CHKERRQ(ierr);
35 ierr = PetscOptionsTail();CHKERRQ(ierr);
36 if (set) {
37 if (nvals != 2 *bs) SETERRQ2(PetscObjectComm((PetscObject)tagger),PETSC_ERR_ARG_INCOMP,"Expect array of %D values for -vec_tagger_box, got %D",2 * bs,nvals);
38 ierr = VecTaggerSetBox_Simple(tagger,(VecTaggerBox *)inBoxVals);CHKERRQ(ierr);
39 }
40 ierr = PetscFree(inBoxVals);CHKERRQ(ierr);
41 PetscFunctionReturn(0);
42 }
43
VecTaggerSetUp_Simple(VecTagger tagger)44 PetscErrorCode VecTaggerSetUp_Simple(VecTagger tagger)
45 {
46 VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;
47
48 PetscFunctionBegin;
49 if (!smpl->box) SETERRQ(PetscObjectComm((PetscObject)tagger),PETSC_ERR_ARG_WRONGSTATE,"Must set a box before calling setup.");
50 PetscFunctionReturn(0);
51 }
52
VecTaggerView_Simple(VecTagger tagger,PetscViewer viewer)53 PetscErrorCode VecTaggerView_Simple(VecTagger tagger, PetscViewer viewer)
54 {
55 VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;
56 PetscBool iascii;
57 PetscErrorCode ierr;
58
59 PetscFunctionBegin;
60 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
61 if (iascii) {
62 PetscInt bs, i;
63 const char *name;
64
65 ierr = PetscObjectGetType((PetscObject)tagger,&name);CHKERRQ(ierr);
66 ierr = VecTaggerGetBlockSize(tagger,&bs);CHKERRQ(ierr);
67 ierr = PetscViewerASCIIPrintf(viewer," %s box=[",name);CHKERRQ(ierr);
68 for (i = 0; i < bs; i++) {
69 if (i) {ierr = PetscViewerASCIIPrintf(viewer,"; ");CHKERRQ(ierr);}
70 #if !defined(PETSC_USE_COMPLEX)
71 ierr = PetscViewerASCIIPrintf(viewer,"%g,%g",(double)smpl->box[i].min,(double)smpl->box[i].max);CHKERRQ(ierr);
72 #else
73 ierr = 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));CHKERRQ(ierr);
74 #endif
75 }
76 ierr = PetscViewerASCIIPrintf(viewer,"]\n");CHKERRQ(ierr);
77 }
78 PetscFunctionReturn(0);
79 }
80
VecTaggerSetBox_Simple(VecTagger tagger,VecTaggerBox * box)81 PetscErrorCode VecTaggerSetBox_Simple(VecTagger tagger,VecTaggerBox *box)
82 {
83 VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;
84 PetscErrorCode ierr;
85
86 PetscFunctionBegin;
87 PetscValidHeaderSpecific(tagger,VEC_TAGGER_CLASSID,1);
88 PetscValidPointer(box,2);
89 if (box != smpl->box) {
90 PetscInt bs, i;
91
92 ierr = VecTaggerGetBlockSize(tagger,&bs);CHKERRQ(ierr);
93 ierr = PetscFree(smpl->box);CHKERRQ(ierr);
94 ierr = PetscMalloc1(bs,&(smpl->box));CHKERRQ(ierr);
95 for (i = 0; i < bs; i++) smpl->box[i] = box[i];
96 }
97 PetscFunctionReturn(0);
98 }
99
VecTaggerGetBox_Simple(VecTagger tagger,const VecTaggerBox ** box)100 PetscErrorCode VecTaggerGetBox_Simple(VecTagger tagger,const VecTaggerBox **box)
101 {
102 VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;
103
104 PetscFunctionBegin;
105 PetscValidHeaderSpecific(tagger,VEC_TAGGER_CLASSID,1);
106 PetscValidPointer(box,2);
107 *box = smpl->box;
108 PetscFunctionReturn(0);
109 }
110
VecTaggerCreate_Simple(VecTagger tagger)111 PetscErrorCode VecTaggerCreate_Simple(VecTagger tagger)
112 {
113 VecTagger_Simple *smpl;
114 PetscErrorCode ierr;
115
116 PetscFunctionBegin;
117 tagger->ops->destroy = VecTaggerDestroy_Simple;
118 tagger->ops->setfromoptions = VecTaggerSetFromOptions_Simple;
119 tagger->ops->setup = VecTaggerSetUp_Simple;
120 tagger->ops->view = VecTaggerView_Simple;
121 tagger->ops->computeis = VecTaggerComputeIS_FromBoxes;
122 ierr = PetscNewLog(tagger,&smpl);CHKERRQ(ierr);
123 tagger->data = smpl;
124 PetscFunctionReturn(0);
125 }
126