chore: remove deprecated flow_boundary and update docs to match new architecture
This commit is contained in:
@@ -214,6 +214,60 @@
|
||||
"## 5. Recommandations par Application"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import entropyk\n",
|
||||
"\n",
|
||||
"# Create a system\n",
|
||||
"system = entropyk.System()\n",
|
||||
"\n",
|
||||
"# Add components\n",
|
||||
"# Note: Python bindings use simplified adapters for demonstration\n",
|
||||
"compressor = entropyk.Compressor(\n",
|
||||
" speed_rpm=2900.0,\n",
|
||||
" displacement=0.0001, # m³/rev\n",
|
||||
" efficiency=0.85,\n",
|
||||
" fluid=\"R134a\",\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"condenser = entropyk.Condenser(ua=5000.0) # UA in W/K\n",
|
||||
"evaporator = entropyk.Evaporator(ua=3000.0)\n",
|
||||
"valve = entropyk.ExpansionValve(fluid=\"R134a\", opening=0.8)\n",
|
||||
"\n",
|
||||
"# Add to system\n",
|
||||
"comp_idx = system.add_component(compressor)\n",
|
||||
"cond_idx = system.add_component(condenser)\n",
|
||||
"evap_idx = system.add_component(evaporator)\n",
|
||||
"valve_idx = system.add_component(valve)\n",
|
||||
"\n",
|
||||
"# Connect refrigerant circuit\n",
|
||||
"system.add_edge(comp_idx, cond_idx) # Compressor → Condenser (hot side)\n",
|
||||
"system.add_edge(cond_idx, valve_idx) # Condenser → Valve\n",
|
||||
"system.add_edge(valve_idx, evap_idx) # Valve → Evaporator (cold side)\n",
|
||||
"system.add_edge(evap_idx, comp_idx) # Evaporator → Compressor\n",
|
||||
"\n",
|
||||
"# Finalize topology\n",
|
||||
"system.finalize()\n",
|
||||
"\n",
|
||||
"# Configure solver\n",
|
||||
"solver = entropyk.NewtonConfig(\n",
|
||||
" max_iterations=200,\n",
|
||||
" tolerance=1e-6,\n",
|
||||
" line_search=True,\n",
|
||||
")\n",
|
||||
"\n",
|
||||
"# Solve (requires proper boundary conditions and fluid backend)\n",
|
||||
"try:\n",
|
||||
" result = solver.solve(system)\n",
|
||||
" print(f\"Converged in {result.iterations} iterations\")\n",
|
||||
"except entropyk.SolverError as e:\n",
|
||||
" print(f\"Solver error: {e}\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
@@ -294,15 +348,28 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "NameError",
|
||||
"evalue": "name 'entropyk' is not defined",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[31m---------------------------------------------------------------------------\u001b[39m",
|
||||
"\u001b[31mNameError\u001b[39m Traceback (most recent call last)",
|
||||
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 48\u001b[39m\n\u001b[32m 46\u001b[39m \u001b[38;5;66;03m# Test\u001b[39;00m\n\u001b[32m 47\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m fluid \u001b[38;5;129;01min\u001b[39;00m [\u001b[33m\"\u001b[39m\u001b[33mR134a\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mR32\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mR290\u001b[39m\u001b[33m\"\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mR744\u001b[39m\u001b[33m\"\u001b[39m]:\n\u001b[32m---> \u001b[39m\u001b[32m48\u001b[39m system = \u001b[43mcreate_cycle_for_fluid\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfluid\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mClimatisation\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[32m 49\u001b[39m \u001b[38;5;28mprint\u001b[39m(\u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfluid\u001b[38;5;132;01m:\u001b[39;00m\u001b[33m8s\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00msystem.state_vector_len\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m variables d\u001b[39m\u001b[33m'\u001b[39m\u001b[33métat\u001b[39m\u001b[33m\"\u001b[39m)\n",
|
||||
"\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[2]\u001b[39m\u001b[32m, line 21\u001b[39m, in \u001b[36mcreate_cycle_for_fluid\u001b[39m\u001b[34m(fluid, app_name)\u001b[39m\n\u001b[32m 18\u001b[39m ua_cond = \u001b[32m5000.0\u001b[39m\n\u001b[32m 19\u001b[39m ua_evap = \u001b[32m3000.0\u001b[39m\n\u001b[32m---> \u001b[39m\u001b[32m21\u001b[39m system = \u001b[43mentropyk\u001b[49m.System()\n\u001b[32m 23\u001b[39m comp = entropyk.Compressor(\n\u001b[32m 24\u001b[39m speed_rpm=\u001b[32m2900.0\u001b[39m,\n\u001b[32m 25\u001b[39m displacement=\u001b[32m0.0001\u001b[39m,\n\u001b[32m 26\u001b[39m efficiency=\u001b[32m0.85\u001b[39m,\n\u001b[32m 27\u001b[39m fluid=fluid\n\u001b[32m 28\u001b[39m )\n\u001b[32m 29\u001b[39m cond = entropyk.Condenser(ua=ua_cond)\n",
|
||||
"\u001b[31mNameError\u001b[39m: name 'entropyk' is not defined"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def create_cycle_for_fluid(fluid: str, app_name: str = \"Climatisation\"):\n",
|
||||
" \"\"\"\n",
|
||||
" Crée un cycle optimisé pour un fluide et une application donnée.\n",
|
||||
" \"\"\"\n",
|
||||
" params = applications[app_name]\n",
|
||||
" #params = applications[app_name]\n",
|
||||
" \n",
|
||||
" # Ajuster les composants selon le fluide\n",
|
||||
" if fluid == \"R744\":\n",
|
||||
@@ -349,6 +416,253 @@
|
||||
" print(f\"{fluid:8s}: {system.state_vector_len} variables d'état\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Construction du système Entropyk complet...\n",
|
||||
"Finalisation du graphe (Construction de la topologie)...\n",
|
||||
"Propriétés du système : 18 composants, 17 connexions.\n",
|
||||
"Taille du vecteur d'état mathématique : 34 variables.\n",
|
||||
"\n",
|
||||
"Configuration de la stratégie de résolution...\n",
|
||||
"Lancement de la simulation (Newton uniquement)...\n",
|
||||
"\n",
|
||||
"❌ Erreur du solveur : Solver diverged: Jacobian is singular - cannot solve linear system\n",
|
||||
"Note: Ce comportement peut arriver si les paramètres (taille des tuyaux, coeffs, températures)\n",
|
||||
"dépassent le domaine thermodynamique du fluide ou si le graphe manque de contraintes aux limites.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"import entropyk\n",
|
||||
"import math\n",
|
||||
"\n",
|
||||
"def build_complete_system():\n",
|
||||
" # ── 1. Initialisation du graphe du système ──\n",
|
||||
" system = entropyk.System()\n",
|
||||
" print(\"Construction du système Entropyk complet...\")\n",
|
||||
"\n",
|
||||
" # Paramètres fluides\n",
|
||||
" refrigerant = \"R410A\"\n",
|
||||
" water = \"Water\"\n",
|
||||
"\n",
|
||||
" # =========================================================================\n",
|
||||
" # BOUCLE 1 : CIRCUIT FRIGORIFIQUE (REFRIGERANT R410A)\n",
|
||||
" # =========================================================================\n",
|
||||
" \n",
|
||||
" # 1.1 Compresseur (Modèle Polynomial AHRI 540)\n",
|
||||
" compressor = system.add_component(entropyk.Compressor(\n",
|
||||
" m1=0.85, m2=2.5, m3=500.0, m4=1500.0, m5=-2.5, m6=1.8, m7=600.0, m8=1600.0, m9=-3.0, m10=2.0,\n",
|
||||
" speed_rpm=3600.0,\n",
|
||||
" displacement=0.00008,\n",
|
||||
" efficiency=0.88,\n",
|
||||
" fluid=refrigerant\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" # 1.2 Tuyau de refoulement (vers condenseur)\n",
|
||||
" pipe_hot = system.add_component(entropyk.Pipe(\n",
|
||||
" length=5.0,\n",
|
||||
" diameter=0.02,\n",
|
||||
" fluid=refrigerant\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" # 1.3 Condenseur (Rejet de chaleur)\n",
|
||||
" condenser = system.add_component(entropyk.Condenser(\n",
|
||||
" ua=4500.0,\n",
|
||||
" fluid=refrigerant,\n",
|
||||
" water_temp=30.0, # Température d'entrée côté eau/air\n",
|
||||
" water_flow=2.0\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" # 1.4 Ligne liquide\n",
|
||||
" pipe_liquid = system.add_component(entropyk.Pipe(\n",
|
||||
" length=10.0,\n",
|
||||
" diameter=0.015,\n",
|
||||
" fluid=refrigerant\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" # 1.5 Division du débit (FlowSplitter) vers 2 évaporateurs\n",
|
||||
" splitter = system.add_component(entropyk.FlowSplitter(n_outlets=2))\n",
|
||||
" \n",
|
||||
" # 1.6 Branche A : Détendeur + Évaporateur 1\n",
|
||||
" exv_a = system.add_component(entropyk.ExpansionValve(fluid=refrigerant, opening=0.5))\n",
|
||||
" evap_a = system.add_component(entropyk.Evaporator(\n",
|
||||
" ua=2000.0,\n",
|
||||
" fluid=refrigerant,\n",
|
||||
" water_temp=12.0,\n",
|
||||
" water_flow=1.0\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" # 1.7 Branche B : Détendeur + Évaporateur 2\n",
|
||||
" exv_b = system.add_component(entropyk.ExpansionValve(fluid=refrigerant, opening=0.5))\n",
|
||||
" evap_b = system.add_component(entropyk.Evaporator(\n",
|
||||
" ua=2000.0,\n",
|
||||
" fluid=refrigerant,\n",
|
||||
" water_temp=15.0, # Température d'eau légèrement différente\n",
|
||||
" water_flow=1.0\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" # 1.8 Fusion du débit (FlowMerger)\n",
|
||||
" merger = system.add_component(entropyk.FlowMerger(n_inlets=2))\n",
|
||||
" \n",
|
||||
" # 1.9 Tuyau d'aspiration (retour compresseur)\n",
|
||||
" pipe_suction = system.add_component(entropyk.Pipe(\n",
|
||||
" length=5.0,\n",
|
||||
" diameter=0.025,\n",
|
||||
" fluid=refrigerant\n",
|
||||
" ))\n",
|
||||
"\n",
|
||||
" # --- Connexions de la boucle frigo ---\n",
|
||||
" system.add_edge(compressor, pipe_hot)\n",
|
||||
" system.add_edge(pipe_hot, condenser)\n",
|
||||
" system.add_edge(condenser, pipe_liquid)\n",
|
||||
" \n",
|
||||
" # Splitter\n",
|
||||
" system.add_edge(pipe_liquid, splitter)\n",
|
||||
" system.add_edge(splitter, exv_a)\n",
|
||||
" system.add_edge(splitter, exv_b)\n",
|
||||
" \n",
|
||||
" # Branches parallèles\n",
|
||||
" system.add_edge(exv_a, evap_a)\n",
|
||||
" system.add_edge(exv_b, evap_b)\n",
|
||||
" \n",
|
||||
" # Merger\n",
|
||||
" system.add_edge(evap_a, merger)\n",
|
||||
" system.add_edge(evap_b, merger)\n",
|
||||
" \n",
|
||||
" system.add_edge(merger, pipe_suction)\n",
|
||||
" system.add_edge(pipe_suction, compressor)\n",
|
||||
"\n",
|
||||
" # =========================================================================\n",
|
||||
" # BOUCLE 2 : CIRCUIT RÉSEAU HYDRAULIQUE (EAU - Côté Évaporateur Principal)\n",
|
||||
" # (Juste de la tuyauterie et une pompe pour montrer les FlowSource/FlowSink)\n",
|
||||
" # =========================================================================\n",
|
||||
" \n",
|
||||
" water_source = system.add_component(entropyk.FlowSource(\n",
|
||||
" fluid=water,\n",
|
||||
" pressure_pa=101325.0, # 1 atm\n",
|
||||
" temperature_k=285.15 # 12 °C\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" water_pump = system.add_component(entropyk.Pump(\n",
|
||||
" pressure_rise_pa=50000.0, # 0.5 bar\n",
|
||||
" efficiency=0.6\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" water_pipe = system.add_component(entropyk.Pipe(\n",
|
||||
" length=20.0,\n",
|
||||
" diameter=0.05,\n",
|
||||
" fluid=water\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" water_sink = system.add_component(entropyk.FlowSink())\n",
|
||||
" \n",
|
||||
" # --- Connexions Hydrauliques Principales ---\n",
|
||||
" system.add_edge(water_source, water_pump)\n",
|
||||
" system.add_edge(water_pump, water_pipe)\n",
|
||||
" system.add_edge(water_pipe, water_sink)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" # =========================================================================\n",
|
||||
" # BOUCLE 3 : CIRCUIT VENTILATION (AIR - Côté Condenseur)\n",
|
||||
" # =========================================================================\n",
|
||||
" \n",
|
||||
" air_source = system.add_component(entropyk.FlowSource(\n",
|
||||
" fluid=\"Air\",\n",
|
||||
" pressure_pa=101325.0,\n",
|
||||
" temperature_k=308.15 # 35 °C d'air ambiant\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" condenser_fan = system.add_component(entropyk.Fan(\n",
|
||||
" pressure_rise_pa=200.0, # 200 Pa de montée en pression par le ventilo\n",
|
||||
" efficiency=0.5\n",
|
||||
" ))\n",
|
||||
" \n",
|
||||
" air_sink = system.add_component(entropyk.FlowSink())\n",
|
||||
" \n",
|
||||
" # --- Connexions Ventilation ---\n",
|
||||
" system.add_edge(air_source, condenser_fan)\n",
|
||||
" system.add_edge(condenser_fan, air_sink)\n",
|
||||
"\n",
|
||||
"\n",
|
||||
" # ── 4. Finalisation du système ──\n",
|
||||
" print(\"Finalisation du graphe (Construction de la topologie)...\")\n",
|
||||
" system.finalize()\n",
|
||||
" print(f\"Propriétés du système : {system.node_count} composants, {system.edge_count} connexions.\")\n",
|
||||
" print(f\"Taille du vecteur d'état mathématique : {system.state_vector_len} variables.\")\n",
|
||||
" \n",
|
||||
" return system\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"def solve_system(system):\n",
|
||||
" # ── 5. Configuration Avancée du Solveur (Story 6-6) ──\n",
|
||||
" print(\"\\nConfiguration de la stratégie de résolution...\")\n",
|
||||
"\n",
|
||||
" # (Optionnel) Critères de convergence fins\n",
|
||||
" convergence = entropyk.ConvergenceCriteria(\n",
|
||||
" pressure_tolerance_pa=5.0,\n",
|
||||
" mass_balance_tolerance_kgs=1e-6,\n",
|
||||
" energy_balance_tolerance_w=1e-3\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" # (Optionnel) Jacobian Freezing pour aller plus vite\n",
|
||||
" freezing = entropyk.JacobianFreezingConfig(\n",
|
||||
" max_frozen_iters=4,\n",
|
||||
" threshold=0.1\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" # Configuration Newton avec tolérances avancées\n",
|
||||
" newton_config = entropyk.NewtonConfig(\n",
|
||||
" max_iterations=150,\n",
|
||||
" tolerance=1e-5,\n",
|
||||
" line_search=True,\n",
|
||||
" use_numerical_jacobian=True,\n",
|
||||
" jacobian_freezing=freezing,\n",
|
||||
" convergence_criteria=convergence,\n",
|
||||
" initial_state=[1000000.0, 450000.0] * 17\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" # Configuration Picard robuste en cas d'échec de Newton\n",
|
||||
" picard_config = entropyk.PicardConfig(\n",
|
||||
" max_iterations=500,\n",
|
||||
" tolerance=1e-4,\n",
|
||||
" relaxation=0.4,\n",
|
||||
" convergence_criteria=convergence\n",
|
||||
" )\n",
|
||||
"\n",
|
||||
" # ── 6. Lancement du calcul ──\n",
|
||||
" print(\"Lancement de la simulation (Newton uniquement)...\")\n",
|
||||
" try:\n",
|
||||
" result = newton_config.solve(system)\n",
|
||||
" \n",
|
||||
" status = result.status\n",
|
||||
" print(f\"\\n✅ Simulation terminée avec succès !\")\n",
|
||||
" print(f\"Statut : {status}\")\n",
|
||||
" print(f\"Itérations : {result.iterations}\")\n",
|
||||
" print(f\"Résidu final : {result.final_residual:.2e}\")\n",
|
||||
" \n",
|
||||
" # Le résultat contient le vecteur d'état complet\n",
|
||||
" state_vec = result.state_vector\n",
|
||||
" print(f\"Aperçu des 5 premières variables d'état : {state_vec[:5]}\")\n",
|
||||
" \n",
|
||||
" except entropyk.TimeoutError:\n",
|
||||
" print(\"\\n❌ Le solveur a dépassé le temps imparti (Timeout).\")\n",
|
||||
" except entropyk.SolverError as e:\n",
|
||||
" print(f\"\\n❌ Erreur du solveur : {e}\")\n",
|
||||
" print(\"Note: Ce comportement peut arriver si les paramètres (taille des tuyaux, coeffs, températures)\")\n",
|
||||
" print(\"dépassent le domaine thermodynamique du fluide ou si le graphe manque de contraintes aux limites.\")\n",
|
||||
"\n",
|
||||
"if __name__ == \"__main__\":\n",
|
||||
" system = build_complete_system()\n",
|
||||
" solve_system(system)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
@@ -387,7 +701,7 @@
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3",
|
||||
"display_name": "entropyk",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
@@ -401,7 +715,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.0"
|
||||
"version": "3.13.11"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
||||
Reference in New Issue
Block a user