Actual source code: ao.c

  1: /*
  2:    Defines the abstract operations on AO (application orderings)
  3: */
  4: #include <../src/vec/is/ao/aoimpl.h>

  6: /* Logging support */
  7: PetscClassId  AO_CLASSID;
  8: PetscLogEvent AO_PetscToApplication, AO_ApplicationToPetsc;

 10: /*@
 11:   AOView - Displays an application ordering.

 13:   Collective

 15:   Input Parameters:
 16: + ao     - the application ordering context
 17: - viewer - viewer used for display

 19:   Level: intermediate

 21:   Options Database Key:
 22: . -ao_view - calls `AOView()` at end of `AOCreate()`

 24:   Notes:
 25:   The available visualization contexts include
 26: +     `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
 27: -     `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
 28:   output where only the first processor opens
 29:   the file.  All other processors send their
 30:   data to the first processor to print.

 32:   The user can open an alternative visualization context with
 33:   `PetscViewerASCIIOpen()` - output to a specified file.

 35: .seealso: [](sec_ao), `AO`, `PetscViewerASCIIOpen()`, `AOViewFromOptions()`
 36: @*/
 37: PetscErrorCode AOView(AO ao, PetscViewer viewer)
 38: {
 39:   PetscFunctionBegin;
 41:   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ao), &viewer));

 44:   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)ao, viewer));
 45:   PetscUseTypeMethod(ao, view, viewer);
 46:   PetscFunctionReturn(PETSC_SUCCESS);
 47: }

 49: /*@
 50:   AOViewFromOptions - View an `AO` based on values in the options database

 52:   Collective

 54:   Input Parameters:
 55: + ao   - the application ordering context
 56: . obj  - optional object that provides the prefix used to search the options database
 57: - name - command line option

 59:   Level: intermediate

 61: .seealso: [](sec_ao), `AO`, `AOView()`, `PetscObjectViewFromOptions()`, `AOCreate()`
 62: @*/
 63: PetscErrorCode AOViewFromOptions(AO ao, PetscObject obj, const char name[])
 64: {
 65:   PetscFunctionBegin;
 67:   PetscCall(PetscObjectViewFromOptions((PetscObject)ao, obj, name));
 68:   PetscFunctionReturn(PETSC_SUCCESS);
 69: }

 71: /*@
 72:   AODestroy - Destroys an application ordering.

 74:   Collective

 76:   Input Parameter:
 77: . ao - the application ordering context

 79:   Level: beginner

 81: .seealso: [](sec_ao), `AO`, `AOCreate()`
 82: @*/
 83: PetscErrorCode AODestroy(AO *ao)
 84: {
 85:   PetscFunctionBegin;
 86:   if (!*ao) PetscFunctionReturn(PETSC_SUCCESS);
 88:   if (--((PetscObject)*ao)->refct > 0) {
 89:     *ao = NULL;
 90:     PetscFunctionReturn(PETSC_SUCCESS);
 91:   }
 92:   /* if memory was published with SAWs then destroy it */
 93:   PetscCall(PetscObjectSAWsViewOff((PetscObject)*ao));
 94:   PetscCall(ISDestroy(&(*ao)->isapp));
 95:   PetscCall(ISDestroy(&(*ao)->ispetsc));
 96:   /* destroy the internal part */
 97:   PetscTryTypeMethod(*ao, destroy);
 98:   PetscCall(PetscHeaderDestroy(ao));
 99:   PetscFunctionReturn(PETSC_SUCCESS);
100: }

102: #include <../src/vec/is/is/impls/general/general.h>

104: PETSC_INTERN PetscErrorCode ISSetUp_General(IS);

106: /*@
107:   AOPetscToApplicationIS - Maps an index set in the PETSc ordering to
108:   the application-defined ordering.

110:   Collective

112:   Input Parameters:
113: + ao - the application ordering context
114: - is - the index set; this is replaced with its mapped values

116:   Output Parameter:
117: . is - the mapped index set

119:   Level: intermediate

121:   Notes:
122:   The index set cannot be of `ISType` `ISSTRIDE` or `ISBLOCK`.

124:   Any integers in is that are negative are left unchanged. This
125:   allows one to convert, for example, neighbor lists that use negative
126:   entries to indicate nonexistent neighbors due to boundary conditions etc.

128: .seealso: [](sec_ao), `AO`, `AOCreateBasic()`, `AOView()`, `AOApplicationToPetsc()`,
129:           `AOApplicationToPetscIS()`, `AOPetscToApplication()`, `ISSTRIDE`, `ISBLOCK`
130: @*/
131: PetscErrorCode AOPetscToApplicationIS(AO ao, IS is)
132: {
133:   PetscInt  n;
134:   PetscInt *ia;

136:   PetscFunctionBegin;
139:   PetscCall(ISToGeneral(is));
140:   /* we cheat because we know the IS is general and that we can change the indices */
141:   PetscCall(ISGetIndices(is, (const PetscInt **)&ia));
142:   PetscCall(ISGetLocalSize(is, &n));
143:   PetscUseTypeMethod(ao, petsctoapplication, n, ia);
144:   PetscCall(ISRestoreIndices(is, (const PetscInt **)&ia));
145:   /* updated cached values (sorted, min, max, etc.)*/
146:   PetscCall(ISSetUp_General(is));
147:   PetscFunctionReturn(PETSC_SUCCESS);
148: }

