Create images and then a movie or a .gif animation from your data

Create images and then a movie or a .gif animation from your data

• Make sure you save your data in a proper way (i.e. a way for which any tilmestep you need is saved and for which you save the position of the particles and their physical characteristics you’re interested in). Here I save one .txt file for each iteration I want to save from the computation (of flow of 2D beads). Each file is named save1.txt, save2.txt etc. until the last one : save101.txt for me.

Each of these text file is composed by the following columns (by there are no headers):
it,radius[i],rx[i], ry[i],vx[i], vy[i],ome[i],ax[i], ay[i],domedt[i] (i being the particle)

Therefore it looks like:
1.000000e+02 4.411078e-01 -5.310373e-01 8.232963e+00 3.710539e+00 -1.537021e-01 0.000000e+00 4.204679e-01 -5.028706e-01 0.000000e+00
1.000000e+02 5.043521e-01 1.579150e+01 2.389012e+01 7.111336e+00 -2.592077e-01 0.000000e+00 1.986693e-01 -9.800666e-01 0.000000e+00
1.000000e+02 4.639842e-01 1.709093e+01 9.843280e+00 3.501103e+00 4.201602e-01 0.000000e+00 -1.247290e+01 -1.373425e+01 0.000000e+00
1.000000e+02 4.598597e-01 -1.441409e+01 9.238946e+00 4.124428e+00 -9.097106e-01 0.000000e+00 9.960587e-01 -4.897665e+00 0.000000e+00
1.000000e+02 5.051099e-01 -2.714866e+00 1.688822e+00 1.288142e-01 6.407148e-02 0.000000e+00 2.723070e+00 5.263489e+00 0.000000e+00
1.000000e+02 5.797257e-01 -1.710212e+01 1.670530e+01 5.672349e+00 -1.402118e-01 0.000000e+00 -1.754910e+01 -9.859782e+00 0.000000e+00
1.000000e+02 4.439925e-01 8.605122e+00 1.071265e+01 3.753931e+00 -5.498020e-01 0.000000e+00 2.538151e+00 1.270680e-01 0.000000e+00
1.000000e+02 5.372175e-01 -1.175561e+01 1.120167e+01 3.876558e+00 -6.042894e-01 0.000000e+00 -2.538811e+00 1.648526e+00 0.000000e+00
1.000000e+02 4.408521e-01 1.036803e+01 1.629499e+01 5.747330e+00 -7.071506e-02 0.000000e+00 4.726249e+00 -3.825003e+00 0.000000e+00

Once you have all your save%%%.txt files, you can generate the corresponding images (one for each save%%%.txt file, i.e. one for each saved iteration of your computation).

• Generate the images:
You can make your proper routine that plots circles of proper radius at the proper position, and choosing their face color according to a physical quantity loaded from the save%%%.txt file.

