แสดงบทความที่มีป้ายกำกับ res11 แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ res11 แสดงบทความทั้งหมด

วันจันทร์ที่ 8 กรกฎาคม พ.ศ. 2556

การแสดงค่าระดับน้ำสูงสุดร่วมกับหน้าตัดลำน้ำใน MIKE11

บทความนี้จะแนะนำเทคนิคในการตั้งค่าโปรแกรม ให้แสดงระดับน้ำคำนวณสูงสุด
ร่วมกับรูปหน้าตัดลำน้ำใน MIKE11

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

เริ่มต้นด้วยการสร้างแบบจำลอง MIKE11 แล้วรันเพื่อให้ได้ผลคำนวณค่าสูงสุดก่อน
จากนั้นเปิดผลรันด้วยโปรแกรม MIKEView แล้วใช้เครื่องมือสร้างกราฟดังรูป



ใช้เครื่องมือในวงกลมสีแดง



กดปุ่ม List



ทำการเลือกข้อมูลในหน้า List โดยเลือกไปถึง Maximum จากนั้นกดปุ่ม Ctrl+C เพื่อ Copy ข้อมูลไว้



เปิดโปรแกรม Excel แล้ว Paste ข้อมูลลงไปแล้วจัดข้อมูลให้มี RiverName, Chainage และ Maximum
จะต้องใช้วิธีการจัดการข้อมูลแบบ Text to Column ใน Excel เพื่อช่วยแยก River Name และ Chainage
จากนั้นให้ Copy ข้อมูลจากแถวที่ 2 ไปจนหมด



เปิดไฟล์ HD11 แล้วเลือกหน้า User Def. Marks แล้วเพิ่มช่องกรอกข้อมูล (กดปุ่ม Tab)
จากนั้นตั้งชื่อข้อมูล Mark title เอง ส่วนตัวข้อมูลให้ Paste ข้อมูลที่ Copy จาก Excel ลงไป
ในระหว่างนี้ จะต้องเปิดไฟล์ sim11 ค้างไว้คู่กันตลอดเวลา



เปิดไฟล์หน้าตัดลำน้ำ แล้วเข้าไปคลิกขวาส่วนที่แสดงรูปหน้าตัด แล้วเลือก Settings...



เลือกให้แสดงข้อมูลเพิ่มโดยเลือก Draw user defined marks และเลือกข้อมูลให้ถูกต้อง



เมื่อเลือกเสร็จแล้ว จะเห็นว่าในหน้าตัดลำน้ำมีการวาดระดับน้ำสูงสุดแล้ว
พร้อมกันนี้ เราสามารถเลือกหน้าตัดลำน้ำที่จะสั่ง Print พร้อมกันหลายหน้าตัดได้โดย
คลิกขวาที่ลำน้ำแล้วเลือก Select และเลือก All Section in all Rivers 
หรือจะเลือกทีละหน้าตัดโดยกดปุ่ม Ctrl ค้างไว้แล้วคลิกเม้าส์ซ้ายที่หน้าตัดที่ต้องการ



ตั้งค่าการพิมพ์โดยคลิกที่เมนู File แล้วเลือก Print Multiple Sections, Settings...



ตัวอย่างนี้ตั้งค่าการพิมพ์โดยให้มี 2 Columns และ 4 Rows



ตรวจสอบการพิมพ์โดยคลิกที่เมนู File แล้วเลือก Print Multiple Sections, Preview
เพื่อตรวจสอบว่ารูปแบบหน้าตัดที่จะพิมพ์ ถูกต้องตามต้องการแล้วจึงสั่งพิมพ์


วันอาทิตย์ที่ 7 กรกฎาคม พ.ศ. 2556

การเพิ่ม Marker ลงใน Result File ของแบบจำลอง MIKE11 และ plot ใน profile plot ใน MIKEView

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

การเพิ่มข้อมูลตรวจวัด เช่นข้อมูลระดับน้ำสูงสุดที่ตำแหน่งต่างๆของลำน้ำ
จะทำผ่าน User Defined Markers ซึ่งจัดเก็บอยู่ในไฟล์ HD Parameters

ไฟล์ HD11 เมื่อเปิดหน้า User Def. Marks สามารถเพิ่มข้อมูลตรวจวัดต่างๆได้

