/** Simulation d'un pendule rigide.
 * version 'de luxe'
 * compiler/executer comme suit:
 *   javac SimulPendule
 *   java SimulPendule theta_init omega_init > pendule.data
 * 2008 Adrian Daerr (+conseils Bip, Oresama, ...), Univ Paris Diderot
 * domaine public
 */


import java.text.MessageFormat;

public class SimulPendule {
    private static void usage() {
        System.err.println("usage : SimulPendule [ theta0 omega0 ]");
        System.exit(1);
    }

    public static void main(String args[]) {
        // lire les conditions initiales dans la liste des arguments
        double theta0 = 0.0;
        double omega0 = 1.99;
        switch(args.length) {
        case 0:
            break;
        case 2:
            try {
                theta0 = Double.parseDouble(args[0]);
                omega0 = Double.parseDouble(args[1]);
            } catch (NumberFormatException nfe) {// il y a eu un problème
                System.err.println("Erreur de conversion: "+nfe);
                usage();
            }
            break;
        default:
            usage();
        }
        // initialiser un pendule avec les bonnes conditions initiales
        Pendule systeme = new Pendule(theta0, omega0);
        final double tfinal = 50.0, h = 0.05;// durée simul, pas de temps
        // créer l'intégrateur souhaité pour notre système
        Integrateur simul = new RungeKutta4(systeme, h);
        double t = 0.0;
        int n=0;
        while (t < tfinal) {
            t = (n++)*h;
            System.out.printf("%g %g %g\n", t, systeme.getTheta(),
                            systeme.getOmega());
            simul.integre();
        }
    }
}