بان برنامه‌نویسی فرترن (Fortran) ممکن است در دنیای توسعه وب یا اپلیکیشن‌های موبایل جایگاهی نداشته باشد، اما وقتی صحبت از محاسبات عددی سنگین مهندسی به میان می‌آید، فرترن همچنان پادشاه بلامنازع است. برای مهندسان مکانیک، تسلط بر فرترن یک مهارت جانبی نیست؛ بلکه کلید ورود به دنیای بی‌کران شبیه‌سازی‌های پیشرفته در نرم‌افزارهایی مانند آباکوس (Abaqus) و انسیس (ANSYS) است.

زبان برنامه نویسی فرترن (Fortran) در سال 1957 برای محاسبات علمی (scientific calculations) توسط IBM توسعه یافت. فرترن (Fortran) در ابتدا زبان برنامه نویسی سطح پایین (low-level) بود که در بروزرسانی‌های خود به زبان برنامه نویسی سطح بالا (high-level) تبدیل شد. زبان‌های برنامه نویسی سطح پایین مثل اسمبلی (assembly) بسیار نزدیک به زبان ماشین یا کامپیوتر هستند در حالیکه زبان‌های برنامه نویسی سطح بالا مثل متلب (MATLAB)، پایتون (Python) و … بسیار شبیه به زبان انسان هستند.

در این مقاله از سایت مکادمی (Mecademy)، به طور جامع بررسی می‌کنیم که چرا یادگیری فرترن برای یک تحلیلگر المان محدود (FEM) ضروری است و چگونه می‌توانید از آن برای نوشتن سابروتین‌های پیچیده استفاده کنید.

فرترن (Fortran) مخفف Formula Translation است. این زبان برنامه نویسی در دهه ۱۹۵۰ برای انجام محاسبات ریاضی و مهندسی متولد شد. دلیل اینکه نرم‌افزارهای غول‌پیکری مانند Abaqus ،ANSYS و LS-DYNA هسته محاسباتی (solver) خود را بر پایه فرترن بنا کرده‌اند، دو ویژگی کلیدی است:

  • سرعت پردازش بی‌نظیر: کامپایلرهای (compilers) فرترن بهینه‌سازی‌های ریاضیاتی فوق‌العاده‌ای انجام می‌دهند که در محاسبات ماتریسی عظیم (مانند حل ماتریس سفتی (stiffness) در روش اجزای محدود) سریع‌تر از C++ یا پایتون عمل می‌کنند.
  • مدیریت عالی آرایه‌ها (arrays): در مکانیک محیط‌های پیوسته (continuum mechanics)، همه‌چیز با تانسورها و ماتریس‌ها سر و کار دارد. فرترن به صورت ذاتی برای عملیات روی آرایه‌های چندبعدی بهینه‌سازی شده است.

کاربران ایده‌ها و اهداف خود را توسط یکی از زبان‌های برنامه نویسی پیاده سازی می‌کنند سپس زبان برنامه نویسی توسط مترجم (translator) خود، برنامه نوشته شده را به زبان ماشین (machine code) تبدیل می‌کند. مترجم‌ها یا خط به خط این عملیات را انجام می‌دهند یعنی interpreter دارند، یا به‌صورت یکجا این عملیات را انجام می‌دهند که compiler نام دارند. مترجم یا مفسر زبان برنامه فرترن (Fortran) به زبان ماشین، compilation است که معمولا سرعت بالاتری نسبت به مترجم interpretation دارد.

تبدیل زبان‌های برنامه نویسی به زبان ماشین
فرایند تبدیل زبان‌های برنامه نویسی به زبان ماشین

از میان کامپایلرهای مختلف موجود برای فرترن (Fortran) تمرکز ما بر کامپایلرهای اینتل (Intel) برای فرترن است.

  • کامپایلر کلاسیک اینتل فرترن (Intel Fortran Compiler Classic) یعنی ifort
  • کامپایلر LLVM-based اینتل فرترن (Intel® LLVM-based compiler Intel® Fortran Compiler) یعنی ifx

شرکت Intel آخرین ورژن ifort را در سال 2024 عرضه کرد و به پشتیبانی خود به کامپایلر کلاسیک اینتل فرترن خاتمه داد.

برنامه‌های فرترن به صورت fixed-form و free-form نوشته می‌شوند. فایل‌های f.* و for.* به صورت fixed-form نوشته می‌شوند که ساختار اولیه و تاریخی فرترن است. این فرمت هنوز در سابروتین نویسی در آباکوس کاربرد دارد. فایل‌های f90 و f95 از جمله ساختارهای free-form هستند که امروزه بیشتر استفاده می‌شوند.

