`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]]);
Edited by Kanato Kono

Merge request reports

Loading
Loading