Beispiel #1
0
    def __init__(self,
                 fields,
                 str_f,
                 pt0,
                 pt1,
                 tfunc,
                 spatial_value=1.,
                 is_overwrite=False):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_value('str_f', str_f,
                           ('ex', 'ey', 'ez', 'hx', 'hy', 'hz'))
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('tfunc', tfunc, types.FunctionType)
        common.check_type('spatial_value', spatial_value, \
                (np.ndarray, np.number, types.FloatType, types.IntType) )
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list(common.convert_indices(fields.ns, pt0))
        pt1 = list(common.convert_indices(fields.ns, pt1))

        # local variables
        e_or_h = str_f[0]
        dtype = fields.dtype
        is_array = True if isinstance(spatial_value, np.ndarray) else False

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        if is_array:
            shape = common.shape_two_points(pt0, pt1)
            assert shape == spatial_value.shape, \
                    'shape mismatch : %s, %s' % (shape, spatial_value.shape)
            assert dtype == spatial_value.dtype, \
                    'dtype mismatch : %s, %s' % (dtype, spatial_value.dtype)
        else:
            spatial_value = dtype(spatial_value)

        # create the SetFields instance
        setf = SetFields(fields, str_f, pt0, pt1, is_array, is_overwrite)

        # global variables
        self.mainf = fields
        self.tfunc = tfunc
        self.setf = setf
        self.spatial_value = spatial_value

        self.e_or_h = e_or_h
        self.tstep = 1

        # append to the update list
        self.priority_type = 'incident'
        fields.append_instance(self)
    def __init__(self, fields, str_f, pt0, pt1):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))

        pt0 = list(common.convert_indices(fields.ns, pt0))
        pt1 = list(common.convert_indices(fields.ns, pt1))

        # local variables
        str_fs = common.convert_to_tuple(str_f)
        dtype_str_list = fields.dtype_str_list

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        # program
        macros = ['NMAX', 'XID', 'YID', 'ZID', \
                'ARGS', \
                'TARGET', 'SOURCE', 'OVERWRITE', \
                'DTYPE']

        values = common_gpu.macro_replace_list(pt0, pt1) + \
                ['DTYPE *source', \
                'target[sub_idx]', 'source[idx]', '='] + \
                dtype_str_list

        ksrc = common.replace_template_code( \
                open(common_gpu.src_path + 'copy.cu').read(), macros, values)
        program = SourceModule(ksrc)
        kernel_copy = program.get_function('copy')

        # allocation
        source_bufs = [fields.get_buf(str_f) for str_f in str_fs]
        shape = common.shape_two_points(pt0, pt1, len(str_fs))

        host_array = np.zeros(shape, fields.dtype)
        split_host_array = np.split(host_array, len(str_fs))
        split_host_array_dict = dict(zip(str_fs, split_host_array))
        target_buf = cuda.to_device(host_array)

        # global variables
        self.mainf = fields
        self.kernel_copy = kernel_copy
        self.source_bufs = source_bufs
        self.target_buf = target_buf
        self.host_array = host_array
        self.split_host_array_dict = split_host_array_dict
    def __init__(self, fields, str_f, pt0, pt1):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        str_fs = common.convert_to_tuple(str_f)
        dtype_str_list = fields.dtype_str_list

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        # program
        macros = ['NMAX', 'XID', 'YID', 'ZID', \
                'ARGS', \
                'TARGET', 'SOURCE', 'OVERWRITE', \
                'DTYPE']

        values = common_gpu.macro_replace_list(pt0, pt1) + \
                ['DTYPE *source', \
                'target[sub_idx]', 'source[idx]', '='] + \
                dtype_str_list

        ksrc = common.replace_template_code( \
                open(common_gpu.src_path + 'copy.cu').read(), macros, values)
        program = SourceModule(ksrc)
        kernel_copy = program.get_function('copy')

        # allocation
        source_bufs = [fields.get_buf(str_f) for str_f in str_fs]
        shape = common.shape_two_points(pt0, pt1, len(str_fs))

        host_array = np.zeros(shape, fields.dtype)
        split_host_array = np.split(host_array, len(str_fs))
        split_host_array_dict = dict( zip(str_fs, split_host_array) ) 
        target_buf = cuda.to_device(host_array)

        # global variables
        self.mainf = fields
        self.kernel_copy = kernel_copy
        self.source_bufs = source_bufs
        self.target_buf = target_buf
        self.host_array = host_array
        self.split_host_array_dict = split_host_array_dict