Here is an example of a Python routine that does want you need (I is very basic but does the job 😉
#!/usr/bin/env python
import matplotlib
matplotlib.rcParams['legend.fancybox'] = True
import numpy as np
import matplotlib.pyplot as plt
import pylab
from matplotlib import rc
rc('text', usetex=True)
rc('font', family='serif')
from pylab import *
from scipy.integrate import ode
from scipy.special import airy
from scipy.optimize import leastsq
from scipy.optimize import fmin_slsqp
from scipy.optimize import curve_fit
from operator import itemgetter, attrgetter
inFile = sys.argv[1]
endfilm= int(sys.argv[2])
#upscale= int(sys.argv[3])
for T in range(1,endfilm):
Al= np.genfromtxt(inFile+str(T)+'.txt')
fig = plt.figure()
figure(figsize=(5.0,7.8),dpi=20000)
allo = Al[:,4]
area = np.pi * (8* Al[:,1])**2
im=plt.scatter(Al[:,2], Al[:,3], s=area,c=allo, alpha=1,linewidths=0.5,vmin = -2, vmax = 10)
cb=plt.colorbar(im,orientation="horizontal")
plt.xlabel(r"$x/d$",fontsize='14',labelpad=2)
plt.ylabel(r"$y/d$",fontsize='14',labelpad=2)
plt.tick_params(axis='y', labelsize=10,pad=4)
plt.tick_params(axis='x', labelsize=10,pad=4)
file= int(Al[0,0])
plt.ylim([-5,40])
plt.xlim([-16,16])
cb.set_label(r"$Vx$", fontname='Arial', fontsize=20)
plt.savefig("fig"+str('{:05.0f}'.format(T))+".png")
# plt.savefig("fig"+str(file)+".png")

I save it as plot.py
To use it, type the following command in your terminal (you need to ave all the images and this .py code in the save file):
python plot.py save 101 1.
Here, « save » is the generic name of your save%%%.txt files, 101 is the maximum number and 1 is a dilatation coefficient to adjust the plot (I commented the line in the code here so you don’t need it a priori).
Here you go! You now have your 101 images, numbered with 5 digits (to be adjusted if need, see last code line).

• Create a GIF animation:
– install ImageMagick using Homebrew (to install Homebrew on your mac: see http://brew.sh). To do so, type the following command line in your Terminal:
brew install ImageMagick
– then create the GIF from your images: go in the directory in which you stored the images and type in the Terminal:
convert fig*.png filmGIF.gif
– way a bit and you’ll have your .gif file, that you want visualize using your internet browser for instance.

• Create a movie from your images:
– if not already done, install FFMPEG on your mac by typing the following in your Terminal:
brew install ffmpeg
– then compute the film (you can check the ffmpeg website for more options, the most important is the framerate -25 here-, the definition -1920×1080- and the -vcodec libx264 to make sure you can play the movie on any platform):
ffmpeg -r 25 -f image2 -s 1920x1080 -i fig%05d.png -vcodec libx264 -crf 25 -pix_fmt yuv420p myMOVIE.mp4

Here you go! Please share and comment 😉
Thanks!

Code and write bash scripts

This article is just a draft for the moment. Thought you can find some interesting tips…

 

• Always begin your script with the instruction that telles the shell what program to interpret the script with, when executed. It is called the Shebang. I personally always use:
#!/bin/bash
In this example, the script is to be interpreted and run by the bash shell.

Some other example shebangs are:
#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell
#!/bin/csh — Execute the file using csh, the C shell, or a compatible shell
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks
#!/usr/bin/php — Execute the file using the PHP command line interpreter
#!/usr/bin/python -O — Execute using Python with optimizations to code
#!/usr/bin/ruby — Execute using Ruby
#!/bin/ksh #!/bin/awk #!/bin/expect

 

• Shell loop using non-integer variable:
RangeNumber=$(awk 'BEGIN{for(j=0;j<=18;j+=2)print j/100}') #####
for Number in $RangeNumber 0.07 #### you can add another number such as 0.07 here
do
printf -v Number "%1.2f" $Number # in order to impose the format with 2 digits like in 0.10 (N.B. adding \n would go to next line)
echo $Number
done
end
exit 0

 

• Mathematics and operation in the shell:
Example you have:
Angle=0.195
then
iPreviousAngle=`echo "($Angle*1000+5)/1000" | bc -l`
printf -v iPreviousAngle "%1.3f" $iPreviousAngle # in order to impose the format with 2 digits like in 0.10 (N.B. adding \n would go to next line)
echo "Angle=$Angle"
echo "PreviousAngle=$iPreviousAngle"

and therefore
echo $iPreviousAngle
gives
PreviousAngle=.20000000000000000000


• To properly format the variable:
printf -v iPreviousAngle "%1.3f" $iPreviousAngle # in order to impose the format with 2 digits like in 0.10 (N.B. adding \n would go to next line)
echo "PreviousAngle=$iPreviousAngle"

PreviousAngle=0.200

How to remotely use Matlab on a distant computer (running Os X)

To remotely use Matlab on the computer, first check if Matlab is installed and then check the path of your folder within matlab (for starters, the easiest way is to actually go on the computer).

Then connect to the computer by ssh and then type :
matlab -nosplash -nodesktop -nodisplay -logfile output.txt -r 'myfunction(myarguments)'

if this is a function… or

matlab -nodesktop -nodisplay < myscript.m > output.txt 2>&1 &

if you want to run a script…

As usual please comment if you have any remarks or question 😉

Un .bashrc pratique, avec historique et autocompletion

• Pour ajouter l’autocompletion :
# Case insensitive
bind "set completion-ignore-case on"

• Pour ajouter l’historique :
# History search
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

Ensuite, pour que ces changement prennent effet, depuis le home (que l’on peut retrouver en tapant cd dans le terminal), taper :
source .bashrc

Petites notes de commandes shell

• empty trash on Mac OS X using Terminal:
rm -rf ~/.Trash/*
Sometimes you need to force it so use a sudo command:
sudo rm -rf ~/.Trash/* (your password will be required).
____________________________________________________________________________
• Voir combien il reste d’espace disque :
df -h (-h pour avoir les données en octets)
____________________________________________________________________________
• Faire une recherche d’un mot dans Vim :
/puis_le_mot puis shift+n (« n » pour « next »)
____________________________________________________________________________
• Rechercher une chaine de caractère dans la sortie d’une autre instruction :
your_shell_command | grep the_string_you_are_looking_for
e.g.:
ps | grep IPA Here I am looking within the process currently running (using the command Process Status ps the process called IPA).
____________________________________________________________________________
• install top sur Mac Os X : avec Homebrew
brew install htop
____________________________________________________________________________
• pour compiler en C mon code contenu dans main.c (et en faire un executable que l’on appelle par exemple CCC : se mettre dans le dossier contenant le main.c puis :
gcc -o CCC main.c (sur Linux, il faut linker la bibliothèque Math donc ajouter -lm à la fin de la ligne de commande)

• ensuite, lancer le calcul depuis l’executable :
./CCC
(NB: on peut lancer le calcul avec un nohup ou encore en utilisant screen 😉
____________________________________________________________________________
• lancer une command line qui survit à la mort du shell qui l’a lancé :
nohup [ma ligne de commande, le programme que je veux lancer]

• si en plus on souhaite écrire la sortie de ce programme et l’écrire dans un fichier :
nohup ./mon_programme > sortie.txt

• si en revanche on veut écrire dans un fichier sortie sans afficher la sortie à l’écran et continuer d’utiliser le Terminal, alors :
nohup ./mon_programme > sortie.txt &

• si installé, on peut aussi utiliser screen puis on lance sa commande dedans. Ensuite pour détacher la fenêtre du terminal (de la commande qui tourne toujours) :
crtl+a crtl+d (ou crtl+a d)
puis pour re-attacher le terminal virtuel de screen depuis un autre terminal :
screen -rd

____________________________________________________________________________
• lorsque l’on écrit un script shell (.sh), il faut le rendre executable pour pouvoir le lancer. On utilise alors la commande chmod avec l’option +x:
chmod +x script.sh
Je reviendrai sur l’écriture de scripts shell plus tard.
____________________________________________________________________________
• Installation de SSHFS sur Mac OS:
1. Télécharger FUSE et l’installer : http://sourceforge.net/projects/osxfuse/files/
2. Télécharger SSHFS et l’installer : https://github.com/osxfuse/sshfs/releases
Plus d’explications (installation, désinstallation sur https://github.com/osxfuse/osxfuse/wiki/SSHFS)

• Utilisation de SSHFS
1. créer le lien entre les deux ordi. Là on crée l’image disque virtuelle qui lie mon home sur ingres et on le met dans testcluster/
mkdir testcluster
sshfs login@cluster: testcluster/
2. ensuite, on peut aller dans l’arborescence de Ingres (ordinateur distant) depuis mon mac (sur lequel je suis) en allant dans le dossier testcluster/
3. Parfois, on n’arrive pas à faire le sshfs car le dossier testcluster n’a pas été démonté. Il faut alors forcer le démontage du disque virtuel par la commande :
sudo diskutil umount force [path] (pour moi [path] = ~/testluster)
puis remonter à nouveau l’image virtuelle.
4. de manière générale je préconise de démonter le disque virtuel à chaque fois que l’on se déconnecte du réseau (et/ou que l’on éteint le mac).
____________________________________________________________________________
• Pour copier le même fichier dans plusieurs répertoires :
echo ./nomgenerique_*/ | xargs -n 1 cp datain.txt
Sinon, on peut aussi faire ça :
echo dir1 dir2 dir3 | xargs -n 1 cp file1
Will copy file1 to dir1, dir2, and dir3. xargs will call cp 3 times to do this, see the man page for xargs for details.

De même, pour effacer plusieurs fichier (par exemple output*.txt) dans plusieurs répertoires :
echo ./nomgenerique_*/output* | xargs -n 1 rm
____________________________________________________________________________

Bonjour tout le monde !

Salut à tous !

Ce petit blog recense pour le moment des petites commandes shell (et autres choses du genre) que j’utilise au quotidien. Je vais les ajouter au fur et à mesure de mon apprentissage…

Pour ce qui est de ma configuration informatique, puisque cela se fait paraît-il : je suis sur Mac, j’ai un Macbook Pro 15′ fin 2013 sur lequel tourne Mac OS X 10.10.5 (Yosemite).

En ce qui me concerne, je suis doctorant en 3ème année au PMMH à l’ESPCI. Je travaille sur la rhéologie non-locale des milieux granulaires denses et secs. Une autre partie de mon travail de recherche porte sur l’acoustique dans les granulaires peu confinés et je participe ainsi à des campagnes de vols paraboliques (Airbus ZeroG) pour étudier la propagation acoustique dans de tels milieux.
Je fais donc de l’expérimental et que du numérique (C, Matlab, bases de Python). Vous pouvez en savoir plus sur ma page perso.

 

Bonne visite et n’hésitez pas à me contacter ou commenter les articles pour me corriger, partager vos connaissances ou autre !

 

Adrien