SU2

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

Ver também