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