periodic2 用に primitive cell メッシュを canonical unwrapped 形へ平行移動し、 幾何キャッシュと collision grid を再構築する。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mesh_type), | intent(inout) | :: | mesh | |||
| type(sim_config), | intent(in) | :: | sim |
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