0% found this document useful (0 votes)
99 views50 pages

Abaqus - Rpy Abaqus - Rpy

جزوه اباکوس پی دی اف

Uploaded by

Mohmah
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
99 views50 pages

Abaqus - Rpy Abaqus - Rpy

جزوه اباکوس پی دی اف

Uploaded by

Mohmah
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

‫فصل هجدهم‬

‫برنامه نویسی در آباکوس ( پیتون)‬

‫مقدمه‪:‬‬
‫تمام فعالیتهایی که در واسطه گرافیکی آباکوس انجام میگیرد‪ ،‬بهصورت‬
‫دستوراتی در فایلی با نام ‪ abaqus.rpy‬ذخیره میگردد‪ .‬با هر بار اجرای آباکوس‪ ،‬به پسوند‬
‫فایل ذخیره شده قبلی یک عدد اضافه شده و مجدداً دستورات جدید در فایل ‪abaqus.rpy‬‬
‫ذخیره میگردد‪.‬‬
‫از طرف دیگر میتوان تمام دستورات واسط گرافیکی را بهصورت توابع و دستوراتی‬
‫در فایلی با پسوند ‪ *.py‬نوشت و سپس فایل آماده شده را در آباکوس اجرا کرد‪ .‬قواعد‬
‫حاکم بر نگارش این دستورات از زبان برنامه نویسی پیتون(‪ )Python‬تبعیت میکند و‬
‫عالوه بر توابع اختصاصی آباکوس‪ ،‬دستورات پیتون نیز توسط آباکوس شناخته شده است‪.‬‬
‫به عبارت دیگر حلقههای تکرار وشرطی و کلیه توابع پیتون را میتوان در آباکوس اجرا‬
‫کرد‪ .‬به این ترتیب مدلسازی اجسامی که از الگوریتم خاصی پیروی میکنند و یا بهینه‬
‫سازی مدل بر اساس یک روند تکراری‪ ،‬براحتی امکان پذیر است‪ .‬برای استفاده از این‬
‫قابلیت آباکوس کاربر باید با زبان برنامه نویسی پیتون آشنایی داشته باشد‪.‬‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪264‬‬

‫در این قسمت ابتدا برنامهنویسی پیتون معرفی میگردد‪ .‬ذخیره سازی و کنترل جریان‬
‫برنامه و سایر ابزارهای مورد نیاز برای برنامه نویسی در پیتون مورد بررسی قرار گرفته‪،‬‬
‫سپس به برنامه نویسی در آباکوس پرداخته خواهد شد‪ .‬هدف این بخش آموزش سریع و‬
‫کاربردی برنامه نویسی در آباکوس است و فرض میشود که خواننده حداقل با یک زبان‬
‫برنامه نویسی آشنایی کامل دارد‪.‬‬
‫برنامه پیتون را میتوانید از سایت رسمی پیتون ‪ www.python.org‬دانلود کنید‪ .‬البته‬
‫نسخههای دیگری از این نرمافزار نیز وجود دارند که برخی از آنها دارای ویرایشگرهای‬
‫مناسبتری هستند‪ .‬نسخه ‪ ActivePython‬نسخه نسبتاً مناسبتری از این نرم افزار است و‬
‫استفاده از آن توصیه میشود‪ .‬البته از ویرایشگر آباکوس نیز میتوان استفاده کرد که در‬
‫شکل زیر طریقه اجرای آن نشان داده شده است‪.‬‬

‫شکل‪ 1-18‬مسیر ‪ABAQUS PDE‬‬


‫‪265‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫شکل زیر محیط ‪ Interactive Window‬را در نسخه ‪ ActivePython‬نشان میدهد‪.‬‬


‫با باز کردن پنجره جدید از طریق مسیر ‪ ،File→ new→ "Python Script"_OK‬میتوان‬
‫از محیط برنامه نویسی آن بهره برد‪.‬‬

‫شکل ‪ 2-18‬محیط ‪Active python‬‬

‫برنامه نویسی درپیتون‬


‫این بخش به اختصار موارد زیر را شامل میشود‪:‬‬
‫‪ .1‬انواع دادهها در پیتون‬

‫‪ .2‬دستورات کنترل جریان برنامه‬

‫‪ .3‬ذخیره سازی اطالعات در فایل‬

‫‪ .4‬توابع‬

‫‪ .5‬کالس‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪266‬‬

‫‪ .6‬ماژول‬

‫انواع دادهها در پیتون‬


‫در برنامه نویسی پیتون محدوده اعداد صحیح از ‪ -2147483647‬تا ‪2147483648‬‬
‫است‪ .‬این دامنه برای دادههای غیر صحیح از ‪  4.9e - 324‬تا‬
‫‪  1.7976931348623157e308‬میباشد‪ .‬عملیات ریاضی جمع(‪ ، ) +‬منها (‪، ) -‬‬
‫ضرب( * ) ‪ ،‬تقسیم( ‪ ) /‬و توان ( ** ) در این برنامه تعریف شدهاند‪ .‬برخی از توابع‬
‫کاربردی مثل توابع مثلثاتی را میتوان با وارد کردن ماژول ‪ math‬به برنامه پیتون فعال کرد‪.‬‬
‫به مثال زیر توجه کنید‪:‬‬
‫ابتدا به برنامه پیتون وارد میشویم‪ .‬با نوشتن دستور ‪ ،import math‬کلیه توابع تعریف‬
‫شده در ماژول ‪ math‬قابل استفادهاند‪.‬‬
‫‪>>> import math‬‬
‫برای استفاده از توابع موجود در ‪ math‬از فرمت "نام تابع ‪ "math.‬استفاده میشود‪.‬‬
‫دستور ‪ math.pi‬نوشته میشود‪ .‬دستور زیر مقدار ‪ ‬را می‪-‬‬ ‫‪‬‬ ‫مثال برای دسترسی به عدد‬
‫‪2‬‬
‫دهد‪.‬‬
‫‪>>> math.pi/2‬‬
‫‪1.5707963267948966‬‬
‫به همین ترتیب برای محاسبه )‪ ، sin(x‬دستور )‪ math.sin(x‬نوشته میشود‪.‬‬
‫‪‬‬ ‫‪‬‬
‫دستورات زیر ) (‪ sin‬و ) (‪ cos‬را محاسبه میکند‪.‬‬
‫‪2‬‬ ‫‪2‬‬
‫)‪>>> math.sin(math.pi/2‬‬
‫‪1.0‬‬
‫)‪>>> math.cos(math.pi/2‬‬
‫‪6.1230317691118863e-017‬‬
‫را‬ ‫‪‬‬ ‫در مثالهای باال ماژول ‪ math‬امکان دسترسی به توابع سینوس و کسینوس و عدد‬
‫فراهم کرده است‪ .‬به همین ترتیب میتوان از سایر توابع ماژول ‪ math‬نیز استفاده کرد‪.‬‬
‫‪267‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫رشتهها‬
‫رشتهها یکی دیگر از انواع دادهها هستند که با نوشتن بین " " یا ' ' مشخص میشوند‪.‬‬
‫مثالً "‪ '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‬‬

‫عبارت زیر را میتوان بهکار برد‪:‬‬


‫‪>>> a=b=2‬‬
‫سادهسازیهای فوق در آباکوس مکرر استفاده میشود‪ .‬اعداد را میتوان با استفاده از‬
‫تابع )(‪ str‬به رشته تبدیل کرد‪ .‬به عنوان مثال در عبارت زیر مقدار ‪ i‬که برابر عدد ‪ 4‬است به‬
‫رشته '‪ '4‬تبدیل خواهد شد‪:‬‬
‫‪>>> i=4‬‬
‫)‪>>> str(i‬‬
‫'‪'4‬‬
‫بنابراین )‪ str(i‬و یا )‪ str(4‬رشته هستند و میتوان آنها را با یک رشته دیگر جمع کرد‪.‬‬
‫در مثال زیر این موضوع نشان داده شده است‪.‬‬
‫)‪>>> 'job_'+str(i‬‬
‫'‪'job_4‬‬
‫از توابع )(‪ int‬و یا )(‪ float‬نیز میتوان برای تبدیل رشته به عدد صحیح یا اعشار‬
‫استفاده نمود‪ .‬به بیان دیگر این دو دستور عکس تابع)(‪ str‬هستند‪.‬‬
‫)'‪>>> int('5‬‬
‫‪5‬‬
‫)'‪>>> float('5.3‬‬
‫‪5.2999999999999998‬‬

