// RK.h
//
// Original author:  Yurii Il'inskii
//
// Modifications:
// 05 Dec 1996: Modified by Ronald Kumon to realign text and add comments

#ifndef RK_H
#define RK_H

extern int nm, nm2, DiagnosticsOn;
extern double A;                  // Dissipation factor
extern double D;                  // Dispersion factor
extern double kxbar;              // Wavenumber*shock formation distance
extern double *V;
extern int statflag;
extern char stepfilename[81]; 
extern char statfilename[81];
extern float *nvec;               // Harmonic number vector
extern float *normdB;             // Vector for plotting amplitude norms in dB
extern float *normdBold;          // Vector for erasing old normdB values
extern double hi;                 // Initial step size
extern double eps;                // Accuracy required for each step
extern double tiny;               // Minimum scale factor for integration

void odeint(double *ystart,int nvar,double x1,double x2,double eps,
            double h1,double hmin,int *nok,int *nbad,  
            void(*derivs)(const double, const int, double *, double *),
            void(*rkqc)(double *, double *, int, double *, double, double,
            double *, double *, double *, 
            void(*)(const double, const int, double *, double *)));

void rkfixed(double *ystart,int nvar,double x1,double x2,double dx,
	     void(*derivs)(const double, const int, double *, double *),
             const float *nvec, float *normdB, float *normdBold);
				
void rkqc(double *y, double *dydx, int n, double *x, double htry,
          double eps, double *yscal, double *hdid, double *hnext,
          void (*derivs)(const double, const int, double *, double *));

void rk4(double *y, double *dydx, int n, double x, double h, double *yout,
         void (*derivs)(const double, const int, double *, double *));

void derivs(const double x, const int nvar, double *V, double *dvdx);

void normdBproc(const int NM, const double *V, float *normdB);

void eraseAndDrawGraph(const int N, const float *x, 
                       const float *y, const float t, float *yold);

#endif //RK_H
