SlideShare a Scribd company logo
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
ADVENTURE_Solidの関数
荻野正雄 (九州大学)
2006年9月15日(金)
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
内容
• 入力データについて
- 階層型領域分割された入力データの構造
- 入力データを読み込む関数フロー
- 入力されたデータへのアクセス例
• 線形方程式の領域分割法による解法について
- CG法に基づく解法
- 係数行列とのベクトル積の計算方法
- 係数行列を作る関数フロー
• 階層型領域分割法の並列処理について
- infree自由度とoutfree自由度
- ベクトルノルム計算の並列処理方法
- CG法処理の関数フロー
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
今回の内容について
• 弾性問題解析が中心
• 前処理法(BDDなど)については扱わない
• 並列処理はp-mode
• 解説するのはsolver/以下の関数について
• 基本的なC言語は理解しているとする
• MPIの関数解説は扱わない
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
内容
• 入力データについて
- 階層型領域分割された入力データの構造
- 入力データを読み込む関数フロー
- 入力されたデータへのアクセス例
• 線形方程式の領域分割法による解法について
- CG法に基づく解法
- 係数行列とのベクトル積の計算方法
- 係数行列を作る関数フロー
• 階層型領域分割法の並列処理について
- infree自由度とoutfree自由度
- ベクトルノルム計算の並列処理方法
- CG法処理の関数フロー
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
FEM解析モデルの領域分割
• AdvSolidではAdvMetisによって領域分割され
たデータの入力を前提としている.
一体型モデル(TetMesh/sample/nozzle) 階層型領域分割モデル
AdvMetis
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
階層型領域分割について
• 4角形1次要素: 64
  ↓階層型領域分割
• Part数: 4
Part内Subdomain数: 4
総Subdomain数: 16
• 領域分割によって生じた
境界面(基本境界を除く)
をInterfaceと呼ぶ
赤線は基本境界条件のある境界面
Element Subdomain Part
はInterface自由度
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
一体型モデルデータ
content_type(/fega_type/label)
Element
Node
FEGA/NodeVariable/ForcedDisplacement
FEGA/NodeVariable/Load
FEGA/AllElementConstant/YoungModulus
FEGA/AllElementConstant/PoissonRatio
FEGA: FEGenericAttribute
有限要素
節点座標
境界条件
材料物性
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
有限要素の階層型領域分割データ (1/2)
Subdomain単位, Part内の各Subdomainに属する有限要素
[Properties]
HDDM_Element
[Data]
要素数
要素コネクティビティ
…
要素数
要素コネクティビティ
…
Subdomainのデータ
節点番号はSubdomainローカル
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
有限要素の階層型領域分割データ (2/2)
Subdomain単位, Part内の各Subomainに属する要素の
領域分割前グローバル要素番号
[Properties]
HDDM_FEGA/AllElementVariable/ElementIndex_SubdomainToGlobal
[Data]
要素数
グローバル要素番号
…
要素数
グローバル要素番号
…
HDDM_FEGA: HDDM_FEGenericAttribute
Subdomainのデータ
現バージョンでは
特に用いない
現バージョンでは
特に用いない
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
節点情報の階層型領域分割データ (1/5)
Partに属する節点
[Properties]
Node
[Data]
節点座標(x, y, z)
…
節点座標情報はPartが担当する節点で
まとめて管理する
Subdomain毎の節点座標情報はこの
データから必要部分を抽出する
Partのデータ
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
節点情報の階層型領域分割データ (2/5)
Subdomain単位, Part内の各Subdomainに属する節点の
Partローカル番号
[Properties]
HDDM_FEGA/AllNodeVariable/NodeIndex_SubdomainToPart
[Data]
節点数
Partローカル節点番号
…
節点数
Partローカル節点番号
…
Subdomainのデータ
これを用いてSubdomain内の
節点座標情報を作成する
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
節点情報の階層型領域分割データ (3/5)
Partに属する節点の領域分割前グローバル番号
[Properties]
FEGA/AllNodeVariable/NodeIndex_PartToGlobal
[Data]
グローバル節点番号
…
現バージョンでは
特に用いない
現バージョンでは
特に用いない
Partのデータ
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
節点情報の階層型領域分割データ (4/5)
Part単位, Partが他Partと共有するInterface自由度番号情報
[Properties]
HDDM_InterfaceDOF
[Data]
自由度数
他PartでのローカルInterface自由度番号
…
自由度数
他PartでのローカルInterface自由度番号
…
Partのデータ
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
節点情報の階層型領域分割データ (5/5)
Subdomain単位, Part内の各Subdomainが他Subdomainと共有
するInterface自由度情報
[Properties]
HDDM_FEGA/NodeVariable/InterfaceDOF
[Data]
自由度数
節点番号 軸方向 担当Part番号 ¥
担当PartでのローカルInterface自由度番号 ¥
このPartでのローカルInterface自由度番号
…
Subdomainのデータ
節点番号はSubdomainローカル
AdvSolidでは
使用していない
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
境界条件の階層型領域分割データ
Partが担当する境界条件を, 節点が属する部分領域毎に
[Properties]
HDDM_FEGA/NodeVariable/ForcedDisplacement
HDDM_FEGA/NodeVariable/Load
[Data]
境界条件数
節点番号 軸方向 値
…
境界条件数
節点番号 軸方向 値
…
Subdomainのデータ
節点番号はSubdomainローカル
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
材料物性の階層型領域分割データ
全Partに同じデータが配布される
[Properties]
HDDM_FEGA/AllElementConstant/YoungModulus
HDDM_FEGA/AllElementConstant/PoissonRatio
[Data]
値
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
入力データを格納する変数.
変数名: pmesh
型: PartMesh*
宣言場所: main.c
特徴:
 プロセッサ毎に担当するPart数の大きさだけ動的確保が行
われる.担当Part数は int get_my_npart() により取得できる
が,逐次計算では全Part数,p-mode並列計算では1となる.
 メンバー変数として,Part内のSubdomain情報を格納するた
めの DomMesh* dom を持つ.
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
主な入力データの格納先
• HDDM_Element
PartMesh* pmesh → DomMesh* dom → int* nop
• Node
PartMesh* pmesh → double* crd
• HDDM_FEGA/NodeIndex_SubdomainToPart
PartMesh* pmesh → DomMesh* dom → int* ndindex
• HDDM_InterfaceDOF
PartMesh* pmesh → OPinfo* op
• HDDM_FEGA/InterfaceDOF
PartMesh* pmesh → DomMesh* dom → Inbc* inbd
• HDDM_FEGA/ForcedDisplacement
PartMesh* pmesh → DomMesh* dom
→ Slist* bclist → BCset* bcset → Bcnd* bcdisp
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
入力データ読込み関数の呼び出し
void Static_Solver_AllInit() {
…
mynparts = get_my_npart();
for (ipart = 0; ipart < mynparts; ipart++) {
if (! is_file_access_parallel()) COM_Grp_Synchronize();
if (! is_my_part(ipart)) continue;
make_indata_filename();
myipart = gpart2mypart(ipart);
pmesh[myipart]=NewPartMesh_fromAdvFile();
pfield[myipart]=NewPartField();
}
…
}
担当Part数分のforループ
s-mode: 全Part数
p-mode: 1
並列処理時にファイルシステムへの
同時アクセスを避ける仕組み
1つのPartの入力データを読み込む
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
関数NewPartMesh_fromAdvFile
PartMesh NewPartMesh_fromAdvFile() {
AdvDatabox* dbox;
dbox = adv_dbox_new();
adv_dbox_add(dbox, fname);
ReadPartDocs_fromAdvDbox();
pmesh.dom = (DomMesh *) Calloc();
Read_HDDM_Element_fromAdvDbox();
Read_HDDMFEGA_DomNdindex_fromAdvDbox();
Read_HDDMFEGA_InterfaceDOF_fromAdvDbox();
Read_HDDMFEGA_BCond_fromAdvDbox();
Read_HDDMFEGA_MaterialID_fromAdvDbox();
…
adv_dbox_close();
}
AdvIO形式のファイルを
AdvDataboxとして開く
Node, HDDM_InterfaceDOFの読込み
AdvDataboxを閉じる
Subdomain単位の
各種データを読み込む
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
void Read_HDDMFEGA_DomNdindex_fromAdvDbox() {
AdvDocument* doc;
adv_off_t off;
char *content_type, *label;
content_type = "HDDM_FEGenericAttribute";
label = "NodeIndex_SubdomainToPart";
doc = adv_dbox_find_by_property(dbox, NULL,
"content_type", content_type, "label", label, NULL);
off = 0;
for (idom = 0; idom < n_domain; idom++) {
off += adv_dio_read_int32(doc, off, &size);
pmesh->dom[idom].nodes = size;
pmesh->dom[idom].ndindex = (int *) Calloc(sizeof(int), size);
off += adv_dio_read_int32v(doc, off, size, pmesh->dom[idom].ndindex);
}
}
content_typeとlabelを指定して,
読み込みたいDocumentを探す
定番の記述方法
Documentのデータを読み込むのに必要な変数
int型整数を1つData領域から
読み込む
int型整数をsize個Data領域から
読み込む
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
データのアクセス方法 (1/4)
• あるPartへのアクセス例
void HDDM_Solver_Parent(…, PartMesh* pmesh,…) {
…
int ipart, mynparts;
…
mynparts = get_my_npart();
…
for (ipart = 0; ipart < mynparts; ipart++) {
partsolv(…, pmesh[ipart], …);
}
…
}
担当Partに順番にアクセスする
single/p-mode両者共通のコード
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
データのアクセス方法 (2/4)
• あるSubdomainへのアクセス例
void make_coarse_space_part(…, PartMesh pmesh, …) {
int idom;
…
DomMesh dmesh;
…
for (idom = 0; idom < pmesh.n_domain; idom++) {
dmesh = pmesh.dom[idom];
…
}
…
}
この場合は,DomMesh構造体の代入を
行っていることには注意しておく
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
データのアクセス方法 (3/4)
• ある要素の頂点番号へのアクセス
for (ipart = 0; ipart < get_my_npart(); ipart++) {
for (idom = 0; idom < pmesh[ipart].n_domain; idom++) {
DomMesh* dmesh = pmesh[ipart].dom+idom;
for (ielm = 0; ielm < dmesh.elms; ielm++) {
int* nop = dmesh.nop + ielm*dmesh.nd_elm;
for (i = 0; i < dmesh.nd_elm; i++) {
int dn_i, pn_i;
dn_i= nop[i]; 頂点iのSubdomainローカル節点番号
   pn_i= dmesh.ndindex[dn_i] ; 頂点iのPartローカル節点番号
}}}}
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
データのアクセス方法 (4/4)
• ある節点の座標値へのアクセス
for (ipart = 0; ipart < get_my_npart(); ipart++) {
double* pcrd = pmesh[ipart].crd;
for (idom = 0; idom < pmesh[ipart].n_domain; idom++) {
DomMesh* dmesh = pmesh[ipart].dom+idom;
for (i = 0; i < dmesh->nodes; i++) {
int pn_i = dmesh->ndindex[i] ; 頂点iのPartローカル節点番号
for (j = 0; j < dmesh->node_dim; j++) {
double x = pcrd[pn_i*dmesh->node_dim+j]; 頂点iの座標値
}}}}
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
入力データのまとめ
• Part単位,Subdomain単位のデータがある
• 要素,節点,境界条件らが領域分割された状態に
なり,Part間とSubdomain間の共有自由度情報が
新たに作成される
• 入力データは変数pmeshに格納される
• Partループ→Subdomainループ→要素ループや節
点ループというアクセスの流れになる
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
内容
• 入力データについて
- 階層型領域分割された入力データの構造
- 入力データを読み込む関数フロー
- 入力されたデータへのアクセス例
• 線形方程式の領域分割法による解法について
- CG法に基づく解法
- 係数行列とのベクトル積の計算方法
- 係数行列を作る関数フロー
• 階層型領域分割法の並列処理について
- infree自由度とoutfree自由度
- ベクトルノルム計算の並列処理方法
- CG法処理の関数フロー
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
AdvSolidの解析の流れ
開始
各領域の静解析
領域間境界の更新
応力積分
荷重増分の更新
終了
荷重増分
ループ
Newton-Raphson
反復
階層型領域分割法
CG法
反復
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
CG法に基づく領域分割法アルゴリズム
fKu =
gSuB =
線形化問題
( ) ( ) ( )
( ) ( ) ( )
( ) ( ) ( ) ( ) ( ) ( ) ( )
( )
( )
( )
( )
( ) ( )


















