build_parts_mesh Subroutine

public subroutine build_parts_mesh(cfg, mesh)

有効な OBJ と template を連結し、1つのメッシュへまとめる。

Arguments

Type IntentOptional Attributes Name
type(app_config), intent(in) :: cfg

parts 設定を含むアプリ設定。

type(mesh_type), intent(out) :: mesh

連結後の三角形メッシュ。


Calls

proc~~build_parts_mesh~~CallsGraph proc~build_parts_mesh build_parts_mesh proc~apply_obj_transform apply_obj_transform proc~build_parts_mesh->proc~apply_obj_transform proc~build_one_template build_one_template proc~build_parts_mesh->proc~build_one_template proc~init_mesh init_mesh proc~build_parts_mesh->proc~init_mesh proc~load_obj_mesh load_obj_mesh proc~build_parts_mesh->proc~load_obj_mesh proc~surface_model_id_from_name surface_model_id_from_name proc~build_parts_mesh->proc~surface_model_id_from_name proc~apply_obj_transform->proc~init_mesh proc~lower_ascii lower_ascii proc~build_one_template->proc~lower_ascii proc~make_annulus make_annulus proc~build_one_template->proc~make_annulus proc~make_box make_box proc~build_one_template->proc~make_box proc~make_cylinder make_cylinder proc~build_one_template->proc~make_cylinder proc~make_disk make_disk proc~build_one_template->proc~make_disk proc~make_icosphere make_icosphere proc~build_one_template->proc~make_icosphere proc~make_plane make_plane proc~build_one_template->proc~make_plane proc~make_plate_hole make_plate_hole proc~build_one_template->proc~make_plate_hole proc~make_sphere make_sphere proc~build_one_template->proc~make_sphere proc~update_mesh_geometry update_mesh_geometry proc~init_mesh->proc~update_mesh_geometry proc~build_mesh_from_indexed build_mesh_from_indexed proc~load_obj_mesh->proc~build_mesh_from_indexed proc~parse_obj parse_obj proc~load_obj_mesh->proc~parse_obj proc~scan_obj scan_obj proc~load_obj_mesh->proc~scan_obj proc~surface_model_id_from_name->proc~lower_ascii proc~build_mesh_from_indexed->proc~init_mesh proc~make_annulus->proc~init_mesh proc~push_tri push_tri proc~make_annulus->proc~push_tri proc~make_box->proc~init_mesh proc~make_box->proc~push_tri proc~make_cylinder->proc~init_mesh proc~make_cylinder->proc~push_tri proc~make_disk->proc~make_annulus proc~make_icosphere->proc~init_mesh proc~make_plane->proc~init_mesh proc~make_plate_hole->proc~init_mesh proc~make_plate_hole->proc~push_tri proc~ray_to_rectangle ray_to_rectangle proc~make_plate_hole->proc~ray_to_rectangle proc~transition_corner_count transition_corner_count proc~make_plate_hole->proc~transition_corner_count proc~transition_corners transition_corners proc~make_plate_hole->proc~transition_corners proc~make_sphere->proc~init_mesh proc~make_sphere->proc~push_tri proc~is_face_line is_face_line proc~parse_obj->proc~is_face_line proc~is_vertex_line is_vertex_line proc~parse_obj->proc~is_vertex_line proc~parse_face_line parse_face_line proc~parse_obj->proc~parse_face_line proc~parse_vertex_line parse_vertex_line proc~parse_obj->proc~parse_vertex_line proc~read_obj_line read_obj_line proc~parse_obj->proc~read_obj_line proc~count_face_tokens count_face_tokens proc~scan_obj->proc~count_face_tokens proc~scan_obj->proc~is_face_line proc~scan_obj->proc~is_vertex_line proc~scan_obj->proc~read_obj_line proc~build_collision_grid build_collision_grid proc~update_mesh_geometry->proc~build_collision_grid proc~cross~2 cross proc~update_mesh_geometry->proc~cross~2 proc~fill_panel_quadrature fill_panel_quadrature proc~update_mesh_geometry->proc~fill_panel_quadrature proc~init_panel_geometry init_panel_geometry proc~update_mesh_geometry->proc~init_panel_geometry proc~cell_id cell_id proc~build_collision_grid->proc~cell_id proc~coord_to_cell coord_to_cell proc~build_collision_grid->proc~coord_to_cell proc~next_face_token next_face_token proc~count_face_tokens->proc~next_face_token proc~parse_face_line->proc~count_face_tokens proc~parse_face_line->proc~next_face_token proc~strip_cr strip_cr proc~read_obj_line->proc~strip_cr proc~edge_order_index edge_order_index proc~transition_corner_count->proc~edge_order_index proc~transition_corners->proc~transition_corner_count proc~corner_between corner_between proc~transition_corners->proc~corner_between proc~edge_next_ccw edge_next_ccw proc~transition_corners->proc~edge_next_ccw

