xref: /petsc/src/vec/is/ao/interface/ao.c (revision d083f849a86f1f43e18d534ee43954e2786cb29a)
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 
14*d083f849SBarry 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 
5401e608bcSBarry Smith /*@
551447629fSBarry Smith    AODestroy - Destroys an application ordering.
561447629fSBarry Smith 
571447629fSBarry Smith    Collective on AO
581447629fSBarry Smith 
591447629fSBarry Smith    Input Parameters:
601447629fSBarry Smith .  ao - the application ordering context
611447629fSBarry Smith 
621447629fSBarry Smith    Level: beginner
631447629fSBarry Smith 
641447629fSBarry Smith .seealso: AOCreate()
651447629fSBarry Smith @*/
661447629fSBarry Smith PetscErrorCode  AODestroy(AO *ao)
671447629fSBarry Smith {
681447629fSBarry Smith   PetscErrorCode ierr;
691447629fSBarry Smith 
701447629fSBarry Smith   PetscFunctionBegin;
711447629fSBarry Smith   if (!*ao) PetscFunctionReturn(0);
721447629fSBarry Smith   PetscValidHeaderSpecific((*ao),AO_CLASSID,1);
731447629fSBarry Smith   if (--((PetscObject)(*ao))->refct > 0) {*ao = 0; PetscFunctionReturn(0);}
74e04113cfSBarry Smith   /* if memory was published with SAWs then destroy it */
75e04113cfSBarry Smith   ierr = PetscObjectSAWsViewOff((PetscObject)*ao);CHKERRQ(ierr);
7601e608bcSBarry Smith   ierr = ISDestroy(&(*ao)->isapp);CHKERRQ(ierr);
7701e608bcSBarry Smith   ierr = ISDestroy(&(*ao)->ispetsc);CHKERRQ(ierr);
781447629fSBarry Smith   /* destroy the internal part */
791447629fSBarry Smith   if ((*ao)->ops->destroy) {
801447629fSBarry Smith     ierr = (*(*ao)->ops->destroy)(*ao);CHKERRQ(ierr);
811447629fSBarry Smith   }
821447629fSBarry Smith   ierr = PetscHeaderDestroy(ao);CHKERRQ(ierr);
831447629fSBarry Smith   PetscFunctionReturn(0);
841447629fSBarry Smith }
851447629fSBarry Smith 
861447629fSBarry Smith 
871447629fSBarry Smith #include <../src/vec/is/is/impls/general/general.h>
881447629fSBarry Smith /* ---------------------------------------------------------------------*/
891cc6b274SLisandro Dalcin 
901cc6b274SLisandro Dalcin PETSC_INTERN PetscErrorCode ISSetUp_General(IS);
911cc6b274SLisandro Dalcin 
921447629fSBarry Smith /*@
931447629fSBarry Smith    AOPetscToApplicationIS - Maps an index set in the PETSc ordering to
941447629fSBarry Smith    the application-defined ordering.
951447629fSBarry Smith 
96*d083f849SBarry Smith    Collective on AO
971447629fSBarry Smith 
981447629fSBarry Smith    Input Parameters:
991447629fSBarry Smith +  ao - the application ordering context
1001447629fSBarry Smith -  is - the index set; this is replaced with its mapped values
1011447629fSBarry Smith 
1021447629fSBarry Smith    Output Parameter:
1031447629fSBarry Smith .  is - the mapped index set
1041447629fSBarry Smith 
1051447629fSBarry Smith    Level: intermediate
1061447629fSBarry Smith 
1071447629fSBarry Smith    Notes:
1081447629fSBarry Smith    The index set cannot be of type stride or block
1091447629fSBarry Smith 
1101447629fSBarry Smith    Any integers in ia[] that are negative are left unchanged. This
1111447629fSBarry Smith          allows one to convert, for example, neighbor lists that use negative
1121447629fSBarry Smith          entries to indicate nonexistent neighbors due to boundary conditions
1131447629fSBarry Smith          etc.
1141447629fSBarry Smith 
1151447629fSBarry Smith .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(),
1161447629fSBarry Smith           AOApplicationToPetscIS(),AOPetscToApplication()
1171447629fSBarry Smith @*/
1181447629fSBarry Smith PetscErrorCode  AOPetscToApplicationIS(AO ao,IS is)
1191447629fSBarry Smith {
1201447629fSBarry Smith   PetscErrorCode ierr;
1211447629fSBarry Smith   PetscInt       n;
1221447629fSBarry Smith   PetscInt       *ia;
1231447629fSBarry Smith 
1241447629fSBarry Smith   PetscFunctionBegin;
1251447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
1261447629fSBarry Smith   PetscValidHeaderSpecific(is,IS_CLASSID,2);
1271447629fSBarry Smith   ierr = ISToGeneral(is);CHKERRQ(ierr);
1281447629fSBarry Smith   /* we cheat because we know the is is general and that we can change the indices */
1291447629fSBarry Smith   ierr = ISGetIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr);
1301447629fSBarry Smith   ierr = ISGetLocalSize(is,&n);CHKERRQ(ierr);
1311447629fSBarry Smith   ierr = (*ao->ops->petsctoapplication)(ao,n,ia);CHKERRQ(ierr);
1321447629fSBarry Smith   ierr = ISRestoreIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr);
1331cc6b274SLisandro Dalcin   /* updated cached values (sorted, min, max, etc.)*/
1341cc6b274SLisandro Dalcin   ierr = ISSetUp_General(is);CHKERRQ(ierr);
1351447629fSBarry Smith   PetscFunctionReturn(0);
1361447629fSBarry Smith }
1371447629fSBarry Smith 
1381447629fSBarry Smith /*@
1391447629fSBarry Smith    AOApplicationToPetscIS - Maps an index set in the application-defined
1401447629fSBarry Smith    ordering to the PETSc ordering.
1411447629fSBarry Smith 
142*d083f849SBarry Smith    Collective on AO
1431447629fSBarry Smith 
1441447629fSBarry Smith    Input Parameters:
1451447629fSBarry Smith +  ao - the application ordering context
1461447629fSBarry Smith -  is - the index set; this is replaced with its mapped values
1471447629fSBarry Smith 
1481447629fSBarry Smith    Output Parameter:
1491447629fSBarry Smith .  is - the mapped index set
1501447629fSBarry Smith 
1511447629fSBarry Smith    Level: beginner
1521447629fSBarry Smith 
1531447629fSBarry Smith    Note:
1541447629fSBarry Smith    The index set cannot be of type stride or block
1551447629fSBarry Smith 
1561447629fSBarry Smith    Any integers in ia[] that are negative are left unchanged. This
1571447629fSBarry Smith    allows one to convert, for example, neighbor lists that use negative
1581447629fSBarry Smith    entries to indicate nonexistent neighbors due to boundary conditions, etc.
1591447629fSBarry Smith 
1601447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOPetscToApplication(),
1611447629fSBarry Smith           AOPetscToApplicationIS(), AOApplicationToPetsc()
1621447629fSBarry Smith @*/
1631447629fSBarry Smith PetscErrorCode  AOApplicationToPetscIS(AO ao,IS is)
1641447629fSBarry Smith {
1651447629fSBarry Smith   PetscErrorCode ierr;
1661447629fSBarry Smith   PetscInt       n,*ia;
1671447629fSBarry Smith 
1681447629fSBarry Smith   PetscFunctionBegin;
1691447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
1701447629fSBarry Smith   PetscValidHeaderSpecific(is,IS_CLASSID,2);
1711447629fSBarry Smith   ierr = ISToGeneral(is);CHKERRQ(ierr);
1721447629fSBarry Smith   /* we cheat because we know the is is general and that we can change the indices */
1731447629fSBarry Smith   ierr = ISGetIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr);
1741447629fSBarry Smith   ierr = ISGetLocalSize(is,&n);CHKERRQ(ierr);
1751447629fSBarry Smith   ierr = (*ao->ops->applicationtopetsc)(ao,n,ia);CHKERRQ(ierr);
1761447629fSBarry Smith   ierr = ISRestoreIndices(is,(const PetscInt**)&ia);CHKERRQ(ierr);
1771cc6b274SLisandro Dalcin   /* updated cached values (sorted, min, max, etc.)*/
1781cc6b274SLisandro Dalcin   ierr = ISSetUp_General(is);CHKERRQ(ierr);
1791447629fSBarry Smith   PetscFunctionReturn(0);
1801447629fSBarry Smith }
1811447629fSBarry Smith 
1821447629fSBarry Smith /*@
1831447629fSBarry Smith    AOPetscToApplication - Maps a set of integers in the PETSc ordering to
1841447629fSBarry Smith    the application-defined ordering.
1851447629fSBarry Smith 
1861447629fSBarry Smith    Collective on AO
1871447629fSBarry Smith 
1881447629fSBarry Smith    Input Parameters:
1891447629fSBarry Smith +  ao - the application ordering context
1901447629fSBarry Smith .  n - the number of integers
1911447629fSBarry Smith -  ia - the integers; these are replaced with their mapped value
1921447629fSBarry Smith 
1931447629fSBarry Smith    Output Parameter:
1941447629fSBarry Smith .   ia - the mapped integers
1951447629fSBarry Smith 
1961447629fSBarry Smith    Level: beginner
1971447629fSBarry Smith 
1981447629fSBarry Smith    Note:
1991447629fSBarry Smith    Any integers in ia[] that are negative are left unchanged. This
2001447629fSBarry Smith    allows one to convert, for example, neighbor lists that use negative
2011447629fSBarry Smith    entries to indicate nonexistent neighbors due to boundary conditions, etc.
2021447629fSBarry Smith 
2031447629fSBarry Smith    Integers that are out of range are mapped to -1
2041447629fSBarry Smith 
2051447629fSBarry Smith .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(),
2061447629fSBarry Smith           AOPetscToApplicationIS(), AOApplicationToPetsc()
2071447629fSBarry Smith @*/
2081447629fSBarry Smith PetscErrorCode  AOPetscToApplication(AO ao,PetscInt n,PetscInt ia[])
2091447629fSBarry Smith {
2101447629fSBarry Smith   PetscErrorCode ierr;
2111447629fSBarry Smith 
2121447629fSBarry Smith   PetscFunctionBegin;
2131447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
2141447629fSBarry Smith   if (n) PetscValidIntPointer(ia,3);
2151447629fSBarry Smith   ierr = (*ao->ops->petsctoapplication)(ao,n,ia);CHKERRQ(ierr);
2161447629fSBarry Smith   PetscFunctionReturn(0);
2171447629fSBarry Smith }
2181447629fSBarry Smith 
2191447629fSBarry Smith /*@
2201447629fSBarry Smith    AOApplicationToPetsc - Maps a set of integers in the application-defined
2211447629fSBarry Smith    ordering to the PETSc ordering.
2221447629fSBarry Smith 
2231447629fSBarry Smith    Collective on AO
2241447629fSBarry Smith 
2251447629fSBarry Smith    Input Parameters:
2261447629fSBarry Smith +  ao - the application ordering context
2271447629fSBarry Smith .  n - the number of integers
2281447629fSBarry Smith -  ia - the integers; these are replaced with their mapped value
2291447629fSBarry Smith 
2301447629fSBarry Smith    Output Parameter:
2311447629fSBarry Smith .   ia - the mapped integers
2321447629fSBarry Smith 
2331447629fSBarry Smith    Level: beginner
2341447629fSBarry Smith 
2351447629fSBarry Smith    Note:
2361447629fSBarry Smith    Any integers in ia[] that are negative are left unchanged. This
2371447629fSBarry Smith    allows one to convert, for example, neighbor lists that use negative
2381447629fSBarry Smith    entries to indicate nonexistent neighbors due to boundary conditions, etc.
2391447629fSBarry Smith 
2401447629fSBarry Smith    Integers that are out of range are mapped to -1
2411447629fSBarry Smith 
2421447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOPetscToApplication(),
2431447629fSBarry Smith           AOPetscToApplicationIS(), AOApplicationToPetsc()
2441447629fSBarry Smith @*/
2451447629fSBarry Smith PetscErrorCode  AOApplicationToPetsc(AO ao,PetscInt n,PetscInt ia[])
2461447629fSBarry Smith {
2471447629fSBarry Smith   PetscErrorCode ierr;
2481447629fSBarry Smith 
2491447629fSBarry Smith   PetscFunctionBegin;
2501447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
2511447629fSBarry Smith   if (n) PetscValidIntPointer(ia,3);
2521447629fSBarry Smith   ierr = (*ao->ops->applicationtopetsc)(ao,n,ia);CHKERRQ(ierr);
2531447629fSBarry Smith   PetscFunctionReturn(0);
2541447629fSBarry Smith }
2551447629fSBarry Smith 
2561447629fSBarry Smith /*@
2571447629fSBarry Smith   AOPetscToApplicationPermuteInt - Permutes an array of blocks of integers
2581447629fSBarry Smith   in the PETSc ordering to the application-defined ordering.
2591447629fSBarry Smith 
2601447629fSBarry Smith   Collective on AO
2611447629fSBarry Smith 
2621447629fSBarry Smith   Input Parameters:
2631447629fSBarry Smith + ao    - The application ordering context
2641447629fSBarry Smith . block - The block size
2651447629fSBarry Smith - array - The integer array
2661447629fSBarry Smith 
2671447629fSBarry Smith   Output Parameter:
2681447629fSBarry Smith . array - The permuted array
2691447629fSBarry Smith 
2701447629fSBarry Smith   Note: The length of the array should be block*N, where N is length
2711447629fSBarry Smith   provided to the AOCreate*() method that created the AO.
2721447629fSBarry Smith 
2731447629fSBarry Smith   The permutation takes array[i_pet] --> array[i_app], where i_app is
2741447629fSBarry Smith   the index of 'i' in the application ordering and i_pet is the index
2751447629fSBarry Smith   of 'i' in the petsc ordering.
2761447629fSBarry Smith 
2771447629fSBarry Smith   Level: beginner
2781447629fSBarry Smith 
2791447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOApplicationToPetsc(), AOPetscToApplicationIS()
2801447629fSBarry Smith @*/
2811447629fSBarry Smith PetscErrorCode  AOPetscToApplicationPermuteInt(AO ao, PetscInt block, PetscInt array[])
2821447629fSBarry Smith {
2831447629fSBarry Smith   PetscErrorCode ierr;
2841447629fSBarry Smith 
2851447629fSBarry Smith   PetscFunctionBegin;
2861447629fSBarry Smith   PetscValidHeaderSpecific(ao, AO_CLASSID,1);
2871447629fSBarry Smith   PetscValidIntPointer(array,3);
2881447629fSBarry Smith   ierr = (*ao->ops->petsctoapplicationpermuteint)(ao, block, array);CHKERRQ(ierr);
2891447629fSBarry Smith   PetscFunctionReturn(0);
2901447629fSBarry Smith }
2911447629fSBarry Smith 
2921447629fSBarry Smith /*@
2931447629fSBarry Smith   AOApplicationToPetscPermuteInt - Permutes an array of blocks of integers
2941447629fSBarry Smith   in the application-defined ordering to the PETSc ordering.
2951447629fSBarry Smith 
2961447629fSBarry Smith   Collective on AO
2971447629fSBarry Smith 
2981447629fSBarry Smith   Input Parameters:
2991447629fSBarry Smith + ao    - The application ordering context
3001447629fSBarry Smith . block - The block size
3011447629fSBarry Smith - array - The integer array
3021447629fSBarry Smith 
3031447629fSBarry Smith   Output Parameter:
3041447629fSBarry Smith . array - The permuted array
3051447629fSBarry Smith 
3061447629fSBarry Smith   Note: The length of the array should be block*N, where N is length
3071447629fSBarry Smith   provided to the AOCreate*() method that created the AO.
3081447629fSBarry Smith 
3091447629fSBarry Smith   The permutation takes array[i_app] --> array[i_pet], where i_app is
3101447629fSBarry Smith   the index of 'i' in the application ordering and i_pet is the index
3111447629fSBarry Smith   of 'i' in the petsc ordering.
3121447629fSBarry Smith 
3131447629fSBarry Smith   Level: beginner
3141447629fSBarry Smith 
3151447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOPetscToApplicationIS(), AOApplicationToPetsc()
3161447629fSBarry Smith @*/
3171447629fSBarry Smith PetscErrorCode  AOApplicationToPetscPermuteInt(AO ao, PetscInt block, PetscInt array[])
3181447629fSBarry Smith {
3191447629fSBarry Smith   PetscErrorCode ierr;
3201447629fSBarry Smith 
3211447629fSBarry Smith   PetscFunctionBegin;
3221447629fSBarry Smith   PetscValidHeaderSpecific(ao, AO_CLASSID,1);
3231447629fSBarry Smith   PetscValidIntPointer(array,3);
3241447629fSBarry Smith   ierr = (*ao->ops->applicationtopetscpermuteint)(ao, block, array);CHKERRQ(ierr);
3251447629fSBarry Smith   PetscFunctionReturn(0);
3261447629fSBarry Smith }
3271447629fSBarry Smith 
3281447629fSBarry Smith /*@
3291447629fSBarry Smith   AOPetscToApplicationPermuteReal - Permutes an array of blocks of reals
3301447629fSBarry Smith   in the PETSc ordering to the application-defined ordering.
3311447629fSBarry Smith 
3321447629fSBarry Smith   Collective on AO
3331447629fSBarry Smith 
3341447629fSBarry Smith   Input Parameters:
3351447629fSBarry Smith + ao    - The application ordering context
3361447629fSBarry Smith . block - The block size
3371447629fSBarry Smith - array - The integer array
3381447629fSBarry Smith 
3391447629fSBarry Smith   Output Parameter:
3401447629fSBarry Smith . array - The permuted array
3411447629fSBarry Smith 
3421447629fSBarry Smith   Note: The length of the array should be block*N, where N is length
3431447629fSBarry Smith   provided to the AOCreate*() method that created the AO.
3441447629fSBarry Smith 
3451447629fSBarry Smith   The permutation takes array[i_pet] --> array[i_app], where i_app is
3461447629fSBarry Smith   the index of 'i' in the application ordering and i_pet is the index
3471447629fSBarry Smith   of 'i' in the petsc ordering.
3481447629fSBarry Smith 
3491447629fSBarry Smith   Level: beginner
3501447629fSBarry Smith 
3511447629fSBarry Smith .seealso: AOCreateBasic(), AOView(), AOApplicationToPetsc(), AOPetscToApplicationIS()
3521447629fSBarry Smith @*/
3531447629fSBarry Smith PetscErrorCode  AOPetscToApplicationPermuteReal(AO ao, PetscInt block, PetscReal array[])
3541447629fSBarry Smith {
3551447629fSBarry Smith   PetscErrorCode ierr;
3561447629fSBarry Smith 
3571447629fSBarry Smith   PetscFunctionBegin;
3581447629fSBarry Smith   PetscValidHeaderSpecific(ao, AO_CLASSID,1);
3591447629fSBarry Smith   PetscValidIntPointer(array,3);
3601447629fSBarry Smith   ierr = (*ao->ops->petsctoapplicationpermutereal)(ao, block, array);CHKERRQ(ierr);
3611447629fSBarry Smith   PetscFunctionReturn(0);
3621447629fSBarry Smith }
3631447629fSBarry Smith 
3641447629fSBarry Smith /*@
3651447629fSBarry Smith   AOApplicationToPetscPermuteReal - Permutes an array of blocks of reals
3661447629fSBarry Smith   in the application-defined ordering to the PETSc ordering.
3671447629fSBarry Smith 
3681447629fSBarry Smith   Collective on AO
3691447629fSBarry Smith 
3701447629fSBarry Smith   Input Parameters:
3711447629fSBarry Smith + ao    - The application ordering context
3721447629fSBarry Smith . block - The block size
3731447629fSBarry Smith - array - The integer array
3741447629fSBarry Smith 
3751447629fSBarry Smith   Output Parameter:
3761447629fSBarry Smith . array - The permuted array
3771447629fSBarry Smith 
3781447629fSBarry Smith   Note: The length of the array should be block*N, where N is length
3791447629fSBarry Smith   provided to the AOCreate*() method that created the AO.
3801447629fSBarry Smith 
3811447629fSBarry Smith   The permutation takes array[i_app] --> array[i_pet], where i_app is
3821447629fSBarry Smith   the index of 'i' in the application ordering and i_pet is the index
3831447629fSBarry Smith   of 'i' in the petsc ordering.
3841447629fSBarry Smith 
3851447629fSBarry Smith   Level: beginner
3861447629fSBarry Smith 
3871447629fSBarry Smith .seealso: AOCreateBasic(), AOView(),AOApplicationToPetsc(), AOPetscToApplicationIS()
3881447629fSBarry Smith @*/
3891447629fSBarry Smith PetscErrorCode  AOApplicationToPetscPermuteReal(AO ao, PetscInt block, PetscReal array[])
3901447629fSBarry Smith {
3911447629fSBarry Smith   PetscErrorCode ierr;
3921447629fSBarry Smith 
3931447629fSBarry Smith   PetscFunctionBegin;
3941447629fSBarry Smith   PetscValidHeaderSpecific(ao, AO_CLASSID,1);
3951447629fSBarry Smith   PetscValidIntPointer(array,3);
3961447629fSBarry Smith   ierr = (*ao->ops->applicationtopetscpermutereal)(ao, block, array);CHKERRQ(ierr);
3971447629fSBarry Smith   PetscFunctionReturn(0);
3981447629fSBarry Smith }
3991447629fSBarry Smith 
40001e608bcSBarry Smith /*@
4011447629fSBarry Smith     AOSetFromOptions - Sets AO options from the options database.
4021447629fSBarry Smith 
4031447629fSBarry Smith    Collective on AO
4041447629fSBarry Smith 
4051447629fSBarry Smith    Input Parameter:
4061447629fSBarry Smith .  ao - the application ordering
4071447629fSBarry Smith 
4081447629fSBarry Smith    Level: beginner
4091447629fSBarry Smith 
4101447629fSBarry Smith .seealso: AOCreate(), AOSetType(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
4111447629fSBarry Smith @*/
4121447629fSBarry Smith PetscErrorCode AOSetFromOptions(AO ao)
4131447629fSBarry Smith {
4141447629fSBarry Smith   PetscErrorCode ierr;
4151447629fSBarry Smith   char           type[256];
4161447629fSBarry Smith   const char     *def=AOBASIC;
4171447629fSBarry Smith   PetscBool      flg;
4181447629fSBarry Smith 
4191447629fSBarry Smith   PetscFunctionBegin;
4201447629fSBarry Smith   PetscValidHeaderSpecific(ao,AO_CLASSID,1);
4211447629fSBarry Smith 
4221447629fSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)ao);CHKERRQ(ierr);
423a264d7a6SBarry Smith   ierr = PetscOptionsFList("-ao_type","AO type","AOSetType",AOList,def,type,256,&flg);CHKERRQ(ierr);
4241447629fSBarry Smith   if (flg) {
4251447629fSBarry Smith     ierr = AOSetType(ao,type);CHKERRQ(ierr);
4261447629fSBarry Smith   } else if (!((PetscObject)ao)->type_name) {
4271447629fSBarry Smith     ierr = AOSetType(ao,def);CHKERRQ(ierr);
4281447629fSBarry Smith   }
4291447629fSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
4301447629fSBarry Smith   PetscFunctionReturn(0);
4311447629fSBarry Smith }
4321447629fSBarry Smith 
43301e608bcSBarry Smith /*@
4341447629fSBarry Smith    AOSetIS - Sets the IS associated with the application ordering.
4351447629fSBarry Smith 
436*d083f849SBarry Smith    Collective
4371447629fSBarry Smith 
4381447629fSBarry Smith    Input Parameters:
4391447629fSBarry Smith +  ao - the application ordering
4401447629fSBarry Smith .  isapp -  index set that defines an ordering
4411447629fSBarry Smith -  ispetsc - index set that defines another ordering (may be NULL to use the
4421447629fSBarry Smith              natural ordering)
4431447629fSBarry Smith 
4441447629fSBarry Smith    Notes:
4451447629fSBarry Smith    The index sets isapp and ispetsc are used only for creation of ao.
4461447629fSBarry Smith 
44701e608bcSBarry 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
44801e608bcSBarry Smith 
4491447629fSBarry Smith    Level: beginner
4501447629fSBarry Smith 
4511447629fSBarry Smith .seealso: AOCreate(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
4521447629fSBarry Smith @*/
4531447629fSBarry Smith PetscErrorCode AOSetIS(AO ao,IS isapp,IS ispetsc)
4541447629fSBarry Smith {
4551447629fSBarry Smith   PetscErrorCode ierr;
4561447629fSBarry Smith 
4571447629fSBarry Smith   PetscFunctionBegin;
4581447629fSBarry Smith   if (ispetsc) {
4591447629fSBarry Smith     PetscInt napp,npetsc;
4601447629fSBarry Smith     ierr = ISGetLocalSize(isapp,&napp);CHKERRQ(ierr);
4611447629fSBarry Smith     ierr = ISGetLocalSize(ispetsc,&npetsc);CHKERRQ(ierr);
4623cad7c52SBarry Smith     if (napp != npetsc) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"napp %D != npetsc %D. Local IS lengths must match",napp,npetsc);
4631447629fSBarry Smith   }
4643cad7c52SBarry Smith   if (isapp) {ierr = PetscObjectReference((PetscObject)isapp);CHKERRQ(ierr);}
4653cad7c52SBarry Smith   if (ispetsc) {ierr = PetscObjectReference((PetscObject)ispetsc);CHKERRQ(ierr);}
46601e608bcSBarry Smith   ierr = ISDestroy(&ao->isapp);CHKERRQ(ierr);
46701e608bcSBarry Smith   ierr = ISDestroy(&ao->ispetsc);CHKERRQ(ierr);
4681447629fSBarry Smith   ao->isapp   = isapp;
4691447629fSBarry Smith   ao->ispetsc = ispetsc;
4701447629fSBarry Smith   PetscFunctionReturn(0);
4711447629fSBarry Smith }
4721447629fSBarry Smith 
47301e608bcSBarry Smith /*@
4741447629fSBarry Smith    AOCreate - Creates an application ordering.
4751447629fSBarry Smith 
476*d083f849SBarry Smith    Collective
4771447629fSBarry Smith 
4781447629fSBarry Smith    Input Parameters:
4791447629fSBarry Smith .  comm - MPI communicator that is to share AO
4801447629fSBarry Smith 
4811447629fSBarry Smith    Output Parameter:
4821447629fSBarry Smith .  ao - the new application ordering
4831447629fSBarry Smith 
4841447629fSBarry Smith    Options Database Key:
4851447629fSBarry Smith +   -ao_type <aotype> - create ao with particular format
4861447629fSBarry Smith -   -ao_view - call AOView() at the conclusion of AOCreate()
4871447629fSBarry Smith 
4881447629fSBarry Smith    Level: beginner
4891447629fSBarry Smith 
4901447629fSBarry Smith .seealso: AOSetIS(), AODestroy(), AOPetscToApplication(), AOApplicationToPetsc()
4911447629fSBarry Smith @*/
4921447629fSBarry Smith PetscErrorCode  AOCreate(MPI_Comm comm,AO *ao)
4931447629fSBarry Smith {
4941447629fSBarry Smith   PetscErrorCode ierr;
4951447629fSBarry Smith   AO             aonew;
4961447629fSBarry Smith 
4971447629fSBarry Smith   PetscFunctionBegin;
4981447629fSBarry Smith   PetscValidPointer(ao,2);
4991447629fSBarry Smith   *ao = NULL;
500607a6623SBarry Smith   ierr = AOInitializePackage();CHKERRQ(ierr);
5011447629fSBarry Smith 
50273107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(aonew,AO_CLASSID,"AO","Application Ordering","AO",comm,AODestroy,AOView);CHKERRQ(ierr);
5031447629fSBarry Smith   *ao  = aonew;
5041447629fSBarry Smith   PetscFunctionReturn(0);
5051447629fSBarry Smith }
506