Cleanup and comment

release
jan 8 years ago
parent 89caff471f
commit 9198779974

2
.gitignore vendored

@ -59,4 +59,4 @@ docs/_build/
target/ target/
# PyCharm # PyCharm
.idea .idea/

@ -19,7 +19,7 @@ Bloch boundary conditions are not included but wouldn't be very hard to add.
The default solver (opencl_fdfd.cg_solver(...)) located in main.py implements The default solver (opencl_fdfd.cg_solver(...)) located in main.py implements
the E-field wave operator directly (ie, as a list of OpenCL instructions the E-field wave operator directly (ie, as a list of OpenCL instructions
rather than a matrix). Additionally, there is a slower (and slightly more rather than a matrix). Additionally, there is a slower (and slightly more
versatile) sovler in csr.py which attempts to solve an arbitrary sparse versatile) solver in csr.py which attempts to solve an arbitrary sparse
matrix in compressed sparse row (CSR) format using the same conjugate gradient matrix in compressed sparse row (CSR) format using the same conjugate gradient
method as the default solver. The CSR solver is significantly slower, but can method as the default solver. The CSR solver is significantly slower, but can
be very useful for testing alternative formulations of the FDFD wave equation. be very useful for testing alternative formulations of the FDFD wave equation.
@ -29,9 +29,29 @@ generalization to multiple GPUs should be pretty straightforward
(ie, just copy over edge values during the matrix multiplication step). (ie, just copy over edge values during the matrix multiplication step).
## Installation
**Dependencies:** **Dependencies:**
* python 3 (written and tested with 3.5) * python 3 (written and tested with 3.5)
* numpy * numpy
* pyopencl * pyopencl
* jinja2 * jinja2
* [fdfd_tools](https://mpxd.net/gogs/jan/fdfd_tools) * [fdfd_tools](https://mpxd.net/gogs/jan/fdfd_tools)
Install with pip, via git:
```bash
pip install git+https://mpxd.net/gogs/jan/opencl_fdfd.git@release
```
## Use
See the documentation for opencl_fdfd.cg_solver(...)
(located in main.py) for details about how to call the solver.
An alternate (slower) FDFD solver and a general gpu-based sparse matrix
solver is available in csr.py . These aren't particularly well-optimized,
and something like [MAGMA](http://icl.cs.utk.edu/magma/index.html) would
probably be a better choice if you absolutely need to solve arbitrary
sparse matrices and can tolerate writing and compiling C/C++ code.

@ -19,7 +19,7 @@
The default solver (opencl_fdfd.cg_solver(...)) located in main.py implements The default solver (opencl_fdfd.cg_solver(...)) located in main.py implements
the E-field wave operator directly (ie, as a list of OpenCL instructions the E-field wave operator directly (ie, as a list of OpenCL instructions
rather than a matrix). Additionally, there is a slower (and slightly more rather than a matrix). Additionally, there is a slower (and slightly more
versatile) sovler in csr.py which attempts to solve an arbitrary sparse versatile) solver in csr.py which attempts to solve an arbitrary sparse
matrix in compressed sparse row (CSR) format using the same conjugate gradient matrix in compressed sparse row (CSR) format using the same conjugate gradient
method as the default solver. The CSR solver is significantly slower, but can method as the default solver. The CSR solver is significantly slower, but can
be very useful for testing alternative formulations of the FDFD wave equation. be very useful for testing alternative formulations of the FDFD wave equation.

@ -1,3 +1,19 @@
"""
Sparse matrix solvers
This file holds the sparse matrix solvers, as well as the
CSRMatrix sparse matrix representation.
The FDFD solver (fdfd_cg_solver()) solves an FDFD problem by
creating a sparse matrix representing the problem (using
fdfd_tools) and then passing it to cg(), which performs a
conjugate gradient solve.
cg() is capable of solving arbitrary sparse matrices which
satisfy the constraints for the 'conjugate gradient' algorithm
(positive definite, symmetric) and some that don't.
"""
from typing import List, Dict, Any from typing import List, Dict, Any
import time import time
@ -133,16 +149,16 @@ def cg(a: 'scipy.sparse.csr_matrix',
return x return x
def cg_solver(omega: complex, def fdfd_cg_solver(omega: complex,
dxes: List[List[numpy.ndarray]], dxes: List[List[numpy.ndarray]],
J: numpy.ndarray, J: numpy.ndarray,
epsilon: numpy.ndarray, epsilon: numpy.ndarray,
mu: numpy.ndarray = None, mu: numpy.ndarray = None,
pec: numpy.ndarray = None, pec: numpy.ndarray = None,
pmc: numpy.ndarray = None, pmc: numpy.ndarray = None,
adjoint: bool = False, adjoint: bool = False,
solver_opts: Dict[str, Any] = None, solver_opts: Dict[str, Any] = None,
) -> numpy.ndarray: ) -> numpy.ndarray:
""" """
Conjugate gradient FDFD solver using CSR sparse matrices, mainly for Conjugate gradient FDFD solver using CSR sparse matrices, mainly for
testing and development since it's much slower than the solver in main.py. testing and development since it's much slower than the solver in main.py.

@ -1,3 +1,11 @@
"""
Default FDFD solver
This file holds the default FDFD solver, which uses an E-field wave
operator implemented directly as OpenCL arithmetic (rather than as
a matrix).
"""
from typing import List from typing import List
import time import time

@ -1,3 +1,12 @@
"""
Basic PyOpenCL operations
The functions are mostly concerned with creating and compiling OpenCL
kernels for use by the other solvers.
See kernels/ for any of the .cl files loaded in this file.
"""
from typing import List, Callable from typing import List, Callable
import numpy import numpy
@ -8,6 +17,7 @@ import pyopencl.array
from pyopencl.elementwise import ElementwiseKernel from pyopencl.elementwise import ElementwiseKernel
from pyopencl.reduction import ReductionKernel from pyopencl.reduction import ReductionKernel
# Create jinja2 env on module load # Create jinja2 env on module load
jinja_env = jinja2.Environment(loader=jinja2.PackageLoader(__name__, 'kernels')) jinja_env = jinja2.Environment(loader=jinja2.PackageLoader(__name__, 'kernels'))

@ -3,7 +3,7 @@
from setuptools import setup, find_packages from setuptools import setup, find_packages
setup(name='opencl_fdfd', setup(name='opencl_fdfd',
version='0.1', version='0.2',
description='Opencl FDFD solver', description='Opencl FDFD solver',
author='Jan Petykiewicz', author='Jan Petykiewicz',
author_email='anewusername@gmail.com', author_email='anewusername@gmail.com',

Loading…
Cancel
Save