Radiative Equilibrium with Simple Physics


This demo steps the grey radiation code forward in time to get a radiative equilibrium profile. In addition, the Simple Physics module is available to add a boundary layer and large scale condensation.

This notebook shows how to configure Simple Physics to only provide those tendency terms that are needed for the simulation. In the first example below, large scale condensation is switched off, and in the second it is switched on. This makes a difference in the final profiles obtained: with large scale condensation, the boundary layer temperatures are warmer, and the vapour profile is significantly changed.


In [1]:
%matplotlib notebook
import numpy as np
import climt
from climt.simple_physics_custom import simple_physics_custom
# Federation
kwargs = {}
kwargs['beta'] = 1.

#Initialise radiation

rad = climt.radiation(scheme='newgreygas', **kwargs)

#Initialise simple physics
kwargs = {}
#kwargs['qflux'] = False
#kwargs['tflux'] = False
#kwargs['lsc'] = False
kwargs['use_ext_ts'] = True
kwargs['dt'] = 1200.

solar_in = 500.
Ts = (solar_in/5.67e-8)**0.25*np.ones((1,1))
kwargs['Ts'] = Ts

phys = simple_physics_custom(**kwargs)


Using netCDF4 interface for IO

In [2]:
#Initialise federation
kwargs = {}
kwargs['MonitorFields'] = ['T','U','q']
T = np.zeros((1,1,rad.nlev)) + (solar_in/2./5.67e-8)**0.25
U = 10.*np.ones((1,1,rad.nlev))

kwargs['dt'] = 1200.
kwargs['T'] = T
kwargs['U'] = U
kwargs['Ts'] = Ts

print Ts


[[ 306.44090507]]

In [3]:
fed = climt.federation(rad, phys, **kwargs)

for i in range(30000):
    fed.step()


---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-3-94c50f18f3c7> in <module>()
      2 
      3 for i in range(30000):
----> 4     fed.step()

/home/joymm/github/joyClimt/lib/python2.7/site-packages/climt/component.pyc in step(self, RunLength, Inc)
    214                 freq = self.Monitor.MonitorFreq
    215                 if int(time/freq) != int((time-dt)/freq):
--> 216                     self.Monitor.refresh(self)
    217 
    218     def __call__(self,**kwargs):

/home/joymm/github/joyClimt/lib/python2.7/site-packages/climt/plot.pyc in refresh(self, Component)
    174 
    175         # Redraw figure
--> 176         self.manager.canvas.draw()
    177 
    178 class Panel:

/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_webagg_core.pyc in draw(self)
    176         backend_agg.RendererAgg.lock.acquire()
    177         try:
--> 178             self.figure.draw(renderer)
    179         finally:
    180             backend_agg.RendererAgg.lock.release()

/usr/local/lib/python2.7/dist-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
     59     def draw_wrapper(artist, renderer, *args, **kwargs):
     60         before(artist, renderer)
---> 61         draw(artist, renderer, *args, **kwargs)
     62         after(artist, renderer)
     63 

/usr/local/lib/python2.7/dist-packages/matplotlib/figure.pyc in draw(self, renderer)
   1157         dsu.sort(key=itemgetter(0))
   1158         for zorder, a, func, args in dsu:
-> 1159             func(*args)
   1160 
   1161         renderer.close_group('figure')

/usr/local/lib/python2.7/dist-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
     59     def draw_wrapper(artist, renderer, *args, **kwargs):
     60         before(artist, renderer)
---> 61         draw(artist, renderer, *args, **kwargs)
     62         after(artist, renderer)
     63 

/usr/local/lib/python2.7/dist-packages/matplotlib/axes/_base.pyc in draw(self, renderer, inframe)
   2322 
   2323         for zorder, a in dsu:
-> 2324             a.draw(renderer)
   2325 
   2326         renderer.close_group('axes')

/usr/local/lib/python2.7/dist-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
     59     def draw_wrapper(artist, renderer, *args, **kwargs):
     60         before(artist, renderer)
---> 61         draw(artist, renderer, *args, **kwargs)
     62         after(artist, renderer)
     63 

/usr/local/lib/python2.7/dist-packages/matplotlib/axis.pyc in draw(self, renderer, *args, **kwargs)
   1109 
   1110         for tick in ticks_to_draw:
-> 1111             tick.draw(renderer)
   1112 
   1113         # scale up the axis label box to also find the neighbors, not

/usr/local/lib/python2.7/dist-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
     59     def draw_wrapper(artist, renderer, *args, **kwargs):
     60         before(artist, renderer)
---> 61         draw(artist, renderer, *args, **kwargs)
     62         after(artist, renderer)
     63 

/usr/local/lib/python2.7/dist-packages/matplotlib/axis.pyc in draw(self, renderer)
    250 
    251         if self.label1On:
--> 252             self.label1.draw(renderer)
    253         if self.label2On:
    254             self.label2.draw(renderer)

/usr/local/lib/python2.7/dist-packages/matplotlib/artist.pyc in draw_wrapper(artist, renderer, *args, **kwargs)
     59     def draw_wrapper(artist, renderer, *args, **kwargs):
     60         before(artist, renderer)
---> 61         draw(artist, renderer, *args, **kwargs)
     62         after(artist, renderer)
     63 

/usr/local/lib/python2.7/dist-packages/matplotlib/text.pyc in draw(self, renderer)
    747 
    748         with _wrap_text(self) as textobj:
--> 749             bbox, info, descent = textobj._get_layout(renderer)
    750             trans = textobj.get_transform()
    751 

/usr/local/lib/python2.7/dist-packages/matplotlib/text.pyc in _get_layout(self, renderer)
    332         of a rotated text when necessary.
    333         """
--> 334         key = self.get_prop_tup()
    335         if key in self._cached:
    336             return self._cached[key]

/usr/local/lib/python2.7/dist-packages/matplotlib/text.pyc in get_prop_tup(self)
    901         need to know if the text has changed.
    902         """
--> 903         x, y = self.get_unitless_position()
    904         return (x, y, self.get_text(), self._color,
    905                 self._verticalalignment, self._horizontalalignment,

KeyboardInterrupt: 

In [ ]:
import matplotlib.pyplot as plt

plt.figure()
# Federation
kwargs = {}

#Initialise radiation

rad = climt.radiation(scheme='newgreygas', **kwargs)

#Initialise simple physics
kwargs = {}
#kwargs['qflux'] = False
#kwargs['tflux'] = False
#kwargs['lsc'] = False
kwargs['use_ext_ts'] = True
kwargs['dt'] = 1200.

solar_in = 500.
Ts = (solar_in/5.67e-8)**0.25*np.ones((1,1))
kwargs['Ts'] = Ts

phys = simple_physics_custom(**kwargs)

In [ ]:
# Initialise federation
kwargs = {}
kwargs['MonitorFields'] = ['T','U','q']
T = np.zeros((1,1,rad.nlev)) + (solar_in/2./5.67e-8)**0.25
U = 10.*np.ones((1,1,rad.nlev))

kwargs['dt'] = 1200.
kwargs['T'] = T
kwargs['U'] = U
kwargs['Ts'] = Ts

print Ts

In [ ]:
fed = climt.federation(rad, phys, **kwargs)

for i in range(30000):
    fed.step()