مقالات  >  دینامیک سیالات محاسباتی (CFD)  >  ژورنال نویسی با استفاده از نرم‌افزار ANSYS Fluent

ژورنال نویسی با استفاده از نرم‌افزار ANSYS Fluent

یکی از مشکلاتی که کاربران نرم‌افزار ANSYS Fluent با آن مواجه هستند این است که برای مسایل و مدل‌های بزرگ و پیچیده فرآیند تنظیمات مساله برای مدل‌های مختلف را باید تکرار کنند. به عنوان مثال زمانی که تنظیمات مشابهی را برای مدل‌های مختلف اعمال می‌کنند (مثلا زمانی که مدل شامل شرط مرزی‌های زیاد باشد)، استفاده از فایل ژورنال می‌تواند پروسه تنظیمات مساله را بدون اشتباه و در زمان اندک انجام دهد. همچنین از کاربردهای فایل ژورنال می‌توان به این مورد اشاره کرد که در جاهایی که امکان پردازش مساله توسط ابررایانه‌ها وجود دارد به جای آپلود چند فایل برای بررسی پارامترهای مختلف یا دانلود و آپلود مجدد فایل برای تغییر پارامترها، می‌توان کل تنظیمات را از خواندن مش تا گرفتن خروجی از مساله را در فایل ژورنال انجام داد.

فایل ژورنال یک سری متوالی از دستورهای ANSYS Fluent است که یا بصورت تعاملی و از طریق واسط کاربر متنی یا همان Text User Interface (TUI) در خود برنامه نوشته می‌شود ( که در داخل فایل نیز درچ می‌شود) یا از طریق واسط کاربر گرافیکی یا همان Graphical User Interface (GUI) اعمال می‌شود. دستورهای GUI بصورت کد Scheme در فایل ژورنال درج می‌شوند ( که در این صورت cx-gui-do در اول هر دستور در فایل بصورت اتوماتیک نوشته می‌شود). برای ایجاد کردن فایل ژورنال هم می‌توان از داخل خود نرم‌افزار ANSYS Fluent اقدام کرد یا بصورت دستی فایل را ایجاد کرد. در صورتی که فایل ژورنال از داخل نرم‌افزار ایجاد شود تا زمانی که فایل یا خود برنامه بسته نشود تمام دستورات تایپ شده (TUI) یا تنظیمات انجام شده با ماوس (GUI) در داخل فایل درج می‌شود. نکته دیگری که در فایل ژورنال باید در نظر گرفته شود این است که در صورت نیاز به نوشتن کامنت در داخل فایل باید قبل از شروع خط کامنت از ; استفاده شود. 

دو ایراد عمده در صورتی که از GUI برای نوشتن فایل ژورنال استفاده شود وجود دارد که عبارتند از: 1- برای تنظیم یک قسمت بسیار کوچک در نرم‌افزار بصورت گرافیکی چند خط کد در فایل ژورنال نوشته می‌شود و پیدا کردن قسمت موردنیاز برای تغییر تا حدی مشکل خواهد بود. 2- فرامین نوشته شده در فایل در واقع واسط‌های کاربر گرافیکی را در حین دوباره اجرا شدن کنترل می‌کنند که در نتیجه به راحتی این امکان وجود دارد که با واسط‌های کاربر گرافیکی دیگر در حین اجرا اثر متقابل داشته و اختلال در فایل ژورنال ایجاد شود.

برای شروع ژورنال نویسی فرآیند زیر را دنبال می‌کنیم:

File → Write → Start Journal...

پس از وارد کردن اسم فایل، فرآیند رکورد ژورنال آغاز می‌شود. و آیتم Start Journal در منو به آیتم Stop Journal تبدیل می‌شود. برای خاتمه دادن به رکورد ژورنال می‌توان گزینه Stop Journal را انتخاب کرد یا اینکه خود برنامه را بست.

File → Write → Stop Journal

 

 

فایل ژورنال را از طریق زیر می‌توان فراخوانی کرد.

File → Read → Journal...
 

برای مثال کد زیر فایل مش را خوانده و تنظیمات مدل، شرط مرزی، نوع حلگر و سایر موارد را مشخص می‌کند، سپس برای 200 تکرار مساله را بصورت پایا حل می‌کند سپس تنظیمات حل گذرا انجام شده و نهایتا حل گذرا برای 50 گام زمانی انجام می‌شود.

