Kratos-一個基於現代C++的開源有限元框架

文章來源: 公眾號 有限元術

Kratos是一個基於現代C++的多物理場開源有限元框架,其可以完成固體,流體,熱,DEM等各個方面的單場計算和耦合計算。在線性方程組求解方面,其支持常見的多種直接法和迭代法求解;在並行方面,其支持MPI和Openmp的進程和線程並行,是一個先進的多物理場開源有限元框架。

Kratos的開發團隊是CIMNE。眾所周知,這是一個位於巴塞羅那的國際知名數值模擬科研組織,在知名的O. C. Zienkiewicz, R. L. Taylor的經典著作《The finite element method》中就特別感謝瞭這一組織提供的GID這一前後處理工具。

實際上,該機構開發的GID是一個非常好用的前後處理工具,其提供瞭基本的幾何建模,網格劃分,後處理等功能,界面美觀,雲圖精美。國內元計算公司的先進國產有限元軟件PFEPG在很長一段時間就采用瞭該軟件作為前後處理。

GID另一特色時其具備良好的定制功能,其不僅原生支持多種商業和開源有限元軟件的前後處理,而且可以通過修改problemtype下的.cnd,.mat和.tcl等文件輕松實現自己對GID界面的定制。

以GID中的abaqus類型的problemtype為例:

打開GID目錄下的problemtypes下的abaqus.gid文件夾下的abaqus.mat,其內容如下:

GID中對應的界面:

如果需要修改界面,隻需要將abaqus.mat的內容稍加修改:

對應界面就變為:

因此在GID中,實現界面定制是很輕松的。在實現瞭界面定制以後,再通過.bas文件,實際上就實現瞭對應的導出inp的修改。因此實際上GID是一個方便有限元程序開發者的前後處理利器。

繼續講Kratos,在GID中,實際上也集成瞭對Kratos的前後處理:

在加載Kratos的problemtype後,通過樹形菜單,既可以完成Kratos模型的前處理:

當然,Kratos作為一個開源有限元框架,也可以通過編譯源代碼獲得其運行文件。其GITHUB的鏈接如下:

https://github.com/KratosMultiphysics/Kratos

同時,Kratos更先進的是其廣泛采用的現代C++模板技術,使得代碼足夠抽象化和良好的擴展性。

template<class TSparseSpace, class TDenseSpace, class TLinearSolver>
class ImplicitSolvingStrategy : public SolvingStrategy<TSparseSpace, TDenseSpace>
{
public:
///@name Type Definitions
///@{
typedef SolvingStrategy<TSparseSpace, TDenseSpace> BaseType;
typedef typename BaseType::TDataType TDataType;
typedef typename BaseType::TSystemMatrixType TSystemMatrixType;
typedef typename BaseType::TSystemVectorType TSystemVectorType;
typedef typename BaseType::TSystemMatrixPointerType TSystemMatrixPointerType;
typedef typename BaseType::TSystemVectorPointerType TSystemVectorPointerType;
typedef typename BaseType::LocalSystemMatrixType LocalSystemMatrixType;
typedef typename BaseType::LocalSystemVectorType LocalSystemVectorType;
typedef Scheme<TSparseSpace, TDenseSpace> TSchemeType;
typedef BuilderAndSolver<TSparseSpace, TDenseSpace, TLinearSolver> TBuilderAndSolverType;
typedef ImplicitSolvingStrategy<TSparseSpace, TDenseSpace, TLinearSolver> ClassType;
typedef typename BaseType::TDofType TDofType;
typedef typename BaseType::DofsArrayType DofsArrayType;
typedef typename BaseType::NodesArrayType NodesArrayType;
typedef typename BaseType::ElementsArrayType ElementsArrayType;
typedef typename BaseType::ConditionsArrayType ConditionsArrayType;
/** Counted pointer of ClassName */
KRATOS_CLASS_POINTER_DEFINITION(ImplicitSolvingStrategy);

赞(0)