{"id":1185,"date":"2026-08-21T14:25:39","date_gmt":"2026-08-21T14:25:39","guid":{"rendered":"https:\/\/matforge.org\/?p=1185","raw":"https:\/\/matforge.org\/?p=1185"},"modified":"2026-08-21T14:25:39","modified_gmt":"2026-08-21T14:25:39","slug":"code-coupling-precice-multi-physics-python","status":"publish","type":"post","link":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/","title":{"rendered":"Couplage de code avec precice : simulations multi-physiques en Python","raw":"Couplage de code avec precice : simulations multi-physiques en Python"},"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>tl;dr<\/h2>\n<p>Les simulations multi-physiques n\u00e9cessitent souvent un couplage de plusieurs solveurs sp\u00e9cialis\u00e9s. Precice est une biblioth\u00e8que de couplage open-source mature qui permet des simulations multi-physiques partitionn\u00e9es en Python. Ce didacticiel montre comment coupler Fipy avec un autre solveur utilisant Precice, couvrant l&rsquo;installation, la mise en \u0153uvre de l&rsquo;adaptateur, la configuration et les pi\u00e8ges courants. Vous apprendrez quand utiliser le couplage partitionn\u00e9, comment configurer l&rsquo;\u00e9change de donn\u00e9es et comment d\u00e9boguer les probl\u00e8mes typiques.<\/p>\n<h2>Introduction&nbsp;: lorsqu&rsquo;un solveur ne suffit pas<\/h2>\n<p>De nombreux probl\u00e8mes scientifiques impliquent plusieurs processus physiques qui interagissent. Par exemple :<\/p>\n<ul>\n<li>Transfert de chaleur coupl\u00e9 \u00e0 un d\u00e9bit de fluide (transfert de chaleur conjugu\u00e9)<\/li>\n<li>M\u00e9canique structurelle interagissant avec la dynamique des fluides (interaction fluide-structure)<\/li>\n<li>\u00c9lectrochimie coupl\u00e9e \u00e0 des ph\u00e9nom\u00e8nes de transport (mod\u00e9lisation de la batterie)<\/li>\n<\/ul>\n<p>FIPY excelle dans la r\u00e9solution d&rsquo;\u00e9quations aux d\u00e9riv\u00e9es partielles (EDP) pour les probl\u00e8mes de transport, de diffusion et de champ de phase. Cependant, certains sc\u00e9narios multi-physiques n\u00e9cessitent un couplage de FIPY avec un solveur sp\u00e9cialis\u00e9 pour un autre domaine physique, comme OpenFoam pour la dynamique des fluides ou un code structurel personnalis\u00e9.<\/p>\n<p><strong>Le couplage de code<\/strong> est la pratique de connecter deux ou plusieurs codes de simulation ind\u00e9pendants afin qu&rsquo;ils \u00e9changent des donn\u00e9es pendant le calcul. C&rsquo;est l\u00e0 qu&rsquo;intervient <strong>pr\u00e9cise<\/strong> (infrastructure de couplage cloisonn\u00e9e pour les \u00e9quations du continuum).<\/p>\n<h3>Pourquoi utiliser Precice ?<\/h3>\n<p>Pr\u00e9cis fournit :<\/p>\n<ul>\n<li><strong>Couplage agnostique-langue<\/strong>&nbsp;: connectez les solveurs \u00e9crits en C++, Python, Fortran, etc.<\/li>\n<li><strong>Mappage de donn\u00e9es flexibles<\/strong>&nbsp;: G\u00e9rer l&rsquo;interpolation maillage \u00e0 maillage entre des grilles non correspondantes<\/li>\n<li><strong>Coordination de pas de temps<\/strong>&nbsp;: prend en charge les sch\u00e9mas de couplage explicites, implicites et quasi-newton<\/li>\n<li><strong>\u00c9volutivit\u00e9 parall\u00e8le<\/strong>&nbsp;: con\u00e7ue pour les environnements de calcul hautes performances<\/li>\n<li><strong>Communaut\u00e9 active<\/strong>&nbsp;: utilis\u00e9 dans la recherche et l&rsquo;industrie, avec une bonne documentation<\/li>\n<\/ul>\n<p>Pour les utilisateurs de Fipy, Precice ouvre la porte \u00e0 des flux de travail multi-physiques robustes sans cr\u00e9er d&rsquo;infrastructure de couplage \u00e0 partir de z\u00e9ro.<\/p>\n<h3>Partitions VS Solveurs monolithiques<\/h3>\n<p>Avant de plonger, comprenez les deux principales approches de la multi-physique :<\/p>\n<table>\n<thead>\n<tr>\n<th>aspect<\/th>\n<th>partitionn\u00e9 (pr\u00e9cision)<\/th>\n<th>Monolithique<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>structure<\/strong><\/td>\n<td>Solveurs s\u00e9par\u00e9s coupl\u00e9s via un \u00e9change de donn\u00e9es<\/td>\n<td>Un seul solveur g\u00e8re toute la physique ensemble<\/td>\n<\/tr>\n<tr>\n<td><strong>R\u00e9utilisation du code<\/strong><\/td>\n<td>\u00c9lev\u00e9 \u2013 Utilisez des solveurs sp\u00e9cialis\u00e9s existants<\/td>\n<td>Faible \u2013 Besoin de mise en \u0153uvre unifi\u00e9e<\/td>\n<\/tr>\n<tr>\n<td><strong>effort de d\u00e9veloppement<\/strong><\/td>\n<td>Mod\u00e9r\u00e9 \u2013 \u00c9crire des adaptateurs, configurer le couplage<\/td>\n<td>Tr\u00e8s \u00e9lev\u00e9 \u2013 impl\u00e9mentez toute la physique dans un seul code<\/td>\n<\/tr>\n<tr>\n<td><strong>Performances<\/strong><\/td>\n<td>Bien, mais surcharge de communication<\/td>\n<td>Potentiellement mieux pour les probl\u00e8mes \u00e9troitement coupl\u00e9s<\/td>\n<\/tr>\n<tr>\n<td><strong>Flexibilit\u00e9<\/strong><\/td>\n<td>Echange ou mise \u00e0 niveau des solveurs individuels faciles<\/td>\n<td>Rigide \u2013 Les modifications affectent toute la base de code<\/td>\n<\/tr>\n<tr>\n<td><strong>Cas d&rsquo;utilisation<\/strong><\/td>\n<td>Des solveurs matures existent pour chaque physique<\/td>\n<td>Mod\u00e8les physiques nouveaux ou hautement int\u00e9gr\u00e9s<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Quand choisir un couplage partitionn\u00e9 avec Precice&nbsp;:<\/strong><\/p>\n<ul>\n<li>Vous disposez de solveurs fiables et optimis\u00e9s pour la physique individuelle (par exemple, FIPY pour diffusion, OpenFoam pour Flow)<\/li>\n<li>Les physiques sont coupl\u00e9es de mani\u00e8re l\u00e2che ou mod\u00e9r\u00e9e<\/li>\n<li>Vous souhaitez tirer parti des bases de code et des communaut\u00e9s existantes<\/li>\n<li>Vous avez besoin de flexibilit\u00e9 pour essayer diff\u00e9rentes combinaisons de solveurs<\/li>\n<\/ul>\n<p><strong>Quand monolithique pourrait \u00eatre meilleur&nbsp;:<\/strong><\/p>\n<ul>\n<li>Couplage extr\u00eamement serr\u00e9 n\u00e9cessitant un traitement implicite au niveau de l&rsquo;alg\u00e8bre lin\u00e9aire<\/li>\n<li>Simulations HPC critiques pour les performances o\u00f9 la surcharge de communication est inacceptable<\/li>\n<li>Tr\u00e8s nouvelle physique o\u00f9 il n&rsquo;existe pas encore de solveur sp\u00e9cialis\u00e9<\/li>\n<\/ul>\n<p>Pour de nombreuses applications de recherche, <strong>Couplet cloisonn\u00e9 avec precice est le choix pragmatique<\/strong>.<\/p>\n<h2>Aper\u00e7u conceptuel : Comment fonctionne Precice<\/h2>\n<p>Precice suit une architecture <strong>client-server<\/strong>&nbsp;:<\/p>\n<ol>\n<li><strong>Solver A<\/strong> (par exemple, Fipy) s&rsquo;ex\u00e9cute en tant que <strong>Client de precision<\/strong><\/li>\n<li><strong>Le solveur B<\/strong> (un autre code) s&rsquo;ex\u00e9cute comme un autre <strong>Client de precis<\/strong><\/li>\n<li><strong>Precice<\/strong> s&rsquo;ex\u00e9cute comme un processus distinct (le <strong>service de couplage<\/strong>) qui g\u00e8re la communication et la cartographie des donn\u00e9es<\/li>\n<li>Au niveau des interfaces de couplage, les solveurs \u00e9changent des donn\u00e9es de limites (p. ex., temp\u00e9rature, flux de chaleur, vitesse) \u00e0 travers<\/li>\n<li>PRECICE g\u00e8re&nbsp;:\n<ul>\n<li>Mappage de maillage lorsque les maillages d&rsquo;interface ne correspondent pas<\/li>\n<li>Synchronisation du pas de temps<\/li>\n<li>D\u00e9tentation et sous-relaxation des donn\u00e9es pour am\u00e9liorer la convergence<\/li>\n<li>Sch\u00e9mas de couplage (explicite, implicite, quasi-newton)<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>L&rsquo;avantage cl\u00e9 : chaque solveur reste inconscient des d\u00e9tails internes de l&rsquo;autre. Ils n&rsquo;ont qu&rsquo;\u00e0 savoir comment envoyer\/recevoir des donn\u00e9es \u00e0 leur limite via l&rsquo;API de Precice.<\/p>\n<h2>Les pr\u00e9requis<\/h2>\n<p>Avant de commencer, assurez-vous d&rsquo;avoir :<\/p>\n<ul>\n<li><strong>Fipy install\u00e9<\/strong> et fonctionnant (voir <a href=\"https:\/\/matforge.org\/installing-and-setting-up-fipy-for-the-first-time\/\">Installer et configurer Fipy pour la premi\u00e8re fois<\/a> pour le guidage de la configuration)<\/li>\n<li><strong>Exp\u00e9rience de programmation Python<\/strong> avec Fipy (familiarit\u00e9 avec <a href=\"https:\/\/matforge.org\/what-is-fipy-and-when-should-you-use-it\/\">Concepts de base de Fipy<\/a>)<\/li>\n<li><strong>Un deuxi\u00e8me solveur<\/strong> pr\u00eat pour le couplage (ce didacticiel utilise un simple solveur Python comme entr\u00e9e en fonction, mais le m\u00eame mod\u00e8le fonctionne avec OpenFoam,Calculix ou d&rsquo;autres codes compatibles avec Precice)<\/li>\n<li><strong>Pr\u00e9cision install\u00e9e<\/strong> sur votre syst\u00e8me (voir <a href=\"https:\/\/precice.org\/installation-overview.html\">Guide d&rsquo;installation de Precice<\/a>)<\/li>\n<li><strong>Comprendre les donn\u00e9es de base du multi-physique<\/strong> (Examen <a href=\"https:\/\/matforge.org\/what-is-scientific-simulation-and-why-it-matters\/\">Qu&rsquo;est-ce que la simulation scientifique et pourquoi cela est important<\/a> n\u00e9cessaire)<\/li>\n<\/ul>\n<h2>\u00c9tape&nbsp;1&nbsp;: Installez les fixations Python Python<\/h2>\n<p>Precice fournit des liaisons Python afin que Fipy (ou tout code Python) puisse agir en tant que client de couplage.<\/p>\n<pre><code class=\"language-bash\"># Using conda (recommended)\nconda install -c conda-forge precice\n\n# Or using pip\npip install precice\n<\/code><\/pre>\n<p>V\u00e9rifiez l&rsquo;installation&nbsp;:<\/p>\n<pre><code class=\"language-bash\">python -c \"import precice; print('preCICE Python version:', precice.__version__)\"\n<\/code><\/pre>\n<p>Vous devriez voir la version de pr\u00e9cision imprim\u00e9e sans erreur.<\/p>\n<h2>\u00c9tape&nbsp;2&nbsp;: Concevez votre interface de couplage<\/h2>\n<p>Identifiez <strong>o\u00f9<\/strong> les deux solveurs interagissent. Sc\u00e9narios courants&nbsp;:<\/p>\n<ul>\n<li><strong>Domaine de Fipy<\/strong> \u2192 Champ de temp\u00e9rature<\/li>\n<li><strong>Autre domaine du solveur<\/strong> \u2192 Flux de chaleur ou temp\u00e9rature<\/li>\n<\/ul>\n<p>D\u00e9finir&nbsp;:<\/p>\n<ul>\n<li><strong>Maille d&rsquo;interface<\/strong> de chaque c\u00f4t\u00e9 (peut-\u00eatre diff\u00e9rent)<\/li>\n<li><strong>Donn\u00e9es de couplage<\/strong>&nbsp;: quelles quantit\u00e9s sont \u00e9chang\u00e9es (par exemple, <code>Temperature<\/code>, <code>Heat-Flux<\/code>)<\/li>\n<li><strong>Mesh Scaling<\/strong>&nbsp;: s&rsquo;assurer que les syst\u00e8mes de coordonn\u00e9es s&rsquo;alignent<\/li>\n<\/ul>\n<p>Pour ce didacticiel, nous allons coupler un solveur <strong>FIPY Heat Diffusion<\/strong> avec un solveur <strong>Simple Python Convective Cooling<\/strong>. L&rsquo;interface est une ligne 1D o\u00f9 la temp\u00e9rature et le flux de chaleur sont \u00e9chang\u00e9s.<\/p>\n<h2>\u00c9tape&nbsp;3&nbsp;: \u00c9crivez l&rsquo;adaptateur Fipy Precice<\/h2>\n<p>Le <strong>Adaptateur<\/strong> est le code qui relie votre solveur (FIPY) \u00e0 Precice. Il g\u00e8re :<\/p>\n<ul>\n<li>Initialisation de la connexion de pr\u00e9cision<\/li>\n<li>D\u00e9finir le maillage de l&rsquo;interface de couplage<\/li>\n<li>Lecture des donn\u00e9es entrantes de l&rsquo;autre solveur<\/li>\n<li>\u00c9crire des donn\u00e9es sortantes \u00e0 envoyer<\/li>\n<li>Avancement du pas de temps de couplage<\/li>\n<\/ul>\n<p>Cr\u00e9er un fichier <code>fipy_precice_adapter.py<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-python\">import numpy as np\nfrom fipy import CellVariable, Grid1D, DiffusionTerm, TransientTerm\nimport precice\n\n# --- Configuration ---\n# These should match the preCICE configuration file\nCOUPLING_INTERFACE = \"Fluid-Solid\"  # Name of the coupling interface\nCOUPLING_MESH_ID = 0  # ID of the mesh on this solver side\nCOUPLING_DATA_TEMPERATURE_ID = 0\nCOUPLING_DATA_HEATFLUX_ID = 1\n\n# Simulation parameters\nnx = 50\ndx = 1.0\ntotal_time = 10.0\ndt = 0.1\n\n# --- FiPy setup ---\nmesh = Grid1D(nx=nx, dx=dx)\nT = CellVariable(name=\"Temperature\", mesh=mesh, value=300.0)  # Initial temp in K\nk = 1.0  # Thermal conductivity\n\n# Boundary conditions\n# Left boundary: fixed temperature (will be overwritten by coupling)\n# Right boundary: fixed temperature (example)\nT.constrain(300.0, mesh.facesRight)\n\n# Equation: transient diffusion\neq = TransientTerm() == DiffusionTerm(coeff=k)\n\n# --- preCICE setup ---\nsolver_name = \"FiPy-Solver\"\nconfig_file = \"precice-config.xml\"  # Provided separately\n\nprecice_dll = precice.Participant(solver_name, config_file, 0, 0)\n\n# Get the coupling mesh from preCICE\nmesh_vertices = precice_dll.get_mesh_vertices(COUPLING_MESH_ID, COUPLING_INTERFACE)\n# In 1D, mesh_vertices is an array of x-coordinates\n# We'll map these to our FiPy mesh cells\n\n# Main coupling loop\ntime = 0.0\nwhile time &lt; total_time:\n    # 1. Advance FiPy one time step (without coupling first)\n    eq.solve(var=T, dt=dt)\n    \n    # 2. Read incoming data from the other solver (e.g., heat flux)\n    # preCICE expects data at the coupling interface vertices\n    heat_flux_in = precice_dll.read_data(\n        COUPLING_DATA_HEATFLUX_ID,\n        COUPLING_INTERFACE,\n        mesh_vertices\n    )\n    \n    # 3. Apply received heat flux as Neumann boundary condition on FiPy\n    # This is simplified: in practice you'd map heat_flux_in to FiPy faces\n    # For 1D, we can directly apply to left boundary\n    if len(heat_flux_in) &gt; 0:\n        # Neumann BC: -k * dT\/dx = heat_flux\n        # In FiPy, you can set flux via constrained faces\n        # For simplicity, we'll adjust the left boundary value to mimic flux\n        # A proper implementation would use a FluxBoundaryCondition\n        pass  # Implementation depends on exact boundary treatment\n    \n    # 4. Write outgoing data (temperature) to send to the other solver\n    # Extract temperature at coupling interface cells\n    T_interface = T.value  # In practice, sample at interface mesh locations\n    precice_dll.write_data(\n        COUPLING_DATA_TEMPERATURE_ID,\n        COUPLING_INTERFACE,\n        T_interface[:len(mesh_vertices)]  # ensure matching size\n    )\n    \n    # 5. Advance coupling\n    precice_dll.advance(dt)\n    \n    time += dt\n    print(f\"Time: {time:.2f}, Max T: {T.max():.2f}, Min T: {T.min():.2f}\")\n\nprecice_dll.finalize()\n<\/code><\/pre>\n<p><strong>Notes importantes&nbsp;:<\/strong><\/p>\n<ul>\n<li>Il s&rsquo;agit d&rsquo;un <strong>exemple minimal<\/strong>. Les impl\u00e9mentations r\u00e9elles n\u00e9cessitent un mappage de maillage et une application de conditions aux limites.<\/li>\n<li>Le fichier <code>precice-config.xml<\/code> d\u00e9finit les param\u00e8tres de communication, les ID de maillage et les ID de donn\u00e9es. Voir \u00e9tape 4.<\/li>\n<li>La mise \u00e0 jour des conditions aux limites de FIPY est simplifi\u00e9e ; Pour une utilisation en production, impl\u00e9mentez Neumann BC appropri\u00e9 via <code>FaceVariable<\/code> ou une contrainte personnalis\u00e9e.<\/li>\n<\/ul>\n<h2>\u00c9tape&nbsp;4&nbsp;: Cr\u00e9ez le fichier de configuration de prix<\/h2>\n<p>Precice utilise un fichier de configuration XML (<code>precice-config.xml<\/code>) qui d\u00e9finit&nbsp;:<\/p>\n<ul>\n<li>Participants (solveurs)<\/li>\n<li>Interfaces de couplage<\/li>\n<li>D\u00e9finitions de maillage et de donn\u00e9es<\/li>\n<li>Param\u00e8tres de communication<\/li>\n<li>Sch\u00e9ma de couplage (explicite, implicite, quasi-newton)<\/li>\n<\/ul>\n<p>Une configuration minimale pour le couplage FIPY + Python :<\/p>\n<pre><code class=\"language-xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;precice-configuration&gt;\n  &lt;schema&gt;https:\/\/precice.org\/schemas\/coupling-schema-2.2.xsd&lt;\/schema&gt;\n\n  &lt;!-- Parallel settings --&gt;\n  &lt;parallel&gt;\n    &lt;exchange comm-world=\"true\" \/&gt;\n  &lt;\/parallel&gt;\n\n  &lt;!-- Coupling participants --&gt;\n  &lt;participants&gt;\n    &lt;participant name=\"FiPy-Solver\"&gt;\n      &lt;use-mesh name=\"Fluid-Solid-Mesh-FiPy\" provide=\"true\" \/&gt;\n      &lt;use-data name=\"Temperature\" from=\"FiPy-Solver\" \/&gt;\n      &lt;use-data name=\"Heat-Flux\" to=\"FiPy-Solver\" \/&gt;\n    &lt;\/participant&gt;\n    &lt;participant name=\"SimpleSolver\"&gt;\n      &lt;use-mesh name=\"Fluid-Solid-Mesh-Simple\" provide=\"true\" \/&gt;\n      &lt;use-data name=\"Temperature\" to=\"SimpleSolver\" \/&gt;\n      &lt;use-data name=\"Heat-Flux\" from=\"SimpleSolver\" \/&gt;\n    &lt;\/participant&gt;\n  &lt;\/participants&gt;\n\n  &lt;!-- Coupling interfaces --&gt;\n  &lt;coupling-scheme:serial-explicit&gt;\n    &lt;participants first=\"FiPy-Solver\" second=\"SimpleSolver\" \/&gt;\n    &lt;exchange&gt;\n      &lt;data name=\"Temperature\" mesh=\"Fluid-Solid-Mesh-FiPy\" \/&gt;\n      &lt;data name=\"Heat-Flux\" mesh=\"Fluid-Solid-Mesh-Simple\" \/&gt;\n    &lt;\/exchange&gt;\n    &lt;max-time&gt;10.0&lt;\/max-time&gt;\n    &lt;max-iterations&gt;10&lt;\/max-iterations&gt;\n  &lt;\/coupling-scheme:serial-explicit&gt;\n\n  &lt;!-- Meshes --&gt;\n  &lt;mesh name=\"Fluid-Solid-Mesh-FiPy\" from=\"FiPy-Solver\" \/&gt;\n  &lt;mesh name=\"Fluid-Solid-Mesh-Simple\" from=\"SimpleSolver\" \/&gt;\n\n  &lt;!-- Data --&gt;\n  &lt;data name=\"Temperature\" mesh=\"Fluid-Solid-Mesh-FiPy\" \/&gt;\n  &lt;data name=\"Heat-Flux\" mesh=\"Fluid-Solid-Mesh-Simple\" \/&gt;\n\n&lt;\/precice-configuration&gt;\n<\/code><\/pre>\n<p>\u00c9l\u00e9ments cl\u00e9s&nbsp;:<\/p>\n<ul>\n<li>Deux participants : <code>FiPy-Solver<\/code> et <code>SimpleSolver<\/code><\/li>\n<li>\u00c9change de donn\u00e9es : <code>Temperature<\/code> (FIPY \u2192 SimpleSolver) et <code>Heat-Flux<\/code> (SimpleSolver \u2192 FIPY)<\/li>\n<li><code>serial-explicit<\/code> Couplage&nbsp;: pas de temps simple explicite (bon pour d\u00e9marrer)<\/li>\n<li><code>max-iterations<\/code> contr\u00f4le le nombre de sous-it\u00e9rations par pas de temps (pour les sch\u00e9mas implicites)<\/li>\n<\/ul>\n<p>Pour un couplage plus avanc\u00e9, pensez \u00e0 :<\/p>\n<ul>\n<li><code>serial-implicit<\/code> avec acc\u00e9l\u00e9ration quasi-newton pour un couplage plus serr\u00e9<\/li>\n<li>Facteurs de sous-relaxation pour am\u00e9liorer la convergence<\/li>\n<li>D\u00e9finitions de connectivit\u00e9 de maillage si les maillages ne sont pas align\u00e9s<\/li>\n<\/ul>\n<h2>\u00c9tape&nbsp;5&nbsp;: Impl\u00e9mentez le deuxi\u00e8me solveur (exemple simple)<\/h2>\n<p>Pour tester le couplage, vous avez besoin d&rsquo;un deuxi\u00e8me solveur. Voici un solveur Python minimal qui \u00e9change le flux de chaleur avec Fipy :<\/p>\n<p><code>solver_simple.py<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-python\">import numpy as np\nimport precice\n\n# Configuration\nCOUPLING_INTERFACE = \"Fluid-Solid\"\nCOUPLING_MESH_ID = 0\nCOUPLING_DATA_TEMPERATURE_ID = 0\nCOUPLING_DATA_HEATFLUX_ID = 1\n\nsolver_name = \"SimpleSolver\"\nconfig_file = \"precice-config.xml\"\n\nprecice_dll = precice.Participant(solver_name, config_file, 0, 0)\n\n# Simple 1D mesh (could be completely different from FiPy's mesh)\nmesh_vertices = np.array([[0.0], [1.0]])  # Two points at interface\nT_interface = np.array([300.0, 300.0])    # Initial guess\n\ntotal_time = 10.0\ndt = 0.1\ntime = 0.0\n\nwhile time &lt; total_time:\n    # 1. Read incoming temperature from FiPy\n    T_from_fipy = precice_dll.read_data(\n        COUPLING_DATA_TEMPERATURE_ID,\n        COUPLING_INTERFACE,\n        mesh_vertices\n    )\n    \n    # 2. Compute outgoing heat flux (simple Newton's law of cooling)\n    # q = h * (T_fluid - T_solid)\n    h = 10.0  # Heat transfer coefficient\n    T_fluid = 350.0  # Ambient fluid temperature\n    heat_flux = h * (T_fluid - T_from_fipy.mean())\n    \n    # Send same flux to all interface vertices (simplified)\n    heat_flux_out = np.full_like(T_from_fipy, heat_flux)\n    \n    # 3. Write heat flux to send to FiPy\n    precice_dll.write_data(\n        COUPLING_DATA_HEATFLUX_ID,\n        COUPLING_INTERFACE,\n        heat_flux_out\n    )\n    \n    # 4. Advance coupling\n    precice_dll.advance(dt)\n    \n    time += dt\n    print(f\"[SimpleSolver] Time: {time:.2f}, T_fipy: {T_from_fipy.mean():.2f}, q: {heat_flux:.2f}\")\n\nprecice_dll.finalize()\n<\/code><\/pre>\n<p>Ce simple solveur repr\u00e9sente un environnement de refroidissement convectif qui applique un flux de chaleur proportionnel \u00e0 la diff\u00e9rence de temp\u00e9rature par rapport au solide FIPY.<\/p>\n<h2>\u00c9tape&nbsp;6&nbsp;: Ex\u00e9cutez la simulation coupl\u00e9e<\/h2>\n<ol>\n<li>D\u00e9marrez les deux solveurs <strong>simultan\u00e9ment<\/strong> (le precice g\u00e8re leur communication):<\/li>\n<\/ol>\n<pre><code class=\"language-bash\"># Terminal 1\npython fipy_precice_adapter.py &amp;\n\n# Terminal 2\npython solver_simple.py &amp;\n<\/code><\/pre>\n<ol start=\"2\">\n<li>Regardez la sortie. Vous devriez voir l&rsquo;\u00e9volution du temps dans les solveurs et les valeurs de flux de temp\u00e9rature\/chaleur \u00e9voluant.<\/li>\n<li>La simulation se termine lorsque <code>total_time<\/code> est atteint ou que le sch\u00e9ma de couplage est termin\u00e9.<\/li>\n<\/ol>\n<p><strong>Comportement attendu&nbsp;:<\/strong><\/p>\n<ul>\n<li>La temp\u00e9rature de Fipy devrait progressivement diminuer de 300&nbsp;K initiaux \u00e0 la courbe de refroidissement<\/li>\n<li>Le flux de chaleur de SimpleSolver doit \u00eatre positif (chaleur en laissant FIPY)<\/li>\n<li>Les deux solveurs doivent rester synchronis\u00e9s dans le temps<\/li>\n<\/ul>\n<h2>\u00c9tape&nbsp;7&nbsp;: Visualisez les r\u00e9sultats<\/h2>\n<p>Apr\u00e8s avoir ex\u00e9cut\u00e9, vous pouvez tracer le profil de temp\u00e9rature de Fipy&nbsp;:<\/p>\n<pre><code class=\"language-python\">import matplotlib.pyplot as plt\nfrom fipy import Grid1D, CellVariable, DiffusionTerm\n\n# Re-run simulation while storing history\n# (or modify the adapter to save snapshots to file)\n# Then plot T vs x at final time\n<\/code><\/pre>\n<h2>D\u00e9pannage&nbsp;: probl\u00e8mes et solutions courants<\/h2>\n<table>\n<thead>\n<tr>\n<th>Sympt\u00f4me<\/th>\n<th>cause probable<\/th>\n<th>Solution<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>precice: error: XML file not found<\/code><\/td>\n<td>Chemin de configuration manquant ou incorrect<\/td>\n<td>Assurez-vous que <code>precice-config.xml<\/code> est dans le r\u00e9pertoire de travail ou fournit un chemin complet<\/td>\n<\/tr>\n<tr>\n<td><code>Mesh vertex count mismatch<\/code><\/td>\n<td>Les maillages d&rsquo;interface Fipy et Precice ont des nombres diff\u00e9rents de sommets<\/td>\n<td>cochez <code>get_mesh_vertices()<\/code> renvoie le nombre attendu&nbsp;; Mapper correctement<\/td>\n<\/tr>\n<tr>\n<td><code>Data not found in configuration<\/code><\/td>\n<td>Le nom ou l&rsquo;ID des donn\u00e9es ne correspond pas au XML<\/td>\n<td>V\u00e9rifier <code>COUPLING_DATA_*<\/code> Les constantes correspondent aux entr\u00e9es <code>&lt;data name=\"...\"&gt;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>Coupling diverges (temperatures explode)<\/code><\/td>\n<td>Sous-relaxation n\u00e9cessaire ou sch\u00e9ma explicite instable<\/td>\n<td>Ajouter <code>&lt;relaxation value=\"0.5\"\/&gt;<\/code> en XML ou passer au couplage implicite<\/td>\n<\/tr>\n<tr>\n<td><code>Time step mismatch<\/code><\/td>\n<td>Les solveurs utilisent diff\u00e9rentes valeurs <code>dt<\/code><\/td>\n<td>Assurez-vous que les deux utilisent le m\u00eame <code>dt<\/code> ou laissez le temps de contr\u00f4le de pr\u00e9cision (<code>precice_dll.advance(dt)<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><code>Segmentation fault in preCICE<\/code><\/td>\n<td>Versions de prix incompatibles entre les participants<\/td>\n<td>R\u00e9installez Precice pour vous assurer que tous les participants utilisent la m\u00eame version<\/td>\n<\/tr>\n<tr>\n<td><code>FiPy boundary not updating<\/code><\/td>\n<td>L&rsquo;adaptateur n&rsquo;applique pas correctement le flux re\u00e7u<\/td>\n<td>Impl\u00e9menter la condition limite appropri\u00e9e de Neumann en utilisant <code>FaceVariable<\/code> ou modifier le terme source d&rsquo;\u00e9quation<\/td>\n<\/tr>\n<tr>\n<td><code>Communication timeout<\/code><\/td>\n<td>Un solveur s&rsquo;est \u00e9cras\u00e9 ou bloqu\u00e9<\/td>\n<td>V\u00e9rifiez que les deux solveurs sont en cours d&rsquo;ex\u00e9cution&nbsp;; V\u00e9rifiez qu&rsquo;ils appellent <code>advance()<\/code> r\u00e9guli\u00e8rement<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Conseils de d\u00e9bogage&nbsp;:<\/strong><\/p>\n<ul>\n<li>Ex\u00e9cutez les solveurs avec <code>PRECICE_DEBUG=1<\/code> Variable d&rsquo;environnement pour les journaux verbeux<\/li>\n<li>Commencez avec un maillage grossier et un temps total court pour tester rapidement<\/li>\n<li>Utilisez <code>serial-explicit<\/code> le couplage en premier (le plus indulgent) avant d&rsquo;essayer des sch\u00e9mas implicites<\/li>\n<li>Validez chaque solveur <strong>sans couplage<\/strong> pour vous assurer qu&rsquo;ils fonctionnent de mani\u00e8re autonome<\/li>\n<\/ul>\n<h2>Sujets avanc\u00e9s<\/h2>\n<p>Une fois que le couplage de base fonctionne, explorez :<\/p>\n<h3>Couplage implicite avec Quasi-Newton<\/h3>\n<p>Pour les probl\u00e8mes \u00e9troitement coupl\u00e9s, les sch\u00e9mas explicites peuvent n\u00e9cessiter de nombreuses sous-it\u00e9rations ou devenir instables. Precice prend en charge les <strong>couplage implicite<\/strong> avec une acc\u00e9l\u00e9ration quasi-newton&nbsp;:<\/p>\n<pre><code class=\"language-xml\">&lt;coupling-scheme:serial-implicit&gt;\n  &lt;participants first=\"FiPy-Solver\" second=\"SimpleSolver\" \/&gt;\n  &lt;exchange&gt;\n    &lt;data name=\"Temperature\" mesh=\"Fluid-Solid-Mesh-FiPy\" \/&gt;\n    &lt;data name=\"Heat-Flux\" mesh=\"Fluid-Solid-Mesh-Simple\" \/&gt;\n  &lt;\/exchange&gt;\n  &lt;max-time&gt;10.0&lt;\/max-time&gt;\n  &lt;max-iterations&gt;10&lt;\/max-iterations&gt;\n  &lt;convergence-measure&gt;\n    &lt;data name=\"Temperature\" mesh=\"Fluid-Solid-Mesh-FiPy\" \/&gt;\n  &lt;\/convergence-measure&gt;\n  &lt;relaxation value=\"0.5\"\/&gt;\n&lt;\/coupling-scheme:serial-implicit&gt;\n<\/code><\/pre>\n<h3>Mappage maillage vers maillage<\/h3>\n<p>Si le maillage d&rsquo;interface de Fipy ne correspond pas au maillage de l&rsquo;autre solveur, Precice effectue <strong>Mappage de maillage<\/strong> (interpolation). Vous pouvez configurer la m\u00e9thode de mappage en XML&nbsp;:<\/p>\n<pre><code class=\"language-xml\">&lt;mesh name=\"Fluid-Solid-Mesh-FiPy\" from=\"FiPy-Solver\"&gt;\n  &lt;use-data name=\"Temperature\" \/&gt;\n  &lt;mapping:nearest-neighbor \/&gt;\n&lt;\/mesh&gt;\n<\/code><\/pre>\n<p>Options : <code>nearest-neighbor<\/code>, <code>linear<\/code>, <code>rbf<\/code> (fonctions de base radiale). Choisissez en fonction de la qualit\u00e9 du maillage et de la physique.<\/p>\n<h3>Gestion des pas de temps non-correspondants<\/h3>\n<p>Precice permet \u00e0 chaque solveur d&rsquo;utiliser son propre pas de temps tout en coordonnant les interfaces de couplage. d\u00e9finir <code>dt<\/code> ind\u00e9pendamment dans chaque solveur&nbsp;; Precice interpolera les donn\u00e9es au besoin. Cependant, de grandes diff\u00e9rences peuvent r\u00e9duire la pr\u00e9cision.<\/p>\n<h2>Consid\u00e9rations relatives aux performances<\/h2>\n<ul>\n<li><strong>Frais g\u00e9n\u00e9raux de communication<\/strong> peuvent dominer pour les petits probl\u00e8mes. Profile to ensure coupling isn&rsquo;t the bottleneck.<\/li>\n<li><strong>Under-relaxation<\/strong> (<code>&lt;relaxation&gt;<\/code> en XML) am\u00e9liore la stabilit\u00e9 mais ralentit la convergence.<\/li>\n<li><strong>r\u00e9solution de maillage<\/strong> sur l&rsquo;interface affecte la pr\u00e9cision de la cartographie. Utilisez des maillages d&rsquo;interface suffisamment raffin\u00e9s.<\/li>\n<li><strong>\u00c9chelle parall\u00e8le<\/strong>&nbsp;: Precice fonctionne avec les solveurs compatibles MPI. Assurez-vous que Fipy (avec PETSC) et l&rsquo;autre solveur s&rsquo;ex\u00e9cutent en parall\u00e8le si n\u00e9cessaire.<\/li>\n<\/ul>\n<h2>Prochaines \u00e9tapes<\/h2>\n<p>Apr\u00e8s avoir ma\u00eetris\u00e9 le couplage de base :<\/p>\n<ol>\n<li><strong>Essayez un v\u00e9ritable deuxi\u00e8me solveur<\/strong> (par exemple, OpenFoam pour le flux de fluide) au lieu de l&rsquo;espace r\u00e9serv\u00e9 Python<\/li>\n<li><strong>Explorer les sch\u00e9mas de couplage avanc\u00e9s<\/strong> (<code>serial-implicit<\/code>, <code>multi<\/code>)<\/li>\n<li><strong>Ajouter plus de physique<\/strong> (par exemple, coupler trois solveurs&nbsp;: thermique, fluide, structurel)<\/li>\n<li><strong>Mettre en place des conditions aux limites appropri\u00e9es<\/strong> dans FIPY en utilisant <code>FaceVariable<\/code> ou des termes personnalis\u00e9s<\/li>\n<li><strong>Optimisez les performances<\/strong> avec une ex\u00e9cution et un profilage parall\u00e8les<\/li>\n<li><strong>\u00c9tude de cas<\/strong> comme le couplage thermique-fluide ou l&rsquo;interaction fluide-structure<\/li>\n<\/ol>\n<p>Pour des connaissances approfondies de FIPY, consultez <a href=\"https:\/\/matforge.org\/from-equations-to-simulations-the-modeling-pipeline\/\">De \u00e9quations aux simulations&nbsp;: le pipeline de mod\u00e9lisation<\/a> et <a href=\"https:\/\/matforge.org\/finite-volume-method-explained-simply\/\">m\u00e9thode de volume fini expliqu\u00e9e simplement<\/a>.<\/p>\n<h2>Lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/matforge.org\/what-is-fipy-and-when-should-you-use-it\/\">Qu&rsquo;est-ce que FIPY et quand devriez-vous l&rsquo;utiliser&nbsp;?<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/installing-and-setting-up-fipy-for-the-first-time\/\">Installer et configurer Fipy pour la premi\u00e8re fois<\/a><\/strong>&nbsp;\u2013&nbsp;Configuration et d\u00e9pannage de l&rsquo;environnement<\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/what-is-scientific-simulation-and-why-it-matters\/\">Qu&rsquo;est-ce que la simulation scientifique et pourquoi cela est important<\/a><\/strong> \u2013 M\u00e9thodologie de simulation et meilleures pratiques<\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/from-equations-to-simulations-the-modeling-pipeline\/\">Des \u00e9quations aux simulations&nbsp;: le pipeline de mod\u00e9lisation<\/a><\/strong> \u2013 flux de travail de bout en bout des \u00e9quations \u00e0 valid\u00e9es r\u00e9sultats<\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/finite-volume-method-explained-simply\/\">M\u00e9thode de volume fini expliqu\u00e9e simplement<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/understanding-phase-field-models-in-materials-science\/\">Comprendre les mod\u00e8les de champ de phases en science des mat\u00e9riaux<\/a><\/strong> \u2013 Applications multi-champs de phase<\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/why-issue-tracking-is-critical-in-scientific-projects\/\">Pourquoi le suivi des probl\u00e8mes est essentiel dans les projets scientifiques<\/a><\/strong> \u2013 Pratiques de reproductibilit\u00e9 et de collaboration<\/li>\n<\/ul>\n<h2>Besoin d&rsquo;aide pour votre projet multi-physique ?<\/h2>\n<p>La construction de simulations coupl\u00e9es robustes n\u00e9cessite une expertise approfondie tant dans les m\u00e9thodes num\u00e9riques que dans l&rsquo;int\u00e9gration de logiciels. Si vous vous attaquez \u00e0 un probl\u00e8me complexe multi-physique et avez besoin de conseils sur :<\/p>\n<ul>\n<li>Conception d&rsquo;un workflow de couplage avec Precice<\/li>\n<li>Impl\u00e9mentation d&rsquo;adaptateurs Fipy pour votre physique sp\u00e9cifique<\/li>\n<li>D\u00e9boguer les probl\u00e8mes de convergence<\/li>\n<li>Optimisation des performances pour les simulations \u00e0 grande \u00e9chelle<\/li>\n<\/ul>\n<p><strong>MatForge offre des services de consultation<\/strong> pour les flux de travail des logiciels de recherche. Nous pouvons vous aider \u00e0 mettre en place des simulations multi-physiques fiables et reproductibles adapt\u00e9es \u00e0 votre projet. <a href=\"https:\/\/matforge.org\/\">Visitez la page d&rsquo;accueil de Matforge<\/a> pour en savoir plus et discuter de vos besoins sp\u00e9cifiques.<\/p>\n<hr>\n<h2>R\u00e9sum\u00e9<\/h2>\n<ul>\n<li><strong>Pr\u00e9cice<\/strong> permet un couplage multi-physique partitionn\u00e9, permettant \u00e0 Fipy de travailler avec d&rsquo;autres solveurs<\/li>\n<li><strong>Approche cloisonn\u00e9e<\/strong> est pratique pour la recherche&nbsp;: r\u00e9utiliser les codes existants, maintenir la flexibilit\u00e9<\/li>\n<li><strong>\u00c9tapes cl\u00e9s<\/strong>&nbsp;: installez Precice, Write Adapter, configurez XML, impl\u00e9mentez l&rsquo;\u00e9change de donn\u00e9es aux limites<\/li>\n<li><strong>D\u00e9marrer simple<\/strong>&nbsp;: couplage explicite avec un exemple minimal, puis progression vers des sch\u00e9mas implicites<\/li>\n<li><strong>Valider<\/strong> chaque solveur d&rsquo;abord autonome, puis ensemble<\/li>\n<li><strong>Moniteur<\/strong> Convergence et utilisation de la sous-relaxation si n\u00e9cessaire<\/li>\n<\/ul>\n<p>Avec cette base, vous pouvez \u00e9tendre Fipy \u00e0 pratiquement n&rsquo;importe quel sc\u00e9nario multi-physique.<\/p>\n","protected":false,"raw":"<h2>tl;dr<\/h2>\n<p>Les simulations multi-physiques n\u00e9cessitent souvent un couplage de plusieurs solveurs sp\u00e9cialis\u00e9s. Precice est une biblioth\u00e8que de couplage open-source mature qui permet des simulations multi-physiques partitionn\u00e9es en Python. Ce didacticiel montre comment coupler Fipy avec un autre solveur utilisant Precice, couvrant l'installation, la mise en \u0153uvre de l'adaptateur, la configuration et les pi\u00e8ges courants. Vous apprendrez quand utiliser le couplage partitionn\u00e9, comment configurer l'\u00e9change de donn\u00e9es et comment d\u00e9boguer les probl\u00e8mes typiques.<\/p>\n<h2>Introduction&nbsp;: lorsqu'un solveur ne suffit pas<\/h2>\n<p>De nombreux probl\u00e8mes scientifiques impliquent plusieurs processus physiques qui interagissent. Par exemple :<\/p>\n<ul>\n<li>Transfert de chaleur coupl\u00e9 \u00e0 un d\u00e9bit de fluide (transfert de chaleur conjugu\u00e9)<\/li>\n<li>M\u00e9canique structurelle interagissant avec la dynamique des fluides (interaction fluide-structure)<\/li>\n<li>\u00c9lectrochimie coupl\u00e9e \u00e0 des ph\u00e9nom\u00e8nes de transport (mod\u00e9lisation de la batterie)<\/li>\n<\/ul>\n<p>FIPY excelle dans la r\u00e9solution d'\u00e9quations aux d\u00e9riv\u00e9es partielles (EDP) pour les probl\u00e8mes de transport, de diffusion et de champ de phase. Cependant, certains sc\u00e9narios multi-physiques n\u00e9cessitent un couplage de FIPY avec un solveur sp\u00e9cialis\u00e9 pour un autre domaine physique, comme OpenFoam pour la dynamique des fluides ou un code structurel personnalis\u00e9.<\/p>\n<p><strong>Le couplage de code<\/strong> est la pratique de connecter deux ou plusieurs codes de simulation ind\u00e9pendants afin qu'ils \u00e9changent des donn\u00e9es pendant le calcul. C'est l\u00e0 qu'intervient <strong>pr\u00e9cise<\/strong> (infrastructure de couplage cloisonn\u00e9e pour les \u00e9quations du continuum).<\/p>\n<h3>Pourquoi utiliser Precice ?<\/h3>\n<p>Pr\u00e9cis fournit :<\/p>\n<ul>\n<li><strong>Couplage agnostique-langue<\/strong>&nbsp;: connectez les solveurs \u00e9crits en C++, Python, Fortran, etc.<\/li>\n<li><strong>Mappage de donn\u00e9es flexibles<\/strong>&nbsp;: G\u00e9rer l'interpolation maillage \u00e0 maillage entre des grilles non correspondantes<\/li>\n<li><strong>Coordination de pas de temps<\/strong>&nbsp;: prend en charge les sch\u00e9mas de couplage explicites, implicites et quasi-newton<\/li>\n<li><strong>\u00c9volutivit\u00e9 parall\u00e8le<\/strong>&nbsp;: con\u00e7ue pour les environnements de calcul hautes performances<\/li>\n<li><strong>Communaut\u00e9 active<\/strong>&nbsp;: utilis\u00e9 dans la recherche et l'industrie, avec une bonne documentation<\/li>\n<\/ul>\n<p>Pour les utilisateurs de Fipy, Precice ouvre la porte \u00e0 des flux de travail multi-physiques robustes sans cr\u00e9er d'infrastructure de couplage \u00e0 partir de z\u00e9ro.<\/p>\n<h3>Partitions VS Solveurs monolithiques<\/h3>\n<p>Avant de plonger, comprenez les deux principales approches de la multi-physique :<\/p>\n<table>\n<thead>\n<tr>\n<th>aspect<\/th>\n<th>partitionn\u00e9 (pr\u00e9cision)<\/th>\n<th>Monolithique<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>structure<\/strong><\/td>\n<td>Solveurs s\u00e9par\u00e9s coupl\u00e9s via un \u00e9change de donn\u00e9es<\/td>\n<td>Un seul solveur g\u00e8re toute la physique ensemble<\/td>\n<\/tr>\n<tr>\n<td><strong>R\u00e9utilisation du code<\/strong><\/td>\n<td>\u00c9lev\u00e9 \u2013 Utilisez des solveurs sp\u00e9cialis\u00e9s existants<\/td>\n<td>Faible \u2013 Besoin de mise en \u0153uvre unifi\u00e9e<\/td>\n<\/tr>\n<tr>\n<td><strong>effort de d\u00e9veloppement<\/strong><\/td>\n<td>Mod\u00e9r\u00e9 \u2013 \u00c9crire des adaptateurs, configurer le couplage<\/td>\n<td>Tr\u00e8s \u00e9lev\u00e9 \u2013 impl\u00e9mentez toute la physique dans un seul code<\/td>\n<\/tr>\n<tr>\n<td><strong>Performances<\/strong><\/td>\n<td>Bien, mais surcharge de communication<\/td>\n<td>Potentiellement mieux pour les probl\u00e8mes \u00e9troitement coupl\u00e9s<\/td>\n<\/tr>\n<tr>\n<td><strong>Flexibilit\u00e9<\/strong><\/td>\n<td>Echange ou mise \u00e0 niveau des solveurs individuels faciles<\/td>\n<td>Rigide \u2013 Les modifications affectent toute la base de code<\/td>\n<\/tr>\n<tr>\n<td><strong>Cas d'utilisation<\/strong><\/td>\n<td>Des solveurs matures existent pour chaque physique<\/td>\n<td>Mod\u00e8les physiques nouveaux ou hautement int\u00e9gr\u00e9s<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Quand choisir un couplage partitionn\u00e9 avec Precice&nbsp;:<\/strong><\/p>\n<ul>\n<li>Vous disposez de solveurs fiables et optimis\u00e9s pour la physique individuelle (par exemple, FIPY pour diffusion, OpenFoam pour Flow)<\/li>\n<li>Les physiques sont coupl\u00e9es de mani\u00e8re l\u00e2che ou mod\u00e9r\u00e9e<\/li>\n<li>Vous souhaitez tirer parti des bases de code et des communaut\u00e9s existantes<\/li>\n<li>Vous avez besoin de flexibilit\u00e9 pour essayer diff\u00e9rentes combinaisons de solveurs<\/li>\n<\/ul>\n<p><strong>Quand monolithique pourrait \u00eatre meilleur&nbsp;:<\/strong><\/p>\n<ul>\n<li>Couplage extr\u00eamement serr\u00e9 n\u00e9cessitant un traitement implicite au niveau de l'alg\u00e8bre lin\u00e9aire<\/li>\n<li>Simulations HPC critiques pour les performances o\u00f9 la surcharge de communication est inacceptable<\/li>\n<li>Tr\u00e8s nouvelle physique o\u00f9 il n'existe pas encore de solveur sp\u00e9cialis\u00e9<\/li>\n<\/ul>\n<p>Pour de nombreuses applications de recherche, <strong>Couplet cloisonn\u00e9 avec precice est le choix pragmatique<\/strong>.<\/p>\n<h2>Aper\u00e7u conceptuel : Comment fonctionne Precice<\/h2>\n<p>Precice suit une architecture <strong>client-server<\/strong>&nbsp;:<\/p>\n<ol>\n<li><strong>Solver A<\/strong> (par exemple, Fipy) s'ex\u00e9cute en tant que <strong>Client de precision<\/strong><\/li>\n<li><strong>Le solveur B<\/strong> (un autre code) s'ex\u00e9cute comme un autre <strong>Client de precis<\/strong><\/li>\n<li><strong>Precice<\/strong> s'ex\u00e9cute comme un processus distinct (le <strong>service de couplage<\/strong>) qui g\u00e8re la communication et la cartographie des donn\u00e9es<\/li>\n<li>Au niveau des interfaces de couplage, les solveurs \u00e9changent des donn\u00e9es de limites (p. ex., temp\u00e9rature, flux de chaleur, vitesse) \u00e0 travers<\/li>\n<li>PRECICE g\u00e8re&nbsp;: <ul> <li>Mappage de maillage lorsque les maillages d'interface ne correspondent pas<\/li> <li>Synchronisation du pas de temps<\/li> <li>D\u00e9tentation et sous-relaxation des donn\u00e9es pour am\u00e9liorer la convergence<\/li> <li>Sch\u00e9mas de couplage (explicite, implicite, quasi-newton)<\/li> <\/ul><\/li>\n<\/ol>\n<p>L'avantage cl\u00e9 : chaque solveur reste inconscient des d\u00e9tails internes de l'autre. Ils n'ont qu'\u00e0 savoir comment envoyer\/recevoir des donn\u00e9es \u00e0 leur limite via l'API de Precice.<\/p>\n<h2>Les pr\u00e9requis<\/h2>\n<p>Avant de commencer, assurez-vous d'avoir :<\/p>\n<ul>\n<li><strong>Fipy install\u00e9<\/strong> et fonctionnant (voir <a href=\"https:\/\/matforge.org\/installing-and-setting-up-fipy-for-the-first-time\/\">Installer et configurer Fipy pour la premi\u00e8re fois<\/a> pour le guidage de la configuration)<\/li>\n<li><strong>Exp\u00e9rience de programmation Python<\/strong> avec Fipy (familiarit\u00e9 avec <a href=\"https:\/\/matforge.org\/what-is-fipy-and-when-should-you-use-it\/\">Concepts de base de Fipy<\/a>)<\/li>\n<li><strong>Un deuxi\u00e8me solveur<\/strong> pr\u00eat pour le couplage (ce didacticiel utilise un simple solveur Python comme entr\u00e9e en fonction, mais le m\u00eame mod\u00e8le fonctionne avec OpenFoam,Calculix ou d'autres codes compatibles avec Precice)<\/li>\n<li><strong>Pr\u00e9cision install\u00e9e<\/strong> sur votre syst\u00e8me (voir <a href=\"https:\/\/precice.org\/installation-overview.html\">Guide d'installation de Precice<\/a>)<\/li>\n<li><strong>Comprendre les donn\u00e9es de base du multi-physique<\/strong> (Examen <a href=\"https:\/\/matforge.org\/what-is-scientific-simulation-and-why-it-matters\/\">Qu'est-ce que la simulation scientifique et pourquoi cela est important<\/a> n\u00e9cessaire)<\/li>\n<\/ul>\n<h2>\u00c9tape&nbsp;1&nbsp;: Installez les fixations Python Python<\/h2>\n<p>Precice fournit des liaisons Python afin que Fipy (ou tout code Python) puisse agir en tant que client de couplage.<\/p>\n<pre><code class=\"language-bash\"># Using conda (recommended)\nconda install -c conda-forge precice\n\n# Or using pip\npip install precice\n<\/code><\/pre>\n<p>V\u00e9rifiez l'installation&nbsp;:<\/p>\n<pre><code class=\"language-bash\">python -c \"import precice; print('preCICE Python version:', precice.__version__)\"\n<\/code><\/pre>\n<p>Vous devriez voir la version de pr\u00e9cision imprim\u00e9e sans erreur.<\/p>\n<h2>\u00c9tape&nbsp;2&nbsp;: Concevez votre interface de couplage<\/h2>\n<p>Identifiez <strong>o\u00f9<\/strong> les deux solveurs interagissent. Sc\u00e9narios courants&nbsp;:<\/p>\n<ul>\n<li><strong>Domaine de Fipy<\/strong> \u2192 Champ de temp\u00e9rature<\/li>\n<li><strong>Autre domaine du solveur<\/strong> \u2192 Flux de chaleur ou temp\u00e9rature<\/li>\n<\/ul>\n<p>D\u00e9finir&nbsp;:<\/p>\n<ul>\n<li><strong>Maille d'interface<\/strong> de chaque c\u00f4t\u00e9 (peut-\u00eatre diff\u00e9rent)<\/li>\n<li><strong>Donn\u00e9es de couplage<\/strong>&nbsp;: quelles quantit\u00e9s sont \u00e9chang\u00e9es (par exemple, <code>Temperature<\/code>, <code>Heat-Flux<\/code>)<\/li>\n<li><strong>Mesh Scaling<\/strong>&nbsp;: s'assurer que les syst\u00e8mes de coordonn\u00e9es s'alignent<\/li>\n<\/ul>\n<p>Pour ce didacticiel, nous allons coupler un solveur <strong>FIPY Heat Diffusion<\/strong> avec un solveur <strong>Simple Python Convective Cooling<\/strong>. L'interface est une ligne 1D o\u00f9 la temp\u00e9rature et le flux de chaleur sont \u00e9chang\u00e9s.<\/p>\n<h2>\u00c9tape&nbsp;3&nbsp;: \u00c9crivez l'adaptateur Fipy Precice<\/h2>\n<p>Le <strong>Adaptateur<\/strong> est le code qui relie votre solveur (FIPY) \u00e0 Precice. Il g\u00e8re :<\/p>\n<ul>\n<li>Initialisation de la connexion de pr\u00e9cision<\/li>\n<li>D\u00e9finir le maillage de l'interface de couplage<\/li>\n<li>Lecture des donn\u00e9es entrantes de l'autre solveur<\/li>\n<li>\u00c9crire des donn\u00e9es sortantes \u00e0 envoyer<\/li>\n<li>Avancement du pas de temps de couplage<\/li>\n<\/ul>\n<p>Cr\u00e9er un fichier <code>fipy_precice_adapter.py<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-python\">import numpy as np\nfrom fipy import CellVariable, Grid1D, DiffusionTerm, TransientTerm\nimport precice\n\n# --- Configuration ---\n# These should match the preCICE configuration file\nCOUPLING_INTERFACE = \"Fluid-Solid\"  # Name of the coupling interface\nCOUPLING_MESH_ID = 0  # ID of the mesh on this solver side\nCOUPLING_DATA_TEMPERATURE_ID = 0\nCOUPLING_DATA_HEATFLUX_ID = 1\n\n# Simulation parameters\nnx = 50\ndx = 1.0\ntotal_time = 10.0\ndt = 0.1\n\n# --- FiPy setup ---\nmesh = Grid1D(nx=nx, dx=dx)\nT = CellVariable(name=\"Temperature\", mesh=mesh, value=300.0)  # Initial temp in K\nk = 1.0  # Thermal conductivity\n\n# Boundary conditions\n# Left boundary: fixed temperature (will be overwritten by coupling)\n# Right boundary: fixed temperature (example)\nT.constrain(300.0, mesh.facesRight)\n\n# Equation: transient diffusion\neq = TransientTerm() == DiffusionTerm(coeff=k)\n\n# --- preCICE setup ---\nsolver_name = \"FiPy-Solver\"\nconfig_file = \"precice-config.xml\"  # Provided separately\n\nprecice_dll = precice.Participant(solver_name, config_file, 0, 0)\n\n# Get the coupling mesh from preCICE\nmesh_vertices = precice_dll.get_mesh_vertices(COUPLING_MESH_ID, COUPLING_INTERFACE)\n# In 1D, mesh_vertices is an array of x-coordinates\n# We'll map these to our FiPy mesh cells\n\n# Main coupling loop\ntime = 0.0\nwhile time &lt; total_time:\n    # 1. Advance FiPy one time step (without coupling first)\n    eq.solve(var=T, dt=dt)\n    \n    # 2. Read incoming data from the other solver (e.g., heat flux)\n    # preCICE expects data at the coupling interface vertices\n    heat_flux_in = precice_dll.read_data(\n        COUPLING_DATA_HEATFLUX_ID,\n        COUPLING_INTERFACE,\n        mesh_vertices\n    )\n    \n    # 3. Apply received heat flux as Neumann boundary condition on FiPy\n    # This is simplified: in practice you'd map heat_flux_in to FiPy faces\n    # For 1D, we can directly apply to left boundary\n    if len(heat_flux_in) &gt; 0:\n        # Neumann BC: -k * dT\/dx = heat_flux\n        # In FiPy, you can set flux via constrained faces\n        # For simplicity, we'll adjust the left boundary value to mimic flux\n        # A proper implementation would use a FluxBoundaryCondition\n        pass  # Implementation depends on exact boundary treatment\n    \n    # 4. Write outgoing data (temperature) to send to the other solver\n    # Extract temperature at coupling interface cells\n    T_interface = T.value  # In practice, sample at interface mesh locations\n    precice_dll.write_data(\n        COUPLING_DATA_TEMPERATURE_ID,\n        COUPLING_INTERFACE,\n        T_interface[:len(mesh_vertices)]  # ensure matching size\n    )\n    \n    # 5. Advance coupling\n    precice_dll.advance(dt)\n    \n    time += dt\n    print(f\"Time: {time:.2f}, Max T: {T.max():.2f}, Min T: {T.min():.2f}\")\n\nprecice_dll.finalize()\n<\/code><\/pre>\n<p><strong>Notes importantes&nbsp;:<\/strong><\/p>\n<ul>\n<li>Il s'agit d'un <strong>exemple minimal<\/strong>. Les impl\u00e9mentations r\u00e9elles n\u00e9cessitent un mappage de maillage et une application de conditions aux limites.<\/li>\n<li>Le fichier <code>precice-config.xml<\/code> d\u00e9finit les param\u00e8tres de communication, les ID de maillage et les ID de donn\u00e9es. Voir \u00e9tape 4.<\/li>\n<li>La mise \u00e0 jour des conditions aux limites de FIPY est simplifi\u00e9e ; Pour une utilisation en production, impl\u00e9mentez Neumann BC appropri\u00e9 via <code>FaceVariable<\/code> ou une contrainte personnalis\u00e9e.<\/li>\n<\/ul>\n<h2>\u00c9tape&nbsp;4&nbsp;: Cr\u00e9ez le fichier de configuration de prix<\/h2>\n<p>Precice utilise un fichier de configuration XML (<code>precice-config.xml<\/code>) qui d\u00e9finit&nbsp;:<\/p>\n<ul>\n<li>Participants (solveurs)<\/li>\n<li>Interfaces de couplage<\/li>\n<li>D\u00e9finitions de maillage et de donn\u00e9es<\/li>\n<li>Param\u00e8tres de communication<\/li>\n<li>Sch\u00e9ma de couplage (explicite, implicite, quasi-newton)<\/li>\n<\/ul>\n<p>Une configuration minimale pour le couplage FIPY + Python :<\/p>\n<pre><code class=\"language-xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;precice-configuration&gt;\n  &lt;schema&gt;https:\/\/precice.org\/schemas\/coupling-schema-2.2.xsd&lt;\/schema&gt;\n\n  &lt;!-- Parallel settings --&gt;\n  &lt;parallel&gt;\n    &lt;exchange comm-world=\"true\" \/&gt;\n  &lt;\/parallel&gt;\n\n  &lt;!-- Coupling participants --&gt;\n  &lt;participants&gt;\n    &lt;participant name=\"FiPy-Solver\"&gt;\n      &lt;use-mesh name=\"Fluid-Solid-Mesh-FiPy\" provide=\"true\" \/&gt;\n      &lt;use-data name=\"Temperature\" from=\"FiPy-Solver\" \/&gt;\n      &lt;use-data name=\"Heat-Flux\" to=\"FiPy-Solver\" \/&gt;\n    &lt;\/participant&gt;\n    &lt;participant name=\"SimpleSolver\"&gt;\n      &lt;use-mesh name=\"Fluid-Solid-Mesh-Simple\" provide=\"true\" \/&gt;\n      &lt;use-data name=\"Temperature\" to=\"SimpleSolver\" \/&gt;\n      &lt;use-data name=\"Heat-Flux\" from=\"SimpleSolver\" \/&gt;\n    &lt;\/participant&gt;\n  &lt;\/participants&gt;\n\n  &lt;!-- Coupling interfaces --&gt;\n  &lt;coupling-scheme:serial-explicit&gt;\n    &lt;participants first=\"FiPy-Solver\" second=\"SimpleSolver\" \/&gt;\n    &lt;exchange&gt;\n      &lt;data name=\"Temperature\" mesh=\"Fluid-Solid-Mesh-FiPy\" \/&gt;\n      &lt;data name=\"Heat-Flux\" mesh=\"Fluid-Solid-Mesh-Simple\" \/&gt;\n    &lt;\/exchange&gt;\n    &lt;max-time&gt;10.0&lt;\/max-time&gt;\n    &lt;max-iterations&gt;10&lt;\/max-iterations&gt;\n  &lt;\/coupling-scheme:serial-explicit&gt;\n\n  &lt;!-- Meshes --&gt;\n  &lt;mesh name=\"Fluid-Solid-Mesh-FiPy\" from=\"FiPy-Solver\" \/&gt;\n  &lt;mesh name=\"Fluid-Solid-Mesh-Simple\" from=\"SimpleSolver\" \/&gt;\n\n  &lt;!-- Data --&gt;\n  &lt;data name=\"Temperature\" mesh=\"Fluid-Solid-Mesh-FiPy\" \/&gt;\n  &lt;data name=\"Heat-Flux\" mesh=\"Fluid-Solid-Mesh-Simple\" \/&gt;\n\n&lt;\/precice-configuration&gt;\n<\/code><\/pre>\n<p>\u00c9l\u00e9ments cl\u00e9s&nbsp;:<\/p>\n<ul>\n<li>Deux participants : <code>FiPy-Solver<\/code> et <code>SimpleSolver<\/code><\/li>\n<li>\u00c9change de donn\u00e9es : <code>Temperature<\/code> (FIPY \u2192 SimpleSolver) et <code>Heat-Flux<\/code> (SimpleSolver \u2192 FIPY)<\/li>\n<li><code>serial-explicit<\/code> Couplage&nbsp;: pas de temps simple explicite (bon pour d\u00e9marrer)<\/li>\n<li><code>max-iterations<\/code> contr\u00f4le le nombre de sous-it\u00e9rations par pas de temps (pour les sch\u00e9mas implicites)<\/li>\n<\/ul>\n<p>Pour un couplage plus avanc\u00e9, pensez \u00e0 :<\/p>\n<ul>\n<li><code>serial-implicit<\/code> avec acc\u00e9l\u00e9ration quasi-newton pour un couplage plus serr\u00e9<\/li>\n<li>Facteurs de sous-relaxation pour am\u00e9liorer la convergence<\/li>\n<li>D\u00e9finitions de connectivit\u00e9 de maillage si les maillages ne sont pas align\u00e9s<\/li>\n<\/ul>\n<h2>\u00c9tape&nbsp;5&nbsp;: Impl\u00e9mentez le deuxi\u00e8me solveur (exemple simple)<\/h2>\n<p>Pour tester le couplage, vous avez besoin d'un deuxi\u00e8me solveur. Voici un solveur Python minimal qui \u00e9change le flux de chaleur avec Fipy :<\/p>\n<p><code>solver_simple.py<\/code>&nbsp;:<\/p>\n<pre><code class=\"language-python\">import numpy as np\nimport precice\n\n# Configuration\nCOUPLING_INTERFACE = \"Fluid-Solid\"\nCOUPLING_MESH_ID = 0\nCOUPLING_DATA_TEMPERATURE_ID = 0\nCOUPLING_DATA_HEATFLUX_ID = 1\n\nsolver_name = \"SimpleSolver\"\nconfig_file = \"precice-config.xml\"\n\nprecice_dll = precice.Participant(solver_name, config_file, 0, 0)\n\n# Simple 1D mesh (could be completely different from FiPy's mesh)\nmesh_vertices = np.array([[0.0], [1.0]])  # Two points at interface\nT_interface = np.array([300.0, 300.0])    # Initial guess\n\ntotal_time = 10.0\ndt = 0.1\ntime = 0.0\n\nwhile time &lt; total_time:\n    # 1. Read incoming temperature from FiPy\n    T_from_fipy = precice_dll.read_data(\n        COUPLING_DATA_TEMPERATURE_ID,\n        COUPLING_INTERFACE,\n        mesh_vertices\n    )\n    \n    # 2. Compute outgoing heat flux (simple Newton's law of cooling)\n    # q = h * (T_fluid - T_solid)\n    h = 10.0  # Heat transfer coefficient\n    T_fluid = 350.0  # Ambient fluid temperature\n    heat_flux = h * (T_fluid - T_from_fipy.mean())\n    \n    # Send same flux to all interface vertices (simplified)\n    heat_flux_out = np.full_like(T_from_fipy, heat_flux)\n    \n    # 3. Write heat flux to send to FiPy\n    precice_dll.write_data(\n        COUPLING_DATA_HEATFLUX_ID,\n        COUPLING_INTERFACE,\n        heat_flux_out\n    )\n    \n    # 4. Advance coupling\n    precice_dll.advance(dt)\n    \n    time += dt\n    print(f\"[SimpleSolver] Time: {time:.2f}, T_fipy: {T_from_fipy.mean():.2f}, q: {heat_flux:.2f}\")\n\nprecice_dll.finalize()\n<\/code><\/pre>\n<p>Ce simple solveur repr\u00e9sente un environnement de refroidissement convectif qui applique un flux de chaleur proportionnel \u00e0 la diff\u00e9rence de temp\u00e9rature par rapport au solide FIPY.<\/p>\n<h2>\u00c9tape&nbsp;6&nbsp;: Ex\u00e9cutez la simulation coupl\u00e9e<\/h2>\n<ol>\n<li>D\u00e9marrez les deux solveurs <strong>simultan\u00e9ment<\/strong> (le precice g\u00e8re leur communication):<\/li>\n<\/ol>\n<pre><code class=\"language-bash\"># Terminal 1\npython fipy_precice_adapter.py &amp;\n\n# Terminal 2\npython solver_simple.py &amp;\n<\/code><\/pre>\n<ol start=\"2\">\n<li>Regardez la sortie. Vous devriez voir l'\u00e9volution du temps dans les solveurs et les valeurs de flux de temp\u00e9rature\/chaleur \u00e9voluant.<\/li>\n<li>La simulation se termine lorsque <code>total_time<\/code> est atteint ou que le sch\u00e9ma de couplage est termin\u00e9.<\/li>\n<\/ol>\n<p><strong>Comportement attendu&nbsp;:<\/strong><\/p>\n<ul>\n<li>La temp\u00e9rature de Fipy devrait progressivement diminuer de 300&nbsp;K initiaux \u00e0 la courbe de refroidissement<\/li>\n<li>Le flux de chaleur de SimpleSolver doit \u00eatre positif (chaleur en laissant FIPY)<\/li>\n<li>Les deux solveurs doivent rester synchronis\u00e9s dans le temps<\/li>\n<\/ul>\n<h2>\u00c9tape&nbsp;7&nbsp;: Visualisez les r\u00e9sultats<\/h2>\n<p>Apr\u00e8s avoir ex\u00e9cut\u00e9, vous pouvez tracer le profil de temp\u00e9rature de Fipy&nbsp;:<\/p>\n<pre><code class=\"language-python\">import matplotlib.pyplot as plt\nfrom fipy import Grid1D, CellVariable, DiffusionTerm\n\n# Re-run simulation while storing history\n# (or modify the adapter to save snapshots to file)\n# Then plot T vs x at final time\n<\/code><\/pre>\n<h2>D\u00e9pannage&nbsp;: probl\u00e8mes et solutions courants<\/h2>\n<table>\n<thead>\n<tr>\n<th>Sympt\u00f4me<\/th>\n<th>cause probable<\/th>\n<th>Solution<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>precice: error: XML file not found<\/code><\/td>\n<td>Chemin de configuration manquant ou incorrect<\/td>\n<td>Assurez-vous que <code>precice-config.xml<\/code> est dans le r\u00e9pertoire de travail ou fournit un chemin complet<\/td>\n<\/tr>\n<tr>\n<td><code>Mesh vertex count mismatch<\/code><\/td>\n<td>Les maillages d'interface Fipy et Precice ont des nombres diff\u00e9rents de sommets<\/td>\n<td>cochez <code>get_mesh_vertices()<\/code> renvoie le nombre attendu&nbsp;; Mapper correctement<\/td>\n<\/tr>\n<tr>\n<td><code>Data not found in configuration<\/code><\/td>\n<td>Le nom ou l'ID des donn\u00e9es ne correspond pas au XML<\/td>\n<td>V\u00e9rifier <code>COUPLING_DATA_*<\/code> Les constantes correspondent aux entr\u00e9es <code>&lt;data name=\"...\"&gt;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>Coupling diverges (temperatures explode)<\/code><\/td>\n<td>Sous-relaxation n\u00e9cessaire ou sch\u00e9ma explicite instable<\/td>\n<td>Ajouter <code>&lt;relaxation value=\"0.5\"\/&gt;<\/code> en XML ou passer au couplage implicite<\/td>\n<\/tr>\n<tr>\n<td><code>Time step mismatch<\/code><\/td>\n<td>Les solveurs utilisent diff\u00e9rentes valeurs <code>dt<\/code><\/td>\n<td>Assurez-vous que les deux utilisent le m\u00eame <code>dt<\/code> ou laissez le temps de contr\u00f4le de pr\u00e9cision (<code>precice_dll.advance(dt)<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><code>Segmentation fault in preCICE<\/code><\/td>\n<td>Versions de prix incompatibles entre les participants<\/td>\n<td>R\u00e9installez Precice pour vous assurer que tous les participants utilisent la m\u00eame version<\/td>\n<\/tr>\n<tr>\n<td><code>FiPy boundary not updating<\/code><\/td>\n<td>L'adaptateur n'applique pas correctement le flux re\u00e7u<\/td>\n<td>Impl\u00e9menter la condition limite appropri\u00e9e de Neumann en utilisant <code>FaceVariable<\/code> ou modifier le terme source d'\u00e9quation<\/td>\n<\/tr>\n<tr>\n<td><code>Communication timeout<\/code><\/td>\n<td>Un solveur s'est \u00e9cras\u00e9 ou bloqu\u00e9<\/td>\n<td>V\u00e9rifiez que les deux solveurs sont en cours d'ex\u00e9cution&nbsp;; V\u00e9rifiez qu'ils appellent <code>advance()<\/code> r\u00e9guli\u00e8rement<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Conseils de d\u00e9bogage&nbsp;:<\/strong><\/p>\n<ul>\n<li>Ex\u00e9cutez les solveurs avec <code>PRECICE_DEBUG=1<\/code> Variable d'environnement pour les journaux verbeux<\/li>\n<li>Commencez avec un maillage grossier et un temps total court pour tester rapidement<\/li>\n<li>Utilisez <code>serial-explicit<\/code> le couplage en premier (le plus indulgent) avant d'essayer des sch\u00e9mas implicites<\/li>\n<li>Validez chaque solveur <strong>sans couplage<\/strong> pour vous assurer qu'ils fonctionnent de mani\u00e8re autonome<\/li>\n<\/ul>\n<h2>Sujets avanc\u00e9s<\/h2>\n<p>Une fois que le couplage de base fonctionne, explorez :<\/p>\n<h3>Couplage implicite avec Quasi-Newton<\/h3>\n<p>Pour les probl\u00e8mes \u00e9troitement coupl\u00e9s, les sch\u00e9mas explicites peuvent n\u00e9cessiter de nombreuses sous-it\u00e9rations ou devenir instables. Precice prend en charge les <strong>couplage implicite<\/strong> avec une acc\u00e9l\u00e9ration quasi-newton&nbsp;:<\/p>\n<pre><code class=\"language-xml\">&lt;coupling-scheme:serial-implicit&gt;\n  &lt;participants first=\"FiPy-Solver\" second=\"SimpleSolver\" \/&gt;\n  &lt;exchange&gt;\n    &lt;data name=\"Temperature\" mesh=\"Fluid-Solid-Mesh-FiPy\" \/&gt;\n    &lt;data name=\"Heat-Flux\" mesh=\"Fluid-Solid-Mesh-Simple\" \/&gt;\n  &lt;\/exchange&gt;\n  &lt;max-time&gt;10.0&lt;\/max-time&gt;\n  &lt;max-iterations&gt;10&lt;\/max-iterations&gt;\n  &lt;convergence-measure&gt;\n    &lt;data name=\"Temperature\" mesh=\"Fluid-Solid-Mesh-FiPy\" \/&gt;\n  &lt;\/convergence-measure&gt;\n  &lt;relaxation value=\"0.5\"\/&gt;\n&lt;\/coupling-scheme:serial-implicit&gt;\n<\/code><\/pre>\n<h3>Mappage maillage vers maillage<\/h3>\n<p>Si le maillage d'interface de Fipy ne correspond pas au maillage de l'autre solveur, Precice effectue <strong>Mappage de maillage<\/strong> (interpolation). Vous pouvez configurer la m\u00e9thode de mappage en XML&nbsp;:<\/p>\n<pre><code class=\"language-xml\">&lt;mesh name=\"Fluid-Solid-Mesh-FiPy\" from=\"FiPy-Solver\"&gt;\n  &lt;use-data name=\"Temperature\" \/&gt;\n  &lt;mapping:nearest-neighbor \/&gt;\n&lt;\/mesh&gt;\n<\/code><\/pre>\n<p>Options : <code>nearest-neighbor<\/code>, <code>linear<\/code>, <code>rbf<\/code> (fonctions de base radiale). Choisissez en fonction de la qualit\u00e9 du maillage et de la physique.<\/p>\n<h3>Gestion des pas de temps non-correspondants<\/h3>\n<p>Precice permet \u00e0 chaque solveur d'utiliser son propre pas de temps tout en coordonnant les interfaces de couplage. d\u00e9finir <code>dt<\/code> ind\u00e9pendamment dans chaque solveur&nbsp;; Precice interpolera les donn\u00e9es au besoin. Cependant, de grandes diff\u00e9rences peuvent r\u00e9duire la pr\u00e9cision.<\/p>\n<h2>Consid\u00e9rations relatives aux performances<\/h2>\n<ul>\n<li><strong>Frais g\u00e9n\u00e9raux de communication<\/strong> peuvent dominer pour les petits probl\u00e8mes. Profile to ensure coupling isn't the bottleneck.<\/li>\n<li><strong>Under-relaxation<\/strong> (<code>&lt;relaxation&gt;<\/code> en XML) am\u00e9liore la stabilit\u00e9 mais ralentit la convergence.<\/li>\n<li><strong>r\u00e9solution de maillage<\/strong> sur l'interface affecte la pr\u00e9cision de la cartographie. Utilisez des maillages d'interface suffisamment raffin\u00e9s.<\/li>\n<li><strong>\u00c9chelle parall\u00e8le<\/strong>&nbsp;: Precice fonctionne avec les solveurs compatibles MPI. Assurez-vous que Fipy (avec PETSC) et l'autre solveur s'ex\u00e9cutent en parall\u00e8le si n\u00e9cessaire.<\/li>\n<\/ul>\n<h2>Prochaines \u00e9tapes<\/h2>\n<p>Apr\u00e8s avoir ma\u00eetris\u00e9 le couplage de base :<\/p>\n<ol>\n<li><strong>Essayez un v\u00e9ritable deuxi\u00e8me solveur<\/strong> (par exemple, OpenFoam pour le flux de fluide) au lieu de l'espace r\u00e9serv\u00e9 Python<\/li>\n<li><strong>Explorer les sch\u00e9mas de couplage avanc\u00e9s<\/strong> (<code>serial-implicit<\/code>, <code>multi<\/code>)<\/li>\n<li><strong>Ajouter plus de physique<\/strong> (par exemple, coupler trois solveurs&nbsp;: thermique, fluide, structurel)<\/li>\n<li><strong>Mettre en place des conditions aux limites appropri\u00e9es<\/strong> dans FIPY en utilisant <code>FaceVariable<\/code> ou des termes personnalis\u00e9s<\/li>\n<li><strong>Optimisez les performances<\/strong> avec une ex\u00e9cution et un profilage parall\u00e8les<\/li>\n<li><strong>\u00c9tude de cas<\/strong> comme le couplage thermique-fluide ou l'interaction fluide-structure<\/li>\n<\/ol>\n<p>Pour des connaissances approfondies de FIPY, consultez <a href=\"https:\/\/matforge.org\/from-equations-to-simulations-the-modeling-pipeline\/\">De \u00e9quations aux simulations&nbsp;: le pipeline de mod\u00e9lisation<\/a> et <a href=\"https:\/\/matforge.org\/finite-volume-method-explained-simply\/\">m\u00e9thode de volume fini expliqu\u00e9e simplement<\/a>.<\/p>\n<h2>Lectures compl\u00e9mentaires<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/matforge.org\/what-is-fipy-and-when-should-you-use-it\/\">Qu'est-ce que FIPY et quand devriez-vous l'utiliser&nbsp;?<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/installing-and-setting-up-fipy-for-the-first-time\/\">Installer et configurer Fipy pour la premi\u00e8re fois<\/a><\/strong>&nbsp;\u2013&nbsp;Configuration et d\u00e9pannage de l'environnement<\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/what-is-scientific-simulation-and-why-it-matters\/\">Qu'est-ce que la simulation scientifique et pourquoi cela est important<\/a><\/strong> \u2013 M\u00e9thodologie de simulation et meilleures pratiques<\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/from-equations-to-simulations-the-modeling-pipeline\/\">Des \u00e9quations aux simulations&nbsp;: le pipeline de mod\u00e9lisation<\/a><\/strong> \u2013 flux de travail de bout en bout des \u00e9quations \u00e0 valid\u00e9es r\u00e9sultats<\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/finite-volume-method-explained-simply\/\">M\u00e9thode de volume fini expliqu\u00e9e simplement<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/understanding-phase-field-models-in-materials-science\/\">Comprendre les mod\u00e8les de champ de phases en science des mat\u00e9riaux<\/a><\/strong> \u2013 Applications multi-champs de phase<\/li>\n<li><strong><a href=\"https:\/\/matforge.org\/why-issue-tracking-is-critical-in-scientific-projects\/\">Pourquoi le suivi des probl\u00e8mes est essentiel dans les projets scientifiques<\/a><\/strong> \u2013 Pratiques de reproductibilit\u00e9 et de collaboration<\/li>\n<\/ul>\n<h2>Besoin d'aide pour votre projet multi-physique ?<\/h2>\n<p>La construction de simulations coupl\u00e9es robustes n\u00e9cessite une expertise approfondie tant dans les m\u00e9thodes num\u00e9riques que dans l'int\u00e9gration de logiciels. Si vous vous attaquez \u00e0 un probl\u00e8me complexe multi-physique et avez besoin de conseils sur :<\/p>\n<ul>\n<li>Conception d'un workflow de couplage avec Precice<\/li>\n<li>Impl\u00e9mentation d'adaptateurs Fipy pour votre physique sp\u00e9cifique<\/li>\n<li>D\u00e9boguer les probl\u00e8mes de convergence<\/li>\n<li>Optimisation des performances pour les simulations \u00e0 grande \u00e9chelle<\/li>\n<\/ul>\n<p><strong>MatForge offre des services de consultation<\/strong> pour les flux de travail des logiciels de recherche. Nous pouvons vous aider \u00e0 mettre en place des simulations multi-physiques fiables et reproductibles adapt\u00e9es \u00e0 votre projet. <a href=\"https:\/\/matforge.org\/\">Visitez la page d'accueil de Matforge<\/a> pour en savoir plus et discuter de vos besoins sp\u00e9cifiques.<\/p>\n<hr>\n<h2>R\u00e9sum\u00e9<\/h2>\n<ul>\n<li><strong>Pr\u00e9cice<\/strong> permet un couplage multi-physique partitionn\u00e9, permettant \u00e0 Fipy de travailler avec d'autres solveurs<\/li>\n<li><strong>Approche cloisonn\u00e9e<\/strong> est pratique pour la recherche&nbsp;: r\u00e9utiliser les codes existants, maintenir la flexibilit\u00e9<\/li>\n<li><strong>\u00c9tapes cl\u00e9s<\/strong>&nbsp;: installez Precice, Write Adapter, configurez XML, impl\u00e9mentez l'\u00e9change de donn\u00e9es aux limites<\/li>\n<li><strong>D\u00e9marrer simple<\/strong>&nbsp;: couplage explicite avec un exemple minimal, puis progression vers des sch\u00e9mas implicites<\/li>\n<li><strong>Valider<\/strong> chaque solveur d'abord autonome, puis ensemble<\/li>\n<li><strong>Moniteur<\/strong> Convergence et utilisation de la sous-relaxation si n\u00e9cessaire<\/li>\n<\/ul>\n<p>Avec cette base, vous pouvez \u00e9tendre Fipy \u00e0 pratiquement n'importe quel sc\u00e9nario multi-physique.<\/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>tl;dr Les simulations multi-physiques n\u00e9cessitent souvent un couplage de plusieurs solveurs sp\u00e9cialis\u00e9s. Precice est une biblioth\u00e8que de couplage open-source mature qui permet des simulations multi-physiques partitionn\u00e9es en Python. Ce didacticiel montre comment coupler Fipy avec un autre solveur utilisant Precice, couvrant l&rsquo;installation, la mise en \u0153uvre de l&rsquo;adaptateur, la configuration et les pi\u00e8ges courants. Vous [&hellip;]<\/p>\n","protected":false,"raw":""},"author":6,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_locale":"fr_FR","_original_post":"https:\/\/matforge.org\/?p=216","iawp_total_views":0,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-1185","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>Couplage de code avec precice : simulations multi-physiques en Python - matforge.org<\/title>\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\/code-coupling-precice-multi-physics-python\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Couplage de code avec precice : simulations multi-physiques en Python - matforge.org\" \/>\n<meta property=\"og:description\" content=\"Reading Time:  10 minutestl;dr Les simulations multi-physiques n\u00e9cessitent souvent un couplage de plusieurs solveurs sp\u00e9cialis\u00e9s. Precice est une biblioth\u00e8que de couplage open-source mature qui permet des simulations multi-physiques partitionn\u00e9es en Python. Ce didacticiel montre comment coupler Fipy avec un autre solveur utilisant Precice, couvrant l&rsquo;installation, la mise en \u0153uvre de l&rsquo;adaptateur, la configuration et les pi\u00e8ges courants. Vous [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/\" \/>\n<meta property=\"og:site_name\" content=\"matforge.org\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-21T14:25:39+00:00\" \/>\n<meta name=\"author\" content=\"steven\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"steven\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/\"},\"author\":{\"name\":\"steven\",\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"headline\":\"Couplage de code avec precice : simulations multi-physiques en Python\",\"datePublished\":\"2026-08-21T14:25:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/\"},\"wordCount\":2500,\"commentCount\":0,\"articleSection\":[\"FIPY : documentation, exemples &amp; D\u00e9veloppement\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/\",\"url\":\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/\",\"name\":\"Couplage de code avec precice : simulations multi-physiques en Python - matforge.org\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#website\"},\"datePublished\":\"2026-08-21T14:25:39+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/#\\\/schema\\\/person\\\/8f690fb596d657b12994b83caa788f03\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/matforge.org\\\/fr\\\/code-coupling-precice-multi-physics-python\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/matforge.org\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Couplage de code avec precice : simulations multi-physiques en Python\"}]},{\"@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\\\/8f690fb596d657b12994b83caa788f03\",\"name\":\"steven\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g\",\"caption\":\"steven\"},\"url\":\"https:\\\/\\\/matforge.org\\\/author\\\/steven\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Couplage de code avec precice : simulations multi-physiques en Python - matforge.org","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\/code-coupling-precice-multi-physics-python\/","og_locale":"fr_FR","og_type":"article","og_title":"Couplage de code avec precice : simulations multi-physiques en Python - matforge.org","og_description":"Reading Time:  10 minutestl;dr Les simulations multi-physiques n\u00e9cessitent souvent un couplage de plusieurs solveurs sp\u00e9cialis\u00e9s. Precice est une biblioth\u00e8que de couplage open-source mature qui permet des simulations multi-physiques partitionn\u00e9es en Python. Ce didacticiel montre comment coupler Fipy avec un autre solveur utilisant Precice, couvrant l&rsquo;installation, la mise en \u0153uvre de l&rsquo;adaptateur, la configuration et les pi\u00e8ges courants. Vous [&hellip;]","og_url":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/","og_site_name":"matforge.org","article_published_time":"2026-08-21T14:25:39+00:00","author":"steven","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"steven","Dur\u00e9e de lecture estim\u00e9e":"17 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/#article","isPartOf":{"@id":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/"},"author":{"name":"steven","@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"headline":"Couplage de code avec precice : simulations multi-physiques en Python","datePublished":"2026-08-21T14:25:39+00:00","mainEntityOfPage":{"@id":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/"},"wordCount":2500,"commentCount":0,"articleSection":["FIPY : documentation, exemples &amp; D\u00e9veloppement"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/","url":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/","name":"Couplage de code avec precice : simulations multi-physiques en Python - matforge.org","isPartOf":{"@id":"https:\/\/matforge.org\/#website"},"datePublished":"2026-08-21T14:25:39+00:00","author":{"@id":"https:\/\/matforge.org\/#\/schema\/person\/8f690fb596d657b12994b83caa788f03"},"breadcrumb":{"@id":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/matforge.org\/fr\/code-coupling-precice-multi-physics-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/matforge.org\/"},{"@type":"ListItem","position":2,"name":"Couplage de code avec precice : simulations multi-physiques en Python"}]},{"@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\/8f690fb596d657b12994b83caa788f03","name":"steven","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d46cfcd83a298f27e8d66bfa035514fefca7652f26bd3ef7402f82b68a41ec0f?s=96&d=mm&r=g","caption":"steven"},"url":"https:\/\/matforge.org\/author\/steven\/"}]}},"_links":{"self":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1185","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\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/comments?post=1185"}],"version-history":[{"count":1,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1185\/revisions"}],"predecessor-version":[{"id":1318,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/posts\/1185\/revisions\/1318"}],"wp:attachment":[{"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/media?parent=1185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/categories?post=1185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/matforge.org\/wp-json\/wp\/v2\/tags?post=1185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}