عدد کورانت (CFL) چیست و چگونه گام زمانی (Time Step) مناسب را انتخاب کنیم؟
چرا شبیهسازیهای وابسته به زمان (Transient) کرش میکنند؟
حدود ۵ سال پیش، روی پروژهی شبیهسازی انتشار آلودگی در یک پارکینگ طبقاتی کار میکردم. هندسه پیچیده بود و ددلاین پروژه، مثل همیشه بیخ گلومون! مشبندی را انجام دادم و دکمه Run را زدم. همه چیز خوب پیش میرفت تا اینکه بعد از حدود ۱۰ ساعت حل، ناگهان نمودار باقیماندهها (Residuals) به آسمان رفت و ارور معروف Floating Point Exception ظاهر شد. احتمالاً شما هم این صحنه دردناک را تجربه کردید.
اول فکر کردم مشکل از کیفیت مش است، اما بعد از بررسی دقیقتر متوجه شدم که گام زمانی (Time Step) را خیلی دستدلبازانه انتخاب کرده بودم! اینجاست که مفهومی به نام عدد کورانت(CFL) وارد بازی میشود. در حلهای گذرا یا همان Transient، برخلاف حلهای پایا (Steady)، ما با زمان سر و کار داریم و اگر سرعت جلو رفتن در زمان با سرعت جریان سیال هماهنگ نباشد، یا حل واگرا میشود یا نتایج کاملاً غلط از آب در میآیند. اگر با خطاهای عجیب و غریب در حل روبرو هستید، پیشنهاد میکنم حتماً نگاهی به مقاله ۷دلیل اصلی عدم همگرایی(Divergence) در فلوئنت بیندازید، اما قبل از آن، بیایید تکلیف CFL را روشن کنیم.

