Beispiel #1
0
def cm1_prep(mem, start, end, restart_name='cm1out_rst_000001.nc'):
    """ Function to write new namelist.input and check to be
        sure files are in order 

    """
    # If this is a restart, be sure we have the right file
    if start != 0:
        # Try loading the restart file with the correct name
        if not os.path.exists(restart_name):
            error_handler(
                'unable to find file {:s} in member {:d} directory'.format(
                    restart_name, mem), 'cm1_prep')
        # Make sure that the restart file is indeed at the correct time
        rstnc = Dataset(restart_name, 'r')
        time_sec = int(rstnc.variables['time'][0])
        rstnc.close()
        if time_sec != start:
            error_handler(
                'restart file {:s} for member {:d} does not match current cycle time: {:d} min.'
                .format(restart_name, mem, start), 'cm1_prep')

    # Find out how long the run should be
    dtime = int(end - start)

    # Write the namelist
    if not os.path.exists('namelist.input'):
        os.system('cp {:s}/namelist.input .'.format(dir_dom))
    nmld = read_namelist('namelist.input')
    if start != 0:
        irst = 1
        nmld['param2']['irst'] = 1
        nmld['param2']['rstnum'] = 1
        nmld['param1']['run_time'] = dtime
        nmld['param1']['rstfrq'] = cycle_len
        write_namelist(nmld, 'namelist.input')
        #os.system('./write_cm1_namelist.py -r {:s} -l {:d}'.format(restart_name, dtime))
    else:
        nmld['param1']['run_time'] = dtime
        nmld['param1']['rstfrq'] = cycle_len
        write_namelist(nmld, 'namelist.input')
        #os.system('./write_cm1_namelist.py -l {:d}'.format(dtime))
    if not os.path.exists('namelist.input'):
        error_handler('Unable to find namelist.input', 'wrf_prep')
Beispiel #2
0
def cm1_prep(mem,start,end,restart_name='cm1out_rst_000001.nc'):
    """ Function to write new namelist.input and check to be
        sure files are in order 

    """
    # If this is a restart, be sure we have the right file
    if start != 0:
        # Try loading the restart file with the correct name
        if not os.path.exists(restart_name):
            error_handler('unable to find file {:s} in member {:d} directory'.format(restart_name, mem), 'cm1_prep')
        # Make sure that the restart file is indeed at the correct time
        rstnc = Dataset(restart_name, 'r')
        time_sec = int(rstnc.variables['time'][0])
        rstnc.close()
        if time_sec != start:
            error_handler('restart file {:s} for member {:d} does not match current cycle time: {:d} min.'.format(restart_name, mem, start), 'cm1_prep')
    

    # Find out how long the run should be 
    dtime = int(end-start)

    # Write the namelist
    if not os.path.exists('namelist.input'):
        os.system('cp {:s}/namelist.input .'.format(dir_dom))
    nmld = read_namelist('namelist.input')
    if start != 0:
        irst = 1
        nmld['param2']['irst'] = 1
        nmld['param2']['rstnum'] = 1
        nmld['param1']['run_time'] = dtime
        nmld['param1']['rstfrq'] = cycle_len
        write_namelist(nmld, 'namelist.input')
        #os.system('./write_cm1_namelist.py -r {:s} -l {:d}'.format(restart_name, dtime))
    else:
        nmld['param1']['run_time'] = dtime
        nmld['param1']['rstfrq'] = cycle_len
        write_namelist(nmld, 'namelist.input')
        #os.system('./write_cm1_namelist.py -l {:d}'.format(dtime))
    if not os.path.exists('namelist.input'):
        error_handler('Unable to find namelist.input','wrf_prep')
# Change the name of the template file
dartnml['model_nml']['cm1_template_file'] = restart_filename

# Set the right obs sequence name
dartnml['filter_nml']['obs_sequence_in_name'] = 'obs_seq.prior'

# Set the number of ensemble members
dartnml['filter_nml']['ens_size'] = ens_size

# Set some interesting observation types to assimilate
dartnml['obs_kind_nml']['assimilate_these_obs_types'] = ['TEMPERATURE_2M']
#>@todo TJH test the rest of the observation types in the obs file
#dartnml['obs_kind_nml']['evaluate_these_obs_types'] = ['TEMPERATURE_2M']

# Write this modified namelist out
write_namelist(dartnml, 'input.nml')

# filter will read the contents of input_filelist.txt for the names
# of the CM1 restart files. After each model advance these same
# filenames will be queried for the new model state.
# So, the actual file associated with this name must be updated.
# Ensemble advances are handled by running advance_ensemble.py
# Each model advance is performed in a unique model directory that
# has an instance or ensemble member number in the directory name.

os.system('{remove} input_filelist.txt'.format(**locals()))
os.system('touch input_filelist.txt')

for instance in range(1, ens_size + 1):

    # filter will read the contents of input_filelist.txt for
Beispiel #4
0
    format(**locals()))
os.system(
    '{copy} {truthdir}/namelist.input       {dirname}/namelist.input.template || exit 2'
    .format(**locals()))

# Enforce certain assumptions.
# 1) we are always starting from a netCDF file ... irst == 1
# 2) restart always be named cm1_out_rst_000001.nc ... rstnum == 1
# 3) the run_time value will be a dummy string
# Python version --use namelist utilities
nmld = read_namelist(os.path.join(dirname, 'namelist.input.template'))
nmld['param2']['irst'] = 1
nmld['param2']['rstnum'] = 1
nmld['param1']['run_time'] = cm1_forecast_length
nmld['param1']['rstfrq'] = cm1_forecast_length
write_namelist(nmld, os.path.join(dirname, 'namelist.input.template'))

os.system('{remove} input_filelist.txt'.format(**locals()))

# Python -- write to input_filelist.txt in with
# statement.  This will automatically close
# the file when we are out of the block
with open('input_filelist.txt', 'w') as outfile:
    outfile.write(os.path.join(dirname, filename) + '\n')

# When perfect_model_obs starts, it needs to read the grid information.
# The DART/CM1 interface specifies the file for the grid information by
# the input.nml:&model_nml:cm1_template_file  variable, which defaults
# to cm1out_rst_000001.nc
#
# Consequently, we can get simply link to the true model state.
Beispiel #5
0
def main():
    DOMDIR = dir_dom
    os.chdir(DOMDIR)
    """
    if os.path.isdir(DOMDIR+'/mems'):
        remove = raw_input('Remove contents of current ensemble directory (0 or 1)?')
        if remove:
            os.system('rm -rf {:s}/mems/*'.format(DOMDIR))
        else:
            exit(1)
    else:
        os.system('mkdir mems')  
    """
    print "############### MAKING ENSEMBLE ###############"
    print "############## NUMBER OF MEMS: %d #############" % Ne
    # Now populate the ensemble directory
    print "Populating ensemble directory (mems)"
    os.chdir(DOMDIR + '/mems')

    # Check our initialization method to see what we need for
    # each ensemble member
    if cm1nml['param2']['isnd'] == 7:
        # Will need an input sounding file.  Check for this
        if not os.path.exists('{:s}/input_sounding'.format(DOMDIR)):
            print(
                "ERROR: CM1 namelist has isnd=7, but no input_sounding file found in {:s}"
                .format(DOMDIR))
            exit(1)

    # Loop through each member
    print "######################################"
    print "Making ensemble member sub-directories"
    print "######################################"
    print ""
    for k in range(Ne):
        #for k in [0]:
        k = k + 1  # Don't start at 0
        print "***** MEMBER {:d} *****".format(k)
        os.chdir(DOMDIR)
        # Run script to generate the namelist
        write_namelist(cm1nml, 'namelist.input')
        # That will be written as namelist.input
        # hold onto that while making a directory for it
        os.chdir('{:s}/mems'.format(DOMDIR))
        os.system('mkdir {:s}/mems/m{:d}'.format(DOMDIR, k))
        os.chdir('{:s}/mems/m{:d}'.format(DOMDIR, k))
        # Copy in the namelist
        os.system('cp {:s}/namelist.input namelist.input'.format(DOMDIR))
        # See if we need an input sounding file
        if cm1nml['param2']['isnd'] == 7:
            os.system('cp {:s}/input_sounding .'.format(DOMDIR))

        # Link in executable
        os.system('ln -sf {:s}/LANDUSE.TBL .'.format(dir_src_model))
        os.system('ln -sf {:s}/cm1.exe .'.format(dir_src_model))

        # Go back up a directory to start the next one
        os.chdir('%s/mems' % DOMDIR)

    print "### DONE MAKING DIRECTORIES ###"
    print ""

    os.chdir(DOMDIR)
