37  use, 
intrinsic :: iso_fortran_env
 
   75    integer,  
allocatable :: helicity(:)
 
   76    integer,  
allocatable :: m_order(:)
 
   77    real(real64),    
allocatable :: amp(:)
 
   78    real(real64),    
allocatable :: theta_k(:)
 
   79    real(real64),    
allocatable :: omega(:)
 
   80    real(real64),    
allocatable :: shift(:,:)
 
   81    logical,  
allocatable :: envelope(:)
 
   82    integer,  
allocatable :: lin_dir(:)
 
   90    integer                          :: points_number
 
   91    integer,             
allocatable :: points_map(:)
 
   93    integer,             
allocatable :: modus(:)
 
   94    integer,             
allocatable :: field_type(:)
 
   95    character(len=1024), 
allocatable :: e_field_string(:,:)
 
   96    real(real64),        
allocatable :: k_vector(:,:)
 
   97    real(real64),        
allocatable :: v_vector(:,:)
 
   98    complex(real64),     
allocatable :: e_field(:,:)
 
   99    real(real64),        
allocatable :: pw_phase(:)
 
  100    type(mxf_t),         
allocatable :: mx_function(:)
 
  102    logical                          :: output_from_point = .false. 
 
  103    real(real64), 
allocatable               :: selected_point_coordinate(:)
 
  104    real(real64), 
allocatable               :: selected_point_field(:)
 
  105    real(real64)                     :: c_factor
 
  106    type(accel_mem_t)                :: buff_map
 
  107    type(bessel_beam_t)                :: bessel
 
  122    class(external_waves_t), 
pointer :: this
 
  123    type(namespace_t), 
intent(in) :: namespace
 
  125    integer :: iq, quantities(3)
 
  131    this%namespace = namespace_t(
"ExternalSource", parent=namespace)
 
  133    message(1) = 
'Plane-wave is currently always 3D and non-periodic.' 
  139    do iq = 1, 
size(quantities)
 
  140      this%quantities(quantities(iq))%always_available = .
true.
 
  141      this%quantities(quantities(iq))%updated_on_demand = .
true.
 
  142      this%quantities(quantities(iq))%iteration = 
clock_t()
 
  152    class(external_waves_t),    
intent(in)    :: partner
 
  153    class(interaction_surrogate_t), 
intent(inout) :: interaction
 
  157    select type (interaction)
 
  176    integer,                  
intent(in)    :: iq
 
  200    select type(interaction)
 
  204        interaction%system_field)
 
  205      call interaction%do_mapping()
 
  208      interaction%system_field = 
m_zero 
  211      call interaction%do_mapping()
 
  216        interaction%system_field, der=interaction%system_gr%der)
 
  217      call interaction%do_mapping()
 
  220      message(1) = 
"Incompatible interaction." 
  231    type(namespace_t),     
intent(in)     :: namespace
 
  233    logical :: has_source
 
  258    type(namespace_t),         
intent(in)    :: namespace
 
  260    integer              :: il, nlines, ncols, iex_norm, idim
 
  261    integer, 
parameter   :: sys_dim = 3
 
  262    real(real64)         :: k_vector(sys_dim), velocity(sys_dim), x_pos(sys_dim)
 
  263    real(real64)         :: x_norm, dummy(sys_dim), k_dot_e , test_limit, k_norm, output_pos(3)
 
  264    complex(real64)      :: e_field(sys_dim)
 
  265    character(len=1024)  :: k_string(sys_dim)
 
  266    character(len=1), 
dimension(sys_dim), 
parameter :: dims = [
"x", 
"y", 
"z"]
 
  267    character(len=1024)  :: mxf_expression
 
  273    test_limit = 10.0e-9_real64
 
  291    if (
parse_block(namespace, 
'ExternalSourceBesselOutput', blk) == 0) 
then 
  293      if (nlines > 1 ) 
then 
  294        message(2) = 
'ExternalSource output is limited to one point.' 
  298      if (ncols /= 3 ) 
then 
  299        message(1) = 
'ExternalSourceBesselOutput must have 3 columns.' 
  302      external_waves%output_from_point= .
true.
 
  303      safe_allocate(external_waves%selected_point_coordinate(1:3))
 
  304      safe_allocate(external_waves%selected_point_field(1:3))
 
  309      external_waves%selected_point_coordinate(1:3) = output_pos(1:3)
 
  310      external_waves%selected_point_field(1:3)  = 
