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