วันพุธที่ 9 ตุลาคม พ.ศ. 2556

การจัดการไฟล์ dfs แบบต่างๆของ DHI ด้วยการเขียนโปรแกรม

ไฟล์ข้อมูลที่ใช้กับโปรแกรม MIKE ต่างๆนั้น จะมีนามสกุลขึ้นด้วย dfs แล้วตามด้วยตัวเลข 0, 1, 2

ไฟล์เหล่านี้ เป็นไฟล์ข้อมูลตามเวลา ที่เก็บข้อมูลจากจุดสำรวจ(0) จากแนวสำรวจ(1) หรือจากพื้นที่สำรวจ(2) ขึ้นกับเลขลงท้าย

โดยปกติแล้ว เราสามารถสร้าง แก้ไข ดัดแปลง และจัดการไฟล์ข้อมูลเหล่านี้ได้ด้วยโปรแกรม MIKE Zero

อย่างไรก็ตามกรณีที่ต้องการแก้ไข หรือดัดแปลง ไฟล์ข้อมูลเหล่านี้ ทีละมากๆ การเขียนโปรแกรมขึ้นมาจัดการ ก็มีความสะดวกมากกว่า และมีความยืดหยุ่นในการทำงานตามที่ต้องการได้มากกว่า

ตัวอย่างหนึ่งในการต้องการการจัดการข้อมูลด้วยการเขียนโปรแกรมเพิ่มเอง เช่น การดัดแปลงข้อมูลสำหรับงาน Real time ซึ่งต้องการปรับปรุงข้อมูลในไฟล์ dfs ต่างๆอัตโนมัติ

ในที่นี้ จะแนะนำคู่มือ และตัวอย่าง ซึ่งแนะนำวิธีการจัดการกับไฟล์ dfs ไว้อย่างละเอียด

หลังจากลงโปรแกรม MIKE ตัวใดตัวหนึ่งแล้ว โปรแกรมจะติดตั้งไปที่
C:\Program Files (x86)\DHI\2012

ซึ่งนอกจากติดตั้งโปแกรมแล้ว เราจะได้คู่มือ และตัวอย่าง ติดตั้งมาพร้อมกันนี้ด้วย

โดยคู่มือ และตัวอย่างสำหรับจัดการไฟล์ dfs นั้นจะอยู่ที่
C:\Program Files (x86)\DHI\2012\MIKE Zero\Manuals\MIKE_ZERO\FileFormats\DFS_Examples

ในรูปด้านล่าง เป็นตัวอย่างหนึ่ง ที่แสดงให้เห็นว่า เราสามารถเขียนโปรแกรมภาษา python ในการจัดการข้อมูล dfs ได้


อีกรูปตัวอย่าง แสดงให้เห็นลักษณะไฟล์ dfs ต่างๆที่รวมอยู่ในตัวอย่าง และคู่มือ


ตัวอย่างภาษาที่สามารถเขียนเพื่อจัดการข้อมูล dfs ได้ประกอบไปด้วย
C#, Python, และ CsScript เป็นต้น


แน่นอนว่า การเขียนโปรแกรมเพื่อจัดการข้อมูล ไม่ใช่เรื่องง่าย
แต่ข้อมูลเหล่านี้ แสดงให้เห็นว่า เราสามารถเขียนโปรแกรมเพื่อช่วยในการจัดการข้อมูล dfs ได้ทุกรูปแบบ ตามที่ต้องการ ทำให้เราสามารถประยุกต์ใช้ประโยชน์แบบจำลองที่มีอยู่ไม่ว่าจะกับสถานการณ์แบบ Real time หรือเป็นเครื่องมือช่วยตัดสินใจได้

ในกรณีที่ต้องการเขียนโปรแกรม เพื่อบริหารจัดการ ข้อมูล แบบจำลอง และผลรันของแบบจำลอง สำหรับการจำลองสถานการณ์น้ำแบบอัตโนมัติ (Real time mode) เพื่อใช้เป็นระบบช่วยตัดสินใจนั้น (DSS) ก็สามารถเขียนโปรแกรมดำเนินการเองได้ทั้งหมดโดยมีเนื้อหาที่ควรทำความเข้าใจสำหรับการดำเนินการมีดังต่อไปนี้

