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