`elem_node_index` 型不整合修正(その2)
Closes #751 (closed)
概要
hecmwST_local_mesh.elem_node_index は long long * として宣言されているが、その値や派生ポインタを int 型の変数・配列・関数引数で受けている箇所が複数残っていた。これらの型不整合(縮小代入、ポインタ型不一致、(int *)calloc で long long * メンバへ代入する致命的なバグ等)を修正する。
参照コミット
過去のコミット 58b91e2f "Use long long for elem_node_index" と同じ方針:
- 変数宣言・関数引数の
intをlong longに変更 (int *)HECMW_malloc(sizeof(int) * ...)を(long long *)HECMW_malloc(sizeof(long long) * ...)に変更- MPI 通信は
HECMW_INTをHECMW_LONG_LONGに変更(本MRでは該当箇所なし)
変更ファイル
| ファイル | 主な変更内容 |
|---|---|
| hecmw1/src/common/hecmw_dist_refine.c | elem_node_index_ref を long long * に。ref_mesh->elem_node_index を (long long *)HECMW_malloc(sizeof(long long) * ...) で確保。new_elem_node_index を long long * に変更し、mesh->elem_node_index への再代入を整合させた。jstart、各所の局所 nn、start_old/start_new を long long に。reorder_nodes の elem_node_item 反復ループには局所 long long ii を導入 |
| hecmw1/src/common/hecmw_io_mesh.c | setup_elem の int n を long long n に変更 |
| hecmw1/src/common/hecmw_ucd_print.c | ucd_print の int node_index を long long node_index に変更 |
| hecmw1/src/couple/hecmw_couple_background_cell.c | elem_size_by_elem/elem_size_by_surf のループカウンタ j を long long に変更 |
| hecmw1/src/couple/hecmw_couple_boundary_info.c | set_boundary_node_by_elem の j、set_boundary_node_by_surf の node_index を long long に変更 |
| hecmw1/src/couple/hecmw_couple_bounding_box.c | HECMW_couple_set_bounding_box のループカウンタ j を long long に変更 |
| hecmw1/src/couple/hecmw_couple_inter_iftable.c | bgcell 関係2関数のループカウンタ j を long long に変更 |
| hecmw1/src/couple/hecmw_couple_judge.c | HECMW_couple_judge_tet1/HECMW_couple_judge_hex1 の node_index を long long に変更 |
| hecmw1/src/couple/hecmw_couple_mapped_point.c | set_mapped_point_by_elem のループカウンタ j を long long に変更 |
| hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_elem_sr_adapt.c | new_mesh->elem_node_index の確保を (long long *)calloc(..., sizeof(long long)) に修正。elem_node_index を反復する4箇所(L208/L274/L1604/L1623)に局所 long long jj を導入。L2338 ブロック内に局所 long long *new_idx_tmp, *new_idx_tmp2, jj を導入し、elem_node_index の差分計算用一時配列を long long * 化。tmp_int_send/tmp2_int_send への代入には明示的な (int) キャストで narrowing を表明 |
| hecmw1/src/operations/dynamic_load_balancing/hecmw_dlb_mesh2graph.c | add8_adj_link/add6_adj_link/add4_adj_link の j/ncon を long long に変更 |
| hecmw1/src/operations/dynamic_load_balancing/output_ucd_c.c | write_dist_mesh_display の elem_node_index 反復ループを局所スコープ { long long jj; ... } に分離 |
| hecmw1/src/visualizer/hecmw_fstr_output_exo.c | get_effective_n_nodes と exodus_output の int jS, jE を long long jS, jE に変更 |
| hecmw1/src/visualizer/hecmw_fstr_output_vtk.c | vtk_output/bin_vtk_output の int jS, jE を long long jS, jE に変更。for (j = jS; j < jE-shift; j++) のループ4箇所には局所 long long jj を導入し narrowing を回避 |
| hecmw1/src/visualizer/hecmw_vis_mesh_extent.c | calc_extent のループカウンタ j を long long に変更 |
| hecmw1/src/visualizer/hecmw_vis_ucd_trans.c | transform_ucd_pvr の elem_node_index 反復ループを局所スコープ { long long jj; ... } に分離 |
| hecmw1/tools/hec2rcap/hec2rcap.c | int n0 を long long n0 に変更 |
注意事項
1. 局所スコープの導入方針
ループカウンタ等の変数が 同一関数内で複数の用途に使われている 場合、関数上部の int 宣言を long long に変更すると他用途のループ(小整数範囲の int 配列イテレーション等)にも波及してしまう。そのため、long long が必要な箇所のみ { long long jj; for (jj = ...; ...) { ... } } のように 局所スコープを作成して近傍で宣言 した。
該当箇所:
- hecmw_dist_refine.c:
reorder_nodesのelem_node_item反復でlong long iiをローカルブロックに導入 - hecmw_dlb_elem_sr_adapt.c:
mesh_migration_adapt関数内ではjがpesize/adapt_children_index/send_elem_num等の int 範囲ループで多数利用されているため、elem_node_indexを反復する4箇所のみ局所long long jjを導入。L2338 のブロックはnew_idx_tmp/new_idx_tmp2も含めて局所スコープにまとめた - output_ucd_c.c:
jはtn_component範囲ループでも利用されているため、elem_node_index反復のみ局所long long jjを導入 - hecmw_fstr_output_vtk.c: 関数内で
jが複数の用途に使われているため、for (j = jS; j < jE-shift; j++)の4ループに局所long long jjを導入 - hecmw_vis_ucd_trans.c:
jはdata->nn_componentループ等でも利用されているため、elem_node_index反復のみ局所long long jjを導入
2. プリプロセッサで除外される箇所は修正対象外
- hecmw_partition.c の
mask_boundary_elem_with_slaveおよびmask_boundary_link_elem_with_slave(L3792-3864) は#if 0 ... #endifブロック内のため、コンパイル対象外。本MRでは変更を加えていない - hecmw_dlb_migrate.c L173 周辺の
elem_node_index反復ループは/* ... */のコメントブロック内のため、本MRでは変更を加えていない
3. 設計判断: 明示的な int キャストを残した箇所
hecmw_dlb_elem_sr_adapt.c の tmp_int_send[i]/tmp2_int_send[i] (L1246, L1252) では、mesh->elem_node_index[..+1] - mesh->elem_node_index[..](要素当たりの節点数、最大でも数十)を代入している。これらの buffer は MPI 通信で int * として再利用されている多目的バッファであり、型を long long * に変更すると通信仕様および呼び出し側全体に影響が波及する。値域が int に十分収まるため、明示的な (int) キャストで縮小を表明する形に留めた:
tmp_int_send[i] = (int)(mesh->elem_node_index[send_elem[i] + 1] -
mesh->elem_node_index[send_elem[i]]);