#ifndef Z4c_CLASS_H
#define Z4c_CLASS_H
 
#ifdef newc
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdlib>
#include <string>
#include <cmath>
using namespace std;
#else
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#endif

#include <mpi.h>

#include "cgh.h"
#include "ShellPatch.h"
#include "misc.h"
#include "var.h"
#include "MyList.h"
#include "monitor.h"
#include "surface_integral.h"

#include "macrodef.h"

#ifdef USE_GPU
#include "bssn_gpu_class.h"
#else
#include "bssn_class.h"
#endif

class Z4c_class : public bssn_class
{
public:
     Z4c_class(double Couranti, double StartTimei, double TotalTimei, double DumpTimei, double d2DumpTimei, double CheckTimei, double AnasTimei,
               int Symmetryi, int checkruni, char *checkfilenamei, double numepssi, double numepsbi, double numepshi,
               int a_levi, int maxli, int decni, double maxrexi, double drexi);
     ~Z4c_class();

     void Initialize();
     void Check_extrop();
     // Since we have set zero to variables at very begining
     // we can neglect TZ for initial data setting
     void Step(int lev, int YN);
     void Interp_Constraint();
     void Constraint_Out();
     void Compute_Constraint();

protected:
     var *TZo;
     var *TZ0;
     var *TZ;
     var *TZ1;
     var *TZ_rhs;
};
#endif /* Z4c_CLASS_H */