import sys, os sys.path.insert(0, os.path.join(os.pardir, 'src')) from fe_approx1D_numint import approximate, u_glob from sympy import tanh, Symbol, lambdify x = Symbol('x') steepness = 20 arg = steepness * (x - 0.5) approximate(tanh(arg), symbolic=False, numint='GaussLegendre4', d=3, N_e=1, filename='fe_p3_tanh_1e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre4', d=3, N_e=2, filename='fe_p3_tanh_2e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre4', d=3, N_e=4, filename='fe_p3_tanh_4e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre5', d=4,
results = {} d_values = [1, 2, 3, 4] for case in cases: f = cases[case]['f'] f_func = lambdify([x], f, modules='numpy') Omega = cases[case]['Omega'] results[case] = {} for d in d_values: results[case][d] = {'E': [], 'h': [], 'r': []} for N_e in [4, 8, 16, 32, 64, 128]: try: c = approximate( f, symbolic=False, numint='GaussLegendre%d' % (d+1), d=d, N_e=N_e, Omega=Omega, filename='tmp_%s_d%d_e%d' % (case, d, N_e)) except np.linalg.linalg.LinAlgError as e: print str(e) continue vertices, cells, dof_map = mesh_uniform( N_e, d, Omega, symbolic=False) xc, u, _ = u_glob(c, vertices, cells, dof_map, 51) e = f_func(xc) - u # Trapezoidal integration of the L2 error over the # xc/u patches e2 = e**2 L2_error = 0 for i in range(len(xc)-1): L2_error += 0.5*(e2[i+1] + e2[i])*(xc[i+1] - xc[i])
import sys, os sys.path.insert(0, os.path.join(os.pardir, 'src')) from fe_approx1D_numint import approximate from sympy import tanh, Symbol x = Symbol('x') steepness = 20 arg = steepness * (x - 0.5) approximate(tanh(arg), symbolic=False, numint='GaussLegendre2', d=1, N_e=4, filename='fe_p1_tanh_4e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre2', d=1, N_e=8, filename='fe_p1_tanh_8e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre2', d=1, N_e=16, filename='fe_p1_tanh_16e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre3', d=2, N_e=2,
def approx(functionclass='intro'): """ Exemplify approximating various functions by various choices of finite element functions """ import os if functionclass == 'intro': # Note: no plot if symbol=True approximate(x * (1 - x), symbolic=False, d=1, N_e=2, filename='fe_p1_x2_2e') #approximate(x*(1-x), symbolic=True, numint='Trapezoidal', # d=1, N_e=2, filename='fe_p1_x2_2eT') approximate(x * (1 - x), symbolic=False, d=1, N_e=4, filename='fe_p1_x2_4e') approximate(x * (1 - x), symbolic=False, d=2, N_e=1, filename='fe_p2_x2_1e') #approximate(x*(1-x), symbolic=True, numint='Simpson', # d=2, N_e=4, filename='fe_p1_x2_2eS') approximate(x * (1 - x), symbolic=False, d=1, N_e=4, filename='fe_p1_x2_4e') # Only the extended fe_approx1D_numint can do P0 elements import fe_approx1D_numint fe_approx1D_numint.approximate(x * (1 - x), symbolic=False, d=0, N_e=4, filename='fe_p0_x2_4e') fe_approx1D_numint.approximate(x * (1 - x), symbolic=False, d=0, N_e=8, filename='fe_p0_x2_8e') for ext in 'pdf', 'png': cmd = 'doconce combine_images fe_p1_x2_2e.%(ext)s fe_p1_x2_4e.%(ext)s fe_p1_x2_2e_4e.%(ext)s' % vars( ) os.system(cmd) cmd = 'doconce combine_images fe_p0_x2_4e.%(ext)s fe_p0_x2_8e.%(ext)s fe_p1_x2_4e_8e.%(ext)s' % vars( ) os.system(cmd) elif functionclass == 'special': # Does not work well because Heaviside cannot be analytically # integrated (not important) and numpy cannot evaluate # Heaviside (serious for plotting) from sympy import Heaviside, Rational approximate(Heaviside(x - Rational(1, 2)), symbolic=False, d=1, N_e=2, filename='fe_p1_H_2e') approximate(Heaviside(x - Rational(1, 2)), symbolic=False, d=1, N_e=4, filename='fe_p1_H_4e') approximate(Heaviside(x - Rational(1, 2)), symbolic=False, d=1, N_e=8, filename='fe_p1_H_8e') elif functionclass == 'easy': approximate(1 - x, symbolic=False, d=1, N_e=4, filename='fe_p1_x_4e') approximate(x * (1 - x), symbolic=False, d=2, N_e=4, filename='fe_p2_x2_4e') approximate(x * (1 - x)**8, symbolic=False, d=1, N_e=4, filename='fe_p1_x9_4e') approximate(x * (1 - x)**8, symbolic=False, d=1, N_e=8, filename='fe_p1_x9_8e') approximate(x * (1 - x)**8, symbolic=False, d=2, N_e=2, filename='fe_p2_x9_2e') approximate(x * (1 - x)**8, symbolic=False, d=2, N_e=4, filename='fe_p2_x9_4e') for ext in 'pdf', 'png': cmd = 'doconce combine_images fe_p1_x9_4e.%(ext)s fe_p1_x9_8e.%(ext)s fe_p1_x9_4e_8e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p2_x9_2e.%(ext)s fe_p2_x9_4e.%(ext)s fe_p2_x9_2e_4e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p1_x9_4e.%(ext)s fe_p2_x9_2e.%(ext)s fe_p1_x9_8e.%(ext)s fe_p2_x9_4e.%(ext)s fe_p1_p2_x9_248e.%(ext)s' os.system(cmd) elif functionclass == 'hard': approximate(sin(pi * x), symbolic=False, d=1, N_e=4, filename='fe_p1_sin_4e') approximate(sin(pi * x), symbolic=False, d=1, N_e=8, filename='fe_p1_sin_8e') approximate(sin(pi * x), symbolic=False, d=2, N_e=2, filename='fe_p2_sin_2e') approximate(sin(pi * x), symbolic=False, d=2, N_e=4, filename='fe_p2_sin_4e') approximate(sin(pi * x)**2, symbolic=False, d=1, N_e=4, filename='fe_p1_sin2_4e') approximate(sin(pi * x)**2, symbolic=False, d=1, N_e=4, filename='fe_p1_sin2_8e') approximate(sin(pi * x)**2, symbolic=False, d=2, N_e=2, filename='fe_p2_sin2_2e') approximate(sin(pi * x)**2, symbolic=False, d=2, N_e=4, filename='fe_p2_sin2_4e') for ext in 'pdf', 'png': cmd = 'doconce combine_images fe_p1_sin_4e.%(ext)s fe_p1_sin_8e.%(ext)s fe_p1_sin_4e_8e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p2_sin_2e.%(ext)s fe_p2_sin_4e.%(ext)s fe_p2_sin_2e_4e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p1_sin2_4e.%(ext)s fe_p1_sin2_8e.%(ext)s fe_p1_sin2_4e_8e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p2_sin2_2e.%(ext)s fe_p2_sin2_4e.%(ext)s fe_p2_sin2_2e_4e.%(ext)s' os.system(cmd)
import sys, os sys.path.insert(0, os.path.join(os.pardir, 'src-approx')) from fe_approx1D_numint import approximate from sympy import tanh, Symbol x = Symbol('x') steepness = 20 arg = steepness*(x-0.5) approximate(tanh(arg), symbolic=False, numint='GaussLegendre2', d=1, N_e=4, filename='fe_p1_tanh_4e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre2', d=1, N_e=8, filename='fe_p1_tanh_8e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre2', d=1, N_e=16, filename='fe_p1_tanh_16e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre3', d=2, N_e=2, filename='fe_p2_tanh_2e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre3', d=2, N_e=4, filename='fe_p2_tanh_4e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre3', d=2, N_e=8, filename='fe_p2_tanh_8e')
results = {} d_values = [1, 2, 3, 4] for case in cases: f = cases[case]['f'] f_func = lambdify([x], f, modules='numpy') Omega = cases[case]['Omega'] results[case] = {} for d in d_values: results[case][d] = {'E': [], 'h': [], 'r': []} for N_e in [4, 8, 16, 32, 64, 128]: try: c = approximate( f, symbolic=False, numint='GaussLegendre%d' % (d+1), d=d, N_e=N_e, Omega=Omega, filename='tmp_%s_d%d_e%d' % (case, d, N_e)) except np.linalg.linalg.LinAlgError as e: print(str(e)) continue vertices, cells, dof_map = mesh_uniform( N_e, d, Omega, symbolic=False) xc, u, _ = u_glob(c, vertices, cells, dof_map, 51) e = f_func(xc) - u # Trapezoidal integration of the L2 error over the # xc/u patches e2 = e**2 L2_error = 0 for i in range(len(xc)-1): L2_error += 0.5*(e2[i+1] + e2[i])*(xc[i+1] - xc[i])
def approx(functionclass='intro'): """ Exemplify approximating various functions by various choices of finite element functions """ import os if functionclass == 'intro': # Note: no plot if symbol=True approximate(x*(1-x), symbolic=False, d=1, N_e=2, filename='fe_p1_x2_2e') #approximate(x*(1-x), symbolic=True, numint='Trapezoidal', # d=1, N_e=2, filename='fe_p1_x2_2eT') approximate(x*(1-x), symbolic=False, d=1, N_e=4, filename='fe_p1_x2_4e') approximate(x*(1-x), symbolic=False, d=2, N_e=1, filename='fe_p2_x2_1e') #approximate(x*(1-x), symbolic=True, numint='Simpson', # d=2, N_e=4, filename='fe_p1_x2_2eS') approximate(x*(1-x), symbolic=False, d=1, N_e=4, filename='fe_p1_x2_4e') # Only the extended fe_approx1D_numint can do P0 elements import fe_approx1D_numint fe_approx1D_numint.approximate(x*(1-x), symbolic=False, d=0, N_e=4, filename='fe_p0_x2_4e') fe_approx1D_numint.approximate(x*(1-x), symbolic=False, d=0, N_e=8, filename='fe_p0_x2_8e') for ext in 'pdf', 'png': cmd = 'doconce combine_images fe_p1_x2_2e.%(ext)s fe_p1_x2_4e.%(ext)s fe_p1_x2_2e_4e.%(ext)s' % vars() os.system(cmd) cmd = 'doconce combine_images fe_p0_x2_4e.%(ext)s fe_p0_x2_8e.%(ext)s fe_p1_x2_4e_8e.%(ext)s' % vars() os.system(cmd) elif functionclass == 'special': # Does not work well because Heaviside cannot be analytically # integrated (not important) and numpy cannot evaluate # Heaviside (serious for plotting) from sympy import Heaviside, Rational approximate(Heaviside(x - Rational(1,2)), symbolic=False, d=1, N_e=2, filename='fe_p1_H_2e') approximate(Heaviside(x - Rational(1,2)), symbolic=False, d=1, N_e=4, filename='fe_p1_H_4e') approximate(Heaviside(x - Rational(1,2)), symbolic=False, d=1, N_e=8, filename='fe_p1_H_8e') elif functionclass == 'easy': approximate(1-x, symbolic=False, d=1, N_e=4, filename='fe_p1_x_4e') approximate(x*(1-x), symbolic=False, d=2, N_e=4, filename='fe_p2_x2_4e') approximate(x*(1-x)**8, symbolic=False, d=1, N_e=4, filename='fe_p1_x9_4e') approximate(x*(1-x)**8, symbolic=False, d=1, N_e=8, filename='fe_p1_x9_8e') approximate(x*(1-x)**8, symbolic=False, d=2, N_e=2, filename='fe_p2_x9_2e') approximate(x*(1-x)**8, symbolic=False, d=2, N_e=4, filename='fe_p2_x9_4e') for ext in 'pdf', 'png': cmd = 'doconce combine_images fe_p1_x9_4e.%(ext)s fe_p1_x9_8e.%(ext)s fe_p1_x9_4e_8e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p2_x9_2e.%(ext)s fe_p2_x9_4e.%(ext)s fe_p2_x9_2e_4e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p1_x9_4e.%(ext)s fe_p2_x9_2e.%(ext)s fe_p1_x9_8e.%(ext)s fe_p2_x9_4e.%(ext)s fe_p1_p2_x9_248e.%(ext)s' os.system(cmd) elif functionclass == 'hard': approximate(sin(pi*x), symbolic=False, d=1, N_e=4, filename='fe_p1_sin_4e') approximate(sin(pi*x), symbolic=False, d=1, N_e=8, filename='fe_p1_sin_8e') approximate(sin(pi*x), symbolic=False, d=2, N_e=2, filename='fe_p2_sin_2e') approximate(sin(pi*x), symbolic=False, d=2, N_e=4, filename='fe_p2_sin_4e') approximate(sin(pi*x)**2, symbolic=False, d=1, N_e=4, filename='fe_p1_sin2_4e') approximate(sin(pi*x)**2, symbolic=False, d=1, N_e=4, filename='fe_p1_sin2_8e') approximate(sin(pi*x)**2, symbolic=False, d=2, N_e=2, filename='fe_p2_sin2_2e') approximate(sin(pi*x)**2, symbolic=False, d=2, N_e=4, filename='fe_p2_sin2_4e') for ext in 'pdf', 'png': cmd = 'doconce combine_images fe_p1_sin_4e.%(ext)s fe_p1_sin_8e.%(ext)s fe_p1_sin_4e_8e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p2_sin_2e.%(ext)s fe_p2_sin_4e.%(ext)s fe_p2_sin_2e_4e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p1_sin2_4e.%(ext)s fe_p1_sin2_8e.%(ext)s fe_p1_sin2_4e_8e.%(ext)s' os.system(cmd) cmd = 'doconce combine_images fe_p2_sin2_2e.%(ext)s fe_p2_sin2_4e.%(ext)s fe_p2_sin2_2e_4e.%(ext)s' os.system(cmd)
import sys, os sys.path.insert(0, os.path.join(os.pardir, 'src-approx')) from fe_approx1D_numint import approximate, u_glob from sympy import tanh, Symbol, lambdify x = Symbol('x') steepness = 20 arg = steepness*(x-0.5) approximate(tanh(arg), symbolic=False, numint='GaussLegendre4', d=3, N_e=1, filename='fe_p3_tanh_1e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre4', d=3, N_e=2, filename='fe_p3_tanh_2e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre4', d=3, N_e=4, filename='fe_p3_tanh_4e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre5', d=4, N_e=1, filename='fe_p4_tanh_1e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre5', d=4, N_e=2, filename='fe_p4_tanh_2e') approximate(tanh(arg), symbolic=False, numint='GaussLegendre5', d=4, N_e=4, filename='fe_p4_tanh_4e') # Interpolation method import numpy as np import matplotlib.pyplot as plt f = lambdify([x], tanh(arg), modules='numpy') # Compute exact f on a fine mesh x_fine = np.linspace(0, 1, 101) f_fine = f(x_fine)