{"id":1274,"date":"2026-08-21T14:31:31","date_gmt":"2026-08-21T14:31:31","guid":{"rendered":"https:\/\/matforge.org\/?p=1274","raw":"https:\/\/matforge.org\/?p=1274"},"modified":"2026-08-21T14:31:31","modified_gmt":"2026-08-21T14:31:31","slug":"periodic-symmetric-robin-boundary-conditions-fipy-patterns","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/","title":{"rendered":"Conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin : mod\u00e8les FIPY avanc\u00e9s","raw":"Conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin : mod\u00e8les FIPY avanc\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\"> 10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span><h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li>Les limites p\u00e9riodiques de FIPY sont mises en \u0153uvre de mani\u00e8re plus propre avec les objets <code>PeriodicGrid<\/code> ou les commandes de maillage p\u00e9riodique GMSH plut\u00f4t qu&rsquo;un couplage manuel.<\/li>\n<li>Les limites sym\u00e9triques sont des conditions de Neumann \u00e0 flux z\u00e9ro appliqu\u00e9e aux plans de sym\u00e9trie. Ce n&rsquo;est pas une cat\u00e9gorie FIPY distincte, mais une utilisation physique des mod\u00e8les de conditions aux limites standard.<\/li>\n<li>Les fronti\u00e8res de Robin combinent des contraintes de valeur et de flux. Ils peuvent \u00eatre impl\u00e9ment\u00e9s avec <code>ImplicitRobinSource<\/code>, <code>ImplicitSourceTerm<\/code> ou une approche de divergence <code>FaceVariable<\/code>.<\/li>\n<li>Les \u00e9cueils des limites de Robin les plus courants sont les erreurs de signe des conventions de direction de flux incorrectes et l&rsquo;alias de variable lorsque plusieurs noms de Python font r\u00e9f\u00e9rence au m\u00eame objet <code>FaceVariable<\/code>.<\/li>\n<li>Pour les limites p\u00e9riodiques d\u00e9pendant du temps, utilisez des expressions conditionnelles telles que <code>t % 10<\/code> plut\u00f4t que les fonctions Python. Les fonctions Python ne sont pas r\u00e9\u00e9valu\u00e9es automatiquement \u00e0 mesure que la variable de temps de simulation change.<\/li>\n<\/ul>\n<p>Si vous avez travaill\u00e9 sur des didacticiels Fipy de base, vous savez d\u00e9j\u00e0 que les conditions aux limites sont celles o\u00f9 la th\u00e9orie rencontre les bords du maillage. Dirichlet, Neumann, Robin et les fronti\u00e8res p\u00e9riodiques peuvent sembler simples en th\u00e9orie, mais les d\u00e9tails de la mise en \u0153uvre sont importants dans les simulations r\u00e9elles.<\/p>\n<p>Cet article couvre les mod\u00e8les FIPY avanc\u00e9s pour les domaines p\u00e9riodiques, les plans de sym\u00e9trie et les limites de Robin. Celles-ci sont courantes dans les mod\u00e8les de cellules unitaires, les probl\u00e8mes axisym\u00e9triques, les transferts de chaleur par convection et les simulations d&rsquo;\u00e9change de masse.<\/p>\n<p>Les exemples ci-dessous montrent comment impl\u00e9menter chaque type de limite correctement, comment choisir entre les approches et comment \u00e9viter les d\u00e9faillances silencieuses qui peuvent perdre des heures de d\u00e9bogage.<\/p>\n<h2>Conditions aux limites p\u00e9riodiques : couplage des ar\u00eates<\/h2>\n<p>Les limites p\u00e9riodiques collent les c\u00f4t\u00e9s oppos\u00e9s du domaine. Une solution laissant un c\u00f4t\u00e9 r\u00e9appara\u00eet sur le c\u00f4t\u00e9 oppos\u00e9. Ce mod\u00e8le est courant dans les simulations de cellules unitaires, les \u00e9l\u00e9ments de volume repr\u00e9sentatifs, la science des mat\u00e9riaux et les mod\u00e8les de transport simplifi\u00e9s o\u00f9 le domaine r\u00e9el se r\u00e9p\u00e8te.<\/p>\n<h3>L&rsquo;approche simple : Objets P\u00e9riodiqueGrid<\/h3>\n<p>Fipy fournit des objets de grille p\u00e9riodiques int\u00e9gr\u00e9s qui g\u00e8rent automatiquement le couplage du visage. Pour les domaines 1D, la configuration est simple :<\/p>\n<pre><code class=\"language-python\">from fipy import PeriodicGrid1D, CellVariable, DiffusionTerm, TransientTerm\n\nnx = 50\ndx = 1.0\nmesh = PeriodicGrid1D(nx=nx, dx=dx)\n\nC = CellVariable(name=\"concentration\", mesh=mesh, value=0.0)\n\n# No explicit boundary condition needed.\n# FiPy handles periodic coupling through the mesh.\neq = TransientTerm() == DiffusionTerm(coeff=1.0)\n\n# Initialize with a non-uniform perturbation.\nx = mesh.cellCenters[0]\nC.setValue(1.0, where=(x &gt; 0.7) &amp; (x &lt; 0.8))\n\neq.sweep(var=C)\n<\/code><\/pre>\n<p>Pour les domaines 2D, FIPY fournit <code>PeriodicGrid2D<\/code> et des variantes orient\u00e9es&nbsp;:<\/p>\n<pre><code class=\"language-python\">from fipy import PeriodicGrid2D, CellVariable, DiffusionTerm\n\nnx, ny = 50, 50\ndx = dy = 1.0\n\n# Periodic on all sides\nmesh = PeriodicGrid2D(nx=nx, ny=ny, dx=dx, dy=dy)\n\n# Oriented variants can be used when needed:\n# PeriodicGrid2DLeftRight: periodic only in x\n# PeriodicGrid2DTopBottom: periodic only in y\n<\/code><\/pre>\n<p>Les variantes orient\u00e9es sont utiles lorsque vous avez besoin de p\u00e9riodicit\u00e9 dans une direction mais dans des conditions aux limites diff\u00e9rentes dans l&rsquo;autre. Par exemple, un probl\u00e8me de transport peut n\u00e9cessiter des entr\u00e9es et des sorties p\u00e9riodiques dans une direction et des parois sans flux dans l&rsquo;autre.<\/p>\n<h3>G\u00e9om\u00e9tries complexes : maillages p\u00e9riodiques GMSH<\/h3>\n<p>Lorsque le domaine n&rsquo;est pas une simple ligne ou un rectangle, utilisez GMSH pour d\u00e9finir des relations p\u00e9riodiques au niveau du maillage. Les commandes importantes sont <code>Periodic Line<\/code> et <code>Periodic Surface<\/code>.<\/p>\n<pre><code>\/\/ In a Gmsh .geo file\nPeriodic Line {1} = {2} + 10;\nPeriodic Surface {3} = {4};\n<\/code><\/pre>\n<p>Importez ensuite le maillage en Python&nbsp;:<\/p>\n<pre><code class=\"language-python\">from fipy import GmshImporter2D\n\nmesh = GmshImporter2D(\"mesh.geo\")\n<\/code><\/pre>\n<p>L&rsquo;avantage est que le couplage p\u00e9riodique est d\u00e9fini dans le maillage, et non manuellement dans le solveur. Ceci est plus robuste pour les g\u00e9om\u00e9tries arbitraires car le solveur fonctionne avec un maillage qui contient d\u00e9j\u00e0 les relations p\u00e9riodiques.<\/p>\n<h3>Couplage facial manuel : lorsque vous avez besoin de contr\u00f4le<\/h3>\n<p>Pour les cas personnalis\u00e9s, vous souhaiterez peut-\u00eatre mapper manuellement des faces et appliquer des contraintes. Cela donne un contr\u00f4le total mais n\u00e9cessite une indexation minutieuse des visages.<\/p>\n<pre><code class=\"language-python\">from fipy import CellVariable, Grid1D\n\nnx = 50\ndx = 1.0\nmesh = Grid1D(nx=nx, dx=dx)\n\nC = CellVariable(mesh=mesh, value=0.0)\n\nleft_faces = mesh.facesLeft\nright_faces = mesh.facesRight\n\n# Manual periodic-style coupling\nC.constrain(C.faceValue[mesh.facesLeft.value], where=mesh.facesRight)\n<\/code><\/pre>\n<p>Le couplage manuel est plus fragile que l&rsquo;utilisation de <code>PeriodicGrid<\/code>. Pr\u00e9f\u00e9rez les maillages p\u00e9riodiques int\u00e9gr\u00e9s \u00e0 moins que vous n&rsquo;ayez besoin d&rsquo;un comportement qu&rsquo;ils ne peuvent pas fournir.<\/p>\n<h3>Limites p\u00e9riodiques d\u00e9pendant du temps<\/h3>\n<p>Les limites p\u00e9riodiques d\u00e9pendant du temps peuvent \u00eatre d\u00e9licates. Une erreur courante consiste \u00e0 d\u00e9finir une fonction Python et \u00e0 s&rsquo;attendre \u00e0 ce que Fipy la r\u00e9\u00e9value automatiquement :<\/p>\n<pre><code class=\"language-python\"># Wrong: this evaluates once and then stays fixed\ndef sw_func(t):\n    if t &lt; 5:\n        return 0.0\n    elif t &lt; 10:\n        return 1.0\n    else:\n        return sw_func(t - 10)\n\nvalueRight = sw_func(t)\n<\/code><\/pre>\n<p>Le r\u00e9sultat de la fonction est \u00e9valu\u00e9 une fois. Lorsque <code>t<\/code> change, la valeur limite ne se met pas \u00e0 jour automatiquement.<\/p>\n<p>Utilisez \u00e0 la place des expressions conditionnelles et des variables compatibles FIPY&nbsp;:<\/p>\n<pre><code class=\"language-python\"># Correct pattern: expression can re-evaluate as t changes\nt_mod = t % 10\nvalueRight = ((t_mod &gt;= 5) &amp; (t_mod &lt; 10)) * 1.0\n\nC.constrain(valueRight, where=mesh.facesRight)\n<\/code><\/pre>\n<p>Le point cl\u00e9 est que les variables FIPY se comportent comme des expressions symboliques. Cr\u00e9ez des conditions d\u00e9pendant du temps avec des expressions compatibles avec FIPY, des masques logiques et des op\u00e9rations de style tableau plut\u00f4t que des instructions Python <code>if<\/code>.<\/p>\n<h3>Lorsque les limites p\u00e9riodiques \u00e9chouent silencieusement<\/h3>\n<p>Une panne silencieuse courante consiste \u00e0 utiliser une condition initiale uniforme sur un domaine p\u00e9riodique&nbsp;:<\/p>\n<pre><code class=\"language-python\">C = CellVariable(mesh=mesh, value=1.0)\n\neq = TransientTerm() == DiffusionTerm(coeff=1.0)\neq.solve(var=C, dt=0.1)\n<\/code><\/pre>\n<p>Le r\u00e9sultat ne change jamais car le champ n&rsquo;a pas de d\u00e9grad\u00e9. Les limites p\u00e9riodiques ne cr\u00e9ent pas de gradients par elles-m\u00eames.<\/p>\n<p>Initialisez toujours des domaines p\u00e9riodiques avec une condition non uniforme, telle qu&rsquo;une perturbation, une fonction de pas ou une blob gaussienne.<\/p>\n<h2>Conditions aux limites sym\u00e9triques&nbsp;: flux nuls sur les plans de sym\u00e9trie<\/h2>\n<p>Les fronti\u00e8res sym\u00e9triques exploitent la sym\u00e9trie afin que vous ne puissiez simuler qu&rsquo;une partie du domaine. Ceci est courant dans le transfert de chaleur axisym\u00e9trique, les mod\u00e8les cristallographiques et les flux avec des plans de sym\u00e9trie.<\/p>\n<p>Dans FIPY, les limites sym\u00e9triques sont impl\u00e9ment\u00e9es comme des conditions de Neumann \u00e0 flux nul sur le plan de sym\u00e9trie.<\/p>\n<pre><code class=\"language-python\">from fipy import Grid2D, CellVariable, DiffusionTerm, TransientTerm\n\nnx, ny = 50, 25\ndx = dy = 0.1\n\nmesh = Grid2D(nx=nx, ny=ny, dx=dx, dy=dy)\n\nT = CellVariable(name=\"temperature\", mesh=mesh, value=100.0)\n\n# Symmetry plane at the top: zero flux\nT.faceGrad.constrain(0.0, where=mesh.facesTop)\n\n# Bottom boundary: fixed temperature\nT.constrain(100.0, where=mesh.facesBottom)\n\n# Left and right: insulated\nT.faceGrad.constrain(0.0, where=mesh.facesLeft)\nT.faceGrad.constrain(0.0, where=mesh.facesRight)\n\neq = TransientTerm() == DiffusionTerm(coeff=1.0)\n<\/code><\/pre>\n<p>La signification physique est que la chaleur ou la masse ne traverse pas le plan de sym\u00e9trie car la moiti\u00e9 omise du domaine refl\u00e8te la moiti\u00e9 simul\u00e9e.<\/p>\n<h3>Coordonn\u00e9es cylindriques axisym\u00e9triques<\/h3>\n<p>Les probl\u00e8mes axisym\u00e9triques n\u00e9cessitent des soins suppl\u00e9mentaires car la coordonn\u00e9e radiale change l&rsquo;op\u00e9rateur de diffusion. En coordonn\u00e9es cylindriques, le terme de diffusion radiale comprend un facteur g\u00e9om\u00e9trique :<\/p>\n<p>(1\/R) \u2202(R \u2202C\/\u2202R) \/ \u2202R<\/p>\n<p>FIPY peut repr\u00e9senter ce type de comportement, mais la configuration n\u00e9cessite une construction soign\u00e9e et une conception de maillage.<\/p>\n<pre><code class=\"language-python\">from fipy import CellVariable, FaceVariable, DiffusionTerm, TransientTerm\n\nr = mesh.cellCenters[0]\n\n# Example structure for a radial coefficient\naxisymmetric_coeff = FaceVariable(mesh=mesh, value=1.0)\n\neq = TransientTerm() == DiffusionTerm(coeff=axisymmetric_coeff)\n<\/code><\/pre>\n<p>L&rsquo;axe \u00e0 <code>r = 0<\/code> est singulier en raison du facteur <code>1\/r<\/code>. \u00c9vitez de placer les centres de cellules exactement \u00e0 <code>r = 0<\/code>. D\u00e9marrez le maillage \u00e0 un petit rayon positif, utilisez soigneusement les coordonn\u00e9es radiales centr\u00e9es sur les cellules ou utilisez une conception de maillage qui \u00e9vite la singularit\u00e9.<\/p>\n<h2>Conditions aux limites de Robin&nbsp;: contraintes de valeur-flux mixtes<\/h2>\n<p>Les conditions aux limites de Robin sp\u00e9cifient une combinaison lin\u00e9aire de la variable et de sa d\u00e9riv\u00e9e normale. Ils combinent une contrainte de valeur avec une contrainte de flux.<\/p>\n<p>Un exemple courant est la loi de refroidissement de Newton :<\/p>\n<p>k \u2202t\/\u2202n + h(t &#8211; t\u221e) = 0<\/p>\n<p>Ici, le flux de chaleur \u00e0 la limite est proportionnel \u00e0 la diff\u00e9rence entre la temp\u00e9rature de surface et la temp\u00e9rature ambiante.<\/p>\n<h3>L&rsquo;approche implicitrobinsource<\/h3>\n<p><code>ImplicitRobinSource<\/code> est souvent l&rsquo;approche la plus propre pour le transfert de chaleur par convection et l&rsquo;\u00e9change de masse.<\/p>\n<pre><code class=\"language-python\">import fipy as fp\n\nnx = 50\ndx = 1.0\nmesh = fp.Grid1D(nx=nx, dx=dx)\n\nT = fp.CellVariable(name=\"temperature\", mesh=mesh, value=20.0)\n\n# Physical parameters\nk = 1.0\nh = 0.5\nT_inf = 10.0\nT_left = 100.0\n\n# Equation setup\neq = fp.TransientTerm() == fp.DiffusionTerm(coeff=k)\n\n# Left boundary: fixed temperature\nbc_left = fp.FixedValue(mesh.facesLeft, T_left)\n\n# Right boundary: convective heat transfer\nbc_right = fp.ImplicitRobinSource(\n    mesh.facesRight,\n    coeff=h,\n    value=h * T_inf\n)\n\ndt = 0.1\nfor step in range(100):\n    eq.solve(var=T, boundaryConditions=[bc_left, bc_right], dt=dt)\n<\/code><\/pre>\n<p>L&rsquo;approche <code>ImplicitRobinSource<\/code> ajoute une source implicite ou une contribution de puits \u00e0 la matrice du solveur. Cela peut \u00eatre plus stable que la manipulation explicite des limites, en particulier pour les probl\u00e8mes d&rsquo;\u00e9change de chaleur ou de transfert de masse.<\/p>\n<h3>L&rsquo;approche de divergence de faces variables<\/h3>\n<p>Pour des coefficients variant dans l&rsquo;espace ou des limites multi-physiques coupl\u00e9es, une approche de divergence <code>FaceVariable<\/code> donne plus de contr\u00f4le.<\/p>\n<pre><code class=\"language-python\">from fipy import CellVariable, FaceVariable, Grid1D\nfrom fipy import DiffusionTerm, ImplicitSourceTerm, TransientTerm\n\nnx = 100\ndx = 1.0\nmesh = Grid1D(nx=nx, dx=dx)\n\nC = CellVariable(mesh=mesh, value=0.0)\n\nD_coeff = 2.0\nh_coeff = 1.0\nC_ambient = 0.5\n\n# Step 1: define face coefficient\nD_face = FaceVariable(mesh=mesh, value=D_coeff)\n\n# Step 2: zero out coefficient at the boundary as a precaution\nD_face[..., mesh.facesLeft.value] = 0.0\n\n# Step 3: formulate Robin-like boundary contribution\nrobin_flux = (h_coeff * (C_ambient - C)).divergence\n\neq = (\n    TransientTerm()\n    == DiffusionTerm(coeff=D_face)\n    + robin_flux\n    - ImplicitSourceTerm(coeff=0.0)\n)\n<\/code><\/pre>\n<p>Cette approche n\u00e9cessite une attention \u00e0 trois d\u00e9tails :<\/p>\n<ol>\n<li>Mettez \u00e0 z\u00e9ro le coefficient de diffusion \u00e0 la face limite cible.<\/li>\n<li>Formulez le flux de Robin comme source de divergence.<\/li>\n<li>Ajoutez la contribution \u00e0 l&rsquo;\u00e9quation de mani\u00e8re coh\u00e9rente.<\/li>\n<\/ol>\n<p>La mise \u00e0 z\u00e9ro du coefficient de limite est souvent trait\u00e9e comme une pr\u00e9caution s\u00fbre car elle emp\u00eache le comportement par d\u00e9faut de non-flux d&rsquo;entrer en conflit avec la contribution personnalis\u00e9e de Robin.<\/p>\n<h3>Pi\u00e8ges de la limite commune de Robin<\/h3>\n<h4>Signez les erreurs dans le sens du flux<\/h4>\n<p>La convention de signe peut basculer selon que le flux est trait\u00e9 comme une source vers l&rsquo;int\u00e9rieur ou vers l&rsquo;ext\u00e9rieur.<\/p>\n<pre><code class=\"language-python\"># Wrong sign\nRobinCoeff = maskSurfaces * D * n \/ (-dPf.dot(a) + b)\n\n# Corrected sign pattern\nRobinCoeff = maskSurfaces * D * n \/ (dPf.dot(a) + b)\n<\/code><\/pre>\n<p>V\u00e9rifier les cas limitants&nbsp;:<\/p>\n<ul>\n<li>Si <code>h \u2192 0<\/code>, la limite doit se comporter comme un flux z\u00e9ro neumann.<\/li>\n<li>Si <code>h \u2192 \u221e<\/code>, la limite doit se comporter comme un dirichlet \u00e0 valeur fixe.<\/li>\n<\/ul>\n<h4>alias variable<\/h4>\n<p>L&rsquo;alias des variables se produit lorsque plusieurs noms Python pointent vers le m\u00eame objet <code>FaceVariable<\/code>.<\/p>\n<pre><code class=\"language-python\"># Wrong: all names reference the same object\nD = FaceVariable(mesh=mesh, value=0.9)\nGamma = D\nb = D\n\nGamma.setValue(0.0, where=maskSurfaces)\n<\/code><\/pre>\n<p>Changer <code>Gamma<\/code> change \u00e9galement <code>D<\/code> et <code>b<\/code>. Cela peut briser silencieusement la condition aux limites.<\/p>\n<p>Utilisez plut\u00f4t une expression non mutante&nbsp;:<\/p>\n<pre><code class=\"language-python\"># Better: create a new masked expression\nGamma = D * ~maskSurfaces\n<\/code><\/pre>\n<p>Cela cr\u00e9e une nouvelle expression qui est <code>D<\/code> \u00e9loign\u00e9e de la limite et z\u00e9ro sur la limite, sans muter l&rsquo;objet d&rsquo;origine.<\/p>\n<h4>Probl\u00e8mes de convergence<\/h4>\n<p>Les fronti\u00e8res de Robin peuvent rendre les r\u00e9solutions instables ou difficiles \u00e0 converger. Une solution de contournement pratique consiste \u00e0 introduire la d\u00e9pendance au temps, m\u00eame pour un probl\u00e8me qui devrait atteindre un \u00e9tat stable. L&rsquo;\u00e9volution transitoire peut aider le solveur \u00e0 aborder la solution correcte plus progressivement.<\/p>\n<h2>Limites spatialement variables et bas\u00e9es sur les patchs<\/h2>\n<p>Les conditions aux limites ne peuvent \u00eatre appliqu\u00e9es qu&rsquo;aux r\u00e9gions s\u00e9lectionn\u00e9es en utilisant des masques spatiaux. Ceci est utile lorsque diff\u00e9rentes parties d&rsquo;une m\u00eame limite ont un comportement physique diff\u00e9rent.<\/p>\n<pre><code class=\"language-python\">from fipy import Grid2D, CellVariable, DiffusionTerm\n\nnx, ny = 80, 80\ndx = dy = 0.1\nmesh = Grid2D(nx=nx, ny=ny, dx=dx, dy=dy)\n\nT = CellVariable(mesh=mesh, value=0.0)\n\nX, Y = mesh.faceCenters\n\n# Left half of the boundary\nmask_left = X &lt; 0.5 * nx * dx\n\n# Fixed value on one patch\nT.constrain(1.0, where=mesh.facesLeft &amp; mask_left)\n\n# Zero flux on the other patch\nT.faceGrad.constrain(0.0, where=mesh.facesLeft &amp; ~mask_left)\n<\/code><\/pre>\n<p>Cette approche de limite de patch est importante pour les probl\u00e8mes de conditions physiques mixtes, telles qu&rsquo;un mur qui est partiellement chauff\u00e9 et partiellement isol\u00e9.<\/p>\n<h2>Ce que nous recommandons : Choisir la bonne approche<\/h2>\n<h3>Limites p\u00e9riodiques<\/h3>\n<ol>\n<li>Utilisez <code>PeriodicGrid<\/code> pour des domaines 1D, 2D ou 3D structur\u00e9s simples.<\/li>\n<li>Utilisez des maillages p\u00e9riodiques GMSH pour les g\u00e9om\u00e9tries complexes, car le couplage au niveau du maillage est plus robuste que les contraintes de face manuelle.<\/li>\n<li>Initialiser avec des conditions non uniformes car les valeurs uniformes ne produisent aucune \u00e9volution dans les probl\u00e8mes de diffusion pure.<\/li>\n<li>Utilisez des expressions conditionnelles telles que <code>t % N<\/code> pour des limites p\u00e9riodiques d\u00e9pendant du temps, et non des fonctions Python.<\/li>\n<\/ol>\n<h3>Limites sym\u00e9triques<\/h3>\n<ol>\n<li>Appliquer des conditions Neumann \u00e0 flux z\u00e9ro avec <code>faceGrad.constrain(0.0)<\/code> sur le plan de sym\u00e9trie.<\/li>\n<li>Pour les probl\u00e8mes axisym\u00e9triques, traitez soigneusement la singularit\u00e9 <code>r = 0<\/code> gr\u00e2ce \u00e0 la conception de maillage.<\/li>\n<li>V\u00e9rifiez la sym\u00e9trie en v\u00e9rifiant que le gradient de solution est nul au niveau du plan de sym\u00e9trie.<\/li>\n<\/ol>\n<h3>fronti\u00e8res de robin<\/h3>\n<ol>\n<li>Utilisez <code>ImplicitRobinSource<\/code> pour le transfert de chaleur par convection et l&rsquo;\u00e9change de masse.<\/li>\n<li>Utilisez l&rsquo;approche de divergence <code>FaceVariable<\/code> pour des coefficients variant dans l&rsquo;espace ou des limites multi-physiques coupl\u00e9es.<\/li>\n<li>Les coefficients de z\u00e9ro sur la face limite par pr\u00e9caution lors de l&rsquo;utilisation de formulations de flux personnalis\u00e9s.<\/li>\n<li>Surveillez les erreurs de signe et v\u00e9rifiez les cas limitants.<\/li>\n<li>Surveillez l&rsquo;alias variable. Pr\u00e9f\u00e9rez les expressions masqu\u00e9es telles que <code>D * ~mask<\/code> plut\u00f4t que de muter les variables partag\u00e9es avec <code>setValue()<\/code>.<\/li>\n<\/ol>\n<h2>Comparaison : quand utiliser chaque approche<\/h2>\n<table class=\"custom-table\">\n<tbody>\n<tr>\n<th>Type de limite<\/th>\n<th>cas d&rsquo;utilisation<\/th>\n<th>Approche FIPY recommand\u00e9e<\/th>\n<th>\u00e9cueil commun<\/th>\n<\/tr>\n<tr>\n<td>P\u00e9riodique, structur\u00e9<\/td>\n<td>Cellules unitaires, RVE, domaines r\u00e9p\u00e9titifs<\/td>\n<td><code>PeriodicGrid1D<\/code>, <code>PeriodicGrid2D<\/code> ou <code>PeriodicGrid3D<\/code><\/td>\n<td>\u00c9tat initial uniforme<\/td>\n<\/tr>\n<tr>\n<td>P\u00e9riodique, complexe<\/td>\n<td>G\u00e9om\u00e9tries arbitraires<\/td>\n<td>Commandes GMS <code>Periodic<\/code><\/td>\n<td>Erreurs d&rsquo;importation ou de couplage de maillage<\/td>\n<\/tr>\n<tr>\n<td>P\u00e9riodique, variable dans le temps<\/td>\n<td>D\u00e9bits puls\u00e9s ou conditions cycliques<\/td>\n<td>Expression conditionnelle telle que <code>t % N<\/code><\/td>\n<td>Les fonctions Python ne r\u00e9\u00e9valuent pas<\/td>\n<\/tr>\n<tr>\n<td>Sym\u00e9trique<\/td>\n<td>Probl\u00e8mes axisym\u00e9triques ou sym\u00e9trie cristalline<\/td>\n<td><code>faceGrad.constrain(0.0)<\/code><\/td>\n<td><code>r = 0<\/code> Singularit\u00e9 en coordonn\u00e9es cylindriques<\/td>\n<\/tr>\n<tr>\n<td>Robin, convection<\/td>\n<td>Transfert de chaleur ou \u00e9change de masse<\/td>\n<td><code>ImplicitRobinSource<\/code><\/td>\n<td>Signez les erreurs dans le sens du flux<\/td>\n<\/tr>\n<tr>\n<td>Robin, complexe<\/td>\n<td>Coefficients variant spatialement ou couplage multi-physique<\/td>\n<td><code>FaceVariable<\/code> Plus divergence<\/td>\n<td>Probl\u00e8mes d&rsquo;alias et de convergence variables<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>D\u00e9pannage&nbsp;: d\u00e9faillances courantes des conditions aux limites<\/h2>\n<h3>La solution ne change pas<\/h3>\n<p>Si un domaine p\u00e9riodique produit la m\u00eame valeur partout, v\u00e9rifiez la condition initiale. Une condition initiale uniforme n&rsquo;a pas de gradient, donc la diffusion pure n&rsquo;a rien \u00e0 \u00e9voluer.<\/p>\n<h3>la valeur limite est erron\u00e9e<\/h3>\n<p>Pour les limites de Robin, v\u00e9rifiez :<\/p>\n<ul>\n<li>Le signe de la direction du flux.<\/li>\n<li>Que vous contraigniez les visages plut\u00f4t que les cellules.<\/li>\n<li>si le coefficient de diffusion a \u00e9t\u00e9 mis \u00e0 z\u00e9ro \u00e0 la limite dans les formulations personnalis\u00e9es.<\/li>\n<\/ul>\n<h3>Le solveur diverge<\/h3>\n<p>Pour les limites de Robin, essayez&nbsp;:<\/p>\n<ul>\n<li>R\u00e9duire <code>dt<\/code> et augmenter la r\u00e9solution.<\/li>\n<li>Ajout d&rsquo;une \u00e9volution transitoire m\u00eame pour les probl\u00e8mes destin\u00e9s \u00e0 atteindre un \u00e9tat stable.<\/li>\n<li>Utiliser les solveurs PETSC au lieu de simples balayages pour les configurations de limites complexes.<\/li>\n<\/ul>\n<h3>La limite ne se met pas \u00e0 jour<\/h3>\n<p>Pour les limites p\u00e9riodiques d\u00e9pendant du temps, la cause probable est une fonction python utilis\u00e9e \u00e0 la place d&rsquo;une expression FIPY. Utilisez les objets <code>Variable<\/code> et les masques logiques au lieu des instructions <code>if<\/code> et <code>elif<\/code>.<\/p>\n<h2>Conclusion<\/h2>\n<p>Les conditions aux limites p\u00e9riodiques, sym\u00e9triques et de Robin sont celles o\u00f9 la th\u00e9orie de Fipy rencontre les bords du maillage. Les grilles p\u00e9riodiques g\u00e8rent automatiquement le couplage du visage. Les plans de sym\u00e9trie sont des conditions de Neumann \u00e0 flux z\u00e9ro. Les fronti\u00e8res de Robin combinent les contraintes de valeur et de flux via <code>ImplicitRobinSource<\/code> ou une approche de divergence <code>FaceVariable<\/code>.<\/p>\n<p>L&rsquo;habitude la plus importante est de v\u00e9rifier les cas limitants. Pour les limites de Robin, v\u00e9rifiez que <code>h \u2192 0<\/code> donne un comportement sans flux et que <code>h \u2192 \u221e<\/code> donne un comportement \u00e0 valeur fixe. Pour les domaines p\u00e9riodiques, v\u00e9rifiez que la condition initiale n&rsquo;est pas uniforme. Pour les limites sym\u00e9triques, confirmez que le gradient au niveau du plan de sym\u00e9trie est nul.<\/p>\n<p>Ces v\u00e9rifications r\u00e9cup\u00e8rent la plupart des erreurs de condition aux limites avant qu&rsquo;elles ne deviennent de longues sessions de d\u00e9bogage.<\/p>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"\/boundary-conditions-theory-and-implementation-in-fipy\/\">Conditions aux limites&nbsp;: th\u00e9orie et mise en \u0153uvre dans FIPY<\/a> &#8211; les fondamentaux de Dirichlet, Neumann et les fronti\u00e8res mixtes.<\/li>\n<li><a href=\"\/working-through-your-first-fipy-example\/\">Travailler dans votre premier exemple FIPY<\/a>&nbsp;: configuration du maillage, variables, \u00e9quations de diffusion et conditions aux limites.<\/li>\n<li><a href=\"\/understanding-fipys-core-architecture\/\">Comprendre l&rsquo;architecture de base de Fipy<\/a>&nbsp;: variables de la cellule contre le visage, des contraintes de conditions aux limites et de l&rsquo;assemblage de la matrice.<\/li>\n<li><a href=\"https:\/\/github.com\/usnistgov\/fipy\/discussions\">discussions github de Fipy<\/a> \u2014 Exemples de communaut\u00e9 et d\u00e9pannage.<\/li>\n<\/ul>\n<h2>Prochaines \u00e9tapes<\/h2>\n<ol>\n<li>Commencez par <code>PeriodicGrid1D<\/code> pour un simple domaine p\u00e9riodique 1D.<\/li>\n<li>Ajoutez une d\u00e9pendance temporelle avec des expressions conditionnelles telles que <code>t % N<\/code>.<\/li>\n<li>Pour les limites de Robin, commencez par <code>ImplicitRobinSource<\/code> et v\u00e9rifiez les cas limitants.<\/li>\n<li>D\u00e9placez-vous vers les maillages GMSH pour des g\u00e9om\u00e9tries complexes une fois les cas structur\u00e9s.<\/li>\n<\/ol>\n<p>Pour obtenir de l&rsquo;aide sur la mise en \u0153uvre des conditions aux limites dans des mod\u00e8les de recherche sp\u00e9cifiques, <a href=\"\/\">visitez notre page d&rsquo;accueil<\/a> pour consulter des ressources et un soutien au d\u00e9veloppement de Fipy.<\/p>\n","protected":false,"raw":"<h2>Points \u00e0 retenir cl\u00e9s<\/h2>\n<ul>\n<li>Les limites p\u00e9riodiques de FIPY sont mises en \u0153uvre de mani\u00e8re plus propre avec les objets <code>PeriodicGrid<\/code> ou les commandes de maillage p\u00e9riodique GMSH plut\u00f4t qu'un couplage manuel.<\/li>\n<li>Les limites sym\u00e9triques sont des conditions de Neumann \u00e0 flux z\u00e9ro appliqu\u00e9e aux plans de sym\u00e9trie. Ce n'est pas une cat\u00e9gorie FIPY distincte, mais une utilisation physique des mod\u00e8les de conditions aux limites standard.<\/li>\n<li>Les fronti\u00e8res de Robin combinent des contraintes de valeur et de flux. Ils peuvent \u00eatre impl\u00e9ment\u00e9s avec <code>ImplicitRobinSource<\/code>, <code>ImplicitSourceTerm<\/code> ou une approche de divergence <code>FaceVariable<\/code>.<\/li>\n<li>Les \u00e9cueils des limites de Robin les plus courants sont les erreurs de signe des conventions de direction de flux incorrectes et l'alias de variable lorsque plusieurs noms de Python font r\u00e9f\u00e9rence au m\u00eame objet <code>FaceVariable<\/code>.<\/li>\n<li>Pour les limites p\u00e9riodiques d\u00e9pendant du temps, utilisez des expressions conditionnelles telles que <code>t % 10<\/code> plut\u00f4t que les fonctions Python. Les fonctions Python ne sont pas r\u00e9\u00e9valu\u00e9es automatiquement \u00e0 mesure que la variable de temps de simulation change.<\/li>\n<\/ul>\n<p>Si vous avez travaill\u00e9 sur des didacticiels Fipy de base, vous savez d\u00e9j\u00e0 que les conditions aux limites sont celles o\u00f9 la th\u00e9orie rencontre les bords du maillage. Dirichlet, Neumann, Robin et les fronti\u00e8res p\u00e9riodiques peuvent sembler simples en th\u00e9orie, mais les d\u00e9tails de la mise en \u0153uvre sont importants dans les simulations r\u00e9elles.<\/p>\n<p>Cet article couvre les mod\u00e8les FIPY avanc\u00e9s pour les domaines p\u00e9riodiques, les plans de sym\u00e9trie et les limites de Robin. Celles-ci sont courantes dans les mod\u00e8les de cellules unitaires, les probl\u00e8mes axisym\u00e9triques, les transferts de chaleur par convection et les simulations d'\u00e9change de masse.<\/p>\n<p>Les exemples ci-dessous montrent comment impl\u00e9menter chaque type de limite correctement, comment choisir entre les approches et comment \u00e9viter les d\u00e9faillances silencieuses qui peuvent perdre des heures de d\u00e9bogage.<\/p>\n<h2>Conditions aux limites p\u00e9riodiques : couplage des ar\u00eates<\/h2>\n<p>Les limites p\u00e9riodiques collent les c\u00f4t\u00e9s oppos\u00e9s du domaine. Une solution laissant un c\u00f4t\u00e9 r\u00e9appara\u00eet sur le c\u00f4t\u00e9 oppos\u00e9. Ce mod\u00e8le est courant dans les simulations de cellules unitaires, les \u00e9l\u00e9ments de volume repr\u00e9sentatifs, la science des mat\u00e9riaux et les mod\u00e8les de transport simplifi\u00e9s o\u00f9 le domaine r\u00e9el se r\u00e9p\u00e8te.<\/p>\n<h3>L'approche simple : Objets P\u00e9riodiqueGrid<\/h3>\n<p>Fipy fournit des objets de grille p\u00e9riodiques int\u00e9gr\u00e9s qui g\u00e8rent automatiquement le couplage du visage. Pour les domaines 1D, la configuration est simple :<\/p>\n<pre><code class=\"language-python\">from fipy import PeriodicGrid1D, CellVariable, DiffusionTerm, TransientTerm\n\nnx = 50\ndx = 1.0\nmesh = PeriodicGrid1D(nx=nx, dx=dx)\n\nC = CellVariable(name=\"concentration\", mesh=mesh, value=0.0)\n\n# No explicit boundary condition needed.\n# FiPy handles periodic coupling through the mesh.\neq = TransientTerm() == DiffusionTerm(coeff=1.0)\n\n# Initialize with a non-uniform perturbation.\nx = mesh.cellCenters[0]\nC.setValue(1.0, where=(x &gt; 0.7) &amp; (x &lt; 0.8))\n\neq.sweep(var=C)\n<\/code><\/pre>\n<p>Pour les domaines 2D, FIPY fournit <code>PeriodicGrid2D<\/code> et des variantes orient\u00e9es&nbsp;:<\/p>\n<pre><code class=\"language-python\">from fipy import PeriodicGrid2D, CellVariable, DiffusionTerm\n\nnx, ny = 50, 50\ndx = dy = 1.0\n\n# Periodic on all sides\nmesh = PeriodicGrid2D(nx=nx, ny=ny, dx=dx, dy=dy)\n\n# Oriented variants can be used when needed:\n# PeriodicGrid2DLeftRight: periodic only in x\n# PeriodicGrid2DTopBottom: periodic only in y\n<\/code><\/pre>\n<p>Les variantes orient\u00e9es sont utiles lorsque vous avez besoin de p\u00e9riodicit\u00e9 dans une direction mais dans des conditions aux limites diff\u00e9rentes dans l'autre. Par exemple, un probl\u00e8me de transport peut n\u00e9cessiter des entr\u00e9es et des sorties p\u00e9riodiques dans une direction et des parois sans flux dans l'autre.<\/p>\n<h3>G\u00e9om\u00e9tries complexes : maillages p\u00e9riodiques GMSH<\/h3>\n<p>Lorsque le domaine n'est pas une simple ligne ou un rectangle, utilisez GMSH pour d\u00e9finir des relations p\u00e9riodiques au niveau du maillage. Les commandes importantes sont <code>Periodic Line<\/code> et <code>Periodic Surface<\/code>.<\/p>\n<pre><code>\/\/ In a Gmsh .geo file\nPeriodic Line {1} = {2} + 10;\nPeriodic Surface {3} = {4};\n<\/code><\/pre>\n<p>Importez ensuite le maillage en Python&nbsp;:<\/p>\n<pre><code class=\"language-python\">from fipy import GmshImporter2D\n\nmesh = GmshImporter2D(\"mesh.geo\")\n<\/code><\/pre>\n<p>L'avantage est que le couplage p\u00e9riodique est d\u00e9fini dans le maillage, et non manuellement dans le solveur. Ceci est plus robuste pour les g\u00e9om\u00e9tries arbitraires car le solveur fonctionne avec un maillage qui contient d\u00e9j\u00e0 les relations p\u00e9riodiques.<\/p>\n<h3>Couplage facial manuel : lorsque vous avez besoin de contr\u00f4le<\/h3>\n<p>Pour les cas personnalis\u00e9s, vous souhaiterez peut-\u00eatre mapper manuellement des faces et appliquer des contraintes. Cela donne un contr\u00f4le total mais n\u00e9cessite une indexation minutieuse des visages.<\/p>\n<pre><code class=\"language-python\">from fipy import CellVariable, Grid1D\n\nnx = 50\ndx = 1.0\nmesh = Grid1D(nx=nx, dx=dx)\n\nC = CellVariable(mesh=mesh, value=0.0)\n\nleft_faces = mesh.facesLeft\nright_faces = mesh.facesRight\n\n# Manual periodic-style coupling\nC.constrain(C.faceValue[mesh.facesLeft.value], where=mesh.facesRight)\n<\/code><\/pre>\n<p>Le couplage manuel est plus fragile que l'utilisation de <code>PeriodicGrid<\/code>. Pr\u00e9f\u00e9rez les maillages p\u00e9riodiques int\u00e9gr\u00e9s \u00e0 moins que vous n'ayez besoin d'un comportement qu'ils ne peuvent pas fournir.<\/p>\n<h3>Limites p\u00e9riodiques d\u00e9pendant du temps<\/h3>\n<p>Les limites p\u00e9riodiques d\u00e9pendant du temps peuvent \u00eatre d\u00e9licates. Une erreur courante consiste \u00e0 d\u00e9finir une fonction Python et \u00e0 s'attendre \u00e0 ce que Fipy la r\u00e9\u00e9value automatiquement :<\/p>\n<pre><code class=\"language-python\"># Wrong: this evaluates once and then stays fixed\ndef sw_func(t):\n    if t &lt; 5:\n        return 0.0\n    elif t &lt; 10:\n        return 1.0\n    else:\n        return sw_func(t - 10)\n\nvalueRight = sw_func(t)\n<\/code><\/pre>\n<p>Le r\u00e9sultat de la fonction est \u00e9valu\u00e9 une fois. Lorsque <code>t<\/code> change, la valeur limite ne se met pas \u00e0 jour automatiquement.<\/p>\n<p>Utilisez \u00e0 la place des expressions conditionnelles et des variables compatibles FIPY&nbsp;:<\/p>\n<pre><code class=\"language-python\"># Correct pattern: expression can re-evaluate as t changes\nt_mod = t % 10\nvalueRight = ((t_mod &gt;= 5) &amp; (t_mod &lt; 10)) * 1.0\n\nC.constrain(valueRight, where=mesh.facesRight)\n<\/code><\/pre>\n<p>Le point cl\u00e9 est que les variables FIPY se comportent comme des expressions symboliques. Cr\u00e9ez des conditions d\u00e9pendant du temps avec des expressions compatibles avec FIPY, des masques logiques et des op\u00e9rations de style tableau plut\u00f4t que des instructions Python <code>if<\/code>.<\/p>\n<h3>Lorsque les limites p\u00e9riodiques \u00e9chouent silencieusement<\/h3>\n<p>Une panne silencieuse courante consiste \u00e0 utiliser une condition initiale uniforme sur un domaine p\u00e9riodique&nbsp;:<\/p>\n<pre><code class=\"language-python\">C = CellVariable(mesh=mesh, value=1.0)\n\neq = TransientTerm() == DiffusionTerm(coeff=1.0)\neq.solve(var=C, dt=0.1)\n<\/code><\/pre>\n<p>Le r\u00e9sultat ne change jamais car le champ n'a pas de d\u00e9grad\u00e9. Les limites p\u00e9riodiques ne cr\u00e9ent pas de gradients par elles-m\u00eames.<\/p>\n<p>Initialisez toujours des domaines p\u00e9riodiques avec une condition non uniforme, telle qu'une perturbation, une fonction de pas ou une blob gaussienne.<\/p>\n<h2>Conditions aux limites sym\u00e9triques&nbsp;: flux nuls sur les plans de sym\u00e9trie<\/h2>\n<p>Les fronti\u00e8res sym\u00e9triques exploitent la sym\u00e9trie afin que vous ne puissiez simuler qu'une partie du domaine. Ceci est courant dans le transfert de chaleur axisym\u00e9trique, les mod\u00e8les cristallographiques et les flux avec des plans de sym\u00e9trie.<\/p>\n<p>Dans FIPY, les limites sym\u00e9triques sont impl\u00e9ment\u00e9es comme des conditions de Neumann \u00e0 flux nul sur le plan de sym\u00e9trie.<\/p>\n<pre><code class=\"language-python\">from fipy import Grid2D, CellVariable, DiffusionTerm, TransientTerm\n\nnx, ny = 50, 25\ndx = dy = 0.1\n\nmesh = Grid2D(nx=nx, ny=ny, dx=dx, dy=dy)\n\nT = CellVariable(name=\"temperature\", mesh=mesh, value=100.0)\n\n# Symmetry plane at the top: zero flux\nT.faceGrad.constrain(0.0, where=mesh.facesTop)\n\n# Bottom boundary: fixed temperature\nT.constrain(100.0, where=mesh.facesBottom)\n\n# Left and right: insulated\nT.faceGrad.constrain(0.0, where=mesh.facesLeft)\nT.faceGrad.constrain(0.0, where=mesh.facesRight)\n\neq = TransientTerm() == DiffusionTerm(coeff=1.0)\n<\/code><\/pre>\n<p>La signification physique est que la chaleur ou la masse ne traverse pas le plan de sym\u00e9trie car la moiti\u00e9 omise du domaine refl\u00e8te la moiti\u00e9 simul\u00e9e.<\/p>\n<h3>Coordonn\u00e9es cylindriques axisym\u00e9triques<\/h3>\n<p>Les probl\u00e8mes axisym\u00e9triques n\u00e9cessitent des soins suppl\u00e9mentaires car la coordonn\u00e9e radiale change l'op\u00e9rateur de diffusion. En coordonn\u00e9es cylindriques, le terme de diffusion radiale comprend un facteur g\u00e9om\u00e9trique :<\/p>\n<p>(1\/R) \u2202(R \u2202C\/\u2202R) \/ \u2202R<\/p>\n<p>FIPY peut repr\u00e9senter ce type de comportement, mais la configuration n\u00e9cessite une construction soign\u00e9e et une conception de maillage.<\/p>\n<pre><code class=\"language-python\">from fipy import CellVariable, FaceVariable, DiffusionTerm, TransientTerm\n\nr = mesh.cellCenters[0]\n\n# Example structure for a radial coefficient\naxisymmetric_coeff = FaceVariable(mesh=mesh, value=1.0)\n\neq = TransientTerm() == DiffusionTerm(coeff=axisymmetric_coeff)\n<\/code><\/pre>\n<p>L'axe \u00e0 <code>r = 0<\/code> est singulier en raison du facteur <code>1\/r<\/code>. \u00c9vitez de placer les centres de cellules exactement \u00e0 <code>r = 0<\/code>. D\u00e9marrez le maillage \u00e0 un petit rayon positif, utilisez soigneusement les coordonn\u00e9es radiales centr\u00e9es sur les cellules ou utilisez une conception de maillage qui \u00e9vite la singularit\u00e9.<\/p>\n<h2>Conditions aux limites de Robin&nbsp;: contraintes de valeur-flux mixtes<\/h2>\n<p>Les conditions aux limites de Robin sp\u00e9cifient une combinaison lin\u00e9aire de la variable et de sa d\u00e9riv\u00e9e normale. Ils combinent une contrainte de valeur avec une contrainte de flux.<\/p>\n<p>Un exemple courant est la loi de refroidissement de Newton :<\/p>\n<p>k \u2202t\/\u2202n + h(t - t\u221e) = 0<\/p>\n<p>Ici, le flux de chaleur \u00e0 la limite est proportionnel \u00e0 la diff\u00e9rence entre la temp\u00e9rature de surface et la temp\u00e9rature ambiante.<\/p>\n<h3>L'approche implicitrobinsource<\/h3>\n<p><code>ImplicitRobinSource<\/code> est souvent l'approche la plus propre pour le transfert de chaleur par convection et l'\u00e9change de masse.<\/p>\n<pre><code class=\"language-python\">import fipy as fp\n\nnx = 50\ndx = 1.0\nmesh = fp.Grid1D(nx=nx, dx=dx)\n\nT = fp.CellVariable(name=\"temperature\", mesh=mesh, value=20.0)\n\n# Physical parameters\nk = 1.0\nh = 0.5\nT_inf = 10.0\nT_left = 100.0\n\n# Equation setup\neq = fp.TransientTerm() == fp.DiffusionTerm(coeff=k)\n\n# Left boundary: fixed temperature\nbc_left = fp.FixedValue(mesh.facesLeft, T_left)\n\n# Right boundary: convective heat transfer\nbc_right = fp.ImplicitRobinSource(\n    mesh.facesRight,\n    coeff=h,\n    value=h * T_inf\n)\n\ndt = 0.1\nfor step in range(100):\n    eq.solve(var=T, boundaryConditions=[bc_left, bc_right], dt=dt)\n<\/code><\/pre>\n<p>L'approche <code>ImplicitRobinSource<\/code> ajoute une source implicite ou une contribution de puits \u00e0 la matrice du solveur. Cela peut \u00eatre plus stable que la manipulation explicite des limites, en particulier pour les probl\u00e8mes d'\u00e9change de chaleur ou de transfert de masse.<\/p>\n<h3>L'approche de divergence de faces variables<\/h3>\n<p>Pour des coefficients variant dans l'espace ou des limites multi-physiques coupl\u00e9es, une approche de divergence <code>FaceVariable<\/code> donne plus de contr\u00f4le.<\/p>\n<pre><code class=\"language-python\">from fipy import CellVariable, FaceVariable, Grid1D\nfrom fipy import DiffusionTerm, ImplicitSourceTerm, TransientTerm\n\nnx = 100\ndx = 1.0\nmesh = Grid1D(nx=nx, dx=dx)\n\nC = CellVariable(mesh=mesh, value=0.0)\n\nD_coeff = 2.0\nh_coeff = 1.0\nC_ambient = 0.5\n\n# Step 1: define face coefficient\nD_face = FaceVariable(mesh=mesh, value=D_coeff)\n\n# Step 2: zero out coefficient at the boundary as a precaution\nD_face[..., mesh.facesLeft.value] = 0.0\n\n# Step 3: formulate Robin-like boundary contribution\nrobin_flux = (h_coeff * (C_ambient - C)).divergence\n\neq = (\n    TransientTerm()\n    == DiffusionTerm(coeff=D_face)\n    + robin_flux\n    - ImplicitSourceTerm(coeff=0.0)\n)\n<\/code><\/pre>\n<p>Cette approche n\u00e9cessite une attention \u00e0 trois d\u00e9tails :<\/p>\n<ol>\n<li>Mettez \u00e0 z\u00e9ro le coefficient de diffusion \u00e0 la face limite cible.<\/li>\n<li>Formulez le flux de Robin comme source de divergence.<\/li>\n<li>Ajoutez la contribution \u00e0 l'\u00e9quation de mani\u00e8re coh\u00e9rente.<\/li>\n<\/ol>\n<p>La mise \u00e0 z\u00e9ro du coefficient de limite est souvent trait\u00e9e comme une pr\u00e9caution s\u00fbre car elle emp\u00eache le comportement par d\u00e9faut de non-flux d'entrer en conflit avec la contribution personnalis\u00e9e de Robin.<\/p>\n<h3>Pi\u00e8ges de la limite commune de Robin<\/h3>\n<h4>Signez les erreurs dans le sens du flux<\/h4>\n<p>La convention de signe peut basculer selon que le flux est trait\u00e9 comme une source vers l'int\u00e9rieur ou vers l'ext\u00e9rieur.<\/p>\n<pre><code class=\"language-python\"># Wrong sign\nRobinCoeff = maskSurfaces * D * n \/ (-dPf.dot(a) + b)\n\n# Corrected sign pattern\nRobinCoeff = maskSurfaces * D * n \/ (dPf.dot(a) + b)\n<\/code><\/pre>\n<p>V\u00e9rifier les cas limitants&nbsp;:<\/p>\n<ul>\n<li>Si <code>h \u2192 0<\/code>, la limite doit se comporter comme un flux z\u00e9ro neumann.<\/li>\n<li>Si <code>h \u2192 \u221e<\/code>, la limite doit se comporter comme un dirichlet \u00e0 valeur fixe.<\/li>\n<\/ul>\n<h4>alias variable<\/h4>\n<p>L'alias des variables se produit lorsque plusieurs noms Python pointent vers le m\u00eame objet <code>FaceVariable<\/code>.<\/p>\n<pre><code class=\"language-python\"># Wrong: all names reference the same object\nD = FaceVariable(mesh=mesh, value=0.9)\nGamma = D\nb = D\n\nGamma.setValue(0.0, where=maskSurfaces)\n<\/code><\/pre>\n<p>Changer <code>Gamma<\/code> change \u00e9galement <code>D<\/code> et <code>b<\/code>. Cela peut briser silencieusement la condition aux limites.<\/p>\n<p>Utilisez plut\u00f4t une expression non mutante&nbsp;:<\/p>\n<pre><code class=\"language-python\"># Better: create a new masked expression\nGamma = D * ~maskSurfaces\n<\/code><\/pre>\n<p>Cela cr\u00e9e une nouvelle expression qui est <code>D<\/code> \u00e9loign\u00e9e de la limite et z\u00e9ro sur la limite, sans muter l'objet d'origine.<\/p>\n<h4>Probl\u00e8mes de convergence<\/h4>\n<p>Les fronti\u00e8res de Robin peuvent rendre les r\u00e9solutions instables ou difficiles \u00e0 converger. Une solution de contournement pratique consiste \u00e0 introduire la d\u00e9pendance au temps, m\u00eame pour un probl\u00e8me qui devrait atteindre un \u00e9tat stable. L'\u00e9volution transitoire peut aider le solveur \u00e0 aborder la solution correcte plus progressivement.<\/p>\n<h2>Limites spatialement variables et bas\u00e9es sur les patchs<\/h2>\n<p>Les conditions aux limites ne peuvent \u00eatre appliqu\u00e9es qu'aux r\u00e9gions s\u00e9lectionn\u00e9es en utilisant des masques spatiaux. Ceci est utile lorsque diff\u00e9rentes parties d'une m\u00eame limite ont un comportement physique diff\u00e9rent.<\/p>\n<pre><code class=\"language-python\">from fipy import Grid2D, CellVariable, DiffusionTerm\n\nnx, ny = 80, 80\ndx = dy = 0.1\nmesh = Grid2D(nx=nx, ny=ny, dx=dx, dy=dy)\n\nT = CellVariable(mesh=mesh, value=0.0)\n\nX, Y = mesh.faceCenters\n\n# Left half of the boundary\nmask_left = X &lt; 0.5 * nx * dx\n\n# Fixed value on one patch\nT.constrain(1.0, where=mesh.facesLeft &amp; mask_left)\n\n# Zero flux on the other patch\nT.faceGrad.constrain(0.0, where=mesh.facesLeft &amp; ~mask_left)\n<\/code><\/pre>\n<p>Cette approche de limite de patch est importante pour les probl\u00e8mes de conditions physiques mixtes, telles qu'un mur qui est partiellement chauff\u00e9 et partiellement isol\u00e9.<\/p>\n<h2>Ce que nous recommandons : Choisir la bonne approche<\/h2>\n<h3>Limites p\u00e9riodiques<\/h3>\n<ol>\n<li>Utilisez <code>PeriodicGrid<\/code> pour des domaines 1D, 2D ou 3D structur\u00e9s simples.<\/li>\n<li>Utilisez des maillages p\u00e9riodiques GMSH pour les g\u00e9om\u00e9tries complexes, car le couplage au niveau du maillage est plus robuste que les contraintes de face manuelle.<\/li>\n<li>Initialiser avec des conditions non uniformes car les valeurs uniformes ne produisent aucune \u00e9volution dans les probl\u00e8mes de diffusion pure.<\/li>\n<li>Utilisez des expressions conditionnelles telles que <code>t % N<\/code> pour des limites p\u00e9riodiques d\u00e9pendant du temps, et non des fonctions Python.<\/li>\n<\/ol>\n<h3>Limites sym\u00e9triques<\/h3>\n<ol>\n<li>Appliquer des conditions Neumann \u00e0 flux z\u00e9ro avec <code>faceGrad.constrain(0.0)<\/code> sur le plan de sym\u00e9trie.<\/li>\n<li>Pour les probl\u00e8mes axisym\u00e9triques, traitez soigneusement la singularit\u00e9 <code>r = 0<\/code> gr\u00e2ce \u00e0 la conception de maillage.<\/li>\n<li>V\u00e9rifiez la sym\u00e9trie en v\u00e9rifiant que le gradient de solution est nul au niveau du plan de sym\u00e9trie.<\/li>\n<\/ol>\n<h3>fronti\u00e8res de robin<\/h3>\n<ol>\n<li>Utilisez <code>ImplicitRobinSource<\/code> pour le transfert de chaleur par convection et l'\u00e9change de masse.<\/li>\n<li>Utilisez l'approche de divergence <code>FaceVariable<\/code> pour des coefficients variant dans l'espace ou des limites multi-physiques coupl\u00e9es.<\/li>\n<li>Les coefficients de z\u00e9ro sur la face limite par pr\u00e9caution lors de l'utilisation de formulations de flux personnalis\u00e9s.<\/li>\n<li>Surveillez les erreurs de signe et v\u00e9rifiez les cas limitants.<\/li>\n<li>Surveillez l'alias variable. Pr\u00e9f\u00e9rez les expressions masqu\u00e9es telles que <code>D * ~mask<\/code> plut\u00f4t que de muter les variables partag\u00e9es avec <code>setValue()<\/code>.<\/li>\n<\/ol>\n<h2>Comparaison : quand utiliser chaque approche<\/h2>\n<table class=\"custom-table\">\n<tbody><tr>\n<th>Type de limite<\/th>\n<th>cas d'utilisation<\/th>\n<th>Approche FIPY recommand\u00e9e<\/th>\n<th>\u00e9cueil commun<\/th>\n<\/tr>\n<tr>\n<td>P\u00e9riodique, structur\u00e9<\/td>\n<td>Cellules unitaires, RVE, domaines r\u00e9p\u00e9titifs<\/td>\n<td><code>PeriodicGrid1D<\/code>, <code>PeriodicGrid2D<\/code> ou <code>PeriodicGrid3D<\/code><\/td>\n<td>\u00c9tat initial uniforme<\/td>\n<\/tr>\n<tr>\n<td>P\u00e9riodique, complexe<\/td>\n<td>G\u00e9om\u00e9tries arbitraires<\/td>\n<td>Commandes GMS <code>Periodic<\/code><\/td>\n<td>Erreurs d'importation ou de couplage de maillage<\/td>\n<\/tr>\n<tr>\n<td>P\u00e9riodique, variable dans le temps<\/td>\n<td>D\u00e9bits puls\u00e9s ou conditions cycliques<\/td>\n<td>Expression conditionnelle telle que <code>t % N<\/code><\/td>\n<td>Les fonctions Python ne r\u00e9\u00e9valuent pas<\/td>\n<\/tr>\n<tr>\n<td>Sym\u00e9trique<\/td>\n<td>Probl\u00e8mes axisym\u00e9triques ou sym\u00e9trie cristalline<\/td>\n<td><code>faceGrad.constrain(0.0)<\/code><\/td>\n<td><code>r = 0<\/code> Singularit\u00e9 en coordonn\u00e9es cylindriques<\/td>\n<\/tr>\n<tr>\n<td>Robin, convection<\/td>\n<td>Transfert de chaleur ou \u00e9change de masse<\/td>\n<td><code>ImplicitRobinSource<\/code><\/td>\n<td>Signez les erreurs dans le sens du flux<\/td>\n<\/tr>\n<tr>\n<td>Robin, complexe<\/td>\n<td>Coefficients variant spatialement ou couplage multi-physique<\/td>\n<td><code>FaceVariable<\/code> Plus divergence<\/td>\n<td>Probl\u00e8mes d'alias et de convergence variables<\/td>\n<\/tr>\n<\/tbody><\/table>\n<h2>D\u00e9pannage&nbsp;: d\u00e9faillances courantes des conditions aux limites<\/h2>\n<h3>La solution ne change pas<\/h3>\n<p>Si un domaine p\u00e9riodique produit la m\u00eame valeur partout, v\u00e9rifiez la condition initiale. Une condition initiale uniforme n'a pas de gradient, donc la diffusion pure n'a rien \u00e0 \u00e9voluer.<\/p>\n<h3>la valeur limite est erron\u00e9e<\/h3>\n<p>Pour les limites de Robin, v\u00e9rifiez :<\/p>\n<ul>\n<li>Le signe de la direction du flux.<\/li>\n<li>Que vous contraigniez les visages plut\u00f4t que les cellules.<\/li>\n<li>si le coefficient de diffusion a \u00e9t\u00e9 mis \u00e0 z\u00e9ro \u00e0 la limite dans les formulations personnalis\u00e9es.<\/li>\n<\/ul>\n<h3>Le solveur diverge<\/h3>\n<p>Pour les limites de Robin, essayez&nbsp;:<\/p>\n<ul>\n<li>R\u00e9duire <code>dt<\/code> et augmenter la r\u00e9solution.<\/li>\n<li>Ajout d'une \u00e9volution transitoire m\u00eame pour les probl\u00e8mes destin\u00e9s \u00e0 atteindre un \u00e9tat stable.<\/li>\n<li>Utiliser les solveurs PETSC au lieu de simples balayages pour les configurations de limites complexes.<\/li>\n<\/ul>\n<h3>La limite ne se met pas \u00e0 jour<\/h3>\n<p>Pour les limites p\u00e9riodiques d\u00e9pendant du temps, la cause probable est une fonction python utilis\u00e9e \u00e0 la place d'une expression FIPY. Utilisez les objets <code>Variable<\/code> et les masques logiques au lieu des instructions <code>if<\/code> et <code>elif<\/code>.<\/p>\n<h2>Conclusion<\/h2>\n<p>Les conditions aux limites p\u00e9riodiques, sym\u00e9triques et de Robin sont celles o\u00f9 la th\u00e9orie de Fipy rencontre les bords du maillage. Les grilles p\u00e9riodiques g\u00e8rent automatiquement le couplage du visage. Les plans de sym\u00e9trie sont des conditions de Neumann \u00e0 flux z\u00e9ro. Les fronti\u00e8res de Robin combinent les contraintes de valeur et de flux via <code>ImplicitRobinSource<\/code> ou une approche de divergence <code>FaceVariable<\/code>.<\/p>\n<p>L'habitude la plus importante est de v\u00e9rifier les cas limitants. Pour les limites de Robin, v\u00e9rifiez que <code>h \u2192 0<\/code> donne un comportement sans flux et que <code>h \u2192 \u221e<\/code> donne un comportement \u00e0 valeur fixe. Pour les domaines p\u00e9riodiques, v\u00e9rifiez que la condition initiale n'est pas uniforme. Pour les limites sym\u00e9triques, confirmez que le gradient au niveau du plan de sym\u00e9trie est nul.<\/p>\n<p>Ces v\u00e9rifications r\u00e9cup\u00e8rent la plupart des erreurs de condition aux limites avant qu'elles ne deviennent de longues sessions de d\u00e9bogage.<\/p>\n<h2>Guides connexes<\/h2>\n<ul>\n<li><a href=\"\/boundary-conditions-theory-and-implementation-in-fipy\/\">Conditions aux limites&nbsp;: th\u00e9orie et mise en \u0153uvre dans FIPY<\/a> - les fondamentaux de Dirichlet, Neumann et les fronti\u00e8res mixtes.<\/li>\n<li><a href=\"\/working-through-your-first-fipy-example\/\">Travailler dans votre premier exemple FIPY<\/a>&nbsp;: configuration du maillage, variables, \u00e9quations de diffusion et conditions aux limites.<\/li>\n<li><a href=\"\/understanding-fipys-core-architecture\/\">Comprendre l'architecture de base de Fipy<\/a>&nbsp;: variables de la cellule contre le visage, des contraintes de conditions aux limites et de l'assemblage de la matrice.<\/li>\n<li><a href=\"https:\/\/github.com\/usnistgov\/fipy\/discussions\">discussions github de Fipy<\/a> \u2014 Exemples de communaut\u00e9 et d\u00e9pannage.<\/li>\n<\/ul>\n<h2>Prochaines \u00e9tapes<\/h2>\n<ol>\n<li>Commencez par <code>PeriodicGrid1D<\/code> pour un simple domaine p\u00e9riodique 1D.<\/li>\n<li>Ajoutez une d\u00e9pendance temporelle avec des expressions conditionnelles telles que <code>t % N<\/code>.<\/li>\n<li>Pour les limites de Robin, commencez par <code>ImplicitRobinSource<\/code> et v\u00e9rifiez les cas limitants.<\/li>\n<li>D\u00e9placez-vous vers les maillages GMSH pour des g\u00e9om\u00e9tries complexes une fois les cas structur\u00e9s.<\/li>\n<\/ol>\n<p>Pour obtenir de l'aide sur la mise en \u0153uvre des conditions aux limites dans des mod\u00e8les de recherche sp\u00e9cifiques, <a href=\"\/\">visitez notre page d'accueil<\/a> pour consulter des ressources et un soutien au d\u00e9veloppement de Fipy.<\/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\"> 10<\/span> <span class=\"rt-label rt-postfix\">minutes<\/span><\/span>Points \u00e0 retenir cl\u00e9s Les limites p\u00e9riodiques de FIPY sont mises en \u0153uvre de mani\u00e8re plus propre avec les objets PeriodicGrid ou les commandes de maillage p\u00e9riodique GMSH plut\u00f4t qu&rsquo;un couplage manuel. Les limites sym\u00e9triques sont des conditions de Neumann \u00e0 flux z\u00e9ro appliqu\u00e9e aux plans de sym\u00e9trie. Ce n&rsquo;est pas une cat\u00e9gorie FIPY distincte, [&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=351","iawp_total_views":1,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1274","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>Conditions aux limites avanc\u00e9es de FIPY<\/title>\n<meta name=\"description\" content=\"Apprenez des mod\u00e8les FIPY avanc\u00e9s pour les conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin, y compris les sources de P\u00e9riodicGrid, de flux z\u00e9ro et de robin.\" \/>\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\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Conditions aux limites avanc\u00e9es de FIPY\" \/>\n<meta property=\"og:description\" content=\"Apprenez des mod\u00e8les FIPY avanc\u00e9s pour les conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin, y compris les sources de P\u00e9riodicGrid, de flux z\u00e9ro et de robin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:31:31+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=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/\"},\"author\":{\"name\":\"Tomas Delgado\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"headline\":\"Conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin : mod\u00e8les FIPY avanc\u00e9s\",\"datePublished\":\"2026-08-21T14:31:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/\"},\"wordCount\":2488,\"commentCount\":0,\"articleSection\":[\"FIPY : documentation, exemples &amp; D\u00e9veloppement\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/\",\"name\":\"Conditions aux limites avanc\u00e9es de FIPY\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:31:31+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/518cdd1f18dd092f4ed738d68e540061\"},\"description\":\"Apprenez des mod\u00e8les FIPY avanc\u00e9s pour les conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin, y compris les sources de P\u00e9riodicGrid, de flux z\u00e9ro et de robin.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin : mod\u00e8les FIPY avanc\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":"Conditions aux limites avanc\u00e9es de FIPY","description":"Apprenez des mod\u00e8les FIPY avanc\u00e9s pour les conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin, y compris les sources de P\u00e9riodicGrid, de flux z\u00e9ro et de robin.","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\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/","og_locale":"fr_FR","og_type":"article","og_title":"Conditions aux limites avanc\u00e9es de FIPY","og_description":"Apprenez des mod\u00e8les FIPY avanc\u00e9s pour les conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin, y compris les sources de P\u00e9riodicGrid, de flux z\u00e9ro et de robin.","og_url":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:31:31+00:00","author":"Tomas Delgado","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Tomas Delgado","Dur\u00e9e de lecture estim\u00e9e":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/"},"author":{"name":"Tomas Delgado","@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"headline":"Conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin : mod\u00e8les FIPY avanc\u00e9s","datePublished":"2026-08-21T14:31:31+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/"},"wordCount":2488,"commentCount":0,"articleSection":["FIPY : documentation, exemples &amp; D\u00e9veloppement"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/","url":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/","name":"Conditions aux limites avanc\u00e9es de FIPY","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:31:31+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/518cdd1f18dd092f4ed738d68e540061"},"description":"Apprenez des mod\u00e8les FIPY avanc\u00e9s pour les conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin, y compris les sources de P\u00e9riodicGrid, de flux z\u00e9ro et de robin.","breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/periodic-symmetric-robin-boundary-conditions-fipy-patterns\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Conditions aux limites p\u00e9riodiques, sym\u00e9triques et robin : mod\u00e8les FIPY avanc\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\/1274","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=1274"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1274\/revisions"}],"predecessor-version":[{"id":1416,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1274\/revisions\/1416"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1274"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1274"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1274"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}