File: Multilayers.tex

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (835 lines) | stat: -rw-r--r-- 34,751 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%%   BornAgain Developers Reference
%%
%%   homepage:   http://www.bornagainproject.org
%%
%%   copyright:  Forschungszentrum Jülich GmbH 2015-
%%
%%   license:    Creative Commons CC-BY-SA
%%
%%   authors:    Scientific Computing Group at MLZ Garching
%%   editor:     Joachim Wuttke
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\chapter{Flat multilayer systems}\label{sec:Multilayers}%
\index{Multilayer|(}%
\index{Layered structure|see{Multilayer}}

This chapter specializes the DWBA for a multilayer system with
$\overline{v}(\r)=\overline{v}(z)$.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Wave propagation and scattering in layered samples}\label{Swave21}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%===============================================================================
\subsection{Wave propagation in 2+1 dimensions}\label{Sgrazingwave}
%===============================================================================

We now specialize the results from~\cref{SSca} to wave propagation
in a sample that is, on average, translationally invariant in 2~dimensions.
Following standard convention,
we choose the surface of the sample in the $xy$~plane,
\index{Sample plane}%
and its normal along~$z$.
\index{Sample normal}%
\nomenclature[2x020]{$x$}{Horizontal coordinate, in the sample plane}%
\nomenclature[2y020]{$y$}{Horizontal coordinate, in the sample plane}%
\nomenclature[2z020]{$z$}{Vertical coordinate, along the sample normal}%
\index{Horizontal plane}%
\index{Vertical direction}%
In visualizations, we will always represent the $xy$~plane as \E{horizontal},
and the $z$~axis as upward \E{vertical},
altough there are ``horizontal'' reflectometers
where the sample is upright to allow for a horizontal scattering plane.
\index{Reflectometer!vertical vs horizontal}%

Scattering from such systems will be studied in distorted-wave Born approximation.
To determine the neutron scattering cross section~\cref{Exsection},
we need to determine the incident and final wavefunctions
$\psi_\si$ and~$\psi_\sf$.
Vertical variations of the refractive index $n(z)$
\index{Refractive index!vertical variation}%
cause refraction and reflection.
\index{Glancing angle}%
\index{Refraction}%
\index{Reflection}%
For waves propagating at small glancing angles,
the reflectance can take any value between 0 and~1,
even though $1-n$ is only of the order $10^{-5}$ or smaller.
Such zeroth-order effects cannot be accounted for
by perturbative scattering theory.
Instead, we need to deal with refraction and reflection
from the onset, in the wave propagation equation.
Accordingly, the SLD decomposition~\cref{Edecompose} takes the form
\begin{equation}\label{Edecompose_z}
  v(\r) = \mv(z) + \delta v(\r),
