public List <string> measurement_inlet_set_order = new List <string>(); ///Each item is inlet set id; order of items in this list determines which measurement number (i.e. which element of measured_flow in FlowMeter and which element of measured_pressure in Logger) correspond to which inlet set //list_of_throttled_inlets field is not needed if one EFavorTest allows throttling of inlets one-by-one //public List<FlowMeter> list_of_throttled_inlets = new List<FlowMeter>(); ///list of inlet flowmeters (and hence valves) that are throttled at the same time in this experiment //prv_settings will be a property of each Flowmeter object //public List<double[]> prv_settings = new List<double[]>(); ///no of elements in list = no_of_inlets, length of each list element (array) = no_of_pressure_steps; with field like this we have flexibility in how prvs are manipulated for multi-inlet DMA (one-by-one, all-at-once, etc.); we can still use this field, even if we assume that in each EFavorTest object only 1 prv is throttled /// <summary>load experiment data from Excel file /// </summary> /// <param name="file_name">xls file to be loaded</param> /// <param name="water_network">water_network object to use for allocating loggers to nodes and flowmeters to valves</param> /// <returns>0 if successful</returns> /// <returns>-1 if wrong logger node name</returns> /// <returns>-2 if wrong flowmeter valve name</returns> /// <returns>-3 if error in PRV setpoints</returns> /// <returns>-4 if unknown logger ID used in pressure_measurements sheet</returns> /// <returns>-5 if unknown inlet set in pressure_measurements sheet</returns> /// <returns>-6 if error while reading pressure in pressure_measurements sheet</returns> /// <returns>-7 if unknown flowmeter ID used in flow_measurements sheet</returns> /// <returns>-8 if unknown inlet set in flow_measurements sheet</returns> /// <returns>-9 if order on inlet sets different in flow measurement sheet and pressure measurement sheet</returns> /// <returns>-10 if error while reading flow in flow_measurements sheet</returns> /// <returns>-11 if VerifyEFavorSetup() returned error in data</returns> /// <returns>-12 if error in parsing loggers sheet</returns> /// <returns>-13 if error in reading times sheet</returns> /// <returns>-20 if other exception thrown</returns> public int LoadEFavorData(string file_name, WaterNetwork water_network) { //!!!TODO: test for multi-inlet DMA bool parse_ok; try { ExcelFile efavor_data = new ExcelFile(); efavor_data.LoadXls(file_name); ExcelWorksheet efavor_loggers_sheet = efavor_data.Worksheets["loggers"]; foreach (ExcelRow logger_row in efavor_loggers_sheet.Rows) { string logger_id = logger_row.Cells[0].Value.ToString(); string node_id = logger_row.Cells[1].Value.ToString(); if (logger_id.StartsWith("Logger ID")) //header row { continue; } double logger_elevation; parse_ok = double.TryParse(logger_row.Cells[2].Value.ToString(), out logger_elevation); if (!parse_ok) { MessageBox.Show("Unexpected string: " + logger_row.Cells[2].Value.ToString() + ", when parsing logger elevation data, expected number"); return(-12); } bool is_inlet; parse_ok = bool.TryParse(logger_row.Cells[3].Value.ToString(), out is_inlet); if (!parse_ok) { MessageBox.Show("Unexpected string: " + logger_row.Cells[3].Value.ToString() + ", when parsing logger data, expected true/false"); return(-12); } Node logger_node = water_network.listOfNodes.Find(tmp => tmp.name == node_id); if (logger_node == null) { MessageBox.Show("Can't find node " + node_id + " when processing logger ID " + logger_id); return(-1); } Logger new_logger = new Logger(logger_id, logger_node, is_inlet); if (logger_elevation <= -1000) { new_logger.elevation = logger_node.elevation; } else { new_logger.elevation = logger_elevation; } list_of_loggers.Add(new_logger); if (is_inlet) { list_of_inlet_loggers.Add(new_logger); } } no_of_loggers = list_of_loggers.Count; //MessageBox.Show(efavor_loggers_sheet.Rows.Count.ToString()); //used number of rows ExcelWorksheet efavor_flowmeters_sheet = efavor_data.Worksheets["inlets"]; foreach (ExcelRow flowmeter_row in efavor_flowmeters_sheet.Rows) { string flowmeter_id = flowmeter_row.Cells[0].Value.ToString(); string valve_id = flowmeter_row.Cells[1].Value.ToString(); string set_of_inlets_id = flowmeter_row.Cells[2].Value.ToString(); //Inlets belonging to the same set are throttled at the same time. if (flowmeter_id.StartsWith("Flowmeter ID")) //header row - !!! check if all headings are as expected { continue; } Valve flowmeter_valve = water_network.listOfValves.Find(tmp => tmp.link.name == valve_id); if (flowmeter_valve == null) { MessageBox.Show("Can't find valve " + valve_id + " when processing flowmeter ID " + flowmeter_id); return(-2); } FlowMeter new_flowmeter = new FlowMeter(flowmeter_id, flowmeter_valve, set_of_inlets_id); for (int i = 3; i < flowmeter_row.AllocatedCells.Count; i++) //first 3 columns are flowmeter id, valve id and set { double prv_setting; parse_ok = double.TryParse(flowmeter_row.Cells[i].Value.ToString(), out prv_setting); if (parse_ok) { new_flowmeter.prv_settings.Add(prv_setting); } else { MessageBox.Show("Error while reading PRV setpoints for flowmeter ID " + flowmeter_id); return(-3); //perhaps this could be just ignored instead of return??? } } list_of_inlet_flowmeters.Add(new_flowmeter); bool already_defined = list_of_inlet_set_ids.Exists(tmp => tmp == set_of_inlets_id); //check if this set_of_inlets has already been added to the list of sets if (!already_defined) { list_of_inlet_set_ids.Add(set_of_inlets_id); } } no_of_inlets = list_of_inlet_flowmeters.Count; if (no_of_inlets == 0) { throw new Exception("This experiment data does not seem to have any PRV inlets!"); } ExcelWorksheet efavor_pressure_measure_sheet = efavor_data.Worksheets["pressure_measurements"]; List <int> logger_index_order = new List <int>(); //order of loggers in the pressure_measurements sheet for (int i = 1; i < efavor_pressure_measure_sheet.Rows[0].AllocatedCells.Count; i++) //read header row, get order of loggers; use AllocatedCells.Count instead of no_of_loggers to avoid error in case pressure_measurements sheet did not have enough columns, correctness of all measurement data is checked later on anyway { string logger_id = efavor_pressure_measure_sheet.Cells[0, i].Value.ToString(); int tmp_index = list_of_loggers.FindIndex(tmp => tmp.logger_id == logger_id); if (tmp_index < 0) { MessageBox.Show("Unknown logger ID " + logger_id + " in pressure_measurements sheet"); return(-4); } else { logger_index_order.Add(tmp_index); } } if (logger_index_order.Count != list_of_loggers.Count) { MessageBox.Show("Number of declared loggers does not match number of loggers in sheet \"pressure_measurements\""); return(-6); } for (int i = 1; i < efavor_pressure_measure_sheet.Rows.Count; i++) { ExcelRow current_row = efavor_pressure_measure_sheet.Rows[i]; string inlet_set = current_row.Cells[0].Value.ToString(); if (!list_of_inlet_set_ids.Exists(tmp => tmp == inlet_set)) { MessageBox.Show("Unknown inlet set " + inlet_set + " when processing pressure_measurements sheet"); return(-5); } measurement_inlet_set_order.Add(inlet_set); for (int j = 1; j < no_of_loggers + 1; j++) { double pressure; parse_ok = double.TryParse(current_row.Cells[j].Value.ToString(), out pressure); if (parse_ok) { list_of_loggers[logger_index_order[j - 1]].measured_pressure.Add(pressure); } else { MessageBox.Show("Error while reading pressure measurement for logger ID " + list_of_loggers[logger_index_order[j - 1]].logger_id); return(-6); } } } ExcelWorksheet efavor_flow_measure_sheet = efavor_data.Worksheets["flow_measurements"]; List <int> flowmeter_index_order = new List <int>(); //order of flowmeters in the flow_measurements sheet if (efavor_flow_measure_sheet.Rows[0].AllocatedCells.Count - 1 != no_of_inlets) { MessageBox.Show("Missing data in flow measurement sheet. Declared flowmeters: " + no_of_inlets.ToString() + ". Flow measurement datasets: " + (efavor_flow_measure_sheet.Rows[0].AllocatedCells.Count - 1).ToString()); return(-10); } for (int i = 1; i < efavor_flow_measure_sheet.Rows[0].AllocatedCells.Count; i++) //read header row, get order of flowmeters; use AllocatedCells.Count instead of no_of_inlets to avoid error in case flow_measurements sheet did not have enough columns, correctness of all measurement data is checked later on anyway { string flowmeter_id = efavor_flow_measure_sheet.Cells[0, i].Value.ToString(); int tmp_index = list_of_inlet_flowmeters.FindIndex(tmp => tmp.flowmeter_id == flowmeter_id); if (tmp_index < 0) { MessageBox.Show("Unknown flowmeter ID " + flowmeter_id + " in flow_measurements sheet"); return(-7); } else { flowmeter_index_order.Add(tmp_index); } } total_no_of_pressure_steps = 0; for (int i = 1; i < efavor_flow_measure_sheet.Rows.Count; i++) { total_no_of_pressure_steps++; ExcelRow current_row = efavor_flow_measure_sheet.Rows[i]; string inlet_set = current_row.Cells[0].Value.ToString(); if (!list_of_inlet_set_ids.Exists(tmp => tmp == inlet_set)) { MessageBox.Show("Unknown inlet set " + inlet_set + " when processing flow_measurements sheet"); return(-8); } if (measurement_inlet_set_order[i - 1] != inlet_set) { MessageBox.Show("Order on inlet sets different in flow measurement sheet and pressure measurement sheet"); return(-9); } for (int j = 1; j < no_of_inlets + 1; j++) { double flow; parse_ok = double.TryParse(current_row.Cells[j].Value.ToString(), out flow); if (parse_ok) { list_of_inlet_flowmeters[flowmeter_index_order[j - 1]].measured_flow.Add(flow); } else { MessageBox.Show("Error while reading flow measurement for flowmeter ID " + list_of_inlet_flowmeters[flowmeter_index_order[j - 1]].flowmeter_id); return(-10); } } } //load experiment time variables ExcelWorksheet efavor_times_sheet = efavor_data.Worksheets["times"]; int tmp_time; parse_ok = int.TryParse(efavor_times_sheet.Rows[0].Cells[1].Value.ToString(), out tmp_time); if (parse_ok) { first_measure_time = tmp_time; } else { MessageBox.Show("Error while reading start time. Value read: " + efavor_times_sheet.Rows[0].Cells[1].Value.ToString()); return(-13); } parse_ok = int.TryParse(efavor_times_sheet.Rows[1].Cells[1].Value.ToString(), out tmp_time); if (parse_ok) { time_step_pressure_stepping = tmp_time; } else { MessageBox.Show("Error while reading measurement time step. Value read: " + efavor_times_sheet.Rows[1].Cells[1].Value.ToString()); return(-13); } if ((first_measure_time <= 0) || (time_step_pressure_stepping <= 0)) { MessageBox.Show("Times cannot be negative!"); return(-13); } }//try catch (Exception ex) { MessageBox.Show(ex.Message); return(-20); } //Verify that the experiment data makes sense if (VerifyEFavorSetup() < 0) { return(-11); } return(0); }
/// <summary>Retrieve valve associated with a flowmeter; used for converter of ConvertAll /// </summary> /// <param name="flowmeter"></param> /// <returns></returns> public static Valve GetValve(FlowMeter flowmeter) { return(flowmeter.valve); }