solve_matching_implicit_zero_mode Subroutine

public subroutine solve_matching_implicit_zero_mode(provider, mpi, displacement_before, displacement_seed, duration, displacement_bounded, displacement_min, displacement_max, displacement_scale, search_direction, feedback_reference, electron_charge, ion_charge, photoelectron_active, photoelectron_charge, root_before, root_after, displacement_after, response_after)

Arguments

Type IntentOptional Attributes Name
type(matching_plane_response_provider_type), intent(inout) :: provider
type(mpi_context), intent(in) :: mpi
real(kind=dp), intent(in) :: displacement_before
real(kind=dp), intent(in) :: displacement_seed
real(kind=dp), intent(in) :: duration
logical, intent(in) :: displacement_bounded
real(kind=dp), intent(in) :: displacement_min
real(kind=dp), intent(in) :: displacement_max
real(kind=dp), intent(in) :: displacement_scale
integer(kind=i32), intent(in) :: search_direction
real(kind=dp), intent(in) :: feedback_reference(4)
real(kind=dp), intent(in) :: electron_charge
real(kind=dp), intent(in) :: ion_charge
logical, intent(in) :: photoelectron_active
real(kind=dp), intent(in) :: photoelectron_charge
type(matching_plane_zhao_root_seed_type), intent(in) :: root_before
type(matching_plane_zhao_root_seed_type), intent(out) :: root_after
real(kind=dp), intent(out) :: displacement_after
real(kind=dp), intent(out) :: response_after(6)

Calls

proc~~solve_matching_implicit_zero_mode~~CallsGraph proc~solve_matching_implicit_zero_mode solve_matching_implicit_zero_mode none~evaluate_local matching_plane_response_provider_type%evaluate_local proc~solve_matching_implicit_zero_mode->none~evaluate_local proc~mpi_bcast_i32_array mpi_bcast_i32_array proc~solve_matching_implicit_zero_mode->proc~mpi_bcast_i32_array proc~mpi_bcast_real_dp_array mpi_bcast_real_dp_array proc~solve_matching_implicit_zero_mode->proc~mpi_bcast_real_dp_array proc~mpi_is_root mpi_is_root proc~solve_matching_implicit_zero_mode->proc~mpi_is_root none~evaluate matching_plane_response_table_type%evaluate none~evaluate_local->none~evaluate

Source Code

  subroutine solve_matching_implicit_zero_mode( &
    provider, mpi, displacement_before, displacement_seed, duration, displacement_bounded, &
    displacement_min, displacement_max, &
    displacement_scale, search_direction, feedback_reference, electron_charge, ion_charge, photoelectron_active, &
    photoelectron_charge, root_before, root_after, displacement_after, response_after &
    )
    type(matching_plane_response_provider_type), intent(inout) :: provider
    type(mpi_context), intent(in) :: mpi
    logical, intent(in) :: displacement_bounded
    real(dp), intent(in) :: displacement_before, displacement_seed, duration
    real(dp), intent(in) :: displacement_min, displacement_max, displacement_scale
    integer(i32), intent(in) :: search_direction
    real(dp), intent(in) :: feedback_reference(4)
    real(dp), intent(in) :: electron_charge, ion_charge, photoelectron_charge
    logical, intent(in) :: photoelectron_active
    type(matching_plane_zhao_root_seed_type), intent(in) :: root_before
    type(matching_plane_zhao_root_seed_type), intent(out) :: root_after
    real(dp), intent(out) :: displacement_after, response_after(6)

    real(dp) :: result_packet(7)
    integer(i32) :: status, status_packet(1)
    character(len=512) :: message

    displacement_after = 0.0_dp
    response_after = 0.0_dp
    root_after = matching_plane_zhao_root_seed_type()
    result_packet = 0.0_dp
    status = matching_plane_provider_ok
    message = ''
    if (mpi_is_root(mpi)) then
      call solve_matching_implicit_zero_mode_local( &
        provider, displacement_before, displacement_seed, duration, displacement_bounded, &
        displacement_min, displacement_max, &
        displacement_scale, search_direction, feedback_reference, electron_charge, ion_charge, photoelectron_active, &
        photoelectron_charge, root_before, root_after, displacement_after, response_after, status, message &
        )
      if (status == matching_plane_provider_ok .and. len_trim(message) > 0) then
        write (error_unit, '(a)') trim(message)
        flush (error_unit)
      end if
      if (status == matching_plane_provider_ok) result_packet = [displacement_after, response_after]
    end if
    status_packet = [status]
    call mpi_bcast_i32_array(mpi, status_packet, 0_i32)
    status = status_packet(1)
    if (status /= matching_plane_provider_ok) then
      if (mpi_is_root(mpi)) then
        write (error_unit, '(a)') trim(message)
        flush (error_unit)
      end if
      error stop 128
    end if
    call mpi_bcast_real_dp_array(mpi, result_packet, 0_i32)
    displacement_after = result_packet(1)
    response_after = result_packet(2:7)
  end subroutine solve_matching_implicit_zero_mode