def P1_solution(): plt.figure() from fe1D import mesh_uniform, u_glob N_e_values = [2, 4, 8] d = 1 legends = [] for N_e in N_e_values: vertices, cells, dof_map = mesh_uniform(N_e=N_e, d=d, Omega=[0, 2], symbolic=False) h = vertices[1] - vertices[0] Ae = 1. / h * np.array([[1, -1], [-1, 1]]) N = N_e + 1 A = np.zeros((N, N)) b = np.zeros(N) for e in range(N_e): if vertices[e] >= 1: be = -h / 2. * np.array([1, 1]) else: be = h / 2. * np.array([0, 0]) for r in range(d + 1): for s in range(d + 1): A[dof_map[e][r], dof_map[e][s]] += Ae[r, s] b[dof_map[e][r]] += be[r] # Enforce boundary conditions A[0, :] = 0 A[0, 0] = 1 b[0] = 0 A[-1, :] = 0 A[-1, -1] = 1 b[-1] = 0 c = np.linalg.solve(A, b) # Plot solution print(('c:', c)) print(('vertices:', vertices)) print(('cells:', cells)) print(('len(cells):', len(cells))) print(('dof_map:', dof_map)) xc, u, nodes = u_glob(c, vertices, cells, dof_map) plt.plot(xc, u) legends.append('$N_e=%d$' % N_e) plt.plot(xc, exact_solution(xc), '--') legends.append('exact') plt.legend(legends, loc='lower left') plt.savefig('tmp3.png') plt.savefig('tmp3.pdf')
def P1_solution(): plt.figure() from fe1D import mesh_uniform, u_glob N_e_values = [2, 4, 8] d = 1 legends = [] for N_e in N_e_values: vertices, cells, dof_map = mesh_uniform( N_e=N_e, d=d, Omega=[0,2], symbolic=False) h = vertices[1] - vertices[0] Ae = 1./h*np.array( [[1, -1], [-1, 1]]) N = N_e + 1 A = np.zeros((N, N)) b = np.zeros(N) for e in range(N_e): if vertices[e] >= 1: be = -h/2.*np.array( [1, 1]) else: be = h/2.*np.array( [0, 0]) for r in range(d+1): for s in range(d+1): A[dof_map[e][r], dof_map[e][s]] += Ae[r,s] b[dof_map[e][r]] += be[r] # Enforce boundary conditions A[0,:] = 0; A[0,0] = 1; b[0] = 0 A[-1,:] = 0; A[-1,-1] = 1; b[-1] = 0 c = np.linalg.solve(A, b) # Plot solution xc, u, nodes = u_glob(c, vertices, cells, dof_map) plt.plot(xc, u) legends.append('$N_e=%d$' % N_e) plt.plot(xc, exact_solution(xc), '--') legends.append('exact') plt.legend(legends, loc='lower left') plt.savefig('tmp3.png'); plt.savefig('tmp3.pdf')
c, A, b, timing = finite_element1D( vertices, cells, dof_map, essbc, ilhs=lambda e, phi, r, s, X, x, h: phi[1][r](X, h)*phi[1][s](X, h), irhs=lambda e, phi, r, X, x, h: x**m*phi[0][r](X), blhs=lambda e, phi, r, s, X, x, h: 0, brhs=lambda e, phi, r, X, x, h: -C*phi[0][r](-1) if e == 0 else 0, intrule='GaussLegendre') # Visualize # (Recall that x is a symbol, use xc for coordinates) xc, u, nodes = u_glob(c, vertices, cells, dof_map) u_e = u_exact(xc) print('Max diff at nodes, d=%d:' % d, \ np.abs(u_exact(nodes) - c).max()) plt.figure() plt.plot(xc, u, 'b-', xc, u_e, 'r--') plt.legend(['finite elements, d=%d' %d, 'exact'], loc='lower left') figname = 'tmp_%d_%d' % (m, d) plt.savefig(figname + '.png'); plt.savefig(figname + '.pdf') for ext in 'pdf', 'png': cmd = 'doconce combine_images -2 ' cmd += ' '.join(['tmp_%d_%d.' % (m, d) + ext for d in d_values]) cmd += ' u_xx_xm%d_P1to4.' % m + ext print(cmd)
vertices[1] = 3 essbc = {} essbc[dof_map[-1][-1]] = D c, A, b, timing = finite_element1D_naive( vertices, cells, dof_map, essbc, ilhs=lambda e, phi, r, s, X, x, h: phi[1][r](X, h)*phi[1][s](X, h), irhs=lambda e, phi, r, X, x, h: x**m*phi[0][r](X), blhs=lambda e, phi, r, s, X, x, h: 0, brhs=lambda e, phi, r, X, x, h: -C*phi[0][r](-1) if e == 0 else 0, intrule='GaussLegendre', verbose=False, ) # Visualize from fe1D import u_glob x, u, nodes = u_glob(c, cells, vertices, dof_map) u_e = u_exact(x, C, D, L) print u_exact(nodes, C, D, L) - c # difference at the nodes import matplotlib.pyplot as plt plt.plot(x, u, 'b-', x, u_e, 'r--') plt.legend(['finite elements, d=%d' %d, 'exact'], loc='upper left') plt.savefig('tmp.png'); plt.savefig('tmp.pdf') plt.show()