/*
 * This code is generated by BioUML FrameWork 
 * for BIOMD0000000053.xml diagram  at 2008.03.20 15:04:38
 */
import biouml.plugins.simulation.ae.NewtonSolver;
import biouml.plugins.simulation.java.JavaBaseModel;
import ru.biosoft.math.MathRoutines;

public class BIOMD0000000053 extends JavaBaseModel
{

/*
 * Write rules to calculate equation parameters
 */
    private void __internalVarInitFunc_0(double time, double[] x)
    {
        Fraction_Amadori = x[0]/0.0034;
        Fraction_CML = x[1]/0.0034;
    }


/*
 * Write rules to calculate equation parameters excluding internal variables.
 */
    public void __internalRateVarInitFunc_0(double time, double[] x)
    {
        rate_v1a = compartment*v1a_p1*v1a_k1a*x[2]*x[4];
        rate_v1b = compartment*v1b_k1b*x[5];
        rate_v2a = compartment*v2a_p2*v2a_k2a*x[5];
        rate_v2b = compartment*v2b_p2*v2b_k2b*x[0];
        rate_v3 = compartment*v3_ox*v3_p3*v3_k3*Math.pow((x[2]/0.25), 0.36);
        rate_v4 = compartment*v4_ox*v4_p4*v4_k4*x[0];
        rate_v5 = compartment*v5_ox*v5_p5*v5_k5*x[3]*x[4];
        rate_v5b = compartment*v5b_k5b*x[3];
        rate_v6 = compartment*v6_ox*v6_p6*v6_k3*Math.pow((x[5]/0.25), 0.36);
        rate_v7a = compartment*0.05*v7a_ox*v7a_p7*v7a_k3*Math.pow((x[5]/0.25), 0.36);
        rate_v7b = compartment*0.0050*v7b_ox*v7b_p7*v7b_k3*Math.pow((x[5]/0.25), 0.36);
        rate_v7c = compartment*v7c_ox*v7c_p7*v7c_k3*Math.pow((x[5]/0.25), 0.36);
    }

    public void Init()
    {
        initialValues = getInitialValues();
/*
 * Initialize variables
 */
        compartment = 1.0; // initial value of $compartment
        v1a_k1a = 0.09; // initial value of v1a_k1a
        v1a_p1 = 0.115; // initial value of v1a_p1
        v1b_k1b = 0.36; // initial value of v1b_k1b
        v2a_k2a = 0.033; // initial value of v2a_k2a
        v2a_p2 = 0.75; // initial value of v2a_p2
        v2b_k2b = 0.0012; // initial value of v2b_k2b
        v2b_p2 = 0.75; // initial value of v2b_p2
        v3_k3 = 7.92E-7; // initial value of v3_k3
        v3_ox = 1.0; // initial value of v3_ox
        v3_p3 = 1.0; // initial value of v3_p3
        v4_k4 = 8.6E-5; // initial value of v4_k4
        v4_ox = 1.0; // initial value of v4_ox
        v4_p4 = 1.0; // initial value of v4_p4
        v5_k5 = 0.019; // initial value of v5_k5
        v5_ox = 1.0; // initial value of v5_ox
        v5_p5 = 1.0; // initial value of v5_p5
        v5b_k5b = 0.0017; // initial value of v5b_k5b
        v6_k3 = 7.92E-7; // initial value of v6_k3
        v6_ox = 1.0; // initial value of v6_ox
        v6_p6 = 2.7; // initial value of v6_p6
        v7a_k3 = 7.92E-7; // initial value of v7a_k3
        v7a_ox = 1.0; // initial value of v7a_ox
        v7a_p7 = 60.0; // initial value of v7a_p7
        v7b_k3 = 7.92E-7; // initial value of v7b_k3
        v7b_ox = 1.0; // initial value of v7b_ox
        v7b_p7 = 60.0; // initial value of v7b_p7
        v7c_k3 = 7.92E-7; // initial value of v7c_k3
        v7c_ox = 1.0; // initial value of v7c_ox
        v7c_p7 = 60.0; // initial value of v7c_p7
    }

    /*
     * Model variables initial values
     */
    protected double rate_v1a;
    protected double rate_v1b;
    protected double rate_v2a;
    protected double rate_v2b;
    protected double rate_v3;
    protected double rate_v4;
    protected double rate_v5;
    protected double rate_v5b;
    protected double rate_v6;
    protected double rate_v7a;
    protected double rate_v7b;
    protected double rate_v7c;
    protected double compartment;
    protected double Fraction_Amadori;
    protected double Fraction_CML;
    protected double v1a_k1a;
    protected double v1a_p1;
    protected double v1b_k1b;
    protected double v2a_k2a;
    protected double v2a_p2;
    protected double v2b_k2b;
    protected double v2b_p2;
    protected double v3_k3;
    protected double v3_ox;
    protected double v3_p3;
    protected double v4_k4;
    protected double v4_ox;
    protected double v4_p4;
    protected double v5_k5;
    protected double v5_ox;
    protected double v5_p5;
    protected double v5b_k5b;
    protected double v6_k3;
    protected double v6_ox;
    protected double v6_p6;
    protected double v7a_k3;
    protected double v7a_ox;
    protected double v7a_p7;
    protected double v7b_k3;
    protected double v7b_ox;
    protected double v7b_p7;
    protected double v7c_k3;
    protected double v7c_ox;
    protected double v7c_p7;

    public double[] extendResult(double time,double [] x)
    {
        this.time = time;

        __internalVarInitFunc_0(time, x);

        double[] y = new double[8];
        y[0] = x[0];
        y[1] = x[1];
        y[2] = x[2];
        y[3] = x[3];
        y[4] = x[4];
        y[5] = x[5];
        y[6] = Fraction_Amadori;
        y[7] = Fraction_CML;
        return y;
    }
    public double[] getInitialValues()
    {
        double [] x = new double[6];
        this.time = 0.0;
        x[0] = 0.0; // - $"compartment.Amadori"
        x[1] = 0.0; // - $"compartment.CML"
        x[2] = 0.25; // - $"compartment.Glucose"
        x[3] = 0.0; // - $"compartment.Glyoxal"
        x[4] = 0.0034; // - $"compartment.Lysine"
        x[5] = 0.0; // - $"compartment.Schiff"

        __internalVarInitFunc_0(time, x);
        __internalRateVarInitFunc_0(time, x);

        return x;
    }

/*
 * code for algebraic rules calculations
 */

/*
 * end of code for algebraic rules calculations
 */

    protected void calculateRates(double time, double[] x)
    {

        __internalVarInitFunc_0(time, x);
        __internalRateVarInitFunc_0(time, x);

    }

        /*
         * calculate dy/dt for 'BIOMD0000000053.xml' model
         */
    public void __internalDyDt_0(double time, double [] x, double[] result)
    {
        result[0] = +rate_v2a-rate_v2b-rate_v4;
        result[1] = +rate_v4+rate_v5+rate_v6;
        result[2] = -rate_v1a+rate_v1b-rate_v3;
        result[3] = +rate_v3-rate_v5-rate_v5b+rate_v7b;
        result[4] = -rate_v1a+rate_v1b-rate_v5+rate_v7a;
        result[5] = +rate_v1a-rate_v1b-rate_v2a+rate_v2b-rate_v6-rate_v7c;
    }
    protected double [] calculateResult(double time, double[] x)
    {
        double[] result = new double[6];
        __internalDyDt_0(time, x, result);
        return result;
    }
    public double[] dy_dt(double time, double[] x)
    {
        this.time = time;
        calculateRates( time,x );

        return calculateResult( time,x );
    }

} // class ...