def assemble_blockwise_matrix_BDF1(dt, ux_n1, uy_n1): S11 = assemble.u_gradv_w_p1(topo_u, x_u, y_u, ux_n1, uy_n1) D11 = M + dt*K + dt*S11 D22 = M + dt*K + dt*S11 S12 = sparse.csc_matrix((ndofs_u, ndofs_u)) S21 = sparse.csc_matrix((ndofs_u, ndofs_u)) (D11, D22) = apply_mat_bc(D11, D22) #### assembly of Navier-Stokes system mat = sparse.vstack([ sparse.hstack([D11, S12, -dt*BT1, sparse.csc_matrix((ndofs_u, 1))]), sparse.hstack([S21, D22, -dt*BT2, sparse.csc_matrix((ndofs_u, 1))]), sparse.hstack([-B, sparse.csc_matrix((ndofs_p,ndofs_p)), mean_p.transpose()]), sparse.hstack([sparse.csc_matrix((1, 2*ndofs_u)), mean_p, sparse.csc_matrix((1,1))]) ], "csc") return mat
def assemble_blockwise_matrix_BDF2(): S11 = assemble.u_gradv_w_p1(topo_u, x_u, y_u, ux_n1, uy_n1) D11 = 1.5 * ph.rho_fluid / ph.dt * M11 + ph.nu * A11 + ph.rho_fluid * S11 D22 = 1.5 * ph.rho_fluid / ph.dt * M11 + ph.nu * A11 + ph.rho_fluid * S11 S12 = sparse.csr_matrix((ndofs_u, ndofs_u)) S21 = sparse.csr_matrix((ndofs_u, ndofs_u)) (D11, D22) = apply_bc_mat(D11, D22) #### assembly of Navier-Stokes system mat = sparse.vstack( [ sparse.hstack([D11, S12, -BT1 ]), #, sparse.csr_matrix((ndofs_u, 1))]), sparse.hstack([S21, D22, -BT2 ]), #, sparse.csr_matrix((ndofs_u, 1))]), sparse.hstack([-B, sparse.csr_matrix( (ndofs_p, ndofs_p))]) #, mean_p.transpose()]), # sparse.hstack([sparse.csr_matrix((1, 2*ndofs_u)), mean_p, sparse.csr_matrix((1,1))]) ], "csr") return mat
max_iter = 10 residuals = np.zeros((len(ph.stampa), max_iter)) #### start time steppig procedure for cn_time in range(0, len(ph.stampa)): step_t0 = time.time() t_sol = 0 u_n1 = u_n ux_n1 = ux_n uy_n1 = uy_n p_n1 = p_n if ph.time_integration == 'BDF1': force = assemble_blockwise_force_BDF1() mat = assemble_blockwise_matrix_BDF1() elif ph.time_integration == 'Theta' or cn_time == 0: S11 = assemble.u_gradv_w_p1(topo_u, x_u, y_u, ux_n1, uy_n1) force = assemble_blockwise_force_Theta(S11) mat = assemble_blockwise_matrix_Theta(S11) else: force = assemble_blockwise_force_BDF2() mat = assemble_blockwise_matrix_BDF2() for k in range(max_iter): sol = sp_la.spsolve(mat, force) u_n1 = np.reshape(sol[0:2 * ndofs_u], u_n.shape) p_n1 = np.reshape(sol[2 * ndofs_u:2 * ndofs_u + ndofs_p], (ndofs_p, 1)) ux_n1 = np.reshape(u_n1[0:ndofs_u], ux_n.shape) uy_n1 = np.reshape(u_n1[ndofs_u:2 * ndofs_u], uy_n.shape) if ph.time_integration == 'BDF1':
sy_asmbl = 2*sy_n - sy_n_old elif ph.time_integration == 'CN': ux_asmbl = 1.5*ux_n - 0.5*ux_n_old uy_asmbl = 1.5*uy_n - 0.5*uy_n_old sx_asmbl = 1.5*sx_n - 0.5*sx_n_old sy_asmbl = 1.5*sy_n - 0.5*sy_n_old else: ux_asmbl = ux_n uy_asmbl = uy_n sx_asmbl = sx_n sy_asmbl = sy_n (G, GT, GT11, GT22) = assemble_kinematic_coupling(sx_asmbl, sy_asmbl) (H, HT, HT11, HT22) = assemble_kinematic_coupling(sx_n, sy_n) if(ph.fluid_behavior == "Navier-Stokes"): S11 = ph.rho_fluid*assemble.u_gradv_w_p1(topo_u, x_u, y_u, ux_asmbl, uy_asmbl) T11 = ph.rho_fluid*assemble.u_gradv_w_p1(topo_u, x_u, y_u, ux_n, uy_n) else: S11 = sparse.csc_matrix((ndofs_u, ndofs_u)) T11 = S11 ###Assemble linear system and solve if ph.time_integration == 'BDF1': mat = assemble_blockwise_matrix_BDF1(S11) force = assemble_blockwise_force_BDF1(ux_n, uy_n, dx_n, dy_n) elif ph.time_integration == 'CN': mat = assemble_blockwise_matrix_CN(S11) force = assemble_blockwise_force_CN(ux_n, uy_n, u_n, p_n, dx_n, dy_n, l_n) elif ph.time_integration == 'TR': mat = assemble_blockwise_matrix_TR(S11) force = assemble_blockwise_force_TR(ux_n, uy_n, u_n, p_n, dx_n, dy_n, l_n)