Update---在FLAC3D中使用Python

1 引言

這個筆記是對大約一年半前《FLAC3D與Python的集成》系列的更新,當時是在FLAC3D 6.0環境下進行的,盡管基本的操作流程和6.0版本相同,但目前的FLAC3D 7.0發生了很大變化,不僅增強了Python的運行環境(Jupyter QtConsole 4.3.1,Python 3.6.1, IPython 6.2.1,matplotlib backend: Qt5Agg), 而且改進了自身的函數功能,因此對過去的筆記作了部分更新。

2 運行設置

FLAC3D集成了IPython的控制臺,當進入FLACD3D的運行環境后,從主菜單Panes > IPython Console, 進入到IPython Console。為了建立FLAC3D和Python的聯系,首先需要導入itasca模塊,itasca模塊定義了Python和FLAC3D之間的交互(from itasca import gridpointarray as gpa > gpa.pos())。

import itasca as itit.command("python-reset-state false")it.command("""program load module 'zone'program load guimodule 'zone'program load module 'body'program load guimodule 'body'program load module 'extruder'program load guimodule 'extruder'program load module 'sel'program load module 'zonesel'program load module 'selpython'program load module 'wallsel'program load guimodule 'sel'program load module 'pfcsel'program load module 'rblocksel'program load module 'dfnzone'program load module 'ballzone'program load module 'zonepython'program load module 'wallzone'""")

所有的FLAC3D都將封裝在it.command函數內,python-reset-state false命令能夠確保FLAC3D使用New或Restore命令后python變量不會刪除。接下來便可以輸入FLAC3D命令。

it.command("""model newmodel large-strain offzone create brick size 10 10 10zone cmodel assign elasticzone property density 2950 young 12e9 poisson 0.25cycle 1""")

3 FLAC3D單元(Zone)

單元zone是FLAC3D最基本的幾何屬性,下面使用Python操作zone的屬性。

(1) 使用it.zone.count()函數檢查模型單元總數;

(2) 使用it.zone.find命令來返回某個單元對象, z = it.zone.find(1)獲取了ID=1的單元對象(it.zone.Zone),以變量z表示;

(3) Zone對象有許多方法,例如z.pos()獲得該單元中心點的坐標(itasca.zone.Zone.pos);

(4) 一旦獲得了一個對象,本質上可以獲得該對象的所有屬性,例如: z.id(), z.model(), z.pos()等;

(5) 下面的代碼通過對整個模型中所有的單元體積相加來得到整個模型的體積。這個功能非常有用,因為有時我們需要比較模型變形前后的體積變化量。

volume_sum = 0.0for z in it.zone.list():    volume_sum += z.vol()print(volume_sum)print(z.vol() * it.zone.count())assert volume_sum == z.vol() * it.zone.count()

(6) z = it.zone.near((5,5,5))是另一種獲取單元對象的方式;

(7) z.props()方法可以返回該單元所有的材料參數; 由于這是一個字典對象,因此也可以單獨取出材料參數,例如z.props()['bulk']或z.prop('shear');反過來,可以使用z.set_prop('bulk', 8.5e9)方法進行賦值(itasca.zone.Zone.set_prop)。


必須注意的是,itasca.zone模塊是針對整個模型的,而itasca.zone.Zone類是針對特定單元的。下面列出itasca.zone模塊所有可使用的函數。這些函數分為兩種類型,一種是取值的(get),另一種是賦值的(set),賦值的函數中都有set的字樣,很好區別。

itasca.zone.containing()itasca.zone.count() itasca.zone.create_ratio()itasca.zone.creep_time_total() itasca.zone.creep_timestep() itasca.zone.dynamic_time_total() itasca.zone.dynamic_timestep() itasca.zone.find()itasca.zone.fluid_ratio() itasca.zone.fluid_stress_normal() itasca.zone.fluid_time_total() itasca.zone.fluid_timestep() itasca.zone.fluid_unbal_avg() itasca.zone.fluid_unbal_max() itasca.zone.force_update() itasca.zone.list() itasca.zone.maxid() itasca.zone.mech_convergence() itasca.zone.mech_ratio() itasca.zone.mech_ratio_avg() itasca.zone.mech_ratio_local() itasca.zone.mech_ratio_max() itasca.zone.near(point: vec)itasca.zone.set_creep_time_total(value: float)itasca.zone.set_creep_timestep(value: float)itasca.zone.set_dynamic_time_total(value: float)itasca.zone.set_dynamic_timestep(value: float)itasca.zone.set_fluid_timestep(value: float)itasca.zone.set_thermal_time_total(value: float)itasca.zone.set_thermal_timestep(value: float)itasca.zone.thermal_ratio() itasca.zone.thermal_time_total() itasca.zone.thermal_timestep() itasca.zone.unbal()

如果運行下面的代碼: 

zone_maxid = it.zone.find(it.zone.maxid())print(type(zone_maxid))

可以發現, zone_maxid的類型是<class 'itasca.zone.Zone'>,這是一個類,不是一個字典或列表,因此我們必須使用方法來返回或賦予該單元的值。下面是試驗的一些例子:

print(zone_maxid.density())print(zone_maxid.geom_test()) print(zone_maxid.id()) print(zone_maxid.vol_deformed()) print(zone_maxid.vol()) print(zone_maxid.type())print(zone_maxid.props())

itasca.zone.Zone 類下的方法非常多,參看【FLAC3D與Python的集成 (4)---zone.Zone類和方法】。

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

2
2