FDTD Method
Solving Maxwell's equation for 1D case with two interfaces. Based on the work of John B. Schneider "Understanding the Finite-Difference Time-Domain Method" 2023
Download original notebookDefine constants
ζ = 377.0; (*BB[*)(*Ohm*)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*) size = 400; ez = ConstantArray[0., {size}]; hy = ConstantArray[0., {size}]; cμ = ConstantArray[ζ, {size}]; cϵ = ConstantArray[1., {size}]; (*BB[*)(*Define a second medium with losses*)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*) cϵ[[200;;220]] = (*FB[*)(((1 - 0.001))(*,*)/(*,*)((1 + 0.001)))(*]FB*); cμ[[200;;220]] = (*FB[*)((ζ)(*,*)/(*,*)(9.0))(*]FB*) / (1 + 0.001); generator = With[{ie = size}, Compile[{{steps, _Integer}}, Module[ {ez = ez, hy = hy}, Do[ (*BB[*)(*Calculate magnetic field *)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*) Do[ hy[[j]] += (*FB[*)(((ez[[j + 1]] - ez[[j]]))(*,*)/(*,*)(ζ))(*]FB*); , {j, 1, ie-1}]; (*BB[*)(*Boundary conditions*)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*) hy[[ie]] = hy[[ie-1]]; ez[[ie]] = ez[[ie-1]]; (*BB[*)(*Pulse generator*)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*) hy[[49]] -= Exp[- (*FB[*)(((*SpB[*)Power[(n - 30.)(*|*),(*|*)2](*]SpB*))(*,*)/(*,*)(100.))(*]FB*)] / ζ; ez[[1]] = ez[[2]]; (*BB[*)(*Calculate electric field *)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*) Do[ ez[[j]] = cϵ[[j]] ez[[j]] + cμ[[j]] (hy[[j]] - hy[[j - 1]]) , {j, 2, ie - 1}]; (*BB[*)(*Pulse generator*)(*,*)(*"1:eJxTTMoPSmNhYGAo5gcSAUX5ZZkpqSn+BSWZ+XnFaYwgCS4g4Zyfm5uaV+KUXxEMUqxsbm6exgSSBPGCSnNSg9mAjOCSosy8dLBYSFFpKpoKkDkeqYkpEFXBILO1sCgJSczMQVYCAOFrJEU="*)(*]BB*) ez[[50]] += Exp[- (*FB[*)(((*SpB[*)Power[(n + 0.5 - (-0.5) - 30.)(*|*),(*|*)2](*]SpB*))(*,*)/(*,*)(100.0))(*]FB*)]; , {n, steps}]; ez], CompilationOptions -> {"InlineExternalDefinitions" -> True}, "CompilationTarget" -> "C", "RuntimeOptions" -> "Speed"]];
Plot as a function of x-coordinate
electricField = {Range[400], generator[3]} // Transpose; Graphics[ Line[electricField // Offload], PlotRange->{{0,400}, {-1,1}}, TransitionDuration->5 ]
(*VB[*)(Graphics[Line[Offload[electricField]], PlotRange -> {{0, 400}, {-1, 1}}, TransitionDuration -> 5])(*,*)(*"1:eJxdTVsKAjEQqy/UD3+8gXcR9WNBKV6g7k41UFrpdO/hjTVFZHHnI5NkmGR3S9ZPjDE6J5xS6PysqhXhmN3zgVaHe4MoX7UknL0PyXW6IZcgbcloDxBGTH8Ptg+ia5JLSMW6eJfh1kDLvwK3wYsFI//NQe0dJW9JrtlFRUGK+z67urGg/QE7azJt"*)(*]VB*)
Manipulate the time
EventHandler[InputRange[1,800,10,10], Function[val, electricField = {Range[400], generator[val]} // Transpose; ]]
(*VB[*)(EventObject[<|"Id" -> "c89daae1-37e8-42c0-8b1d-df9245dee993", "Initial" -> 10, "View" -> "8f7a33e3-c23f-4773-9462-7d69117199b2"|>])(*,*)(*"1:eJxTTMoPSmNkYGAoZgESHvk5KRCeEJBwK8rPK3HNS3GtSE0uLUlMykkNVgEKW6SZJxobpxrrJhsZp+mamJsb61qamBnpmqeYWRoamhtaWiYZAQB7JhTJ"*)(*]VB*)