設(shè)計仿真 | Adams回調(diào)函數(shù)功能解析
01
概 述
在應(yīng)用Adams處理工程問題時,尤其面對復(fù)雜工況條件下,需要對求解器在仿真過程中進行更為細致和靈活的設(shè)置,此時,基于軟件界面上的功能已經(jīng)很難滿足實際需求。CBKSUB子程序作為Adams的回調(diào)函數(shù),其主要作用是幫助用戶優(yōu)化仿真的執(zhí)行,可以對仿真進行控制和相應(yīng)內(nèi)存分配,還可以緩存仿真過程中計算的數(shù)值。
02
回調(diào)函數(shù)子程序
Adams求解器每次運行,其實會劃分很多細小的階段,比如完成模型讀入、仿真求解命令開始、迭代運行開始、迭代終止、靜力分析開始、傳感器觸發(fā)等等,CBKSUB就可以這些事件作為其觸發(fā)的條件。Adams回調(diào)函數(shù)的架構(gòu),旨在為高級用戶定制執(zhí)行自定義解決方案的數(shù)值密集型模型,通過該架構(gòu)的輔助代碼,實現(xiàn)初始化內(nèi)存、運行各類仿真計算、生成供其它用戶子程序共享的結(jié)果數(shù)據(jù)以及優(yōu)化自定義模型等。可以基于Fortran或者C/C++編寫回調(diào)函數(shù)子程序CBKSUB,另外,擁有回調(diào)函數(shù)子程序的計算消耗可以忽略不記,除非用戶在其中執(zhí)行冗長的數(shù)值計算。
回調(diào)函數(shù)子程序的一般形式
CBKSUB/id,priority=I,function=user(0),routine=libname::subname
其中,
●Priority,描述多個回調(diào)子程序存在時,它們的調(diào)用次序,有高優(yōu)先級的回調(diào)函數(shù)先調(diào)用,如果兩個有相同的優(yōu)先級,相當(dāng)于沒有次序。該值沒有默認值,可設(shè)置為任意整數(shù)。
●Function,設(shè)置為當(dāng)前模式Adams求解器不給回調(diào)函數(shù)傳遞輸入?yún)?shù)。
●Routine,用于指定所調(diào)用的庫及函數(shù)名稱。
回調(diào)子程序在仿真中,當(dāng)每個預(yù)定義事件觸發(fā)時進行調(diào)用。在回調(diào)函數(shù)內(nèi)部,用戶可編寫代碼進行準備計算,運行自定義解決方案等進行優(yōu)化復(fù)雜Adams模型的工作。主要內(nèi)容如下:
●回調(diào)函數(shù)總是由主線程調(diào)用;
●回調(diào)函數(shù)總是在仿真過程中預(yù)定義事件觸發(fā)時調(diào)用;
●每次調(diào)用所需的三個參數(shù)是當(dāng)前仿真時間,事件識別號和基于事件類型的數(shù)據(jù)數(shù)組。
回調(diào)函數(shù)的運行次序說明
這里以動力學(xué)仿真中的CBKSUB調(diào)用次序為例說明,與其它類型仿真相仿。當(dāng)執(zhí)行動力學(xué)仿真時,Adams求解器將當(dāng)前仿真時間和最終仿真時間之間的時間跨度劃分為一系列的輸出步長。系統(tǒng)的狀態(tài)被推進到每個輸出步驟的末尾,在這個步驟中,從最內(nèi)層的代碼層觸發(fā)生成輸出的請求。然而,為了達到每個輸出步驟的結(jié)束,求解器可能需要執(zhí)行一組更小的時間步驟,以達到當(dāng)前輸出步驟的結(jié)束。也就是分為兩個循環(huán),內(nèi)層的時間步驟求解和外層的輸出步驟求解,每一個外層輸出步驟的求解又劃分為多個時間步驟求解,更進一步,按照數(shù)值求解的一般規(guī)則,每個時間步的求解又會進行多次迭代計算。因此,后面兩圖共同描述了整個程序流的過程,顯示了對CBKSUB子程序的調(diào)用次序,其中左側(cè)為外層輸出步驟循環(huán)右側(cè)為內(nèi)層時間步驟循環(huán)。
圖 1動力學(xué)分析回調(diào)函數(shù)調(diào)用次序
在左側(cè)圖中,首先,標有“Process SIM/DYN command”的塊表示讀取仿真命令輸入?yún)?shù)的代碼,命令信息用于確定求解器需要執(zhí)行的輸出步驟的數(shù)量。右側(cè)圖中所示的流程圖由兩個循環(huán)組成。外環(huán)控制動態(tài)集成的“時間步長”的數(shù)量,直到達到“輸出步長”。內(nèi)部循環(huán)控制推進模擬狀態(tài)所需的校正器迭代次數(shù),直到按照算法要求達到“時間步長”。這樣從內(nèi)到外,完成一次動力學(xué)求解,會有很多可以觸發(fā)回調(diào)函數(shù)的事件發(fā)生,因此,用戶可以根據(jù)需要利用對應(yīng)的事件進行編碼實現(xiàn)我們所需的功能。
03
應(yīng) 用
對于CBKSUB程序的使用,需要注意其有賴于slv_cbksub_util.inc\slv_sbksub.inc及對應(yīng)C/C++版本的文件支持,這些文件存儲了事件映射信息、功能函數(shù)、仿真模式、命令編號等內(nèi)容,可以在Adams安裝路徑下找到。
另外,Adams所提供的系列功能子程序基本都是可以被CBKSUB調(diào)用的,比如sysfnc和sysary,并且使用這兩者時需要注意,如果期望獲得的數(shù)據(jù)沒有相關(guān)性,用戶可以在指定事件中計算和緩存對應(yīng)數(shù)值。
本文以Adams自帶的二階彈簧振子模型為例進行CBKSUB的說明,主要實現(xiàn)回調(diào)CBKSUB時,基于緩存數(shù)據(jù)的方式完成對Vforce的計算。本例將CBKSUB,VFOSUB,STOPERR等子程序?qū)懙揭黄次募校g有相互調(diào)用和數(shù)據(jù)傳遞,方便對有多個子程序混編的用戶提供借鑒。另外,隨著源文件復(fù)雜度的提升,程序中利用了許多Fortran的函數(shù)和功能,比如在CBKSUB,VFOSUB之間傳遞數(shù)據(jù)時,采用了Common功能,將每次事件觸發(fā)調(diào)用回調(diào)函數(shù)的信息展現(xiàn)出來使用了Write函數(shù)等。如下列出源程序部分代碼進行關(guān)鍵行說明:
include 'slv_cbksub_util.inc'//改行是進行CBKSUB使用所必須的文件
SUBROUTINE VFOSUB(id, time, par, npar, dflag, iflag, result)//改行是進行Vforce子程序定義的函數(shù)
COMMON/ FORCES/ VALUE, FLAG//定義公共參數(shù),用于接收CBKSUB的數(shù)值
RETURN
END
SUBROUTINE STOPERR(id, mesage)//完成終止計算及信息展示的程序
RETURN
END
SUBROUTINE CBKSUB(time, event, data)//完成回調(diào)函數(shù)程序
include 'slv_cbksub.inc'//改行是進行CBKSUB使用所必須的文件
COMMON/ FORCES/ VALUE, FLAG//完成力值計算
FLAG = 0
IF( event.eq.ev_ITERATION_BEG ) THEN//判斷是否為迭代開始事件
WRITE(MESSAGE,'(A,A,A,A,A,A,e10.3)')'Event', EVTNAME(event),
*' ', ANLYMOD(data(1)), ' ', ANLYMOD(data(2)), time
//針對每次迭代開始事件,進行相關(guān)信息的展示
RETURN
END
二階彈簧振子模型,通過滑移副與大地關(guān)聯(lián)后,確保系統(tǒng)自由度為2,再通過三個彈簧力建立相互之間力連接,下側(cè)小球為part_2,上側(cè)小球為part_3,分別在二者上施加Sforce_4和Vforce_1。
圖 2二階彈簧振子模型
由于要進行有回調(diào)函數(shù)的模型計算,因此,利用命令導(dǎo)航器找到如下功能進行設(shè)置:
圖 3回調(diào)函數(shù)創(chuàng)建
雙擊后打開如下對話框進行設(shè)置,其中Routine框中的yescallback為前面源程序編譯后所形成的動態(tài)鏈接庫文件名稱,通過雙冒號指向回調(diào)函數(shù)的名稱。
圖 4回調(diào)函數(shù)定義窗口參數(shù)設(shè)置
圖 5用戶子程序編譯后動態(tài)鏈接庫
為了看到回調(diào)函數(shù)的作用,求解時需要利用外部求解功能,基于腳本仿真,并且將展示信息選中。
圖 6仿真設(shè)置
完成計算后,有如下信息,仿真開始階段由于編寫的用戶子程序中有判斷語句
IF( event.eq.ev_ITERATION_BEG ) THEN,
因此,在信息窗口中展現(xiàn)了:
Eventev_ITERATION_BEGam_DYNAMICSam_INITIAL_CONDITI 0.000E+00,
進入動力學(xué)仿真工況的初始化條件計算階段,時間為0表明初始這一時刻。待到動力學(xué)分析開始后,進入迭代環(huán)節(jié)時,展現(xiàn)如下信息:Eventev_ITERATION_BEGam_DYNAMICS am_DYNAMICS 0.500E-03,
進入動力學(xué)仿真工況的動力學(xué)計算階段,時間項開始有數(shù)據(jù),標明每個迭代的終止時鐘,由于這里采用了e10.3的數(shù)據(jù)格式,時間數(shù)據(jù)按科學(xué)計數(shù)法保留小數(shù)點后三位,而迭代周期有可能小于這個量,故此列表中有相同量的表現(xiàn)。
圖 7仿真計算流程中回調(diào)函數(shù)調(diào)用
04
總 結(jié)
回調(diào)函數(shù)作為Adams用戶子程序中的一種常用功能,主要是利用了其與求解器更緊密的關(guān)聯(lián)以及衍生出的多種操作方法,可以深入到一個仿真流程中的各種細微階段,直到每個迭代的開始和結(jié)束都可作為其響應(yīng)的事件,極大地拓展了對仿真流程控制的應(yīng)用廣度和深度。上述實例僅僅展示了對迭代開始事件的操作和信息展示,類似這種可操作的事件還有40余種,包括用于變拓撲相關(guān)的傳感器觸發(fā)事件都可進行回調(diào)函數(shù)的使用,而傳感器觸發(fā)事件后的動作又有很多種,因此,從使用角度的豐富性而言,回調(diào)函數(shù)可以發(fā)掘出許多意想不到的應(yīng)用場景。
后繼更新基于回調(diào)函數(shù)以及傳感器觸發(fā)事件相結(jié)合在變拓撲分析方面的使用。
工程師必備
- 項目客服
- 培訓(xùn)客服
- 平臺客服
TOP




















