Hàm người dùng định nghĩauser define fucntion (UDF), là hàm mà bạn lập trình để có thể được nhập vào (tải dữ liệu) bởi trình giải (solver) của phần mềm mô phỏng. Mục đích để nâng cao các đặc tính cơ bản của mã nguồn. Tài liệu hướng dẫn Lập trình fortran trong môi trường ansys CFX tạo hàm UFDHave fun
Trang 11
Lậ p trì nh bậ ng User Fortrận trong
mo i trườ ng phậ n me m Ansys CFX
1 Định nghĩa hàm UDF
Hàm người dùng định nghĩa-user define fucntion (UDF), là hàm mà bạn lập trình để có thể được nhập vào (tải dữ liệu) bởi trình giải (solver) của phần mềm
mô phỏng Mục đích để nâng cao các đặc tính cơ bản của mã nguồn Ví dụ, bạn
có thể dùng UDF để định nghĩa điều kiện biên, đặc tính vật lý, các toán tử nguồn cho cơ chế dòng chảy của riêng bạn, như là xác định các thông số mô hình tùy biến, điều kiện ban đầu, hoặc nâng cao xử lý kết quả
UDF được viết với các ngôn ngữ lập trình C hoặc Fortran, sử dụng bất cứ trình biên soạn nào và mã nguồn nào Một file có thể chứa một hoặc nhiều UDF, và bạn có thể định nghĩa nhiều file nguồn
Tại sao cần dùng UDF?
UDF cho phép chúng ta tùy biến, thay đổi phần mềm mô phỏng nào đó để cho phù hợp với bài toán tiêng của chúng ta UDF được dùng cho nhiều ứng dụng khác nhau Ví dụ:
Tùy biến điều kiện biên, định nghĩa đặc tính vật liệu, tốc độ phản ứng bề mặt và thể tích, các toán tử nguồn trong phương trình trao đổi…
Chỉnh sửa giá trị tính toán trên một bước lặp cơ bản
Khởi tạo lời giải ban đầu
Đồng bộ thực thi lệnh
Cải thiện khả năng xử lý kết quả
Nâng cao các mô hình đã có của phần mềm
Trang 22
2 Tổng quan về User Fortran trong CFX
Để cho người sử dụng thêm những đặc tính và mô hình vật lý cho ANSYS CFX, người sử dụng có thể viết chương trình con (subroutine) của riêng họ bằng ngôn ngữ lập trình Fortran và có ANSYS CFX-Solver gọi những chương trình con đó qua một code nguồn giao diện Chúng ta có thể xây dựng một mô hình vật lý nào đó không có sẵn trong ANSYS CFX dựa trên hiểu biết và suy nghĩ chắc chắn
ANSYS CFX hỗ trợ người dùng những subroutine được viết bằng Fortran 77 hay Fortran 90 Một danh sách của các trình biên dịch hỗ trợ cho mỗi kiểu trường hợp đã có và có thể sử dụng Một lời khuyên được đưa ra là: sử dụng Fortran 77 bất cứ khi nào có thể
Hai loại khách nhau của routine được sử dụng trong ANSYS CFX là:
User defined CEL (CFX Expression Language) functions: có thể được sử dụng trong một CEL expresstion, tuân theo luật CEL chuẩn
Junction box routine: có thể được sử dụng tại một vài nơi trong ANSYS CFX-Solver để chạy các code của người dùng
Các nhiệm vụ sau có thể được thực hiện với subroutine của người dùng trong ANSYS CFX:
Nhập dữ liệu của người dùng ( ví dụ: dữ liệu yêu cầu cho điều kiện biên của profile hay các nguồn bên ngoài)
Các điều kiện biên đặc biệt của người dùng ( ví dụ: điều kiện biên của profile)
Các điều kiện ban đầu đặc biệt của người dùng ( ví dụ: vùng dòng chảy sinh ra bên ngoài, sự phân phối ngẫu nhiên hoặc sự nhiễu loạn của giải pháp đang tồn tại)
Trang 33
Các giới hạn nguồn đặc biệt của người dùng ( ví dụ: các lực sinh ra bên ngoài của vật thể hoặc giới hạn nguồn thêm vào một cách tổng quan được
sử dụng trong mô hình vật lý)
Junction box routine gọi tất cả các bước thời gian mà hoạt động như giao diện tổng qan giữa ANSYS CFX-Solver và phần mềm khác ( ví dụ: các code về kết cấu cơ khí) Junction box cũng yêu cầu một giao diện cho monitor nâng cao
và giải pháp đầu ra
Các User particle routine được sử dụng để chỉ ra các nguồn của momen, nhiệt và di chuyển khối lượng , và cũng có thể được sử dụng để chỉ ra những vùng có thể đi vào cho những vật nhỏ Cấu trúc của user routine nhỏ là giống nhau
Chú ý rằng ANSYS CFX bao gồm những chức năng như là tăng các biến của thuật giải trên màn hình quan sát hay các giá trị tổng quan và chức năng mở rộng của CEL, các chức năng đó có thể làm giảm nhu cầu sử dụng subroutine của người dùng
Để sử dụng junction box routine, người sử dụng cần phải làm quen với ANSYS CFX MMS (Memory Management System) để có thể thiết lập và đưa vào giá trị của người dùng để vào bất kì một routine nào
Các thư viện chia sẻ (Shared libraries) chấp nhận các subroutine có thể được
sử dụng lại không cần bên dịch lại cho ANSYS CFX-Solver chạy hay thậm chí cho các ứng dụng khác Vị trí của thư viện chia sẻ được chỉ rõ trong ANSYS CFX-Pre Trong quá trình chạy của ANSYS CFX-Solver, các subroutine của người dùng được tải từ các thư viện chia sẻ đó
2.1 User CEL Functions và Routine
User CEL function chấp nhận người dùng tạo chức năng riêng tùy ý để thêm vào định nghĩa ban đầu của CEL function ( ví dụ: sin, cos, step…) Ta có thể dùng chức năng này trong bất cứ cách diễn tả nào nơi mà CEL function có thể
Trang 44
được sử dụng Một CEL function nhập vào các giá trị cho các subroutine của người sử dụng, và sử dụng các giá trị được trả lại từ các routine để nhập lại vào các giá trị mà có sự thay đổi Hình sau chỉ ra rõ ràng hơn về quá trình trên
Hình 1.1 Trình tự làm việc của User function
Mọi biến mà CEL expression chuẩn có thể sử dụng được thì thì cũng sử dụng được cho User CEL Expression Có danh sách các biến được sử dụng
Cấu trúc của User CEL Function
Một file User Fortran có thể chứa một vài routine, các routine này được gọi bởi ANSYS CFX-Solver và routine con chỉ có thể được gọi từ các routine khác trong file đó
Để miêu tả rõ hơn, cấu trúc cơ bản của user CEL function là:
Trang 55
Macro dllexport():được sử dụng để chắc chắn rằng một tên gọi được biết từ bên ngoài mà các trường hợp yêu cầu điều đó để thành công trong việc kết nối đúng thời gian chạy Macro: #include "cfx5ext.h" nên là dòng đầu trong file Fortran
Một dllexport() nên xác định cho mọi routine mà ANSYS CFX-Solver có thể gọi trong file Fortran
Mỗi dllexport() phải đứng trước routine mà nó đề cập tới và phải được bắt đầu trong cột 1 Các argument của macro dllexport nên được đặt tên là các routine con và không nên có khoảng trống
User CEL function có các argument cố định và gồm các dữ liệu trong các lĩnh vực sau:
NLOC: số vị trí trong khoảng không trên nơi diễn ra các phép tính
Trang 66
NARG: số argument được chuyển tới các chức năng
ARGS(1:NLOC,1:NARG): số argument được chuyển tới các chức năng( tại mỗi điểm trong khoảng trống)
NRET: số các biến được trả lại giá trị các giá trị luôn luôn là 1 trong ANSYS CFX, nhưng có khả năng thay đổi trong quá trình chạy chương trình
RET(1:NLOC, 1:NRET): các biến được trả lại giá trị (tại mỗi điểm trong khoảng trống)
CZ(*), DZ(*), IZ(*), RZ(*): CHARACTER, DOUBLE PRECISION, INTERGER, LOGICAL, và REAL
Độ dài (NLOC) của các argument (ARGS) và giá trị được trả lại (RET) của user CEL function được chỉ bởi vị trí mà routine được gọi Ví dụ, với nhóm các yếu tố của biên, NLOC là số các bề mặt trong nhóm, với các đỉnh, NLOC là số các đỉnh trong vùng hiện tại
Chú ý rằng, về mặt tổng quan, user CEL function sẽ được gọi một vài lần trong mỗi vòng lặp và giá trị của NLOC sẽ khác với mỗi lần gọi Đó là do ANSYS CFX-Solver sẽ chia các vùng xác định (ví dụ: vùng điều kiện biên) thành một số những mảnh nhỏ hơn và gọi user CEL function cho mỗi mảnh Subroutine của người dùng sẽ được lập trình để thích hợp với điều này
Các stacks (CHARACTER, DOUBLE PRECISION ) được dùng nếu thông tin bên phía vế phải của CEL expression (ví dujL B*C and D in A = UR (B*C, D)) không đủ cho tính toán A Có thể là cần thiết cho việc lấy các dữ liệu bổ xung (ví dụ: giữ liệu nhập vào của ngườ dùng, dữ liệu của vị trí khác, gradient
…) Các dữ liệu này được lấy vào từ ANSYS CFX Memory Management System và yêu cầu các stack tương ứng Vì thế các stack tương ứng này được thêm vào trong danh sách các argument
Trang 77
Argument trong User CEL Function
Khi nhập giá trị cho các user CEL function routine, các giá trị nhập vào các argument được biến đổi đơn vị một cách tự động thành đơn vị được xác định sẵn trong các danh sách argument trong User Function Editor
Khi lấy giá trị ra, các đơn vị của các kết quả được biến đổi tự động thành các đơn vị của thuật giải bởi ANSYS CFX-Solver
Khả năng chọn đơn vị làm việc của các routine với sự tự động biến đổi đơn
vị có thể hữu dụng cho việc tạo ra một giao diện giữa ANSYS CFX-Solver và một ứng dụng hay dữ liệu thứ 3
2.2 User Junction Box Routines
Để bổ xung trong việc định nghĩa CEL fuction của riêng người sử dụng, ta
có thể gọi subroutine tại một vài thời điểm trong quá trình chạy của ANSYS CFX-Solver, được gọi là các junction box Các junction box có thể được sử dụng để hoàn thành một số các nhiệm vụ khác nhau:
Nhập hoặc xuất dữ liệu của người dùng
Cải tiến các chức năng của màn hình trong thuật giải
Kết hợp ANSYS CFX với cái gói phần mềm khác
Điều khiển chương trình ( ví dụ: điều khiển tiêu chuẩn kết thúc của hệ số các vòng lặp trong khi chạy transient hay là số vòng lặp lớn nhất hay mục đích cần đạt được)
User defined junction box routine chỉ được dùng trong ANSYS CFX-Solver như là một argument Không giống user CEL function, không có argument của người sử dụng cho các routine này Tuy nhiên, bằng việc sử dụng các chức năng của ANSYS CFX MMS (Memory Management System), người sử dụng có thể
có đường tốt nhất vào cấu trúc dữ liệu bên trong của ANSYS CFX-Solver
Trang 88
Các biến CEL không thể dùng với junction box routine Ta có thể gọi nhiều junction box trong quá trình chạy
Các lựa chọn và chỉ số của các Junction Box Routine
Một junction box routine được tạo ra trong ANSYS CFX-Fre sao cho ANSYS CFX-Solver có thể biết được nơi để tìm subroutine và khi nào routine này sẽ được sử dụng Các chỉ số phải được chỉ rõ như là diễn tả dưới đây
Các chỉ số được thiết lập cho user routine CCL phải tương tự như chỉ số được sử dụng cho User CEL Function; tuy nhiên các chỉ số Junction Box Location CCL được thêm vào chỉ ra các điểm mà junction box routine được sử dụng trong khi chạy ANSYS CFX-Solver
Các chỉ số phải được thiết lập cho USER ROUTINE CCL để có thể dùng được junction box routine
Calling Name: là tên mà ta dùng trong subroutine của mình (ví dụ: mysub cho subroutine mysub (…)) Chú ý rằng tên này nên ở cấp thấp hơn thậm chí khi nó ở cấp cao hơn trong file Fortran
Library Name: là tên của thư viện chia sẻ
Library Path: là đường dẫn tới thư mục chứa thư viện chia sẻ
Junction Box Location: là một danh sách các vị trí trong thuật giải mà juction box routine được sử dụng
First Partitioning Call: chỉ có thể dùng khi sự chia cắt được diễn ra Gọi junction box routine chỉ trước khi lưới được đọc và trước khi sự chia cắt được diễn ra
Start of Partitioning: chỉ có thể dùng khi sự chia cắt được diễn ra Gọi junction box routine sau khi đọc lưới nhưng trước khi sự chia cắt diễn ra
End of Partitioning: chỉ có thể dùng khi sự chia cắt được diễn ra Gọi junction box routine sau khi sự chia cắt được hoàn thành và file par được viết
Trang 99
First call: gọi trước khi lưới được đọc và sau việc nhập giá trị vật lý và cho điều kiện biên Gọi sau khi sự chia cắt được hoàn thành nếu có thể
Start of Run: gọi sau khi đã thiết lập được vấn đề và lưới đã được đọc
End of Run: gọi sau khi kết quả đã được ghi lại
User Input: gọi sau khi Start of Run Là vị trí được khuyên dùng cho nhập code cho file Fortran của người dùng, nó làm việc song song với nhiều phần chạy
User Start: gọi sau khi User Input với mọi sự chia tách
User Output: gọi sau khi End of Run Đây là vị trí được khuyên dùng cho việc xuất ra kết quả, nó làm việc song song với nhiều phần chạy
Start of Timestep: gọi khi bắt đầu của mỗi bước thời gian Việc gọi này được dùng khi chạy ở transient và liên quan đến vòng lặp bên ngoài
User Input Start of Timestep: gọi tại thời điểm bắt đầu của mỗi của mỗi bước thời gian, làm việc hệt như User Input nhưng được gọi tại lúc bắt đầu của mỗi bước thời gian trong khi chạy transient
End of Timestep: được gọi khi kết thúc của mỗi bước thời gian Chỉ ứng dụng cho chạy transient và liên hệ tới vòng lặp bên ngoài
Start of Coefficient Loop: được gọi tại vòng đặt giá trị vào, cho khi chạy transient và liên quan đến vòng lặp bên trong
User Input Start of Coefficient Loop: được gọi tại thời điểm bắt đầu của mỗi hệ số vòng lặp, làm việc giống như User Iput nhưng được gọi tại thời điểm bắt đầu của mỗi vòng lặp khi chạy transient và trạng thái steady
End of Coefficient Loop: được gọi tại thời điểm kết thúc của mỗi vòng đặt giá trị, dùng khi chạy transient và liên hệ tới vòng bên trong
Start of Linear Solution: được gọi trước khi thuật giải tuyến tính cho phương trình nhất định
Trang 1010
End of Linear Solution: được gọi sau khi thuật giải tuyến tính cho phương trình nhất định
Abort: được gọi khi thuật giải dừng lại vì một số lý do nào đó
Gọi Juncton Box Routine
Rất nhiều junction box routine đã được định nghĩa, nhưng chỉ những junction box routine được chọn ở Solver Output Control tab sẽ được gọi trong quá trình chạy ANSYS CFX-Solver
2.3 Thư viện chia sẻ
Thư viện chia sẻ giúp ta có thể kết nối với user routine trong quá trình chạy của ANSYS CFX-Solver và tránh việc cần phải tạo ra một đoạn code mới mỗi khi dùng user subroutine, điều này làm tăng chức năng của ANSYS CFX Điều này thể hiện như sau:
Các ứng dụng khác nhau có thể sử dụng lại thư viện thông thường hay cách sử dụng thư viện
Một ứng dụng có thể sử dụng một vài thư viện hay các thư viện thay thế
Cả hai user CEL function và junction box routine trong file CCL đều phải chỉ rõ tên thư viện, tên gọi duy nhât và đường dẫn tới thư viện chia sẻ
Cách tạo ra thư viện chia sẻ
File cfx5mkext.exe được sử dụng để tạo ra các thư viện chia sẻ Ta phải chạy cfx5mkext –help để lấy các thông tin về các argument được chấp nhận Để tạo các thư viện chia sẻ ta phải chạy:
cfx5mkext myroutine1.F myroutine2.F
tại dòng lệnh Điều này sẽ tạo ra thư mục đặc biệt trong thư mục đang làm việc (ví dụ như: irix hoặc winnt) Thư mục này chứa các file chia sẻ của thư viện như: libmyroutine1.so (UNIX except hpux) libmyroutine1.sl (hpux) hoặc myroutine1.dll (Windows) Một thư viện được tạo ra cho tất cả các file nhờ
Trang 1111
cfx5mkext Mặc định, tên của thư viện được lấy theo file đầu tiên trong lệnh cfx5mkext
Nếu ta dùng chế độ chạy hai ANSYS CFX-Solver một cách chính xác, ta nên sử dụng argument –double với cfx5mkext để biên dịch các subroutine
Ta có thể xác định các tên khác nhau cho đối tượng của thư viện chia sẻ bằng việc sử dụng lựa chọn: -name Lựa chọn có thể được sử dụng để chỉ đường dẫn đến vị trí của thư viện Ví dụ: cfx5mkext -name UserRoutine -dest /home/user/SharedLibraries myroutine.F tạo ra libUserRoutine.so (UNIX except hpux) libmyroutine.sl (hpux) or UserRoutine.dll (Windows) Khi thiết kế, chỉ
ra tên thư mục trong /home/user/SharedLibraries.
Khi chỉ ra đường dẫn đến thư viện trong ANSYS CFX-Pre, ta nên chỉ ra đường dẫn chính xác tới thư mục chứa chứa thư mục con đã được thiết kế (ví dụ: /home/user/SharedLibraries ở ví dụ trước, hoặc trong Window có thể là: F:\user\SharedLibraries Một số các đường dẫn tới thư viện được cung cấp để chấp nhận việc chạy phân phối song song qua các thiết kế khác nhau
2.4 Phụ lục
Biên dịch User Fortran Routine trong ANSYS CFX 11.0 ở Windows (32-bit)
Bộ biên dịch Intel Fortran 9.0 được khuyến cáo và sẽ hỗ trợ việc biên dịch cho ANSYS CFX 11.0 Các đường dẫn hỗ trợ cũng được yêu cầu Visual C++2005 Express Edition được sử dụng miễn phí
Các thư viện tạo với Visual Fortran 6.6a (không phải 6.5) sẽ làm việc với Ansys CFX 11.0 Solver.Tuy nhiên, các sản phẩm được cài được mặc định là dùng bộ trình dịch Intel Fortran ở chế độ mặc định