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