2016-07-29 30 views
4

我有一個模型代表一些化學過程,我希望反應模型可以在吸收和解吸類(定義相應的模型)之間切換,並基於布爾參數。 我試圖做這樣的:基於布爾參數的開關類型(沒有繼承)?

model Sorption 
    boolean parameter absorbing; 
    AbsorptionModel if absorbing else Desorptionmodel reaction; 
equation 
    reaction.T = T; //dummy usage 
    ... 

使用方法如下:

Sorption TestAbsorption(absorbing=true); // uses the absorption model 
Sorption TestDesorption(absorbing=false); // uses the desorption model 

當然,這種方法是行不通的。 absorbing在編譯時是已知的,所以我有一種感覺,它應該可以做到這一點。

我試圖使用replaceable,但我不想(不必要地)製作Sorption的兩個單獨的子類來切換反應模型的類型。看起來可替換/重新聲明只能在繼承時使用,但我可能是錯的?有沒有辦法做我想要的?

AbsorptionModelDesorptionModel都從相同的基類繼承,並且具有相同的接口(如果相關的話)。

回答

4

沒有,如果需要,你不能使用如果與組件聲明,除了條件組件(但只會刪除組件聲明及其連接方程)。

model Sorption 
    boolean parameter absorbing; 
    replaceable model RModel = AbsorptionModel; 
    RModel reaction; 
equation 
    reaction.T = T; //dummy usage 
    ... 

這樣使用它:

Sorption TestAbsorption(redeclare model RModel = AbsorptionModel); // uses the absorption model 
Sorption TestDesorption(redeclare model RModel = Desorptionmodel); // uses the desorption model 
+0

OK,這就是我懷疑。真正的應用沒有一個,但分別有幾個吸收和解吸模型。這很快就會變得笨拙,這就是爲什麼我想隱藏實現細節,而只是向用戶呈現布爾值。也許我會嘗試使用條件組件方法。謝謝! – Christoph

+0

所以,我最終解決這個問題的方法是將布爾開關拉入反應模型類本身,並切換ab和解吸之間的方程式部分。 w.r.t差一點對模型進行劃分,但感覺比替代方案少。 – Christoph

+0

我想推薦它,但我不喜歡那麼多,因爲它打破了封裝,並且如果您有幾個案例,模型變得很大且難以管理。有些工具支持重新聲明的選擇,請參閱Modelica規範中的註釋「選項」。 –