Esempio n. 1
0
class overturn(Engine):

    def create_sweeper(self):
        """Define the parameter space and return a sweeper."""
        parameters = {
            'RA': ['1.e5', '1.e6', '1.e7'],
            'RCMB' : [2.],
            'KFe' : [0.85, 0.9, 0.95, 0.99]
            }
        sweeps = sweep(parameters)
        self.sweeper = ParamSweeper(os.path.join(self.result_dir, "sweeps"),
                                    sweeps)

    def create_par_file(self, comb):
        """Create Run directory on remote server and upload par file"""
        logger.info('Creating and uploading par file')
        comb_dir = parent_dir + slugify(comb) + '/'
        logger.info('comb_dir = ' + comb_dir)
        # Create remote directories
        make_dirs = SshProcess('mkdir -p ' + comb_dir + 'Img ; mkdir -p ' +
                               comb_dir + 'Op ; ', jobserver).run()
        # Generate par file
        par_file = 'par_' + slugify(comb)
        logger.info('par_file = %s', style.emph(par_file))
        nml = f90nml.read('template.nml')
        nml['refstate']['ra0'] = float(comb['RA'])
        nml['tracersin']['K_Fe'] = comb['KFe']
        nml['geometry']['r_cmb'] = comb['RCMB']
        nztot = min(int(2**(math.log10(float(comb['RA']))+1)), 128)
        nml['geometry']['nztot'] = nztot
        nml['geometry']['nytot'] = int(math.pi*(comb['RCMB']+0.5)*nztot)
        nml.write(par_file, force=True)
        logger.info('Created par file ' + par_file)
        # Upload par file to remote directory
        Put([jobserver], [par_file], remote_location=comb_dir).run()
        SshProcess('cd ' + comb_dir + ' ; mv ' + par_file+ ' par', jobserver).run()
        logger.info('Done')

    def submit_job(self, comb):
        """Use the batch script on psmn"""
        logger.info('Submit job on '+ jobserver)
        comb_dir = parent_dir + slugify(comb) + '/'
        job_sub = SshProcess('cd ' + comb_dir +
                             ' ; /usr/local/bin/qsub /home/stephane/ExamplePBS/batch_single',
                             jobserver).run()

        return job_sub.stdout.splitlines()[-1].split('.')[0]

    def is_job_running(self, job_id=None):
        """ """
        get_state = SshProcess('qstat -f ' + str(job_id), jobserver)
        get_state.ignore_exit_code = True
        get_state.run()
        return get_state.ok

    def retrieve(self):
        """ """
        SshProcess('')

    def workflow(self, comb):
        self.create_par_file(comb)
        job_id = self.submit_job(comb)
        logger.info('Combination %s will be treated by job %s',
                    slugify(comb), str(job_id))

        while self.is_job_running(job_id):
            sleep(10)

        self.sweeper.done(comb)


    def run(self):

        self.create_sweeper()
        logger.info('%s parameters combinations to be treated', len(self.sweeper.get_sweeps()))
        threads = []
        while len(self.sweeper.get_remaining()) > 0:
            comb = self.sweeper.get_next()
            logger.info('comb = %s', comb)
            t = Thread(target=self.workflow, args=(comb,))
            t.daemon = True
            threads.append(t)
            t.start()
        
        for t in threads:
			t.join()
Esempio n. 2
0
class overturn(Engine):

    def create_sweeper(self):
        """Define the parameter space and return a sweeper."""
        parameters = {
            'RA': ['1.e5', '1.e6'],
            'RCMB' : [1.19, 3.29],
            'KFe' : [0.85, 0.9]
            }
        sweeps = sweep(parameters)
        self.sweeper = ParamSweeper(os.path.join(self.result_dir, "sweeps"),
                                    sweeps)

    def create_par_file(self, comb):
        """Create Run directory on remote server and upload par file"""
        logger.info('Creating par file')
        comb_dir = parent_dir + slugify(comb) + '/'
        logger.info('comb_dir = ' + comb_dir)
        # Create remote directories
        
        mdir = sp.call('mkdir -p ' + comb_dir + 'Img ; mkdir -p ' + comb_dir + 'Op ; ', shell=True)
        # Generate par file
        par_file = 'par_' + slugify(comb)
        nml = f90nml.read('template.nml')
        nml['refstate']['ra0'] = float(comb['RA'])
        nml['tracersin']['K_Fe'] = comb['KFe']
        nml['geometry']['r_cmb'] = comb['RCMB']
        nztot = min(int(2**(math.log10(float(comb['RA']))+1)), 128)
        nml['geometry']['nztot'] = nztot
        nml['geometry']['nytot'] = int(math.pi*(comb['RCMB']+0.5)*nztot)
        nml.write(par_file, force=True)
        logger.info('Created par file ' + par_file)
        # Upload par file to remote directory
        cpar = sp.call('cp ' + par_file + ' ' + comb_dir, shell=True)
        mpar = sp.call('cd ' + comb_dir + ' ; mv ' + par_file+ ' par', shell=True)
        logger.info('Done')

    def submit_job(self, comb):
        """Use the batch script"""
        logger.info('Submiting job on '+ jobserver)
        comb_dir = parent_dir + slugify(comb) + '/'
        job_sub = sp.Popen('cd ' + comb_dir +
                             ' ; /usr/local/bin/qsub /home/stephane/ExamplePBS/batch_single',
                             shell=True,
                             stdout=sp.PIPE, stderr=sp.STDOUT)
        return job_sub.stdout.readlines()[-1].split('.')[0]

    def workflow(self, comb):
        self.create_par_file(comb)
        job_id = self.submit_job(comb)
        logger.info('Combination %s will be treated by job %s',
                    slugify(comb), str(job_id))
        self.sweeper.done(comb)

    def run(self):
        self.create_sweeper()
        logger.info('%s parameters combinations to be treated', len(self.sweeper.get_sweeps()))
        threads = []
        while len(self.sweeper.get_remaining()) > 0:
            comb = self.sweeper.get_next()
            t = Thread(target=self.workflow, args=(comb,))
            t.daemon = True
            threads.append(t)
            t.start()
        for t in threads:
			t.join()