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;


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

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

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

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

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

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

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

 89:   VecTaggerComputeBoxes(tagger,vec,&nint,&boxes,&listed);
 90:   if (listed) {
 91:     PetscViewer viewer = NULL;

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

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

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

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

130:   ISGetLocalSize(isBlockGlobal,&ntagged);
131:   ISGetLocalSize(isComp,&nuntagged);

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

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

143:   VecScatterCreate(vec,isBlockGlobal,tagged,NULL,&taggedScatter);
144:   VecScatterCreate(vec,isComp,untagged,NULL,&untaggedScatter);

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

151:   VecViewFromOptions(tagged,NULL,"-tagged_vec_view");
152:   VecViewFromOptions(untagged,NULL,"-untagged_vec_view");

154:   VecScatterDestroy(&untaggedScatter);
155:   VecScatterDestroy(&taggedScatter);

157:   VecDestroy(&untagged);
158:   VecDestroy(&tagged);
159:   ISDestroy(&isComp);
160:   ISDestroy(&isBlockGlobal);
161:   ISDestroy(&is);

163:   VecTaggerDestroy(&tagger);
164:   VecDestroy(&vec);
165:   PetscFinalize();
166:   return 0;
167: }

169: /*TEST

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

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

182:   test:
183:     suffix: 2
184:     requires: !complex
185:     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

187:   test:
188:     suffix: 3
189:     requires: !complex
190:     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

192:   test:
193:     suffix: 4
194:     requires: !complex
195:     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

197:   test:
198:     suffix: 5
199:     requires: !complex
200:     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

202:   test:
203:     suffix: 6
204:     requires: !complex
205:     nsize: 3
206:     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

208:   test:
209:     suffix: 7
210:     requires: !complex
211:     nsize: 3
212:     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

214:   test:
215:     suffix: 8
216:     requires: !complex
217:     nsize: 3
218:     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
219:     filter: sed -e s~Inf~inf~g

221:   test:
222:     suffix: 9
223:     requires: !complex
224:     nsize: 3
225:     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
226:     filter: sed -e s~Inf~inf~g

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

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

239:   test:
240:     suffix: 12
241:     requires: complex
242:     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

244:   test:
245:     suffix: 13
246:     requires: complex
247:     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

249:   test:
250:     suffix: 14
251:     requires: complex
252:     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

254:   test:
255:     suffix: 15
256:     requires: complex
257:     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

259:   test:
260:     suffix: 16
261:     requires: complex
262:     nsize: 3
263:     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

265:   test:
266:     suffix: 17
267:     requires: complex
268:     nsize: 3
269:     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

271:   test:
272:     suffix: 18
273:     requires: complex
274:     nsize: 3
275:     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
276:     filter: sed -e s~Inf~inf~g

278:   test:
279:     suffix: 19
280:     requires: complex
281:     nsize: 3
282:     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
283:     filter: sed -e s~Inf~inf~g

285: TEST*/