Óptica numérica · Artículo 05

Cada punto es un dipolo: DDA

Llena el objeto de dipolos puntuales, deja que cada uno responda al campo de todos los demás, y resuelve el sistema. Simple en concepto, potente en la práctica.

La DDA nace de una idea sencilla: cualquier objeto se puede pensar como una colección de puntos polarizables — dipolos — lo suficientemente juntos como para capturar la forma del objeto. Cada dipolo responde al campo incidente más el campo que producen todos los demás dipolos. El resultado es un sistema lineal que, una vez resuelto, te da los campos dispersados. El método fue propuesto por Purcell y Pennypacker en 1973 para calcular el scattering de polvo interestelar — y sigue siendo la herramienta estándar para nanopartículas de forma arbitraria.

La idea

Divide el objeto en NN celdas cúbicas. Cada celda se reemplaza por un dipolo puntual con polarizabilidad αj\alpha_j, calculada a partir del índice de refracción local usando la relación de Clausius-Mossotti:

αj=3V4πεj1εj+2\alpha_j = \frac{3V}{4\pi} \, \frac{\varepsilon_j - 1}{\varepsilon_j + 2}

donde VV es el volumen de la celda. El momento dipolar de cada punto es:

pj=αj(Einc(rj)+kjG(rj,rk)pk)\mathbf{p}_j = \alpha_j \left( \mathbf{E}_{\text{inc}}(\mathbf{r}_j) + \sum_{k \neq j} \mathbf{G}(\mathbf{r}_j, \mathbf{r}_k) \cdot \mathbf{p}_k \right)

donde G\mathbf{G} es el tensor de Green de espacio libre — el campo que produce un dipolo a distancia. En notación matricial:

(α1G)p=Einc\left(\boldsymbol{\alpha}^{-1} - \mathbf{G}\right) \mathbf{p} = \mathbf{E}_{\text{inc}}

Un sistema lineal de 3N×3N3N \times 3N (tres componentes del dipolo por cada punto). La matriz es densa — cada dipolo interactúa con todos los demás.

El tensor de Green explícito

El tensor de Green de espacio libre para un dipolo en rk\mathbf{r}_k evaluado en rj\mathbf{r}_j es:

Gjk=eikrr3[(k2r2+ikr1)I+(k2r23ikr+3)r^r^]G_{jk} = \frac{e^{ikr}}{r^3}\left[(k^2 r^2 + ikr - 1)\mathbf{I} + (-k^2 r^2 - 3ikr + 3)\hat{\mathbf{r}}\hat{\mathbf{r}}\right]

donde r=rjrkr = |\mathbf{r}_j - \mathbf{r}_k| y r^\hat{\mathbf{r}} es el vector unitario de rk\mathbf{r}_k a rj\mathbf{r}_j. Contiene tres regiones: campo lejano (k2r2k^2r^2, decae como 1/r1/r), campo intermedio (ikrikr, decae como 1/r21/r^2) y campo cercano (constante, decae como 1/r31/r^3). Para dipolos muy juntos (kr1kr \ll 1), domina el campo cercano — la interacción dipolo-dipolo electrostática.

La polarizabilidad correcta

La fórmula de Clausius-Mossotti da la polarizabilidad «desnuda» αCM\alpha_{\text{CM}}. Pero en la práctica, el dipolo discreto también radia — y esa radiación modifica su respuesta efectiva. La corrección estándar es la LDR (Lattice Dispersion Relation) de Draine y Goodman (1993):

αLDR1=αCM123ik3k2db1\alpha_{\text{LDR}}^{-1} = \alpha_{\text{CM}}^{-1} - \frac{2}{3}ik^3 - \frac{k^2}{d}\,b_1

donde dd es el espaciado entre dipolos y b1b_1 es un coeficiente que depende de la dirección de propagación respecto a la rejilla. La corrección radiativa (2ik3/32ik^3/3) garantiza que un dipolo aislado cumpla el teorema óptico. Sin esta corrección, DDA viola la conservación de energía.

Criterio de convergencia

¿Cuántos dipolos necesitas? La regla empírica es:

