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


15

สมมติว่าฉันมีไฟล์ VTK สองไฟล์ทั้งในรูปแบบกริดที่มีโครงสร้าง กริดที่มีโครงสร้างเหมือนกัน (มีรายการจุดเหมือนกันตามลำดับเดียวกัน) และมีฟิลด์เรียกว่า "พี" ในแต่ละไฟล์ VTK ฉันต้องการสร้างไฟล์ VTK ที่สามอีกครั้งด้วยกริดที่มีโครงสร้างเดียวกันและพล็อตฟิลด์ที่แตกต่างระหว่างพีในไฟล์ VTK แรกและพีในไฟล์ VTK ที่สอง

ฉันรู้วิธีการทำสิ่งนี้ด้วยตนเอง; ฉันสามารถแยกวิเคราะห์ข้อความดิบในไฟล์ VTK สองไฟล์คัดลอกข้อมูลลงในอาร์เรย์ลบหนึ่งอาเรย์ออกจากที่อื่นแล้วถ่ายโอนข้อมูลในรูปแบบที่ถูกต้องลงในไฟล์ใหม่ มีวิธีที่ดีกว่าในการคำนวณความแตกต่างนี้และส่งออกไปยัง VTK หรือไม่ โซลูชันใน Python หรือซอฟต์แวร์สร้างภาพข้อมูลเช่น VisIt หรือ Paraview ควรใช้ภาษาที่คอมไพล์เช่น C ++

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


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

เมื่อคุณพูดว่า "แยกวิเคราะห์ข้อความดิบ" คุณหมายถึงเข้าไปในไฟล์จริงๆหรือใช้ parser python ใช่ไหม
SAAD

ในตอนนั้นฉันหมายถึงเขียนตัวแยกวิเคราะห์ Python ด้วยมือ
Geoff Oxberry

คำตอบ:


16

วิธีที่ง่ายที่สุดที่ฉันสามารถค้นหาเพื่อลบสองฟิลด์จากไฟล์ VTK ที่แตกต่างกันด้วยกริดที่มีโครงสร้างเดียวกันคือการใช้ตัวกรองที่สามารถตั้งโปรแกรมได้ใน Paraview ซึ่งช่วยให้คุณจัดการข้อมูลโดยใช้สคริปต์ Python

ในกล่องโต้ตอบตัวกรองที่ตั้งโปรแกรมได้คุณสามารถลบสองอาร์เรย์และเขียนไปยังเอาต์พุตด้วยรหัส:

   phi_0 = inputs[0].CellData['Phi']
   phi_1 = inputs[1].CellData['Phi']
   output.CellData.append(phi_1 - phi_0, 'difference')

ในกรณีนี้ฟิลด์พีเกิดขึ้นเป็นข้อมูลเซลล์ ถ้าเขตของคุณเป็นข้อมูลจุดเปลี่ยนทุกที่ในสคริปต์ด้วยCellData PointDataดูhttp://public.kitware.com/pipermail/paraview/2010-April/016667.htmlสำหรับรายละเอียดเพิ่มเติม


4
มันไม่เคยมากเกินไปที่จะเตือนว่ามีสองอินพุต (อินพุต [0] และอินพุต [1]) หนึ่งจะต้องเน้นทั้งชุดข้อมูลก่อนที่จะเลือกตัวกรองที่ตั้งโปรแกรมได้ (นี่คือลิงค์ที่อ้างถึง)
toliveira

3

ใน ParaView จะมีตัวกรองผนวกคุณสมบัติซึ่งสามารถใช้สำหรับสิ่งนี้ จำเป็นต้องมีจำนวนจุดเดียวกันในชุดข้อมูลสำหรับการต่อท้ายข้อมูลจุดอย่างถูกต้องและจำนวนเซลล์เดียวกันอยู่ในชุดข้อมูลสำหรับการผนวกข้อมูลเซลล์อย่างถูกต้อง มันจะมีปัญหาแม้ว่าจะมีอาร์เรย์ในชื่อเดียวกัน (เช่นพีในตัวอย่างของคุณ) คุณสามารถคัดลอกอาร์เรย์นั้นได้อย่างง่ายดายด้วยตัวกรองเครื่องคิดเลขก่อนใช้ตัวกรองผนวกคุณสมบัติ จากนั้นคุณสามารถใช้ตัวกรองเครื่องคิดเลขตัวอื่นเพื่อทำการลบ นี่อาจมีประสิทธิภาพน้อยกว่าการใช้ตัวกรองที่สามารถตั้งโปรแกรม Python ของ ParaView ได้ นอกจากนั้นคุณสามารถใช้ไฟล์ปฏิบัติการ vtkpython เพื่อทำงานด้วยตนเองเนื่องจากคุณสามารถเข้าถึงทั้งกริดและแอตทริบิวต์ได้โดยตรง


1

ฉันไม่มีวิธีการที่ดีเป็นพิเศษ แต่ฉันจะคัดลอกฟิลด์ 'phi' จากไฟล์ VTK หนึ่งไปยังอีกไฟล์หนึ่งและตั้งชื่อว่า 'phiprime' หรือบางอย่าง ในทั้ง Paraview และ Visit คุณมีตัวเลือกในการกำหนดเขตข้อมูลใหม่ด้วยสูตรที่ใช้ค่าของเขตข้อมูลอื่น จากนั้นคุณสามารถกำหนดฟิลด์ "ข้อผิดพลาด" เป็น "ข้อผิดพลาด = phi-phiprime" ในตัวแก้ไขฟิลด์และพล็อตข้อผิดพลาดฟิลด์นี้ "เป็น" ทั้งพื้นผิวพล็อตรูปร่างหรือสิ่งที่คุณสนใจ

ขั้นตอนการคัดลอกบล็อกของข้อมูลจากไฟล์หนึ่งไปอีกอันหนึ่งนั้นค่อนข้างชัดเจน แต่มันเป็นสิ่งที่ดีที่สุดที่ฉันสามารถทำได้


1

ฉันรู้ว่านี่เก่าไปหน่อย แต่ฉันคิดว่าคุณอาจสนใจโซลูชั่น VisIt:

คุณสามารถทำได้ใน VisIt ด้วยสิ่งที่เรียกว่า Expression Based Cross Mesh Field Expression นั่นคือคำหนึ่ง แต่โดยทั่วไปแล้วเครื่องจักรจะแมปฟิลด์ระหว่างฐานข้อมูล (ในไฟล์ VTK ของคุณ)

"การเชื่อมต่อที่ใช้" (conn_cmfe) จะใช้เมื่อโทโพโลยีเหมือนกันระหว่างไฟล์ - เช่นในกรณีของคุณ

นอกจากนี้ยังมี "ตำแหน่งตาม" (pos_cmfe) ที่ตัวอย่างระหว่างตาข่ายกับทอพอโลยีที่แตกต่างกัน

สำหรับกรณีของคุณให้เปิดไฟล์แรกและใช้หน้าต่างนิพจน์เพื่อกำหนดนิพจน์ (MyPhi_Diff):

Phi - conn_cmfe(<file2.vtk:Phi>, mesh)

จากนั้นคุณสามารถลงจุด "MyPhi_Diff" ด้วยพล็อต Pseudocolor

นอกจากนี้ยังมีตัวช่วยสร้างที่คุณสามารถใช้เพื่อกำหนดนิพจน์

(เมนูตัวเลือก -> "การเปรียบเทียบระดับข้อมูล")

นี่คือข้อมูลเพิ่มเติม:

http://visitusers.org/index.php?title=Cmfe

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.