ElectroMagneticPython 2.1.4__tar.gz → 2.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/RCWA.py +268 -276
  2. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/__init__.py +0 -4
  3. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/devices.py +6 -7
  4. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/materials.py +0 -1
  5. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/modesolvers/FD.py +1 -15
  6. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/modesolvers/FMM.py +0 -57
  7. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/modesolvers/geometries.py +0 -2
  8. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/modesolvers/interface.py +0 -2
  9. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/transfer_matrix.py +82 -87
  10. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/utils.py +0 -6
  11. electromagneticpython-2.2.1/EMpy/version.py +1 -0
  12. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/ElectroMagneticPython.egg-info/PKG-INFO +25 -8
  13. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/PKG-INFO +25 -8
  14. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/README.rst +20 -6
  15. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_transfer_matrix.py +5 -5
  16. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/requirements.txt +14 -16
  17. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/setup.py +1 -1
  18. ElectroMagneticPython-2.1.4/EMpy/version.py +0 -1
  19. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/constants.py +0 -0
  20. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/modesolvers/__init__.py +0 -0
  21. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/EMpy/scattering.py +0 -0
  22. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/ElectroMagneticPython.egg-info/SOURCES.txt +0 -0
  23. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/ElectroMagneticPython.egg-info/dependency_links.txt +0 -0
  24. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/ElectroMagneticPython.egg-info/requires.txt +0 -0
  25. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/ElectroMagneticPython.egg-info/top_level.txt +0 -0
  26. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/LICENSE +0 -0
  27. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/MANIFEST.in +0 -0
  28. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_APRR.py +0 -0
  29. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_NRR.py +0 -0
  30. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_RCWA.py +0 -0
  31. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_RCWA_2.py +0 -0
  32. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_RCWA_3.py +0 -0
  33. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_SRR.py +0 -0
  34. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_laser_etch_monitor.py +0 -0
  35. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_modesolver.py +0 -0
  36. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_modesolver_2.py +0 -0
  37. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_modesolver_3.py +0 -0
  38. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_modesolver_4.py +0 -0
  39. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_modesolver_dch.py +0 -0
  40. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_modesolver_dch_anis.py +0 -0
  41. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_transfer_matrix_2.py +0 -0
  42. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/ex_transfer_matrix_3.py +0 -0
  43. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/lc_data.dat +0 -0
  44. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/examples/nk.py +0 -0
  45. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/setup.cfg +0 -0
  46. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/tests/__init__.py +0 -0
  47. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/tests/materials_test.py +0 -0
  48. {ElectroMagneticPython-2.1.4 → electromagneticpython-2.2.1}/tests/utils_test.py +0 -0
@@ -14,7 +14,7 @@ one, only stable for low diffraction orders and thin layers.
14
14
  """
15
15
  __author__ = "Lorenzo Bolla"
16
16
 
17
- import scipy as S
17
+ import numpy as np
18
18
  from scipy.linalg import toeplitz, inv, eig, solve as linsolve
19
19
  from numpy import pi
20
20
 
@@ -41,7 +41,7 @@ def dispersion_relation_ordinary(kx, ky, k, nO):
41
41
  raise ValueError("kx and ky must have the same length")
42
42
 
43
43
  delta = (k * nO) ** 2 - (kx**2 + ky**2)
44
- kz = S.sqrt(delta)
44
+ kz = np.sqrt(delta)
45
45
 
46
46
  # Adjust sign of real/imag part
47
47
  kz.real = abs(kz.real)
@@ -65,15 +65,14 @@ def dispersion_relation_extraordinary(kx, ky, k, nO, nE, c):
65
65
  "kx and ky must have the same length and c must have 3 components"
66
66
  )
67
67
 
68
- kz = S.empty_like(kx)
68
+ kz = np.empty_like(kx)
69
69
 
70
70
  for ii in range(0, kx.size):
71
-
72
71
  alpha = nE**2 - nO**2
73
72
  beta = kx[ii] / k * c[0] + ky[ii] / k * c[1]
74
73
 
75
74
  # coeffs
76
- C = S.array(
75
+ C = np.array(
77
76
  [
78
77
  nO**2 + c[2] ** 2 * alpha,
79
78
  2.0 * c[2] * beta * alpha,
@@ -84,13 +83,13 @@ def dispersion_relation_extraordinary(kx, ky, k, nO, nE, c):
84
83
  )
85
84
 
86
85
  # two solutions of type +x or -x, purely real or purely imag
87
- tmp_kz = k * S.roots(C)
86
+ tmp_kz = k * np.roots(C)
88
87
 
89
88
  # get the negative imaginary part or the positive real one
90
- if S.any(S.isreal(tmp_kz)):
91
- kz[ii] = S.absolute(tmp_kz[0])
89
+ if np.any(np.isreal(tmp_kz)):
90
+ kz[ii] = np.absolute(tmp_kz[0])
92
91
  else:
93
- kz[ii] = -1j * S.absolute(tmp_kz[0])
92
+ kz[ii] = -1j * np.absolute(tmp_kz[0])
94
93
 
95
94
  return kz
96
95
 
@@ -146,7 +145,7 @@ class RCWA:
146
145
  def get_pitch(self):
147
146
  """Inspect the multilayer to check that all the binary
148
147
  gratings present have the same pitch, and return it."""
149
- idx = S.where(
148
+ idx = np.where(
150
149
  [
151
150
  (
152
151
  isinstance(m, BinaryGrating)
@@ -161,8 +160,8 @@ class RCWA:
161
160
  return 1.0 # return LAMBDA: any value will do
162
161
  else:
163
162
  # check that all the pitches are the same!
164
- l = S.asarray([self.multilayer[i].pitch for i in idx])
165
- if not S.all(l == l[0]):
163
+ l = np.asarray([self.multilayer[i].pitch for i in idx])
164
+ if not np.all(l == l[0]):
166
165
  raise ValueError("All the BinaryGratings must have the same pitch.")
167
166
  else:
168
167
  return l[0]
@@ -193,7 +192,7 @@ class IsotropicRCWA(RCWA):
193
192
  matrix approach", JOSA A, 12(5), 1995
194
193
  """
195
194
 
196
- self.wls = S.atleast_1d(wls)
195
+ self.wls = np.atleast_1d(wls)
197
196
 
198
197
  LAMBDA = self.LAMBDA
199
198
  n = self.n
@@ -204,37 +203,36 @@ class IsotropicRCWA(RCWA):
204
203
  phi = self.phi
205
204
 
206
205
  nlayers = len(multilayer)
207
- i = S.arange(-n, n + 1)
206
+ i = np.arange(-n, n + 1)
208
207
  nood = 2 * n + 1
209
208
  hmax = nood - 1
210
209
 
211
210
  # grating vector (on the xz plane)
212
211
  # grating on the xy plane
213
- K = 2 * pi / LAMBDA * S.array([S.sin(phi), 0.0, S.cos(phi)], dtype=complex)
212
+ K = 2 * pi / LAMBDA * np.array([np.sin(phi), 0.0, np.cos(phi)], dtype=complex)
214
213
 
