Skip to content

Commit

Permalink
New module to automate integration through orbital cycles. Version nu…
Browse files Browse the repository at this point in the history
…mber incremented to 0.2.6
  • Loading branch information
brian-rose committed Apr 3, 2015
1 parent 18b304f commit ab78068
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 77 deletions.
2 changes: 1 addition & 1 deletion climlab/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
__version__ = '0.2.5'
__version__ = '0.2.6'

# This list defines all the modules that will be loaded if a user invokes
# from climLab import *
Expand Down
83 changes: 7 additions & 76 deletions climlab/model/ebm.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,6 @@
brose@albany.edu
"""

#import numpy as np
#from scipy.linalg import solve_banded
#from scipy import integrate
#import climlab.utils.constants as const
#from climlab.process.time_dependent_process import TimeDependentProcess
#import climlab.solar.insolation as insolation
#from climlab.solar.orbital import OrbitalTable

import numpy as np
from climlab import constants as const
from climlab.domain.field import Field, global_mean
Expand Down Expand Up @@ -50,14 +42,16 @@ def __init__(self,
self.param['water_depth'] = water_depth
# create sub-models
self.add_subprocess('LW', AplusBT(state=self.state, **self.param))
self.add_subprocess('insolation', P2Insolation(domains=sfc, **self.param))
self.add_subprocess('albedo', albedo.StepFunctionAlbedo(state=self.state,
**self.param))
self.add_subprocess('insolation',
P2Insolation(domains=sfc, **self.param))
self.add_subprocess('albedo',
albedo.StepFunctionAlbedo(state=self.state,
**self.param))
# diffusivity in units of 1/s
K = self.param['D'] / self.domains['Ts'].heat_capacity
self.add_subprocess('diffusion', MeridionalDiffusion(state=self.state,
K=K,
**self.param))
K=K,
**self.param))
self.topdown = False # call subprocess compute methods first

def _compute_heating_rates(self):
Expand Down Expand Up @@ -354,69 +348,6 @@ def __init__(self, **kwargs):
# super(EBM_landocean,self).integrate_years( years, verbose )
#==============================================================================

#==============================================================================
#
# class OrbitalCycles:
# def __init__( self, model, kyear_start = 20., kyear_stop = 0.,
# segment_length_years = 100., orbital_year_factor = 1., verbose=True ):
# """Automatically integrate an Energy Balance Model through changes in orbital parameters.
#
# model is an object of class EBM or its daughters.
#
# segment_length_years is the length of each integration with fixed orbital parameters.
# orbital_year_factor is an optional speed-up to the orbital cycles.
# """
#
# self.model = model
# self.kyear_start = kyear_start
# self.kyear_stop = kyear_stop
# self.segment_length_years = segment_length_years
# self.orbital_year_factor = orbital_year_factor
# self.verbose = verbose
# self.num_segments = int( (kyear_start - kyear_stop) * 1000. / segment_length_years / orbital_year_factor )
#
# kyear_before_present = kyear_start
#
# if verbose:
# print( "--------- OrbitalCycles START ----------" )
# print( "Beginning integration for the model from " + str(kyear_start) + " to " +
# str(kyear_stop) + " kyears before present." )
# print( "Integration time for each set of orbital parameters is " +
# str(segment_length_years) + " years." )
# print( "Orbital cycles will be sped up by a factor " + str(orbital_year_factor) )
# print( "Total number of segments is " + str(self.num_segments) )
#
# # initialize storage arrays
# self.T_segments_global = np.empty( self.num_segments )
# self.T_segments = np.empty( (self.model.num_points, self.num_segments) )
# self.T_segments_annual = np.empty_like( self.T_segments )
# self.orb_kyear = np.empty( self.num_segments )
#
# # Get orbital data table
# orbtable = OrbitalTable()
#
# for n in range(self.num_segments):
# if verbose:
# print("-------------------------")
# print("Segment " + str(n) + " out of " + str(self.num_segments) )
# print( "Using orbital parameters from " + str(kyear_before_present) + " kyears before present." )
# orb = orbtable.lookup_parameters( kyear_before_present )
# self.model.make_insolation_array( orb )
# self.model.integrate_years( segment_length_years-1., verbose=False )
# # Run one final year to characterize the current equilibrated state
# self.model.integrate_years( 1.0, verbose=False )
# self.T_segments_annual[:,n] = self.model.T_timeave
# self.T_segments[:,n] = self.model.T
# self.T_segments_global[n] = self.model.global_mean( self.model.T_timeave )
# self.orb_kyear[n] = kyear_before_present
# kyear_before_present -= segment_length_years / 1000. * orbital_year_factor
# if verbose:
# print( "Global mean temperature from the final year of integration is " +
# str(self.T_segments_global[n]) + " degrees C." )
# if verbose:
# print( "--------- OrbitalCycles END ----------" )
#==============================================================================


