असंरक्षित सेल-केंद्रित FVM CFD कोड के लिए कुछ अच्छे डेटा-प्रकार क्या हैं?


12

मैं असंरचित सेल-आधारित परिमित मात्रा CFD में सेल ब्राउज़िंग के लिए कुशल डेटा संरचनाओं के लिए एक सलाह में दिलचस्पी रखता हूं।

एक उदाहरण जो मुझे मिला ( डॉल्फिन सीएफडी कोड में) इस तरह से आता है (मैं प्रासंगिक सेगमेंट दिखाऊंगा) तो हमारे पास एक सरणी NFaces है जहां प्रत्येक सेल के लिए चेहरों की संख्या संग्रहीत है। फिर CFace सरणी जो स्थानीय-से-सेल फेस नंबर को वैश्विक फेस नंबर पर मैप करती है।

\ start {लिस्टिंग} do ip = 1, Ncel ... do j = 1, NFaces (ip) k = CFace (ip, j) ipp = Face (k)% cell1 inn = Face (k)% cell2 if (inn > 0) फिर! आंतरिक \ अंत {} लिस्टिंग

कोड फेस बेस्ड होता है इसलिए एक फेस डेटा टाइप होता है जो दो सेल के सीरियल नंबर को स्टोर करता है जो फेस (k)% cell1 और फेस (k)% सेल 2 के बीच होता है।

इस पर कोई टिप्पणी या वैकल्पिक दृष्टिकोण के सुझावों का स्वागत है।

जवाबों:


9

आपके द्वारा प्रदर्शित संरचना एक आम पसंद है और एक विशेष स्थान पर सीमा भूत कोशिकाओं के साथ सीएसआर मैट्रिक्स प्रारूप में सेल-फेस आसन्नता के भंडारण के बराबर है। हालांकि, ध्यान दें कि FV विधियों को भी पूरी तरह से या लगभग-पूरी तरह से फेस ट्रैवर्सल से युक्त करने के लिए तैयार किया जा सकता है, जहां प्रत्येक चेहरे को केवल एक बार दौरा किया जाता है (दोनों पक्षों से सेंट्रोइड / क्वाड्रेचर बिंदु का पुनर्निर्माण किया जाता है, रीमैन समस्या को हल करें, कोशिकाओं पर अवशिष्ट को वापस प्रवाहित करें) )। आप अपने सेल-आधारित ट्रैवर्सल का उपयोग करके "नकली" कर सकते हैं और विरल मैट्रिक्स में "विकर्ण" के नीचे किसी भी दो कोशिकाओं को छोड़ सकते हैं, लेकिन स्टोर करने के लिए एक लोकप्रिय विकल्प है(leftCell, rightCell) = support(face)किस स्थिति में चेहरे प्रथम श्रेणी के बन जाते हैं। यह उपयोगी है क्योंकि आपको आम तौर पर फेस क्वाड्रैचर पॉइंट (सेंट्रोइड्स), फेस नॉर्म्स को स्टोर करने के लिए जगह की आवश्यकता होती है। आप फेस-आधारित डेटा संरचनाओं में पुनर्निर्माण भागों (जैसे कम से कम वर्ग) को भी डाल सकते हैं। चेहरा ट्रावेलर प्रतीत होता है कि वेक्टर-फ्रेंडली है क्योंकि सभी आकार नियमित हैं, लेकिन दूसरी ओर, ओवरलैपिंग आउटपुट हैं, इसलिए आपको आंतरिक लूप में डालने से बचने के लिए ट्रावेल को व्यवस्थित करने की आवश्यकता है। इस अधिक फेस-ओरिएंटेड डेटा संरचना के साथ, चेहरे की संख्याओं को क्रमबद्ध करना स्वाभाविक है, ताकि प्रत्येक सीमा स्थिति प्रकार को चेहरों के एक आकस्मिक आघात (भी वेक्टर-अनुकूल) का उपयोग करके लागू किया जा सके।

यदि आप इस डेटा संरचना को चुनते हैं, तो चेहरों को क्रमबद्ध करना याद रखें ताकि ट्रैवर्सल सेल डेटा को कैश में अधिक से अधिक पुनः उपयोग कर सकें। फेस ऑर्डरिंग और संबंधित अनुकूलन के प्रदर्शन विश्लेषण के लिए PETSc-FUN3D पत्रों में से कोई भी देखें।


यदि आप चेहरों पर लूप करते हैं, तो आपको फ्लक्स की गणना करने के लिए एक बाएं और राइटसेल से जानकारी प्राप्त करने की आवश्यकता होगी, कहते हैं कि फेस 1 में लेसेल 1 और राइटसेल 10 है, फेस 2 में लेसेल 6 और राइटसेल 31 है, ... जिससे मेमोरी में कूद जाता है । यह वैश्वीकरण के अनुकूल कैसे होगा?
क्रिस

जैसा कि ऊपर उल्लेख किया गया है (और PETSc-FUN3D पत्रों में चर्चा की गई है), आप चेहरों को कैश का पुन: उपयोग करने का आदेश देते हैं। परिणाम एक "एक तरफा" सेल ट्रैवर्सल की तरह है जिसमें प्रत्येक चेहरे का केवल एक बार दौरा किया जाता है।
जेड ब्राउन

3

मुझे पता है कि यह प्रश्न पहले से ही उत्तर दिया गया है, लेकिन यहां एक समान एकल-चेहरा आधारित लूपिंग स्टोरेज है जो ओपनफैम + सी + + में लागू किया गया है:

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

उदाहरण के लिए फ्लक्स गणना के लिए यह अच्छी तरह से काम करता है। फ्लक्स का मूल्यांकन एक बार प्रति चेहरे पर किया जाता है, और इसे मालिक कोशिकाओं के लिए कुल चेहरों के योग में जोड़ा जाता है, और पड़ोसी कोशिकाओं से कटौती की जाती है (चेहरे के क्षेत्र सामान्य के उन्मुखीकरण के आधार पर योग / कटौती का फैसला किया जाता है)। सीमा के चेहरे को क्रमबद्ध किया जाता है और चेहरे की सूची के नीचे संग्रहीत किया जाता है, जिससे सीमा की स्थिति को चेहरे की सूची के स्लाइस के रूप में परिभाषित किया जाता है (सीमा लेबल, सीमा पैच का अंत लेबल), इस प्रकार सीमा शर्तों के कार्यान्वयन को सरल बनाने के साथ-साथ सीमा की स्थितियों के लिए अद्यतन प्रक्रिया की इनहेनिंग दक्षता के रूप में, क्योंकि यह आंतरिक चेहरों पर संचालन द्वारा प्रदान किए गए समाधान पर निर्भर है।

चूंकि सीमा के चेहरे पैच में बढ़े हुए हैं, इसलिए अंतर-प्रक्रिया संचार को युग्मित (प्रोसेसर) पैच, और पूर्व-परिभाषित के लिए परिभाषित किया गया है। इसका मतलब यह है कि जैसे ही सीमा मेष पर एक लूप होता है, शीर्ष स्तर के एक्सेस फ़ंक्शन एमपीआई कॉल को लपेटते हैं, ऐसे कोड को "स्वचालित रूप से" समानांतर बनाते हैं, अगर यह ऊपर वर्णित चेहरे-आधारित कनेक्टिविटी पर निर्भर करता है।


कोई बात नहीं, मुझे यह देखकर खुशी हुई कि यह वर्णन किसी के लिए उपयोगी है .. :) क्या आप OpenFOAM के साथ भी काम कर रहे हैं?
tmaric

मैं करता था, अतीत में थोड़ा सा। मैं आम तौर पर स्वीकृत रुझानों से दूर रहता हूं और पहिया को फिर से मजबूत करने की कोशिश करता हूं। वही मेरा ताओ है।
जॉन्‍ट्रा वोल्‍टा

1
आपका ताओ कंप्यूटर विज्ञान के ताओ के विपरीत है: "पहिया का फिर से आविष्कार न करें"। लेकिन मैं इसे समझ सकता हूं, यह खरोंच से सामान करने की अपील कर रहा है! :)
टेमरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.