Beispiel #4
0
    def set_savefields(self, str_f, pt0, pt1, tstep_range, dir_path, tag=0):
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('tstep_range', tstep_range, (list, tuple), int)
        common.check_type('dir_path', dir_path, str)
        common.check_type('tag', tag, int)

        pt0 = common.convert_indices(self.ns, pt0)
        pt1 = common.convert_indices(self.ns, pt1)
        t0 = common.convert_index(self.max_tstep, tstep_range[0])
        t1 = common.convert_index(self.max_tstep, tstep_range[1]) + 1
        tgap = tstep_range[2]
        tmax = self.max_tstep

        tag = tag if tag not in self.savef_tag_list else max(self.savef_tag_list)+1
        self.savef_tag_list.append(tag)

        if is_mpi:
            overlap = common.overlap_two_regions(self.node_pt0, self.node_pt1, pt0, pt1)
            if overlap != None:
                sx0, sy0, sz0 = self.node_pt0
                ox0, oy0, oz0 = overlap[0]
                ox1, oy1, oz1 = overlap[1]

                local_pt0 = (ox0-sx0, oy0-sy0, oz0-sz0)
                local_pt1 = (ox1-sx0, oy1-sy0, oz1-sz0)

                savef = node.SaveFields(self.nodef, str_f, local_pt0, local_pt1, dir_path, tag, tmax, True, rank)
                self.savef_list.append(savef)
        else:
            savef = node.SaveFields(self.nodef, str_f, pt0, pt1, dir_path, tag, tmax)
            self.savef_list.append(savef)

        # save the subdomain informations as pickle
        if self.is_master:
            if is_mpi:
                divide_info_dict = common_mpi.divide_info_dict(size, self.mpi_shape, pt0, pt1, self.asn_dict)
            else:
                divide_info_dict = { \
                        'shape': common.shape_two_points(pt0, pt1), \
                        'pt0': pt0, \
                        'pt1': pt1, \
                        'anx_list': self.nodef.accum_nx_list }

            divide_info_dict['str_fs'] = common.convert_to_tuple(str_f)
            divide_info_dict['tmax'] = tmax
            divide_info_dict['tgap'] = tgap
            pkl_file = open(dir_path + 'divide_info.pkl', 'wb')
            pickle.dump(divide_info_dict, pkl_file)
            pkl_file.close()

        self.t0 = t0
        self.t1 = t1
        self.tgap = tgap
Beispiel #5
0
    def set_incident_direct(self,
                            str_f,
                            pt0,
                            pt1,
                            tfunc,
                            spatial_value=1.,
                            is_overwrite=False):
        common.check_value('str_f', str_f,
                           ('ex', 'ey', 'ez', 'hx', 'hy', 'hz'))
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('tfunc', tfunc, types.FunctionType)
        common.check_type('spatial_value', spatial_value, \
                (np.ndarray, np.number, types.FloatType, types.IntType) )
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list(common.convert_indices(self.ns, pt0))
        pt1 = list(common.convert_indices(self.ns, pt1))

        if is_mpi:
            node_pt0 = list(self.node_pt0)
            node_pt1 = list(self.node_pt1)

            for i, axis in enumerate(['x', 'y', 'z']):
                if self.nodef.buffer_dict.has_key('%s+' % axis):
                    node_pt1[i] += 1
                if self.nodef.buffer_dict.has_key('%s-' % axis):
                    node_pt0[i] -= 1

                if coord[i] == 0 and pt0[i] == 0:
                    pt0[i] -= 1
                if coord[i] == self.mpi_shape[i] - 1 and pt1[
                        i] == self.ns[i] - 1:
                    pt1[i] += 1

            overlap = common.overlap_two_regions(node_pt0, node_pt1, pt0, pt1)
            if overlap != None:
                sx0, sy0, sz0 = self.node_pt0
                ox0, oy0, oz0 = overlap[0]
                ox1, oy1, oz1 = overlap[1]

                local_pt0 = (ox0 - sx0, oy0 - sy0, oz0 - sz0)
                local_pt1 = (ox1 - sx0, oy1 - sy0, oz1 - sz0)

                node.IncidentDirect(self.nodef, str_f, local_pt0, local_pt1,
                                    tfunc, spatial_value, is_overwrite)

        else:
            node.IncidentDirect(self.nodef, str_f, pt0, pt1, tfunc,
                                spatial_value, is_overwrite)
    def __init__(self, fields, str_f, pt0, pt1, tfunc, spatial_value=1., is_overwrite=False):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_value('str_f', str_f, ('ex', 'ey', 'ez', 'hx', 'hy', 'hz'))
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('tfunc', tfunc, types.FunctionType)
        common.check_type('spatial_value', spatial_value, \
                (np.ndarray, np.number, types.FloatType, types.IntType) )
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        e_or_h = str_f[0]
        dtype = fields.dtype
        is_array = True if isinstance(spatial_value, np.ndarray) else False

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        if is_array:
            shape = common.shape_two_points(pt0, pt1)
            assert shape == spatial_value.shape, \
                    'shape mismatch : %s, %s' % (shape, spatial_value.shape)
            assert dtype == spatial_value.dtype, \
                    'dtype mismatch : %s, %s' % (dtype, spatial_value.dtype)
        else:
            spatial_value = dtype(spatial_value)

        # create the SetFields instance
        setf = SetFields(fields, str_f, pt0, pt1, is_array, is_overwrite)

        # global variables
        self.mainf = fields
        self.tfunc = tfunc
        self.setf = setf
        self.spatial_value = spatial_value

        self.e_or_h = e_or_h
        self.tstep = 1

        # append to the update list
        self.priority_type = 'incident'
        fields.append_instance(self)
