Source code for cudapyint.CulsodaCodeGenerator

import cudapyint.CodeGenerator as generator
import os

[docs]class CulsodaCodeGenerator(generator.CodeGenerator): """ Extends the cudapyint.CodeGenerator in order to generate Culsoda specific code. """
[docs] def __init__(self, cudaCodePath, constants, culsoda_file_name, culsoda_main_file_name, args_tex_name): """ Constructor for the ode solver. Parameters ---------- cudaCodePath : string Path to the cuda kernel. constants : dict Dictionary containing constants value used for the integration. Supported values are: int, float, numpy.float32, numpy.float64, numpy.array culsoda_file_name : string name of the culsoda source file culsoda_main_file_name : string name of the culsoda main source file args_tex_name : string name of the arguments texture """ super(CulsodaCodeGenerator, self).__init__(cudaCodePath, constants) self.culsoda_file_name = culsoda_file_name self.culsoda_main_file_name = culsoda_main_file_name self.args_tex_name = args_tex_name
[docs] def generate(self, neq=1, blocks=1, threads=1, write_code=False): """ Generates the complete culsoda code Parameters blocks : int (optional) The number of blocks threads : int (optional) The number of threads / block write_code : bool (optional) True if the generated code should be written to the disc :returns: The generated code """ fc = open( os.path.join(os.path.split(os.path.realpath(__file__))[0],self.culsoda_file_name),'r') coulsoda_source = fc.read() fc = open( os.path.join(os.path.split(os.path.realpath(__file__))[0],self.culsoda_main_file_name),'r') culsoda_main_source = fc.read() isize_def = ""#define ISIZE " + repr( 20 + self._neq ) + "\n" rsize_def = ""#define RSIZE " + repr( 22 + self._neq * max(16, self._neq + 9) ) + "\n\n" block_size_def = "#define BLOCK_SIZE " + repr(threads) + "\n" neq_def = "#define NEQ " + repr(neq) + "\n" definitions = isize_def + rsize_def + block_size_def + neq_def + "\n" args_array_def = "texture<float, 2, cudaReadModeElementType> "+ self.args_tex_name +";\n\n" constants_def= self._create_constants_fields() common_block_def = "__device__ struct cuLsodaCommonBlock common[" + repr(blocks*threads) + "];\n" code_def = definitions + args_array_def + constants_def + self.cudaCode + coulsoda_source + common_block_def + culsoda_main_source if (write_code): self._writeCode(code_def) return code_def