m_zero 
  314      external_waves%out_file  = 
io_open(
'bessel_source_at_point', namespace=namespace, action=
'write')
 
  315      write(external_waves%out_file, 
'(12a) ')  
'#    Time (a.u.)    ' , 
'  Field-x  ' , 
'  Field-y  ' , 
'   Field-z   ' 
  318      external_waves%output_from_point= .false.
 
  362    if (
parse_block(namespace, 
'MaxwellIncidentWaves', blk) == 0) 
then 
  369      external_waves%number = nlines
 
  370      safe_allocate(external_waves%modus(1:nlines))
 
  371      safe_allocate(external_waves%e_field_string(1:3, 1:nlines))
 
  372      safe_allocate(external_waves%e_field(1:3, 1:nlines))
 
  373      safe_allocate(external_waves%k_vector(1:3, 1:nlines))
 
  374      safe_allocate(external_waves%v_vector(1:3, 1:nlines))
 
  375      safe_allocate(external_waves%mx_function(1:nlines))
 
  376      safe_allocate(external_waves%field_type(1:nlines))
 
  377      safe_allocate(external_waves%pw_phase(1:nlines))
 
  378      external_waves%pw_phase = 
m_zero 
  380      call external_waves%bessel%init(nlines, 3)
 
  384        if ((ncols < 5) .or. (ncols > 9)) 
then 
  385          message(1) = 
'Each line in the MaxwellIncidentWaves block must have five to nine columns.' 
  394        if (external_waves%modus(il) == option__maxwellincidentwaves__plane_wave_parser) 
then 
  397            call parse_block_string( blk, il - 1, 3 + idim + 1, external_waves%e_field_string(idim, il))
 
  399          write(
message(1), 
'(a,i2,a) ') 
'Substituting electromagnetic incident wave ', il, 
' with the expressions: ' 
  402            write(
message(idim), 
'(6a)')     
'  Wave vector k('//dims(idim)//
')   = ', trim(k_string(idim))
 
  403            write(
message(idim+1), 
'(2a)')     
'  E-field('//dims(idim)//
') for t_0 = ', trim(external_waves%e_field_string(idim, il))
 
  419          k_norm = norm2(k_vector)
 
  421          velocity(:)    = k_vector(:) / k_norm * 
p_c * external_waves%c_factor
 
  422          external_waves%k_vector(:,il) = k_vector(:)
 
  423          external_waves%v_vector(:,il) = velocity(:)
 
  425        else if (external_waves%modus(il) == option__maxwellincidentwaves__plane_wave_mx_function) 
then 
  431          write(
message(1), 
'(a,i2) ') 
'Substituting electromagnetic incident wave ', il
 
  432          write(
message(2), 
'(a)'    ) 
'with the expression: ' 
  436            write(
message(idim), 
'(a,f9.4,sp,f9.4,"i")') 
'  E-field('//trim(dims(idim))//
') complex amplitude  = ', &
 
  437              real(e_field(idim)), aimag(e_field(idim))
 
  439          write(
message(4), 
'(2a)'    )      
'  Maxwell wave function name = ', trim(mxf_expression)
 
  442          call mxf_read(external_waves%mx_function(il), namespace, trim(mxf_expression), iex_norm)
 
  443          if (iex_norm /= 0) 
then 
  444            write(
message(1),
'(3A)') 
'Ex_norm in the ""', trim(mxf_expression), &
 
  445              '"" field defined in the MaxwellIncidentWaves block' 
  452          k_vector(1:3) = external_waves%mx_function(il)%k_vector(1:3)
 
  453          k_norm = norm2(k_vector)
 
  455          k_dot_e = real(dot_product(k_vector, e_field), real64)
 
  456          if (abs(k_dot_e) > test_limit) 
then 
  457            write(
message(1), 
'(a) ') 
'The wave vector k or its electric field are not perpendicular. ' 
  458            write(
message(2), 
'(a,f8.3,a)' ) 
'Their dot product yields the magnitude', abs(k_dot_e) , 
' while' 
  459            write(
message(3), 
'(a,f8.3,a)' ) 
'tolerance is ', test_limit ,
'.' 
  462          if (k_norm < 1e-10) 
then 
  463            message(1) = 
