init_mesh Subroutine

public subroutine init_mesh(mesh, v0, v1, v2, q0, elem_mesh_id0)

三角形頂点配列から mesh_type を初期化し、幾何キャッシュと要素電荷配列を準備する。

Arguments

Type IntentOptional 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(:)

Calls

proc~~init_mesh~~CallsGraph proc~init_mesh init_mesh proc~update_mesh_geometry update_mesh_geometry proc~init_mesh->proc~update_mesh_geometry 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~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~~init_mesh~~CalledByGraph proc~init_mesh init_mesh 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~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 build_mesh_from_config 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 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 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