Springhead
An open source physics engine for virtual reality, haptics and motion generation.
クラス PHFemMesh

有限要素法シミュレーションのためのメッシュ(4面体メッシュ) [詳細]

#include <PHFemMesh.h>

PHFemMeshに対する継承グラフ

構成

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 SceneIfGetScene () const
 
virtual SceneObjectIfCloneObject ()
 
- Public メソッド inherited from NamedObject
 NamedObject (const NamedObject &n)
 
NamedObjectoperator= (const NamedObject &n)
 
virtual const char * GetName () const
 名前の取得
 
virtual void SetName (const char *n)
 名前の設定
 
virtual void SetNameManager (NameManagerIf *s)
 NameManagerを設定
 
virtual NameManagerIfGetNameManager () const
 NameManagerの取得
 
- Public メソッド inherited from Object
 SPR_OBJECTDEF (Object)
 クラス名の取得などの基本機能の実装
 
ObjectIfGetObjectIf ()
 
const ObjectIfGetObjectIf () const
 
virtual void Print (std::ostream &os) const
 デバッグ用の表示
 
virtual void PrintShort (std::ostream &os) const
 
virtual ObjectIfCreateObject (const IfInfo *info, const void *desc)
 オブジェクトの作成
 
virtual size_t NChildObject () const
 子オブジェクトの数
 
virtual ObjectIfGetChildObject (size_t pos)
 子オブジェクトの取得
 
virtual const ObjectIfGetChildObject (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< FemVertexvertices
 基本情報(生成時にデスクリプタから与えられる情報) [詳細]
 
std::vector< Tettets
 四面体
 
追加情報 基本情報からSetDesc()が計算して求める。
std::vector< int > surfaceVertices
 物体表面の頂点のID
 
std::vector< Facefaces
 
 
unsigned nSurfaceFace
 面のうち物体表面のものが、faces[0]..faces[nSurfaceFace-1] 以降は内側の面:faces[nSurfaceFace]..faces[faces.size()]
 
std::vector< Edgeedges
 
 
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
 名前
 
NameManagernameManager
 名前の検索や重複管理をするもの.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

頂点


このクラスの説明は次のファイルから生成されました: