diff --git a/da/tools/initexit.py b/da/tools/initexit.py index 2402d00c91409164b579658f2972f4b5206ff763..7ee70826d4d54fe6296cdf06e57c06df6c085459 100755 --- a/da/tools/initexit.py +++ b/da/tools/initexit.py @@ -73,6 +73,9 @@ needed_da_items = [ 'time.nlag', 'time.cycle', 'dir.da_run', + 'da.resources.ncycles_per_job', + 'da.resources.ntasks', + 'da.resources.ntime', 'da.system', 'da.system.rc', 'da.obsoperator', @@ -299,6 +302,7 @@ class CycleControl(dict): strippedname = os.path.split(self['jobrcfilename'])[-1] self['jobrcfilename'] = os.path.join(self['dir.exec'], strippedname) self.read_random_seed(False) + self['da.resources.ncycle_in_job'] = self['da.resources.ncycles_per_job'] # force submission of next job after this elif self['time.restart']: logging.info("Restarting filter from previous step") @@ -306,10 +310,15 @@ class CycleControl(dict): strippedname = os.path.split(self['jobrcfilename'])[-1] self['jobrcfilename'] = os.path.join(self['dir.exec'], strippedname) self.read_random_seed(False) + self['da.resources.ncycle_in_job'] = int(self['da.resources.ncycle_in_job'])+1 + if int(self['da.resources.ncycle_in_job']) > int(self['da.resources.ncycles_per_job']): + self['da.resources.ncycle_in_job'] = 1 # reset counter if we just submitted this job + else: #assume that it is a fresh start, change this condition to more specific if crash recover added logging.info("First time step in filter sequence") self.setup_file_structure() + self['da.resources.ncycle_in_job'] = self['da.resources.ncycles_per_job'] # force submission of next job after this # expand jobrcfilename to include exec dir from now on. # First strip current leading path from filename @@ -482,7 +491,7 @@ class CycleControl(dict): fname = os.path.join(self['dir.restart'], 'da_runtime_%s.rc' % new_dacycle['time.start'].strftime('%Y%m%d'))#advanced time rc.write(fname, new_dacycle) - logging.debug('Wrote new da_runtime.rc (%s) to exec dir' % fname) + logging.debug('Wrote new da_runtime.rc (%s) to restart dir' % fname) # The rest is info needed for a system restart, so it modifies the current dacycle object (self) @@ -523,11 +532,25 @@ class CycleControl(dict): execcommand = os.path.join(self['dir.da_submit'], sys.argv[0]) if '-t' in self.opts: (self.opts).remove('-t') - template += 'python %s rc=%s %s >&%s' % (execcommand, self['da.restart.fname'], join(self.opts, ''), logfile) + + ncycles = int(self['da.resources.ncycles_per_job']) + + for cycle in range(ncycles): + nextjobid = '%s'% ( (self['time.end']+cycle*self['cyclelength']).strftime('%Y%m%d'),) + nextrestartfilename = self['da.restart.fname'].replace(jobid,nextjobid) + nextlogfilename = logfile.replace(jobid,nextjobid) + template += 'python %s rc=%s %s >&%s\n' % (execcommand, nextrestartfilename, join(self.opts, ''), nextlogfilename) # write and submit self.daplatform.write_job(jobfile, template, jobid) - jobid = self.daplatform.submit_job(jobfile, joblog=logfile) + if 'da.resources.ncycles_per_job' in self: + do_submit = (int(self['da.resources.ncycle_in_job']) == int(self['da.resources.ncycles_per_job'])) + else: + dosubmit = True + + if do_submit: + jobid = self.daplatform.submit_job(jobfile, joblog=logfile) + else: logging.info('Final date reached, no new cycle started')