#define MAX_PERIODS 20
typedef struct {
  Vec *up;
  PetscTruth firstTime;
  PetscInt numPeriods;
} PeriodicVec;

typedef struct {
  Mat Ap[MAX_PERIODS];
  PetscTruth firstTime;
  PetscInt numPeriods;
} PeriodicMat;

typedef struct {
  PetscScalar *up[MAX_PERIODS];
  PetscInt arrayLength;
  PetscTruth firstTime;
  PetscInt numPeriods;
} PeriodicArray;

extern PetscErrorCode calcInterpFactor(PetscInt nmax,PetscScalar t,PetscScalar tarray[],PetscInt *itf,PetscScalar *alpha);
extern PetscErrorCode calcPeriodicInterpFactor(PetscInt n,PetscScalar t,PetscScalar tparr[],PetscInt *itf1,PetscInt *itf2,PetscScalar *al1,PetscScalar *al2);
extern PetscInt findindex(PetscScalar tarr[],PetscInt nmax,PetscScalar t);
extern PetscErrorCode interpPeriodicMatrix(PetscScalar tc, Mat *A, PetscScalar cyclePeriod, PetscInt numPeriods, 
                                           PetscScalar *tdp, PeriodicMat *user, char *filename);
extern PetscErrorCode interpPeriodicVector(PetscScalar tc, Vec *u, PetscScalar cyclePeriod, PetscInt numPeriods, 
                                           PetscScalar *tdp, PeriodicVec *user, char *filename);

extern PetscErrorCode destroyPeriodicVec(PeriodicVec *user);
extern PetscErrorCode destroyPeriodicMat(PeriodicMat *user);
extern PetscErrorCode destroyPeriodicArray(PeriodicArray *user);

// extern PetscErrorCode interpPeriodicMatrix(PetscScalar tc, Mat *A, PetscScalar cyclePeriod, PetscInt numPeriods, 
//                                            PetscScalar *tdp, Mat A0, Mat A1, char *filename, MatLayout *layout);
// extern PetscErrorCode interpPeriodicVector(PetscScalar tc, Vec *u, PetscScalar cyclePeriod, PetscInt numPeriods, 
//                                            PetscScalar *tdp, PeriodicVec *user, char *filename);