\end{equation}
\index{Wave propagation!in multilayer|(}
and the unperturbed distorted wave equation~\cref{EDPsi0} becomes
\begin{equation}\label{EWaveZ}
  \left\{\Nabla^2+k(z)^2\right\}\psi(\r) = 0.
\end{equation}
Below and above the sample,
$k(z)=\text{const}$:
in these regions, $\psi(\r)$~is a superposition of plane waves.
The exciting wavefunction is
\begin{equation}\label{Epsiminus}
  \psi_\se(\r) = \e^{i\k_\plll\r_\plll+ik_{\perp\se}z},
\end{equation}
\nomenclature[0$\plll$]{$\plll$}{Parallel to the $xy$ sample plane}%
\nomenclature[0$\perp$]{$\perp$}{Normal to the $xy$ sample plane}%
\nomenclature[2k021\perp]{$k_\perp$}{Component of $\k$ along the sample normal}%
\nomenclature[2k041\plll]{$\k_\plll$}{Projection of $\k$ onto the sample plane}%
The subscripts $\plll$ and~$\perp$ refer to the sample $xy$ plane.
The wavevector components $\k_\plll$ and $k_{\perp}$ must fulfill
\begin{equation}
  k(z)^2=\k_\plll^2+k_{\perp}^2.
\end{equation}
\index{Wavenumber!vertical}%
\index{Vertical wavenumber}%
Continuity across the sample implies
\begin{equation}\label{Ekconst}
  \k_\plll = \text{const}.
\end{equation}
\index{Wavevector!horizontal}%
\index{Horizontal wavevector}%
From here on, we abbreviate
\begin{equation}\label{Dkappa}
  \kappa \coloneqq k_\perp.
\end{equation}
When the incident wave hits the sample,
it is wholly or partly reflected.
Therefore, the full the solution of~\cref{EWaveZ} in the half space
of the radiation source is
\begin{equation}\label{Eref1}
  \psi(\r) = \e^{i\k_\plll\r_\plll+i\kappa_\se z} +
      R\, \e^{i\k_\plll\r_\plll-i\kappa_\se z}
\end{equation}
with a complex reflection coefficient~$R$.
\index{Reflection!coefficient}%
The reflected flux is given by the re\-flect\-an\-ce $|R|^2$.
\index{Reflectance}%
\index{Flux!reflected}%
In the opposite halfspace, the solution of~\cref{EWaveZ} is simply
\begin{equation}\label{Etra1}
  \psi(\r) = T\, \e^{i\k_\plll\r_\plll+i\kappa_\se z}
\end{equation}
with a complex transmission coefficient~$T$.
The transmitted flux is given by the transmittance $|T|^2$.
\index{Transmittance}%
\index{Flux!transmitted}%
As before, subscript $\se$ stands for the exciting wave in vacuum outside the sample.

Within the sample, the wave equation~\cref{EWaveZ}
is solved by the factorization ansatz
\begin{equation}\label{Ekpar}
\psi(\r) = \e^{i \k_\plll\r_\plll} \phi(z).
\end{equation}
\nomenclature[1φ020 0z020]{$\phi(z)$}{$z$-dependent factor of $\psi(\r)$}%
The vertical wavefunction~$\phi(z)$
is governed by the one-dimensional wave equation
\begin{equation}\label{Ewavez}
\left\{\partial_z^2 + k(z)^2 - k_\plll^2 \right\} \phi(z) = 0.
\end{equation}
As solution of a differential equation of second degree,
$\phi(z)$~can be written as superposition
of a downward travelling wave $\phi^-(z)$
and an upward travelling wave $\phi^+(z)$.
Accordingly, the three-dimensional wavefunction can be written as
\begin{equation}\label{Epsisumpm}
  \psi(\r) = \psi^-(\r)+\psi^+(\r).
\end{equation}
\nomenclature[1ψ041 0\pm 2r040]{$\psi^\pm(\r)$}{Upward ($+$) or downward ($-$) propagating component of $\psi(\r)$}%
\nomenclature[0\pm]{$\pm$}{Upward ($+$) or downward ($-$) propagating}%

%===============================================================================
\subsection{The four DWBA terms}\label{Sdwba4terms}
%===============================================================================

All the above holds not only for the incident wavefunction~$\psi_\si$,
but also for the wavefunction~$\psi_\sf$
that is tracked back from a detector pixel towards the sample.
Therefore the scattering matrix element
involves two incident and two final partial wavefunctions.
The resulting sum
\index{Wave propagation!in multilayer|)}
\begin{equation}\label{Edwba4}
  \braket{\psi_\si|\delta v|\psi_\sf}
  = \braket{\psi^-_\si|\delta v|\psi^-_\sf}
  + \braket{\psi^-_\si|\delta v|\psi^+_\sf}
  + \braket{\psi^+_\si|\delta v|\psi^-_\sf}
  + \braket{\psi^+_\si|\delta v|\psi^+_\sf}
\end{equation}
is depicted in \Cref{Fdwba4terms}.
It can be written in an obvious shorthand notation
\begin{equation}\label{Edwba}
  \braket{\psi_\si|\delta v|\psi_\sf}
  = \sum_{\pm_\si} \sum_{\pm_\sf}
    \braket{\psi^\pm_\si|\delta v|\psi^\pm_\sf}.
\end{equation}
This equation contains the essence of
the DWBA for GISAS,
and is the base for all scattering models implemented in \BornAgain.
Since $\braket{\psi_\si|\delta v|\psi_\sf}$
appears as a squared modulus
in the differential cross section~\cref{Exsection},
the four terms of \cref{Edwba} can interfere with each other,
which adds to the complexity of GISAS patterns.

%--------------------------------------------------------------------------------
\begin{figure}[tb]
\begin{center}
\includegraphics[width=1\textwidth]{fig/drawing/dwba_4terms.ps}
\end{center}
\caption{The four terms in the DWBA scattering matrix element~\cref{Edwba}.
Note that this is a highly simplified visualization.
In particular, it does not show multiple reflections
of incoming or scattered radiation,
though they are properly accounted for by DWBA theory and by all simulation software.}
\label{Fdwba4terms}
\end{figure}
%--------------------------------------------------------------------------------

BornAgain supports multilayer samples
with refractive index discontinuities at layer interfaces.
Conventions for layer numbers and interface coordinates are introduced in~\Cref{Fdefz}.
\index{Coordinates!sample}%
\index{Interface!coordinate}%
\index{Multilayer!numbering}%
\index{Multilayer!coordinates}%
\index{Layer!index}%
\index{Numbering!layers}%
A sample has $N$ layers,
including the semi-infinite bottom and top layers.
Numbering is from top to bottom,
and from 0 to $N-1$ as imposed by the programming languages C$++$ and Python.
Each layer~$l$
\nomenclature[2l010]{$l$}{Layer index}%
has a constant refractive index $n_l$
\nomenclature[2k022 2l010]{$k_l$}{Wavenumber in layer~$l$}%
\nomenclature[2n020 2l010]{$n_l$}{Refractive index of layer~$l$}%
and a constant wavenumber $k_l\coloneqq K_\text{vac} n_l$.
Any up- or downward travelling solution of the wave equation shall be written
as a sum over partial wavefunctions,
\begin{equation}\label{Epsipmsuml}
  \psi^\pm(\r) = \sum_l \psi_l^\pm(\r),
