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