'The k vector is not set correctly: |k|~0 .' 
  467          external_waves%e_field(:,il)  = e_field(:)
 
  468          external_waves%k_vector(:,il) = k_vector(:)
 
  469          external_waves%v_vector(:,il) = k_vector(:) / k_norm * 
p_c * external_waves%c_factor
 
  471        else if (external_waves%modus(il) == option__maxwellincidentwaves__bessel_function) 
then 
  479            external_waves%bessel%envelope(il) = .
true.
 
  480            call mxf_read(external_waves%mx_function(il), namespace, trim(mxf_expression), iex_norm)
 
  486          write(
message(1), 
'(a,i2) ') 
'Incident Bessel Beam', il
 
  489          if (abs(external_waves%bessel%helicity(il)) /= 1) 
then 
  490            write(
message(1),
'(A)') 
'Helicity has to be either +1 or -1 !' 
  494          write(
message(1), 
'(a,f5.3)'    )  
' Bessel Amplitude ', external_waves%bessel%amp(il)
 
  495          write(
message(2), 
'(a,i2)'    )  
' Bessel Order m', external_waves%bessel%m_order(il)
 
  496          write(
message(3), 
'(a,f5.3)'    )  
' Bessel Frequency ', external_waves%bessel%omega(il)
 
  497          write(
message(4), 
'(a,i2)'    )  
' Bessel Helicity ', external_waves%bessel%helicity(il)
 
  498          write(
message(5), 
'(a,f5.3)'    )  
' Bessel Opening Angle ', external_waves%bessel%theta_k(il)
 
  501          if (external_waves%bessel%lin_dir(il)/= 0) 
then 
  502            write(
message(5), 
'(a,i2)'    )  
' Bessel is Linearly Polarized in Direction : ', external_waves%bessel%lin_dir(il)
 
  513      external_waves%number = 0
 
  531    if (
parse_block(namespace, 
'BesselBeamAxisShift', blk) == 0) 
then 
  534      if (ncols /= 3 ) 
then 
  535        message(1) = 
'BesselBeamAxisShift must have 3 columns.' 
  559    if (external_waves%output_from_point) 
then 
  560      call io_close(external_waves%out_file)
 
  561      safe_deallocate_a(external_waves%selected_point_coordinate)
 
  562      safe_deallocate_a(external_waves%selected_point_field)
 
  565    safe_deallocate_a(external_waves%bessel%shift)
 
  566    safe_deallocate_a(external_waves%points_map)
 
  567    safe_deallocate_a(external_waves%modus)
 
  568    safe_deallocate_a(external_waves%e_field_string)
 
  569    safe_deallocate_a(external_waves%k_vector)
 
  570    safe_deallocate_a(external_waves%v_vector)
 
  571    safe_deallocate_a(external_waves%e_field)
 
  572    safe_deallocate_a(external_waves%mx_function)
 
  573    safe_deallocate_a(external_waves%pw_phase)
 
  584  subroutine external_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
 
  586    real(real64),              
intent(in)    :: time
 
  587    class(
mesh_t),             
intent(in)    :: mesh
 
  588    integer,                   
intent(in)    :: type_of_field
 
  589    real(real64),              
intent(out)   :: out_field_total(:, :)
 
  599    call plane_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der=der)
 
  600    call bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der=der)
 
  609  subroutine plane_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
 
  611    real(real64),              
intent(in)    :: time
 
  612    class(
mesh_t),             
intent(in)    :: mesh
 
  613    integer,                   
intent(in)    :: type_of_field
 
  614    real(real64),              
intent(out)   :: out_field_total(:, :)
 
  618    real(real64), 
allocatable   :: pw_field(:,:), ztmp(:,:), b_field_aux(:,:)
 
  620    integer, 
allocatable :: indices_pw_parser(:)
 
  621    integer, 
allocatable :: indices_mx_ftc(:)
 
  622    integer :: n_plane_waves, n_points
 
  628    indices_pw_parser = pack([(wn, wn = 1,external_waves%number)], &
 
  629      external_waves%modus == option__maxwellincidentwaves__plane_wave_parser)
 
  631    indices_mx_ftc = pack([(wn, wn = 1,external_waves%number)], &
 
  632      external_waves%modus == option__maxwellincidentwaves__plane_wave_mx_function)
 
  634    n_plane_waves = 
size(indices_pw_parser) + 
size(indices_mx_ftc)
 
  636    p_c_ = 
p_c * external_waves%c_factor
 
  638    if (n_plane_waves == 0) 
