Skip to article frontmatterSkip to article content

Visualizing the cloud-capped boundary layer

Data is from a large eddy simulation of trade cumulus clouds.

  • Single timestep at 12.5 m x, y, z grid spacing

  • Variable is QN -- cloud liquid water (g/kg)

The netcdf file: bomex_qv_qn.nc -- 527 Mbytes

import xarray as xr
from pathlib import Path
from vapor import session, renderer, dataset, camera
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[1], line 1
----> 1 import xarray as xr
      2 from pathlib import Path
      3 from vapor import session, renderer, dataset, camera

ModuleNotFoundError: No module named 'xarray'

adjust path to point to file

the_file = Path().resolve() / 'bomex_qv_qn.nc'
print(the_file)
the_file.exists()

Inspect the xarray dataset

bomex_data = xr.open_dataset(the_file)
bomex_data

open as a Vapor dataset

ses = session.Session()
data = ses.OpenDataset(dataset.CF, [str(the_file)])
ses.Load('session.vs3')
print("Time Coordinate Variable Name:", data.GetTimeCoordVarName())
print("Coordinate Variable Names:", data.GetCoordVarNames())

print("Dimensions:")
for dim in data.GetDimensionNames():
    print(f"  {dim}:", data.GetDimensionLength(dim, 0))

print("Data Variables:")
for var in data.GetDataVarNames():
    print(f"  {var}")
    print(f"    Time Varying:", bool(data.IsTimeVarying(var)))
    print(f"    Dimensionality:", data.GetVarGeometryDim(var))
    print(f"    Coordinates:", data.GetVarCoordVars(var, True))
    print("     Data Range:", data.GetDataRange(var))

Show gridcells

  • Red: watervapor
  • Grey: cloud liquid water

Top view of cloud field, with condensation threshold set to 0.01 g/kg

ren = data.NewRenderer(renderer.VolumeIsoRenderer)
ren.SetVariableName(data.GetDataVarNames(3)[0]) # Set to first 3D data variable
ren.SetIsoValues([0.01])

ses.GetCamera().ViewAll()
ses.Show()

Create visualizer widget

from jupyter_vapor_widget import *

viz = VaporVisualizerWidget(ses)
viz

Add a slider bar

tf = ren.GetPrimaryTransferFunction()
dataRange = tf.GetMinMaxMapValue()

def sliderChanged(change):
    ren.SetIsoValues([change.new])
    viz.Render(fast=True)

slider = widgets.FloatSlider(value=ren.GetIsoValues()[0], min=dataRange[0], max=dataRange[1], step=(dataRange[1]-dataRange[0])/100)
slider.observe(sliderChanged, names='value')

widgets.VBox([
    viz,
    widgets.HBox([widgets.Label("Iso value:"), slider])
])