int main(void)
{
    FILE *f;

    int i;
    int iteration;

    double x[2];
    double xx[2];
    double t, dt;

    dt = 0.05;
    iteration=1000;

    x[0] = 1.0; // q
    x[1] = 0.0; // p

    f = fopen("trajectory_symp2.dat","w");

    for (i=0; i<iteration; i++) {
        t = i*dt;
        fprintf(f,"%lf %lf %lf %le\n", t, x[0], x[1], Hamiltonian(t,x[0],x[1]));
        Integrator(Symplectic2, t,dt,x,xx);

        x[0] = xx[0];
        x[1] = xx[1];
    }
    fclose(f);
    return 0;
}
int Trajectory(double* X1, double* X2, double* Phi1, double* Phi2, double* K, int numProcs, int myID)
{
    double* Eta = new double[TOT];
    double* P = new double[TOT];
    double* F = new double[TOT];
    double* temK = new double[TOT];
    double* temBuf = new double[TOT];
    double t = sqrt(0.5);
    int flag;
    MPI_Generate(Eta, t, numProcs, myID);
    M(Eta, Phi1, K, numProcs, myID);
    MPI_Generate(Eta, t, numProcs, myID);
    M(Eta, Phi2, K, numProcs, myID);
    MPI_Setzero(X1, numProcs, myID);
    MPI_Setzero(X2, numProcs, myID);
    MPI_Generate(P, 1.0, numProcs, myID);
    MPI_Assign(K, temK, numProcs, myID);
    double hamStart = Hamiltonian(X1, X2, Phi1, Phi2, P, K, numProcs, myID);
    flag = FermionForce(X1, X2, Phi1, Phi2, F, K, numProcs, myID);
    if(!flag)
    {
        MPI_Assign(temK, K, numProcs, myID);
        return 0;
    }
    MPI_Multiply(F, 0.5*dt, temBuf, numProcs, myID);
    MPI_Add(P, temBuf, P, numProcs, myID);
    for(int i = 0; i<(N_md-1); i++)
    {
        MPI_Multiply(P, dt, temBuf, numProcs, myID);
        MPI_Add(K, temBuf, K, numProcs, myID);
        flag = FermionForce(X1, X2, Phi1, Phi2, F, K, numProcs, myID);
        if(!flag)
        {
            MPI_Assign(temK, K, numProcs, myID);
            return 0;
        }
        MPI_Multiply(F, dt, temBuf, numProcs, myID);
        MPI_Add(P, temBuf, P, numProcs, myID);
    }
    MPI_Multiply(P, dt, temBuf, numProcs, myID);
    MPI_Add(K, temBuf, K, numProcs, myID);
    flag = FermionForce(X1, X2, Phi1, Phi2, F, K, numProcs, myID);
    if(!flag)
    {
        MPI_Assign(temK, K, numProcs, myID);
        return 0;
    }
    MPI_Multiply(F, 0.5*dt, temBuf, numProcs, myID);
    MPI_Add(P, temBuf, P, numProcs, myID);
    double hamEnd = Hamiltonian(X1, X2, Phi1, Phi2, P, K, numProcs, myID);
    double r = 0.0;
    if(myID == ROOT)
    {
        random_device rd;
        mt19937 generator(rd());
        uniform_real_distribution<double> dis(0.0, 1.0);
        r = dis(generator);
    }
    MPI_Bcast(&r, 1, MPI_DOUBLE, ROOT, MPI_COMM_WORLD);
    double s = exp(hamStart-hamEnd);
    if(myID == ROOT)
    {
        ofstream file_log("evolution.log", ios_base::app);
        file_log<<"Hamiltoian: "<<hamStart<<" "<<hamEnd<<" "<<r<<" "<<s<<endl;
        file_log.close();
    }
    delete [] Eta;
    delete [] P;
    delete [] F;
    delete [] temK;
    delete [] temBuf;
    if(r<s)
    {
        return 1;
    }
    else
    {
        MPI_Assign(temK, K, numProcs, myID);
        return 0;
    }
}