# 9月13日 于成都黄龙溪
1 #!/usr/bin/perl
2
3 # Author : Leon Email: yangli0534@gmail.com
4 # fdtd simulation , plotting with gnuplot, writting in perl
5 # perl and gnuplot software packages should be installed before running this program
6
7 #use Time::HiRes qw(sleep);
8 #use autodie qw(:all);
9 print "\@\n";
10 my $terminal = "";
11 open GNUPLOT_TERM, "echo \'show terminal;\' | gnuplot 2>&1 |";
12 while (<GNUPLOT_TERM>) {
13 if (m/terminal type is (\w+)/) {
14 $terminal=$1;
15 }
16 }
17 close GNUPLOT_TERM;
18
19 # unfortunately, the wxt terminal type does not support positioning.
20 # hardcode it...
21 $terminal = "x11";
22
23 open my $PIPE ,"| gnuplot " || die "Can\'t initialize gnuplot number \n";
24
25 print $PIPE "set size 0.85, 0.85\n";
26 print $PIPE "set term png size 600, 400\n";
27
28 my $title = "fdtd simulation by leon,yangli0534\\\\@"."gmail.com";
29 print $PIPE "set terminal gif animate\n";# terminal type: png
30 print $PIPE "set output \"fdtd_simulation_v0.1.gif\"\n";#output file name
31 print $PIPE "set title \"{/Times:Italic $title}\"\n";# title name and font
32 #print $PIPE "set title \"fdtd simulation by leon,yangli0534\\\\@ gmail.com\"\n";# title name and font
33 print $PIPE "set title font \",15\" norotate tc rgb \"white\"\n";
34 print $PIPE "unset key\n";
35 print $PIPE "set tics textcolor rgb \"white\"\n";# text color
36 print $PIPE "set border lc rgb \"orange\"\n";
37 print $PIPE "set grid lc rgb\"orange\"\n";
38 print $PIPE "set object 1 rectangle from screen 0,0 to screen 1,1 fc rgb \"gray10\" behind\n";#background color
39 print $PIPE "set xlabel\" {/Times:Italic distance: wave length}\" tc rgb \"white\" \n";# xlabel
40 print $PIPE "set ylabel\"{/Times:Italic amplitude: v}\" tc rgb \"white\"\n";#ylabel
41 print $PIPE "set autoscale\n";
42
43 my $size = 400;#physical distance
44 my @ez;#electric field
45 my @hy;#magnetic field
46
47 my $imp0 = 377.0;
48 #initalization
49 for (my $i = 0; $i < $size; $i++){
50 $ez[$i] = 0;
51 $hy[$i] = 0;
52
53 }
54 my $qTime;
55 my $MaxTime = 1850;
56 my $pi = 3.141592563589793;
57 print $PIPE "set xrange [0:$size-1]\n";
58 my $mm = 0;
59
60 #do time stepping
61 for($qTime = 0; $qTime < $MaxTime; $qTime+=5){
62
63 # update magnetic field
64 for( $mm = 0; $mm < $size - 1; $mm++){
65 $hy[$mm] = $hy[$mm] + ($ez[$mm+1] - $ez[$mm])/$imp0;
66 }
67
68 # update electric field
69 for( $mm = 1; $mm < $size ; $mm++){
70 $ez[$mm] = $ez[$mm] + ($hy[$mm] - $hy[$mm-1])*$imp0;
71 }
72
73 if($qTime % 10 == 0){
74
75 print $PIPE "plot \"-\" w l lw 3 lc rgb \"green\"\n";
76 my $cnt = 0;
77 for my $elem ( @ez) {
78 #print " ".$elem;
79 print $PIPE $cnt." ".$elem."\n";
80 $cnt += 1;
81 }
82 print $PIPE "e\n";
83 }
84 #hardwire a source
85 $ez[0] = exp(-($qTime - 30.0)*($qTime - 30.0)/100);
86 }
87
88 #print $PIPE "set terminal x11\n";
89
90 print $PIPE "set output\n";
91
92 close($PIPE);