การเขียนโปรแกรมเพื่อจัดการข้อมูลแบบ dfs ที่ใช้ในโปรแกรม MIKEbyDHI

การแปลงผลรันแบบจำลอง MIKE11 เป็น ACSII ด้วยโปรแกรม res11read.exe

การสั่งรันแบบจำลอง MIKE 11 ด้วย batch file

และเนื่องจากแบบจำลอง version ใหม่ ไม่ได้รวมเอา manual ไว้ใน package แล้ว
ดังนั้นจึงได้นำเอา FileFormats ที่อยู่ใน version 2012 มาลงไว้ที่ link ด้านล่างนี้
เผื่อใครต้องการลองโหลดไปศึกษาดู

DFS File Formats Examples

วันอังคารที่ 8 ตุลาคม พ.ศ. 2556

การตั้งค่าใน Control Structure ของแบบจำลอง MIKE 11 เพื่อควบคุมการระบายน้ำ

ในแบบจำลอง MIKE 11 จะมีโมดูลสำหรับโครงสร้างควบคุมการไหลของน้ำ

ในชื่อย่อ SO หรือมาจาก Structure Operation

โมดูลย่อยนี้ สามารถนำมาใช้ในการเพิ่มโครงสร้างบริหารจัดการน้ำแบบต่างๆ


ประกอบไปด้วย ฝาย ท่อลอด สะพาน สถานีสูบน้ำ และอื่นๆ

สำหรับโครงสร้างที่นิยมนำมาใช้บ่อยมากๆคือ Control Str.

เป็นส่วนที่สามารถนำมาใช้กำหนดกฎเกณฑ์การไหล ภายใต้เงื่อนไขเพิ่มเติม

ทำให้มีความยืดหยุ่นในการควบคุมการไหลของน้ำได้สูง จึงสามารถนำมาใช้ได้ในหลายๆกรณี

สำหรับวันนี้ จะแนะนำการใช้ Control Str. สำหรับควบคุมการระบายน้ำโดยมีเงื่อนไขการระบายดังนี้

1 หากมีข้อมูลตรวจวัดการปล่อยน้ำ ให้ใช้ค่าจากการตรวจวัด
2 หากมีข้อมูลประมาณการการปล่อยน้ำ ให้ใช้ค่าจากการประมาณการ
3 หากมีการเปลี่ยนแปลงการปล่อยน้ำยังไม่ถึง 1 ชั่วโมง จะยังไม่เปลี่ยนแปลง
4 หากระดับน้ำ เท่ากับระดับน้ำจาก Rule Curve จะใช้การปล่อยน้ำเท่าเดิม
5 หากระดับน้ำ ต่ำกว่า ระดับน้ำจาก Rule Curve จะให้ปล่อยน้ำลดลง
6 หากระดับน้ำ สูงกว่า ระดับน้ำจาก Rule Curve จะให้ปล่อยน้ำเพิ่มขึ้น

จากเกณฑท์ควบคุมการระบายน้ำทั้ง 6 ข้อข้างบน จะเป็นการควบคุมให้การระบายน้ำเป็นไปอย่างถูกต้อง
ตามการบริหารจริง และยังเพิ่มเงื่อนไขไว้ต่อท้าย ในกรณีที่ หากไม่มีข้อมูลตรวจวัด ก็จะสลับกลับมาใช้การระบายน้ำโดยอิงตามเกณฑ์ของ Rule Curve ของเขื่อนนั้นๆแทน

การตั้งค่า Control Str. จะตั้งค่าใน Network file โดยเปิด Tabular View แล้วเลือกไปที่ Control Str.

กำหนดตำแหน่งที่ตั้งของโครงสร้างให้เรียบร้อย โดยต้องมี Name, Chainage และ ID ให้ครบ


