#! /usr/bin/env python """ python m3d.py m3d.input """ import os import re import sys import string #set up selectors pcoment=re.compile('^(\s)*#.*') pnewline=re.compile('^(\s)*\n$') pstar=re.compile('^(\*)\w') pnlist=re.compile('^&') pd=re.compile('^\d+') #indicators for m3d.input file pmkfile=re.compile('^__makefile__', re.IGNORECASE) pexec=re.compile('^__executable__', re.IGNORECASE) pcomputer=re.compile('^__name_of_computer__', re.IGNORECASE) pquenue=re.compile('^__name_of_quenue__', re.IGNORECASE) presource=re.compile('^__resource__', re.IGNORECASE) pjobname=re.compile('^__runtime_job_name__', re.IGNORECASE) pmode=re.compile('^__runtime_mode__', re.IGNORECASE) pequilibrium=re.compile('^__equilibrium__', re.IGNORECASE) pchk=re.compile('^__checkpoint__', re.IGNORECASE) pothers=re.compile('^__others__', re.IGNORECASE) pconf=re.compile('^__configuration__', re.IGNORECASE) pwxy=re.compile('^__wxy__', re.IGNORECASE) pend=re.compile('^__', re.IGNORECASE) #computer pseaborg=re.compile('seaborg', re.IGNORECASE) pjacquard=re.compile('jacquard', re.IGNORECASE) pjaguar=re.compile('jaguar', re.IGNORECASE) pbgl=re.compile('bgl', re.IGNORECASE) pmhd=re.compile('mhd', re.IGNORECASE) #quenue pinteractive=re.compile('interactive', re.IGNORECASE) pdebug=re.compile('debug', re.IGNORECASE) pregular=re.compile('regular', re.IGNORECASE) ppremium=re.compile('premiun', re.IGNORECASE) pbatch=re.compile('batch', re.IGNORECASE) #convenient definitions bn = ' ' nline = '\n' tab = '\t' #default variables name_of_exe='m3dp.x' name_of_computer='seaborg' name_of_quenue = 'debug' num_of_proc=1 num_of_proc_total=1 wtime='00:30:00' name_of_job='m3dp' name_of_mode='vn' name_of_equilibrium='vmec4.dat' name_of_checkpoint='' name_of_config='config.dat' memory='4GB' #__________________________fun1 generate wxy file__________________________ def construct_wxy_file(wxy): """driver for m3d dec-21-2006 by Jin Chen""" new_wxy=[] nlist_in_wxy=[] for item in wxy: if(pcoment.match(item)): pass elif(pnewline.match(item)): pass else: new_wxy.append(string.strip(item)) #get rid of \n #print new_wxy #f=open('wxy', 'w') for item in new_wxy: #item is a string, wxy is a list #f.write(item) first=string.strip(item) second= re.sub(r"(\s)+=", "=", item) #get rid of space before = third= re.sub(r"=(\s)+", "=", second) #get rid of the space after = fourth= re.sub(r"(\s)+", " ", third) #keep only one space bettwen the fields fifth= re.split(r"\s", fourth) #fifth is a list for field in fifth: #sys.stdout.write(field+nline) #f.write(field+nline) if(pnlist.match(field)): #print ' is', wxy.index(' '+field+'\n'), 'th position in wxy' nlist_in_wxy.append(field) #f.close() num_nlist=len(nlist_in_wxy) print num_nlist, 'namelists are found for wxy :', nlist_in_wxy print #__________________________fun2 generate conf file__________________________ def construct_con_file(con): """driver for m3d dec-21-2006 by Jin Chen""" new_con=[] for item in con: if(pcoment.match(item)): pass elif(pnewline.match(item)): pass else: #f_m3d = re.match(r"(.+[\.].+)#(.*)", item) #peel of comments f_m3d = re.match(r"(.+[\.].+)(//)(.*)", item) i_m3d = re.match(r"(\d+)\s+(.*)", item) if(f_m3d): #print m_m3d.group(0) new_con.append(string.atof(f_m3d.group(1))) elif(i_m3d): #print n_m3d.group(0) new_con.append(string.atoi(i_m3d.group(1))) else: new_con.append(item) #f=open(name_of_config, 'w') #for item in new_con: #sys.stdout.write(str(item)+nline) #f.write(m3d[item]) #f.close() A= new_con[0] B= new_con[1] C= new_con[2] D= new_con[3] E= new_con[4] F= new_con[5] #global num_of_proc_total if(D==1): num_of_proc_total=B*F elif(D==2): num_of_proc_total=B*(F+1) print 'num_of_proc_total = ', num_of_proc_total print return num_of_proc_total #__________________________fun3 generate job script__________________________ def construct_job_file(other_option): """driver for m3d dec-21-2006 by Jin Chen""" pbs_sign = '#@' resource ='' account_no = 'mp288' runtime_option = '' #computer nodes= num_of_proc_total / num_of_proc print 'num_of_nodes = ', nodes sys.stdout.write('generate job submit file and then submitt the job'+nline) #mpi command if (pseaborg.match(name_of_computer)): runtime_option = runtime_option + 'poe' +bn if (pjacquard.match(name_of_computer)): runtime_option = runtime_option + 'mpiexec' +bn pbs_sign = '#PBS' resource = 'nodes=' + str(nodes) +':' + 'ppn=' + str(num_of_proc) + ',' + wtime if (pjaguar.match(name_of_computer)): runtime_option = runtime_option + 'yod' +bn pbs_sign = '#PBS' size = nodes sn = re.search("sn", name_of_mode) if(sn): size = num_of_proc_total resource = wtime +','+ memory +','+ 'size=' + str(size) account_no = 'FUS013' if (pbgl.match(name_of_computer)): runtime_option = runtime_option + 'cqsub' +bn+ '-q' +bn+ name_of_quenue +bn+ '-t' +bn+ str(wtime) +bn+ '-n' +bn+ str(num_of_proc*nodes) +bn+ '-'+name_of_mode +bn+ str(num_of_proc*nodes) +bn if (pmhd.match(name_of_computer)): runtime_option = runtime_option + 'mpirun' +bn+ '-np' +bn+ str(num_of_proc_total) + bn pbs_sign = '#PBS' resource = 'ncpus=' + str(num_of_proc_total) +',' + memory + ',' + wtime +bn #m3d executable runtime_option = runtime_option + name_of_exe + bn if (pseaborg.match(name_of_computer)): if(pinteractive.match(name_of_quenue)): runtime_option = runtime_option +bn+ '-retry 20 -retrycount 100' +bn+ \ '-nodes' +bn+ str(nodes) +bn+ \ '-tasks_per_node' +bn+ str(num_of_proc) +bn elif (pjaguar.match(name_of_computer)): runtime_option = runtime_option + '-'+name_of_mode.upper() +bn runtime_option = runtime_option + '\\' + nline #physics vmec = re.search("vmec", name_of_equilibrium) equin = re.search("\.in", name_of_equilibrium) if(vmec) : runtime_option = runtime_option + '-vmecfile' +bn+ name_of_equilibrium +bn+'\\'+nline elif equin: runtime_option = runtime_option + '-vmecInput' +bn+ name_of_equilibrium +bn+'\\'+nline if(name_of_checkpoint): runtime_option = runtime_option + '-checkpoint' +bn+ name_of_checkpoint +bn+'\\'+nline if(name_of_config): runtime_option = runtime_option + '-configFile' +bn+ name_of_config +bn+'\\'+nline runtime_option = runtime_option +'\\'+nline #other options runtime_option = runtime_option + other_option +'\\'+nline runtime_option = runtime_option +'\\'+nline #solver options symm = re.search("m3dp_fsymm", name_of_exe) if not symm: runtime_option = runtime_option + '-poisson_pc_type asm' +bn+'\\'+nline \ + '-poisson_pc_asm_overlap 1' +bn+'\\'+nline \ + '-poisson_sub_pc_type ilu' +bn+'\\'+nline \ + '-poisson_sub_pc_ilu_levels 3' +bn+'\\'+nline \ + '-poisson_ksp_type gmres' +bn+'\\'+nline \ + '\\' + nline runtime_option = runtime_option + '-poissonN_pc_type asm' +bn+'\\'+nline \ + '-poissonN_pc_asm_overlap 1' +bn+'\\'+nline \ + '-poissonN_sub_pc_type ilu' +bn+'\\'+nline \ + '-poissonN_sub_pc_ilu_levels 3' +bn+'\\'+nline \ + '-poissonN_ksp_type gmres' +bn+'\\'+nline \ + '\\' + nline runtime_option = runtime_option + '-xflg_nullspace' +bn+'\\'+nline \ + '-xpoissonN_pc_type asm' +bn+'\\'+nline \ + '-xpoissonN_pc_asm_overlap 1' +bn+'\\'+nline \ + '-xpoissonN_sub_pc_type icc' +bn+'\\'+nline \ + '-xpoissonN_sub_pc_factor_levels 3' +bn+'\\'+nline \ + '-xpoissonN_ksp_type cg' +bn+'\\'+nline \ + '\\' + nline runtime_option = runtime_option + '-poissonH_pc_type asm' +bn+'\\'+nline \ + '-poissonH_pc_asm_overlap 1' +bn+'\\'+nline \ + '-poissonH_sub_pc_type ilu' +bn+'\\'+nline \ + '-poissonH_sub_pc_ilu_levels 3' +bn+'\\'+nline \ + '-poissonH_ksp_type gmres' +bn+'\\'+nline \ + '\\' + nline runtime_option = runtime_option + '-pc_type asm' +bn+'\\'+nline \ + '-pc_asm_overlap 1' +bn+'\\'+nline \ + '-sub_pc_type ilu' +bn+'\\'+nline \ + '-sub_pc_ilu_levels 3' +bn+'\\'+nline \ + '-ksp_type gmres' +bn+'\\'+nline #runtime_option = runtime_option + '-poisson_ksp_view -poisson_ksp_monitor -poissonN_ksp_view -poissonN_ksp_monitor -poissonH_ksp_view -poissonH_ksp_monitor -ksp_view -ksp_monitor' elif symm : runtime_option = runtime_option + '-poisson_pc_type hypre' +bn+'\\'+nline \ + '-poisson_pc_hypre_type boomeramg' +bn+'\\'+nline \ + '-poisson_ksp_type cg' +bn+'\\'+nline \ + '\\' + nline runtime_option = runtime_option + '-poissonN_pc_type hypre' +bn+'\\'+nline \ + '-poissonN_pc_hypre_type boomeramg' +bn+'\\'+nline \ + '-poissonN_ksp_type cg' +bn+'\\'+nline \ + '\\' + nline runtime_option = runtime_option + '-xflg_nullspace' +bn+'\\'+nline \ + '-xpoissonN_pc_type asm' +bn+'\\'+nline \ + '-xpoissonN_pc_asm_overlap 1' +bn+'\\'+nline \ + '-xpoissonN_sub_pc_type icc' +bn+'\\'+nline \ + '-xpoissonN_sub_pc_factor_levels 3' +bn+'\\'+nline \ + '-xpoissonN_ksp_type cg' +bn+'\\'+nline \ + '\\' + nline runtime_option = runtime_option + '-poissonH_pc_type hypre' +bn+'\\'+nline \ + '-poissonH_pc_hypre_type boomeramg' +bn+'\\'+nline \ + '-poissonH_ksp_type cg' +bn+'\\'+nline \ + '\\' + nline runtime_option = runtime_option + '-pc_type jacobi' +bn+'\\'+nline \ + '-ksp_type cg' +bn+'\\'+nline #runtime_option = runtime_option + '-poisson_ksp_view -poisson_ksp_monitor -poissonN_ksp_view -poissonN_ksp_monitor -poissonH_ksp_view -poissonH_ksp_monitor -ksp_view -ksp_monitor' print #print 'runtime_option = %s'% runtime_option #script if (pseaborg.match(name_of_computer)): if(pinteractive.match(name_of_quenue)): f=open('rs.'+name_of_computer+'_'+name_of_job, 'w') f.write(runtime_option) f.close() sys.stderr.write('submit job: rs.'+name_of_computer+'_'+name_of_job) os.system('rs.'+name_of_computer+'_'+name_of_job) else: f=open('bs.'+name_of_computer+'_'+name_of_job, 'w') f.write('#@ shell = /usr/bin/csh\n') f.write('#@ job_name = %s\n'%name_of_job) f.write('#@ output = %s.out\n'%name_of_job) f.write('#@ error = %s.err\n'%name_of_job) f.write('#@ account_no = %s\n'%account_no) f.write('#@ job_type = parallel\n') f.write('#@ class = %s\n'%name_of_quenue) f.write('#@ tasks_per_node = '+ str(num_of_proc) +'\n') f.write('#@ node = '+ str(nodes) +'\n') f.write('#@ wall_clock_limit= %s\n'% wtime[9:]) f.write('#@ notification = complete\n') f.write('#@ network.MPI = csss,not_shared,us\n') f.write('#@ queue\n') f.write('\n') f.write(runtime_option) f.write('\n') f.write('\n') f.write('echo End of Execution `date`\n') f.write('\n') f.write('exit\n') f.close() sys.stderr.write('submit job: bs.'+name_of_computer+'_'+name_of_job) os.system('llsubmit bs.'+name_of_computer+'_'+name_of_job) elif (pbgl.match(name_of_computer)): f=open('rs.'+name_of_computer+'_'+name_of_job, 'w') f.write(runtime_option) f.close() sys.stderr.write('submit job: rs.'+name_of_computer+'_'+name_of_job) os.system('cqsub rs.'+name_of_computer+'_'+name_of_job) elif (pmhd.match(name_of_computer)): f=open('bs.'+name_of_computer+'_'+name_of_job, 'w') f.write('#!/bin/bash' + nline) f.write(pbs_sign +bn+ '-N' +bn+ '%s' % name_of_job + nline) f.write(pbs_sign +bn+ '-o' +bn+ '%s.out' % name_of_job + nline) f.write(pbs_sign +bn+ '-e' +bn+ '%s.err' % name_of_job + nline) f.write(pbs_sign +bn+ '-l' +bn+ '%s' % resource + nline) f.write(pbs_sign +bn+ '-q' +bn+ 'sgi' + nline) f.write(pbs_sign +bn+ '-m' +bn+ 'e' + nline) f.write(pbs_sign +bn+ '-V' + nline) f.write(nline) f.write('echo -n \'Started job at : \' ; date' + nline + nline) f.write(runtime_option) f.write(nline) f.write('echo -n \'Ended job at : \' ; date' + nline) f.close() sys.stderr.write('script created for' +bn+ name_of_computer +bn+ 'computer' + nline) sys.stdout.write('get more helps from beowulf.pppl.gov/SGI/SGI_User_Guide.htm'+nline) else: f=open('bs.'+name_of_computer+'_'+name_of_job, 'w') f.write('#!/bin/csh' + nline) f.write(pbs_sign +bn+ '-A' +bn+ '%s' % account_no + nline) f.write(pbs_sign +bn+ '-N' +bn+ '%s' % name_of_job + nline) f.write(pbs_sign +bn+ '-o' +bn+ '%s.out' % name_of_job + nline) f.write(pbs_sign +bn+ '-e' +bn+ '%s.err' % name_of_job + nline) f.write(pbs_sign +bn+ '-l' +bn+ '%s' % resource + nline) f.write(pbs_sign +bn+ '-q' +bn+ '%s' % name_of_quenue + nline) f.write(pbs_sign +bn+ '-m' +bn+ 'e' + nline) f.write(pbs_sign +bn+ '-V' + nline) f.write(nline) if (pjacquard.match(name_of_computer)): #path = os.getcwd() #pritnt path #f.write('cd'+bn+path) f.write('ulimit -v 5242880'+nline) f.write('echo'+bn+'$PBS_NODEFILE'+nline) f.write('echo'+bn+'$PBS_O_WORKDIR'+nline) f.write(nline) f.write('cd'+bn+'$PBS_O_WORKDIR'+nline) f.write(nline) f.write(runtime_option) f.write(nline) f.write(nline) f.write('echo End of Execution `date`\n') f.write(nline) f.write('exit' + nline) f.close() sys.stderr.write('qsub job: bs.'+name_of_computer+'_'+name_of_job) os.system('qsub bs.'+name_of_computer+'_'+name_of_job) #__________________________main__________________________ if __name__ == "__main__": """driver for m3d dec-21-2006 by Jin Chen""" new_m3d=[] resource=[] others=[] con=[] wxy=[] block=[] start_of_resource = 0 start_of_others = 0 start_of_conf = 0 start_of_wxy = 0 #read in the files name_m3d=sys.argv[1] fid_m3d=file(name_m3d, 'r') m3d=fid_m3d.readlines() #m3d is a list fid_m3d.close() print 'm3d input is given in file %s'% name_m3d #for item in m3d: #sys.stdout.write(item) print #seperate each block into individual list for item in m3d: if(pmkfile.match(item)): block.append(m3d.index(item)) elif(pexec.match(item)): ind=m3d.index(item) block.append(ind) first = string.strip(m3d[ind+1]) second = first.split() for item in second: if pstar.match(item): name_of_exe = item[1:] print 'name_of_executable: %s'% name_of_exe elif(pcomputer.match(item)): ind=m3d.index(item) block.append(ind) first = string.strip(m3d[ind+1]) second = first.split() for item in second: if pstar.match(item): name_of_computer=item[1:] print 'name_of_computer: %s'% name_of_computer elif(pquenue.match(item)): ind=m3d.index(item) block.append(ind) first = string.strip(m3d[ind+1]) second = first.split() for item in second: if pstar.match(item): name_of_quenue=item[1:] print 'name_of_quenue: %s'% name_of_quenue elif(presource.match(item)): ind=m3d.index(item) block.append(ind) start_of_resource = len(block)-1 #presource=m3d[ind+1].strip() #print 'wall_clock_time is: %s'% wtime elif(pjobname.match(item)): ind=m3d.index(item) block.append(ind) first = string.strip(m3d[ind+1]) second = first.split() for item in second: if pstar.match(item): name_of_job=item[1:] print 'runtime job name is: %s'% name_of_job elif(pmode.match(item)): ind=m3d.index(item) block.append(ind) first = string.strip(m3d[ind+1]) second = first.split() for item in second: if pstar.match(item): name_of_mode=item[1:] print 'name_of_mode: %s'% name_of_mode elif(pequilibrium.match(item)): ind=m3d.index(item) block.append(ind) first = string.strip(m3d[ind+1]) second = first.split() for item in second: if pstar.match(item): name_of_equilibrium=item[1:] print 'name_of_equilibrium: %s'% name_of_equilibrium elif(pchk.match(item)): ind=m3d.index(item) block.append(ind) first = string.strip(m3d[ind+1]) second = first.split() for item in second: if pstar.match(item): name_of_checkpoint=item[1:] print 'name_of_checkpoint: %s'% name_of_checkpoint elif(pothers.match(item)): ind=m3d.index(item) block.append(ind) start_of_others = len(block)-1 #num_of_proc=string.atoi(m3d[ind+1]) #print 'num_of_proc: %d'% num_of_proc elif(pconf.match(item)): ind=m3d.index(item) block.append(ind) start_of_conf = len(block)-1 first= string.strip(m3d[ind+1]) second = first.split() for item in second: if pstar.match(item): name_of_config=item[1:] print 'name_of_configuration: %s'% name_of_config elif(pwxy.match(item)): block.append(m3d.index(item)) start_of_wxy = len(block)-1 elif(pend.match(item)): block.append(m3d.index(item)) print 'We found %s blocks: resource start from %d; other options start from %d; conf start from %d; wxy start from %d'% (len(block), start_of_resource, start_of_others, start_of_conf, start_of_wxy) print if (pseaborg.match(name_of_computer)): pass elif (pbgl.match(name_of_computer)): if (pdebug.match(name_of_quenue)): name_of_quenue='short' else: name_of_quenue='long' else: if (pdebug.match(name_of_quenue)): pass else: name_of_quenue='batch' #construct resouce list if(start_of_resource): for index in range( block[start_of_resource]+1, block[start_of_resource+1]): if(pcoment.match(m3d[index])): pass elif(pnewline.match(m3d[index])): pass else: resource.append(string.strip(m3d[index])) #get rid of \n print 'resource list = '#, resource for item in resource: #item is a string, wxy is a list first=string.strip(item) second= re.sub(r"(\s)+=", "=", item) #get rid of space before = third= re.sub(r"=(\s)+", "=", second) #get rid of the space after = fourth= re.sub(r"(\s)+", " ", third) #keep only one space bettwen the fields fifth= re.split(r"\s", fourth) #fifth is a list for field in fifth: #sys.stdout.write("\t"+field+nline) c_m3d = re.match(r"(.+[\.].+)#(.*)", field) #peel of comments i_m3d = re.match(r"(.+)(=)(\d+)", field) #peel of integer s_m3d = re.match(r"(.+)(=)(.+)", field) #peel of string pnp = re.search("num_proc_per_node", field) if(pnp): print i_m3d.group(0) num_of_proc = string.atoi((i_m3d.group(3))) wtim = re.search("walltime", field) if(wtim): print s_m3d.group(0) wtime= s_m3d.group(0) memo = re.search("mem", field) if(memo): print s_m3d.group(0) memory = s_m3d.group(0) print #construct others list if(start_of_others): for index in range( block[start_of_others]+1, block[start_of_others+1]): if(pcoment.match(m3d[index])): pass elif(pnewline.match(m3d[index])): pass else: others.append(string.strip(m3d[index])) #get rid of \n other_option = '' print 'other options = '#, others for item in others: #item is a string, wxy is a list first=string.strip(item) second= re.sub(r"(\s)+=", "=", item) #get rid of space before = third= re.sub(r"=(\s)+", "=", second) #get rid of the space after = fourth= re.sub(r"(\s)+", " ", third) #keep only one space bettwen the fields fifth= re.split(r"\s", fourth) #fifth is a list for field in fifth: #sys.stdout.write("\t"+field+nline) c_m3d = re.match(r"(.+[\.].+)#(.*)", field) #peel of comments i_m3d = re.match(r"(.+)(=)(\d+)", field) #peel of integer s_m3d = re.match(r"(.+)(=)(.+)", field) #peel of string f_m3d = re.match(r"(.+[\.].+)(//)(.*)", item) #peel of float chkf = re.search("iwriteCheckPoint", field) if(chkf): print i_m3d.group(1), i_m3d.group(3) other_option = other_option + '-'+i_m3d.group(1) +bn+ i_m3d.group(3) +bn rescale = re.search("rescale", field) if(rescale): print i_m3d.group(1), i_m3d.group(3) if string.atoi(i_m3d.group(3)) > 0: other_option = other_option + '-'+i_m3d.group(1) +bn EB = re.search("EngUpBound", field) if(EB): print s_m3d.group(1), s_m3d.group(3) other_option = other_option + '-'+s_m3d.group(1) +bn+ s_m3d.group(3) +bn timestep = re.search("timestep", field) if(timestep): print s_m3d.group(1), s_m3d.group(3) other_option = other_option + '-'+s_m3d.group(1) +bn+ s_m3d.group(3) +bn NumRestart = re.search("NumRestart", field) if(NumRestart): print i_m3d.group(1), i_m3d.group(3) other_option = other_option + '-'+s_m3d.group(1) +bn+ s_m3d.group(3) +bn samplingT = re.search("samplingT", field) if(samplingT): print i_m3d.group(1), i_m3d.group(3) other_option = other_option + '-'+s_m3d.group(1) +bn+ s_m3d.group(3) +bn its = re.search("its", field) if(its): print i_m3d.group(1), i_m3d.group(3) other_option = other_option + '-'+s_m3d.group(1) +bn+ s_m3d.group(3) +bn print other_option print #construct configuration list if(start_of_conf): sys.stdout.write('generate configuration file'+nline) f=open(name_of_config, 'w') #print ' range', ( block[start_of_conf]+1, block[start_of_conf+1]) for index in range( block[start_of_conf]+2, block[start_of_conf+1]): con.append(m3d[index]) #pd.findall(new_m3d[index])) f.write(m3d[index]) f.close() #construct wxy list if(start_of_wxy): sys.stdout.write('generate wxy file'+nline) f=open('wxy', 'w') #print ' range', ( block[start_of_wxy]+1, block[start_of_wxy+1]) for index in range( block[start_of_wxy]+1, block[start_of_wxy+1]): #sys.stdout.write(m3d[index]) wxy.append(m3d[index]) f.write(m3d[index]) #wxy.append(string.strip(new_m3d[index])) f.close() sys.stdout.write(nline) num_of_proc_total = construct_con_file(con) construct_wxy_file(wxy) construct_job_file(other_option)