/*
 * This code is generated by BioUML FrameWork 
 * for BIOMD0000000041.xml diagram  at 2008.03.20 15:04:20
 */
import biouml.plugins.simulation.ae.NewtonSolver;
import biouml.plugins.simulation.java.JavaBaseModel;
import ru.biosoft.math.MathRoutines;

public class BIOMD0000000041 extends JavaBaseModel
{

/*
 * Write rules to calculate equation parameters
 */


/*
 * Write rules to calculate equation parameters excluding internal variables.
 */
    public void __internalRateVarInitFunc_0(double time, double[] x)
    {
        rate_ADP_diffusion = IMS*ADP_diffusion_k1_7*(x[4]/IMS) - CYT*ADP_diffusion_k1_7*(x[0]/CYT);
        rate_ATP_diffusion = IMS*ATP_diffusion_k1_9*(x[5]/IMS) - CYT*ATP_diffusion_k1_9*(x[1]/CYT);
        rate_ATPase = CYT*ATPase_v_4*(x[1]/CYT);
        rate_Cr_diffusion = IMS*Cr_diffusion_k1_6*(x[6]/IMS) - CYT*Cr_diffusion_k1_6*(x[8]/CYT);
        rate_MMCK = CYT*((MMCK_Vf_3*(x[1]/CYT)*(x[8]/CYT)/(MMCK_Kia_3*MMCK_Kb_3) - MMCK_Vb_3*(x[0]/CYT)*(x[3]/CYT)/(MMCK_Kic_3*MMCK_Kd_3))/(1 + x[8]/CYT/MMCK_Kib_3 + x[3]/CYT/MMCK_Kid_3 + x[1]/CYT*(1.0/MMCK_Kia_3 + x[8]/CYT/(MMCK_Kia_3*MMCK_Kb_3)) + x[0]/CYT*(1.0/MMCK_Kic_3 + x[8]/CYT/(MMCK_Kic_3*MMCK_Kib_3) + x[3]/CYT/(MMCK_Kid_3*(MMCK_Kic_3*MMCK_Kd_3/MMCK_Kid_3)))));
        rate_MiCK = IMS*((MiCK_Vf_2*(x[5]/IMS)*(x[6]/IMS)/(MiCK_Kia_2*MiCK_Kb_2) - MiCK_Vb_2*(x[4]/IMS)*(x[7]/IMS)/(MiCK_Kic_2*MiCK_Kd_2))/(1 + x[6]/IMS/MiCK_Kib_2 + x[7]/IMS/MiCK_Kid_2 + x[5]/IMS*(1.0/MiCK_Kia_2 + x[6]/IMS/(MiCK_Kia_2*MiCK_Kb_2)) + x[4]/IMS*(1.0/MiCK_Kic_2 + x[6]/IMS/(MiCK_Kic_2*MiCK_Kib_2) + x[7]/IMS/(MiCK_Kid_2*(MiCK_Kic_2*MiCK_Kd_2/MiCK_Kid_2)))));
        rate_OxPhos = IMS*(OxPhos_V_1*(x[4]/IMS)*(x[9]/IMS)/(OxPhos_Ka_1*OxPhos_Kb_1*(1 + x[4]/IMS/OxPhos_Ka_1 + x[9]/IMS/OxPhos_Kb_1 + x[4]/IMS*(x[9]/IMS)/(OxPhos_Ka_1*OxPhos_Kb_1))));
        rate_PCr_diffusion = IMS*PCr_diffusion_k1_8*(x[7]/IMS) - CYT*PCr_diffusion_k1_8*(x[3]/CYT);
        rate_Pi_diffusion = IMS*Pi_diffusion_k2_5*(x[9]/IMS) - CYT*Pi_diffusion_k2_5*(x[2]/CYT);
    }