Beispiel #7
0
    def set_incident_direct(self, str_f, pt0, pt1, tfunc, spatial_value=1., is_overwrite=False):
        common.check_value('str_f', str_f, ('ex', 'ey', 'ez', 'hx', 'hy', 'hz'))
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('tfunc', tfunc, types.FunctionType)
        common.check_type('spatial_value', spatial_value, \
                (np.ndarray, np.number, types.FloatType, types.IntType) )
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list( common.convert_indices(self.ns, pt0) )
        pt1 = list( common.convert_indices(self.ns, pt1) )

        if is_mpi:
            node_pt0 = list(self.node_pt0)
            node_pt1 = list(self.node_pt1)

            for i, axis in enumerate(['x', 'y', 'z']):
                if self.nodef.buffer_dict.has_key('%s+' % axis):
                    node_pt1[i] += 1
                if self.nodef.buffer_dict.has_key('%s-' % axis):
                    node_pt0[i] -= 1

                if coord[i] == 0 and pt0[i] == 0:
                    pt0[i] -= 1
                if coord[i] == self.mpi_shape[i]-1 and pt1[i] == self.ns[i]-1:
                    pt1[i] += 1

            overlap = common.overlap_two_regions(node_pt0, node_pt1, pt0, pt1)
            if overlap != None:
                sx0, sy0, sz0 = self.node_pt0
                ox0, oy0, oz0 = overlap[0]
                ox1, oy1, oz1 = overlap[1]

                local_pt0 = (ox0-sx0, oy0-sy0, oz0-sz0)
                local_pt1 = (ox1-sx0, oy1-sy0, oz1-sz0)

                node.IncidentDirect(self.nodef, str_f, local_pt0, local_pt1, tfunc, spatial_value, is_overwrite)

        else:
            node.IncidentDirect(self.nodef, str_f, pt0, pt1, tfunc, spatial_value, is_overwrite)
    def __init__(self, fields, str_f, pt0, pt1):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        str_fs = common.convert_to_tuple(str_f)

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        # allocation
        shape = common.shape_two_points(pt0, pt1, len(str_fs))
        host_array = np.zeros(shape, dtype=fields.dtype)

        split_host_array = np.split(host_array, len(str_fs))
        split_host_array_dict = dict( zip(str_fs, split_host_array) ) 

        # global variables
        self.mainf = fields
        self.str_fs = str_fs
        self.slice_xyz = common.slices_two_points(pt0, pt1)

        self.host_array = host_array
        self.split_host_array_dict = split_host_array_dict
    def __init__(self, fields, str_f, pt0, pt1, is_array=False, is_overwrite=True):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('is_array', is_array, bool)
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        str_fs = common.convert_to_tuple(str_f)

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        # global variables and functions
        self.mainf = fields
        self.str_fs = str_fs
        self.slice_xyz = common.slices_two_points(pt0, pt1)
        self.shape = common.shape_two_points(pt0, pt1, len(str_fs))
        self.is_overwrite = is_overwrite

        if is_array:
            self.func = self.set_fields_spatial_value
        else:
            self.func = self.set_fields_single_value
    def __init__(self, fields, str_f, pt0, pt1, is_array=False, is_overwrite=True):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('is_array', is_array, bool)
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        str_fs = common.convert_to_tuple(str_f)
        dtype_str_list = fields.dtype_str_list
        overwrite_str = {True: '=', False: '+='}[is_overwrite]

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

		# program
        macros = ['NMAX', 'XID', 'YID', 'ZID', \
                'ARGS', \
                'TARGET', 'SOURCE', 'OVERWRITE', \
                'DTYPE']

        if is_array:
            values = common_gpu.macro_replace_list(pt0, pt1) + \
                    ['DTYPE *source', \
                    'target[idx]', 'source[sub_idx]', overwrite_str] + \
                    dtype_str_list
        else:
            values = common_gpu.macro_replace_list(pt0, pt1) + \
                    ['DTYPE source', \
                    'target[idx]', 'source', overwrite_str] + \
                    dtype_str_list

        ksrc = common.replace_template_code( \
                open(common_gpu.src_path + 'copy.cu').read(), macros, values)
        program = SourceModule(ksrc)
        kernel_copy = program.get_function('copy')

		# allocation
        target_bufs = [fields.get_buf(str_f) for str_f in str_fs]
        shape = common.shape_two_points(pt0, pt1, len(str_fs))

        if is_array:
            tmp_array = np.zeros(shape, fields.dtype)
            source_buf = cuda.to_device(tmp_array)

        # global variabels and functions
        self.mainf = fields
        self.kernel_copy = kernel_copy
        self.target_bufs = target_bufs
        self.shape = shape

        if is_array:
            self.source_buf = source_buf
            self.set_fields = self.set_fields_spatial_value
        else:
            self.set_fields = self.set_fields_single_value
    def __init__(self,
                 fields,
                 str_f,
                 pt0,
                 pt1,
                 tfunc,
                 spatial_value=1.,
                 is_overwrite=False):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_value('str_f', str_f,
                           ('ex', 'ey', 'ez', 'hx', 'hy', 'hz'))
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('tfunc', tfunc, types.FunctionType)
        common.check_type('spatial_value', spatial_value, \
                (np.ndarray, np.number, types.FloatType, types.IntType) )
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list(common.convert_indices(fields.ns, pt0))
        pt1 = list(common.convert_indices(fields.ns, pt1))

        # local variables
        e_or_h = str_f[0]
        dtype = fields.dtype
        is_buffer = True if isinstance(fields, BufferFields) else False
        is_array = True if isinstance(spatial_value, np.ndarray) else False

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        if is_array:
            shape = common.shape_two_points(pt0, pt1)
            assert shape == spatial_value.shape, \
                    'shape mismatch : %s, %s' % (shape, spatial_value.shape)
            assert dtype == spatial_value.dtype, \
                    'dtype mismatch : %s, %s' % (dtype, spatial_value.dtype)
        else:
            spatial_value = dtype(spatial_value)

        # create the SetFields instances
        is_update_dict = {}
        setf_dict = {}
        svalue_dict = {}

        if is_buffer:
            for part in ['', 'pre', 'post']:
                sl0 = common.slices_two_points(pt0, pt1)
                sl1 = common_buffer.slice_dict[e_or_h][part]
                overlap = common.overlap_two_slices(fields.ns, sl0, sl1)

                if overlap == None:
                    setf_dict[part] = None
                else:
                    opt0, opt1 = common.two_points_slices(fields.ns, overlap)
                    setf_dict[part] = SetFields(fields, str_f, opt0, opt1,
                                                is_array, is_overwrite)
                    svalue_dict[part] = self.overlap_svalue(
                        pt0, pt1, opt0, opt1, spatial_value, is_array)

        else:
            setf_dict[''] = SetFields(fields, str_f, pt0, pt1, is_array,
                                      is_overwrite)
            svalue_dict[''] = spatial_value

        # global variables
        self.mainf = fields
        self.tfunc = tfunc
        self.setf_dict = setf_dict
        self.svalue_dict = svalue_dict

        self.e_or_h = e_or_h
        self.tstep = 1

        # append to the update list
        self.priority_type = 'incident'
        fields.append_instance(self)