مفهوم فیزیکی عدد کورانت (CFL)؛ فراتر از یک فرمول ریاضی
بیایید از فرمولهای خشک ریاضی فاصله بگیریم. تصور کنید میخواهید از یک خیابان عبور کنید (سیال هستید) و این خیابان خطکشی عابر پیاده دارد (مشبندی یا Grid). عدد کورانت به زبان ساده میگوید: در هر “گام زمانی”، سیال شما اجازه دارد از چند خطکشی عبور کند؟
اگر عدد کورانت برابر ۱ باشد، یعنی سیال در هر گام زمانی، دقیقاً به اندازه طول یک سلول محاسباتی جلو میرود. اگر CFL بزرگتر از ۱ باشد، یعنی سیال در یک گام زمانی از روی چندین سلول میپرد و اطلاعات سلولهای میانی را نادیده میگیرد. در حلهای صریح (Explicit)، این کار ممنوع است چون باعث ناپایداری میشود، اما در روشهای ضمنی (Implicit) که معمولاً در انسیس فلوئنت استفاده میکنیم، دستمان بازتر است. اما چقدر بازتر؟ این همان نکتهای است که مرز بین یک مهندس حرفهای و یک اپراتور نرمافزار را مشخص میکند. 🧐
رابطه مثلثی سرعت، مش و گام زمانی (فرمول CFL)
برای اینکه بتوانیم کنترل حل را در دست بگیریم، باید فرمول ساده اما حیاتی کورانت را بشناسیم. عدد کورانت (C) با رابطه زیر تعریف میشود:
C=u⋅ΔtΔxC = \frac{u \cdot \Delta t}{\Delta x}C=Δxu⋅Δt
که در آن:
- uuu
: سرعت محلی سیال (Magnitude of Velocity)
- Δt\Delta tΔt
: گام زمانی (Time Step Size)
- Δx\Delta xΔx
: اندازه سلول شبکه (Mesh Size)
همانطور که میبینید، عدد کورانت (CFL) رابطه مستقیمی با گام زمانی و سرعت دارد و رابطه عکس با اندازه مش. یعنی اگر مش شما ریزتر شود (
Δx\Delta xΔx
کوچک شود)، برای ثابت نگه داشتن پایداری، مجبورید گام زمانی را هم کوچکتر کنید. این یکی از دلایلی است که همیشه میگوییم بیهوده مش را ریز نکنید! هزینه محاسباتی وحشتناک بالا میرود.
تفاوت حلگرهای صریح (Explicit) و ضمنی (Implicit) در تحمل CFL
اینجا جایی است که خیلیها اشتباه میکنند. در دانشگاه معمولاً به ما یاد میدهند که شرط پایداری کورانت-فریدریش-لوی (CFL Condition) این است که
C<1C < 1C<1
باشد. این حرف برای حلگرهای “صریح” (Density-Based Explicit) کاملاً درست است. اگر از این حلگرها استفاده میکنید (مثلاً برای شبیهسازی امواج شوک مافوق صوت)، عدد کورانت حتماً باید زیر ۱ باشد.
اما در اکثر پروژههای مهندسی مکانیک که ما در “سیمومک” انجام میدهیم، از حلگرهای “ضمنی” (Pressure-Based Implicit) استفاده میشود. این حلگرها پایداری بسیار بالاتری دارند و از نظر تئوری، ناپایداری غیرمشروط ندارند. یعنی میتوانید CFL های ۲۰، ۴۰ یا حتی بالاتر داشته باشید. البته این به معنی دقت بالا نیست! هرچقدر عدد کورانت بزرگتر شود، خطای زمانی (Temporal Error) بیشتر میشود و جزئیات گذرا (مثل نوسانات گردابهها) حذف میشوند.
چرا در انسیس فلوئنت با CFL بالای ۱ هم میتوان جواب گرفت؟
احتمالاً دیدید که در تنظیمات پیشفرض فلوئنت برای حلهای Steady، عدد کورانت گاهی روی ۲۰۰ یا حتی بالاتر تنظیم شده (در روش Coupled). دلیلش تکنیکهای ماتریسی قوی است که معادلات را به هم کوپل میکنند. برای درک بهتر مکانیک این حلگرها، بد نیست مقاله مقایسه الگوریتمهایSIMPLE، PISO وCoupled در فلوئنت را مطالعه کنید تا بدانید زیر پوست نرمافزار چه میگذرد.
در حلهای Transient با روش ضمنی، معمولاً توصیه میکنیم عدد کورانت را بین ۱ تا ۵ نگه دارید تا دقت حل حفظ شود. اگر دنبال دیدن پدیدههای خیلی سریع هستید (مثل انتشار صوت)، باید CFL نزدیک ۱ باشد، اما برای پر شدن مخزن یا انتقال حرارتهای کند، مقادیر بالاتر هم قابل قبول است.

