/* $Id: ao.h,v 1.15 1997/12/12 19:40:34 bsmith Exp curfman $ */

/* 
  An application ordering is mapping between an application-centric
  ordering (the ordering that is "natural" for the application) and 
  the parallel ordering that PETSc uses.
*/
#if !defined(__AO_PACKAGE)
#define __AO_PACKAGE
#include "is.h"
#include "mat.h"

typedef enum {AO_BASIC=0, AO_ADVANCED=1} AOType;

#define AO_COOKIE PETSC_COOKIE+20

typedef struct _p_AO* AO;

extern int AOCreateBasic(MPI_Comm,int,int*,int*,AO*);
extern int AOCreateBasicIS(IS,IS,AO*);

extern int AOPetscToApplication(AO,int,int*);
extern int AOApplicationToPetsc(AO,int,int*);
extern int AOPetscToApplicationIS(AO,IS);
extern int AOApplicationToPetscIS(AO,IS);

extern int AODestroy(AO);
extern int AOView(AO,Viewer);

/* ----------------------------------------------------*/

typedef enum {AODATA_BASIC=0, AODATA_ADVANCED=1} AODataType;

#define AODATA_COOKIE PETSC_COOKIE+24

typedef struct _p_AOData* AOData;

extern int AODataCreateBasic(MPI_Comm,AOData *);
extern int AODataView(AOData,Viewer);
extern int AODataDestroy(AOData);
extern int AODataLoadBasic(Viewer,AOData *);
extern int AODataGetInfo(AOData,int*,char ***);

extern int AODataKeyAdd(AOData,char*,int,int);
extern int AODataKeyRemove(AOData,char*);

extern int AODataKeySetLocalToGlobalMapping(AOData,char*,ISLocalToGlobalMapping);
extern int AODataKeyGetLocalToGlobalMapping(AOData,char*,ISLocalToGlobalMapping*);
extern int AODataKeyRemap(AOData,char *,AO);

extern int AODataKeyExists(AOData,char*,PetscTruth*);
extern int AODataKeyGetInfo(AOData,char *,int *,int*,int*,char***);
extern int AODataKeyGetOwnershipRange(AOData,char *,int *,int*);

extern int AODataKeyGetNeighbors(AOData,char *,int,int*,IS *);
extern int AODataKeyGetNeighborsIS(AOData,char *,IS,IS *);
extern int AODataKeyGetAdjacency(AOData,char *,Mat*);

extern int AODataKeyGetActive(AOData,char*,char*,int,int *,int,IS*);
extern int AODataKeyGetActiveIS(AOData,char*,char*,IS,int,IS*);
extern int AODataKeyGetActiveLocal(AOData,char*,char*,int,int *,int,IS*);
extern int AODataKeyGetActiveLocalIS(AOData,char*,char*,IS,int,IS*);

extern int AODataKeyPartition(AOData,char *);

extern int AODataSegmentAdd(AOData,char*,char *,int, int, int *,void *,PetscDataType);
extern int AODataSegmentRemove(AOData,char *,char *);
extern int AODataSegmentAddIS(AOData,char*,char *,int, IS,void *,PetscDataType);

extern int AODataSegmentExists(AOData,char*,char*,PetscTruth*);
extern int AODataSegmentGetInfo(AOData,char *,char *,int *,PetscDataType*);

extern int AODataSegmentGet(AOData,char *,char *,int,int*,void **);
extern int AODataSegmentRestore(AOData,char *,char *,int,int*,void **);
extern int AODataSegmentGetIS(AOData,char *,char *,IS,void **);
extern int AODataSegmentRestoreIS(AOData,char *,char *,IS,void **);

extern int AODataSegmentGetLocal(AOData,char *,char *,int,int*,void **);
extern int AODataSegmentRestoreLocal(AOData,char *,char *,int,int*,void **);
extern int AODataSegmentGetLocalIS(AOData,char *,char *,IS,void **);
extern int AODataSegmentRestoreLocalIS(AOData,char *,char *,IS,void **);

extern int AODataSegmentGetReduced(AOData,char *,char *,int,int*,IS *);
extern int AODataSegmentGetReducedIS(AOData,char *,char *,IS,IS *);
extern int AODataSegmentGetExtrema(AOData,char*,char*,void *,void *);

extern int AODataSegmentPartition(AOData,char *,char *);


#endif