เนื่องจากต้องการเงื่อนไขควบคุมการระบาย 6 ข้อ ดังนั้นให้กด Tab ที่ช่องข้อมูล Control Definition เพื่อเพิ่มช่องข้อมูลให้ครบ 6 และปรับเปลี่ยน Calculation Mode ให้เป็น Tabulated สำหรับทุกข้อ ยกเว้นข้อ 3 และ 4 ให้เป็น Unchanged


เลือกเงื่อนไขที่ 1 แล้วกดปุ่ม Details ตั้งค่าใน Logical Operands ให้ใช้ LO Type เป็น TS-Scalar และ Sign ใช้ ">" โดยมี Value เป็น 0 และ ให้ Browse หาไฟล์ที่เป็นปริมาณน้ำระบายจากการตรวจวัด
(ไฟล์ค่าการระบายน้ำ กรณีที่มีข้อมูล ให้กรอกข้อมูลจริง แต่หากช่วงเวลาใดไม่มีข้อมูล ให้กรอกเป็นค่า ติดลบ จะเป็นการบอกให้โปรแกรมรับรู้ว่า ไม่มีข้อมูล)


ในหน้า Control and Targetpoint ให้เลือก Control Type เป็น Time แล้ว Browse หาไฟล์การระบายน้ำไฟล์เดียวกับที่ใช้ในหน้า Logical Operands


ทำเช่นเดียวกันนี้ กับเงื่อนไขการระบายน้ำที่ 2 แต่เปลี่ยนมาใช้ไฟล์ข้อมูลประมาณการ การระบายน้ำแทน


สำหรับเงื่อนไขการระบายน้ำที่ 3 ในหน้า Logical Operands ให้เลือก LO Type เป็น ThisGate TSLGLC (โดย TSLGLC  ย่อมาจาก Time Since Last Gate Level Change) และเปลี่ยน Sign เป็น < พร้อมกับค่า Value เป็น 1 ชั่วโมง ซึ่งตัวเลขบอกระยะเวลาที่ต้องการคุมไม่ให้มีการปรับเปลี่ยนปริมาณการระบายอาจเปลี่ยนเป็นค่าอื่นได้ขึ้นกับความเหมาะสมของโครงสร้างในจุดนั้นๆ


สำหรับเงื่อนไขการระบายที่ 4 ในหน้า Logical Operands จะใช้ LO Type เป็น Hups (ระดับน้ำเหนือเขื่อน) เปลี่ยน Sign เป็น "=" และ Use TS-value เป็น Yes จากนั้น Browse หาไฟล์ที่เป็น Rule Curve ของเขื่อน


เงื่อนไขการระบายน้ำที่ 5 ตั้งค่าใน Logical Operands เหมือนเงื่อนไขที่ 4 แต่ใช้ Sign เป็น "<" แทน เท่ากับกรณีนี้จะทำงานเมื่อระดับน้ำต่ำกว่า Rule Curve และจะต้องเข้าไปตั้งค่าให้ลดการระบายน้ำต่อไป


ในหน้า Control - and Targetpoint ให้ใช้ตัว Control Type เป็น Qups กรณีนี้คือ ปริมาณน้ำไหลเข้าเขื่อน


ในหน้า Control Strategy เป็นตารางแสดงค่าระหว่าง Control Point Value VS Target Point Value ตัวอย่างนี้เป็นการตั้งค่าในกรณีเขื่อนมีการระบายสูงสุดไม่เกิน 1530 และตั้งค่าให้การระบาย น้อยกว่าน้ำไหลเข้าเขื่อน 30 ซึ่งมีผลทำให้ระดับน้ำสูงขึ้นหากระบายตามวิธีการนี้


สำหรับเงื่อนไขสุดท้าย ในหน้า Logical Operands ไม่จำเป็นต้องตั้งค่า แต่หน้า Control - and Targetpoint ให้ตั้งค่าเหมือนเงื่อนไขที่ 5 ส่วน Control Strategy ก็ตั้งค่าให้การระบาย สูงกว่าน้ำไหลเข้าเขื่อน เพื่อให้ระดับน้ำลดลง


