.
@@ -146,10 +146,10 @@ The experimental results for the mean density are given in Sandia’s database,
---
### References
-$$^{1}$$ R.W. Schefer, "Data Base for a Turbulent, Nonpremixed, Nonreacting, Propane-Jet Flow", tech. rep., Sandia National Laboratories, Livermore, CA, 2001.
+[1] R.W. Schefer, "Data Base for a Turbulent, Nonpremixed, Nonreacting, Propane-Jet Flow", tech. rep., Sandia National Laboratories, Livermore, CA, 2001.
-$$^{2}$$ R.W. Schefer, F.C. Gouldin, S.C. Johnson and W. Kollmann, "Nonreacting Turbulent Mixing Flows", tech. rep., Sandia National Laboratories, Livermore, CA, 1986.
+[2] R.W. Schefer, F.C. Gouldin, S.C. Johnson and W. Kollmann, "Nonreacting Turbulent Mixing Flows", tech. rep., Sandia National Laboratories, Livermore, CA, 1986.
-$$^{3}$$ A. Aghajanpour and S. Khatibi, "Numerical Simulation of Velocity and Mixture Fraction Fiels in a Turbulent Non-reacting Propane Jet Flow Issuing into Parallel Co-Flowing Air in Isothermal Condition through OpenFOAM", 2023.
+[3] A. Aghajanpour and S. Khatibi, "Numerical Simulation of Velocity and Mixture Fraction Fiels in a Turbulent Non-reacting Propane Jet Flow Issuing into Parallel Co-Flowing Air in Isothermal Condition through OpenFOAM", 2023.
-$$^{4}$$ V. Goncalves, G.M. Magalhaes and J.M. Vedovetto, "Urans Simulation of Turbulent Non-Premixed and Non-Reacting Propane Jet Flow", Associacao Brasileira de Engenharia e Ciencias Mecanicas - ABCM, 2021.
+[4] V. Goncalves, G.M. Magalhaes and J.M. Vedovetto, "Urans Simulation of Turbulent Non-Premixed and Non-Reacting Propane Jet Flow", Associacao Brasileira de Engenharia e Ciencias Mecanicas - ABCM, 2021.
From 914128eb48dd09ab2e03506c3bbe7a9b532a8541 Mon Sep 17 00:00:00 2001
From: Cristopher-Morales
Date: Sat, 4 Oct 2025 16:26:52 +0200
Subject: [PATCH 3/9] fix slash
---
_vandv/SANDIA_jet.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/_vandv/SANDIA_jet.md b/_vandv/SANDIA_jet.md
index 0c0a2ce5..a02e163c 100644
--- a/_vandv/SANDIA_jet.md
+++ b/_vandv/SANDIA_jet.md
@@ -8,9 +8,9 @@ permalink: /vandv/SANDIA_jet/
| `INC_RANS` | 7.5.0 | Sem Bosmans |
-The details of the 2D Axisymmetric, Nonpremixed, Nonreacting, Variable Density, Turbulent Jet Flow are taken from [Sandia National Laboratories database](https://tnfworkshop.org/data-archives/simplejet/propanejet) [1](#ref1),[2](#ref2)/.
+The details of the 2D Axisymmetric, Nonpremixed, Nonreacting, Variable Density, Turbulent Jet Flow are taken from [Sandia National Laboratories database](https://tnfworkshop.org/data-archives/simplejet/propanejet) [1](#ref1),[2](#ref2).
-By comparing the results of SU2 simulations case against the experimental data, as well as OpenFOAM simulation results [3](#ref3)/ (and MFSim [4](#ref4)/), we can build a high degree of confidence that the composition-dependent model is implemented correctly in combination with the SST turbulence model. Therefore, the goal of this case is to validate the implementation of the composition-dependent model in SU2.
+By comparing the results of SU2 simulations case against the experimental data, as well as OpenFOAM simulation results [3](#ref3) (and MFSim [4](#ref4)), we can build a high degree of confidence that the composition-dependent model is implemented correctly in combination with the SST turbulence model. Therefore, the goal of this case is to validate the implementation of the composition-dependent model in SU2.
## Problem Setup
The problem consists of a turbulent propane jet mixing into coflowing air. The schematic overview of this problem is given in the figure below:
@@ -137,7 +137,7 @@ The comparisons in the figures demonstrate good agreement with the experimental
-The experimental results for the mean density are given in Sandia’s database, but these are directly computed from the mixture fraction by making use of the ratio between the density of propane and air. The ratio that is being used for this purpose is 1.6 [2](#ref2)/, whereas the expected ratio is lower. The higher density ratio used in the post-processing of the experimental data results in a wider density range across the domain, which can partly explain the differences between the experimental data and the numerical results on the density along the jet centerline. Note that the spreading rate of a jet is independent of the initial density ratio [2](#ref2)/.
+The experimental results for the mean density are given in Sandia’s database, but these are directly computed from the mixture fraction by making use of the ratio between the density of propane and air. The ratio that is being used for this purpose is 1.6 [2](#ref2), whereas the expected ratio is lower. The higher density ratio used in the post-processing of the experimental data results in a wider density range across the domain, which can partly explain the differences between the experimental data and the numerical results on the density along the jet centerline. Note that the spreading rate of a jet is independent of the initial density ratio [2](#ref2).
From 098916134945e41ee013cabc7ff73e6e3ce9470d Mon Sep 17 00:00:00 2001
From: Cristopher-Morales
Date: Sat, 4 Oct 2025 16:34:25 +0200
Subject: [PATCH 4/9] extra fix
---
_vandv/SANDIA_jet.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_vandv/SANDIA_jet.md b/_vandv/SANDIA_jet.md
index a02e163c..1cfbb47f 100644
--- a/_vandv/SANDIA_jet.md
+++ b/_vandv/SANDIA_jet.md
@@ -19,7 +19,7 @@ The problem consists of a turbulent propane jet mixing into coflowing air. The s
-The flow conditions are based on the Sandia experiment $$^{1}$$:
+The flow conditions are based on the Sandia experiment [1](#ref1):
- Temperature = 294 [K]
- Thermodynamic pressure = 101325 [Pa]
From 8c821b514a988d0e20b30f3ee0afdc83690d92d9 Mon Sep 17 00:00:00 2001
From: Cristopher Morales
<98025159+Cristopher-Morales@users.noreply.github.com>
Date: Thu, 16 Oct 2025 13:56:20 +0200
Subject: [PATCH 5/9] reformulating (#187)
Co-authored-by: Cristopher-Morales
---
_docs_v7/Theory.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/_docs_v7/Theory.md b/_docs_v7/Theory.md
index 935d81a1..c03d7ddc 100644
--- a/_docs_v7/Theory.md
+++ b/_docs_v7/Theory.md
@@ -264,11 +264,12 @@ $$S$$ is a generic source term, and the convective and viscous fluxes are
$$\bar{F}^{c}(V) = \left\{\begin{array}{c} \rho Y_1 \bar{v} \\ ... \\\rho Y_{N-1} \, \bar{v} \end{array} \right\}$$
-$$\bar{F}^{v}(V,\nabla V) = \left\{\begin{array}{c} D \nabla Y_{1} \\ ... \\ D \nabla Y_{N-1} \end{array} \right\} $$
+$$\bar{F}^{v}(V,\nabla V) = \left\{\begin{array}{c} \rho D \nabla Y_{1} \\ ... \\ \rho D \nabla Y_{N-1} \end{array} \right\} $$
with $$D$$ $$[m^2/s]$$ being the mass diffusion.
+For turbulence modeling, the diffusion coefficient becomes:
-$$D = D_{lam} + \frac{\mu_T}{Sc_{T}}$$
+$$\rho D = \rho D_{lam} + \frac{\mu_T}{Sc_{T}}$$
where $$\mu_T$$ is the eddy viscosity and $$Sc_{T}$$ $$[-]$$ the turbulent Schmidt number.
From 757e60640d77c5f466066966e40d523e7fb0a1c5 Mon Sep 17 00:00:00 2001
From: Andrew Corrigan
Date: Fri, 12 Dec 2025 17:43:03 -0500
Subject: [PATCH 6/9] typo fix: two --> three
---
_docs/Installation.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_docs/Installation.md b/_docs/Installation.md
index e5df89cc..7a057be9 100644
--- a/_docs/Installation.md
+++ b/_docs/Installation.md
@@ -22,7 +22,7 @@ In general, all SU2 execution occurs via command line arguments within a termina
### Data Visualization
-Users of SU2 need a data visualization tool to post-process solution files. The software currently supports .vtk and .plt output formats natively read by ParaView and Tecplot, respectively. ParaView provides full functionality for data visualization and is freely available under an open source license. Tecplot is a commercially-licensed software package widely used by the scientific computing community and is available for purchase. Some SU2 results are also output to comma-separated value (.csv) files, which can be read by a number of software packages. Furthermore, CGNS output files can also be generated, which can also be read by the majority of visualization programs. The two most typical packages used by the development team are the following:
+Users of SU2 need a data visualization tool to post-process solution files. The software currently supports .vtk and .plt output formats natively read by ParaView and Tecplot, respectively. ParaView provides full functionality for data visualization and is freely available under an open source license. Tecplot is a commercially-licensed software package widely used by the scientific computing community and is available for purchase. Some SU2 results are also output to comma-separated value (.csv) files, which can be read by a number of software packages. Furthermore, CGNS output files can also be generated, which can also be read by the majority of visualization programs. The three most typical packages used by the development team are the following:
- ParaView
- Tecplot
- FieldView
From 97493a9c9004484e87882a122c10ba35dfc85edc Mon Sep 17 00:00:00 2001
From: bigfooted
Date: Mon, 22 Dec 2025 11:07:47 +0100
Subject: [PATCH 7/9] TFC python wrapper tutorial
---
.../multiphysics/TFC_python/TFC_python.md | 160 ++++++++++++++++++
.../TFC_python/images/TFC_c_init.png | Bin 0 -> 9059 bytes
.../TFC_python/images/TFC_source.png | Bin 0 -> 63422 bytes
.../TFC_python/images/TFC_temp.png | Bin 0 -> 19608 bytes
.../TFC_python/images/TFC_temp_init.png | Bin 0 -> 9758 bytes
5 files changed, 160 insertions(+)
create mode 100644 _tutorials/multiphysics/TFC_python/TFC_python.md
create mode 100644 tutorials_files/multiphysics/TFC_python/images/TFC_c_init.png
create mode 100644 tutorials_files/multiphysics/TFC_python/images/TFC_source.png
create mode 100644 tutorials_files/multiphysics/TFC_python/images/TFC_temp.png
create mode 100644 tutorials_files/multiphysics/TFC_python/images/TFC_temp_init.png
diff --git a/_tutorials/multiphysics/TFC_python/TFC_python.md b/_tutorials/multiphysics/TFC_python/TFC_python.md
new file mode 100644
index 00000000..823177bb
--- /dev/null
+++ b/_tutorials/multiphysics/TFC_python/TFC_python.md
@@ -0,0 +1,160 @@
+---
+title: User Defined combustion model with Python
+permalink: /tutorials/multiphysics/
+written_by: Nijso Beishuizen
+for_version: 8.3.0
+revised_by:
+revision_date:
+revised_version:
+solver: INC_NAVIER_STOKES
+requires: SU2_CFD, python
+complexity: advanced
+---
+
+
+Figure (1): high-pressure turbulent premixed flame of the Paul-Scherrer Institute (PSI), Switzerland
+
+## Goals
+
+In this tutorial we will simulate a high pressure turbulent premixed flame using the Turbulent Flamespeed Closure (TFC) model. This is a simple turbulent combustion model that can be implemented with a User Defined Source (UDS) in python.
+In this tutorial we will touch upon the following aspects:
+- Compile and run SU2 from within python.
+- Create a User Defined Source
+- Create User Defined boundary conditions
+- Create User Defined initial conditions
+
+
+## Resources
+
+The resources for this tutorial can be found in the [TFC_python](https://github.com/su2code/Tutorials/tree/master/multiphysics/TFC_python) directory in the [tutorial repository](https://github.com/su2code/Tutorials). You will need the configuration file ([psi.cfg](https://github.com/su2code/Tutorials/tree/master/multiphysics/TFC_python/psi.cfg)) and the mesh file ([psi.su2](https://github.com/su2code/Tutorials/tree/master/multiphysics/TFC_python/psi.su2)). Additionally, the Gmsh geometry is also provided so you can recreate the mesh yourself: [psi.geo](https://github.com/su2code/Tutorials/tree/master/multiphysics/TFC_python/psi.geo).
+
+
+### Background
+
+Turbulent combustion can be very expensive to simulate with high accuracy. The Turbulent Flamespeed Closure model, first pioneered by Zimont, is a very simple model for turbulent premixed combustion that aims to give accurate predictions for temperature in turbulent premixed combustion. In the TFC model, a transport equation for the progress variable is solved:
+
+$$ \frac{\partial c}{\dt} + \nabla \cdot (\rho u c) = \nabla\cdot (\frac{\mu_t}{Sc_t}\nabla c) + \rho S_c$$
+
+and the combustion source term is given by
+$$ S_c = \rho_u U_t \nabla c$$,
+with $\rho_u$ the unburnt density of the gas an $U_t$ the turbulent flamespeed.
+
+### Problem Setup
+
+First, SU2 needs to be compiled with python support. add the option *-Ddenable-pywrapper=true* to the meson setup. In this case, we compile including mpi support:
+
+```bash
+$ ./meson.py setup build --optimization=2 -Denable-mixedprec=true -Ddebug=false -Denable-pywrapper=true --warnlevel=3 -Denable-autodiff=false -Denable-directdiff=false -Dwith-mpi=enabled -Dcustom-mpi=true --prefix=/home/user/Codes/su2_github_develop/su2/
+```
+
+Note that the python wrapper (or your python setup) might need additional python packages that you need to install. Especially the python package mpi4py is important if you would like to work with mpi. The mpi4py package should match your installed mpi library, usually openmpi or mpich.
+
+
+### Mesh Description
+
+The geometry of this testcase is provided as a gmsh file and matches the size of the experiment of Griebel et al (2007), https://doi.org/10.1016/j.proci.2006.07.042.
+
+The mesh consists of a a coarse structured mesh with 12.4k cells and 12.7k points. The mesh was created using Gmsh and the configuration file to create the mesh can be found here: [psi.geo](https://github.com/su2code/Tutorials/tree/master/multiphysics/TFC_python/psi.geo). The only thing you need to do to create a mesh from the geometry is start Gmsh, and then load the .geo file. You will then see the geometry in the Gmsh visualization window. If you click on *Mesh->2D* the 2D mesh will be generated. You can then export the mesh as a .su2 file by choosing *File->Export*. The mesh will automatically be saved in su2 format when the filename has been given the extension .su2. In general, you should not choose *save all elements* because this will also save additional points that were used to construct the geometry but are not part of the final mesh, like for example the center of a circle.
+
+
+### Configuration File Options
+
+The setup for this testcase consists of 2 files:
+- the run.py file is the python file that runs the case. in this file, we simply import the su2 capabilities using *import pysu2*
+- the psi.cfg file for the basic setup. Some settings will be overwritten by python.
+
+In the configuration file, we have set up a case for turbulent incompressible flow using the k-omega SST model. We have also activated the energy equation (sensible enthalpy) and species transport.
+```
+SOLVER= INC_RANS
+KIND_TURB_MODEL= SST
+INC_ENERGY_EQUATION= YES
+KIND_SCALAR_MODEL= SPECIES_TRANSPORT
+```
+
+
+in the python file, we have defined several functions to set up the testcase. The first function creates a simple initial condition for the progress variable c:
+```python ################################################################## #
+# create a function for the initial progress variable c # ################################################################## #
+def initC(coord):
+ x = coord[0]
+ #y = coord[1]
+ #z = coord[2]
+ # location where the flame should be
+ flame_x = 0.012
+ if (x < flame_x):
+ C = 0.0
+ else:
+ C = 1.0
+
+ return C
+
+# ################################################################## #
+# loop over all vertices and set the species progress variable c # ################################################################## #
+def SetInitialSpecies(SU2Driver):
+ allCoords = SU2Driver.Coordinates()
+ iSPECIESSOLVER = SU2Driver.GetSolverIndices()['SPECIES']
+ for iPoint in range(SU2Driver.GetNumberNodes()):
+ coord = allCoords.Get(iPoint)
+ C = initC(coord)
+ # now update the initial condition for the species
+ SU2Driver.Solution(iSPECIESSOLVER).Set(iPoint,0,C)
+
+```
+
+
+Figure(2): initial temperature field created using the python wrapper
+
+Note that when setting the solution, we use the index=0, because we have only 1 species transport equation. When setting a flow solution, the index to the required field should be used. The indices can be retrieved using:
+```python
+print("indices of solver variables: ", getsolvar(driver))
+```
+with the result:
+```
+indices of solver variables: {'PRESSURE': 0, 'VELOCITY_X': 1, 'VELOCITY_Y': 2, 'TEMPERATURE': 3}
+```
+
+
+in the main function, we simply check in the config file if **RESTART=YES** to decide if we want to overwrite the solution for the progress variable.
+
+```python
+ # ### Check if we do a restart or not. ###
+ with open('psi.cfg') as f:
+ if 'RESTART_SOL= YES' in f.read():
+ if rank == 0:
+ print("restarting from file")
+ else:
+ # We can set an initial condition by calling this function:
+ if rank == 0:
+ print("Using user defined initial condition.")
+ SetInitialSpecies(driver)
+
+```
+
+The functions *update_temperature* and *zimont* implement the algebraic temperature relationship and the source term for the progress variable. Then in the main file, we simply loop over all points in the domain, compute the source term and add it to the progress variable equation:
+```python
+ Source = driver.UserDefinedSource(iSPECIESSOLVER)
+
+ # set the source term, per point
+ for i_node in range(driver.GetNumberNodes() - driver.GetNumberHaloNodes()):
+ # add source term:
+ # default TFC of Zimont: rho*Sc = rho_u * U_t * grad(c)
+ S = zimont(driver,i_node)
+ Source.Set(i_node,0,S)
+
+```
+
+Note that we do not add the source term to the halo nodes, which are used in parallel computing. In parallel computing we divide the mesh in parts and each cpu gets a part, which is called a rank. the points on the interface between ranks need information from the other side of the interface, but this information is computed on another rank. This is why each rank has halo points, which are copies of the points on the other side of the rank. They should not be taken into account in any computation, because they are in fact copies of points that *are* taken into account during the computation.
+
+
+### Running SU2
+
+If possible, always use a parallel setup to reduce computational time (wall clock time). Run the SU2_CFD executable in parallel using MPI and 4 nodes by entering:
+
+ $ mpirun -n 4 python run.py
+
+### Results
+
+
+Figure (3): visualization of the TFC source term for the turbulent combustion model, together with the streamlines. A large recirculation region has formed between the flame and the wall of the combustion chamber.
+
+Also note that we clip the species between [0,1]. Sometimes this clipping is necessary on coarse grids. In that case, this will be visible in the residuals of the progress variable, since clipping prevents convergence to the actual solution.
diff --git a/tutorials_files/multiphysics/TFC_python/images/TFC_c_init.png b/tutorials_files/multiphysics/TFC_python/images/TFC_c_init.png
new file mode 100644
index 0000000000000000000000000000000000000000..352caac5b018922b9e7391c9508bb8e9d1f56a8c
GIT binary patch
literal 9059
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