1from __future__ import absolute_import, division, print_function, unicode_literals
2__metaclass__ = type
3
4import hashlib
5
6from dune.generator.generator import SimpleGenerator
7
8generator = SimpleGenerator("SpaceAdaptation", "Dune::FemPy")
9
10modules = {}
11
12def module(space):
13    storage, dfIncludes, dfTypeName, _, _, _ = space.storage
14    try:
15        return modules[dfTypeName]
16    except KeyError:
17        pass
18
19    typeName = "Dune::FemPy::SpaceAdaptation< " + dfTypeName + " >"
20    includes = dfIncludes + ["dune/fempy/py/spaceadapt.hh"]
21    moduleName = "spaceadapt_" + hashlib.md5(typeName.encode('utf8')).hexdigest()
22
23    module = generator.load(includes, typeName, moduleName)
24    modules[dfTypeName] = module
25    return module
26
27
28def spaceAdapt(space, marker, dfList):
29    dfs = {}
30    for df in dfList:
31        try:
32            for dfc in df.components:
33                try:
34                    dfs[dfc.space] += [dfc]
35                except KeyError:
36                    dfs[dfc.space] = [dfc]
37        except AttributeError:
38            try:
39                dfs[df.space] += [df]
40            except KeyError:
41                dfs[df.space] = [df]
42    for s,df in dfs.items(): # if we really have different spaces then there is still the problem that the marker doesn't know which space we are on
43        module(s).SpaceAdaptation(s).adapt(marker, df)
44