get_efield Subroutine

public subroutine get_efield(igrid, x, tloc, e)

Uses

  • proc~~get_efield~~UsesGraph proc~get_efield get_efield module~mod_geometry mod_geometry proc~get_efield->module~mod_geometry module~mod_global_parameters mod_global_parameters proc~get_efield->module~mod_global_parameters module~mod_usr_methods mod_usr_methods proc~get_efield->module~mod_usr_methods 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

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: igrid
double precision, intent(in), dimension(3) :: x
double precision, intent(in) :: tloc
double precision, intent(out), dimension(ndir) :: e

Calls

proc~~get_efield~~CallsGraph proc~get_efield get_efield proc~get_bfield get_bfield proc~get_efield->proc~get_bfield proc~get_vec get_vec proc~get_efield->proc~get_vec proc~interpolate_var interpolate_var proc~get_efield->proc~interpolate_var proc~get_bfield->proc~get_vec proc~get_bfield->proc~interpolate_var proc~get_vec->proc~interpolate_var proc~mpistop mpistop proc~interpolate_var->proc~mpistop mpi_abort mpi_abort proc~mpistop->mpi_abort

Called by

proc~~get_efield~~CalledByGraph proc~get_efield get_efield proc~derivs_gca derivs_gca proc~derivs_gca->proc~get_efield proc~derivs_gca_rk derivs_gca_rk proc~derivs_gca_rk->proc~get_efield proc~gca_integrate_particles gca_integrate_particles proc~gca_integrate_particles->proc~get_efield proc~gca_integrate_particles->proc~derivs_gca proc~gca_integrate_particles->proc~derivs_gca_rk proc~gca_update_payload gca_update_payload proc~gca_integrate_particles->proc~gca_update_payload proc~gca_get_particle_dt gca_get_particle_dt proc~gca_integrate_particles->proc~gca_get_particle_dt proc~gca_update_payload->proc~get_efield proc~lorentz_integrate_particles Lorentz_integrate_particles proc~lorentz_integrate_particles->proc~get_efield proc~lorentz_update_payload Lorentz_update_payload proc~lorentz_integrate_particles->proc~lorentz_update_payload proc~lorentz_update_payload->proc~get_efield proc~gca_create_particles gca_create_particles proc~gca_create_particles->proc~gca_update_payload proc~gca_get_particle_dt->proc~derivs_gca proc~gca_get_particle_dt->proc~derivs_gca_rk proc~lorentz_create_particles Lorentz_create_particles proc~lorentz_create_particles->proc~lorentz_update_payload proc~particles_create particles_create proc~particles_create->proc~gca_create_particles 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 get_efield(igrid,x,tloc,e)
    use mod_global_parameters
    use mod_usr_methods, only: usr_particle_analytic, usr_particle_fields
    use mod_geometry

    integer,intent(in)                                 :: igrid
    double precision,dimension(3), intent(in)          :: x
    double precision, intent(in)                       :: tloc
    double precision,dimension(ndir), intent(out)      :: e
    double precision,dimension(ndir)                   :: vec1, vec2, vec
    double precision,dimension(ndir)                   :: vfluid, b
    double precision,dimension(ndir)                   :: current
    double precision                                   :: rho = 1.d0,&
        rho2 = 1.d0
    double precision                                   :: td
    integer                                            :: ic1,ic2,ic3,idir

    current(:) = 0.d0

    if (associated(usr_particle_analytic)) then
      call usr_particle_analytic(ep, x, tloc, vec)
    else if (associated(usr_particle_fields)) then
      call get_vec(ep, igrid, x, tloc, vec)
    else
      call get_bfield(igrid, x, tloc, b)
      call get_vec(vp, igrid, x, tloc, vfluid)
      if (particles_eta > zero) then
        call get_vec(jp, igrid, x, tloc, current)
      end if
      if (particles_etah > zero) then
        call interpolate_var(igrid,ixGlo1,ixGlo2,ixGlo3,ixGhi1,ixGhi2,ixGhi3,&
           ixMlo1,ixMlo2,ixMlo3,ixMhi1,ixMhi2,ixMhi3,&
           gridvars(igrid)%w(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo3:ixGhi3,rhop),&
           ps(igrid)%x(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo3:ixGhi3,1:ndim),x,&
           rho)
        if (time_advance) then
          call interpolate_var(igrid,ixGlo1,ixGlo2,ixGlo3,ixGhi1,ixGhi2,ixGhi3,&
             ixMlo1,ixMlo2,ixMlo3,ixMhi1,ixMhi2,ixMhi3,&
             gridvars(igrid)%wold(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo3:ixGhi3,&
             rhop),ps(igrid)%x(ixGlo1:ixGhi1,ixGlo2:ixGhi2,ixGlo3:ixGhi3,&
             1:ndim),x,rho2)
          td = (tloc - global_time) / dt
          rho = rho * (1.0d0 - td) + rho2 * td
        end if
      end if

      ! Build E
      select case (coordinate)
      case (Cartesian,Cartesian_stretched,spherical)
        vec(1) = -vfluid(2)*b(3)+vfluid(3)*b(2) + particles_eta*current(1) + &
           particles_etah/rho*(current(2)*b(3) - current(3)*b(2))
        vec(2) = vfluid(1)*b(3)-vfluid(3)*b(1) + particles_eta*current(2)  + &
           particles_etah/rho*(-current(1)*b(3) + current(3)*b(1))
        vec(3) = -vfluid(1)*b(2)+vfluid(2)*b(1) + particles_eta*current(3) + &
           particles_etah/rho*(current(1)*b(2) - current(2)*b(1))
      case (cylindrical)
        vec(r_) = -vfluid(phi_)*b(z_)+vfluid(z_)*b(phi_) + &
           particles_eta*current(r_)   + &
           particles_etah/rho*(current(phi_)*b(z_) - current(z_)*b(phi_))
        vec(phi_) = vfluid(r_)*b(z_)-vfluid(z_)*b(r_)    + &
           particles_eta*current(phi_) + &
           particles_etah/rho*(-current(r_)*b(z_) + current(z_)*b(r_))
        vec(z_) = -vfluid(r_)*b(phi_)+vfluid(phi_)*b(r_) + &
           particles_eta*current(z_)   + &
           particles_etah/rho*(current(r_)*b(phi_) - current(phi_)*b(r_))
      end select
    end if

    e(:) = vec(:)

  end subroutine get_efield