Beispiel #12
0
    def set_savefields(self, str_f, pt0, pt1, tstep_range, dir_path, tag=0):
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('tstep_range', tstep_range, (list, tuple), int)
        common.check_type('dir_path', dir_path, str)
        common.check_type('tag', tag, int)

        pt0 = common.convert_indices(self.ns, pt0)
        pt1 = common.convert_indices(self.ns, pt1)
        t0 = common.convert_index(self.max_tstep, tstep_range[0])
        t1 = common.convert_index(self.max_tstep, tstep_range[1]) + 1
        tgap = tstep_range[2]
        tmax = self.max_tstep

        tag = tag if tag not in self.savef_tag_list else max(
            self.savef_tag_list) + 1
        self.savef_tag_list.append(tag)

        if is_mpi:
            overlap = common.overlap_two_regions(self.node_pt0, self.node_pt1,
                                                 pt0, pt1)
            if overlap != None:
                sx0, sy0, sz0 = self.node_pt0
                ox0, oy0, oz0 = overlap[0]
                ox1, oy1, oz1 = overlap[1]

                local_pt0 = (ox0 - sx0, oy0 - sy0, oz0 - sz0)
                local_pt1 = (ox1 - sx0, oy1 - sy0, oz1 - sz0)

                savef = node.SaveFields(self.nodef, str_f, local_pt0,
                                        local_pt1, dir_path, tag, tmax, True,
                                        rank)
                self.savef_list.append(savef)
        else:
            savef = node.SaveFields(self.nodef, str_f, pt0, pt1, dir_path, tag,
                                    tmax)
            self.savef_list.append(savef)

        # save the subdomain informations as pickle
        if self.is_master:
            if is_mpi:
                divide_info_dict = common_mpi.divide_info_dict(
                    size, self.mpi_shape, pt0, pt1, self.asn_dict)
            else:
                divide_info_dict = { \
                        'shape': common.shape_two_points(pt0, pt1), \
                        'pt0': pt0, \
                        'pt1': pt1, \
                        'anx_list': self.nodef.accum_nx_list }

            divide_info_dict['str_fs'] = common.convert_to_tuple(str_f)
            divide_info_dict['tmax'] = tmax
            divide_info_dict['tgap'] = tgap
            pkl_file = open(dir_path + 'divide_info.pkl', 'wb')
            pickle.dump(divide_info_dict, pkl_file)
            pkl_file.close()

        self.t0 = t0
        self.t1 = t1
        self.tgap = tgap
