2012-05-25 17 views
5

के साथ एक सॉल्वर के लिए एक अच्छा ओओपी डिज़ाइन मैं एक पीडीई सिस्टम को हल करने के लिए एक फोरट्रान कोड तैयार कर रहा हूं।आधुनिक फोरट्रान

जिस तरह से यह अभी डिज़ाइन किया गया है यह है कि मेरे पास Variable है जिसमें कई विशेषताएं हैं, जिनमें से सबसे महत्वपूर्ण मूल्य val है जो मान संग्रहीत करता है।

अब मेरे पास solver कक्षा भी है, जो variable पर गणना करेगा। मैंने सोचा कि पूरे variable को सॉल्वर में पास करना और variable%val के साथ काम करना हर बार जब मैं इसे चलाने के लिए (निष्पादन के दौरान कई हज़ार बार) अक्षम होना चाहता हूं, इसलिए मैंने solver कक्षा में पॉइंटर फ़ील्ड को परिभाषित करने का निर्णय लिया उचित चर के लिए हलचल। उदाहरण

program example 
    use variable 
    use solvers 

    type(Variable) T 
    type(Solver) solver_temperature 

    !Contructors 
    call T%create() 
    call solver_temperature%create(T) 

    call solver_temperature%solve() 
end program example 

और solver मॉड्यूल

module solvers 
type Solver 
    real*8, pointer :: T(:,:) 

contains 
    procedure :: create 
    procedure :: solve 
end type 

contains 
    subroutine create(this,T) 
     type(Solver) :: this 
     type(Variable) :: T 

     this%T => T%val 
    end subroutine 
end module 

मेरे कार्यक्रम में के लिए मैं विभिन्न भौतिक गुणों और विभिन्न समाधानकर्ताओं कि जिस तरह से मैं ऊपर से पता चला है में उन चर के साथ जुड़े रहे हैं के लिए अलग अलग चर परिभाषित करते हैं।

मैं आम तौर पर ओओपी के लिए नया हूं, इसलिए मेरा सवाल यह है कि यह एक सभ्य डिजाइन है? खासकर एक प्रदर्शन बिंदु से। यह T को केवल एक सरणी बनाने और गति के संदर्भ में एक subroutine solve पर पास करने के साथ तुलना करता है? क्या ऐसा करने का कोई नियमित तरीका है?

+2

मुझे परिवर्तनीय सूचक में बहुत अधिक बिंदु नहीं दिख रहा है। बस इसे एक डमी तर्क के रूप में पास करना मेरे लिए अधिक प्राकृतिक लगता है। यह केवल एक सरणी वर्णनकर्ता है, प्रदर्शन के लिए कुछ भी बुरा नहीं है। –

उत्तर

5

मैं एक साल के लिए फोरट्रान की ओओ सुविधाओं के साथ काम कर रहा हूं या अब, यहां कुछ विस्तारित टिप्पणियां उत्तर के रूप में मास्कराइडिंग हैं।

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

कोड डिजाइन, समझदारी, विस्तारशीलता, इस तरह की चीज के मुद्दों पर स्थापित होने पर ओओ के पक्ष में तर्क मजबूत होते हैं। यदि यह आपके लिए महत्वपूर्ण है तो आपको ओओ सुविधाओं का उपयोग करने के बारे में सोचना चाहिए।

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

व्यक्तिगत रूप से, मुझे आपकी टाइप-बाध्य प्रक्रिया create परिभाषित करने के तरीके को पसंद नहीं है। मैं बहुत, एक समारोह के रूप आपरेशन के उस तरह लागू करने के लिए इतना है कि मैं इस तरह लाइनों लिख सकते हैं पसंद करते हैं:

t = solver%new() 
बजाय अपने

call T%create() 

नोट

इस मेरा एक प्राथमिकता है, और यह और भी है दक्षता या शुद्धता की तुलना में शैली का सवाल। मैंने देखा है कि आपने subroutine create पर तर्कों के इरादे घोषित नहीं किए हैं; शायद क्योंकि आपने केवल अपने कोड का एक स्निपेट पोस्ट किया है।

क्योंकि ओओ फोर्ट्रान के लिए अपेक्षाकृत नया है (और, तर्कसंगत रूप से, उन क्षेत्रों में काम करने वाले अधिकांश लोगों के लिए अपेक्षाकृत अपरिचित है जहां फोरट्रान का व्यापक रूप से उपयोग किया जाता है) इसे अपनाने में हमें मार्गदर्शन करने के लिए बहुत उपयोगी सामग्री नहीं है।मैं Scientific Software Design की सिफारिश करता हूं। यह विषय सभ्य कवरेज देता है और इस बारे में तर्क देता है कि वैज्ञानिक और इंजीनियरिंग प्रोग्रामर को ओओ क्यों अपनाना चाहिए।

+0

+1 मुझे एक समारोह के रूप में प्रारंभिक पसंद भी है, क्योंकि यह रचनाकारों के साथ अन्य दृष्टिकोण (हालांकि स्मृति आवंटन कहीं और किया जाता है)। कभी-कभी सॉल्वर% नाम के साथ सॉल्वर% नया इंटरफ़ेस बनाने के लिए भी आसान होता है, फिर मानक टी व्युत्पन्न प्रकार प्रारंभिक नहीं होने पर उन मामलों में 'टी = सॉल्वर()' का उपयोग करें। –

+0

पुस्तक लिंक के लिए बहुत कुछ टैंक करता है, मैं इसे पकड़ने की कोशिश करूंगा। आपके 'सॉल्वर% नए()' उदाहरण में – tiam

+0

, 'सॉल्वर' क्या है? एक सॉल्वर ऑब्जेक्ट? या आप इस तरह के प्रकार के कार्यों को इस तरह से एक्सेस कर सकते हैं? – weymouth