मैं एक ही संरचना के साथ दो अलग-अलग VTK फ़ाइलों में संग्रहीत दो क्षेत्रों के बीच संख्यात्मक अंतर की गणना कैसे करूं?


15

मान लीजिए कि मेरे पास दो वीटीके फ़ाइलें हैं, दोनों संरचित ग्रिड प्रारूप में। संरचित ग्रिड समान हैं (उनके पास समान क्रम में समान अंकों की सूची है), और एक फ़ील्ड है, इसे प्रत्येक वीटीके फ़ाइल में "फि" कहते हैं। मैं एक तीसरी वीटीके फ़ाइल बनाना चाहता हूं, फिर से उसी संरचित ग्रिड के साथ, और दूसरी वीटीके फाइल में फी के बीच पहली वीटीके फाइल और फी के बीच अंतर करने वाले क्षेत्र की साजिश करें।

मुझे पता है कि यह मैन्युअल रूप से कैसे करना है; मैं दो VTK फ़ाइलों में कच्चे पाठ को पार्स कर सकता हूं, डेटा को सरणियों में कॉपी कर सकता हूं, एक सरणी को दूसरे से घटा सकता हूं, और फिर डेटा को एक नई फ़ाइल में सही प्रारूप में डंप कर सकता हूं। क्या इस अंतर की गणना करने और वीटीके को निर्यात करने का एक बेहतर तरीका है? पायथन में एक समाधान, या विज़टिट सॉफ्टवेयर जैसे कि विज़ इट या पैराव्यू, सी ++ जैसी संकलित भाषा का उपयोग करने के लिए बेहतर होगा।

इस अंतर की गणना का उद्देश्य पीडीई के समाधान की गणना के लिए विभिन्न संख्यात्मक तरीकों की तुलना करना है; चूंकि मैं समाधानों को उत्पन्न करने के लिए एक ही सॉफ्टवेयर का उपयोग कर रहा हूं, इसलिए मैं यह गारंटी दे सकता हूं कि सभी डेटा लेकिन फ़ील्ड Phi प्रत्येक फ़ाइल में समान होगी जो मैं उत्पन्न करता हूं।


मैंने इस प्रश्न को पोस्ट किया क्योंकि मुझे उत्तर का पता लगाने में लगभग डेढ़ दिन का समय लगा; क्या मुझे कल नहीं मिला था, मैंने इस सवाल को यहाँ वैसे भी पूछा होगा। मुझे यह देखने में दिलचस्पी है कि क्या समान कार्य को पूरा करने के अन्य त्वरित तरीके हैं।
ज्योफ ऑक्सीबेरी

जब आप कहते हैं "कच्चे पाठ को पार्स करें" तो आपका मतलब है कि सचमुच फाइल में जाना है या अजगर पार्सर का उपयोग करना है?
SAAD

उस समय, मेरा मतलब था कि हाथ से पायथन पार्सर लिखना।
ज्योफ ऑक्सीबेरी

जवाबों:


16

एक ही संरचित ग्रिड के साथ अलग-अलग VTK फ़ाइलों से दो फ़ील्ड्स को मिलाने का सबसे आसान तरीका है, Parview में प्रोग्रामेबल फ़िल्टर का उपयोग करना, जो आपको पायथन स्क्रिप्ट्स का उपयोग करके डेटा को हेरफेर करने की अनुमति देता है।

प्रोग्राम करने योग्य फ़िल्टर संवाद बॉक्स में, आप दो सरणियों को घटा सकते हैं और कोड के साथ आउटपुट में लिख सकते हैं:

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

इस उदाहरण में, फ़ील्ड Phi सेल डेटा होने के लिए होता है। यदि आपका फ़ील्ड बिंदु डेटा है, CellDataतो स्क्रिप्ट के साथ हर जगह बदलें PointData। अधिक जानकारी के लिए http://public.kitware.com/pipermail/paraview/2010-April/016667.html देखें ।


4
यह याद दिलाने के लिए कभी भी बहुत अधिक नहीं है कि दो इनपुट्स (इनपुट्स [0] और इनपुट्स [1]), किसी को प्रोग्रामेबल फ़िल्टर को चुनने से पहले दोनों डेटा सेट को हाइलाइट करना होगा (यह एक संदर्भित लिंक है)।
टॉलिवेरा