Called by

proc~~build_parts_mesh~~CalledByGraph proc~build_parts_mesh build_parts_mesh proc~build_mesh_from_config build_mesh_from_config proc~build_mesh_from_config->proc~build_parts_mesh proc~load_or_init_run_state load_or_init_run_state proc~load_or_init_run_state->proc~build_mesh_from_config program~main main program~main->proc~load_or_init_run_state

Source Code

  subroutine build_parts_mesh(cfg, mesh)
    type(app_config), intent(in) :: cfg
    type(mesh_type), intent(out) :: mesh
    ! Keep only vertices between passes; retaining whole meshes would also retain
    ! every part's geometry caches. Move ownership without copying the vertices.
    type :: part_vertices
      real(dp), allocatable :: v0(:, :), v1(:, :), v2(:, :)
    end type part_vertices
    type(part_vertices), allocatable :: parts(:)
    type(mesh_type) :: part
    real(dp), allocatable :: v0(:, :), v1(:, :), v2(:, :), elem_epsilon_r(:)
    integer(i32), allocatable :: elem_mesh_id(:), elem_surface_model(:)
    integer(i32) :: i, mesh_id, n
    integer(i64) :: first, last

    allocate (parts(cfg%n_mesh_parts))
    n = 0_i32
    do i = 1, cfg%n_mesh_parts
      if (.not. cfg%mesh_parts(i)%enabled) cycle
      if (trim(cfg%mesh_parts(i)%kind) == 'obj') then
        call load_obj_mesh(trim(cfg%mesh_parts(i)%path), part)
        call apply_obj_transform(part, cfg%mesh_parts(i)%scale, cfg%mesh_parts(i)%rotation, cfg%mesh_parts(i)%offset)
      else
        call build_one_template(cfg%mesh_parts(i), part)
      end if
      if (part%nelem > huge(n) - n) error stop 'Combined mesh element count exceeds the supported integer range.'
      n = n + part%nelem
      call move_alloc(part%v0, parts(i)%v0)
      call move_alloc(part%v1, parts(i)%v1)
      call move_alloc(part%v2, parts(i)%v2)
    end do
    if (n == 0_i32) error stop 'No enabled mesh.parts found in configuration.'

    allocate (v0(3, n), v1(3, n), v2(3, n), elem_mesh_id(n), elem_surface_model(n), elem_epsilon_r(n))
    mesh_id = 0_i32
    first = 1_i64
    do i = 1, cfg%n_mesh_parts
      if (.not. cfg%mesh_parts(i)%enabled) cycle
      mesh_id = mesh_id + 1_i32
      last = first + size(parts(i)%v0, 2) - 1_i64
      v0(:, first:last) = parts(i)%v0
      v1(:, first:last) = parts(i)%v1
      v2(:, first:last) = parts(i)%v2
      deallocate (parts(i)%v0, parts(i)%v1, parts(i)%v2)
      elem_mesh_id(first:last) = mesh_id
      elem_surface_model(first:last) = surface_model_id_from_name(cfg%mesh_parts(i)%surface_model)
      elem_epsilon_r(first:last) = cfg%mesh_parts(i)%epsilon_r
      first = last + 1_i64
    end do
    call init_mesh( &
      mesh, v0, v1, v2, elem_mesh_id0=elem_mesh_id, elem_surface_model0=elem_surface_model, &
      elem_epsilon_r0=elem_epsilon_r &
      )
  end subroutine build_parts_mesh