def elliptic_demo(args): args['PROBLEM-NUMBER'] = int(args['PROBLEM-NUMBER']) assert 0 <= args['PROBLEM-NUMBER'] <= 1, ValueError('Invalid problem number') args['DIRICHLET-NUMBER'] = int(args['DIRICHLET-NUMBER']) assert 0 <= args['DIRICHLET-NUMBER'] <= 2, ValueError('Invalid Dirichlet boundary number.') args['NEUMANN-NUMBER'] = int(args['NEUMANN-NUMBER']) assert 0 <= args['NEUMANN-NUMBER'] <= 2, ValueError('Invalid Neumann boundary number.') args['NEUMANN-COUNT'] = int(args['NEUMANN-COUNT']) assert 0 <= args['NEUMANN-COUNT'] <= 3, ValueError('Invalid Neumann boundary count.') rhss = [ExpressionFunction('ones(x.shape[:-1]) * 10', 2, ()), ExpressionFunction('(x[..., 0] - 0.5) ** 2 * 1000', 2, ())] dirichlets = [ExpressionFunction('zeros(x.shape[:-1])', 2, ()), ExpressionFunction('ones(x.shape[:-1])', 2, ()), ExpressionFunction('x[..., 0]', 2, ())] neumanns = [None, ConstantFunction(3., dim_domain=2), ExpressionFunction('50*(0.1 <= x[..., 1]) * (x[..., 1] <= 0.2)' '+50*(0.8 <= x[..., 1]) * (x[..., 1] <= 0.9)', 2, ())] domains = [RectDomain(), RectDomain(right='neumann'), RectDomain(right='neumann', top='neumann'), RectDomain(right='neumann', top='neumann', bottom='neumann')] rhs = rhss[args['PROBLEM-NUMBER']] dirichlet = dirichlets[args['DIRICHLET-NUMBER']] neumann = neumanns[args['NEUMANN-NUMBER']] domain = domains[args['NEUMANN-COUNT']] for n in [32, 128]: grid_name = '{1}(({0},{0}))'.format(n, 'RectGrid' if args['--rect'] else 'TriaGrid') print('Solving on {0}'.format(grid_name)) print('Setup problem ...') problem = StationaryProblem( domain=domain, diffusion=ConstantFunction(1, dim_domain=2), rhs=rhs, dirichlet_data=dirichlet, neumann_data=neumann ) print('Discretize ...') if args['--rect']: grid, bi = discretize_domain_default(problem.domain, diameter=m.sqrt(2) / n, grid_type=RectGrid) else: grid, bi = discretize_domain_default(problem.domain, diameter=1. / n, grid_type=TriaGrid) discretizer = discretize_stationary_fv if args['--fv'] else discretize_stationary_cg discretization, _ = discretizer(analytical_problem=problem, grid=grid, boundary_info=bi) print('Solve ...') U = discretization.solve() print('Plot ...') discretization.visualize(U, title=grid_name) print('')
def elliptic_demo(args): args['PROBLEM-NUMBER'] = int(args['PROBLEM-NUMBER']) assert 0 <= args['PROBLEM-NUMBER'] <= 1, ValueError('Invalid problem number') args['DIRICHLET-NUMBER'] = int(args['DIRICHLET-NUMBER']) assert 0 <= args['DIRICHLET-NUMBER'] <= 2, ValueError('Invalid Dirichlet boundary number.') args['NEUMANN-NUMBER'] = int(args['NEUMANN-NUMBER']) assert 0 <= args['NEUMANN-NUMBER'] <= 2, ValueError('Invalid Neumann boundary number.') args['NEUMANN-COUNT'] = int(args['NEUMANN-COUNT']) assert 0 <= args['NEUMANN-COUNT'] <= 3, ValueError('Invalid Neumann boundary count.') rhss = [GenericFunction(lambda X: np.ones(X.shape[:-1]) * 10, 2), GenericFunction(lambda X: (X[..., 0] - 0.5) ** 2 * 1000, 2)] dirichlets = [GenericFunction(lambda X: np.zeros(X.shape[:-1]), 2), GenericFunction(lambda X: np.ones(X.shape[:-1]), 2), GenericFunction(lambda X: X[..., 0], 2)] neumanns = [None, ConstantFunction(3., dim_domain=2), GenericFunction(lambda X: 50*(0.1 <= X[..., 1]) * (X[..., 1] <= 0.2) +50*(0.8 <= X[..., 1]) * (X[..., 1] <= 0.9), 2)] domains = [RectDomain(), RectDomain(right=BoundaryType('neumann')), RectDomain(right=BoundaryType('neumann'), top=BoundaryType('neumann')), RectDomain(right=BoundaryType('neumann'), top=BoundaryType('neumann'), bottom=BoundaryType('neumann'))] rhs = rhss[args['PROBLEM-NUMBER']] dirichlet = dirichlets[args['DIRICHLET-NUMBER']] neumann = neumanns[args['NEUMANN-NUMBER']] domain = domains[args['NEUMANN-COUNT']] for n in [32, 128]: grid_name = '{1}(({0},{0}))'.format(n, 'RectGrid' if args['--rect'] else 'TriaGrid') print('Solving on {0}'.format(grid_name)) print('Setup problem ...') problem = EllipticProblem(domain=domain, rhs=rhs, dirichlet_data=dirichlet, neumann_data=neumann) print('Discretize ...') if args['--rect']: grid, bi = discretize_domain_default(problem.domain, diameter=m.sqrt(2) / n, grid_type=RectGrid) else: grid, bi = discretize_domain_default(problem.domain, diameter=1. / n, grid_type=TriaGrid) discretizer = discretize_elliptic_fv if args['--fv'] else discretize_elliptic_cg discretization, _ = discretizer(analytical_problem=problem, grid=grid, boundary_info=bi) print('Solve ...') U = discretization.solve() print('Plot ...') discretization.visualize(U, title=grid_name) print('')
def test_visualize_patch(backend_gridtype): backend, gridtype = backend_gridtype domain = LineDomain() if gridtype is OnedGrid else RectDomain() dim = 1 if gridtype is OnedGrid else 2 rhs = GenericFunction(lambda X: np.ones(X.shape[:-1]) * 10, dim) # NOQA dirichlet = GenericFunction(lambda X: np.zeros(X.shape[:-1]), dim) # NOQA diffusion = GenericFunction(lambda X: np.ones(X.shape[:-1]), dim) # NOQA problem = EllipticProblem(domain=domain, rhs=rhs, dirichlet_data=dirichlet, diffusion_functions=(diffusion,)) grid, bi = discretize_domain_default(problem.domain, grid_type=gridtype) discretization, data = discretize_elliptic_cg(analytical_problem=problem, grid=grid, boundary_info=bi) U = discretization.solve() visualize_patch(data['grid'], U=U, backend=backend) sleep(2) # so gui has a chance to popup stop_gui_processes()
def parabolic_demo(args): args['DIFF'] = float(args['DIFF']) args['--nt'] = int(args['--nt']) args['--grid'] = int(args['--grid']) grid_name = '{1}(({0},{0}))'.format(args['--grid'], 'RectGrid' if args['--rect'] else 'TriaGrid') print('Solving on {0}'.format(grid_name)) print('Setup problem ...') domain = RectDomain(top=BoundaryType('neumann'), bottom=BoundaryType('neumann')) rhs = ConstantFunction(value=0, dim_domain=2) diffusion_functional = GenericParameterFunctional(mapping=lambda mu: mu['diffusion'], parameter_type={'diffusion': 0}) neumann = ConstantFunction(value=-1., dim_domain=2) initial = GenericFunction(lambda X: np.cos(np.pi*X[..., 0])*np.sin(np.pi*X[..., 1]), dim_domain=2) problem = ParabolicProblem(domain=domain, rhs=rhs, diffusion_functionals=[diffusion_functional], dirichlet_data=initial, neumann_data=neumann, initial_data=initial) print('Discretize ...') if args['--rect']: grid, bi = discretize_domain_default(problem.domain, diameter=m.sqrt(2) / args['--grid'], grid_type=RectGrid) else: grid, bi = discretize_domain_default(problem.domain, diameter=1. / args['--grid'], grid_type=TriaGrid) discretizer = discretize_parabolic_fv if args['--fv'] else discretize_parabolic_cg discretization, _ = discretizer(analytical_problem=problem, grid=grid, boundary_info=bi, nt=args['--nt']) print('The parameter type is {}'.format(discretization.parameter_type)) mu = {'diffusion': args['DIFF']} print('Solving for diffusion = {} ... '.format(mu['diffusion'])) U = discretization.solve(mu) print('Plot ...') discretization.visualize(U, title=grid_name) print('')
def test_visualize_patch(backend_gridtype): backend, gridtype = backend_gridtype domain = LineDomain() if gridtype is OnedGrid else RectDomain() dim = 1 if gridtype is OnedGrid else 2 rhs = GenericFunction(lambda X: np.ones(X.shape[:-1]) * 10, dim) # NOQA dirichlet = GenericFunction(lambda X: np.zeros(X.shape[:-1]), dim) # NOQA diffusion = GenericFunction(lambda X: np.ones(X.shape[:-1]), dim) # NOQA problem = StationaryProblem(domain=domain, rhs=rhs, dirichlet_data=dirichlet, diffusion=diffusion) grid, bi = discretize_domain_default(problem.domain, grid_type=gridtype) discretization, data = discretize_stationary_cg(analytical_problem=problem, grid=grid, boundary_info=bi) U = discretization.solve() try: visualize_patch(data['grid'], U=U, backend=backend) except PySideMissing as ie: pytest.xfail("PySide missing") finally: stop_gui_processes()
def test_visualize_patch(backend_gridtype): backend, gridtype = backend_gridtype domain = LineDomain() if gridtype is OnedGrid else RectDomain() dim = 1 if gridtype is OnedGrid else 2 rhs = GenericFunction(lambda X: np.ones(X.shape[:-1]) * 10, dim) # NOQA dirichlet = GenericFunction(lambda X: np.zeros(X.shape[:-1]), dim) # NOQA diffusion = GenericFunction(lambda X: np.ones(X.shape[:-1]), dim) # NOQA problem = StationaryProblem(domain=domain, rhs=rhs, dirichlet_data=dirichlet, diffusion=diffusion) grid, bi = discretize_domain_default(problem.domain, grid_type=gridtype) d, data = discretize_stationary_cg(analytical_problem=problem, grid=grid, boundary_info=bi) U = d.solve() try: visualize_patch(data['grid'], U=U, backend=backend) except QtMissing as ie: pytest.xfail("Qt missing") finally: stop_gui_processes()
def test_visualize_patch(backend_gridtype): backend, gridtype = backend_gridtype domain = LineDomain() if gridtype is OnedGrid else RectDomain() dim = 1 if gridtype is OnedGrid else 2 rhs = GenericFunction(lambda X: np.ones(X.shape[:-1]) * 10, dim) # NOQA dirichlet = GenericFunction(lambda X: np.zeros(X.shape[:-1]), dim) # NOQA diffusion = GenericFunction(lambda X: np.ones(X.shape[:-1]), dim) # NOQA problem = EllipticProblem(domain=domain, rhs=rhs, dirichlet_data=dirichlet, diffusion_functions=(diffusion, )) grid, bi = discretize_domain_default(problem.domain, grid_type=gridtype) discretization, data = discretize_elliptic_cg(analytical_problem=problem, grid=grid, boundary_info=bi) U = discretization.solve() visualize_patch(data['grid'], U=U, backend=backend) sleep(2) # so gui has a chance to popup for child in multiprocessing.active_children(): child.terminate()