Skip to content
Snippets Groups Projects
page1_simulation.py 14.2 KiB
Newer Older
Pierre Saramito's avatar
Pierre Saramito committed
from tkinter import *
from tkinter import ttk
from vertical_canvas import *
from lavaview_variable import *
import os
import functools
import pymap

dark_grey = "#282827"
light_grey = "#484845"

class page1():
	"""
	A class to create the first page about the domain
	"""
	def __init__(self, parent, mytitle, *args, **kw):
		self.parent=parent
Noe Bernabeu's avatar
Noe Bernabeu committed
		#self.dir_path = os.path.dirname(os.path.abspath(__file__))
Pierre Saramito's avatar
Pierre Saramito committed
		f = parent.n.add(mytitle)
		parent.n.tab(mytitle).configure(background=dark_grey,fg="white")
		self.scrollable_canvas  = VerticalScrolledFrame(f)
		self.scrollable_canvas.pack(fill = 'both', expand = 1)
		parent.n.tab(mytitle).bind('<1>',self.reset_the_view,add="+") #reset the view after click on tabs
		main_window = self.scrollable_canvas.interior
		# Create a frame to center all widgets
		center_Frame = Frame(main_window)
		center_Frame.pack()
		center_Frame.configure(borderwidth=0, bg=dark_grey)
		Label(center_Frame,text="Simulation domain setting",font=("Helvetica", 16, "bold"), bg=dark_grey, fg= "white").grid(row=0,column=0,columnspan=3,padx = 5, pady = 5)
		Label(center_Frame,text="Select DEM", bg=dark_grey, fg= "white").grid(row=1,column=0,padx = 5, pady = 5)
		self.select_map = Listbox(center_Frame,height=3,exportselection=False,selectmode='single')
		self.select_map.insert('end', "Reunion island (2008)")
		self.select_map.insert('end', "Kilauea lava flow (1974)")
		self.select_map.insert('end', "Etna (2001)")
		self.select_map.grid(sticky = "w", row=1, column=1, columnspan = 2, padx = 5, pady = 5)
		self.selected_item = IntVar()
		self.selected_item.set(0)
		self.select_map.select_set(self.selected_item.get())
		self.select_map.bind("<<ListboxSelect>>", self.updateLabel)
		self.xmin = 0
		self.xmax = 0
		self.ymin = 0
		self.ymax = 0
		self.utm_zone = Lavaview_variable(center_Frame,"UTM grid zone", "UTM grid zone (<< longitudinal zone number >><< latitudinal zone letter >>, \n ex: the southern end of South America is 19F)","40K",2,0,dark_grey)
		self.main_vent_xe_variable = Lavaview_scale_variable(center_Frame,0,1000,1,1,"main vent position E (UTM coordinates)","the main vent position E in UTM coordinates (m)", 0,3,0,dark_grey)
		self.main_vent_ye_variable = Lavaview_scale_variable(center_Frame,0,1000,1,1,"main vent position N (UTM coordinates)","the main vent position N in UTM coordinates (m)", 0,4,0,dark_grey)
		self.south_variable = Lavaview_scale_variable(center_Frame,0,1000,100,1,"south","south extension", 1000,5,0,dark_grey)
		self.est_variable = Lavaview_scale_variable(center_Frame,0,1000,100,1,"est","est extension",1000,6,0,dark_grey)
		self.north_variable = Lavaview_scale_variable(center_Frame,0,1000,100,1,"north","north extension", 1000,7,0,dark_grey)
		self.west_variable = Lavaview_scale_variable(center_Frame,0,1000,100,1,"west", "west extension", 1000,8,0,dark_grey)
		self.main_vent_xe_variable.Myvar.trace("w", self.callback_trace_xe)
		self.main_vent_ye_variable.Myvar.trace("w", self.callback_trace_ye)
		self.south_variable.Myvar.trace("w", self.callback_trace_south)
		self.est_variable.Myvar.trace("w", self.callback_trace_est)
		self.north_variable.Myvar.trace("w", self.callback_trace_north)
		self.west_variable.Myvar.trace("w", self.callback_trace_west)
		self.main_vent_xe_variable.Myscale.config(command=self.callback_scale_xe)
		self.main_vent_ye_variable.Myscale.config(command=self.callback_scale_ye)
		self.south_variable.Myscale.config(command=self.callback_scale_south)
		self.est_variable.Myscale.config(command=self.callback_scale_est)
		self.north_variable.Myscale.config(command=self.callback_scale_north)
		self.west_variable.Myscale.config(command=self.callback_scale_west)
		self.main_vent_xe_variable.MyEntry.bind('<FocusOut>', self.controle_value_xe)
		self.main_vent_ye_variable.MyEntry.bind('<FocusOut>', self.controle_value_ye)
		self.south_variable.MyEntry.bind('<FocusOut>', functools.partial(self.controle_value, variable=self.south_variable))
		self.est_variable.MyEntry.bind('<FocusOut>', functools.partial(self.controle_value, variable=self.est_variable))
		self.north_variable.MyEntry.bind('<FocusOut>', functools.partial(self.controle_value, variable=self.north_variable))
		self.west_variable.MyEntry.bind('<FocusOut>', functools.partial(self.controle_value, variable=self.west_variable))
		self.reso_variable = Lavaview_variable(center_Frame,"resolution", "resolution of DEM (m)", 10,9,0,dark_grey)
		self.message_Label=Label(main_window, bg=dark_grey, fg= "white")
		self.updateLabel() #default value (reunion volcano)
		Frame_for_button=Frame(main_window,bg=dark_grey)
		Frame_for_button.pack(padx = 5, pady = 5)
		generate_mesh_button = ttk.Button(Frame_for_button, text = 'Generate mesh and DEM files', command =  lambda:self.generate_mesh_command(parent))
		generate_mesh_button.grid(row=0,column=0, padx = 5, pady = 5)
		view_DEM_button = ttk.Button(Frame_for_button, text = 'View DEM with Paraview', command = self.view_DEM)
		view_DEM_button.grid(row=0,column=1, padx = 5, pady = 5)
		view_map_button = ttk.Button(center_Frame, text = 'View map', command = self.view_map)
		view_map_button.grid(row=9,column=2, padx = 5, pady = 5)
		next_from_1_to_2 = ttk.Button(Frame_for_button, text = 'Next', command = lambda:parent.n.nextpage())
		next_from_1_to_2.grid(row=1,column=0, columnspan=2, padx = 5, pady = 25)
	def reset_the_view(self, event):
		self.scrollable_canvas.canvas.xview_moveto(0)
		self.scrollable_canvas.canvas.yview_moveto(0)