‫در برخی موارد یک رشته دارای چند قسمت است که بین قسمتهای مختلف فضای خالی‬
‫وجود دارد‪ .‬قسمتهای مختلف را میتوان توسط دستور ‪ 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‬پیتون)‬

‫]'‪>>> L=['job_1', 'job_3', 'job_5‬‬


‫]‪>>> del L[1‬‬
‫‪>>> L‬‬
‫]'‪['job_1', 'job_5‬‬
‫ممکن است برخی از دادههای یک لیست‪ ،‬خود لیستی دیگر باشند‪ .‬مثال زیر دستیابی‬
‫به دادههای یک لیست داخلی را مشخص میکند‪.‬‬
‫]]‪>>> L=['job_1','job_3',[1,3,5‬‬
‫]‪>>> L[2][1‬‬
‫‪3‬‬
‫در این مثال‪ ،‬اندیس نوشته شده در براکت اول مربوط به لیست بزرگتر است و به‬
‫لیست ]‪ [1,3,5‬اشاره دارد‪ .‬اندیس براکت دوم مربوط به لیست داخلی بوده و مقدار ‪ 3‬را‬
‫مشخص میکند‪.‬‬
‫میتوان از تابع )‪ range(start,stop,step‬و یا )‪ range(stop‬برای تولید لیست اعداد‬
‫صحیح استفاده نمود که در آن ‪ start‬مقدار اولیه‪ stop ،‬مقدار نهایی و ‪ step‬گام است که‬
‫باید عدد صحیح باشد ‪ .‬به عنوان مثال با اجرای دستور زیر لیستی از مقادیر صحیح تولید‬
‫خواهد شد‪:‬‬
‫)‪>>> range(10‬‬
‫]‪[0, 1, 2, 3, 4, 5, 6, 7, 8, 9‬‬
‫)‪>>> range(2.2,20.4,4‬‬
‫]‪[2, 6, 10, 14, 18‬‬
‫در قسمتهای بعد خواهید دید که این تابع برای استفاده از دستور ‪ for‬بسیار مهم است‪.‬‬
‫نکته مهم‪ :‬به مثال زیر توجه کنید‪:‬‬
‫]‪>>> a=[1,4,2‬‬
‫‪>>> b=a‬‬
‫‪>>> b[1]=100‬‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪272‬‬

‫‪>>> 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‬پیتون)‬

‫مشابه لیست میتوانیم یک تاپل را درون تاپل دیگری قرار دهیم‪:‬‬


‫)‪>>> data=data0,(3,5‬‬
‫‪>>> data‬‬
‫))‪((1, 4), (3, 5‬‬
‫)‪>>> data=data,(4,6‬‬
‫‪>>> data‬‬
‫))‪(((1, 4), (3, 5)), (4, 6‬‬
‫روش زیر برای ایجاد یک جدول در آباکوس توصیه میشود‪ .‬به نحوه قرارگیری‬
‫عالمت کاما دقت کنید‪:‬‬
‫)‪>>> data0=((1,4),‬‬
‫‪>>> data0‬‬
‫)‪((1, 4),‬‬
‫)‪>>> data0=data0+((3,5),‬‬
‫‪>>> data0‬‬
‫))‪((1, 4), (3, 5‬‬
‫)‪>>> data0=data0+((4,6),‬‬
‫‪>>> data0‬‬
‫))‪((1, 4), (3, 5), (4, 6‬‬

‫دیکشنری‬
‫بر خالف لیستها که مکان یک داده اندیس آن بهشمار میآید‪ ،‬در دیکشنریها‬
‫اندیس داده را نیز باید مشخص کرد‪ .‬به عبارت دیگر عالوه بر داده‪ ،‬اندیس داده را نیز باید‬
‫مشخص کرد‪ .‬اندیس که میتواند عدد و یا رشته باشد‪ ،‬قبل از داده نوشته شده و با عالمت ‪:‬‬
‫از داده مجزا میگردد‪ .‬به مثال زیر توجه کنید‪:‬‬
‫}‪>>> a={2:3,'weight':4,'lenght':10‬‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪274‬‬

‫]‪>>> a[2‬‬
‫‪3‬‬
‫]'‪>>> a['weight‬‬
‫‪4‬‬
‫پیتون نوعی برنامه نویسی شیئ گراست و دادهها در آن نوعی شیئ هستند‪ .‬توضیحات‬
‫بیشتر در هنگام معرفی کالس ارائه خواهد شد‪ .‬در این قسمت به معرفی توابع (متد) پر‪-‬‬
‫کاربرد در دیکشنری میپردازیم‪ .‬متدها بهصورت زیر فراخوانی میشوند‪.‬‬
‫نام متد ‪ + . +‬نام دیکشنری‬
‫دیکشنری ‪ a‬که قبالً تعریف شده را در نظر بگیرید‪ .‬متدهای زیر هنگام برنامه نویسی‬
‫در آباکوس بسیار کاربردی هستند‪.‬‬

‫)(‪a.values‬‬ ‫لیستی از دادهها را باز میگرداند‪.‬‬


‫)(‪a.keys‬‬ ‫لیستی از اندیسها را باز میگرداند‪.‬‬
‫هر داده به همراه اندیسش را در یک تاپل قرار‬
‫)(‪a.items‬‬
‫داده و مجموعه تاپلها را در یک لیست قرار میدهد‪.‬‬

‫نتیجه این دستورات در زیر نشان داده شدهاست‪.‬‬


‫)(‪>>> a.values‬‬
‫]‪[3, 10, 4‬‬
‫)(‪>>> a.keys‬‬
‫]'‪[2, 'lenght', 'weight‬‬
‫)(‪>>> a.items‬‬
‫])‪[(2, 3), ('lenght', 10), ('weight', 4‬‬
‫در آباکوس اطالعات مربوط به مدل و خروجیهای برنامه در ساختاری شبیه‬
‫دیکشنری ذخیره می گردد‪ .‬در مورد این ساختار در بخش مربوطه توضیحات الزم داده ‪-‬‬
‫خواهد شد‪.‬‬
‫‪275‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫حلقهها و کنترل روند برنامه در پیتون‪:‬‬


‫از دستورات ‪ ... , if , else , for ,while‬میتوان برای ایجاد حلقه و یا کنترل روند‬
‫برنامه استفاده کرد‪ .‬برای استفاده مناسبتر از مثالهای این بخش توصیه میشود بهجای‬
‫استفاده از محیط ‪( ،Interactive window‬مطابق روند گفته شده در ابتدای فصل) پنجره‬
‫جدیدی باز کرده و مثالهای ارائه شده در این بخش را انجام دهید‪.‬‬
‫دستور ‪: if‬‬
‫کلیات این دستور در زیر آورده شده است‪:‬‬

‫بعد از دستور ‪ 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‬ودستورات وابسته به آن را نشان میدهد‪.‬‬


‫'‪L='job‬‬
‫‪if i == 5:‬‬
‫)‪L=L+str(i‬‬
‫‪print L‬‬
‫‪elif i == 6:‬‬
‫‪print i‬‬
‫‪else:‬‬
‫‪i=0‬‬
‫دستور ‪:while‬‬
‫به مثال زیر توجه کنید‪:‬‬

‫در این دستور همانند دستور ‪ ، 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‬انجام میگیرد‪ .‬شکل کلی این دستور بهصورت زیر است‪:‬‬

‫نام ماژول ‪import‬‬

‫بعد وارد کردن یک ماژول در برنامه اصلی میتوان از توابع داخل آن بهصورت زیر‬
‫استفاده کرد‪:‬‬

‫() نام تابع ‪ .‬نام ماژول‬


‫به مثال زیر توجه کنید‪:‬‬
‫‪>>> import math‬‬
‫‪>>> math.pi‬‬
‫‪281‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫‪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‬که فرم کلی آن در زیر آورده شده است‪ ،‬انجام‬
‫میگیرد‪.‬‬
‫)' حالت باز کردن فایل ' ‪ ' ,‬مسیر ' ( ‪ = open‬نام متغیر‬
‫در این فرم کلی ‪ ،‬دستور ) ( ‪ open‬به نام متغیر نوشته شده نسبت داده میشود که از‬
‫آن برای عملیاتهای بعدی استفاده خواهد شد‪ .‬حالتهای مختلف بازکردن فایل‪ ،‬مشخص‬
‫کننده نوع استفاده از فایل است که در جدول زیر آمدهاست‪.‬‬

‫’‪‘w’,’wb‬‬ ‫نوشتن در فایل‬


‫’‪‘r’,’rb‬‬ ‫خواندن از فایل‬
‫’‪‘r+’,’r+b‬‬ ‫خواندن و نوشتن‬
‫’‪‘a’,’ab‬‬ ‫اضافه کردن داده به فایل‬

‫به عنوان مثال دستور‬


‫)'‪>>> file = open ( ' e:\\ data.txt ' , 'w‬‬
‫فایل ‪ data.txt‬را در آدرس ‪ e:\\data.txt‬برای نوشتن اطالعات باز کرده و به متغیر‬
‫‪ file‬نسبت می دهد‪ .‬در صورت عدم وجود فایل فوق‪ ،‬برنامه پیتون این فایل را در آدرس‬
‫داده شده خواهد ساخت‪.‬‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪284‬‬

‫بعد از باز شدن فایل‪ ،‬توابع زیر برای خواندن اطالعات استفاده میشوند‪ .‬در جدول‬
‫زیر منظور از متغیر‪ ،‬نام متغیری است که هنگام باز کردن فایل دستور )(‪ open‬را به آن‬
‫نسبت دادیم‪..‬‬

‫جدول ‪ 1-18‬توابع خواندن اطالعات از فایل‬


‫)(‪ . readline‬متغیر‬ ‫یک خط از دادههای درون فایل را بر میگرداند‪.‬‬
‫همه داده را بهصورت لیست برمیگرداند‪ .‬هر داده‬
‫)(‪ . readlines‬متغیر‬
‫از لیست حاوی یک خط از دادههای فایل است‪.‬‬
‫)(‪ . tell‬متغیر‬ ‫مکان انجام عملیات در فایل را نشان میدهد‪.‬‬

‫برای نوشتن اطالعات در فایل از دستور زیر میتوان استفاده کرد‪:‬‬


‫)رشته(‪. write‬متغیر‬
‫در انتها با استفاده از دستور زیر فایل بازشده بسته خواهد شد و به این ترتیب ذخیره‬
‫سازی اطالعات در فایل تکمیل میگردد‪.‬‬

‫)(‪. close‬متغیر‬

‫کالس‪:‬‬
‫برنامه پیتون یک برنامه شییگراست و برنامه آباکوس از این خاصیت بهره بسیاری‬
‫برده است‪ .‬در این بخش مفاهیم کالس و شیئ بطور مختصر معرفی میشود‪ .1‬اگر چه در‬
‫عمل از کالس به ندرت در برنامه نویسیهای مربوط به آباکوس استفاده میشود با این‬
‫وجود انتظار میرود که خواننده با مطالعه این فصل بتواند درک بهتری از دستورات‬
‫آباکوس و پیتون بدست آورد‪.‬‬

‫‪1‬‬
‫عالقه مندان میتوانند برای اطالعات بیشتر به کتابهای برنامه نویسی به زبان پیتون مراجه کنند‪.‬‬
‫‪285‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫مفهوم کالس و شیی از مفاهیم اساسی یک برنامهنویسی شییگراست‪ .‬کالس را می‪-‬‬


‫توان به یک قالب و شیی را محصولی از آن قالب تشبیه کرد‪ .‬به عنوان مثال لیست نوعی‬
‫کالس است و متغیرهایی که بهصورت لیست ساخته میشوند‪ ،‬اشیایی از کالس لیست‬
‫هستند‪ .‬یک کالس حاوی مجموعهای از عملگرها ( متدها‪ ) 2‬و اعداد (خواص) است و‬
‫نمایش کلی آن بهصورت زیر است‪.‬‬

‫متدها توابعی هستند که عملیاتی را روی شیئ انجام میدهند‪ .‬بنابراین خود شیئ همیشه‬
‫یکی از ورودیهای متد است و به طور قراردادی با کلمه ‪ self‬نشان داده میشود‪ .‬مثالهای‬
‫پیش رو نحوه عملکرد کالس را بیشتر روشن میکند‪.‬‬
‫مثال ‪ - 1‬کالس زیر مشخصکننده کالس مستطیل است که ابعاد آن (بهعنوان خواص‬
‫کالس) بطور پیش فرض ‪ 11‬انتخاب شده است‪.‬‬
‫‪>>> 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‬پیتون)‬