เมื่อตั้งค่าเงื่อนไขการระบายครบหมดแล้ว ก็พร้อมจะนำไฟล์ Network ดังกล่าวไปทดสอบใช้
แต่อย่างไรก็ตาม ในกรณีที่มีการลดจำนวนหน้าตัดลำน้ำเหนือเขื่อน ให้เหลือเพียง 1-2 หน้าตัด เพื่อจำลองเพียงปริมาณน้ำในเขื่อนนั้น การคำนวณจะมี Stability น้อย ดังนั้นอาจปรับแก้ค่า Delta ใน Default Values ซึ่งอยู่ในไฟล์ HD parameter เพิ่มขึ้น เช่นเปลี่ยนจาก 0.5 เป็น 0.75 เป็นต้น
ส่วนรายละเอียดทางเทคนิคของพารามิเตอร์นี้ ให้ตรวจสอบดูจากคู่มือ Scientific documentation ของแบบจำลอง MIKE 11 ที่จะมาพร้อมกับการติดตั้งโปรแกรม


หลังจากตั้งค่าโครงสร้างแล้ว ควรจะตรวจสอบผลการทำงานของโครงสร้างนั้นๆด้วย
ว่าควบคุมการไหล ได้ตามที่ตั้งค่าไว้ทั้งหมดหรือไม่
ในกรณีตัวอย่างนี้ จะต้องตรวจสอบระดับน้ำในเขื่อน และการระบาย ว่าเป็นไปตามเงื่อนไข
ครบถ้วนหรือไม่



อัพเดทเพิ่มด้านล่างนี้เมื่อ 2013-10-11
vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv

ในกรณีต้องการตั้งค่าประตูระบายน้ำ เพื่อควบคุมระดับน้ำเหนือบานประตูให้คงที่

เราสามารถทำได้โดย เปลี่ยนรูปแบบของโครงสร้าง จากการควบคุมด้วย Discharge มาเป็น Sluice Formula


และต้องกรอกข้อมูลลักษณะของบานประตูให้ครบ รวมถึงฐานประตูด้วย

จากนั้น การควบคุมการระบายน้ำ ใน Control Definition จะมี 3 ข้อดังนี้


โดยข้อแรก จะตั้งค่าเช่นเดียวกับ Control Definition ข้อ 3 ของโครงสร้างก่อนหน้าที่
ซึ่งตั้งค่าให้ ThisGate-TSLGLC มีค่าน้อยกว่า 1 ชั่วโมง จะยังไม่มีการเปลี่ยนแปลง

ส่วนข้อ 2 จะตั้งค่าใน Detail โดยให้มี LO-Type เป็น Hups และตรวจสอบว่า มีค่าสูงกว่าระดับน้ำที่ต้องการควบคุม (เมื่อระดับน้ำสูงเกิน โปรแกรมจะเปิดบานเพิ่มขึ้น จนกว่าจะถึงระดับ Fully Open ซึ่งเป็นการพยายามลดระดับน้ำลง)

ส่วนข้อ 3 ไม่ต้องตั้งค่าใดๆ (การจะเข้ามาเงื่อนไขข้อนี้ ก็ต่อเมื่อ ระดับน้ำต่ำกว่าเกณฑ์ที่ต้องการ ดังนั้น โปรแกรมจะพยายามปิดประตู เพื่อลดการระบาย และทำให้ระดับน้ำสูงขึ้น)

จาก Control Definition ทั้ง 3 ข้อ ก็เพียงพอที่จะทำให้โครงสร้างนี้ สามารถควบคุมระดับน้ำเหนือบางประตู ได้ตามที่ต้องการแล้ว


วันศุกร์ที่ 4 ตุลาคม พ.ศ. 2556

ปรับปรุงค่าความจุเก็บกักน้ำของเขื่อนในแบบจำลอง MIKE11 (Configuration of Dam in MIKE11)

โดยทั่วไป การจำลองเขื่อนลงในแบบจำลอง 1 มิติ จะทำได้ยาก หากต้องการความแม่นยำสูง

โดยสิ่งที่ทำได้ง่ายสุดคือ การใส่หน้าตัดลำน้ำของเขื่อน เข้าไปในแบบจำลองให้ถี่ที่สุด

