Пример #1
0
        /// <summary>
        /// measures mean value of given parameter in mySubstrates depending on Q
        ///
        /// type 3
        /// </summary>
        /// <param name="x">not used</param>
        /// <param name="mySubstrates"></param>
        /// <param name="Q">
        /// substrate feed in m^3/d
        /// doesn't matter if this is substrate mix for plant or
        /// substrate mix to digester, depends on what we want to have</param>
        /// <param name="par">not used</param>
        /// <returns>mean value of given parameter</returns>
        override protected physValue[] doMeasurement(double[] x, biogas.substrates mySubstrates,
                                                     double[] Q, params double[] par)
        {
            physValue[] values = new physValue[1];

            // id_suffix is here the parameter to be measured, see above
            mySubstrates.get_weighted_sum_of(Q, id_suffix, out values[0]);

            values[0].Symbol = id_suffix;

            return(values);
        }
Пример #2
0
        /// <summary>
        /// measures the density of the substrate feed of a given digester
        ///
        /// type 7
        ///
        /// TODO: mySensors wird hier eigentlich nicht benötigt
        /// wenn mySensors gelöscht wird, dann ist das keine type 7 funktion mehr, OK
        ///
        /// </summary>
        /// <param name="x">ADM state vector</param>
        /// <param name="myPlant"></param>
        /// <param name="mySubstrates"></param>
        /// <param name="mySensors"></param>
        /// <param name="Q">
        /// substrate feed and recirculation sludge going into the digester
        /// first values are Q for substrates, then pumped sludge going into digester
        /// dimension: always number of substrates + number of digesters
        /// </param>
        /// <param name="par">not used</param>
        /// <returns></returns>
        override protected physValue[] doMeasurement(double[] x, biogas.plant myPlant,
                                                     biogas.substrates mySubstrates, biogas.sensors mySensors,
                                                     double[] Q, params double[] par)
        {
            physValue[] values = new physValue[1];

            // number of substrates
            int n_substrate = mySubstrates.getNumSubstrates();

            double Qsum = math.sum(Q);

            // das ist feed in fermenter
            if (Q.Length < n_substrate)
            {
                throw new exception(String.Format(
                                        "Q.Length < n_substrate: {0} < {1}!", Q.Length, n_substrate));
            }

            double[] Qsubstrates = new double[n_substrate];

            // volumeflow for substrates
            for (int isubstrate = 0; isubstrate < n_substrate; isubstrate++)
            {
                Qsubstrates[isubstrate] = Q[isubstrate];
            }

            //

            physValue rhoSubstrate;

            // wenn fermenter nicht mit substraten gefüttert wird
            if (math.sum(Qsubstrates) == 0)
            {
                rhoSubstrate = new physValue(0, "kg/d");
            }
            else
            {
                mySubstrates.get_weighted_sum_of(Qsubstrates, "rho", out rhoSubstrate);
                rhoSubstrate = rhoSubstrate.convertUnit("kg/d");
            }

            //

            physValue rhoSludge = new physValue("rho", 1000, "kg/m^3");

            for (int isubstrate = n_substrate; isubstrate < Q.Length; isubstrate++)
            {
                rhoSubstrate += rhoSludge * new physValue(Q[isubstrate], "m^3/d");
            }

            //

            if (Qsum != 0)
            {
                values[0] = rhoSubstrate / new physValue(Qsum, "m^3/d");
            }
            else
            {
                values[0] = new physValue(0, "kg/m^3");
            }

            //

            values[0].Symbol = "rho";

            //

            return(values);
        }