OpenFOAM

Descrição

De acordo com a página do OpenFOAM, OpenFOAM é o software livre e open-source de CFD (Computational Fluid Dynamics) desenvolvido principalmente pela OpenCFD Ltd desde 2004. Possui uma vasta gama de funcionalidades para resolver problemas complexos de fluidos envolvendo reações químicas, turbulência, transferência de calor, acústica, mecânica dos sólidos e eletromagnetismo.

Versões Disponíveis

  • openfoam/4.1

  • openfoam/5.x (default)

  • openfoam/7

  • openfoam/8

  • openfoam/1912

  • openfoam/2012

  • openfoam/2112

Carregando o Módulo

# Carregar OpenFOAM
module load openfoam/2012

# Verificar instalação
foamSystemCheck
foamVersion

Submissão de Jobs Seriais

submit_openfoam_serial.sh
#!/bin/bash
#SBATCH -J openfoam_serial
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 24:00:00
#SBATCH --mem=8G

export INPUT="cavity.zip"
export OUTPUT="cavity_results.zip"

module load openfoam/2012

job-nanny ./run_serial.sh
run_serial.sh
#!/bin/bash

# Descompactar caso
unzip cavity.zip
cd cavity

# Executar
blockMesh
icoFoam

# Compactar resultados
cd ..
zip -r cavity_results.zip cavity/[0-9]* cavity/constant cavity/system

Submissão de Jobs Paralelos

submit_openfoam_mpi.sh
#!/bin/bash
#SBATCH -J openfoam_mpi
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 48:00:00
#SBATCH --mem-per-cpu=2G

export INPUT="motorBike.zip"
export OUTPUT="motorBike_results.zip"

module load openfoam/2012

job-nanny ./run_parallel.sh
run_parallel.sh
#!/bin/bash

# Descompactar
unzip motorBike.zip
cd motorBike

# Decompor domínio
decomposePar -copyZero

# Executar em paralelo
mpirun -np $SLURM_NTASTS simpleFoam -parallel

# Reconstruir resultados
reconstructPar

# Compactar resultados
cd ..
zip -r motorBike_results.zip motorBike/[0-9]* motorBike/constant motorBike/system

Exemplo: Caso Cavidade (icoFoam)

prepare_cavity.sh
#!/bin/bash
#SBATCH -J prepare_cavity
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 00:30:00
#SBATCH --mem=2G

module load openfoam/2012

# Copiar caso tutorial
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity .
cd cavity

# Gerar malha
blockMesh

# Executar
icoFoam

# Visualizar resultados (para pós-processamento)
# paraFoam

Arquivos de Configuração do Caso

system/controlDict

application     icoFoam;
startFrom       startTime;
startTime       0;
stopAt          endTime;
endTime         0.5;
deltaT          0.005;
writeControl    timeStep;
writeInterval   20;
purgeWrite      0;
writeFormat     ascii;
writePrecision  6;
writeCompression off;
timeFormat      general;
timePrecision   6;
runTimeModifiable yes;

system/fvSchemes

ddtSchemes
{
    default         Euler;
}

gradSchemes
{
    default         Gauss linear;
}

divSchemes
{
    default         none;
    div(phi,U)      Gauss linear;
}

laplacianSchemes
{
    default         Gauss linear corrected;
}

interpolationSchemes
{
    default         linear;
}

snGradSchemes
{
    default         corrected;
}

system/fvSolution

solvers
{
    p
    {
        solver          PCG;
        preconditioner  DIC;
        tolerance       1e-06;
        relTol          0.05;
    }

    U
    {
        solver          smoothSolver;
        smoother        symGaussSeidel;
        tolerance       1e-05;
        relTol          0;
    }
}

PISO
{
    nCorrectors     2;
    nNonOrthogonalCorrectors 0;
    pRefCell        0;
    pRefValue       0;
}

constant/transportProperties

nu              [0 2 -1 0 0 0 0] 0.01;

constant/polyMesh/blockMeshDict

vertices
(
    (0 0 0)
    (1 0 0)
    (1 1 0)
    (0 1 0)
    (0 0 0.1)
    (1 0 0.1)
    (1 1 0.1)
    (0 1 0.1)
);

blocks
(
    hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1)
);

edges
(
);

boundary
(
    movingWall
    {
        type wall;
        faces
        (
            (3 7 6 2)
        );
    }
    fixedWalls
    {
        type wall;
        faces
        (
            (0 4 7 3)
            (2 6 5 1)
            (1 5 4 0)
            (4 5 6 7)
            (0 3 2 1)
        );
    }
);

mergePatchPairs
(
);

Job Array para Múltiplos Casos

submit_openfoam_array.sh
#!/bin/bash
#SBATCH -J openfoam_array
#SBATCH --array=1-5
#SBATCH -N 2
#SBATCH --ntasks-per-node=28
#SBATCH -t 48:00:00
#SBATCH --mem-per-cpu=2G

CASES=(
    "cavity"
    "motorBike"
    "damBreak"
    "pitzDaily"
    "airFoil"
)

CASE=${CASES[$SLURM_ARRAY_TASK_ID-1]}
export INPUT="${CASE}.zip"
export OUTPUT="${CASE}_results/"

module load openfoam/2012

mkdir -p ${CASE}_results
cd ${CASE}_results
unzip ../${CASE}.zip
cd ${CASE}

# Decompor para execução paralela
decomposePar -copyZero

# Executar
mpirun -np $SLURM_NTASKS simpleFoam -parallel

# Reconstruir
reconstructPar

cd ../..

Pós-processamento

postprocess_openfoam.sh
#!/bin/bash
#SBATCH -J openfoam_post
#SBATCH -N 1
#SBATCH -n 1
#SBATCH -t 02:00:00
#SBATCH --mem=4G

export INPUT="cavity"
export OUTPUT="postprocessing/"

module load openfoam/2012

cd cavity

# Extrair forças
forces

# Calcular coeficientes de parede
wallShearStress

# Extrair cortes
sample

# Gerar gráficos com Python
cat > plot.py << 'EOF'
import numpy as np
import matplotlib.pyplot as plt

# Ler dados de velocidade
data = np.loadtxt('postProcessing/sample/0/U.xy')
x = data[:,0]
Ux = data[:,1]

plt.figure()
plt.plot(x, Ux)
plt.xlabel('x (m)')
plt.ylabel('Ux (m/s)')
plt.title('Perfil de velocidade')
plt.grid(True)
plt.savefig('velocity_profile.png')
EOF

python plot.py

Referências

Ver também