def spawn(self, dna): x, y = dna['x'], dna['y'] obj = Turbine(x, y) if indivCheckConstraints(obj, self.coords, self.config['dia']): return obj else: del obj return 0
def __init__(self): self.config = config() self.idx = 0 self.coords = [] self.pop = [] self.losses = [] self.pool = [] self.thresh = 0.3 corners = [[clearance, clearance], [limit - clearance, clearance], [clearance, limit - clearance], [limit - clearance, limit - clearance]] for i, coord in enumerate(corners): obj = Turbine() for j in range(0, life): obj.dna[j] = coord self.pop.append(obj) for i in range(0, num - 4): obj = Turbine() self.pop.append(obj)
def __init__(self): self.compressor = Compressor() self.turbine = Turbine() self.initial_guess = self.__class__.DEFAULT_PARAMS.copy() self.cpc = 1004 # J/(kg K) self.cpt = 1225 # J/(kg K) self.T01 = 273.15 # K self.P01 = 101e3 # Pa self.R_c = (1 - 1 / self.compressor.gam) * self.cpc # from gam and cp self.R_t = (1 - 1 / self.turbine.gam) * self.cpt self.A8 = pi / 4 * 35e-3**2 # Measured: D8 = 45mm self.FHV = 43e6 #J/kg Fuel lower calorific value self.eta_combustion = 0.5
def __init__(self,V=1000.,cmp_eff=80.,trb_eff=90.,p=200000): # Air Side self.amb = Ambient() self.cmp = Compressor(eff=cmp_eff) self.tank = Tank(V=V,p=p) self.trb = Turbine(eff=trb_eff) self.m_dot_i = 0.0 self.m_dot_o = 0.0 # Heat Side # Create pandas DataFrame to store results self.df = pd.DataFrame(columns=variables)
def validate(args): config = TurbineConfig.load(args.Config_file) config.environment.load = args.Environment_file # Set given path as environment.xml path env_file = ET.parse(config.environment.load) robot_xml = env_file.find('Robot') robot_xml.attrib['file'] = args.Robot_file env_file.write(config.environment.load) # Set given path as robot.xml path turbine = Turbine(config) DB = db.DB(join(environ['PYTHON_DATABASE'], area_db[args.Area]), turbine) success = blade_coverage.base_grid_validation_parser( turbine, DB, args.Grid, args.Trajectory_file) if not success: print "could not find the required coating trajectory" sys.exit(1)
from turbine_config import TurbineConfig, ConfigFileError from visualizer import Visualizer from os.path import join, realpath from os import makedirs, environ from openravepy import matrixFromAxisAngle, Sensor from math import pi import time from copy import copy from numpy import array if __name__ == "__main__": dir_test = join(realpath('.'), 'test') environ['OPENRAVE_DATA'] = str(dir_test) cfg = TurbineConfig.load('turbine_unittest.cfg', 'test') turb = Turbine(cfg) turb.env.Remove(turb.primary) turb.env.Remove(turb.secondary) turb.env.Remove(turb.iris) turb.env.Remove(turb.rotor) turb.env.Remove(turb.runner_area) turb.env.Remove(turb.blades[1]) turb.env.Remove(turb.blades[2]) turb.env.Remove(turb.blades[3]) # Visualizer vis = Visualizer(turb.env) # Move Robot T = array([[-1, 0, 0, 2.21], [0, 0, 1, -3.42], [0, 1, 0, 0.69],
def topology(): return Turbine(debug=True)
def saveClicked(self): for i in range(len(self.field)): try: if not self.edit[i].isEnabled(): continue except: continue self.edit[i].setFocus() if isinstance(self.edit[i], QtWidgets.QLineEdit): if self.field[i] == 'direction' and 'PV' in self.technology: try: setattr(self, self.field[i], int(self.edit[i].text())) if self.direction < 0: self.direction = 360 + self.direction if self.direction > 360: self.message.setText('Error with ' + self.field[i].title() + ' field') return except: setattr(self, self.field[i], self.edit[i].text()) if self.direction.upper() in ['', 'N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']: self.direction = self.direction.upper() else: self.message.setText('Error with ' + self.field[i].title() + ' field') return if self.field[i] == 'tilt' and 'PV' in self.technology: try: setattr(self, self.field[i], float(self.edit[i].text())) if self.tilt < -180. or self.tilt > 180.: self.message.setText('Error with ' + self.field[i].title() + ' field') return except: pass elif self.field_type[i] == 'int': try: setattr(self, self.field[i], int(self.edit[i].text())) except: self.message.setText('Error with ' + self.field[i].title() + ' field') return elif self.field_type[i] == 'float': try: setattr(self, self.field[i], float(self.edit[i].text())) if self.field[i] == 'lon': if self.lon < self.upper_left[1]: self.message.setText('Error with ' + self.field[i].title() + ' field. Too far west') return elif self.lon > self.lower_right[1]: self.message.setText('Error with ' + self.field[i].title() + ' field. Too far east') return elif self.field[i] == 'lat': if self.lat > self.upper_left[0]: self.message.setText('Error with ' + self.field[i].title() + ' field. Too far north') return elif self.lat < self.lower_right[0]: self.message.setText('Error with ' + self.field[i].title() + ' field. Too far south') return except: self.message.setText('Error with ' + self.field[i].title() + ' field') return elif self.field[i] == 'grid_line': if self.edit[i].text() == '': setattr(self, self.field[i], None) else: setattr(self, self.field[i], self.edit[i].text()) else: setattr(self, self.field[i], self.edit[i].text()) elif isinstance(self.edit[i], QtWidgets.QComboBox): setattr(self, self.field[i], self.edit[i].currentText()) if self.field[i] == 'technology' and self.edit[i].currentText() == '': self.message.setText('Error with ' + self.field[i].title() + '. Choose technology') return elif isinstance(self.edit[i], QtWidgets.QDoubleSpinBox): setattr(self, self.field[i], self.edit[i].value()) elif isinstance(self.edit[i], QtWidgets.QSpinBox): setattr(self, self.field[i], self.edit[i].value()) if self.technology.find('Wind') < 0 and self.technology.find('Offshore') < 0: self.rotor = 0.0 self.turbine == '' if self.technology == 'Biomass': self.area = self.areas[self.technology] * float(self.capacity) elif 'PV' in self.technology: self.area = self.areas[self.technology] * float(self.capacity) elif self.technology.find('Wind') >= 0 or self.technology.find('Offshore') >= 0: if self.turbine == '': self.edit[5].setFocus() self.message.setText('Error with ' + self.field[5].title() + '. Choose turbine') return turbine = Turbine(self.turbine) if self.capacity != self.capacity_was or \ (self.turbine != self.turbine_was and self.no_turbines == self.no_turbines_was): self.no_turbines = int(round((self.capacity * 1000.) / turbine.capacity)) self.capacity = self.no_turbines * turbine.capacity / 1000. # reduce from kW to MW self.rotor = turbine.rotor self.area = self.areas[self.technology] * float(self.no_turbines) * pow((self.rotor * .001), 2) elif self.technology in ['CST', 'Solar Thermal']: self.area = self.areas[self.technology] * float(self.capacity) # temp calc. Should be 3.83 x collector area elif self.technology == 'Geothermal': self.area = self.areas[self.technology] * float(self.capacity) elif self.technology == 'Wave': self.area = self.areas[self.technology] * float(self.capacity) elif self.technology == 'Hydro': self.area = self.areas[self.technology] * float(self.capacity) elif self.technology[:5] == 'Other': self.area = self.areas[self.technology] * float(self.capacity) else: self.message.setText('This technology not yet implemented. Choose another.') self.edit[1].setFocus() return self.save = True self.close()
def curveClicked(self): if self.turbine.currentText() != '': Turbine(self.turbine.currentText()).PowerCurve() return
def __init__(self, dialog, anobject, scenarios=None): super(AnObject, self).__init__() self.get_config() self.anobject = anobject if scenarios is not None: self.scenarios = [] for i in range(len(scenarios)): if scenarios[i][0] != 'Existing': self.scenarios.append(scenarios[i][0]) if len(self.scenarios) < 2: self.scenarios = None else: self.scenarios = None dialog.setObjectName('Dialog') self.save = False self.field = ['name', 'technology', 'lat', 'lon', 'capacity', 'turbine', 'rotor', 'no_turbines', 'area', 'scenario', 'power_file', 'grid_line', 'storage_hours', 'direction', 'tilt', 'zone'] self.label = [] self.edit = [] self.field_type = [] metrics = [] widths = [0, 0] heights = 0 self.turbines = [['', '', 0., 0.]] # name, class, rotor, size # self.turbine_class = [''] grid = QtWidgets.QGridLayout() turbcombo = QtWidgets.QComboBox(self) if os.path.exists(self.sam_file): sam = open(self.sam_file) sam_turbines = csv.DictReader(sam) for turb in sam_turbines: if turb['Name'] == 'Units' or turb['Name'] == '[0]': pass else: self.turbines.append([turb['Name'].strip(), '', turb['Rotor Diameter'], float(turb['KW Rating'])]) if turb['IEC Wind Speed Class'] in ['', ' ', '0', 'Unknown', 'unknown', 'not listed']: pass else: cls = turb['IEC Wind Speed Class'].replace('|', ', ') cls.replace('Class ', '') self.turbines[-1][1] = 'Class: ' + cls sam.close() if os.path.exists(self.pow_dir): pow_files = os.listdir(self.pow_dir) for name in pow_files: if name[-4:] == '.pow': turb = Turbine(name[:-4]) if name == 'Enercon E40.pow': size = 600. else: size = 0. bits = name.lower().split('kw') if len(bits) > 1: bit = bits[0].strip() for i in range(len(bit) -1, -1, -1): if not bit[i].isdigit() and not bit[i] == '.': break size = float(bit[i + 1:]) else: bits = name.lower().split('mw') if len(bits) > 1: bit = bits[0].strip() for i in range(len(bit) -1, -1, -1): if not bit[i].isdigit() and not bit[i] == '.': break size = float(bit[i + 1:]) * 1000 else: for i in range(len(name) -4, -1, -1): if not name[i].isdigit() and not name[i] == '.': break try: size = float(name[i + 1: -4]) except: pass self.turbines.append([name[:-4], '', str(turb.rotor), size]) self.turbines.sort() self.turbines_sorted = True got_turbine = False j = 0 # in case no Vestas V90-2.0 for i in range(len(self.turbines)): if self.turbines[i][0] == 'Vestas V90-2.0': j = i turbcombo.addItem(self.turbines[i][0]) if self.turbines[i][0] == self.anobject.turbine: turbcombo.setCurrentIndex(i) if self.turbines[i][0] != '': got_turbine = True if not got_turbine: turbcombo.setCurrentIndex(j) techcombo = QtWidgets.QComboBox(self) for i in range(len(self.technologies)): techcombo.addItem(self.technologies[i]) if self.technologies[i] == self.anobject.technology: techcombo.setCurrentIndex(i) if self.scenarios is not None: scencombo = QtWidgets.QComboBox(self) for i in range(len(self.scenarios)): scencombo.addItem(self.scenarios[i]) if self.scenarios[i] == self.anobject.scenario: scencombo.setCurrentIndex(i) for i in range(len(self.field)): if self.field[i] == 'turbine': self.label.append(ClickableQLabel(self.field[i].title() + ': (Name order)')) self.label[-1].setStyleSheet("background-color: white; border: 1px inset grey; min-height: 22px; border-radius: 4px;") self.label[-1].clicked.connect(self.turbineSort) else: self.label.append(QtWidgets.QLabel(self.field[i].title() + ':')) if i == 0: metrics.append(self.label[-1].fontMetrics()) if metrics[0].boundingRect(self.label[-1].text()).width() > widths[0]: widths[0] = metrics[0].boundingRect(self.label[-1].text()).width() grid.addWidget(self.label[-1], i + 1, 0) self.capacity_was = 0.0 self.no_turbines_was = 0 self.turbine_was = '' self.turbine_classd = QtWidgets.QLabel('') self.show_hide = {} units = {'area': 'sq. Km', 'capacity': 'MW'} for i in range(len(self.field)): try: attr = getattr(self.anobject, self.field[i]) except: attr = '' if isinstance(attr, int): self.field_type.append('int') elif isinstance(attr, float): self.field_type.append('float') else: self.field_type.append('str') if self.field[i] == 'name': self.name = attr self.edit.append(QtWidgets.QLineEdit(self.name)) metrics.append(self.label[-1].fontMetrics()) elif self.field[i] == 'technology': self.techcomb = techcombo self.edit.append(self.techcomb) self.techcomb.currentIndexChanged.connect(self.technologyChanged) elif self.field[i] == 'lat': self.lat = attr self.edit.append(QtWidgets.QLineEdit(str(self.lat))) elif self.field[i] == 'lon': self.lon = attr self.edit.append(QtWidgets.QLineEdit(str(self.lon))) elif self.field[i] == 'capacity': self.capacity = attr self.capacity_was = attr self.edit.append(QtWidgets.QDoubleSpinBox()) # QtWidgets.QLineEdit(str(self.capacity))) self.edit[-1].setRange(0, 10000) self.edit[-1].setValue(self.capacity) self.edit[-1].setDecimals(3) elif self.field[i] == 'turbine': if self.techcomb.currentText().find('Wind') < 0 \ and self.techcomb.currentText().find('Offshore') < 0 \ and self.techcomb.currentText() != '': turbcombo.setCurrentIndex(0) self.turbine = turbcombo self.turbines_was = turbcombo self.show_hide['turbine'] = len(self.edit) self.edit.append(self.turbine) self.turbine_classd.setText(self.turbines[turbcombo.currentIndex()][1]) self.turbine.currentIndexChanged.connect(self.turbineChanged) grid.addWidget(self.turbine_classd, i + 1, 2) elif self.field[i] == 'rotor': self.rotor = attr self.show_hide['rotor'] = len(self.edit) self.edit.append(QtWidgets.QLineEdit(str(self.rotor))) self.edit[-1].setEnabled(False) self.curve = QtWidgets.QPushButton('Show Power Curve', self) grid.addWidget(self.curve, i + 1, 2) self.curve.clicked.connect(self.curveClicked) elif self.field[i] == 'no_turbines': self.no_turbines = attr self.no_turbines_was = attr self.show_hide['no_turbines'] = len(self.edit) self.edit.append(QtWidgets.QSpinBox()) # QtWidgets.QLineEdit(str(self.no_turbines))) self.edit[-1].setRange(0, 299) if self.no_turbines == '': self.edit[-1].setValue(0) else: self.edit[-1].setValue(int(self.no_turbines)) elif self.field[i] == 'area': self.area = attr self.edit.append(QtWidgets.QLineEdit(str(self.area))) self.edit[-1].setEnabled(False) elif self.field[i] == 'scenario': self.scenario = attr if self.scenarios is None: self.edit.append(QtWidgets.QLineEdit(self.scenario)) self.edit[-1].setEnabled(False) else: self.scencomb = scencombo self.scencomb.currentIndexChanged.connect(self.scenarioChanged) self.edit.append(self.scencomb) elif self.field[i] == 'power_file': self.power_file = attr self.edit.append(QtWidgets.QLineEdit(self.power_file)) elif self.field[i] == 'grid_line': self.grid_line = attr if attr is not None: self.edit.append(QtWidgets.QLineEdit(self.grid_line)) else: self.edit.append(QtWidgets.QLineEdit('')) elif self.field[i] == 'storage_hours': self.storage_hours = attr self.show_hide['storage_hours'] = len(self.edit) if attr is not None: self.edit.append(QtWidgets.QLineEdit(str(self.storage_hours))) else: try: if self.techcomb.currentText() == 'CST': self.edit.append(QtWidgets.QLineEdit(str(self.cst_tshours))) else: self.edit.append(QtWidgets.QLineEdit(str(self.st_tshours))) except: pass elif self.field[i] == 'direction': self.direction = attr self.show_hide['direction'] = len(self.edit) if attr is not None: self.edit.append(QtWidgets.QLineEdit(str(self.direction))) else: self.edit.append(QtWidgets.QLineEdit('')) elif self.field[i] == 'tilt': self.tilt = attr self.show_hide['tilt'] = len(self.edit) if attr is not None: self.edit.append(QtWidgets.QLineEdit(str(self.tilt))) else: self.edit.append(QtWidgets.QLineEdit('')) elif self.field[i] == 'zone': self.zone = attr self.show_hide['zone'] = len(self.edit) if attr is not None: self.edit.append(QtWidgets.QLineEdit(str(self.zone))) else: self.edit.append(QtWidgets.QLineEdit('')) self.edit[-1].setEnabled(False) try: if metrics[1].boundingRect(self.edit[-1].text()).width() > widths[1]: widths[1] = metrics[1].boundingRect(self.edit[-1].text()).width() except: pass grid.addWidget(self.edit[-1], i + 1, 1) if self.field[i] in list(units.keys()): grid.addWidget(QtWidgets.QLabel(units[self.field[i]]), i + 1, 2) self.technologyChanged(self.techcomb.currentIndex) grid.setColumnMinimumWidth(0, widths[0] + 10) grid.setColumnMinimumWidth(1, widths[1] + 10) grid.setColumnMinimumWidth(2, 30) i += 1 self.message = QtWidgets.QLabel('') msg_font = self.message.font() msg_font.setBold(True) self.message.setFont(msg_font) msg_palette = QtGui.QPalette() msg_palette.setColor(QtGui.QPalette.Foreground, QtCore.Qt.red) self.message.setPalette(msg_palette) grid.addWidget(self.message, i + 1, 0, 1, 2) i += 1 quit = QtWidgets.QPushButton("Quit", self) grid.addWidget(quit, i + 1, 0) quit.clicked.connect(self.quitClicked) save = QtWidgets.QPushButton("Save && Exit", self) grid.addWidget(save, i + 1, 1) save.clicked.connect(self.saveClicked) self.setLayout(grid) self.resize(widths[0] + widths[1] + 40, heights * i) self.setWindowTitle('SIREN - Edit ' + getattr(self.anobject, '__module__')) QtWidgets.QShortcut(QtGui.QKeySequence("q"), self, self.quitClicked)
def main(): # Debugging make_plots = False make_run = False # Preamble end_time = 75 * unit.minute time_step = 1.5 * unit.second show_time = (True, 5 * unit.minute) plant = Cortix(use_mpi=False, splash=True) # System top level plant_net = plant.network = Network() # Network # Reactor reactor = SMPWR() # Create reactor module reactor.name = "SM-PWR" reactor.shutdown = (True, 60 * unit.minute) plant_net.module(reactor) # Add reactor module to network # Steamer steamer = Steamer() # Create reactor module plant_net.module(steamer) # Add steamer module to network # Turbine turbine = Turbine() # Create reactor module plant_net.module(turbine) # Add steamer module to network '''Condenser''' condenser = Condenser() # Create condenser module plant_net.module(condenser) # Add condenser module to network` '''Feedwater Heating system''' water_heater = WaterHeater() # Create water_heater module water_heater.malfunction = (True, 30 * unit.minute, 45 * unit.minute) plant_net.module(water_heater) # Add water_heater module to network # Balance of Plant Network Connectivity plant_net.connect([reactor, 'coolant-outflow'], [steamer, 'primary-inflow']) plant_net.connect([steamer, 'primary-outflow'], [reactor, 'coolant-inflow']) plant_net.connect([steamer, 'secondary-outflow'], [turbine, 'inflow']) plant_net.connect([turbine, 'outflow'], [condenser, 'inflow']) plant_net.connect([turbine, 'process-heat'], [water_heater, 'external-heat']) plant_net.connect([condenser, 'outflow'], [water_heater, 'inflow']) plant_net.connect([water_heater, 'outflow'], [steamer, 'secondary-inflow']) plant_net.draw(engine='circo', node_shape='folder') # Run if make_run: for module in plant_net.modules: module.time_step = time_step module.end_time = end_time module.show_time = show_time plant.run() # Run network dynamics simulation # Cortix run closure plant.close() # Properly shutdow plant # Plots if make_plots and plant.use_multiprocessing or plant.rank == 0: # Reactor plots reactor = plant_net.modules[0] (quant, time_unit ) = reactor.neutron_phase.get_quantity_history('neutron-dens') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / max(quant.value), x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('reactor-neutron-dens.png', dpi=300) (quant, time_unit ) = reactor.neutron_phase.get_quantity_history('delayed-neutrons-cc') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('reactor-delayed-neutrons-cc.png', dpi=300) (quant, time_unit ) = reactor.coolant_outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('reactor-coolant-outflow-temp.png', dpi=300) (quant, time_unit) = reactor.state_phase.get_quantity_history('core-temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('reactor-core-temp.png', dpi=300) (quant, time_unit) = reactor.state_phase.get_quantity_history('power') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / unit.mega, x_label='Time [m]', y_label=quant.latex_name + ' [M' + quant.unit + ']') plt.grid() plt.savefig('reactor-power.png', dpi=300) (quant, time_unit) = reactor.state_phase.get_quantity_history('reynolds') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / unit.mega, x_label='Time [m]', y_label=quant.latex_name + r' [$\times 10^6$' + quant.unit + ']') plt.grid() plt.savefig('reactor-reynolds.png', dpi=300) (quant, time_unit) = reactor.state_phase.get_quantity_history('prandtl') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + r' [' + quant.unit + ']') plt.grid() plt.savefig('reactor-prandtl.png', dpi=300) (quant, time_unit ) = reactor.coolant_outflow_phase.get_quantity_history('flowrate') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + r' [' + quant.unit + ']') plt.grid() plt.savefig('reactor-flowrate.png', dpi=300) (quant, time_unit) = reactor.state_phase.get_quantity_history('heatflux') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / unit.mega, x_label='Time [m]', y_label=quant.latex_name + ' [M' + quant.unit + ']') plt.grid() plt.savefig('reactor-heatflux.png', dpi=300) (quant, time_unit) = reactor.state_phase.get_quantity_history('inlet-temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('reactor-coolant-inflow-temp.png', dpi=300) (quant, time_unit) = reactor.state_phase.get_quantity_history('nusselt') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('reactor-nusselt.png', dpi=300) (quant, time_unit) = reactor.state_phase.get_quantity_history('tau') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('reactor-coolant-tau.png', dpi=300) (quant, time_unit ) = reactor.coolant_outflow_phase.get_quantity_history('quality') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + r' [' + quant.unit + ']') plt.grid() plt.savefig('reactor-coolant-outflow-quality.png', dpi=300) # Steamer plots steamer = plant_net.modules[1] (quant, time_unit ) = steamer.primary_outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('steamer-primary-outflow-temp.png', dpi=300) (quant, time_unit ) = steamer.secondary_inflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('steamer-secondary-inflow-temp.png', dpi=300) (quant, time_unit ) = steamer.secondary_inflow_phase.get_quantity_history('flowrate') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('steamer-secondary-inflow-flowrate.png', dpi=300) (quant, time_unit ) = steamer.secondary_outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('steamer-secondary-outflow-temp.png', dpi=300) (quant, time_unit ) = steamer.secondary_outflow_phase.get_quantity_history('flowrate') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('steamer-secondary-outflow-flowrate.png', dpi=300) (quant, time_unit) = steamer.state_phase.get_quantity_history('tau_p') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('steamer-primary-tau.png', dpi=300) (quant, time_unit) = steamer.state_phase.get_quantity_history('tau_s') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('steamer-secondary-tau.png', dpi=300) (quant, time_unit ) = steamer.secondary_outflow_phase.get_quantity_history('quality') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('steamer-secondary-quality.png', dpi=300) (quant, time_unit) = steamer.state_phase.get_quantity_history('heatflux') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / unit.kilo, x_label='Time [m]', y_label=quant.latex_name + ' [k' + quant.unit + ']') plt.grid() plt.savefig('steamer-heatflux.png', dpi=300) (quant, time_unit) = steamer.state_phase.get_quantity_history('nusselt_p') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('steamer-nusselt_p.png', dpi=300) (quant, time_unit) = steamer.state_phase.get_quantity_history('nusselt_s') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('steamer-nusselt_s.png', dpi=300) # Turbine plots turbine = plant_net.modules[2] (quant, time_unit) = turbine.state_phase.get_quantity_history('power') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / unit.mega, x_label='Time [m]', y_label=quant.latex_name + ' [M' + quant.unit + ']') plt.grid() plt.savefig('turbine-power.png', dpi=300) (quant, time_unit) = turbine.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('turbine-outflow-temp.png', dpi=300) (quant, time_unit) = turbine.state_phase.get_quantity_history('rejected-heat') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / unit.mega, x_label='Time [m]', y_label=quant.latex_name + ' [M' + quant.unit + ']') plt.grid() plt.savefig('turbine-rejected-heat.png', dpi=300) # Condenser plots condenser = plant_net.modules[3] (quant, time_unit) = condenser.inflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('condenser-inflow-temp.png', dpi=300) (quant, time_unit) = condenser.inflow_phase.get_quantity_history('flowrate') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('condenser-inflow-flowrate.png', dpi=300) (quant, time_unit) = condenser.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('condenser-outflow-temp.png', dpi=300) # Water heater plots water_heater = plant_net.modules[4] (quant, time_unit) = water_heater.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, y_shift=273.15, x_label='Time [m]', y_label=quant.latex_name + ' [C]') plt.grid() plt.savefig('water_heater-outflow-temp.png', dpi=300) (quant, time_unit ) = water_heater.outflow_phase.get_quantity_history('flowrate') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + r' [' + quant.unit + ']') plt.grid() plt.savefig('water_heater-flowrate.png', dpi=300) (quant, time_unit ) = water_heater.inflow_phase.get_quantity_history('external-heat') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / unit.mega, x_label='Time [m]', y_label=quant.latex_name + r' [M' + quant.unit + ']') plt.grid() plt.savefig('water_heater-external-heat.png', dpi=300) (quant, time_unit ) = water_heater.outflow_phase.get_quantity_history('rejected-heat') quant.plot(x_scaling=1 / unit.minute, y_scaling=1 / unit.mega, x_label='Time [m]', y_label=quant.latex_name + r' [M' + quant.unit + ']') plt.grid() plt.savefig('water_heater-rejected-heat.png', dpi=300)
from turbine import Turbine from turbine_config import TurbineConfig import os from os.path import join, isfile, realpath from numpy import array from time import time cfg = TurbineConfig.load('test/turbine_unittest.cfg') turbine = Turbine(cfg) import visualizer vis = visualizer.Visualizer(turbine.env) import blade_coverage import db grid = 7 robot = turbine.robot manip = robot.GetActiveManipulator() robot.GetLink('Flame').Enable(False) DB = db.DB(join(os.environ['PYTHON_DATABASE'], 'FACE'), turbine) T = turbine.blades[3].GetTransform() DB.T = T psa = (1.8500000000000032, 0.53725006964517363, 0.82546707480056725) threshold = 5e-2 t = time() path = blade_coverage.base_grid_validation(turbine, psa, DB, grid, threshold) print time() - t
from turbine import Turbine topology = Turbine(debug=True) @topology.source("input") def add_exclamation(input_str): return input_str + "!" @topology.scatter("input", ["output_1", "output_2"], num_tasks=1) def moar_exclamations(input_str): return input_str + "!!" @topology.sink("output_1") def print_val(val): print(val) @topology.sink("output_2", num_tasks=2) def print_val2(val): print(val.upper()) values = ["hello", "world"] topology.run(values)
def main(): """Balance of plant of a boiling water nuclear reactor. Attributes ---------- end_time: float End of the flow time in SI unit. time_step: float Size of the time step between port communications in SI unit. use_mpi: bool If set to `True` use MPI otherwise use Python multiprocessing. """ # Preamble end_time = 30.0 * unit.minute time_step = 30.0 # seconds show_time = (True, 5 * unit.minute) use_mpi = False # True for MPI; False for Python multiprocessing plot_results = True # True for enabling plotting section below params = get_params() # parameters for BoP BWR #***************************************************************************** # Define Cortix system # System top level plant = Cortix(use_mpi=use_mpi, splash=True) # Network plant_net = plant.network = Network() params['start-time'] = 0.0 params['end-time'] = end_time params['shutdown-time'] = 999.0 * unit.hour params['shutdown-mode'] = False #***************************************************************************** # Create reactor module reactor = BWR(params) reactor.name = 'BWR' reactor.save = True reactor.time_step = time_step reactor.end_time = end_time reactor.show_time = show_time reactor.RCIS = True # Add reactor module to network plant_net.module(reactor) #***************************************************************************** # Create turbine high pressure module params['turbine_inlet_pressure'] = 2 params['turbine_outlet_pressure'] = 0.5 params['high_pressure_turbine'] = True #params_turbine = reactor.params #params_turbine.inlet_pressure = 2 #params.turbine_outlet_pressure = 0.5 turbine_hp = Turbine(params) turbine_hp.name = 'High Pressure Turbine' turbine_hp.save = True turbine_hp.time_step = time_step turbine_hp.end_time = end_time # Add turbine high pressure module to network plant_net.module(turbine_hp) #***************************************************************************** # Create turbine low pressure module params['turbine_inlet_pressure'] = 0.5 params['turbine_outlet_pressure'] = 0.005 params['high_pressure_turbine'] = False params['steam flowrate'] = params['steam flowrate'] / 2 turbine_lp1 = Turbine(params) turbine_lp1.name = 'Low Pressure Turbine 1' turbine_lp1.save = True turbine_lp1.time_step = time_step turbine_lp1.end_time = end_time plant_net.module(turbine_lp1) #***************************************************************************** # Create turbine low pressure module params['turbine_inlet_pressure'] = 0.5 params['turbine_outlet_pressure'] = 0.005 params['high_pressure_turbine'] = False turbine_lp2 = Turbine(params) turbine_lp2.name = 'Low Pressure Turbine 2' turbine_lp2.save = True turbine_lp2.time_step = time_step turbine_lp2.end_time = end_time plant_net.module(turbine_lp2) #***************************************************************************** # Create condenser module params['steam flowrate'] = params['steam flowrate'] * 2 condenser = Condenser() condenser.name = 'Condenser' condenser.save = True condenser.time_step = time_step condenser.end_time = end_time plant_net.module(condenser) #***************************************************************************** params['RCIS-shutdown-time'] = 5 * unit.minute rcis = Cooler(params) rcis.name = 'RCIS' rcis.save = True rcis.time_step = time_step rcis.end_time = end_time plant_net.module(rcis) #***************************************************************************** # Create the BoP network connectivity plant_net.connect([reactor, 'coolant-outflow'], [turbine_hp, 'inflow']) plant_net.connect([turbine_hp, 'outflow-1'], [turbine_lp1, 'inflow']) plant_net.connect([turbine_hp, 'outflow-2'], [turbine_lp2, 'inflow']) plant_net.connect([turbine_lp1, 'outflow-1'], [condenser, 'inflow-1']) plant_net.connect([turbine_lp2, 'outflow-1'], [condenser, 'inflow-2']) plant_net.connect([condenser, 'outflow'], [reactor, 'coolant-inflow']) plant_net.connect([reactor, 'RCIS-outflow'], [rcis, 'coolant-inflow']) plant_net.connect([rcis, 'coolant-outflow'], [reactor, 'RCIS-inflow']) #plant_net.connect([rcis, 'signal-in'], [reactor, 'signal-out']) plant_net.draw(engine='dot', node_shape='folder') #***************************************************************************** # Run network dynamics simulation plant.run() #***************************************************************************** # Plot results if plot_results and (plant.use_multiprocessing or plant.rank == 0): # Reactor plots reactor = plant_net.modules[0] (quant, time_unit ) = reactor.neutron_phase.get_quantity_history('neutron-dens') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('startup-neutron-dens.png', dpi=300) (quant, time_unit ) = reactor.neutron_phase.get_quantity_history('delayed-neutrons-cc') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('startup-delayed-neutrons-cc.png', dpi=300) (quant, time_unit ) = reactor.coolant_outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('startup-coolant-outflow-temp.png', dpi=300) (quant, time_unit) = reactor.reactor_phase.get_quantity_history('fuel-temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('startup-fuel-temp.png', dpi=300) # Turbine high pressure plots turbine_hp = plant_net.modules[1] (quant, time_unit) = turbine_hp.outflow_phase.get_quantity_history('power') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='High Pressure Turbine Power') plt.grid() plt.savefig('startup-turbine-hp-power.png', dpi=300) (quant, time_unit) = turbine_hp.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='High Pressure Turbine Outflow Temperature') plt.grid() plt.savefig('startup-turbine-hp-outflow-temp.png', dpi=300) # Turbine low pressure graphs turbine_lp1 = plant_net.modules[2] (quant, time_unit) = turbine_lp1.outflow_phase.get_quantity_history('power') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='Lower Pressure Turbine 1 Power') plt.grid() plt.savefig('startup-turbine-lp1-power.png', dpi=300) (quant, time_unit) = turbine_lp1.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='Lower Pressure Turbine 1 Outflow Temperature') plt.grid() plt.savefig('startup-turbine-lp1-outflow-temp.png', dpi=300) # Condenser graphs condenser = plant_net.modules[3] (quant, time_unit) = condenser.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('startup-condenser-outflow-temp.png', dpi=300) #setup initial values for simulation turbine1_outflow_temp = turbine_hp.outflow_phase.get_value( 'temp', end_time) turbine1_chi = turbine_hp.outflow_phase.get_value('quality', end_time) turbine1_power = turbine_hp.outflow_phase.get_value('power', end_time) turbine2_outflow_temp = turbine_lp1.outflow_phase.get_value( 'temp', end_time) turbine2_chi = turbine_lp1.outflow_phase.get_value('quality', end_time) turbine2_power = turbine_lp1.outflow_phase.get_value('power', end_time) condenser_runoff_temp = condenser.outflow_phase.get_value('temp', end_time) delayed_neutron_cc = reactor.neutron_phase.get_value( 'delayed-neutrons-cc', end_time) n_dens = reactor.neutron_phase.get_value('neutron-dens', end_time) fuel_temp = reactor.reactor_phase.get_value('fuel-temp', end_time) coolant_temp = reactor.coolant_outflow_phase.get_value('temp', end_time) # Values loaded into params when they are needed (module instantiation) # Properly shutdown simulation plant.close() # Now we run shutdown as a seperate simulation with starting parameters equal to the ending # values of the startup simulation #************************************************************************************************** # Preamble start_time = 0.0 * unit.minute end_time = 60 * unit.minute time_step = 30.0 # seconds show_time = (True, 5 * unit.minute) use_mpi = False # True for MPI; False for Python multiprocessing plot_results = True # True for enabling plotting section below params = get_params() # clear params, just to be safe #***************************************************************************** # Define Cortix system # System top level plant = Cortix(use_mpi=use_mpi, splash=True) # Network plant_net = plant.network = Network() params['start-time'] = start_time params['end-time'] = end_time params['shutdown time'] = 0.0 params['shutdown-mode'] = True #***************************************************************************** # Create reactor module params['delayed-neutron-cc'] = delayed_neutron_cc params['n-dens'] = n_dens params['fuel-temp'] = fuel_temp params['coolant-temp'] = coolant_temp params['operating-mode'] = 'shutdown' reactor = BWR(params) reactor.name = 'BWR' reactor.save = True reactor.time_step = time_step reactor.end_time = end_time reactor.show_time = show_time reactor.RCIS = False # Add reactor module to network plant_net.module(reactor) #***************************************************************************** # Create turbine high pressure module params['turbine_inlet_pressure'] = 2 params['turbine_outlet_pressure'] = 0.5 params['high_pressure_turbine'] = True params['turbine-outflow-temp'] = turbine1_outflow_temp params['turbine-chi'] = turbine1_chi params['turbine-work'] = turbine1_power params['turbine-inflow-temp'] = coolant_temp #params_turbine = reactor.params #params_turbine.inlet_pressure = 2 #params.turbine_outlet_pressure = 0.5 turbine_hp = Turbine(params) turbine_hp.name = 'High Pressure Turbine' turbine_hp.save = True turbine_hp.time_step = time_step turbine_hp.end_time = end_time # Add turbine high pressure module to network plant_net.module(turbine_hp) #***************************************************************************** # Create turbine low pressure 1 module params['turbine_inlet_pressure'] = 0.5 params['turbine_outlet_pressure'] = 0.005 params['high_pressure_turbine'] = False params['steam flowrate'] = params['steam flowrate'] / 2 params['turbine-outflow-temp'] = turbine2_outflow_temp params['turbine-inflow-temp'] = turbine1_outflow_temp params['turbine-chi'] = turbine2_chi params['turbine-work'] = turbine2_power turbine_lp1 = Turbine(params) turbine_lp1.name = 'Low Pressure Turbine 1' turbine_lp1.save = True turbine_lp1.time_step = time_step turbine_lp1.end_time = end_time plant_net.module(turbine_lp1) #***************************************************************************** # Create turbine low pressure 2 module params['turbine_inlet_pressure'] = 0.5 params['turbine_outlet_pressure'] = 0.005 params['high_pressure_turbine'] = False turbine_lp2 = Turbine(params) turbine_lp2.name = 'Low Pressure Turbine 2' turbine_lp2.save = True turbine_lp2.time_step = time_step turbine_lp2.end_time = end_time plant_net.module(turbine_lp2) #***************************************************************************** # Create condenser module params['steam flowrate'] = params['steam flowrate'] * 2 params['condenser-runoff-temp'] = condenser_runoff_temp condenser = Condenser() condenser.name = 'Condenser' condenser.save = True condenser.time_step = time_step condenser.end_time = end_time plant_net.module(condenser) #***************************************************************************** params['RCIS-shutdown-time'] = -1 * unit.minute rcis = Cooler(params) rcis.name = 'RCIS' rcis.save = True rcis.time_step = time_step rcis.end_time = end_time plant_net.module(rcis) #***************************************************************************** # Create the BoP network connectivity plant_net.connect([reactor, 'coolant-outflow'], [turbine_hp, 'inflow']) plant_net.connect([turbine_hp, 'outflow-1'], [turbine_lp1, 'inflow']) plant_net.connect([turbine_hp, 'outflow-2'], [turbine_lp2, 'inflow']) plant_net.connect([turbine_lp1, 'outflow-1'], [condenser, 'inflow-1']) plant_net.connect([turbine_lp2, 'outflow-1'], [condenser, 'inflow-2']) plant_net.connect([condenser, 'outflow'], [reactor, 'coolant-inflow']) plant_net.connect([reactor, 'RCIS-outflow'], [rcis, 'coolant-inflow']) plant_net.connect([rcis, 'coolant-outflow'], [reactor, 'RCIS-inflow']) #plant_net.connect([rcis, 'signal-in'], [reactor, 'signal-out']) plant_net.draw(engine='dot', node_shape='folder') #***************************************************************************** # Run network dynamics simulation plant.run() #***************************************************************************** # Plot results if plot_results and (plant.use_multiprocessing or plant.rank == 0): # Reactor plots reactor = plant_net.modules[0] (quant, time_unit ) = reactor.neutron_phase.get_quantity_history('neutron-dens') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('shutdown-neutron-dens.png', dpi=300) (quant, time_unit ) = reactor.neutron_phase.get_quantity_history('delayed-neutrons-cc') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('shutdown-delayed-neutrons-cc.png', dpi=300) (quant, time_unit ) = reactor.coolant_outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('shutdown-coolant-outflow-temp.png', dpi=300) (quant, time_unit) = reactor.reactor_phase.get_quantity_history('fuel-temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('shutdown-fuel-temp.png', dpi=300) # Turbine high pressure plots turbine_hp = plant_net.modules[1] (quant, time_unit) = turbine_hp.outflow_phase.get_quantity_history('power') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='High Pressure Turbine Power') plt.grid() plt.savefig('shutdown-turbine-hp-power.png', dpi=300) (quant, time_unit) = turbine_hp.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='High Pressure Turbine Outflow Temperature') plt.grid() plt.savefig('shutdown-turbine-hp-outflow-temp.png', dpi=300) # Turbine low pressure graphs turbine_lp1 = plant_net.modules[2] (quant, time_unit) = turbine_lp1.outflow_phase.get_quantity_history('power') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='Lower Pressure Turbine 1 Power') plt.grid() plt.savefig('shutdown-turbine-lp1-power.png', dpi=300) (quant, time_unit) = turbine_lp1.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='Lower Pressure Turbine 1 Outflow Temperature') plt.grid() plt.savefig('shutdown-turbine-lp1-outflow-temp.png', dpi=300) # Condenser graphs condenser = plant_net.modules[4] (quant, time_unit) = condenser.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('shutdown-condenser-outflow-temp.png', dpi=300) # Shutdown The Simulation plant.close()
def main(): """Balance of plant of a boiling water nuclear reactor. Attributes ---------- end_time: float End of the flow time in SI unit. time_step: float Size of the time step between port communications in SI unit. use_mpi: bool If set to `True` use MPI otherwise use Python multiprocessing. """ # Preamble end_time = 30 * unit.minute time_step = 30.0 # seconds show_time = (True, 5 * unit.minute) use_mpi = False # True for MPI; False for Python multiprocessing plot_results = True # True for enabling plotting section below params = get_params() # parameters for BoP BWR #***************************************************************************** # Define Cortix system # System top level plant = Cortix(use_mpi=use_mpi, splash=True) # Network plant_net = plant.network = Network() params['start-time'] = 0 params['end-time'] = end_time #***************************************************************************** # Create reactor module reactor = BWR(params) reactor.name = 'BWR' reactor.save = True reactor.time_step = time_step reactor.end_time = end_time reactor.show_time = show_time # Add reactor module to network plant_net.module(reactor) #***************************************************************************** # Create turbine 1 module params['turbine_inlet_pressure'] = 2 params['turbine_outlet_pressure'] = 0.005 params['high_pressure_turbine'] = True #params_turbine = reactor.params #params_turbine.inlet_pressure = 2 #params.turbine_outlet_pressure = 0.5 turbine1 = Turbine(params) turbine1.name = 'High Pressure Turbine' turbine1.save = True turbine1.time_step = time_step turbine1.end_time = end_time # Add turbine 1 module to network plant_net.module(turbine1) #***************************************************************************** # Create condenser module params['steam flowrate'] = params['steam flowrate'] * 2 condenser = Condenser(params) condenser.name = 'Condenser' condenser.save = True condenser.time_step = time_step condenser.end_time = end_time plant_net.module(condenser) #***************************************************************************** # Create the BoP network connectivity plant_net.connect([reactor, 'coolant-outflow'], [turbine1, 'inflow']) plant_net.connect([turbine1, 'outflow-1'], [condenser, 'inflow-1']) plant_net.connect([condenser, 'outflow'], [reactor, 'coolant-inflow']) plant_net.draw() #***************************************************************************** # Run network dynamics simulation plant.run() #***************************************************************************** # Plot results if plot_results and (plant.use_multiprocessing or plant.rank == 0): # Reactor plots reactor = plant_net.modules[0] (quant, time_unit ) = reactor.neutron_phase.get_quantity_history('neutron-dens') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('test-neutron-dens.png', dpi=300) (quant, time_unit ) = reactor.neutron_phase.get_quantity_history('delayed-neutrons-cc') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('test-delayed-neutrons-cc.png', dpi=300) (quant, time_unit ) = reactor.coolant_outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('test-coolant-outflow-temp.png', dpi=300) (quant, time_unit) = reactor.reactor_phase.get_quantity_history('fuel-temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('test-fuel-temp.png', dpi=300) # Turbine1 plots turbine1 = plant_net.modules[1] (quant, time_unit) = turbine1.outflow_phase.get_quantity_history('power') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='High Pressure Turbine Power') plt.grid() plt.savefig('test-turbine1-power.png', dpi=300) (quant, time_unit) = turbine1.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']', title='High Pressure Turbine Outflow Temperature') plt.grid() plt.savefig('test-turbine1-outflow-temp.png', dpi=300) # Condenser graphs condenser = plant_net.modules[-1] (quant, time_unit) = condenser.outflow_phase.get_quantity_history('temp') quant.plot(x_scaling=1 / unit.minute, x_label='Time [m]', y_label=quant.latex_name + ' [' + quant.unit + ']') plt.grid() plt.savefig('test-condenser-outflow-temp.png', dpi=300) # Properly shutdown simulation plant.close()
from inlet import Inlet from fan import Fan from bypass import Bypass from compressor import Compressor from combustion import CombustionChamber from spool import Spool from turbine import Turbine ambient_conditions = FlowCondition(corrected_mass_flow=1400., mach=0.8, t_static=216., p_static=22632., station_number='1', medium='air') inlet = Inlet(ambient=ambient_conditions, eta=0.98) fan = Fan(inflow=inlet.outflow, eta=0.92, pressure_ratio=1.6, station_number='21') bypass = Bypass(inflow=fan.outflow, bypass_ratio=8.) lpc = Compressor(inflow=bypass.outflow_core, eta=0.9, pressure_ratio=1.4, station_number='25') hpc = Compressor(inflow=lpc.outflow, eta=0.9, pressure_ratio=19, station_number='3') combustor = CombustionChamber(inflow=hpc.outflow, eta=0.99, pressure_ratio=0.96, t_total_exit=1450.) lp_spool = Spool(compressor_in=(fan, lpc), eta=0.99) hp_spool = Spool(compressor_in=hpc, eta=0.99) hpt = Turbine(inflow=combustor.outflow, spool_in=hp_spool, eta=0.92, station_number='45') lpt = Turbine(inflow=hpt.outflow, spool_in=lp_spool, eta=0.92, station_number='5') nozzle_core = Nozzle(inflow=lpt.outflow, ambient=ambient_conditions, eta=0.98, nozzle_type='convergent', station_number=('7', '8')) nozzle_bypass = Nozzle(inflow=bypass.outflow_bypass, ambient=ambient_conditions, eta=0.98, nozzle_type='convergent', station_number=('16', '18')) print(nozzle_core.p_critical) print(nozzle_core.choked) print(nozzle_core.pressure_thrust) # print(obj.p_total) # print(obj.t_total)
import dynamics from turbine import Turbine # Turn off gravity dynamics.OPT_GRAVITY = True dynamics.OPT_GEOMETRIC_STIFFNESS = True # Parameters pitch_freq = 0.3 # rad/s pitch_amp = 0.3 # rad rotor_speed = 2 # rad/s # Create model bladed_file = r'C:\Users\Rick Lupton\Dropbox\phd\Bladed\Models\OC3-Hywind_SparBuoy_NREL5MW.prj' tb = Turbine(bladed_file) # Linearise model and simulate lin = tb.lin(az0=0, rotor_speed=rotor_speed, init=True) t, yl = lin.integrate(90) # Convert to MBC and simulate mbclin = lin.multiblade_transform( (0, rotor_speed), [range(0, 4), range(4, 8), range(8, 12)]) t, ym = mbclin.integrate(90) # Simulate original full system #t,y = tb.simulate(rotor_speed=2, t1=90, dt=0.10, init=True)
import numpy as np from numpy import pi, array, dot import matplotlib.pylab as plt import matplotlib.gridspec as gridspec import dynamics from turbine import Turbine # Options dynamics.OPT_GRAVITY = True dynamics.OPT_GEOMETRIC_STIFFNESS = False # Create model bladed_file = r'C:\Users\Rick Lupton\Dropbox\phd\Bladed\Models\OC3-Hywind_SparBuoy_NREL5MW.prj' tb = Turbine(bladed_file, rigid=False) # Set base motion tb.system.free(tb.base) tb.system.prescribe(tb.base, acc=0, vel=0, part=[0,1,2,3,5]) # Define foundation matrix - no coupling for now # Choose to match appropriate frequencies of rigid-body motion (Karimirad & Moan, 2012) # in surge, sway, heave, roll, pitch yaw respectively rigid_body_freqs = array([0.05, 0.05, 0.20, 0.22, 0.22, 0.84]) **2 foundation = np.diag([ tb.mass * rigid_body_freqs[0], tb.mass * rigid_body_freqs[1], tb.mass * rigid_body_freqs[2], tb.inertia[0,0] * rigid_body_freqs[3], tb.inertia[1,1] * rigid_body_freqs[4],