三角形頂点配列から mesh_type を初期化し、幾何キャッシュと要素電荷配列を準備する。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mesh_type), | intent(out) | :: | mesh |
幾何キャッシュ(重心・法線・AABB)を含むメッシュ構造体。 |
||
| real(kind=dp), | intent(in) | :: | v0(:,:) | |||
| real(kind=dp), | intent(in) | :: | v1(:,:) | |||
| real(kind=dp), | intent(in) | :: | v2(:,:) | |||
| real(kind=dp), | intent(in), | optional | :: | q0(:) | ||
| integer(kind=i32), | intent(in), | optional | :: | elem_mesh_id0(:) |
subroutine init_mesh(mesh, v0, v1, v2, q0, elem_mesh_id0) type(mesh_type), intent(out) :: mesh real(dp), intent(in) :: v0(:, :), v1(:, :), v2(:, :) real(dp), intent(in), optional :: q0(:) integer(i32), intent(in), optional :: elem_mesh_id0(:) integer(i32) :: n if (size(v0, 1) /= 3 .or. size(v1, 1) /= 3 .or. size(v2, 1) /= 3) then error stop "mesh vertex input first dimension must be 3" end if n = size(v0, 2) if (size(v1, 2) /= n .or. size(v2, 2) /= n) then error stop "mesh vertex input size mismatch" end if mesh%nelem = n allocate (mesh%v0(3, n), mesh%v1(3, n), mesh%v2(3, n)) allocate (mesh%centers(3, n), mesh%center_x(n), mesh%center_y(n), mesh%center_z(n), mesh%normals(3, n)) allocate (mesh%bb_min(3, n), mesh%bb_max(3, n)) allocate (mesh%h_elem(n), mesh%q_elem(n), mesh%elem_mesh_id(n)) mesh%v0 = v0 mesh%v1 = v1 mesh%v2 = v2 if (present(q0)) then if (size(q0) /= n) error stop "q0 size mismatch" mesh%q_elem = q0 else mesh%q_elem = 0.0d0 end if if (present(elem_mesh_id0)) then if (size(elem_mesh_id0) /= n) error stop "elem_mesh_id0 size mismatch" mesh%elem_mesh_id = elem_mesh_id0 else mesh%elem_mesh_id = 1_i32 end if mesh%periodic2_collision_ready = .false. call update_mesh_geometry(mesh) end subroutine init_mesh