![]() |
Springhead
An open source physics engine for virtual reality, haptics and motion generation.
|
有限要素法シミュレーションのためのメッシュ(4面体メッシュ) [詳細]
#include <PHFemMesh.h>

構成 | |
| struct | Edge |
| class | Face |
| class | FemVertex |
| class | Tet |
Public メソッド | |
| SPR_OBJECTDEF (PHFemMesh) | |
| PHFemMesh (const PHFemMeshDesc &desc=PHFemMeshDesc(), SceneIf *s=NULL) | |
| virtual size_t | GetDescSize () const |
| デスクリプタのサイズ | |
| virtual bool | GetDesc (void *desc) const |
| デスクリプタの読み出し(コピー版) | |
| virtual void | SetDesc (const void *desc) |
| デスクリプタの設定。ここで、頂点座標と四面体の4頂点のIDの情報から、面や辺についての情報を計算しておく。 | |
| virtual void | Step (double dt) |
| 時刻をdt進める処理。PHFemEngineが呼び出す。 | |
| unsigned | GetNFace () |
| std::vector< Vec3d > | GetFaceEdgeVtx (unsigned id) |
| Vec3d | GetFaceEdgeVtx (unsigned id, unsigned vtx) |
四面体の計算 対象によらずに必要になる形状関数のXXを計算する関数 | |
| void | UpdateJacobian () |
Public メソッド inherited from SceneObject | |
| virtual void | SetScene (SceneIf *s) |
| virtual SceneIf * | GetScene () const |
| virtual SceneObjectIf * | CloneObject () |
Public メソッド inherited from NamedObject | |
| NamedObject (const NamedObject &n) | |
| NamedObject & | operator= (const NamedObject &n) |
| virtual const char * | GetName () const |
| 名前の取得 | |
| virtual void | SetName (const char *n) |
| 名前の設定 | |
| virtual void | SetNameManager (NameManagerIf *s) |
| NameManagerを設定 | |
| virtual NameManagerIf * | GetNameManager () const |
| NameManagerの取得 | |
Public メソッド inherited from Object | |
| SPR_OBJECTDEF (Object) | |
| クラス名の取得などの基本機能の実装 | |
| ObjectIf * | GetObjectIf () |
| const ObjectIf * | GetObjectIf () const |
| virtual void | Print (std::ostream &os) const |
| デバッグ用の表示 | |
| virtual void | PrintShort (std::ostream &os) const |
| virtual ObjectIf * | CreateObject (const IfInfo *info, const void *desc) |
| オブジェクトの作成 | |
| virtual size_t | NChildObject () const |
| 子オブジェクトの数 | |
| virtual ObjectIf * | GetChildObject (size_t pos) |
| 子オブジェクトの取得 | |
| virtual const ObjectIf * | GetChildObject (size_t pos) const |
| virtual bool | AddChildObject (ObjectIf *o) |
| 子オブジェクトの追加 | |
| virtual bool | DelChildObject (ObjectIf *o) |
| 子オブジェクトの削除 | |
| virtual void | Clear () |
| すべての子オブジェクトの削除とプロパティのクリア | |
| virtual void | Loaded (UTLoadContext *) |
| ファイルロード後に一度呼ばれる。ノードの設定に使う。 呼び出し順序に依存する処理がしたい場合は、UTLoadHandeler と UTLoadTask を使うと良い。 | |
| virtual void | Setup () |
| ノードの設定をするための関数 | |
| virtual const void * | GetDescAddress () const |
| デスクリプタの読み出し(参照版) | |
| virtual bool | GetState (void *state) const |
| 状態の読み出し(コピー版) | |
| virtual const void * | GetStateAddress () const |
| 状態の読み出し(参照版) | |
| virtual void | GetStateR (char *&state) |
| 状態の再帰的な読み出し | |
| virtual void | SetState (const void *state) |
| 状態の設定 | |
| virtual void | SetStateR (const char *&state) |
| 状態の再帰的な設定 | |
| virtual bool | WriteStateR (std::ostream &fout) |
| 状態のファイルへの書き出し | |
| virtual bool | WriteState (std::string fileName) |
| virtual bool | ReadStateR (std::istream &fin) |
| 状態の読み込み | |
| virtual bool | ReadState (std::string fileName) |
| virtual size_t | GetStateSize () const |
| 状態のサイズ | |
| virtual void | ConstructState (void *m) const |
| メモリブロックを状態型に初期化 | |
| virtual void | DestructState (void *m) const |
| 状態型をメモリブロックに戻す | |
| virtual void | DumpObjectR (std::ostream &os, int level=0) const |
| メモリデバッグ用。単純にツリーのオブジェクトをファイルにダンプする。 | |
Public 変数 | |
| std::vector< FemVertex > | vertices |
| 基本情報(生成時にデスクリプタから与えられる情報) [詳細] | |
| std::vector< Tet > | tets |
| 四面体 | |
追加情報 基本情報からSetDesc()が計算して求める。 | |
| std::vector< int > | surfaceVertices |
| 物体表面の頂点のID | |
| std::vector< Face > | faces |
| 面 | |
| unsigned | nSurfaceFace |
| 面のうち物体表面のものが、faces[0]..faces[nSurfaceFace-1] 以降は内側の面:faces[nSurfaceFace]..faces[faces.size()] | |
| std::vector< Edge > | edges |
| 辺 | |
| unsigned | nSurfaceEdge |
| 辺のうち物体表面のものが、edges[0]..edges[nSurfaceEdge-1] | |
Additional Inherited Members | |
Protected メソッド inherited from NamedObject | |
| virtual void | PrintHeader (std::ostream &os, bool bClose) const |
| 開き括弧 | |
Protected メソッド inherited from Object | |
| virtual void | PrintChildren (std::ostream &os) const |
| 子オブジェクトをPrint | |
| virtual void | PrintFooter (std::ostream &os) const |
| 閉じ括弧 | |
| virtual void | BeforeGetDesc () const |
| GetDesc()の前に呼ばれる | |
| virtual void | AfterSetDesc () |
| SetDesc()のあとに呼ばれる | |
Static Protected メソッド inherited from Object | |
| static void | ConstructState (ObjectIf *o, char *&s) |
| sをoのStateとして初期化する. | |
| static void | DestructState (ObjectIf *o, char *&s) |
| sをoのStateからメモリブロックに戻す. | |
Protected 変数 inherited from NamedObject | |
| UTString | name |
| 名前 | |
| NameManager * | nameManager |
| 名前の検索や重複管理をするもの.SceneやSDKなど. | |
有限要素法では、辺が、頂点・四面体から参照できることが必要になる。
有限要素法では、要素(=四面体)の体積や面積の積分から、各ノードの物理量を求める。
各ノード(頂点)は複数の四面体で共有されているので、頂点や頂点と頂点(=辺)は、
複数四面体の係数を合成したものを持つことになる。
隣り合う頂点と頂点(=辺)の間に係数がある。
i列 j列
+------------------+
| x |
| | 係数行列Aは左のようになる。 要素 ii, jj(対角成分) や ij, ji(非対角成分) に値が入る(i,jは頂点、ijは辺) //(ii,jj)が頂点、ijやji...etcは辺
i行 | x d o | | | j行 | o d | | | +---------------—+
Ax + b = 0, (D-F)x + b = 0 , x = D^{-1} F x - D^{-1} b, x = D^{-1} F x - b'
x_i = (F_i * x)/D_ii - b_i/D_ii ... (1)
i->j, j->i で同じ係数(F_ij, F_ji)が必要だが、計算は上から行うので、両方から係数が見えないとならない。
1. 全四面体について係数を求め、辺に係数を記録していく
2. ガウスザイデルの計算=上から1行ずつ、式(1)の計算をする。
この時、F_ij=辺の係数 が必要なので、頂点iから辺ixが参照したくなる。
辺の係数F_ijを計算するためには、辺ijを含む四面体の係数の和を求める必要がある。
係数の計算は四面体単位で行うので、四面体から辺への参照も必要。
∴辺構造体 Edge が必要 | std::vector<FemVertex> vertices |
頂点