![]() |
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 () |
![]() | |
virtual void | SetScene (SceneIf *s) |
virtual SceneIf * | GetScene () const |
virtual SceneObjectIf * | CloneObject () |
![]() | |
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の取得 | |
![]() | |
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 | |
![]() | |
virtual void | PrintHeader (std::ostream &os, bool bClose) const |
開き括弧 | |
![]() | |
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 void | ConstructState (ObjectIf *o, char *&s) |
sをoのStateとして初期化する. | |
static void | DestructState (ObjectIf *o, char *&s) |
sをoのStateからメモリブロックに戻す. | |
![]() | |
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 |
頂点