gpt-5生成圆柱blockmesh脚本
用法示例
./genCylinderblockMesh.sh -h
Usage: ./genCylinderblockMesh.sh [--x0 X] [--y0 Y] [--z0 Z] --H HEIGHT --r RADIUS --nZ NZ [--nR NR] [--nBox NBOX] [--boxFactor BF] [--out PATH]./genCylinderblockMesh.sh --x0 10 --y0 15 --z0 20 --H 15 --r 2.5 --nZ 30 --nR 5 --nBox 10 --out ./system/blockMeshDict
结果
脚本
#!/usr/bin/env bash
# Generate blockMeshDict for OpenFOAM-2.3.x using arc edges (no geometry/project).
# Parameters:
# --x0, --y0 : cylinder center (default 0, 0)
# --z0 : start z (default 0)
# --H : cylinder height (REQUIRED)
# --r : cylinder radius (REQUIRED)
# --nR : radial divisions in ring blocks (default 4)
# --nBox : divisions of inner square per side (default 10)
# --nZ : axial divisions (REQUIRED)
# --boxFactor: inner square half-length = boxFactor * r (default 0.5)
# --out : output path (default blockMeshDict)
#
# Example:
# ./gen_blockMesh.sh --H 0.4 --r 0.02 --nZ 160 --out system/blockMeshDictset -euo pipefail
export LC_ALL=C# defaults
x0=0.0
y0=0.0
z0=0.0
H=""
r=""
nR=4
nBox=10
nZ=""
boxFactor=0.5
out="blockMeshDict"# parse args
while [[ $# -gt 0 ]]; docase "$1" in--x0) x0="$2"; shift 2;;--y0) y0="$2"; shift 2;;--z0) z0="$2"; shift 2;;--H) H="$2"; shift 2;;--r) r="$2"; shift 2;;--nR) nR="$2"; shift 2;;--nBox) nBox="$2"; shift 2;;--nZ) nZ="$2"; shift 2;;--boxFactor) boxFactor="$2"; shift 2;;--out) out="$2"; shift 2;;-h|--help)echo "Usage: $0 [--x0 X] [--y0 Y] [--z0 Z] --H HEIGHT --r RADIUS --nZ NZ [--nR NR] [--nBox NBOX] [--boxFactor BF] [--out PATH]"exit 0;;*) echo "Unknown arg: $1" >&2; exit 1;;esac
done# required checks
if [[ -z "${H}" || -z "${r}" || -z "${nZ}" ]]; thenecho "Error: --H, --r, and --nZ are required. Try -h for help." >&2exit 1
fi# compute derived values using awk (portable float math)
read -r zMin zMax box rs2 cx cy <<< "$(awk -v z0="$z0" -v H="$H" -v r="$r" -v bf="$boxFactor" -v x0="$x0" -v y0="$y0" 'BEGIN{zMin = z0; zMax = z0 + H;box = bf * r;rs2 = r / sqrt(2.0);printf("%.10f %.10f %.10f %.10f %.10f %.10f", zMin, zMax, box, rs2, x0, y0);}'
)"# helper to format a point (center + offset)
pt() {# $1: dx, $2: dy, $3: zawk -v cx="$cx" -v cy="$cy" -v dx="$1" -v dy="$2" -v z="$3" 'BEGIN{printf("(%.10f %.10f %.10f)", cx+dx, cy+dy, z);}'
}# helper for arc mid points (center + offset)
mid() {# $1: mx, $2: my, $3: zawk -v cx="$cx" -v cy="$cy" -v mx="$1" -v my="$2" -v z="$3" 'BEGIN{printf("(%.10f %.10f %.10f)", cx+mx, cy+my, z);}'
}# ensure output dir
mkdir -p "$(dirname "$out")"# generate blockMeshDict
cat > "$out" <<EOF
/*--------------------------------*- C++ -*----------------------------------*\\
| ========= | |
| \\\\ / Field | OpenFOAM: The Open Source CFD Toolbox |
| \\\\ / Operation | Version: 2.3.x |
| \\\\ / And | Web: www.OpenFOAM.org |
| \\\\/ Manipulation | |
\\*---------------------------------------------------------------------------*/
FoamFile
{version 2.0;format ascii;class dictionary;object blockMeshDict;
}// Auto-generated: x0=${cx}, y0=${cy}, z in [${zMin}, ${zMax}], r=${r}, box=${box}, nR=${nR}, nBox=${nBox}, nZ=${nZ}convertToMeters 1;vertices
(// Inner square @ zMin$(pt -$box -$box $zMin) // 0$(pt $box -$box $zMin) // 1$(pt -$box $box $zMin) // 2$(pt $box $box $zMin) // 3// Outer ring @ zMin (45-degree points)$(pt -$rs2 -$rs2 $zMin) // 4$(pt $rs2 -$rs2 $zMin) // 5$(pt -$rs2 $rs2 $zMin) // 6$(pt $rs2 $rs2 $zMin) // 7// Inner square @ zMax$(pt -$box -$box $zMax) // 8$(pt $box -$box $zMax) // 9$(pt -$box $box $zMax) // 10$(pt $box $box $zMax) // 11// Outer ring @ zMax$(pt -$rs2 -$rs2 $zMax) // 12$(pt $rs2 -$rs2 $zMax) // 13$(pt -$rs2 $rs2 $zMax) // 14$(pt $rs2 $rs2 $zMax) // 15
);blocks
(// ring blocks + center blockhex ( 4 5 1 0 12 13 9 8) (${nBox} ${nR} ${nZ}) simpleGrading (1 1 1)hex ( 4 0 2 6 12 8 10 14) (${nR} ${nBox} ${nZ}) simpleGrading (1 1 1)hex ( 1 5 7 3 9 13 15 11) (${nR} ${nBox} ${nZ}) simpleGrading (1 1 1)hex ( 2 3 7 6 10 11 15 14) (${nBox} ${nR} ${nZ}) simpleGrading (1 1 1)hex ( 0 1 3 2 8 9 11 10) (${nBox} ${nBox} ${nZ}) simpleGrading (1 1 1)
);edges
(// arcs @ zMinarc 4 5 $(mid 0.0 -$r $zMin)arc 5 7 $(mid $r 0.0 $zMin)arc 6 7 $(mid 0.0 $r $zMin)arc 4 6 $(mid -$r 0.0 $zMin)// arcs @ zMaxarc 12 13 $(mid 0.0 -$r $zMax)arc 13 15 $(mid $r 0.0 $zMax)arc 12 14 $(mid -$r 0.0 $zMax)arc 14 15 $(mid 0.0 $r $zMax)
);boundary
(INLET{type patch;faces((0 1 3 2)(0 2 6 4)(0 1 5 4)(1 5 7 3)(2 3 7 6));}OUTLET{type patch;faces((8 9 11 10)(8 10 14 12)(8 9 13 12)(9 13 15 11)(10 11 15 14));}WALL{type wall;faces((4 12 14 6)(4 5 13 12)(5 13 15 7)(6 7 15 14));}
);// ************************************************************************* //
EOFecho "Generated: $out"