=


































∑∑ ==
N
i
i
B
i
B
N
I
I
B
N
I
I
N
i
Ti
B
i
BB
i
B
TN
IB
N
B
T
IBB
TN
B
N
IB
N
II
T
BIBII
fR
f
f
u
u
u
RKRKRKR
RKK
RKK
1
1
1
1
11
111
0
0
00
M
M
M
M
LL
LL
MMOM
MMO
L領域分割し,
Interface自由度
と各Subdomain
内部自由度に
整理
( ) ( ) ( ) ( )
( ) ( )
{ } ( ) ( ) ( ) ( ) ( )
( ) ( )
{ }∑∑ =
−
=
−
−=⋅






−
N
i
i
I
i
II
Ti
IB
i
B
i
BB
N
i
Ti
B
i
IB
i
II
Ti
IB
i
BB
i
B fKKfRuRKKKKR
1
1
1
1
Interface自由度に関する式に整理
このInterface自由度に関する問題を
前処理付き共役勾配法で解く
S: シュアコンプリメント行列
別紙1: pp.1-4を参照
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
PCG法のアルゴリズム
;
;
;
;
00
0
1
0
00
0
zp
rMz
guSr
u
B
B
=
=
−=
−
}
break
)(if
{)k10k(for
;
;/
;
;
/
;
;
;/
;
;;
kkkk
k
T
kk
T
kk
kk
T
k
T
k
kkkk
kkkBkB
k
T
kk
T
kk
kk
pzp
zrzr
rMz
zrzr
qrr
puu
qpzr
Spq
ββββ
ββββ
εεεε
αααα
αααα
αααα
+=
=
=
≤
−=
−=
=
=
++=
++
++
+
−
+
++
+
+
11
11
1
1
1
0011
1
1
初期化 CG反復
別紙1: p.9を参照
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
シュアコンプリメント行列との
ベクトル積を計算する方法
( ) ( ) ( ) ( ) ( )
( ) ( )
pRKKKKRSp
N
i
Ti
B
i
IB
i
II
Ti
IB
i
BB
i
B∑ =
−
−= 1
1
( )
( )
( )
1
1
0
0
−
−








=
iI
K
K
i
IIi
ΓΓΓΓ
|
この部分をSubdomain毎に計算し,重ね合わせる
( )
( ) ( )
( ) ( ) 





= i
BB
Ti
IB
i
IB
i
IIi
KK
KK
K ローカル剛性行列
与えられたDirichlet境界に加えてInterface
境界も拘束したK(i)をLDLT分解したもの
用意するもの
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
シュアコンプリメント行列との
ベクトル積を計算する方法
• 考え方: Interface境界にuB
(i)=p(i)の変位拘束条件を与え,
      Interface境界上の反力を計算する
( ) ( ) ( )
( ) ( ) ( ) 





−







=








pRKK
KKf
Ti
B
i
BB
Ti
IB
i
IB
i
II
i
I
0
0
~
( ) ( )
( )
( )
















=





−
00
0
0
1
i
I
i
II
i
I f
I
Ku
i
~~
ΓΓΓΓ
( )
( ) ( )
( ) ( )
( )
( ) 













=




 ⋅
pR
u
KK
KK
q Ti
B
i
I
i
BB
Ti
IB
i
IB
i
II
i
~
1. K(i)を用いて変位拘束境界条件による右辺項を計算
2. K(i)-1を用いてSubdomain内部の変位量を計算
3. K(i)を用いてInterface上の反力量を計算
( ) ( ) ( )
pRKf
Ti
B
i
IB
i
I −=
~
( ) ( ) ( )
( ) ( ) ( )
pRKK
fKu
Ti
B
i
IB
i
II
i
I
i
II
i
I
1
1
−
−
−=
=
~~
( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( ) ( ) ( )
( ) ( ) ( ) ( )
( ) ( )
pRKKKK
pRKpRKKK
pRKuKq
Ti
B
i
IB
i
II
Ti
IB
i
BB
Ti
B
i
BB
Ti
B
i
IB
i
II
Ti
IB
Ti
B
i
BB
i
I
Ti
IB
i
1
1
−
−
−=
+−=
+= ~
別紙1: p.7を参照
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
関数domsolve
void domsolve() {
if (! SWCG_ITER) {
set_load_to_rhs(force, bcload);
for (i=0;i<matdim;i++) force[i] += hddmmat.force[i];
}
for (i=0;i<matdim;i++) disp[i] = force[i];
put_neg_bcdisp_to_vec(bcdisp, reac);
skysl1_add_multvec(gk, reac, disp);
SKY_MkSolution(gk_inv, disp);
put_bcdisp_to_vec(bcdisp, disp);
skysl1_add_multvec(gk, disp, reac);
if (SWCG_LAST) renew_stress();
}
CG法初期とCG法収束後であれば,
荷重境界条件を右辺ベクトルに入力
作成済みの体積力を加える
dispに右辺項forceを代入
reacに変位規定値を負で入力
dispに剛性行列とreacの積を追加
dispを右辺として解く
dispに変位規定値を再代入
reacに剛性行列とdispの積を代入
CG法収束後であれば応力を計算
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
係数行列を作る関数フロー
• solver/hddm_solver.c: HDDM_Solver_Parent()
   PCG法に基づいて線形化問題を解く
⇒ solver/s_partsolver.c: spartsolv()
   シュアコンプリメント行列-ベクトル積を計算
  CG法初期では残差計算,収束後は領域内部自由度計算
⇒ solver/domfem.c: MkNewHDDM_SkylineMat()
   ローカル剛性行列K(i),LDLT分解したK(i)-1,
  体積力ベクトルを作成
⇒ solver/domfem.c: hddm_mkstiff()
   要素剛性行列,要素体積力ベクトルを作成し,
  全体に重ね合わせる
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
関数HDDM_Solver_Parent
void HDDM_Solver_Parent() {
MakeNewCGVectors();
SetupCGVectors();
PrepareKeepmat();
while (CG loop) {
partsolv();
if (SWCG_LAST) break;
IncrementCGstep_step1();
Make_Preconditioned_Gg();
IncrementCGstep_step2();
CGCheckConv();
PrepNextCGstep();
}
PurgeCGVectors();
}
CG法ベクトルp, r, z, qを確保
初期値uB0を設定
剛性行列K(i), K(i)-1と右辺f(i)の確保準備
uB, rの更新とrのノルム計算
前処理zを計算
pの更新
収束判定
CG法ベクトルp, r, z, qを解放
初期残差r0,またはq=Spを計算
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
関数partsolvvoid spartsolv() {
for (i = 0; i< pmesh.n_domain; i++) {
dmesh = SetDom4CG();
dfield = SetDomField4CG();
if (sw_kpmat == SWKP_MAKE) {
hddmmat = MkNewHDDM_SkylineMat();
save_hddmmat[i] = hddmmat;
} else {
hddmmat = save_hddmmat[i];
}
domsolve();
if (sw_cg != SWCG_LAST)
put_domvec_to_cgvec();
UnsetDom4CG();
UnsetDomField4CG();
}
}
メッシュデータ
物理量フィールド
初期ステップ時にK(i),
K(i)-1, f(i)を作成
保存しておいたK(i), K(i)-1, f(i)
初期残差r0
(i),またはq(i)=S(i)p(i)
結果の重ね合わせΣRB
(i)r0
(i),またはΣRB
(i)q(i)
保存
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
関数MkNewHDDM_SkylineMat
HDDM_SkylineMat MkNewHDDN_SkylineMat() {
skyline_mkindex();
hddm_mkstiff();
mk_bcdisp_table();
skyline_mkreducedindex();
copy_gk_to_inv();
SKY_Decomposite();
hddm_slmat.gk = gk;
hddm_slmat.gk_inv = gk_inv;
hddm_slmat.force = force;
return(hddm_slmat);
}
K(i)のスカイラインインデックス作成
K(i)の作成, 体積力と熱歪みによるf(i)を作成
変位拘束境界やInterface上にある自由度情報を作成
K(i)-1のスカイラインインデックス作成
Dirichlet境界を除いてK(i)をK(i)-1に複製
K(i)-1をLDLT分解
各種データを構造体に格納
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
関数hddm_mkstiffvoid hddm_mkstiff() {
for (i = 0; i < nel; i++) {
fe_material = get_fe_Constants();
material = get_Material_by_element();
get_nodal_elmdata_from_dom();
fe_make_elm_k();
skyline_add_ek_to_gk();
if (optsw.sw_gravity == 1) {
make_elm_gravity_force_3d();
add_elmf_to_force();
}
if (optsw.sw_gravity == 1) {
fe_mk_elm_thermal_force();
add_elmf_to_force();
}
}
}
要素剛性行列作成に必要な
材料物性を取得
材料物性を取得
要素構成節点の座標値を取得
要素剛性行列を作成
全体行列に重ね合わせ
自重による要素体積力ベクトルを作成
全体ベクトルに重ね合わせ
熱歪みによる要素荷重ベクトルを作成
全体ベクトルに重ね合わせ
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
solverからlibfemへ
• solver/domfem.c: hddm_mkstiff()
⇒ libfem/select_element.c: fe_make_elm_k()
   有限要素のタイプによって決まった関数を呼び出す.
⇒ libfem/s3d_element.c: make_elm_k_tet10()
   4面体2次要素の要素剛性行列(弾塑性解析時には
consistent接線剛性)を作成する.
要素単位の多くの処理は
libfem内にあるファイルに記述されている
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
線形方程式の領域分割法による
解法についてのまとめ
• Interface問題をCG法で解く.
• CG法アルゴリズム中における係数行列とのベクトル
積は,各Subdomain毎に有限要素解析を行うことで
計算する.
• 要素剛性行列や要素体積力ベクトルなどの要素単
位の計算を行う関数はlibfem以下に存在する.
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
内容
• 入力データについて
- 階層型領域分割された入力データの構造
- 入力データを読み込む関数フロー
- 入力されたデータへのアクセス例
• 線形方程式の領域分割法による解法について
- CG法に基づく解法
- 係数行列とのベクトル積の計算方法
- 係数行列を作る関数フロー
• 階層型領域分割法の並列処理について
- infree自由度とoutfree自由度
- ベクトルノルム計算の並列処理方法
- CG法処理の関数フロー
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
;
;
;
;
00
0
1
0
00
0
zp
rMz
guSr
u
B
B
=
=
−=
−
PCG法の並列処理
}
break
)(if
{)k10k(for
;
;/
;
;
/
;
;
;/
;
;;
kkkk
k
T
kk
T
kk
kk
T
k
T
k
kkkk
kkkBkB
k
T
kk
T
kk
kk
pzp
zrzr
rMz
zrzr
qrr
puu
qpzr
Spq
ββββ
ββββ
εεεε
αααα
αααα
αααα
+=
=
=
≤
−=
−=
=
=
++=
++
++
+
−
+
++
+
+
11
11
1
1
1
0011
1
1
初期化 CG反復
1. シュアコンプリメント
行列とのベクトル積
2. ベクトルノルム
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
infreeとoutfreeについて (1/2).
• Interface自由度は,
(i) Part内部自由度
(ii) Part間共有自由度
に分けられる.
部分が(ii)となるが,
共有部分は担当Partを
決定しておく.
はinfree自由度
Part0
Part1 Part2
Part3
はoutfree自由度
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
infreeとoutfreeについて (2/2).
- 各Partのinfree自由度の
合計が全体のInterface
自由度になる
[利用例]
- 残差ベクトルなどの全体
Interface自由度ベクトル
のノルムをとる場合は
infreeのみを観れば良い
- 袖領域の情報交換が必
要なときはoutfree情報を
用いる
全体Interface自由度ベクトル
Part0
Part1
Part2
Part3
はinfree自由度
はoutfree自由度
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
シュアコンプリメント行列-ベクトル積の並列処理
全体Interface自由度ベクトル
は他Partと共有していないinfree自由度
は他Partと共有しているinfree自由度
( ) ( )
∑ =
= PN
i
ii
BP qRq 10q
1q
2q
3q
各プロセッサが担当するPart
毎に並列に重ね合わせを行う
はoutfree自由度
Part間で共有されている
■や■の自由度部分は
Part間での重ね合わせが必要
outfree部分を担当する
プロセッサに送信する
各プロセッサが担当するPart
のinfree部分は完全になる
void GatherCGVectorOf()
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
重ね合わせ結果の配布
全体Interface自由度ベクトル
はinfree自由度
0q
1q
2q
3q
はoutfree自由度
各プロセッサが担当するPart
のinfree部分は完全
共有する他プロセッサの
outfree部分に送信する
void DistribCGVectorOf()
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
ベクトルノルムの並列処理
全体Interface自由度ベクトル
Part0
Part1
Part2
Part3
はinfree自由度
はoutfree自由度
0r
1r
2r
3r
残差ベクトルのノルムを
計算する場合,
各プロセッサが担当する
Partのinfree部分は
Part間で重なりがない.00 rr
T
11 rr
T
22 rr
T
33 rr
T
rrT
double CGvector_inner_prod()
各プロセッサ毎にinfree部分の
内積を計算し,その後全プロ
セッサで重ね合わせて,平方根
をとる
r
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
CG法処理の関数フロー
void IncrementCGstep_step1() {
GatherCGVectorOf(CGVEC_AW);
UpdateCGVector_gmyu();
GetCGnorm(CGVEC_G);
}
void IncrementCGstep_step2() {
CGvector_g_dot_g();
CGMakegamma();
UpdateCGVector_w();
CGvector_keep_gdotg();
}
Part毎のq=Spの結果を重ね合わせ
Part毎にuB, rのinfree部分を更新
残差ベクトルrのノルムを計算
残差ベクトルrの内積を計算
ββββを計算
Part毎に補助ベクトルpを更新
残差ベクトルrの内積を保存
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
階層型領域分割法の
並列処理についてのまとめ
• 各PartのInterface自由度には
infree部分とoutfree部分がある
• Subdomain毎の行列-ベクトル積後などは,
Interface上での情報交換が必要となる
• CG法ベクトル処理などはinfree部分で行えばよい
• 以上から,本アルゴリズムにおける必要な通信量は
少ない
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
AdvSolid全体について
• AdvSolidのコーディング方法は,
- 弾性/弾塑性や逐次/並列などの共通部分を生かし,
- 大枠の関数部分は同じプログラミングにし,
- 最終的な実作業部分でif条件文により分ける,
といった形が多い.よって,
- 関数構造が深くなってしまっているが,
根気強く眺めていただきたい.
次期公開版ではコードの解読性を改善させます.
                                        第4回ADVENTURE定期セミナー ADVENTURE_Solidの関数
ADVENTURE_Solid開発状況
• 次回正式公開版はVer.2.0になる予定
- Newmark's β法による非定常問題解析 (済済済済)
- 境界条件の時間依存性 (済済済済)
- AdvThermalとの連成解析強化(非定常) (済済済済)
- 物性値の温度依存性 (済済済済)
- 多点拘束条件の考慮 (開発中)
- 材料異方性の考慮 (開発中)

More Related Content

More from ADVENTURE Project

ADVENTURE_sFlowの最新動向
ADVENTURE_sFlowの最新動向ADVENTURE_sFlowの最新動向
ADVENTURE_sFlowの最新動向
ADVENTURE Project
 
ADVENTURE_Solid Ver.2.0の概要
ADVENTURE_Solid Ver.2.0の概要ADVENTURE_Solid Ver.2.0の概要
ADVENTURE_Solid Ver.2.0の概要
ADVENTURE Project
 
ADVENTURE_BCtool Ver.2.の概要と実際[デモ]
ADVENTURE_BCtool Ver.2.の概要と実際[デモ]ADVENTURE_BCtool Ver.2.の概要と実際[デモ]
ADVENTURE_BCtool Ver.2.の概要と実際[デモ]
ADVENTURE Project
 
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTURE Project
 
大規模並列解析用可視化モジュール ADVENTURE_POSTtool
大規模並列解析用可視化モジュール ADVENTURE_POSTtool大規模並列解析用可視化モジュール ADVENTURE_POSTtool
大規模並列解析用可視化モジュール ADVENTURE_POSTtool
ADVENTURE Project
 
Linuxにおけるコマンドとエディタの使用方法の紹介
Linuxにおけるコマンドとエディタの使用方法の紹介Linuxにおけるコマンドとエディタの使用方法の紹介
Linuxにおけるコマンドとエディタの使用方法の紹介
ADVENTURE Project
 
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTURE Project
 
ADVENTURE AutoGL 「おてがる」
ADVENTURE AutoGL 「おてがる」ADVENTURE AutoGL 「おてがる」
ADVENTURE AutoGL 「おてがる」
ADVENTURE Project
 
ADVENTURE_Solid-1.2 構造体リファレンスマニュアル
ADVENTURE_Solid-1.2 構造体リファレンスマニュアルADVENTURE_Solid-1.2 構造体リファレンスマニュアル
ADVENTURE_Solid-1.2 構造体リファレンスマニュアル
ADVENTURE Project
 
ADVENTURE_Solid 線形代数関数群 advlasリファレンスマニュアル
ADVENTURE_Solid 線形代数関数群 advlasリファレンスマニュアルADVENTURE_Solid 線形代数関数群 advlasリファレンスマニュアル
ADVENTURE_Solid 線形代数関数群 advlasリファレンスマニュアル
ADVENTURE Project
 
ADVENTURE_Solid Ver.1.2の概要
ADVENTURE_Solid Ver.1.2の概要ADVENTURE_Solid Ver.1.2の概要
ADVENTURE_Solid Ver.1.2の概要
ADVENTURE Project
 
DecisionMaker
DecisionMakerDecisionMaker
DecisionMaker
ADVENTURE Project
 
原子力発電プラントの地震耐力予測シミュレーション
原子力発電プラントの地震耐力予測シミュレーション原子力発電プラントの地震耐力予測シミュレーション
原子力発電プラントの地震耐力予測シミュレーション
ADVENTURE Project
 
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTURE Project
 
ADVENTURE_Magnetic Ver.1.3の解説
ADVENTURE_Magnetic Ver.1.3の解説ADVENTURE_Magnetic Ver.1.3の解説
ADVENTURE_Magnetic Ver.1.3の解説
ADVENTURE Project
 
領域分割法による定常非圧縮性流れ解析
領域分割法による定常非圧縮性流れ解析領域分割法による定常非圧縮性流れ解析
領域分割法による定常非圧縮性流れ解析
ADVENTURE Project
 
Stationary Incompressible Viscous Flow Analysis by a Domain Decomposition Method
Stationary Incompressible Viscous Flow Analysis by a Domain Decomposition MethodStationary Incompressible Viscous Flow Analysis by a Domain Decomposition Method
Stationary Incompressible Viscous Flow Analysis by a Domain Decomposition Method
ADVENTURE Project
 
ADVENTUREの他のモジュールの近況
ADVENTUREの他のモジュールの近況ADVENTUREの他のモジュールの近況
ADVENTUREの他のモジュールの近況
ADVENTURE Project
 
ADVENTURE_Solid-1.1 構造体リファレンス
ADVENTURE_Solid-1.1 構造体リファレンスADVENTURE_Solid-1.1 構造体リファレンス
ADVENTURE_Solid-1.1 構造体リファレンス
ADVENTURE Project
 
領域分割法
領域分割法領域分割法
領域分割法
ADVENTURE Project
 

More from ADVENTURE Project (20)

ADVENTURE_sFlowの最新動向
ADVENTURE_sFlowの最新動向ADVENTURE_sFlowの最新動向
ADVENTURE_sFlowの最新動向
 
ADVENTURE_Solid Ver.2.0の概要
ADVENTURE_Solid Ver.2.0の概要ADVENTURE_Solid Ver.2.0の概要
ADVENTURE_Solid Ver.2.0の概要
 
ADVENTURE_BCtool Ver.2.の概要と実際[デモ]
ADVENTURE_BCtool Ver.2.の概要と実際[デモ]ADVENTURE_BCtool Ver.2.の概要と実際[デモ]
ADVENTURE_BCtool Ver.2.の概要と実際[デモ]
 
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
 
大規模並列解析用可視化モジュール ADVENTURE_POSTtool
大規模並列解析用可視化モジュール ADVENTURE_POSTtool大規模並列解析用可視化モジュール ADVENTURE_POSTtool
大規模並列解析用可視化モジュール ADVENTURE_POSTtool
 
Linuxにおけるコマンドとエディタの使用方法の紹介
Linuxにおけるコマンドとエディタの使用方法の紹介Linuxにおけるコマンドとエディタの使用方法の紹介
Linuxにおけるコマンドとエディタの使用方法の紹介
 
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
 
ADVENTURE AutoGL 「おてがる」
ADVENTURE AutoGL 「おてがる」ADVENTURE AutoGL 「おてがる」
ADVENTURE AutoGL 「おてがる」
 
ADVENTURE_Solid-1.2 構造体リファレンスマニュアル
ADVENTURE_Solid-1.2 構造体リファレンスマニュアルADVENTURE_Solid-1.2 構造体リファレンスマニュアル
ADVENTURE_Solid-1.2 構造体リファレンスマニュアル
 
ADVENTURE_Solid 線形代数関数群 advlasリファレンスマニュアル
ADVENTURE_Solid 線形代数関数群 advlasリファレンスマニュアルADVENTURE_Solid 線形代数関数群 advlasリファレンスマニュアル
ADVENTURE_Solid 線形代数関数群 advlasリファレンスマニュアル
 
ADVENTURE_Solid Ver.1.2の概要
ADVENTURE_Solid Ver.1.2の概要ADVENTURE_Solid Ver.1.2の概要
ADVENTURE_Solid Ver.1.2の概要
 
DecisionMaker
DecisionMakerDecisionMaker
DecisionMaker
 
原子力発電プラントの地震耐力予測シミュレーション
原子力発電プラントの地震耐力予測シミュレーション原子力発電プラントの地震耐力予測シミュレーション
原子力発電プラントの地震耐力予測シミュレーション
 
ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介ADVENTUREの他のモジュール・関連プロジェクトの紹介
ADVENTUREの他のモジュール・関連プロジェクトの紹介
 
ADVENTURE_Magnetic Ver.1.3の解説
ADVENTURE_Magnetic Ver.1.3の解説ADVENTURE_Magnetic Ver.1.3の解説
ADVENTURE_Magnetic Ver.1.3の解説
 
領域分割法による定常非圧縮性流れ解析
領域分割法による定常非圧縮性流れ解析領域分割法による定常非圧縮性流れ解析
領域分割法による定常非圧縮性流れ解析
 
Stationary Incompressible Viscous Flow Analysis by a Domain Decomposition Method
Stationary Incompressible Viscous Flow Analysis by a Domain Decomposition MethodStationary Incompressible Viscous Flow Analysis by a Domain Decomposition Method
Stationary Incompressible Viscous Flow Analysis by a Domain Decomposition Method
 
ADVENTUREの他のモジュールの近況
ADVENTUREの他のモジュールの近況ADVENTUREの他のモジュールの近況
ADVENTUREの他のモジュールの近況
 
ADVENTURE_Solid-1.1 構造体リファレンス
ADVENTURE_Solid-1.1 構造体リファレンスADVENTURE_Solid-1.1 構造体リファレンス
ADVENTURE_Solid-1.1 構造体リファレンス
 
領域分割法
領域分割法領域分割法
領域分割法
 

ADVENTURE_Solidの関数