def test_density(fieldset, mode, area_scale): lons, lats = np.meshgrid(np.linspace(0.05, 0.95, 10), np.linspace(-30, 30, 20)) pset = ParticleSet(fieldset, pclass=ptype[mode], lon=lons, lat=lats) arr = pset.density(area_scale=area_scale) if area_scale: assert np.allclose(arr, 1 / fieldset.U.cell_areas(), rtol=1e-3) # check that density equals 1/area else: assert(np.sum(arr) == lons.size) # check conservation of particles inds = np.where(arr) for i in range(len(inds[0])): # check locations (low atol because of coarse grid) assert np.allclose(fieldset.U.lon[inds[1][i]], pset[i].lon, atol=fieldset.U.lon[1]-fieldset.U.lon[0]) assert np.allclose(fieldset.U.lat[inds[0][i]], pset[i].lat, atol=fieldset.U.lat[1]-fieldset.U.lat[0])
def test_density(grid, mode, npart=10): pset = ParticleSet(grid, pclass=ptype[mode], lon=np.linspace(0, 1, npart, dtype=np.float32), lat=0.5 * np.ones(npart, dtype=np.float32)) arr = pset.density(area_scale=False) assert (np.sum(arr) == npart) # check conservation of particles inds = zip(*np.where(arr)) for i in range( len(inds)): # check locations (low rtol because of coarse grid) assert np.allclose(grid.U.lon[inds[i][0]], pset[i].lon, rtol=1e-1) assert np.allclose(grid.U.lat[inds[i][1]], pset[i].lat, rtol=1e-1)
def test_density(fieldset, mode): lons, lats = np.meshgrid(fieldset.U.lon[0], fieldset.U.lat) pset = ParticleSet(fieldset, pclass=ptype[mode], lon=lons, lat=lats) arr = pset.density(area_scale=False) # Not scaling by area assert (np.sum(arr) == fieldset.U.lat.size ) # check conservation of particles inds = zip(*np.where(arr)) for i in range( len(inds)): # check locations (low rtol because of coarse grid) assert np.allclose(fieldset.U.lon[inds[i][0]], pset[i].lon, rtol=1e-1) assert np.allclose(fieldset.U.lat[inds[i][1]], pset[i].lat, rtol=1e-1) arr = pset.density(area_scale=True) # Scaling by area area = np.zeros(np.shape(fieldset.U.data[0, :, 0]), dtype=np.float32) U = fieldset.U V = fieldset.V dy = (V.lon[1] - V.lon[0]) / V.units.to_target(1, V.lon[0], V.lat[0], V.depth[0]) for y in range(len(U.lat)): dx = (U.lon[1] - U.lon[0]) / U.units.to_target(1, U.lon[0], U.lat[y], V.depth[0]) area[y] = dy * dx assert ((arr[0, :] - (1 / area)) == 0).all() # check that density equals 1/area