Planning CFD work: from problem to credibility evidence
เลือกฟิสิกส์ กริด เงื่อนไขขอบเขต และวิธีตรวจผล พร้อมเส้นทาง OpenFOAM, SU2 และ FLOWUnsteady
เริ่มจากปริมาณที่ต้องการ ไม่ใช่ภาพสี
จบบทนี้ผู้เรียนจะทำแผนกรณีศึกษาและบอกหลักฐานที่ยังขาดได้ ตัวอย่างเป้าหมายคือแรงขับเฉลี่ยที่รอบหมุนกำหนด ไม่ใช่เพียงภาพ wake สวย ๆ ต้องระบุเรขาคณิต อากาศ ความเร็ว รอบหมุน และความแม่นยำที่ต้องการก่อนจัดกริด แนวทางนี้สอดคล้องกับ NASA CFD Analysis Process
แผนกรณีศึกษาที่ผู้อื่นทำซ้ำได้
| สิ่งที่ต้องบันทึก | ตัวอย่างคำถาม |
|---|---|
| เป้าหมาย | ต้องการแรงเฉลี่ย แรงเป็นคาบ หรือรายละเอียด wake? |
| เรขาคณิตและโดเมน | แหล่งไฟล์ หน่วย ความละเอียดผิว และระยะขอบเขตไกลเพียงพอหรือไม่? |
| ฟิสิกส์ | Re และ Mach เฉพาะที่เท่าไร ใช้ laminar, RANS, URANS หรือ LES เพราะอะไร? |
| การหมุน | ใช้กรอบหมุนประมาณค่าเฉลี่ย หรือ mesh เคลื่อนที่เพื่อศึกษาผลตามเวลา? |
| ขอบเขต | ทางเข้า ทางออก ผนัง พื้น และเงื่อนไข turbulence กำหนดอย่างไร? |
| วิธีเชิงตัวเลข | solver, schemes, tolerances, time step และเกณฑ์หยุดคืออะไร? |
| หลักฐาน | มี log, กริดหลายระดับ, การตรวจมวล และชุดทดลองตรงเงื่อนไขหรือไม่? |
งาน steady อาจประมาณค่าเฉลี่ยได้ในบางกรณี แต่ไม่แสดง blade-passing หรือปฏิสัมพันธ์ตามเวลาทั้งหมด งาน unsteady ต้องรันนานพอพ้น transient และมีช่วงเฉลี่ยที่ระบุจำนวนรอบอย่างชัดเจน
เครื่องมือสามทางและขอบเขตเอกสาร
- OpenFOAM Foundation: เรียนรู้การจัด case และ finite-volume CFD บทนี้อ้างโครงสร้าง turbulence จากคู่มือ v13 ซึ่งใช้
constant/momentumTransportอย่าผสมไฟล์ตัวอย่างคนละสายหรือคนละเวอร์ชันโดยไม่ตรวจ เอกสาร v13 turbulence แสดง laminar, RAS และ LES - SU2: อีกทางสำหรับเรียน solver และกรณีศึกษาด้านอากาศพลศาสตร์ เริ่มจาก installation docs v7 และเลือก tutorial ที่ตรงรุ่น เอกสารนี้เป็นฐานอ้างอิง ไม่ใช่คำกล่าวว่า v7 เป็นรุ่นล่าสุด
- FLOWUnsteady: กรอบจำลองอากาศพลศาสตร์ตามเวลาที่รวมหลายระดับความละเอียด เช่น blade elements และ reformulated vortex particle method ไม่ใช่คำแทนของ CFD ที่ resolve ผิวใบพัดทุกกรณี อ่านขอบเขตที่ เว็บไซต์ FLOW Lab ก่อนเลือก
สำหรับ Windows หน้า OpenFOAM Foundation for Windows ระบุเส้นทาง Ubuntu ผ่าน WSL บน Windows 10/11 ส่วน Linux ใช้คำแนะนำแพ็กเกจให้ตรง distribution และรุ่น SU2 มีเส้นทาง Windows และ Linux ของตนเอง สมุดงานช่องไหลของบทก่อนใช้ Python standard library จึงเริ่มฝึกตัวเลขได้โดยยังไม่ติดตั้ง CFD suite
ก่อนทำซ้ำให้บันทึก OS, solver distribution/version หรือ commit, compiler/runtime และไฟล์ตั้งค่าทั้งหมด สิทธิ์ซอฟต์แวร์กับสิทธิ์ข้อมูลทดลองแยกกัน: OpenFOAM Foundation ใช้ GPL, SU2 download ระบุ LGPL 2.1 และ FLOWUnsteady ระบุ MIT ให้ตรวจ LICENSE ของรุ่นที่ใช้และ dependencies เพิ่มเติม เอกสารบทนี้ตรวจวันที่ 26 กันยายน 2569 กรณีที่รันจริงด้านล่างใช้ OpenFOAM สาย OpenCFD รุ่น 1912 จากแพ็กเกจ Ubuntu ไม่ใช่ Foundation v13; SU2 และ FLOWUnsteady เป็นทางเลือกอ้างอิงที่ไม่ได้รันในบทนี้
สะพานจากสมการสู่จานแรงขับ
ก่อนสร้าง mesh ของใบพัด เราเริ่มจาก actuator disk: แทนผลรวมของใบพัดด้วยบริเวณที่เพิ่มโมเมนตัมให้อากาศ กำหนด T เป็นแรงที่จานให้อากาศตามทิศการไหล แรงที่อากาศกระทำกลับต่อโดรนมีทิศตรงข้าม วิธีนี้ไม่เห็นผิวใบ ปลายใบ swirl หรือเสียง และไม่ได้ทำนาย T จากรูปทรงหรือรอบหมุน
สำหรับจานอุดมคติในกระแสตามแกนคงตัว ไม่มีผนังหรือการสูญเสีย ให้ U₀ ≥ 0 เป็นความเร็วก่อนเข้าจาน A = πD²/4 และ vᵢ เป็นความเร็วเหนี่ยวนำที่จาน จากสมดุลโมเมนตัมได้
T = 2ρAvᵢ(U₀ + vᵢ)
vᵢ = [√(U₀² + 2T/(ρA)) − U₀]/2
Uจาน = U₀ + vᵢ, Uwakeไกล = U₀ + 2vᵢ, Pอุดมคติ = T(U₀ + vᵢ)
T มีหน่วย N, ความเร็ว m/s, A m² และ P W กำลังนี้เป็นกำลังอุดมคติที่ส่งสู่อากาศ ไม่ใช่กำลังแบตเตอรี่ NASA: Propeller Thrust อธิบายว่าใช้ Bernoulli แยกก่อนและหลังจานได้ แต่ใช้ข้ามจานไม่ได้เพราะมีงานเพิ่มให้ของไหล
ตัวอย่างตรวจคำตอบ: ตั้ง ρ = 1 kg/m³, A = 1 m², U₀ = 2 m/s และ T = 6 N จะได้ vᵢ = 1 m/s, Uจาน = 3 m/s, Uwakeไกล = 4 m/s และ P = 18 W เป็นค่าตั้งเพื่อฝึก ไม่ใช่ข้อมูลอุปกรณ์จริง ทดลองที่ เครื่องคำนวณจานแรงขับ
แบบฝึก: เมื่อ U₀ = 0, ρ = 1, A = 1 และ T = 2 N จะได้ vᵢ = 1 m/s และ P = 2 W การที่ผล hover คำนวณได้ไม่ทำให้สูตรใช้กับการไหลย้อนหรือ vortex ring state ได้
เมื่อนำไปทำ CFD แบบ prescribed force เรากำหนดแรงในปริมาตร แล้วดูสนาม U และ p ที่ solver คำนวณขึ้น การอินทิเกรตแรงต้นทางกลับได้ค่า T เป็นการตรวจการตั้ง source ไม่ใช่การตรวจเทียบแรงขับกับการทดลอง และความต่างจากจานอุดมคติอาจมาจากความหนืด โดเมน ความหนาจาน และความละเอียด mesh
ผล Navier–Stokes ที่รันจริง: จานกำหนดแรงสองกริด
เราใช้ simpleFoam แก้สมการความต่อเนื่องและโมเมนตัมแบบ steady incompressible laminar ด้วย finite volume ใน WSL Ubuntu 24.04, Python 3.12 และแพ็กเกจ OpenFOAM 1912.200626-2build3 กรณีนี้กำหนดแรงรวม 0.08 N ให้ของไหลผ่าน source volume ทรงกระบอก ไม่ได้คำนวณแรงขับจากใบพัดหรือรอบหมุน
ตั้ง D = 0.2 m, ความหนาจาน 0.1 m, U∞ = 2 m/s และ ρ = 1.225 kg/m³ แต่เลือก ν = 0.001 m²/s โดยตั้งใจให้หนืดสูงสำหรับการเรียนรู้ จึงได้ Re = U∞D/ν = 400 ค่านี้ไม่ใช่ความหนืดของอากาศปกติ โดเมน x = −0.6…1.4 m และ y,z = −0.4…0.4 m มีด้านข้างเป็น symmetry planes จึงยังมีผลจากขอบเขตจำกัด
| ผลจากไฟล์รัน | กริดหยาบ | กริดละเอียด |
|---|---|---|
| จำนวนเซลล์ | 10,240 | 81,920 |
| ระยะกริด (m) | 0.05 | 0.025 |
| SIMPLE iterations จนผ่านเกณฑ์ | 289 | 322 |
| Ux แกนกลางที่ x = 0.4 m (m/s) | 2.862234 | 2.802475 |
| ปริมาตร source ที่เลือกจริง (m³) | 0.00300 | 0.00325 |
ความต่างความเร็วที่ x = 0.4 m คือ 2.13% ของค่ากริดละเอียด นี่เป็นการตรวจความไวสองกริด ไม่ใช่ข้อสรุป mesh independence หรือขอบเขต error; รูปทรงจานที่แทนด้วยเซลล์ยังเปลี่ยนระหว่างกริดด้วย Source แบบ volumeMode absolute ทำให้แรงรวมยังเท่ากับ 0.08 N แม้ปริมาตรเซลล์ที่เลือกต่างกัน การอินทิเกรตได้แรงเดิมจึงเป็นการตรวจการกำหนด source ไม่ใช่การทำนายแรง
ทั้งสองกริดผ่าน checkMesh และเกณฑ์ initial residual ของความเร็ว/ความดันต่ำกว่า 10⁻⁷ ก่อนถึงเพดาน 1,200 iterations จำนวนนี้เป็นรอบแก้สมการ ไม่ใช่เวลาไหลจริง ค่า continuity ในไฟล์ metrics เป็น diagnostic ที่ normalize แล้วของ OpenFOAM ไม่ใช่ mass-flow error หน่วย kg/s กรณีนี้ยังไม่ resolve ใบพัด การหมุน turbulence หรือ tip vortices และยังไม่มีการทดลองเพื่อ validation
ดาวน์โหลดและทำซ้ำกรณีที่รัน
ดาวน์โหลด สมุดงาน OpenFOAM พร้อมผล CSV และ log แล้วแตกไฟล์ อ่าน README.md และรันจากโฟลเดอร์สมุดงานใน Bash ของ WSL Ubuntu 24.04:
bash bootstrap-ubuntu.sh
export OF_LOCAL_ROOT="$HOME/.cache/drone-openfoam/root"
bash run.sh "$HOME/.cache/rotor-cfd-new-run"
python3 verify.py
verify.py ตรวจผลที่แนบมาในสมุดงาน ส่วนการรันใหม่บันทึก case และผลในโฟลเดอร์ output ที่ระบุ ให้เปิดผลใหม่นั้นเปรียบเทียบกับชุดอ้างอิงก่อนสรุปว่าทำซ้ำได้
สคริปต์ bootstrap ดาวน์โหลดแพ็กเกจ Ubuntu ที่ระบุรุ่นและตรวจ SHA256 ก่อนแตกลง user cache โดยไม่ใช้ sudo; ZIP ไม่รวม binary ของ OpenFOAM หากแพ็กเกจรุ่นเดิมไม่อยู่ในแหล่ง Ubuntu แล้ว สคริปต์จะหยุดแทนการเปลี่ยนรุ่นเงียบ ๆ
เปิด results/metrics.json, *-centerline.csv, *-downstream.csv และ *-residuals.csv เพื่อสร้างกราฟของตนเอง เทียบ *-checkMesh.txt และ solver tail กับผลในตาราง แบบฝึกถัดไปคือเพิ่มกริดที่สาม ขยายขอบเขต และตรวจค่าเฉลี่ยบนพื้นที่จานก่อนอ้างผลละเอียดขึ้น ค่าแกนกลางไม่เท่ากับค่าเฉลี่ยพื้นที่จาน
ตรวจผลโดยแยก verification และ validation
Verification ตรวจว่าการคำนวณแก้แบบจำลองได้ถูกต้องเพียงใด เช่น เทียบคำตอบวิเคราะห์ ตรวจการอนุรักษ์มวล และศึกษาความไวต่อกริด/เวลา Validation เปรียบเทียบผลกับการทดลองของระบบที่เกี่ยวข้องพร้อมความไม่แน่นอน NASA V&V tutorial อธิบายทั้งสองกระบวนการ residual ลดลงอย่างเดียวไม่เพียงพอ ต้องดูแรง อัตราไหล และปริมาณเป้าหมายด้วย
ตัวอย่างสมมติเพื่อฝึกอ่านผล: กริดหยาบ กลาง ละเอียดให้แรงเฉลี่ย 1.00, 1.04 และ 1.05 N ความต่างคู่ท้ายประมาณ 0.95% ของ 1.05 N แต่ยังสรุปว่า error ต่ำกว่า 1% ไม่ได้ เพราะต้องรู้ refinement ratio, อยู่ในช่วง convergence หรือไม่ และ error ด้านเวลา/โมเดลยังมีอยู่ ห้ามเรียกตัวเลขนี้ว่าผล CFD ที่รันจริงหรือค่าทดลอง
แบบฝึกและแนวคำตอบ
โจทย์: residual ลดลง แต่แรงขับยังแกว่งเป็นคาบ ควรหยุดและรายงานค่าจุดสุดท้ายหรือไม่?
แนวคำตอบ: ยังไม่ควรสรุปจากจุดสุดท้าย ตรวจว่าเป็นพฤติกรรม unsteady จริงหรือความไม่เสถียรเชิงตัวเลข ศึกษา time step และเก็บค่าเฉลี่ย/ช่วงแกว่งหลายคาบหลัง transient พร้อมระบุช่วงเวลา ถ้าใช้ steady solver ต้องพิจารณาว่าสมมติฐานเหมาะหรือไม่
ใช้ case-planning worksheet ใน สมุดงานช่องไหล ประกอบผลที่รันจริงข้างต้น กรอก geometry และข้อมูลทดลองที่ยังขาดก่อนเข้าสู่ ส่วนเชื่อมตารางแรงกับ DroneSim ซึ่งมีการสาธิตด้วยแรงต้านสังเคราะห์แยกต่างหาก ห้ามส่งแรง rotor source 0.08 N นี้เป็น airframe drag เพราะชนิดแรงและหน้าที่ใน simulator ต่างกัน
บรรณานุกรม
- NASA NPARC — CFD Analysis Process
- NASA NPARC — V&V Tutorial
- NASA Glenn — Propeller Thrust และสมดุลโมเมนตัมจาน
- OpenCFD — OpenFOAM v1912 source tag และ Ubuntu noble — แพ็กเกจ OpenFOAM
- OpenCFD — Semi-implicit source (เอกสารรุ่นใหม่เพื่ออธิบาย source; case 1912 ที่แนบตรวจด้วยการรันจริง)
- OpenFOAM Foundation — Windows / WSL และ GPL license
- CFD Direct — OpenFOAM v13 Turbulence
- SU2 — Installation v7 และ Download / License
- BYU FLOW Lab — FLOWUnsteady
คำนวณจานแรงขับอุดมคติ
Momentum theory: การไหลตามแกนคงตัว ไม่อัดตัว ไร้การสูญเสียและ swirl ไม่มีพื้นหรือขอบอาคาร กำหนดแรง T เป็นอินพุต ไม่ได้ทำนายแรงจากรูปทรงใบพัด ข้อมูลคำนวณในเบราว์เซอร์ ไม่ส่งออกจากเครื่อง