Beispiel #13
0
    def __init__(self,
                 fields,
                 pt0,
                 pt1,
                 ep_inf,
                 drude_freq,
                 gamma,
                 mask_arrays=(1, 1, 1)):
        common.check_type('fields', fields, Fields)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('ep_inf', ep_inf, (int, float))
        common.check_type('drude_freq', drude_freq, (int, float))
        common.check_type('gamma', gamma, (int, float))
        common.check_type('mask_arrays', mask_arrays, (list, tuple),
                          (np.ndarray, int))

        # local variables
        pt0 = common.convert_indices(fields.ns, pt0)
        pt1 = common.convert_indices(fields.ns, pt1)
        context = fields.context
        queue = fields.queue
        dtype = fields.dtype
        shape = common.shape_two_points(pt0, pt1, is_dummy=True)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        for mask_array in mask_arrays:
            if isinstance(mask_array, np.ndarray):
                assert common.shape_two_points(pt0, pt1) == mask_array.shape, \
                       'shape mismatch : %s, %s' % (shape, mask_array.shape)

        # allocations
        psis = [np.zeros(shape, dtype) for i in range(3)]
        psi_bufs = [
            cl.Buffer(context, cl.mem_flags.READ_WRITE, psi.nbytes)
            for psi in psis
        ]
        for psi_buf, psi in zip(psi_bufs, psis):
            cl.enqueue_copy(queue, psi_buf, psi)

        dt = fields.dt
        aa = (2 - gamma * dt) / (2 + gamma * dt)
        bb = drude_freq**2 * dt / (2 + gamma * dt)
        comm = 2 * ep_inf + bb * dt
        ca = 2 * dt / comm
        cb = -(aa + 3) * bb * dt / comm
        cc = -(aa + 1) * dt / comm
        cas = [ca * mask for mask in mask_arrays]

        shape = common.shape_two_points(pt0, pt1, is_dummy=True)
        f = np.zeros(shape, dtype)
        psi_bufs = [
            cl.Buffer(context, cl.mem_flags.READ_WRITE, f.nbytes)
            for i in range(3)
        ]
        for psi_buf in psi_bufs:
            cl.enqueue_copy(queue, psi_buf, f)

        cf = np.ones(shape, dtype)
        mask_bufs = [
            cl.Buffer(context, cl.mem_flags.READ_ONLY, cf.nbytes)
            for i in range(3)
        ]
        for mask_buf, mask in zip(mask_bufs, mask_arrays):
            cl.enqueue_copy(queue, mask_buf, cf * mask)

        # modify ce arrays
        slices = common.slices_two_points(pt0, pt1)
        for ce, ca in zip(fields.get_ces(), cas):
            ce[slices] = ca * mask + ce[slices] * mask.__invert__()

        # program
        nmax_str, xid_str, yid_str, zid_str = common_gpu.macro_replace_list(
            pt0, pt1)
        macros = ['NMAX', 'XID', 'YID', 'ZID', 'DX', 'DTYPE', 'PRAGMA_fp64']
        values = [nmax_str, xid_str, yid_str, zid_str,
                  str(fields.ls)] + fields.dtype_str_list

        ksrc = common.replace_template_code( \
            open(common_gpu.src_path + 'drude.cl').read(), macros, values)
        program = cl.Program(fields.context, ksrc).build()

        # arguments
        pca = aa
        pcb = (aa + 1) * bb
        args = fields.ns + [dtype(cb), dtype(cc), dtype(pca), dtype(pcb)] \
            + fields.eh_bufs[:3] + psi_bufs + mask_bufs

        # global variables
        self.mainf = fields
        self.program = program
        self.args = args

        nx, ny, nz = fields.ns
        nmax = int(nmax_str)
        remainder = nmax % fields.ls
        self.gs = nmax if remainder == 0 else nmax - remainder + fields.ls

        # append to the update list
        self.priority_type = 'material'
        fields.append_instance(self)