Noe Bernabeu's avatar
Noe Bernabeu committed
	"""def update_DEM_limit(self):  # update values of xmin,xmax,ymin,ymax
Pierre Saramito's avatar
Pierre Saramito committed
		path = self.parent.parent.dir_path
		if self.selected_item.get()==0:
			self.xmin=float(os.popen("head -n 1 "+path+"/reunion_5m_volcano.xyz | awk \'{print $1}\'").read().rstrip())
			self.xmax=float(os.popen("tail -n 1 "+path+"/reunion_5m_volcano.xyz | awk \'{print $1}\'").read().rstrip())
			self.ymin=float(os.popen("tail -n 1 "+path+"/reunion_5m_volcano.xyz | awk \'{print $2}\'").read().rstrip())
			self.ymax=float(os.popen("head -n 1 "+path+"/reunion_5m_volcano.xyz | awk \'{print $2}\'").read().rstrip())
			self.utm_zone.Myvar.set("40K")
		elif self.selected_item.get()==1:
			self.xmin=float(os.popen("head -n 1 "+path+"/kilauea1974_2m.xyz | awk \'{print $1}\'").read().rstrip())
			self.xmax=float(os.popen("tail -n 1 "+path+"/kilauea1974_2m.xyz | awk \'{print $1}\'").read().rstrip())
			self.ymin=float(os.popen("tail -n 1 "+path+"/kilauea1974_2m.xyz | awk \'{print $2}\'").read().rstrip())
			self.ymax=float(os.popen("head -n 1 "+path+"/kilauea1974_2m.xyz | awk \'{print $2}\'").read().rstrip())
			self.utm_zone.Myvar.set("5Q")
		elif self.selected_item.get()==2:
			self.xmin=float(os.popen("head -n 1 "+path+"/etna2001_10m.xyz | awk \'{print $1}\'").read().rstrip())
			self.xmax=float(os.popen("tail -n 1 "+path+"/etna2001_10m.xyz | awk \'{print $1}\'").read().rstrip())
			self.ymin=float(os.popen("tail -n 1 "+path+"/etna2001_10m.xyz | awk \'{print $2}\'").read().rstrip())
			self.ymax=float(os.popen("head -n 1 "+path+"/etna2001_10m.xyz | awk \'{print $2}\'").read().rstrip())
Noe Bernabeu's avatar
Noe Bernabeu committed
			self.utm_zone.Myvar.set("33S")"""