در ساختار fixed-form ستون اول می‌تواند خالی باشد یا عبارت C به معنای کامنت بودن آن خط قرار گیرد. ستون‌های 2-5 برای لیبل‌گذاری برنامه است. ستون ششم اگر پر باشد به معنای آن است که کدها ادامه خط قبلی هستند. ستون 7-72 برای نوشتن برنامه است و بعد از خط 72 خوانده نمی‌شود. ساختار fixed-form به گذشته‌های دور بر می‌گردد که کدها بر روی صفحات پانج می‌شدند، برای همین است که امروزه معمولا fixed-form منسوخ شده است. از معدود جاهایی که نیاز است از ساختار fixed-form استفاده شود، سابروتین نویسی در نرم افزار المان محدود آباکوس (Abaqus) است. با نوشتن عبارت DIR$ FREEFORM می‌توان کامپایلر را راهنمایی نمود که از free-form به جای fixed-form استفاده شده است.

ساختار fixed-form در فرترن (Fortran)
ساختار fixed-form در فرترن (Fortran)

بر خلاف ساختار fixed-form، ساختار free-form محدودیت‌ خاصی ندارد و کدها را می‌توان از ستون اول نوشت. امروزه معمولا ساختار free-form در فرترن (Fortan) استفاده می‌شود.

داده‌های تعریف شده موجود در فرترن (Fortran) به شرح زیر است:

  • داده‌ متنی (Character type)
  • داده‌های عددی (Numeric types)
  • داده‌ منطقی یا بولین (Logical type)

علاوه بر این داده‌های از پیش تعریف شده (Intrinsic Data Types) در فرترن (Fortran)، کاربر با توجه به نیازهای خود می‌تواند داده‌های دیگری نیز تولید کند.

برای ذخیره اسم‌ها در زبان‌های برنامه نویسی از دیتای کاراکتر (Character) یا رشته (String) استفاده می‌شود. این متن داخل سینگل کوتیشن (single quotation) مثل ‘Mecademy’ یا دابل کوتیشن (double quotation) مثل “Mecademy” نوشته می‌شود.

تعریف کاراکتر (Character) در fixed-form و free-form
تعریف کاراکتر (Character) در زبان برنامه نویسی فرترن (Fortarn) در ساختار fixed-form و free-form

داده‌های عددی در فرترن می‌تواند اسکالر (scaler) یا آرایه (array) باشند و یکی از انواع اعداد زیر باشند.

  • اعداد صحیح (Integer)
  • اعداد حقیقی یا اعشاری (real)
  • اعداد مختلط (complex)
انواع دیتای تعریف شده در فرترن (Intrinsic Data Types in Fortran)
انواع دیتای تعریف شده در فرترن (Intrinsic Data Types in Fortran)

دیتای منطقی (logical) یا بولین (boolean) به دو حالت true یا false است و بیشتر در عبارات شرطی (conditional statement) استفاده می‌شوند.

در زبان برنامه نویسی فرترن (Fortran) تابع دارای چند ورودی و یک خروجی هست. فراخوانی توابع ذاتی فرترن بدین ترتیب است.

output = functionName(arg1, arg2, arg3 …)

DescriptionFunction
Dot product of 2 rank-one arraysDOT_PRODUCT
Matrix multiplicationMATMUL
Transpose of an array of rank twoTRANSPOSE
Reshape an arrayRESHAPE
Replicate array by adding a dimensionSPREAD
Array allocation statusALLOCATED
Lower dimension bounds of an arrayLBOUND
Shape of an array (or scalar)SHAPE
Upper dimension bounds of an arrayUBOUND
Maximum value in an arrayMAXVAL
Minimum value in an arrayMINVAL
Location of first maximum value in an arrayMAXLOC
Location of first minimum value in an arrayMINLOC
Product of array elementsPRODUCT
Sum of array elementsSUM

در زبان برنامه نویسی فرترن (Fortran) سابروتین (subroutine) دارای چند ورودی و چندین خروجی هستند به نحوی که می‌توان خروجی‌های سابروتین را بر حسب ورودی‌های سابروتین تعریف و حتی ورودی‌های سابروتین را ویرایش کرد. برای فراخوانی سابروتین‌های ذاتی یا از پیش تعریف شده در فرترن کافی قبل از اسم سابروتین و آرگمان‌های آن عبارت call نوشته شود. بنابراین فراخوانی سابروتین‌های ذاتی فرترن بدین ترتیب است.

