Question:
Pourquoi FORTRAN est-il si couramment utilisé en chimie computationnelle?
Melanie
2015-02-06 07:58:01 UTC
view on stackexchange narkive permalink

J'utilise Ruby pour écrire des scripts de recherche, mais je veux entrer dans des choses plus lourdes pour lesquelles Ruby est trop lent. J'ai remarqué qu'il y avait quelques choses écrites en C et C ++, mais il y a une proportion étrangement grande de logiciels utilisés en chimie informatique qui sont écrits en FORTRAN (dans lesquels je n'ai aucune expérience.)

Pourquoi FORTRAN utilisé en chimie computationnelle? D'après ce que je comprends, FORTRAN est un peu sur le côté ancien («punchcard» vieux.) J'ai été un peu choqué de trouver des tutoriels écrits assez récemment pour FORTRAN.

Est-ce une sorte de, "c'est comment nous l'avons toujours fait, "chose ou y a-t-il un aspect d'efficacité de FORTRAN que je néglige?

Note: J'ai peut-être confondu FORTRAN avec des langages de programmation plus récents avec des noms similaires.

Parce que les gens ont commencé à écrire du code il y a longtemps, et Fortran était (et est toujours) fortement optimisé pour la traduction de formules (par exemple, les calculs).
Gardez à l'esprit que le Fortran moderne (95, 2003, 2008) est très différent du FORTRAN 66 ou 77.
Oui, vous oubliez quelque chose. 1) Fortran a une sémantique légèrement différente. Il n'a pas de vrais pointeurs, donc le compilateur peut être un peu plus libéral dans les optimisations. 2) il y a beaucoup de code fortran hérité 3) fortran est bien plus simple que C et surtout les langages «orientés objet».
Pour certains calculs de tableaux, Fortran est potentiellement plus rapide que C / C ++ en raison de sa [supposition que les pointeurs ne s'aliasent jamais.] (Http://stackoverflow.com/questions/146159/is-fortran-faster-than-c)
"pas tout à fait punchcard"? https://upload.wikimedia.org/wikipedia/commons/5/58/FortranCardPROJ039.agr.jpg
Cette guerre linguistique particulière (http://en.wikipedia.org/wiki/Software_wars) est apparue plusieurs fois sur Stackoverflow http://stackoverflow.com/questions/13078736/fortran-vs-c-does-fortran-still- hold-any-avantage-in-numerical-analysis-thes? lq = 1 http://stackoverflow.com/questions/31672/learning-fortran-in-the-modern-era/168565#168565 http: // stackoverflow. com / questions / 953869 / est-ce-que-le-retour-vaut-l'investissement-dans-l'apprentissage-pourtran? lq = 1 http://stackoverflow.com/questions/146159/is-fortran-faster-than-c En proie à des gens qui ont 30 ans en arrière et pensent qu'il est toujours écrit FORTRAN comme ici.
FORTRAN était l'une des rares options disponibles pour développer des programmes spécifiques de calcul. Quant aux cartes perforées, le format de colonne (qui fait partie de la spécification du langage) a été conçu avec les cartes perforées à l'esprit.
@DavidZhang C'est facilement corrigé avec l'utilisation du mot-clé restrict, qui a été ajouté il y a 16 ans.
N'oublions pas que de nombreux programmeurs scientifiques sont en fait de terribles programmeurs, et il est beaucoup plus facile d'écrire quelque chose de raisonnable en Fortran qu'en C ++.
https://www.quora.com/What-is-the-most-popular-programming-language-used-in-computational-chemistry?share=1
LOL - J'ai écrit mon premier programme en 1971 en FORTRAN en utilisant des cartes perforées. Je me demande combien de personnes savent comment configurer la carte de contrôle pour une frappe. Un autre signe perdu d'être un nerd était de savoir comment enrouler une bande de papier pour un lecteur de poinçon de télétype.
Six réponses:
Geoff Hutchison
2015-02-06 08:35:30 UTC
view on stackexchange narkive permalink

Je ne pense plus que ce soit vraiment vrai.

Certaines utilisations de Fortran sont historiques (c'est-à-dire que les premiers codes ont été développés en FORTRAN parce que c'était le meilleur langage de programmation pour le calcul des nombres dans les années 70 et 80) . Heck, le nom signifie «traduction de formule».

Une certaine utilisation de Fortran est due à la performance. Le langage a été conçu pour être:

particulièrement adapté au calcul numérique et au calcul scientifique.

Plusieurs fois, je trouve des codeurs de chimie collant à Fortran parce qu'ils savent et ont des bases de code numériques hautement optimisées existantes.

Je pense que le côté performances n'est plus nécessairement vrai lorsque l'on utilise des compilateurs C et C ++ modernes et hautement optimisés.

J'écris un beaucoup de code en C et C ++ pour les performances et coller beaucoup de choses avec Python. Je sais que certains programmes quantiques sont écrits exclusivement ou principalement en C ++. Voici quelques exemples open source:

  • Psi4 - Écrit en C ++ et Python
  • MPQC - Écrit en C ++
  • LibInt - Écrit en C ++ pour des intégrales quantiques efficaces.
  • LibXC - Écrit en C avec des «liaisons» Fortran pour Fonctionnelles de corrélation d'échange DFT

C'est mon avis, mais ma recommandation pour des performances plus rapides en chimie serait Python avec du C ou C ++ mélangé.

Je trouve que je suis un codage plus efficace en Python, en partie à cause du langage, en partie à cause des nombreux packages, en partie parce que je n'ai pas à compiler, et c'est tout important.

De plus, vous pouvez exécuter des scripts Python et fonctionne en parallèle, sur le GPU, et même les compiler, par exemple avec Numba. Comme je l'ai dit, si je pense que la performance est cruciale, j'écrirai des morceaux en C ou généralement C ++ et je créerai un lien vers Python au besoin.

Sur la base de son utilisation pure, je recommande * fortement * Python pour la programmation scientifique en ce moment. Certaines pièces d'un projet récent étaient déjà disponibles en tant que fonctions NumPy ou SciPy efficaces. :-)
Je suis sérieusement vendu sur Python. Je n'ai pas beaucoup écrit en Python, mais j'ai trouvé beaucoup de scripts vraiment utiles écrits dedans.Quand il s'agit de C ou C ++, que recommandez-vous? Je n'ai jamais vraiment utilisé que Ruby et Perl (et un tout petit peu de Python) et je me fichais vraiment de Perl.
Ma suggestion pour l'apprentissage des langues est d'avoir un projet là où vous en avez besoin. Je me suis récemment appris à utiliser Python simplement pour utiliser le traitement d'image NumPy. Je suggérerais d'utiliser Python pendant un moment, puis s'il y a une partie critique pour les performances, essayez de réécrire en C ou C ++. De nombreux guides «apprendre la langue X» existent en ligne et sous forme de livre.
@GeoffHutchison, Je ne recommanderais * jamais * quelque chose uniquement sur son utilisation.
Cependant, la plupart des packages QC répandus sont écrits en fortran.
@Wildcat Il y a des avantages en termes de prototypage plus rapide si vous n'avez pas besoin de réinventer la roue.
@permeakra Je pense que c'est en grande partie dû à l'histoire. Gaussian a été lancé par Pople dans les années 70. GAMESS a été lancé de la même manière bien avant que C ne soit largement accepté. Les projets plus modernes sont largement mixtes ou C ++.
@permeakra Pour ce que ça vaut, je sais que Pople a appris lui-même un peu de C ++ quand il a commencé Q-Chem. Certains des modèles de métaprogrammation dans des projets comme libint seraient difficiles voire impossibles à reproduire dans Fortran.
@GeoffHutchison C / C ++ a quelques quircks dans la sémantique (en particulier, l'accès indirect à l'aide de pointeurs et de tableau nom = pointeur), qui restreint la réorganisation des lectures et des écritures en mémoire. Pour ces raisons, le code fortran peut être beaucoup mieux optimisé. Pour cette raison, Fortran est le meilleur langage pour le calcul des nombres de toutes les langues répandues. Dans les temps modernes d'Opencl, la langue hôte devient moins importante, si bien que d'autres options deviennent disponibles.
@permeakra Je suis d'accord, mais je ne veux pas me lancer dans un débat sur la meilleure langue. Les deux sont certainement utilisés pour créer des codes de chimie hautement performants, et OpenCL et d'autres fonctionnalités rendent le choix de la langue moins important.
Fortran a, depuis des lustres, des tableaux multidimensionnels natifs avec prise en charge du compilateur et de l'optimiseur. C / C ++, d'autre part, simule cela avec des vecteurs de vecteurs. Beaucoup de gens ont continué à utiliser Fortran pour la chimie et à d'autres fins scientifiques précisément pour cette raison.
En fait, Python est un langage de script interprété, ce qui signifie que votre code est traduit par un interpréteur au moment de l'exécution. Il y a donc un compromis entre le temps de développement et la vitesse. Pour les calculs mathématiques / chimiques, aucun langage de programmation ne battra c / c ++. Si vous cherchez à exécuter du code en parallèle, vous devriez apprendre à rendre vos programmes multithreads
Bien que je doive mentionner qu'il existe une courbe d'apprentissage pour un c / c ++ efficace et efficient, mais je vous mets au défi de démontrer le contraire.
@AlanZ2223 Du nouveau programme est destiné à fonctionner sur un logiciel compatible opencl, il n'y a pas beaucoup de différence par rapport à la langue à utiliser. Et C ++ est l'un des pires langages existants.
Wildcat
2015-02-06 15:56:58 UTC
view on stackexchange narkive permalink

Je pense qu'il est logique de fournir une vue quelque peu alternative et de clarifier la question.

FORTRAN contre Fortran

Tout d'abord, il faut distinguer l'ancien FORTRAN de le nouveau Fortran, où, par convention, le nom de l'ancienne langue est généralement écrit en majuscules. L'ancien FORTRAN (jusqu'à FORTRAN 77) est en effet toujours utilisé à cause de tonnes de code hérité, mais le nouveau Fortran (à partir de Fortran 90) est utilisé principalement parce que c'est un langage très élégant et simple mais puissant et efficacement implémenté pour le calcul des nombres .

DSL contre GPL en général

Notez spécifiquement que même le Fortran moderne, à mon avis, est un langage spécifique à un domaine (DSL) et c'est là que réside sa faiblesse relative par rapport à certains langages à usage général (GPL) comme le C ++ mentionné: Fortran est spécialisé pour une tâche particulière (calcul des nombres) et pourrait ne pas convenir à certaines tâches connexes (par exemple, l'analyse automatisée des résultats finaux, leur représentation graphique, etc.)

Les langages à usage général, tels que C ++, vous offrent plus de flexibilité (dans les fonctionnalités du langage, dans les bibliothèques tierces, etc.) afin que vous puissiez résoudre non seulement la tâche principale (calcul des nombres) mais aussi la tâche associée en utilisant le même langage . Si, cependant, vous choisissez Fortran pour le calcul des nombres, vous devez souvent utiliser un autre langage (par exemple Python) pour ces tâches connexes. Pensez-y comme à l'utilisation de deux DSL différents: un pour la tâche principale, un autre pour les tâches connexes. Bien sûr, vous pouvez également utiliser Python avec C ++, mais un développeur C ++ expérimenté (ce que vous êtes censé être si vous choisissez d'y faire un calcul des nombres) ne profiterait pas nécessairement de l'utilisation d'un autre langage au lieu de sa bête C ++.

Fortran contre C ++ en particulier

Tout cela est quelque peu subjectif, mais de toute façon, voici mes 5 cents. Dans l'ensemble, Fortran est plus simple que C ++, mais (et parce que) C ++ est plus riche en fonctionnalités . En gros, c'est parce que Fortran est DSL, alors que C ++ est GPL. Et comme je l'ai dit, c'est subjectif dans une certaine mesure, et en plus, la complexité est l'une des choses les plus complexes de l'univers, nous pourrions donc lancer un débat à ce sujet, mais bon, juste un mot: les modèles et la discussion principe terminé. Les modèles font du C ++ la bête, mais tout a son prix.

Notez que je n'ai pas dit que C ++ est plus puissant, car, à mon avis, «plus riche en fonctionnalités» ne veut pas toujours dire » plus puissant". Cela dépend tout d'abord si vous avez réellement besoin de ces fonctionnalités supplémentaires en premier lieu ou non? Sérieusement, avez-vous besoin du niveau de générosité (et de métaprogrammation) que les modèles C ++ offrent pour le calcul des nombres? Pas nécessairement. Et si c'est le cas, C ++ ne serait pas plus puissant que Fortran, bien qu'il soit toujours plus riche en fonctionnalités.

Les modèles ne sont pas la seule fonctionnalité de C ++ que Fortran ne possède pas. Les exceptions et la bibliothèque standard - sont deux autres fonctionnalités remarquables que Fortran n'a pas. Encore une fois, il est peu probable que vous profitiez grandement de ces fonctionnalités pour le calcul des nombres. Mais certaines autres tâches peuvent être très utiles, donc C ++ en tant que GPL les inclut alors que Fortran en tant que DSL pour le calcul des nombres ne le fait pas. Pensez à Fortran comme à un "langage de valise" juste pour le calcul des nombres et au C ++ comme à un "langage de tronc" pour tout.

Il y a aussi une fonctionnalité intéressante du langage Fortran que C ++ ne pouvait toujours pas rattraper: les modules. Je veux dire, de vrais modules , et pas d'anciennes machines de préprocesseur qui m'irritent plus que tout le reste.

C ++ a de vrais modules; si vous n'aimez pas les détails de l'implémentation, utilisez simplement #pragma une fois.
Jonathon
2015-02-06 08:38:05 UTC
view on stackexchange narkive permalink

FORTRAN avait un avantage en termes de vitesse grâce à des compilateurs bien mieux optimisés, en partie à cause de sa relative simplicité. Maintenant que les compilateurs C et C ++ sont presque à égalité (et parfois meilleurs), d'autres facteurs tels que la programmabilité entrent en jeu. Cependant, il existe également beaucoup de code hérité.

Je travaille en chimie quantique, et de nombreux programmes avec lesquels je travaille ont un mélange mais commencent à incorporer davantage de C ++. Le package PSI4 mélange même Python et C ++ pour profiter des avantages de la vitesse et de la convivialité de chacun.

Voici une liste de divers programmes et le (s) langage (s) qu'ils utilisent.

  • ORCA - C ++
  • MPQC - C ++
  • PSI4 - C ++, Python
  • PySCF - Python
  • Q-Chem - FORTRAN, C ++
  • CFour / ACES - FORTRAN, récemment un peu de C ++
  • NWChem - FORTRAN, C
  • GAMESS (US) et GAMESS (UK) - FORTRAN
  • Gaussien - FORTRAN
  • Molpro - FORTRAN
  • Dalton - FORTRAN, certains C
  • MRCC - FORTRAN
  • MOLCAS / OpenMOLCAS - FORTRAN
  • DIRAC - FORTRAN
  • ADF - FORTRAN
  • CASINO - FORTRAN
  • COLUMBUS - FORTRAN
  • CP2K - FORTRAN
  • TURBOMOL - FORTRAN

Paquets de chimie quantique

Le code C / C ++ dans Computer Language Benchmarks Game est écrit de manière très "hacky". Personne ne le fera "en production" car un tel code est pratiquement impossible à maintenir. Le C / C ++ maintenable ne battrait pas celui de Fortran.
Malheureusement, cela est parfois vrai. Cependant, depuis que les compilateurs d'optimisation C et C ++ ont rattrapé leur retard, il y a d'autres considérations telles que la convivialité.
@Wildcat Je ne suis pas d'accord; les bibliothèques telles que Blitz ++ utilisant des modèles d'expression ne sont ni piratées ni impossibles à maintenir; ils sont très faciles à utiliser et à entretenir, et battent régulièrement FORTRAN en algèbre linéaire.
@Alice, d'abord, je n'ai pas dit un mot sur la complexité des bibliothèques C ++. Et deuxièmement, ils sont en effet très complexes. Si vous avez 10 ans de développement C ++, alors vous pourriez peut-être comprendre les modèles d'expression, mais regardez où vous en êtes: c'est un site de chimie là-bas.
@Alice: Je n'ai jamais entendu parler de Blitz ++. C'est peut-être bien, mais une large base d'utilisateurs est également importante.
@Alice: Pouvez-vous donner un exemple où Blitz ++ bat FORTRAN?
Cort Ammon
2015-02-06 11:30:43 UTC
view on stackexchange narkive permalink

FORTRAN est un langage moins expressif que C ++, et qui permettait aux anciens compilateurs d'optimiser beaucoup plus efficacement. Dans les compilateurs modernes, il y a peu ou pas de différence de performances. Il n'y a que quelques endroits où les garanties de sécurité plus faibles de FORTRAN permettent des optimisations plus extrêmes. Vous ne remarquerez probablement pas la différence à moins de passer 6 à 10 ans à développer FORTRAN.

De manière générale, il est plus facile de faire du développement dans les nouveaux langages car ils tirent mieux parti des capacités informatiques modernes. FORTRAN est très strict dans son format car il a dû être compilé par des ordinateurs du milieu des années 1970. Vous dites à l'ordinateur exactement quoi faire dans sa langue, plutôt que de lui dire ce que vous voulez faire dans un langage plus lisible par l'homme.

FORTRAN est toujours utilisé pour deux raisons majeures que je peux découvrir:

  • Certains problèmes sont assez simples où l'expressivité du C ++ est gaspillée, et vous pouvez en fait créer un programme plus clair avec le FORTRAN plus simple.
  • De nombreux programmes sont créés par la génération précédente. FORTRAN était, dans le passé, tout simplement meilleur pour le travail de calcul.
En tant que pure opinion, en tant que développeur qui a développé dans peut-être une douzaine de langues, il n'y a aucune raison pour que je recommande FORTRAN à n'importe quel développeur pour quelque tâche que ce soit, à moins qu'il n'y ait une base de code FORTRAN héritée avec laquelle interfacer. Les gens n'apprennent tout simplement plus la langue, ce qui signifie que vous devrez conserver pour toujours tout code que vous écrivez. Ce sera difficile à transmettre à qui que ce soit.
@CortAmmon C'est si loin d'être vrai que c'est intellectuellement malhonnête. Le FORTRAN moderne est utilisé au CERN sur le LHC pour l'amour de Dieu, et non pas un nouveau code utilisant une base héritée non plus; beaucoup de choses ont été largement réécrites ou écrites à partir de zéro. FORTRAN n'est même pas moins expressif que C ++, comme le montre la myriade de bibliothèques et de tâches sur lesquelles il a été mis à profit. De plus, des tonnes de personnes l'apprennent encore; c'est un langage de programmation requis dans certains environnements (principalement scientifiques).
Cela a obtenu un vote favorable, ce qui a attiré mon attention sur cela.J'ai pensé qu'il serait utile de publier un lien vers le [sondage sur les programmeurs StackExchange de 2019] (https://insights.stackoverflow.com/survey/2019#technology).Au crédit d'Alice, il peut y avoir de petites populations très unies qui développent FORTRAN, et dans ces populations, cela peut être un langage maintenable.Mais dans la plus grande population de développeurs, c'est tellement impopulaire qu'il n'a même pas fait la liste des langages avec lesquels les gens développent (le plus bas de la liste était WebAssembly, à 1,1%)
Buttonwood
2017-05-31 18:18:22 UTC
view on stackexchange narkive permalink

Je suis tombé sur un article dans J. Appl. Cryst. partiellement lié à la question d'origine. La comparaison de Fortran à d'autres langages de programmation dans le contexte d'algorithmes cristallographiques dans un cadre logiciel réutilisable donne ce diagramme condensé:

enter image description here

( doi 10.1107 / S0021889801017824)

Il faut ajouter que l'article concerne des progiciels écrits dans l'ancien dialecte Fortran 77.

Bien que les langages comme Python ne soient pas particulièrement rapides (il est essentiellement interprété non compilé), cela est trompeur. Python facilite l'accès à des bibliothèques compilées hautement optimisées pour des tâches de calcul spécifiques. Ainsi, vous pouvez combiner la facilité de programmation tout en réalisant un calcul de nombre à grande vitesse. C'est l'une des raisons de sa popularité croissante.
Pierpy
2017-04-03 01:39:44 UTC
view on stackexchange narkive permalink

Je pense qu'il y a deux raisons principales à l'utilisation répandue de Fortran dans la communauté de la chimie computationnelle. Le premier était dû à son efficacité: FORTRAN signifie Formula Translator et le calcul scientifique / numérique était la principale raison du développement de ce code.

De nos jours, Fortran est toujours très efficace, cependant, certains autres langages (C ++ pour exemple) sont aussi efficaces que Fortran. Mais alors pourquoi codons-nous toujours en Fortran ?? Fondamentalement, la majorité des logiciels de structure électronique sont écrits en Fortran et personne n'est aussi fou de traduire des millions de lignes. Par conséquent, nous le gardons écrit en Fortran lors de l'ajout de blocs de code! En revanche, si un nouveau logiciel devait être écrit, il n'y aurait aucune raison pratique de choisir Fortran comme langage. Par exemple, le logiciel récent MIDAS (Université d'Aarhus) pour l'obtention de fonctions d'ondes nucléaires a été entièrement écrit en C ++. Personnellement, j'utilise Fortran90 comme langage et il n'est pas aussi rigide que l'ancien FORTRAN77 ... et j'aime ça! :) Je me suis en fait posé la même question que vous avez posée lorsque j'ai commencé mon doctorat.

+1. Très bonne réponse. D'autant que c'était votre première et unique réponse ici. Cette réponse devrait avoir beaucoup plus de votes positifs qu'elle n'en a.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...