Implementation of "source" fields (J)
This commit is contained in:
		
							parent
							
								
									cb471df182
								
							
						
					
					
						commit
						d8dc024626
					
				
							
								
								
									
										32
									
								
								opencl_fdtd/kernels/update_j.cl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								opencl_fdtd/kernels/update_j.cl
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,32 @@
 | 
			
		||||
/*
 | 
			
		||||
 *  Update E-field from J field 
 | 
			
		||||
 *
 | 
			
		||||
 *  Template parameters:
 | 
			
		||||
 *   common_header: Rendered contents of common.cl
 | 
			
		||||
 *
 | 
			
		||||
 *  OpenCL args:
 | 
			
		||||
 *   E, Jr, Ji, c, s, xmin, xmax, ymin, ymax, zmin, zmax   
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
{{common_header}}
 | 
			
		||||
 | 
			
		||||
////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
__global ftype *Jrx = Jr + XX;
 | 
			
		||||
__global ftype *Jry = Jr + YY;
 | 
			
		||||
__global ftype *Jrz = Jr + ZZ;
 | 
			
		||||
__global ftype *Jix = Ji + XX;
 | 
			
		||||
__global ftype *Jiy = Ji + YY;
 | 
			
		||||
__global ftype *Jiz = Ji + ZZ;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if (x < xmin || y < ymin || z < zmin) {
 | 
			
		||||
   PYOPENCL_ELWISE_CONTINUE;
 | 
			
		||||
}
 | 
			
		||||
if (x >= xmax || y >= ymax || z >= zmax) {
 | 
			
		||||
   PYOPENCL_ELWISE_CONTINUE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Ex[i] += c * Jrx[i] + s * Jix[i];
 | 
			
		||||
Ey[i] += c * Jry[i] + s * Jiy[i];
 | 
			
		||||
Ez[i] += c * Jrz[i] + s * Jiz[i];
 | 
			
		||||
@ -70,6 +70,7 @@ class Simulation(object):
 | 
			
		||||
    update_E = None     # type: Callable[[List[pyopencl.Event]], pyopencl.Event]
 | 
			
		||||
    update_H = None     # type: Callable[[List[pyopencl.Event]], pyopencl.Event]
 | 
			
		||||
    update_S = None     # type: Callable[[List[pyopencl.Event]], pyopencl.Event]
 | 
			
		||||
    update_J = None     # type: Callable[[List[pyopencl.Event]], pyopencl.Event]
 | 
			
		||||
    sources = None      # type: Dict[str, str]
 | 
			
		||||
 | 
			
		||||
    def __init__(self,
 | 
			
		||||
@ -80,7 +81,8 @@ class Simulation(object):
 | 
			
		||||
                 context: pyopencl.Context = None,
 | 
			
		||||
                 queue: pyopencl.CommandQueue = None,
 | 
			
		||||
                 float_type: numpy.float32 or numpy.float64 = numpy.float32,
 | 
			
		||||
                 do_poynting: bool = True):
 | 
			
		||||
                 do_poynting: bool = True,
 | 
			
		||||
                 do_fieldsrc: bool = False):
 | 
			
		||||
        """
 | 
			
		||||
        Initialize the simulation.
 | 
			
		||||
 | 
			
		||||
@ -179,6 +181,17 @@ class Simulation(object):
 | 
			
		||||
            S_fields[ptr('oS')] = self.oS
 | 
			
		||||
            S_fields[ptr('S')] = self.S
 | 
			
		||||
 | 
			
		||||
        J_fields = OrderedDict()
 | 
			
		||||
        if do_fieldsrc:
 | 
			
		||||
            J_source = jinja_env.get_template('update_j.cl').render(**jinja_args)
 | 
			
		||||
            self.sources['J'] = J_source
 | 
			
		||||
 | 
			
		||||
            self.Ji = pyopencl.array.zeros_like(self.E)
 | 
			
		||||
            self.Jr = pyopencl.array.zeros_like(self.E)
 | 
			
		||||
            J_fields[ptr('Jr')] = self.Jr
 | 
			
		||||
            J_fields[ptr('Ji')] = self.Ji
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        '''
 | 
			
		||||
        PML
 | 
			
		||||
        '''
 | 
			
		||||
@ -191,6 +204,15 @@ class Simulation(object):
 | 
			
		||||
        self.update_H = self._create_operation(H_source, (base_fields, pml_h_fields, S_fields))
 | 
			
		||||
        if do_poynting:
 | 
			
		||||
            self.update_S = self._create_operation(S_source, (base_fields, S_fields))
 | 
			
		||||
        if do_fieldsrc:
 | 
			
		||||
            args = OrderedDict()
 | 
			
		||||
            [args.update(d) for d in (base_fields, J_fields)]
 | 
			
		||||
            var_args = [ctype + ' ' + v for v in 'cs'] + ['uint ' + r + m for r in 'xyz' for m in ('min', 'max')]
 | 
			
		||||
            print(var_args)
 | 
			
		||||
            update = ElementwiseKernel(self.context, operation=J_source,
 | 
			
		||||
                                       arguments=', '.join(list(args.keys()) + var_args))
 | 
			
		||||
            #print(len(args.values()),'\n\n',  args.values(), args.keys())
 | 
			
		||||
            self.update_J = lambda e, *a: update(*args.values(), *a, wait_for=e)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def _create_pmls(self, pmls):
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user