# -*- coding: iso-8859-1 -*- # #------------------------------------------------------------------------------- # Code_Saturne version 1.3 # ------------------------ # # # This file is part of the Code_Saturne User Interface, element of the # Code_Saturne CFD tool. # # Copyright (C) 1998-2007 EDF S.A., France # # contact: saturne-support@edf.fr # # The Code_Saturne User Interface is free software; you can redistribute it # and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # The Code_Saturne User Interface is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied warranty # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with the Code_Saturne Kernel; if not, write to the # Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301 USA # #------------------------------------------------------------------------------- """ Start/Restart batch analysis """ #------------------------------------------------------------------------------- # Library modules import #------------------------------------------------------------------------------- import os, sys import string, types import Tix from Tkconstants import * import tkFileDialog, tkMessageBox #------------------------------------------------------------------------------- # Application modules import #------------------------------------------------------------------------------- from Base.Common import * import Base.Toolbox as Tool import Base.Dialog as Dialog import Base.TkPage as TkPage from BatchRunningModel import BatchRunningModel #------------------------------------------------------------------------------- # Popup window class: Validator Class #------------------------------------------------------------------------------- class AsciiValidator(TkPage.DataValidator2): """ """ def isAscii(self, entry, var): """ This method verify that value is an ascii string """ try: toto = str(var) return 1 except: return self.error(entry) return 0 #------------------------------------------------------------------------------- # Popup window class: Data and results user files #------------------------------------------------------------------------------- class UserFilesDialog(Dialog.Dialog): """ All dirty stuff is done by the Dialog module """ def setListbox(self, num, list): """ Add data and results files input in entries in the good list. """ # 1) Which key is it ? # if num == 0: key = 'data' elif num == 1: key = 'results' else: self.e[num].delete(0,END) return for item in list: # 2) Verify that the input is not allready in the Listbox # if item in self.result[key]: t = PageText() tkMessageBox.showwarning (t.WARNING, t.MSG_ALLREADY) self.e[num].delete(0,END) else: # 3) Update element # ## self.result[key] = self.result[key] + (str(item)) self.result[key].append(str(item)) # 4) Update Listbox, clean entry # self.l[num].listbox.insert(END, item) self.e[num].delete(0,END) def getFilesName(self, num, var, event=None): """ Add data and results users files input in entries in the good list. """ list = string.split(var.get()) if not list: return # Verify for User data files if they exist in self.case[data_path] # if num == 0: for item in list: if file not in os.listdir(self.default['data_path']): self.e[num].bell() self.e[num].selection_range(0,END) self.e[num].config(selectbackground='red') t = PageText() tt = t.ERR_DATA_FILE + self.default['data_path'] \ + '\n\n' + item + '\n\n' + t.MSG_IDENTITY tkMessageBox.showwarning(t.WARNING, tt) self.setListbox(num, list) def searchUserFiles(self, event=None): """ Add data users files input in entries in the good list. """ file_name = "" tk_fopen = tkFileDialog.askopenfilename dir=os.getcwd() if os.path.isdir(dir + "/../DATA"): dir = dir + "/../DATA" file_name = tk_fopen (title="Search user data files.", initialdir=dir, filetypes=[("User data files", "*"), ("All files", "*")]) if file_name: file = os.path.basename(file_name) list = string.split(file) if not list: return num = 0 self.setListbox(num, list) def killSelection(self, num, event=None): """ Delete the selection from the listbox (one by one). """ # 1) Is there something to delete ? # item = self.l[num].listbox.curselection() if not item: return # 2) Delete item from listbox # index = int(item[0]) self.l[num].listbox.delete(index) # 3) Delete item from self.result # if num == 0: del self.result['data'][index] elif num == 1: del self.result['results'][index] def body(self, master): """ Processors number and list selection. """ # Main initialization # t = PageText() # Variables declaration # self.data = Tix.StringVar() self.resu = Tix.StringVar() # Results from window initialization # self.result = {} self.result['data'] = [] self.result['results'] = [] # Popup window layout # self.imgs = Tix.PhotoImage(file=PIC_PATH+'skull.gif') self.imgc = Tix.PhotoImage(file=PIC_PATH+'cardfile.gif') # Display the two listbox # f = [0]*2 g = [0]*2 h = [0]*2 self.l = [0]*2 self.e = [0]*2 b = [0]*2 for (num, txt1, txt2, var) in \ [(0, t.USER_DATA_LIST, t.USER_DATA_NEW, self.data), (1, t.USER_RESU_LIST, t.USER_RESU_NEW, self.resu)]: f[num] = Tix.LabelFrame(master, label=txt1, bd=2) f[num].label.config(font=fT) f[num].pack(side=TOP, expand=YES, padx=10, pady=2) w1 = f[num].frame self.l[num] = Tix.ScrolledListBox(w1, scrollbar='auto', width=200, height=60) self.l[num].pack(side=TOP, expand=YES, padx=4, pady=10) self.l[num].vsb.config(width=10, bd=1) self.l[num].hsb.config(width=10, bd=1) g[num] = Tix.Frame(w1, relief=FLAT) g[num].pack(side=TOP, fill=BOTH) w2 = g[num] h[num] = Tix.Label(w2, text=txt2) h[num].grid(row=0, column=0, padx=4, sticky=W) self.e[num] = Tix.Entry(w2, width=20, textvariable=var) self.e[num].bind("", TkPage.Callback(self.getFilesName,num,var)) self.e[num].grid(row=1, column=0, padx=4) self.e[num].delete(0,END) # Kill buttons # b[num] = Tix.Button(w2, image=self.imgs, command=TkPage.Callback(self.killSelection,num)) b[num].grid(row=1, column=1, padx=2, pady=1) #self.balloon.bind_widget(b[num], balloonmsg=t.DELETE) # Kill buttons # if num == 0: b1 = Tix.Button(w2, image=self.imgc, command=self.searchUserFiles) b1.grid(row=0, column=1, padx=2, pady=1) #self.balloon.bind_widget(b1, statusmsg=t.DELETE) # Previous values # for (i,s) in [(0,'data'), (1,'results')]: try: if self.default[s]: self.setListbox(i, self.default[s]) except: pass def validate(self): """ Verify if data and results users files input exit in the good directory. """ num = 0 s = "" for item in self.result['data']: file = self.default['data_path'] +'/'+ item if not os.path.isfile(file): s = s + item + '\n' if s: self.e[num].bell() t = PageText() s = '\n\n' + s + '\n' tt = t.ERR_DATA_FILE + self.default['data_path'] +s+ t.MSG_IDENTITY tkMessageBox.showwarning(t.WARNING, tt) return 1 def sequence(self): """ Bind the dialog window with only 'Echap' (delete sequence 'Return', because of the Tix.Control.entry). """ self.bind("", self.cancel) #------------------------------------------------------------------------------- # Popup window class: Cluster job management #------------------------------------------------------------------------------- class PBSJobManagementDialog(Dialog.Dialog): """ All dirty stuff is done by Dialog module """ def jobName(self, entry, event=None): """ Delete Blank in the job name """ v = string.join(string.split(self.job_name.get()),'_') self.job_name.set(v) entry.selection_range(0,END) entry.config(selectbackground='green') def getValue(self, entry, var, step=None, event=None): """ Incremente, decremente and colorize the input argument entry """ if step: v= var.get() var.set(v+step) entry.config(selectbackground='green') entry.selection_range(0,END) def body(self, master): """ Processors number and list selection. """ # Main initialization # t = PageText() # Variables declaration # self.job_name = Tix.StringVar() self.cluster_node = Tix.IntVar() self.cluster_ppn = Tix.IntVar() self.h_cput = Tix.IntVar() self.m_cput = Tix.IntVar() self.s_cput = Tix.IntVar() self.job_mem = Tix.IntVar() # Popup window layout # lf = Tix.LabelFrame(master, bd=2, label=t.JOB, relief=FLAT) lf.label.config(font=fT) lf.pack(side=TOP, expand=YES, padx=5, pady=5) f = lf.frame f1 = Tix.Frame(f,bd=2, relief=FLAT) f1.pack(side=TOP, anchor=W) le = Tix.LabelEntry(f1, bd=2, label=t.JOB_NAME) le.entry.config(width=20, textvariable = self.job_name) le.entry.bind('', TkPage.Callback(self.jobName, le.entry)) le.grid(row=0, column=0, sticky=W, padx=5, pady=10) f2 = Tix.Frame(f, bd=2, relief=FLAT) f2.pack(side=TOP, anchor=W) e1=[0]*2 M=[16,2] for (num, var, tt) in [(0, self.cluster_node, t.CL_NODES), (1, self.cluster_ppn, t.CL_PPN) ]: e1[num] = Tix.Control(f2, label=tt, bd=2, value='1', min=1, max=M[num], integer=1, selectmode='normal', variable=var) e1[num].entry.config(width=3) e1[num].entry.bind('',TkPage.Callback(self.getValue, e1[num].entry, var, 0)) e1[num].decr.bind('',TkPage.Callback(self.getValue, e1[num].entry, var, -1)) e1[num].incr.bind('',TkPage.Callback(self.getValue, e1[num].entry, var, 1)) e1[num].grid(row=0, column=num, padx=5, pady=10, sticky=W) f3 = Tix.Frame(f, relief=FLAT) f3.pack(side=TOP, anchor=W) l2 = Tix.Label(f3, text=t.CPU_TIME) l2.grid(row=0, column=0, padx=5, pady=10, sticky=W) e2=[0]*3 M=[999,59,59] for (num, c, var, tt) in [(0, 1, self.h_cput, " h "), (1, 3, self.m_cput, " mn ") , (2, 5, self.s_cput, " s ") ]: e2[num] = Tix.Control(f3, label=tt, bd=2, value='0', min=0, max=M[num], integer=1, selectmode='normal', variable=var) e2[num].entry.config(width=3) e2[num].entry.bind('',TkPage.Callback(self.getValue, e2[num].entry, var, 0)) e2[num].decr.bind('',TkPage.Callback(self.getValue, e2[num].entry, var, -1)) e2[num].incr.bind('',TkPage.Callback(self.getValue, e2[num].entry, var, 1)) e2[num].grid(row=0, column=c, padx=2, pady=10, sticky=W) f4 = Tix.Frame(f, relief=FLAT) f4.pack(side=TOP, anchor=W) S = 10 e3 = Tix.Control(f4, label=t.JOB_MEM, bd=2, value='100', min=1, max=9999999, step=S, integer=1, selectmode='normal', variable=self.job_mem) e3.entry.config(width=10) e3.entry.bind('',TkPage.Callback(self.getValue, e3.entry, self.job_mem, 0)) e3.decr.bind('',TkPage.Callback(self.getValue, e3.entry, self.job_mem, -S)) e3.incr.bind('',TkPage.Callback(self.getValue, e3.entry, self.job_mem, S)) e3.grid(row=0, column=0, padx=5, pady=10, sticky=W) # Previous values # try: self.job_name.set(self.default['job_name']) self.cluster_node.set(self.default['PBS_node']) self.cluster_ppn.set(self.default['PBS_ppn']) self.job_mem.set(self.default['PBS_mem']) L = string.split(self.default['PBS_cput'], ":") self.h_cput.set(L[0]) self.m_cput.set(L[1]) self.s_cput.set(L[2]) except: pass def apply(self): """ What to do when user clicks on 'OK'. """ self.result = {} self.result['job_name'] = self.job_name.get() self.result['PBS_node'] = self.cluster_node.get() self.result['PBS_ppn'] = self.cluster_ppn.get() self.result['PBS_cput'] = str(self.h_cput.get()) + ":" \ + str(self.m_cput.get()) + ":" \ + str(self.s_cput.get()) self.result['PBS_mem'] = self.job_mem.get() def sequence(self): """ Bind the dialog window with only 'Echap' (delete sequence 'Return', because of the Tix.Control.entry). """ self.bind("", self.cancel) #------------------------------------------------------------------------------- # Popup window class: Cluster job management #------------------------------------------------------------------------------- class LSFJobManagementDialog(Dialog.Dialog): """ All dirty stuff is done by the Dialog module """ def jobName(self, entry, event=None): """ Delete blank in the job name """ v = string.join(string.split(self.job_name.get()),'_') self.job_name.set(v) entry.selection_range(0,END) entry.config(selectbackground='green') def getValue(self, entry, var, step=None, event=None): """ Incremente, decremente and colorize the input argument entry """ if step: v= var.get() var.set(v+step) entry.config(selectbackground='green') entry.selection_range(0,END) def body(self, master): """ Processors number and list selection. """ # Main initialization # t = PageText() # Variables declaration # self.job_name = Tix.StringVar() self.cput = Tix.IntVar() self.cpuT = Tix.IntVar() self.job_mem = Tix.IntVar() # Popup window layout # lf = Tix.LabelFrame(master, bd=2, label=t.JOB, relief=FLAT) lf.label.config(font=fT) lf.pack(side=TOP, expand=YES, padx=5, pady=5) f = lf.frame f1 = Tix.Frame(f, bd=2, relief=FLAT) f1.pack(side=TOP, anchor=W) le = Tix.LabelEntry(f1, bd=2, label=t.JOB_NAME) le.entry.config(width=20, textvariable = self.job_name) le.entry.bind('', TkPage.Callback(self.jobName,le.entry)) le.grid(row=0, column=0, sticky=W, padx=5, pady=10) f2 = Tix.Frame(f, bd=2, relief=FLAT) f2.pack(side=TOP, anchor=W) e1=[0]*3 M=[999999,3600,999999] S=[100,10,10] for (num, var, tt) in [(0, self.cput, t.CPU_TIME2) , (1, self.cpuT, t.CPU_TIME_SUP), (2, self.job_mem, t.JOB_MEM) ]: e1[num] = Tix.Control(f2, label=tt, bd=2, value='1', min=1, max=M[num], step=S[num], integer=1, selectmode='normal', variable=var) e1[num].entry.config(width=10) e1[num].entry.bind('',TkPage.Callback(self.getValue, e1[num].entry, var, 0)) e1[num].decr.bind('',TkPage.Callback(self.getValue, e1[num].entry, var, -S[num])) e1[num].incr.bind('',TkPage.Callback(self.getValue, e1[num].entry, var, S[num])) e1[num].grid(row=num, column=0, padx=5, pady=10, sticky=W) # Previous values # try: self.job_name.set(self.default['job_name']) self.cput.set(self.default['NQS_cput']) self.cpuT.set(self.default['NQS_cpuT']-self.default['NQS_cput']) self.job_mem.set(self.default['NQS_mem']) except: pass def apply(self): """ What to do when user clicks on 'OK'. """ self.result = {} self.result['job_name'] = self.job_name.get() self.result['NQS_cput'] = self.cput.get() self.result['NQS_cpuT'] = self.cpuT.get() self.result['NQS_mem'] = self.job_mem.get() def sequence(self): """ Bind the dialog window with only 'Echap' (delete sequence 'Return', because of the Tix.Control.entry). """ self.bind("", self.cancel) #------------------------------------------------------------------------------- # Popup advanced options #------------------------------------------------------------------------------- class AdvancedOptionsDialog(Dialog.Dialog): """ """ def getOptions(self, num, var, tt, event=None): """ Input advanced options. """ self.check.begin(self.eopt[num]) if not self.check.isAscii(self.eopt[num],var.get()): var.set('') def getModeExe(self, event=None): """ Input execution mode option. """ self.mode_exe.get() def setOptimisation(self, event=None): """ Put optimisation option. """ self.optimise.set(self.default['OPTIMISATION']) if self.default['OPTIMISATION'] == '': self.optimise.set('none') def getOptimisation(self, event=None): """ Input advanced options. """ self.opt = '' self.opt = self.optimise.get() if self.optimise.get() == 'none': self.opt = '' return self.opt def setArgCsVerif(self): """ Put ARG_CS_VERIF option from "lance" file. """ if self.default['ARG_CS_VERIF'] == '': self.arg_cs_verif.set('standard') if self.default['ARG_CS_VERIF'] == '0': self.arg_cs_verif.set('mesh_quality') if self.default['ARG_CS_VERIF'] == '1': self.arg_cs_verif.set('imrgra0') if self.default['ARG_CS_VERIF'] == '2': self.arg_cs_verif.set('imrgra1') if self.default['ARG_CS_VERIF'] == '3': self.arg_cs_verif.set('imrgra2') if self.default['ARG_CS_VERIF'] == '4': self.arg_cs_verif.set('imrgra3') if self.default['ARG_CS_VERIF'] == '5': self.arg_cs_verif.set('imrgra4') def getArgCsVerif(self, event=None): """ Input ARG_CS_VERIF option. """ self.val_verif ='' arg_verif = self.arg_cs_verif.get() if arg_verif == 'standard': self.val_verif = '' if arg_verif == 'mesh_quality': self.val_verif = "0" if arg_verif == 'imrgra0': self.val_verif = "1" if arg_verif == 'imrgra1': self.val_verif = "2" if arg_verif == 'imrgra2': self.val_verif = "3" if arg_verif == 'imrgra3': self.val_verif = "4" if arg_verif == 'imrgra4': self.val_verif = "5" return self.val_verif def setArgCsOutput(self): """ Put ARG_CS_OUTPUT options from "lancer" file. """ self.val_output = self.default['ARG_CS_OUTPUT'] if self.default['ARG_CS_OUTPUT'] == '': self.arg_cs_out1.set('listing') self.arg_cs_out2.set('shunte') else: list = self.default['ARG_CS_OUTPUT'].split() l1 = 0 l2 = 0 for n in range(len(list)): if list[n] == '--log': l1 = 1 if list[n+1] == '0': self.arg_cs_out1.set('standard') if list[n+1] == '1': self.arg_cs_out1.set('listing') if list[n] == '--logp': l2 = 1 if list[n+1] == '0': self.arg_cs_out2.set('standard') if list[n+1] == '1': self.arg_cs_out2.set('listing') if list[n+1] == '-1': self.arg_cs_out2.set('shunte') if l1 == 0: self.arg_cs_out1.set('listing') if l2 == 0: self.arg_cs_out2.set('shunte') def getArgCsOutput(self, event=None): """ Input ARG_CS_OUTPUT options. """ self.val_output ='' out1 = '' out2 = '' arg_out1 = self.arg_cs_out1.get() arg_out2 = self.arg_cs_out2.get() if arg_out1 == 'listing': out1 = '' if arg_out1 == 'standard': out1 = '--log 0' if arg_out2 == 'shunte': out2 = '' if arg_out2 == 'standard': out2 = '--logp 0' if arg_out2 == 'listing': out2 = '--logp 1' self.val_output = out1 + ' ' + out2 def searchDir(self, event=None): """ Choice temporary directory for batch """ t = PageText() self.dir_name ='' path_case = os.getcwd() self.dir_name = Dialog.dirselect(self.master, stbar=self.stbar, title=t.SELECT_DIR, default=path_case) if self.dir_name: self.exe_name.set(self.dir_name) ## self._scrollHandler(self.edir, "moveto", 1) self._scrollHandler(self.eopt[0], "moveto", 1) else: self.exe_name.set('') return self.dir_name def searchFile(self, event=None): """ Choice temporary directory for batch """ t = PageText() file_name = "" tk_fopen = tkFileDialog.askopenfilename file_name = tk_fopen(title=t.NEW_FILE, initialdir=os.getcwd(), filetypes=[("All files","*")]) if file_name: if not self.valgrind.get(): new = file_name + " --tool=memcheck" else: new = "" for i in string.split(self.valgrind.get()): if i == string.split(self.valgrind.get())[0]: i = file_name new = new + i + ' ' self.valgrind.set(new) def body(self,master): """ Creation of popup window's widgets """ t = PageText() self.mode_exe = Tix.StringVar() self.optimise = Tix.StringVar() self.valgrind = Tix.StringVar() self.list_lib_sat = Tix.StringVar() self.opt_lib_ext = Tix.StringVar() self.arg_cs_output = Tix.StringVar() self.arg_cs_out1 = Tix.StringVar() self.arg_cs_out2 = Tix.StringVar() self.arg_cs_verif = Tix.StringVar() self.exe_name = Tix.StringVar() self.check = AsciiValidator() # Options OPTIMISATION, VALGRIND, LISTE_LIB_SAT, et OPTION_LIB_EXT w = Tix.Frame(master, relief=FLAT) w.pack(side=TOP, fill=X, padx=10, pady=10) lab=[0]*6 self.eopt=[0]*6 for (num, var, tt) in [(0, self.exe_name , t.EXE_NAME ), (1, self.mode_exe , t.MODE_EXEC), (2, self.optimise , 'OPTIMISATION'), (3, self.valgrind , 'VALGRIND'), (4, self.list_lib_sat , t.LISTE_LIB_SAT), (5, self.opt_lib_ext , t.OPTION_LIB_EXT)]: lab[num] = Tix.Label(w, text=tt) lab[num].grid(row=num, column=0, padx=10, pady=5, sticky=W) if num >= 3: self.eopt[num] = Tix.Entry(w, bd=2, width=40, textvariable=var) self.eopt[num].grid(row=num, column=1, padx=5, pady=10, sticky=W) self.eopt[num].event_add("<>", "", "", "") self.eopt[num].bind("<>", TkPage.Callback(self.getOptions, num, var, tt)) if num == 0: self.eopt[num] = Tix.Entry(w, bd=1, width=40, textvariable=self.exe_name) self.eopt[num].grid(row=0, column=1, padx=10, pady=10, sticky=W) self.eopt[num].event_add("<>", "", "", "") # Search directory in list self.img_dir = Tix.PhotoImage(file=PIC_PATH+'search1.gif') bdir = Tix.Button(w, image=self.img_dir, command=self.searchDir) bdir.grid(row=0, column=2, padx=3) self.balloon.bind_widget(bdir, balloonmsg=t.MSG_CASE_DIR) if num == 1: self.eopt[num] = Tix.OptionMenu(w) self.eopt[num].menubutton.config(width=36, height=0, bd=2, relief=RAISED) self.eopt[num].grid(row=num, column=1, padx=0, pady=10) self.eopt[num].add_command('complet', label=t.COMPLET) self.eopt[num].add_command('pre-traitement', label=t.PRETRAIT) self.eopt[num].add_command('calcul', label=t.CALCUL) self.eopt[num].config(variable=var,command=self.getModeExe) if num == 2: self.eopt[num] = Tix.OptionMenu(w) self.eopt[num].menubutton.config(width=36, height=0, bd=2, relief=RAISED) self.eopt[num].grid(row=num, column=1, padx=0, pady=10) self.eopt[num].add_command('none', label=t.NONE) self.eopt[num].add_command('LO', label='low option (LO)') self.eopt[num].add_command('DBG', label='-g compilation debug option (DBG)') self.eopt[num].add_command('EF', label='Electric Fence (EF)') self.eopt[num].add_command('PROF', label='profiling (PROF)') self.eopt[num].config(variable=var, command=self.getOptimisation) if num == 3: bopt = Tix.Button(w, image=self.img_dir, command=self.searchFile) bopt.grid(row=num, column=2, padx=3) self.balloon.bind_widget(bopt, balloonmsg=t.MSG_CASE_FILE) #for ARG_CS_VERIF larg_verif = Tix.Label(w, text=t.ARG_CS_VERIF) larg_verif.grid(row=6, column=0, padx=10, pady=5, sticky=W) self.arg_verif = Tix.OptionMenu(w) self.arg_verif.menubutton.config(width=36, height=0, bd=2, relief=RAISED) self.arg_verif.grid(row=6, column=1, padx=0, pady=0) self.arg_verif.add_command('standard', label=t.JOB_STD) self.arg_verif.add_command('mesh_quality', label=t.QUALITY_MESH) self.arg_verif.add_command('imrgra0', label=t.IMRGRA0) self.arg_verif.add_command('imrgra1', label=t.IMRGRA1) self.arg_verif.add_command('imrgra2', label=t.IMRGRA2) self.arg_verif.add_command('imrgra3', label=t.IMRGRA3) self.arg_verif.add_command('imrgra4', label=t.IMRGRA4) self.arg_verif.config(variable=self.arg_cs_verif,command=self.getArgCsVerif) #for ARG_CS_OUTPUT warg_out = Tix.LabelFrame(master, bd=2, label=t.ARG_CS_OUTPUT, relief=FLAT) warg_out.label.config(font=fT) warg_out.pack(side=TOP, fill=X, padx=10, pady=10) larg_out1 = Tix.Label(warg_out.frame, text=t.ARG_CS_OUT1) larg_out1.grid(row=0, column=0, padx=10, pady=10, sticky=W) self.arg_out1 = Tix.OptionMenu(warg_out.frame) self.arg_out1.menubutton.config(width=25, height=0, bd=2, relief=RAISED) self.arg_out1.grid(row=0, column=1, padx=0, pady=10) self.arg_out1.add_command('standard', label=t.STANDARD) self.arg_out1.add_command('listing', label=t.LISTING) self.arg_out1.config(variable=self.arg_cs_out1,command=self.getArgCsOutput) larg_out2 = Tix.Label(warg_out.frame, text=t.ARG_CS_OUT2) larg_out2.grid(row=1, column=0, padx=10, pady=10, sticky=W) self.arg_out2 = Tix.OptionMenu(warg_out.frame) self.arg_out2.menubutton.config(width=25, height=0, bd=2, relief=RAISED) self.arg_out2.grid(row=1, column=1, padx=0, pady=10) self.arg_out2.add_command('shunte', label=t.SHUNTE) self.arg_out2.add_command('standard', label=t.STANDARD) self.arg_out2.add_command('listing', label=t.LISTING) self.arg_out2.config(variable=self.arg_cs_out2,command=self.getArgCsOutput) # Previous values # self.mode_exe.set(self.default['MODE_EXEC']) self.setOptimisation() self.valgrind.set(self.default['VALGRIND']) self.list_lib_sat.set(self.default['LISTE_LIB_SAT']) self.opt_lib_ext.set(self.default['OPTION_LIB_EXT']) self.setArgCsVerif() self.setArgCsOutput() self.exe_name.set(self.default['CS_TMP_PREFIX']) self.dir_name = self.default['CS_TMP_PREFIX'] self.eopt[0].config(state=DISABLED, bg='white') def apply(self): """ What to do when user clicks on 'OK'. """ self.result = {} self.result['MODE_EXEC'] = self.mode_exe.get() self.result['OPTIMISATION'] = self.opt self.result['VALGRIND'] = self.valgrind.get() self.result['LISTE_LIB_SAT'] = self.list_lib_sat.get() self.result['OPTION_LIB_EXT']= self.opt_lib_ext.get() self.result['ARG_CS_OUTPUT'] = self.val_output self.result['ARG_CS_VERIF'] = self.val_verif self.result['CS_TMP_PREFIX'] = self.dir_name def sequence(self): """ Bind the dialog window with only 'Echap' (delete sequence 'Return', because of the Tix.Control.entry). """ self.bind("", self.cancel) #------------------------------------------------------------------------------- # Main class : BatchRunning #------------------------------------------------------------------------------- class BatchRunning(TkPage.Page): """ This class is devoted to the Computer selection. When a new computer is selected, The old data frame is deleted and a new apropriate frame is open. If the batch script file name is known, informations are display in the apropiate widget. """ def _tkControlVariables(self): """ Tkinter variables declaration. """ self.computer = Tix.StringVar() self.IAsize = Tix.IntVar() self.RAsize = Tix.IntVar() self.num_cpu = Tix.IntVar() def _pageControl(self): """ """ # Computers list # t = PageText() self.computerList = [(0, 'station', t.WORKSTATION), (1, 'cluster', t.CLUSTER) ] if not self.case['batchScript']: self.case['batchScript'] = {'station': "" , 'cluster': "" } if not self.case['backupBatchScript']: self.case['backupBatchScript'] = {'station': "no" , 'cluster': "no" } def getBatchScriptFileDefaultValues(self): """ Extract informations from the batch script file. """ self.stbar.busy() dico = self.mdl.dicoValues for (valword, var) in [(dico['LONGIA'], self.IAsize), (dico['LONGRA'], self.RAsize), (dico['NOMBRE_DE_PROCESSEURS'], self.num_cpu)]: var.set(valword) self.stbar.idle() def verifyBoundariesDefinitions(self, param): """ Check if boundaries definitions are in xml file param. """ self.stbar.busy() t = PageText() from DefineBoundaryRegions import DefBCModel refList, groupList = DefBCModel(self.case).getLists() del DefBCModel if refList or groupList: pass else: if self.case['no_boundary_conditions'] == 0: Dialog.Warning(self.master, title=t.WARNING, text=t.MSG_NOCL) self.case['no_boundary_conditions'] = 1 self.stbar.idle() def getSize(self, num, var, event=None): """ Check the validity of 'LONGIA' and 'LONGRA' input. """ self.stbar.busy() if self.check2.isPositive(self.e1[num], var): if num: self.mdl.dicoValues['LONGRA'] = self.RAsize.get() self.mdl.updateBatchScriptFile('LONGRA') else: self.mdl.dicoValues['LONGIA'] = self.IAsize.get() self.mdl.updateBatchScriptFile('LONGIA') self.stbar.idle() def getParallelComputing(self, entry, step=None, event=None): """ Incremente, decremente and colorize the input argument entry """ if step: v= self.num_cpu.get() self.num_cpu.set(v+step) self.mdl.dicoValues['NOMBRE_DE_PROCESSEURS'] = self.num_cpu.get() self.mdl.updateBatchScriptFile('NOMBRE_DE_PROCESSEURS') entry.config(selectbackground='green') entry.selection_range(0,END) def pbsJobManagement(self, event=None): """ Get PBS card informations. """ t = PageText() self.stbar.busy() default = {} default['job_name'] = self.mdl.dicoValues['PBS_JOB_NAME'] default['PBS_node'] = self.mdl.dicoValues['PBS_nodes'] default['PBS_ppn'] = self.mdl.dicoValues['PBS_ppn'] default['PBS_cput'] = self.mdl.dicoValues['PBS_walltime'] default['PBS_mem'] = self.mdl.dicoValues['PBS_mem'] dialog = PBSJobManagementDialog(self.myPage, title=t.CLUSTER, default=default) self.mdl.dicoValues['PBS_JOB_NAME'] = dialog.result['job_name'] self.mdl.dicoValues['PBS_nodes'] = dialog.result['PBS_node'] self.mdl.dicoValues['PBS_ppn'] = dialog.result['PBS_ppn'] self.mdl.dicoValues['PBS_walltime'] = dialog.result['PBS_cput'] self.mdl.dicoValues['PBS_mem'] = dialog.result['PBS_mem'] self.mdl.updateBatchScriptFile() self.stbar.idle() def lsfJobManagement(self, event=None): """ Get NQS card informations """ pass ## t = PageText() ## self.stbar.busy() ## ## default = {} ## default['job_name'] = self.mdl.dicoValues['PBS_JOB_NAME'] ## default['NQS_cput'] = ## default['NQS_cpuT'] = ## default['NQS_mem'] = ## dialog = LSFJobManagementDialog(self.myPage, title=t.CATHY, default=default) ## ## self.job_name = dialog.result['job_name'] ## self.NQS_cpult = dialog.result['NQS_cput'] ## self.NQS_cpulT = dialog.result['NQS_cpuT'] + dialog.result['NQS_cput'] ## self.job_memory = dialog.result['NQS_mem'] ## ## self.mdl.updateBatchScriptFile() ## ## self.stbar.idle() ## def getUserFiles(self, event=None): """ Input 'FICHIERS_DONNEES_UTILISATEUR' and 'FICHIERS_RESULTATS_UTILISATEUR' """ t = PageText() self.stbar.busy() default = {} default['data_path'] = "" default['data_path'] = self.case['data_path'] default['data'] = string.split(self.mdl.dicoValues['FICHIERS_DONNEES_UTILISATEUR']) default['results'] = string.split(self.mdl.dicoValues['FICHIERS_RESULTATS_UTILISATEUR']) dialog = UserFilesDialog(self.myPage, title=t.USER_FILES, default=default) self.mdl.dicoValues['FICHIERS_DONNEES_UTILISATEUR'] = string.join(dialog.result['data']) self.mdl.dicoValues['FICHIERS_RESULTATS_UTILISATEUR'] = string.join(dialog.result['results']) self.mdl.updateBatchScriptFile('FICHIERS_DONNEES_UTILISATEUR') self.mdl.updateBatchScriptFile('FICHIERS_RESULTATS_UTILISATEUR') self.stbar.idle() def getAdvancedOptions(self, event=None): """ Ask one popup for advanced specifications """ t=PageText() self.stbar.busy() default = {} for option in ['MODE_EXEC', 'OPTIMISATION', 'VALGRIND', 'LISTE_LIB_SAT', 'OPTION_LIB_EXT', 'ARG_CS_OUTPUT', 'ARG_CS_VERIF', 'CS_TMP_PREFIX']: default[option] = self.mdl.dicoValues[option] dialog = AdvancedOptionsDialog(self.master, title=t.OPTIONS, stbar=self.stbar, default=default) for option in ['MODE_EXEC', 'OPTIMISATION', 'VALGRIND', 'LISTE_LIB_SAT', 'OPTION_LIB_EXT', 'ARG_CS_OUTPUT', 'ARG_CS_VERIF', 'CS_TMP_PREFIX']: self.mdl.dicoValues[option] = dialog.result[option] self.mdl.updateBatchScriptFile(option) self.stbar.idle() def batchRunning(self, event=None): """ Launch Code_Saturne batch running. """ t = PageText() self.stbar.busy() # Test 1: is the file saved? # if self.case['new'] == "yes" or Tool.GuiParam.saved == "no": Dialog.ShowInfo (self.master, title=t.WARNING, text=t.CASE_NOT_SAVED) self.stbar.idle() return # FIXME: self.case["saved"] = "no" for all set method in model classes self.case.xmlSaveDocument() self.mdl.dicoValues['PARAM'] = os.path.basename(self.case['xmlfile']) self.mdl.updateBatchScriptFile('PARAM') # Test 2: have we a mesh? # if not Tool.GuiParam.matisse : node_ecs = self.case.xmlGetNode('solution_domain') if not node_ecs.xmlGetNode('meshes_list'): if not node_ecs.xmlGetNode('meshes_list').xmlGetNodeList('mesh'): Dialog.ShowInfo (self.master, title=t.WARNING, text=t.MSG_NOMESH) self.stbar.idle() return # Test 3: have we a trouble with the mesh generation? # if Tool.GuiParam.matisse : import Pages.Matisse as Matisse if not Matisse.MatisseMeshRunning(self.case).ok : Dialog.Warning(self.master, title=t.WARNING, text= t.MESHW) return # Command line # key = self.case['computer'] script = self.case['scripts_path'] + "/" + self.case['batchScript'][key] batch1 = self.case['scripts_path'] + "/" + "batch" batch2 = batch1 + '~' ## self.mdl.updateBatchScriptFile() # Verify if boundaries definitions exist # if not Tool.GuiParam.matisse: param = os.path.basename(self.case['xmlfile']) if param: self.verifyBoundariesDefinitions(param) if key == 'station': try: os.rename(batch1, batch2) except: pass cmd = 'nice nohup ' + script + ' | tee ' + batch1 + ' &' elif key == 'cluster': #cmd = 'qsub ' + script + ' ' + self.case['batchScript'][key] + ' &' cmd = 'qsub ' + script elif key == 'cathy': cmd = 'sub ca cs ' + script + ' ' + self.case['batchScript'][key] + ' &' os.system(cmd) self.stbar.idle() def displayBatchScriptInfo(self): """ Layout of the second part of this page. """ self.stbar.busy() t = PageText() self.lf2.pack(side=TOP, fill=X, padx=10, pady=5) self.f3.pack_forget() self.f3_2.pack_forget() self.f3p.pack_forget() self.sepo.pack_forget() self.fopt.pack_forget() self.sep2.pack_forget() self.f5.pack_forget() self.l3[0].grid_forget() self.l3[1].grid_forget() self.lsb.grid_forget() self.sb.grid_forget() self.b1[0].grid_forget() self.b1[1].grid_forget() if hasattr(self, 'mdl'): del self.mdl self.mdl = BatchRunningModel(self.case) self.mdl.readBatchScriptFile() self.nameFile1.grid(row=0, column=2, sticky=E) name = self.case['batchScript'][self.computer.get()] self.nameFile1.config(text = name, font=fB) if self.case['computer'] == "station": if Tool.GuiParam.matisse : self.f3p.pack(side=TOP, padx=64, anchor=W) else: self.f3.pack(side=TOP, padx=72, anchor=W) self.f3p.pack(side=TOP, padx=64, anchor=W) self.lsb.grid(row=0, column=0, padx=0, pady=2, sticky=W) self.sb.grid(row=0, column=1, padx=26, pady=1, sticky=W) else: for (i, comput, txt, imag, msg, cmd) in \ [(0, "cluster", t.JOB, 'cluster.gif', t.CLUSTER_INFO, self.pbsJobManagement), (1, "ccrt", t.JOB, 'cathy.gif' , t.CLUSTER_INFO, self.lsfJobManagement)]: self.f3_2.pack(side=TOP, padx=66, anchor=W) self.f3p.pack(side=TOP, padx=66, anchor=W) self.l3[i].grid(row=0, column=0, padx=10, pady=2, sticky=W) self.b1[i].grid(row=0, column=1, padx=66, pady=1, sticky=W) self.sepo.pack(side=TOP, fill=X, pady=10) self.fopt.pack(side=TOP, padx=66, anchor=W) self.sep2.pack(side=TOP, fill=X, pady=10) self.f5.pack(side=TOP, fill=X, padx=10, pady=0) self.getBatchScriptFileDefaultValues() self.mdl.updateBatchScriptFile() self.stbar.idle() def getBatchAnalysis(self, event=None): """ 1) Look if the batch script file name is allready known for the current computer 2) Display the apropriate frame for the selected computer """ self.stbar.busy() self.lf2.pack_forget() key = self.computer.get() self.case['computer'] = key self.lab.config(state=NORMAL) if self.case['batchScript'].has_key(key) and self.case['batchScript'][key]: self.displayBatchScriptInfo() else: self.nameFile1.grid_forget() self.stbar.idle() def searchBatchScriptFile(self, event=None): """ Open a FileDialog in order to search the batch script file in the system file. """ t = PageText() self.stbar.busy() self.stbar.set(t.MSG_LAUNCHER + self.case['scripts_path'] +")") file_name = "" tk_fopen = tkFileDialog.askopenfilename if self.case['scripts_path'] and os.path.isdir(self.case['scripts_path']): dir = self.case['scripts_path'] else: dir = os.getcwd() file_name = tk_fopen (title=t.LAUNCHER_SELECT, initialdir=dir, filetypes=[("All files","*")]) if file_name: launcher = os.path.basename(file_name) if self.case['scripts_path'] == os.path.dirname(file_name): key = self.computer.get() if self.case['batchScript'].has_key(key): self.case['batchScript'][key] = launcher else: print "Warning: searchBatchScriptFile\n Error with key:", key self.displayBatchScriptInfo() else: t = PageText() tkMessageBox.showwarning(t.WARNING, t.MSG_SCRIPTS + t.MSG_IDENTITY) self.stbar.clear() self.stbar.force_idle() def _createWidgets(self): """ Create the Page layout. """ #### Beginning of the page ##### #### t = PageText() # -1) Mother frame for layout # self.lf1 = Tix.LabelFrame(self.myPage, bd=2, label=t.ARCH_SELECT, relief=FLAT) self.lf1.label.config(font=fT) self.lf1.pack(side=TOP, fill=X, padx=10, pady=5) # 0) Plateform selection between Workstation/Cluster/CaThy # #self.r = [0]*3 self.l = [0]*3 f0 = Tix.Frame(self.lf1.frame, relief=FLAT) f0.pack(side=TOP, fill=X, padx=10, pady=10) self.b = Tix.OptionMenu(f0) self.b.menubutton.config(width=28, bd=2, relief=RAISED) self.b.grid(row=0, column=0, padx=15, pady=5) self.balloon.bind_widget(self.b, statusmsg=t.MSG_MACHIN, balloonmsg=t.KEYWORD+'ARCH') self.b.add_command('station', label=t.WORKSTATION) self.b.add_command('cluster', label=t.CLUSTER) self.b.add_command('ccrt', label=t.CCRT, state=DISABLED) self.b.config(variable=self.computer,command=self.getBatchAnalysis) # 1) separator # Tix.Frame(self.lf1.frame, height=2, bd=2, relief=SUNKEN).pack(side=TOP, fill=X) # 1) label # f1 = Tix.Frame(self.lf1.frame, relief=FLAT) f1.pack(side=TOP, fill=X) self.lab = Tix.Label(f1, text=t.LAUNCHER) self.lab.grid(row=0, column=0, sticky=W, padx=10, pady=10) self.balloon.bind_widget(self.lab, statusmsg=t.MSG_LAUNCHER + self.case['scripts_path'] +")") # 2) Search button # self.imgsf = Tix.PhotoImage(file=PIC_PATH+'search1.gif') self.bsf = Tix.Button(f1, image=self.imgsf, command=self.searchBatchScriptFile) self.bsf.grid(row=0, column=1, sticky=E, padx=10, pady=10) self.balloon.bind_widget(self.bsf, balloonmsg=t.LAUNCHER_SELECT) # 2.1) File name # self.nameFile1 = Tix.Label(f1) #### Follwing of the page for reading of parameters ##### #### for Batch Analysis # # 0) Mother frame for layout # self.lf2 = Tix.LabelFrame(self.myPage, bd=2, label=t.BATCH_TITLE, relief=FLAT) self.lf2.label.config(font=fT) self.lf2.pack(side=TOP, fill=X, padx=10, pady=10) self.f2 = Tix.Frame(self.lf2.frame, relief=FLAT) #self.f2.pack(side=TOP, anchor=W, pady=5) self.f2.pack(side=TOP, fill=X, pady=5) # 1) Integer and Float array size # l1=[0]*2 self.e1=[0]*2 for (num, var, tt) in [(0, self.IAsize, t.LONGIA), (1, self.RAsize, t.LONGRA)]: l1 = Tix.Label(self.f2, text=tt) l1.grid(row=num, column=0, padx=10, pady=2, sticky=W) self.e1[num] = Tix.Entry(self.f2, bd=2, width=15, textvariable=var) self.e1[num].grid(row=num, column=1, padx=5, pady=2, sticky=W) self.e1[num].event_add("<>", "", "", "") self.e1[num].bind("<>", TkPage.Callback(self.getSize, num, var)) # 2) Parallel computing # self.f3 = Tix.Frame(self.lf2.frame, relief=FLAT) self.f3.pack(side=TOP, anchor=W) self.f3_2 = Tix.Frame(self.lf2.frame, relief=FLAT) self.f3_2.pack(side=BOTTOM, anchor=W) self.lsb = Tix.Label(self.f3, text=t.NUM_OF_CPU) self.lsb.grid(row=0, column=0, padx=10, pady=2, sticky=W) self.sb = Tix.Control(self.f3, bd=2, value='1', min=1, max=32, integer=1, selectmode='normal', variable=self.num_cpu) self.sb.entry.config(width=3) self.sb.entry.bind('',TkPage.Callback(self.getParallelComputing, self.sb.entry, 0)) self.sb.decr.bind('',TkPage.Callback(self.getParallelComputing, self.sb.entry, -1)) self.sb.incr.bind('',TkPage.Callback(self.getParallelComputing, self.sb.entry, 1)) self.sb.grid(row=0, column=1, columnspan=2, padx=10, pady=10, sticky=W) self.l3 = [0]*2 self.img1 = [0]*2 self.b1 = [0]*2 for (i, comput, txt, imag, msg, cmd) in \ [(0, "cluster", t.JOB, 'cluster.gif', t.CLUSTER_INFO, self.pbsJobManagement), (1, "ccrt", t.JOB, 'cathy.gif', t.CLUSTER_INFO, self.lsfJobManagement)]: self.l3[i] = Tix.Label(self.f3_2, text=txt) self.l3[i].grid(row=0, column=0, padx=0, pady=2, sticky=W) self.img1[i] = Tix.PhotoImage(file=PIC_PATH+imag) self.b1[i] = Tix.Button(self.f3_2, image=self.img1[i], command=cmd) self.b1[i].grid(row=0, column=1, padx=55, pady=1, sticky=W) self.balloon.bind_widget(self.b1[i], balloonmsg=msg) # 3) User files # self.f3p = Tix.Frame(self.lf2.frame, relief=FLAT) self.f3p.pack(side=TOP, anchor=W) l4 = Tix.Label(self.f3p, text=t.USER_FILES) l4.grid(row=1, column=0, padx=10, pady=2, sticky=W) self.img2 = Tix.PhotoImage(file=PIC_PATH+'chimie.gif') self.b2 = Tix.Button(self.f3p, image=self.img2, command=self.getUserFiles) self.b2.grid(row=1, column=1, padx=50, pady=1, sticky=W) self.balloon.bind_widget(self.b2, balloonmsg=t.USER_FILES_INFO) # 4) separator # self.sepo = Tix.Frame(self.lf2.frame, height=2, bd=2, relief=SUNKEN) self.sepo.pack(side=TOP, fill=X) # Advanced options # self.fopt = Tix.Frame(self.lf2.frame, relief=FLAT) self.fopt.pack(side=TOP, fill = X, padx=10) self.lop = Tix.Label(self.fopt, text=t.OPTIONS) self.lop.grid(row=0, column=0, padx=10, sticky=W) self.imsop = Tix.PhotoImage(file=PIC_PATH+'graduate.gif') sop = Tix.Button(self.fopt, image=self.imsop, command=self.getAdvancedOptions) sop.grid(row=0, column=1, padx=50, sticky=E) #self.balloon.bind_widget(sop, balloonmsg=t.POPUP) # 5) separator # self.sep2 = Tix.Frame(self.lf2.frame, height=2, bd=2, relief=SUNKEN) self.sep2.pack(side=TOP, fill=X) # 6) Batch script update and Code_Saturne batch running # self.f5 = Tix.Frame(self.lf2.frame, relief=FLAT, bd=3) self.f5.pack(side=TOP, fill=X, padx=10, pady=0) self.b5 = Tix.Button(self.f5, text=t.BUTTON_EXE, width=15, fg="red", font=fB, highlightbackground="black") self.b5.grid(row=0, column=0, padx=10, pady=10) self.balloon.bind_widget(self.b5, statusmsg=t.SAVE_AND_EXE) self.b5.config(command=self.batchRunning) def _initializeWidgets(self): """ Extract resquested informations from the self.case. This informations are used to initialize the widgets. """ # the selected computer is stored in self.case['computer'] # #print "dans initiialis...",self.case['batchScript'] #if self.case['batchScript']: # if self.case['batchScript'][self.case['computer']] == "": # self.lf2.pack_forget() # self.f2.pack_forget() # self.f3.pack_forget() # self.f3p.pack_forget() if self.case['computer'] == "": self.b.config(value='station') self.case['computer'] = 'station' else: for (i,tx1,tx2) in self.computerList: if self.case['computer'] == tx1: self.b.config(value=tx1) #------------------------------------------------------------------------------- # Text and messages for this page #------------------------------------------------------------------------------- class PageText: """ Storage of all texts and messages for this page. """ def __init__(self): # 1) Texts # if Tool.GuiParam.lang == 'fr': self.ARCH_SELECT = "Sélection de la plateforme" self.ARG_CS_OUTPUT = "Gestion des redirections des "\ "sorties (ARG_CS_OUTPUT)" self.ARG_CS_OUT1 = "redirection pour calcul monoprocesseur ou pour le\n"\ "processeur de rang 0 d'un calcul parallèle (--log)" self.ARG_CS_OUT2 = "redirection pour les processeurs de rang 1 à N-1 \n"\ "d'un calcul en parallèle sur N processeurs (--logp)" self.ARG_CS_VERIF = "Tests élémentaires du maillage\n"\ "(ARG_CS_VERIF)" self.BATCH_TITLE = "Exécution en arrière-plan" self.BLANC = " " self.BUTTON_EXE = "Exécution\nde\nCode_Saturne" self.CALCUL = "Calcul seul" self.CATHY = "CaThy" self.CATHY_INFO = "Informations pour la carte NQS" self.CCRT = "Gestion carte LSF (ccrt CEA)" self.CLUSTER = "Gestion carte PBS (Cluster) " self.CLUSTER_INFO = "Informations pour la carte PBS" self.CL_NODES = "Nombre de noeuds" self.COMPLET = "Calcul complet" self.CL_PPN = "CPU par noeuds" self.CPU_LIST = "Liste des processeurs" self.CPU_TIME = "Temps de calcul :" self.CPU_TIME2 = "Temps de calcul (s)" self.CPU_TIME_SUP = "Temps pour le transfert des fichiers (s)" self.DATA = "Données" self.DELETE = "Effacer la sélection" self.ERROR = "Erreur" self.EXE_NAME = "Préfix du répertoire temporaire\n"\ " d'exécution (CS_TMP_PREFIX)" self.IMRGRA0 = "Test du gradient en IMRGRA=0" self.IMRGRA1 = "Test du gradient en IMRGRA=1" self.IMRGRA2 = "Test du gradient en IMRGRA=2" self.IMRGRA3 = "Test du gradient en IMRGRA=3" self.IMRGRA4 = "Test du gradient en IMRGRA=4" self.JOB = "Gestion du job " self.JOB_NAME = "Nom du job" self.JOB_MEM = "Mémoire (Mb)" self.JOB_STD = "Pas de test" self.KEYWORD = "Mot clé Code_Saturne : " self.LAUNCHER = "Sélectionner le script de lancement" self.LAUNCHER_SELECT = "Recherche du script de lancement" self.LISTE_LIB_SAT = "Liste des bibliothèques internes pour\n"\ "édition de liens (LISTE_LIB_SAT)" self.LISTING = "vers listing_n" self.LONGIA = "Taille du tableau d'entiers" self.LONGRA = "Taille du tableau des réels" self.MODE_EXEC = "Mode d'exécution (MODE_EXEC)" self.NONE = "Pas d'option" self.NEW_FILE = "Sélection du fichier d'exécution de VALGRIND" self.NUM_OF_CPU = "Nombre de processeurs" self.OPTIONS = "Options avancées" self.OPTION_LIB_EXT = "Liste des bibliothèques externes pour\n"\ "édition de liens (OPTION_LIB_EXT)" self.PARALL = "Calcul parallèle" self.PARALL_INFO = "Nombre et liste des processeurs" self.PATH_UNKNOWN1 = "Les répertoires suivants n'ont "\ "pas pu être renseignés :\n\n" self.PRETRAIT = "Pré traitement" self.QUALITY_MESH = "Critères de qualité du maillage" self.RESU = "Résultats" self.SAVE_AND_EXE = "Attention : enregistre automatiquement le cas courant"\ " avant d'exécuter Code_Saturne" self.SCRIPTS = "Scripts d'exécution" self.SELECT_DIR = "Sélectionnez un répertoire" self.SHUNTE = "pas de sortie" self.STANDARD = "vers sortie standard" self.USER_DATA_LIST = "Sélection des fichiers de données" self.USER_DATA_NEW = "Nouveaux fichiers :" self.USER_FILES = "Fichiers utilisateur" self.USER_FILES_INFO = "Sélection des fichiers de données\n "\ "et nom des fichiers de résultats" self.USER_RESU_LIST = "Sélection des fichiers de résultats" self.USER_RESU_NEW = "Nouveaux fichiers :" self.USER_SRC = "Sous-programmes utilisateur" self.WARNING = "Attention" self.WORKSTATION = "Station de travail" else: self.ARCH_SELECT = "Computer Selection" self.ARG_CS_OUTPUT = "Outputs redirections management (ARG_CS_OUTPUT)" self.ARG_CS_OUT1 = "redirection for single processor job or for\n"\ "processor rank 0 of multi-processors job (--log)" self.ARG_CS_OUT2 = "redirection for processors from rank 1 to N-1\n"\ "of multi-processors job (--logp)" self.ARG_CS_VERIF = "Elementary tests of the mesh\n"\ "(ARG_CS_VERIF)" self.BATCH_TITLE = "Prepare batch analysis" self.BLANC = " " self.BUTTON_EXE = "Code_Saturne\nbatch\nrunning" self.CALCUL = "Only calculation" self.CATHY = "CaThy" self.CATHY_INFO = "NQS card informations" self.CCRT = "management of chart LSF (CEA ccrt)" self.CLUSTER = "management of chart PBS (Cluster)" self.CLUSTER_INFO = "PBS card informations" self.CL_NODES = "Nodes number" self.CL_PPN = "CPU per node" self.COMPLET = "Full job" self.CPU_LIST = "Processors list" self.CPU_TIME = "CPU time:" self.CPU_TIME2 = "CPU time (s)" self.CPU_TIME_SUP = "Time for file transfert (s)" self.DATA = "Data" self.DELETE = "Delete selection" self.ERROR = "Error" self.EXE_NAME = "Prefix of temporary directory of \n"\ " execution (CS_TMP_PREFIX)" self.IMRGRA0 = "Test of the gradient in IMRGRA=0" self.IMRGRA1 = "Test of the gradient in IMRGRA=1" self.IMRGRA2 = "Test of the gradient in IMRGRA=2" self.IMRGRA3 = "Test of the gradient in IMRGRA=3" self.IMRGRA4 = "Test of the gradient in IMRGRA=4" self.JOB = "Job management" self.JOB_NAME = "Name of the job" self.JOB_MEM = "Memory (Mb)" self.JOB_STD = "Off" self.KEYWORD = "Code_Saturne key word: " self.LAUNCHER = "Select the batch script file" self.LAUNCHER_SELECT = "Search the batch script" self.LISTE_LIB_SAT = "List of internal libraries\n"\ "for link (LISTE_LIB_SAT)" self.LISTING = "towards listing_n" self.LONGIA = "Integer array size " self.LONGRA = "Float array size " self.MODE_EXEC = "Execution mode (MODE_EXEC)" self.NONE = "None" self.NEW_FILE = "Select file for use VALGRIND option" self.NUM_OF_CPU = "Number of processors " self.OPTIONS = "Advanced options" self.OPTION_LIB_EXT = "List of external libraries\n"\ "for link (OPTION_LIB_EXT)" self.PARALL = "Parallel computing" self.PARALL_INFO = "Number and list of processors" self.PATH_UNKNOWN1 = "The following paths could not be given:\n\n" self.PRETRAIT = "Without calculation" self.QUALITY_MESH = "Quality criteria of the mesh" self.RESU = "Results" self.SAVE_AND_EXE = "Warning : save the current file automatically"\ " before Code_Saturne batch running" self.SCRIPTS = "Run Scripts" self.SELECT_DIR = "Select directory" self.SHUNTE = "no output" self.STANDARD = "towards standard output" self.USER_DATA_LIST = "User data files selection" self.USER_DATA_NEW = "New data files:" self.USER_FILES = "User files " self.USER_FILES_INFO = "Data files selection and\n "\ "results files name" self.USER_RESU_LIST = "User results files selection" self.USER_RESU_NEW = "New results files:" self.USER_SRC = "User Subroutines" self.WARNING = "Warning" self.WORKSTATION = "Workstation" # 2) Messages # if Tool.GuiParam.lang == 'fr': self.MESHW = "Problème dans la génération du maillage. \n "\ "Voir le compte rendu d'execution 'listsim'" self.CASE_NOT_SAVED= "Le cas courant doit être enregistré avant "\ "de pouvoir lancer l'exécution de Code_Saturne." self.ERR_DATA_FILE = "Les fichiers de données utilisateur suivants "\ "ne sont pas dans le répertoire : \n\n" self.MSG_ALLREADY = "Cette entrée est déjà enregistée " \ "dans la liste." self.MSG_BLANK = "Donner un nom sans blanc ou accent" self.MSG_CASE_DIR = "Sélectionner le répertoire temporaire d'exécution du cas" self.MSG_CASE_FILE = "Sélectionner le fichier d'exécution de VALGRIND" self.MSG_IDENTITY = "Vérifier l'existence et l'emplacement des fichiers, "\ "ainsi que la rubrique 'Identité et chemins'.\n\n" self.MSG_LAUNCHER = "Le script de lancement est recherché dans " self.MSG_MACHIN = "Sélectionner la machine sur laquelle le calcul "\ "sera éxécuté" self.MSG_SCRIPTS = "Le nouveau fichier de script n'est pas dans "\ "le répertoire des fichiers de scripts indiqué "\ "dans la rubrique 'Identité et chemins'.\n\n" self.MSG_NOMESH = "Vous devez sélectionner un maillage.\n\n" self.MSG_NOCL = "Vous n'avez pas définis de conditions aux limites.\n\n" else: self.MESHW = "Mesh generation error. \n See the file 'listsim'" self.CASE_NOT_SAVED= "The current case must be saved before "\ "Code_Saturne batch running." self.ERR_DATA_FILE = "The following data files are not in the directory:\n\n" self.MSG_ALLREADY = "This input is allready uploaded in the list." self.MSG_BLANK = "Please, give a name without blank or accent" self.MSG_CASE_DIR = "Select the batch temporary directory of the case" self.MSG_CASE_FILE = "Select file for option VALGRIND" self.MSG_IDENTITY = "Verify existence and location of these files, "\ "and the 'Identity and Pathes' rubric" self.MSG_LAUNCHER = "The batch script file name is searched in " self.MSG_MACHIN = "Select the calculator of running of calculation " self.MSG_SCRIPTS = "The new batch script file is not in scripts "\ "directory given in the 'Identity and paths' "\ "rubric.\n\n" self.MSG_NOMESH = "You have to select a mesh.\n\n" self.MSG_NOCL = "No boundary definition declared.\n\n" #------------------------------------------------------------------------------- # End #-------------------------------------------------------------------------------