2016-09-01 14:39:44 -07:00
|
|
|
/*
|
|
|
|
* Update E-field, including any PMLs.
|
2017-08-24 11:28:03 -07:00
|
|
|
*
|
2016-09-01 14:39:44 -07:00
|
|
|
* Template parameters:
|
|
|
|
* common_header: Rendered contents of common.cl
|
2017-10-01 12:34:11 -07:00
|
|
|
* pmls: [{'axis': 'x', 'polarity': 'n', 'thickness': 8}, ...] list of pml dicts containing
|
|
|
|
axes, polarities, and thicknesses.
|
2017-08-24 11:28:03 -07:00
|
|
|
*
|
2016-09-01 14:39:44 -07:00
|
|
|
* OpenCL args:
|
|
|
|
* E, H, dt, eps, [p{01}e{np}, Psi_{xyz}{np}_E]
|
|
|
|
*/
|
|
|
|
|
|
|
|
{{common_header}}
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
__global ftype *epsx = eps + XX;
|
|
|
|
__global ftype *epsy = eps + YY;
|
|
|
|
__global ftype *epsz = eps + ZZ;
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Precalclate derivatives
|
|
|
|
*/
|
|
|
|
ftype dHxy = Hx[i] - Hx[i + my];
|
|
|
|
ftype dHxz = Hx[i] - Hx[i + mz];
|
|
|
|
|
|
|
|
ftype dHyx = Hy[i] - Hy[i + mx];
|
|
|
|
ftype dHyz = Hy[i] - Hy[i + mz];
|
|
|
|
|
|
|
|
ftype dHzx = Hz[i] - Hz[i + mx];
|
|
|
|
ftype dHzy = Hz[i] - Hz[i + my];
|
|
|
|
|
|
|
|
/*
|
|
|
|
* PML Update
|
|
|
|
*/
|
|
|
|
// PML effects on E
|
|
|
|
ftype pExi = 0;
|
|
|
|
ftype pEyi = 0;
|
|
|
|
ftype pEzi = 0;
|
|
|
|
|
2017-10-01 12:34:11 -07:00
|
|
|
{% for pml in pmls -%}
|
|
|
|
{%- set r = pml['axis'] -%}
|
|
|
|
{%- set p = pml['polarity'] -%}
|
2016-09-01 14:39:44 -07:00
|
|
|
{%- set u, v = ['x', 'y', 'z'] | reject('equalto', r) -%}
|
|
|
|
{%- set psi = 'Psi_' ~ r ~ p ~ '_E' -%}
|
|
|
|
{%- if r != 'y' -%}
|
|
|
|
{%- set se, sh = '-', '+' -%}
|
|
|
|
{%- else -%}
|
|
|
|
{%- set se, sh = '+', '-' -%}
|
|
|
|
{%- endif -%}
|
|
|
|
|
2017-10-01 12:34:11 -07:00
|
|
|
pml_{{r ~ p}}_thickness = {{pml['thickness']}};
|
|
|
|
|
2016-09-01 14:39:44 -07:00
|
|
|
{%- if p == 'n' %}
|
|
|
|
|
2017-10-01 12:34:11 -07:00
|
|
|
if ( {{r}} < pml_{{r ~ p}_thickness ) {
|
2016-09-01 14:39:44 -07:00
|
|
|
const size_t ir = {{r}}; // index into pml parameters
|
|
|
|
|
|
|
|
{%- elif p == 'p' %}
|
|
|
|
|
2017-10-01 12:34:11 -07:00
|
|
|
if ( s{{r}} > {{r}} && {{r}} >= s{{r}} - pml_{{r ~ p}_thickness ) {
|
2016-09-01 14:39:44 -07:00
|
|
|
const size_t ir = (s{{r}} - 1) - {{r}}; // index into pml parameters
|
|
|
|
|
|
|
|
{%- endif %}
|
|
|
|
const size_t ip = {{v}} + {{u}} * s{{v}} + ir * s{{v}} * s{{u}}; // linear index into Psi
|
|
|
|
{{psi ~ u}}[ip] = p0e{{p}}[ir] * {{psi ~ u}}[ip] + p1e{{p}}[ir] * dH{{v ~ r}};
|
|
|
|
{{psi ~ v}}[ip] = p0e{{p}}[ir] * {{psi ~ v}}[ip] + p1e{{p}}[ir] * dH{{u ~ r}};
|
|
|
|
pE{{u}}i {{se}}= {{psi ~ u}}[ip];
|
|
|
|
pE{{v}}i {{sh}}= {{psi ~ v}}[ip];
|
|
|
|
}
|
|
|
|
{%- endfor %}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Update E
|
|
|
|
*/
|
|
|
|
Ex[i] += dt / epsx[i] * (dHzy - dHyz + pExi);
|
|
|
|
Ey[i] += dt / epsy[i] * (dHxz - dHzx + pEyi);
|
|
|
|
Ez[i] += dt / epsz[i] * (dHyx - dHxy + pEzi);
|