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:

sho-1.gif
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License