Beispiel #6
0
# Python version --use namelist utilities
# read the namelist
nmld = read_namelist('namelist.input')

# Check for environment variable that
# contains the current forecast length
# Otherwise leave as is
if os.environ.get('CM1_FORECAST_LENGTH') not in [None, '']:
    cm1_forecast_length = float(os.envion.get('CM1_FORECAST_LENGTH'))
    nmld['param1']['run_time'] = cm1_forecast_length
    nmld['param1']['rstfrq'] = cm1_forecast_length

# Set the other namelist requirements and write
nmld['param2']['irst'] = 1
nmld['param2']['rstnum'] = 1
write_namelist(nmld, 'namelist.input')

# Python -- write to input_filelist.txt in with
# statement.  This will automatically close
# the file when we are out of the block
# Only have one ens member to worry about here, so link directly
os.system('{remove} input_filelist.txt'.format(**locals()))
with open('input_filelist.txt', 'w') as outfile:
    outfile.write('dir_model_001/cm1out_rst_000001.nc\n')

# While we're here, make a copy of the restart file for
# advance model with the time of the current restart
# file attached to it
# Read the simulation start (base time) from the namelist
nmldtime = nmld['param11']
startdt = datetime(nmldtime['year'], nmldtime['month'], nmldtime['day'],\
Beispiel #7
0
def main():
    DOMDIR = dir_dom
    os.chdir(DOMDIR)
    """
    if os.path.isdir(DOMDIR+'/mems'):
        remove = raw_input('Remove contents of current ensemble directory (0 or 1)?')
        if remove:
            os.system('rm -rf {:s}/mems/*'.format(DOMDIR))
        else:
            exit(1)
    else:
        os.system('mkdir mems')  
    """
    print "############### MAKING ENSEMBLE ###############"
    print "############## NUMBER OF MEMS: %d #############" % Ne
    # Now populate the ensemble directory
    print "Populating ensemble directory (mems)"
    os.chdir(DOMDIR+'/mems')

    # Check our initialization method to see what we need for
    # each ensemble member
    if cm1nml['param2']['isnd'] == 7:
        # Will need an input sounding file.  Check for this
        if not os.path.exists('{:s}/input_sounding'.format(DOMDIR)):
            print("ERROR: CM1 namelist has isnd=7, but no input_sounding file found in {:s}".format(DOMDIR))
            exit(1)


    # Loop through each member
    print "######################################"
    print "Making ensemble member sub-directories"
    print "######################################"
    print ""
    for k in range(Ne):
    #for k in [0]:
        k = k+1 # Don't start at 0
        print "***** MEMBER {:d} *****".format(k)
        os.chdir(DOMDIR)
        # Run script to generate the namelist
        write_namelist(cm1nml, 'namelist.input')
        # That will be written as namelist.input
        # hold onto that while making a directory for it
        os.chdir('{:s}/mems'.format(DOMDIR))
        os.system('mkdir {:s}/mems/m{:d}'.format(DOMDIR,k))
        os.chdir('{:s}/mems/m{:d}'.format(DOMDIR,k))
        # Copy in the namelist
        os.system('cp {:s}/namelist.input namelist.input'.format(DOMDIR))
        # See if we need an input sounding file
        if cm1nml['param2']['isnd'] == 7:
            os.system('cp {:s}/input_sounding .'.format(DOMDIR))
            

        # Link in executable
        os.system('ln -sf {:s}/LANDUSE.TBL .'.format(dir_src_model))
        os.system('ln -sf {:s}/cm1.exe .'.format(dir_src_model))

        # Go back up a directory to start the next one
        os.chdir('%s/mems' % DOMDIR)

    print "### DONE MAKING DIRECTORIES ###"
    print ""

    os.chdir(DOMDIR)