150: /*@
151:   AOApplicationToPetscIS - Maps an index set in the application-defined
152:   ordering to the PETSc ordering.

154:   Collective

156:   Input Parameters:
157: + ao - the application ordering context
158: - is - the index set; this is replaced with its mapped values

160:   Output Parameter:
161: . is - the mapped index set

163:   Level: beginner

165:   Notes:
166:   The index set cannot be of `ISType` `ISSTRIDE` or `ISBLOCK`

168:   Any integers in is that are negative are left unchanged. This
169:   allows one to convert, for example, neighbor lists that use negative
170:   entries to indicate nonexistent neighbors due to boundary conditions, etc.

172: .seealso: [](sec_ao), `AO`, `AOCreateBasic()`, `AOView()`, `AOPetscToApplication()`,
173:           `AOPetscToApplicationIS()`, `AOApplicationToPetsc()`, `ISSTRIDE`, `ISBLOCK`
174: @*/
175: PetscErrorCode AOApplicationToPetscIS(AO ao, IS is)
176: {
177:   PetscInt n, *ia;

179:   PetscFunctionBegin;
182:   PetscCall(ISToGeneral(is));
183:   /* we cheat because we know the IS is general and that we can change the indices */
184:   PetscCall(ISGetIndices(is, (const PetscInt **)&ia));
185:   PetscCall(ISGetLocalSize(is, &n));
186:   PetscUseTypeMethod(ao, applicationtopetsc, n, ia);
187:   PetscCall(ISRestoreIndices(is, (const PetscInt **)&ia));
188:   /* updated cached values (sorted, min, max, etc.)*/
189:   PetscCall(ISSetUp_General(is));
190:   PetscFunctionReturn(PETSC_SUCCESS);
191: }

193: /*@
194:   AOPetscToApplication - Maps a set of integers in the PETSc ordering to
195:   the application-defined ordering.

197:   Collective

199:   Input Parameters:
200: + ao - the application ordering context
201: . n  - the number of integers
202: - ia - the integers; these are replaced with their mapped value

204:   Output Parameter:
205: . ia - the mapped integers

207:   Level: beginner

209:   Note:
210:   Any integers in `ia` that are negative are left unchanged. This
211:   allows one to convert, for example, neighbor lists that use negative
212:   entries to indicate nonexistent neighbors due to boundary conditions, etc.

214:   Integers that are out of range are mapped to -1

216: .seealso: [](sec_ao), `AO`, `AOCreateBasic()`, `AOView()`, `AOApplicationToPetsc()`,
217:           `AOPetscToApplicationIS()`
218: @*/
219: PetscErrorCode AOPetscToApplication(AO ao, PetscInt n, PetscInt ia[])
220: {
221:   PetscFunctionBegin;
223:   if (n) PetscAssertPointer(ia, 3);
224:   PetscUseTypeMethod(ao, petsctoapplication, n, ia);
225:   PetscFunctionReturn(PETSC_SUCCESS);
226: }

228: /*@
229:   AOApplicationToPetsc - Maps a set of integers in the application-defined
230:   ordering to the PETSc ordering.

232:   Collective

234:   Input Parameters:
235: + ao - the application ordering context
236: . n  - the number of integers
237: - ia - the integers; these are replaced with their mapped value

239:   Output Parameter:
240: . ia - the mapped integers

242:   Level: beginner

244:   Notes:
245:   Any integers in `ia` that are negative are left unchanged. This
246:   allows one to convert, for example, neighbor lists that use negative
247:   entries to indicate nonexistent neighbors due to boundary conditions, etc.

249:   Integers that are out of range are mapped to -1

251: .seealso: [](sec_ao), `AOCreateBasic()`, `AOView()`, `AOPetscToApplication()`,
252:           `AOPetscToApplicationIS()`
253: @*/
254: PetscErrorCode AOApplicationToPetsc(AO ao, PetscInt n, PetscInt ia[])
255: {
256:   PetscFunctionBegin;
258:   if (n) PetscAssertPointer(ia, 3);
259:   PetscUseTypeMethod(ao, applicationtopetsc, n, ia);
260:   PetscFunctionReturn(PETSC_SUCCESS);
261: }