‫‪...‬‬ ‫‪return A‬‬


‫‪...‬‬ ‫‪def extension(self,dx,dy):‬‬
‫‪...‬‬ ‫‪self.lenght=self.lenght+dx‬‬
‫‪...‬‬ ‫‪self.width=self.width+dy‬‬
‫‪...‬‬
‫همانگونه مشاهده میشود‪ ،‬از کلمه ‪ self‬برای نشان دادن شیئ استفاده شده است‪.‬‬
‫مشابه قبل دستورات زیر اشیاء ‪ a,b‬را با ابعاد ‪ 1 1‬میسازد‪.‬‬
‫)(‪>>> a=rectangle‬‬
‫)(‪>>> b=rectangle‬‬
‫این اشیاء مستقل بوده و تغییر در یکی تاثیری بر دیگری ندارد‪ .‬دستورات زیر طریقه‬
‫استفاده از متد را نشان میدهد‪ .‬با اجرای این دستورات‪ ،‬ویژگیهای شیئ ‪ a‬و مقادیر ‪ 2‬و ‪4‬‬
‫درون متد ‪ extension‬قرار گرفته‪ ،‬طول و عرض آن به اندازه ‪2‬و ‪ 4‬افزایش مییابد‪ .‬در پایان‬
‫متد ‪ area‬اجرا گردیده و مساحت مستطیل محاسبه میگردد‪.‬‬
‫)‪>>> a.extension(2,4‬‬
‫‪>>> a.lenght‬‬
‫‪3‬‬
‫‪>>> a.width‬‬
‫‪5‬‬
‫)(‪>>> a.area‬‬
‫‪15‬‬
‫در این مثال مشاهده میکنید که با مستطیل مانند یک شیء برخورد شده است‪ .‬برای‬
‫محاسبه مساحت در دیدگاه تابعگرا یک تابع مجزا نوشته میشد‪ .‬در حالیکه در دیدگاه‬
‫شیءگرا مقدار مساحت از خود شیء درخواست میشود‪.‬‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪288‬‬

‫مقدمهای که از زبان برنامهنویسی پیتون ارائه شد‪ ،‬اگرچه کامل نیست با این وجود‬
‫انتظار میرود که تمام نیازهای کاربران آباکوس را برآورده سازد‪ .‬در ادامه به بررسی‬
‫اشیائی میپردازیم که به طور اختصاصی در برنامه آباکوس مورد استفاده قرار میگیرند‪.‬‬

‫استفاده از قابلیت برنامه نویسی در آباکوس‬

‫مقدمه‪ :‬کالسها و اشیاء آباکوس‬


‫فرض کنید که میخواهیم اطالعات مربوط به خمش یک تیر االستیک را برای‬
‫آباکوس مشخص کنیم ‪ .‬برای این منظور‪ ،‬اطالعات مربوط به هندسه ‪ ،‬نوع ماده‪ ،‬شرایط‬
‫مرزی‪ ،‬نوع حل و ‪ ...‬را بهصورت مجزا در صفحات مختلفی که ‪ MODULE‬نامیده میشود‬
‫وارد میکنیم‪ .‬این نحوه دادن اطالعات مشابه پر کردن صفحات یک شناسنامه است‪ .‬این‬
‫اطالعات ورودی در آباکوس به عنوان ‪ model base data‬شناخته میشود و یکی از‬
‫مهمترین اشیائ آباکوس است‪.‬‬
‫همانگونه که گفته شد‪ ،‬پیتون اشیایی مانند دیکشنری و لیست را برای استفاده در‬
‫اختیار کاربر قرار میدهد‪ .‬عالوه بر این اشیاء‪ ،‬آباکوس از نوع دیگری از اشیاء طبقاتی نیز‬
‫استفاده میکند‪ .‬بطور کلی در آباکوس سه دسته شیئ اساسی وجود دارد که عبارتند از‪:‬‬
‫‪ Mdb() ‬و یا ‪ model base data‬که مربوط به مدلسازی و اطالعات مورد نیاز‬
‫برای حلگر است‪.‬‬

‫‪ Odb() ‬که اطالعات حاصل از حل مسئله در آن قرار گرفته است‪.‬‬

‫‪ Session() ‬که مربوط به نمایش است‪.‬‬


‫شکل زیر ساختار این اشیاء را نشان میدهد‪.‬‬
‫‪289‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫شکل ‪ 3-18‬ساختار اشیاء آباکوس‬

‫ساختار این اشیاء در آباکوس با آنچه تاکنون در برنامهنویسی پیتون مشاهده شد‪ ،‬کمی‬
‫متفاوت است‪ .‬این اشیاء شباهتهایی با دیکشنری دارند و البته برخی از متدهای معرفی‬
‫شده در دیکشنری در اینجا نیز قابل استفاده است‪ .‬همانگونه که گفته شد اشیاء آباکوس به‪-‬‬
‫صورت طبقاتی و سلسله وار است‪ .‬به این معنی که برای اجرای هر دستور و یا دسترسی به‬
‫دادهها‪ ،‬باید مسیر آن نوشته شود‪ .‬بعد از نوشتن هر سر شاخه‪ ،‬با گذاشتن یک نقطه وارد زیر‬
‫شاخه می شویم‪ .‬با توجه به گسترده بودن این اشیاء‪ ،‬امکان توضیح کامل آن در این کتاب‬
‫مقدور نیست‪ .‬بنابراین تنها به نکات مهم و کاربردی اشاره خواهد شد تا کاربر با سرعت‬
‫بیشتری بتواند از برنامه نویسی پیتون در آباکوس بهره ببرد‪ .‬در این فصل به بررسی دو شیئ‬
‫)(‪ Mdb‬و)(‪ Odb‬خواهیم پرداخت‪.‬‬

‫شیئ ‪ Mdb‬و دستورات مربوط به مدلسازی در آباکوس‬


‫فرض کنید که میخواهیم فایل پیتون مربوط به مدلسازی یک قطعه را آماده کنیم‪.‬‬
‫اگر بخواهید تمام دستورات مربوط به مدلسازی را حفظ کرده و آنها را بکار ببرید عمالً‬
‫غیر ممکن است‪ .‬لذا همانگونه که در بخشهای بعد توضیح داده خواهد شد‪ ،‬میتوانید‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪290‬‬

‫فایل ‪ ABAQUS.rpy‬را با استفاده از یک ویرایشگر برنامه نویسی پیتون و یا ‪ABAQUS‬‬


‫‪ PDE‬باز کرده و دستورات اجرا شده در واسط گرافیکی ( ‪ ) CAE‬را مرحله به مرحله‬
‫مشاهده کنید‪ .‬بدین ترتیب میتوانید در هر مرحله از مدلسازی دستورات مورد نظر را به‬
‫فایل دیگری انتقال داده و مطابق نیاز ویرایش کنید‪ .‬بنابراین یادگیری دقیق دستورات‬
‫مربوط به مدلسازی الزامی نخواهد بود‪ .‬در این فصل با ذکر چند مثال برخی نکات کلیدی‬
‫مربوط به این دستورات توضیح داده خواهد شد‪.‬‬

‫مثال – مدلسازی پارامتریک یک مکعب مستطیل‪.‬‬


‫برنامه آباکوس را اجرا کرده و یک مکعب ‪ 25  20 20‬را بسازید‪ .‬برای ساختن این‬
‫استفاده نکنید‪ .‬توسط ویرایشگر پیتون‪ ،‬فایل ‪ ABAQUS.rpy‬را باز‬ ‫مکعب از دستور‬
‫کرده و همزمان به دستورات نوشته شده در فایل ‪ ABAQUS.rpy‬دقت کنید‪.‬‬
‫در قسمت اول این فایل دستوراتی را میبینید که به عالمت ‪ #‬آغاز شدهاند‪ .‬مانند‬
‫دستورات زیر‪:‬‬
‫‪# -*- coding: mbcs -*-‬‬
‫‪#‬‬
‫‪# Abaqus/CAE Version 6.8-1 replay file‬‬
‫‪# Internal Version: 2008_05_02-13.37.42 86896‬‬
‫‪# Run by shd on Sun Jun 13 23:39:50 2010‬‬
‫‪. . .‬‬
‫‪. . .‬‬
‫این دستورات توضیحات برنامه بوده و در پیتون اجرا نمیشود‪ .‬بعد از این دستورات‪،‬‬
‫آباکوس ماژولهای مورد نیاز خود را فراخوانی میکند‪ .‬به عنوان مثال دستور‬
‫* ‪from abaqus import‬‬
‫تمامی توابع موجود در ماژول آباکوس را فراخوانی میکند‪ .‬بعد از دستورات مربوط‬
‫به فراخوانی ماژولها دستوراتی مشاهده میشوند که با ‪ session.‬شروع شدهاند مانند‬
‫دستورات زیر‪:‬‬
‫‪291‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫‪session.Viewport(name='Viewport: 1', origin=(0.0, 0.0),‬‬


‫)‪width=200.5947265625, height=169.375004768372‬‬
‫)(‪session.viewports['Viewport: 1'].makeCurrent‬‬
‫)(‪session.viewports['Viewport: 1'].maximize‬‬
‫این دستورات عموماً مربوط به نمایش صفحه گرافیکی است‪ .‬در این دستورات تو‬
‫رفتهگی نشان دهنده ادامه خط قبلی است‪.‬‬
‫همانگونه که گفته شد اشیاء آباکوس حالت درختی و سلسلهوار دارند‪ .‬برای رفتن از‬
‫یک سرشاخه به یک زیرشاخه نقطه گذاشته میشود ( مثل ‪ session.Viewport‬در‬
‫دستورات باال )‪ .‬بعد از نام هر شاخه ممکن است بالفاصله نقطه گذاشته شود ( مانند‬
‫‪ .) session.‬به این گونه اشیاء‪ ،‬اشیاء تک قسمتی گفته میشود‪ .‬در برخی موارد نیز بعد‬
‫از نام شاخه عالمت براکت ( ][ ) و یا پراتز( () ) مشاهده میشود (مانند ‪.)Viewport‬‬
‫عالمت پراتز در دو حالت بکار میرود‪ .‬در حالت اول در مقابل نام یک شاخه بکار‬
‫میرود که ویژگیهای شیء را مشخص میکند مانند دستور ‪ Viewport‬در سطر زیر‪:‬‬
‫‪session.Viewport(name='Viewport: 1', origin=(0.0, 0.0),‬‬
‫)‪width=200.5947265625, height=169.375004768372‬‬
‫در این دستور نام‪ ،‬مبداء‪ ،‬طول و عرض به عنوان ویژگیهای شیء فوق مشخص شده‪-‬‬
‫اند‪.‬‬
‫در حالت دوم پرانتز مقابل یک متد گذاشته میشود مانند ‪ maximize‬در دستور‬
‫زیر‪:‬‬
‫)(‪session.viewports['Viewport: 1'].maximize‬‬
‫در این حالت متد یک فعالیت انجام میدهد‪.‬‬
‫زمانی که یک شیء چند قسمتی باشد در مقابل آن براکت گذاشته و نام قسمت مورد‬
‫نظر در آن نوشته میشود‪ .‬این موضوع در سطر زیر نشان داده شده است‪.‬‬
‫()‪session.viewports['Viewport: 1'].makeCurrent‬‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪292‬‬

‫دستورات مربوط به گرافیک با وارد شدن به هر ماژول و یا بزرگ و کوچک کردن‬


‫مدل در آباکوس و عملیاتی مشابه نوشته میشود‪ .‬بنابراین در صورت اصالح یک‬
‫اسکریپت تمام دستوراتی که با ‪ session‬آغاز میشوند قابل حذف هستند‪.‬‬
‫دستور‬
‫)(‪Mdb‬‬
‫دستوری است که اطالعات مربوط به مدل را (در صورت وجود) پاک کرده و برنامه‬
‫آباکوس را آماده دریافت اطالعات مربوط به مدل جدید میکند‪ .‬بنابراین میتوان این‬
‫دستور را اولین دستور اجرایی آباکوس دانست‪.‬‬
‫در اسکریپت آباکوس میتوان یک مسیر را در یک متغیر ذخیره کرد و از آن متغیر به‬
‫عنوان آن مسیر استفاده کرد‪ ،‬به عنوان مثال در‪:‬‬
‫=‪s = mdb.models['Model-1'].ConstrainedSketch(name‬‬
‫)‪'__profile__', sheetSize=200.0‬‬
‫مسیر را در متغیر ‪ s‬ذخیره کردهایم‪ .‬البته بیان صحیحتر این است که گفته شود‪ :‬از‬
‫شیء‬
‫=‪mdb.models['Model-1'].ConstrainedSketch(name‬‬
‫)‪'__profile__', sheetSize=200.0‬‬
‫یک معادل با نام ‪ s‬ساخته شده است‪ .‬بنابراین شیء ‪ s‬تمامی ویژگیهای شیء اولیه را‬
‫داشته و دقیقاً بجای آن قابل استفاده است‪ .‬بنابراین دستورات‪:‬‬
‫=‪s = mdb.models['Model-1'].ConstrainedSketch(name‬‬
‫)‪'__profile__', sheetSize=200.0‬‬
‫‪c=s.geometry‬‬
‫معادل دستور زیر است‪:‬‬
‫=‪c= mdb.models['Model-1'].ConstrainedSketch(name‬‬
‫‪'__profile__', sheetSize=200.0).geometry‬‬
‫‪293‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫همانگونه که در دستورات فوق مشاهده میکنید‪ ،‬بعد از ‪( 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‬نیز قابل اجرا است‪ .‬برای باز شدن این‬
‫که در قسمت پایینی پنجره آباکوس قرار دارد کلیک کنید‪.‬‬ ‫پنجره بر دکمه‬

‫مثال‪ :‬مشخص کردن ماده یک بخش خاص‬


‫طریقه نوشتن یک اسکریپت با کمک فایل ‪ ABAQUS.rpy‬در قسمت قبل توضیح‬
‫داده شد‪ .‬همان روند برای قسمت ‪( property modul‬و بقیه قسمتها) نیز قابل استفاده‬
‫است با این تفاوت که در قسمت ‪ property modul‬باید چند نکته در نظر گرفته شود‪ .‬به‬
‫منظور همراهی با این مثال‪ ،‬یک جسم ساده سه بعدی را در محیط گرافیکی مدلسازی‬
‫کرده و ماده آن را نیز مشخص کنید‪ .‬در صورتی که دستورات نوشته شده در فایل‬
‫‪ ABAQUS.rpy‬را دنبال کنید به دستوراتی مشابه زیر میرسید‪:‬‬
‫)'‪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),‬‬
‫=‪mdb.models['Model-1'].HomogeneousSolidSection(name‬‬
295 )‫ (پیتون‬ABAQUS ‫برنامه نویسی در‬

'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‬‬

‫دسته سوم دستورات مربوط به ‪ assign‬کردن ‪ section‬است که در زیر آورده شده‬


‫است‪:‬‬
‫]'‪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'].parts['Part-1‬یک شیء با نام ‪p‬‬
‫ساخته میشود‪ .‬همانگونه که در بخش قبل توضیح داده شد‪ ،‬این شیء میتواند بهجای‬
‫شیء اصلی استفاده شود‪ .‬در خط دوم نیز از ‪ p.cells‬یک شیء با نام ‪ c‬ساخته میشود‪ .‬کلمه‬
‫‪ cells‬به دلیل سه بعدی بودن جسم است‪ .‬در صورتی که جسم دو بعدی و یا یک پوسته‬
‫‪ shell‬باشد‪ ،‬کلمه ‪ faces‬بهجای ‪ cells‬نوشته میشود‪ .‬معموالً دستورات گفته شده در این‬
‫پاراگراف باید عیناً از فایل ‪ ABAQUS.rpy‬به اسکریپت مورد نظر منتقل شود‪.‬‬
‫دستور خط سوم شماره مربوط به قسمتهای مختلف را که ‪ section‬باید به آنها‬
‫‪ assign‬شود‪ ،‬در پارامتر ‪ cells‬ذخیره میکند‪ .‬استفاده از متد ‪getSequenceFromMask‬‬
‫در بسیاری از موارد چندان ساده نیست‪ .‬اعدادی مثل ‪ #7‬در‬
‫) ‪cells = c.getSequenceFromMask(mask=('[#7 ]', ),‬‬
‫از الگوریتمی پیروی میکند که با استفاده از آن یک یا چند قسمت بهطور همزمان با‬
‫یک عدد نمایش داده میشود‪ .‬به عنوان مثال عدد ‪ 7‬نشان دهنده قسمتهایی با شمارههای‬
‫‪ 7  4  2  1  3,2,1‬است‪.‬‬
‫میتوان بهجای این دستور‪ ،‬از دستورات معادل دیگری استفاده کرد که دقیقاً‬
‫جایگزین عبارت‬
‫) ‪cells = c.getSequenceFromMask(mask=('[#7 ]', ),‬‬
‫‪297‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫شود‪ .‬این مجموعه دستورات در ادامه نوشته شده است‪:‬‬


‫)‪f11=c.findAt((x,y,z),‬‬
‫‪f12=f11.index‬‬
‫]‪cells=c[f12:f12+1‬‬
‫این دستورات دقیقاً میتواند جایگزین سطر مذکور شود‪ x,y,z .‬در خط اول یک نقطه‬
‫از قسمت مورد نظر است‪ .‬متد ‪ findAt‬قسمت قرار گرفته در مکان ‪ x,y,z‬را مشخص می‪-‬‬
‫کند‪ .‬این متد برای مشخص کردن سطوح و یا لبهها نیز بکار میرود ( در صورت نیاز می‪-‬‬
‫توانید از ‪ help‬آباکوس اطالعات بیشتری بدست آورید)‪ .‬بنابراین ‪ f11‬برابر شیء زیر‬
‫خواهد شد‪.‬‬
‫]‪mdb.models['Model-1'].parts['Part-1'].cells[0‬‬
‫که البته اندیس صفر در ]‪ cells[0‬در هر مثال متفاوت است‪ .‬مقدار اندیس برای‬
‫استفاده در دستورات بعدی مورد نیاز است‪ .‬به منظور بدست آوردن این اندیس ( مشابه‬
‫روند گفته شده در دیکشنری ) میتوان از متد ‪ index‬استفاده کرد‪ .‬بنابراین دستور‬
‫‪ f11.index‬مقدار اندیس شیء را مشخص میکند‪ .‬حاصل سطر انتهایی نیز برابر شیء زیر‬
‫خواهد شد‪:‬‬
‫[‪mdb.models['Model-1'].parts‬‬
‫(‪'Part-1'].cells.getSequenceFromMask‬‬
‫)‪mask=('[#1 ]',),‬‬
‫در شیء باال عدد ‪ #1‬مشاهده میشود که نشان دهنده عضو شماره ‪ 1‬است‪ .‬سایر‬
‫دستورات مربوط به ‪ assign‬کردن ‪ section‬به شیء بدون تغییر خواهد ماند‪.‬‬

‫اجراهای متوالی‬
‫در بسیاری از موارد تکرار حل اجتناب ناپذیر است‪ .‬به عنوان مثال در یک الگوریتم‬
‫بهینه سازی بعد از هر اجرا با توجه به نتایج بدست آمده باید نسبت به اصالح مدل و اجرای‬
‫مجّدد اقدام نمود‪ .‬در ساده ترین حالت ممکن است بخواهیم مدلی را با انجام تغییراتی روی‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪298‬‬

‫آن بطور متوالی اجرا کنیم‪ .‬باید توجه داشت که دستورات در آباکوس خط به خط و به‬
‫ترتیب اجرا نمیگردد و اجرا بهصورت سینکرون است‪ .‬به عبارت دیگر در صورت زمانبر‬
‫بودن یک دستور‪ ،‬برنامه پیتون به خط بعد رفته و دستور بعدی را همزمان اجرا میکند‪.‬‬
‫بنابراین در صورتی که در یک حلقه دستور ‪ submit‬استفاده شده باشد‪ ،‬با توجه به زمانبر‬
‫بودن هر اجرا‪ ،‬بعد از هر ‪ submit‬برنامه ادامه یافته و مجدداً دستور ‪ submit‬اجرا میشود‪.‬‬
‫بنابراین تعداد زیادی اجرا بهصورت همزمان انجام خواهد گرفت‪ .‬در حالتی که ادامه‬
‫الگوریتم نیاز به نتایج حل داشته باشد‪ ،‬به دلیل عدم اجرای مرحله قبل‪ ،‬حل متوقف خواهد‬
‫شد‪ .‬به منظور حل این مشکل باید از دستور زیر بعد از دستور ‪ submit‬استفاده کرد‪:‬‬
‫‪mdb.jobs[' job‬‬ ‫)(‪ '].waitForCompletion‬نام‬

‫با اجرای این دستور‪ ،‬برنامه تا اتمام اجرای ‪ job‬منتظر میماند و بعد از اتمام آن‪ ،‬برنامه‬
‫ادامه مییابد‪ .‬به عنوان مثال فرض کنید که میخواهیم یک مدل را با ‪amplitude‬های‬
‫مختلف بارگذاری کنیم‪ .‬میتوان با انجام مراحل زیر ‪ -‬که در این مثال انجام آن بر عهده‬
‫خواننده گذاشته شده است ‪ -‬به این هدف دست یافت‪:‬‬
‫مدل مربوطه را ساخته و پس از مشبندی ذخیره میکنیم‪ .‬در این مثال نام مدل‬ ‫‪‬‬

‫‪ book.cae‬بوده و در مسیر ‪ c:/book‬ذخیره شده است‪.‬‬


‫با باز کردن یک صفحه جدید‪ ،‬مدل قبل را پاک کرده و دستوراتی که از این مرحله به‬ ‫‪‬‬

‫بعد در فایل ‪ ABAQUS.rpy‬نوشته میشود را به یک فایل جدید منتقل میکنیم‪.‬‬


‫ابتدا فایل ذخیره شده را باز کرده وسپس ‪ amplitude‬را اصالح میکنیم‪ .‬در انتها مدل را‬ ‫‪‬‬

‫‪ submit‬میکنیم‪ .‬به این ترتیب دستورات مورد نیاز بدست خواهد آمد‪.‬‬
‫خطوط اضافی را پاک کرده و مجموعه دستورات را در درون یک حلقه میگذاریم‪.‬‬ ‫‪‬‬

‫سپس مقدار ‪ amplitude‬را بهصورت پارامتری مشخص میکنیم‪ .‬در انتها از متد‬
‫)(‪ waitForCompletion‬استفاده میکنیم‪.‬‬
‫اسکریپت زیر بدست خواهد آمد‪.‬‬ ‫‪‬‬

‫‪for num in [2,6,7]:‬‬


299 )‫ (پیتون‬ABAQUS ‫برنامه نویسی در‬

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 ‫ در انتها دستور‬.‫خواهند بود‬
.‫اجرای قبل خواهد شد‬

‫گرفتن اطالعات از کاربر‬


‫برخی مواقع الزم است که اسکریپت نوشته شده اطالعات ورودی را در حین اجرا از‬
‫ در این موارد دستورات مناسبی‬getInputs()‫ و‬getInput() ‫ دستور‬.‫کاربر دریافت کند‬
‫ در مثال زیر طریقه کاربرد این دستورات و نتیجه اجرای آن در صفحه‬.‫خواهند بود‬
:‫گرافیکی نشان داده شده است‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪300‬‬

‫)' توضیحات ‪ \t‬متغیر '(‪a1= getInput‬‬

‫‪'),‬پیش فرض متغیر ‪ ','1‬متغیر ‪a2=getInputs (((' 1‬‬

‫‪'),‬پیش فرض متغیر ‪ ','2‬متغیر ‪(' 2‬‬

‫‪(' ……..','………………..'),‬‬
‫‪(' ……..','………………..')),‬‬
‫)'نام پنجره'‪',‬توضیحات'‬

