Actual source code: ex1.c


  2: static char help[] = "VecTagger interface routines.\n\n";

  4: #include <petscvec.h>

  6: static PetscErrorCode ISGetBlockGlobalIS(IS is, Vec vec, PetscInt bs, IS *isBlockGlobal)
  7: {
  8:   const PetscInt *idxin;
  9:   PetscInt       *idxout, i, n, rstart;
 10:   PetscLayout    map;


 15:   VecGetLayout(vec,&map);
 16:   rstart = map->rstart / bs;
 17:   ISGetLocalSize(is, &n);
 18:   PetscMalloc1(n, &idxout);
 19:   ISGetIndices(is, &idxin);
 20:   for (i = 0; i < n; i++) idxout[i] = rstart + idxin[i];
 21:   ISRestoreIndices(is, &idxin);
 22:   ISCreateBlock(PetscObjectComm((PetscObject)vec),bs,n,idxout,PETSC_OWN_POINTER,isBlockGlobal);
 23:   return(0);
 24: }

 26: int main(int argc, char **argv)
 27: {
 28:   Vec            vec, tagged, untagged;
 29:   VecScatter     taggedScatter, untaggedScatter;
 30:   PetscInt       bs;
 31:   PetscInt       n, nloc, nint, i, j, k, localStart, localEnd, ntagged, nuntagged;
 32:   MPI_Comm       comm;
 33:   VecTagger      tagger;
 34:   PetscScalar    *array;
 35:   PetscRandom    rand;
 36:   VecTaggerBox   *defaultBox;
 37:   VecTaggerBox   *boxes;
 38:   IS             is, isBlockGlobal, isComp;

 41:   PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
 42:   n    = 10.;
 43:   bs   = 1;
 44:   comm = PETSC_COMM_WORLD;
 45:   PetscOptionsBegin(comm, "" , "VecTagger Test Options", "Vec");
 46:   PetscOptionsInt("-bs","The block size of the vector","ex1.c",bs,&bs,NULL);
 47:   PetscOptionsInt("-n","The size of the vector (in blocks)","ex1.c",n,&n,NULL);
 48:   PetscOptionsEnd();

 50:   PetscRandomCreate(comm,&rand);
 51:   PetscRandomSetFromOptions(rand);

 53:   VecCreate(comm,&vec);
 54:   PetscObjectSetName((PetscObject)vec,"Vec to Tag");
 55:   VecSetBlockSize(vec,bs);
 56:   VecSetSizes(vec,PETSC_DECIDE,n);
 57:   VecSetUp(vec);
 58:   VecGetLocalSize(vec,&nloc);
 59:   VecGetArray(vec,&array);
 60:   for (i = 0; i < nloc; i++) {
 61:     PetscScalar val;

 63:     PetscRandomGetValue(rand,&val);
 64:     array[i] = val;
 65:   }
 66:   VecRestoreArray(vec,&array);
 67:   PetscRandomDestroy(&rand);
 68:   VecViewFromOptions(vec,NULL,"-vec_view");

 70:   VecTaggerCreate(comm,&tagger);
 71:   VecTaggerSetBlockSize(tagger,bs);
 72:   VecTaggerSetType(tagger,VECTAGGERABSOLUTE);
 73:   PetscMalloc1(bs,&defaultBox);
 74:   for (i = 0; i < bs; i++) {
 75: #if !defined(PETSC_USE_COMPLEX)
 76:     defaultBox[i].min = 0.1;
 77:     defaultBox[i].max = 1.5;
 78: #else
 79:     defaultBox[i].min = PetscCMPLX(0.1,0.1);
 80:     defaultBox[i].max = PetscCMPLX(1.5,1.5);
 81: #endif
 82:   }
 83:   VecTaggerAbsoluteSetBox(tagger,defaultBox);
 84:   PetscFree(defaultBox);
 85:   VecTaggerSetFromOptions(tagger);
 86:   VecTaggerSetUp(tagger);
 87:   PetscObjectViewFromOptions((PetscObject)tagger,NULL,"-vec_tagger_view");
 88:   VecTaggerGetBlockSize(tagger,&bs);

 90:   VecTaggerComputeBoxes(tagger,vec,&nint,&boxes);
 91:   if (ierr && ierr != PETSC_ERR_SUP) 
 92:   else {
 93:     PetscViewer viewer = NULL;

 95:     PetscOptionsGetViewer(comm,NULL,NULL,"-vec_tagger_boxes_view",&viewer,NULL,NULL);
 96:     if (viewer) {
 97:       PetscBool iascii;

 99:       PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
100:       if (iascii) {
101:         PetscViewerASCIIPrintf(viewer,"Num boxes: %D\n",nint);
102:         PetscViewerASCIIPushTab(viewer);
103:         for (i = 0, k = 0; i < nint; i++) {
104:           PetscViewerASCIIPrintf(viewer,"%D: ",i);
105:           for (j = 0; j < bs; j++, k++) {
106:             if (j) {PetscViewerASCIIPrintf(viewer," x ");}
107: #if !defined(PETSC_USE_COMPLEX)
108:             PetscViewerASCIIPrintf(viewer,"[%g,%g]",(double)boxes[k].min,(double)boxes[k].max);
109: #else
110:             PetscViewerASCIIPrintf(viewer,"[%g+%gi,%g+%gi]",(double)PetscRealPart(boxes[k].min),(double)PetscImaginaryPart(boxes[k].min),(double)PetscRealPart(boxes[k].max),(double)PetscImaginaryPart(boxes[k].max));
111: #endif
112:           }
113:           PetscViewerASCIIPrintf(viewer,"\n");
114:         }
115:         PetscViewerASCIIPopTab(viewer);
116:       }
117:     }
118:     PetscViewerDestroy(&viewer);
119:     PetscFree(boxes);
120:   }

122:   VecTaggerComputeIS(tagger,vec,&is);
123:   ISGetBlockGlobalIS(is,vec,bs,&isBlockGlobal);
124:   PetscObjectSetName((PetscObject)isBlockGlobal,"Tagged IS (block global)");
125:   ISViewFromOptions(isBlockGlobal,NULL,"-tagged_is_view");

127:   VecGetOwnershipRange(vec,&localStart,&localEnd);
128:   ISComplement(isBlockGlobal,localStart,localEnd,&isComp);
129:   PetscObjectSetName((PetscObject)isComp,"Untagged IS (global)");
130:   ISViewFromOptions(isComp,NULL,"-untagged_is_view");

132:   ISGetLocalSize(isBlockGlobal,&ntagged);
133:   ISGetLocalSize(isComp,&nuntagged);

135:   VecCreate(comm,&tagged);
136:   PetscObjectSetName((PetscObject)tagged,"Tagged selection");
137:   VecSetSizes(tagged,ntagged,PETSC_DETERMINE);
138:   VecSetUp(tagged);

140:   VecCreate(comm,&untagged);
141:   PetscObjectSetName((PetscObject)untagged,"Untagged selection");
142:   VecSetSizes(untagged,nuntagged,PETSC_DETERMINE);
143:   VecSetUp(untagged);

145:   VecScatterCreate(vec,isBlockGlobal,tagged,NULL,&taggedScatter);
146:   VecScatterCreate(vec,isComp,untagged,NULL,&untaggedScatter);

148:   VecScatterBegin(taggedScatter,vec,tagged,INSERT_VALUES,SCATTER_FORWARD);
149:   VecScatterEnd(taggedScatter,vec,tagged,INSERT_VALUES,SCATTER_FORWARD);
150:   VecScatterBegin(untaggedScatter,vec,untagged,INSERT_VALUES,SCATTER_FORWARD);
151:   VecScatterEnd(untaggedScatter,vec,untagged,INSERT_VALUES,SCATTER_FORWARD);

153:   VecViewFromOptions(tagged,NULL,"-tagged_vec_view");
154:   VecViewFromOptions(untagged,NULL,"-untagged_vec_view");

156:   VecScatterDestroy(&untaggedScatter);
157:   VecScatterDestroy(&taggedScatter);

159:   VecDestroy(&untagged);
160:   VecDestroy(&tagged);
161:   ISDestroy(&isComp);
162:   ISDestroy(&isBlockGlobal);
163:   ISDestroy(&is);

165:   VecTaggerDestroy(&tagger);
166:   VecDestroy(&vec);
167:   PetscFinalize();
168:   return ierr;
169: }