call subroutineName(arg1, arg2, arg3 …)

بهتر است کل برنامه را به قسمت‌های کوچک‌تر تبدیل کرد تا خوانایی و توسعه برنامه و دیباگ کردن آن ساده‌تر شود. این قسمت‌ها می‌توانند به صورت تابع نویسی توسط کاربر (User-defined Function) انجام یا سابروتین نویسی توسط کاربر (User-defined Subroutine) انجام شود. نحوه نوشتن تابع توسط کاربر در زبان برنامه نویسی فرترن مطابق تصویر زیر است.

نوشتن تابع توسط کاربر (User-defined Function) در فرترن (Fortran)
نوشتن تابع توسط کاربر (User-defined Function) در فرترن (Fortran)

بهتر است کل برنامه را به قسمت‌های کوچک‌تر تبدیل کرد تا خوانایی و توسعه برنامه و دیباگ کردن آن ساده‌تر شود. این قسمت‌ها می‌توانند به صورت تابع نویسی توسط کاربر (User-defined Function) انجام یا سابروتین نویسی توسط کاربر (User-defined Subroutine) انجام شود. نحوه نوشتن سابروتین توسط کاربر در زبان برنامه نویسی فرترن مطابق تصویر زیر است

نوشتن سابروتین توسط کاربر (User-defined Subroutine) در فرترن (Fortran)
نوشتن سابروتین توسط کاربر (User-defined Subroutine) در فرترن (Fortran)

نرم‌افزار آباکوس دارای دو حلگر قدرتمند Abaqus Standard (Impilicit) و Abaqus Explicit است که از پس بسیاری از مسائل پیچیده مهندسی برمی‌آید هرچند در پروژه‌های تحقیقاتی و صنعتی پیشرفته، امکانات محیط گرافیگی نرم‌افزار آباکوس (Abaqus) پاسخگو نیست. اینجاست که سابروتین‌های مبتنی بر فرترن وارد عمل می‌شوند. برای مثال سابروتین‌های DLOAD (برای بارهای متغیر با زمان و مکان)، USDFLD (برای تعریف متغیرهای میدانی)، DISP (برای شرایط مرزی پیچیده) UMAT (برای رفتار مکانیکی ماده) و UEL (برای تعریف فرمولاسیون المان) با زبان فرترن نوشته می‌شوند.

آموزش سابروتین نویسی در آباکوس (Abaqus)

در نرم‌افزار انسیس (ANSYS) نیز محدودیت‌ها به کمک قابلیت UPFs (User Programmable Features) و زبان فرترن برداشته می‌شود. معروف‌ترین سابروتین در این بخش USERMAT است که عملکردی مشابه UMAT در آباکوس دارد و برای تعریف روابط ساختاری (Constitutive Laws) دلخواه استفاده می‌شود. توسعه USERMAT نیازمند درک عمیقی از کامپایلر Intel Fortran و معماری فراخوانی توابع در حلگر انسیس است.

برای شروع سابروتین‌نویسی، نیازی نیست تمام جزئیات ربان برنامه نویسی فرترن و الگوریتم حل مسائل FEM را بدانید؛ اما تسلط بر موارد زیر الزامی است:

  • دستور IMPLICIT NONE: این دستور باید در خط اول هر سابروتینی قرار گیرد. بدون این دستور، فرترن بر اساس حرف اول متغیرها نوع آن‌ها را حدس می‌زند (مثلاً متغیرهایی که با I تا N شروع می‌شوند صحیح یا Integer فرض می‌شوند) که در معادلات حساس مکانیک جامدات، منجر به خطاهای فاجعه‌بار محاسباتی می‌شود.
  • مدیریت آرایه‌ها: درک تفاوت ماتریس‌های متقارن و نحوه ذخیره‌سازی آن‌ها (مانند تبدیل تانسور تنش ۶ مولفه‌ای به بردار) برای تخصیص بهینه حافظه ضروری است.
  • بلوک‌های COMMON و ماژول‌ها: برای انتقال داده‌های گلوبال بین سابروتین‌های مختلف (مثلاً انتقال یک فیلد دمایی به سابروتین متریال) از این ساختارها استفاده می‌شود.
مهندس میلاد وحیدیان
تصویر مهندس میلاد وحیدیان

نویسنده:
مهندس میلاد وحیدیان 
دانشجوی دکترای مهندسی مکانیک دانشگاه تهران

(برای مطالعه بیشتر روی نام یا تصویر ایشان کلیک کنید)