263: /*@
264:   AOPetscToApplicationPermuteInt - Permutes an array of blocks of integers
265:   in the PETSc ordering to the application-defined ordering.

267:   Collective

269:   Input Parameters:
270: + ao    - The application ordering context
271: . block - The block size
272: - array - The integer array

274:   Output Parameter:
275: . array - The permuted array

277:   Level: beginner

279:   Notes:
280:   The length of the array should be $block*N$, where `N` is length
281:   provided to the AOCreate*() method that created the `AO`.

283:   The permutation takes `array[i_pet] --> array[i_app]`, where `i_app` is
284:   the index of `i` in the application ordering and `i_pet` is the index
285:   of `i` in the PETSc ordering.

287: .seealso: [](sec_ao), `AO`, `AOCreateBasic()`, `AOView()`, `AOApplicationToPetsc()`, `AOPetscToApplicationIS()`
288: @*/
289: PetscErrorCode AOPetscToApplicationPermuteInt(AO ao, PetscInt block, PetscInt array[])
290: {
291:   PetscFunctionBegin;
293:   PetscAssertPointer(array, 3);
294:   PetscUseTypeMethod(ao, petsctoapplicationpermuteint, block, array);
295:   PetscFunctionReturn(PETSC_SUCCESS);
296: }

298: /*@
299:   AOApplicationToPetscPermuteInt - Permutes an array of blocks of integers
300:   in the application-defined ordering to the PETSc ordering.

302:   Collective

304:   Input Parameters:
305: + ao    - The application ordering context
306: . block - The block size
307: - array - The integer array

309:   Output Parameter:
310: . array - The permuted array

312:   Level: beginner

314:   Notes:
315:   The length of the array should be $ block*N $, where `N` is length
316:   provided to the AOCreate*() method that created the `AO`.

318:   The permutation takes `array[i_app] --> array[i_pet]`, where `i_app` is
319:   the index of `i` in the application ordering and `i_pet` is the index
320:   of `i` in the PETSc ordering.

322: .seealso: [](sec_ao), `AO`, `AOCreateBasic()`, `AOView()`, `AOPetscToApplicationIS()`, `AOApplicationToPetsc()`
323: @*/
324: PetscErrorCode AOApplicationToPetscPermuteInt(AO ao, PetscInt block, PetscInt array[])
325: {
326:   PetscFunctionBegin;
328:   PetscAssertPointer(array, 3);
329:   PetscUseTypeMethod(ao, applicationtopetscpermuteint, block, array);
330:   PetscFunctionReturn(PETSC_SUCCESS);
331: }

333: /*@
334:   AOPetscToApplicationPermuteReal - Permutes an array of blocks of reals
335:   in the PETSc ordering to the application-defined ordering.

337:   Collective

339:   Input Parameters:
340: + ao    - The application ordering context
341: . block - The block size
342: - array - The integer array

344:   Output Parameter:
345: . array - The permuted array

347:   Level: beginner

349:   Notes:
350:   The length of the array should be $block*N$, where `N` is length
351:   provided to the AOCreate*() method that created the `AO`.

353:   The permutation takes `array[i_pet] --> array[i_app]`, where `i_app` is
354:   the index of `i` in the application ordering and `i_pet` is the index
355:   of `i` in the PETSc ordering.

357: .seealso: [](sec_ao), `AO`, `AOCreateBasic()`, `AOView()`, `AOApplicationToPetsc()`, `AOPetscToApplicationIS()`
358: @*/
359: PetscErrorCode AOPetscToApplicationPermuteReal(AO ao, PetscInt block, PetscReal array[])
360: {
361:   PetscFunctionBegin;
363:   PetscAssertPointer(array, 3);
364:   PetscUseTypeMethod(ao, petsctoapplicationpermutereal, block, array);
365:   PetscFunctionReturn(PETSC_SUCCESS);
366: }

368: /*@
369:   AOApplicationToPetscPermuteReal - Permutes an array of blocks of reals
370:   in the application-defined ordering to the PETSc ordering.

372:   Collective

374:   Input Parameters:
375: + ao    - The application ordering context
376: . block - The block size
377: - array - The integer array

379:   Output Parameter:
380: . array - The permuted array

382:   Level: beginner

384:   Notes:
385:   The length of the array should be $block*N$, where `N` is length
386:   provided to the AOCreate*() method that created the `AO`.

388:   The permutation takes `array[i_app] --> array[i_pet]`, where `i_app` is
389:   the index of `i` in the application ordering and `i_pet` is the index
390:   of `i` in the PETSc ordering.

392: .seealso: [](sec_ao), `AO`, `AOCreateBasic()`, `AOView()`, `AOApplicationToPetsc()`, `AOPetscToApplicationIS()`
393: @*/
394: PetscErrorCode AOApplicationToPetscPermuteReal(AO ao, PetscInt block, PetscReal array[])
395: {
396:   PetscFunctionBegin;
398:   PetscAssertPointer(array, 3);
399:   PetscUseTypeMethod(ao, applicationtopetscpermutereal, block, array);
400:   PetscFunctionReturn(PETSC_SUCCESS);
401: }

