diff --git a/config.default b/config.default index 7629af906..dff3e0835 100644 --- a/config.default +++ b/config.default @@ -38,7 +38,21 @@ preprocessedReferenceRunName = None # directory containing model results baseDirectory = /dir/to/model/output -# names of namelist and streams files. If not in baseDirectory, give full path + +# Note: an absolute path can be supplied for any of these subdirectories. +# A relative path is assumed to be relative to baseDirectory. +# By default, results are assumed to be directly in baseDirectory, +# i.e. /./ + +# subdirectory containing restart files +runSubdirectory = . +# subdirectory for ocean history files +oceanHistorySubdirectory = . +# subdirectory for sea ice history files +seaIceHistorySubdirectory = . + +# names of namelist and streams files, either a path relative to baseDirectory +# or an absolute path. oceanNamelistFileName = mpas-o_in oceanStreamsFileName = streams.ocean seaIceNamelistFileName = mpas-cice_in diff --git a/mpas_analysis/ocean/meridional_overturning_circulation.py b/mpas_analysis/ocean/meridional_overturning_circulation.py index bd752f638..a0eeb632a 100644 --- a/mpas_analysis/ocean/meridional_overturning_circulation.py +++ b/mpas_analysis/ocean/meridional_overturning_circulation.py @@ -8,11 +8,11 @@ Authors ------- -Milena Veneziani, Mark Petersen, Phillip Wolfram +Milena Veneziani, Mark Petersen, Phillip Wolfram, Xylar Asay-Davis Last Modified ------------- -03/14/2017 +03/23/2017 """ import xarray as xr @@ -24,8 +24,7 @@ from ..shared.plot.plotting import plot_vertical_section,\ timeseries_analysis_plot, setup_colormap -from ..shared.io import NameList, StreamsFile -from ..shared.io.utility import buildConfigFullPath +from ..shared.io.utility import build_config_full_path from ..shared.generalized_reader.generalized_reader \ import open_multifile_dataset @@ -33,8 +32,10 @@ from ..shared.timekeeping.utility import get_simulation_start_time, \ days_to_datetime +from ..shared.analysis_task import setup_task -def moc_streamfunction(config, streamMap=None, variableMap=None): # {{{ + +def moc_streamfunction(config): # {{{ """ Process MOC analysis member data if available, or compute MOC at post-processing if not. Plots streamfunction climatolgoical sections @@ -56,22 +57,18 @@ def moc_streamfunction(config, streamMap=None, variableMap=None): # {{{ Authors ------- - Milena Veneziani, Mark Petersen, Phillip J. Wolfram + Milena Veneziani, Mark Petersen, Phillip J. Wolfram, Xylar Asay-Davis Last Modified ------------- - 03/14/2017 + 03/23/2017 """ # **** Initial settings **** - # read parameters from config file - inDirectory = config.get('input', 'baseDirectory') - - namelistFileName = config.get('input', 'oceanNamelistFileName') - namelist = NameList(namelistFileName, path=inDirectory) - streamsFileName = config.get('input', 'oceanStreamsFileName') - streams = StreamsFile(streamsFileName, streamsdir=inDirectory) + # perform common setup for the task + namelist, runStreams, historyStreams, calendar, streamMap, \ + variableMap, plotsDirectory = setup_task(config, componentName='ocean') timeSeriesStatsMonthlyAnalysisMemberFlag = namelist.get( 'config_am_timeseriesstatsmonthly_enable') @@ -83,14 +80,13 @@ def moc_streamfunction(config, streamMap=None, variableMap=None): # {{{ # Get a list of timeSeriesStats output files from the streams file, # reading only those that are between the start and end dates # First a list necessary for the streamfunctionMOC climatology - streamName = streams.find_stream(streamMap['timeSeriesStats']) + streamName = historyStreams.find_stream(streamMap['timeSeriesStats']) startDateClimo = config.get('climatology', 'startDate') endDateClimo = config.get('climatology', 'endDate') - calendar = namelist.get('config_calendar_type') - inputFilesClimo = streams.readpath(streamName, - startDate=startDateClimo, - endDate=endDateClimo, - calendar=calendar) + inputFilesClimo = historyStreams.readpath(streamName, + startDate=startDateClimo, + endDate=endDateClimo, + calendar=calendar) print '\n List of files for climatologies:\n{} through {}'.format( inputFilesClimo[0], inputFilesClimo[-1]) startYearClimo = config.getint('climatology', 'startYear') @@ -105,10 +101,10 @@ def moc_streamfunction(config, streamMap=None, variableMap=None): # {{{ # Then a list necessary for the streamfunctionMOC Atlantic timeseries startDateTseries = config.get('timeSeries', 'startDate') endDateTseries = config.get('timeSeries', 'endDate') - inputFilesTseries = streams.readpath(streamName, - startDate=startDateTseries, - endDate=endDateTseries, - calendar=calendar) + inputFilesTseries = historyStreams.readpath(streamName, + startDate=startDateTseries, + endDate=endDateTseries, + calendar=calendar) print '\n List of files for timeSeries:\n{} through {}'.format( inputFilesTseries[0], inputFilesTseries[-1]) startYearTseries = config.getint('timeSeries', 'startYear') @@ -133,15 +129,14 @@ def moc_streamfunction(config, streamMap=None, variableMap=None): # {{{ # streams, calendar, sectionName, dictClimo, dictTseries) else: mocDictClimo, dictRegion = _compute_moc_climo_postprocess( - config, streams, variableMap, calendar, sectionName, regionNames, - dictClimo) + config, runStreams, variableMap, calendar, sectionName, + regionNames, dictClimo) dsMOCTimeSeries = _compute_moc_time_series_postprocess( - config, streams, variableMap, calendar, sectionName, regionNames, - dictTseries, mocDictClimo, dictRegion) + config, runStreams, variableMap, calendar, sectionName, + regionNames, dictTseries, mocDictClimo, dictRegion) # **** Plot MOC **** # Define plotting variables - plotsDirectory = buildConfigFullPath(config, 'output', 'plotsSubdirectory') mainRunName = config.get('runs', 'mainRunName') movingAveragePoints = config.getint(sectionName, 'movingAveragePoints') colorbarLabel = '[Sv]' @@ -184,10 +179,10 @@ def moc_streamfunction(config, streamMap=None, variableMap=None): # {{{ # }}} -def _load_mesh(streams): # {{{ +def _load_mesh(runStreams): # {{{ # Load mesh related variables try: - restartFile = streams.readpath('restart')[0] + restartFile = runStreams.readpath('restart')[0] except ValueError: raise IOError('No MPAS-O restart file found: need at least one ' 'restart file for MOC calculation') @@ -210,13 +205,13 @@ def _load_mesh(streams): # {{{ refTopDepth, refLayerThickness # }}} -def _compute_moc_climo_postprocess(config, streams, variableMap, calendar, +def _compute_moc_climo_postprocess(config, runStreams, variableMap, calendar, sectionName, regionNames, dictClimo): # {{{ '''compute mean MOC streamfunction as a post-process''' dvEdge, areaCell, refBottomDepth, latCell, nVertLevels, \ - refTopDepth, refLayerThickness = _load_mesh(streams) + refTopDepth, refLayerThickness = _load_mesh(runStreams) variableList = ['avgNormalVelocity', 'avgVertVelocityTop'] @@ -257,9 +252,9 @@ def _compute_moc_climo_postprocess(config, streams, variableMap, calendar, # Compute and plot annual climatology of MOC streamfunction print '\n Compute and/or plot post-processed MOC climatological '\ 'streamfunction...' - simulationStartTime = get_simulation_start_time(streams) - outputDirectory = buildConfigFullPath(config, 'output', - 'mpasClimatologySubdirectory') + simulationStartTime = get_simulation_start_time(runStreams) + outputDirectory = build_config_full_path(config, 'output', + 'mpasClimatologySubdirectory') try: os.makedirs(outputDirectory) except OSError: @@ -375,7 +370,7 @@ def _compute_moc_climo_postprocess(config, streams, variableMap, calendar, return mocDictClimo, dictRegion # }}} -def _compute_moc_time_series_postprocess(config, streams, variableMap, +def _compute_moc_time_series_postprocess(config, runStreams, variableMap, calendar, sectionName, regionNames, dictTseries, mocDictClimo, dictRegion): # {{{ @@ -397,12 +392,12 @@ def write_file(dsMOCTimeSeries): 'time series...' print ' Load data...' - simulationStartTime = get_simulation_start_time(streams) + simulationStartTime = get_simulation_start_time(runStreams) variableList = ['avgNormalVelocity', 'avgVertVelocityTop'] dvEdge, areaCell, refBottomDepth, latCell, nVertLevels, \ - refTopDepth, refLayerThickness = _load_mesh(streams) + refTopDepth, refLayerThickness = _load_mesh(runStreams) ds = open_multifile_dataset(fileNames=dictTseries['inputFilesTseries'], calendar=calendar, @@ -422,8 +417,8 @@ def write_file(dsMOCTimeSeries): transectEdgeMaskSigns = dictRegion['transectEdgeMaskSignsAtlantic'] regionCellMask = dictRegion['AtlanticCellMask'] - outputDirectory = buildConfigFullPath(config, 'output', - 'timeseriesSubdirectory') + outputDirectory = build_config_full_path(config, 'output', + 'timeseriesSubdirectory') try: os.makedirs(outputDirectory) except OSError: diff --git a/mpas_analysis/ocean/nino34_index.py b/mpas_analysis/ocean/nino34_index.py index 3df2763fd..402e9703e 100644 --- a/mpas_analysis/ocean/nino34_index.py +++ b/mpas_analysis/ocean/nino34_index.py @@ -3,19 +3,17 @@ Author ------ -Luke Van Roekel +Luke Van Roekel, Xylar Asay-Davis Last Modified ------------- -03/21/2017 +03/23/2017 """ -from ..shared.plot.plotting import nino34_timeseries_plot, nino34_spectra_plot import xarray as xr import pandas as pd import numpy as np +from scipy import signal, stats -from ..shared.io import NameList, StreamsFile -from ..shared.io.utility import buildConfigFullPath from ..shared.climatology import climatology from ..shared.constants import constants @@ -24,9 +22,12 @@ from ..shared.timekeeping.utility import get_simulation_start_time +from ..shared.plot.plotting import nino34_timeseries_plot, nino34_spectra_plot + +from ..shared.analysis_task import setup_task -def nino34_index(config, streamMap=None, variableMap=None): - # {{{ + +def nino34_index(config, streamMap=None, variableMap=None): # {{{ """ Computes NINO34 index and plots the time series and power spectrum with 95 and 99% confidence bounds @@ -46,38 +47,30 @@ def nino34_index(config, streamMap=None, variableMap=None): Author ------ - Luke Van Roekel + Luke Van Roekel, Xylar Asay-Davis Last Modified ------------- - 03/22/2017 + 03/23/2017 """ - # Define/read in general variables print ' Load SST data...' - # read parameters from config file - inDirectory = config.get('input', 'baseDirectory') - - streamsFileName = config.get('input', 'oceanStreamsFileName') - streams = StreamsFile(streamsFileName, streamsdir=inDirectory) + # perform common setup for the task + namelist, runStreams, historyStreams, calendar, streamMap, \ + variableMap, plotsDirectory = setup_task(config, componentName='ocean') - namelistFileName = config.get('input', 'oceanNamelistFileName') - namelist = NameList(namelistFileName, path=inDirectory) - - calendar = namelist.get('config_calendar_type') - simulationStartTime = get_simulation_start_time(streams) + simulationStartTime = get_simulation_start_time(runStreams) # get a list of timeSeriesStats output files from the streams file, # reading only those that are between the start and end dates startDate = config.get('index', 'startDate') endDate = config.get('index', 'endDate') - streamName = streams.find_stream(streamMap['timeSeriesStats']) - fileNames = streams.readpath(streamName, startDate=startDate, - endDate=endDate, calendar=calendar) + streamName = historyStreams.find_stream(streamMap['timeSeriesStats']) + fileNames = historyStreams.readpath(streamName, startDate=startDate, + endDate=endDate, calendar=calendar) print 'Reading files {} through {}'.format(fileNames[0], fileNames[-1]) mainRunName = config.get('runs', 'mainRunName') - plotsDirectory = buildConfigFullPath(config, 'output', 'plotsSubdirectory') # regionIndex should correspond to NINO34 in surface weighted Average AM regionIndex = config.getint('indexNino34', 'regionIndicesToPlot') @@ -96,11 +89,10 @@ def nino34_index(config, streamMap=None, variableMap=None): SSTregions = ds.avgSurfaceTemperature print ' Compute NINO3.4 index...' - nino34 = compute_nino34_index(SSTregions[:, regionIndex], config) + nino34 = compute_nino34_index(SSTregions[:, regionIndex], calendar) print ' Computing NINO3.4 power spectra...' - f, spectra, conf99, conf95, redNoise = compute_nino34_spectra(nino34, - config) + f, spectra, conf99, conf95, redNoise = compute_nino34_spectra(nino34) # Convert frequencies to period in years f = 1.0 / (constants.eps + f*constants.sec_per_year) @@ -113,11 +105,10 @@ def nino34_index(config, streamMap=None, variableMap=None): figureName = '{}/NINO34_spectra_{}.png'.format(plotsDirectory, mainRunName) nino34_spectra_plot(config, f, spectra, conf95, conf99, redNoise, 'NINO3.4 power spectrum', figureName, linewidths=2) + # }}} -# }}} -def compute_nino34_index(regionSST, config): - # {{{ +def compute_nino34_index(regionSST, calendar): # {{{ """ Computes nino34 index time series. It follow the standard nino34 algorithm, i.e., @@ -134,8 +125,8 @@ def compute_nino34_index(regionSST, config): regionSST : xarray.dataArray object values of SST in the nino region - config : MpasConfigParser object - the config options + calendar: {'gregorian', 'gregorian_noleap'} + The name of the calendars used in the MPAS run Returns ------- @@ -143,31 +134,25 @@ def compute_nino34_index(regionSST, config): Author ------ - Luke Van Roekel + Luke Van Roekel, Xylar Asay-Davis Last Modified ------------- - 03/22/2017 + 03/23/2017 """ - assert isinstance(regionSST, xr.core.dataarray.DataArray) - - inDirectory = config.get('input', 'baseDirectory') - namelistFileName = config.get('input', 'oceanNamelistFileName') - namelist = NameList(namelistFileName, path=inDirectory) - calendar = namelist.get('config_calendar_type') + if not isinstance(regionSST, xr.core.dataarray.DataArray): + raise ValueError('regionSST should be an xarray DataArray') # Compute monthly average and anomaly of climatology of SST monthlyClimatology = climatology.compute_monthly_climatology(regionSST, calendar) anomalySST = regionSST.groupby('month') - monthlyClimatology - return _running_mean(anomalySST.to_pandas()) + return _running_mean(anomalySST.to_pandas()) # }}} -# }}} -def compute_nino34_spectra(nino34Index, config): - # {{{ +def compute_nino34_spectra(nino34Index): # {{{ """ Computes power spectra of Nino34 index. @@ -181,8 +166,6 @@ def compute_nino34_spectra(nino34Index, config): nino34Index : xarray.DataArray object nino34Index for analysis - config : instance of the MPAS configParser - Returns ------- pxxSmooth : xarray.DataArray object @@ -204,15 +187,13 @@ def compute_nino34_spectra(nino34Index, config): Author ------ - Luke Van Roekel + Luke Van Roekel, Xylar Asay-Davis Last Modified ------------- - 03/22/2017 + 03/23/2017 """ - from scipy import signal, stats - detrendedNino34 = signal.detrend(nino34Index.values) window = signal.tukey(len(detrendedNino34), alpha=0.1) @@ -244,12 +225,10 @@ def compute_nino34_spectra(nino34Index, config): # return Spectra, 99% confidence level, 95% confidence level, # and Red-noise fit - return f, pxxSmooth, mkov*scale*xHigh, mkov*scale*xLow, mkov*scale + return f, pxxSmooth, mkov*scale*xHigh, mkov*scale*xLow, mkov*scale # }}} -# }}} -def _autocorr(x, t=1): - # {{{ +def _autocorr(x, t=1): # {{{ """ Computes lag one auto-correlation for the NINO34 spectra calculation @@ -272,27 +251,24 @@ def _autocorr(x, t=1): 03/22/2017 """ - return np.corrcoef(np.array([x[0:len(x)-t], x[t:len(x)]])) + return np.corrcoef(np.array([x[0:len(x)-t], x[t:len(x)]])) # }}} -# }}} -def _running_mean(inputData): - # {{{ +def _running_mean(inputData): # {{{ """ Calculates 5-month running mean for NINO index and the spectra Author ------ - Luke Van Roekel + Luke Van Roekel, Xylar Asay-Davis Last Modified ------------- - 03/22/2017 + 03/23/2017 """ - runningMean = pd.Series.rolling(inputData, 5, center=True, min_periods=1).mean() - return xr.DataArray.from_series(runningMean) - + runningMean = pd.Series.rolling(inputData, 5, center=True, + min_periods=1).mean() + return xr.DataArray.from_series(runningMean) # }}} -# }}} # vim: foldmethod=marker ai ts=4 sts=4 et sw=4 ft=python diff --git a/mpas_analysis/ocean/ocean_modelvsobs.py b/mpas_analysis/ocean/ocean_modelvsobs.py index 543358bf2..c623cdf2b 100644 --- a/mpas_analysis/ocean/ocean_modelvsobs.py +++ b/mpas_analysis/ocean/ocean_modelvsobs.py @@ -9,7 +9,7 @@ Last Modified ------------- -03/03/2017 +03/23/2017 """ import xarray as xr @@ -24,8 +24,7 @@ setup_colormap from ..shared.constants import constants -from ..shared.io import NameList, StreamsFile -from ..shared.io.utility import buildConfigFullPath +from ..shared.io.utility import build_config_full_path from ..shared.generalized_reader.generalized_reader \ import open_multifile_dataset @@ -35,8 +34,10 @@ from ..shared.climatology import climatology +from ..shared.analysis_task import setup_task -def ocn_modelvsobs(config, field, streamMap=None, variableMap=None): + +def ocn_modelvsobs(config, field): """ Plots a comparison of ACME/MPAS output to SST or MLD observations @@ -49,47 +50,32 @@ def ocn_modelvsobs(config, field, streamMap=None, variableMap=None): field : {'sst', 'sss', 'mld'} The name of a field to be analyized - streamMap : dict, optional - A dictionary of MPAS-O stream names that map to their mpas_analysis - counterparts. - - variableMap : dict, optional - A dictionary of MPAS-O variable names that map to their mpas_analysis - counterparts. - Authors ------- Luke Van Roekel, Xylar Asay-Davis, Milena Veneziani Last Modified ------------- - 03/03/2017 + 03/23/2017 """ - # read parameters from config file - inDirectory = config.get('input', 'baseDirectory') - - namelistFileName = config.get('input', 'oceanNamelistFileName') - namelist = NameList(namelistFileName, path=inDirectory) - - streamsFileName = config.get('input', 'oceanStreamsFileName') - streams = StreamsFile(streamsFileName, streamsdir=inDirectory) + # perform common setup for the task + namelist, runStreams, historyStreams, calendar, streamMap, \ + variableMap, plotsDirectory = setup_task(config, componentName='ocean') - calendar = namelist.get('config_calendar_type') - simulationStartTime = get_simulation_start_time(streams) + simulationStartTime = get_simulation_start_time(runStreams) # get a list of timeSeriesStats output files from the streams file, # reading only those that are between the start and end dates startDate = config.get('climatology', 'startDate') endDate = config.get('climatology', 'endDate') - streamName = streams.find_stream(streamMap['timeSeriesStats']) - inputFiles = streams.readpath(streamName, startDate=startDate, - endDate=endDate, calendar=calendar) + streamName = historyStreams.find_stream(streamMap['timeSeriesStats']) + inputFiles = historyStreams.readpath(streamName, startDate=startDate, + endDate=endDate, calendar=calendar) print 'Reading files {} through {}'.format(inputFiles[0], inputFiles[-1]) - plotsDirectory = buildConfigFullPath(config, 'output', 'plotsSubdirectory') - observationsDirectory = buildConfigFullPath(config, 'oceanObservations', - '{}Subdirectory'.format(field)) + observationsDirectory = build_config_full_path( + config, 'oceanObservations', '{}Subdirectory'.format(field)) mainRunName = config.get('runs', 'mainRunName') overwriteMpasClimatology = config.getWithDefault( @@ -99,7 +85,7 @@ def ocn_modelvsobs(config, field, streamMap=None, variableMap=None): 'oceanObservations', 'overwriteObsClimatology', False) try: - restartFileName = streams.readpath('restart')[0] + restartFileName = runStreams.readpath('restart')[0] except ValueError: raise IOError('No MPAS-O restart file found: need at least one ' 'restart file for ocn_modelvsobs calculation') diff --git a/mpas_analysis/ocean/ohc_timeseries.py b/mpas_analysis/ocean/ohc_timeseries.py index 90b8a11e7..da7d351db 100644 --- a/mpas_analysis/ocean/ohc_timeseries.py +++ b/mpas_analysis/ocean/ohc_timeseries.py @@ -3,15 +3,14 @@ from ..shared.plot.plotting import timeseries_analysis_plot -from ..shared.io import NameList, StreamsFile -from ..shared.io.utility import buildConfigFullPath - from ..shared.generalized_reader.generalized_reader \ import open_multifile_dataset from ..shared.timekeeping.utility import get_simulation_start_time, \ date_to_days, days_to_datetime, string_to_datetime +from ..shared.analysis_task import setup_task + def ohc_timeseries(config, streamMap=None, variableMap=None): """ @@ -29,19 +28,14 @@ def ohc_timeseries(config, streamMap=None, variableMap=None): to their mpas_analysis counterparts. Author: Xylar Asay-Davis, Milena Veneziani - Last Modified: 02/11/2017 + Last Modified: 03/23/2017 """ - inDirectory = config.get('input', 'baseDirectory') - - namelistFileName = config.get('input', 'oceanNamelistFileName') - namelist = NameList(namelistFileName, path=inDirectory) + # perform common setup for the task + namelist, runStreams, historyStreams, calendar, streamMap, \ + variableMap, plotsDirectory = setup_task(config, componentName='ocean') - streamsFileName = config.get('input', 'oceanStreamsFileName') - streams = StreamsFile(streamsFileName, streamsdir=inDirectory) - - calendar = namelist.get('config_calendar_type') - simulationStartTime = get_simulation_start_time(streams) + simulationStartTime = get_simulation_start_time(runStreams) # read parameters from config file mainRunName = config.get('runs', 'mainRunName') @@ -53,8 +47,6 @@ def ohc_timeseries(config, streamMap=None, variableMap=None): compareWithObservations = config.getboolean('timeSeriesOHC', 'compareWithObservations') - plotsDirectory = buildConfigFullPath(config, 'output', 'plotsSubdirectory') - movingAveragePoints = config.getint('timeSeriesOHC', 'movingAveragePoints') regions = config.getExpression('regions', 'regions') @@ -67,7 +59,7 @@ def ohc_timeseries(config, streamMap=None, variableMap=None): # well as simulationStartTime, that are not guaranteed to be in the mesh # file. try: - restartFile = streams.readpath('restart')[0] + restartFile = runStreams.readpath('restart')[0] except ValueError: raise IOError('No MPAS-O restart file found: need at least one ' 'restart file for OHC calculation') @@ -76,9 +68,9 @@ def ohc_timeseries(config, streamMap=None, variableMap=None): # reading only those that are between the start and end dates startDate = config.get('timeSeries', 'startDate') endDate = config.get('timeSeries', 'endDate') - streamName = streams.find_stream(streamMap['timeSeriesStats']) - fileNames = streams.readpath(streamName, startDate=startDate, - endDate=endDate, calendar=calendar) + streamName = historyStreams.find_stream(streamMap['timeSeriesStats']) + fileNames = historyStreams.readpath(streamName, startDate=startDate, + endDate=endDate, calendar=calendar) print 'Reading files {} through {}'.format(fileNames[0], fileNames[-1]) # Define/read in general variables @@ -123,10 +115,10 @@ def ohc_timeseries(config, streamMap=None, variableMap=None): startDateFirstYear = simulationStartTime firstYear = int(startDateFirstYear[0:4]) endDateFirstYear = '{:04d}-12-31_23:59:59'.format(firstYear) - filesFirstYear = streams.readpath(streamName, - startDate=startDateFirstYear, - endDate=endDateFirstYear, - calendar=calendar) + filesFirstYear = historyStreams.readpath(streamName, + startDate=startDateFirstYear, + endDate=endDateFirstYear, + calendar=calendar) dsFirstYear = open_multifile_dataset( fileNames=filesFirstYear, calendar=calendar, diff --git a/mpas_analysis/ocean/sst_timeseries.py b/mpas_analysis/ocean/sst_timeseries.py index 3198923aa..6eaf73173 100644 --- a/mpas_analysis/ocean/sst_timeseries.py +++ b/mpas_analysis/ocean/sst_timeseries.py @@ -1,14 +1,13 @@ from ..shared.plot.plotting import timeseries_analysis_plot -from ..shared.io import NameList, StreamsFile -from ..shared.io.utility import buildConfigFullPath - from ..shared.generalized_reader.generalized_reader \ import open_multifile_dataset from ..shared.timekeeping.utility import get_simulation_start_time, \ date_to_days, days_to_datetime +from ..shared.analysis_task import setup_task + def sst_timeseries(config, streamMap=None, variableMap=None): """ @@ -25,30 +24,24 @@ def sst_timeseries(config, streamMap=None, variableMap=None): to their mpas_analysis counterparts. Author: Xylar Asay-Davis, Milena Veneziani - Last Modified: 02/11/2017 + Last Modified: 03/23/2017 """ - # Define/read in general variables print ' Load SST data...' - # read parameters from config file - inDirectory = config.get('input', 'baseDirectory') - streamsFileName = config.get('input', 'oceanStreamsFileName') - streams = StreamsFile(streamsFileName, streamsdir=inDirectory) + # perform common setup for the task + namelist, runStreams, historyStreams, calendar, streamMap, \ + variableMap, plotsDirectory = setup_task(config, componentName='ocean') - namelistFileName = config.get('input', 'oceanNamelistFileName') - namelist = NameList(namelistFileName, path=inDirectory) - - calendar = namelist.get('config_calendar_type') - simulationStartTime = get_simulation_start_time(streams) + simulationStartTime = get_simulation_start_time(runStreams) # get a list of timeSeriesStats output files from the streams file, # reading only those that are between the start and end dates startDate = config.get('timeSeries', 'startDate') endDate = config.get('timeSeries', 'endDate') - streamName = streams.find_stream(streamMap['timeSeriesStats']) - fileNames = streams.readpath(streamName, startDate=startDate, - endDate=endDate, calendar=calendar) + streamName = historyStreams.find_stream(streamMap['timeSeriesStats']) + fileNames = historyStreams.readpath(streamName, startDate=startDate, + endDate=endDate, calendar=calendar) print 'Reading files {} through {}'.format(fileNames[0], fileNames[-1]) mainRunName = config.get('runs', 'mainRunName') @@ -57,8 +50,6 @@ def sst_timeseries(config, streamMap=None, variableMap=None): preprocessedInputDirectory = config.get('oceanPreprocessedReference', 'baseDirectory') - plotsDirectory = buildConfigFullPath(config, 'output', 'plotsSubdirectory') - movingAveragePoints = config.getint('timeSeriesSST', 'movingAveragePoints') regions = config.getExpression('regions', 'regions') diff --git a/mpas_analysis/sea_ice/modelvsobs.py b/mpas_analysis/sea_ice/modelvsobs.py index 95d10424b..49e01a962 100644 --- a/mpas_analysis/sea_ice/modelvsobs.py +++ b/mpas_analysis/sea_ice/modelvsobs.py @@ -8,7 +8,7 @@ Last Modified ------------- -03/03/2017 +03/23/2017 """ import os @@ -28,8 +28,8 @@ from ..shared.plot.plotting import plot_polar_comparison, \ setup_colormap -from ..shared.io import NameList, StreamsFile -from ..shared.io.utility import buildConfigFullPath +from ..shared.io import StreamsFile +from ..shared.io.utility import build_config_full_path from ..shared.generalized_reader.generalized_reader \ import open_multifile_dataset @@ -37,6 +37,8 @@ from ..shared.timekeeping.utility import get_simulation_start_time, \ days_to_datetime +from .utility import setup_sea_ice_task + def seaice_modelvsobs(config, streamMap=None, variableMap=None): """ @@ -63,45 +65,44 @@ def seaice_modelvsobs(config, streamMap=None, variableMap=None): Last Modified ------------- - 03/03/2017 + 03/23/2017 """ - # read parameters from config file - inDirectory = config.get('input', 'baseDirectory') - - namelistFileName = config.get('input', 'seaIceNamelistFileName') - namelist = NameList(namelistFileName, path=inDirectory) - - streamsFileName = config.get('input', 'seaIceStreamsFileName') - streams = StreamsFile(streamsFileName, streamsdir=inDirectory) + # perform common setup for the task + namelist, runStreams, historyStreams, calendar, streamMap, variableMap, \ + plotsDirectory, simulationStartTime, restartFileName = \ + setup_sea_ice_task(config) - calendar = namelist.get('config_calendar_type') try: - simulationStartTime = get_simulation_start_time(streams) + simulationStartTime = get_simulation_start_time(runStreams) except IOError: # try the ocean stream instead + runDirectory = build_config_full_path(config, 'input', + 'runSubdirectory') oceanStreamsFileName = config.get('input', 'oceanStreamsFileName') oceanStreams = StreamsFile(oceanStreamsFileName, - streamsdir=inDirectory) + streamsdir=runDirectory) simulationStartTime = get_simulation_start_time(oceanStreams) # get a list of timeSeriesStatsMonthly output files from the streams file, # reading only those that are between the start and end dates startDate = config.get('climatology', 'startDate') endDate = config.get('climatology', 'endDate') - streamName = streams.find_stream(streamMap['timeSeriesStats']) - fileNames = streams.readpath(streamName, startDate=startDate, - endDate=endDate, calendar=calendar) + streamName = historyStreams.find_stream(streamMap['timeSeriesStats']) + fileNames = historyStreams.readpath(streamName, startDate=startDate, + endDate=endDate, calendar=calendar) print 'Reading files {} through {}'.format(fileNames[0], fileNames[-1]) try: - restartFileName = streams.readpath('restart')[0] + restartFileName = runStreams.readpath('restart')[0] except ValueError: # get an ocean restart file, since no sea-ice restart exists try: + runDirectory = build_config_full_path(config, 'input', + 'runSubdirectory') oceanStreamsFileName = config.get('input', 'oceanStreamsFileName') oceanStreams = StreamsFile(oceanStreamsFileName, - streamsdir=inDirectory) + streamsdir=runDirectory) restartFileName = oceanStreams.readpath('restart')[0] except ValueError: raise IOError('No MPAS-O or MPAS-Seaice restart file found: need ' @@ -169,7 +170,8 @@ def _compute_and_plot_concentration(config, monthlyClimatology, print " Make ice concentration plots..." - plotsDirectory = buildConfigFullPath(config, 'output', 'plotsSubdirectory') + plotsDirectory = build_config_full_path(config, 'output', + 'plotsSubdirectory') mainRunName = config.get('runs', 'mainRunName') startYear = config.getint('climatology', 'startYear') endYear = config.getint('climatology', 'endYear') @@ -195,7 +197,7 @@ def _compute_and_plot_concentration(config, monthlyClimatology, climFieldName = 'iceConcentration' for obsName in ['NASATeam', 'Bootstrap']: key = (months, obsName) - obsFileName = buildConfigFullPath( + obsFileName = build_config_full_path( config, 'seaIceObservations', 'concentration{}{}_{}'.format(obsName, hemisphere, months)) obsFieldName = '{}_{}_{}'.format(climFieldName, hemisphere, @@ -359,7 +361,8 @@ def _compute_and_plot_thickness(config, monthlyClimatology, subtitle = "Ice thickness" - plotsDirectory = buildConfigFullPath(config, 'output', 'plotsSubdirectory') + plotsDirectory = build_config_full_path(config, 'output', + 'plotsSubdirectory') mainRunName = config.get('runs', 'mainRunName') startYear = config.getint('climatology', 'startYear') endYear = config.getint('climatology', 'endYear') @@ -378,7 +381,7 @@ def _compute_and_plot_thickness(config, monthlyClimatology, climFieldName = 'iceThickness' for hemisphere in ['NH', 'SH']: key = (months, hemisphere) - obsFileName = buildConfigFullPath( + obsFileName = build_config_full_path( config, 'seaIceObservations', 'thickness{}_{}'.format(hemisphere, months)) if not os.path.isfile(obsFileName): diff --git a/mpas_analysis/sea_ice/timeseries.py b/mpas_analysis/sea_ice/timeseries.py index fc4be9d78..7ed13ed15 100644 --- a/mpas_analysis/sea_ice/timeseries.py +++ b/mpas_analysis/sea_ice/timeseries.py @@ -3,8 +3,8 @@ from ..shared.plot.plotting import timeseries_analysis_plot, \ timeseries_analysis_plot_polar -from ..shared.io import NameList, StreamsFile -from ..shared.io.utility import buildConfigFullPath +from ..shared.io import StreamsFile +from ..shared.io.utility import build_config_full_path from ..shared.timekeeping.utility import get_simulation_start_time, \ date_to_days, days_to_datetime, datetime_to_days @@ -14,6 +14,8 @@ import open_multifile_dataset from ..shared.mpas_xarray.mpas_xarray import subset_variables +from .utility import setup_sea_ice_task + def seaice_timeseries(config, streamMap=None, variableMap=None): """ @@ -29,35 +31,21 @@ def seaice_timeseries(config, streamMap=None, variableMap=None): to their mpas_analysis counterparts. Author: Xylar Asay-Davis, Milena Veneziani - Last Modified: 02/02/2017 + Last Modified: 03/23/2017 """ - # read parameters from config file - inDirectory = config.get('input', 'baseDirectory') - - namelistFileName = config.get('input', 'seaIceNamelistFileName') - namelist = NameList(namelistFileName, path=inDirectory) - - streamsFileName = config.get('input', 'seaIceStreamsFileName') - streams = StreamsFile(streamsFileName, streamsdir=inDirectory) - - calendar = namelist.get('config_calendar_type') - try: - simulationStartTime = get_simulation_start_time(streams) - except IOError: - # try the ocean stream instead - oceanStreamsFileName = config.get('input', 'oceanStreamsFileName') - oceanStreams = StreamsFile(oceanStreamsFileName, - streamsdir=inDirectory) - simulationStartTime = get_simulation_start_time(oceanStreams) + # perform common setup for the task + namelist, runStreams, historyStreams, calendar, streamMap, variableMap, \ + plotsDirectory, simulationStartTime, restartFileName = \ + setup_sea_ice_task(config) # get a list of timeSeriesStatsMonthly output files from the streams file, # reading only those that are between the start and end dates startDate = config.get('timeSeries', 'startDate') endDate = config.get('timeSeries', 'endDate') - streamName = streams.find_stream(streamMap['timeSeriesStats']) - fileNames = streams.readpath(streamName, startDate=startDate, - endDate=endDate, calendar=calendar) + streamName = historyStreams.find_stream(streamMap['timeSeriesStats']) + fileNames = historyStreams.readpath(streamName, startDate=startDate, + endDate=endDate, calendar=calendar) print 'Reading files {} through {}'.format(fileNames[0], fileNames[-1]) variableNames = ['iceAreaCell', 'iceVolumeCell'] @@ -71,11 +59,11 @@ def seaice_timeseries(config, streamMap=None, variableMap=None): 'iceThickness': '[m]'} obsFileNames = { - 'iceAreaCell': [buildConfigFullPath(config, 'seaIceObservations', - subdir) + 'iceAreaCell': [build_config_full_path(config, 'seaIceObservations', + subdir) for subdir in ['areaNH', 'areaSH']], - 'iceVolumeCell': [buildConfigFullPath(config, 'seaIceObservations', - subdir) + 'iceVolumeCell': [build_config_full_path(config, 'seaIceObservations', + subdir) for subdir in ['volNH', 'volSH']]} # Some plotting rules @@ -90,31 +78,14 @@ def seaice_timeseries(config, streamMap=None, variableMap=None): compareWithObservations = config.getboolean('timeSeriesSeaIceAreaVol', 'compareWithObservations') - plotsDirectory = buildConfigFullPath(config, 'output', 'plotsSubdirectory') - movingAveragePoints = config.getint('timeSeriesSeaIceAreaVol', 'movingAveragePoints') polarPlot = config.getboolean('timeSeriesSeaIceAreaVol', 'polarPlot') - # first, check for a sea-ice restart file - try: - restartFile = streams.readpath('restart')[0] - except ValueError: - # get an ocean restart file, since no sea-ice restart exists - try: - oceanStreamsFileName = config.get('input', 'oceanStreamsFileName') - oceanStreams = StreamsFile(oceanStreamsFileName, - streamsdir=inDirectory) - restartFile = oceanStreams.readpath('restart')[0] - except ValueError: - raise IOError('No MPAS-O or MPAS-Seaice restart file found: need ' - 'at least one restart file for seaice_timeseries ' - 'calculation') - print ' Load sea-ice data...' # Load mesh - dsMesh = xr.open_dataset(restartFile) + dsMesh = xr.open_dataset(restartFileName) dsMesh = subset_variables(dsMesh, variableList=['lonCell', 'latCell', 'areaCell']) diff --git a/mpas_analysis/sea_ice/utility.py b/mpas_analysis/sea_ice/utility.py new file mode 100644 index 000000000..fff1b81a5 --- /dev/null +++ b/mpas_analysis/sea_ice/utility.py @@ -0,0 +1,104 @@ +''' +common utility functions for sea ice analysis tasks + +Xylar Asay-Davis + +Last Modified: 03/23/2017 +''' + +from ..shared.io import StreamsFile +from ..shared.io.utility import build_config_full_path + +from ..shared.timekeeping.utility import get_simulation_start_time + +from ..shared.analysis_task import setup_task + + +def setup_sea_ice_task(config): # {{{ + ''' + Perform steps to set up the sea ice analysis (e.g. reading namelists and + streams files, finding a restart file). + + Parameters + ---------- + config : instance of MpasAnalysisConfigParser + Contains configuration options + + Returns + ------- + namelist : NameList object + for parsing namelist options + + runStreams : StreamsFile object + for parsing the streams file related to output in the run subdirectory + + historyStreams : StreamsFile object + for parsing the streams file related to output in the history + subdirectory + + calendar: {'gregorian', 'gregorian_noleap'} + The name of the calendars used in the MPAS run + + streamMap : dict + A dictionary of MPAS stream names that map to their mpas_analysis + counterparts. + + variableMap : dict + A dictionary of MPAS variable names that map to their mpas_analysis + counterparts. + + plotsDirectory : str + the directories for writing plots + + simulationStartTime : str + the date and time of the start of the simulation + + restartFileName : str + the path to a restart file (which may be an MPAS-O restart file is no + MPAS-SeaIce restart could be found) + + Authors + ------- + Xylar Asay-Davis + + Last Modified + ------------- + 03/23/2017 + ''' + # perform common setup for the task + namelist, runStreams, historyStreams, calendar, streamMap, \ + variableMap, plotsDirectory = setup_task(config, + componentName='seaIce') + + try: + simulationStartTime = get_simulation_start_time(runStreams) + except IOError: + # try the ocean stream instead + runDirectory = build_config_full_path(config, 'input', + 'runSubdirectory') + oceanStreamsFileName = config.get('input', 'oceanStreamsFileName') + oceanStreams = StreamsFile(oceanStreamsFileName, + streamsdir=runDirectory) + simulationStartTime = get_simulation_start_time(oceanStreams) + + try: + restartFileName = runStreams.readpath('restart')[0] + except ValueError: + # get an ocean restart file, since no sea-ice restart exists + try: + runDirectory = build_config_full_path(config, 'input', + 'runSubdirectory') + oceanStreamsFileName = config.get('input', 'oceanStreamsFileName') + oceanStreams = StreamsFile(oceanStreamsFileName, + streamsdir=runDirectory) + restartFileName = oceanStreams.readpath('restart')[0] + except ValueError: + raise IOError('No MPAS-O or MPAS-Seaice restart file found: need ' + 'at least one restart file for seaice_timeseries ' + 'calculation') + + return namelist, runStreams, historyStreams, calendar, streamMap, \ + variableMap, plotsDirectory, simulationStartTime, restartFileName + # }}} + +# vim: foldmethod=marker ai ts=4 sts=4 et sw=4 ft=python \ No newline at end of file diff --git a/mpas_analysis/shared/analysis_task.py b/mpas_analysis/shared/analysis_task.py new file mode 100644 index 000000000..18c78e46e --- /dev/null +++ b/mpas_analysis/shared/analysis_task.py @@ -0,0 +1,104 @@ +''' +common utility functions for analysis tasks + +Xylar Asay-Davis + +Last Modified: 03/23/2017 +''' + +from .io import NameList, StreamsFile +from .io.utility import build_config_full_path, make_directories + +from ..ocean.variable_stream_map import oceanStreamMap, \ + oceanVariableMap + +from ..sea_ice.variable_stream_map import seaIceStreamMap, \ + seaIceVariableMap + + +def setup_task(config, componentName): # {{{ + ''' + Perform steps to set up the analysis (e.g. reading namelists and + streams files). + + Parameters + ---------- + config : instance of MpasAnalysisConfigParser + Contains configuration options + + componentName : {'ocean', 'seaIce', 'landIce'} + The name of a MPAS core to be analyized + + Returns + ------- + namelist : NameList object + for parsing namelist options + + runStreams : StreamsFile object + for parsing the streams file related to output in the run subdirectory + + historyStreams : StreamsFile object + for parsing the streams file related to output in the history + subdirectory + + calendar: {'gregorian', 'gregorian_noleap'} + The name of the calendars used in the MPAS run + + streamMap : dict + A dictionary of MPAS stream names that map to their mpas_analysis + counterparts. + + variableMap : dict + A dictionary of MPAS variable names that map to their mpas_analysis + counterparts. + + plotsDirectory : str + the directories for writing plots + + Authors + ------- + Xylar Asay-Davis + + Last Modified + ------------- + 03/23/2017 + ''' + + # read parameters from config file + # the run directory contains the restart files + runDirectory = build_config_full_path(config, 'input', 'runSubdirectory') + # if the history directory exists, use it; if not, fall back on + # runDirectory + historyDirectory = build_config_full_path( + config, 'input', '{}HistorySubdirectory'.format(componentName), + defaultPath=runDirectory) + + namelistFileName = build_config_full_path( + config, 'input', '{}NamelistFileName'.format(componentName)) + namelist = NameList(namelistFileName) + + streamsFileName = build_config_full_path( + config, 'input', '{}StreamsFileName'.format(componentName)) + runStreams = StreamsFile(streamsFileName, streamsdir=runDirectory) + historyStreams = StreamsFile(streamsFileName, streamsdir=historyDirectory) + + calendar = namelist.get('config_calendar_type') + + plotsDirectory = build_config_full_path(config, 'output', + 'plotsSubdirectory') + make_directories(plotsDirectory) + + if componentName == 'ocean': + streamMap = oceanStreamMap + variableMap = oceanVariableMap + elif componentName == 'seaIce': + streamMap = seaIceStreamMap + variableMap = seaIceVariableMap + else: + streamMap = None + variableMap = None + + return namelist, runStreams, historyStreams, calendar, streamMap, \ + variableMap, plotsDirectory # }}} + +# vim: foldmethod=marker ai ts=4 sts=4 et sw=4 ft=python diff --git a/mpas_analysis/shared/climatology/climatology.py b/mpas_analysis/shared/climatology/climatology.py index 1a3e0f13a..06a2602f2 100644 --- a/mpas_analysis/shared/climatology/climatology.py +++ b/mpas_analysis/shared/climatology/climatology.py @@ -20,7 +20,7 @@ from ..timekeeping.utility import days_to_datetime -from ..io.utility import buildConfigFullPath +from ..io.utility import build_config_full_path from ..interpolation import interpolate @@ -80,8 +80,8 @@ def write_mpas_mapping_file(config, meshFileName): else: # we need to build the path to the mapping file and an appropriate # file name - mappingSubdirectory = buildConfigFullPath(config, 'output', - 'mappingSubdirectory') + mappingSubdirectory = build_config_full_path(config, 'output', + 'mappingSubdirectory') try: os.makedirs(mappingSubdirectory) except OSError: @@ -186,8 +186,8 @@ def write_observations_mapping_file(config, componentName, fieldName, # no need to remap the observations obsMappingFileName = None else: - mappingSubdirectory = buildConfigFullPath(config, 'output', - 'mappingSubdirectory') + mappingSubdirectory = build_config_full_path(config, 'output', + 'mappingSubdirectory') try: os.makedirs(mappingSubdirectory) @@ -267,11 +267,11 @@ def get_mpas_climatology_file_names(config, fieldName, monthNames): 'comparisonLatResolution', constants.dLongitude) - climatologyDirectory = buildConfigFullPath(config, 'output', - 'mpasClimatologySubdirectory') + climatologyDirectory = build_config_full_path( + config, 'output', 'mpasClimatologySubdirectory') - regriddedDirectory = buildConfigFullPath(config, 'output', - 'mpasRegriddedClimSubdirectory') + regriddedDirectory = build_config_full_path( + config, 'output', 'mpasRegriddedClimSubdirectory') try: os.makedirs(regriddedDirectory) except OSError: @@ -349,12 +349,12 @@ def get_observation_climatology_file_names(config, fieldName, monthNames, 'comparisonLatResolution', constants.dLongitude) - climatologyDirectory = buildConfigFullPath( + climatologyDirectory = build_config_full_path( config=config, section='output', relativePathOption='climatologySubdirectory', relativePathSection=obsSection) - regriddedDirectory = buildConfigFullPath( + regriddedDirectory = build_config_full_path( config=config, section='output', relativePathOption='regriddedClimSubdirectory', relativePathSection=obsSection) diff --git a/mpas_analysis/shared/io/utility.py b/mpas_analysis/shared/io/utility.py index 89a62951e..d5fbe2982 100644 --- a/mpas_analysis/shared/io/utility.py +++ b/mpas_analysis/shared/io/utility.py @@ -1,10 +1,9 @@ -#!/usr/bin/env python """ IO utility functions Phillip J. Wolfram, Xylar Asay-Davis -Last Modified: 03/03/2017 +Last Modified: 03/23/2017 """ import glob @@ -25,22 +24,55 @@ def paths(*args): return paths -def buildConfigFullPath(config, section, relativePathOption, - relativePathSection=None): +def make_directories(path): # {{{ + """ + Make the given path if it does not already exist. + + Returns the path unchanged. + + Author: Xylar Asay-Davis + Last Modified: 02/02/2017 + """ + + try: + os.makedirs(path) + except OSError: + pass + return path # }}} + + +def build_config_full_path(config, section, relativePathOption, + relativePathSection=None, + defaultPath=None): """ Returns a full path from a base directory and a relative path - `config` is an instance of a ConfigParser + Parameters + ---------- + config : MpasAnalysisConfigParser object + configuration from which to read the path + + section : str + the name of a section in `config`, which must have an option + `baseDirectory` - `section` is the name of a section in `config`, which must have an - option `baseDirectory` + relativePathOption : str + the name of an option in `section` of the relative path within + `baseDirectory` (or possibly an absolute path) - `relativePathOption` is the name of an option in `section` that - points to the name of a relative path within `baseDirectory` + relativePathSection : str, optional + the name of a section for `relativePathOption` if not `section` + defaultPath : str, optional + the name of a path to return if the resulting path doesn't exist. + + Authors + ------- Xylar Asay-Davis - Last Modified: 03/03/2017 + Last Modified + ------------- + 03/23/2017 """ if relativePathSection is None: relativePathSection = section @@ -51,6 +83,9 @@ def buildConfigFullPath(config, section, relativePathOption, else: fullPath = '{}/{}'.format(config.get(section, 'baseDirectory'), subDirectory) + + if defaultPath is not None and not os.path.exists(fullPath): + fullPath = defaultPath return fullPath # vim: foldmethod=marker ai ts=4 sts=4 et sw=4 ft=python diff --git a/run_analysis.py b/run_analysis.py index badc7e6b1..dea6382f2 100755 --- a/run_analysis.py +++ b/run_analysis.py @@ -5,7 +5,7 @@ specifying analysis options. Author: Xylar Asay-Davis, Phillip J. Wolfram -Last Modified: 03/03/2017 +Last Modified: 03/23/2017 """ import os @@ -15,14 +15,6 @@ from mpas_analysis.configuration.MpasAnalysisConfigParser \ import MpasAnalysisConfigParser -from mpas_analysis.ocean.variable_stream_map import oceanStreamMap, \ - oceanVariableMap - -from mpas_analysis.sea_ice.variable_stream_map import seaIceStreamMap, \ - seaIceVariableMap - -from mpas_analysis.shared.io.utility import buildConfigFullPath - def checkPathExists(path): # {{{ """ @@ -86,7 +78,7 @@ def checkGenerate(config, analysisName, mpasCore, analysisCategory=None): def analysis(config): # {{{ # set default values of start and end dates for climotologies and # timeseries and indices - for section in ['climatology', 'timeSeries','index']: + for section in ['climatology', 'timeSeries', 'index']: startDate = '{:04d}-01-01_00:00:00'.format( config.getint(section, 'startYear')) if not config.has_option(section, 'startDate'): @@ -122,8 +114,6 @@ def analysis(config): # {{{ continue checkPathExists('{}/{}'.format(baseDirectory, fileName)) - makeDirectories(buildConfigFullPath(config, 'output', 'plotsSubdirectory')) - # choose the right rendering backend, depending on whether we're displaying # to the screen if not config.getboolean('plot', 'displayToScreen'): @@ -138,24 +128,21 @@ def analysis(config): # {{{ print "" print "Plotting OHC time series..." from mpas_analysis.ocean.ohc_timeseries import ohc_timeseries - ohc_timeseries(config, streamMap=oceanStreamMap, - variableMap=oceanVariableMap) + ohc_timeseries(config) if checkGenerate(config, analysisName='timeSeriesSST', mpasCore='ocean', analysisCategory='timeSeries'): print "" print "Plotting SST time series..." from mpas_analysis.ocean.sst_timeseries import sst_timeseries - sst_timeseries(config, streamMap=oceanStreamMap, - variableMap=oceanVariableMap) + sst_timeseries(config) if checkGenerate(config, analysisName='indexNino34', mpasCore='ocean', analysisCategory='index'): - print "" - print "Plotting Nino3.4 time series and power spectrum...." - from mpas_analysis.ocean.nino34_index import nino34_index - nino34_index(config, streamMap=oceanStreamMap, - variableMap=oceanVariableMap) + print "" + print "Plotting Nino3.4 time series and power spectrum...." + from mpas_analysis.ocean.nino34_index import nino34_index + nino34_index(config) # if checkGenerate(config, analysisName='timeSeriesMHT', mpasCore='ocean', # analysisCategory='timeSeries'): @@ -169,32 +156,30 @@ def analysis(config): # {{{ print "" print "Plotting 2-d maps of SST climatologies..." from mpas_analysis.ocean.ocean_modelvsobs import ocn_modelvsobs - ocn_modelvsobs(config, 'sst', streamMap=oceanStreamMap, - variableMap=oceanVariableMap) + ocn_modelvsobs(config, 'sst') if checkGenerate(config, analysisName='regriddedMLD', mpasCore='ocean', analysisCategory='regriddedHorizontal'): print "" print "Plotting 2-d maps of MLD climatologies..." from mpas_analysis.ocean.ocean_modelvsobs import ocn_modelvsobs - ocn_modelvsobs(config, 'mld', streamMap=oceanStreamMap, - variableMap=oceanVariableMap) + ocn_modelvsobs(config, 'mld') if checkGenerate(config, analysisName='regriddedSSS', mpasCore='ocean', analysisCategory='regriddedHorizontal'): print "" print "Plotting 2-d maps of SSS climatologies..." from mpas_analysis.ocean.ocean_modelvsobs import ocn_modelvsobs - ocn_modelvsobs(config, 'sss', streamMap=oceanStreamMap, - variableMap=oceanVariableMap) + ocn_modelvsobs(config, 'sss') - if checkGenerate(config, analysisName='streamfunctionMOC', mpasCore='ocean', + if checkGenerate(config, analysisName='streamfunctionMOC', + mpasCore='ocean', analysisCategory='streamfunctionMOC'): print "" print "Plotting streamfunction of Meridional Overturning Circulation (MOC)..." - from mpas_analysis.ocean.meridional_overturning_circulation import moc_streamfunction - moc_streamfunction(config, streamMap=oceanStreamMap, - variableMap=oceanVariableMap) + from mpas_analysis.ocean.meridional_overturning_circulation \ + import moc_streamfunction + moc_streamfunction(config) # GENERATE SEA-ICE DIAGNOSTICS if checkGenerate(config, analysisName='timeSeriesSeaIceAreaVol', @@ -202,8 +187,7 @@ def analysis(config): # {{{ print "" print "Plotting sea-ice area and volume time series..." from mpas_analysis.sea_ice.timeseries import seaice_timeseries - seaice_timeseries(config, streamMap=seaIceStreamMap, - variableMap=seaIceVariableMap) + seaice_timeseries(config) if checkGenerate(config, analysisName='regriddedSeaIceConcThick', mpasCore='seaIce', @@ -212,8 +196,7 @@ def analysis(config): # {{{ print "Plotting 2-d maps of sea-ice concentration and thickness " \ "climatologies..." from mpas_analysis.sea_ice.modelvsobs import seaice_modelvsobs - seaice_modelvsobs(config, streamMap=seaIceStreamMap, - variableMap=seaIceVariableMap) + seaice_modelvsobs(config) # GENERATE LAND-ICE DIAGNOSTICS