# เริ่มอ่านชุด Layer mesh ใน 15–30 นาที

คู่มือนี้ใช้กับชุด `ms1101-layer-study.zip` สำหรับอ่านผลที่คำนวณไว้แล้ว ไม่จำเป็นต้องมีโดรนหรือรัน OpenFOAM ใหม่ เวลาเป็นประมาณการสำหรับการอ่านและตรวจไฟล์ ไม่ใช่ระยะเวลาคำนวณ CFD

## 1. แตกไฟล์และเริ่มจากข้อมูล

แตก ZIP แล้วเปิดโฟลเดอร์ `ms1101-layer-study` เปิด terminal ในโฟลเดอร์นี้ อ่าน `LICENSE.txt` ก่อนใช้ซ้ำ ไฟล์รูปทรงของบุคคลที่สามไม่รวมอยู่ในชุด

เปิด `results/layers/v3-global32-solver/layer-solver-summary.json` แล้วหา `case_accepted` จะพบ `true` ลองเปิด N36 ในตำแหน่งเดียวกัน จะพบ `false` ทั้งสองคำนวณครบ 6,000 รอบ แต่ผ่านเกณฑ์ต่างกัน

| ไฟล์ | ใช้ดูอะไร |
|---|---|
| layer-solver-summary.json | ผลตรวจรับรายกรณีและตัวชี้วัดช่วงสุดท้าย |
| residuals.csv | residual แยกตัวแปรและ iteration |
| force.dat / moment.dat | ประวัติแรงและแรงบิด คอลัมน์แรกเป็น iteration ไม่ใช่วินาที |
| solver-provenance.json | runtime และ hash ของ inputs |
| final-checkpoint.json | หลักฐานไฟล์สนามครบ 8 ranks เมื่อจบ |
| solver-segments.json | ช่วงการคำนวณก่อนและหลังต่อ checkpoint |
| user-pause / user-resume JSON | หลักฐานการพักและเริ่มใหม่ในกรณีที่มี |

ZIP ไม่รวม raw `log.simpleFoam*` เพื่อลดขนาด แต่มี CSV และ summary ที่สกัดจาก log; raw logs อยู่ใน repository จึงไม่ควรอ้างว่าการตรวจ ZIP อย่างเดียวได้ตรวจ raw logs ครบแล้ว

## 2. ตรวจว่า Python พร้อม

Windows PowerShell:

```powershell
py -3 --version
py -3 -m unittest discover -s .
```

Linux หรือ WSL:

```bash
python3 --version
python3 -m unittest discover -s .
```

ใช้ Python 3.10 ขึ้นไปสำหรับเครื่องมือชุดนี้ การอ่าน JSON/CSV และ unit tests ไม่ต้องติดตั้งไลบรารีเพิ่ม บาง tests ที่ตรวจ delivery ZIP จาก repository จะถูกข้ามเมื่อรันจากโฟลเดอร์ที่แตก ZIP และ test ของ Linux จะข้ามบน Windows นั่นไม่ใช่การรับรองผล CFD ว่าผ่าน

## 3. อ่านผลโดยไม่เขียนทับหลักฐาน

ตัวอย่าง Windows:

```powershell
py -3 -c "import json; from pathlib import Path; s=json.loads(Path('results/layers/v3-global36-solver/layer-solver-summary.json').read_text()); print(s['case_accepted']); print(s['residual_window']); print(s['thrust_window'])"
```

บน Linux เปลี่ยน `py -3` เป็น `python3` คำสั่งนี้อ่านอย่างเดียว N36 ต้องแสดง `False` และ residual ผ่าน 0/100 รอบ ตามหลักฐานในรุ่น 1.12.29

อย่ารัน `evaluate_global_layer_solver.py` ทับโฟลเดอร์หลักฐานต้นฉบับโดยไม่ตั้งใจ เพราะ CLI เขียน summary ใหม่ และการประเมินจาก ZIP ที่ไม่มี raw logs จะให้รายการ log hash ต่างจากต้นฉบับ หากทดลองแก้ข้อมูลให้ทำบนสำเนาแยกเสมอ

## 4. สร้างกราฟจริงด้วยตนเอง

ต้องมี `matplotlib` เพิ่ม ถ้ายังไม่มี ให้ติดตั้งใน virtual environment ของงานนี้ตามวิธีจัดการ Python ของเครื่อง จากนั้น:

```powershell
py -3 plot_case_acceptance.py results/layers/v3-global36-solver n36-check.png
```

Linux ใช้ `python3` แทน `py -3` ภาพต้องแสดงแรง แรงบิด และ residual รอบ 5901–6000 พร้อมคำว่า REJECTED ลองเปลี่ยน `36` เป็น `32` และใช้ชื่อภาพใหม่เพื่อเทียบกับกรณีที่ผ่าน

## 5. ตอบคำถามก่อนใช้ผล

1. จบครบ 6,000 รอบหรือไม่?
2. residual ผ่านกี่รอบจาก 100 และครบทุกตัวแปรหรือไม่?
3. แรงและแรงบิดผ่านทั้งช่วงแกว่งและการเปลี่ยนค่าเฉลี่ยสองครึ่งหรือไม่?
4. กำลังอ่านผลรายกรณี หรืออ้างความไวต่อกริดทั้งชุด?
5. มีข้อมูลทดลองและ uncertainty ที่ตรงชิ้นทดสอบจริงหรือยัง?

N30/N36 ไม่ผ่านเกณฑ์รายกรณี จึงอ่านเพื่อวินิจฉัย ไม่ใช้รับรอง grid independence หรือคำนวณ GCI ของทั้งชุด ZIP รอบ1.13.0 มีผลสุดท้าย N44 แล้ว โดย N44 ไม่ผ่าน residual เช่นกัน

## หากต้องการรัน CFD ใหม่

เป็นขั้นสูงแยกจากคู่มือนี้ ต้องมี Linux/WSL, OpenFOAM2512/OpenMPI ที่เข้ากัน รูปทรงที่จัดหาตามสิทธิ์ และทรัพยากรคำนวณ อ่าน protocol v3 และ checkpoint addendum ก่อน ห้ามเริ่ม runner ซ้ำกับกรณีที่กำลังทำงาน และอย่าคาดหวังว่าเครื่อง Windows ที่อ่าน CSV ได้จะรัน solver ได้ทันที

แหล่งวิธีตีความ: [NASA: Iterative Convergence](https://www.grc.nasa.gov/www/wind/valid/tutorial/iterconv.html), [NASA: Grid Convergence](https://www.grc.nasa.gov/www/wind/valid/tutorial/spatconv.html) เกณฑ์ตัวเลขเป็นของ protocol ชุดนี้ ไม่ใช่ข้อกำหนดสากลของ NASA
