├── .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 | 12 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 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 | --------------------------------------------------------------------------------