Bonjours,
Je vais vous expliquer le contexte avant d'entrer dans les détails pour enfin poser mes questions. Si vous vous en fiché du contexte (parce que j'écrit trop XD), passez directement à la question tout en bas avant les P.S. . Le langage utilisé est décrit dans le P.S .
Un ami a fait un programme de post process d'un code de calcul quantique, plus précisément de l'AIMD (pour Ab-Initio Molecular Dynamic). Ce programme n'a, en fait rien avoir avec la mécanique quantique, il ne se sert que des positions, vitesses, forces ... etc des atomes du système qui ont été déterminés par le code de calcul quantique.
Son petit programme est génial et extrêmement pratique, seulement, il ne s'en occupe plus (étant donné qu'il a autre chose à faire, et qu'il a déjà fait un excellent boulot). L'une des fonctionnalité de ce programme est de calculer la fonction de distribution radial, ou g(r) ou encore RDF en anglais. Et il se trouve qu'il est en parti erroné. Je me suis donc mis à le corriger, et de file en auguille j'y ajoute quelques fonctionnalités supplémentaire, comme l'intégrale du g(r), le g(théta) (ou fonction de distribution angulaire) ou encore la probabilité de présence des voisins ...
Je sens que vous êtes perdue. Je vais vous expliquer ce que tout cela signifie. Le g(r) est une fonction qui représente le nombre d'atome moyen présent autour d'un atome à un rayon r. Il a cette tête : http://en.wikipedia.org/wiki/Radial_distribution_function (bon, d'accord, c'est wikipédia, mais pour ce que j'ai à vous montrer, ça suffit amplement. Le g(r), c'est la fonction oscillante en dessous de l'image avec les atomes, à droite). Son intégrale correspond au nombre d'atome moyen présent autour d'un atome dans une sphère de rayon r.
Le g(théta), c'est la même chose mais avec les angles. Et la probabilité de présence des voisins, c'est une fonction dont je ne connais pas le nom réel, mais qui permet de donner la probabilité selon laquelle le nième voisin d'un atome va rester son nième voisin après x itérations, indiquant, dans un liquide notamment, une structure atomique au sein de ce liquide (là où j'ai vu cette astuce, c'était pour du lithium. A 100 K et 180 GPa environ, le lithium est liquide, et les atomes ont tendance à se regrouper en tétraèdres).
Bref, j'ai programmé tout ça. ça a l'air de plutôt bien fonctionner, mais voilà, le g(théta) fonctionne pour de "petits" systèmes.
En gros, dans la fonction, je lui donne le nombre de voisin à prendre en compte (car on peut lui dire de calculer les angles formés entre les 3 atomes les plus proches, ou les angles de tous le système, même s'ils sont distants), ainsi que le nombre d'itération de dynamique moléculaire à prendre en compte (pour moyenner la répartition sur l'ensemble de la dynamique, et non pas sur un unique pas de temps), et d'autres paramètres qui ne posent à priori pas de problème.
Un exemple qui marche est quand je prend 1835 pas de dynamique et jusque 8 voisins, ça fonctionne. Au 9ième voisins, ça plante (le calcul s'arrête, et l'interface disparait ... en gros, le programme se ferme). Pour vérifier si c'est sur les voisins que ça pose problème, j'ai pris 10 pas de dynamique avec 107 voisins, ça fonctionne. WTF ?
J'ai déjà eu ce genre de problème (programme qui se ferme sans message d'erreur), et il s'agissait d'un problème de dépassement de matrice. Ici, je stock beaucoup de données (les calculs sont très rapide cependant), et je me demande, sachant que j'ai cherché un dépassement de matrice sans en avoir trouvé, est-ce qu'il ne s'agirait pas d'un problème de cache ? Genre, pendant le calcul, le cache stock temporairement les données, et comme il y a beaucoup d'itérations effectuées, il fini par ne plus avoir de place et plante.
De temps en temps, il me marque une erreur avec marqué "Memory map: ..." et tout un tas de babla numérique sur la mémoire, avec, en fin, "Abandon python2.6 appa.py"
Donc, une question pratique, à laquelle vous êtes en mesure de répondre (car sans le code, vous ne pourrez pas attesté que je ne me suis pas planté quelque part XD ce qui est possible, j'ai peut être mal vu. Je vous présenterez plus en détail le programme si ce que je pense ne résous pas mon problème) :
Quel est la ligne de commande qui permet de vider le cache mémoire utilisé lors d'un calcul ?
P.S.: je n'ai pas précisé, mais le programme globale est un programme python, et mon problème se situe dans une subroutine fortran (d'où le terme f2py qui est fortran to python). Cela a été fait ainsi car fortran a une vitesse de calcul démentiel en comparaison de python, mais à l'inverse python est extrêmement pratique pour gérer les interfaces. Grâce à cette expérience, j'ai aussi appris à manipuler la programmation orienté objet, et c'est franchement génial ... en tout cas, pour les interfaces et l'utilisation de subroutine ^^.
P.P.S.: si ça vous parait impossible (genre, lorsqu'il n'y a plus de cache, il réécrit par dessus, ou encore, il faut vraiment beaucoup d'itérations pour remplir le cache ... etc) n'hésitez pas, ça peut toujours m'être utile d'avoir des détails de fonctionnement supplémentaire sur ce type de sujet. Et encore une fois, c'est peut être moi qui n'ai pas vu mon erreur. Simplement, en faisant des print, j'ai repéré qu'il avait l'air de s'arrêter en plein milieu d'une boucle sans raison visible (et justement, sans dépassement de taille de matrice).