import java.util.*;
//***********************************************************************************
//* Class for driven pendulum ODE */
//***********************************************************************************

public class PendulumFunction extends OdesFunction {

      private static final double Pi2=2*Math.PI;
      
      PendulumFunction(int n) {
            super(n);
            x0=new double[n];
            x0[0]=0.;
            x0[1]=0.2;
            x0[2]=0.1;
            x0[3]=0.;
            dt=0.2;
            trans=50.;
            ghostTime=50.;
            poincareSection=3.14;
            title="Drive Damped Pendulum";
            nParameters=4;
            aDefault=new double[nParameters];
            aDefault[0]=1.5;
            aDefault[1]=0.5;
            aDefault[2]=0.6667;
            aDefault[3]=0.;
            a=new double[nParameters]; 
            wrapZ=true;
            wrapZValue=Pi2;   
            wrapX=true;
            wrapXValue=Pi2;                     
            
      }      
      
//***********************************************************************************
/** Sets the equation paramters 
* @param paramters the array of input paramters
*/
//***********************************************************************************      
      public void setParameters(double[] parameters) {
            for(int i=0; i<nParameters;i++) a[i]=parameters[i];
      }

//*********************************************************************
/**
* Returns RHS of differential equations for Driven Pendulum model
* @param x[] vector of current value of dependent variables
* @param n number of dependent variables in array x[]
* @param t current value of independent variable
* @return n compoent vector giving derivatives of dependent variables
*/
//*********************************************************************       
      public double[] derivs(double[] x, double t){
           double rhs[] = new double[nVariables];
           rhs[0]=1.;
           rhs[1]=x[2];
           rhs[2]=-a[1]*x[2]-Math.sin(x[1])+a[0]*Math.cos(x[3])+a[3];
           rhs[3]=a[2];
           return rhs;
      }

     
//***********************************************************************************
/** Returnd the number of parameters defining the equation
* @return number of parameters
*/
//***********************************************************************************
     public int getNParameters() {
            return nParameters;
     } 
                  
}
