Beispiel #1
0
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,
Beispiel #2
0
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])
Beispiel #3
0
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,
Beispiel #4
0
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)
Beispiel #5
0
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])
Beispiel #7
0
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)
Beispiel #8
0
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)