From f6c4b2bcd3579a06d184df97821908b2d9ad1902 Mon Sep 17 00:00:00 2001 From: olender Date: Fri, 19 Jul 2024 18:50:44 -0300 Subject: [PATCH] cleanup --- check_mlt.py | 28 - check_sem.py | 55 - check_u.py | 70 - check_u2.py | 113 - check_u3.py | 138 - notebook_tutorials/meshing.html | 8976 ----------------- .../premade_useful_examples.html | 8177 --------------- notebook_tutorials/simple_forward.html | 8120 --------------- .../simple_forward_with_overthrust.html | 8125 --------------- simple_mms.py | 145 - temp_MMS.py | 28 - velocity_models/tutorial | Bin 518568 -> 0 bytes 12 files changed, 33975 deletions(-) delete mode 100644 check_mlt.py delete mode 100644 check_sem.py delete mode 100644 check_u.py delete mode 100644 check_u2.py delete mode 100644 check_u3.py delete mode 100644 notebook_tutorials/meshing.html delete mode 100644 notebook_tutorials/premade_useful_examples.html delete mode 100644 notebook_tutorials/simple_forward.html delete mode 100644 notebook_tutorials/simple_forward_with_overthrust.html delete mode 100644 simple_mms.py delete mode 100644 temp_MMS.py delete mode 100644 velocity_models/tutorial diff --git a/check_mlt.py b/check_mlt.py deleted file mode 100644 index 623dc913..00000000 --- a/check_mlt.py +++ /dev/null @@ -1,28 +0,0 @@ -import finat -from firedrake import * -import numpy as np - - -def isDiag(M): - i, j = np.nonzero(M) - return np.all(i == j) - -degree = 4 -mesh = RectangleMesh(3, 2, 2.0, 1.0) -element = FiniteElement( # noqa: F405 - "KMV", mesh.ufl_cell(), degree=degree, variant="KMV" -) -V = FunctionSpace(mesh, element) -quad_rule = finat.quadrature.make_quadrature(V.finat_element.cell, V.ufl_element().degree(), "KMV") - -u = TrialFunction(V) -v = TestFunction(V) - -form = u*v*dx(scheme=quad_rule) -A = assemble(form) -M = A.M.values -Mdiag = M.diagonal() - -print(f"Matrix is diagonal:{isDiag(M)}") -np.save("new_diag", Mdiag) -print("END") \ No newline at end of file diff --git a/check_sem.py b/check_sem.py deleted file mode 100644 index d2645690..00000000 --- a/check_sem.py +++ /dev/null @@ -1,55 +0,0 @@ -import finat -import FIAT -from firedrake import * -import numpy as np - - -def gauss_lobatto_legendre_line_rule(degree): - fiat_make_rule = FIAT.quadrature.GaussLobattoLegendreQuadratureLineRule - fiat_rule = fiat_make_rule(FIAT.ufc_simplex(1), degree + 1) - finat_ps = finat.point_set.GaussLobattoLegendrePointSet - points = finat_ps(fiat_rule.get_points()) - weights = fiat_rule.get_weights() - return finat.quadrature.QuadratureRule(points, weights) - -def gauss_lobatto_legendre_cube_rule(dimension, degree): - make_tensor_rule = finat.quadrature.TensorProductQuadratureRule - result = gauss_lobatto_legendre_line_rule(degree) - for _ in range(1, dimension): - line_rule = gauss_lobatto_legendre_line_rule(degree) - result = make_tensor_rule([result, line_rule]) - return result - - - -def isDiag(M): - i, j = np.nonzero(M) - return np.all(i == j) - -degree = 2 -# mesh = RectangleMesh(3, 2, 2.0, 1.0, quadrilateral=True) -mesh = RectangleMesh(1, 1, 1.0, 1.0, quadrilateral=True) -element = FiniteElement('CG', mesh.ufl_cell(), degree=degree, variant='spectral') -V = FunctionSpace(mesh, element) -quad_rule = gauss_lobatto_legendre_cube_rule(dimension=2, degree=degree) - -u = TrialFunction(V) -v = TestFunction(V) - -form = u*v*dx(scheme=quad_rule) -A = assemble(form) -M = A.M.values -Mdiag = M.diagonal() - -x_mesh, y_mesh = SpatialCoordinate(mesh) -x_func = Function(V) -y_func = Function(V) -x_func.interpolate(x_mesh) -y_func.interpolate(y_mesh) -x = x_func.dat.data[:] -y = y_func.dat.data[:] - -print(f"Matrix is diagonal:{isDiag(M)}") -old_diag = np.load("/home/olender/Development/issue_50_compatibility/spyro-1/old_sem_diag.npy") -dif = Mdiag-old_diag -print("END") \ No newline at end of file diff --git a/check_u.py b/check_u.py deleted file mode 100644 index e3f3eda2..00000000 --- a/check_u.py +++ /dev/null @@ -1,70 +0,0 @@ -import finat -from firedrake import * -import numpy as np - - -def analytical_solution(t, V, mesh_z, mesh_x): - analytical = Function(V) - x = mesh_z - y = mesh_x - analytical.interpolate(x * (x + 1) * y * (y - 1) * t) - - return analytical - - -def isDiag(M): - i, j = np.nonzero(M) - return np.all(i == j) - -degree = 4 -mesh = RectangleMesh(3, 2, 2.0, 1.0) -mesh.coordinates.dat.data[:, 0] *= -1.0 -mesh_z, mesh_x = SpatialCoordinate(mesh) -V = FunctionSpace(mesh, "KMV", degree) -quad_rule = finat.quadrature.make_quadrature(V.finat_element.cell, V.ufl_element().degree(), "KMV") - -u = TrialFunction(V) -v = TestFunction(V) - -c = Function(V, name="velocity") -c.interpolate(1 + sin(pi*-mesh_z)*sin(pi*mesh_x)) -u_n = Function(V) -u_nm1 = Function(V) -dt = 0.0005 -t = 0.0 -u_nm1.assign(analytical_solution((t - 2 * dt), V, mesh_z, mesh_x)) -u_n.assign(analytical_solution((t - dt), V, mesh_z, mesh_x)) - -q = Function(V) -q.assign(1.0) -dt = 0.001 - -m1 = ( - 1 - / (c * c) - * ((u - 2.0 * u_n + u_nm1) / Constant(dt**2)) - * v - * dx(scheme=quad_rule) -) -a = dot(grad(u_n), grad(v)) * dx(scheme=quad_rule) -le = q * v * dx(scheme=quad_rule) - -form = m1 + a - le - -boundary_ids = (1, 2, 3, 4) -bcs = DirichletBC(V, 0.0, boundary_ids) -A = assemble(lhs(form), bcs=bcs) -solver_parameters = { - "ksp_type": "preonly", - "pc_type": "jacobi", -} -solver = LinearSolver( - A, solver_parameters=solver_parameters -) -M = A.M.values -Mdiag = M.diagonal() - -print(f"Matrix is diagonal:{isDiag(M)}") -np.save("/home/olender/Development/issue_50_compatibility/spyro-1/new_diag", Mdiag) - -print("END") \ No newline at end of file diff --git a/check_u2.py b/check_u2.py deleted file mode 100644 index 30ff1ad1..00000000 --- a/check_u2.py +++ /dev/null @@ -1,113 +0,0 @@ -import finat -from firedrake import * -import numpy as np - - -def analytical_solution(t, V, mesh_z, mesh_x): - analytical = Function(V) - x = mesh_z - y = mesh_x - analytical.interpolate(x * (x + 1) * y * (y - 1) * t) - - return analytical - - -def isDiag(M): - i, j = np.nonzero(M) - return np.all(i == j) - -degree = 4 -mesh = RectangleMesh(50, 50, 1.0, 1.0) -mesh.coordinates.dat.data[:, 0] *= -1.0 -mesh_z, mesh_x = SpatialCoordinate(mesh) -V = FunctionSpace(mesh, "KMV", degree) -quad_rule = finat.quadrature.make_quadrature(V.finat_element.cell, V.ufl_element().degree(), "KMV") - -u = TrialFunction(V) -v = TestFunction(V) - -c = Function(V, name="velocity") -c.interpolate(1 + sin(pi*-mesh_z)*sin(pi*mesh_x)) -u_n = Function(V) -u_nm1 = Function(V) -dt = 0.0005 -t = 0.0 -final_time = 1.0 -u_nm1.assign(analytical_solution((t - 2 * dt), V, mesh_z, mesh_x)) -u_n.assign(analytical_solution((t - dt), V, mesh_z, mesh_x)) - -q_xy = Function(V) -q_xy.interpolate(-(mesh_z**2) - mesh_z - mesh_x**2 + mesh_x) -q = q_xy * Constant(2 * t) - -nt = int((final_time - t) / dt) + 1 - -m1 = ( - 1 - / (c * c) - * ((u - 2.0 * u_n + u_nm1) / Constant(dt**2)) - * v - * dx(scheme=quad_rule) -) -a = dot(grad(u_n), grad(v)) * dx(scheme=quad_rule) -le = q * v * dx(scheme=quad_rule) - -form = m1 + a - le - -B = Cofunction(V.dual()) - -boundary_ids = (1, 2, 3, 4) -bcs = DirichletBC(V, 0.0, boundary_ids) -A = assemble(lhs(form), bcs=bcs) -solver_parameters = { - "ksp_type": "preonly", - "pc_type": "jacobi", -} -solver = LinearSolver( - A, solver_parameters=solver_parameters -) -As = solver.A -petsc_matrix = As.petscmat -diagonal = petsc_matrix.getDiagonal() -Mdiag = diagonal.array - -np.save("/home/olender/Development/issue_50_compatibility/spyro-1/new_diag", Mdiag) -out = File("new_firedrake_u2.pvd") - -u_np1 = Function(V) -for step in range(nt): - q = q_xy * Constant(2 * t) - m1 = ( - 1 - / (c * c) - * ((u - 2.0 * u_n + u_nm1) / Constant(dt**2)) - * v - * dx(scheme=quad_rule) - ) - a = dot(grad(u_n), grad(v)) * dx(scheme=quad_rule) - le = q * v * dx(scheme=quad_rule) - - form = m1 + a - le - - B = assemble(rhs(form), tensor=B) - - solver.solve(u_np1, B) - - if (step - 1) % 100 == 0: - print(f"Time : {t}") - out.write(u_n) - assert ( - norm(u_n) < 1 - ), "Numerical instability. Try reducing dt or building the \ - mesh differently" - - u_nm1.assign(u_n) - u_n.assign(u_np1) - - t = step * float(dt) - -u_an = analytical_solution(t, V, mesh_z, mesh_x) -error = errornorm(u_n, u_an) -print(f"Error: {error}") - -print("END") \ No newline at end of file diff --git a/check_u3.py b/check_u3.py deleted file mode 100644 index ed72098e..00000000 --- a/check_u3.py +++ /dev/null @@ -1,138 +0,0 @@ -import finat -import FIAT -from firedrake import * -import numpy as np - - -def gauss_lobatto_legendre_line_rule(degree): - fiat_make_rule = FIAT.quadrature.GaussLobattoLegendreQuadratureLineRule - fiat_rule = fiat_make_rule(FIAT.ufc_simplex(1), degree + 1) - finat_ps = finat.point_set.GaussLobattoLegendrePointSet - points = finat_ps(fiat_rule.get_points()) - weights = fiat_rule.get_weights() - return finat.quadrature.QuadratureRule(points, weights) - -def gauss_lobatto_legendre_cube_rule(dimension, degree): - make_tensor_rule = finat.quadrature.TensorProductQuadratureRule - result = gauss_lobatto_legendre_line_rule(degree) - for _ in range(1, dimension): - line_rule = gauss_lobatto_legendre_line_rule(degree) - result = make_tensor_rule([result, line_rule]) - return result - - - -def analytical_solution(t, V, mesh_z, mesh_x): - analytical = Function(V) - x = mesh_z - y = mesh_x - analytical.interpolate(x * (x + 1) * y * (y - 1) * t) - - return analytical - - -def isDiag(M): - i, j = np.nonzero(M) - return np.all(i == j) - -degree = 4 -mesh = RectangleMesh(50, 50, 1.0, 1.0, quadrilateral=True) -mesh.coordinates.dat.data[:, 0] *= -1.0 -mesh_z, mesh_x = SpatialCoordinate(mesh) -element = FiniteElement('CG', mesh.ufl_cell(), degree=degree, variant='spectral') -V = FunctionSpace(mesh, element) -quad_rule = gauss_lobatto_legendre_cube_rule(dimension=2, degree=degree) - -u = TrialFunction(V) -v = TestFunction(V) - -c = Function(V, name="velocity") -c.interpolate(1 + sin(pi*-mesh_z)*sin(pi*mesh_x)) -u_n = Function(V) -u_nm1 = Function(V) -dt = 0.0005 -t = 0.0 -final_time = 1.0 -u_nm1.assign(analytical_solution((t - 2 * dt), V, mesh_z, mesh_x)) -u_n.assign(analytical_solution((t - dt), V, mesh_z, mesh_x)) - -q_xy = Function(V) -q_xy.interpolate(-(mesh_z**2) - mesh_z - mesh_x**2 + mesh_x) -q = q_xy * Constant(2 * t) - -nt = int((final_time - t) / dt) + 1 - -m1 = ( - 1 - / (c * c) - * ((u - 2.0 * u_n + u_nm1) / Constant(dt**2)) - * v - * dx(scheme=quad_rule) -) -a = dot(grad(u_n), grad(v)) * dx(scheme=quad_rule) -le = q * v * dx(scheme=quad_rule) - -form = m1 + a - le - -B = Cofunction(V.dual()) - -boundary_ids = (1, 2, 3, 4) -bcs = DirichletBC(V, 0.0, boundary_ids) -A = assemble(lhs(form), bcs=bcs) -solver_parameters = { - "ksp_type": "preonly", - "pc_type": "jacobi", -} -solver = LinearSolver( - A, solver_parameters=solver_parameters -) -As = solver.A -petsc_matrix = As.petscmat -diagonal = petsc_matrix.getDiagonal() -Mdiag = diagonal.array - -# old_Mdiag = np.load("/home/olender/Development/issue_50_compatibility/spyro-1/old_diag.npy") -# old_qxy = np.load("/home/olender/Development/issue_50_compatibility/spyro-1/old_qxy.npy") # OK -# old_un = np.load("/home/olender/Development/issue_50_compatibility/spyro-1/old_un.npy") # OK -# old_unm1 = np.load("/home/olender/Development/issue_50_compatibility/spyro-1/old_unm1.npy") # OK -# old_c = np.load("/home/olender/Development/issue_50_compatibility/spyro-1/old_c.npy") # OK - -# out = File("new_firedrake_u2.pvd") - -u_np1 = Function(V) -for step in range(nt): - q = q_xy * Constant(2 * t) - m1 = ( - 1 - / (c * c) - * ((u - 2.0 * u_n + u_nm1) / Constant(dt**2)) - * v - * dx(scheme=quad_rule) - ) - a = dot(grad(u_n), grad(v)) * dx(scheme=quad_rule) - le = q * v * dx(scheme=quad_rule) - - form = m1 + a - le - - B = assemble(rhs(form), tensor=B) - - solver.solve(u_np1, B) - - if (step - 1) % 100 == 0: - print(f"Time : {t}") - # out.write(u_n) - assert ( - norm(u_n) < 1 - ), "Numerical instability. Try reducing dt or building the \ - mesh differently" - - u_nm1.assign(u_n) - u_n.assign(u_np1) - - t = step * float(dt) - -u_an = analytical_solution(t, V, mesh_z, mesh_x) -error = errornorm(u_n, u_an) -print(f"Error: {error}") - -print("END") \ No newline at end of file diff --git a/notebook_tutorials/meshing.html b/notebook_tutorials/meshing.html deleted file mode 100644 index fe948904..00000000 --- a/notebook_tutorials/meshing.html +++ /dev/null @@ -1,8976 +0,0 @@ - - - - - -meshing - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - diff --git a/notebook_tutorials/premade_useful_examples.html b/notebook_tutorials/premade_useful_examples.html deleted file mode 100644 index fe6b0895..00000000 --- a/notebook_tutorials/premade_useful_examples.html +++ /dev/null @@ -1,8177 +0,0 @@ - - - - - -premade_useful_examples - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - -
- - diff --git a/notebook_tutorials/simple_forward.html b/notebook_tutorials/simple_forward.html deleted file mode 100644 index a71fb9aa..00000000 --- a/notebook_tutorials/simple_forward.html +++ /dev/null @@ -1,8120 +0,0 @@ - - - - - -simple_forward - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
- - diff --git a/notebook_tutorials/simple_forward_with_overthrust.html b/notebook_tutorials/simple_forward_with_overthrust.html deleted file mode 100644 index d042fc35..00000000 --- a/notebook_tutorials/simple_forward_with_overthrust.html +++ /dev/null @@ -1,8125 +0,0 @@ - - - - - -simple_forward_with_overthrust - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - -
- - diff --git a/simple_mms.py b/simple_mms.py deleted file mode 100644 index de70a538..00000000 --- a/simple_mms.py +++ /dev/null @@ -1,145 +0,0 @@ -import firedrake as fire -from firedrake import dot, grad, sin, pi, dx -import FIAT -import finat -import math - - -def gauss_lobatto_legendre_line_rule(degree): - fiat_make_rule = FIAT.quadrature.GaussLobattoLegendreQuadratureLineRule - fiat_rule = fiat_make_rule(FIAT.ufc_simplex(1), degree + 1) - finat_ps = finat.point_set.GaussLobattoLegendrePointSet - points = finat_ps(fiat_rule.get_points()) - weights = fiat_rule.get_weights() - return finat.quadrature.QuadratureRule(points, weights) - - -def gauss_lobatto_legendre_cube_rule(dimension, degree): - make_tensor_rule = finat.quadrature.TensorProductQuadratureRule - result = gauss_lobatto_legendre_line_rule(degree) - for _ in range(1, dimension): - line_rule = gauss_lobatto_legendre_line_rule(degree) - result = make_tensor_rule([result, line_rule]) - return result - - -def analytical_solution(t, V, mesh_z, mesh_x): - analytical = fire.Function(V) - x = mesh_z - y = mesh_x - analytical.interpolate(x * (x + 1) * y * (y - 1) * t) - - return analytical - - -quad_rule = gauss_lobatto_legendre_cube_rule(dimension=2, degree=4) - -length_z = 1.0 -length_x = 1.0 - -mesh_dx = 0.02 -nz = int(length_z / mesh_dx) -nx = int(length_x / mesh_dx) -mesh = fire.RectangleMesh( - nz, - nx, - length_z, - length_x, - quadrilateral=True -) -mesh_z, mesh_x = fire.SpatialCoordinate(mesh) - -output = fire.File("debug.pvd") - -element = fire.FiniteElement( # noqa: F405 - "CG", mesh.ufl_cell(), degree=4, variant="spectral" -) -V = fire.FunctionSpace(mesh, element) - -X = fire.Function(V) -u_nm1 = fire.Function(V) -u_n = fire.Function(V) - -# Setting C -c = fire.Function(V, name="velocity") -c.interpolate(1 + sin(pi*-mesh_z)*sin(pi*mesh_x)) - -# setting xy part of source -q_xy = fire.Function(V) -xy = fire.project((-(mesh_z**2) - mesh_z - mesh_x**2 + mesh_x), V) -q_xy.assign(xy) - -# Starting time integration -t = 0.0 -final_time = 1.0 -dt = 0.0001 -nt = int((final_time - t) / dt) + 1 -u_nm1.assign(analytical_solution((t - 2 * dt), V, mesh_z, mesh_x)) -u_n.assign(analytical_solution((t - dt), V, mesh_z, mesh_x)) -u_np1 = fire.Function(V, name="pressure t +dt") -u = fire.TrialFunction(V) -v = fire.TestFunction(V) - -m1 = ( - (1 / (c * c)) - * ((u - 2.0 * u_n + u_nm1) / fire.Constant(dt**2)) - * v - * dx(scheme=quad_rule) -) -a = dot(grad(u_n), grad(v)) * dx(scheme=quad_rule) # explicit - -B = fire.Function(V) - -form = m1 + a -lhs = fire.lhs(form) -rhs = fire.rhs(form) - -A = fire.assemble(lhs, mat_type="matfree") -solver_parameters = { - "ksp_type": "preonly", - "pc_type": "jacobi", -} -solver = fire.LinearSolver( - A, solver_parameters=solver_parameters -) - -for step in range(nt): - q = q_xy * fire.Constant(2 * t) - m1 = ( - 1 - / (c * c) - * ((u - 2.0 * u_n + u_nm1) / fire.Constant(dt**2)) - * v - * dx(scheme=quad_rule) - ) - a = dot(grad(u_n), grad(v)) * dx(scheme=quad_rule) - le = q * v * dx(scheme=quad_rule) - - form = m1 + a - le - rhs = fire.rhs(form) - - B = fire.assemble(rhs, tensor=B) - - solver.solve(X, B) - - u_np1.assign(X) - - if (step - 1) % 100 == 0: - assert ( - fire.norm(u_n) < 1 - ), "Numerical instability. Try reducing dt or building the \ - mesh differently" - output.write(u_n, time=t, name="Pressure") - if t > 0: - print(f"Simulation time is: {t:{10}.{4}} seconds", flush=True) - - u_nm1.assign(u_n) - u_n.assign(u_np1) - - t = step * float(dt) - -last_analytical_sol = analytical_solution(t, V, mesh_z, mesh_x) -error = fire.errornorm(u_n, last_analytical_sol) -test = math.isclose(error, 0.0, abs_tol=1e-7) - -print(F"Test is {test}") diff --git a/temp_MMS.py b/temp_MMS.py deleted file mode 100644 index 241b78c3..00000000 --- a/temp_MMS.py +++ /dev/null @@ -1,28 +0,0 @@ -import math -from copy import deepcopy -from firedrake import * -import spyro - -from test.model import dictionary as model -model["acquisition"]["source_type"] = "MMS" -model["options"]["cell_type"] = "Q" -model["options"]["variant"] = "lumped" - - - -def run_solve(model): - testmodel = deepcopy(model) - - Wave_obj = spyro.AcousticWaveMMS(dictionary=testmodel) - Wave_obj.set_mesh(mesh_parameters={"dx": 0.02}) - Wave_obj.set_initial_velocity_model(expression="1 + sin(pi*-z)*sin(pi*x)") - Wave_obj.forward_solve() - - u_an = Wave_obj.analytical - u_num = Wave_obj.u_n - - return errornorm(u_num, u_an) - - -error = run_solve(model) -print(error) diff --git a/velocity_models/tutorial b/velocity_models/tutorial deleted file mode 100644 index 81a389f542af76ce23026353c707775482c0aace..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 518568 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