Beispiel #14
0
    def __init__(self, fields, str_f, pt0, pt1, is_array=False, is_overwrite=True):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('is_array', is_array, bool)
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        str_fs = common.convert_to_tuple(str_f)
        dtype_str_list = fields.dtype_str_list
        overwrite_str = {True: '=', False: '+='}[is_overwrite]

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        # program
        macros = ['NMAX', 'XID', 'YID', 'ZID', \
                  'ARGS', \
                  'TARGET', 'SOURCE', 'OVERWRITE', \
                  'DTYPE', 'PRAGMA_fp64']

        nmax_str, xid_str, yid_str, zid_str = common_gpu.macro_replace_list(pt0, pt1)
        if is_array:
            values = [nmax_str, xid_str, yid_str, zid_str, \
                      '__global DTYPE *source', \
                      'target[idx]', 'source[sub_idx]', overwrite_str] + \
                dtype_str_list
        else:
            values = [nmax_str, xid_str, yid_str, zid_str, \
                      'DTYPE source', \
                      'target[idx]', 'source', overwrite_str] + \
                dtype_str_list

        ksrc = common.replace_template_code( \
            open(common_gpu.src_path + 'copy.cl').read(), macros, values)
        program = cl.Program(fields.context, ksrc).build()

        # allocation
        target_bufs = [fields.get_buf(str_f) for str_f in str_fs]
        shape = common.shape_two_points(pt0, pt1, len(str_fs))

        if is_array:
            tmp_array = np.zeros(shape, dtype=fields.dtype)
            source_buf = cl.Buffer( \
                fields.context, \
                cl.mem_flags.READ_WRITE | cl.mem_flags.COPY_HOST_PTR, \
                hostbuf=tmp_array)

        # global variabels and functions
        self.mainf = fields
        self.program = program
        self.target_bufs = target_bufs
        self.shape = shape

        nmax = int(nmax_str)
        remainder = nmax % fields.ls
        self.gs = nmax if remainder == 0 else nmax - remainder + fields.ls 

        if is_array:
            self.source_buf = source_buf
            self.set_fields = self.set_fields_spatial_value
        else:
            self.set_fields = self.set_fields_single_value
    def __init__(self, fields, str_f, pt0, pt1, is_array=False, is_overwrite=True):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('is_array', is_array, bool)
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        str_fs = common.convert_to_tuple(str_f)
        dtype_str_list = fields.dtype_str_list
        overwrite_str = {True: '=', False: '+='}[is_overwrite]

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

		# program
        macros = ['NMAX', 'XID', 'YID', 'ZID', \
                'ARGS', \
                'TARGET', 'SOURCE', 'OVERWRITE', \
                'DTYPE', 'PRAGMA_fp64']

        nmax_str, xid_str, yid_str, zid_str = common_gpu.macro_replace_list(pt0, pt1)
        if is_array:
            values = [nmax_str, xid_str, yid_str, zid_str, \
                    '__global DTYPE *source', \
                    'target[idx]', 'source[sub_idx]', overwrite_str] + \
                    dtype_str_list
        else:
            values = [nmax_str, xid_str, yid_str, zid_str, \
                    'DTYPE source', \
                    'target[idx]', 'source', overwrite_str] + \
                    dtype_str_list

        ksrc = common.replace_template_code( \
                open(common_gpu.src_path + 'copy.cl').read(), macros, values)
        program = cl.Program(fields.context, ksrc).build()

		# allocation
        target_bufs = [fields.get_buf(str_f) for str_f in str_fs]
        shape = common.shape_two_points(pt0, pt1, len(str_fs))

        if is_array:
            tmp_array = np.zeros(shape, dtype=fields.dtype) 
            source_buf = cl.Buffer( \
                    fields.context, \
                    cl.mem_flags.READ_WRITE | cl.mem_flags.COPY_HOST_PTR, \
                    hostbuf=tmp_array)

        # global variabels and functions
        self.mainf = fields
        self.program = program
        self.target_bufs = target_bufs
        self.shape = shape

        nmax = int(nmax_str)
        remainder = nmax % fields.ls
        self.gs = nmax if remainder == 0 else nmax - remainder + fields.ls 

        if is_array:
            self.source_buf = source_buf
            self.set_fields = self.set_fields_spatial_value
        else:
            self.set_fields = self.set_fields_single_value
Beispiel #16
0
    def __init__(self,
                 fields,
                 pt0,
                 pt1,
                 ep_inf,
                 drude_freq,
                 gamma,
                 mask_arrays=(1, 1, 1)):
        common.check_type('fields', fields, Fields)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('ep_inf', ep_inf, (int, float))
        common.check_type('drude_freq', drude_freq, (int, float))
        common.check_type('gamma', gamma, (int, float))
        common.check_type('mask_arrays', mask_arrays, (list, tuple),
                          (np.ndarray, types.IntType))

        # local variables
        pt0 = common.convert_indices(fields.ns, pt0)
        pt1 = common.convert_indices(fields.ns, pt1)
        dtype = fields.dtype

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        for mask_array in mask_arrays:
            if isinstance(mask_array, np.ndarray):
                assert common.shape_two_points(pt0, pt1) == mask_array.shape, \
                       'shape mismatch : %s, %s' % (shape, mask_array.shape)

        # allocations
        shape = common.shape_two_points(pt0, pt1, is_dummy=True)
        psis = [np.zeros(shape, dtype) for i in range(3)]

        dt = fields.dt
        aa = (2 - gamma * dt) / (2 + gamma * dt)
        bb = drude_freq**2 * dt / (2 + gamma * dt)
        comm = 2 * ep_inf + bb * dt
        ca = 2 * dt / comm
        cb = -(aa + 3) * bb * dt / comm
        cc = -(aa + 1) * dt / comm
        cas = [ca * mask for mask in mask_arrays]
        cbs = [cb * mask for mask in mask_arrays]
        ccs = [cc * mask for mask in mask_arrays]

        # modify ce arrays
        slices = common.slices_two_points(pt0, pt1)
        for ce, ca in zip(fields.get_ces(), cas):
            ce[slices] = ca

        # global variables
        self.mainf = fields
        self.psis = psis
        self.cbs = cbs
        self.ccs = ccs
        self.pcs = aa, (aa + 1) * bb
        self.slices = slices

        # append to the update list
        self.priority_type = 'material'
        fields.append_instance(self)
    def __init__(self,
                 fields,
                 str_f,
                 pt0,
                 pt1,
                 is_array=False,
                 is_overwrite=True):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('is_array', is_array, bool)
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list(common.convert_indices(fields.ns, pt0))
        pt1 = list(common.convert_indices(fields.ns, pt1))

        # local variables
        str_fs = common.convert_to_tuple(str_f)
        dtype_str_list = fields.dtype_str_list
        overwrite_str = {True: '=', False: '+='}[is_overwrite]

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

