37 use,
intrinsic :: iso_fortran_env
73 integer,
allocatable :: helicity(:)
74 integer,
allocatable :: m_order(:)
75 real(real64),
allocatable :: amp(:)
76 real(real64),
allocatable :: theta_k(:)
77 real(real64),
allocatable :: omega(:)
78 real(real64),
allocatable :: shift(:,:)
79 logical,
allocatable :: envelope(:)
80 integer,
allocatable :: lin_dir(:)
88 integer :: points_number
89 integer,
allocatable :: points_map(:)
91 integer,
allocatable :: modus(:)
93 integer,
allocatable :: field_type(:)
94 character(len=1024),
allocatable :: e_field_string(:,:)
95 real(real64),
allocatable :: k_vector(:,:)
96 real(real64),
allocatable :: v_vector(:,:)
97 complex(real64),
allocatable :: e_field(:,:)
98 real(real64),
allocatable :: pw_phase(:)
99 type(mxf_t),
allocatable :: mx_function(:)
101 logical :: output_from_point = .false.
102 real(real64),
allocatable :: selected_point_coordinate(:)
103 real(real64),
allocatable :: selected_point_field(:)
104 real(real64) :: c_factor
105 type(accel_mem_t) :: buff_map
106 type(bessel_beam_t) :: bessel
121 class(external_waves_t),
pointer :: this
122 type(namespace_t),
intent(in) :: namespace
125 character(len=:),
allocatable :: quantities(:)
131 this%namespace = namespace_t(
"ExternalSource", parent=namespace)
133 message(1) =
'Plane-wave is currently always 3D and non-periodic.'
137 quantities = [
character(16) ::
"E field",
"vector potential",
"B field"]
138 do iq = 1,
size(quantities)
139 call this%quantities%add(
quantity_t(quantities(iq), always_available = .
true., &
140 updated_on_demand = .
true., iteration =
clock_t()))
151 class(external_waves_t),
intent(in) :: partner
152 class(interaction_surrogate_t),
intent(inout) :: interaction
156 select type (interaction)
166 message(1) =
"Unsupported interaction."
175 character(len=*),
intent(in) :: label
180 case (
"E field",
"B field",
"vector potential")
201 select type(interaction)
203 quantity => partner%quantities%get(
"E field")
206 interaction%system_field)
207 call interaction%do_mapping()
210 quantity => partner%quantities%get(
"vector potential")
211 interaction%system_field =
m_zero
213 "vector potential", interaction%system_field)
214 call interaction%do_mapping()
217 quantity => partner%quantities%get(
"B field")
218 interaction%system_field =
m_zero
219 call external_waves_eval(partner, quantity%iteration%value(), interaction%system_gr,
"B field", &
220 interaction%system_field, der=interaction%system_gr%der)
221 call interaction%do_mapping()
224 message(1) =
"Incompatible interaction."
235 type(namespace_t),
intent(in) :: namespace
237 logical :: has_source
248 call parse_variable(namespace,
'AnalyticalExternalSource', .false., has_source)
262 type(namespace_t),
intent(in) :: namespace
264 integer :: il, nlines, ncols, iex_norm, idim
265 integer,
parameter :: sys_dim = 3
266 real(real64) :: k_vector(sys_dim), velocity(sys_dim), x_pos(sys_dim)
267 real(real64) :: x_norm, dummy(sys_dim), k_dot_e , test_limit, k_norm, output_pos(3)
268 complex(real64) :: e_field(sys_dim)
269 character(len=1024) :: k_string(sys_dim)
270 character(len=1),
dimension(sys_dim),
parameter :: dims = [
"x",
"y",
"z"]
271 character(len=1024) :: mxf_expression
277 test_limit = 10.0e-9_real64
295 if (
parse_block(namespace,
'ExternalSourceBesselOutput', blk) == 0)
then
297 if (nlines > 1 )
then
298 message(2) =
'ExternalSource output is limited to one point.'
302 if (ncols /= 3 )
then
303 message(1) =
'ExternalSourceBesselOutput must have 3 columns.'
306 external_waves%output_from_point= .
true.
307 safe_allocate(external_waves%selected_point_coordinate(1:3))
308 safe_allocate(external_waves%selected_point_field(1:3))
313 external_waves%selected_point_coordinate(1:3) = output_pos(1:3)
314 external_waves%selected_point_field(1:3) =
m_zero
318 external_waves%out_file =
io_open(
'bessel_source_at_point', namespace=namespace, action=
'write')
319 write(external_waves%out_file,
'(12a) ')
'# Time (a.u.) ' ,
' Field-x ' ,
' Field-y ' ,
' Field-z '
322 external_waves%output_from_point= .false.
367 if (
parse_block(namespace,
'MaxwellIncidentWaves', blk) == 0)
then
374 external_waves%number = nlines
375 safe_allocate(external_waves%modus(1:nlines))
376 safe_allocate(external_waves%e_field_string(1:3, 1:nlines))
377 safe_allocate(external_waves%e_field(1:3, 1:nlines))
378 safe_allocate(external_waves%k_vector(1:3, 1:nlines))
379 safe_allocate(external_waves%v_vector(1:3, 1:nlines))
380 safe_allocate(external_waves%mx_function(1:nlines))
381 safe_allocate(external_waves%field_type(1:nlines))
382 safe_allocate(external_waves%pw_phase(1:nlines))
383 external_waves%pw_phase =
m_zero
385 call external_waves%bessel%init(nlines, 3)
389 if ((ncols < 5) .or. (ncols > 9))
then
390 message(1) =
'Each line in the MaxwellIncidentWaves block must have five to nine columns.'
399 if (external_waves%modus(il) == option__maxwellincidentwaves__plane_wave_parser)
then
402 call parse_block_string( blk, il - 1, 3 + idim + 1, external_waves%e_field_string(idim, il))
404 write(
message(1),
'(a,i2,a) ')
'Substituting electromagnetic incident wave ', il,
' with the expressions: '
407 write(
message(idim),
'(6a)')
' Wave vector k('//dims(idim)//
') = ', trim(k_string(idim))
408 write(
message(idim+1),
'(2a)')
' E-field('//dims(idim)//
') for t_0 = ', &
409 trim(external_waves%e_field_string(idim, il))
424 k_norm = norm2(k_vector)
426 velocity(:) = k_vector(:) / k_norm *
p_c * external_waves%c_factor
427 external_waves%k_vector(:,il) = k_vector(:)
428 external_waves%v_vector(:,il) = velocity(:)
430 else if (external_waves%modus(il) == option__maxwellincidentwaves__plane_wave_mx_function)
then
436 write(
message(1),
'(a,i2) ')
'Substituting electromagnetic incident wave ', il
437 write(
message(2),
'(a)' )
'with the expression: '
441 write(
message(idim),
'(a,f9.4,sp,f9.4,"i")')
' E-field('//trim(dims(idim))//
') complex amplitude = ', &
442 real(e_field(idim)), aimag(e_field(idim))
444 write(
message(4),
'(2a)' )
' Maxwell wave function name = ', trim(mxf_expression)
447 call mxf_read(external_waves%mx_function(il), namespace, trim(mxf_expression), iex_norm)
448 if (iex_norm /= 0)
then
449 write(
message(1),
'(3A)')
'Ex_norm in the ""', trim(mxf_expression), &
450 '"" field defined in the MaxwellIncidentWaves block'
456 k_vector(1:3) = external_waves%mx_function(il)%k_vector(1:3)
457 k_norm = norm2(k_vector)
459 k_dot_e = real(dot_product(k_vector, e_field), real64)
460 if (abs(k_dot_e) > test_limit)
then
461 write(
message(1),
'(a) ')
'The wave vector k or its electric field are not perpendicular. '
462 write(
message(2),
'(a,f8.3,a)' )
'Their dot product yields the magnitude', abs(k_dot_e) ,
' while'
463 write(
message(3),
'(a,f8.3,a)' )
'tolerance is ', test_limit ,
'.'
466 if (k_norm < 1e-10_real64)
then
467 message(1) =
'The k vector is not set correctly: |k|~0 .'
471 external_waves%e_field(:,il) = e_field(:)
472 external_waves%k_vector(:,il) = k_vector(:)
473 external_waves%v_vector(:,il) = k_vector(:) / k_norm *
p_c * external_waves%c_factor
475 else if (external_waves%modus(il) == option__maxwellincidentwaves__bessel_function)
then
483 external_waves%bessel%envelope(il) = .
true.
484 call mxf_read(external_waves%mx_function(il), namespace, trim(mxf_expression), iex_norm)
490 write(
message(1),
'(a,i2) ')
'Incident Bessel Beam', il
493 if (abs(external_waves%bessel%helicity(il)) /= 1)
then
494 write(
message(1),
'(A)')
'Helicity has to be either +1 or -1 !'
498 write(
message(1),
'(a,f5.3)' )
' Bessel Amplitude ', external_waves%bessel%amp(il)
499 write(
message(2),
'(a,i2)' )
' Bessel Order m', external_waves%bessel%m_order(il)
500 write(
message(3),
'(a,f5.3)' )
' Bessel Frequency ', external_waves%bessel%omega(il)
501 write(
message(4),
'(a,i2)' )
' Bessel Helicity ', external_waves%bessel%helicity(il)
502 write(
message(5),
'(a,f5.3)' )
' Bessel Opening Angle ', external_waves%bessel%theta_k(il)
505 if (external_waves%bessel%lin_dir(il)/= 0)
then
506 write(
message(5),
'(a,i2)' )
' Bessel is Linearly Polarized in Direction : ', external_waves%bessel%lin_dir(il)
517 external_waves%number = 0
535 if (
parse_block(namespace,
'BesselBeamAxisShift', blk) == 0)
then
538 if (ncols /= 3 )
then
539 message(1) =
'BesselBeamAxisShift must have 3 columns.'
563 if (external_waves%output_from_point)
then
564 call io_close(external_waves%out_file)
565 safe_deallocate_a(external_waves%selected_point_coordinate)
566 safe_deallocate_a(external_waves%selected_point_field)
569 safe_deallocate_a(external_waves%bessel%shift)
570 safe_deallocate_a(external_waves%points_map)
571 safe_deallocate_a(external_waves%modus)
572 safe_deallocate_a(external_waves%e_field_string)
573 safe_deallocate_a(external_waves%k_vector)
574 safe_deallocate_a(external_waves%v_vector)
575 safe_deallocate_a(external_waves%e_field)
576 safe_deallocate_a(external_waves%mx_function)
577 safe_deallocate_a(external_waves%pw_phase)
588 subroutine external_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
590 real(real64),
intent(in) :: time
591 class(
mesh_t),
intent(in) :: mesh
592 character(len=*),
intent(in) :: type_of_field
593 real(real64),
intent(out) :: out_field_total(:, :)
603 call plane_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der=der)
604 call bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der=der)
613 subroutine plane_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
615 real(real64),
intent(in) :: time
616 class(
mesh_t),
intent(in) :: mesh
617 character(len=*),
intent(in) :: type_of_field
618 real(real64),
intent(out) :: out_field_total(:, :)
622 real(real64),
allocatable :: pw_field(:,:), ztmp(:,:), b_field_aux(:,:)
624 integer,
allocatable :: indices_pw_parser(:)
625 integer,
allocatable :: indices_mx_ftc(:)
626 integer :: n_plane_waves, n_points
632 indices_pw_parser = pack([(wn, wn = 1,external_waves%number)], &
633 external_waves%modus == option__maxwellincidentwaves__plane_wave_parser)
635 indices_mx_ftc = pack([(wn, wn = 1,external_waves%number)], &
636 external_waves%modus == option__maxwellincidentwaves__plane_wave_mx_function)
638 n_plane_waves =
size(indices_pw_parser) +
size(indices_mx_ftc)
640 p_c_ =
p_c * external_waves%c_factor
642 if (n_plane_waves == 0)
then
650 safe_allocate(ztmp(mesh%np,
size(out_field_total, dim=2)))
651 n_points = mesh%np_part
655 safe_allocate(pw_field(n_points,
size(out_field_total, dim=2)))
659 do wn = 1, external_waves%number
661 select case(external_waves%modus(wn))
662 case (option__maxwellincidentwaves__plane_wave_parser)
665 case (option__maxwellincidentwaves__plane_wave_mx_function)
669 select case (external_waves%field_type(wn))
673 select case (type_of_field)
675 do idir = 1,
size(out_field_total, dim=2)
676 call lalg_axpy(mesh%np,
m_one, pw_field(:, idir), out_field_total(:, idir))
678 case (
"vector potential")
681 safe_allocate(b_field_aux(1:mesh%np, 1:mesh%box%dim))
682 call get_pw_b_field(external_waves, mesh, wn, pw_field, b_field_aux)
683 out_field_total(:,:) = out_field_total(:,:) + b_field_aux(:,:)
684 safe_deallocate_a(b_field_aux)
689 select case (type_of_field)
692 case (
"vector potential")
694 call lalg_axpy(mesh%np, -
m_one/p_c_, pw_field(:, idir), out_field_total(:, idir))
697 call dderivatives_curl(der, pw_field(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
699 call lalg_axpy(mesh%np, -
m_one/p_c_, ztmp(:, idir), out_field_total(:, idir))
706 safe_deallocate_a(pw_field)
707 safe_deallocate_a(ztmp)
718 integer,
intent(in) :: wn
719 real(real64),
intent(in) :: time
720 class(
mesh_t),
intent(in) :: mesh
721 integer,
intent(in) :: n_points
722 real(real64),
intent(out) :: pw_field(:,:)
724 real(real64) :: x_prop(3), x_norm
725 real(real64) :: velocity_time(3)
726 real(real64) :: parsed_field(3)
727 real(real64) :: dummy(3)
730 velocity_time(:) = external_waves%v_vector(1:3, wn) * time
733 x_prop = mesh%x(:, ip) - velocity_time
734 x_norm = norm2(x_prop(1:3))
736 external_waves%e_field_string(idim, wn))
747 integer,
intent(in) :: wn
748 real(real64),
intent(in) :: time
749 class(
mesh_t),
intent(in) :: mesh
750 integer,
intent(in) :: n_points
751 real(real64),
intent(out) :: pw_field(:,:)
753 real(real64) :: x_prop(3), x_norm
754 real(real64) :: velocity_time(3)
755 complex(real64) :: efield_ip(3)
756 complex(real64) :: e0(3)
759 velocity_time(:) = external_waves%v_vector(1:3, wn) * time
760 e0(:) = external_waves%e_field(1:3, wn)
762 x_prop = mesh%x(:, ip) - velocity_time
763 x_norm = norm2(x_prop(1:3))
764 efield_ip =
mxf(external_waves%mx_function(wn), x_prop, external_waves%pw_phase(wn))
765 pw_field(ip, :) = real(e0(1:3) * efield_ip, real64)
772 subroutine get_pw_b_field(external_waves, mesh, pwidx, e_field, b_field)
774 class(
mesh_t),
intent(in) :: mesh
775 real(real64),
intent(in) :: e_field(:,:)
776 real(real64),
intent(out) :: b_field(:,:)
777 integer,
intent(in) :: pwidx
779 real(real64) :: k_vector(3), k_vector_abs
780 real(real64) :: velocity(3)
782 complex(real64) :: e0(3)
785 velocity = external_waves%v_vector(1:3, pwidx)
786 k_vector = external_waves%k_vector(1:3, pwidx)
787 k_vector_abs = norm2(k_vector(1:3))
788 e0 = external_waves%e_field(1:3, pwidx)
789 p_c_ =
p_c * external_waves%c_factor
793 b_field(ip, :) =
m_one/(p_c_ * k_vector_abs) * dcross_product(k_vector, e_field(ip, :))
800 subroutine bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
802 real(real64),
intent(in) :: time
803 class(
mesh_t),
intent(in) :: mesh
804 character(len=*),
intent(in) :: type_of_field
805 real(real64),
intent(out) :: out_field_total(:, :)
808 real(real64) :: dmin, omega, k_vector(3), c_factor
809 integer :: iline, wn, pos_index, n_points, rankmin, ip, idir
810 real(real64),
allocatable :: shift(:,:)
811 complex(real64),
allocatable :: bessel_field_total(:,:), ztmp(:,:), vec_pot(:,:)
812 integer,
allocatable :: indices_bessel_ftc(:)
813 type(
mxf_t) :: envelope_mxf
819 indices_bessel_ftc = pack([(wn, wn = 1,external_waves%number)], &
820 external_waves%modus == option__maxwellincidentwaves__bessel_function)
822 if (
size(indices_bessel_ftc) == 0)
then
829 if (
allocated(external_waves%bessel%shift) .and. &
830 size(external_waves%bessel%shift(:,1)) /=
size(indices_bessel_ftc))
then
831 message(1) =
'Number of BesselBeamAxisShift defined in input file'
832 message(2) =
'does not match the number of Bessel beams.'
836 safe_allocate(shift(
size(indices_bessel_ftc), 3))
837 if (
allocated(external_waves%bessel%shift))
then
838 shift = external_waves%bessel%shift
843 if (type_of_field ==
"B field")
then
845 safe_allocate(vec_pot(mesh%np_part,
size(out_field_total, dim=2)))
846 safe_allocate(ztmp(
size(out_field_total, dim=1),
size(out_field_total, dim=2)))
847 n_points = mesh%np_part
853 safe_allocate(bessel_field_total(1:n_points, 1:3))
854 bessel_field_total =
m_zero
856 do iline = 1,
size(indices_bessel_ftc)
857 wn = indices_bessel_ftc(iline)
858 omega = external_waves%bessel%omega(wn)
859 k_vector = external_waves%mx_function(wn)%k_vector
860 c_factor = external_waves%c_factor
861 envelope_mxf = external_waves%mx_function(wn)
863 call external_waves%bessel%function(wn, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field_total)
865 select case (external_waves%field_type(wn))
869 select case (type_of_field)
874 out_field_total(ip,idir) = out_field_total(ip,idir) + real(
m_zi*omega*bessel_field_total(ip,idir), real64)
878 case (
"vector potential")
884 out_field_total(ip,idir) = out_field_total(ip,idir) -
m_one/
p_c * real(bessel_field_total(ip,idir), real64)
889 call zderivatives_curl(der, bessel_field_total(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
893 out_field_total(ip,idir) = out_field_total(ip,idir) -
m_one/
p_c * real(ztmp(ip,idir), real64)
901 select case (type_of_field)
906 out_field_total(ip,idir) = out_field_total(ip,idir) + real(bessel_field_total(ip,idir), real64)
910 case (
"vector potential")
916 out_field_total(ip,idir) = out_field_total(ip,idir) -
m_one/
p_c * &
917 real(bessel_field_total(ip,idir)/
m_zi/omega, real64)
924 do ip = 1, mesh%np_part
925 vec_pot(ip,idir) = -
m_one/
p_c * real(bessel_field_total(ip,idir)/
m_zi/omega, real64)
929 call zderivatives_curl(der, vec_pot(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
933 out_field_total(ip,idir) = out_field_total(ip,idir) - real(ztmp(ip,idir), real64)
942 if (external_waves%output_from_point)
then
943 pos_index =
mesh_nearest_point(mesh, external_waves%selected_point_coordinate(1:3), dmin, rankmin)
944 if (mesh%mpi_grp%rank == rankmin)
then
945 external_waves%selected_point_field(:) = out_field_total(pos_index,:)
946 write(external_waves%out_file,
"(4F14.8, 4x)") time, external_waves%selected_point_field(:)
950 safe_deallocate_a(shift)
951 safe_deallocate_a(ztmp)
952 safe_deallocate_a(vec_pot)
953 safe_deallocate_a(bessel_field_total)
962 subroutine bessel_beam_function(this, iline, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field)
964 integer,
intent(in) :: iline
965 real(real64),
intent(in) :: shift(:,:), time, k_vector(3), c_factor
966 class(
mesh_t),
intent(in) :: mesh
967 integer,
intent(in) :: n_points
968 type(
mxf_t),
intent(in) :: envelope_mxf
969 complex(real64),
intent(out) :: bessel_field(:,:)
971 real(real64) :: pos(3), temp, temp2, temp3, rho, phi_rho, wigner(3)
972 real(real64) :: hel, theta, omega, amp, kappa, proj, k_norm, velocity_time(3), x_prop(3)
973 complex(real64) :: efield_ip(3)
974 real(real64) :: bessel_plus, bessel_minus
975 integer :: ip, mm, pol
977 assert(iline <=
size(this%omega))
978 hel = real(this%helicity(iline), real64)
979 theta = this%theta_k(iline)
980 mm = this%m_order(iline)
982 omega = this%omega(iline)
983 proj = omega *
cos(theta) /
p_c
984 kappa =
sqrt(omega**2 - (proj*
p_c)**2)
987 wigner(2) = 0.5 * (1 + hel *
cos(theta))
988 wigner(3) = 0.5 * (1 - hel *
cos(theta))
989 proj = omega *
cos(theta) /
p_c
990 pol = this%lin_dir(iline)
993 pos(:) = mesh%x(:, ip) - shift(iline,:)
994 rho = norm2(pos(1:2))
995 phi_rho =
atan2(pos(2) , pos(1))
996 temp = proj * pos(3) + phi_rho * (mm + 1) - omega*time
997 temp2 = proj * pos(3) + phi_rho * (mm - 1) - omega*time
998 temp3 = proj * pos(3) + phi_rho * mm - omega*time
1004 bessel_field(ip, 1) = amp * (
exp(
m_zi*temp) * wigner(3) * bessel_plus +
exp(
m_zi*temp2) * wigner(2) * bessel_minus)
1008 bessel_field(ip, 2) =
m_zi * amp * (-
exp(
m_zi*temp) * wigner(3) * bessel_plus + &
1009 exp(
m_zi*temp2) * wigner(2) * bessel_minus)
1016 if (this%envelope(iline))
then
1017 k_norm = norm2(k_vector)
1018 velocity_time = k_vector *
p_c * c_factor * time / k_norm
1019 x_prop(:) = pos(:) - velocity_time(:)
1021 bessel_field(ip, :) = bessel_field(ip, :) * real(efield_ip, real64)
1031 integer,
intent(in) :: nlines
1032 integer,
intent(in) :: dim
1034 safe_allocate(this%amp(1: nlines))
1035 safe_allocate(this%omega(1:nlines))
1036 safe_allocate(this%theta_k(1:nlines))
1037 safe_allocate(this%m_order(1:nlines))
1038 safe_allocate(this%helicity(1:nlines))
1039 safe_allocate(this%shift(1:nlines, 1:dim))
1040 safe_allocate(this%envelope(1:nlines))
1041 safe_allocate(this%lin_dir(1:nlines))
1049 this%envelope = .false.
1057 safe_deallocate_a(this%amp)
1058 safe_deallocate_a(this%omega)
1059 safe_deallocate_a(this%theta_k)
1060 safe_deallocate_a(this%m_order)
1061 safe_deallocate_a(this%helicity)
1062 safe_deallocate_a(this%shift)
1063 safe_deallocate_a(this%lin_dir)
1064 safe_deallocate_a(this%envelope)
constant times a vector plus a vector
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_free_buffer(this, async)
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, public bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
Calculation of Bessel beam from parsed formula.
subroutine external_waves_update_quantity(this, label)
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)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
Maxwell-field-to-matter interactions.
Some general things and nomenclature:
subroutine, public parse_block_string(blk, l, c, res, convert_to_c)
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...
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
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 electric field to a medium
class to transfer a Maxwell vector potential to a medium
Systems (system_t) can expose quantities that can be used to calculate interactions with other system...