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(:)
95 integer,
allocatable :: field_type(:)
96 character(len=1024),
allocatable :: e_field_string(:,:)
97 real(real64),
allocatable :: k_vector(:,:)
98 real(real64),
allocatable :: v_vector(:,:)
99 complex(real64),
allocatable :: e_field(:,:)
100 real(real64),
allocatable :: pw_phase(:)
101 type(mxf_t),
allocatable :: mx_function(:)
103 logical :: output_from_point = .false.
104 real(real64),
allocatable :: selected_point_coordinate(:)
105 real(real64),
allocatable :: selected_point_field(:)
106 real(real64) :: c_factor
107 type(accel_mem_t) :: buff_map
108 type(bessel_beam_t) :: bessel
123 class(external_waves_t),
pointer :: this
124 type(namespace_t),
intent(in) :: namespace
127 character(len=:),
allocatable :: quantities(:)
133 this%namespace = namespace_t(
"ExternalSource", parent=namespace)
135 message(1) =
'Plane-wave is currently always 3D and non-periodic.'
139 quantities = [
character(16) ::
"E field",
"vector potential",
"B field"]
140 do iq = 1,
size(quantities)
141 call this%quantities%add(
quantity_t(quantities(iq), always_available = .
true., &
142 updated_on_demand = .
true., iteration =
clock_t()))
153 class(external_waves_t),
intent(in) :: partner
154 class(interaction_surrogate_t),
intent(inout) :: interaction
158 select type (interaction)
177 character(len=*),
intent(in) :: label
182 case (
"E field",
"B field",
"vector potential")
187 message(1) =
"Incompatible quantity."
203 select type(interaction)
205 quantity => partner%quantities%get(
"E field")
207 call external_waves_eval(partner, quantity%iteration%value(), interaction%system_gr,
"E field", &
208 interaction%system_field)
209 call interaction%do_mapping()
212 quantity => partner%quantities%get(
"vector potential")
213 interaction%system_field =
m_zero
215 "vector potential", interaction%system_field)
216 call interaction%do_mapping()
219 quantity => partner%quantities%get(
"B field")
220 interaction%system_field =
m_zero
221 call external_waves_eval(partner, quantity%iteration%value(), interaction%system_gr,
"B field", &
222 interaction%system_field, der=interaction%system_gr%der)
223 call interaction%do_mapping()
226 message(1) =
"Incompatible interaction."
237 type(namespace_t),
intent(in) :: namespace
239 logical :: has_source
250 call parse_variable(namespace,
'AnalyticalExternalSource', .false., has_source)
264 type(namespace_t),
intent(in) :: namespace
266 integer :: il, nlines, ncols, iex_norm, idim
267 integer,
parameter :: sys_dim = 3
268 real(real64) :: k_vector(sys_dim), velocity(sys_dim), x_pos(sys_dim)
269 real(real64) :: x_norm, dummy(sys_dim), k_dot_e , test_limit, k_norm, output_pos(3)
270 complex(real64) :: e_field(sys_dim)
271 character(len=1024) :: k_string(sys_dim)
272 character(len=1),
dimension(sys_dim),
parameter :: dims = [
"x",
"y",
"z"]
273 character(len=1024) :: mxf_expression
279 test_limit = 10.0e-9_real64
297 if (
parse_block(namespace,
'ExternalSourceBesselOutput', blk) == 0)
then
299 if (nlines > 1 )
then
300 message(2) =
'ExternalSource output is limited to one point.'
304 if (ncols /= 3 )
then
305 message(1) =
'ExternalSourceBesselOutput must have 3 columns.'
308 external_waves%output_from_point= .
true.
309 safe_allocate(external_waves%selected_point_coordinate(1:3))
310 safe_allocate(external_waves%selected_point_field(1:3))
315 external_waves%selected_point_coordinate(1:3) = output_pos(1:3)
316 external_waves%selected_point_field(1:3) =
m_zero
320 external_waves%out_file =
io_open(
'bessel_source_at_point', namespace=namespace, action=
'write')
321 write(external_waves%out_file,
'(12a) ')
'# Time (a.u.) ' ,
' Field-x ' ,
' Field-y ' ,
' Field-z '
324 external_waves%output_from_point= .false.
369 if (
parse_block(namespace,
'MaxwellIncidentWaves', blk) == 0)
then
376 external_waves%number = nlines
377 safe_allocate(external_waves%modus(1:nlines))
378 safe_allocate(external_waves%e_field_string(1:3, 1:nlines))
379 safe_allocate(external_waves%e_field(1:3, 1:nlines))
380 safe_allocate(external_waves%k_vector(1:3, 1:nlines))
381 safe_allocate(external_waves%v_vector(1:3, 1:nlines))
382 safe_allocate(external_waves%mx_function(1:nlines))
383 safe_allocate(external_waves%field_type(1:nlines))
384 safe_allocate(external_waves%pw_phase(1:nlines))
385 external_waves%pw_phase =
m_zero
387 call external_waves%bessel%init(nlines, 3)
391 if ((ncols < 5) .or. (ncols > 9))
then
392 message(1) =
'Each line in the MaxwellIncidentWaves block must have five to nine columns.'
401 if (external_waves%modus(il) == option__maxwellincidentwaves__plane_wave_parser)
then
404 call parse_block_string( blk, il - 1, 3 + idim + 1, external_waves%e_field_string(idim, il))
406 write(
message(1),
'(a,i2,a) ')
'Substituting electromagnetic incident wave ', il,
' with the expressions: '
409 write(
message(idim),
'(6a)')
' Wave vector k('//dims(idim)//
') = ', trim(k_string(idim))
410 write(
message(idim+1),
'(2a)')
' E-field('//dims(idim)//
') for t_0 = ', &
411 trim(external_waves%e_field_string(idim, il))
427 k_norm = norm2(k_vector)
429 velocity(:) = k_vector(:) / k_norm *
p_c * external_waves%c_factor
430 external_waves%k_vector(:,il) = k_vector(:)
431 external_waves%v_vector(:,il) = velocity(:)
433 else if (external_waves%modus(il) == option__maxwellincidentwaves__plane_wave_mx_function)
then
439 write(
message(1),
'(a,i2) ')
'Substituting electromagnetic incident wave ', il
440 write(
message(2),
'(a)' )
'with the expression: '
444 write(
message(idim),
'(a,f9.4,sp,f9.4,"i")')
' E-field('//trim(dims(idim))//
') complex amplitude = ', &
445 real(e_field(idim)), aimag(e_field(idim))
447 write(
message(4),
'(2a)' )
' Maxwell wave function name = ', trim(mxf_expression)
450 call mxf_read(external_waves%mx_function(il), namespace, trim(mxf_expression), iex_norm)
451 if (iex_norm /= 0)
then
452 write(
message(1),
'(3A)')
'Ex_norm in the ""', trim(mxf_expression), &
453 '"" field defined in the MaxwellIncidentWaves block'
460 k_vector(1:3) = external_waves%mx_function(il)%k_vector(1:3)
461 k_norm = norm2(k_vector)
463 k_dot_e = real(dot_product(k_vector, e_field), real64)
464 if (abs(k_dot_e) > test_limit)
then
465 write(
message(1),
'(a) ')
'The wave vector k or its electric field are not perpendicular. '
466 write(
message(2),
'(a,f8.3,a)' )
'Their dot product yields the magnitude', abs(k_dot_e) ,
' while'
467 write(
message(3),
'(a,f8.3,a)' )
'tolerance is ', test_limit ,
'.'
470 if (k_norm < 1e-10)
then
471 message(1) =
'The k vector is not set correctly: |k|~0 .'
475 external_waves%e_field(:,il) = e_field(:)
476 external_waves%k_vector(:,il) = k_vector(:)
477 external_waves%v_vector(:,il) = k_vector(:) / k_norm *
p_c * external_waves%c_factor
479 else if (external_waves%modus(il) == option__maxwellincidentwaves__bessel_function)
then
487 external_waves%bessel%envelope(il) = .
true.
488 call mxf_read(external_waves%mx_function(il), namespace, trim(mxf_expression), iex_norm)
494 write(
message(1),
'(a,i2) ')
'Incident Bessel Beam', il
497 if (abs(external_waves%bessel%helicity(il)) /= 1)
then
498 write(
message(1),
'(A)')
'Helicity has to be either +1 or -1 !'
502 write(
message(1),
'(a,f5.3)' )
' Bessel Amplitude ', external_waves%bessel%amp(il)
503 write(
message(2),
'(a,i2)' )
' Bessel Order m', external_waves%bessel%m_order(il)
504 write(
message(3),
'(a,f5.3)' )
' Bessel Frequency ', external_waves%bessel%omega(il)
505 write(
message(4),
'(a,i2)' )
' Bessel Helicity ', external_waves%bessel%helicity(il)
506 write(
message(5),
'(a,f5.3)' )
' Bessel Opening Angle ', external_waves%bessel%theta_k(il)
509 if (external_waves%bessel%lin_dir(il)/= 0)
then
510 write(
message(5),
'(a,i2)' )
' Bessel is Linearly Polarized in Direction : ', external_waves%bessel%lin_dir(il)
521 external_waves%number = 0
539 if (
parse_block(namespace,
'BesselBeamAxisShift', blk) == 0)
then
542 if (ncols /= 3 )
then
543 message(1) =
'BesselBeamAxisShift must have 3 columns.'
567 if (external_waves%output_from_point)
then
568 call io_close(external_waves%out_file)
569 safe_deallocate_a(external_waves%selected_point_coordinate)
570 safe_deallocate_a(external_waves%selected_point_field)
573 safe_deallocate_a(external_waves%bessel%shift)
574 safe_deallocate_a(external_waves%points_map)
575 safe_deallocate_a(external_waves%modus)
576 safe_deallocate_a(external_waves%e_field_string)
577 safe_deallocate_a(external_waves%k_vector)
578 safe_deallocate_a(external_waves%v_vector)
579 safe_deallocate_a(external_waves%e_field)
580 safe_deallocate_a(external_waves%mx_function)
581 safe_deallocate_a(external_waves%pw_phase)
592 subroutine external_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
594 real(real64),
intent(in) :: time
595 class(
mesh_t),
intent(in) :: mesh
596 character(len=*),
intent(in) :: type_of_field
597 real(real64),
intent(out) :: out_field_total(:, :)
607 call plane_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der=der)
608 call bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der=der)
617 subroutine plane_waves_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
619 real(real64),
intent(in) :: time
620 class(
mesh_t),
intent(in) :: mesh
621 character(len=*),
intent(in) :: type_of_field
622 real(real64),
intent(out) :: out_field_total(:, :)
626 real(real64),
allocatable :: pw_field(:,:), ztmp(:,:), b_field_aux(:,:)
628 integer,
allocatable :: indices_pw_parser(:)
629 integer,
allocatable :: indices_mx_ftc(:)
630 integer :: n_plane_waves, n_points
636 indices_pw_parser = pack([(wn, wn = 1,external_waves%number)], &
637 external_waves%modus == option__maxwellincidentwaves__plane_wave_parser)
639 indices_mx_ftc = pack([(wn, wn = 1,external_waves%number)], &
640 external_waves%modus == option__maxwellincidentwaves__plane_wave_mx_function)
642 n_plane_waves =
size(indices_pw_parser) +
size(indices_mx_ftc)
644 p_c_ =
p_c * external_waves%c_factor
646 if (n_plane_waves == 0)
then
654 safe_allocate(ztmp(mesh%np,
size(out_field_total, dim=2)))
655 n_points = mesh%np_part
659 safe_allocate(pw_field(n_points,
size(out_field_total, dim=2)))
663 do wn = 1, external_waves%number
665 select case(external_waves%modus(wn))
666 case (option__maxwellincidentwaves__plane_wave_parser)
669 case (option__maxwellincidentwaves__plane_wave_mx_function)
673 select case (external_waves%field_type(wn))
677 select case (type_of_field)
679 out_field_total(1:mesh%np,:) = out_field_total(1:mesh%np,:) + pw_field(1:mesh%np,:)
680 case (
"vector potential")
683 safe_allocate(b_field_aux(1:mesh%np, 1:mesh%box%dim))
684 call get_pw_b_field(external_waves, mesh, wn, pw_field, b_field_aux)
685 out_field_total(:,:) = out_field_total(:,:) + b_field_aux(:,:)
686 safe_deallocate_a(b_field_aux)
691 select case (type_of_field)
694 case (
"vector potential")
695 out_field_total(1:mesh%np,:) = out_field_total(1:mesh%np,:) -
m_one/p_c_ * pw_field(1:mesh%np,1:3)
697 call dderivatives_curl(der, pw_field(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
698 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)
704 safe_deallocate_a(pw_field)
705 safe_deallocate_a(ztmp)
716 integer,
intent(in) :: wn
717 real(real64),
intent(in) :: time
718 class(
mesh_t),
intent(in) :: mesh
719 integer,
intent(in) :: n_points
720 real(real64),
intent(out) :: pw_field(:,:)
722 real(real64) :: x_prop(3), x_norm
723 real(real64) :: velocity_time(3)
724 real(real64) :: parsed_field(3)
725 real(real64) :: dummy(3)
728 velocity_time(:) = external_waves%v_vector(1:3, wn) * time
731 external_waves%e_field_string(idim, wn))
733 x_prop = mesh%x(ip, :) - velocity_time
734 x_norm = norm2(x_prop(1:3))
745 integer,
intent(in) :: wn
746 real(real64),
intent(in) :: time
747 class(
mesh_t),
intent(in) :: mesh
748 integer,
intent(in) :: n_points
749 real(real64),
intent(out) :: pw_field(:,:)
751 real(real64) :: x_prop(3), x_norm
752 real(real64) :: velocity_time(3)
753 complex(real64) :: efield_ip(3)
754 complex(real64) :: e0(3)
757 velocity_time(:) = external_waves%v_vector(1:3, wn) * time
758 e0(:) = external_waves%e_field(1:3, wn)
760 x_prop = mesh%x(ip, :) - velocity_time
761 x_norm = norm2(x_prop(1:3))
762 efield_ip =
mxf(external_waves%mx_function(wn), x_prop, external_waves%pw_phase(wn))
763 pw_field(ip, :) = real(e0(1:3) * efield_ip, real64)
770 subroutine get_pw_b_field(external_waves, mesh, pwidx, e_field, b_field)
772 class(
mesh_t),
intent(in) :: mesh
773 real(real64),
intent(in) :: e_field(:,:)
774 real(real64),
intent(out) :: b_field(:,:)
775 integer,
intent(in) :: pwidx
777 real(real64) :: k_vector(3), k_vector_abs
778 real(real64) :: velocity(3)
780 complex(real64) :: e0(3)
783 velocity = external_waves%v_vector(1:3, pwidx)
784 k_vector = external_waves%k_vector(1:3, pwidx)
785 k_vector_abs = norm2(k_vector(1:3))
786 e0 = external_waves%e_field(1:3, pwidx)
787 p_c_ =
p_c * external_waves%c_factor
791 b_field(ip, :) =
m_one/(p_c_ * k_vector_abs) * dcross_product(k_vector, e_field(ip, :))
798 subroutine bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
800 real(real64),
intent(in) :: time
801 class(
mesh_t),
intent(in) :: mesh
802 character(len=*),
intent(in) :: type_of_field
803 real(real64),
intent(out) :: out_field_total(:, :)
806 real(real64) :: dmin, omega, k_vector(3), c_factor
807 integer :: iline, wn, pos_index, n_points, rankmin
808 real(real64),
allocatable :: shift(:,:)
809 complex(real64),
allocatable :: bessel_field_total(:,:), ztmp(:,:), vec_pot(:,:)
810 integer,
allocatable :: indices_bessel_ftc(:)
811 type(
mxf_t) :: envelope_mxf
817 indices_bessel_ftc = pack([(wn, wn = 1,external_waves%number)], &
818 external_waves%modus == option__maxwellincidentwaves__bessel_function)
820 if (
size(indices_bessel_ftc) == 0)
then
827 if (
allocated(external_waves%bessel%shift) .and. &
828 size(external_waves%bessel%shift(:,1)) /=
size(indices_bessel_ftc))
then
829 message(1) =
'Number of BesselBeamAxisShift defined in input file'
830 message(2) =
'does not match the number of Bessel beams.'
834 safe_allocate(shift(
size(indices_bessel_ftc), 3))
835 if (
allocated(external_waves%bessel%shift))
then
836 shift = external_waves%bessel%shift
841 if (type_of_field ==
"B field")
then
843 safe_allocate(vec_pot(mesh%np_part,
size(out_field_total, dim=2)))
844 safe_allocate(ztmp(
size(out_field_total, dim=1),
size(out_field_total, dim=2)))
845 n_points = mesh%np_part
851 safe_allocate(bessel_field_total(1:n_points, 1:3))
852 bessel_field_total =
m_zero
854 do iline = 1,
size(indices_bessel_ftc)
855 wn = indices_bessel_ftc(iline)
856 omega = external_waves%bessel%omega(wn)
857 k_vector = external_waves%mx_function(wn)%k_vector
858 c_factor = external_waves%c_factor
859 envelope_mxf = external_waves%mx_function(wn)
861 call external_waves%bessel%function(wn, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field_total)
863 select case (external_waves%field_type(wn))
867 select case (type_of_field)
869 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))
870 case (
"vector potential")
873 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))
875 call zderivatives_curl(der, bessel_field_total(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
876 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))
881 select case (type_of_field)
883 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))
884 case (
"vector potential")
887 out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) -
m_one/
p_c * &
888 real(bessel_field_total(1:mesh%np,1:3)/M_zI/omega)
890 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)
892 out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) - real(ztmp(1:mesh%np, 1:3))
898 if (external_waves%output_from_point)
then
899 pos_index =
mesh_nearest_point(mesh, external_waves%selected_point_coordinate(1:3), dmin, rankmin)
900 if (mesh%mpi_grp%rank == rankmin)
then
901 external_waves%selected_point_field(:) = out_field_total(pos_index,:)
902 write(external_waves%out_file,
"(4F14.8, 4x)") time, external_waves%selected_point_field(:)
906 safe_deallocate_a(shift)
907 safe_deallocate_a(ztmp)
908 safe_deallocate_a(vec_pot)
909 safe_deallocate_a(bessel_field_total)
918 subroutine bessel_beam_function(this, iline, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field)
920 integer,
intent(in) :: iline
921 real(real64),
intent(in) :: shift(:,:), time, k_vector(3), c_factor
922 class(
mesh_t),
intent(in) :: mesh
923 integer,
intent(in) :: n_points
924 type(
mxf_t),
intent(in) :: envelope_mxf
925 complex(real64),
intent(out) :: bessel_field(:,:)
927 real(real64) :: pos(3), temp, temp2, temp3, rho, phi_rho, wigner(3)
928 real(real64) :: hel, theta, omega, amp, kappa, proj, k_norm, velocity_time(3), x_prop(3)
929 complex(real64) :: efield_ip(3)
930 real(real64) :: bessel_plus, bessel_minus
931 integer :: ip, mm, pol
933 assert(iline <=
size(this%omega))
934 hel = real(this%helicity(iline), real64)
935 theta = this%theta_k(iline)
936 mm = this%m_order(iline)
938 omega = this%omega(iline)
939 proj = omega *
cos(theta) /
p_c
940 kappa =
sqrt(omega**2 - (proj*
p_c)**2)
943 wigner(2) = 0.5 * (1 + hel *
cos(theta))
944 wigner(3) = 0.5 * (1 - hel *
cos(theta))
945 proj = omega *
cos(theta) /
p_c
946 pol = this%lin_dir(iline)
949 pos(:) = mesh%x(ip, :) - shift(iline,:)
950 rho = norm2(pos(1:2))
951 phi_rho =
atan2(pos(2) , pos(1))
952 temp = proj * pos(3) + phi_rho * (mm + 1) - omega*time
953 temp2 = proj * pos(3) + phi_rho * (mm - 1) - omega*time
954 temp3 = proj * pos(3) + phi_rho * mm - omega*time
960 bessel_field(ip, 1) = amp * (
exp(
m_zi*temp) * wigner(3) * bessel_plus +
exp(
m_zi*temp2) * wigner(2) * bessel_minus)
964 bessel_field(ip, 2) =
m_zi * amp * (-
exp(
m_zi*temp) * wigner(3) * bessel_plus + &
965 exp(
m_zi*temp2) * wigner(2) * bessel_minus)
972 if (this%envelope(iline))
then
973 k_norm = norm2(k_vector)
974 velocity_time = k_vector *
p_c * c_factor * time / k_norm
975 x_prop(:) = pos(:) - velocity_time(:)
977 bessel_field(ip, :) = bessel_field(ip, :) * real(efield_ip, real64)
987 integer,
intent(in) :: nlines
988 integer,
intent(in) :: dim
990 safe_allocate(this%amp(1: nlines))
991 safe_allocate(this%omega(1:nlines))
992 safe_allocate(this%theta_k(1:nlines))
993 safe_allocate(this%m_order(1:nlines))
994 safe_allocate(this%helicity(1:nlines))
995 safe_allocate(this%shift(1:nlines, 1:dim))
996 safe_allocate(this%envelope(1:nlines))
997 safe_allocate(this%lin_dir(1:nlines))
1005 this%envelope = .false.
1013 safe_deallocate_a(this%amp)
1014 safe_deallocate_a(this%omega)
1015 safe_deallocate_a(this%theta_k)
1016 safe_deallocate_a(this%m_order)
1017 safe_deallocate_a(this%helicity)
1018 safe_deallocate_a(this%shift)
1019 safe_deallocate_a(this%lin_dir)
1020 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, 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)
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...
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
Systems (system_t) can expose quantities that can be used to calculate interactions with other system...