handle_particles Subroutine

public subroutine handle_particles()

Uses

  • proc~~handle_particles~~UsesGraph proc~handle_particles handle_particles module~mod_global_parameters mod_global_parameters proc~handle_particles->module~mod_global_parameters module~mod_timing mod_timing proc~handle_particles->module~mod_timing module~mod_basic_types mod_basic_types module~mod_global_parameters->module~mod_basic_types module~mod_connectivity mod_connectivity module~mod_global_parameters->module~mod_connectivity module~mod_constants mod_constants module~mod_global_parameters->module~mod_constants module~mod_physicaldata mod_physicaldata module~mod_global_parameters->module~mod_physicaldata module~mod_variables mod_variables module~mod_global_parameters->module~mod_variables mpi mpi module~mod_global_parameters->mpi module~mod_variables->module~mod_basic_types

Let particles evolve in time. The routine also handles grid variables and output.

Arguments

None

Calls

proc~~handle_particles~~CallsGraph proc~handle_particles handle_particles mpi_allreduce mpi_allreduce proc~handle_particles->mpi_allreduce mpi_wtime mpi_wtime proc~handle_particles->mpi_wtime proc~advance_particles advance_particles proc~handle_particles->proc~advance_particles proc~comm_particles_global comm_particles_global proc~handle_particles->proc~comm_particles_global proc~mpistop mpistop proc~handle_particles->proc~mpistop proc~set_neighbor_ipe set_neighbor_ipe proc~handle_particles->proc~set_neighbor_ipe proc~update_gridvars update_gridvars proc~handle_particles->proc~update_gridvars proc~write_particle_output write_particle_output proc~handle_particles->proc~write_particle_output proc~advance_particles->mpi_allreduce proc~advance_particles->mpi_wtime proc~comm_particles comm_particles proc~advance_particles->proc~comm_particles proc~select_active_particles select_active_particles proc~advance_particles->proc~select_active_particles proc~comm_particles_global->proc~mpistop mpi_waitall mpi_waitall proc~comm_particles_global->mpi_waitall proc~find_particle_ipe find_particle_ipe proc~comm_particles_global->proc~find_particle_ipe proc~mpi_irecv_wrapper mpi_irecv_wrapper proc~comm_particles_global->proc~mpi_irecv_wrapper proc~mpi_isend_wrapper mpi_isend_wrapper proc~comm_particles_global->proc~mpi_isend_wrapper proc~mpi_recv_wrapper mpi_recv_wrapper proc~comm_particles_global->proc~mpi_recv_wrapper proc~mpi_send_wrapper mpi_send_wrapper proc~comm_particles_global->proc~mpi_send_wrapper proc~pull_particle_from_particles_on_mype pull_particle_from_particles_on_mype proc~comm_particles_global->proc~pull_particle_from_particles_on_mype proc~push_particle_into_particles_on_mype push_particle_into_particles_on_mype proc~comm_particles_global->proc~push_particle_into_particles_on_mype mpi_abort mpi_abort proc~mpistop->mpi_abort proc~ipe_cf ipe_cf proc~set_neighbor_ipe->proc~ipe_cf proc~ipe_fc ipe_fc proc~set_neighbor_ipe->proc~ipe_fc proc~ipe_srl ipe_srl proc~set_neighbor_ipe->proc~ipe_srl proc~update_gridvars->mpi_wtime proc~output_ensemble output_ensemble proc~write_particle_output->proc~output_ensemble proc~output_individual output_individual proc~write_particle_output->proc~output_individual proc~comm_particles->proc~mpistop proc~comm_particles->mpi_waitall proc~comm_particles->proc~find_particle_ipe proc~comm_particles->proc~mpi_irecv_wrapper proc~comm_particles->proc~mpi_isend_wrapper proc~comm_particles->proc~pull_particle_from_particles_on_mype proc~comm_particles->proc~push_particle_into_particles_on_mype proc~apply_periodb apply_periodB proc~comm_particles->proc~apply_periodb proc~destroy_particles destroy_particles proc~comm_particles->proc~destroy_particles proc~particle_in_igrid particle_in_igrid proc~comm_particles->proc~particle_in_igrid proc~get_igslice get_igslice proc~find_particle_ipe->proc~get_igslice proc~particle_in_domain particle_in_domain proc~find_particle_ipe->proc~particle_in_domain mpi_irecv mpi_irecv proc~mpi_irecv_wrapper->mpi_irecv mpi_isend mpi_isend proc~mpi_isend_wrapper->mpi_isend mpi_recv mpi_recv proc~mpi_recv_wrapper->mpi_recv mpi_send mpi_send proc~mpi_send_wrapper->mpi_send proc~output_ensemble->proc~mpi_recv_wrapper proc~output_ensemble->proc~mpi_send_wrapper mpi_allgather mpi_allgather proc~output_ensemble->mpi_allgather proc~output_particle output_particle proc~output_ensemble->proc~output_particle proc~output_individual->proc~output_particle proc~select_active_particles->mpi_allreduce proc~apply_periodb->proc~find_particle_ipe proc~destroy_particles->mpi_allreduce proc~destroy_particles->proc~output_ensemble proc~destroy_particles->proc~pull_particle_from_particles_on_mype proc~get_igslice->proc~mpistop proc~partcoord_to_cartesian partcoord_to_cartesian proc~output_particle->proc~partcoord_to_cartesian

Called by

proc~~handle_particles~~CalledByGraph proc~handle_particles handle_particles proc~advance advance proc~advance->proc~handle_particles proc~main main proc~main->proc~handle_particles proc~timeintegration timeintegration proc~main->proc~timeintegration proc~timeintegration->proc~advance program~agile agile program~agile->proc~main

Source Code

  subroutine handle_particles()
    use mod_global_parameters
    use mod_timing

    integer :: steps_taken, nparticles_left

    tpartc0 = MPI_WTIME()

    call set_neighbor_ipe

    if (time_advance) then
      tmax_particles = global_time + dt
      call update_gridvars()
    else
      tmax_particles = time_max
    end if
    tpartc_com0=MPI_WTIME()
    call comm_particles_global()
    tpartc_com=tpartc_com + (MPI_WTIME()-tpartc_com0)


    ! main integration loop
    do
      if (tmax_particles >= t_next_output) then
        call advance_particles(t_next_output, steps_taken)
        tpartc_io_0 = MPI_WTIME()
        if (mype .eq. 0 .and. (.not. time_advance)) print*,&
            "Writing particle output at time",t_next_output
        call write_particle_output()
        timeio_tot  = timeio_tot+(MPI_WTIME()-tpartc_io_0)
        tpartc_io   = tpartc_io+(MPI_WTIME()-tpartc_io_0)

        ! If we are using a constant time step, this prevents multiple outputs
        ! at the same time
        t_next_output = max(t_next_output,&
            min_particle_time) + dtsave_particles
      else
        call advance_particles(tmax_particles, steps_taken)
!        call write_particle_output()
        exit
      end if

      call MPI_ALLREDUCE(nparticles_on_mype, nparticles_left, 1, MPI_INTEGER,&
          MPI_SUM, icomm, ierrmpi)
      if (nparticles_left == 0 .and. convert) call &
         mpistop('No particles left')

    end do

    tpartc = tpartc + (MPI_WTIME() - tpartc0)

  end subroutine handle_particles