SU2
Nesta seção:
Descrição
De acordo com a página do SU2, SU2 é uma coleção open-source de ferramentas em C++ para realizar análise de Equações Diferenciais Parciais (PDE) e resolver problemas de otimização com restrições PDE. É projetado para Dinâmica de Fluidos Computacional (CFD) e otimização de forma aerodinâmica, mas é extensível para outros conjuntos de equações governantes.
Versões Disponíveis
su2/6.0.0 (default)
su2/6.2.0
Carregando o Módulo
# Carregar SU2
module load su2/6.2.0
# Verificar instalação
SU2_CFD -h
Submissão de Jobs Seriais
submit_su2_serial.sh
#!/bin/bash
#SBATCH -J su2_serial
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 24:00:00
#SBATCH --mem=8G
export INPUT="inv_NACA0012.cfg"
export OUTPUT="flow.out"
module load su2/6.2.0
job-nanny SU2_CFD inv_NACA0012.cfg > flow.out
Submissão de Jobs MPI
submit_su2_mpi.sh
#!/bin/bash
#SBATCH -J su2_mpi
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 48:00:00
#SBATCH --mem-per-cpu=2G
export INPUT="inv_NACA0012.cfg"
export OUTPUT="flow.out"
module load su2/6.2.0
job-nanny mpirun -np $SLURM_NTASKS SU2_CFD inv_NACA0012.cfg > flow.out
Exemplo de Arquivo de Configuração
inv_NACA0012.cfg
% Physical problem definition
PHYSICAL_PROBLEM= NAVIER_STOKES
KIND_TURB_MODEL= SA
MACH_NUMBER= 0.8
ANGLE_OF_ATTACK= 1.25
SIDESLIP_ANGLE= 0.0
REYNOLDS_NUMBER= 6.5e6
REYNOLDS_LENGTH= 1.0
% Reference values for non-dimensionalization
REF_ORIGIN_MOMENT_X = 0.25
REF_ORIGIN_MOMENT_Y = 0.00
REF_ORIGIN_MOMENT_Z = 0.00
REF_LENGTH= 1.0
REF_AREA= 1.0
% Mesh
MESH_FILENAME= mesh_NACA0012_inv.su2
MESH_FORMAT= SU2
% Output
OUTPUT_FORMAT= TECPLOT
VOLUME_OUTPUT= (VELOCITY, PRESSURE, MACH)
SCREEN_OUTPUT= (WARNING, ITER, RMS_RHO, RMS_RHO, LIFT, DRAG)
% Solver
NUM_METHOD_GRAD= WEIGHTED_LEAST_SQUARES
CFL_NUMBER= 1.0
CFL_ADAPT= NO
MAX_ITER= 10000
% Linear solver
LINEAR_SOLVER= FGMRES
LINEAR_SOLVER_PREC= LU_SGS
LINEAR_SOLVER_ERROR= 1E-6
LINEAR_SOLVER_ITER= 10
% Convergence
CONV_FIELD= RMS_RHO
CONV_RESIDUAL_MINVAL= -12
CONV_STARTITER= 10
Otimização de Forma
submit_su2_opt.sh
#!/bin/bash
#SBATCH -J su2_opt
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 72:00:00
#SBATCH --mem-per-cpu=2G
export INPUT="shape_opt.cfg"
export OUTPUT="optimization.log"
module load su2/6.2.0
job-nanny mpirun -np $SLURM_NTASKS SU2_CFD shape_opt.cfg > flow.log
job-nanny SU2_DOT shape_opt.cfg > adjoint.log
job-nanny SU2_DEF shape_opt.cfg > mesh_deform.log
job-nanny SU2_GEO shape_opt.cfg > geometry.log
shape_opt.cfg
% Configuração para otimização de forma
OPT_OBJECTIVE= DRAG
OPT_GRADIENT= CONTINUOUS_ADJOINT
OPT_METHOD= STEEPEST_DESCENT
OPT_STEP_SIZE= 0.01
OPT_ITERATIONS= 50
OPT_LINEAR_SOLVER= FGMRES
OPT_LINEAR_SOLVER_PREC= ILU
OPT_LINEAR_SOLVER_ERROR= 1E-6
Job Array para Varredura de Parâmetros
submit_su2_array.sh
#!/bin/bash
#SBATCH -J su2_array
#SBATCH --array=1-5
#SBATCH -N 1
#SBATCH -n 28
#SBATCH -t 24:00:00
#SBATCH --mem-per-cpu=2G
AOA_VALUES=(0.0 1.0 2.0 3.0 4.0)
AOA=${AOA_VALUES[$SLURM_ARRAY_TASK_ID-1]}
export INPUT="template.cfg"
export OUTPUT="aoa_${AOA}/"
module load su2/6.2.0
mkdir -p aoa_${AOA}
cd aoa_${AOA}
cp ../template.cfg .
# Modificar ângulo de ataque
sed -i "s/ANGLE_OF_ATTACK=.*/ANGLE_OF_ATTACK= $AOA/" template.cfg
job-nanny SU2_CFD template.cfg > flow_${AOA}.out
# Extrair coeficientes
grep "Total CL" flow_${AOA}.out | tail -1 >> ../CL_values.txt
grep "Total CD" flow_${AOA}.out | tail -1 >> ../CD_values.txt
Análise de Resultados
analyze_su2.sh
#!/bin/bash
#SBATCH -J analyze_su2
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 01:00:00
#SBATCH --mem=2G
# Coletar coeficientes
echo "#AOA CL CD" > coefficients.txt
for dir in aoa_*/; do
aoa=$(basename $dir | sed 's/aoa_//')
cl=$(grep "Total CL" ${dir}flow_*.out | tail -1 | awk '{print $5}')
cd_val=$(grep "Total CD" ${dir}flow_*.out | tail -1 | awk '{print $5}')
echo "$aoa $cl $cd_val" >> coefficients.txt
done
# Plotar com Python
cat > plot_coeff.py << 'EOF'
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('coefficients.txt', skiprows=1)
aoa = data[:,0]
cl = data[:,1]
cd = data[:,2]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
ax1.plot(aoa, cl, 'bo-')
ax1.set_xlabel('Ângulo de ataque (graus)')
ax1.set_ylabel('CL')
ax1.set_title('Coeficiente de sustentação')
ax1.grid(True)
ax2.plot(aoa, cd, 'ro-')
ax2.set_xlabel('Ângulo de ataque (graus)')
ax2.set_ylabel('CD')
ax2.set_title('Coeficiente de arrasto')
ax2.grid(True)
plt.tight_layout()
plt.savefig('aerodynamics.png', dpi=150)
EOF
python plot_coeff.py
Referências
Documentação: https://su2code.github.io/docs_v7/home/
Tutoriais: https://su2code.github.io/tutorials/home/
GitHub: https://github.com/su2code/SU2
Ver também
OpenFOAM - CFD open-source
Foam-Extend - Extensão do OpenFOAM
Processando Simulações - Como submeter jobs