\end{equation}
with the requirement
\begin{equation}\label{Epsipmloutside}
   \psi_l^\pm(\r) = 0 \text{~for $\r$ outside layer~$l$.}
\end{equation}
The DWBA matrix element~\cref{Edwba} then takes the form
\begin{equation}\label{Edwbal}
  \braket{\psi_\si|\delta v|\psi_\sf}
  = \sum_l \sum_{\pm_\si} \sum_{\pm_\sf}
    \braket{\psi^\pm_{\si l}|\delta v|\psi^\pm_{\sf l}}.
\end{equation}

%--------------------------------------------------------------------------------
\begin{figure}[tb]
\begin{center}
\includegraphics[width=0.4\textwidth]{fig/drawing/multilayer_z_conventions.ps}
\end{center}
\caption{Conventions for layer numbers and interface coordinates.
\index{Coordinates!sample}%
\index{Interface!coordinate}%
\index{Multilayer!numbering}%
\index{Multilayer!coordinates}%
\index{Layer!index}%
\index{Numbering!layers}%
A sample has $N$ layers,
including the semi-infinite bottom and top layers.
\nomenclature[2n120]{$N$}{A multilayer sample has $N$ layers, including the
  semi-infinite bottom and top layers}
Layers are numbered from top to bottom.
The top vacuum (or air) layer (which extends to $z\to+\infty$) has number~0,
the substrate (extending to $z\to-\infty$) is layer~$N-1$.
The parameter $z_l$
\nomenclature[2z020 2l010]{$z_l$}{Vertical
  coordinate at the top of layer~$l$ (at the bottom for $l=0$)}%
is the $z$ coordinate of the \E{top} interface of layer~$l$,
except for $z_0$ which is the coordinate of the \E{bottom} interface
of the air or vacuum layer~0.}
\label{Fdefz}
\end{figure}
%--------------------------------------------------------------------------------

%===============================================================================
\subsection{DWBA for layers with constant mean SLD}\label{SStep}
%===============================================================================

We now specialize to the case that $\mv(z)$ is a step function:
within each layer, $\mv(z)\eqqcolon v_l$ is constant.
Accordingly, within the layer, the directional neutron wavefunction~$\psi^\pm_l$
is a plane wave and factorizes as in~\cref{Ekpar}.
Its amplitude~$A_l^\pm$ is determined recursively
by Fresnel's transmission and reflection coefficients
\index{Fresnel coefficients}%
that are based on continuity conditions at the layer interfaces.
This will be elaborated in \Cref{Sacrolay}.
\index{Multilayer!refractive index profiles}%
\index{Layer!refractive index profiles}%
The vertical wavenumber is determined by \cref{Epsiminus} and~\cref{Ekconst},
\begin{equation}\label{Ekperpl}
  \kappa_l^\pm = \pm\sqrt{k_l^2 - k_\plll^2}.
\end{equation}
In the absence of absorption and above the critical angle,
wavevectors are real
so that we can describe the beam in terms of a glancing angle
\begin{equation}\label{Edef_alpha}
  \alpha_l\coloneqq \arctan(\kappa_l/k_{\plll}).
\end{equation}
Equivalently,
\begin{equation}\label{Ekplllncos}
  k_{\plll}=K n_l \cos\alpha_l.
\end{equation}
Since $k_{\plll}$ is constant across layers,
we have
\begin{equation}\label{ESnell}
  n_l \cos\alpha_l = \text{the same for all }l,
