update_mesh_geometry Subroutine

public subroutine update_mesh_geometry(mesh)

頂点配列から重心・法線・AABB・代表長・collision grid を再構築する。

Arguments

Type IntentOptional Attributes Name
type(mesh_type), intent(inout) :: mesh

Calls

proc~~update_mesh_geometry~~CallsGraph proc~update_mesh_geometry update_mesh_geometry proc~build_collision_grid build_collision_grid proc~update_mesh_geometry->proc~build_collision_grid proc~cross~3 cross proc~update_mesh_geometry->proc~cross~3 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~2 cell_id proc~build_collision_grid->proc~cell_id~2 proc~coord_to_cell~2 coord_to_cell proc~build_collision_grid->proc~coord_to_cell~2

Called by

proc~~update_mesh_geometry~~CalledByGraph proc~update_mesh_geometry update_mesh_geometry proc~init_mesh init_mesh proc~init_mesh->proc~update_mesh_geometry proc~prepare_periodic2_collision_mesh prepare_periodic2_collision_mesh proc~prepare_periodic2_collision_mesh->proc~update_mesh_geometry proc~apply_obj_transform apply_obj_transform proc~apply_obj_transform->proc~init_mesh proc~build_mesh_from_indexed build_mesh_from_indexed proc~build_mesh_from_indexed->proc~init_mesh proc~build_template_mesh build_template_mesh proc~build_template_mesh->proc~init_mesh proc~build_one_template build_one_template proc~build_template_mesh->proc~build_one_template proc~load_or_init_run_state load_or_init_run_state proc~load_or_init_run_state->proc~prepare_periodic2_collision_mesh proc~build_mesh_from_config build_mesh_from_config proc~load_or_init_run_state->proc~build_mesh_from_config proc~make_annulus make_annulus proc~make_annulus->proc~init_mesh proc~make_box make_box proc~make_box->proc~init_mesh proc~make_cylinder make_cylinder proc~make_cylinder->proc~init_mesh proc~make_plane make_plane proc~make_plane->proc~init_mesh proc~make_plate_hole make_plate_hole proc~make_plate_hole->proc~init_mesh proc~make_sphere make_sphere proc~make_sphere->proc~init_mesh proc~build_mesh_from_config->proc~apply_obj_transform proc~build_mesh_from_config->proc~build_template_mesh proc~load_obj_mesh load_obj_mesh proc~build_mesh_from_config->proc~load_obj_mesh proc~build_one_template->proc~make_annulus proc~build_one_template->proc~make_box proc~build_one_template->proc~make_cylinder proc~build_one_template->proc~make_plane proc~build_one_template->proc~make_plate_hole proc~build_one_template->proc~make_sphere proc~make_disk make_disk proc~build_one_template->proc~make_disk proc~load_obj_mesh->proc~build_mesh_from_indexed proc~make_disk->proc~make_annulus program~main main program~main->proc~load_or_init_run_state

Source Code

  subroutine update_mesh_geometry(mesh)
    type(mesh_type), intent(inout) :: mesh

    integer(i32) :: i
    real(dp) :: e1(3), e2(3), nvec(3), nn
    type(panel_geometry_type) :: panel
    integer(i32) :: panel_status

    do i = 1, mesh%nelem
      call init_panel_geometry(mesh%v0(:, i), mesh%v1(:, i), mesh%v2(:, i), panel, panel_status)
      mesh%bb_min(:, i) = min(min(mesh%v0(:, i), mesh%v1(:, i)), mesh%v2(:, i))
      mesh%bb_max(:, i) = max(max(mesh%v0(:, i), mesh%v1(:, i)), mesh%v2(:, i))
      if (panel_status == panel_geometry_ok) then
        mesh%centers(:, i) = panel%centroid
        mesh%normals(:, i) = panel%normal
        mesh%h_elem(i) = sqrt(panel%area)
        mesh%panel_area(i) = panel%area
        mesh%panel_moment1(:, i) = panel%moment1
        mesh%panel_moment2(:, :, i) = panel%moment2
        mesh%panel_edge_length(:, i) = panel%edge_length
        mesh%panel_edge_outward(:, :, i) = panel%edge_outward
        call fill_panel_quadrature(panel, mesh%panel_quad_position(:, :, i), mesh%panel_quad_weight(:, i))
      else
        ! Collision geometry still includes thin triangles rejected by panel integration.
        mesh%centers(:, i) = (mesh%v0(:, i) + mesh%v1(:, i) + mesh%v2(:, i))/3.0_dp
        e1 = mesh%v1(:, i) - mesh%v0(:, i)
        e2 = mesh%v2(:, i) - mesh%v0(:, i)
        nvec = cross(e1, e2)
        nn = sqrt(sum(nvec*nvec))
        if (nn > 0.0_dp) then
          mesh%normals(:, i) = nvec/nn
        else
          mesh%normals(:, i) = 0.0_dp
        end if
        mesh%h_elem(i) = sqrt(0.5_dp*nn)
        mesh%panel_area(i) = 0.0_dp
        mesh%panel_moment1(:, i) = 0.0_dp
        mesh%panel_moment2(:, :, i) = 0.0_dp
        mesh%panel_edge_length(:, i) = 0.0_dp
        mesh%panel_edge_outward(:, :, i) = 0.0_dp
        mesh%panel_quad_position(:, :, i) = 0.0_dp
        mesh%panel_quad_weight(:, i) = 0.0_dp
      end if
      mesh%center_x(i) = mesh%centers(1, i)
      mesh%center_y(i) = mesh%centers(2, i)
      mesh%center_z(i) = mesh%centers(3, i)
      if (mesh%elem_vacuum_sign(i) == 1_i32 .or. mesh%elem_vacuum_sign(i) == -1_i32) then
        mesh%vacuum_normals(:, i) = real(mesh%elem_vacuum_sign(i), dp)*mesh%normals(:, i)
      else
        mesh%vacuum_normals(:, i) = 0.0_dp
      end if
    end do

    call build_collision_grid(mesh)
  end subroutine update_mesh_geometry