زبان برنامه نویسی فرترن (Fortran)
بان برنامهنویسی فرترن (Fortran) ممکن است در دنیای توسعه وب یا اپلیکیشنهای موبایل جایگاهی نداشته باشد، اما وقتی صحبت از محاسبات عددی سنگین مهندسی به میان میآید، فرترن همچنان پادشاه بلامنازع است. برای مهندسان مکانیک، تسلط بر فرترن یک مهارت جانبی نیست؛ بلکه کلید ورود به دنیای بیکران شبیهسازیهای پیشرفته در نرمافزارهایی مانند آباکوس (Abaqus) و انسیس (ANSYS) است.
زبان برنامه نویسی فرترن (Fortran) در سال 1957 برای محاسبات علمی (scientific calculations) توسط IBM توسعه یافت. فرترن (Fortran) در ابتدا زبان برنامه نویسی سطح پایین (low-level) بود که در بروزرسانیهای خود به زبان برنامه نویسی سطح بالا (high-level) تبدیل شد. زبانهای برنامه نویسی سطح پایین مثل اسمبلی (assembly) بسیار نزدیک به زبان ماشین یا کامپیوتر هستند در حالیکه زبانهای برنامه نویسی سطح بالا مثل متلب (MATLAB)، پایتون (Python) و … بسیار شبیه به زبان انسان هستند.
در این مقاله از سایت مکادمی (Mecademy)، به طور جامع بررسی میکنیم که چرا یادگیری فرترن برای یک تحلیلگر المان محدود (FEM) ضروری است و چگونه میتوانید از آن برای نوشتن سابروتینهای پیچیده استفاده کنید.
- زبان برنامه نویسی فرترن (Fortran)
- چرا فرترن (Fortran)؟ راز بقای یک زبان کلاسیک
- کامپایلرهای (compilers) زبان برنامه نویسی فرترن (Fortran)
- انواع فایل در فرترن (File Extensions in Fortran)
- انواع داده (Data Type) در زبان برنامه نویسی فرترن (Fortran)
- توابع ذاتی یا از پیش تعریف شده (Intrinsics Function) در فرترن (Fortran)
- سابروتینهای ذاتی یا از پیش تعریف شده (Intrinsics Subroutine) در فرترن (Fortran)
- نوشتن تابع توسط کاربر (User-defined Function) در فرترن (Fortran)
- نوشتن سابروتین توسط کاربر (User-defined Subroutine) در فرترن (Fortran)
- کاربرد فرترن (Fortran) در سابروتیننویسی آباکوس (Abaqus)
- کاربرد فرترن (Fortran) در سابروتیننویسی انسیس (ANSYS)
- مفاهیم حیاتی فرترن (Fortran) برای تحلیلگران FEM
چرا فرترن (Fortran)؟ راز بقای یک زبان کلاسیک
فرترن (Fortran) مخفف Formula Translation است. این زبان برنامه نویسی در دهه ۱۹۵۰ برای انجام محاسبات ریاضی و مهندسی متولد شد. دلیل اینکه نرمافزارهای غولپیکری مانند Abaqus ،ANSYS و LS-DYNA هسته محاسباتی (solver) خود را بر پایه فرترن بنا کردهاند، دو ویژگی کلیدی است:
- سرعت پردازش بینظیر: کامپایلرهای (compilers) فرترن بهینهسازیهای ریاضیاتی فوقالعادهای انجام میدهند که در محاسبات ماتریسی عظیم (مانند حل ماتریس سفتی (stiffness) در روش اجزای محدود) سریعتر از C++ یا پایتون عمل میکنند.
- مدیریت عالی آرایهها (arrays): در مکانیک محیطهای پیوسته (continuum mechanics)، همهچیز با تانسورها و ماتریسها سر و کار دارد. فرترن به صورت ذاتی برای عملیات روی آرایههای چندبعدی بهینهسازی شده است.
کامپایلرهای (compilers) زبان برنامه نویسی فرترن (Fortran)
کاربران ایدهها و اهداف خود را توسط یکی از زبانهای برنامه نویسی پیاده سازی میکنند سپس زبان برنامه نویسی توسط مترجم (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 عرضه کرد و به پشتیبانی خود به کامپایلر کلاسیک اینتل فرترن خاتمه داد.
انواع فایل در فرترن (File Extensions in Fortran)
برنامههای فرترن به صورت fixed-form و free-form نوشته میشوند. فایلهای f.* و for.* به صورت fixed-form نوشته میشوند که ساختار اولیه و تاریخی فرترن است. این فرمت هنوز در سابروتین نویسی در آباکوس کاربرد دارد. فایلهای f90 و f95 از جمله ساختارهای free-form هستند که امروزه بیشتر استفاده میشوند.
ساختار fixed-form در فرترن (Fortan)
در ساختار fixed-form ستون اول میتواند خالی باشد یا عبارت C به معنای کامنت بودن آن خط قرار گیرد. ستونهای 2-5 برای لیبلگذاری برنامه است. ستون ششم اگر پر باشد به معنای آن است که کدها ادامه خط قبلی هستند. ستون 7-72 برای نوشتن برنامه است و بعد از خط 72 خوانده نمیشود. ساختار fixed-form به گذشتههای دور بر میگردد که کدها بر روی صفحات پانج میشدند، برای همین است که امروزه معمولا fixed-form منسوخ شده است. از معدود جاهایی که نیاز است از ساختار fixed-form استفاده شود، سابروتین نویسی در نرم افزار المان محدود آباکوس (Abaqus) است. با نوشتن عبارت DIR$ FREEFORM میتوان کامپایلر را راهنمایی نمود که از free-form به جای fixed-form استفاده شده است.
ساختار free-form در فرترن (Fortan)
بر خلاف ساختار fixed-form، ساختار free-form محدودیت خاصی ندارد و کدها را میتوان از ستون اول نوشت. امروزه معمولا ساختار free-form در فرترن (Fortan) استفاده میشود.
انواع داده (Data Type) در زبان برنامه نویسی فرترن (Fortran)
دادههای تعریف شده موجود در فرترن (Fortran) به شرح زیر است:
- داده متنی (Character type)
- دادههای عددی (Numeric types)
- داده منطقی یا بولین (Logical type)
علاوه بر این دادههای از پیش تعریف شده (Intrinsic Data Types) در فرترن (Fortran)، کاربر با توجه به نیازهای خود میتواند دادههای دیگری نیز تولید کند.
داده متنی یا کاراکتر (Character type)
برای ذخیره اسمها در زبانهای برنامه نویسی از دیتای کاراکتر (Character) یا رشته (String) استفاده میشود. این متن داخل سینگل کوتیشن (single quotation) مثل ‘Mecademy’ یا دابل کوتیشن (double quotation) مثل “Mecademy” نوشته میشود.

دادههای عددی (Numeric types)
دادههای عددی در فرترن میتواند اسکالر (scaler) یا آرایه (array) باشند و یکی از انواع اعداد زیر باشند.
- اعداد صحیح (Integer)
- اعداد حقیقی یا اعشاری (real)
- اعداد مختلط (complex)

داده منطقی یا بولین (Logical type)
دیتای منطقی (logical) یا بولین (boolean) به دو حالت true یا false است و بیشتر در عبارات شرطی (conditional statement) استفاده میشوند.
توابع ذاتی یا از پیش تعریف شده (Intrinsics Function) در فرترن (Fortran)
در زبان برنامه نویسی فرترن (Fortran) تابع دارای چند ورودی و یک خروجی هست. فراخوانی توابع ذاتی فرترن بدین ترتیب است.
output = functionName(arg1, arg2, arg3 …)
| Description | Function |
| Dot product of 2 rank-one arrays | DOT_PRODUCT |
| Matrix multiplication | MATMUL |
| Transpose of an array of rank two | TRANSPOSE |
| Reshape an array | RESHAPE |
| Replicate array by adding a dimension | SPREAD |
| Array allocation status | ALLOCATED |
| Lower dimension bounds of an array | LBOUND |
| Shape of an array (or scalar) | SHAPE |
| Upper dimension bounds of an array | UBOUND |
| Maximum value in an array | MAXVAL |
| Minimum value in an array | MINVAL |
| Location of first maximum value in an array | MAXLOC |
| Location of first minimum value in an array | MINLOC |
| Product of array elements | PRODUCT |
| Sum of array elements | SUM |
سابروتینهای ذاتی یا از پیش تعریف شده (Intrinsics Subroutine) در فرترن (Fortran)
در زبان برنامه نویسی فرترن (Fortran) سابروتین (subroutine) دارای چند ورودی و چندین خروجی هستند به نحوی که میتوان خروجیهای سابروتین را بر حسب ورودیهای سابروتین تعریف و حتی ورودیهای سابروتین را ویرایش کرد. برای فراخوانی سابروتینهای ذاتی یا از پیش تعریف شده در فرترن کافی قبل از اسم سابروتین و آرگمانهای آن عبارت call نوشته شود. بنابراین فراخوانی سابروتینهای ذاتی فرترن بدین ترتیب است.
call subroutineName(arg1, arg2, arg3 …)
نوشتن تابع توسط کاربر (User-defined Function) در فرترن (Fortran)
بهتر است کل برنامه را به قسمتهای کوچکتر تبدیل کرد تا خوانایی و توسعه برنامه و دیباگ کردن آن سادهتر شود. این قسمتها میتوانند به صورت تابع نویسی توسط کاربر (User-defined Function) انجام یا سابروتین نویسی توسط کاربر (User-defined Subroutine) انجام شود. نحوه نوشتن تابع توسط کاربر در زبان برنامه نویسی فرترن مطابق تصویر زیر است.

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

کاربرد فرترن (Fortran) در سابروتیننویسی آباکوس (Abaqus)
نرمافزار آباکوس دارای دو حلگر قدرتمند Abaqus Standard (Impilicit) و Abaqus Explicit است که از پس بسیاری از مسائل پیچیده مهندسی برمیآید هرچند در پروژههای تحقیقاتی و صنعتی پیشرفته، امکانات محیط گرافیگی نرمافزار آباکوس (Abaqus) پاسخگو نیست. اینجاست که سابروتینهای مبتنی بر فرترن وارد عمل میشوند. برای مثال سابروتینهای DLOAD (برای بارهای متغیر با زمان و مکان)، USDFLD (برای تعریف متغیرهای میدانی)، DISP (برای شرایط مرزی پیچیده) UMAT (برای رفتار مکانیکی ماده) و UEL (برای تعریف فرمولاسیون المان) با زبان فرترن نوشته میشوند.
آموزش سابروتین نویسی در آباکوس (Abaqus)
کاربرد فرترن (Fortran) در سابروتیننویسی انسیس (ANSYS)
در نرمافزار انسیس (ANSYS) نیز محدودیتها به کمک قابلیت UPFs (User Programmable Features) و زبان فرترن برداشته میشود. معروفترین سابروتین در این بخش USERMAT است که عملکردی مشابه UMAT در آباکوس دارد و برای تعریف روابط ساختاری (Constitutive Laws) دلخواه استفاده میشود. توسعه USERMAT نیازمند درک عمیقی از کامپایلر Intel Fortran و معماری فراخوانی توابع در حلگر انسیس است.
مفاهیم حیاتی فرترن (Fortran) برای تحلیلگران FEM
برای شروع سابروتیننویسی، نیازی نیست تمام جزئیات ربان برنامه نویسی فرترن و الگوریتم حل مسائل FEM را بدانید؛ اما تسلط بر موارد زیر الزامی است:
- دستور IMPLICIT NONE: این دستور باید در خط اول هر سابروتینی قرار گیرد. بدون این دستور، فرترن بر اساس حرف اول متغیرها نوع آنها را حدس میزند (مثلاً متغیرهایی که با I تا N شروع میشوند صحیح یا Integer فرض میشوند) که در معادلات حساس مکانیک جامدات، منجر به خطاهای فاجعهبار محاسباتی میشود.
- مدیریت آرایهها: درک تفاوت ماتریسهای متقارن و نحوه ذخیرهسازی آنها (مانند تبدیل تانسور تنش ۶ مولفهای به بردار) برای تخصیص بهینه حافظه ضروری است.
- بلوکهای
COMMONو ماژولها: برای انتقال دادههای گلوبال بین سابروتینهای مختلف (مثلاً انتقال یک فیلد دمایی به سابروتین متریال) از این ساختارها استفاده میشود.
نویسنده:
مهندس میلاد وحیدیان
دانشجوی دکترای مهندسی مکانیک دانشگاه تهران
(برای مطالعه بیشتر روی نام یا تصویر ایشان کلیک کنید)