    public void Init()
    {
        initialValues = getInitialValues();
/*
 * Initialize variables
 */
        CYT = 0.75; // initial value of $CYT
        IMS = 0.0625; // initial value of $IMS
        ADP_diffusion_k1_7 = 8.16; // initial value of ADP_diffusion_k1_7
        ATP_diffusion_k1_9 = 8.16; // initial value of ATP_diffusion_k1_9
        ATPase_v_4 = 4600.0; // initial value of ATPase_v_4
        Cr_diffusion_k1_6 = 14.6; // initial value of Cr_diffusion_k1_6
        MMCK_Kb_3 = 15500.0; // initial value of MMCK_Kb_3
        MMCK_Kd_3 = 1670.0; // initial value of MMCK_Kd_3
        MMCK_Kia_3 = 900.0; // initial value of MMCK_Kia_3
        MMCK_Kib_3 = 34900.0; // initial value of MMCK_Kib_3
        MMCK_Kic_3 = 222.4; // initial value of MMCK_Kic_3
        MMCK_Kid_3 = 4730.0; // initial value of MMCK_Kid_3
        MMCK_Vb_3 = 29250.0; // initial value of MMCK_Vb_3
        MMCK_Vf_3 = 6966.0; // initial value of MMCK_Vf_3
        MiCK_Kb_2 = 5200.0; // initial value of MiCK_Kb_2
        MiCK_Kd_2 = 500.0; // initial value of MiCK_Kd_2
        MiCK_Kia_2 = 750.0; // initial value of MiCK_Kia_2
        MiCK_Kib_2 = 28800.0; // initial value of MiCK_Kib_2
        MiCK_Kic_2 = 204.8; // initial value of MiCK_Kic_2
        MiCK_Kid_2 = 1600.0; // initial value of MiCK_Kid_2
        MiCK_Vb_2 = 11160.0; // initial value of MiCK_Vb_2
        MiCK_Vf_2 = 2658.0; // initial value of MiCK_Vf_2
        OxPhos_Ka_1 = 800.0; // initial value of OxPhos_Ka_1
        OxPhos_Kb_1 = 20.0; // initial value of OxPhos_Kb_1
        OxPhos_V_1 = 4600.0; // initial value of OxPhos_V_1
        PCr_diffusion_k1_8 = 14.6; // initial value of PCr_diffusion_k1_8
        Pi_diffusion_k2_5 = 18.4; // initial value of Pi_diffusion_k2_5
    }

    /*
     * Model variables initial values
     */
    protected double rate_ADP_diffusion;
    protected double rate_ATP_diffusion;
    protected double rate_ATPase;
    protected double rate_Cr_diffusion;
    protected double rate_MMCK;
    protected double rate_MiCK;
    protected double rate_OxPhos;
    protected double rate_PCr_diffusion;
    protected double rate_Pi_diffusion;
    protected double CYT;
    protected double IMS;
    protected double ADP_diffusion_k1_7;
    protected double ATP_diffusion_k1_9;
    protected double ATPase_v_4;
    protected double Cr_diffusion_k1_6;
    protected double MMCK_Kb_3;
    protected double MMCK_Kd_3;
    protected double MMCK_Kia_3;
    protected double MMCK_Kib_3;
    protected double MMCK_Kic_3;
    protected double MMCK_Kid_3;
    protected double MMCK_Vb_3;
    protected double MMCK_Vf_3;
    protected double MiCK_Kb_2;
    protected double MiCK_Kd_2;
    protected double MiCK_Kia_2;
    protected double MiCK_Kib_2;
    protected double MiCK_Kic_2;
    protected double MiCK_Kid_2;
    protected double MiCK_Vb_2;
    protected double MiCK_Vf_2;
    protected double OxPhos_Ka_1;
    protected double OxPhos_Kb_1;
    protected double OxPhos_V_1;
    protected double PCr_diffusion_k1_8;
    protected double Pi_diffusion_k2_5;

    public double[] extendResult(double time,double [] x)
    {
        this.time = time;


        double[] y = new double[10];
        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] = x[6];
        y[7] = x[7];
        y[8] = x[8];
        y[9] = x[9];
        return y;
    }
    public double[] getInitialValues()
    {
        double [] x = new double[10];
        this.time = 0.0;
        x[0] = 0.0; // - $"CYT.ADP"
        x[1] = 7275.0; // - $"CYT.ATP"
        x[2] = 0.0; // - $"CYT.P"
        x[3] = 0.0; // - $"CYT.PCr"
        x[4] = 0.0; // - $"IMS.ADPi"
        x[5] = 0.0; // - $"IMS.ATPi"
        x[6] = 0.0; // - $"IMS.Cri"
        x[7] = 0.0; // - $"IMS.PCri"
        x[8] = 19500.0; // - $CYT.Cr
        x[9] = 2000.0; // - $IMS.Pi

        __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)
    {

        __internalRateVarInitFunc_0(time, x);

    }

        /*
         * calculate dy/dt for 'BIOMD0000000041.xml' model
         */
    public void __internalDyDt_0(double time, double [] x, double[] result)
    {
        result[0] = +rate_ADP_diffusion+rate_ATPase+rate_MMCK;
        result[1] = +rate_ATP_diffusion-rate_ATPase-rate_MMCK;
        result[2] = +rate_ATPase+rate_Pi_diffusion;
        result[3] = +rate_MMCK+rate_PCr_diffusion;
        result[4] = -rate_ADP_diffusion+rate_MiCK-rate_OxPhos;
        result[5] = -rate_ATP_diffusion-rate_MiCK+rate_OxPhos;
        result[6] = -rate_Cr_diffusion-rate_MiCK;
        result[7] = +rate_MiCK-rate_PCr_diffusion;
        result[8] = +rate_Cr_diffusion-rate_MMCK;
        result[9] = -rate_OxPhos-rate_Pi_diffusion;
    }
    protected double [] calculateResult(double time, double[] x)
    {
        double[] result = new double[10];
        __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 ...