/file/read-case "C:\Users\iransys\Desktop\journal\2d-channel.msh"
/define/models/viscous/kw-sst? yes
/define/materials/copy fluid water-liquid
/define/boundary-conditions/list-zones
/define/boundary-conditions/fluid fluid yes water-liquid no no no no 0. no 0. no no no no
/define/boundary-conditions/velocity-inlet inlet no no yes yes no 0.1 no 0. no no no yes 2 0.1
/solve/set/discretization-scheme/mom 1
/solve/monitors/residual/convergence-criteria 1e-05 1e-05 1e-05 1e-05 1e-05
/solve/initialize/hyb-initialization
/solve/iterate 200
/define/models/unsteady-1st-order? yes
/solve/set/time-step 0.01
/solve/dual-time-iterate 50 20

به عنوان مثال برگه شرط مرزی ورودی قبل از ست کردن از قسمت کنسول بصورت شکل زیر است:

 

برای تنظیم کردن شرط مرزی ورودی همانند شکل زیر عمل می‌کنیم که نهایتا تغییر نیز در برگه شرط مرزی قابل مشاهده است:

 

همانگونه که در شکل نیز مشخص است کل پارامترهای موجود در برگه توسط نرم‌افزار پرسیده می‌شود و پارامترهایی که ما نیاز به تغییر داشتیم در برگه با جعبه زردرنگ نشان داده شده است و نهایتا کد دستوری در فایل ژورنال بصورت زیر که قبلا نیز اشاره شد درج می‌شود:

 no 0. no no no yes 2 0.1/define/boundary-conditions/velocity-inlet inlet no no yes yes no /
 

در صورتی که از gui برای نوشتن فایل ژورنال استفاده کنیم کد مثال بالا بصورت زیر خواهد بود:

(cx-gui-do cx-activate-item "MenuBar*ReadSubMenu*Mesh...")

