![]() """ # Set of single function is orthogonal if len ( A ) <= 1 : return # Orthogonalize overything but the last function orthogonalize ( A ) # Orthogonalize the last function to the previous ones f = A for v in A : r = assemble ( inner ( f, v ) * dx ) / assemble ( inner ( v, v ) * dx ) assert f. For numerical stability modified Gramm-Schmidt would be better. Use classical Gramm-Schmidt algorithm for brevity. format ( lambd, len ( space ))) return space def orthogonalize ( A ): """L^2-orthogonalize a list of Functions living on the same function space. get_eigenpair ( j ) # Check that eigenvalue is real assert near ( c / r, 0, 1e-6 ) # Consider found eigenvalues close to the target eigenvalue if near ( r, lambd, tol * lambd ): print ( 'Found eigenfunction with eigenvalue '. get_number_converged ()): # Get eigenpair r, c, rx, cx = eigensolver. solve ( maxdim ) # Iterate over converged eigenpairs space = for j in range ( eigensolver. parameters = 1e-6 #eigensolver.parameters = True # for debugging # Solve for given number of eigenpairs eigensolver. ![]() parameters = 'shift-and-invert' eigensolver. parameters = float ( lambd ) eigensolver. parameters = 'gen_hermitian' eigensolver. """ # Assemble Laplacian A and mass matrix B bc = DirichletBC ( V, 0, lambda x, on_boundary : on_boundary ) u, v = TrialFunction ( V ), TestFunction ( V ) a = inner ( grad ( u ), grad ( v )) * dx L_dummy = Constant ( 0 ) * v * dx m = u * v * dx A, _ = assemble_system ( a, L_dummy, bc ) B = assemble ( m ) # Prepare eigensolver for # A x = lambda B x eigensolver = SLEPcEigenSolver ( as_backend_type ( A ), as_backend_type ( B )) eigensolver. Return list with basis functions of the space. """ bc = DirichletBC ( V, 0, lambda x, on_boundary : on_boundary ) u, v = TrialFunction ( V ), TestFunction ( V ) a = inner ( grad ( u ), grad ( v )) * dx - Constant ( lambd ) * u * v * dx L = f * v * dx u = Function ( V ) solve ( a = L, u, bc ) return u def build_laplacian_eigenspace ( V, lambd, maxdim, tol ): """For given space V finds eigenspace of Laplacian (with zero Dirichlet BC) corresponding to eigenvalues close to lambd by given tolerance tol. From dolfin import * import matplotlib.pyplot as plt def solve_helmholtz ( V, lambd, f ): """Solve Helmholtz problem -\Delta u - lambd u = f in \Omega u = 0 on \partial\Omega and return u.
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. ArchivesCategories |