Test implicit evaluation of 3D curl operator for correctness.
(basis, N, dealias, dtype)
| 354 | @pytest.mark.parametrize('dealias', dealias_range) |
| 355 | @pytest.mark.parametrize('dtype', dtype_range) |
| 356 | def test_curl_implicit_FFC(basis, N, dealias, dtype): |
| 357 | """Test implicit evaluation of 3D curl operator for correctness.""" |
| 358 | c, d, b, r = basis(N, dealias, dtype) |
| 359 | # ABC vector field |
| 360 | k = 2 * np.pi * np.array([1/Lx, 1/Ly, 1/Lz]) |
| 361 | f = d.VectorField(c, bases=b) |
| 362 | f.preset_scales(dealias) |
| 363 | f['g'][0] = np.sin(k[2]*r[2]) + np.cos(k[1]*r[1]) |
| 364 | f['g'][1] = np.sin(k[0]*r[0]) + np.cos(k[2]*r[2]) |
| 365 | f['g'][2] = np.sin(k[1]*r[1]) + np.cos(k[0]*r[0]) |
| 366 | g = d.VectorField(c, bases=b) |
| 367 | g.preset_scales(dealias) |
| 368 | g['g'][0] = k[2]*np.sin(k[2]*r[2]) + k[1]*np.cos(k[1]*r[1]) |
| 369 | g['g'][1] = k[0]*np.sin(k[0]*r[0]) + k[2]*np.cos(k[2]*r[2]) |
| 370 | g['g'][2] = k[1]*np.sin(k[1]*r[1]) + k[0]*np.cos(k[0]*r[0]) |
| 371 | # Helmholtz LBVP |
| 372 | u = d.VectorField(c, name='u', bases=b) |
| 373 | phi = d.Field(name='phi', bases=b) |
| 374 | tau1 = d.VectorField(c, name='tau1', bases=b[0:2]) |
| 375 | tau2 = d.Field(name='tau2', bases=b[0:2]) |
| 376 | lift_basis = b[2].derivative_basis(1) |
| 377 | lift = lambda A, n: d3.Lift(A, lift_basis, n) |
| 378 | problem = d3.LBVP([u, phi, tau1, tau2], namespace=locals()) |
| 379 | problem.add_equation("curl(u) + grad(phi) + lift(tau1,-1) = g") |
| 380 | problem.add_equation("div(u) + lift(tau2,-1) = 0") |
| 381 | problem.add_equation("u(z=0) = f(z=0)") |
| 382 | problem.add_equation("phi(z=0) = 0") |
| 383 | solver = problem.build_solver() |
| 384 | solver.solve() |
| 385 | assert np.allclose(u['c'], f['c']) |
| 386 |
nothing calls this directly
no test coverage detected