अजनबियों के साथ अपने कार्यक्रमों को एकीकृत करने की समस्याएं तेजी से सॉफ्टवेयर विकास के क्षेत्र को कवर कर रही हैं। कई प्रोग्रामर मानते हैं कि आपको अपना खुद का लिखने की ज़रूरत है, अन्य लोगों के विकास के साथ एकीकरण खराब है, और वे विकास टीमों के आकार, उनके अनुभव और समीचीनता को ध्यान में नहीं रखते हैं। हां, और एक या दो साल के भीतर एक ही परिमित-तत्व गणना प्रणाली को लागू करना संभव है, लेकिन यह उच्च गुणवत्ता का नहीं होगा। क्या यह संभव है कि 10-20 साल से विकसित हो रही परियोजना के विकास के मार्ग को दोहराएं। स्वाभाविक रूप से असंभव और अक्सर अनुचित।
कोई भी यह तर्क नहीं देता है कि रूस में सबसे लोकप्रिय सॉफ्टवेयर उपकरण ANSYS, ABAQUS, SCAD, LIRA, PLAXA आदि हैं। और इस लंबे-विभाजित बाजार खंड में एक जगह पर कब्जा करने की संभावना क्या है? और कुछ लोग नए कार्यक्रम के तहत राहत चाहते हैं। लेकिन शक्तिशाली निपटान प्रणालियों के साथ अपने कार्यक्रमों को एकीकृत करने और परिणामों को एक से दूसरे में स्थानांतरित करने की समस्या बहुत अधिक मांग वाला कार्य है। हमारे पास शक्तिशाली कंप्यूटिंग पैकेज हैं, जिनमें से विकास और डिबगिंग में कई साल लग गए, हमारे पास एक निश्चित कार्य है, जो कभी-कभी एक कंप्यूटर सिस्टम में लागू करना बहुत मुश्किल होता है, या हमारे पास आवश्यक क्षमताओं की कमी होती है जो हम खुद को लागू कर सकते हैं।
यदि आवश्यक हो, तो मैंने अपने गणना मॉडल के साथ वास्तविक परीक्षणों के समूह के मॉडलिंग के परिणामों से मेल खाने के लिए सामग्री मॉडल के पैरामीट्रिक अनुकूलन करने के लिए यह कार्य किया। यह इस तथ्य से और बढ़ जाता है कि प्रत्येक सॉफ्टवेयर उत्पाद अपने तरीके से विचार करता है और ANSYS में गणना के परिणाम समान मॉडल मापदंडों के साथ ABAQUS में गणना के समान नहीं होंगे। यह गणना के विशिष्ट कार्यान्वयन, परिमित तत्वों के प्रकार और यहां तक कि ग्रिड नोड्स के स्थान पर भी निर्भर करता है। नतीजतन, इंजीनियर सामग्री के मापदंडों में प्रवेश करता है, न जाने कैसे वे वास्तव में वास्तविकता के अनुरूप होते हैं। इसके अलावा, इष्टतम मापदंडों की परिवर्तनशीलता परीक्षण के परिणामों के 70% तक पहुंच सकती है, खासकर जब से परीक्षण प्रसंस्करण एक के ढांचे के भीतर किया जाता है, ज्यादातर दो ताकत की स्थिति में, सबसे सरल वाले, और जटिल मॉडल के लिए यह हमेशा ज्ञात नहीं होता है कि आवश्यक मापदंडों को कैसे निर्धारित किया जाए, खासकर जब उन्हें सेट के आधार पर निर्धारित किया जाए। किसी भी रेंज में अनुभव से।
यह इस समस्या को हल करना था कि कार्य ANSYS गणना कोर के साथ कार्यक्रम को एकीकृत करने के लिए सेट किया गया था। एकीकरण कार्य सफलतापूर्वक हल किया गया था, हालांकि समस्याओं के बिना नहीं। इसके अलावा, मुख्य समस्या सार्वजनिक डोमेन में प्रलेखन की पूर्ण कमी थी, इसलिए मुझे लगता है कि एकीकरण के कार्यान्वयन की जानकारी उन लोगों के लिए बहुत उपयोगी होगी, जिनके पास मेरी जैसी ही समस्याएं हैं।
एकीकरण तंत्र
एकल ANSYS कार्यक्षेत्र वातावरण में सभी ANSYS सॉफ़्टवेयर उत्पादों के एकीकरण की शुरुआत के साथ, इस वातावरण के साथ सीधे अपने कार्यक्रमों को एकीकृत करना संभव हो गया। ANSYS कार्यक्षेत्र वास्तुकला स्वयं जावा और VB लिपियों के उपयोग पर बनाया गया है, जिसके माध्यम से ANSYS मॉड्यूल जिन्हें Applets कहा जाता है।
किसी भी डेवलपर के लिए दिमाग में आने वाला पहला पहला विकल्प यह है कि यह जावा-स्क्रिप्ट में पहले से लिखी या उत्पन्न स्क्रिप्ट से प्रोग्राम को कॉल करने के लिए पर्याप्त है। हालाँकि, इस पथ में एक गंभीर दोष है: प्रत्येक बार जब आप स्क्रिप्ट को कॉल करते हैं, तो आपको वर्कबेंच को फिर से खोलना होगा, ANSYS एप्लेट को इनिशियलाइज़ करना होगा, और उसके बाद ही गणना के लिए कर्नेल को कमांड भेजें। यह स्क्रिप्ट से देखा जा सकता है, जो
C: \ Program Files \ ANSYS Inc \ v110 \ AISOL \ SDK \ नमूनों \ JPDL \ Demo.js. में स्थित है। स्क्रिप्ट पाठ नीचे दिखाया गया है:
oWB = नया ActiveXObject ( "AnsysWB.WB.90" ) ;
OWB। StartApplet = "AAOApplet" ;
OWB। रन ( ) ;
OWB। शीर्षक = "ANSYS कार्यक्षेत्र" ;
ConnectToAnsysCS ( ) ;
var fs, ए ;
बलपूर्वक = 8 ;
fs = new ActiveXObject ( "Scripting.FileSystemObject" ) ;
ए = एफएस। CreateTextFile ( "d: \ r undir \ t estfile.txt" , सच ) ;
( ansys। cmd ) के साथ {
के लिए ( l = 4 ; l < 10 ; l ++ ) {
_clear ( ) ;
_prep7 ( ) ;
_view ( शून्य , - 1 , - 2 , - 3 ) ;
var w = 3 ;
var d = 2 ;
ब्लॉक ( नल , एल, नल , डब्ल्यू, नल , डी ) ;
kp4x = ansys। एपीडल । प्राप्त करें ( "केपी" , 4 , "एलओसी" , "एक्स" ) ;
टिप्पणी = "केपी 4 एक्स एलओसी =" ;
commentx + = kp4x ;
kp4y = ansys। एपीडल । प्राप्त करें ( "केपी" , 4 , "एलओसी" , "वाई" ) ;
टिप्पणी = "केपी 4 वाई एलओसी =" ;
टिप्पणी + = kp4y ;
kp4z = ansys। एपीडल । प्राप्त करें ( "केपी" , 4 , "एलओसी" , "जेड" ) ;
टिप्पणी = "केपी 4 जेड एलओसी =" ;
commentz + = kp4z ;
ret = _com ( commentx ) ;
रिट = _com ( टिप्पणी ) ;
ret = _com ( commentz ) ;
यह । a । लिक्लाइन ( टिप्पणी ) ;
यह । a । राइटलाइन ( टिप्पणी ) ;
यह । a । राइटलाइन ( टिप्पणी ) ;
गोला ( 1 ) ;
vsbv ( 1 , 2 ) ;
एट ( 2 , 92 ) ;
vmesh ( "सभी" ) ;
दा ( 9 , "सभी" ) ;
sfa ( 4 , 1 , "राष्ट्रपति" , 10,000,000 ) ;
एमपी ( "पूर्व" , 1 , 27 ई + 06 ) ;
एमपी ( "PRXY" , 1 , 0.3 ) ;
खत्म ( ) ;
_solu ( ) ;
हल ( ) ;
खत्म ( ) ;
_post1 ( ) ;
सेट ( "LAST" ) ;
plnsol ( "S" , "EQV" ) ;
_replot ( ) ;
खत्म ( ) ;
}
}
एक। बंद ( ) ;
यदि आप प्रोग्रामेटिक रूप से स्क्रिप्ट बनाते हैं और उन्हें चलाते हैं, तो यह बहुत असुविधाजनक होगा, क्योंकि स्क्रिप्ट को एक बाहरी हैंडलर द्वारा निष्पादित किया जाएगा, जो इसके डिबगिंग को बहुत जटिल करेगा। और एक स्क्रिप्ट उत्पन्न करना जो काम के पूर्ण चक्र के लिए जिम्मेदार है, बहुत असुविधाजनक है।
मुख्य समस्या वर्कबेंच वातावरण को संभालना और उसे सहेजना था। इस दृष्टिकोण से, कार्यक्षेत्र वातावरण को लोड करने के लिए जिम्मेदार हिस्सा सबसे दिलचस्प है:
oWB = नया ActiveXObject ( "AnsysWB.WB.90" ) ;
OWB। StartApplet = "AAOApplet" ;
OWB। रन ( ) ;
OWB। शीर्षक = "ANSYS कार्यक्षेत्र" ;
इस और अन्य लिपियों का अध्ययन करते समय, मेरे पास एक सवाल था: यदि यह जावा-स्क्रिप्ट है, तो C # क्यों नहीं हो सकता है? और यह पता चला कि यह बहुत अच्छी तरह से हो सकता है। ANSYS स्थापित करते समय, MS Visual Studio स्वयं सभी ANSYS पुस्तकालयों के लिंक ढूंढता है, लेकिन वे कम से कम संस्करण 11 में, भारी रूप से काटे जाते हैं। लेकिन उनमें से एक पुस्तकालय था जो कार्यक्षेत्र के वातावरण के साथ कार्यक्रम के काम के लिए सिर्फ जिम्मेदार था: AnsysWB, जो ANSYSWBLib नामस्थान के रूप में जुड़ा हुआ है।
ANSYS चलाने के लिए, यह निम्नलिखित कोड लिखने के लिए पर्याप्त है:
ANSYSWBLib। WBClass wb = नया ANSYSWBLib। WBClass ( ) ; // एक ABSYS WB ऑब्जेक्ट बनाएँ
पश्चिम बंगाल। पार्टिशन मौजूद। निर्देशिका = @ "c: tmp" ; // कार्यशील निर्देशिका निर्दिष्ट करें
पश्चिम बंगाल। पार्टिशन मौजूद। जॉबनाम = "टेस्ट" ; // परियोजना का नाम निर्दिष्ट करें
पश्चिम बंगाल। पार्टिशन मौजूद। CadFile = @ "c: tmpqwe.ewq" ; // कार्यशील फ़ाइल निर्दिष्ट करें
पश्चिम बंगाल। StartApplet = "AAOApplet" ; // निर्दिष्ट करें कि हमें क्लासिक ANSYS मॉड्यूल की आवश्यकता है
पश्चिम बंगाल। रन ( 0 ) ;
तो, यह कोड आपको ANSYS चलाने की अनुमति देता है, और क्लासिक ANSYS का एप्लेट, जो लॉन्च किया जाएगा, सीधे शुरू एप्लेट के रूप में इंगित किया गया है। लेकिन फिर हमें नियंत्रण आदेशों के हस्तांतरण को उसके लिए व्यवस्थित करने की आवश्यकता है, और यहां कठिनाइयां पैदा हुईं। जावा-स्क्रिप्ट में, यह निम्नलिखित पंक्ति द्वारा कार्यान्वित किया जाता है।
अनुप्रयोग। लिपि । ans_sendcommand ( कमांड )
जहां ऐप AAOApplet मॉड्यूल को हैंडल करने के लिए एक लिंक है। इसे एक क्लास प्रॉपर्टी में स्टोर किया जाता है।
पश्चिम बंगाल। AppletList । get_WBApplet ( "AAOApplet" ) । एप्लेट। ऐप
लेकिन प्लग-इन पुस्तकालयों में ANSYS के संस्करण 11 में, मुझे ANSYS ऐपलेट के साथ काम करने के लिए एक इंटरफ़ेस नहीं मिला। सौभाग्य से, नेट फ्रेमवर्क में Microsoft.JScript जैसी एक लाइब्रेरी है जो आपको सीधे JScript स्क्रिप्ट्स को मेमोरी में संकलित करने और उन्हें निष्पादित करने की अनुमति देती है, और आप C # से आवश्यक फ़ंक्शन के लिए एक कॉल लागू कर सकते हैं।
इस उद्देश्य के लिए, मैंने अपनी कक्षा लिखने का फैसला किया, जो ANSYS / क्लास कोड के साथ काम करने के लिए सभी आवश्यक सुविधाओं को लागू करेगा, नीचे प्रस्तुत किया गया है।
वर्ग WBCommand
{
ANSYSWBLib। WBClass wb ;
सार्वजनिक WBCommand ( ANSYSWBLib। WBClass WB )
{
wb = wb ;
आओ = डब्ल्यूबी। AppletList । get_WBApplet ( "AAOApplet" ) । एप्लेट। अनुप्रयोग;
स्ट्रिंग कोड = @ "फ़ंक्शन बंद होना ()
{
वापसी समारोह (ऐप, कमांड)
{
वापसी App.Script.ans_sendcommand (कमांड);
}
}
बंद () ;
//
SendCommandClosure = ( बंद ) Microsoft। JScript। इवल । JScriptEvaluce ( कोड, Microsoft। JScript । Vsa । Vsa । VineEngine । CreateEngine ( ) ) ;
}
निजी क्लोजर SendCommandClosure = null ;
निजी क्लोजर सेटवर्किंगडायरेक्टरी क्लोजर = नल ;
निजी वस्तु aao = null ;
सार्वजनिक ऑब्जेक्ट SendCommand ( स्ट्रिंग कमांड )
{
SendCommandClouble वापसी करें। आह्वान ( अशक्त , नई वस्तु [ ] { aao, कमांड } ) ;
}
सार्वजनिक शून्य सेटवर्किंगडायरेक्टरी ( स्ट्रिंग वर्कडायरेक्टरी )
{
SendCommand ( "/ CWD," + WorkingDirectory ) ;
}
}
जब मेरी कक्षा के निर्माता को बुलाया जाता है, तो JScript में कॉल की गई प्रक्रिया बनती है और इसका प्रवेश बिंदु बच जाता है:
स्ट्रिंग कोड = @ "फ़ंक्शन बंद होना ()
{
वापसी समारोह (ऐप, कमांड)
{
वापसी App.Script.ans_sendcommand (कमांड);
}
}
बंद () ;
//
SendCommandClosure = ( बंद ) Microsoft। JScript। इवल । JScriptEvaluce ( कोड, Microsoft। JScript । Vsa । Vsa । VineEngine । CreateEngine ( ) ) ;
इसे कॉल करने के लिए, एक विधि लागू की गई थी:
सार्वजनिक ऑब्जेक्ट SendCommand ( स्ट्रिंग कमांड )
{
SendCommandClouble वापसी करें। आह्वान ( अशक्त , नई वस्तु [ ] { aao, कमांड } ) ;
}
इनपुट पैरामीटर के रूप में, जिसे टेक्स्ट कमांड की आवश्यकता होती है, और जब JSCript कहा जाता है, तो फ़ंक्शन अतिरिक्त रूप से एप्लेट के संदर्भ में गुजरता है जो कि कंस्ट्रक्टर में प्राप्त किया गया था और एओ चर में सहेजा गया था।
अब, SendCommand विधि को कॉल करके, हमारे बाहरी एप्लिकेशन से APDL भाषा में ANSYS कमांड ट्रांसफर करना संभव होगा, सभी आवश्यक कार्यों का प्रदर्शन। यह विधि ANSYS कमांड लाइन में सीधे कमांड के इनपुट का अनुकरण करती है, लेकिन कई कमांड को पुष्टि की आवश्यकता होती है। कार्यों की पुष्टि के अनुरोधों से बचने के लिए, यह एक-एक करके आदेशों को सम्मिलित नहीं करने के लिए पर्याप्त है, लेकिन उन्हें APDL फ़ाइल में लिखने और SendCommand कमांड ("/ inp, f, apdl") को कॉल करने के लिए। इस मामले में, ANSYS को एक या निष्पादित करने के लिए पुष्टि की आवश्यकता नहीं होगी। एक और ऑपरेशन।
मैंने ANSYS के नए संस्करणों के साथ काम करने का परीक्षण नहीं किया है, इसलिए जेएस के उपयोग को पूरी तरह से छोड़ना अब संभव है, लेकिन अगर संस्करण 11 के साथ संगतता की आवश्यकता है, तो मुझे अपना कार्यक्रम एकीकृत करने का दूसरा तरीका नहीं मिला।