3

पैराव्यू में एपेंड एट्रीब्यूट्स फिल्टर है जो इसके लिए इस्तेमाल किया जा सकता है। इसके लिए आवश्यक है कि बिंदु डेटा को ठीक से लागू करने के लिए डेटा सेट में समान संख्या में बिंदु हैं और सेल डेटा को ठीक से जोड़ने के लिए डेटा सेट में समान संख्या में सेल हैं। हालांकि यह एक ही नाम (यानी आपके उदाहरण में Phi) के सरणियों के साथ समस्याएँ होंगी। आप ऐप्पल एट्रीब्यूट्स फ़िल्टर का उपयोग करने से पहले कैलकुलेटर सरणी फ़िल्टर के साथ उस सरणी को आसानी से कॉपी कर सकते हैं। तब आप घटाव करने के लिए एक और कैलकुलेटर फ़िल्टर का उपयोग कर सकते हैं। यह शायद पैरावे के पाइथन प्रोग्रामेबल फिल्टर का उपयोग करने की तुलना में कम कुशल है। इसके अलावा, आप vtkpython निष्पादन योग्य का उपयोग इसे मैन्युअल रूप से करने के लिए कर सकते हैं क्योंकि आपके पास ग्रिड और उनकी विशेषताओं दोनों के लिए सीधी पहुंच होगी।


1

मेरे पास विशेष रूप से अच्छा दृष्टिकोण नहीं है, लेकिन मैं एक VTK फ़ाइल से दूसरे में 'phi' फ़ील्ड की प्रतिलिपि बनाऊंगा और इसे 'phiprime' या कुछ और नाम दूंगा। पैराव्यू और विजिट दोनों में, आपके पास नए फ़ील्ड्स को एक सूत्र द्वारा परिभाषित करने का विकल्प होता है जो अन्य फ़ील्ड्स के मानों का उपयोग करता है। आप तब फ़ील्ड संपादक में "त्रुटि" के रूप में "त्रुटि = phi-phiprime" को परिभाषित कर सकते हैं, और इस क्षेत्र "त्रुटि" को या तो एक सतह, एक समोच्च साजिश, या जो भी आप में रुचि रखते हैं, के रूप में साजिश कर सकते हैं।

डेटा के ब्लॉक को एक फ़ाइल से दूसरी फ़ाइल में कॉपी करने का कदम स्पष्ट रूप से अजीब है, लेकिन यह सबसे अच्छा है जिसके साथ मैं आ सकता हूं।


1

मुझे एहसास हुआ कि यह थोड़ा पुराना है, लेकिन मैं आपको VisIt समाधान में दिलचस्पी हो सकती है:

आप इसे VisIt में एक कॉन्सेप्टली बेस्ड क्रॉस मेश फील्ड एक्सप्रेशन नामक चीज़ के साथ कर सकते हैं। यह एक मुखर है, लेकिन मूल रूप से डेटाबेस (आपके मामले में VTK फ़ाइलों में) के बीच फ़ील्ड मैप करने के लिए मशीनरी है।

"कनेक्टिविटी आधारित" (con_cmfe) का उपयोग तब किया जाता है जब टोपोलॉजी फ़ाइलों के बीच समान होती है - जैसे आपके मामले में।

वहाँ भी एक "स्थिति आधारित" (pos_cmfe) है कि अलग टोपोलॉजी के साथ meshes के बीच नमूने हैं।

आपके मामले के लिए, पहली फ़ाइल खोलें और एक अभिव्यक्ति को परिभाषित करने के लिए एक्सप्रेशन विंडो का उपयोग करें (MyPhi_Diff):

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

फिर आप "MyPhi_Diff" को Pseudocolor प्लॉट के साथ प्लॉट कर सकते हैं।

वहाँ भी जादूगर है कि आप अभिव्यक्ति को परिभाषित करने में मदद करने के लिए उपयोग कर सकते हैं

(विकल्प मेनू -> "डेटा स्तर की तुलना")

यहाँ कुछ अधिक जानकारी है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.