# program
        macros = ['NMAX', 'XID', 'YID', 'ZID', \
                'ARGS', \
                'TARGET', 'SOURCE', 'OVERWRITE', \
                'DTYPE']

        if is_array:
            values = common_gpu.macro_replace_list(pt0, pt1) + \
                    ['DTYPE *source', \
                    'target[idx]', 'source[sub_idx]', overwrite_str] + \
                    dtype_str_list
        else:
            values = common_gpu.macro_replace_list(pt0, pt1) + \
                    ['DTYPE source', \
                    'target[idx]', 'source', overwrite_str] + \
                    dtype_str_list

        ksrc = common.replace_template_code( \
                open(common_gpu.src_path + 'copy.cu').read(), macros, values)
        program = SourceModule(ksrc)
        kernel_copy = program.get_function('copy')

        # allocation
        target_bufs = [fields.get_buf(str_f) for str_f in str_fs]
        shape = common.shape_two_points(pt0, pt1, len(str_fs))

        if is_array:
            tmp_array = np.zeros(shape, fields.dtype)
            source_buf = cuda.to_device(tmp_array)

        # global variabels and functions
        self.mainf = fields
        self.kernel_copy = kernel_copy
        self.target_bufs = target_bufs
        self.shape = shape

        if is_array:
            self.source_buf = source_buf
            self.set_fields = self.set_fields_spatial_value
        else:
            self.set_fields = self.set_fields_single_value
Beispiel #18
0
    def __init__(self, fields, str_f, pt0, pt1, process=''):
        """
        """

        common.check_type('fields', fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('process', process, str)

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        str_fs = common.convert_to_tuple(str_f)
        dtype_str_list = fields.dtype_str_list

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        # program
        macros = ['NMAX', 'XID', 'YID', 'ZID', \
                  'ARGS', \
                  'TARGET', 'SOURCE', 'OVERWRITE', \
                  'DTYPE', 'PRAGMA_fp64']

        nmax_str, xid_str, yid_str, zid_str = common_gpu.macro_replace_list(pt0, pt1)
        if process == '':
            process_str_list = ['target[sub_idx]', 'source[idx]', '=']
        elif process == 'square_sum':
            process_str_list = ['target[sub_idx]', 'pown(source[idx], 2)', '+=']

        values = [nmax_str, xid_str, yid_str, zid_str, \
                  '__global DTYPE *source'] + \
                  process_str_list + \
                  dtype_str_list

        ksrc = common.replace_template_code( \
            open(common_gpu.src_path + 'copy.cl').read(), macros, values)
        program = cl.Program(fields.context, ksrc).build()

        # allocation
        source_bufs = [fields.get_buf(str_f) for str_f in str_fs]
        shape = common.shape_two_points(pt0, pt1, len(str_fs))

        host_array = np.zeros(shape, dtype=fields.dtype)
        split_host_array = np.split(host_array, len(str_fs))
        split_host_array_dict = dict( zip(str_fs, split_host_array) ) 

        target_buf = cl.Buffer( \
            fields.context, \
            cl.mem_flags.READ_WRITE | cl.mem_flags.COPY_HOST_PTR, \
            hostbuf=host_array)

        # global variables
        self.mainf = fields
        self.program = program
        self.source_bufs = source_bufs
        self.target_buf = target_buf
        self.host_array = host_array
        self.split_host_array_dict = split_host_array_dict

        nmax = int(nmax_str)
        remainder = nmax % fields.ls
        self.gs = nmax if remainder == 0 else nmax - remainder + fields.ls 
    def __init__(self, fields, str_f, pt0, pt1, tfunc, spatial_value=1., is_overwrite=False):
        """
        """
        
        common.check_type('fields', fields, Fields)
        common.check_value('str_f', str_f, ('ex', 'ey', 'ez', 'hx', 'hy', 'hz'))
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))
        common.check_type('tfunc', tfunc, types.FunctionType)
        common.check_type('spatial_value', spatial_value, \
                (np.ndarray, np.number, types.FloatType, types.IntType) )
        common.check_type('is_overwrite', is_overwrite, bool)

        pt0 = list( common.convert_indices(fields.ns, pt0) )
        pt1 = list( common.convert_indices(fields.ns, pt1) )

        # local variables
        e_or_h = str_f[0]
        dtype = fields.dtype
        is_buffer = True if isinstance(fields, BufferFields) else False
        is_array = True if isinstance(spatial_value, np.ndarray) else False

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], fields.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        if is_array:
            shape = common.shape_two_points(pt0, pt1)
            assert shape == spatial_value.shape, \
                    'shape mismatch : %s, %s' % (shape, spatial_value.shape)
            assert dtype == spatial_value.dtype, \
                    'dtype mismatch : %s, %s' % (dtype, spatial_value.dtype)
        else:
            spatial_value = dtype(spatial_value)

        # create the SetFields instances
        is_update_dict = {}
        setf_dict = {}
        svalue_dict = {}

        if is_buffer:
            for part in ['', 'pre', 'post']:
                sl0 = common.slices_two_points(pt0, pt1)
                sl1 = common_buffer.slice_dict[e_or_h][part]
                overlap = common.overlap_two_slices(fields.ns, sl0, sl1)

                if overlap == None:
                    setf_dict[part] = None
                else:
                    opt0, opt1 = common.two_points_slices(fields.ns, overlap)
                    setf_dict[part] = SetFields(fields, str_f, opt0, opt1, is_array, is_overwrite)
                    svalue_dict[part] = self.overlap_svalue(pt0, pt1, opt0, opt1, spatial_value, is_array)

        else:
            setf_dict[''] = SetFields(fields, str_f, pt0, pt1, is_array, is_overwrite)
            svalue_dict[''] = spatial_value

        # global variables
        self.mainf = fields
        self.tfunc = tfunc
        self.setf_dict = setf_dict
        self.svalue_dict = svalue_dict

        self.e_or_h = e_or_h
        self.tstep = 1

        # append to the update list
        self.priority_type = 'incident'
        fields.append_instance(self)