Pierre Saramito's avatar
Pierre Saramito committed
	def update_scale(self,variable,min_value,max_value):
		if (variable.min_scale_value.get()!=min_value) or (variable.max_scale_value.get()!=max_value):
			variable.min_scale_value.set(min_value)
			variable.max_scale_value.set(max_value)
			variable.my_interval = (max_value - min_value)/1.0
			variable.Myscale.config(from_=min_value, to=max_value,tickinterval=variable.my_interval)
			variable.Myvar.set(str(0.5*(max_value+min_value)))
	def update_vent_position(self):
		xmin=self.xmin
		xmax=self.xmax
		ymin=self.ymin
		ymax=self.ymax
		self.update_scale(self.main_vent_xe_variable,xmin,xmax)
		self.update_scale(self.main_vent_ye_variable,ymin,ymax)
	def update_scale_cardinaux(self):
		xe=float(self.main_vent_xe_variable.Myvar.get())
		ye=float(self.main_vent_ye_variable.Myvar.get())
		xmin=self.xmin
		xmax=self.xmax
		ymin=self.ymin
		ymax=self.ymax
		self.update_scale(self.south_variable,0,ye-ymin)
		self.update_scale(self.est_variable,0,xmax-xe)
		self.update_scale(self.north_variable,0,ymax-ye)
		self.update_scale(self.west_variable,0,xe-xmin)
	def updateLabel(self, event=None): # event when choose DEM
		print("change of DEM")
		line = self.select_map.curselection()[0]
		self.selected_item.set(line)
Noe Bernabeu's avatar
Noe Bernabeu committed
		#self.update_DEM_limit()