การเพิ่มช่องกรอกข้อมูลจะใช้ปุ่ม Tab ในการเพิ่มช่องข้อมูล จากนั้น จะสามารถ Copy และ Paste
ข้อมูลที่เตรียมไว้ใน Excel ได้ หรือจะกรอกเองก็ได้เช่นกัน
โดยจำนวณจุดของข้อมูลที่กรอก จะมากหรือน้อยก็ได้ เช่นตัวอย่างนี้กรอกไว้เพียง 3 จุด

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

โดย Default จะได้ Profile ประกอบไปด้วยระดับน้ำ, ระดับน้ำสูงสุด, ระดับตลิ่งซ้ายและขวา

เพิ่มการวาดข้อมูล User Defined Markers โดยคลิกขวาที่รูปแล้วเลือก Options
จะได้หน้าต่างจัดการการวาดรูป Profile

เลือกไปที่หน้า Graphical Items เพื่อเพิ่มข้อมูล โดยคลิกที่ปุ่มสี่เหลี่ยมเหนือคำว่า Display line

เลือกเพิ่มข้อมูล Static Item แล้วเลือก User defined flag จากนั้น จะสามารถเลือก User mark
ที่มีการใส่ข้อมูลไว้ตั้งแต่ตอนทำไฟล์ HD11 ได้

จากนั้นปรับแต่งลักษณะการ Plot graph สี ขนาดเส้น และอื่นๆ ก็จะได้ตัวอย่าง Profile ดังรูป

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


วันพุธที่ 3 กรกฎาคม พ.ศ. 2556

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

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

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

โปรแกรม ที่จะแปลงไฟล์ดังกล่าวได้นั้น จะมีในคอมพิวเตอร์ที่ลงโปรแกม MIKE ไว้แล้ว
โปรแกรมสำหรับแปลงผลจะมีอยู่ใน folder ที่ลงโปรแกรม MIKE ไว้คือ
C:\Program Files (x86)\DHI\2012\bin\res11read.exe หรือ
C:\Program Files\DHI\2012\bin\res11read.exe

โดยเมื่อสั่งรันโปรแกรมนี้ใน Command prompt จะมีข้อความบอกวิธีการใช้งานดังรูป

จะพบว่ามี option ให้เลือกใช้หลากหลาย แล้วแต่ความต้องการ
โดยสามารถใช้ option ได้มากกว่า 1 อย่าง
ส่วนที่สำคัญเช่น -xy จะทำให้ได้พิกัดตำแหน่งของจุดคำนวณทั้งหมด
-minX จะทำให้ได้ค่าต่ำสุดของ item X โดยค่า X หากเป็นระดับน้ำคือ 1
และสำหรับอัตราการไหลค่า X คือ 2 ดังนั้นถ้าต้องการค่าต่ำสุดของระดับน้ำก็ใช้ -min1
และสำหรับการแปลงไฟล์ให้ได้ข้อมูลผลคำนวณทั้งหมด จะใช้ -allres
ดังนั้นตัวอย่าง code ใน batch file สำหรับ -allres เป็นดังด้านล่าง

"C:\Program Files (x86)\DHI\2012\bin\res11read.exe" -allres C:\DHI\test.res11  C:\DHI\test.txt

โดยตัวอย่าง text ที่แปลงออกมาจะมีส่วนหัวที่ตายตัว และตามด้วยรายละเอียดผลคำนวณดังรูป

และเช่นเดียวกับบทความก่อนหน้านี้เรื่องการใช้ Batch file ในการสั่งรันแบบจำลอง MIKE11
โปรแกรมแปลงผลคำนวณ ก็สามารถใช้คำสั่งที่เขียนด้วย Virtual basic ใน Excel ที่คล้ายๆกัน
ในการสั่งรันโปรแกรมแปลงผลคำนวณได้เช่นเดียวกัน ดังแสดงตัวอย่าง Code สำหรับ Macro ใน Excel
ดังด้านล่างนี้

====================================================================

'Option Explicit