then 
  646      safe_allocate(ztmp(mesh%np, 
size(out_field_total, dim=2)))
 
  647      n_points = mesh%np_part
 
  651    safe_allocate(pw_field(n_points, 
size(out_field_total, dim=2)))
 
  655    do wn = 1, external_waves%number
 
  657      select case(external_waves%modus(wn))
 
  658      case (option__maxwellincidentwaves__plane_wave_parser)
 
  661      case (option__maxwellincidentwaves__plane_wave_mx_function)
 
  665      select case (external_waves%field_type(wn))
 
  669        select case (type_of_field)
 
  671          out_field_total(1:mesh%np,:) = out_field_total(1:mesh%np,:) + pw_field(1:mesh%np,:)
 
  675          safe_allocate(b_field_aux(1:mesh%np, 1:mesh%box%dim))
 
  676          call get_pw_b_field(external_waves, mesh, wn, pw_field, b_field_aux)
 
  677          out_field_total(:,:) = out_field_total(:,:) + b_field_aux(:,:)
 
  678          safe_deallocate_a(b_field_aux)
 
  683        select case (type_of_field)
 
  687          out_field_total(1:mesh%np,:) = out_field_total(1:mesh%np,:) - 
m_one/p_c_ * pw_field(1:mesh%np,1:3)
 
  689          call dderivatives_curl(der, pw_field(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
 
  690          out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) - 
m_one/p_c_ * ztmp(1:mesh%np, 1:3)
 
  696    safe_deallocate_a(pw_field)
 
  697    safe_deallocate_a(ztmp)
 
  708    integer,                   
intent(in)    :: wn
 
  709    real(real64),              
intent(in)    :: time
 
  710    class(
mesh_t),             
intent(in)    :: mesh
 
  711    integer,                   
intent(in)    :: n_points
 
  712    real(real64),              
intent(out)   :: pw_field(:,:)
 
  714    real(real64)         :: x_prop(3), x_norm
 
  715    real(real64)         :: velocity_time(3)
 
  716    real(real64)         :: parsed_field(3)
 
  717    real(real64)         :: dummy(3)
 
  720    velocity_time(:) = external_waves%v_vector(1:3, wn) * time
 
  723        external_waves%e_field_string(idim, wn))
 
  725        x_prop = mesh%x(ip, :) - velocity_time
 
  726        x_norm = norm2(x_prop(1:3))
 
  737    integer,                   
intent(in)    :: wn
 
  738    real(real64),              
intent(in)    :: time
 
  739    class(
mesh_t),             
intent(in)    :: mesh
 
  740    integer,                   
intent(in)    :: n_points
 
  741    real(real64),              
intent(out)   :: pw_field(:,:)
 
  743    real(real64)         :: x_prop(3), x_norm
 
  744    real(real64)         :: velocity_time(3)
 
  745    complex(real64)      :: efield_ip(3)
 
  746    complex(real64)      :: e0(3)
 
  749    velocity_time(:) = external_waves%v_vector(1:3, wn) * time
 
  750    e0(:) = external_waves%e_field(1:3, wn)
 
  752      x_prop = mesh%x(ip, :) - velocity_time
 
  753      x_norm = norm2(x_prop(1:3))
 
  754      efield_ip = 
mxf(external_waves%mx_function(wn), x_prop, external_waves%pw_phase(wn))
 
  755      pw_field(ip, :) = real(e0(1:3) * efield_ip, real64)
 
  762  subroutine get_pw_b_field(external_waves, mesh, pwidx, e_field, b_field)
 
  764    class(
mesh_t),           
intent(in)  :: mesh
 
  765    real(real64),            
intent(in)  :: e_field(:,:)
 
  766    real(real64),            
intent(out) :: b_field(:,:)
 
  767    integer,                 
intent(in)  :: pwidx
 
  769    real(real64)   :: k_vector(3), k_vector_abs
 
  770    real(real64)   :: velocity(3)
 
  772    complex(real64)   :: e0(3)
 
  775    velocity = external_waves%v_vector(1:3, pwidx)
 
  776    k_vector = external_waves%k_vector(1:3, pwidx)
 
  777    k_vector_abs = norm2(k_vector(1:3))
 
  778    e0 = external_waves%e_field(1:3, pwidx)
 
  779    p_c_ = 
p_c * external_waves%c_factor
 
  783      b_field(ip, :) = 