Pierre Saramito's avatar
Pierre Saramito committed
		self.update_vent_position()
		self.update_scale_cardinaux()
	def inside_callback_trace(self,variable):
		if (variable.Myvar.get()!=""):
			try:
				variable.Myscalevar.set(float(variable.Myvar.get()))
				self.update_xe_vents_p3(self.main_vent_xe_variable.Myscalevar.get())
				self.update_ye_vents_p3(self.main_vent_ye_variable.Myscalevar.get())
			except:
				variable.Myvar.set(str(variable.Myscalevar.get()))
	def callback_trace_xe(self,*args):
		if (self.main_vent_xe_variable.Myvar.get()!=""):
			try:
				self.main_vent_xe_variable.Myscalevar.set(float(self.main_vent_xe_variable.Myvar.get()))
				self.modif_from_xe(self.main_vent_xe_variable.Myscalevar.get())
			except:
				self.main_vent_xe_variable.Myvar.set(str(self.main_vent_xe_variable.Myscalevar.get()))
	def callback_trace_ye(self,*args):
		if (self.main_vent_ye_variable.Myvar.get()!=""):
			try:
				self.main_vent_ye_variable.Myscalevar.set(float(self.main_vent_ye_variable.Myvar.get()))
				self.modif_from_ye(self.main_vent_ye_variable.Myscalevar.get())
			except:
				self.main_vent_ye_variable.Myvar.set(str(self.main_vent_ye_variable.Myscalevar.get()))
	def callback_trace_south(self,*args):
		self.inside_callback_trace(self.south_variable)
	def callback_trace_est(self,*args):
		self.inside_callback_trace(self.est_variable)
	def callback_trace_north(self,*args):
		self.inside_callback_trace(self.north_variable)
	def callback_trace_west(self,*args):
		self.inside_callback_trace(self.west_variable)

	def controle_value(self,event=None,variable=None):
		if (event!='mouv_scale') and (float(variable.Myvar.get())==variable.Myscalevar.get()):
			return False
		else:
			variable.Myvar.set(str(variable.Myscalevar.get()))
			return True
	def callback_scale_xe(self,*args):
		self.controle_value_xe('mouv_scale')
	def callback_scale_ye(self,*args):
		self.controle_value_ye('mouv_scale')
	def callback_scale_south(self,*args):
		self.controle_value('mouv_scale',self.south_variable)
	def callback_scale_est(self,*args):
		self.controle_value('mouv_scale',self.est_variable)
	def callback_scale_north(self,*args):
		self.controle_value('mouv_scale',self.north_variable)
	def callback_scale_west(self,*args):
		self.controle_value('mouv_scale',self.west_variable)
	def update_xe_vents_p3(self,xe):
		est = float(self.est_variable.Myvar.get())
		west = float(self.west_variable.Myvar.get())
		xmin_value = xe-west
		xmax_value = xe+est
		for vent in self.parent.p3.hot_spot_Frame.vent_frame_list:
			self.update_scale(vent.xe_variable,xmin_value,xmax_value)
		self.parent.p3.hot_spot_Frame.vent_frame_list[0].xe_variable.Myvar.set(self.main_vent_xe_variable.Myvar.get())
	def modif_from_xe(self,xe):
		xmin=self.xmin
		xmax=self.xmax
		self.update_scale(self.west_variable,0,xe-xmin)
		self.update_scale(self.est_variable,0,xmax-xe)
		self.update_xe_vents_p3(xe)
	def update_ye_vents_p3(self,ye):
		south = float(self.south_variable.Myvar.get())
		north = float(self.north_variable.Myvar.get())
		ymin_value = ye-south
		ymax_value = ye+north
		for vent in self.parent.p3.hot_spot_Frame.vent_frame_list:
			self.update_scale(vent.ye_variable,ymin_value,ymax_value)
		self.parent.p3.hot_spot_Frame.vent_frame_list[0].ye_variable.Myvar.set(self.main_vent_ye_variable.Myvar.get())
	def modif_from_ye(self,ye):
		ymin=float(self.ymin)
		ymax=float(self.ymax)
		self.update_scale(self.south_variable,0,ye-ymin)
		self.update_scale(self.north_variable,0,ymax-ye)
		self.update_ye_vents_p3(ye)
	def controle_value_xe(self,event=None):
		if self.controle_value(event,self.main_vent_xe_variable):
			self.modif_from_xe(float(self.main_vent_xe_variable.Myvar.get()))
	def controle_value_ye(self,event=None):
		if self.controle_value(event,self.main_vent_ye_variable):
			self.modif_from_ye(float(self.main_vent_ye_variable.Myvar.get()))

	def write_domain_input(self):
		xe = float(self.main_vent_xe_variable.Myvar.get())
		ye = float(self.main_vent_ye_variable.Myvar.get())
		south = float(self.south_variable.Myvar.get())
		est = float(self.est_variable.Myvar.get())
		north = float(self.north_variable.Myvar.get())
		west = float(self.west_variable.Myvar.get())
		reso = float(self.reso_variable.Myvar.get())
		xmin = xe-west
		xmax = xe+est
		ymin = ye-south
		ymax = ye+north
		os.makedirs('tmp', exist_ok=True)
		my_file = open("tmp/domain_input.gdat", "w") # erase file
		my_file.write(str(xe)+" ")
		my_file.write(str(ye)+" ")
		my_file.write(str(south)+ " ")
		my_file.write(str(est)+ " ") 
		my_file.write(str(north)+ " ")
		my_file.write(str(west)+ " ")
		my_file.write(str(reso)+ " ")
		my_file.write(str(xmin)+ " ")
		my_file.write(str(xmax)+ " ")
		my_file.write(str(ymin)+ " ")
		my_file.write(str(ymax))
		my_file.close()
	def generate_mesh_command(self, parent):
		print("Generated of mesh (.geo) and DEM (.field)")
		self.message_Label.pack_forget()
		self.message_Label.config(text="It may take a few minutes ...")
		self.message_Label.pack()
		parent.configure(cursor='watch')
		parent.update_idletasks()
		parent.update()
		self.write_domain_input()
		if self.selected_item.get()==0:
			os.system("sh "+self.dir_path+"/simulation_domain_fournaise_5m.sh \""+self.dir_path+"\"")
			os.system(self.dir_path+"/smooth_DEM grille.geo P1 5 DEM_fournaise_5m.field  > fh_smooth.field")
		elif self.selected_item.get()==1:
			os.system("sh "+self.dir_path+"/simulation_domain_kilauea_2m.sh")
			os.system(self.dir_path+"/smooth_DEM grille.geo P1 5 DEM_hawaii_2m.field  > fh_smooth.field")
		elif self.selected_item.get()==2:
			os.system("sh "+self.dir_path+"/simulation_domain_etna2001_10m.sh")
			os.system(self.dir_path+"/smooth_DEM grille.geo P1 1 DEM_etna_10m.field  > fh_smooth.field")
		os.system("field fh_smooth.field -paraview -noclean -noexecute")
		os.system("rm fh_smooth.py")
		self.message_Label.config(text="mesh and DEM created")
		parent.configure(cursor='')
	def view_DEM(self):
		print("open DEM with paraview")
		os.system("paraview fh_smooth.vtk")
	def view_map(self):
		osm = pymap.mymap(self.utm_zone.Myvar.get(), self.xmin,self.xmax,self.ymin,self.ymax,self.south_variable,self.est_variable,self.north_variable,self.west_variable,self.parent.p3.hot_spot_Frame.vent_frame_list, self.parent.p5.shape_filename)