‫همانگونه که در دستور اول نشان داده شده است‪ ،‬آنچه قبل از ‪ \t‬نوشته شود (متغیر)‬
‫در پنجره باز شده نوشته میشود و رشته بعد از ‪ \t‬به محض قرار دادن نشانگر موس زیر‬
‫نوشته اصلی ظاهر میشود‪ .‬مقدار ورودی داده شده توسط پنجره باز شده‪ ،‬بهصورت رشته‬
‫در ‪ a1‬ذخیره میگردد‪ .‬میتوان در صورت لزوم این مقدار را توسط توابع )(‪ int‬و یا‬
‫)(‪ float‬به مقدار عددی تبدیل کرد‪.‬‬
‫دستور دوم سه آرگومان میپذیرد‪ .‬آرگومان اول یک تاپل است که خود از تاپلهای‬
‫دوتایی تشکیل یافته است‪ .‬عضو اول تاپلهای دوتایی عنوان متغیری است که در پنجره نشان‬
‫داده میشود و عضو دوم مقدار پیش فرض آن متغیر است‪ .‬شکل فوق به طور دقیق این‬
‫موضوع را نشان میدهد‪ .‬آرگومانهای دوم و سوم رشته هستند که مطابق شکل قبل‬
‫‪301‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫توضیحات و نام پنجره در آن مشخص میشود‪ .‬خروجی این دستور (‪ ) a2‬یک لیست‬
‫خواهد بود که اعضاء آن رشته هستند‪ .‬در صورت تغییر نکردن پیشفرضها‪ ،‬خود پیش‪-‬‬
‫فرضها در لیست خروجی قرار میگیرند‪ .‬مشابه حالت قبل میتوان در صورت لزوم مقادیر‬
‫لیست را توسط توابع )(‪ int‬و یا )(‪ float‬به مقادیر عددی تبدیل کرد‪.‬‬
‫در صورت نیاز به یک واسط گرافیکی مناسبتر در صفحه ‪ CAE‬آباکوس‪ ،‬از طریق‬
‫مسیر‬
‫‪Plug-ins → Abaqus → RSG Dialog Builder‬‬
‫برنامه طراحی واسط گرافیکی را اجرا کنید‪ .‬در این برنامه میتوان به راحتی واسط‬
‫گرافیکی دلخواه را ایجاد نمود‪ .‬جهت یادگیری طریقه ساخت صفحات واسط گرافیکی در‬
‫کلیک کنید‪.‬‬ ‫این قسمت‪ ،‬بر گزینه‬

‫شیئ ‪ ODB‬و خواندن نتایج‬


‫در قسمت قبل گفته شد که برای نوشتن یک اسکریپت‪ ،‬میتوان از دستورات نوشته‬
‫شده در فایل ‪ ABAQUS.rpy‬استفاده کرد‪ .‬برخالف قسمت قبل‪ ،‬استفاده از دستورات‬
‫فایل ‪ ABAQUS.rpy‬برای خواندن فایل نتایج امکانپذیر نیست‪ .‬در این بخش چگونگی‬
‫ذخیره اطالعات در شیء ‪ ODB‬و همچنین نکات کلیدی برای خواندن فایل نتایج گفته‬
‫خواهد شد‪.‬‬

‫ساختار کلی شیء ‪ ODB‬و باز کردن فایل نتایج‬


‫به طور کلی با کمک شیئ ‪ odb‬میتوان ‪ 3‬دسته فعالیت انجام داد‪ .‬دسته اول فعالیتها‬
‫مربوط به استخراج نتایج حاصل از حلگر آباکوس است‪ .‬دسته دوم مربوط به نوشتن‬
‫اطالعات در یک ‪ odb‬و دسته سوم شامل مجموعه فعالیتهای محاسباتی است‪ .‬هدف از‬
‫این بخش آموزش دسته اول این فعالیتها است‪.‬‬
‫شیء ‪ odb‬به دو قسمت عمده تقسیم میشوند‪ .‬قسمت اول حاوی دادههایی است که‬
‫مربوط به اطالعات مدل (‪ )model data‬بوده و مکان نودها‪ ،‬المانها‪ ،‬سطوح و ‪ ...‬در آن‬
‫ذخیره شده است‪ .‬قسمت دوم حاوی اطالعات مربوط به نتایج حل (‪ )result data‬است و‬
‫آنچه که از حل مسئله بدست میآید (مانند جابجاییها‪ ،‬فرکانس‪ ،‬تنش و ‪ )....‬در این‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪302‬‬

‫قسمت ذخیره میشود‪ .‬این اطالعات بهصورت درختی و سلسلهوار ذخیره میشوند‪ .‬شکل‬
‫‪ 4-18‬این دو دسته اطالعات را نشان میدهد‪:‬‬

‫شکل ‪ 4-18‬شیء ‪odb‬‬

‫با توجه به شکل ‪ 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‬استفاده کرد‪ .‬در‬
‫قسمتهای بعد به بررسی چند مثال مهم پرداخته خواهد شد‪.‬‬

‫استفاده از متدهای دیکشنری برای مشخص کردن ‪step‬ها و میدانهای موجود‬


‫در ‪( result data‬متدهای ‪ keys‬و ‪) items‬‬
‫در بسیاری از موارد میتوان از متدهای معرفی شده در بخش دیکشنری استفاده کرد‪.‬‬
‫فرض کنید که میخواهیم در مرحله ‪step ،steps‬های موجود در حل را ببینیم‪ .‬برای این‬
‫منظور میتوان از متد ‪ ( .keys‬که در بخش مربوط به دیکشنری معرفی شده است) استفاده‬
‫کرد‪ .‬در سایر موارد مشابه نیز میتوان از این متد استفاده کرد‪ .‬به عنوان مثال در سطرهای‬
‫زیر از فایل '‪ 'c:\book\job-1.odb‬باز شده و با متد‪ .keys‬لیستی از ‪ step‬های آن (که در‬
‫این مثال فقط '‪ 'Step-1‬وجود دارد) بدست خواهد آمد‪:‬‬
‫* ‪>>> from odbAccess import‬‬
‫)'‪>>> p1=openOdb('c:\book\job-1.odb‬‬
‫‪305‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫)(‪>>> 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‬حاوی مقادیر میدانی است‪ .‬با این وجود‪،‬‬
‫استفاده از آن مستلزم ذکر نکاتی است که در بخش بعدی بیان خواهد شد‪.‬‬

‫خواندن مقادیر میدان مربوط به یک ‪ instance‬خاص‬


‫همانطور که میدانید‪ ،‬در ماژول ‪ ،assembly‬میتوان چندین نمونه(‪ )instance‬از یک‬
‫قطعه را که در ماژول ‪ part‬مدلسازی شده است‪ ،‬وارد کرد‪ .‬در فایل نتایج‪ ،‬میدانهای‬
‫مربوط به یک نمونه(‪ )instance‬بهصورت مجزا وجود ندارد‪ .‬در این بخش نحوه یافتن‬
‫میدانهای مربوط به یک نمونه(‪)instance‬توضیح داده خواهد شد‪.‬‬
‫در ‪ odb‬میدانهای بدست آمده از حل بر اساس المانها یا نودها ذخیره شدهاند‪.‬‬
‫میدانهای تنش و کرنش از جمله میدانهایی هستند که در نقاط انتگرالگیری المان ذخیره‬
‫می شوند‪ .‬مسیر زیر طریقه دسترسی به میدان تنش را در آخرین فریم از ‪ step-1‬نشان می‪-‬‬
‫دهد‪.‬‬
‫* ‪from odbAccess import‬‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪306‬‬

‫)'‪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‬‬