171: /*TEST

173:   test:
174:     suffix: 0
175:     requires: !complex
176:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view

178:   test:
179:     suffix: 1
180:     requires: !complex
181:     nsize: 3
182:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view

184:   test:
185:     suffix: 2
186:     requires: !complex
187:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -bs 2

189:   test:
190:     suffix: 3
191:     requires: !complex
192:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_block_size 2 -vec_tagger_box 0.1,1.5,0.1,1.5

194:   test:
195:     suffix: 4
196:     requires: !complex
197:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_invert

199:   test:
200:     suffix: 5
201:     requires: !complex
202:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type relative -vec_tagger_box 0.25,0.75

204:   test:
205:     suffix: 6
206:     requires: !complex
207:     nsize: 3
208:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type cdf -vec_tagger_box 0.25,0.75

210:   test:
211:     suffix: 7
212:     requires: !complex
213:     nsize: 3
214:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type cdf -vec_tagger_box 0.25,0.75 -vec_tagger_cdf_method iterative -vec_tagger_cdf_max_it 10

216:   test:
217:     suffix: 8
218:     requires: !complex
219:     nsize: 3
220:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type or -vec_tagger_num_subs 2 -sub_0_vec_tagger_type absolute -sub_0_vec_tagger_box 0.0,0.25 -sub_1_vec_tagger_type relative -sub_1_vec_tagger_box 0.75,inf
221:     filter: sed -e s~Inf~inf~g

223:   test:
224:     suffix: 9
225:     requires: !complex
226:     nsize: 3
227:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type and -vec_tagger_num_subs 2 -sub_0_vec_tagger_type absolute -sub_0_vec_tagger_box -inf,0.5 -sub_1_vec_tagger_type relative -sub_1_vec_tagger_box 0.25,0.75
228:     filter: sed -e s~Inf~inf~g

230:   test:
231:     suffix: 10
232:     requires: complex
233:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view

235:   test:
236:     suffix: 11
237:     requires: complex
238:     nsize: 3
239:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view

241:   test:
242:     suffix: 12
243:     requires: complex
244:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -bs 2

246:   test:
247:     suffix: 13
248:     requires: complex
249:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_block_size 2 -vec_tagger_box 0.1+0.1i,1.5+1.5i,0.1+0.1i,1.5+1.5i

251:   test:
252:     suffix: 14
253:     requires: complex
254:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_invert

256:   test:
257:     suffix: 15
258:     requires: complex
259:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type relative -vec_tagger_box 0.25+0.25i,0.75+0.75i

261:   test:
262:     suffix: 16
263:     requires: complex
264:     nsize: 3
265:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type cdf -vec_tagger_box 0.25+0.25i,0.75+0.75i

267:   test:
268:     suffix: 17
269:     requires: complex
270:     nsize: 3
271:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type cdf -vec_tagger_box 0.25+0.25i,0.75+0.75i -vec_tagger_cdf_method iterative -vec_tagger_cdf_max_it 10

273:   test:
274:     suffix: 18
275:     requires: complex
276:     nsize: 3
277:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type or -vec_tagger_num_subs 2 -sub_0_vec_tagger_type absolute -sub_0_vec_tagger_box 0.0+0.0i,0.25+0.25i -sub_1_vec_tagger_type relative -sub_1_vec_tagger_box 0.75+0.75i,inf+infi
278:     filter: sed -e s~Inf~inf~g

280:   test:
281:     suffix: 19
282:     requires: complex
283:     nsize: 3
284:     args: -n 12 -vec_view -vec_tagger_view -vec_tagger_boxes_view -tagged_is_view -untagged_is_view -tagged_vec_view -untagged_vec_view -vec_tagger_type and -vec_tagger_num_subs 2 -sub_0_vec_tagger_type absolute -sub_0_vec_tagger_box -inf-infi,0.75+0.75i -sub_1_vec_tagger_type relative -sub_1_vec_tagger_box 0.25+0.25i,1.+1.i
285:     filter: sed -e s~Inf~inf~g

287: TEST*/