Discrete dipole approximation codes
Discrete dipole approximation codes. This is a list of Discrete Dipole Approximation (DDA) codes. The "code" here indicates computer code, a particular implementation of the DDA (many of them are open-source). For theoretical approach see Discrete dipole approximation article.
Most of the codes apply to arbitrary-shaped inhomogeneous nonmagnetic particles and particle systems in free space or homogeneous dielectric host medium. The calculated quantities typically include the Mueller matrices, integral cross-sections (extinction, absorption, and scattering), internal fields and angle-resolved scattered fields (phase function). There are some published comparisons of existing DDA codes.[1]
General-purpose open-source DDA codes
[edit | edit source]These codes typically use regular grids (cubical or rectangular cuboid), conjugate gradient method to solve large systems of linear equations, and FFT-acceleration of the matrix-vector products which uses convolution theorem. Complexity of this approach is almost linear in number of dipoles for both time and memory.[2]
| Name | Authors | References | Language | Updated | Features |
|---|---|---|---|---|---|
| DDSCAT | Draine and Flatau | [3] | Fortran | 2019 (v. 7.3.3) | Can also handle periodic particles and efficiently calculate near fields. Uses OpenMP acceleration. |
| DDscat.C++ | Choliy | [4] | C++ | 2017 (v. 7.3.1) | Version of DDSCAT translated to C++ with some further improvements. |
| ADDA | Yurkin, Hoekstra, and contributors | [5][6] | C | 2020 (v. 1.4.0) | Implements fast and rigorous consideration of a plane substrate, and allows rectangular-cuboid voxels for highly oblate or prolate particles. Can also calculate emission (decay-rate) enhancement of point emitters. Near-fields calculation is not very efficient. Uses Message Passing Interface (MPI) parallelization and can run on GPU (OpenCL). |
| OpenDDA | McDonald | [7][8] | C | 2009 (v. 0.4.1) | Uses both OpenMP and MPI parallelization. Focuses on computational efficiency. |
| DDA-GPU | Kieß | [9] | C++ | 2016 | Runs on GPU (OpenCL). Algorithms are partly based on ADDA. |
| VIE-FFT | Sha | [10] | C/C++ | 2019 | Also calculates near fields and material absorption. Named differently, but the algorithms are very similar to the ones used in the mainstream DDA. |
| VoxScatter | Groth, Polimeridis, and White | [11] | Matlab | 2019 | Uses circulant preconditioner for accelerating iterative solvers |
| IF-DDA | Chaumet, Sentenac, and Sentenac | [12] | Fortran, GUI in C++ with Qt | 2021 (v. 0.9.19) | Idiot-friendly DDA. Uses OpenMP and HDF5. Has a separate version (IF-DDAM) for multi-layered substrate. |
| MPDDA | Shabaninezhad, Awan, and Ramakrishna | [13] | Matlab | 2021 (v. 1.0) | Runs on GPU (using Matlab capabilities) |
| CPDDA | Dibo Xu and others | [14] | Python | 2025 | GPU acceleration using CuPy |
Specialized DDA codes
[edit | edit source]These list include codes that do not qualify for the previous section. The reasons may include the following: source code is not available, FFT acceleration is absent or reduced, the code focuses on specific applications not allowing easy calculation of standard scattering quantities.
| Name | Authors | References | Language | Updated | Features |
|---|---|---|---|---|---|
| DDSURF, DDSUB, DDFILM | Schmehl, Nebeker, and Zhang | [15][16][17] | Fortran | 2008 | Rigorous handling of semi-infinite substrate and finite films (with arbitrary particle placement), but only 2D FFT acceleration is used. |
| DDMM | Mackowski | [18] | Fortran | 2002 | Calculates T-matrix, which can then be used to efficiently calculate orientation-averaged scattering properties. |
| CDA | McMahon | [19] | Matlab | 2006 | |
| DDA-SI | Loke | [20] | Matlab | 2014 (v. 0.2) | Rigorous handling of substrate, but no FFT acceleration is used. |
| PyDDA | Dmitriev | Python | 2015 | Reimplementation of DDA-SI | |
| e-DDA | Vaschillo and Bigelow | [21] | Fortran | 2019 (v. 2.0) | Simulates electron-energy loss spectroscopy and cathodoluminescence. Built upon DDSCAT 7.1. |
| DDEELS | Geuquet, Guillaume and Henrard | [22] | Fortran | 2013 (v. 2.1) | Simulates electron-energy loss spectroscopy and cathodoluminescence. Handles substrate through image approximation, but no FFT acceleration is used. |
| T-DDA | Edalatpour | [23] | Fortran | 2015 | Simulates near-field radiative heat transfer. The computational bottleneck is direct matrix inversion (no FFT acceleration is used). Uses OpenMP and MPI parallelization. |
| CDDA | Rosales, Albella, González, Gutiérrez, and Moreno | [24] | 2021 | Applies to chiral systems (solves coupled equations for electric and magnetic fields) | |
| PyDScat | Yibin Jiang, Abhishek Sharma and Leroy Cronin | [25] | Python | 2023 | Simulates nanostructures undergoing structural transformation with GPU acceleration. |
Gallery of shapes
[edit | edit source]-
Scattering by periodic structures such as slabs, gratings, of periodic cubes placed on a surface, can be solved in the discrete dipole approximation.
-
Scattering by infinite object (such as cylinder) can be solved in the discrete dipole approximation.Scattering by infinite object (such as cylinder) can be solved in the discrete dipole approximation.
See also
[edit | edit source]- Computational electromagnetics
- Mie theory
- Finite-difference time-domain method
- Method of moments (electromagnetics)
References
[edit | edit source]- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
- ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).