انتخاب گام زمانی اولیه (Time Step Size)؛ قانون سرانگشتی یا محاسبه دقیق؟
خب، حالا رسیدیم به سوال اصلی: “چه عددی را در کادر Time Step Size وارد کنم؟”. من معمولاً در شروع پروژهها از این روش استفاده میکنم:
- تخمین سرعت ماکزیمم: حدس میزنم بیشترین سرعت در دامنه حل چقدر است (مثلاً ۲۰ متر بر ثانیه در ورودی).
- پیدا کردن ریزترین مش: کوچکترین سلول محاسباتی کجاست؟ (معمولاً نزدیک دیوارهها یا لبههای تیز). فرض کنیم ۱ میلیمتر (
- 0.0010.0010.001
متر).
- محاسبه معکوس: با فرض
- CFL=1CFL = 1CFL=1
، گام زمانی را حساب میکنم:
Δt=1×0.00120=0.00005 s\Delta t = \frac{1 \times 0.001}{20} = 0.00005 \text{ s}Δt=201×0.001=0.00005 s
این عدد
0.000050.000050.00005
ثانیه، نقطه شروع بسیار امنی است. بعد از اینکه حل پایدار شد، میتوانم آن را دو یا سه برابر کنم. هیچ وقت شانسی عدد ندهید! یکبار دیدم کارآموزی برای جریان آب داخل لوله، گام زمانی ۱ ثانیه گذاشته بود؛ در حالی که کل آب در ۰.۱ ثانیه از لوله رد میشد! عملاً نرمافزار هیچ فیزیکی را نمیدید.
استراتژی Adaptive Time Stepping؛ نجاتدهنده پروژههای طولانی
در طول ۷ سال تجربهام در شبیهسازیهای صنعتی، یکی از بهترین دوستانی که پیدا کردم، قابلیت “گام زمانی تطبیقی” یا Adaptive Time Stepping است. در بسیاری از پدیدهها، سرعت جریان در طول زمان تغییر میکند. مثلاً در لحظه باز شدن شیر، سرعت بالاست و نیاز به گام زمانی ریز دارید، اما بعد از چند ثانیه جریان آرام میشود.
اگر گام زمانی را ثابت و ریز نگه دارید، حل هفتهها طول میکشد. اگر درشت بگیرید، همان اول کار واگرا میشود. راه حل؟ تنظیمات Adaptive را فعال کنید و به نرمافزار بگویید: “سعی کن CFL را دور و بر ۳ نگه داری”. خود نرمافزار به صورت هوشمند
Δt\Delta tΔt
را کم و زیاد میکند. این تکنیک به خصوص در شبیهسازیهایی که فیزیک پیچیده دارند بسیار حیاتی است. مثلاً در شبیهسازی جریانهای دوفازی(Multiphase) با مدلVOF که سطح آزاد سیال به شدت حساس است، استفاده از گام زمانی ثابت تقریباً غیرممکن است.
تاثیر کیفیت مش بر محدودیتهای گام زمانی
یادتان هست گفتم
Δx\Delta xΔx
در مخرج کسر است؟ این یعنی یک سلول بیکیفیت و خیلی ریز (مثلاً یک سلول با Skewness بالا که له شده)، میتواند کل حل شما را خراب کند. آن یک دانه سلول خراب، باعث میشود عدد کورانت لوکال در آن نقطه منفجر شود و شما مجبور شوید گام زمانی کل دامنه را به خاطر همان یک سلول، پایین بیاورید.
پس قبل از اینکه به جان تنظیمات حلگر بیفتید، مطمئن شوید که مش یکنواختی دارید. در تحلیلهای حساس، کیفیت مش حرف اول را میزند. (یک نکته کنکوری: همیشه مینیمم سایز مش را چک کنید، نه فقط اوریج را).
جدول راهنمای انتخاب CFL و گام زمانی برای جریانهای مختلف
برای اینکه کارتان راحتتر شود، این جدول تجربی را که حاصل پروژههای مختلف در سیمومک بوده، برایتان آماده کردم. این اعداد وحی منزل نیستند ولی راهنمای خوبیاند:
| نوع جریان | حلگر پیشنهادی | محدوده CFL پیشنهادی | نکته کلیدی |
| آیرودینامیک تراکمناپذیر | Pressure-Based (Coupled) | 5 – 20 | همگرایی سریع مهمتر از جزئیات ریز زمانی است |
| جریانهای دوفازی (VOF) | PISO / Coupled | 0.5 – 2 | سطح مشترک به شدت به CFL حساس است |
| توربوماشین (Rotor-Stator) | Coupled / SIMPLE | 1 – 10 | بستگی به سرعت دورانی دارد |
| احتراق و واکنش شیمیایی | Pressure-Based | < 1 | پایداری واکنشها نیاز به گامهای ریز دارد |
| جریان تراکمپذیر (Shock) | Density-Based Explicit | < 0.9 | شرط پایداری سختگیرانه |
تشخیص خطای CFL در نمودار باقیماندهها (Residuals)
گاهی اوقات ارور مشخصی نمیگیرید، اما حل “بازی” میکند. نمودار باقیماندهها به جای اینکه پایین برود، شروع به نوسان سینوسی میکند یا روی یک عدد بالا گیر میکند (Stall). اگر دیدید نمودارها نوسانات منظمی دارند، شک نکنید که گام زمانیتان بزرگ است.
در نرمافزاری مثل Fluent، میتوانید کانتور Cell Courant Number را رسم کنید. اگر دیدید در نواحی غیرحساس (مثلاً وسط جریان آرام) CFL بالاست، مشکلی نیست. اما اگر در نواحی مهم مثل لایه مرزی یا محل جداشدگی جریان، CFL قرمز (بسیار بالا) بود، باید فکری به حال
Δt\Delta tΔt
بکنید. برای درک بهتر نحوه قضاوت روی نمودارها، مقاله آیا کاهش باقیماندهها(Residuals) برای همگرایی کافی است؟ نکات جالبی دارد.
نقش عدد کورانت در شبیهسازیهای چندفازی
در شبیهسازیهای چندفازی، به خصوص مدل VOF که برای ردیابی سطح آب و هوا استفاده میشود، عدد کورانت حکم مرگ و زندگی را دارد. الگوریتمهای بازسازی سطح (Geo-Reconstruct) فقط زمانی درست کار میکنند که سطح سیال در هر گام، فقط وارد سلول همسایه شود، نه اینکه از سه تا سلول بپرد!
اگر در پروژههای سد شکسته یا پاشش سوخت کار میکنید، حواستان باشد که اینجا نمیتوانید مثل جریان تکفازی عمل کنید. اینجا ماکزیمم CFL مجاز معمولاً زیر ۱ (اغلب ۰.۵) در نظر گرفته میشود.
چالشهای مش دینامیک و تغییرات ناگهانی CFL
وضعیت وقتی پیچیدهتر میشود که هندسه شما حرکت کند. مثلاً حرکت پیستون در سیلندر یا پره توربین بادی. در اینجا علاوه بر سرعت سیال، سرعت حرکت مش (Grid Velocity) هم داریم. وقتی سلولها جمع یا کشیده میشوند،
Δx\Delta xΔx
تغییر میکند و طبق فرمول، CFL هم تغییر میکند.
در این موارد، استفاده از روشهای Smoothing یا Remeshing ضروری است تا اندازه سلولها از کنترل خارج نشود. اگر علاقهمند به این مبحث پیشرفته هستید، حتماً سری به مطلب آموزش مش دینامیک(Dynamic Mesh) برای شبیهسازی قطعات متحرک بزنید که در آنجا مفصل درباره تنظیمات Remeshing صحبت کردهایم. ⚠️
خدمات تخصصی سیمومک در بهینهسازی کدهای محاسباتی
ما در سیمومک (Simumech) فقط اپراتور نرمافزار نیستیم؛ ما مهندسانی هستیم که فیزیک مسئله را درک میکنیم. اگر پروژهای دارید که زمان حل آن غیرمنطقی طولانی شده یا مدام با خطای واگرایی روبرو میشوید، تیم ما میتواند در بخشهای زیر به شما کمک کند:
- انجام کامل پروژههای CFD: از مشبندی تا تحلیل نتایج با گزارشهای معتبر صنعتی.
- دیباگ و رفع خطای شبیهسازی: بررسی ستاپ شما و رفع مشکلات ناپایداری و همگرایی.
- توسعه کدهای UDF: برای زمانی که تنظیمات پیشفرض نرمافزار پاسخگو نیست.
- مشاوره انتخاب سختافزار: برای راندمان ماکزیمم در حلهای سنگین.
- شبیهسازیهای پیشرفته: شامل FSI، جریانهای واکنشی و آکوستیک.
جمعبندی؛ تعادل بین دقت و سرعت همگرایی
در نهایت، انتخاب عدد کورانت (CFL) و گام زمانی، یک هنر است؛ هنر ایجاد تعادل بین “دقت نتایج” و “هزینه محاسباتی”. به عنوان کسی که شبهای زیادی را پای مانیتور منتظر تمام شدن نوار پرگرسبار مانده، به شما توصیه میکنم همیشه محافظهکارانه شروع کنید (CFL پایین) و وقتی از پایداری حل مطمئن شدید، گام زمانی را افزایش دهید. هیچ وقت کیفیت را فدای سرعت نکنید، چون نتیجهی سریع اما غلط، به هیچ دردی نمیخورد.
اگر هنوز سوالی در مورد تنظیمات Time Step دارید یا نمودارهای باقیماندهتان رفتار عجیبی دارند، نگران نباشید؛ این بخشی از مسیر یادگیری CFD است که همه ما طی کردهایم.
رابطه پنهان ضرایب زیر-تغییر (Under-Relaxation) و گام زمانی
خیلی وقتها پیش میآید که گام زمانی را به درستی محاسبه کردهاید و عدد کورانت هم در محدوده امن است، اما باز هم حل ناپایدار میشود. اینجا پای یک متهم دیگر در میان است: “ضرایب Under-Relaxation”. اگر گام زمانی را پدال گاز ماشین در نظر بگیریم، این ضرایب مثل سیستم فنربندی و تعلیق هستند.
وقتی در حلهای گذرا (Transient) از گام زمانی بزرگ استفاده میکنید (CFL بالا)، تغییرات متغیرها در هر تکرار داخلی (Inner Iteration) میتواند خیلی شدید باشد. کم کردن این ضرایب به حلگر کمک میکند تا تغییرات را آرامتر اعمال کند. البته این کار یک تیغ دو لبه است؛ اگر زیادی کمشان کنید، حل کند میشود. برای تسلط بر این “پیچهای تنظیم”، پیشنهاد میکنم مقاله ضرایبUnder-Relaxation در فلوئنت چیست و چگونه با آنها از واگرایی جلوگیری کنیم؟ را حتماً مطالعه کنید تا بدانید چه زمانی باید سراغشان بروید.
تست استقلال از گام زمانی (Time Step Independence Study)؛ شرط لازم برای دفاع
یکی از درسهای سختی که در سال دوم فعالیتم گرفتم، رد شدن نتایج شبیهسازیام توسط کارفرما بود، فقط به این دلیل که “تست استقلال از گام زمانی” را انجام نداده بودم. او پرسید: “از کجا معلوم اگر
Δt\Delta tΔt
را نصف کنی، نتایجت عوض نشود؟” و من جوابی نداشتم!
در پروژههای حرفهای سیمومک، ما یک قانون داریم: نتایج نهایی زمانی قابل استناد هستند که با ریز کردن گام زمانی، تغییر محسوسی نکنند. مثلاً اگر با
Δt=0.01\Delta t = 0.01Δt=0.01
ضریب درگ ۱.۵ شد، با
Δt=0.005\Delta t = 0.005Δt=0.005
هم باید حدود ۱.۵ باشد. اگر عدد عوض شد، یعنی گام زمانی اولیهتان هنوز به اندازه کافی کوچک نبوده است. این بخشی از فرآیند استانداردسازی است که در مطلب راهنمای جامع اعتبارسنجی(Validation) و صحتسنجی(Verification) در شبیهسازیCFD به طور کامل دربارهاش بحث کردهایم. بدون این تست، نتایج شما فقط یک سری “نقاشی رنگی” است، نه مهندسی!
تلههای محاسباتی در جریانهای تراکمپذیر و مافوق صوت
داستان برای جریانهای سرعت بالا (High Speed Flows) کاملاً متفاوت است. وقتی عدد ماخ (Mach) بالا میرود و امواج شوک تشکیل میشوند، اطلاعات نمیتوانند خلاف جهت جریان حرکت کنند. اینجا معمولاً از حلگرهای Density-Based Explicit استفاده میکنیم.
در این حالت، شوخی نداریم! عدد کورانت (CFL) باید اکیداً کمتر از ۱ باشد (معمولاً ۰.۸ یا ۰.۹). اگر حتی در یک سلول CFL به ۱.۱ برسد، حل منفجر میشود. یادم میآید در شبیهسازی یک نازل همگرا-واگرا، مجبور شدیم گام زمانی را تا
10−710^{-7}10−7
ثانیه پایین بیاوریم. اینجاست که صبر ایوب و سختافزار قوی لازم میشود.
هزینه سختافزاری ریز کردن
Δt\Delta tΔt
؛ وقتی سیستم کم میآورد
بیایید واقعبین باشیم؛ همه دوست دارند گام زمانی
10−610^{-6}10−6
بگذارند تا خیالشان راحت باشد، اما آیا سیستم شما میکشد؟ هرچقدر
Δt\Delta tΔt
ریزتر شود، تعداد کل گامهای زمانی برای رسیدن به یک زمان فیزیکی مشخص (مثلاً ۵ ثانیه) بیشتر میشود.
این یعنی زمان ران (Run Time) طولانیتر و فایلهای دیتای حجیمتر. بارها شده که وسط یک شبیهسازی سنگین، هارد دیسک پر شده و کل زحمات چند روزه به باد رفته است. بنابراین، انتخاب گام زمانی فقط یک بحث فیزیکی نیست، یک بحث مدیریتی منابع هم هست. اگر قصد دارید سیستمتان را برای پروژههای سنگین ارتقا دهید، حتماً قبل از خرید، راهنمای کامل انتخاب سختافزار(CPU, RAM, GPU) برای شبیهسازیهایCFD را بررسی کنید تا پولتان را دور نریزید.
تنظیمات ذخیرهسازی خودکار (Autosave)؛ کمربند ایمنی شما
حالا که گام زمانی مناسب را پیدا کردید، یک نکته اجرایی بسیار مهم را فراموش نکنید: تنظیم فرکانس Autosave. اگر گام زمانی شما خیلی ریز است (مثلاً ۱۰,۰۰۰ گام زمانی دارید)، لازم نیست همه را ذخیره کنید. حجم دیتا وحشتناک میشود.
اما از طرفی، اگر هر ۱۰۰۰ گام ذخیره کنید و برق برود یا سیستم کرش کند، بخش زیادی از حل را از دست میدهید. من معمولاً جوری تنظیم میکنم که حداقل هر ۱ ساعت کاری سیستم، یک فایل ذخیره شود. محاسبهاش ساده است: ببینید حل هر گام چقدر طول میکشد و ضرب و تقسیم کنید. این ریزهکاریهاست که فرق یک کاربر باتجربه و مبتدی را مشخص میکند. 😉
لیست خدمات مهندسی مکانیک و شبیهسازی سیمومک
در “سیمومک”، ما طیف وسیعی از خدمات تخصصی را برای صنایع و پژوهشگران ارائه میدهیم. تمرکز ما فقط بر روی ران کردن نرمافزار نیست، بلکه حل چالش مهندسی شماست. برخی از خدمات کلیدی ما عبارتند از:
- شبیهسازی دینامیک سیالات محاسباتی (CFD):
- تحلیل جریانهای آشفته، احتراق و انتقال حرارت.
- شبیهسازی جریانهای چندفازی (Multiphase) و سطح آزاد.
- تحلیل آیرودینامیک خارجی (خودرو، پرنده، ساختمان).
- تهویه مطبوع و جریان در محیطهای بسته (HVAC).
- تحلیل جامداتی و اجزای محدود (FEM):
- تحلیل تنش و کرنش استاتیکی و دینامیکی با Abaqus و Ansys.
- شبیهسازی ضربه، انفجار و شکلدهی فلزات.
- تحلیل خستگی و شکست قطعات صنعتی.
- خدمات کدنویسی و توسعه:
- نوشتن کدهای UDF/UDS برای فلوئنت.
- اسکریپتنویسی پایتون و متلب برای پردازش نتایج.
- مشاوره و منتورینگ:
- رفع خطاهای همگرایی و بهینهسازی تنظیمات حلگر.
- مشاوره در نگارش بخش فنی گزارشهای صنعتی و مقالات.
با عدد کورانت دوست باشید، نه دشمن!
در نهایت، شبیهسازیهای وابسته به زمان (Transient) ذاتاً چالشبرانگیز هستند. هیچ فرمول جادویی وجود ندارد که برای همه مسائل کار کند. شما باید با آزمون و خطا، درک فیزیک مسئله و البته نظارت دقیق بر روی نمودارها، “نقطه شیرین” (Sweet Spot) تنظیمات را پیدا کنید.
به یاد داشته باشید که عدد کورانت (CFL) صرفاً یک عدد خشک ریاضی نیست؛ بلکه شاخصی است که نشان میدهد جریان اطلاعات در دامنه حل شما چقدر روان حرکت میکند. با رعایت نکاتی که در این مقاله گفتیم و کمی صبر و حوصله، میتوانید بر سرکشترین شبیهسازیها هم لگام بزنید و نتایج قابل اعتمادی بگیرید.