m_one/(p_c_ * k_vector_abs) * dcross_product(k_vector, e_field(ip, :))
 
  790  subroutine bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
 
  792    real(real64),              
intent(in)    :: time
 
  793    class(
mesh_t),             
intent(in)    :: mesh
 
  794    integer,                   
intent(in)    :: type_of_field
 
  795    real(real64),              
intent(out)   :: out_field_total(:, :)
 
  798    real(real64)         :: dmin, omega, k_vector(3), c_factor
 
  799    integer              :: iline, wn, pos_index, n_points, rankmin
 
  800    real(real64), 
allocatable   :: shift(:,:)
 
  801    complex(real64), 
allocatable   :: bessel_field_total(:,:), ztmp(:,:), vec_pot(:,:)
 
  802    integer, 
allocatable :: indices_bessel_ftc(:)
 
  803    type(
mxf_t)          :: envelope_mxf
 
  809    indices_bessel_ftc = pack([(wn, wn = 1,external_waves%number)], &
 
  810      external_waves%modus == option__maxwellincidentwaves__bessel_function)
 
  812    if (
size(indices_bessel_ftc) == 0) 
then 
  819    if (
allocated(external_waves%bessel%shift) .and. &
 
  820      size(external_waves%bessel%shift(:,1)) /= 
size(indices_bessel_ftc)) 
then 
  821      message(1) = 
'Number of BesselBeamAxisShift defined in input file' 
  822      message(2) = 
'does not match the number of Bessel beams.' 
  826    safe_allocate(shift(
size(indices_bessel_ftc), 3))
 
  827    if (
allocated(external_waves%bessel%shift)) 
then 
  828      shift = external_waves%bessel%shift
 
  833    if (type_of_field == 
b_field) 
then 
  835      safe_allocate(vec_pot(mesh%np_part, 
size(out_field_total, dim=2)))
 
  836      safe_allocate(ztmp(
size(out_field_total, dim=1), 
size(out_field_total, dim=2)))
 
  837      n_points = mesh%np_part 
 
  843    safe_allocate(bessel_field_total(1:n_points, 1:3))
 
  844    bessel_field_total = 
m_zero 
  846    do iline = 1, 
size(indices_bessel_ftc)
 
  847      wn = indices_bessel_ftc(iline)
 
  848      omega = external_waves%bessel%omega(wn)
 
  849      k_vector = external_waves%mx_function(wn)%k_vector
 
  850      c_factor =  external_waves%c_factor
 
  851      envelope_mxf = external_waves%mx_function(wn)
 
  853      call external_waves%bessel%function(wn, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field_total)
 
  855      select case (external_waves%field_type(wn))
 
  859        select case (type_of_field)
 
  861          out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) + real(
m_zi*omega*bessel_field_total(1:mesh%np,1:3))
 
  865          out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) - 
m_one/
p_c * real(bessel_field_total(1:mesh%np,1:3))
 
  867          call zderivatives_curl(der, bessel_field_total(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
 
  868          out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) - 
m_one/
p_c * real(ztmp(1:mesh%np, 1:3))
 
  873        select case (type_of_field)
 
  875          out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) + real(bessel_field_total(1:mesh%np,1:3))
 
  879          out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) - 
m_one/
p_c * &
 
  880            real(bessel_field_total(1:mesh%np,1:3)/M_zI/omega)
 
  882          vec_pot(1:mesh%np_part,1:3) = - 
m_one/
p_c * real(bessel_field_total(1:mesh%np_part,1:3)/m_zi/omega)
 
  884          out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) - real(ztmp(1:mesh%np, 1:3))
 
  890    if (external_waves%output_from_point) 
then 
  891      pos_index = 
mesh_nearest_point(mesh, external_waves%selected_point_coordinate(1:3), dmin, rankmin)
 
  892      if (mesh%mpi_grp%rank == rankmin) 
then 
  893        external_waves%selected_point_field(:) = out_field_total(pos_index,:)
 
  894        write(external_waves%out_file, 
"(4F14.8, 4x)") time, external_waves%selected_point_field(:)
 
  898    safe_deallocate_a(shift)
 
  899    safe_deallocate_a(ztmp)
 
  900    safe_deallocate_a(vec_pot)
 
  901    safe_deallocate_a(bessel_field_total)
 
  910  subroutine bessel_beam_function(this, iline, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field)
 
  912    integer, 
