prepare_periodic2_collision_mesh Subroutine

public subroutine prepare_periodic2_collision_mesh(mesh, sim)

periodic2 用に primitive cell メッシュを canonical unwrapped 形へ平行移動し、 幾何キャッシュと collision grid を再構築する。

Arguments

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

Calls

proc~~prepare_periodic2_collision_mesh~~CallsGraph proc~prepare_periodic2_collision_mesh prepare_periodic2_collision_mesh proc~resolve_periodic2_collision_config~2 resolve_periodic2_collision_config proc~prepare_periodic2_collision_mesh->proc~resolve_periodic2_collision_config~2 proc~update_mesh_geometry update_mesh_geometry proc~prepare_periodic2_collision_mesh->proc~update_mesh_geometry proc~lower_ascii lower_ascii proc~resolve_periodic2_collision_config~2->proc~lower_ascii 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~~prepare_periodic2_collision_mesh~~CalledByGraph proc~prepare_periodic2_collision_mesh prepare_periodic2_collision_mesh proc~load_or_init_run_state load_or_init_run_state proc~load_or_init_run_state->proc~prepare_periodic2_collision_mesh program~main main program~main->proc~load_or_init_run_state

Source Code

  subroutine prepare_periodic2_collision_mesh(mesh, sim)
    type(mesh_type), intent(inout) :: mesh
    type(sim_config), intent(in) :: sim

    integer(i32) :: periodic_axes(2), iaxis, i
    real(dp) :: periodic_len(2), box_center(2), center_axis, shift
    logical :: use_periodic2

    call resolve_periodic2_collision_config(sim, use_periodic2, periodic_axes, periodic_len)
    mesh%periodic2_collision_ready = .false.
    if (.not. use_periodic2) return

    do iaxis = 1, 2
      box_center(iaxis) = 0.5d0*(sim%box_min(periodic_axes(iaxis)) + sim%box_max(periodic_axes(iaxis)))
    end do

    do i = 1, mesh%nelem
      do iaxis = 1, 2
        center_axis = (mesh%v0(periodic_axes(iaxis), i) + mesh%v1(periodic_axes(iaxis), i) + &
                       mesh%v2(periodic_axes(iaxis), i))/3.0d0
        shift = periodic_len(iaxis)*anint((box_center(iaxis) - center_axis)/periodic_len(iaxis))
        if (shift /= 0.0d0) then
          mesh%v0(periodic_axes(iaxis), i) = mesh%v0(periodic_axes(iaxis), i) + shift
          mesh%v1(periodic_axes(iaxis), i) = mesh%v1(periodic_axes(iaxis), i) + shift
          mesh%v2(periodic_axes(iaxis), i) = mesh%v2(periodic_axes(iaxis), i) + shift
        end if
      end do
    end do

    call update_mesh_geometry(mesh)
    mesh%periodic2_collision_ready = .true.
  end subroutine prepare_periodic2_collision_mesh