Lorentz_update_payload Subroutine

private subroutine Lorentz_update_payload(igrid, xpart, upart, qpart, mpart, mypayload, mynpayload, particle_time)

Uses

  • proc~~lorentz_update_payload~~UsesGraph proc~lorentz_update_payload Lorentz_update_payload module~mod_geometry mod_geometry proc~lorentz_update_payload->module~mod_geometry module~mod_global_parameters mod_global_parameters proc~lorentz_update_payload->module~mod_global_parameters module~mod_comm_lib mod_comm_lib module~mod_geometry->module~mod_comm_lib 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

Update payload subroutine

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: igrid
double precision, intent(in) :: xpart(1:ndir)
double precision, intent(in) :: upart(1:ndir)
double precision, intent(in) :: qpart
double precision, intent(in) :: mpart
double precision, intent(out) :: mypayload(mynpayload)
integer, intent(in) :: mynpayload
double precision, intent(in) :: particle_time

Calls

proc~~lorentz_update_payload~~CallsGraph proc~lorentz_update_payload Lorentz_update_payload proc~cross cross proc~lorentz_update_payload->proc~cross proc~get_bfield get_bfield proc~lorentz_update_payload->proc~get_bfield proc~get_efield get_efield proc~lorentz_update_payload->proc~get_efield proc~get_lfac get_lfac proc~lorentz_update_payload->proc~get_lfac proc~mpistop mpistop proc~cross->proc~mpistop proc~get_vec get_vec proc~get_bfield->proc~get_vec proc~interpolate_var interpolate_var proc~get_bfield->proc~interpolate_var proc~get_efield->proc~get_bfield proc~get_efield->proc~get_vec proc~get_efield->proc~interpolate_var proc~get_vec->proc~interpolate_var proc~interpolate_var->proc~mpistop mpi_abort mpi_abort proc~mpistop->mpi_abort

Called by

proc~~lorentz_update_payload~~CalledByGraph proc~lorentz_update_payload Lorentz_update_payload proc~lorentz_create_particles Lorentz_create_particles proc~lorentz_create_particles->proc~lorentz_update_payload proc~lorentz_integrate_particles Lorentz_integrate_particles proc~lorentz_integrate_particles->proc~lorentz_update_payload proc~particles_create particles_create proc~particles_create->proc~lorentz_create_particles proc~main main proc~main->proc~particles_create program~agile agile program~agile->proc~main

Source Code

  subroutine Lorentz_update_payload(igrid,xpart,upart,qpart,mpart,mypayload,&
     mynpayload,particle_time)
    use mod_global_parameters
    use mod_geometry
    integer, intent(in)           :: igrid,mynpayload
    double precision, intent(in)  :: xpart(1:ndir),upart(1:ndir),qpart,mpart,&
       particle_time
    double precision, intent(out) :: mypayload(mynpayload)
    double precision              :: b(3), e(3), tmp(3), lfac, vfluid(3),&
        current(3), rho, rhoold, td

    call get_bfield(igrid, xpart, particle_time, b)
    call get_efield(igrid, xpart, particle_time, e)

!    call get_vec(bp, igrid, xpart,particle_time,b)
!    call get_vec(vp, igrid, xpart,particle_time,vfluid)
!    call get_vec(jp, igrid, xpart,particle_time,current)
!    select case (coordinate)
!    case (Cartesian,Cartesian_stretched,spherical)
!      e(1) = -vfluid(2)*b(3)+vfluid(3)*b(2) + particles_eta*current(1)
!      e(2) = vfluid(1)*b(3)-vfluid(3)*b(1) + particles_eta*current(2)
!      e(3) = -vfluid(1)*b(2)+vfluid(2)*b(1) + particles_eta*current(3)
!    case (cylindrical)
!      e(r_) = -vfluid(phi_)*b(z_)+vfluid(z_)*b(phi_) + particles_eta*current(r_)
!      e(phi_) = vfluid(r_)*b(z_)-vfluid(z_)*b(r_) + particles_eta*current(phi_)
!      e(z_) = -vfluid(r_)*b(phi_)+vfluid(phi_)*b(r_) + particles_eta*current(z_)
!    end select
!    if (particles_etah > zero) then
!      call interpolate_var(igrid,ixG^LL,ixM^LL,ps(igrid)%w(ixG^T,1),ps(igrid)%x,xpart,rho)
!      if (time_advance) then
!        td = (particle_time - global_time) / dt
!        call interpolate_var(igrid,ixG^LL,ixM^LL,pso(igrid)%w(ixG^T,1),ps(igrid)%x,xpart,rhoold)
!        rho = rhoold * (1.d0-td) + rho * td
!      end if
!      select case (coordinate)
!      case (Cartesian,Cartesian_stretched,spherical)
!        e(1) = e(1) + particles_etah/rho * (current(2)*b(3) - current(3)*b(2))
!        e(2) = e(2) + particles_etah/rho * (-current(1)*b(3) + current(3)*b(1))
!        e(3) = e(3) + particles_etah/rho * (current(1)*b(2) - current(2)*b(1))
!      case (cylindrical)
!        e(r_) = e(r_) + particles_etah/rho * (current(phi_)*b(z_) - current(z_)*b(phi_))
!        e(phi_) = e(phi_) + particles_etah/rho * (-current(r_)*b(z_) + current(z_)*b(r_))
!        e(z_) = e(z_) + particles_etah/rho * (current(r_)*b(phi_) - current(phi_)*b(r_))
!      end select
!    end if

    ! Payload update
    ! Lorentz factor
    if (mynpayload > 0) then
      call get_lfac(upart,lfac)     
      mypayload(1) = lfac
    end if

    ! current gyroradius
    if (mynpayload > 1) then
      call cross(upart,b,tmp)
      tmp = tmp / sqrt(sum(b(:)**2))
      mypayload(2) = mpart/abs(qpart)*sqrt(sum(tmp(:)**2)) / &
         sqrt(sum(b(:)**2))
    end if

    ! magnetic moment
    if (mynpayload > 2) then
      mypayload(3) = mpart*sum(tmp(:)**2)/(2.0d0*sqrt(sum(b(:)**2)))
    end if

    ! e.b
    if (mynpayload > 3) then
      mypayload(4) = sum(e(:)*b(:))
    end if

  end subroutine Lorentz_update_payload