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
Vapor 3.8.3
Python 3.9.16 (/home/phil/mini39/envs/vapor)
OpenGL 4.6.0 NVIDIA 470.182.03

adjust path to point to file

the_file = Path().resolve() / 'bomex_qv_qn.nc'
print(the_file)
the_file.exists()
/home/phil/repos/vapor-python-cookbook/notebooks/bomex_qv_qn.nc
True

Inspect the xarray dataset

bomex_data = xr.open_dataset(the_file)
bomex_data
Loading...

open as a Vapor dataset

ses = session.Session()
data = ses.OpenDataset(dataset.CF, [str(the_file)])
ses.Load('session.vs3')
0
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))
Time Coordinate Variable Name: time
Coordinate Variable Names: ['time', 'x', 'y', 'z']
Dimensions:
  time: 1
  x: 512
  y: 512
  z: 256
Data Variables:
  QN
    Time Varying: True
    Dimensionality: 3
    Coordinates: ['x', 'y', 'z']
     Data Range: [0.0, 2.0163745880126953]
  QV
    Time Varying: True
    Dimensionality: 3
    Coordinates: ['x', 'y', 'z']
     Data Range: [2.760067939758301, 18.385417938232422]

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()
Dataset: 'bomex_qv_qn.nc'
<PIL.Image.Image image mode=RGB size=600x480>

Create visualizer widget

from jupyter_vapor_widget import *

viz = VaporVisualizerWidget(ses)
viz
Loading...

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])
])
Loading...