(cx-gui-do cx-set-file-dialog-entries "Select File" '( "C:/Users/iransys/Desktop/journal/2d-channel.msh") "Mesh Files (*.msh* *.MSH* )")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Models|Viscous (Laminar)"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Models|Viscous (Laminar)"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Models|Viscous (Laminar)"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Models|Viscous (Laminar)"))
(cx-gui-do cx-set-toggle-button2 "Viscous Model*Table1*ToggleBox1(Model)*k-omega (2 eqn)" #t)
(cx-gui-do cx-activate-item "Viscous Model*Table1*ToggleBox1(Model)*k-omega (2 eqn)")
(cx-gui-do cx-set-toggle-button2 "Viscous Model*Table1*ToggleBox7(k-omega Model)*SST" #t)
(cx-gui-do cx-activate-item "Viscous Model*Table1*ToggleBox7(k-omega Model)*SST")
(cx-gui-do cx-activate-item "Viscous Model*PanelButtons*PushButton1(OK)")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Models|Viscous (SST k-omega)"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid|air"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid|air"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Materials|Fluid|air"))
(cx-gui-do cx-activate-item "Create/Edit Materials*Table1*Frame1*Frame2*ButtonBox2*PushButton1(Fluent Database)")
(cx-gui-do cx-set-list-selections "Fluent Database Materials*Table1*Frame1*List1(Materials)" '( 560))
(cx-gui-do cx-activate-item "Fluent Database Materials*Table1*Frame1*List1(Materials)")
(cx-gui-do cx-activate-item "Fluent Database Materials*PanelButtons*PushButton6(Copy)")
(cx-gui-do cx-activate-item "Fluent Database Materials*PanelButtons*PushButton1(Close)")
(cx-gui-do cx-activate-item "Create/Edit Materials*PanelButtons*PushButton1(Close)")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Cell Zone Conditions"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Cell Zone Conditions"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Cell Zone Conditions"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Cell Zone Conditions"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Cell Zone Conditions"))
(cx-gui-do cx-set-list-selections "Boundary Conditions*Table1*List2(Zone)" '( 0))
(cx-gui-do cx-activate-item "Boundary Conditions*Table1*List2(Zone)")
(cx-gui-do cx-activate-item "Boundary Conditions*Table1*Table3*Table4*ButtonBox1*PushButton1(Edit)")
(cx-gui-do cx-set-list-selections "Fluid*Table2*Table1*DropDownList1(Material Name)" '( 0))
(cx-gui-do cx-activate-item "Fluid*Table2*Table1*DropDownList1(Material Name)")
(cx-gui-do cx-activate-item "Fluid*PanelButtons*PushButton1(OK)")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Boundary Conditions|int_fluid (interior, id=9)"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Boundary Conditions|int_fluid (interior, id=9)"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Boundary Conditions|int_fluid (interior, id=9)"))
(cx-gui-do cx-activate-item "Interior*PanelButtons*PushButton2(Cancel)")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Boundary Conditions|inlet (velocity-inlet, id=10)"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Boundary Conditions|inlet (velocity-inlet, id=10)"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|Boundary Conditions|inlet (velocity-inlet, id=10)"))
(cx-gui-do cx-set-real-entry-list "Velocity Inlet*Frame3*Frame1(Momentum)*Table1*Table8*RealEntry2(Velocity Magnitude)" '( 0.1))
(cx-gui-do cx-set-list-selections "Velocity Inlet*Frame3*Frame1(Momentum)*Table1*Table4(Turbulence)*DropDownList1(Specification Method)" '( 1))
(cx-gui-do cx-activate-item "Velocity Inlet*Frame3*Frame1(Momentum)*Table1*Table4(Turbulence)*DropDownList1(Specification Method)")
(cx-gui-do cx-set-real-entry-list "Velocity Inlet*Frame3*Frame1(Momentum)*Table1*Table4(Turbulence)*RealEntry9(Turbulent Intensity)" '( 0.02))
(cx-gui-do cx-set-list-selections "Velocity Inlet*Frame3*Frame1(Momentum)*Table1*Table4(Turbulence)*DropDownList1(Specification Method)" '( 3))
(cx-gui-do cx-activate-item "Velocity Inlet*Frame3*Frame1(Momentum)*Table1*Table4(Turbulence)*DropDownList1(Specification Method)")
(cx-gui-do cx-set-real-entry-list "Velocity Inlet*Frame3*Frame1(Momentum)*Table1*Table4(Turbulence)*RealEntry11(Hydraulic Diameter)" '( 0.1))
(cx-gui-do cx-activate-item "Velocity Inlet*PanelButtons*PushButton1(OK)")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Methods"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Methods"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Methods"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Monitors|Residual"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Monitors|Residual"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Monitors|Residual"))
(cx-gui-do cx-set-real-entry-list "Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry11" '( 1e-05))
(cx-gui-do cx-set-real-entry-list "Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry17" '( 1e-05))
(cx-gui-do cx-set-real-entry-list "Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry23" '( 1e-05))
(cx-gui-do cx-set-real-entry-list "Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry29" '( 1e-05))
(cx-gui-do cx-set-real-entry-list "Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry35" '( 1e-05))
(cx-gui-do cx-activate-item "Residual Monitors*PanelButtons*PushButton1(OK)")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Initialization"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Initialization"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Initialization"))
(cx-gui-do cx-activate-item "Solution Initialization*Table1*ButtonBox10*PushButton2(Initialize)")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Run Calculation"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Run Calculation"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Run Calculation"))
(cx-gui-do cx-set-integer-entry "Run Calculation*Table1*IntegerEntry10(Number of Iterations)" 200)
(cx-gui-do cx-activate-item "Run Calculation*Table1*IntegerEntry10(Number of Iterations)")
(cx-gui-do cx-activate-item "Run Calculation*Table1*PushButton22(Calculate)")
(cx-gui-do cx-activate-item "Information*OK")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|General"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|General"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Setup|General"))
(cx-gui-do cx-set-toggle-button2 "General*Table1*Table2(Solver)*ToggleBox5(Time)*Transient" #t)
(cx-gui-do cx-activate-item "General*Table1*Table2(Solver)*ToggleBox5(Time)*Transient")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Run Calculation"))
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Run Calculation"))
(cx-gui-do cx-activate-item "NavigationPane*List_Tree1")
(cx-gui-do cx-set-list-tree-selections "NavigationPane*List_Tree1" (list "Solution|Run Calculation"))
(cx-gui-do cx-set-real-entry-list "Run Calculation*Table1*Table7*RealEntry1(Time Step Size)" '( 0.01))
(cx-gui-do cx-activate-item "Run Calculation*Table1*Table7*RealEntry1(Time Step Size)")
(cx-gui-do cx-set-integer-entry "Run Calculation*Table1*Table7*IntegerEntry2(Number of Time Steps)" 50)
(cx-gui-do cx-activate-item "Run Calculation*Table1*Table7*IntegerEntry2(Number of Time Steps)")
(cx-gui-do cx-activate-item "Run Calculation*Table1*PushButton22(Calculate)")
(cx-gui-do cx-activate-item "Information*OK")

همانطور که مشاهده می‌شود در صورت رکورد تنظیمات با ماوس حجم کد چندین برابر حالتی می‌شود که از محیط کنسول برای انجام تنظیمات استفاده شود.

کلمات کلیدی:

ژورنال، ژورنالنویسی در فلوئنت، واسط کاربر متنی، واسط کاربر گرافیکی، ابررایانه

Journal, Journal File, Text User Interface, TUI, Graphical User Interface, GUI, ANSYS Fluent