Пример #1
0
phi_1 = lambda x, y: y - 0.2 * (x - 0.5) - 0.475
phi_2 = lambda x, y: phi_1(x, y) - 0.05
omega_1, omega_2, omega_3 = [], [], []
volumes = mesh_gen.mb.get_entities_by_dimension(0, 3)
centroids = mesh_gen.mb.tag_get_data(mesh_gen.centroid_tag, volumes)
for vol, c in zip(volumes, centroids):
    if phi_1(c[0], c[1]) < 0:
        omega_1.append(vol)
    elif phi_1(c[0], c[1]) > 0 and phi_2(c[0], c[1]) < 0:
        omega_2.append(vol)
    elif phi_1(c[0], c[1]) > 0:
        omega_3.append(vol)
mesh_gen.set_homogeneous_permeability(K1, vols=omega_2)
mesh_gen.set_homogeneous_permeability(K2, vols=(omega_1 + omega_3))

mesh_gen.set_source_term(q_func)

dirichlet_faces = []
neumann_faces = []
all_faces = mesh_gen.mb.get_entities_by_dimension(0, 2)
for face in all_faces:
    adj_vols = mesh_gen.mtu.get_bridge_adjacencies(face, 2, 3)
    I, J, K = mesh_gen.mtu.get_bridge_adjacencies(face, 2, 0)
    JI = mesh_gen.mb.get_coords([I]) - mesh_gen.mb.get_coords([J])
    JK = mesh_gen.mb.get_coords([K]) - mesh_gen.mb.get_coords([J])
    normal_area_vec = np.cross(JI, JK)
    if len(adj_vols) < 2:
        if np.dot(normal_area_vec, np.array([0.0, 0.0, 1.0])) != 0.0:
            neumann_faces.append(face)
        else:
            dirichlet_faces.append(face)
Пример #2
0
K_sym = Matrix(
    ([C.y**2 + C.z**2 + 1, -C.x * C.y,
      -C.x * C.z], [-C.x * C.y, C.x**2 + C.z**2 + 1,
                    -C.y * C.z], [-C.x * C.z, -C.y * C.z,
                                  C.x**2 + C.y**2 + 1]))
K_func = lambda x, y, z: np.array([y**2 + z**2 + 1, -x*y, -x*z, \
                                -x*y, x**2 + z**2 + 1, -y*z, \
                                -x*z, -y*z, x**2 + y**2 + 1])

print("Generating mesh...")
mesh_gen = MeshGenerator('61052_vols.h5m')
vertices = mesh_gen.mb.get_entities_by_dimension(0, 0)
mesh_gen.mtu.construct_aentities(vertices)
mesh_gen.set_centroids()
mesh_gen.set_heterogeneous_permeability(K_func)

grad_u_matrix = Matrix(
    [grad_u.coeff(C.i),
     grad_u.coeff(C.j),
     grad_u.coeff(C.k)])
F = K_sym * grad_u_matrix
div_F = F.diff(C.x)[0] + F.diff(C.y)[1] + F.diff(C.z)[2]
div_F_func = lambdify([C.x, C.y, C.z], div_F)
mesh_gen.set_source_term(div_F_func)

mesh_gen.set_dirichlet_boundary_conditions(u_func)

print("Done")

mesh_gen.mb.write_file('test_case_2_eymard.h5m')
        omega_2.append(vol)
    elif phi_1(c[0], c[1]) > 0:
        omega_3.append(vol)
mesh_gen.set_homogeneous_permeability(K1.reshape(9), vols=omega_2)
mesh_gen.set_homogeneous_permeability(K2.reshape(9), vols=omega_1)
mesh_gen.set_homogeneous_permeability(K2.reshape(9), vols=omega_3)

grad_u_matrix = Matrix(
    [grad_u.coeff(C.i),
     grad_u.coeff(C.j),
     grad_u.coeff(C.k)])

F1 = Matrix(K1) * grad_u_matrix
div_F1 = F1.diff(C.x)[0] + F1.diff(C.y)[1] + F1.diff(C.z)[2]
div_F1_func = lambdify([C.x, C.y, C.z], div_F1)
mesh_gen.set_source_term(div_F1_func, vols=omega_2)

F2 = Matrix(K2) * grad_u_matrix
div_F2 = F2.diff(C.x)[0] + F2.diff(C.y)[1] + F2.diff(C.z)[2]
div_F2_func = lambdify([C.x, C.y, C.z], div_F2)
mesh_gen.set_source_term(div_F2_func, vols=(omega_1 + omega_3))

dirichlet_faces = []
neumann_faces = []
all_faces = mesh_gen.mb.get_entities_by_dimension(0, 2)
for face in all_faces:
    adj_vols = mesh_gen.mtu.get_bridge_adjacencies(face, 2, 3)
    I, J, K = mesh_gen.mtu.get_bridge_adjacencies(face, 2, 0)
    JI = mesh_gen.mb.get_coords([I]) - mesh_gen.mb.get_coords([J])
    JK = mesh_gen.mb.get_coords([K]) - mesh_gen.mb.get_coords([J])
    normal_area_vec = np.cross(JI, JK)