mkd<1|m| \, k \, d < 1

donde m=n+ikm = n + ik es el índice de refracción complejo del material y dd el espaciado entre dipolos. Para vidrio (m=1.5|m| = 1.5), necesitas ~10 dipolos por longitud de onda. Para silicio (m4|m| \approx 4), necesitas ~25. Para metales con m10|m| \sim 10, necesitas ~60 — y ahí es donde DDA se vuelve caro.

Discretización

Explora cómo se discretiza un objeto en dipolos. Observa cómo el número de incógnitas (y el tamaño de la matriz) crece con la resolución:

Explorar
Forma
Resolución 12
Discretización en dipolos
Cada punto es un dipolo. El dipolo amarillo interactúa con todos los demás (líneas). La matriz del sistema crece como N².

El dipolo amarillo interactúa con todos los demás — cada línea es una entrada de la matriz G\mathbf{G}. Con 100 dipolos, la matriz tiene 10.000 entradas. Con 1.000, tiene un millón. Esta es la principal limitación de DDA: la memoria y el coste de resolver un sistema denso.

Ventajas y limitaciones

DDA en la práctica

El software de referencia es DDSCAT (Draine & Flatau), open-source y ampliamente validado. Otros: ADDA (paralelizado con MPI, escala a miles de millones de dipolos), OpenDDA. Todos usan FFT para la aceleración y GMRES o BiCGSTAB como solucionador iterativo.

Un test estándar para validar DDA: calcular el scattering de una esfera y comparar con la solución exacta de Mie. Con la corrección LDR y mkd0.5|m|kd \leq 0.5, el error en QextQ_{\text{ext}} es típicamente < 1%.

DDA es el método de elección para nanopartículas de forma arbitraria en espacio abierto — polvo cósmico, agregados coloidales, nanoantenas. Para geometrías que necesitan mallas adaptativas o formulaciones variacionales, el siguiente método — FEM — es más apropiado.

Ejercicios

Ejercicio 1

Quieres modelar un nanocubo de oro de 50 nm de lado a λ=600\lambda = 600 nm. El índice complejo del oro a esa longitud de onda es m0.2+3.3im \approx 0.2 + 3.3i, así que m3.3|m| \approx 3.3. Usando el criterio mkd<1|m|kd < 1, ¿cuál es el espaciado máximo dd entre dipolos? ¿Cuántos dipolos necesitas en total?

Solución

k=2π/λ=2π/6000.0105k = 2\pi/\lambda = 2\pi/600 \approx 0.0105 nm⁻¹. De mkd<1|m|kd < 1: d<1/(3.3×0.0105)29d < 1/(3.3 \times 0.0105) \approx 29 nm.

Con d=5d = 5 nm (conservador): 50/5=1050/5 = 10 dipolos por lado, 103=100010^3 = 1000 dipolos totales. La matriz es 3000×30003000 \times 3000 — trivial. Con d=2d = 2 nm (alta resolución): 253=1562525^3 = 15\,625 dipolos, matriz 46875×4687546\,875 \times 46\,875 — necesitas FFT e iterativos.

Ejercicio 2

La visualización de arriba muestra un dipolo amarillo conectado a todos los demás. Si la partícula tiene NN dipolos y cada interacción es un tensor 3×33 \times 3, ¿cuántas entradas tiene la matriz del sistema completo? Si cada entrada es un número complejo en doble precisión (16 bytes), ¿cuánta memoria necesitas para N=104N = 10^4 y N=105N = 10^5?

Solución

La matriz es 3N×3N=9N23N \times 3N = 9N^2 entradas complejas.

Para N=104N = 10^4: 9×108×1614.49 \times 10^8 \times 16 \approx 14.4 GB. Almacenable, pero al límite.

Para N=105N = 10^5: 9×1010×16=1.449 \times 10^{10} \times 16 = 1.44 TB. Imposible almacenar. Es imprescindible usar FFT (no formas la matriz; solo haces multiplicaciones matriz-vector en O(NlogN)O(N \log N)) con un solucionador iterativo.