Hi Jason,
Welcome to Dedalus!
In your snippet, lines 67-68 are getting the grid you have defined when you set up the domain. These are not variables; they are fixed during the course of the simulation. Lines 69-70 are indeed getting a pointer to the buoyancy ('b') variable and its first derivative in z ('bz'). These are initialized to zero.
Typically, in RB convection problems, it's easier to put a fluctuation in the buoyancy variable rather than the velocity, because then you don't need to worry about ensuring that the perturbation is incompressible! If you look at lines 72-82 in that same file, you'll see that first we create some noise:
# Random perturbations, initialized globally for same results in parallel
gshape = domain.dist.grid_layout.global_shape(scales=1)
slices = domain.dist.grid_layout.slices(scales=1)
rand = np.random.RandomState(seed=42)
noise = rand.standard_normal(gshape)[slices]
and then we put that noise into the buoyancy variable:
zb, zt = z_basis.interval
pert = 1e-3 * noise * (zt - z) * (z - zb)
b['g'] = -F*(z - pert)
b.differentiate('z', out=bz)