頂点配列から重心・法線・AABB・代表長・collision grid を再構築する。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mesh_type), | intent(inout) | :: | mesh |
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