Actual source code: ao.c
petsc-3.5.4 2015-05-23
2: /*
3: Defines the abstract operations on AO (application orderings)
4: */
5: #include <../src/vec/is/ao/aoimpl.h> /*I "petscao.h" I*/
7: /* Logging support */
8: PetscClassId AO_CLASSID;
9: PetscLogEvent AO_PetscToApplication, AO_ApplicationToPetsc;
13: /*@C
14: AOView - Displays an application ordering.
16: Collective on AO and PetscViewer
18: Input Parameters:
19: + ao - the application ordering context
20: - viewer - viewer used for display
22: Level: intermediate
24: Options Database Key:
25: . -ao_view - calls AOView() at end of AOCreate()
27: Note:
28: The available visualization contexts include
29: + PETSC_VIEWER_STDOUT_SELF - standard output (default)
30: - PETSC_VIEWER_STDOUT_WORLD - synchronized standard
31: output where only the first processor opens
32: the file. All other processors send their
33: data to the first processor to print.
35: The user can open an alternative visualization context with
36: PetscViewerASCIIOpen() - output to a specified file.
38: .keywords: application ordering
40: .seealso: PetscViewerASCIIOpen()
41: @*/
42: PetscErrorCode AOView(AO ao,PetscViewer viewer)
43: {
48: if (!viewer) viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)ao));
51: PetscObjectPrintClassNamePrefixType((PetscObject)ao,viewer);
52: (*ao->ops->view)(ao,viewer);
53: return(0);
54: }
58: /*@C
59: AODestroy - Destroys an application ordering.
61: Collective on AO
63: Input Parameters:
64: . ao - the application ordering context
66: Level: beginner
68: .keywords: destroy, application ordering
70: .seealso: AOCreate()
71: @*/
72: PetscErrorCode AODestroy(AO *ao)
73: {
77: if (!*ao) return(0);
79: if (--((PetscObject)(*ao))->refct > 0) {*ao = 0; return(0);}
80: /* if memory was published with SAWs then destroy it */
81: PetscObjectSAWsViewOff((PetscObject)*ao);
82: /* destroy the internal part */
83: if ((*ao)->ops->destroy) {
84: (*(*ao)->ops->destroy)(*ao);
85: }
86: PetscHeaderDestroy(ao);
87: return(0);
88: }
91: #include <../src/vec/is/is/impls/general/general.h>
92: /* ---------------------------------------------------------------------*/
95: /*@
96: AOPetscToApplicationIS - Maps an index set in the PETSc ordering to
97: the application-defined ordering.
99: Collective on AO and IS
101: Input Parameters:
102: + ao - the application ordering context
103: - is - the index set; this is replaced with its mapped values
105: Output Parameter:
106: . is - the mapped index set
108: Level: intermediate
110: Notes:
111: The index set cannot be of type stride or block
113: Any integers in ia[] that are negative are left unchanged. This
114: allows one to convert, for example, neighbor lists that use negative
115: entries to indicate nonexistent neighbors due to boundary conditions
116: etc.
118: .keywords: application ordering, mapping
120: .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(),
121: AOApplicationToPetscIS(),AOPetscToApplication()
122: @*/
123: PetscErrorCode AOPetscToApplicationIS(AO ao,IS is)
124: {
126: PetscInt n;
127: PetscInt *ia;
132: ISToGeneral(is);
133: /* we cheat because we know the is is general and that we can change the indices */
134: ISGetIndices(is,(const PetscInt**)&ia);
135: ISGetLocalSize(is,&n);
136: (*ao->ops->petsctoapplication)(ao,n,ia);
137: ISRestoreIndices(is,(const PetscInt**)&ia);
138: return(0);
139: }
143: /*@
144: AOApplicationToPetscIS - Maps an index set in the application-defined
145: ordering to the PETSc ordering.
147: Collective on AO and IS
149: Input Parameters:
150: + ao - the application ordering context
151: - is - the index set; this is replaced with its mapped values
153: Output Parameter:
154: . is - the mapped index set
156: Level: beginner
158: Note:
159: The index set cannot be of type stride or block
161: Any integers in ia[] that are negative are left unchanged. This
162: allows one to convert, for example, neighbor lists that use negative
163: entries to indicate nonexistent neighbors due to boundary conditions, etc.
165: .keywords: application ordering, mapping
167: .seealso: AOCreateBasic(), AOView(), AOPetscToApplication(),
168: AOPetscToApplicationIS(), AOApplicationToPetsc()
169: @*/
170: PetscErrorCode AOApplicationToPetscIS(AO ao,IS is)
171: {
173: PetscInt n,*ia;
178: ISToGeneral(is);
179: /* we cheat because we know the is is general and that we can change the indices */
180: ISGetIndices(is,(const PetscInt**)&ia);
181: ISGetLocalSize(is,&n);
182: (*ao->ops->applicationtopetsc)(ao,n,ia);
183: ISRestoreIndices(is,(const PetscInt**)&ia);
184: return(0);
185: }
189: /*@
190: AOPetscToApplication - Maps a set of integers in the PETSc ordering to
191: the application-defined ordering.
193: Collective on AO
195: Input Parameters:
196: + ao - the application ordering context
197: . n - the number of integers
198: - ia - the integers; these are replaced with their mapped value
200: Output Parameter:
201: . ia - the mapped integers
203: Level: beginner
205: Note:
206: Any integers in ia[] that are negative are left unchanged. This
207: allows one to convert, for example, neighbor lists that use negative
208: entries to indicate nonexistent neighbors due to boundary conditions, etc.
210: Integers that are out of range are mapped to -1
212: .keywords: application ordering, mapping
214: .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(),
215: AOPetscToApplicationIS(), AOApplicationToPetsc()
216: @*/
217: PetscErrorCode AOPetscToApplication(AO ao,PetscInt n,PetscInt ia[])
218: {
224: (*ao->ops->petsctoapplication)(ao,n,ia);
225: return(0);
226: }
230: /*@
231: AOApplicationToPetsc - Maps a set of integers in the application-defined
232: ordering to the PETSc ordering.
234: Collective on AO
236: Input Parameters:
237: + ao - the application ordering context
238: . n - the number of integers
239: - ia - the integers; these are replaced with their mapped value
241: Output Parameter:
242: . ia - the mapped integers
244: Level: beginner
246: Note:
247: Any integers in ia[] that are negative are left unchanged. This
248: allows one to convert, for example, neighbor lists that use negative
249: entries to indicate nonexistent neighbors due to boundary conditions, etc.
251: Integers that are out of range are mapped to -1
253: .keywords: application ordering, mapping
255: .seealso: AOCreateBasic(), AOView(), AOPetscToApplication(),
256: AOPetscToApplicationIS(), AOApplicationToPetsc()
257: @*/
258: PetscErrorCode AOApplicationToPetsc(AO ao,PetscInt n,PetscInt ia[])
259: {
265: (*ao->ops->applicationtopetsc)(ao,n,ia);
266: return(0);
267: }
271: /*@
272: AOPetscToApplicationPermuteInt - Permutes an array of blocks of integers
273: in the PETSc ordering to the application-defined ordering.
275: Collective on AO
277: Input Parameters:
278: + ao - The application ordering context
279: . block - The block size
280: - array - The integer array
282: Output Parameter:
283: . array - The permuted array
285: Note: The length of the array should be block*N, where N is length
286: provided to the AOCreate*() method that created the AO.
288: The permutation takes array[i_pet] --> array[i_app], where i_app is
289: the index of 'i' in the application ordering and i_pet is the index
290: of 'i' in the petsc ordering.
292: Level: beginner
294: .keywords: application ordering, mapping
295: .seealso: AOCreateBasic(), AOView(), AOApplicationToPetsc(), AOPetscToApplicationIS()
296: @*/
297: PetscErrorCode AOPetscToApplicationPermuteInt(AO ao, PetscInt block, PetscInt array[])
298: {
304: (*ao->ops->petsctoapplicationpermuteint)(ao, block, array);
305: return(0);
306: }
310: /*@
311: AOApplicationToPetscPermuteInt - Permutes an array of blocks of integers
312: in the application-defined ordering to the PETSc ordering.
314: Collective on AO
316: Input Parameters:
317: + ao - The application ordering context
318: . block - The block size
319: - array - The integer array
321: Output Parameter:
322: . array - The permuted array
324: Note: The length of the array should be block*N, where N is length
325: provided to the AOCreate*() method that created the AO.
327: The permutation takes array[i_app] --> array[i_pet], where i_app is
328: the index of 'i' in the application ordering and i_pet is the index
329: of 'i' in the petsc ordering.
331: Level: beginner
333: .keywords: application ordering, mapping
335: .seealso: AOCreateBasic(), AOView(), AOPetscToApplicationIS(), AOApplicationToPetsc()
336: @*/
337: PetscErrorCode AOApplicationToPetscPermuteInt(AO ao, PetscInt block, PetscInt array[])
338: {
344: (*ao->ops->applicationtopetscpermuteint)(ao, block, array);
345: return(0);
346: }
350: /*@
351: AOPetscToApplicationPermuteReal - Permutes an array of blocks of reals
352: in the PETSc ordering to the application-defined ordering.
354: Collective on AO
356: Input Parameters:
357: + ao - The application ordering context
358: . block - The block size
359: - array - The integer array
361: Output Parameter:
362: . array - The permuted array
364: Note: The length of the array should be block*N, where N is length
365: provided to the AOCreate*() method that created the AO.
367: The permutation takes array[i_pet] --> array[i_app], where i_app is
368: the index of 'i' in the application ordering and i_pet is the index
369: of 'i' in the petsc ordering.
371: Level: beginner
373: .keywords: application ordering, mapping
375: .seealso: AOCreateBasic(), AOView(), AOApplicationToPetsc(), AOPetscToApplicationIS()
376: @*/
377: PetscErrorCode AOPetscToApplicationPermuteReal(AO ao, PetscInt block, PetscReal array[])
378: {
384: (*ao->ops->petsctoapplicationpermutereal)(ao, block, array);
385: return(0);
386: }
390: /*@
391: AOApplicationToPetscPermuteReal - Permutes an array of blocks of reals
392: in the application-defined ordering to the PETSc ordering.
394: Collective on AO
396: Input Parameters:
397: + ao - The application ordering context
398: . block - The block size
399: - array - The integer array
401: Output Parameter:
402: . array - The permuted array
404: Note: The length of the array should be block*N, where N is length
405: provided to the AOCreate*() method that created the AO.
407: The permutation takes array[i_app] --> array[i_pet], where i_app is
408: the index of 'i' in the application ordering and i_pet is the index
409: of 'i' in the petsc ordering.
411: Level: beginner
413: .keywords: application ordering, mapping
415: .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(), AOPetscToApplicationIS()
416: @*/
417: PetscErrorCode AOApplicationToPetscPermuteReal(AO ao, PetscInt block, PetscReal array[])
418: {
424: (*ao->ops->applicationtopetscpermutereal)(ao, block, array);
425: return(0);
426: }
430: /*@C
431: AOSetFromOptions - Sets AO options from the options database.
433: Collective on AO
435: Input Parameter:
436: . ao - the application ordering
438: Level: beginner
440: .keywords: AO, options, database
442: .seealso: AOCreate(), AOSetType(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
443: @*/
444: PetscErrorCode AOSetFromOptions(AO ao)
445: {
447: char type[256];
448: const char *def=AOBASIC;
449: PetscBool flg;
454: PetscObjectOptionsBegin((PetscObject)ao);
455: PetscOptionsFList("-ao_type","AO type","AOSetType",AOList,def,type,256,&flg);
456: if (flg) {
457: AOSetType(ao,type);
458: } else if (!((PetscObject)ao)->type_name) {
459: AOSetType(ao,def);
460: }
461: PetscOptionsEnd();
462: return(0);
463: }
467: /*@C
468: AOSetIS - Sets the IS associated with the application ordering.
470: Collective on MPI_Comm
472: Input Parameters:
473: + ao - the application ordering
474: . isapp - index set that defines an ordering
475: - ispetsc - index set that defines another ordering (may be NULL to use the
476: natural ordering)
478: Notes:
479: The index sets isapp and ispetsc are used only for creation of ao.
481: Level: beginner
483: .keywords: AO, create
485: .seealso: AOCreate(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
486: @*/
487: PetscErrorCode AOSetIS(AO ao,IS isapp,IS ispetsc)
488: {
492: if (ispetsc) {
493: PetscInt napp,npetsc;
494: ISGetLocalSize(isapp,&napp);
495: ISGetLocalSize(ispetsc,&npetsc);
496: if (napp != npetsc) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"napp %D != npetsc %d. Local IS lengths must match",napp,npetsc);
497: }
498: ao->isapp = isapp;
499: ao->ispetsc = ispetsc;
500: return(0);
501: }
505: /*@C
506: AOCreate - Creates an application ordering.
508: Collective on MPI_Comm
510: Input Parameters:
511: . comm - MPI communicator that is to share AO
513: Output Parameter:
514: . ao - the new application ordering
516: Options Database Key:
517: + -ao_type <aotype> - create ao with particular format
518: - -ao_view - call AOView() at the conclusion of AOCreate()
520: Level: beginner
522: .keywords: AO, create
524: .seealso: AOSetIS(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
525: @*/
526: PetscErrorCode AOCreate(MPI_Comm comm,AO *ao)
527: {
529: AO aonew;
533: *ao = NULL;
534: AOInitializePackage();
536: PetscHeaderCreate(aonew,_p_AO,struct _AOOps,AO_CLASSID,"AO","Application Ordering","AO",comm,AODestroy,AOView);
537: PetscMemzero(aonew->ops, sizeof(struct _AOOps));
538: *ao = aonew;
539: return(0);
540: }