36 use,
intrinsic :: iso_fortran_env
74 integer,
allocatable :: helicity(:)
75 integer,
allocatable :: m_order(:)
76 real(real64),
allocatable :: amp(:)
77 real(real64),
allocatable :: theta_k(:)
78 real(real64),
allocatable :: omega(:)
79 real(real64),
allocatable :: shift(:,:)
80 logical,
allocatable :: envelope(:)
81 integer,
allocatable :: lin_dir(:)
89 integer :: points_number
90 integer,
allocatable :: points_map(:)
92 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)
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")
205 call external_waves_eval(partner, quantity%iteration%value(), interaction%system_gr,
"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.
366 if (
parse_block(namespace,
'MaxwellIncidentWaves', blk) == 0)
then
373 external_waves%number = nlines
374 safe_allocate(external_waves%modus(1:nlines))
375 safe_allocate(external_waves%e_field_string(1:3, 1:nlines))
376 safe_allocate(external_waves%e_field(1:3, 1:nlines))
377 safe_allocate(external_waves%k_vector(1:3, 1:nlines))
378 safe_allocate(external_waves%v_vector(1:3, 1:nlines))
379 safe_allocate(external_waves%mx_function(1:nlines))
380 safe_allocate(external_waves%field_type(1:nlines))
381 safe_allocate(external_waves%pw_phase(1:nlines))
382 external_waves%pw_phase =
m_zero
384 call external_waves%bessel%init(nlines, 3)
388 if ((ncols < 5) .or. (ncols > 9))
then
389 message(1) =
'Each line in the MaxwellIncidentWaves block must have five to nine columns.'
398 if (external_waves%modus(il) == option__maxwellincidentwaves__plane_wave_parser)
then
401 call parse_block_string( blk, il - 1, 3 + idim + 1, external_waves%e_field_string(idim, il))
403 write(
message(1),
'(a,i2,a) ')
'Substituting electromagnetic incident wave ', il,
' with the expressions: '
406 write(
message(idim),
'(6a)')
' Wave vector k('//dims(idim)//
') = ', trim(k_string(idim))
407 write(
message(idim+1),
'(2a)')
' E-field('//dims(idim)//
') for t_0 = ', trim(external_waves%e_field_string(idim, il))
423 k_norm = norm2(k_vector)
425 velocity(:) = k_vector(:) / k_norm *
p_c * external_waves%c_factor
426 external_waves%k_vector(:,il) = k_vector(:)
427 external_waves%v_vector(:,il) = velocity(:)
429 else if (external_waves%modus(il) == option__maxwellincidentwaves__plane_wave_mx_function)
then
435 write(
message(1),
'(a,i2) ')
'Substituting electromagnetic incident wave ', il
436 write(
message(2),
'(a)' )
'with the expression: '
440 write(
message(idim),
'(a,f9.4,sp,f9.4,"i")')
' E-field('//trim(dims(idim))//
') complex amplitude = ', &
441 real(e_field(idim)), aimag(e_field(idim))
443 write(
message(4),
'(2a)' )
' Maxwell wave function name = ', trim(mxf_expression)
446 call mxf_read(external_waves%mx_function(il), namespace, trim(mxf_expression), iex_norm)
447 if (iex_norm /= 0)
then
448 write(
message(1),
'(3A)')
'Ex_norm in the ""', trim(mxf_expression), &
449 '"" 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 out_field_total(1:mesh%np,:) = out_field_total(1:mesh%np,:) + pw_field(1:mesh%np,:)
676 case (
"vector potential")
679 safe_allocate(b_field_aux(1:mesh%np, 1:mesh%box%dim))
680 call get_pw_b_field(external_waves, mesh, wn, pw_field, b_field_aux)
681 out_field_total(:,:) = out_field_total(:,:) + b_field_aux(:,:)
682 safe_deallocate_a(b_field_aux)
687 select case (type_of_field)
690 case (
"vector potential")
691 out_field_total(1:mesh%np,:) = out_field_total(1:mesh%np,:) -
m_one/p_c_ * pw_field(1:mesh%np,1:3)
693 call dderivatives_curl(der, pw_field(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
694 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)
700 safe_deallocate_a(pw_field)
701 safe_deallocate_a(ztmp)
712 integer,
intent(in) :: wn
713 real(real64),
intent(in) :: time
714 class(
mesh_t),
intent(in) :: mesh
715 integer,
intent(in) :: n_points
716 real(real64),
intent(out) :: pw_field(:,:)
718 real(real64) :: x_prop(3), x_norm
719 real(real64) :: velocity_time(3)
720 real(real64) :: parsed_field(3)
721 real(real64) :: dummy(3)
724 velocity_time(:) = external_waves%v_vector(1:3, wn) * time
727 x_prop = mesh%x(ip, :) - velocity_time
728 x_norm = norm2(x_prop(1:3))
730 external_waves%e_field_string(idim, wn))
741 integer,
intent(in) :: wn
742 real(real64),
intent(in) :: time
743 class(
mesh_t),
intent(in) :: mesh
744 integer,
intent(in) :: n_points
745 real(real64),
intent(out) :: pw_field(:,:)
747 real(real64) :: x_prop(3), x_norm
748 real(real64) :: velocity_time(3)
749 complex(real64) :: efield_ip(3)
750 complex(real64) :: e0(3)
753 velocity_time(:) = external_waves%v_vector(1:3, wn) * time
754 e0(:) = external_waves%e_field(1:3, wn)
756 x_prop = mesh%x(ip, :) - velocity_time
757 x_norm = norm2(x_prop(1:3))
758 efield_ip =
mxf(external_waves%mx_function(wn), x_prop, external_waves%pw_phase(wn))
759 pw_field(ip, :) = real(e0(1:3) * efield_ip, real64)
766 subroutine get_pw_b_field(external_waves, mesh, pwidx, e_field, b_field)
768 class(
mesh_t),
intent(in) :: mesh
769 real(real64),
intent(in) :: e_field(:,:)
770 real(real64),
intent(out) :: b_field(:,:)
771 integer,
intent(in) :: pwidx
773 real(real64) :: k_vector(3), k_vector_abs
774 real(real64) :: velocity(3)
776 complex(real64) :: e0(3)
779 velocity = external_waves%v_vector(1:3, pwidx)
780 k_vector = external_waves%k_vector(1:3, pwidx)
781 k_vector_abs = norm2(k_vector(1:3))
782 e0 = external_waves%e_field(1:3, pwidx)
783 p_c_ =
p_c * external_waves%c_factor
787 b_field(ip, :) =
m_one/(p_c_ * k_vector_abs) * dcross_product(k_vector, e_field(ip, :))
794 subroutine bessel_source_eval(external_waves, time, mesh, type_of_field, out_field_total, der)
796 real(real64),
intent(in) :: time
797 class(
mesh_t),
intent(in) :: mesh
798 character(len=*),
intent(in) :: type_of_field
799 real(real64),
intent(out) :: out_field_total(:, :)
802 real(real64) :: dmin, omega, k_vector(3), c_factor
803 integer :: iline, wn, pos_index, n_points, rankmin
804 real(real64),
allocatable :: shift(:,:)
805 complex(real64),
allocatable :: bessel_field_total(:,:), ztmp(:,:), vec_pot(:,:)
806 integer,
allocatable :: indices_bessel_ftc(:)
807 type(
mxf_t) :: envelope_mxf
813 indices_bessel_ftc = pack([(wn, wn = 1,external_waves%number)], &
814 external_waves%modus == option__maxwellincidentwaves__bessel_function)
816 if (
size(indices_bessel_ftc) == 0)
then
823 if (
allocated(external_waves%bessel%shift) .and. &
824 size(external_waves%bessel%shift(:,1)) /=
size(indices_bessel_ftc))
then
825 message(1) =
'Number of BesselBeamAxisShift defined in input file'
826 message(2) =
'does not match the number of Bessel beams.'
830 safe_allocate(shift(
size(indices_bessel_ftc), 3))
831 if (
allocated(external_waves%bessel%shift))
then
832 shift = external_waves%bessel%shift
837 if (type_of_field ==
"B field")
then
839 safe_allocate(vec_pot(mesh%np_part,
size(out_field_total, dim=2)))
840 safe_allocate(ztmp(
size(out_field_total, dim=1),
size(out_field_total, dim=2)))
841 n_points = mesh%np_part
847 safe_allocate(bessel_field_total(1:n_points, 1:3))
848 bessel_field_total =
m_zero
850 do iline = 1,
size(indices_bessel_ftc)
851 wn = indices_bessel_ftc(iline)
852 omega = external_waves%bessel%omega(wn)
853 k_vector = external_waves%mx_function(wn)%k_vector
854 c_factor = external_waves%c_factor
855 envelope_mxf = external_waves%mx_function(wn)
857 call external_waves%bessel%function(wn, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field_total)
859 select case (external_waves%field_type(wn))
863 select case (type_of_field)
865 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))
866 case (
"vector potential")
869 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))
871 call zderivatives_curl(der, bessel_field_total(1:mesh%np_part,1:3), ztmp(1:mesh%np,1:3), set_bc = .false.)
872 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))
877 select case (type_of_field)
879 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))
880 case (
"vector potential")
883 out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) -
m_one/
p_c * &
884 real(bessel_field_total(1:mesh%np,1:3)/M_zI/omega)
886 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)
888 out_field_total(1:mesh%np,1:3) = out_field_total(1:mesh%np,1:3) - real(ztmp(1:mesh%np, 1:3))
894 if (external_waves%output_from_point)
then
895 pos_index =
mesh_nearest_point(mesh, external_waves%selected_point_coordinate(1:3), dmin, rankmin)
896 if (mesh%mpi_grp%rank == rankmin)
then
897 external_waves%selected_point_field(:) = out_field_total(pos_index,:)
898 write(external_waves%out_file,
"(4F14.8, 4x)") time, external_waves%selected_point_field(:)
902 safe_deallocate_a(shift)
903 safe_deallocate_a(ztmp)
904 safe_deallocate_a(vec_pot)
905 safe_deallocate_a(bessel_field_total)
914 subroutine bessel_beam_function(this, iline, shift, mesh, n_points, time, k_vector, c_factor, envelope_mxf, bessel_field)
916 integer,
intent(in) :: iline
917 real(real64),
intent(in) :: shift(:,:), time, k_vector(3), c_factor
918 class(
mesh_t),
intent(in) :: mesh
919 integer,
intent(in) :: n_points
920 type(
mxf_t),
intent(in) :: envelope_mxf
921 complex(real64),
intent(out) :: bessel_field(:,:)
923 real(real64) :: pos(3), temp, temp2, temp3, rho, phi_rho, wigner(3)
924 real(real64) :: hel, theta, omega, amp, kappa, proj, k_norm, velocity_time(3), x_prop(3)
925 complex(real64) :: efield_ip(3)
926 real(real64) :: bessel_plus, bessel_minus
927 integer :: ip, mm, pol
929 assert(iline <=
size(this%omega))
930 hel = real(this%helicity(iline), real64)
931 theta = this%theta_k(iline)
932 mm = this%m_order(iline)
934 omega = this%omega(iline)
935 proj = omega *
cos(theta) /
p_c
936 kappa =
sqrt(omega**2 - (proj*
p_c)**2)
939 wigner(2) = 0.5 * (1 + hel *
cos(theta))
940 wigner(3) = 0.5 * (1 - hel *
cos(theta))
941 proj = omega *
cos(theta) /
p_c
942 pol = this%lin_dir(iline)
945 pos(:) = mesh%x(ip, :) - shift(iline,:)
946 rho = norm2(pos(1:2))
947 phi_rho =
atan2(pos(2) , pos(1))
948 temp = proj * pos(3) + phi_rho * (mm + 1) - omega*time
949 temp2 = proj * pos(3) + phi_rho * (mm - 1) - omega*time
950 temp3 = proj * pos(3) + phi_rho * mm - omega*time
956 bessel_field(ip, 1) = amp * (
exp(
m_zi*temp) * wigner(3) * bessel_plus +
exp(
m_zi*temp2) * wigner(2) * bessel_minus)
960 bessel_field(ip, 2) =
m_zi * amp * (-
exp(
m_zi*temp) * wigner(3) * bessel_plus + &
961 exp(
m_zi*temp2) * wigner(2) * bessel_minus)
968 if (this%envelope(iline))
then
969 k_norm = norm2(k_vector)
970 velocity_time = k_vector *
p_c * c_factor * time / k_norm
971 x_prop(:) = pos(:) - velocity_time(:)
973 bessel_field(ip, :) = bessel_field(ip, :) * real(efield_ip, real64)
983 integer,
intent(in) :: nlines
984 integer,
intent(in) :: dim
986 safe_allocate(this%amp(1: nlines))
987 safe_allocate(this%omega(1:nlines))
988 safe_allocate(this%theta_k(1:nlines))
989 safe_allocate(this%m_order(1:nlines))
990 safe_allocate(this%helicity(1:nlines))
991 safe_allocate(this%shift(1:nlines, 1:dim))
992 safe_allocate(this%envelope(1:nlines))
993 safe_allocate(this%lin_dir(1:nlines))
1001 this%envelope = .false.
1009 safe_deallocate_a(this%amp)
1010 safe_deallocate_a(this%omega)
1011 safe_deallocate_a(this%theta_k)
1012 safe_deallocate_a(this%m_order)
1013 safe_deallocate_a(this%helicity)
1014 safe_deallocate_a(this%shift)
1015 safe_deallocate_a(this%lin_dir)
1016 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...