intent(in)       :: iline
 
  913    real(real64),   
intent(in)       :: shift(:,:), time, k_vector(3), c_factor
 
  914    class(
mesh_t), 
intent(in) :: mesh
 
  915    integer, 
intent(in)       :: n_points
 
  916    type(
mxf_t), 
intent(in)   :: envelope_mxf
 
  917    complex(real64),   
intent(out)      :: bessel_field(:,:)
 
  919    real(real64)   :: pos(3), temp, temp2, temp3, rho, phi_rho, wigner(3)
 
  920    real(real64)   :: hel, theta, omega, amp, kappa, proj, k_norm, velocity_time(3), x_prop(3)
 
  921    complex(real64)   :: efield_ip(3)
 
  922    real(real64)   :: bessel_plus, bessel_minus
 
  923    integer :: ip, mm, pol
 
  925    assert(iline <= 
size(this%omega))
 
  926    hel = real(this%helicity(iline), real64)
 
  927    theta = this%theta_k(iline)
 
  928    mm = this%m_order(iline)
 
  930    omega = this%omega(iline)
 
  931    proj = omega * 
cos(theta) / 
p_c              
  932    kappa = 
sqrt(omega**2 - (proj* 
p_c)**2)     
 
  935    wigner(2) = 0.5 * (1 + hel * 
cos(theta))    
 
  936    wigner(3) = 0.5 * (1 - hel * 
cos(theta))    
 
  937    proj = omega * 
cos(theta) / 
p_c              
  938    pol = this%lin_dir(iline)  
 
  941      pos(:) = mesh%x(ip, :) -  shift(iline,:)
 
  942      rho = norm2(pos(1:2))
 
  943      phi_rho = 
atan2(pos(2) , pos(1))
 
  944      temp = proj * pos(3) + phi_rho * (mm + 1) - omega*time 
 
  945      temp2 = proj * pos(3) + phi_rho * (mm - 1) - omega*time
 
  946      temp3 = proj * pos(3) + phi_rho * mm - omega*time
 
  952        bessel_field(ip, 1) = amp * (
exp(
m_zi*temp) * wigner(3) * bessel_plus + 
exp(
m_zi*temp2) * wigner(2) * bessel_minus)
 
  956        bessel_field(ip, 2) = 
m_zi * amp * (-
exp(
m_zi*temp) * wigner(3) * bessel_plus + &
 
  957          exp(
m_zi*temp2) * wigner(2) * bessel_minus)
 
  964      if (this%envelope(iline)) 
then 
  965        k_norm = norm2(k_vector)
 
  966        velocity_time = k_vector * 
p_c * c_factor * time  / k_norm
 
  967        x_prop(:) = pos(:) - velocity_time(:)
 
  969        bessel_field(ip, :) = bessel_field(ip, :) * real(efield_ip, real64)
 
  979    integer, 
intent(in) :: nlines
 
  980    integer, 
intent(in) :: dim
 
  982    safe_allocate(this%amp(1: nlines))
 
  983    safe_allocate(this%omega(1:nlines))
 
  984    safe_allocate(this%theta_k(1:nlines))
 
  985    safe_allocate(this%m_order(1:nlines))
 
  986    safe_allocate(this%helicity(1:nlines))
 
  987    safe_allocate(this%shift(1:nlines, 1:dim))
 
  988    safe_allocate(this%envelope(1:nlines))
 
  989    safe_allocate(this%lin_dir(1:nlines))
 
  997    this%envelope = .false.
 
 1005    safe_deallocate_a(this%amp)
 
 1006    safe_deallocate_a(this%omega)
 
 1007    safe_deallocate_a(this%theta_k)
 
 1008    safe_deallocate_a(this%m_order)
 
 1009    safe_deallocate_a(this%helicity)
 
 1010    safe_deallocate_a(this%shift)
 
 1011    safe_deallocate_a(this%lin_dir)
 
 1012    safe_deallocate_a(this%envelope)
 
