animation
This is a basic C program to generate a gnuplot script to produce a gif animation:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 100
FILE * out;
int main()
{
int i, count = 0;
out = fopen("sho_gif.plt", "w");
fprintf(out,"set term gif tiny animate delay 200 \nset output 'sho.gif' \nset size 1.0, 0.8 \n\n");
fprintf(out,"E0(x) = ground \nfit E0(x) 'energy.data' us 1:2:4 via ground \n");
fprintf(out,"E1(x) = first \nfit E1(x) 'energy.data' us 1:5:7 via first \n");
fprintf(out,"p(x) = position \nfit p(x) 'energy.data' us 1:8 via position \n");
fprintf(out,"sho(x) = 0.01125*x*x \n\n");
for (i = 1; i < N; i++)
{
count ++;
fprintf(out,"# Frame %i # \n", count);
fprintf(out,"unset title \n");
fprintf(out,"set multiplot \n\n");
fprintf(out,"set xrange [%i:%i] \nset size 0.4, 0.2 \n\n", i*100 - 500, i*100);
/* Ground state */
fprintf(out,"set origin 0.6, 0.2 \nset yrange [0.05:0.10] \n");
fprintf(out,"set xlabel 'Time' \nset ytics 0.01 \nset ylabel '<E0>' \n");
fprintf(out,"p 'energy.data' us 1:2 noti w li 5, 'energy.data' us 1:3:4 noti w yerr 6, ground noti w li 3\n\n");
/* First excited state */
fprintf(out,"set origin 0.6, 0.4 \nset yrange [0.15:0.30] \n");
fprintf(out,"set xlabel 'Time' \nset ytics 0.03 \nset ylabel '<E1>' \n");
fprintf(out,"p 'energy.data' us 1:5 noti w li 7, 'energy.data' us 1:6:7 noti w yerr 8, first noti w li 4 \n\n");
/* Average position */
fprintf(out,"set origin 0.6, 0.6 \nset yrange[-0.50:0.50] \n");
fprintf(out,"set xlabel 'Time' \nset ytics 0.25 \nset ylabel '<x>' \n");
fprintf(out,"p 'energy.data' us 1:8 noti w li 9, position noti w li 8 \n\n");
/* X vector */
fprintf(out,"set origin 0.0, 0.0 \nset size 1.0, 0.2 \n");
fprintf(out,"set xrange [0:500] \nset ytics 2 \nset yrange [-6:6] \n");
fprintf(out,"set xlabel 'X(N)' \nset ylabel 'Position' \n");
fprintf(out,"p 'x_vector.data' every :::%i::%i noti w histeps 8 \n\n", i, i);
/* Psi squared */
fprintf(out,"set origin 0.0, 0.2 \nset size 0.6, 0.6 \n");
fprintf(out,"set xrange [-6:6] \nset ytics 0.05\n set yrange [0:0.35] \n");
fprintf(out,"set title 'Psi Squared in a SHO' \n");
fprintf(out,"set xlabel 'Position' \nset ylabel 'Energy' \n");
fprintf(out,"set label 1 ' E0 = %%g ', ground at -6.0, (ground + .005) \n");
fprintf(out,"set label 2 ' E1 = %%g ', first at -6.0, (first + .005) \n");
fprintf(out,"p sho(x) noti w li 1, 'psi2.data' ev :::%i::%i noti w boxes 2, ground noti w li 3, first noti w li 4 \n\n", i, i);
/* Reset */
fprintf(out,"unset label 1 \nunset label 2 \nunset multiplot \n set size 1.0, 0.8 \n\n");
}
fclose(out);
}
The first and second frames of the output look like this:
set term gif tiny animate delay 200
set output 'sho.gif'
set size 1.0, 0.8
E0(x) = ground
fit E0(x) 'energy.data' us 1:2:4 via ground
E1(x) = first
fit E1(x) 'energy.data' us 1:5:7 via first
p(x) = position
fit p(x) 'energy.data' us 1:8 via position
sho(x) = 0.01125*x*x
# Frame 1 #
unset title
set multiplot
set xrange [-400:100]
set size 0.4, 0.2
set origin 0.6, 0.2
set yrange [0.05:0.10]
set xlabel 'Time'
set ytics 0.01
set ylabel '<E0>'
p 'energy.data' us 1:2 noti w li 5, 'energy.data' us 1:3:4 noti w yerr 6, ground noti w li 3
set origin 0.6, 0.4
set yrange [0.15:0.30]
set xlabel 'Time'
set ytics 0.03
set ylabel '<E1>'
p 'energy.data' us 1:5 noti w li 7, 'energy.data' us 1:6:7 noti w yerr 8, first noti w li 4
set origin 0.6, 0.6
set yrange[-0.50:0.50]
set xlabel 'Time'
set ytics 0.25
set ylabel '<x>'
p 'energy.data' us 1:8 noti w li 9, position noti w li 8
set origin 0.0, 0.0
set size 1.0, 0.2
set xrange [0:500]
set ytics 2
set yrange [-6:6]
set xlabel 'X(N)'
set ylabel 'Position'
p 'x_vector.data' every :::1::1 noti w histeps 8
set origin 0.0, 0.2
set size 0.6, 0.6
set xrange [-6:6]
set ytics 0.05
set yrange [0:0.35]
set title 'Psi Squared in a SHO'
set xlabel 'Position'
set ylabel 'Energy'
set label 1 ' E0 = %g ', ground at -6.0, (ground + .005)
set label 2 ' E1 = %g ', first at -6.0, (first + .005)
p sho(x) noti w li 1, 'psi2.data' ev :::1::1 noti w boxes 2, ground noti w li 3, first noti w li 4
unset label 1
unset label 2
unset multiplot
set size 1.0, 0.8
# Frame 2 #
unset title
set multiplot
set xrange [-300:200]
set size 0.4, 0.2
set origin 0.6, 0.2
set yrange [0.05:0.10]
set xlabel 'Time'
set ytics 0.01
set ylabel '<E0>'
p 'energy.data' us 1:2 noti w li 5, 'energy.data' us 1:3:4 noti w yerr 6, ground noti w li 3
set origin 0.6, 0.4
set yrange [0.15:0.30]
set xlabel 'Time'
set ytics 0.03
set ylabel '<E1>'
p 'energy.data' us 1:5 noti w li 7, 'energy.data' us 1:6:7 noti w yerr 8, first noti w li 4
set origin 0.6, 0.6
set yrange[-0.50:0.50]
set xlabel 'Time'
set ytics 0.25
set ylabel '<x>'
p 'energy.data' us 1:8 noti w li 9, position noti w li 8
set origin 0.0, 0.0
set size 1.0, 0.2
set xrange [0:500]
set ytics 2
set yrange [-6:6]
set xlabel 'X(N)'
set ylabel 'Position'
p 'x_vector.data' every :::2::2 noti w histeps 8
set origin 0.0, 0.2
set size 0.6, 0.6
set xrange [-6:6]
set ytics 0.05
set yrange [0:0.35]
set title 'Psi Squared in a SHO'
set xlabel 'Position'
set ylabel 'Energy'
set label 1 ' E0 = %g ', ground at -6.0, (ground + .005)
set label 2 ' E1 = %g ', first at -6.0, (first + .005)
p sho(x) noti w li 1, 'psi2.data' ev :::2::2 noti w boxes 2, ground noti w li 3, first noti w li 4
unset label 1
unset label 2
unset multiplot
set size 1.0, 0.8
Running sho_gif.plt on Gnuplot produces the following animation: