वैश्विक विरल परिमित तत्व स्ट्रेन्स मेट्रिसेस में डिरिक्लेट सीमा स्थितियों को कुशलतापूर्वक कैसे लागू किया जाए


9

मैं सोच रहा हूं कि वैश्विक स्पार्स परिमित तत्व मैट्रिसेस में डिरिक्लेट सीमा की स्थिति वास्तव में कुशलता से कैसे लागू की जाती है। उदाहरण के लिए, हम कहते हैं कि हमारा वैश्विक परिमित तत्व मैट्रिक्स था:

=[520-102410001632-1037000203]और दाएं हाथ के वेक्टर=[12345]

फिर पहले नोड पर एक ड्यूरिचलेट स्थिति लागू करने के लिए ( ) हम पहली पंक्ति को शून्य करेंगे, पर 1 , और दाहिने हाथ से पहले कॉलम को । उदाहरण के लिए हमारा सिस्टम बन जाएगा: एक्स1=सी1 1

=[1000004100016320037000203]और दाएं हाथ के वेक्टर=[सी2-2×सी3-0×सी4+1×सी5-0×सी]

यह सिद्धांत में सभी अच्छी तरह से और अच्छा है, लेकिन अगर हमारे K मैट्रिक्स को संपीड़ित पंक्ति प्रारूप (CRS) में संग्रहीत किया जाता है, तो स्तंभों को दाईं ओर स्थानांतरित करना बड़ी प्रणालियों के लिए महंगा हो जाता है (कई नोड्स डीरिचलेट होने के साथ)। एक वैकल्पिक विकल्प यह होगा कि आप डार्किलेट स्थिति के समान कॉलम को दाएं-हाथ की ओर न ले जाएं, अर्थात हमारा सिस्टम बन जाएगा:

=[100002410001632-1037000203]और दाएं हाथ के वेक्टर=[सी2345]

हालाँकि, इसमें एक बड़ी भूमिका यह है कि यह प्रणाली अब सममित नहीं है और इसलिए हम अब पहले से तैयार संयुग्म ढाल (या अन्य सममित ठोस) का उपयोग नहीं कर सकते हैं। एक दिलचस्प समाधान जो मेरे सामने आया वह है "मेथड ऑफ लार्ज नंबर्स" जो मुझे गेनैद निकिशकोव की पुस्तक "प्रोग्रामिंग फिनिट एलिमेंट्स इन जावा" में मिला। यह विधि इस तथ्य का उपयोग करती है कि दोहरी सटीकता में केवल सटीकता के लगभग 16 अंक होते हैं। स्थिति में 1 डालने के बजाय हम एक बड़ी संख्या रखते हैं। उदाहरण के लिए हमारी प्रणाली बन जाती है: 1 1

=[1.06420-102410001632-1037000203]और दाएं हाथ के वेक्टर=[सी×1.0642345]

इस विधि के लाभ यह हैं कि यह मैट्रिक्स की समरूपता को बनाए रखता है जबकि विरल भंडारण प्रारूपों के लिए भी बहुत कुशल है। मेरे प्रश्न इस प्रकार हैं:

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


2
क्या आपके पास इस बात के सबूत हैं कि यह आपको धीमा कर रहा है?
बिल बर्थ

@BillBarth हां, हालांकि हमेशा मौका है कि मैं कुछ अक्षम कर रहा हूं। Gennadily खुद लिखते हैं कि जबकि स्पष्ट विधि पूर्ण 2d सरणियों के लिए आसान है, ".. जब मैट्रिक्स एक कॉम्पैक्ट प्रारूप में होता है तो मैट्रिक्स पंक्तियों और स्तंभों तक पहुंचना हमेशा आसान नहीं होता है।" यह सुझाव देना कि कुशलता से लागू करने के लिए स्पष्ट पद्धति अधिक चुनौतीपूर्ण हो सकती है। जैसा कि मेरा कोड वर्तमान में लिखा गया है, स्पष्ट पद्धति को वास्तविक हल करने में अधिक समय लग सकता है।
जेम्स

1
जैसे कि वोल्फगैंग कहता है और आप इकट्ठा होने से पहले तत्व मैट्रीस के लिए सीमा की स्थिति लागू करते हैं।
बिल बार्थ

@BillBarth हां मुझे लगता है कि मैं ऐसा करूंगा। उनके वीडियो अद्भुत हैं! मैंने उसके बारे में एक टिप्पणी / प्रश्न छोड़ दिया कि क्या आपको प्रत्येक टाइमस्टेप पर वैश्विक मेट्रिक्स को फिर से इकट्ठा करने की आवश्यकता है, जिसके बाद मुझे लगता है कि मैं उसके उत्तर को स्वीकार करूंगा।
जेम्स

जवाबों:


11

Deal.II ( http://www.dealii.org - अस्वीकरण: मैं उस पुस्तकालय के प्रमुख लेखकों में से एक हूं), हम पूरी पंक्तियों और स्तंभों को समाप्त करते हैं, और यह कुल मिलाकर बहुत महंगा नहीं है। ट्रिक इस तथ्य का उपयोग करने के लिए है कि स्पार्सिटी पैटर्न आमतौर पर सममित होता है, इसलिए आप जानते हैं कि एक संपूर्ण कॉलम को समाप्त करते समय आपको किन पंक्तियों पर ध्यान देना चाहिए।

मेरे दृष्टिकोण में, बेहतर दृष्टिकोण, सेल मैट्रिक्स में इन पंक्तियों और स्तंभों को खत्म करना है, इससे पहले कि वे वैश्विक मैट्रिक्स में जोड़े जाएं। वहां आप पूरी तरह से काम करते हैं, इसलिए सब कुछ कुशल है।

मैंने बड़ी संख्या के दृष्टिकोण के बारे में कभी नहीं सुना है और इसका उपयोग नहीं करेगा क्योंकि निश्चित रूप से यह बहुत बुरी तरह से समस्या पैदा करेगा।

संदर्भ के लिए, हम जो एल्गोरिदम डील में उपयोग करते हैं। II को वैचारिक रूप से 21.6 और 21.65 में http://www.math.colostate.edu/~bangerth/videos.html व्याख्यान में वर्णित किया गया है । वे बारीकी से आपके विवरण से मेल खाते हैं।


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

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

1
आह मैं देख रहा हूं कि मुझे क्या संदेह है। जैसा आपने सुझाव दिया था, मैं उसे लागू करूंगा। ठीक है आपकी मदद के लिए thats। उन डीलली ट्यूटोरियल वीडियो वास्तव में बहुत अच्छे हैं!
जेम्स

2

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

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