double exp(double __x) __attribute__((__nothrow__
 
double sin(double __x) __attribute__((__nothrow__
 
double cos(double __x) __attribute__((__nothrow__
 
double atan2(double __y, double __x) __attribute__((__nothrow__
 
subroutine, public accel_release_buffer(this)
 
pure logical function, public accel_is_enabled()
 
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
 
subroutine, public zderivatives_curl(der, ff, op_ff, ghost_update, set_bc)
apply the curl operator to a vector of mesh functions
 
subroutine, public dderivatives_curl(der, ff, op_ff, ghost_update, set_bc)
apply the curl operator to a vector of mesh functions
 
subroutine, public load_external_waves(partners, namespace)
 
subroutine bessel_beam_function(this, iline, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field)
. Evaluation of the Bessel beam expression
 
subroutine external_waves_update_quantity(this, iq)
 
subroutine, public bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
Calculation of Bessel beam from parsed formula.
 
subroutine pw_mx_function_evaluation(external_waves, wn, time, mesh, n_points, pw_field)
Evaluate expression for plane wave that uses predefeined Maxwell function.
 
subroutine bessel_beam_init(this, nlines, dim)
. Initialization of Bessel beam arrays
 
subroutine external_waves_copy_quantities_to_interaction(partner, interaction)
 
subroutine, public external_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
Calculation of external waves from parsed formula.
 
class(external_waves_t) function, pointer external_waves_constructor(namespace)
 
subroutine, public external_waves_end(external_waves)
 
subroutine pw_parsed_evaluation(external_waves, wn, time, mesh, n_points, pw_field)
Evaluate expression for plane wave parsing the provided formula.
 
subroutine plane_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
Calculation of plane waves from parsed formula.
 
subroutine get_pw_b_field(external_waves, mesh, pwidx, e_field, b_field)
Calculation of magnetic field for a plane wave.
 
subroutine external_waves_init_interaction_as_partner(partner, interaction)
 
subroutine, public external_waves_init(external_waves, namespace)
Here, plane wave is evaluated from analytical formulae on grid.
 
subroutine bessel_beam_finalize(this)
. Finalize Bessel beam arrays
 
real(real64), parameter, public m_two
 
real(real64), parameter, public m_zero
 
complex(real64), parameter, public m_zi
 
real(real64), parameter, public p_c
Electron gyromagnetic ratio, see Phys. Rev. Lett. 130, 071801 (2023)
 
real(real64), parameter, public m_one
 
This module implements the underlying real-space grid.
 
This module implements the index, used for the mesh points.
 
integer, parameter, public mxll_vec_pot_to_matter
 
integer, parameter, public mxll_b_field_to_matter
 
integer, parameter, public mxll_e_field_to_matter
 
This module defines the abstract interaction_t class, and some auxiliary classes for interactions.
 
This module defines classes and functions for interaction partners.
 
subroutine, public io_close(iunit, grp)
 
subroutine, public io_mkdir(fname, namespace, parents)
 
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
 
integer, parameter, public e_field_electric
 
integer, parameter, public e_field_vector_potential
 
complex(real64) function mxf_envelope_eval(f, x)
Evaluation of envelope itself.
 
subroutine, public mxf_read(f, namespace, function_name, ierr)
This function initializes "f" from the MXFunctions block.
 
This module defines various routines, operating on mesh functions.
 
This module defines the meshes, which are used in Octopus.
 
integer function, public mesh_nearest_point(mesh, pos, dmin, rankmin)
Returns the index of the point which is nearest to a given vector position pos.
 
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
 
subroutine, public messages_not_implemented(feature, namespace)
 
character(len=512), private msg
 
subroutine, public messages_warning(no_lines, all_nodes, namespace)
 
subroutine, public messages_info(no_lines, iunit, verbose_limit, stress, all_nodes, namespace)
 
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
 
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
 
Some general things and nomenclature:
 
integer function, public parse_block(namespace, name, blk, check_varinfo_)
 
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
 
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
 
This module defines the quantity_t class and the IDs for quantities, which can be exposed by a system...
 
integer, parameter, public b_field
 
integer, parameter, public vector_potential
 
integer, parameter, public e_field
 
subroutine, public conv_to_c_string(str)
converts to c string
 
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
 
This module defines the unit system, used for input and output.
 
type(unit_system_t), public units_inp
the units systems for reading and writing
 
type(unit_t), public unit_one
some special units required for particular quantities
 
class representing derivatives
 
abstract class for general interaction partners
 
surrogate interaction class to avoid circular dependencies between modules.
 
Lorenz force between a systems of particles and an electromagnetic field.
 
Describes mesh distribution to nodes.
 
class to transfer a Maxwell B field to a matter system
 
class to transfer a Maxwell field to a medium
 
class to transfer a Maxwell vector potential to a medium