เพื่อให้หน้าตัดลำน้ำทั้งหมด สามารถอธิบายความจุของเขื่อนได้อย่างถูกต้อง ตรงกับความเป็นจริง

แต่การใส่ข้อมูลหน้าตัดลำน้ำเข้าไปถี่ๆ เป็นการบังคับให้แบบจำลองจำเป็นต้องคำนวณ

ที่ระยะระหว่างหน้าตัด (dx) สั้นลง และบังคับให้แบบจำลองต้องใช้ timestep สั้นลง

ทั้งหมดทำให้การคำนวณใช้เวลานานขึ้นมาก

อย่างไรก็ตาม การตั้งค่าเขื่อน ในแบบจำลอง MIKE11 ให้จำลองได้เหมือนสภาพจริงนั้น

มีเทคนิคง่ายๆในการทำ โดยที่ยังคงความไม่ซับซ้อนในการคำนวณ

ข้อสำคัญในการจัดการแบบจำลองคือ ปรับปรุงข้อมูลหน้าตัดลำน้ำ (เท่าที่มีอยู่ในอ่างเก็บน้ำ) ให้สามารถอธิบายพื้นที่เก็บน้ำ และความจุอ่างเก็บน้ำให้ถูกต้อง โดยไม่เพิ่มหน้าตัดลำน้ำอื่นๆที่ไม่จำเป็น

และใช้ Control Structure เป็นตัวกำหนดการระบายน้ำจากเขื่อน 

ดังนั้นข้อมูลที่ต้องใช้ในการทำงานประกอบด้วย

ข้อมูลโค้งความจุเขื่อนดังตัวอย่าง



และข้อมูลโค้งการบริหารเขื่อน (Rule curve) ดังตัวอย่าง


ปรับแต่งแบบจำลอง โดยให้เหลือเพียงส่วนของเขื่อน และพื้นที่เก็บน้ำเหนือเขื่อนเท่านั้น


เพิ่มโครงสร้างไว้ที่ตำแหน่งของเขื่อน


กำหนดโครงสร้างเป็นแบบ Control Structure และให้เป็นแบบ Discharge และ Close ไว้ก่อน โดยตำแหน่งของเขื่อน ให้วางอยู่ระหว่าง 2 หน้าตัดสุดท้าย ซึ่งจะเป็นตำแหน่งที่แบบจำลองจะคำนวณค่า Discharge ส่วนที่ตำแหน่ง 2 หน้าตัดสุดท้ายนั้น แบบจำลองจะคำนวณค่าระดับน้ำ (ปริมาณน้ำที่คำนวณในแบบจำลองคือปริมาณน้ำที่อยู่ในแต่ละหน้าตัด โดยมาจากพื้นที่หน้าตัดกับระดับน้ำ ในหน้าตัดนั้นๆ)


จากนั้น ตั้งค่า Boundary ให้ปลายฝั่งต้นน้ำ เป็น Discharge มีค่าคงที่ เป็น 0 และปลายน้ำ เป็นระดับน้ำ และคงที่ โดยให้ระดับน้ำสูงกว่าท้องคลองเล็กน้อยก็พอ
จากนั้นให้กำหนด Point source เข้าไปที่หน้าตัดสุดท้ายก่อนตำแหน่งของเขื่อน แล้ว Trial ค่า Discharge Inflow โดยทดสอบว่า ปริมาณน้ำเท่าไหร่จึงรันได้สำเร็จในช่วงเวลาที่กำหนด เช่นรัน 1 เดือน หากเติมน้ำเข้าเขื่อนมากไปด้วยหน้าตัดลำน้ำเดิมๆ อาจทำให้ระดับน้ำสูงเกิน จนรันไม่สำเร็จได้ แต่ก็ต้องได้ระดับน้ำมากพอ ที่จะตรวจสอบพื้นที่ผิวน้ำในเขื่อนได้

สำหรับไฟล์ HD11 ให้เพิ่มผลคำนวณโดยเลือก Flood Area ในส่วนของ Total ไว้ดังรูป