'--------------Shell API and Constants----------
Private Const WAIT_FAILED = -1&
Private Const WAIT_OBJECT_0 = 0
Private Const WAIT_ABANDONED = &H80&
Private Const WAIT_ABANDONED_0 = &H80&
Private Const WAIT_TIMEOUT = &H102&
Private Const INFINITE = &HFFFFFFFF       '  Infinite timeout
Private Const NORMAL_PRIORITY_CLASS = &H20
Private Const SYNCHRONIZE = &H100000

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

Sub Button1_Click()
Call selectfile
End Sub

Sub selectfile()
Dim res11read As String
Dim res11 As String
Dim res11txt As String
Dim commandl As String

res11read = "C:\Program Files (x86)\DHI\2012\bin\res11read.exe"
res11 = "C:\DHI\Test.res11"
res11txt = "C:\DHI\Test.txt"
commandl = "-allres " + res11 + " " + res11txt
aaa = ShellAndWait(res11read, commandl, vbNormalNoFocus, -1)  ' run model and wait it to finish

End Sub

'Purpose   :    Holds execution until application has closed.
'Inputs    :    sFilePath       =   The path to the application to run e.g. "Notepad.exe"
'               [sCommandLine]  =   Any command line arguments
'               [lState]        =   The Window State to run of the shelled program (A Long)
'               [lMaxTimeOut]   =   The maximum amount of time to wait for the process to finish (in secs).
'                                   -1 = infinate
'Outputs   :    Returns the True if failed open a process or complete within the specified timeout.
'Notes     :    Similiar to ShellAndHold, but will not get any 'spiking' effects using this method.

Function ShellAndWait(sFilePath As String, Optional sCommandLine, Optional lState As VbAppWinStyle = vbNormalFocus, Optional lMaxTimeOut As Long = -1) As Boolean
    Dim lRetVal As Long, siStartTime As Single, lProcID As Long

    'Check to see that the file exists
    If FileExists(sFilePath) Then
        'Add double quotes around the path (otherwise you can't use spaces in the path)
        If Left$(sFilePath, 1) <> Chr(34) Then
            sFilePath = Chr(34) & sFilePath
        End If
        If Right$(sFilePath, 1) <> Chr(34) Then
            sFilePath = sFilePath & Chr(34)
        End If
    End If
 
    'Start the shell
    lRetVal = Shell(Trim$(sFilePath + " " + sCommandLine), lState)
    'Open the process
    lProcID = OpenProcess(SYNCHRONIZE, True, lRetVal)
 
    siStartTime = Timer
    Do
        lRetVal = WaitForSingleObject(lProcID, 0)
        If lRetVal = WAIT_OBJECT_0 Then
            'Finished process
            lRetVal = CloseHandle(lProcID)
            ShellAndWait = False
            Exit Do
        ElseIf lRetVal = WAIT_FAILED Then
            lRetVal = CloseHandle(lProcID)
            'Failed to open process
            ShellAndWait = True
            Exit Do
        End If
        Sleep 100
        If lMaxTimeOut > 0 Then
            'Check timeout has not been exceeded
            If siStartTime + lMaxTimeOut < Timer Then
                'Failed, timeout exceeded
                lRetVal = CloseHandle(lProcID)
                ShellAndWait = True
            End If
        End If
    Loop
End Function


'Purpose     :  Checks if a file exists
'Inputs      :  sFilePathName                   The path and file name e.g. "C:\Autoexec.bat"
'Outputs     :  Returns True if the file exists

Function FileExists(sFilePathName As String) As Boolean
 
    On Error GoTo ErrFailed
    If Len(sFilePathName) Then
        If (GetAttr(sFilePathName) And vbDirectory) < 1 Then
            'File Exists
            FileExists = True
        End If
    End If
    Exit Function
 
ErrFailed:
    'File Exists
    FileExists = False
    On Error GoTo 0
End Function

'Purpose     :  Converts a File Name and Path to a Path
'Inputs      :  sFilePathName                   The path and file name e.g. "C:\Autoexec.bat"
'Outputs     :  Returns the path


Function PathFileToPath(sFilePathName As String) As String
    Dim ThisChar As Long

    For ThisChar = 0 To Len(sFilePathName) - 1
        If Mid$(sFilePathName, Len(sFilePathName) - ThisChar, 1) = "\" Then
            PathFileToPath = Left$(sFilePathName, Len(sFilePathName) - ThisChar)
            Exit For
        End If
    Next
End Function
====================================================================