\end{equation}
which is Snell's refraction law.
\index{Refraction!Snell's law}
\index{Snell's law}
In general, however, the vertical wavenumber $\kappa_l$,
determined by $k_l$ and $k_\plll$ as per~\cref{Epsiminus},
can become imaginary (total reflection conditions) or complex (absorbing layer).
\index{Wavevector!complex}%
In these cases, glancing angles are no longer well defined,
and the geometric interpretation of~$\psi_l(\r)$ less obvious.
so that one has to fully rely on the algebraic formalism.

With the indicator function
\nomenclature[1χ032 2l010]{$\chi_l(z)$}{Indicates whether $z$ is in layer~$l$}%
\begin{equation}\label{Echildef}
  \chi_l(\r)\coloneqq\left\{\begin{array}{ll}
  1&\text{~if $z_l\le z \le z_{l+1}$,}\\[.2ex]
  0&\text{~otherwise,} \end{array}\right.
\end{equation}
the vertical wavefunction can be written
\begin{equation}\label{Ephizwj}
  \phi^\pm_l(z)=A^\pm_l\e^{\pm i\kappa_l(z-z_l)}\chi_l(z).
\end{equation}
\nomenclature[2a123 2w010 2l010 \pm]{$A^\pm_{wl}$}{Amplitude
  of the plane wave $\phi^\pm_{wl}(\r)$}%
The offset~$z_l$ has been included in the phase factor for later convenience.
\iffalse See \cref{Snokz} for the case of vanishing~$\kappa$.\fi

The DWBA transition matrix element~\cref{Edwba} is
\index{DWBA!multilayer}%
\begin{equation}\label{Edwba_ml0}
  \braket{\psi_\si|\delta v|\psi_\sf}
  = \sum_l \sum_{\pm_\si} \sum_{\pm_\sf}
    A^{\pm *}_{\si l} A^\pm_{\sf l}
     \delta v_l(\k^\pm_{\sf l}-\k^\pm_{\si l})
\end{equation}
with the Fourier transform of the SLD
restricted to layer~$l$
\begin{equation}\label{Echij}
  \delta v_l(\v{q})
  \coloneqq  \int_{z_l}^{z_{l-1}}\!\d z \int\!\d^2r_\plll\, \e^{i\v{q}\,\r}\delta v(\r)
  = \int\!\d^3r\, \e^{i\v{q}\,\r}\delta v(\r) \chi_l(z).
\end{equation}
\nomenclature[1δ00 2v030 2l010 2q040]{$\delta v_l(\v{q})$}{Fourier transform
of the SLD $\delta v(\r)$, evaluated in one sample layer}%
To alleviate later calculations,
we number the four DWBA terms from 1 to~4 as shown in \cref{Fdwba4terms},
and define the corresponding wavenumbers and amplitude factors and as
\begin{equation}\label{Eudef}
  \begin{array}{l@{\hspace{2em}}l}
    \q^1 \coloneqq  \k^+_\sf - \k^-_\si,& C^1 \coloneqq  A^{-*}_\si A^+_\sf, \\[.6ex]
    \q^2 \coloneqq  \k^-_\sf - \k^-_\si,& C^2 \coloneqq  A^{-*}_\si A^-_\sf, \\[.6ex]
    \q^3 \coloneqq  \k^+_\sf - \k^+_\si,& C^3 \coloneqq  A^{+*}_\si A^+_\sf, \\[.6ex]
    \q^4 \coloneqq  \k^-_\sf - \k^+_\si,& C^4 \coloneqq  A^{+*}_\si A^-_\sf.
  \end{array}
\end{equation}
Accordingly, we can write \cref{Edwba_ml0} as
\begin{equation}\label{Edwba_ml}
  \braket{\psi_\si|\delta v|\psi_\sf}
  = \sum_l \sum_{u} C^u_l \delta v_l(\q_l^u).
\end{equation}
Since $\k_\plll=\text{const}$,
 all wavevectors $\q^u_l$ have the same horizontal component~$\q_\plll$;
they differ only in their vertical component~$q^u_{l\perp}$.

%===============================================================================
\subsection{Wave amplitudes}\label{Sacrolay}
%===============================================================================

\index{Fresnel coefficients}%
\index{Transmission|see{Fresnel coefficients}}%
\index{Reflection|seealso {Fresnel coefficients}}%

The plane-wave amplitudes $A^\pm_{wl}$ need to be computed recursively
from layer to layer.
Since these computations are identical for incident and final waves,
we omit the subscript~$w$ in the remainder of this section.
At layer interfaces, the optical potential changes discontinuously.
From elementary quantum mechanics we know that
piecewise solutions of the Schrödinger equations must be connected
such that the wavefunction $\phi(\r)$ and its first derivative
$\Nabla\phi(\r)$ evolve continuously.

%--------------------------------------------------------------------------------
\begin{figure}[tb]
\begin{center}
\includegraphics[width=0.46\textwidth]{fig/drawing/multilayer_boundary.ps}
\end{center}
\caption{The transfer matrix $M_l$ connects the wavefunctions
\index{Transfer matrix}%
$\Phi_l$, $\Phi_{l-1}$ in adjacent layers.}
\label{Fboundary}
\end{figure}
%--------------------------------------------------------------------------------

To deal with the coordinate offsets introduced in \cref{Ephizwj},
we introduce the function%
\begin{equation}\label{Edldef}
  d_l\coloneqq z_l-z_{l+1},
\end{equation}
which is the thickness of layer~$l$,
except for $l=0$,
where the special definition of $z_0$ (\cref{Fdefz}) implies $d_0=0$.
We consider the interface between layers $l$ and $l-1$,
with~$l=1,\ldots,N-1$, as shown in \cref{Fboundary}.
This interface has the vertical coordinate $z_l=z_{l-1}-d_{l-1}$.
Accordingly, the continuity conditions at the interface are
\begin{equation}\label{Econtcond}
  \begin{array}{lcl}
 \hphantom{\partial_z}\phi_l(z_l) &=& \hphantom{\partial_z}\phi_{l-1}(z_{l-1}-d_{l-1}),\\
           \partial_z \phi_l(z_l) &=&           \partial_z \phi_{l-1}(z_{l-1}-d_{l-1}).
  \end{array}
\end{equation}
We define the phase factor
\begin{equation}\label{Ddell}
   \delta_l \coloneqq  \e^{i\kappa_l d_l}.
\end{equation}
Here and in the following, we will write the downward travelling transmitted
and of the upward travelling reflected amplitude as
\begin{equation}
  t_l \coloneqq A^-_l \quad\text{and}\quad r_l \coloneqq A^+_l.
\end{equation}
For the plane waves \cref{Ephizwj},
the continuity conditions~\cref{Econtcond} take the form
\begin{equation}\label{Econt2}
  \begin{array}{@{}l@{}lcl@{}l}
  \hphantom{+}t_l &\;+\;r_l
  &=&
  \hphantom{+}\delta_{l-1} t_{l-1} &\;+\; \delta_{l-1}^{-1} r_{l-1},
  \\[1.1ex]
  -\kappa_l t_l   &\;+\;  \kappa_l r_l
  &=&
  -\kappa_{l-1} \delta_{l-1} t_{l-1} &\;+\; \kappa_{l-1}\delta_{l-1}^{-1} r_{l-1} .
  \end{array}
\end{equation}
After some lines of linear algebra,
we can rewrite this equation system as
\begin{equation}\label{EcMc}
  \left( \begin{array}{c}t_{l-1}\\ r_{l-1}\end{array} \right)
  = M_l \left( \begin{array}{c}t_l\\r_l\end{array} \right)
\end{equation}
with the transfer matrix\footnote
{This approach is generally attributed to Abelès,
\index{Abelès matrix}%
who elaborated it in his thesis from 1949, published 1950.
The usually cited paper \cite{Abe50a} is no more than a short advertisement.}
\index{Transfer matrix}%
\begin{equation}\label{EMil}
  M_l \coloneqq \Delta_{l-1} S_l,
\end{equation}
which we write using the phase rotation matrix
\begin{equation}\label{DmatD}
  \Delta_l
   \coloneqq
   \left(\begin{array}{cc}
     \delta_{l}^{-1}&0\\
       0 & \delta_{l}
   \end{array}\right)
\end{equation}
and the refraction matrix
\begin{equation}\label{DmatS}
  S_l
   \coloneqq
   \left(\begin{array}{cc}
       s^+_l&s^-_l\\
       s^-_l&s^+_l
   \end{array}\right)
\end{equation}
with coefficients
\begin{equation}\label{Dslpm}
  s^\pm_l \coloneqq \frac{1 \pm \kappa_l/\kappa_{l-1}}{2}.
\end{equation}
Energy conservation can be easily verified for real-valued wave numbers.
The vertical flux is $J=|\Phi|^2\kappa$.
Under the action of either $\Delta$ or S,
\begin{equation}\label{EConservation}
  \kappa_l (|t_l|^2 - |r_l|^2) = \text{const for all~$l$}.
\end{equation}

%===============================================================================
\subsection{Wave amplitudes for X-rays}\label{SmulayX}
%===============================================================================

\def\Ep{\v{\Phi}}
\def\hn{\v{n}}

We shall now translate the above results from unpolarized neutrons to X-rays.
The vectorial amplitude of the electromagnetic field will require
nontrivial modifications.
In place of the factorization~\cref{Ekpar}, we write
\begin{equation}
  \v{E}(\r)=\e^{i\k_\plll\r}\Ep(z).
\end{equation}
In place of~\cref{Ephizwj},
the vertical wavefunction is
\begin{equation}
  \Ep^\pm_l(z) = \v{A}^\pm_l \e^{\pm i\kappa(z-z_l)}\chi_l(z).
\end{equation}

%--------------------------------------------------------------------------------
\begin{figure}[tb]
\begin{center}
\includegraphics[width=0.8\textwidth]{fig/drawing/s-vs-p-polarization.ps}
\end{center}
\caption{Conventions for polarization directions relative to a refracting interface:
\index{Polarization!X-ray@X-ray ($s$ and $p$)}%
\index{X-ray!polarization}%
For $s$ polarization, the electric field vector~$\v{E}$ is perpendicular (\E{senkrecht} in German)
 to the plane spanned by the interface normal~$\hn$ and the incoming~wavevector~$\k$;
for $p$ polarization, it is parallel.
In either case, $\v{E}$ is perpendicular to~$\k$.}
\label{Fsppol}
\end{figure}
%--------------------------------------------------------------------------------

The vectorial character of $\v{A}^\pm_{wl}$ will require changes
with respect to~\cref{Sacrolay}.
For electromagnetic radiation in nonmagnetic media,
the boundary conditions at an interface with normal $\hn$ are \cite[eq. 7.37]{Jac75}
% , Born \& Wolf \cite[ch.~1.1.3]{BoWo99}, or Hecht \cite[ch.~4.6.1]{Hec02}.}
\nomenclature[2n04]{$\hn$}{Normal vector of an interface}
\begin{align}
  &\sum_\pm\,\overline{\epsilon}\,\v{E}^\pm\,\hn = \text{const}, \label{EbcE1}\\[1.4ex]
  &\sum_\pm\,\v{E}^\pm\times\hn = \text{const}, \label{EbcE2}\\[1.4ex]
  &\sum_\pm\,\k^\pm_l\times\v{E}^\pm = \text{const}. \label{EbcE3}
\end{align}
We will only consider the two polarization directions,
\index{Polarization!X-ray@X-ray ($s$ and $p$)|(}%
\index{X-ray!polarization|(}%
conventionally designated as $p$ and~$s$, defined in \Cref{Fsppol}.
As some algebra on \cref{EbcE1,EbcE2,EbcE3} would show,
these are \E{principal axes},
meaning that if both incoming fields $\v{E}^-_{l-1}$ and~$\v{E}^+_l$ are strictly
polarized in either $s$ or $p$ direction,
then the outgoing fields $\v{E}^+_{l-1}$ and~$\v{E}^-_l$
are polarized in the same direction.
Conversely, if the incoming fields are mixtures of $s$ and $p$ polarization,
then the outgoing fields will be, in general, mixed differently.
Therefore if polarization factors are quantitatively important in an experiment,
one should strive to accurately polarize the incident beam in $s$ or $p$ direction
in order to avoid the extra complication of variably mixed polarizations.

Further algebra on \cref{EbcE1,EbcE2,EbcE3} replicates the
reflection law that relates $\k^-$ and $k^+$
and Snell's law~\cref{ESnell}.
Taking these for granted,
we only retain equations that are needed to determine the field amplitudes~$E^\pm$.
For $s$~polarization they yield
\begin{equation}
  \left(\begin{array}{cc}1&1\\
       -\kappa&\kappa\end{array}\right)
  \left(\begin{array}{c}E^-\\
       E^+\end{array}\right) = \text{const}.
\end{equation}
and for $p$~polarization
\begin{equation}
  \left(\begin{array}{cc}n&n\\
       -\kappa/n&\kappa/n\end{array}\right)
  \left(\begin{array}{c}E^-\\
       E^+\end{array}\right) = \text{const},
\end{equation}
The former equation can be brought into the form~\cref{Econt2}.
In consequence,
$s$-polarized X-rays are refracted and reflected in
exactly the same ways as unpolarized neutrons.

For $p$ polarization,
the refraction matrix coefficients become
\begin{equation}
  s_l^\pm = \frac{1}{2}
       \left(\frac{n_l}{n_{l-1}} \pm \frac{\kappa_l}{\kappa_{l-1}}\frac{n_{l-1}}{n_l}\right)
\end{equation}
instead of \cref{Dslpm}.\footnote
{Support for $p$ polarization is not implemented in BornAgain.
It can be added easily if there is need.}
\index{Polarization!X-ray@X-ray ($s$ and $p$)|)}%
\index{X-ray!polarization|)}%

%===============================================================================
\subsection{Scattering of X-rays}\label{SscatterX}
%===============================================================================

The DWBA matrix element is
\begin{equation}\label{Edwba_mlE}
  \braket{\v{E}_\si|\delta v|\v{E}_\sf}
  = \sum_l \sum_{u} C^u_l \delta v_l(\q_l^u).
\end{equation}
in full analogy with~\cref{Edwba_ml},
but the coefficients
$C^1=\v{A}^{-*}_\si\v{A}^{+}_\sf$ etc are now scalar products
of vectorial amplitudes.
For $s$~polarization all amplitudes point in the same direction,
so that we are back to the products of scalar factors of~\cref{Eudef}.
For $p$~polarization,
incident and scattered field amplitudes point in slightly different directions,
which results in correction factors\footnote
{Also currently not implemented in BornAgain.}
\begin{equation}\label{Edwbap}
  \begin{array}{@{}lcl}
    C^1 &=& A^{-*}_\si A^+_\sf\cos(\alpha^{-}_\si+\alpha^+_\sf),\\
    C^2 &=& A^{-*}_\si A^-_\sf\cos(\alpha^{-}_\si+\alpha^-_\sf),\\
    C^3 &=& A^{+*}_\si A^+_\sf\cos(\alpha^{+}_\si+\alpha^+_\sf),\\
    C^4 &=& A^{+*}_\si A^-_\sf\cos(\alpha^{+}_\si+\alpha^-_\sf).
  \end{array}
\end{equation}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Solution of the split boundary problem}\label{Ssolvsplit}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%==================================================================================================%
\subsection{The split boundary problem}\label{Ssplibou}
%==================================================================================================%

We now consider beam propagation through the entire multilayer sample,
from the semiinfinite top layer at $l=0$ to the semiinfinite substrate at $l=N-1$,
which for brevity shall be denoted by $\nu\coloneqq N-1$.

Let us assume that the radiation source or sink is located at $z>0$.
Then in the top layer, $t_0 =1$ is given by the
incident or back-traced final plane wave.
In the substrate, $t_{\nu} =0$ because there is no radiation
coming from $z\to-\infty$.
This leaves us with two unkown amplitudes,
the overall coefficients of transmission~$t_{\nu}$ and reflection~$r_0$.
These two unknowns are connected by a system of two linear equations,
\begin{equation}\label{E1Ap}
  \left( \begin{array}{c}1\\ r_0\end{array} \right)
  = M \left( \begin{array}{c}t_{\nu}\\0\end{array} \right)
\end{equation}
with the matrix product
\begin{equation}\label{DM22}
  M \coloneqq M_1 \cdots M_{\nu}
   \eqqcolon
   \begin{pmatrix} M_{tt} &M_{tr}\\ M_{rt} &M_{rr}\end{pmatrix}.
\end{equation}
To apply this and all the following to the scattered beam in transmission GISAS
\index{Transmission geometry}%
\index{Detector!transmission geometry}%
(sink location $z<0$),
we just reverse the order of layers:
$(0,\ldots, \nu) \mapsto (\nu,\ldots,0)$.

Equation~\cref{E1Ap} is a \emph{split boundary problem} because
the given amplitudes $t_0=1$, $r_\nu=0$ appear on different sides of the equation.
It can be reorganized as
\begin{equation}\label{EWif}
  \begin{pmatrix}{t_\nu}\\ {r_0}\end{pmatrix}
  = W \begin{pmatrix}{1}\\ {0}\end{pmatrix}
\end{equation}
with
\begin{equation}\label{EM2W}
  W = \mathcal{W}(M)
  \coloneqq \begin{pmatrix} {M_{tt}}^{-1} &{M_{tt}}^{-1}M_{tr}\\[.2em]
                     M_{rt}{M_{tt}}^{-1} &
                        (M_{rr}-M_{rt}{M_{tt}}^{-1}M_{tr}) \end{pmatrix}.
\end{equation}
% For later use, we note the inverse function
% \begin{equation}\label{EW2M}
%   M = \mathcal{M}(W)
%   = \begin{pmatrix}  (W_{tt}-W_{tr}{W_{rr}}^{-1}W_{rt}) & W_{tr}{W_{rr}}^{-1}\\[.2em]
%                      {W_{rr}}^{-1}W_{rt} &{W_{rr}}^{-1} \end{pmatrix}.
% \end{equation}
% This formalism, originally developed for dynamic X-ray diffraction \cite{Koh91,StKK98},
% holds also if the matrix components are not commutative under multiplication.
% This will allow us later (for polarized neutrons, \cref{SPol})
% to replace the scalar matrix components by $2\times2$ matrices.
%
From \cref{EWif} and \cref{EM2W}, we can read off
\begin{equation}\label{Etfri0J}
      t_\nu = M_{tt}^{-1} \quad\text{and}\quad r_0 = M_{rt} M_{tt}^{-1}.
\end{equation}
With this, the split boundary problem is formally solved.
However, the matrix product $M$ \cref{DM22} is numerically unstable
\cite[Sects.~III, IV]{StKK98}.
Therefore, the actual computation of $r_0$ and $t_\nu$ is done through
a recursion (\cref{Srt1,SParrattPol}).

If there is one single interface ($\nu=1$),
then $M=S_1$ yields the standard Fresnel results, namely the transmitted amplitude
\begin{equation}\label{EtFresnel}
  t_1 =\frac{2\kappa_0}{\kappa_0+\kappa_1}
\end{equation}
and the reflected amplitude
\begin{equation}\label{ErFresnel}
  r_0 =\frac{\kappa_0-\kappa_1}{\kappa_0+\kappa_1}.
\end{equation}
In connection with roughness models,
we will need to express the coefficients of the refraction matrix~\cref{DmatS}
through $t$ and~$r$,
\begin{equation}
  s_1^+ = \frac{1}{t_1} \quad\text{ and }\quad s_1^- = \frac{r_0}{t_1}.
\end{equation}

%==================================================================================================%
\subsection{Recursive solution}\label{Srt1}
%==================================================================================================%

As mentioned under \cref{Etfri0J},
the matrix product $M$ \cref{DM22} is numerically unstable
\cite[Sects.~III, IV]{StKK98}.
It is therefore preferable to solve the split boundary problem through
the recursion algorithm of Parratt \cite{Par54}.
\index{Parratt recursion!scalar}%
It is based on the insight that one does not need to compute $t_l$ and $r_l$ separately,
but only their ratio $x_l\coloneqq r_l/t_l$.
Spelling out~\cref{EcMc} with $\delta\coloneqq\delta_{l-1}$
and $s^\pm\coloneqq s^\pm_l$, we obtain
\begin{equation}\label{EParratt}
  x_{l-1} = \frac{\delta s^- + \delta s^+ x_l}{\delta^{-1}s^+ + \delta^{-1}s^- x_l}
         = \delta^{2}\frac{R+x_l}{1+Rx_l}.
\end{equation}
The second expression involves the single-interface Fresnel reflection coefficient
\begin{equation}
  R \coloneqq \frac{s^-}{s^+} = \frac{\kappa_{l-1}-\kappa_l}{\kappa_{l-1}+\kappa_l}.
\end{equation}
The recursion starts at the bottom with $x_{\nu}=0$.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Implementation}\label{SimplML}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Last updated to reflect the actual code in May 2023.

