class SystemProperties: """Gets the flow and contaminant properties.""" def __init__(self, master, system): """Constructor method. Defines the parameters to be obtained in this window.""" self.master = master self.system = system self.fonttype = system.fonttype self.version = system.version self.superfont = get_superfont(self.fonttype) #superscript font self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.advs = ['None', 'Steady flow', 'Period oscillation'] self.bios = ['None', 'Uniform', 'Depth-dependent'] self.cons = ['None', 'Consolidation'] self.adv = StringVar(value=self.advs[0]) #tidal flag self.bio = StringVar(value=self.bios[0]) #bioturbation flag self.con = StringVar(value=self.cons[0]) #consolidation flag self.hbio = DoubleVar(value=10.) #bioturbation depth self.sigma = DoubleVar(value=10.) #bioturbation depth self.Dbiop = DoubleVar(value=1.) #particle bioturbation coeff self.Dbiopw = DoubleVar(value=100.) #pore water bioturbation coeff self.Vdar = DoubleVar(value=0.) #Darcy velocity self.Vtidal = DoubleVar(value=0.) #Tidal velocity self.ptidal = DoubleVar(value=0.0014) #Tidal frequency self.hcon = DoubleVar(value=0) #total consolidation self.t90 = DoubleVar(value=1.) #time to 90% consolidation self.top = None #flag for existence of toplevel if system.layers[0].number == 0: self.toplayer_h = system.layers[1].h else: self.toplayer_h = system.layers[0].h self.lengthunit = system.lengthunit self.timeunit = system.timeunit self.diffunit = system.diffunit self.diffunits = system.diffunits try: self.adv.set(system.adv) self.bio.set(system.bio) self.con.set(system.con) self.Vdar.set(system.Vdar) self.hbio.set(system.hbio) self.sigma.set(system.sigma) self.Dbiop.set(system.Dbiop) self.Dbiopw.set(system.Dbiopw) self.Vtidal.set(system.Vtidal) self.ptidal.set(system.ptidal) self.hcon.set(system.hcon) self.t90.set(system.t90) except: pass def make_widgets(self): """Make the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.instructions = Label( self.frame, text= ' Please provide the information of the following system properties: ' ) self.blank1 = Label(self.frame, width=30) self.blank2 = Label(self.frame, width=20) self.blank3 = Label(self.frame, width=15) self.blank4 = Label(self.frame, width=20) self.headings1 = Label(self.frame, text='Parameter') self.headings2 = Label(self.frame, text='Value') self.headings3 = Label(self.frame, text='Units') self.advlabel = Label(self.frame, text='Upwelling groundwater flow') self.advwidget = OptionMenu(self.frame, self.adv, *self.advs, command=self.updatesystem) self.Vdarlabel = Label(self.frame, text='Darcy velocity:') self.Vtidallabel = Label(self.frame, text='Oscillation maximum velocity:') self.ptidallabel = Label(self.frame, text='Oscillation period:') self.Vdarwidget = Entry(self.frame, width=10, textvariable=self.Vdar, justify='center') self.Vtidalwidget = Entry(self.frame, width=10, textvariable=self.Vtidal, justify='center') self.ptidalwidget = Entry(self.frame, width=10, textvariable=self.ptidal, justify='center') self.Vdarunits = Label(self.frame, text=self.lengthunit + '/' + self.timeunit) self.Vtidalunits = Label(self.frame, text=self.lengthunit + '/' + self.timeunit) self.ptidalunits = Label(self.frame, text=self.timeunit) self.biolabel = Label(self.frame, text='Modeling bioturbation') self.biowidget = OptionMenu(self.frame, self.bio, *self.bios, command=self.updatesystem) self.hbiolabel = Label(self.frame, text='Bioturbation depth:') self.sigmalabel = Label(self.frame, text='Gaussian model coefficient:') self.Dbioplabel = Label(self.frame, text='Particle biodiffusion coefficient:') self.Dbiopwlabel = Label(self.frame, text='Pore water biodiffusion coefficient:') self.hbiowidget = Entry(self.frame, width=10, textvariable=self.hbio, justify='center') self.sigmawidget = Entry(self.frame, width=10, textvariable=self.sigma, justify='center') self.Dbiopwidget = Entry(self.frame, width=10, textvariable=self.Dbiop, justify='center') self.Dbiopwwidget = Entry(self.frame, width=10, textvariable=self.Dbiopw, justify='center') self.hbiounits = Label(self.frame, text=self.lengthunit) self.Dbiopunits = Label(self.frame, text=self.diffunits[1]) self.Dbiopwunits = Label(self.frame, text=self.diffunits[1]) self.conlabel = Label(self.frame, text='Modeling consolidation') self.conwidget = OptionMenu(self.frame, self.con, *self.cons, command=self.updatesystem) self.hconlabel = Label(self.frame, text='Maximum consolidation depth:') self.t90label = Label(self.frame, text='Time to 90% consolidation:') self.hconwidget = Entry(self.frame, width=10, textvariable=self.hcon, justify='center') self.t90widget = Entry(self.frame, width=10, textvariable=self.t90, justify='center') self.hconunits = Label(self.frame, text=self.lengthunit) self.t90units = Label(self.frame, text=self.timeunit) self.advwidget.config(width=20) self.biowidget.config(width=20) self.conwidget.config(width=20) #self.okbutton = Button(self.frame, text = 'OK', command = self.OK, width = 20) #show the widgets on the grid self.instructions.grid(row=0, column=0, columnspan=3, padx=6, sticky='W') self.blank1.grid(row=1, column=0) self.blank2.grid(row=1, column=1) self.blank3.grid(row=1, column=2) self.row = 3 self.focusbutton = None self.updatesystem() def updatesystem(self, event=None): try: self.advlabel.grid_forget() self.advwidget.grid_forget() self.Vdarlabel.grid_forget() self.Vdarwidget.grid_forget() self.Vdarunits.grid_forget() self.Vtidallabel.grid_forget() self.Vtidalwidget.grid_forget() self.Vtidalunits.grid_forget() self.ptidallabel.grid_forget() self.ptidalwidget.grid_forget() self.ptidalunits.grid_forget() self.biolabel.grid_forget() self.biowidget.grid_forget() self.sigmalabel.grid_forget() self.sigmawidget.grid_forget() self.hbiolabel.grid_forget() self.hbiowidget.grid_forget() self.hbiounits.grid_forget() self.Dbioplabel.grid_forget() self.Dbiopwidget.grid_forget() self.Dbiopunits.grid_forget() self.Dbiopwlabel.grid_forget() self.Dbiopwwidget.grid_forget() self.Dbiopwunits.grid_forget() self.conlabel.grid_forget() self.conwidget.grid_forget() self.hconlabel.grid_forget() self.hconwidget.grid_forget() self.hconunits.grid_forget() self.t90label.grid_forget() self.t90widget.grid_forget() self.t90units.grid_forget() except: pass row = self.row self.advlabel.grid(row=row, column=0, sticky='E', padx=4) self.advwidget.grid(row=row, column=1, sticky='W', padx=4, columnspan=2) row = row + 1 if self.adv.get() == self.advs[1] or self.adv.get() == self.advs[2]: self.Vdarlabel.grid(row=row, column=0, sticky='E', padx=4) self.Vdarwidget.grid(row=row, column=1, pady=1) self.Vdarunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 if self.adv.get() == self.advs[2]: self.Vtidallabel.grid(row=row, column=0, sticky='E', padx=4) self.Vtidalwidget.grid(row=row, column=1, pady=1) self.Vtidalunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.ptidallabel.grid(row=row, column=0, sticky='E', padx=4) self.ptidalwidget.grid(row=row, column=1, pady=1) self.ptidalunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.biolabel.grid(row=row, column=0, sticky='E', padx=4) self.biowidget.grid(row=row, column=1, sticky='W', padx=4, columnspan=2) row = row + 1 if self.bio.get() == self.bios[1]: self.hbiolabel.grid(row=row, column=0, sticky='E', padx=4) self.hbiowidget.grid(row=row, column=1, pady=1) self.hbiounits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 if self.bio.get() == self.bios[2]: self.sigmalabel.grid(row=row, column=0, sticky='E', padx=4) self.sigmawidget.grid(row=row, column=1, pady=1) self.hbiounits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 if self.bio.get() == self.bios[1] or self.bio.get() == self.bios[2]: self.Dbioplabel.grid(row=row, column=0, sticky='E', padx=4) self.Dbiopwidget.grid(row=row, column=1, pady=1) self.Dbiopunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.Dbiopwlabel.grid(row=row, column=0, sticky='E', padx=4) self.Dbiopwwidget.grid(row=row, column=1, pady=1) self.Dbiopwunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.conlabel.grid(row=row, column=0, sticky='E', padx=4) self.conwidget.grid(row=row, column=1, sticky='W', padx=4, columnspan=2) row = row + 1 if self.con.get() == self.cons[1]: self.hconlabel.grid(row=row, column=0, sticky='E', padx=4) self.hconwidget.grid(row=row, column=1, pady=1) self.hconunits.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.t90label.grid(row=row, column=0, sticky='E', padx=4) self.t90widget.grid(row=row, column=1, pady=1) self.t90units.grid(row=row, column=2, sticky='W', padx=4) row = row + 1 self.blank4.grid(row=row) row = row + 1 self.focusbutton = None self.master.geometry() def error_check(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" error = 0 #if self.bio.get() == self.bios[1] and self.hbio.get() > self.toplayer_h: error = 1 return error def warning(self): tkmb.showerror( title=self.version, message='The bioturbation ' + 'depth (%.1f cm) ' % self.hbio.get() + 'cannot exceed the ' + 'thickness of the top layer (%.1f). ' % self.toplayer_h + 'Automatically increasing ' + 'the thickness of the top layer to the bioturbation ' + 'depth.') self.hbio.set(self.toplayer_h) self.focusbutton = None self.master.tk.lift()
class CoefficientEditor: """Gets the chemical reaction information for each layer.""" def __init__(self, master, system, coefficient, coefficients, editflag): """Constructor method. Makes the GUI using the list of "Layer" objects "layers." """ # Read the Tkinter information self.master = master self.version = system.version self.fonttype = system.fonttype self.formulatype = system.formulatype self.superfont = get_superfont(self.fonttype) self.subfont = get_superfont(self.formulatype) self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.bgcolor = self.frame.cget('bg') self.top = None self.concunit = system.concunit self.timeunit = system.timeunit self.concunits = system.concunits # Convert mass concentration units to corresponding molar concentration units if self.concunit == system.concunits[0]: self.concunit = system.concunits[3] if self.concunit == system.concunits[1]: self.concunit = system.concunits[4] if self.concunit == system.concunits[2]: self.concunit = system.concunits[5] # Read the system information self.coefficient = coefficient self.coefficients = coefficients self.layers = system.layers self.editflag = editflag if self.editflag == 0: self.layer_full_list = [] self.reaction_full_list = [] for layer in system.layers: self.layer_full_list.append(layer.name) for reaction in system.reactions: self.reaction_full_list.append(reaction.name) self.layer_list = [] self.reaction_list = [] for layer in system.layers: coef_check = 0 for reaction in system.reactions: if coefficients[layer.name][reaction.name].lam == 0: coef_check = 1 if coef_check == 1: self.layer_list.append(layer.name) self.reaction_list.append([]) for reaction in system.reactions: if coefficients[layer.name][reaction.name].lam == 0: self.reaction_list[-1].append(reaction.name) self.layer = StringVar(value=self.layer_list[0]) self.reaction = StringVar(value=self.reaction_list[0][0]) self.equation = StringVar(value='') else: self.layer = coefficient.layer.name self.reaction = coefficient.reaction.name self.equation = coefficient.reaction.equation self.reactants = coefficient.reaction.reactants self.lam = DoubleVar(value=coefficient.lam) self.cancelflag = 0 def make_widgets(self): self.instructions = Label( self.frame, text= 'Please input the following information for the added kinetic process: ' ) self.blankcolumn = Label(self.frame, text=' ', width=2) self.layercolumn = Label(self.frame, text=' ', width=15) self.namecolumn = Label(self.frame, text=' ', width=15) self.equationcolumn = Label(self.frame, text=' ', width=20) self.ratecolumn = Label(self.frame, text=' ', width=10) self.coef1column = Label(self.frame, text=' ', width=10) self.unit1column = Label(self.frame, text=' ', width=3) self.endcolumn = Label(self.frame, text=' ', width=2) self.layerlabel = Label(self.frame, text='Layer') self.namelabel = Label(self.frame, text='Reaction') self.equationlabel = Label(self.frame, text='Chemical equation') self.ratelabel = Label(self.frame, text='Rate equation') self.lamcoeflabel = Label(self.frame, text='Coefficient ' + u'\u03BB') self.blank1 = Label(self.frame, text=' ') self.instructions.grid(row=0, column=0, padx=8, sticky='W', columnspan=11) self.blankcolumn.grid(row=1, column=0, padx=2, sticky='WE') self.layercolumn.grid(row=1, column=1, padx=2, sticky='WE') self.namecolumn.grid(row=1, column=2, padx=2, sticky='WE') self.equationcolumn.grid(row=1, column=3, padx=2, sticky='WE') self.ratecolumn.grid(row=1, column=4, padx=2, sticky='WE') self.coef1column.grid(row=1, column=5, padx=2, sticky='WE') self.unit1column.grid(row=1, column=6, padx=2, sticky='WE') self.endcolumn.grid(row=1, column=7, padx=2, sticky='WE') self.layerlabel.grid(row=2, column=1, padx=2, sticky='WE') self.namelabel.grid(row=2, column=2, padx=2, sticky='WE') self.equationlabel.grid(row=2, column=3, padx=2, sticky='WE') self.ratelabel.grid(row=2, column=4, padx=2, sticky='WE') self.blank1.grid(row=3, column=0, padx=2, sticky='WE', columnspan=11) if self.editflag == 1: self.layerwidget = Label(self.frame, text=self.layer) self.namewidget = Label(self.frame, text=self.reaction) self.equationwidget = Label(self.frame, text=self.equation, font=self.formulatype) self.layerwidget.grid(row=4, column=1, padx=2) self.namewidget.grid(row=4, column=2, padx=2) self.equationwidget.grid(row=4, column=3, padx=10) if self.coefficient.reaction.model == 'User-defined' or self.coefficient.reaction.model == 'Fundamental': unitindex = 0 tkfont = tkFont.Font(font=self.formulatype) tksubfont = tkFont.Font(font=self.subfont) tksuperfont = tkFont.Font(font=self.superfont) # Measure the width of rate and lambda expression rate_len = tkfont.measure(u'r = \u03BB') rate_len = rate_len + tksubfont.measure( str(self.coefficient.reaction.number) + ',') if self.coefficient.layer.number == 0: rate_len = rate_len + tksubfont.measure('D') else: rate_len = rate_len + tksubfont.measure( str(self.coefficient.layer.number)) for reactant in self.coefficient.reaction.reactants: if reactant.index <> 0: rate_len = rate_len + tkfont.measure('C') rate_len = rate_len + tksubfont.measure( reactant.formula) if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: rate_len = rate_len + tksuperfont.measure( str(index) + ' ') unitindex = unitindex + reactant.index print(unitindex) lam_len = tkfont.measure('') if unitindex == int(unitindex): unitindex = int(unitindex) print(unitindex) if (unitindex - 1) != 0: if (unitindex - 1) != -1: lam_len = lam_len + tkfont.measure('(' + self.concunit + ')') lam_len = lam_len + tksuperfont.measure( str(-(unitindex - 1))) else: lam_len = lam_len + tkfont.measure(self.concunit + ' ') lam_len = lam_len + tkfont.measure(self.timeunit) lam_len = lam_len + tksuperfont.measure('-1') self.ratewidget = Text(self.frame, width=int(rate_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) self.ratewidget.insert('end', u'r') self.ratewidget.insert('end', ' = ') self.ratewidget.insert('end', u'\u03BB') self.ratewidget.insert( 'end', str(self.coefficient.reaction.number) + ',', 'sub') if self.coefficient.layer.number == 0: self.ratewidget.insert('end', 'D', 'sub') else: self.ratewidget.insert('end', str(self.coefficient.layer.number), 'sub') for reactant in self.coefficient.reaction.reactants: if reactant.index <> 0: self.ratewidget.insert('end', 'C') self.ratewidget.insert('end', reactant.formula, 'sub') if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: self.ratewidget.insert('end', str(index) + ' ', 'super') self.ratewidget.tag_config('sub', offset=-4, font=self.subfont) self.ratewidget.tag_config('super', offset=5, font=self.superfont) self.ratewidget.tag_config('right', justify='right') self.ratewidget.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.lamcoefwidget = Entry(self.frame, textvariable=self.lam, justify='center', width=8) self.lamunitlabel = Text( self.frame, width=int(lam_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) if (unitindex - 1) != 0: if (unitindex - 1) != -1: self.lamunitlabel.insert('end', '(' + self.concunit + ')') self.lamunitlabel.insert('end', str(-(unitindex - 1)), 'super') else: self.lamunitlabel.insert('end', self.concunit + ' ') self.lamunitlabel.insert('end', self.timeunit) self.lamunitlabel.insert('end', '-1', 'super') self.lamunitlabel.tag_config('sub', offset=-4, font=self.subfont) self.lamunitlabel.tag_config('super', offset=5, font=self.superfont) self.lamunitlabel.tag_config('right', justify='right') self.lamunitlabel.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.lamcoeflabel.grid(row=2, column=5, padx=2, sticky='WE', columnspan=4) self.ratewidget.grid(row=4, column=4, padx=5) self.lamcoefwidget.grid(row=4, column=5, padx=2, sticky='E') self.lamunitlabel.grid(row=4, column=6, padx=2, sticky='W') else: self.layerwidget = OptionMenu(self.frame, self.layer, *self.layer_list, command=self.click_layer) self.layerwidget.grid(row=4, column=1, padx=2, sticky='WE') self.click_layer() self.okbutton = Button(self.frame, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.frame, text='Cancel', width=20, command=self.Cancel) self.blank2 = Label(self.frame, text=' ') self.blank3 = Label(self.frame, text=' ') self.blank4 = Label(self.frame, text=' ') self.focusbutton = None self.blank3.grid(row=5) self.okbutton.grid(row=6, columnspan=11) self.cancelbutton.grid(row=7, columnspan=11) self.blank4.grid(row=8) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton def click_layer(self, event=None): try: self.namewidget.grid_forget() except: pass self.reaction.set(self.reaction_list[self.layer_list.index( self.layer.get())][0]) self.namewidget = OptionMenu(self.frame, self.reaction, *self.reaction_list[self.layer_list.index( self.layer.get())], command=self.click_reaction) self.namewidget.grid(row=4, column=2, padx=2, sticky='WE') self.click_reaction() def click_reaction(self, event=None): try: self.equationwidget.grid_forget() self.ratewidget.grid_forget() except: pass try: self.lamcoeflabel.grid_forget() self.lamcoefwidget.grid_forget() self.lamunitlabel.grid_forget() except: pass coefficient = self.coefficients[self.layer.get()][self.reaction.get()] self.lam.set(coefficient.lam) self.equation = coefficient.reaction.equation self.equationwidget = Label(self.frame, text=self.equation, font=self.formulatype) self.equationwidget.grid(row=4, column=3, padx=5) if coefficient.reaction.model == 'User-defined' or coefficient.reaction.model == 'Fundamental': unitindex = 0 tkfont = tkFont.Font(font=self.formulatype) tksubfont = tkFont.Font(font=self.subfont) tksuperfont = tkFont.Font(font=self.superfont) # Measure the width of rate and lambda expression rate_len = tkfont.measure(u'r = \u03BB') rate_len = rate_len + tksubfont.measure( str(coefficient.reaction.number) + ',') if coefficient.layer.number == 0: rate_len = rate_len + tksubfont.measure('D') else: rate_len = rate_len + tksubfont.measure( str(coefficient.layer.number)) for reactant in coefficient.reaction.reactants: if reactant.index <> 0: rate_len = rate_len + tkfont.measure('C') rate_len = rate_len + tksubfont.measure(reactant.formula) if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: rate_len = rate_len + tksuperfont.measure( str(index) + ' ') unitindex = unitindex + reactant.index lam_len = tkfont.measure('') if unitindex == int(unitindex): unitindex = int(unitindex) if (unitindex - 1) != 0: if (unitindex - 1) != 1: lam_len = lam_len + tkfont.measure('(' + self.concunit + ')') lam_len = lam_len + tksuperfont.measure( str(-(unitindex - 1))) else: lam_len = lam_len + tkfont.measure(self.concunit) lam_len = lam_len + tkfont.measure(self.timeunit) lam_len = lam_len + tksuperfont.measure('-1') self.ratewidget = Text(self.frame, width=int(rate_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) self.ratewidget.insert('end', u'r = \u03BB') self.ratewidget.insert('end', str(coefficient.reaction.number) + ',', 'sub') if coefficient.layer.number == 0: self.ratewidget.insert('end', 'D', 'sub') else: self.ratewidget.insert('end', str(coefficient.layer.number), 'sub') for reactant in coefficient.reaction.reactants: if reactant.index <> 0: self.ratewidget.insert('end', 'C') self.ratewidget.insert('end', reactant.formula, 'sub') if reactant.index == int(reactant.index): index = int(reactant.index) else: index = reactant.index if index <> 1.: self.ratewidget.insert('end', str(index) + ' ', 'super') self.ratewidget.tag_config('sub', offset=-4, font=self.subfont) self.ratewidget.tag_config('super', offset=5, font=self.superfont) self.ratewidget.tag_config('right', justify='right') self.ratewidget.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.lamcoefwidget = Entry(self.frame, textvariable=self.lam, justify='center', width=8) self.lamunitlabel = Text(self.frame, width=int(lam_len * 1.1424219345 / 8) + 1, height=1, font=self.formulatype) if unitindex == int(unitindex): unitindex = int(unitindex) if (unitindex - 1) != 0: if (unitindex - 1) != 1: self.lamunitlabel.insert('end', '(' + self.concunit + ')') self.lamunitlabel.insert('end', str(-(unitindex - 1)), 'super') else: self.lamunitlabel.insert('end', self.concunit) self.lamunitlabel.insert('end', self.timeunit) self.lamunitlabel.insert('end', '-1', 'super') self.lamunitlabel.tag_config('sub', offset=-4, font=self.subfont) self.lamunitlabel.tag_config('super', offset=5, font=self.superfont) self.lamunitlabel.tag_config('right', justify='right') self.lamunitlabel.config(state='disabled', background=self.bgcolor, borderwidth=0, spacing3=3) self.lamcoeflabel.grid(row=2, column=5, padx=2, sticky='WE', columnspan=4) self.ratewidget.grid(row=4, column=4, padx=5) self.lamcoefwidget.grid(row=4, column=5, padx=2, sticky='E') self.lamunitlabel.grid(row=4, column=6, padx=2, sticky='W') self.frame.update() self.focusbutton = None self.master.geometry() self.master.center() def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" if self.editflag == 0: self.layerindex = self.layer_full_list.index(self.layer.get()) self.reactionnumber = self.reaction_full_list.index( self.reaction.get()) + 1 if self.master.window.top is not None: self.master.open_toplevel() elif self.lam == 0: self.coefficient_error() else: self.master.tk.quit() def coefficient_error(self): tkmb.showerror( title=self.version, message='At least one chemical has been replicated in the reaction!' ) self.focusbutton = self.okbutton self.master.tk.lift() def Cancel(self): try: self.reactants = self.reaction.reactants self.products = self.reaction.products except: self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class SolverEditor: """Makes a window for the user to specify output options.""" def __init__(self, master, system, ptype, ptotal, tvariable, delt, delz, players): """Constructor method.""" self.master = master self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.fonttype = system.fonttype self.version = system.version self.top = None self.adv = system.adv self.bio = system.bio self.Dbiop = system.Dbiop * self.diff_factor / 86400 / 365 self.Dbiopw = system.Dbiopw * self.diff_factor / 86400 / 365 self.diffunit = system.diffunit self.timeunit = system.timeunit self.lengthunit = system.lengthunit self.components = [component.copy() for component in system.components] self.chemicals = [chemical.copy() for chemical in system.chemicals] self.matrices = [matrix.copy() for matrix in system.matrices] self.layers = [layer.copy() for layer in system.layers] self.nlayers = system.nlayers self.nchemicals = system.nchemicals self.sorptions = {} for component in self.components: self.sorptions[component.name] = {} for chemical in self.chemicals: self.sorptions[component.name][ chemical.name] = system.sorptions[component.name][ chemical.name].copy() self.BCs = {} self.ICs = {} for chemical in self.chemicals: self.BCs[chemical.name] = system.BCs[chemical.name].copy() for layer in self.layers: self.ICs[layer.name] = {} for chemical in self.chemicals: self.ICs[layer.name][chemical.name] = system.ICs[layer.name][ chemical.name].copy() if system.con == 'Consolidation': self.kcon = 2.3026 / system.t90 self.Vcon0 = self.kcon * system.hcon self.U = system.Vdar + consolidation(0, self.Vcon0, self.kcon) else: self.U = system.Vdar if system.adv == 'Tidal oscillation': self.U = self.U + system.Vtidal self.non_linear_check = 0 for component in system.component_list: for chemical in system.chemicals: self.non_linear_check = self.non_linear_check + ( system.sorptions[component][chemical.name].isotherm == 'Freundlich') self.non_linear_check = self.non_linear_check + ( system.sorptions[component][chemical.name].isotherm == 'Langmuir') if system.reactions is not None: for reaction in system.reactions: if sum([reactant.index for reactant in reaction.reactants]) > 1: self.non_linear_check = self.non_linear_check + 1 self.length_unit_converter = 1. self.time_unit_converter = 1. self.diff_unit_converter = 1. if self.lengthunit == 'm': self.length_unit_converter = self.length_unit_converter / (0.01)**2 elif self.lengthunit == u'\u03BCm': self.length_unit_converter = self.length_unit_converter / ( 10000)**2 elif self.timeunit == 's': self.time_unit_converter = self.time_unit_converter * 365.25 * 24 * 3600 if self.timeunit == 'min': self.time_unit_converter = self.time_unit_converter * 365.25 * 24 * 60 elif self.timeunit == 'hr': self.time_unit_converter = self.time_unit_converter * 365.25 * 24 elif self.timeunit == 'day': self.time_unit_converter = self.time_unit_converter * 365.25 if self.diffunit == u'cm\u00B2/s': self.diff_unit_converter = self.diff_unit_converter * 86400 * 365.25 self.ptypes = ['Uniform size', 'Uniform Number', 'User-defined'] self.tvariables = ['slowest layer', 'geometric mean', 'User-defined'] self.ptype = StringVar(value=ptype) self.tvariable = StringVar(value=tvariable) self.ptotal = IntVar(value=ptotal) #minimum grid points self.delt = DoubleVar(value=delt) #minimumu time steps self.htot = sum([layer.h for layer in self.layers]) self.D = [] self.R = [] self.players = [player for player in players] self.delz = [dz for dz in delz] self.Cmax = {} for chemical in self.chemicals: self.Cmax[chemical.name] = max( max([ self.ICs[ilayer.name][chemical.name].uniform for ilayer in self.layers ]), max([ self.ICs[ilayer.name][chemical.name].top for ilayer in self.layers ]), max([ self.ICs[ilayer.name][chemical.name].bot for ilayer in self.layers ]), self.BCs[chemical.name].Co, self.BCs[chemical.name].Cw, self.BCs[chemical.name].Cb) for i in range(system.nlayers): self.D.append([]) matrix = self.matrices[self.layers[i].type_index] for n in range(system.nchemicals): self.D[i].append(self.layers[i].get_D( self.chemicals[n].Dw * self.diff_unit_converter, self.U, matrix.e)) if self.layers[i].number < 2 and system.bio == 1: self.D[i][n] = self.D[i][n] + system.Dbiopw for component in matrix.components: self.D[i][n] = self.D[i][ n] + system.Dbiop * component.fraction * component.rho * self.sorptions[ component.name][chemical.name].get_K( component, self.Cmax[chemical.name], self.Cmax[chemical.name]) for i in range(system.nlayers): self.R.append([]) matrix = self.matrices[self.layers[i].type_index] for n in range(self.nchemicals): chemical = self.chemicals[n] Kd_rho = 0 for component in matrix.components: Kd_rho = Kd_rho + component.fraction * component.rho * self.sorptions[ component.name][chemical.name].get_K( component, self.Cmax[chemical.name], self.Cmax[chemical.name]) self.R[i].append( (matrix.e * (1 + layer.doc / (10**6) * 10**(chemical.Kdoc)) + Kd_rho) / (1 + layer.doc / (10**6) * 10**(chemical.Kdoc))) self.cancelflag = 0 if self.layers[0].number == 0: self.deplayersolveroptions = [ LayerSolverOption( self.layers[0], self.players[0], self.D[0], self.U * self.length_unit_converter * self.time_unit_converter, self.R[0], self.length_unit_converter, self.timeunit) ] self.dep = 1 else: self.dep = 0 self.deplayersolveroptions = [] self.layersolveroptions = [] for i in range(self.dep, self.nlayers): layer = self.layers[i] self.layersolveroptions.append( LayerSolverOption( layer, self.players[i], self.D[i], self.U * self.length_unit_converter * self.time_unit_converter, self.R[i], self.length_unit_converter)) def make_widgets(self): """Make the widgets.""" self.instructions = Label( self.tframe, text= 'Please specify the grid and time step options for the system: ') self.blank1 = Label(self.tframe, text=' ') self.blank2 = Label(self.bframe, text=' ') self.blank3 = Label(self.bframe, text=' ') self.blank4 = Label(self.bframe, text=' ') self.blank5 = Label(self.bframe, text=' ') self.blank6 = Label(self.bframe, text=' ') self.blank7 = Label(self.bframe, text=' ') self.leftcolumn = Label(self.tframe, text='', font='courier 10', width=5) self.layercolumn = Label(self.tframe, text='', font='courier 10', width=10) self.thickcolumn = Label(self.tframe, text='', font='courier 10', width=10) self.gridnumbercolumn = Label(self.tframe, text='', font='courier 10', width=12) self.gridsizecolumn = Label(self.tframe, text='', font='courier 10', width=10) self.penumbercolumn = Label(self.tframe, text='', font='courier 10', width=15) self.timestepcolumn = Label(self.tframe, text='', font='courier 10', width=15) self.endcolumn = Label(self.tframe, text='', font='courier 10', width=2) self.ptypelabel = Label(self.tframe, text='Grid option:', width=15) self.ptypewidget = OptionMenu(self.tframe, self.ptype, *self.ptypes, command=self.updatesolvereditor) self.ptypewidget.config(width=15) self.ptotallabel = Label(self.tframe, text='Total number of grids:', width=15) self.ptotalwidget = Label(self.tframe, textvariable=self.ptotal, width=10, justify='center') self.ptotalentry = Entry(self.tframe, textvariable=self.ptotal, width=10, justify='center') self.tvariablelabel = Label(self.tframe, text='Time step option:', width=15) self.tvariablewidget = OptionMenu(self.tframe, self.tvariable, *self.tvariables, command=self.updatesolvereditor) self.tvariablewidget.config(width=15) self.tsteplabel = Label(self.tframe, text='Time step size (' + self.timeunit + '):', width=15) self.tstepwidget = Label(self.tframe, textvariable=self.delt, width=10, justify='center') self.tstepentry = Entry(self.tframe, textvariable=self.delt, width=10, justify='center') self.layerlabel = Label(self.tframe, text='Layer') self.thicklabel = Label(self.tframe, text='Thickness') self.gridnumberlabel = Label(self.tframe, text='Number of grids') self.gridsizelabel = Label(self.tframe, text='Grid size') self.gridPelabel = Label(self.tframe, text='Max Peclet number') self.timesteplabel = Label(self.tframe, text='CFL Time Step') self.thickunit = Label(self.tframe, text=self.lengthunit) self.gridsizeunit = Label(self.tframe, text=self.lengthunit) self.timestepunit = Label(self.tframe, text=self.timeunit) self.botleftcolumn = Label(self.frame, text='', font='courier 10', width=5) self.botlayercolumn = Label(self.frame, text='', font='courier 10', width=10) self.botthickcolumn = Label(self.frame, text='', font='courier 10', width=10) self.botgridnumbercolumn = Label(self.frame, text='', font='courier 10', width=12) self.botgridsizecolumn = Label(self.frame, text='', font='courier 10', width=10) self.botpenumbercolumn = Label(self.frame, text='', font='courier 10', width=15) self.bottimestepcolumn = Label(self.frame, text='', font='courier 10', width=15) self.botendcolumn = Label(self.frame, text='', font='courier 10', width=2) self.updatebutton = Button(self.bframe, text='Update', width=20, command=self.updatesolvereditor) self.okbutton = Button(self.bframe, text='OK', width=20, command=self.OK) self.cancelbutton = Button(self.bframe, text='Cancel', width=20, command=self.Cancel) #show the widgets that don't change on the grid row = 0 self.instructions.grid(row=row, column=0, sticky='W', padx=8, columnspan=7) row = 1 self.leftcolumn.grid(row=row, column=0, sticky='WE', padx=2) self.layercolumn.grid(row=row, column=1, sticky='WE', padx=2) self.thickcolumn.grid(row=row, column=2, sticky='WE', padx=2) self.gridnumbercolumn.grid(row=row, column=3, sticky='WE', padx=2) self.gridsizecolumn.grid(row=row, column=4, sticky='WE', padx=2) self.penumbercolumn.grid(row=row, column=5, sticky='WE', padx=2) self.timestepcolumn.grid(row=row, column=6, sticky='WE', padx=2) self.endcolumn.grid(row=row, column=7, sticky='WE', padx=2) row = 2 self.ptypelabel.grid(row=row, column=0, sticky='E', padx=2, columnspan=2) self.ptypewidget.grid(row=row, column=2, sticky='W', padx=2, columnspan=2) self.ptotallabel.grid(row=row, column=4, sticky='E', padx=2, columnspan=2) row = 3 self.tvariablelabel.grid(row=row, column=0, sticky='E', padx=2, columnspan=2) self.tvariablewidget.grid(row=row, column=2, sticky='W', padx=2, columnspan=2) self.tsteplabel.grid(row=row, column=4, sticky='E', padx=2, columnspan=2) row = 4 self.blank1.grid(row=row, column=0, sticky='WE', padx=2, columnspan=7) row = 5 self.layerlabel.grid(row=row, column=1, sticky='WE', padx=2) self.thicklabel.grid(row=row, column=2, sticky='WE', padx=2) self.gridnumberlabel.grid(row=row, column=3, sticky='WE', padx=2) self.gridsizelabel.grid(row=row, column=4, sticky='WE', padx=2) self.gridPelabel.grid(row=row, column=5, sticky='WE', padx=2) self.timesteplabel.grid(row=row, column=6, sticky='WE', padx=2) row = 6 self.thickunit.grid(row=row, column=2, sticky='WE', padx=2) self.gridsizeunit.grid(row=row, column=4, sticky='WE', padx=2) self.timestepunit.grid(row=row, column=6, sticky='WE', padx=2) try: self.ptotalwidget.grid_forget() self.ptotalentry.grid_forget() self.tstepwidget.grid_forget() self.tstepentry.grid_forget() except: pass if self.ptype.get() == self.ptypes[2]: self.ptotalwidget.grid(row=2, column=6, sticky='E', padx=2) else: self.ptotalentry.grid(row=2, column=6, sticky='E', padx=2) if self.tvariable.get() == self.tvariables[2]: self.tstepentry.grid(row=3, column=6, sticky='E', padx=2) else: self.tstepwidget.grid(row=3, column=6, sticky='E', padx=2) row = 7 if self.dep == 1: layersolveroption = self.deplayersolveroptions[0] layersolveroption.propertieswidgets(self.frame, row, self.ptype.get()) row = row + 1 for i in range(self.dep, self.nlayers): layersolveroption = self.layersolveroptions[i - self.dep] layersolveroption.propertieswidgets(self.frame, row, self.ptype.get()) row = row + 1 self.botleftcolumn.grid(row=row, column=0, sticky='WE', padx=2) self.botlayercolumn.grid(row=row, column=1, sticky='WE', padx=2) self.botthickcolumn.grid(row=row, column=2, sticky='WE', padx=2) self.botgridnumbercolumn.grid(row=row, column=3, sticky='WE', padx=2) self.botgridsizecolumn.grid(row=row, column=4, sticky='WE', padx=2) self.botpenumbercolumn.grid(row=row, column=5, sticky='WE', padx=2) self.bottimestepcolumn.grid(row=row, column=6, sticky='WE', padx=2) self.botendcolumn.grid(row=row, column=7, sticky='WE', padx=2) row = row + 1 self.blank4.grid(row=row) row = row + 1 self.updatebutton.grid(row=row, columnspan=11) row = row + 1 self.okbutton.grid(row=row, columnspan=11) row = row + 1 self.cancelbutton.grid(row=row, columnspan=11) row = row + 1 self.blank5.grid(row=row) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton self.master.geometry() self.master.center() def updatesolverparameters(self): if self.ptype.get() == self.ptypes[0]: delz = self.htot / self.ptotal.get() for i in range(self.dep, self.nlayers): if self.layersolveroptions[i - self.dep].h / 5 < delz: delz = self.layersolveroptions[i - self.dep].h / 5 for n in range(self.nchemicals): if self.U != 0: delzcfl = 2. * self.D[i][n] / abs(self.U) else: delzcfl = 0 if delzcfl != 0 and delzcfl < delz: delz = delzcfl ptotal = 0 for i in range(self.dep, self.nlayers): if int(self.layers[i].h / delz) <> self.layers[i - self.dep].h / delz: self.layersolveroptions[i - self.dep].player.set( int(self.layers[i].h / delz) + 1) else: self.layersolveroptions[i - self.dep].player.set( int(self.layers[i].h / delz)) delz_temp = self.layers[i].h / self.layersolveroptions[ i - self.dep].player.get() if delz_temp > 1: self.layersolveroptions[i - self.dep].delz = ( ceil(delz_temp * 1000) / 1000) else: j = 2 while delz_temp / 100 < 0.1**j: j = j + 1 self.layersolveroptions[i - self.dep].delz = ( ceil(delz_temp * 10**j) / 10**j) try: self.layersolveroptions[i - self.dep].Pe = round( self.U * self.layersolveroptions[i - self.dep].delz / min(self.D[i]), 2) except: self.layersolveroptions[i - self.dep].Pe = 0 delt_temp = min([ self.R[i][n] * self.layersolveroptions[i - self.dep].delz**2 / 2. / self.D[i][n] for n in range(self.nchemicals) ]) if delt_temp > 1: self.layersolveroptions[i - self.dep].delt = (round( delt_temp, 3)) else: j = 2 while delt_temp / 100 < 0.1**j: j = j + 1 self.layersolveroptions[i - self.dep].delt = (round( delt_temp, j)) ptotal = ptotal + self.layersolveroptions[ i - self.dep].player.get() self.ptotal.set(ptotal) if self.dep == 1: delz = min(layersolveroption.delz for layersolveroption in self.layersolveroptions) for n in range(self.nchemicals): if self.U != 0: delzcfl = 2. * self.D[0][n] / abs(self.U) else: delzcfl = 0 if delzcfl != 0 and delzcfl < delz: delz = delzcfl if delz > 1: self.deplayersolveroptions[0].delz = (ceil(delz * 1000) / 1000) else: j = 2 while delz / 100 < 0.1**j: j = j + 1 self.deplayersolveroptions[0].delz = (ceil(delz * 10**j) / 10**j) self.deplayersolveroptions[0].player.set( round(self.deplayersolveroptions[0].h / delz, 2)) elif self.ptype.get() == self.ptypes[1]: players = [] for i in range(self.dep, self.nlayers): delz = self.layersolveroptions[i - self.dep].h / float( self.ptotal.get() / (self.nlayers - self.dep)) for n in range(self.nchemicals): if self.U != 0: delzcfl = 2. * self.D[i][n] / abs(self.U) else: delzcfl = 0 if delzcfl != 0 and delzcfl < delz: delz = delzcfl players.append( int(self.layersolveroptions[i - self.dep].h / delz)) if max(players) > self.ptotal.get() / self.nlayers: self.ptotal.set(max(players) * (self.nlayers - self.dep)) for i in range(self.dep, self.nlayers): self.layersolveroptions[i - self.dep].player.set( self.ptotal.get() / (self.nlayers - self.dep)) delz_temp = self.layers[i].h / self.layersolveroptions[ i - self.dep].player.get() if delz_temp > 1: self.layersolveroptions[i - self.dep].delz = ( ceil(delz_temp * 1000) / 1000) else: j = 2 while delz_temp / 100 < 0.1**j: j = j + 1 self.layersolveroptions[i - self.dep].delz = ( ceil(delz_temp * 10**j) / 10**j) self.layersolveroptions[i - self.dep].Pe = round( self.U * self.layersolveroptions[i - self.dep].delz / min(self.D[i]), 2) try: delt_temp = min([ self.R[i][n] * self.layersolveroptions[i - self.dep].delz**2 / 2. / self.D[i][n] for n in range(self.nchemicals) ]) except: delt_temp = 0 if delt_temp > 1: self.layersolveroptions[i - self.dep].delt = (round( delt_temp, 3)) else: j = 2 while delt_temp / 100 < 0.1**j: j = j + 1 self.layersolveroptions[i - self.dep].delt = (round( delt_temp, j)) if self.dep == 1: delz = min(layersolveroption.delz for layersolveroption in self.layersolveroptions) for n in range(self.nchemicals): if self.U != 0: delzcfl = 2. * self.D[0][n] / abs(self.U) else: delzcfl = 0 if delzcfl != 0 and delzcfl < delz: delz = delzcfl if delz > 1: self.deplayersolveroptions[0].delz = (ceil(delz * 1000) / 1000) else: j = 2 while delz / 100 < 0.1**j: j = j + 1 self.deplayersolveroptions[0].delz = (ceil(delz * 10**j) / 10**j) self.deplayersolveroptions[0].player.set( round(self.deplayersolveroptions[0].h / delz, 2)) else: for i in range(self.dep, self.nlayers): if self.layersolveroptions[i - self.dep].player.get() < 5: self.layersolveroptions[i - self.dep].player.set(5) delz_temp = self.layers[i].h / self.layersolveroptions[ i - self.dep].player.get() if delz_temp > 1: self.layersolveroptions[i - self.dep].delz = ( ceil(delz_temp * 1000) / 1000) else: j = 2 while delz_temp / 100 < 0.1**j: j = j + 1 self.layersolveroptions[i - self.dep].delz = ( ceil(delz_temp * 10**j) / 10**j) self.layersolveroptions[i - self.dep].Pe = round( self.U * self.layersolveroptions[i - self.dep].delz / min(self.D[i]), 2) try: delt_temp = min([ self.R[i][n] * self.layersolveroptions[i - self.dep].delz**2 / 2. / self.D[i][n] for n in range(self.nchemicals) ]) except: delt_temp = 0 if delt_temp > 1: self.layersolveroptions[i - self.dep].delt = (round( delt_temp, 3)) else: j = 2 while delt_temp / 100 < 0.1**j: j = j + 1 self.layersolveroptions[i - self.dep].delt = (round( delt_temp, j)) self.ptotal.set( sum([ layersolveroption.player.get() for layersolveroption in self.layersolveroptions ])) if self.dep == 1: delz_temp = self.layers[0].h / self.deplayersolveroptions[ 0].player.get() if delz_temp > 1: self.deplayersolveroptions[0].delz = ( ceil(delz_temp * 1000) / 1000) else: j = 2 while delz_temp / 100 < 0.1**j: j = j + 1 self.deplayersolveroptions[0].delz = ( ceil(delz_temp * 10**j) / 10**j) if self.tvariable.get() == self.tvariables[0]: self.delt.set( min([ self.layersolveroptions[i - self.dep].delt for i in range(self.dep, self.nlayers) ])) elif self.tvariable.get() == self.tvariables[1]: delt_temp = (min([ self.layersolveroptions[i - self.dep].delt for i in range(self.dep, self.nlayers) ]) * max([ self.layersolveroptions[i - self.dep].delt for i in range(self.dep, self.nlayers) ]))**0.5 if delt_temp > 1: self.delt.set(round(delt_temp, 3)) else: j = 2 while delt_temp / 100 < 0.1**j: j = j + 1 self.delt.set(round(delt_temp, j)) for i in range(self.dep, self.nlayers): self.delz[i] = self.layersolveroptions[i - self.dep].delz self.players[i] = self.layersolveroptions[i - self.dep].player.get() if self.dep == 1: self.delz[0] = self.deplayersolveroptions[0].delz self.players[0] = self.deplayersolveroptions[0].player.get() def updatesolvereditor(self, event=None): self.updatesolverparameters() try: self.ptotalwidget.grid_forget() self.ptotalentry.grid_forget() self.tstepwidget.grid_forget() self.tstepentry.grid_forget() except: pass if self.ptype.get() == self.ptypes[2]: self.ptotalwidget.grid(row=2, column=6, sticky='E', padx=2) else: self.ptotalentry.grid(row=2, column=6, sticky='E', padx=2) if self.tvariable.get() == self.tvariables[2]: self.tstepentry.grid(row=3, column=6, sticky='E', padx=2) else: self.tstepwidget.grid(row=3, column=6, sticky='E', padx=2) row = 7 if self.dep == 1: layersolveroption = self.deplayersolveroptions[0] layersolveroption.propertieswidgets(self.frame, row, self.ptype.get()) row = row + 1 for i in range(self.dep, self.nlayers): layersolveroption = self.layersolveroptions[i - self.dep] layersolveroption.propertieswidgets(self.frame, row, self.ptype.get()) row = row + 1 self.botleftcolumn.grid(row=row, column=0, sticky='WE', padx=2) self.botlayercolumn.grid(row=row, column=1, sticky='WE', padx=2) self.botthickcolumn.grid(row=row, column=2, sticky='WE', padx=2) self.botgridnumbercolumn.grid(row=row, column=3, sticky='WE', padx=2) self.botgridsizecolumn.grid(row=row, column=4, sticky='WE', padx=2) self.botpenumbercolumn.grid(row=row, column=5, sticky='WE', padx=2) self.bottimestepcolumn.grid(row=row, column=6, sticky='WE', padx=2) self.botendcolumn.grid(row=row, column=7, sticky='WE', padx=2) row = row + 1 self.blank4.grid(row=row) row = row + 1 self.updatebutton.grid(row=row, columnspan=11) row = row + 1 self.okbutton.grid(row=row, columnspan=11) row = row + 1 self.cancelbutton.grid(row=row, columnspan=11) row = row + 1 self.blank5.grid(row=row) self.okbutton.bind('<Return>', self.OK) self.focusbutton = self.okbutton self.master.geometry() self.master.center() def OK(self, event=None): """Finish and move on. Checks that the number chemicals are less than the total number of chemicals in database.""" #self.updatesolverparameters() self.master.tk.quit() def Cancel(self): self.cancelflag = 1 if self.master.window.top is not None: self.master.open_toplevel() else: self.master.tk.quit()
class Product: def __init__(self, number): self.number = number self.soluable = 1 def copy(self): product = Product(self.number) product.coef = self.coef product.MW = self.MW product.name = self.name product.formula = self.formula product.soluable = self.soluable return product def propertieswidgets(self, frame, row, master, chemical_list, formula_list, MW_list): self.master = master self.chemical_list = chemical_list self.formula_list = formula_list self.MW_list = MW_list self.middlelabel = Label(frame, width=8, justify='center', text=' || ') self.delwidget = Button(frame, width=5, justify='center', text='Delete', command=self.del_product) self.namewidget = OptionMenu(frame, self.name, *chemical_list, command=self.click_name) self.coefwidget = Entry(frame, width=8, justify='center', textvariable=self.coef) self.fwidget = Entry(frame, width=8, justify='center', textvariable=self.formula, font='Calibri 11') self.middlelabel.grid(row=row, column=5, padx=2, pady=1, sticky='WE') self.delwidget.grid(row=row, column=6, padx=2, pady=1) self.coefwidget.grid(row=row, column=7, padx=2, pady=1) self.namewidget.grid(row=row, column=8, padx=2, pady=1, sticky='WE') self.fwidget.grid(row=row, column=9, padx=2, pady=1, sticky='WE') def click_name(self, event=None): self.formula.set(self.formula_list[self.chemical_list.index( self.name.get())]) self.MW.set(self.MW_list[self.chemical_list.index(self.name.get())]) def del_product(self): self.master.window.delproduct(self.number) def get_product(self): self.coef = self.coef.get() self.name = self.name.get() self.formula = self.formula.get() self.MW = self.MW.get() def remove_propertieswidgets(self): self.master = 0 self.delwidget.grid_forget() self.namewidget.grid_forget() self.coefwidget.grid_forget() self.fwidget.grid_forget() self.middlelabel.grid_forget() self.delwidget = 0 self.namewidget = 0 self.coefwidget = 0 self.fwidget = 0 self.middlelabel = 0 def get_dynamic_sorption(self, chemical): self.coef = 1 self.index = 1 self.MW = chemical.MW self.name = chemical.name self.formula = '' self.soluable = 0 def get_dynamic_desorption(self, chemical): self.coef = 1 self.index = 1 self.name = chemical.name self.formula = '' self.MW = chemical.MW self.soluable = 1
class Reactant: def __init__(self, number): self.number = number self.soluable = 1 def copy(self): reactant = Reactant(self.number) reactant.coef = self.coef reactant.index = self.index reactant.name = self.name reactant.formula = self.formula reactant.MW = self.MW reactant.soluable = self.soluable return reactant def propertieswidgets(self, frame, row, master, chemical_list, formula_list, MW_list): self.master = master self.chemical_list = chemical_list self.formula_list = formula_list self.MW_list = MW_list self.delwidget = Button(frame, width=5, justify='center', text='Delete', command=self.del_reactant) self.namewidget = OptionMenu(frame, self.name, *chemical_list, command=self.click_name) self.coefwidget = Entry(frame, width=8, justify='center', textvariable=self.coef) self.fwidget = Entry(frame, width=8, justify='center', textvariable=self.formula, font='Calibri 11') self.middlelabel = Label(frame, width=8, justify='center', text=' || ') self.delwidget.grid(row=row, column=1, padx=2, pady=1) self.coefwidget.grid(row=row, column=2, padx=2, pady=1) self.namewidget.grid(row=row, column=3, padx=2, pady=1, sticky='WE') self.fwidget.grid(row=row, column=4, padx=2, pady=1, sticky='WE') self.middlelabel.grid(row=row, column=5, padx=2, pady=1, sticky='WE') def click_name(self, event=None): self.formula.set(self.formula_list[self.chemical_list.index( self.name.get())]) self.MW.set(self.MW_list[self.chemical_list.index(self.name.get())]) self.master.window.updaterateequation() def del_reactant(self): self.master.window.delreactant(self.number) def get_reactant(self): self.coef = self.coef.get() self.name = self.name.get() self.formula = self.formula.get() self.MW = self.MW.get() self.index = self.index.get() def indexwidgets(self, frame, row): self.label = Label(frame, text=self.name.get()) self.widget = Entry(frame, textvariable=self.index, width=6, justify='center') self.label.grid(row=row, column=0, padx=6, pady=2) self.widget.grid(row=row, column=1, padx=6, pady=2) def remove_indexwidgets(self): self.label.grid_forget() self.widget.grid_forget() self.label = 0 self.widget = 0 def remove_propertieswidgets(self): self.delwidget.grid_forget() self.namewidget.grid_forget() self.coefwidget.grid_forget() self.fwidget.grid_forget() self.middlelabel.grid_forget() try: self.label.grid_forget() self.widget.grid_forget() except: pass self.master = 0 self.delwidget = 0 self.namewidget = 0 self.coefwidget = 0 self.fwidget = 0 self.middlelabel = 0 self.label = 0 self.widget = 0 def get_dynamic_sorption(self, chemical, index): self.coef = 1 self.index = index self.name = chemical.name self.formula = '' self.MW = chemical.MW self.soluable = 1 def get_dynamic_desorption(self, chemical, index): self.coef = 1 self.index = index self.name = chemical.name self.formula = '' self.MW = chemical.MW self.soluable = 0
class KblEstimator: """Used to make a window to compute the value of "kbl" for Rivers.""" def __init__(self, master, version, fonttype, bltype, blcoefs): """Constructor method.""" self.version = version self.fonttype = fonttype self.tframe = Frame(master.tframe) self.frame = Frame(master.frame) self.bframe = Frame(master.bframe) self.superfont = get_superfont(self.fonttype) self.bltypes = ['River', 'Lake'] self.bltype = StringVar(value=bltype) self.top = None self.cancelflag = 0 #Parameters for Mass transfer coefficient in river self.vx = DoubleVar(value=blcoefs['vx']) self.n = DoubleVar(value=blcoefs['n']) self.hriver = DoubleVar(value=blcoefs['hriver']) self.rh = DoubleVar(value=blcoefs['rh']) self.nu = DoubleVar(value=blcoefs['nu']) #Parameters for Mass transfer coefficient in lake self.rhoair = DoubleVar(value=blcoefs['rhoair']) self.rhowater = DoubleVar(value=blcoefs['rhowater']) self.vwind = DoubleVar(value=blcoefs['vwind']) self.hlake = DoubleVar(value=blcoefs['hlake']) self.llake = DoubleVar(value=blcoefs['llake']) def make_widgets(self): """Makes the widgets for the window.""" self.bgcolor = self.frame.cget('bg') self.text = Label( self.frame, text= 'Please provide the following information regarding the benthic boundary layer:' ) self.blank1 = Label(self.frame, text='') self.blank2 = Label(self.frame, text='') self.blank3 = Label(self.frame, text='') self.blank4 = Label(self.frame, text='') self.paracolumn = Label(self.frame, text=' ', width=20) self.valuecolumn = Label(self.frame, text=' ', width=10) self.unitcolumn = Label(self.frame, text=' ', width=10) self.paralabel = Label(self.frame, text='Parameters') self.valuelabel = Label(self.frame, text='Values') self.unitlabel = Label(self.frame, text='Units') self.bllabel = Label(self.frame, text='Overlying waterbody type') self.blwidget = OptionMenu(self.frame, self.bltype, *self.bltypes, command=self.updateparameters) self.vxlabel = Label(self.frame, text='River velocity:') self.vxentry = Entry(self.frame, textvariable=self.vx, width=8, justify='center') self.vxunits = Label(self.frame, text='m/s') self.nlabel = Label(self.frame, text="Manning's n:") self.nentry = Entry(self.frame, textvariable=self.n, width=8, justify='center') self.nunits = Label(self.frame, text='-') self.hlabel = Label(self.frame, text='River depth:') self.hentry = Entry(self.frame, justify='center', width=8, textvariable=self.hriver) self.hunits = Label(self.frame, text='m') self.rhlabel = Label(self.frame, text='Hydraulic radius:') self.rhentry = Entry(self.frame, textvariable=self.rh, width=8, justify='center') self.rhunits = Label(self.frame, text='m') self.nulabel = Label(self.frame, text='Kinematic viscosity:') self.nuentry = Entry(self.frame, textvariable=self.nu, width=8, justify='center') self.nuunits = Label(self.frame, text=u'm\u00B2/s') self.rhoairlabel = Label(self.frame, text='Density of air:') self.rhoairentry = Entry(self.frame, textvariable=self.rhoair, width=8, justify='center') self.rhoairunits = Label(self.frame, text='g/L') self.rhowaterlabel = Label(self.frame, text='Density of water:') self.rhowaterentry = Entry(self.frame, textvariable=self.rhowater, width=8, justify='center') self.rhowaterunits = Label(self.frame, text='g/L') self.vwindlabel = Label(self.frame, text='Wind speed:') self.vwindentry = Entry(self.frame, textvariable=self.vwind, width=8, justify='center') self.vwindunits = Label(self.frame, text='m/s') self.hlakelabel = Label(self.frame, text='Lake depth:') self.hlakeentry = Entry(self.frame, textvariable=self.hlake, width=8, justify='center') self.hlakeunits = Label(self.frame, text='m') self.lakelabel = Label(self.frame, text='Lake fetch:') self.lakeentry = Entry(self.frame, textvariable=self.llake, width=8, justify='center') self.lakeunits = Label(self.frame, text='m') self.calcbutton = Button(self.frame, text='Calculate', width=20, command=self.calculate) self.exitbutton = Button(self.frame, text='Cancel', width=20, command=self.exit) self.calcbutton.bind('<Return>', self.calculate) self.exitbutton.bind('<Return>', self.exit) self.text.grid(row=0, columnspan=3, padx=8) self.blank1.grid(row=1) self.paracolumn.grid(row=2, column=0, sticky='WE') self.valuecolumn.grid(row=2, column=1, sticky='WE') self.unitcolumn.grid(row=2, column=2, sticky='WE') self.paralabel.grid(row=3, column=0, sticky='E') self.valuelabel.grid(row=3, column=1, sticky='WE') self.unitlabel.grid(row=3, column=2, sticky='W') self.bllabel.grid(row=4, column=0, sticky='E') self.blwidget.grid(row=4, column=1, sticky='WE') self.blank2.grid(row=10) self.calcbutton.grid(row=11, columnspan=3, pady=1) self.exitbutton.grid(row=12, columnspan=3, pady=1) self.focusbutton = self.calcbutton self.updateparameters() def updateparameters(self, event=None): try: self.vxlabel.grid_forget() self.vxentry.grid_forget() self.vxunits.grid_forget() self.nlabel.grid_forget() self.nentry.grid_forget() self.nunits.grid_forget() self.hlabel.grid_forget() self.hentry.grid_forget() self.hunits.grid_forget() self.rhlabel.grid_forget() self.rhentry.grid_forget() self.rhunits.grid_forget() self.nulabel.grid_forget() self.nuentry.grid_forget() self.nuunits.grid_forget() except: pass try: self.rhoairlabel.grid_forget() self.rhoairentry.grid_forget() self.rhoairunits.grid_forget() self.rhowaterlabel.grid_forget() self.rhowaterentry.grid_forget() self.rhowaterunits.grid_forget() self.vwindlabel.grid_forget() self.vwindentry.grid_forget() self.vwindunits.grid_forget() self.hlakelabel.grid_forget() self.hlakeentry.grid_forget() self.hlakeunits.grid_forget() self.lakelabel.grid_forget() self.lakeentry.grid_forget() self.lakeunits.grid_forget() except: pass if self.bltype.get() == self.bltypes[0]: self.vxlabel.grid(row=5, column=0, sticky='E', padx=4) self.vxentry.grid(row=5, column=1) self.vxunits.grid(row=5, column=2, sticky='W') self.nlabel.grid(row=6, column=0, sticky='E', padx=4) self.nentry.grid(row=6, column=1) self.nunits.grid(row=6, column=2, sticky='W') self.hlabel.grid(row=7, column=0, sticky='E', padx=4) self.hentry.grid(row=7, column=1) self.hunits.grid(row=7, column=2, sticky='W') self.rhlabel.grid(row=8, column=0, sticky='E', padx=4) self.rhentry.grid(row=8, column=1) self.rhunits.grid(row=8, column=2, sticky='W') self.nulabel.grid(row=9, column=0, sticky='E', padx=4) self.nuentry.grid(row=9, column=1) self.nuunits.grid(row=9, column=2, sticky='W') else: self.rhoairlabel.grid(row=5, column=0, sticky='E', padx=4) self.rhoairentry.grid(row=5, column=1) self.rhoairunits.grid(row=5, column=2, sticky='W') self.rhowaterlabel.grid(row=6, column=0, sticky='E', padx=4) self.rhowaterentry.grid(row=6, column=1) self.rhowaterunits.grid(row=6, column=2, sticky='W') self.vwindlabel.grid(row=7, column=0, sticky='E', padx=4) self.vwindentry.grid(row=7, column=1) self.vwindunits.grid(row=7, column=2, sticky='W') self.hlakelabel.grid(row=8, column=0, sticky='E', padx=4) self.hlakeentry.grid(row=8, column=1) self.hlakeunits.grid(row=8, column=2, sticky='W') self.lakelabel.grid(row=9, column=0, sticky='E', padx=4) self.lakeentry.grid(row=9, column=1) self.lakeunits.grid(row=9, column=2, sticky='W') def calculate(self, event=None): """Finish and move on.""" self.frame.quit() def exit(self, event=None): """Used to close the window without computing kbl.""" self.cancelflag = 1 self.frame.quit()