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;

     11:   PetscFree (smpl->box);
     12:   PetscFree (tagger->data);
     13:   return(0);
     14: }

     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;

     27:   PetscObjectGetType((PetscObject)tagger,&name);
     28:   VecTaggerGetBlockSize(tagger,&bs);
     29:   nvals = 2 * bs;
     30:   PetscMalloc1(nvals,&inBoxVals);
     31:   PetscSNPrintf(headstring,BUFSIZ,"VecTagger %s options",name);
     32:   PetscSNPrintf(funcstring,BUFSIZ,"VecTagger%sSetBox()",name);
     33:   PetscOptionsHead(PetscOptionsObject,headstring);
     34:   PetscOptionsScalarArray("-vec_tagger_box","lower and upper bounds of the box",funcstring,inBoxVals,&nvals,&set);
     35:   PetscOptionsTail();
     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:     VecTaggerSetBox_Simple(tagger,(VecTaggerBox *)inBoxVals);
     39:   }
     40:   PetscFree(inBoxVals);
     41:   return(0);
     42: }

     44: PetscErrorCode VecTaggerSetUp_Simple(VecTagger tagger)
     45: {
     46:   VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;

     49:   if (!smpl->box) SETERRQ(PetscObjectComm((PetscObject)tagger),PETSC_ERR_ARG_WRONGSTATE,"Must set a box before calling setup.");
     50:   return(0);
     51: }

     53: PetscErrorCode VecTaggerView_Simple(VecTagger tagger, PetscViewer viewer)
     54: {
     55:   VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;
     56:   PetscBool        iascii;
     57:   PetscErrorCode   ierr;

     60:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
     61:   if (iascii) {
     62:     PetscInt bs, i;
     63:     const char *name;

     65:     PetscObjectGetType((PetscObject)tagger,&name);
     66:     VecTaggerGetBlockSize(tagger,&bs);
     67:     PetscViewerASCIIPrintf(viewer," %s box=[",name);
     68:     for (i = 0; i < bs; i++) {
     69:       if (i) {PetscViewerASCIIPrintf(viewer,"; ");}
     70: #if !defined(PETSC_USE_COMPLEX)
     71:       PetscViewerASCIIPrintf(viewer,"%g,%g",(double)smpl->box[i].min,(double)smpl->box[i].max);
     72: #else
     73:       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));
     74: #endif
     75:     }
     76:     PetscViewerASCIIPrintf(viewer,"]\n");
     77:   }
     78:   return(0);
     79: }

     81: PetscErrorCode VecTaggerSetBox_Simple(VecTagger tagger,VecTaggerBox *box)
     82: {
     83:   VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;

     89:   if (box != smpl->box) {
     90:     PetscInt bs, i;

     92:     VecTaggerGetBlockSize(tagger,&bs);
     93:     PetscFree(smpl->box);
     94:     PetscMalloc1(bs,&(smpl->box));
     95:     for (i = 0; i < bs; i++) smpl->box[i] = box[i];
     96:   }
     97:   return(0);
     98: }

    100: PetscErrorCode VecTaggerGetBox_Simple(VecTagger tagger,const VecTaggerBox **box)
    101: {
    102:   VecTagger_Simple *smpl = (VecTagger_Simple *) tagger->data;

    107:   *box = smpl->box;
    108:   return(0);
    109: }

    111: PetscErrorCode VecTaggerCreate_Simple(VecTagger tagger)
    112: {
    113:   VecTagger_Simple *smpl;
    114:   PetscErrorCode     ierr;

    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:   PetscNewLog(tagger,&smpl);
    123:   tagger->data = smpl;
    124:   return(0);
    125: }