%===============================================================================
\subsection{Call chain}
%===============================================================================

{
\footnotesize
\parindent=0pt
\parskip=1ex
\flushleft

All simulations are run through the virtual function \T{ISimulation::runComputation}.

For classes \T{ScatteringSimulation} and \T{OffspecSimulation},\\
most work is done in \T{Compute::scattered\_and\_reflected},

for class \T{SpecularSimulation} in \T{Compute::reflectedIntensity},

whereas class \T{DepthprobeSimulation} performs the computation directly
in \T{runComputation}.

In function \T{Compute::scattered\_and\_reflected},\\
incoming and outgoing fluxes are obtained from functions
\T{ReSample::fluxesIn} and \T{fluxesOut},\\
and stored in instances of class \T{Fluxes},
which incarnates \T{OwningVector<IFlux>}.\\
Following that, scattering is computed by
functions \T{Compute::dwbaContribution} and
 \T{Compute::roughMultiLayerContribution}.\\
Specular intensity is added to the appropriate detector pixel by function
\T{Compute::gisasSpecularContribution}.

In \T{DepthprobeSimulation::runComputation}, incoming fluxes are obtained
from function \T{ReSample::fluxesIn}.

In functions \T{ReSample::fluxesIn} and \T{fluxesOut} call either
\T{Compute::SpecularScalar::fluxes} or \T{Compute::SpecularMagnetic::fluxes}.

For specular simulations, function \T{Compute::reflectedIntensity}
calls either \T{Compute::SpecularScalar::topLayerR} or \T{Compute::SpecularMagnetic::topLayerR}.
These functions only return amplitudes reflected from the top of the sample,
whereas the \T{fluxes} functions called for scattering or depthprobe simulation
compute up and down travelling amplitudes for each sample layer.

Functions \T{fluxes} and \T{topLayerR} are implemented
in files \SRC{Resample/Specular}{ComputeFluxScalar.cpp} and
\SRC{Resample/Specular}{ComputeFluxMagnetic.cpp},
where they share some local functions.
}

