
چگونه در CFD به جواب درست برسیم؟ قسمت سوم: Monitoring
تست شده در همه نسخه ها
در قسمت سوم و شاید آخرین قسمت از سری پست های “چگونه در CFD به جواب درست برسیم؟” به اهمیت Monitoring در CFD و همچنین نحوه انجام این کار در اپنفوم می پردازیم.
مانیتورینگ یعنی مشاهده لحظه به لحظه یک مقدار در حین حل CFD نسبت به زمان مساله. برای مثال فرض کنید شما در حال حل جریان حول یک استوانه هستید. همونطور که می دونید، در رینولدزهای بالاتر از حدود 47 در پشت استوانه گردابه های فون کارمن تشکیل میشه. اما اگر تابحال این شبیه سازی رو در CFD انجام داده باشید، متوجه خواهید شد که چنین اتفاقی در ابتدای حل رخ نمیده. ابتدا جریان به سیلندر برخورد می کنه، سپس دو گردابه بزرگ حبابی شکل به صورت متقارن در پشت استوانه تشکیل میشند و در نهایت به تدریج با انحراف یکی از این حباب ها، فرآیند تشکیل گردابه ها شروع میشه. اگر شما قبل از شروع تشکیل گردابه ها حل رو متوقف بکنید، یعنی به چیزی می خواستید، هنوز دست پیدا نکردید. پس چطور می تونیم در حین حل ببینیم که آیا تشکیل گردابه ها آغاز شده یا نه. آیا هنوز باید حل رو ادامه بدیم؟
مانیتورینگ انواع مختلفی داره. از مانیتورینگ ضرایب نیرو گرفته تا مقدار نقطه ای یک پارامتر در میدان و یا مینیموم و ماکزیموم یک مقدار در یک قسمت از میدان. اپنفوم کتابخانه های بسیار خوبی در این زمینه داره. مانیتورینگ در حقیقت یک قسمت از کتابخانه های اپنفوم به نام Function Object رو تشکیل میده. این توابع از تنوع بسیار خوبی در اپنفوم استاندارد برخوردار هست. لیستی از این توابع رو می تونین در اینجا مشاهده کنید. همونطور که می بینید جدول اول مربوط به مانیتورینگ هست.
برای انجام مانیتورینگ شما لازم هست تا کدهایی رو به انتهای فایل controlDict کیس خودتون اضافه بکنید. در اینجا دو تا از معروف ترین این توابع رو معرفی میکنیم: Probes و forceCoeffs. تابع اول برای مشاهده مقدار نقطه ای یک پارامتر در میدان و تابع دوم برای مشاهده ضرایب نیرو مورد استفاده قرار میگیره.
فرض کنید شما در حال بررسی جریان حول یک ساختمان هستید. از طرفی می خواهید ببینید که کی جریان به حالت پایا می رسد. کافیست چند نقطه در آشفته ترین قسمت جریان (که معمولا در قسمت Wake قرار دارد) قرار بدید. اگر این نقطات به حالت پایا برسند به احتمال زیاد نقاط دیگر نیز پایا خواهند بود. مثلا فرض کنید مختصات این نقطات برابر با (0 10 20) و (0 12 20) هست. در این صورت ما می تونیم یک تابع برای بررسی پارامترهای U و p در این نقطه ایجاد کنیم:
functions { sampleProbes { type probes; functionObjectLibs (“libsampling.so”); outputControl timeStep; outputInterval 1; probeLocations ( ( 5 0 0 ) ( 5 2 0 ) ); fields ( p U ); } }
می بینید که تعریف بسیار سادست. کافیست کد بالا را به فایل controlDict خود اضافه کنید. حالا اگر مساله خودتون رو ران بگیرید پوشه ای به نام postProcessing در کیس ایجاد خواهد شد که حاوی اطلاعات مورد نیاز شما نسبت به زمان است. مثلا:
# x 5 5 # y 0 2 # z 0 0 # Time 500.01 -0.0875522 0.00702798 500.02 -0.0866702 0.00655631 500.03 -0.0865122 0.00707015 500.04 -0.0862972 0.00777086 500.05 -0.086109 0.00817497 500.06 -0.0862912 0.00857671 500.07 -0.0865082 0.00915009 500.08 -0.0862369 0.00928144 500.09 -0.086376 0.010004 500.1 -0.0858055 0.00996871 500.11 -0.0857879 0.0103417 500.12 -0.0856697 0.0107954 500.13 -0.0858442 0.0113391 ...
شما می تونید این داده ها را با استفاده از gnuplot رسم کنید. بسیار ساده. یک اسکریپت gnuplot آماده کنید و کد زیر را داخل آن قرار بدید. اسم فایل رو هم مثلا بگذارید plot.
set title "Diagram" set ylabel 'p (Pa)' set xlabel 'Time' plot "postProcessing/sampleProbes/0/p" using 1:2 title 'Point (5 0 0)' with line,\ "postProcessing/sampleProbes/0/p" using 1:3 title 'Point (5 2 0)' with line pause 1 reread
حالا خیلی راحت از کیس اصلی دستور زیر رو در حین حل (از یک ترمینالی به غیر از ترمینالی که در حال ران کردن مساله شماست) نمودار رو رسم کنید:
gnuplot plot
می بینید که در حین حل، نمودار برای شما رسم خواهد شد. هروقت نمودار به حالت ثابت و یا پریودیک رسید یعنی جریان شما در این قسمت پایا شده.
برای کنسل کردن نمودار باید از Ctrl+C استفاده کنید.
تابع دیگر forceCoeffs نام دارد. مساله جریان حول استوانه را که در ابتدا گفتیم به یاد بیاورید. می خواهیم ضرایب درگ و لیفت روی استوانه را مانیتور کنیم. بنابراین داریم:
forcesCoeffs { type forceCoeffs; //type forces; functionObjectLibs ( "libforces.so" ); outputControl timeStep; timeInterval 10; log no; patches ( cylinder ); pName p; UName U; rhoName rhoInf; // Indicates incompressible log true; rhoInf 1000; // Redundant for incompressible liftDir (0 1 0); dragDir (1 0 0); CofR (0 0 0); // Axle midpoint on ground pitchAxis (0 0 1); magUInf 1; lRef 1; // Wheelbase length Aref 1; // Estimated }
کد بالا رو در داخل دیکشنری functions در فایل controlDict قرار میدیم. به مقادیر موجود در تابع توجه کنید. این مقادیر را باید حتما با توجه به مساله خودتون تغییر بدید. بعد از ران و همانند قبل و با تنظیم یک فایل اسکریپت gnuplot می تونید نمودار زیبای زیر رو بعد از یک مدت مشاهده بکنید:
نکته آخر اینکه شاید شما قبل از ران کردن کیس فراموش کردید تا Function Object رو در نظر بگیرید. در این صورت می تونید خیلی راحت با استفاده از دستور زیر فقط Function Object های تازه اضافه شده رو از زمان ابتدا تا انتها سریعا ران کنید. البته در این حالت شاید شما بپرسید چطور با عدم تمام شدن حل و عدم وجود اطلاعات در دسترس، اپنفوم قصد استخراج اطلاعات مربوط به هر تایم استپ را دارد؟ اتفاقا حق با شماست. اپنفوم چنین کاری نمی تونه انجام بده. اپنفوم فقط اطلاعات مربوط به گام های زمانی رو استخراج می کنه که در دیسک رایت شدند. Write Interval که در ControlDict یادتون هست؟
execFlowFunctionObjects
بنابراین اگر نیاز به رسم نمودار خیلی خوب دارید و Write Interval های شما در حین ران خیلی ریز نبودند، باید بگم که شما مجبورید دوباره ران بگیرید و اینبار از Function Object در ControlDict استفاده بکنید.
فینیشد. شاد باشد.
قهوه قراموش نشود 😉
7 دیدگاه. ارسال دیدگاه جدید
بسیار جالب بود
بسیار مفید بود.
منتظر مطالب بعدی هستیم!!
سلام استاد
من امروز با این سایت آشنا شدم. ازتون ممنونم که بهمون کمک میکنید. لطفا مطالب بیشتری بذارین. خیلی ممنون
سلام. البته من استاد نیستم.
خواهش می کنم. امیدوارم وقت بکنم مطالب بیشتری بگذارم.
ممنون از شما.
سلام متشکرم از مطلبتون. متاسفانه قسمت دوم رو پیدا نمیکنم.
پیدا شد 😀
سلام
خسته نباشید اگر مقدور هست این مراحل رو برای اپن فوم تحت ویندوز هم ارایه کنید ممنونم