1313Step 4: matrix Spinup off
1414"""
1515import shutil , glob , os , sys
16+ from datetime import datetime
1617
1718if __name__ == "__main__" :
1819 CIMEROOT = os .environ .get ("CIMEROOT" )
2425else :
2526 from CIME .status import append_testlog
2627
28+ from CIME .case import Case
2729from CIME .XML .standard_module_setup import *
2830from CIME .SystemTests .system_tests_common import SystemTestsCommon
2931from CIME .SystemTests .test_utils import user_nl_utils
@@ -186,6 +188,26 @@ def append_user_nl(self, caseroot, n=0):
186188 caseroot = caseroot , component = self .comp , contents = contents_to_append
187189 )
188190
191+ def run_indv (self , nstep , st_archive = True ):
192+ """
193+ Individual run of a given step
194+ """
195+ suffix = "step{}" .format (self .steps [nstep ])
196+ if isinstance (self ._case , Case ):
197+ super ().run_indv (suffix , st_archive = True )
198+ else :
199+ caseroot = self ._case .get_value ("CASEROOT" )
200+ dout_sr = self ._case .get_value ("DOUT_S_ROOT" )
201+ rest_r = os .path .join (dout_sr , "rest" )
202+ nyear = 1851 + nstep
203+ rundate = "%s-01-01-00000" % nyear
204+ restdir = os .path .join (rest_r , rundate )
205+ os .mkdir (restdir )
206+ rpoint = os .path .join (restdir , "rpointer.clm." + rundate )
207+ os .mknod (rpoint )
208+ rpoint = os .path .join (restdir , "rpointer.cpl." + rundate )
209+ os .mknod (rpoint )
210+
189211 def run_phase (self ):
190212 "Run phase"
191213
@@ -225,6 +247,7 @@ def run_phase(self):
225247 self .append_user_nl (clone_path , n )
226248
227249 dout_sr = clone .get_value ("DOUT_S_ROOT" )
250+ ninst = self ._case .get_value ("NINST" )
228251
229252 self ._skip_pnl = False
230253 #
@@ -247,14 +270,24 @@ def run_phase(self):
247270 os .makedirs (rundir )
248271 os .symlink (item , linkfile )
249272
250- for item in glob .glob ("{}/*rpointer*" .format (rest_path )):
251- shutil .copy (item , rundir )
273+ # For a branch the cpl rpointer file needs to be handled
274+ if self .runtyp [n ] == "branch" :
275+
276+ drvrest = "rpointer.cpl"
277+ if ninst > 1 :
278+ drvrest += "_0001"
279+ drvrest += rest_time
252280
281+ self ._set_drv_restart_pointer (drvrest )
282+ try :
283+ shutil .copy (drvrest , rundir )
284+ except shutil .SameFileError :
285+ pass
253286 #
254287 # Run the case (Archiving on)
255288 #
256289 self ._case .flush ()
257- self .run_indv (suffix = "step{}" . format ( self . steps [ n ]) , st_archive = True )
290+ self .run_indv (nstep = n , st_archive = True )
258291
259292 #
260293 # Get the reference case from this step for the next step
@@ -267,6 +300,7 @@ def run_phase(self):
267300 )
268301 refsec = "00000"
269302 rest_path = os .path .join (dout_sr , "rest" , "{}-{}" .format (refdate , refsec ))
303+ rest_time = "." + refdate + "-" + refsec
270304
271305 #
272306 # Last step in original case
@@ -292,10 +326,22 @@ def run_phase(self):
292326 linkfile = os .path .join (rundir , os .path .basename (item ))
293327 if os .path .exists (linkfile ):
294328 os .remove (linkfile )
329+ expect (True , os .path .exists (item ), "expected file does NOT exist = " + item )
295330 os .symlink (item , linkfile )
296331
297- for item in glob .glob ("{}/*rpointer*" .format (rest_path )):
298- shutil .copy (item , rundir )
332+ # For a branch the cpl rpointer file needs to be handled
333+ if self .runtyp [n ] == "branch" :
334+
335+ drvrest = "rpointer.cpl"
336+ if ninst > 1 :
337+ drvrest += "_0001"
338+ drvrest += rest_time
339+
340+ self ._set_drv_restart_pointer (drvrest )
341+ try :
342+ shutil .copy (os .path .join (rest_path , drvrest ), rundir )
343+ except shutil .SameFileError :
344+ pass
299345
300346 self .append_user_nl (clone_path , n )
301347 #
@@ -306,66 +352,4 @@ def run_phase(self):
306352 # Run the case (short term archiving is off)
307353 #
308354 self ._case .flush ()
309- self .run_indv (suffix = "step{}" .format (self .steps [n ]), st_archive = False )
310-
311-
312- #
313- # Unit testing for above
314- #
315- import unittest
316- from CIME .case import Case
317- from CIME .utils import _LessThanFilter
318- from argparse import RawTextHelpFormatter
319-
320-
321- class test_ssp_matrixcn (unittest .TestCase ):
322- def setUp (self ):
323- self .ssp = SSPMATRIXCN ()
324-
325- def test_logger (self ):
326- # Test the logger
327- stream_handler = logging .StreamHandler (sys .stdout )
328- logger .addHandler (stream_handler )
329- logger .level = logging .DEBUG
330- logger .info ("nyr_forcing = {}" .format (self .ssp .nyr_forcing ))
331- for n in range (self .ssp .n_steps ()):
332- self .ssp .__logger__ (n )
333- if self .ssp .spin [n ] == "sasu" :
334- logger .info (" SASU spinup is .true." )
335- if self .ssp .sasu [n ] != - 999 :
336- logger .info (" nyr_sasu = {}" .format (self .ssp .sasu [n ]))
337- if self .ssp .iloop [n ] != - 999 :
338- logger .info (" iloop_avg = {}" .format (self .ssp .iloop [n ]))
339-
340- logger .info ("Total number of years {}" .format (self .ssp .total_years ()))
341- logger .removeHandler (stream_handler )
342-
343- def test_n_steps (self ):
344- self .assertTrue (self .ssp .n_steps () == 3 )
345-
346- def test_valid_n (self ):
347- for n in range (self .ssp .n_steps ()):
348- self .ssp .check_n (n )
349-
350- def test_negative_n (self ):
351- self .assertRaises (SystemExit , self .ssp .check_n , - 1 )
352-
353- def test_n_too_big (self ):
354- self .assertRaises (SystemExit , self .ssp .check_n , self .ssp .n_steps ())
355-
356- def test_append_user_nl_step2 (self ):
357- ufile = "user_nl_clm"
358- if not os .path .exists (ufile ):
359- os .mknod (ufile )
360- else :
361- expect (0 , ufile + " file already exists, not overwritting it" )
362-
363- self .ssp .append_user_nl (caseroot = "." , n = 2 )
364- print (ufile + " for step 2" )
365- log = open (ufile , "r" ).read ()
366- print (log )
367- os .remove (ufile )
368-
369-
370- if __name__ == "__main__" :
371- unittest .main ()
355+ self .run_indv (nstep = n , st_archive = False )
0 commit comments