├── .idea
├── FDTD.iml
├── inspectionProfiles
│ └── profiles_settings.xml
├── misc.xml
├── modules.xml
├── vcs.xml
└── workspace.xml
├── FDTD1D
├── 1DFDTD.py
├── 1DFDTD_unvectorized.py
├── GrapheneSBC
│ ├── 1DTestSBC.py
│ ├── 1DTestSBC_DrudeGraphene.py
│ └── Movies
│ │ ├── Fields_0.jpg
│ │ ├── Fields_1.jpg
│ │ ├── Fields_10.jpg
│ │ ├── Fields_100.jpg
│ │ ├── Fields_101.jpg
│ │ ├── Fields_102.jpg
│ │ ├── Fields_103.jpg
│ │ ├── Fields_104.jpg
│ │ ├── Fields_105.jpg
│ │ ├── Fields_106.jpg
│ │ ├── Fields_107.jpg
│ │ ├── Fields_108.jpg
│ │ ├── Fields_109.jpg
│ │ ├── Fields_11.jpg
│ │ ├── Fields_110.jpg
│ │ ├── Fields_111.jpg
│ │ ├── Fields_112.jpg
│ │ ├── Fields_113.jpg
│ │ ├── Fields_114.jpg
│ │ ├── Fields_115.jpg
│ │ ├── Fields_116.jpg
│ │ ├── Fields_117.jpg
│ │ ├── Fields_118.jpg
│ │ ├── Fields_119.jpg
│ │ ├── Fields_12.jpg
│ │ ├── Fields_120.jpg
│ │ ├── Fields_121.jpg
│ │ ├── Fields_122.jpg
│ │ ├── Fields_123.jpg
│ │ ├── Fields_124.jpg
│ │ ├── Fields_125.jpg
│ │ ├── Fields_126.jpg
│ │ ├── Fields_127.jpg
│ │ ├── Fields_128.jpg
│ │ ├── Fields_129.jpg
│ │ ├── Fields_13.jpg
│ │ ├── Fields_130.jpg
│ │ ├── Fields_131.jpg
│ │ ├── Fields_132.jpg
│ │ ├── Fields_133.jpg
│ │ ├── Fields_134.jpg
│ │ ├── Fields_135.jpg
│ │ ├── Fields_136.jpg
│ │ ├── Fields_137.jpg
│ │ ├── Fields_138.jpg
│ │ ├── Fields_139.jpg
│ │ ├── Fields_14.jpg
│ │ ├── Fields_140.jpg
│ │ ├── Fields_141.jpg
│ │ ├── Fields_142.jpg
│ │ ├── Fields_143.jpg
│ │ ├── Fields_144.jpg
│ │ ├── Fields_145.jpg
│ │ ├── Fields_146.jpg
│ │ ├── Fields_147.jpg
│ │ ├── Fields_148.jpg
│ │ ├── Fields_149.jpg
│ │ ├── Fields_15.jpg
│ │ ├── Fields_150.jpg
│ │ ├── Fields_151.jpg
│ │ ├── Fields_152.jpg
│ │ ├── Fields_153.jpg
│ │ ├── Fields_154.jpg
│ │ ├── Fields_155.jpg
│ │ ├── Fields_156.jpg
│ │ ├── Fields_157.jpg
│ │ ├── Fields_158.jpg
│ │ ├── Fields_159.jpg
│ │ ├── Fields_16.jpg
│ │ ├── Fields_160.jpg
│ │ ├── Fields_161.jpg
│ │ ├── Fields_162.jpg
│ │ ├── Fields_163.jpg
│ │ ├── Fields_164.jpg
│ │ ├── Fields_165.jpg
│ │ ├── Fields_166.jpg
│ │ ├── Fields_167.jpg
│ │ ├── Fields_168.jpg
│ │ ├── Fields_169.jpg
│ │ ├── Fields_17.jpg
│ │ ├── Fields_170.jpg
│ │ ├── Fields_171.jpg
│ │ ├── Fields_172.jpg
│ │ ├── Fields_173.jpg
│ │ ├── Fields_174.jpg
│ │ ├── Fields_175.jpg
│ │ ├── Fields_176.jpg
│ │ ├── Fields_177.jpg
│ │ ├── Fields_178.jpg
│ │ ├── Fields_179.jpg
│ │ ├── Fields_18.jpg
│ │ ├── Fields_180.jpg
│ │ ├── Fields_181.jpg
│ │ ├── Fields_182.jpg
│ │ ├── Fields_183.jpg
│ │ ├── Fields_184.jpg
│ │ ├── Fields_185.jpg
│ │ ├── Fields_186.jpg
│ │ ├── Fields_187.jpg
│ │ ├── Fields_188.jpg
│ │ ├── Fields_189.jpg
│ │ ├── Fields_19.jpg
│ │ ├── Fields_190.jpg
│ │ ├── Fields_191.jpg
│ │ ├── Fields_192.jpg
│ │ ├── Fields_193.jpg
│ │ ├── Fields_194.jpg
│ │ ├── Fields_195.jpg
│ │ ├── Fields_196.jpg
│ │ ├── Fields_197.jpg
│ │ ├── Fields_198.jpg
│ │ ├── Fields_199.jpg
│ │ ├── Fields_2.jpg
│ │ ├── Fields_20.jpg
│ │ ├── Fields_21.jpg
│ │ ├── Fields_22.jpg
│ │ ├── Fields_23.jpg
│ │ ├── Fields_24.jpg
│ │ ├── Fields_25.jpg
│ │ ├── Fields_26.jpg
│ │ ├── Fields_27.jpg
│ │ ├── Fields_28.jpg
│ │ ├── Fields_29.jpg
│ │ ├── Fields_3.jpg
│ │ ├── Fields_30.jpg
│ │ ├── Fields_31.jpg
│ │ ├── Fields_32.jpg
│ │ ├── Fields_33.jpg
│ │ ├── Fields_34.jpg
│ │ ├── Fields_35.jpg
│ │ ├── Fields_36.jpg
│ │ ├── Fields_37.jpg
│ │ ├── Fields_38.jpg
│ │ ├── Fields_39.jpg
│ │ ├── Fields_4.jpg
│ │ ├── Fields_40.jpg
│ │ ├── Fields_41.jpg
│ │ ├── Fields_42.jpg
│ │ ├── Fields_43.jpg
│ │ ├── Fields_44.jpg
│ │ ├── Fields_45.jpg
│ │ ├── Fields_46.jpg
│ │ ├── Fields_47.jpg
│ │ ├── Fields_48.jpg
│ │ ├── Fields_49.jpg
│ │ ├── Fields_5.jpg
│ │ ├── Fields_50.jpg
│ │ ├── Fields_51.jpg
│ │ ├── Fields_52.jpg
│ │ ├── Fields_53.jpg
│ │ ├── Fields_54.jpg
│ │ ├── Fields_55.jpg
│ │ ├── Fields_56.jpg
│ │ ├── Fields_57.jpg
│ │ ├── Fields_58.jpg
│ │ ├── Fields_59.jpg
│ │ ├── Fields_6.jpg
│ │ ├── Fields_60.jpg
│ │ ├── Fields_61.jpg
│ │ ├── Fields_62.jpg
│ │ ├── Fields_63.jpg
│ │ ├── Fields_64.jpg
│ │ ├── Fields_65.jpg
│ │ ├── Fields_66.jpg
│ │ ├── Fields_67.jpg
│ │ ├── Fields_68.jpg
│ │ ├── Fields_69.jpg
│ │ ├── Fields_7.jpg
│ │ ├── Fields_70.jpg
│ │ ├── Fields_71.jpg
│ │ ├── Fields_72.jpg
│ │ ├── Fields_73.jpg
│ │ ├── Fields_74.jpg
│ │ ├── Fields_75.jpg
│ │ ├── Fields_76.jpg
│ │ ├── Fields_77.jpg
│ │ ├── Fields_78.jpg
│ │ ├── Fields_79.jpg
│ │ ├── Fields_8.jpg
│ │ ├── Fields_80.jpg
│ │ ├── Fields_81.jpg
│ │ ├── Fields_82.jpg
│ │ ├── Fields_83.jpg
│ │ ├── Fields_84.jpg
│ │ ├── Fields_85.jpg
│ │ ├── Fields_86.jpg
│ │ ├── Fields_87.jpg
│ │ ├── Fields_88.jpg
│ │ ├── Fields_89.jpg
│ │ ├── Fields_9.jpg
│ │ ├── Fields_90.jpg
│ │ ├── Fields_91.jpg
│ │ ├── Fields_92.jpg
│ │ ├── Fields_93.jpg
│ │ ├── Fields_94.jpg
│ │ ├── Fields_95.jpg
│ │ ├── Fields_96.jpg
│ │ ├── Fields_97.jpg
│ │ ├── Fields_98.jpg
│ │ ├── Fields_99.jpg
│ │ └── Graphene1D.avi
├── SlabTransmission.py
├── Subgrid
│ ├── 1DSubgridPrimarySubgrid.py
│ └── 1DSubgridding.py
├── SubgridTest1D.py
├── TFSF1D.py
├── UPML.py
└── __init__.py
├── FDTD2D
├── DielectricGenerator2D
│ ├── GMRStructure.py
│ ├── PhotonicCrystalGrid.py
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── GMRStructure.cpython-35.pyc
│ │ ├── PhotonicCrystalGrid.cpython-35.pyc
│ │ ├── __init__.cpython-35.pyc
│ │ └── createShapes.cpython-35.pyc
│ └── createShapes.py
├── FDTD2Dex.py
├── Graphene
│ ├── Graphene2DSheet.py
│ ├── GrapheneSBCTest.py
│ ├── TE_unvectorized.py
│ └── __init__.py
├── GuidedModeResonance
│ └── GMR2D.py
├── PML
│ ├── SCPML.py
│ ├── UPML_coefs.py
│ ├── UPML_test.py
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── UPML_coefs.cpython-35.pyc
│ │ ├── UPML_coefs.cpython-36.pyc
│ │ ├── __init__.cpython-35.pyc
│ │ └── __init__.cpython-36.pyc
│ └── sfactor.py
├── PhotonicCrystals
│ └── CylinderLattice.py
├── Simulators
│ ├── TE.py
│ ├── TM.py
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── __init__.cpython-35.pyc
│ │ └── runTE.cpython-35.pyc
│ └── runTE.py
├── Sources
│ ├── PlaneWave.py
│ ├── TFSF.py
│ └── __init__.py
├── Subgridding
│ ├── 2DSubgridTest.py
│ ├── NonuniformGridTEst.py
│ └── __init__.py
├── __init__.py
└── __pycache__
│ ├── __init__.cpython-35.pyc
│ └── __init__.cpython-36.pyc
├── FDTD3D
├── 3DSubgridTest.py
├── Curl.py
├── DerivativeAnalysis
│ └── DerivativeAnalysis.py
├── FDTD3Dex.py
├── GrapheneSimulation
│ ├── CalcSBCCoef.py
│ ├── FDTD3D_partialvectorizatoin.py
│ └── GrapheneSheetTest3D.py
└── __init__.py
├── Interpolation
└── InterpolationTesting.py
└── UPML.m
/.idea/FDTD.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/FDTD1D/1DFDTD.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from numpy import linalg as nl
4 | N = 100;
5 |
6 | Hz = np.zeros((N+1, ));
7 | IC = lambda x: np.cos(np.pi*x/10)
8 | x = np.linspace(-50,50,N+1);
9 | Ey = np.zeros((N+1,))
10 | for i in range(len(x)):
11 | if(abs(x[i])<= 5):
12 | Ey[i] = np.cos(x[i]*np.pi/10)**2;
13 | else:
14 | Ey[i] = 0;
15 | plt.plot(x, Ey)
16 | Ey = np.squeeze(Ey);
17 | print(Ey.shape)
18 | print(Hz.shape)
19 | dt = 2;
20 | dx = 2;
21 | cc = 1;#dt/dx
22 |
23 | tsteps = 60;
24 | plt.ion()
25 | fieldAmplitudes = list();
26 | plt.figure;
27 | abc = (cc*dt - dx)/(cc*dt + dx);
28 |
29 | for t in range(tsteps):
30 | #update Hz field
31 | deriv = Ey[1:]-np.roll(Ey,1)[1:]
32 | deriv = Ey[0]+deriv;
33 | Ey[-1] = 0;
34 | Hz_next = Hz + (dt/dx)*(Ey - np.roll(Ey, 1))
35 | # for i in range(0, N):
36 | # Hz_next[i] = Hz[i] + (dt/dx)*(Ey[i+1] - (Ey[i]));
37 | #H field abc, #Hz[0] is never updated during the loop
38 | #Hz_next[0] = Hz[1] + abc*(Hz_next[1] - Hz[0])
39 | Hz = Hz_next;
40 |
41 | #update Ey field
42 | Hz[0] = 0;
43 | Ey_next = Ey + (dt/dx)*(np.roll(Hz,-1) - Hz)
44 |
45 | # for i in range(1, N+1):
46 | # Ey_next[i] = Ey[i] + (dt/dx)*(Hz[i] - Hz[i-1]);
47 | #E -field abc
48 | #Ey_next[N] = Ey0 +abc*(Ey_next[-2] - Ey[-1])
49 | #point source pulse
50 | #Ey[50] += np.exp(-(t - 30.) * (t - 30) / 100);
51 | Ey = Ey_next;
52 |
53 | fieldAmplitudes.append(nl.norm(Ey)**2+nl.norm(Hz)**2)
54 |
55 | plt.plot(x,Hz)
56 | plt.ylim([-0.5, 1])
57 | plt.pause(0.1)
58 | plt.clf()
59 | # plt.plot(fieldAmplitudes)
60 | # plt.pause(0.05)
61 | # plt.clf()
--------------------------------------------------------------------------------
/FDTD1D/1DFDTD_unvectorized.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from numpy import linalg as nl
4 | N = 100;
5 |
6 | Hz = np.zeros((N+1, ));
7 | IC = lambda x: np.cos(np.pi*x/10)
8 | x = np.linspace(-50,50,N+1);
9 | Ey = np.zeros((N+1,))
10 | # for i in range(len(x)):
11 | # if(abs(x[i])<= 5):
12 | # Ey[i] = np.cos(x[i]*np.pi/10)**2;
13 | # else:
14 | # Ey[i] = 0;
15 | plt.plot(x, Ey)
16 | Ey = np.squeeze(Ey);
17 | print(Ey.shape)
18 | print(Hz.shape)
19 | dt = 1;
20 | dx = 1;
21 | cc = 1;#dt/dx
22 |
23 | tsteps = 200;
24 | plt.ion()
25 | fieldAmplitudes = list();
26 | plt.figure;
27 | abc = (cc*dt - dx)/(cc*dt + dx);
28 |
29 | for t in range(tsteps):
30 | print(t)
31 | Hz_next = np.zeros((N+1,))
32 | Ey[-1] = 0;
33 | #Hz_next = Hz + (dt/dx)*(Ey - np.roll(Ey, 1))
34 | for i in range(0, N+1):
35 | index = i+1
36 | if(index > N):
37 | index = 0;
38 | Hz_next[i] = Hz[i] + (dt/dx)*(Ey[index] - (Ey[i]));
39 | #print(Hz_next)
40 | #H field abc, #Hz[0] is never updated during the loop
41 | #Hz_next[0] = Hz[1] + abc*(Hz_next[1] - Hz[0])
42 | Hz = Hz_next;
43 |
44 | #update Ey field
45 | Hz[0] = 0;
46 | #Ey_next = Ey + (dt/dx)*(np.roll(Hz,-1) - Hz)
47 |
48 | Ey_next = np.zeros((N+1,));
49 | for i in range(1, N+1):
50 | index = i-1;
51 | if(index < 0):
52 | index = N;
53 | Ey_next[i] = Ey[i] + (dt/dx)*(Hz[i] - Hz[index]);
54 | #E -field abc
55 | #Ey_next[N] = Ey0 +abc*(Ey_next[-2] - Ey[-1])
56 | #point source pulse
57 | Ey_next[50] += np.exp(-(t - 20.) * (t - 20) / 30);
58 | Ey = Ey_next;
59 |
60 | plt.plot(x,Ey);
61 | plt.plot(x, Hz);
62 | plt.ylim([-0.5, 1])
63 | plt.pause(0.00001)
64 | plt.clf()
65 | # plt.plot(fieldAmplitudes)
66 | # plt.pause(0.05)
67 | # plt.clf()
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/1DTestSBC.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from numpy import linalg as nl
4 | import os
5 | directory = 'D:\\Documents\\pythonFDTD\\FDTD1D\\GrapheneSBC\\Movies\\'
6 |
7 | try:
8 | os.stat(directory)
9 | except:
10 | os.mkdir(directory)
11 |
12 | N = 100;
13 |
14 | Hz = np.zeros((N+1, ));
15 |
16 | x = np.linspace(-N/2,N/2,N+1);
17 | Ey = np.zeros((N+1,))
18 |
19 | plt.plot(x, Ey)
20 | Ey = np.squeeze(Ey);
21 | print(Ey.shape)
22 | print(Hz.shape)
23 | dx = 1;
24 | dt = dx;
25 | cc = 1;#dt/dx
26 |
27 | ## time step is SENSITIVE AT THE BOUNDARY???
28 |
29 | plt.ion()
30 | fieldAmplitudes = list();
31 | plt.figure;
32 | abc = (cc*dt/2 - dx)/(cc*dt/2 + dx);
33 | sheet_loc= 50;
34 | source_loc =70;
35 | tau = 0;
36 |
37 |
38 | ## COEFFICIENTS FOR THE SHEET UPDATE
39 | timeAlphaB = 1;
40 |
41 | sigma_0 = 1;
42 | denom = (dx * sigma_0) + dt/timeAlphaB;
43 | c1 = (dt) / (dx * sigma_0 + dt/timeAlphaB);
44 | c2 = (dt) / (dx * sigma_0 + dt/timeAlphaB); ## if this is the courant number, there is instability introduced
45 |
46 | fe1 = sigma_0 * c1;
47 | fe2 = sigma_0 * c2;
48 | fh11 = 1-2.0*c1;
49 | fh22 = 1-2.0*c2
50 | fh12 = c1;
51 | fh21 = c2;
52 |
53 | ## What is the courant number
54 | print(str(c1))
55 |
56 | Hz_int_right = 0;
57 | Hz_int_left = 0;
58 | Hinterface = list(); F1n = 0; F2n=0;
59 | timeAlpha = 1.0;
60 | tsteps = 200;
61 | E_khalf = list();
62 | for t in range(tsteps):
63 | print('time step: '+str(t))
64 | ########################## UPDATE THE HY FIELD ##############################
65 | Hz_next = np.zeros((N+1,))
66 | for i in range(1, N+1): #Hz is offset right of Ey
67 | index = i+1
68 | if(i == sheet_loc):
69 | ## Ey is at time n, get the update coefficients for the H interface before we replace Ey with the updated one
70 | # hz_int_right and hz_int_left are at time n-1/2
71 | F1n = -2 * fe1 * Ey[sheet_loc] + (fh11 * Hz_int_left) + (
72 | fh12 * (Hz_int_right)); # Ey is at time step n, but the interfaces are at n-1/2
73 | F2n = 2 * fe2 * Ey[sheet_loc + 1] + (fh21 * Hz_int_left) + (fh22 * (Hz_int_right));
74 |
75 | Hz_int_left = (1 / (1 - c1 * c2)) * (F1n + c1 * F2n); # time step to n+1/2 using F1n (at time step n)
76 | Hz_int_right = (1 / (1 - c1 * c2)) * (F2n + c2 * F1n);
77 | continue;
78 | if(index > N):
79 | index = 0;
80 | Hz_next[i] = Hz[i] + (dt/dx)*(Ey[index] - (Ey[i]));
81 |
82 |
83 | #print(Hz_next)
84 | Hz_next[0] = Hz[1] + abc*(Hz_next[1] - Hz[0])
85 | Hz = Hz_next;
86 |
87 | ##################### update Ey field #######################
88 | #Hz[0] = 0;
89 | ## iterate through the updates since there's an interface
90 | Ey_next = np.zeros((N+1,));
91 | for i in range(0,N+1):
92 | if(i == sheet_loc+1):
93 | ## Ey field at sheet_loc and sheet_loc+1 have special updates
94 | Ey_next[i] = Ey[i] + (dt / dx/timeAlpha) * (Hz[i] - Hz_int_right);
95 | elif(i == sheet_loc):
96 | Ey_next[i] = Ey[i] + (dt / dx/timeAlpha) * (Hz_int_left - Hz[i-1]);
97 | else: # normal update
98 | index = i-1;
99 | if(index <0):
100 | index = N;
101 | Ey_next[i] = Ey[i] + (dt / dx/timeAlpha) * (Hz[i] - Hz[index]);
102 |
103 | # #E -field abc
104 | Ey_next[-1] = Ey[-1] + abc * (Ey_next[-2] - Ey[-1])
105 |
106 | #point source pulse
107 | Ey_next[source_loc] += np.exp(-(t - 20) * (t - 20) / (60*timeAlpha));
108 |
109 |
110 | print(str(Hz_int_left)+', '+str(Hz_int_right))
111 | Hinterface.append([Hz_int_left, Hz_int_right]);
112 | E_khalf.append((Hz_int_right-Hz_int_left)/sigma_0)
113 | ## calculate the discontinuity
114 |
115 | ##Hz_interfaces are now updated to n+1/2
116 |
117 | Ey = Ey_next; #update Ey to next timestep
118 |
119 |
120 | plt.figure()
121 | plt.plot(x,Hz)
122 | plt.plot(x,Ey)
123 | plt.ylim([-1, 1])
124 | plt.savefig(directory+'Fields_'+str(t)+'.jpg');
125 | plt.pause(0.000001)
126 | plt.clf()
127 |
128 |
129 | Hinterface = np.array(Hinterface);
130 | plt.figure()
131 | # plt.plot(Hinterface);
132 | plt.plot(E_khalf)
133 | plt.show()
134 |
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/1DTestSBC_DrudeGraphene.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from numpy import linalg as nl
4 | N = 100;
5 |
6 | Hz = np.zeros((N+1, ));
7 |
8 | x = np.linspace(-N/2,N/2,N+1);
9 | Ey = np.zeros((N+1,))
10 |
11 | plt.plot(x, Ey)
12 | Ey = np.squeeze(Ey);
13 | print(Ey.shape)
14 | print(Hz.shape)
15 | dx = 1;
16 | dt = dx
17 | cc = 1;#dt/dx
18 |
19 | tsteps = 100;
20 | plt.ion()
21 | fieldAmplitudes = list();
22 | plt.figure;
23 | abc = (cc*dt - dx)/(cc*dt + dx);
24 | sheet_loc= 50;
25 | source_loc = 90;
26 | tau = 0;
27 |
28 |
29 | ## COEFFICIENTS FOR THE SHEET UPDATE
30 | sigma_0 = 1;
31 | denom = dx * sigma_0 + dt + 2 * tau;
32 | c1 = (dt+2*tau)/(dx * sigma_0 + dt + 2 * tau);
33 | c2 = (dt+2*tau)/(dx * sigma_0 + dt + 2 * tau);
34 |
35 | fe1 = sigma_0 * dt / (denom);
36 | fe2 = sigma_0 * dt / (denom);
37 | fh11 = 1-2*dt/(denom);
38 | fh22 = 1-2*dt/(denom);
39 | fh12 = (dt-2*tau)/denom;fh21 = (dt-2*tau)/denom;
40 |
41 |
42 | Hz_int_right = 0;
43 | Hz_int_left = 0;
44 | Hinterface = list(); F1n = 0; F2n=0;
45 | timeAlpha = 1;
46 | timeAlphab = 1;
47 | for t in range(tsteps):
48 | print('time step: '+str(t))
49 | ########################## UPDATE THE HY FIELD ##############################
50 | Hz_next = np.zeros((N+1,))
51 | for i in range(1, N+1): #Hz is offset right of Ey
52 | index = i+1
53 | if(i == sheet_loc):
54 | ## Ey is at time n, get the update coefficients for the H interface before we replace Ey with the updated one
55 | # hz_int_right and hz_int_left are at time n-1/2
56 | F1n = -2 * fe1 * Ey[sheet_loc] + (fh11 * Hz_int_left) + (
57 | fh12 * (Hz_int_right)); # Ey is at time step n, but the interfaces are at n-1/2
58 | F2n = 2 * fe2 * Ey[sheet_loc + 1] + (fh21 * Hz_int_left) + (fh22 * (Hz_int_right));
59 |
60 | Hz_int_left = (1 / (1 - c1 * c2)) * (F1n + c1 * F2n); # time step to n+1/2 using F1n (at time step n)
61 | Hz_int_right = (1 / (1 - c1 * c2)) * (F2n + c2 * F1n);
62 | continue;
63 | if(index > N):
64 | index = 0;
65 | Hz_next[i] = Hz[i] + (dt/dx)*(Ey[index] - (Ey[i]));
66 |
67 |
68 | #print(Hz_next)
69 | #Hz_next[0] = Hz[1] + abc*(Hz_next[1] - Hz[0])
70 | Hz = Hz_next;
71 |
72 | ##################### update Ey field #######################
73 | #Hz[0] = 0;
74 | ## iterate through the updates since there's an interface
75 | Ey_next = np.zeros((N+1,));
76 | for i in range(0,N+1):
77 | if(i == sheet_loc+1):
78 | ## Ey field at sheet_loc and sheet_loc+1 have special updates
79 | Ey_next[i] = Ey[i] + (dt / dx/timeAlpha) * (Hz[i] - Hz_int_right);
80 | elif(i == sheet_loc):
81 | Ey_next[i] = Ey[i] + (dt / dx/timeAlpha) * (Hz_int_left - Hz[i-1]);
82 | else: # normal update
83 | index = i-1;
84 | if(index <0):
85 | index = N;
86 | Ey_next[i] = Ey[i] + (dt / dx/timeAlpha) * (Hz[i] - Hz[index]);
87 |
88 | # #E -field abc
89 | #Ey_next[-1] = Ey[-1] + abc * (Ey_next[-2] - Ey[-1])
90 |
91 | #point source pulse
92 | Ey_next[source_loc] += np.exp(-(t - 20) * (t - 20) / (60*timeAlpha));
93 |
94 |
95 | print(str(Hz_int_left)+', '+str(Hz_int_right))
96 | Hinterface.append([Hz_int_left, Hz_int_right]);
97 | ## calculate the discontinuity
98 |
99 | ##Hz_interfaces are now updated to n+1/2
100 |
101 | Ey = Ey_next; #update Ey to next timestep
102 |
103 |
104 |
105 | plt.plot(x,Hz)
106 | plt.plot(x,Ey)
107 | plt.ylim([-1, 1])
108 | plt.pause(0.000001)
109 | plt.clf()
110 |
111 |
112 |
113 | Hinterface = np.array(Hinterface);
114 | plt.figure()
115 | plt.plot(Hinterface);
116 | plt.show()
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_0.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_0.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_1.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_10.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_10.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_100.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_100.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_101.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_101.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_102.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_102.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_103.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_103.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_104.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_104.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_105.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_105.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_106.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_106.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_107.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_107.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_108.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_108.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_109.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_109.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_11.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_11.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_110.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_110.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_111.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_111.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_112.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_112.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_113.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_113.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_114.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_114.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_115.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_115.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_116.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_116.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_117.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_117.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_118.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_118.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_119.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_119.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_12.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_12.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_120.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_120.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_121.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_121.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_122.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_122.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_123.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_123.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_124.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_124.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_125.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_125.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_126.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_126.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_127.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_127.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_128.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_128.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_129.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_129.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_13.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_13.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_130.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_130.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_131.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_131.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_132.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_132.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_133.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_133.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_134.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_134.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_135.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_135.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_136.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_136.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_137.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_137.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_138.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_138.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_139.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_139.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_14.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_14.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_140.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_140.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_141.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_141.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_142.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_142.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_143.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_143.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_144.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_144.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_145.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_145.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_146.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_146.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_147.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_147.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_148.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_148.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_149.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_149.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_15.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_15.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_150.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_150.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_151.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_151.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_152.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_152.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_153.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_153.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_154.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_154.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_155.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_155.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_156.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_156.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_157.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_157.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_158.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_158.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_159.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_159.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_16.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_16.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_160.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_160.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_161.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_161.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_162.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_162.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_163.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_163.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_164.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_164.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_165.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_165.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_166.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_166.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_167.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_167.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_168.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_168.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_169.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_169.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_17.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_17.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_170.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_170.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_171.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_171.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_172.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_172.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_173.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_173.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_174.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_174.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_175.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_175.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_176.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_176.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_177.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_177.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_178.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_178.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_179.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_179.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_18.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_18.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_180.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_180.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_181.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_181.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_182.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_182.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_183.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_183.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_184.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_184.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_185.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_185.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_186.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_186.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_187.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_187.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_188.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_188.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_189.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_189.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_19.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_19.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_190.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_190.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_191.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_191.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_192.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_192.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_193.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_193.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_194.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_194.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_195.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_195.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_196.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_196.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_197.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_197.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_198.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_198.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_199.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_199.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_2.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_20.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_20.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_21.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_21.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_22.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_22.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_23.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_23.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_24.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_24.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_25.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_25.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_26.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_26.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_27.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_27.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_28.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_28.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_29.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_29.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_3.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_30.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_30.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_31.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_31.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_32.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_32.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_33.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_33.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_34.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_34.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_35.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_35.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_36.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_36.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_37.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_37.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_38.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_38.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_39.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_39.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_4.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_40.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_40.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_41.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_41.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_42.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_42.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_43.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_43.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_44.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_44.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_45.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_45.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_46.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_46.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_47.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_47.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_48.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_48.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_49.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_49.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_5.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_50.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_50.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_51.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_51.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_52.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_52.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_53.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_53.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_54.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_54.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_55.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_55.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_56.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_56.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_57.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_57.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_58.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_58.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_59.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_59.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_6.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_6.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_60.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_60.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_61.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_61.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_62.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_62.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_63.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_63.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_64.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_64.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_65.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_65.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_66.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_66.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_67.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_67.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_68.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_68.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_69.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_69.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_7.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_7.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_70.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_70.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_71.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_71.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_72.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_72.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_73.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_73.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_74.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_74.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_75.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_75.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_76.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_76.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_77.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_77.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_78.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_78.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_79.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_79.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_8.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_8.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_80.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_80.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_81.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_81.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_82.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_82.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_83.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_83.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_84.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_84.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_85.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_85.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_86.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_86.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_87.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_87.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_88.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_88.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_89.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_89.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_9.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_9.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_90.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_90.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_91.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_91.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_92.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_92.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_93.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_93.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_94.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_94.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_95.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_95.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_96.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_96.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_97.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_97.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_98.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_98.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Fields_99.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Fields_99.jpg
--------------------------------------------------------------------------------
/FDTD1D/GrapheneSBC/Movies/Graphene1D.avi:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/GrapheneSBC/Movies/Graphene1D.avi
--------------------------------------------------------------------------------
/FDTD1D/SlabTransmission.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from numpy import linalg as nl
4 |
5 |
6 | mu_0 = 4*np.pi*10**-7;
7 | eps_0 = 8.85e-12;
8 |
9 | def runFDTD(N, dt, dx, c, tsteps, eps, x):
10 | ## J is the current source
11 | abc = (c*dt-dx)/(c*dt+dx);
12 | Ey = np.zeros(N,);
13 | Hz = np.zeros(N,)
14 | ## initial condition on E
15 | #initial field profile has to be continuous!!!
16 | # for i in range(len(Ey)):
17 | #
18 | # if ( i > 200 and i < 300):
19 | # Ey[i] = np.cos((x[i]-250) * np.pi / 100) ** 2;
20 | # else:
21 | # Ey[i] = 0;
22 | # plt.figure;
23 | # plt.plot(Ey);
24 | # plt.show()
25 | plt.ion()
26 | fieldAmplitudes = list();
27 | plt.figure;
28 | omega = 2*np.pi/50;
29 | # update Ey field
30 | lambda_0 = 800;
31 | lambda_U = 1200;
32 | lambda_L = 600;
33 | sigma = (2 / omega) * (lambda_0 / (lambda_U + lambda_L))
34 | print(sigma)
35 | for t in range(tsteps):
36 | # update Hz field
37 | #D = np.multiply(eps, Ey);
38 | D = Ey;
39 | Hz_next = Hz + (dt*c / dx) * (D - np.roll(D, 1))
40 | Hz_next[0] = Hz[1] + abc*(Hz_next[1] - Hz[0])
41 | Hz = Hz_next;
42 |
43 |
44 | J = np.sin(omega*t)*np.exp(-(t-4*sigma)**2/sigma**2)
45 | print(J)
46 | Ey_next = Ey + ((dt *c/ dx)/eps) * (np.roll(Hz, -1) - Hz);
47 | Ey_next[100]-= (dt/1)*J;
48 | # E -field abc
49 | Ey_next[-1] = Ey[-2] +abc*(Ey_next[-2] - Ey[-1])
50 |
51 | Ey = Ey_next;
52 | fieldAmplitudes.append(nl.norm(Ey) ** 2 + nl.norm(Hz) ** 2)
53 |
54 | plt.plot(x, Ey)
55 | plt.ylim([-0.5, 1])
56 | plt.pause(0.1)
57 | plt.clf()
58 |
59 | return [Ey, Hz,J,eps]
60 |
61 | def dielSlab(N, epsilon, xstart, xend, left, dx):
62 | eps = np.ones((N+1,));
63 | Nstart = locToGrid(0, dx, left);
64 | Nend = locToGrid(700, dx, left);
65 | print(str(Nstart)+' '+str(Nend))
66 | eps[Nstart:Nend] = epsilon;
67 |
68 | ## apply the staircase averaging
69 | for i in range(1, N-1):
70 | eps[i] = (eps[i-1]+eps[i+1])/2;
71 | return eps;
72 |
73 | #map spatial location ot grid location
74 | def locToGrid(loc, dx, left):
75 | x = int(abs(left-loc)/dx);
76 | print(int(abs(left-x)));
77 | return x;
78 |
79 |
80 |
81 | ## Run sim
82 | xstart = -300;
83 | xend = 1000;
84 | dt = 1; dx = 1; c = 1;
85 | N = int((xend-xstart)/dx);
86 | x = np.linspace(xstart, xend, N)
87 | tsteps = 300;
88 | dielStart = 0; dielEnd = 700;
89 |
90 | eps = dielSlab(N-1, 4, dielStart, dielEnd, xstart, dx);
91 | # plt.figure()
92 | # plt.plot(eps)
93 | # plt.show()
94 | [Ey, Hz,J, eps] = runFDTD(N, dt, dx, c, tsteps, eps, x);
95 | plt.plot(Ey);
96 | plt.plot(Hz);
97 | plt.show()
98 |
99 |
--------------------------------------------------------------------------------
/FDTD1D/Subgrid/1DSubgridPrimarySubgrid.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 | #we need an index to keep track of colocated points in the subgrid
4 |
--------------------------------------------------------------------------------
/FDTD1D/Subgrid/1DSubgridding.py:
--------------------------------------------------------------------------------
1 | ## step 1, how do we visualize a nonuniform grid
2 | import numpy as np;
3 | import matplotlib.pyplot as plt
4 | from scipy.interpolate import interp1d
5 |
6 | def interp(r1, r2, x):
7 | ans = r1[1] + (x-r1[0])*((r2[1]-r1[1])/(r2[0]-r1[0]));
8 | return ans;
9 |
10 | fullxrange = [-400, 400];
11 | lambda_0 = 800;
12 | dx_coarse = lambda_0/100;
13 | dx_fine = dx_coarse/2; ## refinement factor of 2;
14 | c = 1;
15 |
16 | #there are two time steps...
17 | dt_coarse = dx_coarse;
18 | dt_fine = dx_fine;
19 |
20 | finexrange = [400, 800];
21 |
22 | Nx = int(400/dx_coarse);
23 | Nf = int(400/dx_fine);
24 |
25 | xcoarse = np.linspace(-400, 400, Nx+1)
26 | xfine = np.linspace(400,800, Nf+1);
27 |
28 |
29 | Hz = np.zeros(Nx+1);
30 | Ey = np.zeros(Nx+1);
31 |
32 | ## there is only one border points Ey[end] and ey[0]
33 | ey = np.zeros(Nf+1);
34 | hz = np.zeros(Nf+1);
35 | ## we need to be able to map the spatial positions of the coarse and fine grids
36 |
37 |
38 | tsteps = 2000;
39 | Hz_storage = list(); Hz_storage.append(Hz);
40 | Ey_storage = list(); Ey_storage.append(Ey);
41 |
42 | hz_storage = list();
43 | ey_storage = list();
44 | for i in range(10):
45 | hz_storage.append(hz);
46 | ey_storage.append(ey);
47 | Ey_prev = Ey;
48 |
49 | #storage fields will contain fields for both coarse and fine grid
50 | # at QUARTER STEPS
51 | for t in range(8,tsteps): #odd steps for main grid, even for subgrid
52 | # update Hz field on coarse grid
53 | print(t)
54 | Ey[0] = 0;
55 | Hz_next = Hz + (dt_coarse / dx_coarse) * (Ey - np.roll(Ey, 1))
56 | Hz = Hz_next;
57 | Hz_storage.append(Hz);
58 |
59 | # update Ey field on coarse grid t--> t+dt
60 | Hz[0] = 0; #dirichlet
61 | Ey_next = Ey + (dt_coarse / dx_coarse) * (np.roll(Hz, -1) - Hz)
62 | Ey = Ey_next;
63 |
64 | # source injection
65 | Ey[50] += np.exp(-(t - 30.) * (t - 30.) / 100);
66 | Ey_storage.append(Ey);
67 |
68 | ## Once we do the update, we need to analyze the border points between fine and coarse
69 | # now we transfer information to the fine grid
70 |
71 | hz[0] = (2/3)*(Hz[-1])+(1/3)*(hz[1]) #- fine grid values t+ dt updated from t
72 | ey[0] = (2/3)*(Ey[-1])+(1/3)*(ey[1]) #- fine grid interpolation at t + dt/2 updated from t-dt/2
73 |
74 | ##time interpolate subgrid fields at t+dt/2 for hz and t+dt/4 for ey
75 | tsamples = [-4,0,8]; y = [ey_storage[t-4][0],ey_storage[t][0],ey_storage[t-8][0]];
76 | f = interp1d(tsamples,y, kind='quadratic')
77 |
78 | ## apply the interpolation in time to the border points
79 | es_tminushalf = f(-2);
80 | hb_tminusquarter =f(-2);
81 |
82 | # ## use Yee update to get a different value of the fine grids at t+dt/2 and t+dt/4
83 | hb_tminusquarter2 = hz_storage[t-4][0] - (Ey[1]-(es_tminushalf));
84 | #create weighted average
85 | hb_tminusquarter = hb_tminusquarter*0.65+0.35*hb_tminusquarter2
86 |
87 | ey[0] = es_tminushalf;
88 | hz[0] = hb_tminusquarter;
89 |
90 | ##### YEE UPDATES NO INTERPOLATION
91 | # update the fine grid values for the electric field
92 | hz[0] = 0; #ey
93 | ey_next = ey + (dt_fine / dx_fine) * (np.roll(hz, -1) - hz)
94 | ey = ey_next;
95 | ey_storage.append(ey) #ey at t
96 |
97 | #update hz field to h_int to t+0.25;
98 | ey[-1] = 0; # dirichlet
99 | hz_next = hz + (dt_fine / dx_fine) * (ey - np.roll(ey, 1))
100 | hz = hz_next;
101 | hz_storage.append(hz) #at t+0.25;
102 |
103 | ## NOW THAT WE HAVE RUN THE UPDATE on the fine grid,
104 | ## we reverse interpolate back onto the coarse grid
105 | ## update all H coarse files at t+0.25;
106 | Hz[-1] = hz[0]*(1/3)+(2/3)*Hz[-2];
107 |
108 | ## now we do another quartertime step to get e to t+1, the time step of HZ
109 | ey = ey +(np.roll(hz,-1)-hz);
110 | hz = hz + (dt_fine / dx_fine) * (ey - np.roll(ey, 1))
111 |
112 | ## update coarse E fields and H fields via interpolation again
113 | # Hz[-1] = hz[0]*(1/3)+(2/3)*Hz[-1];
114 | # Ey[-1] = ey[0]*(1/3)+(2/3)*Ey[-2];
115 |
116 | ## why do we need the H fields at the quarter time steps???
117 |
118 | Ey_prev = Ey;
119 | ## at the end, everything has been stepped forward one coarse time step
120 | if(t%10 == 0):
121 | plt.plot(xcoarse, Hz)
122 | plt.hold(True)
123 | plt.plot(xfine, hz)
124 | plt.ylim([-0.5, 1])
125 | plt.pause(0.001)
126 | plt.clf()
127 |
128 | # plt.plot(fieldAmplitudes)
129 | # plt.pause(0.05)
130 |
--------------------------------------------------------------------------------
/FDTD1D/SubgridTest1D.py:
--------------------------------------------------------------------------------
1 | ## step 1, how do we visualize a nonuniform grid
2 | import numpy as np;
3 | import matplotlib.pyplot as plt
4 |
5 | fullxrange = [-400, 400];
6 | lambda_0 = 800;
7 | dx_coarse = lambda_0/100;
8 | dx_fine = dx_coarse/2; ## refinement factor of 2;
9 | c = 1;
10 |
11 | #there are two time steps...
12 | dt_coarse = dx_coarse;
13 | dt_fine = dx_fine;
14 |
15 | finexrange = [-200, 200];
16 |
17 | Nx = int(800/dx_coarse);
18 | Nf = int(200/dx_fine);
19 |
20 | xcoarse = np.linspace(-400, 400, Nx+1)
21 | xfine = np.linspace(-200, 200, Nf+1);
22 |
23 | borders = [-200, 200];
24 | bordernodes = [25, 100];
25 |
26 | Hz = np.zeros(Nx+1);
27 | Ey = np.zeros(Nx+1);
28 | ey = np.zeros(Nf+1);
29 | hz = np.zeros(Nf+1);
30 | ## we need to be able to map the spatial positions of the coarse and fine grids
31 |
32 |
33 | tsteps = 200;
34 | for t in range(tsteps): #odd steps for main grid, even for subgrid
35 | # update Hz field
36 | if(t%2 == 1):
37 | print(t)
38 | Hz_next = np.zeros((Nx + 1,))
39 | deriv = Ey[1:] - np.roll(Ey, 1)[1:]
40 | deriv = Ey[0] + deriv;
41 | Hz_next = Hz + (dt_coarse / dx_coarse) * (Ey - np.roll(Ey, 1))
42 |
43 | Hz = Hz_next;
44 |
45 | # update Ey field
46 | Ey0 = Ey[-2]
47 | Ey_next = np.zeros((Nx + 1,));
48 | Ey_next = Ey + (dt_coarse / dx_coarse) * (np.roll(Hz, -1) - Hz)
49 | Ey = Ey_next;
50 |
51 |
52 | Ey[50] += np.exp(-(t - 30.) * (t - 30.) / 100);
53 |
54 | ## Once we do the update, we need to analyze the border points between fine and coarse
55 | # in 1D, the boundary is 1D
56 |
57 | #1/3 and 2/3 are linear interpolation coefficients for refinement factof of 2
58 | ey[0] = Ey[-1]*(1/3)+ey[1]*(2/3); #these are the field values after the coarse grid has been time stepped dt, but the fine grid has dt/2
59 | hz[0] = Hz[-1]*(1/3)+hz[1]*(2/3);
60 |
61 |
62 | ##apparently, there's a time interpolation step?
63 | #step ey and hz by a quarter steps
64 | hz_next = np.zeros((Nx + 1,))
65 | deriv = ey[1:] - np.roll(ey, 1)[1:]
66 | deriv = ey[0] + deriv;
67 | hz_next = hz + (dt_coarse / dx_coarse) * (ey - np.roll(ey, 1))
68 | hz = hz_next;
69 |
70 | # update Ey field
71 | ey0 = ey[-2]
72 | ey_next = np.zeros((Nf + 1,));
73 | ey_next = ey + (dt_fine / dx_fine) * (np.roll(hz, -1) - hz)
74 | ey = ey_next;
75 |
76 |
77 | #step Ey and Hz by a quarter step;
78 | Hz_next = np.zeros((Nx + 1,))
79 | deriv = Ey[1:] - np.roll(Ey, 1)[1:]
80 | deriv = Ey[0] + deriv;
81 | Hz_next = Hz + (dt_fine / dx_fine) * (Ey - np.roll(Ey, 1))
82 |
83 | Hz = Hz_next;
84 |
85 | # update Ey field
86 | Ey0 = Ey[-2]
87 | Ey_next = np.zeros((Nx + 1,));
88 | Ey_next = Ey + (dt_fine / dx_fine) * (np.roll(Hz, -1) - Hz)
89 | Ey = Ey_next;
90 |
91 |
92 | Ey[50] += np.exp(-(t - 30.) * (t - 30.) / 100);
93 |
94 |
95 | ## at the end, everything has been stepped forward one coarse time step
96 | plt.plot(xcoarse, Hz)
97 | plt.hold(True)
98 | plt.plot(xfine, hz)
99 | plt.ylim([-0.5, 1])
100 | plt.pause(0.001)
101 | plt.clf()
102 | else:
103 | None;
104 | # plt.plot(fieldAmplitudes)
105 | # plt.pause(0.05)
106 |
--------------------------------------------------------------------------------
/FDTD1D/TFSF1D.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from numpy import linalg as nl
4 | N = 200;
5 |
6 | Hz = np.zeros((N+1, ));
7 | IC = lambda x: np.cos(np.pi*x/10)
8 | x = np.linspace(-50,50,N+1);
9 | Ey = np.zeros((N+1,))
10 | # for i in range(len(x)):
11 | # if(abs(x[i])<= 5):
12 | # Ey[i] = np.cos(x[i]*np.pi/10)**2;
13 | # else:
14 | # Ey[i] = 0;
15 | # plt.plot(x, Ey)
16 | Ey = np.squeeze(Ey);
17 | print(Ey.shape)
18 | print(Hz.shape)
19 | dt = 2;
20 | dx = 2;
21 | cc = 1;#dt/dx
22 |
23 | eps = np.ones((N+1,));
24 | eps[125:150] = 4;
25 |
26 | tsteps = 200;
27 | plt.ion()
28 | fieldAmplitudes = list();
29 | plt.figure;
30 | abc = (cc*dt - dx)/(cc*dt + dx);
31 | mu_0 = 1;
32 | for t in range(tsteps):
33 | print('time step: '+str(t))
34 | #update Hz field
35 | deriv = Ey[1:]-np.roll(Ey,1)[1:]
36 | deriv = Ey[0]+deriv;
37 | Hz_next = Hz + (dt/dx)*(Ey - np.roll(Ey, 1))
38 |
39 | Hz_next[0] = Hz[1] + abc*(Hz_next[1] - Hz[0])
40 | Hz = Hz_next;
41 |
42 | delay = dx/2+dt/2
43 | Hz[99] += -np.exp(-(t-30)**2/100)
44 |
45 | Dy = np.multiply(eps, Ey);
46 | #update Ey field
47 | Dy_next = Dy + (dt / dx) * (np.roll(Hz, -1) - Hz)
48 |
49 | #E -field abc
50 | Dy_next[-1] = Dy[-2] + abc * (Dy_next[-2] - Dy[-1])
51 |
52 | Ey = np.divide(Dy_next, eps);
53 | #point source pulse
54 | Ey[100] += np.exp(-(t - 30.+delay)**2/ 100);
55 |
56 |
57 |
58 | plt.plot(x,Hz)
59 | plt.plot(x,Ey)
60 | plt.ylim([-0.5, 1])
61 | plt.pause(0.0001)
62 | plt.clf()
63 | # plt.plot(fieldAmplitudes)
64 | # plt.pause(0.05)
65 | # plt.clf()
--------------------------------------------------------------------------------
/FDTD1D/UPML.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | ## 1D version
4 | N = 209;
5 | Hx = np.zeros((N + 1,));
6 | IC = lambda x: np.cos(np.pi*x/20)
7 | x = np.linspace(-40,40,N+1);
8 | Ey = np.zeros((N+1,))
9 |
10 | dx = 1;
11 | cc = 1;#dt/dx
12 | dt = dx;
13 | Npmlx = 10;
14 | Nx = len(Hx);
15 |
16 | xn = np.zeros((Nx,1))
17 | fi1 = np.zeros((Nx,1))
18 | gi2 = np.ones((Nx,1))
19 | gi3 = np.ones((Nx,1));
20 | fi10 = np.zeros((Npmlx, 1))
21 | gi20 = np.zeros((Npmlx, 1))
22 | gi30 = np.zeros((Npmlx, 1))
23 |
24 | for i in range(Npmlx):
25 | x_n = (1/3)*((i+1)/Npmlx)**3;
26 | xn[Nx-Npmlx+i] = x_n;
27 | xn[Npmlx-1-i] = x_n;
28 |
29 | fi1[Npmlx-1-i] = x_n;
30 | gi2[Npmlx-1-i] = 1/(1+x_n);
31 | gi3[Npmlx-1-i] = (1-x_n)/(1+x_n);
32 |
33 | fi10[i] = x_n;
34 | gi20[i] = 1/(1+x_n);
35 | gi30[i] = (1-x_n)/(1+x_n);
36 |
37 | fi1[Nx-Npmlx+i] = x_n;
38 | gi2[Nx-Npmlx+i] = 1/(1+x_n);
39 | gi3[Nx-Npmlx+i] = (1-x_n)/(1+x_n);
40 |
41 | plt.plot(fi1)
42 | plt.plot(gi2);
43 | plt.plot(gi3)
44 | plt.show()
45 | gi3 = np.squeeze(gi3);
46 | gi2 = np.squeeze(gi2);
47 |
48 | ## apply it to the fdtd
49 |
50 |
51 | plt.ion()
52 | fieldAmplitudes = list();
53 | plt.figure;
54 | abc = (cc*dt - dx)/(cc*dt + dx);
55 | tsteps = 1000;
56 | for t in range(tsteps):
57 | print(t)
58 | #J = np.exp(-(t-40)**2/100);
59 | J = 0.5*np.sin(2*np.pi*t/50)
60 | print(J)
61 | #update Hz field
62 | #Ey[-1] = 0;
63 | Hx_next = np.multiply(gi3,Hx) - (dt / dx) * \
64 | np.multiply(gi2, (Ey - np.roll(Ey, 1)))
65 | # for i in range(0, N):
66 | # Hz_next[i] = Hz[i] + (dt/dx)*(Ey[i+1] - (Ey[i]));
67 | #H field abc, #Hz[0] is never updated during the loop
68 | #Hz_next[0] = Hz[1] + abc*(Hz_next[1] - Hz[0])
69 | Hx = Hx_next;
70 |
71 | #update Ey field
72 | #Hx[0] = 0;
73 | Ey_next = np.multiply(gi3,Ey) - \
74 | (dt/dx)*np.multiply(gi2,(np.roll(Hx, -1) - Hx))
75 |
76 | # for i in range(1, N+1):
77 | # Ey_next[i] = Ey[i] + (dt/dx)*(Hz[i] - Hz[i-1]);
78 | #E -field abc
79 | #Ey_next[N] = Ey0 +abc*(Ey_next[-2] - Ey[-1])
80 | #point source pulse
81 | #Ey[50] += np.exp(-(t - 30.) * (t - 30) / 100);
82 | Ey = Ey_next;
83 | Ey[110] -= J;
84 |
85 | if(t%10 == 0):
86 | plt.plot(x,Ey)
87 | plt.ylim([-1, 1])
88 | plt.pause(0.00001)
89 | plt.clf()
90 | # plt.plot(fieldAmplitudes)
91 | # plt.pause(0.05)
92 | # plt.clf()
--------------------------------------------------------------------------------
/FDTD1D/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD1D/__init__.py
--------------------------------------------------------------------------------
/FDTD2D/DielectricGenerator2D/GMRStructure.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 |
4 | def GMRWaveguide(Nx, Ny, structureLength, structureWidth,\
5 | structureSpacing, numCells, vacuumSpace, diel):
6 | unitCellSpacing = structureLength + structureSpacing;
7 |
8 | structure = diel * np.ones((structureLength, structureWidth))
9 | spacing = np.ones((structureWidth, structureSpacing));
10 | unitcell = np.concatenate((structure, spacing), axis=1);
11 | GMR = unitcell
12 | for i in range(numCells):
13 | GMR = np.concatenate((GMR, unitcell), axis=1)
14 |
15 | ## concatenate vacuum on both sides
16 | print(GMR.shape)
17 | [Nx, ny] = GMR.shape;
18 | vacuum = np.ones((vacuumSpace, ny));
19 | print(vacuum.shape)
20 | simDomain = np.concatenate((vacuum, GMR, vacuum), axis=0)
21 | return simDomain
22 |
23 |
24 | # Nx = 100;
25 | # Ny = 100;
26 | #
27 | # structureLength = 10;
28 | # structureWidth = 10;
29 | # structureSpacing = 10;
30 | # diel = 12;
31 | # eps = np.zeros((Nx,Ny))
32 | #
33 | # unitCellSpacing = structureLength+structureSpacing;
34 | #
35 | # structure = diel*np.ones((structureLength, structureWidth))
36 | # spacing = np.ones((structureWidth, structureSpacing));
37 | # unitcell = np.concatenate((structure, spacing), axis = 1);
38 | # GMR = unitcell
39 | # for i in range(int(Nx/unitCellSpacing)-1):
40 | # GMR = np.concatenate((GMR, unitcell), axis = 1)
41 | #
42 | # ## concatenate vacuum on both sides
43 | # print(GMR.shape)
44 | # [Nx, ny] = GMR.shape;
45 | # vacuumedge = (Ny - structureWidth) / 2
46 | # vacuum = np.ones((50,ny));
47 | # print(vacuum.shape)
48 | # simDomain = np.concatenate((vacuum, GMR, vacuum), axis = 0)
49 | #
50 | # plt.imshow(simDomain)
51 | # plt.show()
--------------------------------------------------------------------------------
/FDTD2D/DielectricGenerator2D/PhotonicCrystalGrid.py:
--------------------------------------------------------------------------------
1 | import matplotlib.pyplot as plt;
2 | import numpy as np
3 | from numpy import matlib
4 | from FDTD2D.DielectricGenerator2D import createShapes as cs
5 |
6 | def PhotonicGrid(xCell, yCell, cellSize, epsilon):
7 | [Nx, Ny] = cellSize;
8 | r = int(Nx/3);
9 | cell = cs.createCircle(Nx, Ny, epsilon, r);
10 | grid = np.matlib.repmat(cell, xCell, yCell);
11 |
12 | return grid;
13 |
14 | def PhotonicWaveguide():
15 | return None;
16 | #
17 | # xCell = 2; yCell = 2;
18 | # cellSize = [50,50]; epsilon = 12;
19 | #
20 | # [Nx, Ny] = cellSize;
21 | # r = int(Nx / 3);
22 | # cell = cs.createCircle(Nx, Ny, epsilon, r);
23 | # grid = np.matlib.repmat(cell, xCell, yCell);
24 | # grid = PhotonicGrid(xCell, yCell, cellSize, 12);
25 | # plt.imshow(grid)
26 | # plt.show()
27 |
--------------------------------------------------------------------------------
/FDTD2D/DielectricGenerator2D/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/DielectricGenerator2D/__init__.py
--------------------------------------------------------------------------------
/FDTD2D/DielectricGenerator2D/__pycache__/GMRStructure.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/DielectricGenerator2D/__pycache__/GMRStructure.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/DielectricGenerator2D/__pycache__/PhotonicCrystalGrid.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/DielectricGenerator2D/__pycache__/PhotonicCrystalGrid.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/DielectricGenerator2D/__pycache__/__init__.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/DielectricGenerator2D/__pycache__/__init__.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/DielectricGenerator2D/__pycache__/createShapes.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/DielectricGenerator2D/__pycache__/createShapes.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/DielectricGenerator2D/createShapes.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 | def createCircle(Nx, Ny, epsilon, r):
4 | eps = np.ones((Nx, Ny));
5 | eps.astype('complex')
6 | # Create index arrays to z
7 | I, J = np.meshgrid(np.arange(eps.shape[0]),\
8 | np.arange(eps.shape[1]))
9 |
10 | # calculate distance of all points to centre
11 | dist = np.sqrt((I - Nx/2 + 1) ** 2 + (J - Ny/2 + 1) ** 2)
12 | eps[np.where(dist < r)] = epsilon;
13 | return eps;
--------------------------------------------------------------------------------
/FDTD2D/FDTD2Dex.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 |
4 | Nx = 200;
5 | Ny = 200;
6 | ## create epsilon
7 | eps = np.ones((Nx, Ny));
8 |
9 | ##initialize fields
10 | Ex = np.zeros((Nx,Ny));
11 | Ey = np.zeros((Nx, Ny));
12 | Hz = np.zeros((Nx, Ny));
13 | #spatial steps
14 | dx = dy = 1;
15 |
16 | #time steps
17 | tsteps = 100;
18 | dt = 1
19 | c = 1;
20 | ## courant constant
21 | cc = c*dt/min(dx, dy);
22 | plt.ion()
23 | fieldAmplitudes = list();
24 | plt.figure(figsize=(10,10));
25 | cc = 0.5;
26 | for t in range(tsteps):
27 | print('t= '+str(t))
28 | #update Hz, Ex, Ey
29 | #remember the yee grid and integer indexing
30 |
31 | # update H field components
32 | deriv_y = np.zeros((Nx, Ny));
33 | deriv_x = np.zeros((Nx, Ny));
34 | for j in range(Nx):
35 | for k in range(Ny):
36 | indx = j + 1; indy = k + 1;
37 | if (indx > Nx - 1):
38 | indx = 0;
39 | if (indy > Ny - 1):
40 | indy = 0;
41 | # TEz mode...only transverse x and y E field
42 | deriv_y[k, j] = (Ex[indy, j] - Ex[k, j]);
43 | deriv_x[k, j] = (Ey[k, indx] - Ey[k, j]);
44 |
45 | Hz -= (deriv_x - deriv_y);
46 | Hz[100, 100] -= np.sin(2*np.pi*t/30)*(dt);
47 |
48 |
49 | #update E field components
50 | Curl_x = np.zeros((Nx, Ny));
51 | Curl_y = np.zeros((Nx, Ny));
52 | for j in range(Nx): #y axis
53 | for k in range(Ny): #x axis;
54 | indx = j - 1; indy = k - 1;
55 | if(indx < 0):
56 | indx = Nx - 1;
57 | if(indy < 0):
58 | indy = Ny - 1;
59 | deriv_y = -(Hz[indy, j] - Hz[k, j]);
60 | deriv_x = -(Hz[k, indx] - Hz[k, j]);
61 | Curl_x[k, j]= (cc) * (deriv_x); #curl Hz, dy(Hz)
62 | Curl_y[k, j] = (cc) * (deriv_y) ; #cul Hz dx(Hz)
63 | Ex += Curl_y;
64 | Ey -= Curl_x;
65 |
66 |
67 |
68 | #insert point source
69 | if(t%10 == 0):
70 | plt.subplot(121)
71 | imgplot = plt.imshow(Ey)
72 | imgplot.set_cmap('jet')
73 | plt.subplot(122)
74 | imgplot = plt.imshow(Hz)
75 | imgplot.set_cmap('jet')
76 | plt.pause(0.001)
77 | plt.clf()
78 | plt.imshow(Hz)
79 | plt.figure()
80 | plt.plot(Hz[:,50])
81 | #get a 1D slice of the 2d field
82 | plt.show()
83 |
--------------------------------------------------------------------------------
/FDTD2D/Graphene/Graphene2DSheet.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | ## only Hx component sees the graphene if we put the sheet along x axis
4 |
5 | Nx = 200;
6 | Ny = 200;
7 | ## create epsilon
8 | eps = np.ones((Nx, Ny));
9 |
10 | ##initialize fields
11 | Hx = np.zeros((Nx, Ny));
12 | Hy = np.zeros((Nx, Ny));
13 | Ez = np.zeros((Nx, Ny));
14 | #spatial steps
15 | dx = dy = 1;
16 |
17 | ## COEFFICIENTS FOR SHEET
18 | sheet_loc_y= 85;
19 | Hx_int_left = np.zeros((Nx,));
20 | Hx_int_right = np.zeros((Nx,));
21 | tau = 0;
22 | #time steps
23 | tsteps = 200;
24 | dt = 1
25 | c = 1;
26 |
27 | ## COEFFICIENTS FOR THE SHEET UPDATE
28 |
29 |
30 | sigma_0 = 0.1;
31 | denom = (dx * sigma_0) - dt;
32 | c1 = (dt) / (dx * sigma_0 - dt);
33 | c2 = (dt) / (dx * sigma_0 - dt); ## if this is the courant number, there is instability introduced
34 |
35 | fe1 = sigma_0 * c1;
36 | fe2 = sigma_0 * c2;
37 | fh11 = 1-2.0*c1;
38 | fh22 = 1-2.0*c2
39 | fh12 = c1;
40 | fh21 = c2;
41 |
42 |
43 | ## courant constant
44 | cc = c*dt/min(dx, dy);
45 | plt.ion()
46 | fieldAmplitudes = list();
47 | plt.figure(figsize=(10,10));
48 | cc = 0.5;
49 | for t in range(tsteps):
50 | print('t= '+str(t))
51 | #update Hz, Ex, Ey
52 | #remember the yee grid and integer indexing
53 |
54 | # update H field components
55 | deriv_y = np.zeros((Nx, Ny));
56 | deriv_x = np.zeros((Nx, Ny));
57 | for j in range(Nx):
58 | for k in range(Ny):
59 | indx = j - 1;
60 | indy = k - 1;
61 | if (indx < 0):
62 | indx = Nx - 1;
63 | if (indy < 0):
64 | indy = Ny - 1;
65 |
66 | #Ez field yee updates couple into the sheet field
67 | if(k == sheet_loc_y+1):
68 | deriv_y[k, j] = +( Hx_int_left[j] - Hx[k-1,j]);
69 | deriv_x[k, j] = -(Hy[k, indx] - Hy[k,j]);
70 | elif(k == sheet_loc_y+2):
71 | deriv_y[k, j] = -(Hx_int_right[j]-Hx[k, j]);
72 | deriv_x[k, j] = -(Hy[k, indx] - Hy[k,j]);
73 | else:
74 | # TEz mode...only transverse x and y E field
75 | deriv_y[k, j] = -(Hx[indy, j] - Hx[k, j]);
76 | deriv_x[k, j] = -(Hy[k, indx] - Hy[k, j]);
77 |
78 | Ez -= (deriv_x - deriv_y);
79 | Ez[100, 100] -= np.sin(2 * np.pi * t / 30) * (dt);
80 |
81 |
82 | #update H field components
83 | Curl_x = np.zeros((Nx, Ny));
84 | Curl_y = np.zeros((Nx, Ny));
85 | F1n = np.zeros((Nx,));
86 | F2n = np.zeros((Nx,))
87 | for j in range(Nx): #y axis
88 | for k in range(Ny): #x axis;
89 | indx = j + 1;
90 | indy = k + 1;
91 | if (indx > Nx - 1):
92 | indx = 0;
93 | if (indy > Ny - 1):
94 | indy = 0;
95 |
96 | if(k == sheet_loc_y):
97 | deriv_x = -(Ez[k, indx] - Ez[k, j]);
98 | Curl_x[k, j] = (cc) * (deriv_x); # curl Hz, dy(Hz) #Hy still exists at sheet loc
99 | # DO NOT UPDATE THE FIELD AT THE SHEET LOC for Hx, IT DOES NOT EXIST
100 | ## consider the updates at k = sheet_loc_y, and k = sheet_loc_y+1
101 |
102 |
103 | elif(k == sheet_loc_y+1):
104 | deriv_y = -(Ez[indy, j] - Ez[k, j]);
105 | deriv_x = -(Ez[k, indx] - Ez[k, j]);
106 | Curl_x[k, j]= (cc) * (deriv_x); #curl Hz, dy(Hz)
107 | Curl_y[k, j] = (cc) * (deriv_y) ; #cul Hz dx(Hz)
108 | else:
109 |
110 | deriv_y = -(Ez[indy, j] - Ez[k, j]);
111 | deriv_x = -(Ez[k, indx] - Ez[k, j]);
112 | Curl_x[k, j]= (cc) * (deriv_x); #curl Hz, dy(Hz)
113 | Curl_y[k, j] = (cc) * (deriv_y) ; #cul Hz dx(Hz)
114 |
115 | F1n[j] = -2 * fe1 * Ez[sheet_loc_y, j] + (fh11 * Hx_int_left[j]) + (fh12 * (Hx_int_right[j]));
116 | F2n[j] = 2 * fe2 * Ez[sheet_loc_y+1 + 1, j] + (fh21 * Hx_int_left[j]) + (fh22 * (Hx_int_right[j]));
117 | # Ey is at time step n, but the interfaces are at n-1/2
118 | print(np.max(F1n))
119 |
120 | Hx_int_left = (1 / (1 - c1 * c2)) * (F1n + c1 * F2n); # time step to n+1/2 using F1n (at time step n)
121 | Hx_int_right = (1 / (1 - c1 * c2)) * (F2n + c2 * F1n);
122 | Hx += -Curl_y;
123 | Hy += Curl_x;
124 |
125 |
126 |
127 | #insert point source
128 | if(t%2 == 0):
129 | # print(np.max(Hx_int_left));
130 | # print(np.max(Hx_int_right))
131 | # print(np.max(Hx))
132 | # print(np.max(Ez))
133 | plt.subplot(121)
134 | imgplot = plt.imshow(Hy)
135 | imgplot.set_cmap('jet')
136 | plt.subplot(122)
137 | imgplot = plt.imshow(Ez)
138 | imgplot.set_cmap('jet')
139 | plt.clim([-0.02, 0.02])
140 | plt.pause(0.001)
141 | plt.clf()
142 | plt.imshow(Ez)
143 | plt.figure()
144 | plt.plot(Ez[:, 50])
145 | #get a 1D slice of the 2d field
146 | plt.show()
147 |
--------------------------------------------------------------------------------
/FDTD2D/Graphene/GrapheneSBCTest.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | ## only Hx component sees the graphene if we put the sheet along x axis
4 |
5 | Nx = 200;
6 | Ny = 200;
7 | ## create epsilon
8 | eps = np.ones((Nx, Ny));
9 |
10 | ##initialize fields
11 | Hx = np.zeros((Nx, Ny));
12 | Hy = np.zeros((Nx, Ny));
13 | Ez = np.zeros((Nx, Ny));
14 | #spatial steps
15 | dx = dy = 1;
16 |
17 | ## COEFFICIENTS FOR SHEET
18 | sheet_loc_y= 85;
19 | Hx_int_left = np.zeros((Nx,));
20 | Hx_int_right = np.zeros((Nx,));
21 | tau = 0;
22 | #time steps
23 | tsteps = 200;
24 | dt = 1
25 | c = 1;
26 |
27 | ## COEFFICIENTS FOR THE SHEET UPDATE
28 |
29 |
30 | sigma_0 = 0.1;
31 | denom = (dx * sigma_0) - dt;
32 | c1 = (dt) / (dx * sigma_0 - dt);
33 | c2 = (dt) / (dx * sigma_0 - dt); ## if this is the courant number, there is instability introduced
34 |
35 | fe1 = sigma_0 * c1;
36 | fe2 = sigma_0 * c2;
37 | fh11 = 1-2.0*c1;
38 | fh22 = 1-2.0*c2
39 | fh12 = c1;
40 | fh21 = c2;
41 |
42 |
43 | ## courant constant
44 | cc = c*dt/min(dx, dy);
45 | plt.ion()
46 | fieldAmplitudes = list();
47 | plt.figure(figsize=(10,10));
48 | cc = 0.5;
49 | for t in range(tsteps):
50 | print('t= '+str(t))
51 | #update Hz, Ex, Ey
52 | #remember the yee grid and integer indexing
53 |
54 | # update H field components
55 | deriv_y = np.zeros((Nx, Ny));
56 | deriv_x = np.zeros((Nx, Ny));
57 | for j in range(Nx):
58 | for k in range(Ny):
59 | indx = j - 1;
60 | indy = k - 1;
61 | if (indx < 0):
62 | indx = Nx - 1;
63 | if (indy < 0):
64 | indy = Ny - 1;
65 |
66 | #Ez field yee updates couple into the sheet field
67 | if(k == sheet_loc_y):
68 | deriv_y[k, j] = +( Hx_int_left[j] - Hx[k-1,j]);
69 | deriv_x[k, j] = -(Hy[k, indx] - Hy[k,j]);
70 | elif(k == sheet_loc_y+1):
71 | deriv_y[k, j] = -(Hx_int_right[j]-Hx[k, j]);
72 | deriv_x[k, j] = -(Hy[k, indx] - Hy[k,j]);
73 | else:
74 | # TEz mode...only transverse x and y E field
75 | deriv_y[k, j] = -(Hx[indy, j] - Hx[k, j]);
76 | deriv_x[k, j] = -(Hy[k, indx] - Hy[k, j]);
77 |
78 | Ez -= (deriv_x - deriv_y);
79 | Ez[100, 100] -= np.sin(2 * np.pi * t / 30) * (dt);
80 |
81 |
82 | #update H field components
83 | Curl_x = np.zeros((Nx, Ny));
84 | Curl_y = np.zeros((Nx, Ny));
85 | F1n = np.zeros((Nx,));
86 | F2n = np.zeros((Nx,))
87 | for j in range(Nx): #y axis
88 | for k in range(Ny): #x axis;
89 | indx = j + 1;
90 | indy = k + 1;
91 | if (indx > Nx - 1):
92 | indx = 0;
93 | if (indy > Ny - 1):
94 | indy = 0;
95 |
96 | if(k == sheet_loc_y):
97 | deriv_x = -(Ez[k, indx] - Ez[k, j]);
98 | Curl_x[k, j] = (cc) * (deriv_x); # curl Hz, dy(Hz) #Hy still exists at sheet loc
99 | # DO NOT UPDATE THE FIELD AT THE SHEET LOC for Hx, IT DOES NOT EXIST
100 | ## consider the updates at k = sheet_loc_y, and k = sheet_loc_y+1
101 | elif(k == sheet_loc_y+1):
102 | deriv_y = -(Ez[indy, j] - Ez[k, j]);
103 | deriv_x = -(Ez[k, indx] - Ez[k, j]);
104 | Curl_x[k, j]= (cc) * (deriv_x); #curl Hz, dy(Hz)
105 | Curl_y[k, j] = (cc) * (deriv_y) ; #cul Hz dx(Hz)
106 | else:
107 |
108 | deriv_y = -(Ez[indy, j] - Ez[k, j]);
109 | deriv_x = -(Ez[k, indx] - Ez[k, j]);
110 | Curl_x[k, j]= (cc) * (deriv_x); #curl Hz, dy(Hz)
111 | Curl_y[k, j] = (cc) * (deriv_y) ; #cul Hz dx(Hz)
112 |
113 | F1n[j] = -2 * fe1 * Ez[sheet_loc_y, j] + (fh11 * Hx_int_left[j]) + (fh12 * (Hx_int_right[j]));
114 | F2n[j] = 2 * fe2 * Ez[sheet_loc_y+1 + 1, j] + (fh21 * Hx_int_left[j]) + (fh22 * (Hx_int_right[j]));
115 | # Ey is at time step n, but the interfaces are at n-1/2
116 | Hx_int_left[j] = (1 / (1 - c1 * c2)) * (F1n[j] + c1 * F2n[j]); # time step to n+1/2 using F1n (at time step n)
117 | Hx_int_right[j] = (1 / (1 - c1 * c2)) * (F2n[j] + c2 * F1n[j]);
118 | print(np.max(F1n))
119 |
120 |
121 | Hx += -Curl_y;
122 | Hy += Curl_x;
123 |
124 |
125 |
126 | #insert point source
127 | if(t%2 == 0):
128 | # print(np.max(Hx_int_left));
129 | # print(np.max(Hx_int_right))
130 | # print(np.max(Hx))
131 | # print(np.max(Ez))
132 | plt.subplot(121)
133 | imgplot = plt.imshow(Hy)
134 | imgplot.set_cmap('jet')
135 | plt.subplot(122)
136 | imgplot = plt.imshow(Ez)
137 | imgplot.set_cmap('jet')
138 | plt.clim([-0.02, 0.02])
139 | plt.pause(0.001)
140 | plt.clf()
141 | plt.imshow(Ez)
142 | plt.figure()
143 | plt.plot(Ez[:, 50])
144 | #get a 1D slice of the 2d field
145 | plt.show()
146 |
--------------------------------------------------------------------------------
/FDTD2D/Graphene/TE_unvectorized.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 |
4 | Nx = 200;
5 | Ny = 200;
6 | ## create epsilon
7 | eps = np.ones((Nx, Ny));
8 |
9 | ##initialize fields
10 | Hx = np.zeros((Nx, Ny));
11 | Hy = np.zeros((Nx, Ny));
12 | Ez = np.zeros((Nx, Ny));
13 | #spatial steps
14 | dx = dy = 1;
15 |
16 | #time steps
17 | tsteps = 100;
18 | dt = 1
19 | c = 1;
20 | ## courant constant
21 | cc = c*dt/min(dx, dy);
22 | plt.ion()
23 | fieldAmplitudes = list();
24 | plt.figure(figsize=(10,10));
25 | cc = 0.5;
26 | for t in range(tsteps):
27 | print('t= '+str(t))
28 | #update Hz, Ex, Ey
29 | #remember the yee grid and integer indexing
30 |
31 | # update H field components
32 | deriv_y = np.zeros((Nx, Ny));
33 | deriv_x = np.zeros((Nx, Ny));
34 | for j in range(Nx):
35 | for k in range(Ny):
36 | indx = j - 1; indy = k - 1;
37 | if (indx < 0):
38 | indx = Nx - 1;
39 | if (indy < 0):
40 | indy = Ny - 1;
41 | # TEz mode...only transverse x and y E field
42 | deriv_y[k, j] = -(Hx[indy, j] - Hx[k, j]);
43 | deriv_x[k, j] = -(Hy[k, indx] - Hy[k, j]);
44 |
45 | Ez -= (deriv_x - deriv_y);
46 | Ez[100, 100] -= np.sin(2 * np.pi * t / 30) * (dt);
47 |
48 |
49 | #update E field components
50 | Curl_x = np.zeros((Nx, Ny));
51 | Curl_y = np.zeros((Nx, Ny));
52 | for j in range(Nx): #y axis
53 | for k in range(Ny): #x axis;
54 | indx = j + 1; indy = k + 1;
55 | if (indx > Nx - 1):
56 | indx = 0;
57 | if (indy > Ny - 1):
58 | indy = 0;
59 |
60 | deriv_y = -(Ez[indy, j] - Ez[k, j]);
61 | deriv_x = -(Ez[k, indx] - Ez[k, j]);
62 | Curl_x[k, j]= (cc) * (deriv_x); #curl Hz, dy(Hz)
63 | Curl_y[k, j] = (cc) * (deriv_y) ; #cul Hz dx(Hz)
64 | Hx -= Curl_y;
65 | Hy += Curl_x;
66 |
67 |
68 |
69 | #insert point source
70 | if(t%10 == 0):
71 | plt.subplot(121)
72 | imgplot = plt.imshow(Hy)
73 | imgplot.set_cmap('jet')
74 | plt.subplot(122)
75 | imgplot = plt.imshow(Ez)
76 | imgplot.set_cmap('jet')
77 | plt.pause(0.001)
78 | plt.clf()
79 | plt.imshow(Ez)
80 | plt.figure()
81 | plt.plot(Ez[:, 50])
82 | #get a 1D slice of the 2d field
83 | plt.show()
84 |
--------------------------------------------------------------------------------
/FDTD2D/Graphene/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/Graphene/__init__.py
--------------------------------------------------------------------------------
/FDTD2D/GuidedModeResonance/GMR2D.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from FDTD2D.DielectricGenerator2D import GMRStructure as GMR
4 | from FDTD2D.Simulators import runTE
5 |
6 | ## fundamental parameter specificatoin (all 1)
7 | c = 1; # we are in units of nanometers;
8 | eps_0 = 1; mu_0 = 1;
9 |
10 | lambda_0 = 800;
11 | lambda_up = 1200;
12 | lambda_low = 400;
13 |
14 | dx = lambda_0/200; dy = dx;
15 | dt = (1/2)**.5*dx/c;
16 | xrange = [-400, 400];
17 | yrange = [-400, 400];
18 |
19 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
20 | source = np.array([0, 0])-xstart; source = [int(i/dx) for i in source];
21 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
22 |
23 |
24 | Nx = int((xrange[1]-xrange[0])/dx);
25 | Ny = int((yrange[1]-yrange[0])/dy);
26 | ## create epsilon
27 |
28 | ## structure specification
29 |
30 | structureLength = 50;
31 | structureWidth = 50;
32 | structureSpacing = 0; numCells = 20; diel = 12;
33 | vacuumSpace = int((Nx-10)/2);
34 | eps = GMR.GMRWaveguide(Nx, Ny,structureLength,structureWidth,\
35 | structureSpacing,numCells, vacuumSpace,diel);
36 | plt.imshow(eps)
37 | plt.show()
38 | [Nx, Ny] = eps.shape
39 | print(eps.shape)
40 | # plt.imshow(eps)
41 | # plt.show()
42 |
43 | ##initialize fields (consider a sparse initializiation)
44 | Npml = [10,10];
45 | Hx = np.zeros((Nx, Ny));
46 | Hy = np.zeros((Nx, Ny));
47 | Ez = np.zeros((Nx, Ny));
48 | #spatial steps
49 | #time steps
50 | tsteps = 1000;
51 | timeRun = np.arange(1,1000+1)
52 | J = np.sin(2*np.pi*timeRun/20);
53 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
54 | omega_0 = 2*np.pi/lambda_0;
55 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
56 | #print(omega_0); print(sigma)
57 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
58 |
59 | J = currSource(timeRun, lambda_up, lambda_low, 170, c, dx);
60 | print(J)
61 |
62 | storedFields = runTE.runTE(tsteps, dt, dx, dy, eps, Ez, Hx, Hy,J,Npml, sourcePos = [112,112])
63 |
--------------------------------------------------------------------------------
/FDTD2D/PML/SCPML.py:
--------------------------------------------------------------------------------
1 | ## first, we need to be able to visualize a non-uniform grid
2 | import numpy as np;
3 | import matplotlib.pyplot as plt
4 | plt.close('All')
5 | ## want to apply the pml as a matrix operation on a matrix HX of nxmxl
6 | ## calculate the PML on a 2x grid, since the even values go for H
7 | ## and the odd values will go for E
8 | ## EMLAB calculation of PML
9 |
10 | lambda_0 = 100; omega_0 = 2*np.pi/lambda_0;
11 | lambda_up = 200;
12 | lambda_low = 50;
13 | dx = 800/100; dy = dx; c =1;
14 | dt = (1/2)**.5*dx/c;
15 | xrange = [-400, 400];
16 | yrange = [-400, 400];
17 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
18 | source = np.array([0,0])-xstart; source = [int(i/dx) for i in source];
19 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
20 |
21 | Nx = int((xrange[1]-xrange[0])/dx);
22 | Ny = int((yrange[1]-yrange[0])/dy);
23 |
24 | c = 1; # we are in units of nanometers;
25 |
26 | Npml = np.array([40,40]);
27 | Nx2 = Nx+2*Npml[0];
28 | Ny2 = Ny+2*Npml[1];
29 | Nx2 = 2*Nx;
30 | Ny2 = 2*Nx;
31 |
32 | ## x-direction pml
33 | ## no 2x grid concept
34 | sigx = np.zeros((Nx2, Ny2));
35 | #left hand side (need negative values)
36 | for nx in range(2*Npml[0]):
37 | nx1 = 2*Npml[0]-nx-1;
38 | sigx[nx1, :] = (0.5/dt)*(nx/2/Npml[0])**4;
39 | #right hand side
40 | for nx in range(2*Npml[0]):
41 | nx1 = Nx2-2*Npml[1]+nx;
42 | sigx[nx1,:] =(0.5/dt)*(nx/2/Npml[1])**4
43 |
44 | ## vertical y direction pml
45 | sigy = np.zeros((Nx2, Ny2))
46 | for ny in range(2*Npml[1]):
47 | ny1 = 2*Npml[0] - ny-1 ;
48 | sigy[:, ny1] = (0.5/dt)*(ny/2/Npml[0])**4;
49 | for ny in range(2*Npml[1]):
50 | ny1 = Ny2 - 2*Npml[1] +ny; #5 index in array for pml mapped value to go
51 | sigy[:, ny1] = (0.5/dt)*(ny/2/Npml[1])**4;
52 |
53 | plt.imshow(sigx)
54 | plt.figure()
55 | plt.imshow(sigy)
56 | plt.show()
57 | ## remember, no imaginary parts because we've transformed back into time domain
58 |
59 |
60 | URxx =1; ## these are permability term
61 | URyy = 1;
62 |
63 | ## CALCULATE UPDATE COEFFICIENTS with the PML incorporated
64 | sigHx0 = sigx[1:Nx2:2, 0:Ny2:2]
65 | sigHy0 = sigy[0:Nx2:2, 1:Ny2:2];
66 | mHx0 = (1/dt)+sigHy0/2
67 | mHx1 = np.divide(((1/dt)-sigHy0/2),mHx0);
68 | mHx2 = -1/(URxx*mHx0) #update to curl term
69 | mHx3 = -dt*np.divide(sigHx0,mHx0)
70 |
71 | sigHx = sigx[1:Nx2:2, 0:Ny2:2]
72 | sigHy = sigy[0:Nx2:2, 1:Ny2:2];
73 | mHy0 = (1/dt)+sigHx/2; # allvalues greater than 1, #concave up like sigHy
74 | mHy1 = np.divide(((1/dt)-sigHx/2),mHy0); #update to past Hy field, concave down
75 | mHy2 = -np.squeeze(1/(mHy0)); #update to curl term
76 | mHy3 = -(dt)*np.divide(sigHy,URyy*mHy0);
77 |
78 | ## Ez is in the center of the square yee cell
79 | sigDx = sigx[1:Nx2:2, 1:Ny2:2];
80 | sigDy = sigy[1:Nx2:2, 1:Ny2:2];
81 | mDz0 = (1/dt) + (sigDx + sigDy)/2 + (sigDx*sigDy)*dt/2
82 | mDz1 = (1/dt) - (sigDx + sigDy)/2 - (sigDx*sigDy)*dt/2;
83 | mDz1 = np.divide(mDz1,mDz0);
84 | mDz2 = 1/mDz0;
85 | #mDz3 is 0
86 | mDz4 = -(dt)*(sigDx*sigDy/mDz0);
87 |
88 | plt.figure()
89 | plt.plot(sigHy[1,:])
90 | plt.plot(sigHx[:,1])
91 | plt.figure()
92 | plt.plot(sigHx[:,1])
93 | plt.plot(sigDy[:,1])
94 | # plt.subplot(221)
95 | # plt.imshow(mDz0)
96 | # plt.subplot(222)
97 | # plt.imshow(mDz1)
98 | # plt.subplot(223)
99 | # plt.imshow(mDz2)
100 | # plt.subplot(224)
101 | # plt.imshow(mDz4)
102 | plt.show()
103 |
104 | #### TEST THE PML #######################################################
105 | #########################################################################
106 |
107 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
108 | omega_0 = 2*np.pi/lambda_0;
109 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
110 | #print(omega_0); print(sigma)
111 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
112 |
113 |
114 |
115 | ## create epsilon
116 | eps = np.ones((Nx, Ny));
117 | #eps[50:150, 50:150] = 4;
118 |
119 | ##initialize fields (consider a sparse initializiation)
120 | Hx = np.zeros((Nx, Ny));
121 | Hy = np.zeros((Nx, Ny));
122 | Ez = np.zeros((Nx, Ny));
123 | #spatial steps
124 | #time steps
125 |
126 | ## courant constant
127 | plt.ion()
128 | fieldAmplitudes = list();
129 | plt.figure;
130 | storedFields = list();
131 |
132 | Idz = 0; #integral collection for curl
133 | Icey = 0; Icex = 0;
134 |
135 | tsteps = 200;
136 | source = [50, 50]
137 | for t in range(tsteps):
138 | print('t= '+str(t))
139 |
140 | J = np.sin(2*np.pi*t/10)*dt;
141 | J = currSource((t+0.5)*dt, lambda_up, lambda_low, lambda_0, c, dx);
142 | ## code currently explodes at the origin
143 |
144 | ## update H fields
145 | Ez[:,0] = 0;
146 | Ez[0,:] = 0;
147 | Cex = (Ez - np.roll(Ez, 1, axis=1)) / dy;
148 | Cey = -(Ez - np.roll(Ez, 1, axis = 0)) / dx;
149 | Icex += Cex;
150 | Icey += Cey;
151 | Hx = mHx1*Hx +mHx2*Cex +mHx3*Icex; # add integral term
152 | Hy = mHy1*Hy + mHy2*Cey +mHy3*Icey;
153 |
154 | ## now work on Dz
155 | Hx[-1,:] = 0;
156 | Hy[:,-1] = 0;
157 | derivy = (np.roll(Hx, -1, axis=1) - Hx) / dy;
158 | derivx = (np.roll(Hy, -1, axis = 0) - Hy) / dx;
159 | Chz = derivx - derivy;
160 |
161 | Dz = np.squeeze(np.multiply(eps, Ez));
162 | Idz +=Dz;
163 | Dz = mDz1*Dz + mDz2 * Chz + mDz4*Idz;
164 | Dz = np.squeeze(Dz)
165 | Dz[source[0],source[1]]-=J; #location of the source
166 |
167 | ## finally update Ez
168 | Ez = (np.divide(Dz,eps)); ## this is important for the next update of the curl # equations
169 |
170 | ## records field in probloc
171 | storedFields.append(Ez[probloc[0], probloc[1]]);
172 |
173 | #insert point source
174 | if(t%10 == 0):
175 | print(np.max(Ez))
176 | plt.subplot(121)
177 | imgplot = plt.imshow(np.real(Hy))
178 | imgplot.set_cmap('jet')
179 | plt.subplot(122)
180 | plt.imshow(np.real(Idz))
181 | plt.pause(0.1)
182 | plt.clf()
183 |
184 | # storedFields = np.array(storedFields);
185 | # FFT = np.fft.fft(storedFields)
186 | # plt.plot(np.abs(FFT));
187 | plt.show()
188 |
--------------------------------------------------------------------------------
/FDTD2D/PML/UPML_coefs.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import numpy.matlib
3 |
4 | def UPML(N, Npml):
5 | Nx = N[0]; Ny = N[1];
6 | xn = np.zeros((Nx, 1))
7 | fi1 = np.zeros((Nx, 1));
8 | fj1 = np.zeros((Ny, 1));
9 | gi2 = np.ones((Nx, 1));
10 | gj2 = np.ones((Ny, 1));
11 | gi3 = np.ones((Nx, 1));
12 | gj3 = np.ones((Ny, 1));
13 | Npmlx = Npml[0];
14 | Npmly = Npml[1];
15 |
16 | for i in range(Npmlx):
17 | x_n = (1 / 3) * ((i + 1) / Npmlx) ** 3;
18 | xn[Nx - Npmlx + i] = x_n;
19 | xn[Npmlx - 1 - i] = x_n;
20 |
21 | fi1[Npmlx - 1 - i] = x_n;
22 | gi2[Npmlx - 1 - i] = 1 / (1 + x_n);
23 | gi3[Npmlx - 1 - i] = (1 - x_n) / (1 + x_n);
24 |
25 | fi1[Nx - Npmlx + i] = x_n;
26 | gi2[Nx - Npmlx + i] = 1 / (1 + x_n);
27 | gi3[Nx - Npmlx + i] = (1 - x_n) / (1 + x_n);
28 |
29 | for i in range(Npmly):
30 | x_n = (1 / 3) * ((i + 1) / Npml[1]) ** 3;
31 | fj1[Npmly - 1 - i] = x_n;
32 | gj2[Npmly - 1 - i] = 1 / (1 + x_n);
33 | gj3[Npmly - 1 - i] = (1 - x_n) / (1 + x_n);
34 |
35 | fj1[Ny - Npmly + i] = x_n;
36 | gj2[Ny - Npmly + i] = 1 / (1 + x_n);
37 | gj3[Ny - Npmly + i] = (1 - x_n) / (1 + x_n);
38 |
39 | gi3 = np.squeeze(gi3);
40 | gi2 = np.squeeze(gi2);
41 | gj3 = np.squeeze(gj3);
42 | gj2 = np.squeeze(gj2);
43 |
44 | ## creat the other f's from teh g's
45 | fi2 = gi2;
46 | fj2 = gj2;
47 | fj3 = gj3;
48 | fi3 = gi3;
49 |
50 | fi1 = np.matlib.repmat(fi1.T, Ny, 1);
51 | fj1 = np.matlib.repmat(fj1, 1, Nx);
52 |
53 | fi2 = np.matlib.repmat(fi2.T, Ny, 1);
54 | fi2 = np.rot90(fi2);
55 | fj2 = np.matlib.repmat(fj2.T, Nx, 1);
56 |
57 | fi3 = np.matlib.repmat(fi3, Ny, 1);
58 | fi3 = np.rot90(fi3)
59 | fj3 = np.matlib.repmat(fj3.T, Nx, 1);
60 |
61 | ## at this point all the fi's and fj's only have the coeffs on one side
62 | fij3 = np.multiply(fj3, fi3);
63 | fij2 = np.multiply(fj2, fi2);
64 | fij1 = np.multiply(fj1, fi1);
65 | fij1 = np.rot90(fij1)
66 |
67 | gi3x = np.matlib.repmat(gi3.T, Ny, 1);
68 | gi3x = np.rot90(gi3x);
69 | gj3x = np.matlib.repmat(gj3, Nx, 1);
70 | gij3 = np.multiply(gi3x, gj3x);
71 |
72 | gi2x = np.matlib.repmat(gi2.T, Ny, 1);
73 | gi2x = np.rot90(gi2x)
74 | gj2x = np.matlib.repmat(gj2, Nx, 1);
75 | gij2 = np.multiply(gi2x, gj2x);
76 |
77 | return [fij1, fij2, fij3, gij2, gij3];
--------------------------------------------------------------------------------
/FDTD2D/PML/UPML_test.py:
--------------------------------------------------------------------------------
1 | ## first, we need to be able to visualize a non-uniform grid
2 | import numpy as np;
3 | import matplotlib.pyplot as plt
4 | import numpy.matlib
5 | plt.close('All')
6 | ## want to apply the pml as a matrix operation on a matrix HX of nxmxl
7 | ## calculate the PML on a 2x grid, since the even values go for H
8 | ## and the odd values will go for E
9 | ## EMLAB calculation of PML
10 |
11 | lambda_0 = 100; omega_0 = 2*np.pi/lambda_0;
12 | lambda_up = 200;
13 | lambda_low = 50;
14 | dx = 800/200; dy = dx; c =1;
15 | dt = (1/2)**.5*dx/c;
16 | xrange = [-400, 400];
17 | yrange = [-300, 300];
18 | rstart = np.array([-400, -300]); rend = np.array([400, 300]);
19 | source = np.array([0,0]) - rstart; source = [int(i / dx) for i in source];
20 | source = [100, 75]
21 | probloc = np.array([200,0]) - rstart; probloc = [int(i / dx) for i in probloc];
22 | Nx = int((xrange[1]-xrange[0])/dx);
23 | Ny = int((yrange[1]-yrange[0])/dy);
24 | N = [Nx, Ny];
25 | c = 1; # we are in units of nanometers;
26 |
27 | Npml = 1*np.array([20,20]);
28 | Nx2 = Nx+2*Npml[0];
29 | Ny2 = Ny+2*Npml[1];
30 |
31 |
32 | ## x-direction pml
33 | ## no 2x grid concept
34 | ## need to make the code compatible for non-square grids
35 |
36 | xn = np.zeros((Nx,1))
37 | fi1 = np.zeros((Nx,1)); fj1 = np.zeros((Ny, 1));
38 | gi2 = np.ones((Nx,1)); gj2 = np.ones((Ny, 1));
39 | gi3 = np.ones((Nx,1)); gj3 = np.ones((Ny, 1));
40 | Npmlx = Npml[0]; Npmly = Npml[1];
41 |
42 | for i in range(Npmlx):
43 | x_n = (1/3)*((i+1)/Npmlx)**3;
44 | xn[Nx-Npmlx+i] = x_n;
45 | xn[Npmlx-1-i] = x_n;
46 |
47 | fi1[Npmlx-1-i] = x_n;
48 | gi2[Npmlx-1-i] = 1/(1+x_n);
49 | gi3[Npmlx-1-i] = (1-x_n)/(1+x_n);
50 |
51 | fi1[Nx-Npmlx+i] = x_n;
52 | gi2[Nx-Npmlx+i] = 1/(1+x_n);
53 | gi3[Nx-Npmlx+i] = (1-x_n)/(1+x_n);
54 |
55 | for i in range(Npmly):
56 | x_n = (1/3)*((i+1)/Npml[1])**3;
57 | fj1[Npmly-1-i] = x_n;
58 | gj2[Npmly-1-i] = 1/(1+x_n);
59 | gj3[Npmly-1-i] = (1-x_n)/(1+x_n);
60 |
61 | fj1[Ny-Npmly+i] = x_n;
62 | gj2[Ny-Npmly+i] = 1/(1+x_n);
63 | gj3[Ny-Npmly+i] = (1-x_n)/(1+x_n);
64 |
65 |
66 | gi3 = np.squeeze(gi3);
67 | gi2 = np.squeeze(gi2);
68 | gj3 = np.squeeze(gj3);
69 | gj2 = np.squeeze(gj2);
70 |
71 | ## creat the other f's from teh g's
72 | fi2 = gi2; fj2 = gj2;
73 | fj3 = gj3; fi3 = gi3;
74 |
75 | fi1 = np.matlib.repmat(fi1.T,Ny,1);
76 | fj1 = np.matlib.repmat(fj1,1,Nx);
77 |
78 | fi2 = np.matlib.repmat(fi2.T,Ny,1);
79 | fi2 = np.rot90(fi2);
80 | fj2 = np.matlib.repmat(fj2.T,Nx,1);
81 |
82 | fi3 = np.matlib.repmat(fi3,Ny,1);
83 | fi3 = np.rot90(fi3)
84 | fj3 = np.matlib.repmat(fj3.T,Nx,1);
85 |
86 | ## at this point all the fi's and fj's only have the coeffs on one side
87 | fij3 = np.multiply(fj3,fi3);
88 | fij2 = np.multiply(fj2,fi2);
89 | fij1 = np.multiply(fj1,fi1); fij1 = np.rot90(fij1)
90 |
91 | gi3x = np.matlib.repmat(gi3.T,Ny,1); gi3x = np.rot90(gi3x);
92 | gj3x = np.matlib.repmat(gj3,Nx,1);
93 | gij3 = np.multiply(gi3x, gj3x);
94 |
95 | gi2x = np.matlib.repmat(gi2.T,Ny,1); gi2x = np.rot90(gi2x)
96 | gj2x = np.matlib.repmat(gj2,Nx,1);
97 | gij2 = np.multiply(gi2x, gj2x);
98 |
99 | # visualize the pml coefficient matrices
100 | plt.figure()
101 | plt.subplot(221)
102 | plt.imshow(fj3)
103 | plt.subplot(222)
104 | plt.imshow(fj2)
105 | plt.subplot(223)
106 | plt.imshow(fi1)
107 | plt.show()
108 |
109 | plt.figure()
110 | plt.subplot(221)
111 | plt.imshow(fi3)
112 | plt.subplot(222)
113 | plt.imshow(fi2)
114 | plt.subplot(223)
115 | plt.imshow(fj1)
116 | plt.show()
117 |
118 | plt.figure()
119 | plt.subplot(121)
120 | plt.imshow(gij3)
121 | plt.subplot(122)
122 | plt.imshow(gij2)
123 | plt.show()
124 |
125 | #### TEST THE PML #######################################################
126 | #########################################################################
127 |
128 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
129 | omega_0 = 2*np.pi/lambda_0;
130 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
131 | #print(omega_0); print(sigma)
132 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
133 |
134 |
135 | ## create epsilon
136 | eps = np.ones((Nx, Ny));
137 | #eps[90:120,:] = 4;
138 | ##initialize fields (consider a sparse initializiation)
139 | Hx = np.zeros((Nx, Ny));
140 | Hy = np.zeros((Nx, Ny));
141 | Ez = np.zeros((Nx, Ny));
142 | #spatial steps
143 | #time steps
144 |
145 | ## courant constant
146 | plt.ion()
147 | fieldAmplitudes = list();
148 | plt.figure(figsize=(25, 20));
149 | storedFields = list();
150 |
151 | Idz = 0; #integral collection for curl
152 | Icey = 0; Icex = 0;
153 |
154 | tsteps = 1000;
155 | source = [150, 75]
156 | for t in range(tsteps):
157 | print('t= '+str(t))
158 |
159 | J = np.sin(2*np.pi*t/30);
160 | #J = currSource((t+0.5)*dt, lambda_up, lambda_low, lambda_0, c, dx);
161 |
162 | ## now work on Dz
163 | # Hx[-1,:] = 0;
164 | # Hy[:,-1] = 0;
165 | derivy = (np.roll(Hx, -1, axis=1) - Hx) / dy;
166 | derivx = (np.roll(Hy, -1, axis=0) - Hy) / dx;
167 | Chz = derivx - derivy;
168 |
169 | Dz = eps * Ez;
170 | Idz += Dz;
171 | Dz = gij3 * Dz + gij2 * dt * Chz;
172 | Dz[source[0], source[1]] -= J; # location of the source
173 |
174 | ## finally update Ez
175 | Ez = Dz/eps; ## this is important for the next update of the curl # equations
176 |
177 | ## update H fields
178 | #Ez[:,0] = 0;
179 | #Ez[0,:] = 0;
180 | Cex = -(Ez - np.roll(Ez, 1, axis=1)) / dy;
181 | Cey = +(Ez - np.roll(Ez, 1, axis = 0)) / dx;
182 | Icex += Cex; Icey += Cey;
183 | Hx = fij3*Hx + (dt)*fij2*Cex + fij1*Icex;
184 | Hy = fij3*Hy + (dt)*fij2*Cey + fij1*Icey;
185 |
186 |
187 | ## records field in probloc
188 | storedFields.append(Ez[probloc[0], probloc[1]]);
189 |
190 | #insert point source
191 | if(t%15 == 0):
192 | print(np.max(Ez))
193 | plt.subplot(221)
194 | imgplot = plt.imshow(np.real(Hy))
195 | imgplot.set_cmap('jet')
196 | plt.clim(-0.1, 0.1)
197 | plt.subplot(222)
198 | plt.imshow(np.real(Idz))
199 | plt.clim(-0.04, 0.04)
200 | plt.subplot(223)
201 | plt.plot(Ez[40,:])
202 | plt.subplot(224)
203 | plt.plot(Hy[40,:])
204 | plt.pause(0.1)
205 | plt.clf()
206 |
207 | # storedFields = np.array(storedFields);
208 | # FFT = np.fft.fft(storedFields)
209 | # plt.plot(np.abs(FFT));
210 | plt.show()
211 |
--------------------------------------------------------------------------------
/FDTD2D/PML/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/PML/__init__.py
--------------------------------------------------------------------------------
/FDTD2D/PML/__pycache__/UPML_coefs.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/PML/__pycache__/UPML_coefs.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/PML/__pycache__/UPML_coefs.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/PML/__pycache__/UPML_coefs.cpython-36.pyc
--------------------------------------------------------------------------------
/FDTD2D/PML/__pycache__/__init__.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/PML/__pycache__/__init__.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/PML/__pycache__/__init__.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/PML/__pycache__/__init__.cpython-36.pyc
--------------------------------------------------------------------------------
/FDTD2D/PML/sfactor.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 | def sfactor(dPML, N, omega_0, m = 4):
4 | lnR = -16; ## final desired reflection coefficient
5 |
6 | PmlBound = [dPML, N - dPML];
7 | sigma_max = (m + 1) * lnR / 2
8 | # need start and stop coordinates of the PML
9 | # abs(wrange - wpml);
10 | sfactor_domain = np.ones((N - 2 * dPML))
11 | d = np.linspace(0, dPML, dPML)
12 | pmlPolynomial = 1/(1 + (1j) * (sigma_max * d / omega_0) ** m);
13 | sfactor_domain = np.concatenate((np.flip(pmlPolynomial, 0),\
14 | sfactor_domain, pmlPolynomial), axis=0);
15 |
16 | sfactorMatrix = np.repeat(sfactor_domain, N);
17 | sfactorMatrix = np.reshape(sfactorMatrix, [N,N])
18 | return sfactorMatrix;
19 |
--------------------------------------------------------------------------------
/FDTD2D/PhotonicCrystals/CylinderLattice.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from FDTD2D.DielectricGenerator2D import PhotonicCrystalGrid as pcg
4 | from FDTD2D.Simulators import runTE
5 |
6 | ## fundamental parameter specificatoin (all 1)
7 | c = 1; # we are in units of nanometers;
8 | eps_0 = 1; mu_0 = 1;
9 |
10 | lambda_0 = 800;
11 | lambda_up = 1200;
12 | lambda_low = 400;
13 |
14 | dx = lambda_0/200; dy = dx;
15 | dt = (1/2)**.5*dx/c;
16 | xrange = [-400, 400];
17 | yrange = [-400, 400];
18 |
19 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
20 | source = np.array([0, 0])-xstart; source = [int(i/dx) for i in source];
21 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
22 |
23 |
24 | Nx = int((xrange[1]-xrange[0])/dx);
25 | Ny = int((yrange[1]-yrange[0])/dy);
26 | ## create epsilon
27 |
28 | ## structure specification
29 |
30 | structureLength = 50;
31 | structureWidth = 50;
32 | structureSpacing = 0; numCells = 20; diel = 12;
33 | vacuumSpace = int((Nx-10)/2);
34 | xcells = 10; ycells = 10; cellSize = np.array([40,40])
35 | eps = pcg.PhotonicGrid(xcells, ycells, cellSize, diel);
36 | plt.imshow(eps)
37 | plt.show()
38 | [Nx, Ny] = eps.shape
39 | print(eps.shape)
40 | # plt.imshow(eps)
41 | # plt.show()
42 |
43 | ##initialize fields (consider a sparse initializiation)
44 | Npml = [10,10];
45 | Hx = np.zeros((Nx, Ny));
46 | Hy = np.zeros((Nx, Ny));
47 | Ez = np.zeros((Nx, Ny));
48 | #spatial steps
49 | #time steps
50 | tsteps = 1000;
51 | timeRun = np.arange(1,1000+1)
52 | J = np.sin(2*np.pi*timeRun/20);
53 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
54 | omega_0 = 2*np.pi/lambda_0;
55 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
56 | #print(omega_0); print(sigma)
57 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
58 |
59 | J = currSource(timeRun, lambda_up, lambda_low, 170, c, dx);
60 | print(J)
61 |
62 | storedFields = runTE.runTE(tsteps, dt, dx, dy, eps, Ez, Hx, Hy,J,Npml, sourcePos = [112,112])
63 |
--------------------------------------------------------------------------------
/FDTD2D/Simulators/TE.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | import numpy as np;
4 |
5 |
6 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
7 | omega_0 = 2*np.pi/lambda_0;
8 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
9 | #print(omega_0); print(sigma)
10 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
11 |
12 |
13 | c = 1; # we are in units of nanometers;
14 | lambda_0 = 800;
15 | lambda_up = 1200;
16 | lambda_low = 400;
17 | dx = lambda_0/160; dy = dx;
18 | dt = (1/2)**.5*dx/c;
19 | xrange = [-400, 400];
20 | yrange = [-400, 400];
21 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
22 | source = np.array([200, 0])-xstart; source = [int(i/dx) for i in source];
23 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
24 | source = [80,80]
25 | Nx = int((xrange[1]-xrange[0])/dx);
26 | Ny = int((yrange[1]-yrange[0])/dy);
27 | ## create epsilon
28 | eps = np.ones((Nx, Ny));
29 | #eps[50:150, 50:150] = 4;
30 |
31 |
32 | ##initialize fields (consider a sparse initializiation)
33 | Hx = np.zeros((Nx, Ny));
34 | Hy = np.zeros((Nx, Ny));
35 | Ez = np.zeros((Nx, Ny));
36 | #spatial steps
37 | #time steps
38 | tsteps = 10000;
39 |
40 | ## courant constant
41 | plt.ion()
42 | fieldAmplitudes = list();
43 | plt.figure;
44 | storedFields = list();
45 | for t in range(tsteps):
46 | print('t= '+str(t))
47 | #update Hz, Ex, Ey
48 | #remember the yee grid and integer indexing
49 | ## current source needs to be scaled
50 | J = np.sin(2*np.pi*t/40)*(dt)#*np.exp(-(t-20)**2/50);
51 | #J = currSource((t+0.5)*dt, lambda_up, lambda_low, lambda_0, c, dx);
52 | #update E field components
53 | # TEz mode...only transverse x and y E field
54 | Hx[-1,:] = 0;
55 | Hy[:,-1] = 0;
56 | deriv_y = (np.roll(Hx,-1, axis=1)-Hx)/dy;
57 | deriv_x = (np.roll(Hy, -1, axis = 0)-Hy)/dx;
58 | Dz = eps*Ez;
59 | Dz= Dz +((dt)* (deriv_x - \
60 | (deriv_y)));
61 | Ez = Dz/eps;
62 | ## enforce Dirichlet
63 | #if( t < 20):
64 | Ez[source[0],source[1]] -= J/eps[source[0], source[1]]; #location of the source # np.roll(Hx,-1)-Hx;
65 | ##vectorize this code
66 | Ez[:,0] = 0;
67 | #deriv_y = dey/dy;
68 | deriv_y = (Ez - np.roll(Ez,1,axis=1 ))/dy;
69 | Ez[0,:] = 0;
70 | #derix_x = dex;
71 | deriv_x = (Ez - np.roll(Ez,1, axis = 0))/dx;
72 | Hx = Hx - (dt) * deriv_y;
73 | Hy = Hy + (dt) * deriv_x ;
74 |
75 | ## records field in probloc
76 | storedFields.append(Ez[probloc[0], probloc[1]]);
77 |
78 | #insert point source
79 | if(t%10 == 0):
80 | imgplot = plt.imshow(Ez)
81 | imgplot.set_cmap('jet')
82 | plt.pause(0.001)
83 | plt.clf()
84 |
85 | storedFields = np.array(storedFields);
86 | FFT = np.fft.fft(storedFields)
87 | plt.plot(np.abs(FFT));
88 | plt.show()
89 |
--------------------------------------------------------------------------------
/FDTD2D/Simulators/TM.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | import numpy as np;
4 |
5 |
6 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
7 | omega_0 = 2*np.pi/lambda_0;
8 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
9 | #print(omega_0); print(sigma)
10 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
11 |
12 |
13 | c = 1; # we are in units of nanometers;
14 | lambda_0 = 800;
15 | lambda_up = 1200;
16 | lambda_low = 400;
17 | dx = lambda_0/80; dy = dx;
18 | dt = (1/2)**.5*dx/c;
19 | xrange = [-400, 400];
20 | yrange = [-400, 400];
21 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
22 | source = np.array([-200, 0])-xstart; source = [int(i/dx) for i in source];
23 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
24 |
25 | Nx = int((xrange[1]-xrange[0])/dx);
26 | Ny = int((yrange[1]-yrange[0])/dy);
27 | ## create epsilon
28 | eps = np.ones((Nx, Ny));
29 | eps[50:150, 50:150] = 4;
30 |
31 |
32 | ##initialize fields (consider a sparse initializiation)
33 | Ex = np.zeros((Nx, Ny));
34 | Ey = np.zeros((Nx, Ny));
35 | Hz = np.zeros((Nx, Ny));
36 | #spatial steps
37 | #time steps
38 | tsteps = 1000;
39 |
40 | ## courant constant
41 | plt.ion()
42 | fieldAmplitudes = list();
43 | plt.figure;
44 | storedFields = list();
45 | for t in range(tsteps):
46 | print('t= '+str(t))
47 | #update Hz, Ex, Ey
48 | #remember the yee grid and integer indexing
49 | ## current source needs to be scaled
50 | J = np.sin(2*np.pi*t/30)*(dt);
51 | # J = currSource((t+0.5)*dt, lambda_up, lambda_low, lambda_0, c, dx);
52 | #update E field components
53 | # TEz mode...only transverse x and y E field
54 | Ex[-1, :] = 0;
55 | Ey[:, -1] = 0;
56 | deriv_y = -(np.roll(Ex, 1, axis = 1) - Ex) / dy;
57 | deriv_x = -(np.roll(Ey, 1, axis = 0) - Ey) / dx;
58 | Hz = Hz - np.multiply((dt / eps), (deriv_x - \
59 | (deriv_y)));
60 |
61 |
62 | Hz[source[0], source[1]]-= J / eps[source[0], source[1]]; #location of the source # np.roll(Hx,-1)-Hx;
63 | ##vectorize this code
64 | Hz[:, 0] = 0;
65 | #deriv_y = dey/dy;
66 | deriv_y = -(Hz - np.roll(Hz, -1, axis = 1)) / dy;
67 | Hz[0, :] = 0;
68 | #derix_x = dex;
69 | deriv_x = -(Hz - np.roll(Hz, -1, axis = 0)) / dx;
70 | Ex = Ex + (dt) * deriv_y;
71 | Ey = Ey - (dt) * deriv_x ;
72 |
73 | ## records field in probloc
74 | storedFields.append(Hz[probloc[0], probloc[1]]);
75 |
76 | #insert point source
77 | if(t%10 == 0):
78 | imgplot = plt.imshow(Ey)
79 | imgplot.set_cmap('jet')
80 | plt.pause(0.001)
81 | plt.clf()
82 |
83 | storedFields = np.array(storedFields);
84 | FFT = np.fft.fft(storedFields)
85 | plt.plot(np.abs(FFT));
86 | plt.show()
87 |
--------------------------------------------------------------------------------
/FDTD2D/Simulators/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/Simulators/__init__.py
--------------------------------------------------------------------------------
/FDTD2D/Simulators/__pycache__/__init__.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/Simulators/__pycache__/__init__.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/Simulators/__pycache__/runTE.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/Simulators/__pycache__/runTE.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/Simulators/runTE.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from FDTD2D.PML import UPML_coefs as umpl
4 |
5 | def runTE(tsteps, dt, dx, dy, eps, Ez, Hx, Hy, J, Npml, sourcePos = [50,50]):
6 | ## courant constant
7 | plt.ion()
8 | fieldAmplitudes = list();
9 | plt.figure(figsize = (25, 20));
10 | storedFields = list();
11 | N = Ez.shape;
12 | [fij1, fij2, fij3, gij2, gij3] = umpl.UPML(N, Npml);
13 |
14 | Icex = 0; Icey = 0; Idz = 0;
15 | for t in range(tsteps):
16 | print('t= ' + str(t))
17 |
18 | ## now work on Dz
19 | # Hx[-1,:] = 0;
20 | # Hy[:,-1] = 0;
21 | derivy = (np.roll(Hx, -1, axis=1) - Hx) / dy;
22 | derivx = (np.roll(Hy, -1, axis=0) - Hy) / dx;
23 | Chz = derivx - derivy;
24 |
25 | Dz = eps * Ez;
26 | Idz += Dz;
27 | Dz = gij3 * Dz + gij2 * dt * Chz;
28 |
29 |
30 | Dz[sourcePos[0], sourcePos[1]] -= J[t]; # location of the source
31 |
32 | ## finally update Ez
33 | Ez = Dz / eps; ## this is important for the next update of the curl # equations
34 |
35 | ## update H fields
36 | # Ez[:,0] = 0;
37 | # Ez[0,:] = 0;
38 | Cex = -(Ez - np.roll(Ez, 1, axis=1)) / dy;
39 | Cey = +(Ez - np.roll(Ez, 1, axis=0)) / dx;
40 | Icex += Cex;
41 | Icey += Cey;
42 | Hx = fij3 * Hx + (dt) * fij2 * Cex + fij1 * Icex;
43 | Hy = fij3 * Hy + (dt) * fij2 * Cey + fij1 * Icey;
44 |
45 |
46 | # insert point source
47 | if (t % 10 == 0):
48 | storedFields.append([Ez, Hx, Hy])
49 | imgplot = plt.imshow(Ez)
50 | imgplot.set_cmap('jet')
51 | plt.clim(-0.04, 0.04)
52 | plt.pause(0.001)
53 | plt.clf()
54 |
55 | plt.show()
56 | return storedFields
57 |
--------------------------------------------------------------------------------
/FDTD2D/Sources/PlaneWave.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | from FDTD2D.DielectricGenerator2D import GMRStructure as GMR
4 | from FDTD2D.Simulators import runTE
5 |
6 | ## fundamental parameter specificatoin (all 1)
7 | c = 1; # we are in units of nanometers;
8 | eps_0 = 1; mu_0 = 1;
9 |
10 | lambda_0 = 800;
11 | lambda_up = 1200;
12 | lambda_low = 400;
13 |
14 | dx = lambda_0/200; dy = dx;
15 | dt = (1/2)**.5*dx/c;
16 | xrange = [-400, 400];
17 | yrange = [-400, 400];
18 |
19 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
20 | source = np.array([0, 0])-xstart; source = [int(i/dx) for i in source];
21 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
22 | Npml = [20,20];
23 | Nx = int((xrange[1]-xrange[0])/dx);
24 | Ny = int((yrange[1]-yrange[0])/dy);
25 | i1 = np.arange(Npml[0],Nx - Npml[1]).T;
26 | i2 = 50*np.ones((len(i1),1)); i2 = np.squeeze(i2)
27 | lineSource = np.vstack((i1,i2)).T
28 |
29 | lineSource = lineSource.astype('int')
30 |
31 | ## create epsilon
32 |
33 | eps = np.ones((Nx, Ny));
34 | plt.show()
35 | [Nx, Ny] = eps.shape
36 | print(eps.shape)
37 | # plt.imshow(eps)
38 | # plt.show()
39 |
40 | ##initialize fields (consider a sparse initializiation)
41 | Hx = np.zeros((Nx, Ny));
42 | Hy = np.zeros((Nx, Ny));
43 | Ez = np.zeros((Nx, Ny));
44 | #spatial steps
45 | #time steps
46 | tsteps = 1000;
47 | timeRun = np.arange(1,1000+1)
48 | J = np.sin(2*np.pi*timeRun/30);
49 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
50 | omega_0 = 2*np.pi/lambda_0;
51 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
52 | #print(omega_0); print(sigma)
53 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
54 |
55 | #J = currSource(timeRun, lambda_up, lambda_low, 90, c, dx);
56 | print(J)
57 | source = np.array([[50,50],[0,0]])
58 | storedFields = runTE.runTE(tsteps, dt, dx, dy, eps, Ez, Hx, Hy,J, source,Npml)
59 |
--------------------------------------------------------------------------------
/FDTD2D/Sources/TFSF.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 | ## first, we need to be able to visualize a non-uniform grid
4 | import numpy as np;
5 | import matplotlib.pyplot as plt
6 | import numpy.matlib
7 | plt.close('All')
8 | ## want to apply the pml as a matrix operation on a matrix HX of nxmxl
9 | ## calculate the PML on a 2x grid, since the even values go for H
10 | ## and the odd values will go for E
11 | ## EMLAB calculation of PML
12 |
13 | lambda_0 = 100; omega_0 = 2*np.pi/lambda_0;
14 | lambda_up = 200;
15 | lambda_low = 50;
16 | dx = 800/200; dy = dx; c =1;
17 | dt = (1/2)**.5*dx/c;
18 | xrange = [-600, 600];
19 | yrange = [-600, 600];
20 | rstart = np.array([-400, -300]); rend = np.array([400, 300]);
21 | source = np.array([0,0]) - rstart; source = [int(i / dx) for i in source];
22 | source = [100, 75]
23 | probloc = np.array([200,0]) - rstart; probloc = [int(i / dx) for i in probloc];
24 | Nx = int((xrange[1]-xrange[0])/dx);
25 | Ny = int((yrange[1]-yrange[0])/dy);
26 | N = [Nx, Ny];
27 | c = 1; # we are in units of nanometers;
28 |
29 | Npml = 1*np.array([20,20]);
30 | Nx2 = Nx+2*Npml[0];
31 | Ny2 = Ny+2*Npml[1];
32 |
33 |
34 | ## x-direction pml
35 | ## no 2x grid concept
36 | ## need to make the code compatible for non-square grids
37 |
38 | xn = np.zeros((Nx,1))
39 | fi1 = np.zeros((Nx,1)); fj1 = np.zeros((Ny, 1));
40 | gi2 = np.ones((Nx,1)); gj2 = np.ones((Ny, 1));
41 | gi3 = np.ones((Nx,1)); gj3 = np.ones((Ny, 1));
42 | Npmlx = Npml[0]; Npmly = Npml[1];
43 |
44 | for i in range(Npmlx):
45 | x_n = (1/3)*((i+1)/Npmlx)**3;
46 | xn[Nx-Npmlx+i] = x_n;
47 | xn[Npmlx-1-i] = x_n;
48 |
49 | fi1[Npmlx-1-i] = x_n;
50 | gi2[Npmlx-1-i] = 1/(1+x_n);
51 | gi3[Npmlx-1-i] = (1-x_n)/(1+x_n);
52 |
53 | fi1[Nx-Npmlx+i] = x_n;
54 | gi2[Nx-Npmlx+i] = 1/(1+x_n);
55 | gi3[Nx-Npmlx+i] = (1-x_n)/(1+x_n);
56 |
57 | for i in range(Npmly):
58 | x_n = (1/3)*((i+1)/Npml[1])**3;
59 | fj1[Npmly-1-i] = x_n;
60 | gj2[Npmly-1-i] = 1/(1+x_n);
61 | gj3[Npmly-1-i] = (1-x_n)/(1+x_n);
62 |
63 | fj1[Ny-Npmly+i] = x_n;
64 | gj2[Ny-Npmly+i] = 1/(1+x_n);
65 | gj3[Ny-Npmly+i] = (1-x_n)/(1+x_n);
66 |
67 |
68 | gi3 = np.squeeze(gi3);
69 | gi2 = np.squeeze(gi2);
70 | gj3 = np.squeeze(gj3);
71 | gj2 = np.squeeze(gj2);
72 |
73 | ## creat the other f's from teh g's
74 | fi2 = gi2; fj2 = gj2;
75 | fj3 = gj3; fi3 = gi3;
76 |
77 | fi1 = np.matlib.repmat(fi1.T,Ny,1);
78 | fj1 = np.matlib.repmat(fj1,1,Nx);
79 |
80 | fi2 = np.matlib.repmat(fi2.T,Ny,1);
81 | fi2 = np.rot90(fi2);
82 | fj2 = np.matlib.repmat(fj2.T,Nx,1);
83 |
84 | fi3 = np.matlib.repmat(fi3,Ny,1);
85 | fi3 = np.rot90(fi3)
86 | fj3 = np.matlib.repmat(fj3.T,Nx,1);
87 |
88 | ## at this point all the fi's and fj's only have the coeffs on one side
89 | fij3 = np.multiply(fj3,fi3);
90 | fij2 = np.multiply(fj2,fi2);
91 | fij1 = np.multiply(fj1,fi1); fij1 = np.rot90(fij1)
92 |
93 | gi3x = np.matlib.repmat(gi3.T,Ny,1); gi3x = np.rot90(gi3x);
94 | gj3x = np.matlib.repmat(gj3,Nx,1);
95 | gij3 = np.multiply(gi3x, gj3x);
96 |
97 | gi2x = np.matlib.repmat(gi2.T,Ny,1); gi2x = np.rot90(gi2x)
98 | gj2x = np.matlib.repmat(gj2,Nx,1);
99 | gij2 = np.multiply(gi2x, gj2x);
100 |
101 | ###################INSERT THE TFSF######################################
102 | ########################################################################
103 | #select a single line of nodes
104 | TFSF_x = 100;
105 |
106 |
107 | #### TEST THE CODE #######################################################
108 | #########################################################################
109 |
110 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
111 | omega_0 = 2*np.pi/lambda_0;
112 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
113 | #print(omega_0); print(sigma)
114 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
115 |
116 |
117 | ## create epsilon
118 | eps = np.ones((Nx, Ny));
119 | eps[150:200,:] = 4;
120 | ##initialize fields (consider a sparse initializiation)
121 | Hx = np.zeros((Nx, Ny));
122 | Hy = np.zeros((Nx, Ny));
123 | Ez = np.zeros((Nx, Ny));
124 | #spatial steps
125 | #time steps
126 |
127 | ## courant constant
128 | plt.ion()
129 | fieldAmplitudes = list();
130 | plt.figure(figsize=(25, 20));
131 | storedFields = list();
132 |
133 | Idz = 0; #integral collection for curl
134 | Icey = 0; Icex = 0;
135 |
136 | tsteps = 1000;
137 | source = [TFSF_x, 25]
138 | time = np.arange(0,tsteps+1);
139 | J = np.sin(2*np.pi*time/40);
140 | J = np.exp(-(time-30)**2/100)
141 | for t in range(tsteps):
142 | print('t= '+str(t))
143 |
144 |
145 | #J = currSource((t+0.5)*dt, lambda_up, lambda_low, lambda_0, c, dx);
146 |
147 | ## now work on Dz
148 | # Hx[-1,:] = 0;
149 | # Hy[:,-1] = 0;
150 | derivy = (np.roll(Hx, -1, axis=1) - Hx) / dy;
151 | derivx = (np.roll(Hy, -1, axis=0) - Hy) / dx;
152 | Chz = derivx - derivy;
153 |
154 | Dz = eps * Ez;
155 | Idz += Dz;
156 | Dz = gij3 * Dz + gij2 * dt * Chz;
157 | Dz[source[0], source[1]] -= J[t]; # location of the source
158 |
159 | ## finally update Ez
160 | Ez = Dz/eps; ## this is important for the next update of the curl # equations
161 | Ez[TFSF_x, :] = J[t];
162 |
163 | ## update H fields
164 | #Ez[:,0] = 0;
165 | #Ez[0,:] = 0;
166 | Cex = -(Ez - np.roll(Ez, 1, axis=1)) / dy;
167 | Cey = +(Ez - np.roll(Ez, 1, axis = 0)) / dx;
168 | Icex += Cex; Icey += Cey;
169 | Hx = fij3*Hx + (dt)*fij2*Cex + fij1*Icex;
170 | Hy = fij3*Hy + (dt)*fij2*Cey + fij1*Icey;
171 |
172 | #update the Hx source for the TFSF
173 | delay = dy/2+dt/2
174 | #Hy[TFSF_x, :] += Ez[TFSF_x, :]
175 |
176 | ## records field in probloc
177 | storedFields.append(Ez[probloc[0], probloc[1]]);
178 |
179 | #insert point source
180 | if(t%15 == 0):
181 | print(np.max(Ez))
182 | plt.subplot(221)
183 | imgplot = plt.imshow(Ez)
184 | imgplot.set_cmap('jet')
185 | plt.clim(-1, 1)
186 | plt.subplot(222)
187 | plt.imshow(np.real(Idz))
188 | plt.clim(-0.04, 0.04)
189 | plt.subplot(223)
190 | plt.plot(Ez[40,:])
191 | plt.subplot(224)
192 | plt.plot(Hy[40,:])
193 | plt.pause(0.1)
194 | plt.clf()
195 |
196 | # storedFields = np.array(storedFields);
197 | # FFT = np.fft.fft(storedFields)
198 | # plt.plot(np.abs(FFT));
199 | plt.show()
200 |
--------------------------------------------------------------------------------
/FDTD2D/Sources/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/Sources/__init__.py
--------------------------------------------------------------------------------
/FDTD2D/Subgridding/2DSubgridTest.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | ## test grid will be a coarse grid on left side, fine grid on right side
4 |
5 | fullxrange = [-400, 400];
6 | fullyrange = [-400, 400];
7 | lambda_0 = 800;
8 | dx_coarse = lambda_0/40;
9 | dy_coarse = dx_coarse;
10 | dx_fine = dx_coarse/2; ## refinement factor of 2;
11 | dy_fine = dx_fine;
12 | dt_coarse = (1/2)**.5*dx_coarse;
13 | dt_fine = dt_coarse/2;
14 |
15 | finexrange = [0, 400];
16 | fineyrange = [-400, 400];
17 | coarsexrange = [-400,0];
18 | coarseyrange = [-400, 400]
19 |
20 |
21 | Nxfine = int(800/dx_fine);
22 | Nyfine = Nxfine;
23 | Nxcoarse = int(800/dx_coarse);
24 | Nycoarse = Nxcoarse;
25 |
26 | Ez1 = np.zeros((Nxcoarse, Nycoarse)); Ez2 = np.zeros((Nxfine, Nyfine));
27 | Hx1 = np.zeros((Nxcoarse, Nycoarse)); Hx2 = np.zeros((Nxfine, Nyfine));
28 | Hy1 = np.zeros((Nxcoarse, Nycoarse)); Hy2 = np.zeros((Nxfine, Nyfine));
29 |
30 | print(Ez1.shape);
31 | print(Ez2.shape)
32 | indx = int(Nxcoarse/2); indy = int(Nycoarse/2)
33 | tsteps = 200;
34 | fig, ax = plt.subplots(nrows=2, ncols=2)
35 |
36 |
37 |
38 | ## we need the dirichlet condition
39 | for t in range(tsteps):
40 | print('timestep: '+str(t))
41 | ## step E components on coarse grid time step t
42 | Hx1[-1,:] = 0;
43 | deriv_x = dt_coarse*(np.roll(Hx1, -1, axis = 0) - Hx1)/dx_coarse;
44 | deriv_y = dt_coarse*(np.roll(Hy1, -1, axis = 1) - Hy1)/dy_coarse;
45 | Ez1 -= deriv_x - deriv_y
46 | ## insert simple point source in coarse grid
47 | J = np.sin(2*np.pi*t/20);
48 | Ez1[indx, 10] =J;
49 |
50 | ## step H components on coarse grid time step t+0.5
51 | Ez1[:,0] = 0;
52 | deriv_x = dt_coarse*(Ez1 - np.roll(Ez1, 1, axis = 0))/dx_coarse;
53 | Ez1[0,:] = 0;
54 | deriv_y = dt_coarse*(Ez1 - np.roll(Ez1, 1, axis = 1))/dy_coarse;
55 | Hx1 -= deriv_x;
56 | Hy1 += deriv_y;
57 | #insert point source
58 | # if(t%10 == 0):
59 | # imgplot = plt.imshow(Ez1)
60 | # imgplot.set_cmap('jet')
61 | # plt.pause(0.01)
62 | # plt.clf()
63 |
64 | ## INTERPOLATION at the quarter time step onto the fine grid
65 | # we can directly map elements onto the coarse grid to every other element on the fine grid
66 | ez1 = Ez1[:, -1]; hx1 = Hx1[:,-1]; hy1 = Hy1[:,-1];
67 |
68 | ## now insert 0's every other value
69 | insertIndices = np.arange(1,Nxcoarse+1);
70 | ez1 = np.insert(ez1,insertIndices ,0)
71 | hx1 = np.insert(hx1,insertIndices ,0)
72 | hy1 = np.insert(hy1,insertIndices ,0)
73 |
74 |
75 | # 0's represent values we need to interpolate
76 | # first step is to do a simple average
77 | ez = (np.roll(ez1, 2) + ez1) / 2
78 | ez = ez1 + np.roll(ez, 1)
79 | hx = (np.roll(hx1, -2) + hx1) / 2
80 | hx = hx1 + np.roll(hx, 1)
81 | hy = (np.roll(hy1, -2) + hy1) / 2
82 | hy = hx1 + np.roll(hy, 1)
83 | # plt.subplot(1,2,1)
84 | # plt.plot(hy)
85 | # plt.ylim([-0.2, 0.2])
86 | # plt.subplot(1,2,2)
87 | # plt.plot(hy1)
88 | # plt.ylim([-0.2, 0.2])
89 | # plt.pause(0.001)
90 | # plt.clf()
91 |
92 | ##Now we havr the subgrid field initial values...now we yee grid this
93 | Ez2[:,0] = ez; Hx2[:,0] = hx; Hy2[:,0] = hy;
94 | Hx2[-1,:] = 0;
95 | Hy2[:,-1] = 0;
96 | deriv_x = dt_fine*(np.roll(Hx2, -1, axis = 0) - Hx2)/dx_fine;
97 | deriv_y = dt_fine*(np.roll(Hy2, -1, axis = 1) - Hy2)/dy_fine;
98 | Ez2 -= deriv_x - deriv_y
99 |
100 | ## we have to be careful here
101 | # Ez1[:,0] = 0;
102 |
103 | deriv_x = dt_fine*(Ez2 - np.roll(Ez2, 1, axis = 0))/dx_fine;
104 | Ez2[0,:] = 0;
105 | deriv_y = dt_fine*(Ez2 - np.roll(Ez2, 1, axis = 1))/dy_fine;
106 | Hx2 -= deriv_x;
107 | Hy2 += deriv_y;
108 |
109 | ## Now we need to interpolate back onto the coarse grid
110 | ez11 = Ez2[0:-1:2,0];
111 | hx11 = Hx2[0:-1:2,0];
112 | hy11 = Hy2[0:-1:2,0];
113 |
114 | ## this reverse mapping is hard
115 | ez11 = (np.roll(ez11,1)+np.roll(ez11,2)+np.roll(ez11,3) +ez11)/9;
116 | hx11 = (np.roll(hx11,1) +hx11)/9;
117 | hy11 = (np.roll(hy11,1) +hy11)/9;
118 |
119 | Ez1[:,-1] = ez11;
120 | Hx1[:,-1] = hx11;
121 | Hy1[:,-1] = hy11;
122 |
123 | plt.subplot(1,2,1)
124 | plt.imshow(Ez1)
125 | plt.subplot(1,2,2)
126 | plt.imshow(Ez2)
127 | plt.pause(0.001)
128 | plt.clf()
--------------------------------------------------------------------------------
/FDTD2D/Subgridding/NonuniformGridTEst.py:
--------------------------------------------------------------------------------
1 | ## step 1, how do we visualize a nonuniform grid
2 |
3 | fullxrange = [-400, 400];
4 | fullyrange = [-400, 400];
5 | lambda_0 = 800;
6 | dx_coarse = lambda_0/80;
7 | dx_fine = dx_coarse/2; ## refinement factor of 2;
8 |
9 |
10 | finexrange = [-200, 200];
11 | fineyrange = [-200, 200];
12 |
13 |
--------------------------------------------------------------------------------
/FDTD2D/Subgridding/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/Subgridding/__init__.py
--------------------------------------------------------------------------------
/FDTD2D/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/__init__.py
--------------------------------------------------------------------------------
/FDTD2D/__pycache__/__init__.cpython-35.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/__pycache__/__init__.cpython-35.pyc
--------------------------------------------------------------------------------
/FDTD2D/__pycache__/__init__.cpython-36.pyc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD2D/__pycache__/__init__.cpython-36.pyc
--------------------------------------------------------------------------------
/FDTD3D/3DSubgridTest.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD3D/3DSubgridTest.py
--------------------------------------------------------------------------------
/FDTD3D/Curl.py:
--------------------------------------------------------------------------------
1 | import numpy as np;
2 |
3 | def curl(Vx, Vy, Vz, roll =1):
4 | #dxVy - dyVx
5 | zcomp = (np.roll(Vy,roll, axis=2) - Vy) - (np.roll(Vx,roll, axis = 1) - Vx);
6 | #dzVx - dxVz
7 | ycomp = (np.roll(Vx,roll, axis=0) - Vx) - (np.roll(Vz,roll, axis=2) - Vz);
8 | #dxVy - dyVx
9 | xcomp = (np.roll(Vz,roll, axis=1) - Vz) - (np.roll(Vy,roll,axis=0) - Vy);
10 | return [xcomp, ycomp, zcomp];
11 |
--------------------------------------------------------------------------------
/FDTD3D/DerivativeAnalysis/DerivativeAnalysis.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 | A = list(range(100));
4 | A = np.reshape(A, (10,10))
5 |
6 | dy = np.roll(A, 1, axis = 1);
7 | dx = np.roll(A,0, axis = 0);
--------------------------------------------------------------------------------
/FDTD3D/FDTD3Dex.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | ## testing of the 3D FDTD equations
3 |
4 | import matplotlib.pyplot as plt
5 | import numpy as np;
6 |
7 | def curl(Vx, Vy, Vz, roll =1):
8 | #dxVy - dyVx
9 | zcomp = (np.roll(Vy,roll, axis=2) - Vy) - (np.roll(Vx,roll, axis = 1) - Vx);
10 | #dzVx - dxVz
11 | ycomp = (np.roll(Vx,roll, axis=0) - Vx) - (np.roll(Vz,roll, axis=2) - Vz);
12 | #dxVy - dyVx
13 | xcomp = (np.roll(Vz,roll, axis=1) - Vz) - (np.roll(Vy,roll,axis=0) - Vy);
14 | return [xcomp, ycomp, zcomp];
15 |
16 |
17 | ## test the curl
18 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
19 | omega_0 = 2*np.pi/lambda_0;
20 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
21 | #print(omega_0); print(sigma)
22 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
23 |
24 |
25 | c = 1; # we are in units of nanometers;
26 | lambda_0 = 800;
27 | lambda_up = 1200;
28 | lambda_low = 400;
29 | dx = lambda_0/100; dy = dx; dz = dy;
30 | dt = (1/3)**.5*dx/c;
31 | xrange = [-400, 400];
32 | yrange = [-400, 400];
33 | zrange = [-400,400]
34 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
35 | source = np.array([-200, 0])-xstart; source = [int(i/dx) for i in source];
36 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
37 |
38 | Nx = int((xrange[1]-xrange[0])/dx);
39 | Ny = int((yrange[1]-yrange[0])/dy);
40 | Nz = int((yrange[1]-yrange[0])/dy);
41 |
42 | ## create epsilon
43 | eps = np.ones((Nx, Ny, Nz));
44 | #eps[50:150, 50:150, 50:150] = 4;
45 |
46 |
47 | ##initialize fields (consider a sparse initializiation)
48 | Hx = np.zeros((Nx, Ny, Nz));
49 | Hy = np.zeros((Nx, Ny, Nz));
50 | Ez = np.zeros((Nx, Ny, Nz));
51 | Ex = np.zeros((Nx, Ny, Nz));
52 | Ey = np.zeros((Nx, Ny, Nz));
53 | Hz = np.zeros((Nx, Ny, Nz));
54 | #spatial steps
55 | #time steps
56 | tsteps = 500;
57 |
58 | ## courant constant
59 | plt.ion()
60 | fieldAmplitudes = list();
61 | plt.figure;
62 | storedFields = list();
63 | jx = int(Nx/2); jy = int(Ny/2); jz = int(Nz/2);
64 | x,y,z = np.mgrid[0:Nx, 0:Ny, 0:Nz];
65 |
66 | dL = [dx, dy, dz];
67 | print('dt: '+str(dt)+' dx: '+str(dx))
68 | for t in range(tsteps):
69 | print('t= '+str(t))
70 | #update Hz, Ex, Ey
71 | #remember the yee grid and integer indexing
72 | ## current source needs to be scaled
73 | J = 1*np.sin(2*np.pi*t/30)
74 | #J = 0.5;
75 | ## we have six different components to update
76 | # 0 = dz, 1 = dy, 2 = dx
77 |
78 | # [chx, chy, chz] = curl(Hx, Hy, Hz, roll = -1);
79 | # #chx = Chx(dL, Hz, Hy); chy = Chy(dL, Hx, Hz);chz = Chz(dL, Hx, Hy);
80 | #
81 | # # print(np.max(chx))
82 | # ## algorithm is unstable right now...somehow the source gets amplified as we do the different rolls
83 | # print('before: '+str(np.max(Ex)))
84 | # Ex -= (dt/dx)*(chx)
85 | # #print('after: '+str(np.max(Ex)))
86 | # Ey -= (dt/dy)*(chy)
87 | # Ez -= (dt/dz)*(chz)
88 | # Ez[jx,jy,jz] -= J;
89 | # #now at the 1/2 time step
90 | # [cex, cey, cez] = curl(Ex, Ey, Ez, roll = 1);
91 | #
92 | # #cex = Cex(dL, Ez, Ey); cey = Cey(dL, Ex, Ez);cez = Cez(dL, Ex, Ey);
93 | #
94 | # Hx -= (dt/dx)*(cex)
95 | # Hy -= (dt/dy)*(cey)
96 | # Hz -= (dt/dz)*(cez)
97 | # print(np.max(Hz))
98 |
99 | #t =t part of the time step, get the curls from t-1/2 for the H field
100 | Chx = ((dt/dy)*(np.roll(Hz, 1, axis = 1) - Hz) - (dt/dz)*(np.roll(Hy, 1, axis = 0)-Hy));
101 | Chy = -((dt/dx)*(np.roll(Hz, 1, axis = 2) - Hz) - (dt/dz)*(np.roll(Hx,1, axis = 0)-Hx));
102 | Chz = ((dt/dx)*(np.roll(Hy, 1, axis = 2) - Hy) - (dt/dy)*(np.roll(Hx, 1, axis = 1)-Hx));
103 | ## add dielectric
104 | Chx = np.multiply(1/eps, Chx);
105 | Chy = np.multiply(1/eps, Chy);
106 | Chz = np.multiply(1/eps, Chz);
107 |
108 | print(np.max(Chx))
109 | print(np.max(Ex))
110 | Ex -= Chx;
111 | print(np.max(Ex))
112 | Ey -= Chy;
113 | Ez -= Chz
114 | Ez[jx, jy, jz] -=J;
115 | # technically, we are t = t+1/2 here
116 | Hx += ((dt/dy)*(Ez - np.roll(Ez, -1, axis = 1) ) - (dt/dz)*(Ey- np.roll(Ey, -1, axis = 0)));
117 | Hy += -((dt/dx)*(Ez - np.roll(Ez, -1, axis = 2) ) - (dt/dz)*(Ex- np.roll(Ex, -1, axis = 0)));
118 | Hz += ((dt/dx)*(Ey - np.roll(Ey, -1, axis = 2) ) - (dt/dy)*(Ex- np.roll(Ex, -1, axis = 1)));
119 |
120 |
121 | #insert point source
122 | if(t%2 == 0):
123 | imgplot = plt.imshow(Ez[:,:,jz], cmap = 'jet')
124 | plt.clim(-0.01, 0.01)
125 | #plt.plot(Ex[:,:,jz])
126 | #imgplot = mlab.contour3d(x,y,z,Hz)
127 | plt.pause(0.001)
128 | #print(np.max(Ez))
129 | #print('current source power: '+str(J))
130 | #print(Ez[jx, jy, jz])
131 | plt.clf()
132 |
133 |
--------------------------------------------------------------------------------
/FDTD3D/GrapheneSimulation/CalcSBCCoef.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | ## we want to encode a 2D grid defining where the SBC is and is not
3 |
4 | def SBCCoefs3D():
5 | return None;
6 |
7 | def squareHole(Nx, Ny):
8 | ## returns a grid containing the structure of the 2D sheet
9 | sheet = np.ones((Nx,Ny));
10 | center = [round(Nx/2), round(Ny/2)]
11 |
--------------------------------------------------------------------------------
/FDTD3D/GrapheneSimulation/FDTD3D_partialvectorizatoin.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | ## testing of the 3D FDTD equations
3 |
4 | import matplotlib.pyplot as plt
5 | import numpy as np;
6 |
7 | def curl(Vx, Vy, Vz, roll =1):
8 | zcomp = (np.roll(Vy,roll, axis=2) - Vy) - (np.roll(Vx,roll, axis = 1) - Vx);
9 | ycomp = (np.roll(Vx,roll, axis=0) - Vx) - (np.roll(Vz,roll, axis=2) - Vz);
10 | xcomp = (np.roll(Vz,roll, axis=1) - Vz) - (np.roll(Vy,roll,axis=0) - Vy);
11 | return [xcomp, ycomp, zcomp];
12 |
13 |
14 | ## test the curl
15 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
16 | omega_0 = 2*np.pi/lambda_0;
17 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
18 | #print(omega_0); print(sigma)
19 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
20 |
21 |
22 | c = 1; # we are in units of nanometers;
23 | lambda_0 = 800;
24 | lambda_up = 1200;
25 | lambda_low = 400;
26 | dx = lambda_0/100; dy = dx; dz = dy;
27 | dt = (1/3)**.5*dx/c;
28 | xrange = [-400, 400];
29 | yrange = [-400, 400];
30 | zrange = [-400,400]
31 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
32 | source = np.array([-200, 0])-xstart; source = [int(i/dx) for i in source];
33 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
34 |
35 | Nx = int((xrange[1]-xrange[0])/dx);
36 | Ny = int((yrange[1]-yrange[0])/dy);
37 | Nz = int((yrange[1]-yrange[0])/dy);
38 |
39 | ## create epsilon
40 | eps = np.ones((Nx, Ny, Nz));
41 | #eps[50:150, 50:150, 50:150] = 4;
42 |
43 |
44 | ##initialize fields (consider a sparse initializiation)
45 | Hx = np.zeros((Nx, Ny, Nz));
46 | Hy = np.zeros((Nx, Ny, Nz));
47 | Ez = np.zeros((Nx, Ny, Nz));
48 | Ex = np.zeros((Nx, Ny, Nz));
49 | Ey = np.zeros((Nx, Ny, Nz));
50 | Hz = np.zeros((Nx, Ny, Nz));
51 | #spatial steps
52 | #time steps
53 |
54 | ## courant constant
55 | plt.ion()
56 | fieldAmplitudes = list();
57 | plt.figure;
58 | storedFields = list();
59 | jx = int(Nx/2); jy = int(Ny/2); jz = int(Nz/2);
60 | x,y,z = np.mgrid[0:Nx, 0:Ny, 0:Nz];
61 |
62 | dL = [dx, dy, dz];
63 | print('dt: '+str(dt)+' dx: '+str(dx))
64 | tsteps = 500;
65 | for t in range(tsteps):
66 | print('t= '+str(t))
67 | #update Hz, Ex, Ey
68 | #remember the yee grid and integer indexing
69 | ## current source needs to be scaled
70 | J = 1*np.sin(2*np.pi*t/30)
71 |
72 | CHX = np.zeros((Nx,Ny,Nz));
73 | CHY = np.zeros((Nx,Ny,Nz));
74 | CHZ = np.zeros((Nx,Ny,Nz));
75 | #t =t part of the time step, get the curls from t-1/2 for the H field
76 | for i in range(0,Nz):
77 | index = i+1;
78 | if(index >Nz-1):
79 | index = 0;
80 | Chx = ((dt/dy)*(np.roll(Hz[i,:,:], 1, axis = 0) - Hz[i,:,:]) - (dt/dz)*(Hy[index, :,:]-Hy[i,:,:]));
81 | Chy = -((dt/dx)*(np.roll(Hz[i,:,:], 1, axis = 1) - Hz[i,:,:]) - (dt/dz)*(Hx[index, :,:]-Hx[i,:,:]));
82 | Chz = ((dt/dx)*(np.roll(Hy[i,:,:], 1, axis = 1) - Hy[i,:,:]) - (dt/dy)*(np.roll(Hx[i,:,:], 1, axis = 0)-Hx[i,:,:]));
83 | ## add dielectric
84 | # Chx = np.multiply(1/eps[i,:,:], Chx);
85 | # Chy = np.multiply(1/eps[i,:,:], Chy);
86 | # Chz = np.multiply(1/eps[i,:,:], Chz);
87 | CHX[i,:,:] = Chx;
88 | CHY[i,:,:] = Chy;
89 | CHZ[i,:,:] = Chz;
90 |
91 | Ex -= CHX;
92 | Ey -= CHY;
93 | Ez -= CHZ;
94 | Ez[jx, jy, jz] -=J;
95 |
96 | ## update H fields
97 | # # technically, we are t = t+1/2 here
98 |
99 | CEX = np.zeros((Nx,Ny,Nz));
100 | CEY = np.zeros((Nx,Ny,Nz));
101 | CEZ = np.zeros((Nx,Ny,Nz));
102 | for i in range(0,Nz):
103 | index = i-1;
104 | if(index <0):
105 | index = Nz-1;
106 | CEx = ((dt/dy)*(Ez[i,:,:] - np.roll(Ez[i,:,:], -1, axis = 0)) - (dt/dz)*(Ey[i,:,:]- Ey[index,:,:]));
107 | CEy = -((dt/dx)*(Ez[i,:,:] - np.roll(Ez[i,:,:], -1, axis = 1)) - (dt/dz)*(Ex[i,:,:]- Ex[index,:,:]));
108 | CEz = ((dt/dx)*(Ey[i,:,:] - np.roll(Ey[i,:,:], -1, axis = 1)) - (dt/dy)*(Ex[i,:,:]- np.roll(Ex[i,:,:], -1, axis = 0)));
109 |
110 | CEX[i,:,:]= CEx;
111 | CEY[i,:,:] = CEy;
112 | CEZ[i,:,:] = CEz;
113 |
114 | Hx += CEX;
115 | Hy += CEY;
116 | Hz += CEZ;
117 |
118 | # Hx += ((dt/dy)*(Ez - np.roll(Ez, -1, axis = 1) ) - (dt/dz)*(Ey- np.roll(Ey, -1, axis = 0)));
119 | # Hy += -((dt/dx)*(Ez - np.roll(Ez, -1, axis = 2) ) - (dt/dz)*(Ex- np.roll(Ex, -1, axis = 0)));
120 | # Hz += ((dt/dx)*(Ey - np.roll(Ey, -1, axis = 2) ) - (dt/dy)*(Ex- np.roll(Ex, -1, axis = 1)));
121 |
122 |
123 | #insert point source
124 | if(t%2 == 0):
125 | imgplot = plt.imshow(((Ez[:,:,jz])), cmap = 'jet')
126 | print(np.max(Ez))
127 | #plt.plot(Ez[:,jy, jz])
128 | plt.clim(-0.01, 0.01)
129 | #plt.plot(Ex[:,:,jz])
130 | #imgplot = mlab.contour3d(x,y,z,Hz)
131 | plt.pause(0.001)
132 | #print(np.max(Ez))
133 | #print('current source power: '+str(J))
134 | #print(Ez[jx, jy, jz])
135 | plt.clf()
136 |
137 |
--------------------------------------------------------------------------------
/FDTD3D/GrapheneSimulation/GrapheneSheetTest3D.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 |
3 | import numpy as np
4 | ## testing of the 3D FDTD equations
5 |
6 | import matplotlib.pyplot as plt
7 | import numpy as np;
8 |
9 | def curl(Vx, Vy, Vz, roll =1):
10 | #dxVy - dyVx
11 | zcomp = (np.roll(Vy,roll, axis=2) - Vy) - (np.roll(Vx,roll, axis = 1) - Vx);
12 | #dzVx - dxVz
13 | ycomp = (np.roll(Vx,roll, axis=0) - Vx) - (np.roll(Vz,roll, axis=2) - Vz);
14 | #dxVy - dyVx
15 | xcomp = (np.roll(Vz,roll, axis=1) - Vz) - (np.roll(Vy,roll,axis=0) - Vy);
16 | return [xcomp, ycomp, zcomp];
17 |
18 |
19 | ## test the curl
20 | def currSource(t, lambda_up, lambda_low, lambda_0, c, dx):
21 | omega_0 = 2*np.pi/lambda_0;
22 | sigma = (2/omega_0)*(lambda_0)/(lambda_up-lambda_low)
23 | #print(omega_0); print(sigma)
24 | return np.exp(-(t-4*sigma)**2/sigma**2)*np.sin(omega_0*t)*(10/dx)**2;
25 |
26 |
27 | c = 1; # we are in units of nanometers;
28 | lambda_0 = 800;
29 | lambda_up = 1200;
30 | lambda_low = 400;
31 | dx = lambda_0/100; dy = dx; dz = dy;
32 | dt = (1/3)**.5*dx/c;
33 | xrange = [-400, 400];
34 | yrange = [-400, 400];
35 | zrange = [-400,400]
36 | xstart = np.array([-400,-400]); xend = np.array([400,400]);
37 | source = np.array([-200, 0])-xstart; source = [int(i/dx) for i in source];
38 | probloc = np.array([200,0])-xstart; probloc = [int(i/dx) for i in probloc];
39 |
40 | Nx = int((xrange[1]-xrange[0])/dx);
41 | Ny = int((yrange[1]-yrange[0])/dy);
42 | Nz = int((yrange[1]-yrange[0])/dy);
43 |
44 | ## create epsilon
45 | eps = np.ones((Nx, Ny, Nz));
46 | #eps[50:150, 50:150, 50:150] = 4;
47 |
48 |
49 | ##initialize fields (consider a sparse initializiation)
50 | Hx = np.zeros((Nx, Ny, Nz));
51 | Hy = np.zeros((Nx, Ny, Nz));
52 | Ez = np.zeros((Nx, Ny, Nz));
53 | Ex = np.zeros((Nx, Ny, Nz));
54 | Ey = np.zeros((Nx, Ny, Nz));
55 | Hz = np.zeros((Nx, Ny, Nz));
56 | #spatial steps
57 |
58 |
59 | tau = 0.1;
60 | sigma_0 = 1;
61 | ## Hx sheet update coefficients
62 | c1 = (dt) / (dz * sigma_0 + dt);
63 | c2 = (dt) / (dz * sigma_0 + dt); ## if this is the courant number, there is instability introduced
64 |
65 | fe1 = sigma_0 * c1;
66 | fe2 = sigma_0 * c2;
67 | fh11 = 1-2.0*c1;
68 | fh22 = 1-2.0*c2
69 | fh12 = c1;
70 | fh21 = c2;
71 |
72 |
73 | ## Hy field coefficients on the sbc sheet
74 | c1y = (dt) / (dz * sigma_0 - dt);
75 | c2y = (dt) / (dz * sigma_0 - dt); ## if this is the courant number, there is instability introduced
76 |
77 | fe1y = sigma_0 * c1y;
78 | fe2y = sigma_0 * c2y;
79 | fh11y = 1-2.0*c1y;
80 | fh22y = 1-2.0*c2y
81 | fh12y = c1y;
82 | fh21y = c2y;
83 |
84 |
85 |
86 | ## courant constant
87 | plt.ion()
88 | fieldAmplitudes = list();
89 | plt.figure(figsize = (20,20));
90 | storedFields = list();
91 | jx = int(Nx/4); jy = int(Ny/2); jz = int(Nz/4);
92 | x,y,z = np.mgrid[0:Nx, 0:Ny, 0:Nz];
93 |
94 | dL = [dx, dy, dz];
95 | print('dt: '+str(dt)+' dx: '+str(dx))
96 |
97 | ## We have to define a special yee cell which contains the conducting surface
98 | Hx_sheet = np.zeros((Nx,Ny,2)); #third dimension denotes index, orwhich side of the sheet
99 | Hy_sheet = np.zeros((Nx,Ny,2));
100 | Ez_sheet = np.zeros((Nx,Ny,2));
101 | Ex_sheet = np.zeros((Nx,Ny));
102 | Ey_sheet = np.zeros((Nx,Ny));
103 | Hz_sheet = np.zeros((Nz,Ny));
104 |
105 | sheet_loc_z = round(Nz/2);
106 |
107 | #time steps
108 | tsteps = 100;
109 | StorageSheet = list();
110 | for t in range(tsteps):
111 | print('t= '+str(t))
112 | #t =t part of the time step, get the curls from t-1/2 for the H field
113 | ## any Hy or Hx that appears will have a special update with the interface
114 |
115 | #############=========== E FIELD UPDATES =====================#################
116 |
117 | CHX = np.zeros((Nx,Ny,Nz));
118 | CHY = np.zeros((Nx,Ny,Nz));
119 | CHZ = np.zeros((Nx,Ny,Nz));
120 | for i in range(Nz):
121 | index = i + 1;
122 | if (index > Nz - 1):
123 | index = 0;
124 | if(i == sheet_loc_z): ## at the yee cell right before the surface cell
125 | Hy_int_bottom = Hy_sheet[:,:,0]; # these are updated in the H loop
126 | Hx_int_bottom = Hx_sheet[:,:,0];
127 | ## The border yee cell couples into the Hy, Hx, components of the cell above it in the z derivatives
128 | Chx = ((dt / dy) * (np.roll(Hz[i, :, :], 1, axis=0) - Hz[i, :, :]) - (dt / dz) * (Hy_int_bottom - Hy[i, :, :]));
129 | Chy = -((dt / dx) * (np.roll(Hz[i, :, :], 1, axis=1) - Hz[i, :, :]) - (dt / dz) * (Hx_int_bottom - Hx[i, :, :]));
130 | Chz = ((dt / dx) * (np.roll(Hy[i, :, :], 1, axis=1) - Hy[i, :, :]) - (dt / dy) * (np.roll(Hx[i, :, :], 1, axis=0) - Hx[i, :, :]));
131 |
132 | CHX[i, :, :] = Chx;
133 | CHY[i, :, :] = Chy;
134 | CHZ[i, :, :] = Chz;
135 |
136 |
137 | ####################UPDATE OF THE SURFACE YEE CELL########################################
138 | ## this is also where we do updates on the Ez sheet, something new from the 1D case
139 | ## Time step the Ez sheet fields using the updated Hy and Hx sheet fields
140 | # calculate derivatives of the sheet fields for Ez update
141 | deriv_Hy_x = np.roll(Hy_sheet[:, :, 0], 1, axis=1) - Hy_sheet[:, :, 0];
142 | deriv_Hx_y = np.roll(Hx_sheet[:, :, 0], 1, axis=0) - Hx_sheet[:, :, 0];
143 | deriv_Hy_x2 = np.roll(Hy_sheet[:, :, 1], 1, axis=1) - Hy_sheet[:, :, 1];
144 | deriv_Hx_y2 = np.roll(Hx_sheet[:, :, 1], 1, axis=0) - Hx_sheet[:, :, 1];
145 |
146 |
147 |
148 | elif(i == sheet_loc_z+1): ## yee cell right afte rthe sheet field update
149 | Hy_int_top = Hy_sheet[:,:,1];
150 | Hx_int_top = Hx_sheet[:,:,1];
151 | Chx = ((dt / dy) * (np.roll(Hz[i, :, :], 1, axis=0) - Hz[i, :, :]) - (dt / dz) * ( Hy[i, :, :]-Hy_int_top));
152 | Chy = -((dt / dx) * (np.roll(Hz[i, :, :], 1, axis=1) - Hz[i, :, :]) - (dt / dz) * (Hx[i, :, :]- Hx_int_top ));
153 | Chz = ((dt / dx) * (np.roll(Hy[i, :, :], 1, axis=1) - Hy[i, :, :]) - (dt / dy) * (np.roll(Hx[i, :, :], 1, axis=0) - Hx[i, :, :]));
154 | ## add dielectric
155 | # Chx = np.multiply(1/eps[i,:,:], Chx);
156 | # Chy = np.multiply(1/eps[i,:,:], Chy);
157 | # Chz = np.multiply(1/eps[i,:,:], Chz);
158 | CHX[i, :, :] = Chx;
159 | CHY[i, :, :] = Chy;
160 | CHZ[i, :, :] = Chz;
161 |
162 |
163 | else:
164 |
165 | Chx = ((dt / dy) * (np.roll(Hz[i, :, :], 1, axis=0) - Hz[i, :, :]) - (dt / dz) * (Hy[index, :, :] - Hy[i, :, :]));
166 | Chy = -((dt / dx) * (np.roll(Hz[i, :, :], 1, axis=1) - Hz[i, :, :]) - (dt / dz) * (Hx[index, :, :] - Hx[i, :, :]));
167 | Chz = ((dt / dx) * (np.roll(Hy[i, :, :], 1, axis=1) - Hy[i, :, :]) - (dt / dy) * (np.roll(Hx[i, :, :], 1, axis=0) - Hx[i, :, :]));
168 | ## add dielectric
169 | # Chx = np.multiply(1/eps[i,:,:], Chx);
170 | # Chy = np.multiply(1/eps[i,:,:], Chy);
171 | # Chz = np.multiply(1/eps[i,:,:], Chz);
172 | CHX[i, :, :] = Chx;
173 | CHY[i, :, :] = Chy;
174 | CHZ[i, :, :] = Chz;
175 |
176 |
177 | ## NOW UPDATE EVERYTHING
178 | # PLUS SIGN BECAUSE WE HAVE REVERSED THE CURL
179 | Ez_sheet[:, :, 0] += (dt / dx) * (deriv_Hx_y - deriv_Hy_x)
180 | Ez_sheet[:, :, 1] += (dt / dx) * (deriv_Hx_y2 - deriv_Hy_x2)
181 |
182 | ## UPDATE THE NORMAL FIELD COMPONENTS IN THE SURFACE CELL
183 | # there is no corresponding Hy or Hx for the Ex and Ey in the sbc cell, only the sheet fields.
184 | # derivative with the sheet field involved is not a full central difference, it's a backward diff, so a facto of 1/2
185 | Ex_sheet += (
186 | (dt / dy) * (np.roll(Hz_sheet, 1, axis=0) - Hz_sheet) - (dt / dz) *0.5* (Hy_int_bottom - Hy[sheet_loc_z, :, :]));
187 | Ey_sheet += -(
188 | (dt / dx) * (np.roll(Hz_sheet, 1, axis=1) - Hz_sheet) - (dt / dz) *0.5* (Hx_int_bottom - Hx[sheet_loc_z, :, :]));
189 | Ex -= CHX;
190 | Ey -= CHY;
191 | Ez -= CHZ;
192 |
193 | ## SOURECE UPDATE
194 | J = 1*np.sin(2*np.pi*t/30)
195 | Ez[jx, jy, jz] -=J;
196 |
197 | #############=========== H FIELD UPDATES =====================#################
198 | CEX = np.zeros((Nx,Ny,Nz));
199 | CEY = np.zeros((Nx,Ny,Nz));
200 | CEZ = np.zeros((Nx,Ny,Nz));
201 | for i in range(1,Nz):
202 | index = i-1;
203 | if(index <0):
204 | index = Nz-1;
205 |
206 | if( i== sheet_loc_z): # we are at the yee cell right before the surface conductivity cell
207 | ## The bordering yee cell coupled to Ey and Ex on the surface conductivity sheet
208 | Ez_top = Ez_sheet[:,:,0];
209 | Ez_bottom = Ez_sheet[:,:,1];
210 |
211 | ## the updates here do not touch any of the surface cell components...
212 | CEx = ((dt/dy)*(Ez[i,:,:] - np.roll(Ez[i,:,:], -1, axis = 0)) - (dt/dz)*(Ey[i,:,:]- Ey[index, :, :]));
213 | CEy = -((dt/dx)*(Ez[i,:,:] - np.roll(Ez[i,:,:], -1, axis = 1)) - (dt/dz)*(Ex[i,:,:]- Ex[index, :, :]));
214 | CEz = ((dt/dx)*(Ey[i,:,:] - np.roll(Ey[i,:,:], -1, axis = 1)) - (dt/dy)*(Ex[i,:,:]- np.roll(Ex[i,:,:], -1, axis = 0)));
215 | CEX[i, :, :] = CEx;
216 | CEY[i, :, :] = CEy;
217 |
218 | CEZ[i, :, :] = CEz;
219 |
220 |
221 | ## define F coefs for the Hx sheet ## WITHIN HERE< WE ARE ACTUALLY GOING TO RUN THE UPDATE ON THE H FIELDS
222 | ## INSIDE THE CONDUCTIVITY CELL
223 | # define derivatives of the sheet fields
224 | deriv_y_1 = (np.roll(Ez_sheet[:, :, 0], 1, axis=1) - Ez_sheet[:, :, 0])/dz;
225 | deriv_y_2 = (np.roll(Ez_sheet[:, :, 1], 1, axis=1) - Ez_sheet[:, :, 1])/dz;
226 |
227 | F1n_Hx = fh11 * (Hx_sheet[:, :, 0] + fh12 * Hx_sheet[:, :, 1]) - \
228 | fe1 * (2 * Ey[:, :, sheet_loc_z]) + dz * deriv_y_1;
229 | F2n_Hx = fh21 * (Hx_sheet[:, :, 0] + fh22 * Hx_sheet[:, :, 1]) + \
230 | fe2 * (2 * Ey[:, :, sheet_loc_z+1] - dz * deriv_y_2);
231 |
232 | F1n_Hy = fh11y * (Hy_sheet[:, :, 0] + fh12y * Hy_sheet[:, :, 1]) - \
233 | fe1y * (2 * Ey[:, :, sheet_loc_z]) + dz * deriv_y_1;
234 | F2n_Hy = fh21y * (Hy_sheet[:, :, 0] + fh22y * Hy_sheet[:, :, 1]) + \
235 | fe2y * (2 * Ey[:, :, sheet_loc_z+1] - dz * deriv_y_2) ;
236 | F1n_Hy = -F1n_Hy; F2n_Hy = -F2n_Hy;
237 |
238 |
239 | elif(i == sheet_loc_z+1): ## NOW WE ARE AT THE CELL ABOVE THE SURFACE CONDUCTIVITY YEE CELL
240 | ## Coupling only happesn on the z derivatives
241 |
242 | CEx = ((dt/dy)*(Ez[i,:,:] - np.roll(Ez[i,:,:], -1, axis = 0)) - (dt/dz)*(Ey[i,:,:]- Ey_sheet));
243 | CEy = -((dt/dx)*(Ez[i,:,:] - np.roll(Ez[i,:,:], -1, axis = 1)) - (dt/dz)*(Ex[i,:,:]- Ex_sheet));
244 | CEz = ((dt/dx)*(Ey[i,:,:] - np.roll(Ey[i,:,:], -1, axis = 1)) - (dt/dy)*(Ex[i,:,:]- np.roll(Ex[i,:,:], -1, axis = 0)));
245 |
246 | CEX[i, :, :] = CEx;
247 | CEY[i, :, :] = CEy;
248 | CEZ[i, :, :] = CEz;
249 |
250 |
251 | else: ## execute normal update
252 | CEx = ((dt/dy)*(Ez[i,:,:] - np.roll(Ez[i,:,:], -1, axis = 0)) - (dt/dz)*(Ey[i,:,:]- Ey[index,:,:]));
253 | CEy = -((dt/dx)*(Ez[i,:,:] - np.roll(Ez[i,:,:], -1, axis = 1)) - (dt/dz)*(Ex[i,:,:]- Ex[index,:,:]));
254 | CEz = ((dt/dx)*(Ey[i,:,:] - np.roll(Ey[i,:,:], -1, axis = 1)) - (dt/dy)*(Ex[i,:,:]- np.roll(Ex[i,:,:], -1, axis = 0)));
255 | CEX[i, :, :] = CEx;
256 | CEY[i, :, :] = CEy;
257 | CEZ[i, :, :] = CEz;
258 | ## once you calculate all the quantities, then do the updates
259 | ## We also need to update the Hz component of the surface cell
260 | Hz_sheet += ((dt / dx) * (Ey_sheet - np.roll(Ey_sheet, -1, axis=1)) - \
261 | (dt / dy) * (Ex_sheet - np.roll(Ex_sheet, -1, axis=0)));
262 |
263 | Hx_sheet[:, :, 0] = (1 / (1 - c1 * c2)) * (F1n_Hx + c1 * F2n_Hx);
264 | Hx_sheet[:, :, 1] = (1 / (1 - c1 * c2)) * (F2n_Hx + c2 * F1n_Hx); # use Fx_sheet to update the E fields
265 |
266 | StorageSheet.append([Hx_sheet, Hy_sheet, Hz_sheet])
267 |
268 | Hy_sheet[:, :, 0] = (1 / (1 - c1 * c2)) * (F1n_Hy + c1 * F2n_Hy);
269 | Hy_sheet[:, :, 1] = (1 / (1 - c1 * c2)) * (F2n_Hy + c2 * F1n_Hy); # use Fx_sheet to update the E fields
270 |
271 | Hx += CEX;
272 | Hy += CEY;
273 | Hz += CEZ;
274 |
275 |
276 | if(t%2 == 0):
277 | plt.subplot(4,3,1)
278 | # print(np.max(Hx_sheet));
279 | # print(np.max(Ez))
280 | # print(np.max(Ex_sheet))
281 | plt.subplot(4,3,2)
282 | imgplot = plt.imshow(Hx_sheet[:,:,1], cmap = 'jet')
283 | plt.subplot(4,3,3)
284 | imgplot = plt.imshow(Ez_sheet[:,:,0], cmap = 'jet')
285 | plt.subplot(4,3,4)
286 | imgplot = plt.imshow(Ez_sheet[:,:,1], cmap = 'jet')
287 | plt.subplot(4,3,5)
288 | imgplot = plt.imshow(Hy_sheet[:,:,0], cmap = 'jet')
289 | plt.subplot(4,3,6)
290 | imgplot = plt.imshow(Hy_sheet[:,:,1], cmap = 'jet')
291 | plt.subplot(4,3,7)
292 | imgplot = plt.plot(Ez[:,jy,sheet_loc_z])
293 | plt.subplot(4,3,8)
294 | imgplot = plt.plot(Ey[:,jy,sheet_loc_z])
295 | plt.subplot(4,3,9)
296 | imgplot = plt.imshow(Ex[:,:,jz], cmap = 'jet')
297 | plt.subplot(400,3,10)
298 | plt.clim(-0.01, 0.01)
299 | imgplot = plt.imshow(Ey[:,:,jz], cmap = 'jet')
300 | plt.clim(-0.01, 0.01)
301 | plt.subplot(4,3,11)
302 | imgplot = plt.imshow(Ez[:,:,jz], cmap = 'jet')
303 | plt.clim(-0.01, 0.01)
304 | #plt.plot(Ex[:,:,0jz])
305 | #imgplot = mlab.co0ntour3d(x,y,z,Hz)
306 | plt.pause(0.001)
307 | #print(np.max(Ez))
308 | #print('current s00ource power: '+str(J))
309 | #print(Ez[jx, jy, jz])
310 | plt.clf()
311 |
312 |
--------------------------------------------------------------------------------
/FDTD3D/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zhaonat/pythonFDTD/91c9bae5b6a98461d0fbe15f03bb68b35a203f34/FDTD3D/__init__.py
--------------------------------------------------------------------------------
/Interpolation/InterpolationTesting.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | ## linear interpolation of two points
4 |
5 | def interp(r1, r2, x):
6 | ans = r1[1] + (x-r1[0])*((r2[1]-r1[1])/(r2[0]-r1[0]));
7 | return ans;
8 |
9 | def bilinearinterp():
10 | #requires knowledge of four points on the plane
11 | return None;
12 |
13 | def trilinearinterp():
14 | #requires knowledge of 9 points on the space
15 | return None;
16 |
17 | r1 = [1,1];
18 | r2 = [3,3];
19 |
20 | test = list();
21 | for i in range(20):
22 | test.append(interp(r1, r2, i))
23 |
24 | plt.plot(test)
25 | plt.show()
--------------------------------------------------------------------------------
/UPML.m:
--------------------------------------------------------------------------------
1 |
2 | Nx = 80;
3 | Ny = 80;
4 | Npml = [10,10]
5 | sigx = zeros(2*Nx, 2*Ny);
6 | dt = 0.1;
7 | for nx = 1:2*Npml(1)
8 | nx1 = 2*Npml(1)-nx+1;
9 | sigx(nx1,:) = 0.5*dt*(nx/2/Npml(1))^3;
10 | end
11 |
12 |
--------------------------------------------------------------------------------