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