%===============================================================================
\subsection{Scalar fluxes}
%===============================================================================

The core numeric algorithm for the scalar flux computation is
implemented in \SRC{Resample/Specular}{ComputeFluxScalar.cpp}.
Here the code is simplified by omitting roughness and transmission geometry.
The code uses class \T{Spinor}, which has components \T{u} and \T{v},
here representing transmitted and reflected amplitude.
Interfaces are numbered as in~\cref{Fdefz}.

\begin{lstlisting}[language=c++, style=eclipseboxed, escapechar=|, style=footnotesize]
std::vector<Spinor>
computeTR(SliceStack& slices, std::vector<cmplx>& kz)
{
    // Parratt algorithm, pass 1:
    //    compute t/t factors and r/t ratios from bottom to top.
    size_t N = slices.size();
    std::vector<cmplx> tfactor(N-1); // transmission damping
    std::vector<cmplx> ratio(N);     // Parratt's x=r/t
    ratio[N-1] = 0;
    for (size_t i = N-1; i > 0; i--) {
        cmplx slp = 1 + kz[i]/kz[i-1];
        cmplx slm = 1 - kz[i]/kz[i-1];
        cmplx delta = exp_I(kz[i-1] * slices[i-1].thicknessOr0());
        cmplx f = delta / (slp + slm * ratio[i]);
        tfactor[i-1] = 2 * f;
        ratio[i-1] = delta * (slm + slp * ratio[i]) * f;
    }

    // Parratt algorithm, pass 2:
    //    compute r and t from top to bottom.
    std::vector<Spinor> TR(N);
    TR[0] = Spinor(1., ratio[0]);
    for (size_t i = 1; i < N; ++i) {
        TR[i].u = TR[i-1].u * tfactor[i-1]; // Spinor.u is t|\label{Lti}|
        TR[i].v = ratio[i] * TR[i].u;       // Spinor.v is r|\label{Lri}|
    }

    return TR;
}
\end{lstlisting}