Beispiel #20
0
    def __init__(self, node_fields, str_f, pt0, pt1, process=''):
        """
        """

        common.check_type('node_fields', node_fields, Fields)
        common.check_type('str_f', str_f, (str, list, tuple), str)
        common.check_type('pt0', pt0, (list, tuple), (int, float))
        common.check_type('pt1', pt1, (list, tuple), (int, float))

        pt0 = list(common.convert_indices(node_fields.ns, pt0))
        pt1 = list(common.convert_indices(node_fields.ns, pt1))

        # local variables
        nodef = node_fields
        str_fs = common.convert_to_tuple(str_f)
        mainf_list = nodef.mainf_list
        anx = nodef.accum_nx_list

        for strf in str_fs:
            strf_list = ['ex', 'ey', 'ez', 'hx', 'hy', 'hz']
            common.check_value('str_f', strf, strf_list)

        for axis, n, p0, p1 in zip(['x', 'y', 'z'], nodef.ns, pt0, pt1):
            common.check_value('pt0 %s' % axis, p0, range(n))
            common.check_value('pt1 %s' % axis, p1, range(n))

        # allocation
        shape = common.shape_two_points(pt0, pt1, len(str_fs))
        dummied_shape = common.shape_two_points(pt0, pt1, is_dummy=True)
        host_array = np.zeros(shape, dtype=nodef.dtype)

        split_host_array = np.split(host_array, len(str_fs))
        split_host_array_dict = dict(zip(str_fs, split_host_array))

        device_type_list = [f.device_type for f in nodef.updatef_list]
        if 'gpu' in device_type_list:
            from kemp.fdtd3d import gpu
            getclass = getattr(gpu, 'GetFields')
        if 'cpu' in device_type_list:
            from kemp.fdtd3d import cpu
            getclass = getattr(cpu, 'GetFields')

        getf_list = []
        slices_list = []
        for i, mainf in enumerate(mainf_list):
            nx0 = anx[i]
            nx1 = anx[i + 1] - 1 if i < len(mainf_list) - 1 else anx[i + 1]
            overlap = common.overlap_two_lines((nx0, nx1), (pt0[0], pt1[0]))

            if overlap != None:
                x0, y0, z0 = pt0
                x1, y1, z1 = pt1

                slice_pt0 = (overlap[0] - x0, 0, 0)
                slice_pt1 = (overlap[1] - x0, y1 - y0, z1 - z0)
                slices = []
                for j, p0, p1 in zip([0, 1, 2], slice_pt0, slice_pt1):
                    if dummied_shape[j] != 1:
                        slices.append(slice(p0, p1 + 1))
                slices_list.append(slices if slices != [] else [slice(0, 1)])

                local_pt0 = (overlap[0] - nx0, y0, z0)
                local_pt1 = (overlap[1] - nx0, y1, z1)
                getf_list.append(
                    getclass(mainf, str_fs, local_pt0, local_pt1, process))

        # global variables
        self.str_fs = str_fs
        self.host_array = host_array
        self.split_host_array_dict = split_host_array_dict
        self.getf_list = getf_list
        self.slices_list = slices_list