Abaqus - Rpy Abaqus - Rpy
Abaqus - Rpy Abaqus - Rpy
مقدمه:
تمام فعالیتهایی که در واسطه گرافیکی آباکوس انجام میگیرد ،بهصورت
دستوراتی در فایلی با نام abaqus.rpyذخیره میگردد .با هر بار اجرای آباکوس ،به پسوند
فایل ذخیره شده قبلی یک عدد اضافه شده و مجدداً دستورات جدید در فایل abaqus.rpy
ذخیره میگردد.
از طرف دیگر میتوان تمام دستورات واسط گرافیکی را بهصورت توابع و دستوراتی
در فایلی با پسوند *.pyنوشت و سپس فایل آماده شده را در آباکوس اجرا کرد .قواعد
حاکم بر نگارش این دستورات از زبان برنامه نویسی پیتون( )Pythonتبعیت میکند و
عالوه بر توابع اختصاصی آباکوس ،دستورات پیتون نیز توسط آباکوس شناخته شده است.
به عبارت دیگر حلقههای تکرار وشرطی و کلیه توابع پیتون را میتوان در آباکوس اجرا
کرد .به این ترتیب مدلسازی اجسامی که از الگوریتم خاصی پیروی میکنند و یا بهینه
سازی مدل بر اساس یک روند تکراری ،براحتی امکان پذیر است .برای استفاده از این
قابلیت آباکوس کاربر باید با زبان برنامه نویسی پیتون آشنایی داشته باشد.
آشنایی و طرز کار با نرم افزار ABAQUS 264
در این قسمت ابتدا برنامهنویسی پیتون معرفی میگردد .ذخیره سازی و کنترل جریان
برنامه و سایر ابزارهای مورد نیاز برای برنامه نویسی در پیتون مورد بررسی قرار گرفته،
سپس به برنامه نویسی در آباکوس پرداخته خواهد شد .هدف این بخش آموزش سریع و
کاربردی برنامه نویسی در آباکوس است و فرض میشود که خواننده حداقل با یک زبان
برنامه نویسی آشنایی کامل دارد.
برنامه پیتون را میتوانید از سایت رسمی پیتون www.python.orgدانلود کنید .البته
نسخههای دیگری از این نرمافزار نیز وجود دارند که برخی از آنها دارای ویرایشگرهای
مناسبتری هستند .نسخه ActivePythonنسخه نسبتاً مناسبتری از این نرم افزار است و
استفاده از آن توصیه میشود .البته از ویرایشگر آباکوس نیز میتوان استفاده کرد که در
شکل زیر طریقه اجرای آن نشان داده شده است.
.4توابع
.5کالس
آشنایی و طرز کار با نرم افزار ABAQUS 266
.6ماژول
رشتهها
رشتهها یکی دیگر از انواع دادهها هستند که با نوشتن بین " " یا ' ' مشخص میشوند.
مثالً " 'job' ، "jobو "_" و '_' و " "1و ' '1همگی رشته هستند .عمل جمع و ضرب برای
رشتهها نیز قابل تعریف است .به عنوان مثال حاصل جمع سه رشته ''jobو'_'و' '1که به
صورت زیر نوشته میشود:
'>>> 'job'+'_'+'1
برابر رشته زیر است:
''job_1
به همین ترتیب ضرب یک رشته در عدد صحیح بهصورت زیر خواهد بود.
>>> 'job'*2
''jobjob
هم رشتهها و هم اعداد را میتوان در یک متغیر با استفاده از ( = ) ذخیره نمود .نام
یک متغیر نمی تواند با عدد شروع شود و به بزرگی یا کوچکی حروف نیز حساس است .به
مثالهای زیر توجه کنید:
>>> a=2.
که aیک متغیر اعشاری است.
>>> b=4
که bیک متغیر صحیح است.
'_>>> c='job
که cیک رشته است .عبارات باال را میتوان با عبارت زیر برابر دانست:
'_>>> a,b,c=2.,4,'job
همچنین بهجای :
>>> a=2
آشنایی و طرز کار با نرم افزار ABAQUS 268
>>> b=2
در برخی موارد یک رشته دارای چند قسمت است که بین قسمتهای مختلف فضای خالی
وجود دارد .قسمتهای مختلف را میتوان توسط دستور splitاز هم مجزا کرد .به مثال
زیر نوجه کنید:
'>>> aa='12 32 1
269 برنامه نویسی در ( ABAQUSپیتون)
)(>>> aa.split
]'['12', '32', '1
در این مثال دستور (متد) )( splitرشته aaرا به قسمتهای مجزا تبدیل کرده و درون
یک داده چند قسمتی به اسم لیست قرار میدهد.
لیست
لیست یک نوع داده چند قسمتی است که بهصورت [ ]elt0, elt1,..., eltn-1مشخص
میشود .به مثالهای زیر توجه کنید:
'>>> a,b,c=1,5,'e
]>>> [1,2,3
][1, 2, 3
]>>> L=[a,b,c
>>> L
]'[1, 5, 'e
در مثال فوق ،لیست Lرا با استفاده از متغیرهای a,b,cمشخص کردهایم .البته با تغییر
متغیرهای a,b,cلیست Lتغییر نخواهد کرد .دستورات زیر را در ادامه دستورات فوق
بنویسید:
>>> a=3
>>> L
]'[1, 5, 'e
به دادههای داخل یک لیست میتوان بهصورت زیر دسترسی پیدا کرد:
]اندیس[>>> L
در پیتون اندیس از صفر آغاز میشود .در شکل زیر طریقه اندیسگذاری در پیتون
نشان داده شده است.
آشنایی و طرز کار با نرم افزار ABAQUS 270
با توجه به شکل فوق مشاهده میشود که دو روند اندیسگذاری وجود دارد .در یک
روند ،داده اول با صفر شروع شده و به ترتیب سایر دادهها اندیسگذاری میشوند .در روند
دوم داده انتها با اندیس -1نشان داده شده و سایر دادهها به ترتیب از انتها با اندیسگذاری
منفی مشخص میشوند .به مثالهای زیر توجه کنید:
]>>> L[0
1
]>>> L[-3
1
]>>> L[-1
''e
]>>> L[2
''e
در واقع در پیتون برای دسترسی به یک داده ،دو راه وجود دارد که در مثالهای باال
نحوه دسترسی به دادههای یک لیست مشخص شده است .میتوان با استفاده از عمل جمع (
) +به دادههای یک لیست افزود .به عبارت دیگر با کمک عالمت جمع میتوان یک
لیست را به یک لیست دیگر اضافه کرد .این موضوع از نظر کاربردی بسیار مهم است .زیرا
به راحتی میتوان اعضای جدیدی به یک لیست افزود .به مثال زیر توجه کنید:
]'>>> ['job_1','job_3']+['job_5
]'['job_1', 'job_3', 'job_5
برای حذف یکی از دادههای درون لیست نیز میتوان از تابع ) ( delاستفاده کرد:
271 برنامه نویسی در ( ABAQUSپیتون)
>>> a
][1, 100, 2
در این مثال متغیر aو bبه یک لیست اشاره دارند و تغییرات یکی بر دیگری نیز اثر
خواهد داشت .برای اینکه aو bدو لیست کامال مجزا باشند باید بجای b=aاز ]b=a[:
استفاده شود .مثال زیر را انجام دهید.
]>>> a=[1,4,2
]>>> b=a[:
>>> b[1]=100
>>> a
][1, 4, 2
تاپل ( ) tuple
تاپل نوعی دیگر از دادهها در پیتون است .این نوع داده در آباکوس استفاده گسترده-
ای دارد .به عنوان مثال جدول تنش – کرنش پالستیک بهصورت یک tupleذخیره می-
شود .دادهها در Tupleدرون ( ) نوشته میشود و با کاما" " ,از یکدیگر جدا میگردند.
به مثال زیر توجه کنید:
>>> data0=1,4
بنابراین data0یک تاپل است .در صورت تایپ این تاپل خواهیم داشت:
>>> data0
)(1, 4
.عمل جمع برای tupleنیز تعریف شده است .در مثال زیر تاپل ) (3,5را به تاپل
data0اضافه میکنیم:
)>>> data=data0+(3,5
>>> data
)(1, 4, 3, 5
273 برنامه نویسی در ( ABAQUSپیتون)
دیکشنری
بر خالف لیستها که مکان یک داده اندیس آن بهشمار میآید ،در دیکشنریها
اندیس داده را نیز باید مشخص کرد .به عبارت دیگر عالوه بر داده ،اندیس داده را نیز باید
مشخص کرد .اندیس که میتواند عدد و یا رشته باشد ،قبل از داده نوشته شده و با عالمت :
از داده مجزا میگردد .به مثال زیر توجه کنید:
}>>> a={2:3,'weight':4,'lenght':10
آشنایی و طرز کار با نرم افزار ABAQUS 274
]>>> a[2
3
]'>>> a['weight
4
پیتون نوعی برنامه نویسی شیئ گراست و دادهها در آن نوعی شیئ هستند .توضیحات
بیشتر در هنگام معرفی کالس ارائه خواهد شد .در این قسمت به معرفی توابع (متد) پر-
کاربرد در دیکشنری میپردازیم .متدها بهصورت زیر فراخوانی میشوند.
نام متد + . +نام دیکشنری
دیکشنری aکه قبالً تعریف شده را در نظر بگیرید .متدهای زیر هنگام برنامه نویسی
در آباکوس بسیار کاربردی هستند.
بعد از دستور ifعبارت شرطی قرار میگیرد .بالفاصله بعد از عبارت شرطی ،عالمت :
مشخص کننده آغاز بدنه ifاست .بدنه ifمجموعه دستوراتی است که میخواهیم در
صورت برقرار بودن شرط ،اجرا گردد .تورفتگی بعد از دستور ، ifمشخص کنندۀ بدنه
است و با حذف تورفتگی ،می توان انتهای بدنه را مشخص کرد .در پیتون دستور endif
وجود ندارد و از حذف تورفتگی برای مشخص کردن انتهای بدنه استفاده میشود .به مثال
زیر توجه کنید:
'L='job
if i < 10:
)L=L+str(i
print L
' print ' end
در این مثال در صورتی که شرط بعد از ) i < 10 ( ifبرقرار باشد ،دو خط بعد از if
اجرا میشود.
آشنایی و طرز کار با نرم افزار ABAQUS 276
در این دستور همانند دستور ، ifبعد از دستور whileشرط حلقه قرار میگیرد.
بالفاصله بعد از عبارت شرطی ،عالمت :مشخص کننده آغاز بدنه whileاست .ایجاد
تورفتگی در برنامه مشخص کننده بدنه است و حذف تو رفتگی معادل دستور endدر سایر
برنامه نویسیها است .به مثال زیر توجه کنید:
x=1
while x < 1000 :
x = x*x+3
277 برنامه نویسی در ( ABAQUSپیتون)
در این مثال با توجه به اینکه مقدار xدر ابتدا برابر یک است ،شرط حلقه ارضاء شده
و دستورات بدنه (x = x*x+3) whileاجرا میگردد .اجرای این حلقه تا زمانی که مقدار
xکمتر از 1000است ادامه خواهد یافت.
دستور : for
طرح کلی این دستور به شکل زیر است:
دستور forبرای انجام عملیاتهای تکراری استفاده میشود .در این دستور بعد از
کلمه forنام متغیر حلقه نوشته میشود .سپس کلمه کلیدی inنوشته شده و در انتها یک
لیست شامل دادههایی که متغیر به خود اختصاص میدهد نوشته میشود .مشابه سایر
دستورات کنترلکننده روند برنامه ،آغاز بدنه این دستور با :و تورفتگی مشخص میشود.
متغیر بکار رفته در این دستور هر یک از مقادیر لیست مشخص شده را به خود اختصاص
میدهد و به ازای هر مقدار اختصاص یافته یک بار حلقه اجرا میگردد .به مثال زیر توجه
کنید:
]'L=['job_1','job_2','job_3','job_4
for v in L:
print v
در این مثال متغیر vبه ترتیب عناصر لیست Lرا به خود اختصاص میدهد .عالمت :
نشان دهنده آغاز بدنه است .در این مثال بدنه forتنها شامل دستور printاست که مقادیر v
را چاپ میکند.
میتوان از تابع )( rangeبرای ایجاد لیست اعداد صحیح استفاده نمود .به مثال زیر
توجه کنید:
آشنایی و طرز کار با نرم افزار ABAQUS 278
for i in range(1,5,1):
)v='job_'+str(i
print v
در این مثال تابع ) ( rangeلیستی از مقادیر یک تا چهار را تولید میکند .متغیر iتک-
تک مقادیر لیست را به خود اختصاص داده که این مقادیر در بدنه حلقه بهصورت رشته
درآمده و با رشته '_ 'jobجمع میشوند .نهایتاً رشتههای تولید شده چاپ خواهند شد.
از تابع breakمیتوان برای قطع حلقه و خروج از حلقه در دستورات فوق استفاده
کرد .دستور continueنیز یکی از دستورات پرکاربرد در پیتون است .با اجرای این دستور،
ادامه دستورات حلقه قطع و اجرای برنامه به شرط حلقه باز میگردد .این دستور تنها برای
حلقههای مشروط ( ifو ) whileکاربرد دارد.
تابع:
احتماال با مفهوم تابع در سایر زبانهای برنامهنویسی تاکنون آشنا شدهاید .در بخش-
های قبل توابعی همچون )( intو )( strمعرفی شدهاند .در پیتون نیز مانند سایر زبانهای
برنامه نویسی میتوان توابع جدیدی ساخت .ساختار کلی تابع بهصورت زیر است:
defکلمهای است که تابع را معرفی میکند .بعد از defنام تابع قرار میگیرد.
ورودیهای تابع بین )( بوده و با عالمت کاما ( ) ,از هم جدا میشوند .ورودیها میتواند
به صورت عدد ،رشته و یا لیست باشند .در صورتی که ورودی یک متغیر تاپل باشد ،قبل از
متغیر * قرار میگیرد .البته باید توجه داشت که بین دادهها در تاپل عالمت ,قرار دارد.
279 برنامه نویسی در ( ABAQUSپیتون)
بنابراین در صورت استفاده از تاپل ،استفاده از انواع دیگر متغیرها امکانپذیر نیست .برای
مشخصکردن ورودی دیکشنری ،باید قبل از متغیر ،عالمت ** قرار داده شود .بعد از
مشخص شدن نام تابع و ورودیهای آن ،عالمت :مشخص کننده آغاز تابع است .مجموعه
دستورات مربوط به یک تابع با ایجاد تورفتگی مشخص میشوند .در پایان یک تابع ،در
صورت نیاز میتوان با دستور returnخروجی دلخواه را در نام تابع ذخیره کرد .نوع
خروجی میتواند عدد ،رشته ،تاپل ،لیست و یا دیکشنری باشد .به مثال زیرتوجه کنید:
def speed_w(*m):
]ro=m[0
]E=m[1
]v=m[2
(c=math.sqrt(E/ro
return c
در این مثال تاپل mورودی است .بعد از نوشته شدن تابع فوق در برنامه اصلی ،می-
توان تابع را فراخوانی کرد .به ادامه مثال توجه کنید:
import math
)a=speed_w(1,1000,0.3
print a
در خط اول ،ماژول mathفراخوانی شده تا در تابع speed_wمورد استفاده قرار
گیرد .خط دوم با دادن مقادیر مورد نیاز تابع ،آن را فراخوانی کرده و در انتها مقدار تابع
چاپ خواهد شد .هنگامی که یک تابع فراخوانی میشود ،متغیرهای استفاده شده در آن
تابع تنها در محدوده آن تابع قابل استفادهاند مگر آنکه بهصورت globalتعریف شوند.
برای تعریف یک متغیر بهصورت globalدستور زیر باید نوشته شود:
نام متغیر global
آشنایی و طرز کار با نرم افزار ABAQUS 280
در صورتی که با کمک عالمت تساوی ( = ) تابع به یک متغیر نسبت داده شود ،از
متغیر میتوان مانند تابع اصلی استفاده کرد .به مثال زیر به عنوان ادامه مثال قبل توجه کنید:
f=speed_w
)b=f(1,1000,0.3
print b
برخالف فراخوانی تابع ،در این حالت جلوی تابع عالمت پرانتز وجود ندارد .با اجرای
دستور فوق نام fمیتواند مانند نام speed_wتابع speed_wرا فراخوانی کند.
ماژول:
ماژولها کدهایی هستند که مستقیماً در برنامه اصلی نوشته نشدهاند .این کدها ممکن
است با زبان پیتون یا سایر زبان های برنامه نویسی نوشته شده باشند .معموال هر ماژول شامل
مجموعه توابعی است که از یک خانوادهاند .به عنوان مثال ماژول mathماژولی است که
مجموعه توابع ریاضی را دربر دارد .کدهایی با پسوند .dll ,.pyd ,.pyo ,.pyدر پیتون
شناخته شدهاند.
هنگامی که بخواهیم از یک ماژول خاص در برنامه استفاده کنیم ،ابتدا باید برای
برنامه اصلی مشخص کنیم که قصد استفاده از آن ماژول را داریم .این کار با دستور
importانجام میگیرد .شکل کلی این دستور بهصورت زیر است:
بعد وارد کردن یک ماژول در برنامه اصلی میتوان از توابع داخل آن بهصورت زیر
استفاده کرد:
3.1415926535897931
)>>> math.sin(0
0.0
با دستور زیر میتوان به توابع داخل ماژول بهصورت مستقیم دسترسی پیدا کرد:
نام ماژول from import *
در این حالت هنگام استفاده از توابع ماژول ،نیازی به تکرار نام ماژول نیست .به مثال
زیر توجه کنید:
* >>> from math import
>>> pi
3.1415926535897931
)>>> sin(0
0.0
اگر بخواهیم تنها یک تابع را از یک ماژول فراخوانی کنیم ،از فرم زیر استفاده می-
کنیم:
نام ماژول from نام تابع import
در برنامهنویسی ممکن است به ماژولهای جدیدی نیاز داشته باشیم .برای ساختن یک
ماژول جدید کافی است توابع مورد نظر را در ساختاری مانند شکل زیر نوشت و در یک
فایل با نام ماژول مورد نظر ذخیره نمود.
آشنایی و طرز کار با نرم افزار ABAQUS 282
برای آنکه بتوان ماژولهای جدید نوشته شده را فراخوانی کرد ،باید آدرس آن را
برای پیتون مشخص کرد .برای این منظور ابتدا باید ماژول sysرا فراخوانی کنیم.
>>> import sys
دستور زیر مسیرهای تعریف شده را نشان میدهد:
>>> sys.path
و با دستور زیر میتوان مسیر جدید را به مسیرهای قبل اضافه کرد:
) ' مسیر جدید ' ( >>> sys.path.append
با دستور dirمیتوان توابع داخل یک ماژول را دید .فرم کلی دستور در زیر آمده-
است:
) نام ماژول ( dir
283 برنامه نویسی در ( ABAQUSپیتون)
بعد از باز شدن فایل ،توابع زیر برای خواندن اطالعات استفاده میشوند .در جدول
زیر منظور از متغیر ،نام متغیری است که هنگام باز کردن فایل دستور )( openرا به آن
نسبت دادیم..
)(. closeمتغیر
کالس:
برنامه پیتون یک برنامه شییگراست و برنامه آباکوس از این خاصیت بهره بسیاری
برده است .در این بخش مفاهیم کالس و شیئ بطور مختصر معرفی میشود .1اگر چه در
عمل از کالس به ندرت در برنامه نویسیهای مربوط به آباکوس استفاده میشود با این
وجود انتظار میرود که خواننده با مطالعه این فصل بتواند درک بهتری از دستورات
آباکوس و پیتون بدست آورد.
1
عالقه مندان میتوانند برای اطالعات بیشتر به کتابهای برنامه نویسی به زبان پیتون مراجه کنند.
285 برنامه نویسی در ( ABAQUSپیتون)
متدها توابعی هستند که عملیاتی را روی شیئ انجام میدهند .بنابراین خود شیئ همیشه
یکی از ورودیهای متد است و به طور قراردادی با کلمه selfنشان داده میشود .مثالهای
پیش رو نحوه عملکرد کالس را بیشتر روشن میکند.
مثال - 1کالس زیر مشخصکننده کالس مستطیل است که ابعاد آن (بهعنوان خواص
کالس) بطور پیش فرض 11انتخاب شده است.
>>> class rectangle:
... lenght=1
... width=1
2
متدها توابعی هستند که درون کالس تعریف میشوند.
آشنایی و طرز کار با نرم افزار ABAQUS 286
...
>>>
با نوشتن عبارت زیر ،شیئ aاز کالس rectangleساخته میشود.
)(>>> a=rectangle
و برای مشاهده دادههای این کالس و یا تغییر آن بهصورت زیر میتوان عمل کرد.
>>> a.lenght
1
>>> a.width
1
>>> a.lenght=4
>>> a.lenght
4
>>>
که در خط پنجم مقدار lengthبه مقدار 4تغییر مییابد.
متغیر aدر دستورات فوق یک شیء که قالب کالس rectangleبه آن داده شده
است .می توان تعداد زیادی شیئ با استفاده از یک کالس ساخت .این اشیاء از یکدیگر
مستقل بوده و تغییر یکی بر دیگری اثر نمیگذارد.
مثال -2کالس تعریف شده درزیر عالوه بر داده (خواص کالس) ،دارای دو متد
است.
>>> class rectangle:
... lenght=1
... width=1
... def area(self):
... A=self.lenght*self.width
287 برنامه نویسی در ( ABAQUSپیتون)
مقدمهای که از زبان برنامهنویسی پیتون ارائه شد ،اگرچه کامل نیست با این وجود
انتظار میرود که تمام نیازهای کاربران آباکوس را برآورده سازد .در ادامه به بررسی
اشیائی میپردازیم که به طور اختصاصی در برنامه آباکوس مورد استفاده قرار میگیرند.
ساختار این اشیاء در آباکوس با آنچه تاکنون در برنامهنویسی پیتون مشاهده شد ،کمی
متفاوت است .این اشیاء شباهتهایی با دیکشنری دارند و البته برخی از متدهای معرفی
شده در دیکشنری در اینجا نیز قابل استفاده است .همانگونه که گفته شد اشیاء آباکوس به-
صورت طبقاتی و سلسله وار است .به این معنی که برای اجرای هر دستور و یا دسترسی به
دادهها ،باید مسیر آن نوشته شود .بعد از نوشتن هر سر شاخه ،با گذاشتن یک نقطه وارد زیر
شاخه می شویم .با توجه به گسترده بودن این اشیاء ،امکان توضیح کامل آن در این کتاب
مقدور نیست .بنابراین تنها به نکات مهم و کاربردی اشاره خواهد شد تا کاربر با سرعت
بیشتری بتواند از برنامه نویسی پیتون در آباکوس بهره ببرد .در این فصل به بررسی دو شیئ
)( Mdbو)( Odbخواهیم پرداخت.
همانگونه که در دستورات فوق مشاهده میکنید ،بعد از ( mdb.که همان شیء مربوط
به مدل است) زیر شاخه modelsنوشته شده است .این زیر شاخه خود یک شیء چند
قسمتی است که در براکت مقابل آن بخش مربوطه نوشته شده است (
]' .) models['Model-1الزم به یادآوری است که میتوان در آباکوس به طور
همزمان چند مدل مختلف ساخت.
در آباکوس معموالً مفهوم دستورات مشخص بوده و نیازی به helpآباکوس وجود
ندارد .به عنوان مثال دستور زیر :
))s.rectangle(point1=(0.0, 0.0), point2=(20.0, 20.0
نشان دهنده مستطیلی است که مختصات نقاط روی قطر آن داده شده است .میتوان
این مختصات را بهصورت دلخواه تغییر داد .در انتهای دستورات مربوط به ساخت یک
قطعه همیشه دستور زیر وجود دارد:
]'__del mdb.models['Model-1'].sketches['__profile
برای نوشتن یک اسکریپت مناسب ،کافی است که اسکریپت بدست آمده از فایل
ABAQUS.rpyرا در فایل جدیدی کپی کرده و خطوط اضافی آن را (خطوطی که با #
یا sessionآغاز میشوند) حذف کنید .پیتون بدست آمده در زیر نشان داده شده است.
* from abaqus import
* from abaqusConstants import
* from caeModules import
from driverUtils import executeOnCaeStartup
)(executeOnCaeStartup
)(Mdb
=s = mdb.models['Model-1'].ConstrainedSketch(name
)'__profile__', sheetSize=200.0
g,v,d,c=s.geometry,s.vertices,s.dimensions,s.constraints
)s.setPrimaryObject(option=STANDALONE
))s.rectangle(point1=(0.0, 0.0), point2=(20.0, 20.0
آشنایی و طرز کار با نرم افزار ABAQUS 294
p = mdb.models['Model-1'].Part(name='Part-1',
)dimensionality=THREE_D, type=DEFORMABLE_BODY
]'p = mdb.models['Model-1'].parts['Part-1
)p.BaseSolidExtrude(sketch=s, depth=25.0
)(s.unsetPrimaryObject
]'p = mdb.models['Model-1'].parts['Part-1
]'__del mdb.models['Model-1'].sketches['__profile
میتوان این اسکریپ را از طریق آدرس زیر در آباکوس اجرا کرد:
file→ run script
این دستورات از طریق kernel commandنیز قابل اجرا است .برای باز شدن این
که در قسمت پایینی پنجره آباکوس قرار دارد کلیک کنید. پنجره بر دکمه
'Section-1', material='Material-1',
thickness=None)
p = mdb.models['Model-1'].parts['Part-1']
c = p.cells
cells = c.getSequenceFromMask(mask=('[#7 ]', ), )
region = regionToolset.Region(cells=cells)
p = mdb.models['Model-1'].parts['Part-1']
p.SectionAssignment(region=region, sectionName=
'Section-1', offset=0.0, offsetType=
MIDDLE_SURFACE, offsetField='')
.دسته اول این دستورات مربوط به مشخص کردن ماده میباشد
mdb.models['Model-1'].Material(name='Material-1')
mdb.models['Model-1'].materials[
'Material-1'].Density(table=((7800.0, ), ))
mdb.models['Model-1'].materials[
'Material-1'].Elastic(table=
((200000000000.0, 0.3), ))
سپس در.در خط اول مشاهده میشود که در بین پرانتز نام ماده مشخص شده است
در صورتی که بخواهید خواص ماده را با.سطور بعدی خواص مربوط به ماده آمده است
دقت کنید که خواص ماده بهصورت تاپل آورده شده،الگوریتم مشخصی تعیین کنید
.است
: استsection دسته دوم دستورات مربوط به تعریف
mdb.models['Model-1'].HomogeneousSolidSection(name=
'Section-1', material='Material-1',thickness=None)
.که معموالً در اسکریپت نویسی بدون تغیر باقی خواهد ماند
آشنایی و طرز کار با نرم افزار ABAQUS 296
اجراهای متوالی
در بسیاری از موارد تکرار حل اجتناب ناپذیر است .به عنوان مثال در یک الگوریتم
بهینه سازی بعد از هر اجرا با توجه به نتایج بدست آمده باید نسبت به اصالح مدل و اجرای
مجّدد اقدام نمود .در ساده ترین حالت ممکن است بخواهیم مدلی را با انجام تغییراتی روی
آشنایی و طرز کار با نرم افزار ABAQUS 298
آن بطور متوالی اجرا کنیم .باید توجه داشت که دستورات در آباکوس خط به خط و به
ترتیب اجرا نمیگردد و اجرا بهصورت سینکرون است .به عبارت دیگر در صورت زمانبر
بودن یک دستور ،برنامه پیتون به خط بعد رفته و دستور بعدی را همزمان اجرا میکند.
بنابراین در صورتی که در یک حلقه دستور submitاستفاده شده باشد ،با توجه به زمانبر
بودن هر اجرا ،بعد از هر submitبرنامه ادامه یافته و مجدداً دستور submitاجرا میشود.
بنابراین تعداد زیادی اجرا بهصورت همزمان انجام خواهد گرفت .در حالتی که ادامه
الگوریتم نیاز به نتایج حل داشته باشد ،به دلیل عدم اجرای مرحله قبل ،حل متوقف خواهد
شد .به منظور حل این مشکل باید از دستور زیر بعد از دستور submitاستفاده کرد:
mdb.jobs[' job )( '].waitForCompletionنام
با اجرای این دستور ،برنامه تا اتمام اجرای jobمنتظر میماند و بعد از اتمام آن ،برنامه
ادامه مییابد .به عنوان مثال فرض کنید که میخواهیم یک مدل را با amplitudeهای
مختلف بارگذاری کنیم .میتوان با انجام مراحل زیر -که در این مثال انجام آن بر عهده
خواننده گذاشته شده است -به این هدف دست یافت:
مدل مربوطه را ساخته و پس از مشبندی ذخیره میکنیم .در این مثال نام مدل
submitمیکنیم .به این ترتیب دستورات مورد نیاز بدست خواهد آمد.
خطوط اضافی را پاک کرده و مجموعه دستورات را در درون یک حلقه میگذاریم.
سپس مقدار amplitudeرا بهصورت پارامتری مشخص میکنیم .در انتها از متد
)( waitForCompletionاستفاده میکنیم.
اسکریپت زیر بدست خواهد آمد.
openMdb(pathName='C:/book/book.cae')
mdb.models['Model-1'].amplitudes['Amp-1'].setValues(
timeSpan=STEP, data=((0.0,0.0), (1.0, num)))
mdb.Job(name='test_'+str(num), model='Model-1',
type=ANALYSIS,explicitPrecision=SINGLE,
nodalOutputPrecision=SINGLE, description='',
parallelizationMethodExplicit=DOMAIN,
multiprocessingMode=DEFAULT,numDomains=1,
userSubroutine='', numCpus=1, memory=50,
memoryUnits=PERCENTAGE, scratch='',
echoPrint=OFF, modelPrint=OFF,contactPrint=OFF,
historyPrint=OFF)
mdb.jobs['test_'+str(num)].submit(
consistencyChecking=OFF)
mdb.jobs['test_'+str(num)].waitForCompletion()
num باز شده و سپس مقدار متغیرbook.cae فایل،در این مثال در هر اجرای حلقه
از، به منظور پرهیز از پاک شدن اجرای قبل. بارگذاری قرار میگیردamplitude در
به رشته تبدیلstr() این شمارنده با استفاده از دستور. استفاده شده استnum شمارنده
بنابراین فایلهای خروجی دارای نامهای مختلفی.' اضافه میگرددtest_' شده و به رشتۀ
مانع از ادامه برنامه بدون تکمیل، waitForCompletion در انتها دستور.خواهند بود
.اجرای قبل خواهد شد
(' ……..','………………..'),
(' ……..','………………..')),
)'نام پنجره'',توضیحات'
همانگونه که در دستور اول نشان داده شده است ،آنچه قبل از \tنوشته شود (متغیر)
در پنجره باز شده نوشته میشود و رشته بعد از \tبه محض قرار دادن نشانگر موس زیر
نوشته اصلی ظاهر میشود .مقدار ورودی داده شده توسط پنجره باز شده ،بهصورت رشته
در a1ذخیره میگردد .میتوان در صورت لزوم این مقدار را توسط توابع )( intو یا
)( floatبه مقدار عددی تبدیل کرد.
دستور دوم سه آرگومان میپذیرد .آرگومان اول یک تاپل است که خود از تاپلهای
دوتایی تشکیل یافته است .عضو اول تاپلهای دوتایی عنوان متغیری است که در پنجره نشان
داده میشود و عضو دوم مقدار پیش فرض آن متغیر است .شکل فوق به طور دقیق این
موضوع را نشان میدهد .آرگومانهای دوم و سوم رشته هستند که مطابق شکل قبل
301 برنامه نویسی در ( ABAQUSپیتون)
توضیحات و نام پنجره در آن مشخص میشود .خروجی این دستور ( ) a2یک لیست
خواهد بود که اعضاء آن رشته هستند .در صورت تغییر نکردن پیشفرضها ،خود پیش-
فرضها در لیست خروجی قرار میگیرند .مشابه حالت قبل میتوان در صورت لزوم مقادیر
لیست را توسط توابع )( intو یا )( floatبه مقادیر عددی تبدیل کرد.
در صورت نیاز به یک واسط گرافیکی مناسبتر در صفحه CAEآباکوس ،از طریق
مسیر
Plug-ins → Abaqus → RSG Dialog Builder
برنامه طراحی واسط گرافیکی را اجرا کنید .در این برنامه میتوان به راحتی واسط
گرافیکی دلخواه را ایجاد نمود .جهت یادگیری طریقه ساخت صفحات واسط گرافیکی در
کلیک کنید. این قسمت ،بر گزینه
قسمت ذخیره میشود .این اطالعات بهصورت درختی و سلسلهوار ذخیره میشوند .شکل
4-18این دو دسته اطالعات را نشان میدهد:
با توجه به شکل 4-18مشاهده میشود که در الیه اول شیئ odbاشیایی چون
rootAssembly, parts, …, stepsوجود دارد .معموالً نام اشیاء مشخص کننده عملکرد
آنها است .به عنوان مثال شیئ stepsو زیرمجموعههای آن ،شامل اطالعات و فعالیتهای
مربوط به نتایج یک stepخاص است که نام آن stepدر براکتی مقابل شیئ stepsنوشته
میشود .البته شیء مشابه دیگری با نام Stepنیز وجود دارد که مربوط به اضافه کردن یک
stepبه شیئ odbاست و اطالعات stepدرون پرانتز مقابل این شیئ نوشته میشود.
همانگونه که قبالً هم اشاره شد هدف این کتاب بررسی این گونه اشیاء نخواهد بود .در
ادامه این بخش دید کاملتری نسبت به شیئ odbپیدا خواهید نمود.
303 برنامه نویسی در ( ABAQUSپیتون)
برای دسترسی به شیئ odbابتدا باید ماژول مربوط به دسترسی به شیء odbفراخوانده
شود .با نوشتن دستور زیر در ابتدای اسکریپت ،ماژول مذکور فراخوانی میشود.
* from odbAccess import
در برخی موارد ماژولهای زیر نیز باید فراخوانی شوند .در مجموعه فعالیتهای مورد
نظر این کتاب ،نیازی به فراخوانی این ماژولها نیست.
* from abaqusConstants import
* from odbMaterial import
* from odbSection import
پس از فراخوانی ماژول odbAccessمیتوان فایل odbرا باز نمود .دستور openOdb
برای باز کردن فایل مورد استفاده قرار میگیرد.
)'p1=openOdb('C:\ book\Job-1.odb
در دستور فوق فایل نتایج از مسیر مورد نظر باز شده و با توجه به ویژگی شیئگرایی
در پیتون ،یک شیئ با نام p1از روی آن ساخته میشود .در آباکوس ،اشیایی چون odb
ساختاری الیه گونه دارند و برای دسترسی به اطالعات درونی باید مسیر آن را مشخص
کرد .برای این منظور ،بعد از باز کردن فایل مربوطه ،از مسیرهای نشان داده در شکل 4-18
برای دسترسی به اطالعات مورد نظر استفاده میشود .به عنوان مثال برای دسترسی به مقادیر
تنش ،باید مسیر زیر نوشته شود:
[S11=openOdb('C:\ book\Job-1.odb').steps
['Step-1'].frames[-1].fieldOutputs['S'].values
]10].data[0
البته میتوان این مسیر را بهصورت مرحله به مرحله نیز طی کرد:
)'p1=openOdb('C:\ book\Job-1.odb
]p2=p1.steps['Step-1'].frames[-1
]p3=p2.fieldOutputs['S'].values[10
]S11=p3.data[0
آشنایی و طرز کار با نرم افزار ABAQUS 304
همانگونه که گفته شد ،اطالعات در شیئ odbبهصورت الیه به الیه ذخیره میگردد.
برای رفتن از یک الیه به الیه دیگر از نقطه ( ) .استفاده میشود .مثالً در خط دوم مثال
باال بعد از الیه ، stepsعالمت ( ) .را قرار داده و به الیه مربوط به اطالعات framesوارد
میشویم .درون براکت مقابل ،stepsنام stepمورد نظر نوشته میشود .به همین ترتیب
درون براکت مقابل ،framesشماره frameمربوطه باید نوشته شود ( توجه داشته باشید که
در واسط گرافیکی آباکوس و در step modulتعداد framهایی که اطالعات باید در آنها
ذخیره شود را مشخص کردهایم .).با نوشتن -1نشان دادهایم که اطالعات مربوط به frame
آخر فراخوانده شود(مشابه لیست) .در خط سوم مثال فوق یازدهمین مقدار ذخیره شده در
میدان تنش را ( که با 10نشان داده شده است) در p3ذخیره کردهایم .این مقدار شامل همه
تنشهای موجود در المان 11است .در این رابطه p3یک لیست است که داده اول این
لیست S11است.
برای استفاده از اطالعات شیئ odbالزم است که از مسیر و نحوه ذخیره اطالعات در
این شیئ آشنایی کافی داشته باشید .همچنین استفاده از متدهایی که در بخش دیکشنری
گفتهشد ،میتواند در بسیاری موارد راهگشا باشد .عالوه بر این در صورت استفاده از
،kernel commandمیتوان جهت تکمیل مسیر و راهنمایی ،از کلید Tabاستفاده کرد .در
قسمتهای بعد به بررسی چند مثال مهم پرداخته خواهد شد.
)(>>> p1.steps.keys
]'['Step-1
از متد itemsنیز میتوان در این موارد استفاده کرد:
)(>>> p1.steps.items
[[('Step-1', openOdb(r'c:\book\job-1.odb').steps
])]''Step-1
برای دسترسی به اطالعات شیء ،stepsباید به شاخه بعدی framesرفت .در این
شیء شماره فریم مورد نظر باید در براکت مقابل آن نوشته شود که عدد -1نشان دهنده
آخرین فریم است .بعد از شیئ framesبرای دسترسی به اطالعات میدان باید وارد زیر
شاخه fieldOutputsشد .میدان تنش ،کرنش ،جابجایی و ...اطالعاتی است که در این
زیرشاخه وجود دارد .برای اطالع از نام این میدانها میتوان از متد .keysاستفاده نمود.
مثال زیر را انجام دهید:
)(p1.steps['Step-1'].frames[-1].fieldOutputs.keys
همانگونه که گفته شد شیئ fieldOutputsحاوی مقادیر میدانی است .با این وجود،
استفاده از آن مستلزم ذکر نکاتی است که در بخش بعدی بیان خواهد شد.
)'p1=openOdb('c:\book\job-1.odb
[p1.steps['Step-1'].frames[-1].fieldOutputs
]'S'].values[i
در این مسیر ،مقادیر میدان ،شماره المان ،شماره نقطه انتگرالگیری و همچنین نام
نمونهای( ) instanceکه المان بر آن قرار دارد موجود است .قبل از بررسی طریقه دستیابی
به این مقادیر ،کمی توضیح در مورد مسیر فوق اجتناب ناپذیر است.
حرف Sدر براکت مقابل ، fieldoutputsنشان دهنده میدان تنش است .در صورت
نیاز به سایر متغیرهای میدان ،کافی است حروف نشان دهنده آن میدان نوشته شود .ساده-
ترین راه برای یافتن حروف نماینده میدان ،استفاده از واسط گرافیکی ( ماژول
visualizationو قسمت ) field outputاست .در انتها عبارت ] values[iامکان
دسترسی به اطالعات مربوط به مقادیر میدان را فراهم میسازد .بعد از معرفی چند متد مهم،
در مورد مقدار iدر ] values[iتوضیحات الزم ارائه خواهد شد.
در صورت نیاز به مقادیر این میدان باید از متد dataبهصورت زیر استفاده شود:
[p1.steps['Step-1'].frames[-1].fieldOutputs['S'].values
i].data
و به همین ترتیب برای دستیابی به شماره المان میتوان از متد elementLabelاستفاده
کرد:
[p1.steps['Step-1'].frames[-1].fieldOutputs
'S'].values[i].elementLabel
متد integrationPointو instance.nameبرای بدست آوردن شماره نقطه انتگرال-
گیری و نام نمونه ( ) instanceمربوطه بکار میرود.
[p1.steps['Step-1'].frames[-1].fieldOutputs
'S'].values[i].integrationPoint
[p1.steps['Step-1'].frames[-1].fieldOutputs
'S'].values[i].instance.name
307 برنامه نویسی در ( ABAQUSپیتون)
مقدار iدر دستورات فوق بر اساس شماره المان و شماره نقطه انتگرالگیری است.
به عنوان مثال i = 0مربوط به نقطه اول انتگرالگیری المان اول است و ،i=1در صورتی که
المان اول بیش از یک نقطه انتگرالگیری داشته باشد ،مربوط به نقطه دوم انتگرالگیری
است .در صورت وجود چند instanceشمارهگذاری بهصورت متوالی ادامه مییابد .به
عنوان مثال یک مدل با دو instanceبا نامهای PART-1-1و PART-2-1را در نظر
بگیرید (شکل .)5-18
مشخص کردن میدان ذخیره شده در نودها و یافتن مکان اولیه نود
مشابه مثال قبل ،میتوان به میدان ذخیره شده در نودها نیز دسترسی داشت .میدانهایی
مانند جابجایی ،سرعت و یا دوران ،میدانهایی هستند که در نودها ذخیره شدهاند .مسیر
زیر مقدار میدان سرعت در نود i+1ام در آخرین فریم را نشان میدهد:
* from odbAccess import
)'p1=openOdb('c:\book\job-1.odb
]p2=p1.steps['Step-1'].frames[-1
p3=p2.fieldOutputs['V'].values[i].data
در صورتی که بخواهیم مکان اولیه این نود را بیابیم ،ابتدا باید از مسیر زیر شماره نود
و نام instanceرا نیز بیابیم.
k=p2.fieldOutputs['V'].values[i].nodeLabel
name=p2.fieldOutputs['V'].values[i].instance.name
حاصل خط اول شماره نود و خط دوم نام instanceوابسته به مقدار iام است .با
مشخص شدن این مقادیر ،از طریق ( model dataشکل )4-18و مسیر زیر ،مختصات اولیه
نود قابل دسترسی است .باید توجه داشت که شماره نود بدست آمده از دستور باال ،از یک
شروع شده در صورتی که در پیتون مقادیر از صفر شروع میگردند .بنابراین در دستورات
زیر بجای مقدار ،kمقدار k-1قرار داده میشود.
[p4=p1.rootAssembly.instances[name].nodes
k-1].coordinates
)'p1=openOdb('c:\book\job-1.odb
p1.steps['Step-1'].frames[i].frequency
p1.steps['Step-1'].frames[i].mode
که' 'Step-1نام stepای است که در آن تحلیل فرکانس طبیعی انتخاب شده است.
مسیر زیر نیز دسترسی به مقادیر بار بحرانی را امکانپذیر میسازد:
p1.steps['Step-1'].frames[i].description
باید توجه داشت که دستور فوق یک رشته ارائه میدهد که میتوان با استفاده از
دستورات گفته شده در بخشهای قبل ،مقدار عددی آن را نیز استخراج کرد.
اجرا کردن اسکریپ آباکوس در ایر نرم افزارهای برنامه نویسی (متلب و
فرترن)
در بسیار ی از موارد ،حل اجزاء محدود تنها یک قسمت از انجام یک پروژه صنعتی
است .در واقع حل اجزاء محدود یک حلقه از زنجیره طراحی و یا تحلیل است .در این
موارد نیاز داریم که اسکریپت نوشته شده در آباکوس در یک برنامه خارجی بهصورت
یک تابع مورد استفاده قرار گیرد .مطالب این قسمت کمک میکند که خواننده بتواند در
چنین مواردی مشکل خود را بر طرف کند.
هنگامی که بر آیکون shortcutآباکوس کلیک میکنید ،عمالً abq681.batرا که
در پوشه commandsقرار دارد اجرا کردهاید .شما میتوانید اجرای آباکوس را از طریق
Command Promptو یا Abaqus Commandنیز انجام دهید .به عنوان مثال میتوانید با
رفتن به پوشه commandsو نوشتن ،abaqus caeنرم افزار آباکوس را اجرا کنید .به عنوان
مثال دستور زیر با شرط صحت مسیر نصب آباکوس ،نرم افزار آباکوس را اجرا میکند:
C:\SIMULIA\Abaqus\Commands\abaqus cae
در زبانهای برنامه نویسی نیز میتوان با نوشت عبارت باال ،نرم افزار آباکوس را اجرا
کرد .در نرم افزار متلب این عمل با نوشتن عبارت عالمت ! انجام میگیرد بنابراین اگر در
نرم افزار متلب دستور زیر نوشته شود ،آباکوس اجرا خواهد شد.
! C:\SIMULIA\Abaqus\Commands\ abaqus cae
311 برنامه نویسی در ( ABAQUSپیتون)
به همین ترتیب در زبان فرترن نیز میتوان بهصورت زیر عمل کرد:
=a=system("C:\SIMULIA\Abaqus\Commands\ abaqus cae script
به این ترتیب فایل پیتون در آباکوس از طریق فرترن و یا متلب قابل اجرا خواهد بود.
بعد از اجرا شدن فایل پیتون در آباکوس ،تا زمانی که برنامه آباکوس باز باشد ،اجرای
برنامه مت لب و یا فرترن ادامه نخواهد یافت .برای ادامه یافتن برنامه ،باید در انتهای برنامه
پیتون ،دستور بسته شدن آباکوس(یا پیتون) نوشته شده باشد .با توجه به اینکه دستور بسته
شدن پیتون در ماژول sysوجود دارد ،بنابراین برای بستن آباکوس دستورات زیر نوشته
میشود:
import sys
)(sys.exit
الزم به ذکر است که نوشتن این دستور بالفاصله بعد از دستور submitباعث عدم
تکمیل اجرای برنامه آباکوس خواهد شد .به منظور پرهیز از این مشکل باید از دستور زیر
بعد از دستور submitاستفاده کرد:
mdb.jobs[' job )( '].waitForCompletionنام
آشنایی و طرز کار با نرم افزار ABAQUS 312
به این ترتیب میتوان از طریق زبان برنامه نویسی متلب (و یا فرترن) ،یک پیتون
مشخص را اجراکرد .عالوه بر این با ذخیره کردن اطالعات در یک فایل نوشتاری در زبان
برنامه نویسی متلب (و یا فرترن) و باز کردن آن در پیتون و بالعکس ،میتوان بین دو زبان
برنامه نویسی پل ارتباطی ایجاد کرد.