The are two code blocks, each with a loop over interfaces.
The first loop runs from bottom $l=\nu$ to top $l=1$.
Variables \T{slp} and \T{slm} are the coefficients $s^\pm_l$ of~\cref{Dslpm}.
Variable \T{delta} is $\delta_{l-1}$ as defined in~\cref{Ddell}.
These are used for recursively computing transmission damping factors
\begin{equation}
  h_{l-1} \coloneqq \frac{2\delta_{l-1}}{s^+_l + s^-_l x_{l}}
\end{equation}
and Parratt ratios \cref{EParratt}
\begin{equation}
  x_{l-1} = \delta_{l-1} \frac{s^-_l+ s^+_l x_{l}}{2} h_{l-1}
         =  \delta_{l-1}^2 \frac{s^-_l+ s^+_l x_{l}}{s^+_l + s^-_l x_{l}},
\end{equation}
starting from the bottom value $x_\nu=0$.
The second loop starts from the top where $t_0=1$, $r_0=0$.
From~\cref{EcMc},
\begin{equation}
  t_{l-1} = \delta^{-1}\left(s^+ t_l + s^- r_l\right)
         = \frac{s^+ + s^- x_l}{\delta}t_l
         = h_{l-1}^{-1} t_l.
\end{equation}
Bringing $h_{l-1}$ to the other side, we obtain code~\cref{Lti}.
By definition, $x_l=r_l/t_l$.
Bringing $t_l$ to the other side, we obtain code~\cref{Lri}.

\index{Multilayer|)}%