Beispiel #1
0
    def get_header(self):
        object = self.object

        transpiler = OpenCLConverter(known_types=self.known_types)

        headers = []
        helpers = []
        if hasattr(object.kernel, '_get_helpers_'):
            helpers.extend(object.kernel._get_helpers_())
        for equation in object.all_group.equations:
            if hasattr(equation, '_get_helpers_'):
                for helper in equation._get_helpers_():
                    if helper not in helpers:
                        helpers.append(helper)
        headers.extend(get_helper_code(helpers, transpiler))
        headers.append(transpiler.parse_instance(object.kernel))

        cls_name = object.kernel.__class__.__name__
        self.known_types['SPH_KERNEL'] = KnownType('__global %s*' % cls_name,
                                                   base_type=cls_name)
        headers.append(object.all_group.get_equation_wrappers(
            self.known_types))

        # This is to be done after the above as the equation names are assigned
        # only at this point.
        cpu_structs = self._cpu_structs
        h = CStructHelper(object.kernel)
        cpu_structs['kern'] = h.get_array()
        for eq in object.all_group.equations:
            self._equations[eq.var_name] = eq
            h.parse(eq)
            cpu_structs[eq.var_name] = h.get_array()

        return '\n'.join(headers)
Beispiel #2
0
def get_helper_code(helpers, transpiler=None):
    """This function generates any additional code for the given list of
    helpers.
    """
    result = []
    if transpiler is None:
        transpiler = OpenCLConverter()
    doc = '\n// Helpers.\n'
    result.append(doc)
    for helper in helpers:
        result.append(transpiler.parse_function(helper))
    return result
Beispiel #3
0
    def get_stepper_code(self):
        classes = {}
        for dest, stepper in self.object.steppers.items():
            cls = stepper.__class__.__name__
            classes[cls] = stepper

        known_types = dict(self.acceleration_eval_helper.known_types)
        code_gen = OpenCLConverter(known_types=known_types)

        wrappers = []
        for cls in sorted(classes.keys()):
            wrappers.append(code_gen.parse_instance(classes[cls]))
        return '\n'.join(wrappers)