Пример #1
0
def elasticity_calculate_errors(ref_level=9,  levels=(1, 3, 5, 7), steps=10):
    ref_disc = ElasticityExample(ref_level)

    log = logging.getLogger()
    errors = {}
    min_lambda, max_lambda = 1., 10.
    lambdas = np.linspace(min_lambda, max_lambda, steps)
    for lmbda in lambdas:
        param = {"lambda": [lmbda], "mu": [1.]}
        try:
            ref_sol = ref_disc.solve(param)
        except RuntimeError as e:
            log.error('fine solve failed lvl {} -- lambda {}'.format(ref_level, lmbda))
            for coarse_level in levels:
                if not errors.has_key(coarse_level):
                    errors[coarse_level] = []
                errors[coarse_level].append(np.nan)
            continue
        for coarse_level in levels:
            if not errors.has_key(coarse_level):
                errors[coarse_level] = []
            coarse_disc = ElasticityExample(coarse_level)
            try:
                coarse_sol = coarse_disc.solve(param)
            except RuntimeError as e:
                log.error('coarse solve failed lvl {} -- lambda {}'.format(coarse_level, lmbda))
                errors[coarse_level].append(np.nan)
                continue
            coarse_disc.visualize([coarse_sol], ['coarse_lvl_{}_lambda_{}.vtk'.format(coarse_level, lmbda)])
            prolonged = coarse_disc.transfer_to(ref_level - coarse_level, coarse_sol)
            prolonged -= ref_sol
            errors[coarse_level].append(coarse_disc.h1_0_semi_norm(prolonged)/coarse_disc.h1_0_semi_norm(ref_sol))
    for coarse_level in errors.keys():
        plt.plot(lambdas, errors[coarse_level], MARKERS[coarse_level])

    open('elas__{}__ref-{}_lambda-min_{}-max_{}_-_steps_{}.dump'.format(levels, ref_level, min_lambda, max_lambda, steps), 'wb').write(dumps((errors, lambdas)))

    elasticity_error_curves(errors, lambdas)
Пример #2
0
from pymor.discretizations.basic import StationaryDiscretization
from pymor.tools.timing import Timer

from pydealii_bindings import ElasticityExample
from pydealii.pymor.operator import DealIIMatrixOperator
from pydealii.pymor.vectorarray import DealIIVector


class PyVis(object):
    def __init__(self, cpp_disc):
        self._cpp_disc = cpp_disc

    def visualize(self, U, _, filename):
        self._cpp_disc.visualize(U._list[0].impl, filename)

cpp_disc = ElasticityExample(refine_steps=7)

param = {"lambda": [1.], "mu": [1.]}
# u = cpp_disc.solve(param)
parameter_type = Parameter(param).parameter_type
# cpp_disc.visualize(u, "highdim_solution_cpp.vtk")

lambda_fn, mu_fn = [GenericParameterFunctional(lambda mu: mu[n], Parameter({n: [1.]}).parameter_type) for n in ['lambda', 'mu']]
LOW, HIGH = 1, 10
ops = [DealIIMatrixOperator(getattr(cpp_disc, name)()) for name in ['lambda_mat', 'mu_mat']]
op = LincombOperator(ops, (lambda_fn, mu_fn))
rhs = VectorFunctional(ListVectorArray([DealIIVector(cpp_disc.rhs())]))
viz = PyVis(cpp_disc)
h1_op = DealIIMatrixOperator(cpp_disc.h1_mat(), "h1_0_semi")
energy_op = DealIIMatrixOperator(cpp_disc.mu_mat(), "energy")
py_disc = StationaryDiscretization(op, rhs, products={"energy": energy_op},