یکی از مشکلاتی که کاربران نرم‌افزار 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 برای نوشتن فایل ژورنال استفاده شود وجود دارد که عبارتند از: ۱- برای تنظیم یک قسمت بسیار کوچک در نرم‌افزار بصورت گرافیکی چند خط کد در فایل ژورنال نوشته می‌شود و پیدا کردن قسمت موردنیاز برای تغییر تا حدی مشکل خواهد بود. ۲- فرامین نوشته شده در فایل در واقع واسط‌های کاربر گرافیکی را در حین دوباره اجرا شدن کنترل می‌کنند که در نتیجه به راحتی این امکان وجود دارد که با واسط‌های کاربر گرافیکی دیگر در حین اجرا اثر متقابل داشته و اختلال در فایل ژورنال ایجاد شود.

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

…File → Write → Start Journal

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

File → Write → Stop Journal

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

File → Read → Journal…

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

/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 ۰. no ۰. no no no no

/define/boundary-conditions/velocity-inlet inlet no no yes yes no ۰.۱ no ۰. no no no yes2 0.1

/solve/set/discretization-scheme/mom ۱

/solve/monitors/residual/convergence-criteria ۱e-05 1e-05 1e-05 1e-05 1e-05

/solve/initialize/hyb-initialization

/solve/iterate ۲۰۰

/define/models/unsteady-1st-order? yes

/solve/set/time-step ۰.۰۱

/solve/dual-time-iterate ۵۰ ۲۰

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

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

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

 no ۰. no no no yes ۲ ۰.۱/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 (2eqn)”)

(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)” ‘( ۵۶۰))

(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)” ‘( ۰))

(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)” ‘( ۱))

(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)” ‘( ۰.۰۲))

(cx-gui-do cx-set-list-selections “Velocity Inlet*Frame3*Frame1(Momentum)*Table1*Table4(Turbulence)*DropDownList1(Specification Method)” ‘( ۳))

(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)” ‘( ۰.۱))

(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” ‘( ۱e-05))

(cx-gui-do cx-set-real-entry-list “Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry17” ‘( ۱e-05))

(cx-gui-do cx-set-real-entry-list “Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry23” ‘( ۱e-05))

(cx-gui-do cx-set-real-entry-list “Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry29” ‘( ۱e-05))

(cx-gui-do cx-set-real-entry-list “Residual Monitors*Table1*Table2*Table1*Table1(Equations)*RealEntry35” ‘( ۱e-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)” ۲۰۰)

(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)” ‘( ۰.۰۱))

(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)” ۵۰)

(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”)

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