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: }