// ------------------------------------------------------------------------------------- // !!! PRIVATE METHODS !!! // ------------------------------------------------------------------------------------- /// <summary> /// Calculates the volumeflow of each substrate going into the given digester digester_id. /// The substrate flows are returned as a vector. /// /// TODO: ist nicht mehr private /// </summary> /// <param name="t">current simulation time</param> /// <param name="mySubstrates"></param> /// <param name="myPlant"></param> /// <param name="mySensors"></param> /// <param name="substrate_network"></param> /// <param name="digester_id">id of the digester which is fed</param> /// <returns> /// always a vector with as many elements as there are substrates on the plant /// </returns> public static physValue[] getSubstrateMixFlowForFermenter(double t, biogas.substrates mySubstrates, biogas.plant myPlant, sensors mySensors, double[,] substrate_network, string digester_id) { int digester_index = myPlant.getDigesterIndex(digester_id) - 1; // get recorded substrate feeds in m³/d physValue[] Q = mySensors.getMeasurementsAt("Q", "Q", t, mySubstrates); // make the sum over the 2nd dimension, the digesters double[] norm_vec = math.sum(substrate_network, 1); double[] substrate_digester = new double[substrate_network.GetLength(0)]; for (int isubstrate = 0; isubstrate < substrate_network.GetLength(0); isubstrate++) { // what is if norm_vec is 0 for an element // then we have 0/0. if (norm_vec[isubstrate] != 0) { substrate_digester[isubstrate] = substrate_network[isubstrate, digester_index] / norm_vec[isubstrate]; } else { substrate_digester[isubstrate] = 0; } } // this is the amount of each substrate going into the given digester Q = physValue.times(Q, substrate_digester); return(Q); }
/// <summary> /// Calculates the slduge input of the given digester. It checks for each digester /// whether it is connected to the input of the given digester. If so the flow /// coming from the digester is returned in the vector at the corresponding position. /// </summary> /// <param name="t">some simulation time in days</param> /// <param name="mySubstrates"></param> /// <param name="myPlant"></param> /// <param name="mySensors"></param> /// <param name="substrate_network"></param> /// <param name="plant_network"></param> /// <param name="digester_id"> /// digester for which the sludge input is calculated /// </param> /// <returns>dimension: number of digesters</returns> private physValue[] getPumpedInputFlowForFermenter(double t, biogas.substrates mySubstrates, biogas.plant myPlant, sensors mySensors, double[,] substrate_network, double[,] plant_network, string digester_id) { int digester_index = myPlant.getDigesterIndex(digester_id) - 1; // vector tells us what input connections the given fermenter has double[] digester_network = new double[myPlant.getNumDigesters()]; for (int idigester = 0; idigester < plant_network.GetLength(0); idigester++) { digester_network[idigester] = plant_network[idigester, digester_index]; } string digester_id_in = digester_id;// myPlant.getDigesterID(digester_index + 1); int n_digester = myPlant.getNumDigesters(); physValue[] Q = physValue.zeros(n_digester); // for (int idigester = 0; idigester < n_digester; idigester++) { if ((digester_network[idigester] > 0) && (digester_index != idigester)) { string digester_id_out = myPlant.getDigesterID(idigester + 1); string digester_conn = digester_id_out + "_" + digester_id_in; try { // wenn wir eine pumpverbindung mit einem split haben, dann gibt es diese // messung, weil diese aus datei geholt wird: volumeflow_...mat Q[idigester] = mySensors.getMeasurementAt("Q", "Q_" + digester_conn, t); } catch { // macht hier die Annahme, dass das was in fermenter_id_out rein geht // auch mengenmaäßig raus geht und dann in fermenter_id_in rein geht. // diee annahme geht nur, wenn volumen constant ist. // TODO: und biogasstrom vernachlässigt wird //Q[idigester]= //physValue.sum(getInputVolumeflowForFermenter( // t, mySubstrates, myPlant, mySensors, // substrate_network, plant_network, digester_id_out)); // das sollte so viel einfacher möglich sein, und vor allem auch korrekt Q[idigester] = mySensors.getMeasurementAt("Q_" + digester_id_out + "_3", "", t); } } else { Q[idigester] = new physValue(0, "m^3/d"); } } // return(Q); }