‫شکل‪ 5-18‬شماره نقطه انتگرالگیری‬


‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪308‬‬

‫در این شکل دو نمونه با نامهای ‪ PART-1-1‬و ‪ PART-2-1‬وجود دارد که هر یک‬


‫دارای چهار المان است‪ .‬هر المان دارای چهار نقطه انتگرالگیری است که با مربع تو پر‬
‫نشان داده شده است‪ .‬همانگونه که مشاهده میشود‪ ،‬مقدار ‪ i‬مربوط به کل مدل است‪ .‬به‬
‫عبارت دیگر ‪ i‬شماره المان در یک ‪ instance‬خاص را نشان نمیدهد‪.‬‬
‫شماره و مختصات نودهای هر المان در مسیر جداگانهای در ‪( model data‬شکل ‪-18‬‬
‫‪ )4‬ذخیره شدهاند و بر خالف قسمت قبل‪ ،‬این مقادیر بر اساس ‪ instance‬های موجود در‬
‫مدل طبقهبندی شده است‪ .‬بنابراین برای بدست آوردن مقدار میدان در یک مکان دلخواه‪،‬‬
‫باید برنامهای نوشته شود که بطور همزمان نام نمونه و شماره المان را از قسمت ‪result data‬‬
‫استخراج کرده و سپس با کمک ‪ ،model data‬مکان آنها را مشخص کند‪ .‬نوشتن چنین‬
‫برنامهای بر عهده خواننده گذاشته میشود‪ .‬در اینجا تنها به معرفی مسیرها و متدهای مورد‬
‫نیاز پرداخته خواهد شد‪.‬‬
‫مسیر زیر نودهای المان ‪ j‬ام را از یک ‪ instance‬با نام ‪ PART-1-1‬مشخص میکند‪:‬‬
‫* ‪from odbAccess import‬‬
‫)'‪p1=openOdb('c:\book\job-1.odb‬‬
‫[‪p1.rootAssembly.instances['PART-1-1'].elements‬‬
‫‪j-1].connectivity‬‬
‫حاصل متد ‪ connectivity‬یک تاپل است که شماره نودها در آن ذخیره شده است‪.‬‬
‫با بدست آمدن شماره نود میتوان مختصات آن را نیز مشخص کرد‪ .‬مسیر زیر‬
‫مختصات اولیه نود ‪ k‬ام که در ‪ Part-1-1‬قرار دارد را تعیین میکند‪.‬‬
‫‪p1.rootAssembly.instances['PART-1-1'].nodes[k-‬‬
‫‪1].coordinates‬‬
‫باید توجه داشت که شماره المانها و نودها از یک آغاز میشوند‪ .‬به عنوان مثال‬
‫]‪ nodes[0‬نشان دهنده نود شماره ‪ 1‬است‪.‬‬
‫‪309‬‬ ‫برنامه نویسی در ‪( ABAQUS‬پیتون)‬

‫مشخص کردن میدان ذخیره شده در نودها و یافتن مکان اولیه نود‬
‫مشابه مثال قبل‪ ،‬میتوان به میدان ذخیره شده در نودها نیز دسترسی داشت‪ .‬میدانهایی‬
‫مانند جابجایی‪ ،‬سرعت و یا دوران ‪ ،‬میدانهایی هستند که در نودها ذخیره شدهاند‪ .‬مسیر‬
‫زیر مقدار میدان سرعت در نود ‪ 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‬‬

‫خواندن فرکانس طبیعی‬


‫برخی نتایج ذخیره شده در شیئ ‪ odb‬مانند کمانش و یا فرکانس طبیعی‪ ،‬در زیرشاخه‬
‫‪ fieldOutputs‬ذخیره نشده است‪ .‬به عنوان مثال مسیر زیر دسترسی به فرکانس طبیعی را‬
‫فراهم میآورد‪:‬‬
‫* ‪from odbAccess import‬‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪310‬‬

‫)'‪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‬‬
‫که در آن ‪ a‬نام متغیری است که نشان دهنده وضعیت اجرای دستور است‪ .‬عالوه بر‬
‫اجرای متداول نرم افزار آباکوس‪ ،‬میتوان دستوری نوشت که یک اسکریپت نیز اجرا‬
‫شود‪ .‬به عنوان مثال در صورتی دستورات زیر در متلب نوشته شود‪ ،‬با شرط مشابه بودن‬
‫مسیر نصب آباکوس‪ ،‬اسکریپت مورد نظر اجرا خواهد شد‪:.‬‬
‫=‪! C:\SIMULIA\Abaqus\Commands\abaqus cae script‬‬

