xref: /petsc/src/vec/is/ao/interface/ao.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
11447629fSBarry Smith 
21447629fSBarry Smith /*
31447629fSBarry Smith    Defines the abstract operations on AO (application orderings)
41447629fSBarry Smith */
51447629fSBarry Smith #include <../src/vec/is/ao/aoimpl.h>      /*I "petscao.h" I*/
61447629fSBarry Smith 
71447629fSBarry Smith /* Logging support */
81447629fSBarry Smith PetscClassId  AO_CLASSID;
91447629fSBarry Smith PetscLogEvent AO_PetscToApplication, AO_ApplicationToPetsc;
101447629fSBarry Smith 
111447629fSBarry Smith /*@C
121447629fSBarry Smith    AOView - Displays an application ordering.
131447629fSBarry Smith 
14d083f849SBarry Smith    Collective on AO
151447629fSBarry Smith 
161447629fSBarry Smith    Input Parameters:
171447629fSBarry Smith +  ao - the application ordering context
181447629fSBarry Smith -  viewer - viewer used for display
191447629fSBarry Smith 
201447629fSBarry Smith    Level: intermediate
211447629fSBarry Smith 
221447629fSBarry Smith     Options Database Key:
231447629fSBarry Smith .   -ao_view - calls AOView() at end of AOCreate()
241447629fSBarry Smith 
251447629fSBarry Smith    Note:
261447629fSBarry Smith    The available visualization contexts include
271447629fSBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
281447629fSBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
291447629fSBarry Smith          output where only the first processor opens
301447629fSBarry Smith          the file.  All other processors send their
311447629fSBarry Smith          data to the first processor to print.
321447629fSBarry Smith 
331447629fSBarry Smith    The user can open an alternative visualization context with
341447629fSBarry Smith    PetscViewerASCIIOpen() - output to a specified file.
351447629fSBarry Smith 
361447629fSBarry Smith .seealso: PetscViewerASCIIOpen()
371447629fSBarry Smith @*/
381447629fSBarry Smith PetscErrorCode  AOView(AO ao,PetscViewer viewer)
391447629fSBarry Smith {
401447629fSBarry Smith   PetscErrorCode ierr;
411447629fSBarry Smith 
421447629fSBarry Smith   PetscFunctionBegin;
431447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
4476d20c1aSBarry Smith   if (!viewer) {
4576d20c1aSBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)ao),&viewer);CHKERRQ(ierr);
4676d20c1aSBarry Smith   }
471447629fSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
4898c3331eSBarry Smith 
4998c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)ao,viewer);CHKERRQ(ierr);
501447629fSBarry Smith   ierr = (*ao->ops->view)(ao,viewer);CHKERRQ(ierr);
511447629fSBarry Smith   PetscFunctionReturn(0);
521447629fSBarry Smith }
531447629fSBarry Smith 
54fe2efc57SMark /*@C
55fe2efc57SMark    AOViewFromOptions - View from Options
56fe2efc57SMark 
57fe2efc57SMark    Collective on AO
58fe2efc57SMark 
59fe2efc57SMark    Input Parameters:
60fe2efc57SMark +  ao - the application ordering context
61736c3998SJose E. Roman .  obj - Optional object
62736c3998SJose E. Roman -  name - command line option
63fe2efc57SMark 
64fe2efc57SMark    Level: intermediate
65fe2efc57SMark .seealso:  AO, AOView, PetscObjectViewFromOptions(), AOCreate()
66fe2efc57SMark @*/
67fe2efc57SMark PetscErrorCode  AOViewFromOptions(AO ao,PetscObject obj,const char name[])
68fe2efc57SMark {
69fe2efc57SMark   PetscErrorCode ierr;
70fe2efc57SMark 
71fe2efc57SMark   PetscFunctionBegin;
72fe2efc57SMark   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
73fe2efc57SMark   ierr = PetscObjectViewFromOptions((PetscObject)ao,obj,name);CHKERRQ(ierr);
74fe2efc57SMark   PetscFunctionReturn(0);
75fe2efc57SMark }
76fe2efc57SMark 
7701e608bcSBarry Smith /*@
781447629fSBarry Smith    AODestroy - Destroys an application ordering.
791447629fSBarry Smith 
801447629fSBarry Smith    Collective on AO
811447629fSBarry Smith 
821447629fSBarry Smith    Input Parameters:
831447629fSBarry Smith .  ao - the application ordering context
841447629fSBarry Smith 
851447629fSBarry Smith    Level: beginner
861447629fSBarry Smith 
871447629fSBarry Smith .seealso: AOCreate()
881447629fSBarry Smith @*/
891447629fSBarry Smith PetscErrorCode  AODestroy(AO *ao)
901447629fSBarry Smith {
911447629fSBarry Smith   PetscErrorCode ierr;
921447629fSBarry Smith 
931447629fSBarry Smith   PetscFunctionBegin;
941447629fSBarry Smith   if (!*ao) PetscFunctionReturn(0);
951447629fSBarry Smith   PetscValidHeaderSpecific((*ao),AO_CLASSID,1);
964c8fdceaSLisandro Dalcin   if (--((PetscObject)(*ao))->refct > 0) {*ao = NULL; PetscFunctionReturn(0);}
97e04113cfSBarry Smith   /* if memory was published with SAWs then destroy it */
98e04113cfSBarry Smith   ierr = PetscObjectSAWsViewOff((PetscObject)*ao);CHKERRQ(ierr);
9901e608bcSBarry Smith   ierr = ISDestroy(&(*ao)->isapp);CHKERRQ(ierr);
10001e608bcSBarry Smith   ierr = ISDestroy(&(*ao)->ispetsc);CHKERRQ(ierr);
1011447629fSBarry Smith   /* destroy the internal part */
1021447629fSBarry Smith   if ((*ao)->ops->destroy) {
1031447629fSBarry Smith     ierr = (*(*ao)->ops->destroy)(*ao);CHKERRQ(ierr);
1041447629fSBarry Smith   }
1051447629fSBarry Smith   ierr = PetscHeaderDestroy(ao);CHKERRQ(ierr);
1061447629fSBarry Smith   PetscFunctionReturn(0);
1071447629fSBarry Smith }
1081447629fSBarry Smith 
1091447629fSBarry Smith #include <../src/vec/is/is/impls/general/general.h>
1101447629fSBarry Smith /* ---------------------------------------------------------------------*/
1111cc6b274SLisandro Dalcin 
1121cc6b274SLisandro Dalcin PETSC_INTERN PetscErrorCode ISSetUp_General(IS);
1131cc6b274SLisandro Dalcin 
1141447629fSBarry Smith /*@
1151447629fSBarry Smith    AOPetscToApplicationIS - Maps an index set in the PETSc ordering to
1161447629fSBarry Smith    the application-defined ordering.
1171447629fSBarry Smith 
118d083f849SBarry Smith    Collective on AO
1191447629fSBarry Smith 
1201447629fSBarry Smith    Input Parameters:
1211447629fSBarry Smith +  ao - the application ordering context
1221447629fSBarry Smith -  is - the index set; this is replaced with its mapped values
1231447629fSBarry Smith 
1241447629fSBarry Smith    Output Parameter:
1251447629fSBarry Smith .  is - the mapped index set
1261447629fSBarry Smith 
1271447629fSBarry Smith    Level: intermediate
1281447629fSBarry Smith 
1291447629fSBarry Smith    Notes:
1301447629fSBarry Smith    The index set cannot be of type stride or block
1311447629fSBarry Smith 
1321447629fSBarry Smith    Any integers in ia[] that are negative are left unchanged. This
1331447629fSBarry Smith          allows one to convert, for example, neighbor lists that use negative
1341447629fSBarry Smith          entries to indicate nonexistent neighbors due to boundary conditions
1351447629fSBarry Smith          etc.
1361447629fSBarry Smith 
1371447629fSBarry Smith .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(),
1381447629fSBarry Smith           AOApplicationToPetscIS(),AOPetscToApplication()
1391447629fSBarry Smith @*/
1401447629fSBarry Smith PetscErrorCode  AOPetscToApplicationIS(AO ao,IS is)
1411447629fSBarry Smith {
1421447629fSBarry Smith   PetscErrorCode ierr;
1431447629fSBarry Smith   PetscInt       n;
1441447629fSBarry Smith   PetscInt       *ia;
1451447629fSBarry Smith 
1461447629fSBarry Smith   PetscFunctionBegin;
1471447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
1481447629fSBarry Smith   PetscValidHeaderSpecific(is,IS_CLASSID,2);
1491447629fSBarry Smith   ierr = ISToGeneral(is);CHKERRQ(ierr);
1501447629fSBarry Smith   /* we cheat because we know the is is general and that we can change the indices */
1511447629fSBarry Smith   ierr = ISGetIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr);
1521447629fSBarry Smith   ierr = ISGetLocalSize(is,&n);CHKERRQ(ierr);
1531447629fSBarry Smith   ierr = (*ao->ops->petsctoapplication)(ao,n,ia);CHKERRQ(ierr);
1541447629fSBarry Smith   ierr = ISRestoreIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr);
1551cc6b274SLisandro Dalcin   /* updated cached values (sorted, min, max, etc.)*/
1561cc6b274SLisandro Dalcin   ierr = ISSetUp_General(is);CHKERRQ(ierr);
1571447629fSBarry Smith   PetscFunctionReturn(0);
1581447629fSBarry Smith }
1591447629fSBarry Smith 
1601447629fSBarry Smith /*@
1611447629fSBarry Smith    AOApplicationToPetscIS - Maps an index set in the application-defined
1621447629fSBarry Smith    ordering to the PETSc ordering.
1631447629fSBarry Smith 
164d083f849SBarry Smith    Collective on AO
1651447629fSBarry Smith 
1661447629fSBarry Smith    Input Parameters:
1671447629fSBarry Smith +  ao - the application ordering context
1681447629fSBarry Smith -  is - the index set; this is replaced with its mapped values
1691447629fSBarry Smith 
1701447629fSBarry Smith    Output Parameter:
1711447629fSBarry Smith .  is - the mapped index set
1721447629fSBarry Smith 
1731447629fSBarry Smith    Level: beginner
1741447629fSBarry Smith 
1751447629fSBarry Smith    Note:
1761447629fSBarry Smith    The index set cannot be of type stride or block
1771447629fSBarry Smith 
1781447629fSBarry Smith    Any integers in ia[] that are negative are left unchanged. This
1791447629fSBarry Smith    allows one to convert, for example, neighbor lists that use negative
1801447629fSBarry Smith    entries to indicate nonexistent neighbors due to boundary conditions, etc.
1811447629fSBarry Smith 
1821447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOPetscToApplication(),
1831447629fSBarry Smith           AOPetscToApplicationIS(), AOApplicationToPetsc()
1841447629fSBarry Smith @*/
1851447629fSBarry Smith PetscErrorCode  AOApplicationToPetscIS(AO ao,IS is)
1861447629fSBarry Smith {
1871447629fSBarry Smith   PetscErrorCode ierr;
1881447629fSBarry Smith   PetscInt       n,*ia;
1891447629fSBarry Smith 
1901447629fSBarry Smith   PetscFunctionBegin;
1911447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
1921447629fSBarry Smith   PetscValidHeaderSpecific(is,IS_CLASSID,2);
1931447629fSBarry Smith   ierr = ISToGeneral(is);CHKERRQ(ierr);
1941447629fSBarry Smith   /* we cheat because we know the is is general and that we can change the indices */
1951447629fSBarry Smith   ierr = ISGetIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr);
1961447629fSBarry Smith   ierr = ISGetLocalSize(is,&n);CHKERRQ(ierr);
1971447629fSBarry Smith   ierr = (*ao->ops->applicationtopetsc)(ao,n,ia);CHKERRQ(ierr);
1981447629fSBarry Smith   ierr = ISRestoreIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr);
1991cc6b274SLisandro Dalcin   /* updated cached values (sorted, min, max, etc.)*/
2001cc6b274SLisandro Dalcin   ierr = ISSetUp_General(is);CHKERRQ(ierr);
2011447629fSBarry Smith   PetscFunctionReturn(0);
2021447629fSBarry Smith }
2031447629fSBarry Smith 
2041447629fSBarry Smith /*@
2051447629fSBarry Smith    AOPetscToApplication - Maps a set of integers in the PETSc ordering to
2061447629fSBarry Smith    the application-defined ordering.
2071447629fSBarry Smith 
2081447629fSBarry Smith    Collective on AO
2091447629fSBarry Smith 
2101447629fSBarry Smith    Input Parameters:
2111447629fSBarry Smith +  ao - the application ordering context
2121447629fSBarry Smith .  n - the number of integers
2131447629fSBarry Smith -  ia - the integers; these are replaced with their mapped value
2141447629fSBarry Smith 
2151447629fSBarry Smith    Output Parameter:
2161447629fSBarry Smith .   ia - the mapped integers
2171447629fSBarry Smith 
2181447629fSBarry Smith    Level: beginner
2191447629fSBarry Smith 
2201447629fSBarry Smith    Note:
2211447629fSBarry Smith    Any integers in ia[] that are negative are left unchanged. This
2221447629fSBarry Smith    allows one to convert, for example, neighbor lists that use negative
2231447629fSBarry Smith    entries to indicate nonexistent neighbors due to boundary conditions, etc.
2241447629fSBarry Smith 
2251447629fSBarry Smith    Integers that are out of range are mapped to -1
2261447629fSBarry Smith 
2271447629fSBarry Smith .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(),
2281447629fSBarry Smith           AOPetscToApplicationIS(), AOApplicationToPetsc()
2291447629fSBarry Smith @*/
2301447629fSBarry Smith PetscErrorCode  AOPetscToApplication(AO ao,PetscInt n,PetscInt ia[])
2311447629fSBarry Smith {
2321447629fSBarry Smith   PetscErrorCode ierr;
2331447629fSBarry Smith 
2341447629fSBarry Smith   PetscFunctionBegin;
2351447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
2361447629fSBarry Smith   if (n) PetscValidIntPointer(ia,3);
2371447629fSBarry Smith   ierr = (*ao->ops->petsctoapplication)(ao,n,ia);CHKERRQ(ierr);
2381447629fSBarry Smith   PetscFunctionReturn(0);
2391447629fSBarry Smith }
2401447629fSBarry Smith 
2411447629fSBarry Smith /*@
2421447629fSBarry Smith    AOApplicationToPetsc - Maps a set of integers in the application-defined
2431447629fSBarry Smith    ordering to the PETSc ordering.
2441447629fSBarry Smith 
2451447629fSBarry Smith    Collective on AO
2461447629fSBarry Smith 
2471447629fSBarry Smith    Input Parameters:
2481447629fSBarry Smith +  ao - the application ordering context
2491447629fSBarry Smith .  n - the number of integers
2501447629fSBarry Smith -  ia - the integers; these are replaced with their mapped value
2511447629fSBarry Smith 
2521447629fSBarry Smith    Output Parameter:
2531447629fSBarry Smith .   ia - the mapped integers
2541447629fSBarry Smith 
2551447629fSBarry Smith    Level: beginner
2561447629fSBarry Smith 
2571447629fSBarry Smith    Note:
2581447629fSBarry Smith    Any integers in ia[] that are negative are left unchanged. This
2591447629fSBarry Smith    allows one to convert, for example, neighbor lists that use negative
2601447629fSBarry Smith    entries to indicate nonexistent neighbors due to boundary conditions, etc.
2611447629fSBarry Smith 
2621447629fSBarry Smith    Integers that are out of range are mapped to -1
2631447629fSBarry Smith 
2641447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOPetscToApplication(),
2651447629fSBarry Smith           AOPetscToApplicationIS(), AOApplicationToPetsc()
2661447629fSBarry Smith @*/
2671447629fSBarry Smith PetscErrorCode  AOApplicationToPetsc(AO ao,PetscInt n,PetscInt ia[])
2681447629fSBarry Smith {
2691447629fSBarry Smith   PetscErrorCode ierr;
2701447629fSBarry Smith 
2711447629fSBarry Smith   PetscFunctionBegin;
2721447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
2731447629fSBarry Smith   if (n) PetscValidIntPointer(ia,3);
2741447629fSBarry Smith   ierr = (*ao->ops->applicationtopetsc)(ao,n,ia);CHKERRQ(ierr);
2751447629fSBarry Smith   PetscFunctionReturn(0);
2761447629fSBarry Smith }
2771447629fSBarry Smith 
2781447629fSBarry Smith /*@
2791447629fSBarry Smith   AOPetscToApplicationPermuteInt - Permutes an array of blocks of integers
2801447629fSBarry Smith   in the PETSc ordering to the application-defined ordering.
2811447629fSBarry Smith 
2821447629fSBarry Smith   Collective on AO
2831447629fSBarry Smith 
2841447629fSBarry Smith   Input Parameters:
2851447629fSBarry Smith + ao    - The application ordering context
2861447629fSBarry Smith . block - The block size
2871447629fSBarry Smith - array - The integer array
2881447629fSBarry Smith 
2891447629fSBarry Smith   Output Parameter:
2901447629fSBarry Smith . array - The permuted array
2911447629fSBarry Smith 
2921447629fSBarry Smith   Note: The length of the array should be block*N, where N is length
2931447629fSBarry Smith   provided to the AOCreate*() method that created the AO.
2941447629fSBarry Smith 
2951447629fSBarry Smith   The permutation takes array[i_pet] --> array[i_app], where i_app is
2961447629fSBarry Smith   the index of 'i' in the application ordering and i_pet is the index
2971447629fSBarry Smith   of 'i' in the petsc ordering.
2981447629fSBarry Smith 
2991447629fSBarry Smith   Level: beginner
3001447629fSBarry Smith 
3011447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOApplicationToPetsc(), AOPetscToApplicationIS()
3021447629fSBarry Smith @*/
3031447629fSBarry Smith PetscErrorCode  AOPetscToApplicationPermuteInt(AO ao, PetscInt block, PetscInt array[])
3041447629fSBarry Smith {
3051447629fSBarry Smith   PetscErrorCode ierr;
3061447629fSBarry Smith 
3071447629fSBarry Smith   PetscFunctionBegin;
3081447629fSBarry Smith   PetscValidHeaderSpecific(ao, AO_CLASSID,1);
3091447629fSBarry Smith   PetscValidIntPointer(array,3);
3101447629fSBarry Smith   ierr = (*ao->ops->petsctoapplicationpermuteint)(ao, block, array);CHKERRQ(ierr);
3111447629fSBarry Smith   PetscFunctionReturn(0);
3121447629fSBarry Smith }
3131447629fSBarry Smith 
3141447629fSBarry Smith /*@
3151447629fSBarry Smith   AOApplicationToPetscPermuteInt - Permutes an array of blocks of integers
3161447629fSBarry Smith   in the application-defined ordering to the PETSc ordering.
3171447629fSBarry Smith 
3181447629fSBarry Smith   Collective on AO
3191447629fSBarry Smith 
3201447629fSBarry Smith   Input Parameters:
3211447629fSBarry Smith + ao    - The application ordering context
3221447629fSBarry Smith . block - The block size
3231447629fSBarry Smith - array - The integer array
3241447629fSBarry Smith 
3251447629fSBarry Smith   Output Parameter:
3261447629fSBarry Smith . array - The permuted array
3271447629fSBarry Smith 
3281447629fSBarry Smith   Note: The length of the array should be block*N, where N is length
3291447629fSBarry Smith   provided to the AOCreate*() method that created the AO.
3301447629fSBarry Smith 
3311447629fSBarry Smith   The permutation takes array[i_app] --> array[i_pet], where i_app is
3321447629fSBarry Smith   the index of 'i' in the application ordering and i_pet is the index
3331447629fSBarry Smith   of 'i' in the petsc ordering.
3341447629fSBarry Smith 
3351447629fSBarry Smith   Level: beginner
3361447629fSBarry Smith 
3371447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOPetscToApplicationIS(), AOApplicationToPetsc()
3381447629fSBarry Smith @*/
3391447629fSBarry Smith PetscErrorCode  AOApplicationToPetscPermuteInt(AO ao, PetscInt block, PetscInt array[])
3401447629fSBarry Smith {
3411447629fSBarry Smith   PetscErrorCode ierr;
3421447629fSBarry Smith 
3431447629fSBarry Smith   PetscFunctionBegin;
3441447629fSBarry Smith   PetscValidHeaderSpecific(ao, AO_CLASSID,1);
3451447629fSBarry Smith   PetscValidIntPointer(array,3);
3461447629fSBarry Smith   ierr = (*ao->ops->applicationtopetscpermuteint)(ao, block, array);CHKERRQ(ierr);
3471447629fSBarry Smith   PetscFunctionReturn(0);
3481447629fSBarry Smith }
3491447629fSBarry Smith 
3501447629fSBarry Smith /*@
3511447629fSBarry Smith   AOPetscToApplicationPermuteReal - Permutes an array of blocks of reals
3521447629fSBarry Smith   in the PETSc ordering to the application-defined ordering.
3531447629fSBarry Smith 
3541447629fSBarry Smith   Collective on AO
3551447629fSBarry Smith 
3561447629fSBarry Smith   Input Parameters:
3571447629fSBarry Smith + ao    - The application ordering context
3581447629fSBarry Smith . block - The block size
3591447629fSBarry Smith - array - The integer array
3601447629fSBarry Smith 
3611447629fSBarry Smith   Output Parameter:
3621447629fSBarry Smith . array - The permuted array
3631447629fSBarry Smith 
3641447629fSBarry Smith   Note: The length of the array should be block*N, where N is length
3651447629fSBarry Smith   provided to the AOCreate*() method that created the AO.
3661447629fSBarry Smith 
3671447629fSBarry Smith   The permutation takes array[i_pet] --> array[i_app], where i_app is
3681447629fSBarry Smith   the index of 'i' in the application ordering and i_pet is the index
3691447629fSBarry Smith   of 'i' in the petsc ordering.
3701447629fSBarry Smith 
3711447629fSBarry Smith   Level: beginner
3721447629fSBarry Smith 
3731447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOApplicationToPetsc(), AOPetscToApplicationIS()
3741447629fSBarry Smith @*/
3751447629fSBarry Smith PetscErrorCode  AOPetscToApplicationPermuteReal(AO ao, PetscInt block, PetscReal array[])
3761447629fSBarry Smith {
3771447629fSBarry Smith   PetscErrorCode ierr;
3781447629fSBarry Smith 
3791447629fSBarry Smith   PetscFunctionBegin;
3801447629fSBarry Smith   PetscValidHeaderSpecific(ao, AO_CLASSID,1);
381064a246eSJacob Faibussowitsch   PetscValidRealPointer(array,3);
3821447629fSBarry Smith   ierr = (*ao->ops->petsctoapplicationpermutereal)(ao, block, array);CHKERRQ(ierr);
3831447629fSBarry Smith   PetscFunctionReturn(0);
3841447629fSBarry Smith }
3851447629fSBarry Smith 
3861447629fSBarry Smith /*@
3871447629fSBarry Smith   AOApplicationToPetscPermuteReal - Permutes an array of blocks of reals
3881447629fSBarry Smith   in the application-defined ordering to the PETSc ordering.
3891447629fSBarry Smith 
3901447629fSBarry Smith   Collective on AO
3911447629fSBarry Smith 
3921447629fSBarry Smith   Input Parameters:
3931447629fSBarry Smith + ao    - The application ordering context
3941447629fSBarry Smith . block - The block size
3951447629fSBarry Smith - array - The integer array
3961447629fSBarry Smith 
3971447629fSBarry Smith   Output Parameter:
3981447629fSBarry Smith . array - The permuted array
3991447629fSBarry Smith 
4001447629fSBarry Smith   Note: The length of the array should be block*N, where N is length
4011447629fSBarry Smith   provided to the AOCreate*() method that created the AO.
4021447629fSBarry Smith 
4031447629fSBarry Smith   The permutation takes array[i_app] --> array[i_pet], where i_app is
4041447629fSBarry Smith   the index of 'i' in the application ordering and i_pet is the index
4051447629fSBarry Smith   of 'i' in the petsc ordering.
4061447629fSBarry Smith 
4071447629fSBarry Smith   Level: beginner
4081447629fSBarry Smith 
4091447629fSBarry Smith .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(), AOPetscToApplicationIS()
4101447629fSBarry Smith @*/
4111447629fSBarry Smith PetscErrorCode  AOApplicationToPetscPermuteReal(AO ao, PetscInt block, PetscReal array[])
4121447629fSBarry Smith {
4131447629fSBarry Smith   PetscErrorCode ierr;
4141447629fSBarry Smith 
4151447629fSBarry Smith   PetscFunctionBegin;
4161447629fSBarry Smith   PetscValidHeaderSpecific(ao, AO_CLASSID,1);
417064a246eSJacob Faibussowitsch   PetscValidRealPointer(array,3);
4181447629fSBarry Smith   ierr = (*ao->ops->applicationtopetscpermutereal)(ao, block, array);CHKERRQ(ierr);
4191447629fSBarry Smith   PetscFunctionReturn(0);
4201447629fSBarry Smith }
4211447629fSBarry Smith 
42201e608bcSBarry Smith /*@
4231447629fSBarry Smith     AOSetFromOptions - Sets AO options from the options database.
4241447629fSBarry Smith 
4251447629fSBarry Smith    Collective on AO
4261447629fSBarry Smith 
4271447629fSBarry Smith    Input Parameter:
4281447629fSBarry Smith .  ao - the application ordering
4291447629fSBarry Smith 
4301447629fSBarry Smith    Level: beginner
4311447629fSBarry Smith 
4321447629fSBarry Smith .seealso: AOCreate(), AOSetType(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
4331447629fSBarry Smith @*/
4341447629fSBarry Smith PetscErrorCode AOSetFromOptions(AO ao)
4351447629fSBarry Smith {
4361447629fSBarry Smith   PetscErrorCode ierr;
4371447629fSBarry Smith   char           type[256];
4381447629fSBarry Smith   const char     *def=AOBASIC;
4391447629fSBarry Smith   PetscBool      flg;
4401447629fSBarry Smith 
4411447629fSBarry Smith   PetscFunctionBegin;
4421447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
4431447629fSBarry Smith 
4441447629fSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)ao);CHKERRQ(ierr);
445a264d7a6SBarry Smith   ierr = PetscOptionsFList("-ao_type","AO type","AOSetType",AOList,def,type,256,&flg);CHKERRQ(ierr);
4461447629fSBarry Smith   if (flg) {
4471447629fSBarry Smith     ierr = AOSetType(ao,type);CHKERRQ(ierr);
4481447629fSBarry Smith   } else if (!((PetscObject)ao)->type_name) {
4491447629fSBarry Smith     ierr = AOSetType(ao,def);CHKERRQ(ierr);
4501447629fSBarry Smith   }
4511447629fSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
4521447629fSBarry Smith   PetscFunctionReturn(0);
4531447629fSBarry Smith }
4541447629fSBarry Smith 
45501e608bcSBarry Smith /*@
4561447629fSBarry Smith    AOSetIS - Sets the IS associated with the application ordering.
4571447629fSBarry Smith 
458d083f849SBarry Smith    Collective
4591447629fSBarry Smith 
4601447629fSBarry Smith    Input Parameters:
4611447629fSBarry Smith +  ao - the application ordering
4621447629fSBarry Smith .  isapp -  index set that defines an ordering
4631447629fSBarry Smith -  ispetsc - index set that defines another ordering (may be NULL to use the
4641447629fSBarry Smith              natural ordering)
4651447629fSBarry Smith 
4661447629fSBarry Smith    Notes:
4671447629fSBarry Smith    The index sets isapp and ispetsc are used only for creation of ao.
4681447629fSBarry Smith 
46901e608bcSBarry Smith    This routine increases the reference count of isapp and ispetsc so you may/should destroy these arguments after this call if you no longer need them
47001e608bcSBarry Smith 
4711447629fSBarry Smith    Level: beginner
4721447629fSBarry Smith 
4731447629fSBarry Smith .seealso: AOCreate(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
4741447629fSBarry Smith @*/
4751447629fSBarry Smith PetscErrorCode AOSetIS(AO ao,IS isapp,IS ispetsc)
4761447629fSBarry Smith {
4771447629fSBarry Smith   PetscErrorCode ierr;
4781447629fSBarry Smith 
4791447629fSBarry Smith   PetscFunctionBegin;
4801447629fSBarry Smith   if (ispetsc) {
4811447629fSBarry Smith     PetscInt napp,npetsc;
4821447629fSBarry Smith     ierr = ISGetLocalSize(isapp,&napp);CHKERRQ(ierr);
4831447629fSBarry Smith     ierr = ISGetLocalSize(ispetsc,&npetsc);CHKERRQ(ierr);
484*2c71b3e2SJacob Faibussowitsch     PetscCheckFalse(napp != npetsc,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"napp %" PetscInt_FMT " != npetsc %" PetscInt_FMT ". Local IS lengths must match",napp,npetsc);
4851447629fSBarry Smith   }
4863cad7c52SBarry Smith   if (isapp) {ierr = PetscObjectReference((PetscObject)isapp);CHKERRQ(ierr);}
4873cad7c52SBarry Smith   if (ispetsc) {ierr = PetscObjectReference((PetscObject)ispetsc);CHKERRQ(ierr);}
48801e608bcSBarry Smith   ierr = ISDestroy(&ao->isapp);CHKERRQ(ierr);
48901e608bcSBarry Smith   ierr = ISDestroy(&ao->ispetsc);CHKERRQ(ierr);
4901447629fSBarry Smith   ao->isapp   = isapp;
4911447629fSBarry Smith   ao->ispetsc = ispetsc;
4921447629fSBarry Smith   PetscFunctionReturn(0);
4931447629fSBarry Smith }
4941447629fSBarry Smith 
49501e608bcSBarry Smith /*@
4961447629fSBarry Smith    AOCreate - Creates an application ordering.
4971447629fSBarry Smith 
498d083f849SBarry Smith    Collective
4991447629fSBarry Smith 
5001447629fSBarry Smith    Input Parameters:
5011447629fSBarry Smith .  comm - MPI communicator that is to share AO
5021447629fSBarry Smith 
5031447629fSBarry Smith    Output Parameter:
5041447629fSBarry Smith .  ao - the new application ordering
5051447629fSBarry Smith 
5061447629fSBarry Smith    Options Database Key:
5071447629fSBarry Smith +   -ao_type <aotype> - create ao with particular format
5081447629fSBarry Smith -   -ao_view - call AOView() at the conclusion of AOCreate()
5091447629fSBarry Smith 
5101447629fSBarry Smith    Level: beginner
5111447629fSBarry Smith 
5121447629fSBarry Smith .seealso: AOSetIS(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
5131447629fSBarry Smith @*/
5141447629fSBarry Smith PetscErrorCode  AOCreate(MPI_Comm comm,AO *ao)
5151447629fSBarry Smith {
5161447629fSBarry Smith   PetscErrorCode ierr;
5171447629fSBarry Smith   AO             aonew;
5181447629fSBarry Smith 
5191447629fSBarry Smith   PetscFunctionBegin;
5201447629fSBarry Smith   PetscValidPointer(ao,2);
5211447629fSBarry Smith   *ao = NULL;
522607a6623SBarry Smith   ierr = AOInitializePackage();CHKERRQ(ierr);
5231447629fSBarry Smith 
52473107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(aonew,AO_CLASSID,"AO","Application Ordering","AO",comm,AODestroy,AOView);CHKERRQ(ierr);
5251447629fSBarry Smith   *ao  = aonew;
5261447629fSBarry Smith   PetscFunctionReturn(0);
5271447629fSBarry Smith }
528