403: /*@
404:   AOSetFromOptions - Sets `AO` options from the options database.

406:   Collective

408:   Input Parameter:
409: . ao - the application ordering

411:   Options Database Key:
412: . -ao_type <basic, memoryscalable> - sets the type of the `AO`

414:   Level: beginner

416: .seealso: [](sec_ao), `AO`, `AOCreate()`, `AOSetType()`, `AODestroy()`, `AOPetscToApplication()`, `AOApplicationToPetsc()`
417: @*/
418: PetscErrorCode AOSetFromOptions(AO ao)
419: {
420:   char        type[256];
421:   const char *def = AOBASIC;
422:   PetscBool   flg;

424:   PetscFunctionBegin;

427:   PetscObjectOptionsBegin((PetscObject)ao);
428:   PetscCall(PetscOptionsFList("-ao_type", "AO type", "AOSetType", AOList, def, type, 256, &flg));
429:   if (flg) {
430:     PetscCall(AOSetType(ao, type));
431:   } else if (!((PetscObject)ao)->type_name) {
432:     PetscCall(AOSetType(ao, def));
433:   }
434:   PetscOptionsEnd();
435:   PetscFunctionReturn(PETSC_SUCCESS);
436: }

438: /*@
439:   AOSetIS - Sets the `IS` associated with the application ordering.

441:   Collective

443:   Input Parameters:
444: + ao      - the application ordering
445: . isapp   - index set that defines an ordering
446: - ispetsc - index set that defines another ordering (may be `NULL` to use the natural ordering)

448:   Level: beginner

450:   Note:
451:   This routine increases the reference count of `isapp` and `ispetsc` so you may/should destroy these arguments after this call
452:   if you no longer need them

454: .seealso: [](sec_ao), [](sec_scatter), `AO`, `AOCreate()`, `AODestroy()`, `AOPetscToApplication()`, `AOApplicationToPetsc()`
455: @*/
456: PetscErrorCode AOSetIS(AO ao, IS isapp, IS ispetsc)
457: {
458:   PetscFunctionBegin;
459:   if (ispetsc) {
460:     PetscInt napp, npetsc;
461:     PetscCall(ISGetLocalSize(isapp, &napp));
462:     PetscCall(ISGetLocalSize(ispetsc, &npetsc));
463:     PetscCheck(napp == npetsc, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "napp %" PetscInt_FMT " != npetsc %" PetscInt_FMT ". Local IS lengths must match", napp, npetsc);
464:   }
465:   if (isapp) PetscCall(PetscObjectReference((PetscObject)isapp));
466:   if (ispetsc) PetscCall(PetscObjectReference((PetscObject)ispetsc));
467:   PetscCall(ISDestroy(&ao->isapp));
468:   PetscCall(ISDestroy(&ao->ispetsc));
469:   ao->isapp   = isapp;
470:   ao->ispetsc = ispetsc;
471:   PetscFunctionReturn(PETSC_SUCCESS);
472: }

474: /*@
475:   AOCreate - Creates an application ordering. That is an object that maps from an application ordering to a PETSc ordering and vice versa

477:   Collective

479:   Input Parameter:
480: . comm - MPI communicator that is to share the `AO`

482:   Output Parameter:
483: . ao - the new application ordering

485:   Options Database Key:
486: + -ao_type <aotype> - create `AO` with particular format
487: - -ao_view          - call `AOView()` at the conclusion of `AOCreate()`

489:   Level: beginner

491: .seealso: [](sec_ao), `AO`, `AOView()`, `AOSetIS()`, `AODestroy()`, `AOPetscToApplication()`, `AOApplicationToPetsc()`
492: @*/
493: PetscErrorCode AOCreate(MPI_Comm comm, AO *ao)
494: {
495:   AO aonew;

497:   PetscFunctionBegin;
498:   PetscAssertPointer(ao, 2);
499:   PetscCall(AOInitializePackage());

501:   PetscCall(PetscHeaderCreate(aonew, AO_CLASSID, "AO", "Application Ordering", "AO", comm, AODestroy, AOView));
502:   *ao = aonew;
503:   PetscFunctionReturn(PETSC_SUCCESS);
504: }