215
- DE1 = S.zeros((nood, self.wls.size))
216
- DE3 = S.zeros_like(DE1)
214
+ DE1 = np.zeros((nood, self.wls.size))
215
+ DE3 = np.zeros_like(DE1)
217
216
 
218
- dirk1 = S.array(
219
- [S.sin(alpha) * S.cos(delta), S.sin(alpha) * S.sin(delta), S.cos(alpha)]
217
+ dirk1 = np.array(
218
+ [np.sin(alpha) * np.cos(delta), np.sin(alpha) * np.sin(delta), np.cos(alpha)]
220
219
  )
221
220
 
222
221
  # usefull matrices
223
- I = S.eye(i.size)
224
- I2 = S.eye(i.size * 2)
225
- ZERO = S.zeros_like(I)
222
+ I = np.eye(i.size)
223
+ I2 = np.eye(i.size * 2)
224
+ ZERO = np.zeros_like(I)
226
225
 
227
- X = S.zeros((2 * nood, 2 * nood, nlayers), dtype=complex)
228
- MTp1 = S.zeros((2 * nood, 2 * nood, nlayers), dtype=complex)
229
- MTp2 = S.zeros_like(MTp1)
226
+ X = np.zeros((2 * nood, 2 * nood, nlayers), dtype=complex)
227
+ MTp1 = np.zeros((2 * nood, 2 * nood, nlayers), dtype=complex)
228
+ MTp2 = np.zeros_like(MTp1)
230
229
 
231
- EPS2 = S.zeros(2 * hmax + 1, dtype=complex)
232
- EPS21 = S.zeros_like(EPS2)
230
+ EPS2 = np.zeros(2 * hmax + 1, dtype=complex)
231
+ EPS21 = np.zeros_like(EPS2)
233
232
 
234
233
  dlt = (i == 0).astype(int)
235
234
 
236
235
  for iwl, wl in enumerate(self.wls):
237
-
238
236
  # free space wavevector
239
237
  k = 2 * pi / wl
240
238
 
@@ -246,40 +244,40 @@ class IsotropicRCWA(RCWA):
246
244
 
247
245
  # all the other wavevectors
248
246
  tmp_x = k1[0] - i * K[0]
249
- tmp_y = k1[1] * S.ones_like(i)
247
+ tmp_y = k1[1] * np.ones_like(i)
250
248
  tmp_z = dispersion_relation_ordinary(tmp_x, tmp_y, k, n1)
251
- k1i = S.r_[[tmp_x], [tmp_y], [tmp_z]]
249
+ k1i = np.r_[[tmp_x], [tmp_y], [tmp_z]]
252
250
 
253
- # k2i = S.r_[[k1[0] - i*K[0]], [k1[1] - i * K[1]], [-i * K[2]]]
251
+ # k2i = np.r_[[k1[0] - i*K[0]], [k1[1] - i * K[1]], [-i * K[2]]]
254
252
 
255
253
  tmp_z = dispersion_relation_ordinary(tmp_x, tmp_y, k, n3)
256
- k3i = S.r_[[k1i[0, :]], [k1i[1, :]], [tmp_z]]
254
+ k3i = np.r_[[k1i[0, :]], [k1i[1, :]], [tmp_z]]
257
255
 
258
256
  # aliases for constant wavevectors
259
257
  kx = k1i[0, :]
260
258
  ky = k1[1]
261
259
 
262
260
  # angles of reflection
263
- # phi_i = S.arctan2(ky,kx)
264
- phi_i = S.arctan2(ky, kx.real) # OKKIO
261
+ # phi_i = np.arctan2(ky,kx)
262
+ phi_i = np.arctan2(ky, kx.real) # OKKIO
265
263
 
266
- Kx = S.diag(kx / k)
264
+ Kx = np.diag(kx / k)
267
265
  Ky = ky / k * I
268
- Z1 = S.diag(k1i[2, :] / (k * n1**2))
269
- Y1 = S.diag(k1i[2, :] / k)
270
- Z3 = S.diag(k3i[2, :] / (k * n3**2))
271
- Y3 = S.diag(k3i[2, :] / k)
272
- # Fc = S.diag(S.cos(phi_i))
273
- fc = S.cos(phi_i)
274
- # Fs = S.diag(S.sin(phi_i))
275
- fs = S.sin(phi_i)
276
-
277
- MR = S.asarray(
278
- S.bmat([[I, ZERO], [-1j * Y1, ZERO], [ZERO, I], [ZERO, -1j * Z1]])
266
+ Z1 = np.diag(k1i[2, :] / (k * n1**2))
267
+ Y1 = np.diag(k1i[2, :] / k)
268
+ Z3 = np.diag(k3i[2, :] / (k * n3**2))
269
+ Y3 = np.diag(k3i[2, :] / k)
270
+ # Fc = np.diag(np.cos(phi_i))
271
+ fc = np.cos(phi_i)
272
+ # Fs = np.diag(np.sin(phi_i))
273
+ fs = np.sin(phi_i)
274
+
275
+ MR = np.asarray(
276
+ np.bmat([[I, ZERO], [-1j * Y1, ZERO], [ZERO, I], [ZERO, -1j * Z1]])
279
277
  )
280
278
 
281
- MT = S.asarray(
282
- S.bmat([[I, ZERO], [1j * Y3, ZERO], [ZERO, I], [ZERO, 1j * Z3]])
279
+ MT = np.asarray(
280
+ np.bmat([[I, ZERO], [1j * Y3, ZERO], [ZERO, I], [ZERO, 1j * Z3]])
283
281
  )
284
282
 
285
283
  # internal layers (grating or layer)
@@ -287,7 +285,6 @@ class IsotropicRCWA(RCWA):
287
285
  MTp1.fill(0.0)
288
286
  MTp2.fill(0.0)
289
287
  for nlayer in range(nlayers - 2, 0, -1): # internal layers
290
-
291
288
  layer = multilayer[nlayer]
292
289
  d = layer.thickness
293
290
 
@@ -296,10 +293,10 @@ class IsotropicRCWA(RCWA):
296
293
  E = toeplitz(EPS2[hmax::-1], EPS2[hmax:])
297
294
  E1 = toeplitz(EPS21[hmax::-1], EPS21[hmax:])
298
295
  E11 = inv(E1)
299
- # B = S.dot(Kx, linsolve(E,Kx)) - I
300
- B = kx[:, S.newaxis] / k * linsolve(E, Kx) - I
301
- # A = S.dot(Kx, Kx) - E
302
- A = S.diag((kx / k) ** 2) - E
296
+ # B = np.dot(Kx, linsolve(E,Kx)) - I
297
+ B = kx[:, np.newaxis] / k * linsolve(E, Kx) - I
298
+ # A = np.dot(Kx, Kx) - E
299
+ A = np.diag((kx / k) ** 2) - E
303
300
 
304
301
  # Note: solution bug alfredo
305
302
  # randomizzo Kx un po' a caso finche' cond(A) e' piccolo (<1e10)
@@ -310,61 +307,59 @@ class IsotropicRCWA(RCWA):
310
307
  if cond(A) > 1e10:
311
308
  warning("BAD CONDITIONING: randomization of kx")
312
309
  while cond(A) > 1e10:
313
- Kx = Kx * (1 + 1e-9 * S.rand())
314
- B = kx[:, S.newaxis] / k * linsolve(E, Kx) - I
315
- A = S.diag((kx / k) ** 2) - E
316
-
317
- if S.absolute(K[2] / k) > 1e-10:
310
+ Kx = Kx * (1 + 1e-9 * np.rand())
311
+ B = kx[:, np.newaxis] / k * linsolve(E, Kx) - I
312
+ A = np.diag((kx / k) ** 2) - E
318
313
 
314
+ if np.absolute(K[2] / k) > 1e-10:
319
315
  raise ValueError(
320
316
  "First Order Helmholtz Operator not implemented, yet!"
321
317
  )
322
318
 
323
- elif ky == 0 or S.allclose(S.diag(Ky / ky * k), 1):
324
-
319
+ elif ky == 0 or np.allclose(np.diag(Ky / ky * k), 1):
325
320
  # lalanne
326
- # H_U_reduced = S.dot(Ky, Ky) + A
321
+ # H_U_reduced = np.dot(Ky, Ky) + A
327
322
  H_U_reduced = (ky / k) ** 2 * I + A
328
- # H_S_reduced = S.dot(Ky, Ky) + S.dot(Kx, linsolve(E, S.dot(Kx, E11))) - E11
323
+ # H_S_reduced = np.dot(Ky, Ky) + np.dot(Kx, linsolve(E, np.dot(Kx, E11))) - E11
329
324
  H_S_reduced = (
330
325
  (ky / k) ** 2 * I
331
- + kx[:, S.newaxis] / k * linsolve(E, kx[:, S.newaxis] / k * E11)
326
+ + kx[:, np.newaxis] / k * linsolve(E, kx[:, np.newaxis] / k * E11)
332
327
  - E11
333
328
  )
334
329
 
335
330
  q1, W1 = eig(H_U_reduced)
336
- q1 = S.sqrt(q1)
331
+ q1 = np.sqrt(q1)
337
332
  q2, W2 = eig(H_S_reduced)
338
- q2 = S.sqrt(q2)
333
+ q2 = np.sqrt(q2)
339
334
 
340
335
  # boundary conditions
341
336
 
342
- # V11 = S.dot(linsolve(A, W1), S.diag(q1))
343
- V11 = linsolve(A, W1) * q1[S.newaxis, :]
344
- V12 = (ky / k) * S.dot(linsolve(A, Kx), W2)
345
- V21 = (ky / k) * S.dot(linsolve(B, Kx), linsolve(E, W1))
346
- # V22 = S.dot(linsolve(B, W2), S.diag(q2))
347
- V22 = linsolve(B, W2) * q2[S.newaxis, :]
348
-
349
- # Vss = S.dot(Fc, V11)
350
- Vss = fc[:, S.newaxis] * V11
351
- # Wss = S.dot(Fc, W1) + S.dot(Fs, V21)
352
- Wss = fc[:, S.newaxis] * W1 + fs[:, S.newaxis] * V21
353
- # Vsp = S.dot(Fc, V12) - S.dot(Fs, W2)
354
- Vsp = fc[:, S.newaxis] * V12 - fs[:, S.newaxis] * W2
355
- # Wsp = S.dot(Fs, V22)
356
- Wsp = fs[:, S.newaxis] * V22
357
- # Wpp = S.dot(Fc, V22)
358
- Wpp = fc[:, S.newaxis] * V22
359
- # Vpp = S.dot(Fc, W2) + S.dot(Fs, V12)
360
- Vpp = fc[:, S.newaxis] * W2 + fs[:, S.newaxis] * V12
361
- # Wps = S.dot(Fc, V21) - S.dot(Fs, W1)
362
- Wps = fc[:, S.newaxis] * V21 - fs[:, S.newaxis] * W1
363
- # Vps = S.dot(Fs, V11)
364
- Vps = fs[:, S.newaxis] * V11
365
-
366
- Mc2bar = S.asarray(
367
- S.bmat(
337
+ # V11 = np.dot(linsolve(A, W1), np.diag(q1))
338
+ V11 = linsolve(A, W1) * q1[np.newaxis, :]
339
+ V12 = (ky / k) * np.dot(linsolve(A, Kx), W2)
340
+ V21 = (ky / k) * np.dot(linsolve(B, Kx), linsolve(E, W1))
341
+ # V22 = np.dot(linsolve(B, W2), np.diag(q2))
342
+ V22 = linsolve(B, W2) * q2[np.newaxis, :]
343
+
344
+ # Vss = np.dot(Fc, V11)
345
+ Vss = fc[:, np.newaxis] * V11
346
+ # Wss = np.dot(Fc, W1) + np.dot(Fs, V21)
347
+ Wss = fc[:, np.newaxis] * W1 + fs[:, np.newaxis] * V21
348
+ # Vsp = np.dot(Fc, V12) - np.dot(Fs, W2)
349
+ Vsp = fc[:, np.newaxis] * V12 - fs[:, np.newaxis] * W2
350
+ # Wsp = np.dot(Fs, V22)
351
+ Wsp = fs[:, np.newaxis] * V22
352
+ # Wpp = np.dot(Fc, V22)
353
+ Wpp = fc[:, np.newaxis] * V22
354
+ # Vpp = np.dot(Fc, W2) + np.dot(Fs, V12)
355
+ Vpp = fc[:, np.newaxis] * W2 + fs[:, np.newaxis] * V12
356
+ # Wps = np.dot(Fc, V21) - np.dot(Fs, W1)
357
+ Wps = fc[:, np.newaxis] * V21 - fs[:, np.newaxis] * W1
358
+ # Vps = np.dot(Fs, V11)
359
+ Vps = fs[:, np.newaxis] * V11
360
+
361
+ Mc2bar = np.asarray(
362
+ np.bmat(
368
363
  [
369
364
  [Vss, Vsp, Vss, Vsp],
370
365
  [Wss, Wsp, -Wss, -Wsp],
@@ -374,52 +369,51 @@ class IsotropicRCWA(RCWA):
374
369
  )
375
370
  )
376
371
 
377
- x = S.r_[S.exp(-k * q1 * d), S.exp(-k * q2 * d)]
372
+ x = np.r_[np.exp(-k * q1 * d), np.exp(-k * q2 * d)]
378
373
 
379
- # Mc1 = S.dot(Mc2bar, S.diag(S.r_[S.ones_like(x), x]))
380
- xx = S.r_[S.ones_like(x), x]
381
- Mc1 = Mc2bar * xx[S.newaxis, :]
374
+ # Mc1 = np.dot(Mc2bar, np.diag(np.r_[np.ones_like(x), x]))
375
+ xx = np.r_[np.ones_like(x), x]
376
+ Mc1 = Mc2bar * xx[np.newaxis, :]
382
377
 
383
- X[:, :, nlayer] = S.diag(x)
378
+ X[:, :, nlayer] = np.diag(x)
384
379
 
385
380
  MTp = linsolve(Mc2bar, MT)
386
381
  MTp1[:, :, nlayer] = MTp[0 : 2 * nood, :]
387
382
  MTp2 = MTp[2 * nood :, :]
388
383
 
389
- MT = S.dot(
384
+ MT = np.dot(
390
385
  Mc1,
391
- S.r_[
386
+ np.r_[
392
387
  I2,
393
- S.dot(MTp2, linsolve(MTp1[:, :, nlayer], X[:, :, nlayer])),
388
+ np.dot(MTp2, linsolve(MTp1[:, :, nlayer], X[:, :, nlayer])),
394
389
  ],
395
390
  )
396
391
 
397
392
  else:
398
-
399
393
  ValueError("Second Order Helmholtz Operator not implemented, yet!")
400
394
 
401
- # M = S.asarray(S.bmat([-MR, MT]))
402
- M = S.c_[-MR, MT]
403
- b = S.r_[
404
- S.sin(psi) * dlt,
405
- 1j * S.sin(psi) * n1 * S.cos(alpha) * dlt,
406
- -1j * S.cos(psi) * n1 * dlt,
407
- S.cos(psi) * S.cos(alpha) * dlt,
395
+ # M = np.asarray(np.bmat([-MR, MT]))
396
+ M = np.c_[-MR, MT]
397
+ b = np.r_[
398
+ np.sin(psi) * dlt,
399
+ 1j * np.sin(psi) * n1 * np.cos(alpha) * dlt,
400
+ -1j * np.cos(psi) * n1 * dlt,
401
+ np.cos(psi) * np.cos(alpha) * dlt,
408
402
  ]
409
403
 
410
404
  x = linsolve(M, b)
411
- R, T = S.split(x, 2)
412
- Rs, Rp = S.split(R, 2)
405
+ R, T = np.split(x, 2)
406
+ Rs, Rp = np.split(R, 2)
413
407
  for ii in range(1, nlayers - 1):
414
- T = S.dot(linsolve(MTp1[:, :, ii], X[:, :, ii]), T)
415
- Ts, Tp = S.split(T, 2)
408
+ T = np.dot(linsolve(MTp1[:, :, ii], X[:, :, ii]), T)
409
+ Ts, Tp = np.split(T, 2)
416
410
 
417
- DE1[:, iwl] = (k1i[2, :] / (k1[2])).real * S.absolute(Rs) ** 2 + (
411
+ DE1[:, iwl] = (k1i[2, :] / (k1[2])).real * np.absolute(Rs) ** 2 + (
418
412
  k1i[2, :] / (k1[2] * n1**2)
419
- ).real * S.absolute(Rp) ** 2
420
- DE3[:, iwl] = (k3i[2, :] / (k1[2])).real * S.absolute(Ts) ** 2 + (
413
+ ).real * np.absolute(Rp) ** 2
414
+ DE3[:, iwl] = (k3i[2, :] / (k1[2])).real * np.absolute(Ts) ** 2 + (
421
415
  k3i[2, :] / (k1[2] * n3**2)
422
- ).real * S.absolute(Tp) ** 2
416
+ ).real * np.absolute(Tp) ** 2
423
417
 
424
418
  # save the results
425
419
  self.DE1 = DE1
@@ -468,7 +462,7 @@ class AnisotropicRCWA(RCWA):
468
462
  and transmitted.
469
463
  """
470
464
 
471
- self.wls = S.atleast_1d(wls)
465
+ self.wls = np.atleast_1d(wls)
472
466
 
473
467
  LAMBDA = self.LAMBDA
474
468
  n = self.n
@@ -479,64 +473,63 @@ class AnisotropicRCWA(RCWA):
479
473
  phi = self.phi
480
474
 
481
475
  nlayers = len(multilayer)
482
- i = S.arange(-n, n + 1)
476
+ i = np.arange(-n, n + 1)
483
477
  nood = 2 * n + 1
484
478
  hmax = nood - 1
485
479
 
486
- DEO1 = S.zeros((nood, self.wls.size))
487
- DEO3 = S.zeros_like(DEO1)
488
- DEE1 = S.zeros_like(DEO1)
489
- DEE3 = S.zeros_like(DEO1)
480
+ DEO1 = np.zeros((nood, self.wls.size))
481
+ DEO3 = np.zeros_like(DEO1)
482
+ DEE1 = np.zeros_like(DEO1)
483
+ DEE3 = np.zeros_like(DEO1)
490
484
 
491
- c1 = S.array([1.0, 0.0, 0.0])
492
- c3 = S.array([1.0, 0.0, 0.0])
485
+ c1 = np.array([1.0, 0.0, 0.0])
486
+ c3 = np.array([1.0, 0.0, 0.0])
493
487
  # grating on the xy plane
494
- K = 2 * pi / LAMBDA * S.array([S.sin(phi), 0.0, S.cos(phi)], dtype=complex)
495
- dirk1 = S.array(
496
- [S.sin(alpha) * S.cos(delta), S.sin(alpha) * S.sin(delta), S.cos(alpha)]
488
+ K = 2 * pi / LAMBDA * np.array([np.sin(phi), 0.0, np.cos(phi)], dtype=complex)
489
+ dirk1 = np.array(
490
+ [np.sin(alpha) * np.cos(delta), np.sin(alpha) * np.sin(delta), np.cos(alpha)]
497
491
  )
498
492
 
499
493
  # D polarization vector
500
- u = S.array(
494
+ u = np.array(
501
495
  [
502
- S.cos(psi) * S.cos(alpha) * S.cos(delta) - S.sin(psi) * S.sin(delta),
503
- S.cos(psi) * S.cos(alpha) * S.sin(delta) + S.sin(psi) * S.cos(delta),
504
- -S.cos(psi) * S.sin(alpha),
496
+ np.cos(psi) * np.cos(alpha) * np.cos(delta) - np.sin(psi) * np.sin(delta),
497
+ np.cos(psi) * np.cos(alpha) * np.sin(delta) + np.sin(psi) * np.cos(delta),
498
+ -np.cos(psi) * np.sin(alpha),
505
499
  ]
506
500
  )
507
501
 
508
- kO1i = S.zeros((3, i.size), dtype=complex)
509
- kE1i = S.zeros_like(kO1i)
510
- kO3i = S.zeros_like(kO1i)
511
- kE3i = S.zeros_like(kO1i)
502
+ kO1i = np.zeros((3, i.size), dtype=complex)
503
+ kE1i = np.zeros_like(kO1i)
504
+ kO3i = np.zeros_like(kO1i)
505
+ kE3i = np.zeros_like(kO1i)
512
506
 
513
- Mp = S.zeros((4 * nood, 4 * nood, nlayers), dtype=complex)
514
- M = S.zeros((4 * nood, 4 * nood, nlayers), dtype=complex)
507
+ Mp = np.zeros((4 * nood, 4 * nood, nlayers), dtype=complex)
508
+ M = np.zeros((4 * nood, 4 * nood, nlayers), dtype=complex)
515
509
 
516
510
  dlt = (i == 0).astype(int)
517
511
 
518
512
  for iwl, wl in enumerate(self.wls):
519
-
520
513
  nO1 = nE1 = multilayer[0].mat.n(wl).item()
521
514
  nO3 = nE3 = multilayer[-1].mat.n(wl).item()
522
515
 
523
516
  # wavevectors
524
517
  k = 2 * pi / wl
525
518
 
526
- eps1 = S.diag(S.asarray([nE1, nO1, nO1]) ** 2)
527
- eps3 = S.diag(S.asarray([nE3, nO3, nO3]) ** 2)
519
+ eps1 = np.diag(np.asarray([nE1, nO1, nO1]) ** 2)
520
+ eps3 = np.diag(np.asarray([nE3, nO3, nO3]) ** 2)
528
521
 
529
522
  # ordinary wave
530
523
  abskO1 = k * nO1
531
524
  # abskO3 = k * nO3
532
525
  # extraordinary wave
533
- # abskE1 = k * nO1 *nE1 / S.sqrt(nO1**2 + (nE1**2 - nO1**2) * S.dot(-c1, dirk1)**2)
534
- # abskE3 = k * nO3 *nE3 / S.sqrt(nO3**2 + (nE3**2 - nO3**2) * S.dot(-c3, dirk1)**2)
526
+ # abskE1 = k * nO1 *nE1 / np.sqrt(nO1**2 + (nE1**2 - nO1**2) * np.dot(-c1, dirk1)**2)
527
+ # abskE3 = k * nO3 *nE3 / np.sqrt(nO3**2 + (nE3**2 - nO3**2) * np.dot(-c3, dirk1)**2)
535
528
 
536
529
  k1 = abskO1 * dirk1
537
530
 
538
531
  kO1i[0, :] = k1[0] - i * K[0]
539
- kO1i[1, :] = k1[1] * S.ones_like(i)
532
+ kO1i[1, :] = k1[1] * np.ones_like(i)
540
533
  kO1i[2, :] = -dispersion_relation_ordinary(kO1i[0, :], kO1i[1, :], k, nO1)
541
534
 
542
535
  kE1i[0, :] = kO1i[0, :]
@@ -555,23 +548,23 @@ class AnisotropicRCWA(RCWA):
555
548
  kE3i[0, :], kE3i[1, :], k, nO3, nE3, c3
556
549
  )
557
550
 
558
- # k2i = S.r_[[k1[0] - i * K[0]], [k1[1] - i * K[1]], [k1[2] - i * K[2]]]
559
- k2i = S.r_[[k1[0] - i * K[0]], [k1[1] - i * K[1]], [-i * K[2]]]
551
+ # k2i = np.r_[[k1[0] - i * K[0]], [k1[1] - i * K[1]], [k1[2] - i * K[2]]]
552
+ k2i = np.r_[[k1[0] - i * K[0]], [k1[1] - i * K[1]], [-i * K[2]]]
560
553
 
561
554
  # aliases for constant wavevectors
562
555
  kx = kO1i[0, :] # o kE1i(1,;), tanto e' lo stesso
563
556
  ky = k1[1]
564
557
 
565
558
  # matrices
566
- I = S.eye(nood, dtype=complex)
567
- ZERO = S.zeros((nood, nood), dtype=complex)
568
- Kx = S.diag(kx / k)
559
+ I = np.eye(nood, dtype=complex)
560
+ ZERO = np.zeros((nood, nood), dtype=complex)
561
+ Kx = np.diag(kx / k)
569
562
  Ky = ky / k * I
570
- Kz = S.diag(k2i[2, :] / k)
571
- KO1z = S.diag(kO1i[2, :] / k)
572
- KE1z = S.diag(kE1i[2, :] / k)
573
- KO3z = S.diag(kO3i[2, :] / k)
574
- KE3z = S.diag(kE3i[2, :] / k)
563
+ Kz = np.diag(k2i[2, :] / k)
564
+ KO1z = np.diag(kO1i[2, :] / k)
565
+ KE1z = np.diag(kE1i[2, :] / k)
566
+ KO3z = np.diag(kO3i[2, :] / k)
567
+ KE3z = np.diag(kE3i[2, :] / k)
575
568
 
576
569
  ARO = Kx * eps1[0, 0] + Ky * eps1[1, 0] + KO1z * eps1[2, 0]
577
570
  BRO = Kx * eps1[0, 1] + Ky * eps1[1, 1] + KO1z * eps1[2, 1]
@@ -597,7 +590,7 @@ class AnisotropicRCWA(RCWA):
597
590
  ETE = c3[2] * Kx - c3[0] * KE3z
598
591
  FTE = c3[0] * Ky - c3[1] * Kx
599
592
 
600
- b = S.r_[
593
+ b = np.r_[
601
594
  u[0] * dlt,
602
595
  u[1] * dlt,
603
596
  (k1[1] / k * u[2] - k1[2] / k * u[1]) * dlt,
@@ -605,18 +598,18 @@ class AnisotropicRCWA(RCWA):
605
598
  ]
606
599
  Ky_CRO_1 = ky / k * CRO_1
607
600
  Ky_CRE_1 = ky / k * CRE_1
608
- Kx_CRO_1 = kx[:, S.newaxis] / k * CRO_1
609
- Kx_CRE_1 = kx[:, S.newaxis] / k * CRE_1
610
- MR31 = -S.dot(Ky_CRO_1, ARO)
611
- MR32 = -S.dot(Ky_CRO_1, BRO) - KO1z
612
- MR33 = -S.dot(Ky_CRE_1, ARE)
613
- MR34 = -S.dot(Ky_CRE_1, BRE) - KE1z
614
- MR41 = S.dot(Kx_CRO_1, ARO) + KO1z
615
- MR42 = S.dot(Kx_CRO_1, BRO)
616
- MR43 = S.dot(Kx_CRE_1, ARE) + KE1z
617
- MR44 = S.dot(Kx_CRE_1, BRE)
618
- MR = S.asarray(
619
- S.bmat(
601
+ Kx_CRO_1 = kx[:, np.newaxis] / k * CRO_1
602
+ Kx_CRE_1 = kx[:, np.newaxis] / k * CRE_1
603
+ MR31 = -np.dot(Ky_CRO_1, ARO)
604
+ MR32 = -np.dot(Ky_CRO_1, BRO) - KO1z
605
+ MR33 = -np.dot(Ky_CRE_1, ARE)
606
+ MR34 = -np.dot(Ky_CRE_1, BRE) - KE1z
607
+ MR41 = np.dot(Kx_CRO_1, ARO) + KO1z
608
+ MR42 = np.dot(Kx_CRO_1, BRO)
609
+ MR43 = np.dot(Kx_CRE_1, ARE) + KE1z
610
+ MR44 = np.dot(Kx_CRE_1, BRE)
611
+ MR = np.asarray(
612
+ np.bmat(
620
613
  [
621
614
  [I, ZERO, I, ZERO],
622
615
  [ZERO, I, ZERO, I],
@@ -628,18 +621,18 @@ class AnisotropicRCWA(RCWA):
628
621
 
629
622
  Ky_CTO_1 = ky / k * CTO_1
630
623
  Ky_CTE_1 = ky / k * CTE_1
631
- Kx_CTO_1 = kx[:, S.newaxis] / k * CTO_1
632
- Kx_CTE_1 = kx[:, S.newaxis] / k * CTE_1
633
- MT31 = -S.dot(Ky_CTO_1, ATO)
634
- MT32 = -S.dot(Ky_CTO_1, BTO) - KO3z
635
- MT33 = -S.dot(Ky_CTE_1, ATE)
636
- MT34 = -S.dot(Ky_CTE_1, BTE) - KE3z
637
- MT41 = S.dot(Kx_CTO_1, ATO) + KO3z
638
- MT42 = S.dot(Kx_CTO_1, BTO)
639
- MT43 = S.dot(Kx_CTE_1, ATE) + KE3z
640
- MT44 = S.dot(Kx_CTE_1, BTE)
641
- MT = S.asarray(
642
- S.bmat(
624
+ Kx_CTO_1 = kx[:, np.newaxis] / k * CTO_1
625
+ Kx_CTE_1 = kx[:, np.newaxis] / k * CTE_1
626
+ MT31 = -np.dot(Ky_CTO_1, ATO)
627
+ MT32 = -np.dot(Ky_CTO_1, BTO) - KO3z
628
+ MT33 = -np.dot(Ky_CTE_1, ATE)
629
+ MT34 = -np.dot(Ky_CTE_1, BTE) - KE3z
630
+ MT41 = np.dot(Kx_CTO_1, ATO) + KO3z
631
+ MT42 = np.dot(Kx_CTO_1, BTO)
632
+ MT43 = np.dot(Kx_CTE_1, ATE) + KE3z
633
+ MT44 = np.dot(Kx_CTE_1, BTE)
634
+ MT = np.asarray(
635
+ np.bmat(
643
636
  [
644
637
  [I, ZERO, I, ZERO],
645
638
  [ZERO, I, ZERO, I],
@@ -653,61 +646,60 @@ class AnisotropicRCWA(RCWA):
653
646
  M.fill(0.0)
654
647
 
655
648
  for nlayer in range(nlayers - 2, 0, -1): # internal layers
656
-
657
649
  layer = multilayer[nlayer]
658
650
  thickness = layer.thickness
659
651
 
660
652
  EPS2, EPS21 = layer.getEPSFourierCoeffs(wl, n, anisotropic=True)
661
653
 
662
- # Exx = S.squeeze(EPS2[0, 0, :])
663
- # Exx = toeplitz(S.flipud(Exx[0:hmax + 1]), Exx[hmax:])
664
- Exy = S.squeeze(EPS2[0, 1, :])
665
- Exy = toeplitz(S.flipud(Exy[0 : hmax + 1]), Exy[hmax:])
666
- Exz = S.squeeze(EPS2[0, 2, :])
667
- Exz = toeplitz(S.flipud(Exz[0 : hmax + 1]), Exz[hmax:])
668
-
669
- Eyx = S.squeeze(EPS2[1, 0, :])
670
- Eyx = toeplitz(S.flipud(Eyx[0 : hmax + 1]), Eyx[hmax:])
671
- Eyy = S.squeeze(EPS2[1, 1, :])
672
- Eyy = toeplitz(S.flipud(Eyy[0 : hmax + 1]), Eyy[hmax:])
673
- Eyz = S.squeeze(EPS2[1, 2, :])
674
- Eyz = toeplitz(S.flipud(Eyz[0 : hmax + 1]), Eyz[hmax:])
675
-
676
- Ezx = S.squeeze(EPS2[2, 0, :])
677
- Ezx = toeplitz(S.flipud(Ezx[0 : hmax + 1]), Ezx[hmax:])
678
- Ezy = S.squeeze(EPS2[2, 1, :])
679
- Ezy = toeplitz(S.flipud(Ezy[0 : hmax + 1]), Ezy[hmax:])
680
- Ezz = S.squeeze(EPS2[2, 2, :])
681
- Ezz = toeplitz(S.flipud(Ezz[0 : hmax + 1]), Ezz[hmax:])
682
-
683
- Exx_1 = S.squeeze(EPS21[0, 0, :])
684
- Exx_1 = toeplitz(S.flipud(Exx_1[0 : hmax + 1]), Exx_1[hmax:])
654
+ # Exx = np.squeeze(EPS2[0, 0, :])
655
+ # Exx = toeplitz(np.flipud(Exx[0:hmax + 1]), Exx[hmax:])
656
+ Exy = np.squeeze(EPS2[0, 1, :])
657
+ Exy = toeplitz(np.flipud(Exy[0 : hmax + 1]), Exy[hmax:])
658
+ Exz = np.squeeze(EPS2[0, 2, :])
659
+ Exz = toeplitz(np.flipud(Exz[0 : hmax + 1]), Exz[hmax:])
660
+
661
+ Eyx = np.squeeze(EPS2[1, 0, :])
662
+ Eyx = toeplitz(np.flipud(Eyx[0 : hmax + 1]), Eyx[hmax:])
663
+ Eyy = np.squeeze(EPS2[1, 1, :])
664
+ Eyy = toeplitz(np.flipud(Eyy[0 : hmax + 1]), Eyy[hmax:])
665
+ Eyz = np.squeeze(EPS2[1, 2, :])
666
+ Eyz = toeplitz(np.flipud(Eyz[0 : hmax + 1]), Eyz[hmax:])
667
+
668
+ Ezx = np.squeeze(EPS2[2, 0, :])
669
+ Ezx = toeplitz(np.flipud(Ezx[0 : hmax + 1]), Ezx[hmax:])
670
+ Ezy = np.squeeze(EPS2[2, 1, :])
671
+ Ezy = toeplitz(np.flipud(Ezy[0 : hmax + 1]), Ezy[hmax:])
672
+ Ezz = np.squeeze(EPS2[2, 2, :])
673
+ Ezz = toeplitz(np.flipud(Ezz[0 : hmax + 1]), Ezz[hmax:])
674
+
675
+ Exx_1 = np.squeeze(EPS21[0, 0, :])
676
+ Exx_1 = toeplitz(np.flipud(Exx_1[0 : hmax + 1]), Exx_1[hmax:])
685
677
  Exx_1_1 = inv(Exx_1)
686
678
 
687
679
  # lalanne
688
680
  Ezz_1 = inv(Ezz)
689
681
  Ky_Ezz_1 = ky / k * Ezz_1
690
- Kx_Ezz_1 = kx[:, S.newaxis] / k * Ezz_1
691
- Exz_Ezz_1 = S.dot(Exz, Ezz_1)
692
- Eyz_Ezz_1 = S.dot(Eyz, Ezz_1)
693
- H11 = 1j * S.dot(Ky_Ezz_1, Ezy)
694
- H12 = 1j * S.dot(Ky_Ezz_1, Ezx)
695
- H13 = S.dot(Ky_Ezz_1, Kx)
696
- H14 = I - S.dot(Ky_Ezz_1, Ky)
697
- H21 = 1j * S.dot(Kx_Ezz_1, Ezy)
698
- H22 = 1j * S.dot(Kx_Ezz_1, Ezx)
699
- H23 = S.dot(Kx_Ezz_1, Kx) - I
700
- H24 = -S.dot(Kx_Ezz_1, Ky)
701
- H31 = S.dot(Kx, Ky) + Exy - S.dot(Exz_Ezz_1, Ezy)
702
- H32 = Exx_1_1 - S.dot(Ky, Ky) - S.dot(Exz_Ezz_1, Ezx)
703
- H33 = 1j * S.dot(Exz_Ezz_1, Kx)
704
- H34 = -1j * S.dot(Exz_Ezz_1, Ky)
705
- H41 = S.dot(Kx, Kx) - Eyy + S.dot(Eyz_Ezz_1, Ezy)
706
- H42 = -S.dot(Kx, Ky) - Eyx + S.dot(Eyz_Ezz_1, Ezx)
707
- H43 = -1j * S.dot(Eyz_Ezz_1, Kx)
708
- H44 = 1j * S.dot(Eyz_Ezz_1, Ky)
709
- H = 1j * S.diag(S.repeat(S.diag(Kz), 4)) + S.asarray(
710
- S.bmat(
682
+ Kx_Ezz_1 = kx[:, np.newaxis] / k * Ezz_1
683
+ Exz_Ezz_1 = np.dot(Exz, Ezz_1)
684
+ Eyz_Ezz_1 = np.dot(Eyz, Ezz_1)
685
+ H11 = 1j * np.dot(Ky_Ezz_1, Ezy)
686
+ H12 = 1j * np.dot(Ky_Ezz_1, Ezx)
687
+ H13 = np.dot(Ky_Ezz_1, Kx)
688
+ H14 = I - np.dot(Ky_Ezz_1, Ky)
689
+ H21 = 1j * np.dot(Kx_Ezz_1, Ezy)
690
+ H22 = 1j * np.dot(Kx_Ezz_1, Ezx)
691
+ H23 = np.dot(Kx_Ezz_1, Kx) - I
692
+ H24 = -np.dot(Kx_Ezz_1, Ky)
693
+ H31 = np.dot(Kx, Ky) + Exy - np.dot(Exz_Ezz_1, Ezy)
694
+ H32 = Exx_1_1 - np.dot(Ky, Ky) - np.dot(Exz_Ezz_1, Ezx)
695
+ H33 = 1j * np.dot(Exz_Ezz_1, Kx)
696
+ H34 = -1j * np.dot(Exz_Ezz_1, Ky)
697
+ H41 = np.dot(Kx, Kx) - Eyy + np.dot(Eyz_Ezz_1, Ezy)
698
+ H42 = -np.dot(Kx, Ky) - Eyx + np.dot(Eyz_Ezz_1, Ezx)
699
+ H43 = -1j * np.dot(Eyz_Ezz_1, Kx)
700
+ H44 = 1j * np.dot(Eyz_Ezz_1, Ky)
701
+ H = 1j * np.diag(np.repeat(np.diag(Kz), 4)) + np.asarray(
702
+ np.bmat(
711
703
  [
712
704
  [H11, H12, H13, H14],
713
705
  [H21, H22, H23, H24],
@@ -718,7 +710,7 @@ class AnisotropicRCWA(RCWA):
718
710
  )
719
711
 
720
712
  q, W = eig(H)
721
- W1, W2, W3, W4 = S.split(W, 4)
713
+ W1, W2, W3, W4 = np.split(W, 4)
722
714
 
723
715
  #
724
716
  # boundary conditions
@@ -735,38 +727,38 @@ class AnisotropicRCWA(RCWA):
735
727
  # [b] = [-MR Mtot.MT] [R]
736
728
  # [0] [...........] [T]
737
729
 
738
- z = S.zeros_like(q)
739
- z[S.where(q.real > 0)] = -thickness
740
- D = S.exp(k * q * z)
741
- Sy0 = W1 * D[S.newaxis, :]
742
- Sx0 = W2 * D[S.newaxis, :]
743
- Uy0 = W3 * D[S.newaxis, :]
744
- Ux0 = W4 * D[S.newaxis, :]
745
-
746
- z = thickness * S.ones_like(q)
747
- z[S.where(q.real > 0)] = 0
748
- D = S.exp(k * q * z)
749
- D1 = S.exp(-1j * k2i[2, :] * thickness)
750
- Syd = D1[:, S.newaxis] * W1 * D[S.newaxis, :]
751
- Sxd = D1[:, S.newaxis] * W2 * D[S.newaxis, :]
752
- Uyd = D1[:, S.newaxis] * W3 * D[S.newaxis, :]
753
- Uxd = D1[:, S.newaxis] * W4 * D[S.newaxis, :]
754
-
755
- Mp[:, :, nlayer] = S.r_[Sx0, Sy0, -1j * Ux0, -1j * Uy0]
756
- M[:, :, nlayer] = S.r_[Sxd, Syd, -1j * Uxd, -1j * Uyd]
757
-
758
- Mtot = S.eye(4 * nood, dtype=complex)
730
+ z = np.zeros_like(q)
731
+ z[np.where(q.real > 0)] = -thickness
732
+ D = np.exp(k * q * z)
733
+ Sy0 = W1 * D[np.newaxis, :]
734
+ Sx0 = W2 * D[np.newaxis, :]
735
+ Uy0 = W3 * D[np.newaxis, :]
736
+ Ux0 = W4 * D[np.newaxis, :]
737
+
738
+ z = thickness * np.ones_like(q)
739
+ z[np.where(q.real > 0)] = 0
740
+ D = np.exp(k * q * z)
741
+ D1 = np.exp(-1j * k2i[2, :] * thickness)
742
+ Syd = D1[:, np.newaxis] * W1 * D[np.newaxis, :]
743
+ Sxd = D1[:, np.newaxis] * W2 * D[np.newaxis, :]
744
+ Uyd = D1[:, np.newaxis] * W3 * D[np.newaxis, :]
745
+ Uxd = D1[:, np.newaxis] * W4 * D[np.newaxis, :]
746
+
747
+ Mp[:, :, nlayer] = np.r_[Sx0, Sy0, -1j * Ux0, -1j * Uy0]
748
+ M[:, :, nlayer] = np.r_[Sxd, Syd, -1j * Uxd, -1j * Uyd]
749
+
750
+ Mtot = np.eye(4 * nood, dtype=complex)
759
751
  for nlayer in range(1, nlayers - 1):
760
- Mtot = S.dot(S.dot(Mtot, Mp[:, :, nlayer]), inv(M[:, :, nlayer]))
752
+ Mtot = np.dot(np.dot(Mtot, Mp[:, :, nlayer]), inv(M[:, :, nlayer]))
761
753
 
762
- BC_b = S.r_[b, S.zeros_like(b)]
763
- BC_A1 = S.c_[-MR, S.dot(Mtot, MT)]
764
- BC_A2 = S.asarray(
765
- S.bmat(
754
+ BC_b = np.r_[b, np.zeros_like(b)]
755
+ BC_A1 = np.c_[-MR, np.dot(Mtot, MT)]
756
+ BC_A2 = np.asarray(
757
+ np.bmat(
766
758
  [
767
759
  [
768
- (c1[0] * I - c1[2] * S.dot(CRO_1, ARO)),
769
- (c1[1] * I - c1[2] * S.dot(CRO_1, BRO)),
760
+ (c1[0] * I - c1[2] * np.dot(CRO_1, ARO)),
761
+ (c1[1] * I - c1[2] * np.dot(CRO_1, BRO)),
770
762
  ZERO,
771
763
  ZERO,
772
764
  ZERO,
@@ -777,8 +769,8 @@ class AnisotropicRCWA(RCWA):
777
769
  [
778
770
  ZERO,
779
771
  ZERO,
780
- (DRE - S.dot(S.dot(FRE, CRE_1), ARE)),
781
- (ERE - S.dot(S.dot(FRE, CRE_1), BRE)),
772
+ (DRE - np.dot(np.dot(FRE, CRE_1), ARE)),
773
+ (ERE - np.dot(np.dot(FRE, CRE_1), BRE)),
782
774
  ZERO,
783
775
  ZERO,
784
776
  ZERO,
@@ -789,8 +781,8 @@ class AnisotropicRCWA(RCWA):
789
781
  ZERO,
790
782
  ZERO,
791
783
  ZERO,
792
- (c3[0] * I - c3[2] * S.dot(CTO_1, ATO)),
793
- (c3[1] * I - c3[2] * S.dot(CTO_1, BTO)),
784
+ (c3[0] * I - c3[2] * np.dot(CTO_1, ATO)),
785
+ (c3[1] * I - c3[2] * np.dot(CTO_1, BTO)),
794
786
  ZERO,
795
787
  ZERO,
796
788
  ],
@@ -801,52 +793,52 @@ class AnisotropicRCWA(RCWA):
801
793
  ZERO,
802
794
  ZERO,
803
795
  ZERO,
804
- (DTE - S.dot(S.dot(FTE, CTE_1), ATE)),
805
- (ETE - S.dot(S.dot(FTE, CTE_1), BTE)),
796
+ (DTE - np.dot(np.dot(FTE, CTE_1), ATE)),
797
+ (ETE - np.dot(np.dot(FTE, CTE_1), BTE)),
806
798
  ],
807
799
  ]
808
800
  )
809
801
  )
810
802
 
811
- BC_A = S.r_[BC_A1, BC_A2]
803
+ BC_A = np.r_[BC_A1, BC_A2]
812
804
 
813
805
  x = linsolve(BC_A, BC_b)
814
806
 
815
- ROx, ROy, REx, REy, TOx, TOy, TEx, TEy = S.split(x, 8)
807
+ ROx, ROy, REx, REy, TOx, TOy, TEx, TEy = np.split(x, 8)
816
808
 
817
- ROz = -S.dot(CRO_1, (S.dot(ARO, ROx) + S.dot(BRO, ROy)))
818
- REz = -S.dot(CRE_1, (S.dot(ARE, REx) + S.dot(BRE, REy)))
819
- TOz = -S.dot(CTO_1, (S.dot(ATO, TOx) + S.dot(BTO, TOy)))
820
- TEz = -S.dot(CTE_1, (S.dot(ATE, TEx) + S.dot(BTE, TEy)))
809
+ ROz = -np.dot(CRO_1, (np.dot(ARO, ROx) + np.dot(BRO, ROy)))
810
+ REz = -np.dot(CRE_1, (np.dot(ARE, REx) + np.dot(BRE, REy)))
811
+ TOz = -np.dot(CTO_1, (np.dot(ATO, TOx) + np.dot(BTO, TOy)))
812
+ TEz = -np.dot(CTE_1, (np.dot(ATE, TEx) + np.dot(BTE, TEy)))
821
813
 
822
- denom = (k1[2] - S.dot(u, k1) * u[2]).real
814
+ denom = (k1[2] - np.dot(u, k1) * u[2]).real
823
815
  DEO1[:, iwl] = (
824
816
  -(
825
- (S.absolute(ROx) ** 2 + S.absolute(ROy) ** 2 + S.absolute(ROz) ** 2)
826
- * S.conj(kO1i[2, :])
817
+ (np.absolute(ROx) ** 2 + np.absolute(ROy) ** 2 + np.absolute(ROz) ** 2)
818
+ * np.conj(kO1i[2, :])
827
819
  - (ROx * kO1i[0, :] + ROy * kO1i[1, :] + ROz * kO1i[2, :])
828
- * S.conj(ROz)
820
+ * np.conj(ROz)
829
821
  ).real
830
822
  / denom
831
823
  )
832
824
  DEE1[:, iwl] = (
833
825
  -(
834
- (S.absolute(REx) ** 2 + S.absolute(REy) ** 2 + S.absolute(REz) ** 2)
835
- * S.conj(kE1i[2, :])
826
+ (np.absolute(REx) ** 2 + np.absolute(REy) ** 2 + np.absolute(REz) ** 2)
827
+ * np.conj(kE1i[2, :])
836
828
  - (REx * kE1i[0, :] + REy * kE1i[1, :] + REz * kE1i[2, :])
837
- * S.conj(REz)
829
+ * np.conj(REz)
838
830
  ).real
839
831
  / denom
840
832
  )
841
833
  DEO3[:, iwl] = (
842
- (S.absolute(TOx) ** 2 + S.absolute(TOy) ** 2 + S.absolute(TOz) ** 2)
843
- * S.conj(kO3i[2, :])
844
- - (TOx * kO3i[0, :] + TOy * kO3i[1, :] + TOz * kO3i[2, :]) * S.conj(TOz)
834
+ (np.absolute(TOx) ** 2 + np.absolute(TOy) ** 2 + np.absolute(TOz) ** 2)
835
+ * np.conj(kO3i[2, :])
836
+ - (TOx * kO3i[0, :] + TOy * kO3i[1, :] + TOz * kO3i[2, :]) * np.conj(TOz)
845
837
  ).real / denom
846
838
  DEE3[:, iwl] = (
847
- (S.absolute(TEx) ** 2 + S.absolute(TEy) ** 2 + S.absolute(TEz) ** 2)
848
- * S.conj(kE3i[2, :])
849
- - (TEx * kE3i[0, :] + TEy * kE3i[1, :] + TEz * kE3i[2, :]) * S.conj(TEz)
839
+ (np.absolute(TEx) ** 2 + np.absolute(TEy) ** 2 + np.absolute(TEz) ** 2)
840
+ * np.conj(kE3i[2, :])
841
+ - (TEx * kE3i[0, :] + TEy * kE3i[1, :] + TEz * kE3i[2, :]) * np.conj(TEz)
850
842
  ).real / denom
851
843
 
852
844
  # save the results