init_panel_geometry Subroutine

public subroutine init_panel_geometry(v0, v1, v2, geometry, status)

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: v0(3)
real(kind=dp), intent(in) :: v1(3)
real(kind=dp), intent(in) :: v2(3)
type(panel_geometry_type), intent(out) :: geometry
integer(kind=i32), intent(out) :: status

Called by

proc~~init_panel_geometry~~CalledByGraph proc~init_panel_geometry init_panel_geometry proc~beach_kernel_build beach_kernel_build proc~beach_kernel_build->proc~init_panel_geometry proc~core_build_panel_plan_impl core_build_panel_plan_impl proc~core_build_panel_plan_impl->proc~init_panel_geometry proc~core_build_plan_impl core_build_plan_impl proc~core_build_plan_impl->proc~init_panel_geometry proc~eval_periodic_nonzero_panel_reference eval_periodic_nonzero_panel_reference proc~eval_periodic_nonzero_panel_reference->proc~init_panel_geometry proc~update_mesh_geometry update_mesh_geometry proc~update_mesh_geometry->proc~init_panel_geometry proc~init_mesh init_mesh proc~init_mesh->proc~update_mesh_geometry proc~prepare_periodic2_collision_mesh prepare_periodic2_collision_mesh proc~prepare_periodic2_collision_mesh->proc~update_mesh_geometry 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~load_or_init_run_state load_or_init_run_state proc~load_or_init_run_state->proc~prepare_periodic2_collision_mesh proc~build_mesh_from_config build_mesh_from_config proc~load_or_init_run_state->proc~build_mesh_from_config 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->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 program~main main program~main->proc~load_or_init_run_state

Source Code

  subroutine init_panel_geometry(v0, v1, v2, geometry, status)
    real(dp), intent(in) :: v0(3), v1(3), v2(3)
    type(panel_geometry_type), intent(out) :: geometry
    integer(i32), intent(out) :: status
    real(dp) :: edge1(3), edge2(3), cross12(3), norm_cross, lref
    real(dp) :: vertex_sum(3)
    integer :: edge, next_edge

    geometry = panel_geometry_type()
    status = panel_geometry_nonfinite
    if (.not. all(ieee_is_finite(v0)) .or. .not. all(ieee_is_finite(v1)) .or. &
        .not. all(ieee_is_finite(v2))) return

    geometry%vertex(:, 1) = v0
    geometry%vertex(:, 2) = v1
    geometry%vertex(:, 3) = v2
    edge1 = v1 - v0
    edge2 = v2 - v0
    cross12 = cross_product(edge1, edge2)
    norm_cross = sqrt(sum(cross12*cross12))
    lref = max(norm2(edge1), norm2(edge2), norm2(v2 - v1))
    status = panel_geometry_degenerate
    if (lref <= 0.0_dp) return
    if (norm_cross <= 128.0_dp*epsilon(1.0_dp)*lref*lref) return

    geometry%area = 0.5_dp*norm_cross
    geometry%normal = cross12/norm_cross
    geometry%centroid = (v0 + v1 + v2)/3.0_dp
    do edge = 1, 3
      next_edge = merge(edge + 1, 1, edge < 3)
      edge1 = geometry%vertex(:, next_edge) - geometry%vertex(:, edge)
      geometry%edge_length(edge) = sqrt(sum(edge1*edge1))
      geometry%edge_outward(:, edge) = cross_product(edge1, geometry%normal)/geometry%edge_length(edge)
    end do

    geometry%moment0 = geometry%area
    geometry%moment1 = geometry%area*geometry%centroid
    vertex_sum = v0 + v1 + v2
    geometry%moment2 = geometry%area/12.0_dp*( &
                       outer_product(v0, v0) + outer_product(v1, v1) + outer_product(v2, v2) + &
                       outer_product(vertex_sum, vertex_sum) &
                       )
    status = panel_geometry_ok
  end subroutine init_panel_geometry