import opale.tools.*;
import opale.mathtools.*;
import opale.ode.*;
import opale.ode.scheme.*;
import opale.m2d.*;
import opale.m2d.object2d.*;
import opale.m2d.component2d.*;


public class Pendule
	{
	
	public static void main(String[] arg)
	{
	// Résolution des problèmes du Pendule amorti avec 15 conditions initiales différentes
	Problem pb = new Problem(2);
	RK ts = new RK();
	
	DVect cd = new DVect(2);
	
	ts.setNstep(1000);
	ts.set(0,100);
	pb.setEqn(
		new Equation()
			{
			DVect y = new DVect(2);
			public int dim() { return 2; }
			public DVect derivs(double t, DVect x)
				{
				y.set(0,x.get(1));
				y.set(1,-Math.sin(x.get(0))-0.1*x.get(1));
				return y;
				}
			}
		);

	pb.setTS(ts);
	
	// on résoud le système du Pendule avec les 15 conditions initiales différentes 
	double[][][] sol = new double[15][3][1000];
	int i;
	for (i=0;i<15;i++)
		{
		cd.set(0,(-7+i>0 ? 1 : -1)*(-Math.PI*7));
		cd.set(1,-7+i);
		pb.setInit(cd);
		pb.solve();
		sol[i]=pb.toTab();
		}
	// A chaque fois, la solution du problème i est stockée dans la variable sol[i]
	
	
	
	// On affiche le résultat avec le module 2d d'Opale
	JFrame2D jf = new JFrame2D();
	jf.setTitle("Système du pendule amorti - Opale-ODE & Opale-2D");
	jf.setSize(600,600);
	jf.getAxis().drawScale(false);
	OIJ repere = new OIJ();
	jf.getCS().set(-20,20,-8,8);
	jf.getPack2D().add(repere,"repere");
	GData2D[] gsol = new GData2D[15];
	//chaque solution est représentée par un objet de type GData2D (nuage de points)
	
	
	//affichage des 15 solutions
	for (i=0;i<15;i++)
		{
		gsol[i] = new GData2D(repere);
		gsol[i].set(1000,sol[i][1],sol[i][2]);
		jf.getPack2D().add(gsol[i],"sol"+i);
		}
	jf.show();
	
	
	
	}

}
