Source code for issm.generic

import socket
import os
import math
import subprocess
from issm.IssmConfig import IssmConfig
from issm.issmdir import issmdir
from issm.pairoptions import pairoptions
from issm.issmssh import issmssh
from issm.issmscpin import issmscpin
from issm.issmscpout import issmscpout
import issm.MatlabFuncs as m

[docs]class generic(object): """ GENERIC cluster class definition Usage: cluster=generic('name','astrid','np',3); cluster=generic('name',gethostname(),'np',3,'login','username'); """ def __init__(self,*args): # {{{ self.name='' self.login='' self.np=1 self.port=0 self.interactive=1 self.codepath=IssmConfig('ISSM_PREFIX')[0]+'/bin' self.executionpath=issmdir()+'/execution' self.valgrind=issmdir()+'/externalpackages/valgrind/install/bin/valgrind' self.valgrindlib=issmdir()+'/externalpackages/valgrind/install/lib/libmpidebug.so' self.valgrindsup=issmdir()+'/externalpackages/valgrind/issm.supp' #use provided options to change fields options=pairoptions(*args) #get name self.name=socket.gethostname() #initialize cluster using user settings if provided if os.path.exists(self.name+'_settings.py'): execfile(self.name+'_settings.py',globals()) #OK get other fields self=options.AssignObjectFields(self) # }}} def __repr__(self): # {{{ # display the object s ="class '%s' object '%s' = \n" % (type(self),'self') s+=" name: %s\n" % self.name s+=" login: %s\n" % self.login s+=" np: %i\n" % self.np s+=" port: %i\n" % self.port s+=" codepath: %s\n" % self.codepath s+=" executionpath: %s\n" % self.executionpath s+=" valgrind: %s\n" % self.valgrind s+=" valgrindlib: %s\n" % self.valgrindlib s+=" valgrindsup: %s\n" % self.valgrindsup return s # }}}
[docs] def checkconsistency(self,md,solution,analyses): # {{{ if self.np<1: md = checkmessage(md,'number of processors should be at least 1') if math.isnan(self.np): md = checkmessage(md,'number of processors should not be NaN!') return md
# }}}
[docs] def BuildQueueScript(self,dirname,modelname,solution,io_gather,isvalgrind,isgprof,isdakota,isoceancoupling): # {{{ executable='issm.exe'; if isdakota: version=IssmConfig('_DAKOTA_VERSION_')[0:2] version=float(version) if version>=6: executable='issm_dakota.exe' if isoceancoupling: executable='issm_ocean.exe' #write queuing script if not m.ispc(): fid=open(modelname+'.queue','w') fid.write('#!/bin/sh\n') if not isvalgrind: if self.interactive: if IssmConfig('_HAVE_MPI_')[0]: fid.write('mpiexec -np %i %s/%s %s %s/%s %s ' % (self.np,self.codepath,executable,solution,self.executionpath,dirname,modelname)) else: fid.write('%s/%s %s %s/%s %s ' % (self.codepath,executable,solution,self.executionpath,dirname,modelname)) else: if IssmConfig('_HAVE_MPI_')[0]: fid.write('mpiexec -np %i %s/%s %s %s/%s %s 2> %s.errlog >%s.outlog ' % (self.np,self.codepath,executable,solution,self.executionpath,dirname,modelname,modelname,modelname)) else: fid.write('%s/%s %s %s/%s %s 2> %s.errlog >%s.outlog ' % (self.codepath,executable,solution,self.executionpath,dirname,modelname,modelname,modelname)) elif isgprof: fid.write('\n gprof %s/%s gmon.out > %s.performance' % (self.codepath,executable,modelname)) else: #Add --gen-suppressions=all to get suppression lines fid.write('LD_PRELOAD=%s \\\n' % self.valgrindlib) if IssmConfig('_HAVE_MPI_')[0]: fid.write('mpiexec -np %i %s --leak-check=full --suppressions=%s %s/%s %s %s/%s %s 2> %s.errlog >%s.outlog ' % \ (self.np,self.valgrind,self.valgrindsup,self.codepath,executable,solution,self.executionpath,dirname,modelname,modelname,modelname)) else: fid.write('%s --leak-check=full --suppressions=%s %s/%s %s %s/%s %s 2> %s.errlog >%s.outlog ' % \ (self.valgrind,self.valgrindsup,self.codepath,executable,solution,self.executionpath,dirname,modelname,modelname,modelname)) if not io_gather: #concatenate the output files: fid.write('\ncat %s.outbin.* > %s.outbin' % (modelname,modelname)) fid.close() else: # Windows fid=open(modelname+'.bat','w') fid.write('@echo off\n') if self.interactive: fid.write('"%s/%s" %s "%s/%s" %s ' % (self.codepath,executable,solution,self.executionpath,dirname,modelname)) else: fid.write('"%s/%s" %s "%s/%s" %s 2> %s.errlog >%s.outlog' % \ (self.codepath,executable,solution,self.executionpath,dirname,modelname,modelname,modelname)) fid.close() #in interactive mode, create a run file, and errlog and outlog file if self.interactive: fid=open(modelname+'.errlog','w') fid.close() fid=open(modelname+'.outlog','w') fid.close()
# }}}
[docs] def BuildKrigingQueueScript(self,modelname,solution,io_gather,isvalgrind,isgprof): # {{{ #write queuing script if not m.ispc(): fid=open(modelname+'.queue','w') fid.write('#!/bin/sh\n') if not isvalgrind: if self.interactive: fid.write('mpiexec -np %i %s/kriging.exe %s/%s %s ' % (self.np,self.codepath,self.executionpath,modelname,modelname)) else: fid.write('mpiexec -np %i %s/kriging.exe %s/%s %s 2> %s.errlog >%s.outlog ' % (self.np,self.codepath,self.executionpath,modelname,modelname,modelname,modelname)) elif isgprof: fid.write('\n gprof %s/kriging.exe gmon.out > %s.performance' & (self.codepath,modelname)) else: #Add --gen-suppressions=all to get suppression lines fid.write('LD_PRELOAD=%s \\\n' % self.valgrindlib) fid.write('mpiexec -np %i %s --leak-check=full --suppressions=%s %s/kriging.exe %s/%s %s 2> %s.errlog >%s.outlog ' % \ (self.np,self.valgrind,self.valgrindsup,self.codepath,self.executionpath,modelname,modelname,modelname,modelname)) if not io_gather: #concatenate the output files: fid.write('\ncat %s.outbin.* > %s.outbin' % (modelname,modelname)) fid.close() else: # Windows fid=open(modelname+'.bat','w') fid.write('@echo off\n') if self.interactive: fid.write('"%s/issm.exe" %s "%s/%s" %s ' % (self.codepath,solution,self.executionpath,modelname,modelname)) else: fid.write('"%s/issm.exe" %s "%s/%s" %s 2> %s.errlog >%s.outlog' % \ (self.codepath,solution,self.executionpath,modelname,modelname,modelname,modelname)) fid.close() #in interactive mode, create a run file, and errlog and outlog file if self.interactive: fid=open(modelname+'.errlog','w') fid.close() fid=open(modelname+'.outlog','w') fid.close()
# }}}
[docs] def UploadQueueJob(self,modelname,dirname,filelist): # {{{ #compress the files into one zip. compressstring='tar -zcf %s.tar.gz ' % dirname for file in filelist: compressstring += ' %s' % file if self.interactive: compressstring += ' %s.errlog %s.outlog ' % (modelname,modelname) subprocess.call(compressstring,shell=True) print 'uploading input file and queueing script' issmscpout(self.name,self.executionpath,self.login,self.port,[dirname+'.tar.gz'])
# }}}
[docs] def LaunchQueueJob(self,modelname,dirname,filelist,restart,batch): # {{{ print 'launching solution sequence on remote cluster' if restart: launchcommand='cd %s && cd %s chmod 777 %s.queue && ./%s.queue' % (self.executionpath,dirname,modelname,modelname) else: if batch: launchcommand='cd %s && rm -rf ./%s && mkdir %s && cd %s && mv ../%s.tar.gz ./ && tar -zxf %s.tar.gz' % \ (self.executionpath,dirname,dirname,dirname,dirname,dirname) else: launchcommand='cd %s && rm -rf ./%s && mkdir %s && cd %s && mv ../%s.tar.gz ./ && tar -zxf %s.tar.gz && chmod 777 %s.queue && ./%s.queue' % \ (self.executionpath,dirname,dirname,dirname,dirname,dirname,modelname,modelname) issmssh(self.name,self.login,self.port,launchcommand)
# }}}
[docs] def Download(self,dirname,filelist): # {{{ if m.ispc(): #do nothing return #copy files from cluster to current directory directory='%s/%s/' % (self.executionpath,dirname) issmscpin(self.name,self.login,self.port,directory,filelist)
# }}}