‫نام و آدرس فایل پیتون‬

‫به همین ترتیب در زبان فرترن نیز میتوان بهصورت زیر عمل کرد‪:‬‬
‫=‪a=system("C:\SIMULIA\Abaqus\Commands\ abaqus cae script‬‬

‫)" نام و آدرس فایل پیتون‬

‫به این ترتیب فایل پیتون در آباکوس از طریق فرترن و یا متلب قابل اجرا خواهد بود‪.‬‬
‫بعد از اجرا شدن فایل پیتون در آباکوس‪ ،‬تا زمانی که برنامه آباکوس باز باشد‪ ،‬اجرای‬
‫برنامه مت لب و یا فرترن ادامه نخواهد یافت‪ .‬برای ادامه یافتن برنامه‪ ،‬باید در انتهای برنامه‬
‫پیتون‪ ،‬دستور بسته شدن آباکوس(یا پیتون) نوشته شده باشد‪ .‬با توجه به اینکه دستور بسته‬
‫شدن پیتون در ماژول ‪ sys‬وجود دارد‪ ،‬بنابراین برای بستن آباکوس دستورات زیر نوشته‬
‫میشود‪:‬‬
‫‪import sys‬‬
‫)(‪sys.exit‬‬
‫الزم به ذکر است که نوشتن این دستور بالفاصله بعد از دستور ‪ submit‬باعث عدم‬
‫تکمیل اجرای برنامه آباکوس خواهد شد‪ .‬به منظور پرهیز از این مشکل باید از دستور زیر‬
‫بعد از دستور ‪ submit‬استفاده کرد‪:‬‬
‫‪mdb.jobs[' job‬‬ ‫)(‪ '].waitForCompletion‬نام‬
‫آشنایی و طرز کار با نرم افزار ‪ABAQUS‬‬ ‫‪312‬‬

‫به این ترتیب میتوان از طریق زبان برنامه نویسی متلب (و یا فرترن) ‪ ،‬یک پیتون‬
‫مشخص را اجراکرد‪ .‬عالوه بر این با ذخیره کردن اطالعات در یک فایل نوشتاری در زبان‬
‫برنامه نویسی متلب (و یا فرترن) و باز کردن آن در پیتون و بالعکس‪ ،‬میتوان بین دو زبان‬
‫برنامه نویسی پل ارتباطی ایجاد کرد‪.‬‬

You might also like