เมื่อสั่งคำนวณแล้ว จะได้ผลคำนวณเป็นไฟล์นามสกุล res11 ออกมาสองไฟล์ โดยไฟล์ที่มีชื่อตามที่เราตั้งค่าใน Result ไว้นั้น เราจะเปิดเพื่อตรวจสอบระดับน้ำที่หน้าตัดสุดท้ายก่อนเขื่อน

ทำโดยเลือกเมนู Plot/Timeseries จากนั้นเลือก List 


เลือกหน้าตัดที่ต้องการ ตามด้วยคลิกปุ่ม Show Values


จะได้ตารางแสดงค่าระดับน้ำพร้อมเวลาที่เกิดขึ้น ให้ Highlight ข้อมูลแล้ว Copy ไปแปะไว้ใน Excel


ทำเช่นเดียวกันกับไฟล์ผลคำนวณอีกไฟล์ที่จะมีชื่อตามที่เราตั้งค่าไว้ต่อท้ายด้วย HDAdd
โดยในไฟล์นี้ เราจะได้ค่า Flood Area ที่เวลาเดียวกันกับตารางระดับน้ำก่อนหน้านี้


จากนั้นทำการ Copy ข้อมูลพื้นที่ผิวน้ำดังกล่าว ไปวางคู่กับข้อมูลระดับน้ำ
แล้วตรวจสอบกับ พื้นที่ผิวน้ำที่เป็นค่าที่ได้จากโค้งความจุของเขื่อน ที่ระดับน้ำเดียวกัน
จะได้ตัวเลขพื้นที่ผิวน้ำที่ต้อง เพิ่ม หรือ ลด สำหรับระดับนั้นๆ
ตัวเลขพื้นที่ผิวน้ำที่เพิ่มหรือลดนี้ เราจะนำไปใช้ในหน้าตัดลำน้ำที่อยู่ในตำแหน่งก่อนเขื่อน

เปิดหน้าตัดลำน้ำ ที่ตำแหน่งก่อนเขื่อน


คลิกที่ปุ่ม View Processed Data จะได้ตารางแสดงข้อมูลของหน้าตัดนั้น พร้อมระดับน้ำและค่า Add.storage area (เบื้องต้นจะมีค่าเป็น 0 ทั้งหมด) จากนั้นให้ Copy พื้นที่ผิวน้ำที่ต้องการเพิ่มหรือลดจาก Excel มา Paste ลงไป (ระวัง ให้ข้อมูลตรงกัน ระหว่าง ระดับ กับค่าพื้นที่ผิวน้ำที่จะเพิ่มหรือลด)


เมื่อเพิ่มพื้นที่ผิวน้ำแล้ว ให้เซฟ แล้วรัน พร้อมกับ Trial ค่า Point source เพื่อให้ได้ระดับน้ำในช่วงเวลาที่รันมีระดับสูงพอให้ตรวจสอบความถูกต้องได้

เมื่อได้ผลรันใหม่แล้ว ให้ตรวจสอบเช่นเดิม โดย Plot ระหว่างค่าระดับน้ำกับพื้นที่ผิวน้ำ ว่าถูกต้องตรงกับข้อมูลจากโค้งความจุของเขื่อนหรือไม่ เพื่อเป็นการตรวจสอบซ้ำในกรณีที่มีการดำเนินการผิดขั้นตอน

แต่โดยปกติแล้ว การทำเนินการตามขั้นตอนดังกล่าวข้างต้น จะได้ผลพื้นที่ผิวน้ำที่ถูกต้อง หากเชคแล้วผิด หรือไม่ตรงกับข้อมูลตรวจวัด ให้ย้อนกลับไปตรวจสอบว่าขั้นตอนไหนผิดพลาด

เมื่อเสร็จขั้นตอนนี้ ก็จะได้หน้าตัดลำน้ำ ที่เป็นตัวแทนของอ่างเก็บน้ำ หรือเขื่อน ที่อธิบายระดับน้ำและปริมาณเก็บกักได้อย่างถูกต้อง พร้อมจะนำไปใช้ในการคำนวณในแบบจำลองรวมได้แล้ว

สำหรับกรณีการตั้งค่าการบริหารจัดการเขื่อนตาม Rule Curve นั้น ขอยกไปตอนต่อไปครับ