{"id":1228,"date":"2026-08-21T14:28:40","date_gmt":"2026-08-21T14:28:40","guid":{"rendered":"https:\/\/matforge.org\/?p=1228","raw":"https:\/\/matforge.org\/?p=1228"},"modified":"2026-08-21T14:28:40","modified_gmt":"2026-08-21T14:28:40","slug":"extending-fipy-with-custom-modules","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/","title":{"rendered":"Extension de Fipy avec des modules personnalis\u00e9s","raw":"Extension de Fipy avec des modules personnalis\u00e9s"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 9<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><p>Fipy est tr\u00e8s utile lorsque vous arr\u00eatez de le traiter comme une collection d&rsquo;exemples isol\u00e9s et que vous commencez \u00e0 l&rsquo;utiliser comme un cadre flexible pour cr\u00e9er vos propres flux de travail PDE. Ce changement compte parce que les vrais projets de simulation restent rarement simples longtemps. Un mod\u00e8le qui commence comme une \u00e9quation sur un maillage se d\u00e9veloppe souvent dans un syst\u00e8me avec des propri\u00e9t\u00e9s de mat\u00e9riau r\u00e9utilisables, des termes sources non lin\u00e9aires, des champs coupl\u00e9s, des param\u00e8tres sp\u00e9cifiques au sc\u00e9nario et des \u00e9tapes de post-traitement r\u00e9p\u00e9t\u00e9es. \u00c0 ce stade, tout garder \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un script en expansion rend g\u00e9n\u00e9ralement le code plus difficile \u00e0 d\u00e9boguer, plus difficile \u00e0 faire confiance et beaucoup plus difficile \u00e0 r\u00e9utiliser.<\/p>\n<p>C&rsquo;est l\u00e0 que les modules personnalis\u00e9s deviennent pr\u00e9cieux. Dans Fipy, l&rsquo;extension du cadre ne signifie pas toujours la r\u00e9\u00e9criture des internes ou la cr\u00e9ation de hi\u00e9rarchies de classes approfondies. Tr\u00e8s souvent, l&rsquo;extension la plus efficace est un module Python propre qui organise une partie du mod\u00e8le num\u00e9rique&nbsp;: cr\u00e9ation de maillage, configuration de variables, logique de coefficient, assemblage d&rsquo;\u00e9quations, gestion des sources, contr\u00f4le du solveur ou routines de sortie. Le but n&rsquo;est pas de rendre le projet plus abstrait pour lui-m\u00eame. L&rsquo;objectif est de rendre le mod\u00e8le math\u00e9matique plus facile \u00e0 lire, \u00e0 tester, \u00e0 modifier et \u00e0 ex\u00e9cuter dans plusieurs cas.<\/p>\n<p>Une bonne strat\u00e9gie d&rsquo;extension de Fipy commence par une question pratique&nbsp;: que doit-il exactement devenir r\u00e9utilisable&nbsp;? Parfois, la r\u00e9ponse est un g\u00e9n\u00e9rateur de source personnalis\u00e9. Il s&rsquo;agit parfois d&rsquo;une usine d&rsquo;\u00e9quations coupl\u00e9es. Parfois, il s&rsquo;agit simplement d&rsquo;une structure de package qui s\u00e9pare la physique des scripts de lancement. Une fois que cela est clair, Fipy devient beaucoup plus facile \u00e0 mettre \u00e0 l&rsquo;\u00e9chelle sans perdre de clart\u00e9.<\/p>\n<h2>Commencez par identifier le bon point d&rsquo;extension<\/h2>\n<p>La plus grande erreur que les gens commettent lors de l&rsquo;extension de Fipy est de supposer que chaque mod\u00e8le r\u00e9p\u00e9t\u00e9 n\u00e9cessite une classe de bas niveau personnalis\u00e9e. En pratique, de nombreux probl\u00e8mes peuvent \u00eatre r\u00e9solus avec une approche beaucoup plus l\u00e9g\u00e8re. Si vous continuez \u00e0 r\u00e9\u00e9crire la m\u00eame configuration pour un maillage, des conditions initiales, des contraintes de limites ou des coefficients, vous n&rsquo;aurez peut-\u00eatre besoin que d&rsquo;un module utilitaire. Si votre principale difficult\u00e9 est de construire la m\u00eame famille d&rsquo;\u00e9quations sous diff\u00e9rents choix de param\u00e8tres, vous avez probablement besoin d&rsquo;un g\u00e9n\u00e9rateur d&rsquo;\u00e9quations. Si votre mod\u00e8le inclut un comportement de source non lin\u00e9aire qui appara\u00eet dans plusieurs cas, une aide \u00e0 un terme source peut \u00eatre le bon point d&rsquo;extension.<\/p>\n<p>Cette distinction est importante car diff\u00e9rentes extensions entra\u00eenent des co\u00fbts d&rsquo;entretien diff\u00e9rents. Un petit module de fonctions d&rsquo;aide est g\u00e9n\u00e9ralement stable, facile \u00e0 tester et facile \u00e0 comprendre pour les collaborateurs. Une modification structurelle plus profonde peut \u00eatre appropri\u00e9e dans les cas avanc\u00e9s, mais elle augmente \u00e9galement les chances de cacher une physique importante derri\u00e8re les abstractions plus difficiles \u00e0 inspecter. En informatique scientifique, la lisibilit\u00e9 fait partie de la fiabilit\u00e9. Si un autre chercheur ne peut pas rapidement voir comment un terme est construit, votre architecture peut \u00eatre trop intelligente pour son propre bien.<\/p>\n<p>La meilleure premi\u00e8re \u00e9tape, alors, est de ne pas se demander&nbsp;: \u00ab\u00a0Comment puis-je sous-classer davantage FIPY&nbsp;?\u00a0\u00bb Mais plut\u00f4t, \u00ab\u00a0Quel \u00e9l\u00e9ment de mon flux de travail num\u00e9rique se r\u00e9p\u00e8te assez souvent pour m\u00e9riter son propre module&nbsp;?\u00a0\u00bb Cette question conduit g\u00e9n\u00e9ralement \u00e0 une conception plus propre et plus maintenable.<\/p>\n<h2>Comprendre les objets de base de Fipy avant de les modulariser<\/h2>\n<p>Toute extension r\u00e9utilisable fonctionne mieux lorsqu&rsquo;elle respecte la structure de base de Fipy. La plupart des projets tournent autour de quelques objets cl\u00e9s : le maillage, les variables, les termes, les \u00e9quations assembl\u00e9es et la boucle de r\u00e9solution ou de balayage. Les modules personnalis\u00e9s doivent rendre ces objets plus faciles \u00e0 g\u00e9rer, et non plus difficiles \u00e0 localiser. Par exemple, un module de maillage peut renvoyer une grille standard ou une famille de g\u00e9om\u00e9tries avec des dimensions param\u00e9tr\u00e9es. Un module de variables peut g\u00e9rer l&rsquo;initialisation, les mises \u00e0 jour des anciennes valeurs et les \u00e9tats de champ par d\u00e9faut. Un module de physique peut d\u00e9finir des coefficients de diffusion, des r\u00e9ponses mat\u00e9rielles ou des expressions sources. Un module d&rsquo;\u00e9quations peut ensuite assembler ces pi\u00e8ces en un seul PDE ou un syst\u00e8me coupl\u00e9.<\/p>\n<p>Cette structure aide \u00e9galement car Fipy fait la distinction entre les diff\u00e9rents types de donn\u00e9es de champ. Dans de nombreux flux de travail, des quantit\u00e9s d\u00e9pendantes vivent dans des cellules, tandis que d&rsquo;autres op\u00e9rations sont naturellement exprim\u00e9es sur les visages. Si un module personnalis\u00e9 floue cette distinction de mani\u00e8re n\u00e9gligente, le code peut toujours s&rsquo;ex\u00e9cuter, mais le r\u00e9sultat peut devenir num\u00e9riquement d\u00e9routant. Cela est particuli\u00e8rement vrai lorsque des expressions, des gradients ou des coefficients bas\u00e9s sur le visage sont impliqu\u00e9s. Une bonne couche d&rsquo;extension devrait donc pr\u00e9server la signification math\u00e9matique des objets sous-jacents au lieu de les cacher derri\u00e8re de vagues noms d&rsquo;aide.<\/p>\n<p>En d&rsquo;autres termes, un module personnalis\u00e9 devrait r\u00e9duire la r\u00e9p\u00e9tition sans affaiblir la compr\u00e9hension par l&rsquo;utilisateur de l&rsquo;endroit o\u00f9 vit r\u00e9ellement la physique discr\u00e9tis\u00e9e.<\/p>\n<h2>Utilisez les modules utilitaires en premier, et non les h\u00e9ritages profonds<\/h2>\n<p>Pour de nombreux projets FIPY, le moyen le plus s\u00fbr et le plus productif d&rsquo;\u00e9tendre le cadre est de cr\u00e9er des modules Python simples autour d&rsquo;objets Fipy standard. Cette approche est beaucoup plus pratique que l&rsquo;h\u00e9ritage profond pour la plupart des utilisateurs. Il maintient votre code \u00e0 proximit\u00e9 des mod\u00e8les FIPY document\u00e9s, facilite les mises \u00e0 niveau et r\u00e9duit le risque d&rsquo;introduire un comportement fragile qu&rsquo;une seule personne de l&rsquo;\u00e9quipe comprend.<\/p>\n<p>Une strat\u00e9gie d&rsquo;extension bas\u00e9e sur les utilitaires peut inclure un module pour la g\u00e9n\u00e9ration de g\u00e9om\u00e9trie et de maillage, un autre pour le chargement des param\u00e8tres, un autre pour les propri\u00e9t\u00e9s des mat\u00e9riaux et un autre pour la construction de PDE. Au lieu de remplir tout cela dans un seul script, vous laissez chaque fichier d\u00e9tenir une seule couche de responsabilit\u00e9. Votre script d&rsquo;ex\u00e9cution devient alors une couche d&rsquo;orchestration claire&nbsp;: cr\u00e9er un maillage, initialiser des variables, construire des \u00e9quations, r\u00e9soudre des pas de temps et exporter des r\u00e9sultats.<\/p>\n<p>Ce style a un autre avantage : il refl\u00e8te la fa\u00e7on dont les gens pensent r\u00e9ellement aux mod\u00e8les scientifiques. Les chercheurs s\u00e9parent g\u00e9n\u00e9ralement le domaine du probl\u00e8me en concepts tels que la g\u00e9om\u00e9trie, les champs, le comportement constitutif, la formulation num\u00e9rique et la configuration de l&rsquo;exp\u00e9rience. Si la structure de votre projet suit cette logique, le code devient plus naturel \u00e0 revoir et \u00e0 \u00e9tendre. C&rsquo;est souvent plus pr\u00e9cieux que n&rsquo;importe quelle astuce de conception orient\u00e9e objet.<\/p>\n<h2>Cr\u00e9er des constructeurs d&rsquo;\u00e9quations r\u00e9utilisables<\/h2>\n<p>L&rsquo;une des utilisations les plus solides des modules personnalis\u00e9s dans FIPY est l&rsquo;assemblage d&rsquo;\u00e9quations dans les constructeurs r\u00e9utilisables. Ceci est particuli\u00e8rement utile une fois que votre projet contient plusieurs variantes du m\u00eame mod\u00e8le de gouvernance. Au lieu de r\u00e9\u00e9crire la PDE dans chaque script, vous d\u00e9finissez une fonction ou une classe qui prend les variables et coefficients requis et renvoie une \u00e9quation pr\u00eate \u00e0 r\u00e9soudre. Cela am\u00e9liore instantan\u00e9ment la coh\u00e9rence entre les ex\u00e9cutions et r\u00e9duit les chances de changer discr\u00e8tement un terme dans un fichier tout en oubliant d&rsquo;en mettre \u00e0 jour un autre.<\/p>\n<p>Un simple g\u00e9n\u00e9rateur d&rsquo;\u00e9quations peut accepter une variable, un coefficient de diffusion, un coefficient transitoire et une expression de source. Un comportement plus avanc\u00e9 peut changer de comportement selon que la convection est active, que la source soit explicite ou semi-implicite, ou que la course actuelle soit en r\u00e9gime permanent ou en fonction du temps. Dans le travail multi-physique, un constructeur peut renvoyer plusieurs \u00e9quations \u00e0 la fois et assembler un syst\u00e8me coupl\u00e9 en un seul endroit plut\u00f4t que de diffuser ces relations sur un ordinateur portable ou plusieurs scripts.<\/p>\n<p>Cette conception devient encore plus importante lorsque plusieurs personnes travaillent sur le m\u00eame mod\u00e8le. Si une personne affine les coefficients tandis qu&rsquo;une autre est en train de r\u00e9gler les pas de temps ou les param\u00e8tres du solveur, un g\u00e9n\u00e9rateur d&rsquo;\u00e9quations partag\u00e9s aide \u00e0 maintenir la stabilit\u00e9 et la visibilit\u00e9 du noyau math\u00e9matique. Le point n&rsquo;est pas seulement pratique. C&rsquo;est une discipline num\u00e9rique.<\/p>\n<h2>Rendre la logique source-term modulaire et explicite<\/h2>\n<p>La gestion des sources personnalis\u00e9es est l&rsquo;une des raisons les plus courantes pour lesquelles les gens doivent \u00e9tendre Fipy. Dans de nombreux mod\u00e8les de PDE, le terme source est l&rsquo;endroit o\u00f9 vit la physique la plus sp\u00e9cifique au probl\u00e8me. Cela peut inclure un comportement de r\u00e9action non lin\u00e9aire, un couplage de phase, des fonctions de for\u00e7age, une d\u00e9pendance \u00e0 la temp\u00e9rature ou des injections et des puits sp\u00e9cifiques \u00e0 un sc\u00e9nario. Si cette logique reste int\u00e9gr\u00e9e directement dans le script d&rsquo;ex\u00e9cution, elle devient rapidement difficile \u00e0 tester et encore plus difficile \u00e0 r\u00e9utiliser.<\/p>\n<p>Une bien meilleure approche consiste \u00e0 isoler la construction de sources dans son propre module. Ce module peut exposer un petit ensemble de constructeurs clairement nomm\u00e9s, tels qu&rsquo;une fonction source explicite, une usine source semi-implicite ou une aide qui divise une expression non lin\u00e9aire en \u00e9l\u00e9ments explicites et implicites. Cela compte car Fipy peut b\u00e9n\u00e9ficier de la lin\u00e9arisation de la partie d&rsquo;une source qui d\u00e9pend de la variable en cours de r\u00e9solution. Lorsqu&rsquo;il est bien fait, cela am\u00e9liore souvent la convergence et maintient le mod\u00e8le num\u00e9riquement plus stable.<\/p>\n<p>C&rsquo;est \u00e9galement le point o\u00f9 la discipline avec des expressions math\u00e9matiques devient importante. Dans les flux de travail FIPY, les expressions sources qui agissent sur les variables FIPY doivent g\u00e9n\u00e9ralement utiliser `fipy.tools.numerix` plut\u00f4t que de supposer que les appels \u00e9quivalents numpy ou scipy se comporteront de la m\u00eame mani\u00e8re. Un module source est donc un bon endroit pour centraliser cette pratique. Ce faisant, vous rendez les r\u00e8gles de physique et de mise en \u0153uvre plus coh\u00e9rentes dans le projet.<\/p>\n<h2>Manipulez soigneusement la cellule et la logique du visage<\/h2>\n<p>Certaines des erreurs les plus frustrantes dans les projets FIPY personnalis\u00e9s proviennent de la diff\u00e9rence entre les quantit\u00e9s bas\u00e9es sur les cellules et les quantit\u00e9s bas\u00e9es sur les cellules. Il est tentant de cr\u00e9er un code d&rsquo;aide g\u00e9n\u00e9rique qui \u00ab\u00a0renvoie simplement un coefficient\u00a0\u00bb sans que son emplacement dans la discr\u00e9tisation soit compl\u00e8tement clair. Ce raccourci peut sembler \u00e9l\u00e9gant, mais cela rend souvent le mod\u00e8le plus difficile \u00e0 raisonner plus tard, en particulier lorsque des gradients, des anisotropies, des coefficients non lin\u00e9aires ou des interpolations de visage sont impliqu\u00e9s.<\/p>\n<p>Les modules personnalis\u00e9s doivent donc \u00eatre explicites sur ce qu&rsquo;ils renvoient. Si un coefficient appartient aux visages, le nom de la fonction et la documentation doivent le dire. Si un assistant convertit une quantit\u00e9 de cellule en une repr\u00e9sentation faciale, cette transformation doit \u00eatre visible et intentionnelle. Ce n&rsquo;est pas simplement une question de style. Dans les travaux \u00e0 volume fini, l&#8217;emplacement et l&rsquo;interpr\u00e9tation d&rsquo;un champ affectent \u00e0 la fois l&rsquo;exactitude et la lisibilit\u00e9 du mod\u00e8le num\u00e9rique.<\/p>\n<p>La m\u00eame prudence s&rsquo;applique lorsque vous comptez sur des conversions automatiques pratiques. Parfois, ces commodit\u00e9s sont utiles, mais elles ne doivent pas devenir une magie invisible \u00e0 l&rsquo;int\u00e9rieur d&rsquo;un module r\u00e9utilisable. Un bon code scientifique favorise l&rsquo;explicit\u00e9 lorsque le sens math\u00e9matique est important.<\/p>\n<h2>Modulariser les mod\u00e8les coupl\u00e9s avant qu&rsquo;ils ne deviennent chaotiques<\/h2>\n<p>Au fur et \u00e0 mesure que les mod\u00e8les FIPY deviennent plus avanc\u00e9s, les \u00e9quations coupl\u00e9es sont souvent le lieu o\u00f9 la structure du projet r\u00e9ussit ou s&rsquo;effondre. Un syst\u00e8me coupl\u00e9 peut rester lisible si chaque relation physique est d\u00e9finie de mani\u00e8re contr\u00f4l\u00e9e, mais cela devient tr\u00e8s rapidement d\u00e9sordonn\u00e9 lorsque des morceaux d&rsquo;\u00e9quations multiples sont assembl\u00e9s \u00e0 diff\u00e9rents endroits du code. C&rsquo;est pourquoi les mod\u00e8les coupl\u00e9s b\u00e9n\u00e9ficient tant des modules personnalis\u00e9s.<\/p>\n<p>Une conception propre peut placer chaque sous-mod\u00e8le dans son propre fichier&nbsp;: un pour le transport, un pour la r\u00e9action, un pour l&rsquo;\u00e9nergie, un pour le comportement de phase et un pour les coefficients partag\u00e9s. Un constructeur central d&rsquo;\u00e9quations coupl\u00e9es importe ensuite ces pi\u00e8ces et assemble le syst\u00e8me dans un ordre coh\u00e9rent. Cela r\u00e9duit le risque de variables de c\u00e2blage de mani\u00e8re incorrecte et facilite l&rsquo;extension du projet lorsqu&rsquo;un troisi\u00e8me ou un quatri\u00e8me champ est ajout\u00e9 plus tard.<\/p>\n<p>Cela aide \u00e9galement \u00e0 l&rsquo;une des r\u00e9alit\u00e9s les plus pratiques du travail coupl\u00e9 : l&rsquo;exp\u00e9rimentation. Vous devrez peut-\u00eatre comparer une solution monolithique \u00e0 une approximation plus l\u00e2che, \u00e9changer un terme constitutif contre un autre ou restructurer un mod\u00e8le pour \u00e9viter les limitations dans la fa\u00e7on dont certains termes interagissent. Une conception modulaire facilite ces modifications car la logique de couplage est centralis\u00e9e plut\u00f4t qu&rsquo;enterr\u00e9e \u00e0 l&rsquo;int\u00e9rieur du code de proc\u00e9dure r\u00e9p\u00e9t\u00e9.<\/p>\n<h2>Organisez le projet comme un package de simulation, pas un script de d\u00e9monstration<\/h2>\n<p>Si votre travail FIPY d\u00e9passe les exp\u00e9riences ponctuelles, la structure globale du package est presque autant importante que les termes PDE eux-m\u00eames. Une mise en page simple et efficace comprend souvent des emplacements distincts pour les maillages, les variables, la logique physique, les g\u00e9n\u00e9rateurs d&rsquo;\u00e9quations, les scripts d&rsquo;ex\u00e9cution, le post-traitement et les tests. Cela n&rsquo;a pas besoin d&rsquo;\u00eatre \u00e9labor\u00e9, mais cela devrait rendre \u00e9vident o\u00f9 chaque type de logique appartient.<\/p>\n<p>Cette organisation modifie le r\u00f4le du script de niveau sup\u00e9rieur. Au lieu d&rsquo;\u00eatre un fichier g\u00e9ant qui d\u00e9finit tout, il devient un point d&rsquo;entr\u00e9e contr\u00f4l\u00e9 pour un cas de simulation. Il importe un maillage, charge des param\u00e8tres, initialise des variables, construit des \u00e9quations, fait avancer la solution et \u00e9crit des sorties. C&rsquo;est beaucoup plus facile \u00e0 examiner, beaucoup plus facile \u00e0 r\u00e9ex\u00e9cuter avec diff\u00e9rents param\u00e8tres et beaucoup plus facile \u00e0 convertir en \u00e9tudes par lots ou en balayages de param\u00e8tres plus tard.<\/p>\n<p>Un projet FIPY bien structur\u00e9 simplifie \u00e9galement la documentation. Chaque module peut expliquer une responsabilit\u00e9 au lieu d&rsquo;obliger les lecteurs \u00e0 naviguer dans un seul long fichier plein de pr\u00e9occupations mitig\u00e9es. Dans les contextes de recherche, c&rsquo;est un avantage pratique et non cosm\u00e9tique.<\/p>\n<h2>Tester des modules personnalis\u00e9s dans les couches<\/h2>\n<p>Une fois que le code FIPY est divis\u00e9 en modules, les tests deviennent beaucoup plus g\u00e9rables. Cela compte parce que les projets num\u00e9riques \u00e9chouent de mani\u00e8re diff\u00e9rente du code d&rsquo;application ordinaire. Un module peut importer correctement et encoder toujours la mauvaise physique. Un g\u00e9n\u00e9rateur de sources peut s&rsquo;ex\u00e9cuter sans erreur et produire des comportements instables sous am\u00e9lioration. Une \u00e9quation coupl\u00e9e peut s&rsquo;assembler avec succ\u00e8s mais placer un terme sur la mauvaise variable.<\/p>\n<p>La meilleure approche est le test en couches. Les petites fonctions d&rsquo;aide doivent avoir des tests locaux dans la mesure du possible. Les constructeurs d&rsquo;\u00e9quations doivent \u00eatre v\u00e9rifi\u00e9s sur les petits probl\u00e8mes de r\u00e9f\u00e9rence avant qu&rsquo;ils ne soient dignes de confiance dans les grandes s\u00e9ries. Les flux de travail de simulation complets doivent \u00e9galement comporter des tests de style de r\u00e9gression, m\u00eame si ces tests sont simples, tels que la v\u00e9rification si une tendance r\u00e9siduelle, un mod\u00e8le de sym\u00e9trie, une quantit\u00e9 conserv\u00e9e ou une statistique de champ finale reste dans une plage attendue.<\/p>\n<p>Ce style de test correspond \u00e0 la logique d&rsquo;un bon calcul scientifique. Vous ne voulez pas que du code qui s&rsquo;ex\u00e9cute. Vous voulez du code dont le comportement reste interpr\u00e9table au fur et \u00e0 mesure que le mod\u00e8le \u00e9volue. Les modules personnalis\u00e9s facilitent la t\u00e2che car ils isolent les responsabilit\u00e9s ; Les tests donnent ensuite \u00e0 ces responsabilit\u00e9s un contrat stable.<\/p>\n<h2>Conclusion<\/h2>\n<p>L&rsquo;extension de Fipy avec des modules personnalis\u00e9s consiste moins \u00e0 rendre le cadre plus compliqu\u00e9 et plus \u00e0 rendre votre propre PDE de contr\u00f4le. Les meilleures extensions sont g\u00e9n\u00e9ralement celles qui clarifient le mod\u00e8le&nbsp;: les modules utilitaires qui r\u00e9duisent la r\u00e9p\u00e9tition, les g\u00e9n\u00e9rateurs d&rsquo;\u00e9quations qui centralisent la formulation, les aides \u00e0 terme source qui maintiennent explicitement la physique non lin\u00e9aire et les structures de paquets qui s\u00e9parent la d\u00e9finition du probl\u00e8me de l&rsquo;ex\u00e9cution. Au fur et \u00e0 mesure que les mod\u00e8les deviennent plus grands, cette modularit\u00e9 cesse d&rsquo;\u00eatre facultative et commence \u00e0 devenir l&rsquo;une des principales garanties contre la confusion num\u00e9rique.<\/p>\n<p>La r\u00e8gle pratique est simple. Commencez peu profond. Modularisez ce qui se r\u00e9p\u00e8te. Gardez la physique visible. Ajoutez une abstraction plus profonde uniquement lorsqu&rsquo;elle am\u00e9liore clairement la r\u00e9utilisation ou la stabilit\u00e9. Si vous suivez ce mod\u00e8le, les modules FIPY personnalis\u00e9s deviennent plus qu&rsquo;une commodit\u00e9 de programmation. Ils deviennent une partie de la fa\u00e7on dont vous rendez un projet de simulation lisible, testable et m\u00e9rite une extension au fil du temps.<\/p>\n","protected":false,"raw":"<p>Fipy est tr\u00e8s utile lorsque vous arr\u00eatez de le traiter comme une collection d'exemples isol\u00e9s et que vous commencez \u00e0 l'utiliser comme un cadre flexible pour cr\u00e9er vos propres flux de travail PDE. Ce changement compte parce que les vrais projets de simulation restent rarement simples longtemps. Un mod\u00e8le qui commence comme une \u00e9quation sur un maillage se d\u00e9veloppe souvent dans un syst\u00e8me avec des propri\u00e9t\u00e9s de mat\u00e9riau r\u00e9utilisables, des termes sources non lin\u00e9aires, des champs coupl\u00e9s, des param\u00e8tres sp\u00e9cifiques au sc\u00e9nario et des \u00e9tapes de post-traitement r\u00e9p\u00e9t\u00e9es. \u00c0 ce stade, tout garder \u00e0 l'int\u00e9rieur d'un script en expansion rend g\u00e9n\u00e9ralement le code plus difficile \u00e0 d\u00e9boguer, plus difficile \u00e0 faire confiance et beaucoup plus difficile \u00e0 r\u00e9utiliser.<\/p>\n<p>C'est l\u00e0 que les modules personnalis\u00e9s deviennent pr\u00e9cieux. Dans Fipy, l'extension du cadre ne signifie pas toujours la r\u00e9\u00e9criture des internes ou la cr\u00e9ation de hi\u00e9rarchies de classes approfondies. Tr\u00e8s souvent, l'extension la plus efficace est un module Python propre qui organise une partie du mod\u00e8le num\u00e9rique&nbsp;: cr\u00e9ation de maillage, configuration de variables, logique de coefficient, assemblage d'\u00e9quations, gestion des sources, contr\u00f4le du solveur ou routines de sortie. Le but n'est pas de rendre le projet plus abstrait pour lui-m\u00eame. L'objectif est de rendre le mod\u00e8le math\u00e9matique plus facile \u00e0 lire, \u00e0 tester, \u00e0 modifier et \u00e0 ex\u00e9cuter dans plusieurs cas.<\/p>\n<p>Une bonne strat\u00e9gie d'extension de Fipy commence par une question pratique&nbsp;: que doit-il exactement devenir r\u00e9utilisable&nbsp;? Parfois, la r\u00e9ponse est un g\u00e9n\u00e9rateur de source personnalis\u00e9. Il s'agit parfois d'une usine d'\u00e9quations coupl\u00e9es. Parfois, il s'agit simplement d'une structure de package qui s\u00e9pare la physique des scripts de lancement. Une fois que cela est clair, Fipy devient beaucoup plus facile \u00e0 mettre \u00e0 l'\u00e9chelle sans perdre de clart\u00e9.<\/p>\n<h2>Commencez par identifier le bon point d'extension<\/h2>\n<p>La plus grande erreur que les gens commettent lors de l'extension de Fipy est de supposer que chaque mod\u00e8le r\u00e9p\u00e9t\u00e9 n\u00e9cessite une classe de bas niveau personnalis\u00e9e. En pratique, de nombreux probl\u00e8mes peuvent \u00eatre r\u00e9solus avec une approche beaucoup plus l\u00e9g\u00e8re. Si vous continuez \u00e0 r\u00e9\u00e9crire la m\u00eame configuration pour un maillage, des conditions initiales, des contraintes de limites ou des coefficients, vous n'aurez peut-\u00eatre besoin que d'un module utilitaire. Si votre principale difficult\u00e9 est de construire la m\u00eame famille d'\u00e9quations sous diff\u00e9rents choix de param\u00e8tres, vous avez probablement besoin d'un g\u00e9n\u00e9rateur d'\u00e9quations. Si votre mod\u00e8le inclut un comportement de source non lin\u00e9aire qui appara\u00eet dans plusieurs cas, une aide \u00e0 un terme source peut \u00eatre le bon point d'extension.<\/p>\n<p>Cette distinction est importante car diff\u00e9rentes extensions entra\u00eenent des co\u00fbts d'entretien diff\u00e9rents. Un petit module de fonctions d'aide est g\u00e9n\u00e9ralement stable, facile \u00e0 tester et facile \u00e0 comprendre pour les collaborateurs. Une modification structurelle plus profonde peut \u00eatre appropri\u00e9e dans les cas avanc\u00e9s, mais elle augmente \u00e9galement les chances de cacher une physique importante derri\u00e8re les abstractions plus difficiles \u00e0 inspecter. En informatique scientifique, la lisibilit\u00e9 fait partie de la fiabilit\u00e9. Si un autre chercheur ne peut pas rapidement voir comment un terme est construit, votre architecture peut \u00eatre trop intelligente pour son propre bien.<\/p>\n<p>La meilleure premi\u00e8re \u00e9tape, alors, est de ne pas se demander&nbsp;: \"Comment puis-je sous-classer davantage FIPY&nbsp;?\" Mais plut\u00f4t, \"Quel \u00e9l\u00e9ment de mon flux de travail num\u00e9rique se r\u00e9p\u00e8te assez souvent pour m\u00e9riter son propre module&nbsp;?\" Cette question conduit g\u00e9n\u00e9ralement \u00e0 une conception plus propre et plus maintenable.<\/p>\n<h2>Comprendre les objets de base de Fipy avant de les modulariser<\/h2>\n<p>Toute extension r\u00e9utilisable fonctionne mieux lorsqu'elle respecte la structure de base de Fipy. La plupart des projets tournent autour de quelques objets cl\u00e9s : le maillage, les variables, les termes, les \u00e9quations assembl\u00e9es et la boucle de r\u00e9solution ou de balayage. Les modules personnalis\u00e9s doivent rendre ces objets plus faciles \u00e0 g\u00e9rer, et non plus difficiles \u00e0 localiser. Par exemple, un module de maillage peut renvoyer une grille standard ou une famille de g\u00e9om\u00e9tries avec des dimensions param\u00e9tr\u00e9es. Un module de variables peut g\u00e9rer l'initialisation, les mises \u00e0 jour des anciennes valeurs et les \u00e9tats de champ par d\u00e9faut. Un module de physique peut d\u00e9finir des coefficients de diffusion, des r\u00e9ponses mat\u00e9rielles ou des expressions sources. Un module d'\u00e9quations peut ensuite assembler ces pi\u00e8ces en un seul PDE ou un syst\u00e8me coupl\u00e9.<\/p>\n<p>Cette structure aide \u00e9galement car Fipy fait la distinction entre les diff\u00e9rents types de donn\u00e9es de champ. Dans de nombreux flux de travail, des quantit\u00e9s d\u00e9pendantes vivent dans des cellules, tandis que d'autres op\u00e9rations sont naturellement exprim\u00e9es sur les visages. Si un module personnalis\u00e9 floue cette distinction de mani\u00e8re n\u00e9gligente, le code peut toujours s'ex\u00e9cuter, mais le r\u00e9sultat peut devenir num\u00e9riquement d\u00e9routant. Cela est particuli\u00e8rement vrai lorsque des expressions, des gradients ou des coefficients bas\u00e9s sur le visage sont impliqu\u00e9s. Une bonne couche d'extension devrait donc pr\u00e9server la signification math\u00e9matique des objets sous-jacents au lieu de les cacher derri\u00e8re de vagues noms d'aide.<\/p>\n<p>En d'autres termes, un module personnalis\u00e9 devrait r\u00e9duire la r\u00e9p\u00e9tition sans affaiblir la compr\u00e9hension par l'utilisateur de l'endroit o\u00f9 vit r\u00e9ellement la physique discr\u00e9tis\u00e9e.<\/p>\n<h2>Utilisez les modules utilitaires en premier, et non les h\u00e9ritages profonds<\/h2>\n<p>Pour de nombreux projets FIPY, le moyen le plus s\u00fbr et le plus productif d'\u00e9tendre le cadre est de cr\u00e9er des modules Python simples autour d'objets Fipy standard. Cette approche est beaucoup plus pratique que l'h\u00e9ritage profond pour la plupart des utilisateurs. Il maintient votre code \u00e0 proximit\u00e9 des mod\u00e8les FIPY document\u00e9s, facilite les mises \u00e0 niveau et r\u00e9duit le risque d'introduire un comportement fragile qu'une seule personne de l'\u00e9quipe comprend.<\/p>\n<p>Une strat\u00e9gie d'extension bas\u00e9e sur les utilitaires peut inclure un module pour la g\u00e9n\u00e9ration de g\u00e9om\u00e9trie et de maillage, un autre pour le chargement des param\u00e8tres, un autre pour les propri\u00e9t\u00e9s des mat\u00e9riaux et un autre pour la construction de PDE. Au lieu de remplir tout cela dans un seul script, vous laissez chaque fichier d\u00e9tenir une seule couche de responsabilit\u00e9. Votre script d'ex\u00e9cution devient alors une couche d'orchestration claire&nbsp;: cr\u00e9er un maillage, initialiser des variables, construire des \u00e9quations, r\u00e9soudre des pas de temps et exporter des r\u00e9sultats.<\/p>\n<p>Ce style a un autre avantage : il refl\u00e8te la fa\u00e7on dont les gens pensent r\u00e9ellement aux mod\u00e8les scientifiques. Les chercheurs s\u00e9parent g\u00e9n\u00e9ralement le domaine du probl\u00e8me en concepts tels que la g\u00e9om\u00e9trie, les champs, le comportement constitutif, la formulation num\u00e9rique et la configuration de l'exp\u00e9rience. Si la structure de votre projet suit cette logique, le code devient plus naturel \u00e0 revoir et \u00e0 \u00e9tendre. C'est souvent plus pr\u00e9cieux que n'importe quelle astuce de conception orient\u00e9e objet.<\/p>\n<h2>Cr\u00e9er des constructeurs d'\u00e9quations r\u00e9utilisables<\/h2>\n<p>L'une des utilisations les plus solides des modules personnalis\u00e9s dans FIPY est l'assemblage d'\u00e9quations dans les constructeurs r\u00e9utilisables. Ceci est particuli\u00e8rement utile une fois que votre projet contient plusieurs variantes du m\u00eame mod\u00e8le de gouvernance. Au lieu de r\u00e9\u00e9crire la PDE dans chaque script, vous d\u00e9finissez une fonction ou une classe qui prend les variables et coefficients requis et renvoie une \u00e9quation pr\u00eate \u00e0 r\u00e9soudre. Cela am\u00e9liore instantan\u00e9ment la coh\u00e9rence entre les ex\u00e9cutions et r\u00e9duit les chances de changer discr\u00e8tement un terme dans un fichier tout en oubliant d'en mettre \u00e0 jour un autre.<\/p>\n<p>Un simple g\u00e9n\u00e9rateur d'\u00e9quations peut accepter une variable, un coefficient de diffusion, un coefficient transitoire et une expression de source. Un comportement plus avanc\u00e9 peut changer de comportement selon que la convection est active, que la source soit explicite ou semi-implicite, ou que la course actuelle soit en r\u00e9gime permanent ou en fonction du temps. Dans le travail multi-physique, un constructeur peut renvoyer plusieurs \u00e9quations \u00e0 la fois et assembler un syst\u00e8me coupl\u00e9 en un seul endroit plut\u00f4t que de diffuser ces relations sur un ordinateur portable ou plusieurs scripts.<\/p>\n<p>Cette conception devient encore plus importante lorsque plusieurs personnes travaillent sur le m\u00eame mod\u00e8le. Si une personne affine les coefficients tandis qu'une autre est en train de r\u00e9gler les pas de temps ou les param\u00e8tres du solveur, un g\u00e9n\u00e9rateur d'\u00e9quations partag\u00e9s aide \u00e0 maintenir la stabilit\u00e9 et la visibilit\u00e9 du noyau math\u00e9matique. Le point n'est pas seulement pratique. C'est une discipline num\u00e9rique.<\/p>\n<h2>Rendre la logique source-term modulaire et explicite<\/h2>\n<p>La gestion des sources personnalis\u00e9es est l'une des raisons les plus courantes pour lesquelles les gens doivent \u00e9tendre Fipy. Dans de nombreux mod\u00e8les de PDE, le terme source est l'endroit o\u00f9 vit la physique la plus sp\u00e9cifique au probl\u00e8me. Cela peut inclure un comportement de r\u00e9action non lin\u00e9aire, un couplage de phase, des fonctions de for\u00e7age, une d\u00e9pendance \u00e0 la temp\u00e9rature ou des injections et des puits sp\u00e9cifiques \u00e0 un sc\u00e9nario. Si cette logique reste int\u00e9gr\u00e9e directement dans le script d'ex\u00e9cution, elle devient rapidement difficile \u00e0 tester et encore plus difficile \u00e0 r\u00e9utiliser.<\/p>\n<p>Une bien meilleure approche consiste \u00e0 isoler la construction de sources dans son propre module. Ce module peut exposer un petit ensemble de constructeurs clairement nomm\u00e9s, tels qu'une fonction source explicite, une usine source semi-implicite ou une aide qui divise une expression non lin\u00e9aire en \u00e9l\u00e9ments explicites et implicites. Cela compte car Fipy peut b\u00e9n\u00e9ficier de la lin\u00e9arisation de la partie d'une source qui d\u00e9pend de la variable en cours de r\u00e9solution. Lorsqu'il est bien fait, cela am\u00e9liore souvent la convergence et maintient le mod\u00e8le num\u00e9riquement plus stable.<\/p>\n<p>C'est \u00e9galement le point o\u00f9 la discipline avec des expressions math\u00e9matiques devient importante. Dans les flux de travail FIPY, les expressions sources qui agissent sur les variables FIPY doivent g\u00e9n\u00e9ralement utiliser `fipy.tools.numerix` plut\u00f4t que de supposer que les appels \u00e9quivalents numpy ou scipy se comporteront de la m\u00eame mani\u00e8re. Un module source est donc un bon endroit pour centraliser cette pratique. Ce faisant, vous rendez les r\u00e8gles de physique et de mise en \u0153uvre plus coh\u00e9rentes dans le projet.<\/p>\n<h2>Manipulez soigneusement la cellule et la logique du visage<\/h2>\n<p>Certaines des erreurs les plus frustrantes dans les projets FIPY personnalis\u00e9s proviennent de la diff\u00e9rence entre les quantit\u00e9s bas\u00e9es sur les cellules et les quantit\u00e9s bas\u00e9es sur les cellules. Il est tentant de cr\u00e9er un code d'aide g\u00e9n\u00e9rique qui \"renvoie simplement un coefficient\" sans que son emplacement dans la discr\u00e9tisation soit compl\u00e8tement clair. Ce raccourci peut sembler \u00e9l\u00e9gant, mais cela rend souvent le mod\u00e8le plus difficile \u00e0 raisonner plus tard, en particulier lorsque des gradients, des anisotropies, des coefficients non lin\u00e9aires ou des interpolations de visage sont impliqu\u00e9s.<\/p>\n<p>Les modules personnalis\u00e9s doivent donc \u00eatre explicites sur ce qu'ils renvoient. Si un coefficient appartient aux visages, le nom de la fonction et la documentation doivent le dire. Si un assistant convertit une quantit\u00e9 de cellule en une repr\u00e9sentation faciale, cette transformation doit \u00eatre visible et intentionnelle. Ce n'est pas simplement une question de style. Dans les travaux \u00e0 volume fini, l'emplacement et l'interpr\u00e9tation d'un champ affectent \u00e0 la fois l'exactitude et la lisibilit\u00e9 du mod\u00e8le num\u00e9rique.<\/p>\n<p>La m\u00eame prudence s'applique lorsque vous comptez sur des conversions automatiques pratiques. Parfois, ces commodit\u00e9s sont utiles, mais elles ne doivent pas devenir une magie invisible \u00e0 l'int\u00e9rieur d'un module r\u00e9utilisable. Un bon code scientifique favorise l'explicit\u00e9 lorsque le sens math\u00e9matique est important.<\/p>\n<h2>Modulariser les mod\u00e8les coupl\u00e9s avant qu'ils ne deviennent chaotiques<\/h2>\n<p>Au fur et \u00e0 mesure que les mod\u00e8les FIPY deviennent plus avanc\u00e9s, les \u00e9quations coupl\u00e9es sont souvent le lieu o\u00f9 la structure du projet r\u00e9ussit ou s'effondre. Un syst\u00e8me coupl\u00e9 peut rester lisible si chaque relation physique est d\u00e9finie de mani\u00e8re contr\u00f4l\u00e9e, mais cela devient tr\u00e8s rapidement d\u00e9sordonn\u00e9 lorsque des morceaux d'\u00e9quations multiples sont assembl\u00e9s \u00e0 diff\u00e9rents endroits du code. C'est pourquoi les mod\u00e8les coupl\u00e9s b\u00e9n\u00e9ficient tant des modules personnalis\u00e9s.<\/p>\n<p>Une conception propre peut placer chaque sous-mod\u00e8le dans son propre fichier&nbsp;: un pour le transport, un pour la r\u00e9action, un pour l'\u00e9nergie, un pour le comportement de phase et un pour les coefficients partag\u00e9s. Un constructeur central d'\u00e9quations coupl\u00e9es importe ensuite ces pi\u00e8ces et assemble le syst\u00e8me dans un ordre coh\u00e9rent. Cela r\u00e9duit le risque de variables de c\u00e2blage de mani\u00e8re incorrecte et facilite l'extension du projet lorsqu'un troisi\u00e8me ou un quatri\u00e8me champ est ajout\u00e9 plus tard.<\/p>\n<p>Cela aide \u00e9galement \u00e0 l'une des r\u00e9alit\u00e9s les plus pratiques du travail coupl\u00e9 : l'exp\u00e9rimentation. Vous devrez peut-\u00eatre comparer une solution monolithique \u00e0 une approximation plus l\u00e2che, \u00e9changer un terme constitutif contre un autre ou restructurer un mod\u00e8le pour \u00e9viter les limitations dans la fa\u00e7on dont certains termes interagissent. Une conception modulaire facilite ces modifications car la logique de couplage est centralis\u00e9e plut\u00f4t qu'enterr\u00e9e \u00e0 l'int\u00e9rieur du code de proc\u00e9dure r\u00e9p\u00e9t\u00e9.<\/p>\n<h2>Organisez le projet comme un package de simulation, pas un script de d\u00e9monstration<\/h2>\n<p>Si votre travail FIPY d\u00e9passe les exp\u00e9riences ponctuelles, la structure globale du package est presque autant importante que les termes PDE eux-m\u00eames. Une mise en page simple et efficace comprend souvent des emplacements distincts pour les maillages, les variables, la logique physique, les g\u00e9n\u00e9rateurs d'\u00e9quations, les scripts d'ex\u00e9cution, le post-traitement et les tests. Cela n'a pas besoin d'\u00eatre \u00e9labor\u00e9, mais cela devrait rendre \u00e9vident o\u00f9 chaque type de logique appartient.<\/p>\n<p>Cette organisation modifie le r\u00f4le du script de niveau sup\u00e9rieur. Au lieu d'\u00eatre un fichier g\u00e9ant qui d\u00e9finit tout, il devient un point d'entr\u00e9e contr\u00f4l\u00e9 pour un cas de simulation. Il importe un maillage, charge des param\u00e8tres, initialise des variables, construit des \u00e9quations, fait avancer la solution et \u00e9crit des sorties. C'est beaucoup plus facile \u00e0 examiner, beaucoup plus facile \u00e0 r\u00e9ex\u00e9cuter avec diff\u00e9rents param\u00e8tres et beaucoup plus facile \u00e0 convertir en \u00e9tudes par lots ou en balayages de param\u00e8tres plus tard.<\/p>\n<p>Un projet FIPY bien structur\u00e9 simplifie \u00e9galement la documentation. Chaque module peut expliquer une responsabilit\u00e9 au lieu d'obliger les lecteurs \u00e0 naviguer dans un seul long fichier plein de pr\u00e9occupations mitig\u00e9es. Dans les contextes de recherche, c'est un avantage pratique et non cosm\u00e9tique.<\/p>\n<h2>Tester des modules personnalis\u00e9s dans les couches<\/h2>\n<p>Une fois que le code FIPY est divis\u00e9 en modules, les tests deviennent beaucoup plus g\u00e9rables. Cela compte parce que les projets num\u00e9riques \u00e9chouent de mani\u00e8re diff\u00e9rente du code d'application ordinaire. Un module peut importer correctement et encoder toujours la mauvaise physique. Un g\u00e9n\u00e9rateur de sources peut s'ex\u00e9cuter sans erreur et produire des comportements instables sous am\u00e9lioration. Une \u00e9quation coupl\u00e9e peut s'assembler avec succ\u00e8s mais placer un terme sur la mauvaise variable.<\/p>\n<p>La meilleure approche est le test en couches. Les petites fonctions d'aide doivent avoir des tests locaux dans la mesure du possible. Les constructeurs d'\u00e9quations doivent \u00eatre v\u00e9rifi\u00e9s sur les petits probl\u00e8mes de r\u00e9f\u00e9rence avant qu'ils ne soient dignes de confiance dans les grandes s\u00e9ries. Les flux de travail de simulation complets doivent \u00e9galement comporter des tests de style de r\u00e9gression, m\u00eame si ces tests sont simples, tels que la v\u00e9rification si une tendance r\u00e9siduelle, un mod\u00e8le de sym\u00e9trie, une quantit\u00e9 conserv\u00e9e ou une statistique de champ finale reste dans une plage attendue.<\/p>\n<p>Ce style de test correspond \u00e0 la logique d'un bon calcul scientifique. Vous ne voulez pas que du code qui s'ex\u00e9cute. Vous voulez du code dont le comportement reste interpr\u00e9table au fur et \u00e0 mesure que le mod\u00e8le \u00e9volue. Les modules personnalis\u00e9s facilitent la t\u00e2che car ils isolent les responsabilit\u00e9s ; Les tests donnent ensuite \u00e0 ces responsabilit\u00e9s un contrat stable.<\/p>\n<h2>Conclusion<\/h2>\n<p>L'extension de Fipy avec des modules personnalis\u00e9s consiste moins \u00e0 rendre le cadre plus compliqu\u00e9 et plus \u00e0 rendre votre propre PDE de contr\u00f4le. Les meilleures extensions sont g\u00e9n\u00e9ralement celles qui clarifient le mod\u00e8le&nbsp;: les modules utilitaires qui r\u00e9duisent la r\u00e9p\u00e9tition, les g\u00e9n\u00e9rateurs d'\u00e9quations qui centralisent la formulation, les aides \u00e0 terme source qui maintiennent explicitement la physique non lin\u00e9aire et les structures de paquets qui s\u00e9parent la d\u00e9finition du probl\u00e8me de l'ex\u00e9cution. Au fur et \u00e0 mesure que les mod\u00e8les deviennent plus grands, cette modularit\u00e9 cesse d'\u00eatre facultative et commence \u00e0 devenir l'une des principales garanties contre la confusion num\u00e9rique.<\/p>\n<p>La r\u00e8gle pratique est simple. Commencez peu profond. Modularisez ce qui se r\u00e9p\u00e8te. Gardez la physique visible. Ajoutez une abstraction plus profonde uniquement lorsqu'elle am\u00e9liore clairement la r\u00e9utilisation ou la stabilit\u00e9. Si vous suivez ce mod\u00e8le, les modules FIPY personnalis\u00e9s deviennent plus qu'une commodit\u00e9 de programmation. Ils deviennent une partie de la fa\u00e7on dont vous rendez un projet de simulation lisible, testable et m\u00e9rite une extension au fil du temps.<\/p>\n"},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\">Reading Time: <\/span> <span class=\"rt-time\"> 9<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Fipy est tr\u00e8s utile lorsque vous arr\u00eatez de le traiter comme une collection d&rsquo;exemples isol\u00e9s et que vous commencez \u00e0 l&rsquo;utiliser comme un cadre flexible pour cr\u00e9er vos propres flux de travail PDE. Ce changement compte parce que les vrais projets de simulation restent rarement simples longtemps. Un mod\u00e8le qui commence comme une \u00e9quation sur [&hellip;]<\/p>\n","protected":false,"raw":""},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=293","iawp_total_views":0,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1228","post","type-post","status-publish","format-standard","hentry","category-fipy-documentation-examples-development","fr-FR"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Extension de Fipy avec des modules personnalis\u00e9s : un guide pratique pour les flux de travail PDE avanc\u00e9s<\/title>\n<meta name=\"description\" content=\"D\u00e9couvrez comment \u00e9tendre Fipy avec des modules personnalis\u00e9s en organisant le code PDE r\u00e9utilisable, en g\u00e9rant les termes sources, en cr\u00e9ant des mod\u00e8les coupl\u00e9s et en testant des flux de travail Fipy avanc\u00e9s.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Extension de Fipy avec des modules personnalis\u00e9s : un guide pratique pour les flux de travail PDE avanc\u00e9s\" \/>\n<meta property=\"og:description\" content=\"D\u00e9couvrez comment \u00e9tendre Fipy avec des modules personnalis\u00e9s en organisant le code PDE r\u00e9utilisable, en g\u00e9rant les termes sources, en cr\u00e9ant des mod\u00e8les coupl\u00e9s et en testant des flux de travail Fipy avanc\u00e9s.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:28:40+00:00\" \/>\n<meta name=\"author\" content=\"Tomas Delgado\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Tomas Delgado\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"Extension de Fipy avec des modules personnalis\u00e9s\",\"datePublished\":\"2026-08-21T14:28:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/\"},\"wordCount\":3096,\"commentCount\":0,\"articleSection\":[\"FIPY : documentation, exemples &amp; D\u00e9veloppement\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/\",\"name\":\"Extension de Fipy avec des modules personnalis\u00e9s : un guide pratique pour les flux de travail PDE avanc\u00e9s\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:28:40+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"description\":\"D\u00e9couvrez comment \u00e9tendre Fipy avec des modules personnalis\u00e9s en organisant le code PDE r\u00e9utilisable, en g\u00e9rant les termes sources, en cr\u00e9ant des mod\u00e8les coupl\u00e9s et en testant des flux de travail Fipy avanc\u00e9s.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/extending-fipy-with-custom-modules\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Extension de Fipy avec des modules personnalis\u00e9s\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\",\"url\":\"https:\\\/\\\/matforge.org\\\/\",\"name\":\"matforge.org\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/matforge.org\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\",\"name\":\"Tomas Delgado\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g\",\"caption\":\"Tomas Delgado\"},\"sameAs\":[\"http:\\\/\\\/matforge.org\"],\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/tomas-delgado\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Extension de Fipy avec des modules personnalis\u00e9s : un guide pratique pour les flux de travail PDE avanc\u00e9s","description":"D\u00e9couvrez comment \u00e9tendre Fipy avec des modules personnalis\u00e9s en organisant le code PDE r\u00e9utilisable, en g\u00e9rant les termes sources, en cr\u00e9ant des mod\u00e8les coupl\u00e9s et en testant des flux de travail Fipy avanc\u00e9s.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/","og_locale":"fr_FR","og_type":"article","og_title":"Extension de Fipy avec des modules personnalis\u00e9s : un guide pratique pour les flux de travail PDE avanc\u00e9s","og_description":"D\u00e9couvrez comment \u00e9tendre Fipy avec des modules personnalis\u00e9s en organisant le code PDE r\u00e9utilisable, en g\u00e9rant les termes sources, en cr\u00e9ant des mod\u00e8les coupl\u00e9s et en testant des flux de travail Fipy avanc\u00e9s.","og_url":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:28:40+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Tomas Delgado","Dur\u00e9e de lecture estim\u00e9e":"15 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"Extension de Fipy avec des modules personnalis\u00e9s","datePublished":"2026-08-21T14:28:40+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/"},"wordCount":3096,"commentCount":0,"articleSection":["FIPY : documentation, exemples &amp; D\u00e9veloppement"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/","url":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/","name":"Extension de Fipy avec des modules personnalis\u00e9s : un guide pratique pour les flux de travail PDE avanc\u00e9s","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:28:40+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"description":"D\u00e9couvrez comment \u00e9tendre Fipy avec des modules personnalis\u00e9s en organisant le code PDE r\u00e9utilisable, en g\u00e9rant les termes sources, en cr\u00e9ant des mod\u00e8les coupl\u00e9s et en testant des flux de travail Fipy avanc\u00e9s.","breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/extending-fipy-with-custom-modules\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Extension de Fipy avec des modules personnalis\u00e9s"}]},{"@type":"WebSite","@id":"https:\/\/matforge.org\/#website","url":"https:\/\/matforge.org\/","name":"matforge.org","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/matforge.org\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061","name":"Tomas Delgado","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/202f82c9f4f4534a3ba77bf8a8fbef09cf8489f52bdf819082f21390da4e7c9a?s=96&d=mm&r=g","caption":"Tomas Delgado"},"sameAs":["http:\/\/matforge.org"],"url":"https:\/\/matforge.org\/author\/tomas-delgado\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1228"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1228\/revisions"}],"predecessor-version":[{"id":1362,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1228\/revisions\/1362"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}