# To do:
# - use integrated positive degree days to calculate implicit ice sheet melt potential
Expand Down
92 changes: 92 additions & 0 deletions climlab/solar/orbital_cycles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
'''Module for setting up long integrations of climlab processes
over orbital cycles
example usage:
from climlab.model.ebm import EBM_seasonal
from climlab.solar.orbital_cycles import OrbitalCycles
from climlab.surface.albedo import StepFunctionAlbedo
ebm = EBM_seasonal()
print ebm
# add an albedo feedback
albedo = StepFunctionAlbedo(state=ebm.state, **ebm.param)
ebm.add_subprocess('albedo', albedo)
# start the integration
# run for 10,000 orbital years, but only 1,000 model years
experiment = OrbitalCycles(ebm, kyear_start=-20,
kyear_stop=-10, orbital_year_factor=10.)
'''

import numpy as np
from climlab import constants as const
from climlab.solar.orbital import OrbitalTable
from climlab.domain.field import global_mean


class OrbitalCycles:
def __init__(self,
model,
kyear_start=-20.,
kyear_stop=0.,
segment_length_years=100.,
orbital_year_factor=1.,
verbose=True ):
"""Automatically integrate a process through changes in orbital parameters.
model is an instance of climlab.time_dependent_process
segment_length_years is the length of each integration with fixed orbital parameters.
orbital_year_factor is an optional speed-up to the orbital cycles.
"""

self.model = model
self.kyear_start = kyear_start
self.kyear_stop = kyear_stop
self.segment_length_years = segment_length_years
self.orbital_year_factor = orbital_year_factor
self.verbose = verbose
self.num_segments = int(-(kyear_start - kyear_stop) * 1000. /
segment_length_years / orbital_year_factor)

kyear_before_present = kyear_start

if verbose:
print("--------- OrbitalCycles START ----------")
print("Beginning integration for the model from " + str(kyear_start) + " to " +
str(kyear_stop) + " kyears before present.")
print("Integration time for each set of orbital parameters is " +
str(segment_length_years) + " years.")
print("Orbital cycles will be sped up by a factor " + str(orbital_year_factor))
print("Total number of segments is " + str(self.num_segments))

# initialize storage arrays
self.T_segments_global = np.empty( self.num_segments )
self.T_segments = np.empty( (self.model.Ts.size, self.num_segments) )
self.T_segments_annual = np.empty_like( self.T_segments )
self.orb_kyear = np.empty( self.num_segments )

# Get orbital data table
orbtable = OrbitalTable()

for n in range(self.num_segments):
if verbose:
print("-------------------------")
print("Segment " + str(n) + " out of " + str(self.num_segments) )
print( "Using orbital parameters from " + str(kyear_before_present) + " kyears before present." )
self.orb = orbtable.lookup_parameters(kyear_before_present)
#self.model.make_insolation_array( orb )
self.model.subprocess['insolation'].orb = self.orb
self.model.integrate_years(segment_length_years-1., verbose=False)
# Run one final year to characterize the current equilibrated state
self.model.integrate_years(1.0, verbose=False)
self.T_segments_annual[:, n] = np.squeeze(self.model.timeave['Ts'])
self.T_segments[:, n] = np.squeeze(self.model.Ts)
self.T_segments_global[n] = global_mean(self.model.timeave['Ts'])
self.orb_kyear[n] = kyear_before_present
kyear_before_present += segment_length_years / 1000. * orbital_year_factor
if verbose:
print( "Global mean temperature from the final year of integration is " +
str(self.T_segments_global[n]) + " degrees C." )
if verbose:
print("--------- OrbitalCycles END ----------")

0 comments on commit ab78068

Please sign in to comment.