def test_jacobi_intergrate(N, a, b, k, dtype): c = coords.Coordinate('x') d = distributor.Distributor((c,)) b = basis.Jacobi(c, size=N, a0=a, b0=b, a=a+k, b=b+k, bounds=(0, 1)) x = b.local_grid(1) f = field.Field(dist=d, bases=(b,), dtype=dtype) f['g'] = x**5 fi = operators.Integrate(f, c).evaluate() assert np.allclose(fi['g'], 1/6)
def add_property(self, property, name, precompute_integral=False): """Add a property.""" self.properties.add_task(property, layout='g', name=name) if precompute_integral: # Add integral under slightly obscured name task_op = self.properties.tasks[-1]['operator'] integral_op = operators.Integrate(task_op) integral_name = '_{}_integral'.format(name) self.properties.add_task(integral_op, layout='g', name=integral_name)
def test_integrate_scalar(Nphi, Nr, k, dealias, dtype, basis, n): c, d, b, phi, r, x, y = basis(Nphi, Nr, k, dealias, dtype) f = field.Field(dist=d, bases=(b, ), dtype=dtype) f.preset_scales(b.domain.dealias) f['g'] = r**(2 * n) h = operators.Integrate(f, c).evaluate() if isinstance(b, DiskBasis): r_inner, r_outer = 0, b.radius else: r_inner, r_outer = b.radii hg = 2 * np.pi * (r_outer**(2 + 2 * n) - r_inner**(2 + 2 * n)) / (2 + 2 * n) assert np.allclose(h['g'], hg)
def test_fourier_integrate(N, bounds, dtype): c = coords.Coordinate('x') d = distributor.Distributor((c, )) if dtype == np.float64: b = basis.RealFourier(c, size=N, bounds=bounds) elif dtype == np.complex128: b = basis.ComplexFourier(c, size=N, bounds=bounds) x = b.local_grid(1) f = field.Field(dist=d, bases=(b, ), dtype=dtype) k = 4 * np.pi / (bounds[1] - bounds[0]) f['g'] = 1 + np.sin(k * x + 0.1) fi = operators.Integrate(f, c).evaluate() assert np.allclose(fi['g'], bounds[1] - bounds[0])
def volume_integral(self, name): """Compute volume integral of a property.""" # Check for precomputed integral try: integral_name = '_{}_integral'.format(name) integral_field = self.properties[integral_name] except KeyError: # Compute volume integral field = self.properties[name] integral_op = operators.Integrate(field) integral_field = integral_op.evaluate() # Communicate integral value to all processes integral_value = self.reducer.global_max(integral_field['g']) return integral_value