96 integer,
parameter,
public :: &
97 MULTIGRID_MX_TO_MA_EQUAL = 1, &
103 type(space_t) :: space
104 type(states_mxll_t) :: st
105 type(hamiltonian_mxll_t) :: hm
107 type(output_t) :: outp
108 type(multicomm_t) :: mc
110 type(mesh_interpolation_t) :: mesh_interpolate
112 type(propagator_mxll_t) :: tr_mxll
113 type(td_write_t) :: write_handler
114 type(c_ptr) :: output_handle
116 complex(real64),
allocatable :: ff_rs_inhom_t1(:,:), ff_rs_inhom_t2(:,:)
117 complex(real64),
allocatable :: rs_state_init(:,:)
118 type(time_interpolation_t),
pointer :: current_interpolation
119 real(real64) :: bc_bounds(2, 3), dt_bounds(2, 3)
120 integer :: energy_update_iter
121 type(restart_t) :: restart_dump
122 type(restart_t) :: restart
124 type(lattice_vectors_t) :: latt
126 type(helmholtz_decomposition_t) :: helmholtz
128 logical :: write_previous_state = .false.
151 procedure maxwell_constructor
158 class(maxwell_t),
pointer :: sys
159 type(namespace_t),
intent(in) :: namespace
173 class(maxwell_t),
intent(inout) :: this
174 type(namespace_t),
intent(in) :: namespace
181 this%namespace = namespace
185 this%space =
space_t(this%namespace)
191 call this%quantities%add(
quantity_t(
"E field", updated_on_demand = .false.))
192 call this%quantities%add(
quantity_t(
"B field", updated_on_demand = .false.))
193 call this%quantities%add(
quantity_t(
"vector potential", updated_on_demand = .false.))
214 select type (interaction)
216 call interaction%init(this%gr)
218 call interaction%init(this%gr, this%st%dim)
219 call interaction%init_space_latt(this%space, this%latt)
223 select type (prop => this%algo)
233 message(1) =
"The chosen propagator does not yet support interaction interpolation"
236 call interaction%init_interpolation(depth, interaction%label, cmplx=.
true.)
238 this%hm%current_density_from_medium = .
true.
240 message(1) =
"Trying to initialize an unsupported interaction by Maxwell."
252 integer(int64) :: index_range(4)
253 integer :: ierr, ip, pos_index, rankmin
262 index_range(1) = this%gr%np_global
263 index_range(2) = this%st%nst
265 index_range(4) = 100000
269 index_range, (/ 5000, 1, 1, 1 /))
271 call mpi_grp_init(this%st%system_grp, this%mc%master_comm)
277 this%st%energy_rate =
m_zero
278 this%st%delta_energy =
m_zero
279 this%st%energy_via_flux_calc =
m_zero
280 this%st%trans_energy_rate =
m_zero
281 this%st%trans_delta_energy =
m_zero
282 this%st%trans_energy_via_flux_calc =
m_zero
283 this%st%plane_waves_energy_rate =
m_zero
284 this%st%plane_waves_delta_energy =
m_zero
285 this%st%plane_waves_energy_via_flux_calc =
m_zero
287 safe_allocate(this%rs_state_init(1:this%gr%np_part, 1:this%st%dim))
288 this%rs_state_init(:,:) =
m_z0
290 this%energy_update_iter = 1
292 call poisson_init(this%st%poisson, this%namespace, this%space, this%gr%der, this%mc, this%gr%stencil)
294 call bc_mxll_init(this%hm%bc, this%namespace, this%space, this%gr, this%st)
295 this%bc_bounds(:,1:3) = this%hm%bc%bc_bounds(:,1:3)
297 this%dt_bounds(2, 1:3) = this%bc_bounds(1, 1:3)
298 this%dt_bounds(1, 1:3) = this%bc_bounds(1, 1:3) - this%gr%der%order * this%gr%spacing(1:3)
304 this%hm%propagation_apply = .
true.
307 do ip = 1, this%st%selected_points_number
308 pos_index =
mesh_nearest_point(this%gr, this%st%selected_points_coordinate(:,ip), dmin, rankmin)
309 if (this%gr%mpi_grp%rank == rankmin)
then
310 this%st%selected_points_map(ip) = pos_index
312 this%st%selected_points_map(ip) = -1
317 this%st%selected_points_number)
318 call accel_write_buffer(this%st%buff_selected_points_map, this%st%selected_points_number, &
319 this%st%selected_points_map)
322 this%hm%plane_waves_apply = .
true.
323 this%hm%spatial_constant_apply = .
true.
329 call zbatch_init(this%st%rs_stateb, 1, 1, this%st%dim, this%gr%np_part)
330 if (this%st%pack_states)
call this%st%rs_stateb%do_pack()
331 call this%st%rs_stateb%copy_to(this%st%rs_state_prevb)
332 call this%st%rs_stateb%copy_to(this%st%inhomogeneousb)
333 if (this%tr_mxll%bc_plane_waves)
then
334 call this%st%rs_stateb%copy_to(this%st%rs_state_plane_wavesb)
340 call this%helmholtz%init(this%namespace, this%gr, this%mc, this%space)
349 real(real64) :: courant
356 select type (algo => this%algo)
365 m_one/this%gr%spacing(3)**2))
368 write(
message(1),
'(a)')
'The timestep is too large compared to the Courant-Friedrichs-Lewy'
369 write(
message(2),
'(a)')
'stability condition. Time propagation might not be stable.'
373 if (
parse_is_defined(this%namespace,
'UserDefinedInitialMaxwellStates'))
then
378 this%st%rs_state(:,:) = this%st%rs_state + this%rs_state_init
379 if (this%tr_mxll%bc_plane_waves)
then
380 this%st%rs_state_plane_waves(:,:) = this%rs_state_init
386 if (this%tr_mxll%bc_constant)
then
388 algo%dt,
m_zero, this%st%rs_state, set_initial_state = .
true.)
393 if (
parse_is_defined(this%namespace,
'UserDefinedInitialMaxwellStates'))
then
394 safe_deallocate_a(this%rs_state_init)
400 call energy_mxll_calc(this%gr, this%st, this%hm, this%hm%energy, this%st%rs_state, &
401 this%st%rs_state_plane_waves)
405 this%st%selected_points_coordinate(:,:), this%st, this%gr)
407 call mxll_set_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
409 if (this%tr_mxll%bc_plane_waves)
then
410 call mxll_set_batch(this%st%rs_state_plane_wavesb, this%st%rs_state_plane_waves, this%gr%np, this%st%dim)
423 character(len=:),
allocatable,
intent(out) :: updated_quantities(:)
425 complex(real64),
allocatable :: charge_density_ext(:)
426 real(real64) :: current_time
429 call profiling_in(trim(this%namespace%get())//
":"//trim(operation%id))
431 current_time = this%iteration%value()
433 select type (algo => this%algo)
437 select case (operation%id)
442 safe_allocate(this%ff_rs_inhom_t1(1:this%gr%np_part, 1:this%hm%dim))
443 safe_allocate(this%ff_rs_inhom_t2(1:this%gr%np_part, 1:this%hm%dim))
446 safe_deallocate_a(this%ff_rs_inhom_t1)
447 safe_deallocate_a(this%ff_rs_inhom_t2)
450 if (this%hm%current_density_ext_flag .or. this%hm%current_density_from_medium)
then
451 call this%get_current(current_time, this%st%rs_current_density_t1)
452 call this%get_current(current_time+algo%dt, this%st%rs_current_density_t2)
459 safe_allocate(charge_density_ext(1:this%gr%np))
462 charge_density_ext =
m_z0
469 safe_deallocate_a(charge_density_ext)
473 this%st%rs_stateb, this%ff_rs_inhom_t1, this%ff_rs_inhom_t2, current_time, algo%dt)
475 updated_quantities = [
character(16) ::
"E field",
"B field",
"vector potential"]
478 if (any(this%hm%bc%bc_ab_type == option__maxwellabsorbingboundaries__cpml))
then
485 if (this%hm%current_density_ext_flag .or. this%hm%current_density_from_medium)
then
486 call this%get_current(current_time, this%st%rs_current_density_t1)
487 call mxll_set_batch(this%st%inhomogeneousb, this%st%rs_current_density_t1, this%gr%np, this%st%dim)
492 current_time, algo%dt, this%iteration%counter())
494 updated_quantities = [
character(16) ::
"E field",
"B field",
"vector potential"]
497 safe_allocate(this%ff_rs_inhom_t1(1:this%gr%np_part, 1:this%hm%dim))
498 if (any(this%hm%bc%bc_ab_type == option__maxwellabsorbingboundaries__cpml))
then
503 safe_deallocate_a(this%ff_rs_inhom_t1)
506 if (this%hm%current_density_ext_flag .or. this%hm%current_density_from_medium)
then
507 call this%get_current(current_time+algo%dt*
m_half, this%st%rs_current_density_t1)
515 current_time, algo%dt)
517 updated_quantities = [
character(16) ::
"E field",
"B field",
"vector potential"]
520 safe_allocate(this%ff_rs_inhom_t1(1:this%gr%np_part, 1:this%hm%dim))
521 safe_allocate(this%ff_rs_inhom_t2(1:this%gr%np_part, 1:this%hm%dim))
522 if (any(this%hm%bc%bc_ab_type == option__maxwellabsorbingboundaries__cpml))
then
527 safe_deallocate_a(this%ff_rs_inhom_t1)
528 safe_deallocate_a(this%ff_rs_inhom_t2)
531 if (this%hm%current_density_ext_flag .or. this%hm%current_density_from_medium)
then
532 call this%get_current(current_time+algo%dt*(
m_half-
sqrt(
m_three)/6.0_real64), this%st%rs_current_density_t1)
533 call this%get_current(current_time+algo%dt*(
m_half+
sqrt(
m_three)/6.0_real64), this%st%rs_current_density_t2)
547 current_time, algo%dt)
549 updated_quantities = [
character(16) ::
"E field",
"B field",
"vector potential"]
561 call profiling_out(trim(this%namespace%get())//
":"//trim(operation%id))
568 real(real64),
intent(in) :: tol
584 select type (interaction)
588 call interaction%init_from_partner(partner%gr, partner%space, partner%namespace)
590 call interaction%init_from_partner(partner%gr, partner%space, partner%namespace)
592 call interaction%init_from_partner(partner%gr, partner%space, partner%namespace)
594 message(1) =
"Unsupported interaction."
603 class(
maxwell_t),
intent(inout) :: partner
607 complex(real64) :: interpolated_value(3)
608 real(real64),
allocatable :: b_field(:,:), vec_pot(:,:)
611 call profiling_in(trim(partner%namespace%get())//
":"//
"COPY_QUANTITY_INTER")
613 select type (interaction)
615 call mxll_get_batch(partner%st%rs_stateb, partner%st%rs_state, partner%gr%np, partner%st%dim)
617 do ip = 1, interaction%system_np
619 interaction%system_pos(:, ip), interpolated_value(1))
621 interaction%system_pos(:, ip), interpolated_value(2))
623 interaction%system_pos(:, ip), interpolated_value(3))
629 call mxll_get_batch(partner%st%rs_stateb, partner%st%rs_state, partner%gr%np, partner%st%dim)
630 select case (interaction%type)
640 call partner%helmholtz%get_long_field(partner%namespace, partner%st%rs_state_long, total_field=partner%st%rs_state)
644 message(1) =
"Unknown type of field requested by interaction."
647 call interaction%do_mapping()
650 call mxll_get_batch(partner%st%rs_stateb, partner%st%rs_state, partner%gr%np, partner%st%dim)
651 safe_allocate(b_field(1:partner%gr%np_part, 1:partner%gr%box%dim))
652 safe_allocate(vec_pot(1:partner%gr%np_part, 1:partner%gr%box%dim))
655 partner%st%mu(1:partner%gr%np), partner%gr%np)
657 call partner%helmholtz%get_vector_potential(partner%namespace, vec_pot, trans_field=b_field)
661 interaction%partner_field(1:partner%gr%np,1:partner%gr%box%dim) = &
662 vec_pot(1:partner%gr%np,1:partner%gr%box%dim)
663 safe_deallocate_a(b_field)
664 safe_deallocate_a(vec_pot)
665 call interaction%do_mapping()
668 call mxll_get_batch(partner%st%rs_stateb, partner%st%rs_state, partner%gr%np, partner%st%dim)
670 interaction%partner_field, partner%st%mu(1:partner%gr%np), partner%gr%np)
671 call interaction%do_mapping()
674 message(1) =
"Unsupported interaction."
678 call profiling_out(trim(partner%namespace%get())//
":"//
"COPY_QUANTITY_INTER")
686 real(real64) :: itr_value
689 call profiling_in(trim(this%namespace%get())//
":"//
"OUTPUT_START")
691 select type (algo => this%algo)
693 call mxll_get_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
695 call td_write_mxll_init(this%write_handler, this%namespace, this%iteration%counter(), algo%dt, &
697 if (this%st%fromScratch)
then
698 call td_write_mxll_iter(this%write_handler, this%space, this%gr, this%st, this%hm, this%helmholtz, algo%dt, &
699 this%iteration%counter(), this%namespace)
700 itr_value = this%iteration%value()
702 this%outp, this%iteration%counter(), itr_value)
707 call profiling_out(trim(this%namespace%get())//
":"//
"OUTPUT_START")
715 logical :: stopping, reached_output_interval
716 real(real64) :: itr_value
720 call profiling_in(trim(this%namespace%get())//
":"//
"OUTPUT_WRITE")
722 select type (algo => this%algo)
726 call td_write_mxll_iter(this%write_handler, this%space, this%gr, this%st, this%hm, this%helmholtz, algo%dt, &
727 this%iteration%counter(), this%namespace)
729 reached_output_interval = .false.
731 if (this%outp%output_interval(iout) > 0)
then
732 if (mod(this%iteration%counter(), this%outp%output_interval(iout)) == 0)
then
733 reached_output_interval = .
true.
739 if (reached_output_interval .or. stopping)
then
740 call mxll_get_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
742 itr_value = this%iteration%value()
744 this%outp, this%iteration%counter(), itr_value)
749 call profiling_out(trim(this%namespace%get())//
":"//
"OUTPUT_WRITE")
762 select type (algo => this%algo)
777 integer :: int_counter
782 call iter%start(this%interactions)
783 do while (iter%has_next())
784 select type (interaction => iter%get_next())
786 int_counter = int_counter + 1
790 if (int_counter /= 0 .and. .not.
allocated(this%hm%medium_boxes))
then
791 safe_allocate(this%hm%medium_boxes(1:int_counter))
792 this%hm%calc_medium_box = .
true.
809 call iter%start(this%interactions)
810 do while (iter%has_next())
811 select type (interaction => iter%get_next())
813 if (
allocated(this%hm%medium_boxes) .and. .not. this%hm%medium_boxes_initialized)
then
815 this%hm%medium_boxes(iint) = interaction%medium_box
820 if (
allocated(this%hm%medium_boxes) .and. .not. this%hm%medium_boxes_initialized)
then
822 this%hm%medium_boxes_initialized = .
true.
825 if (this%hm%medium_boxes_initialized .and. this%hm%operator ==
faraday_ampere)
then
826 message(1) =
"A linear medium has been defined in the input file but the Hamiltonian"
827 message(2) =
"type you specified is not capable of dealing with the medium."
828 message(3) =
"Please use MaxwellHamiltonianOperator = faraday_ampere_medium or simple to enable"
829 message(4) =
"the medium propagation."
834 message(1) =
"The variable MaxwellHamiltonianOperator has been defined as faraday_ampere_medium"
835 message(2) =
"in the input file but no linear medium has been defined in the system block."
836 message(3) =
"Please either use a different option for MaxwellHamiltonianOperator or add"
837 message(4) =
"a linear medium to the system block."
848 integer :: ierr, err, zff_dim, id, id1, id2, ip_in, offset, iout
849 logical :: pml_check, write_previous_state
850 complex(real64),
allocatable :: zff(:,:)
855 call profiling_in(trim(this%namespace%get())//
":"//
"RESTART_WRITE")
861 if (this%write_handler%out(iout)%write)
then
862 call write_iter_flush(this%write_handler%out(iout)%handle)
867 if (.not. this%restart_dump%skip())
then
868 pml_check = any(this%hm%bc%bc_ab_type(1:3) == option__maxwellabsorbingboundaries__cpml)
870 message(1) =
"Debug: Writing td_maxwell restart."
873 if (this%tr_mxll%bc_plane_waves)
then
874 zff_dim = 2 * this%st%dim
876 zff_dim = 1 * this%st%dim
879 zff_dim = zff_dim + 18
881 select type (prop => this%algo)
883 write_previous_state = .
true.
884 zff_dim = zff_dim + this%st%dim
886 write_previous_state = .false.
890 this%hm%bc%pml%points_number, 3, 3, this%hm%bc%pml%conv_plus)
892 this%hm%bc%pml%points_number, 3, 3, this%hm%bc%pml%conv_minus)
895 call mxll_get_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
896 if (write_previous_state)
then
897 call mxll_get_batch(this%st%rs_state_prevb, this%st%rs_state_prev, this%gr%np, this%st%dim)
900 safe_allocate(zff(1:this%gr%np,1:zff_dim))
903 zff(1:this%gr%np, 1:this%st%dim) = this%st%rs_state(1:this%gr%np, 1:this%st%dim)
904 if (this%tr_mxll%bc_plane_waves)
then
905 call mxll_get_batch(this%st%rs_state_plane_wavesb, this%st%rs_state_plane_waves, &
906 this%gr%np, this%st%dim)
907 zff(1:this%gr%np, this%st%dim+1:this%st%dim+this%st%dim) = &
908 this%st%rs_state_plane_waves(1:this%gr%np, 1:this%st%dim)
909 offset = 2*this%st%dim
918 do ip_in = 1, this%hm%bc%pml%points_number
919 zff(ip_in, offset+id) = this%hm%bc%pml%conv_plus(ip_in, id1, id2)
920 zff(ip_in, offset+9+id) = this%hm%bc%pml%conv_minus(ip_in, id1, id2)
926 if (write_previous_state)
then
927 zff(1:this%gr%np, offset+1:offset+this%st%dim) = &
928 this%st%rs_state_prev(1:this%gr%np, 1:this%st%dim)
931 call states_mxll_dump(this%restart_dump, this%st, this%space, this%gr, zff, zff_dim, err, this%iteration%counter())
932 if (err /= 0) ierr = ierr + 1
934 if (this%hm%current_density_from_medium)
then
936 call iter%start(this%interactions)
937 do while (iter%has_next())
938 interaction => iter%get_next()
939 select type (interaction)
941 call interaction%write_restart(this%gr, this%space, this%restart_dump, err)
944 if (err /= 0) ierr = ierr + 1
947 message(1) =
"Debug: Writing td_maxwell restart done."
950 safe_deallocate_a(zff)
953 message(1) =
"Unable to write time-dependent Maxwell restart information."
958 call profiling_out(trim(this%namespace%get())//
":"//
"RESTART_WRITE")
967 integer :: ierr, err, zff_dim, id, id1, id2, ip_in, offset
968 logical :: pml_check, read_previous_state
969 complex(real64),
allocatable :: zff(:,:)
974 call profiling_in(trim(this%namespace%get())//
":"//
"RESTART_READ")
976 if (.not. this%restart%skip())
then
978 pml_check = any(this%hm%bc%bc_ab_type(1:3) == option__maxwellabsorbingboundaries__cpml)
980 if (this%restart%skip())
then
982 call profiling_out(trim(this%namespace%get())//
":"//
"RESTART_READ")
987 message(1) =
"Debug: Reading td_maxwell restart."
990 if (this%tr_mxll%bc_plane_waves)
then
991 zff_dim = 2 * this%st%dim
993 zff_dim = 1 * this%st%dim
996 zff_dim = zff_dim + 18
998 select type (prop => this%algo)
1000 read_previous_state = .
true.
1001 zff_dim = zff_dim + this%st%dim
1003 read_previous_state = .false.
1006 safe_allocate(zff(1:this%gr%np,1:zff_dim))
1008 call states_mxll_load(this%restart, this%st, this%gr, this%namespace, this%space, zff, &
1009 zff_dim, err, label =
": td_maxwell")
1010 this%st%rs_current_density_restart = .
true.
1012 this%st%rs_state(1:this%gr%np,1:this%st%dim) = zff(1:this%gr%np, 1:this%st%dim)
1013 if (this%tr_mxll%bc_plane_waves)
then
1014 this%st%rs_state_plane_waves(1:this%gr%np,1:this%st%dim) = &
1015 zff(1:this%gr%np,this%st%dim+1:this%st%dim+3)
1016 offset = 2*this%st%dim
1018 offset = this%st%dim
1025 do ip_in = 1, this%hm%bc%pml%points_number
1026 this%hm%bc%pml%conv_plus(ip_in,id1,id2) = zff(ip_in, offset+ id)
1027 this%hm%bc%pml%conv_minus(ip_in,id1,id2) = zff(ip_in, offset+9+id)
1031 this%hm%bc%pml%conv_plus_old = this%hm%bc%pml%conv_plus
1032 this%hm%bc%pml%conv_minus_old = this%hm%bc%pml%conv_minus
1033 offset = offset + 18
1035 if (read_previous_state)
then
1036 this%st%rs_state_prev(1:this%gr%np, 1:this%st%dim) = &
1037 zff(1:this%gr%np, offset+1:offset+this%st%dim)
1044 message(1) =
"Debug: Reading td restart done."
1047 safe_deallocate_a(zff)
1050 call accel_write_buffer(this%hm%bc%pml%buff_conv_plus, this%hm%bc%pml%points_number, 3, 3, &
1051 this%hm%bc%pml%conv_plus)
1052 call accel_write_buffer(this%hm%bc%pml%buff_conv_minus, this%hm%bc%pml%points_number, 3, 3, &
1053 this%hm%bc%pml%conv_minus)
1054 call accel_write_buffer(this%hm%bc%pml%buff_conv_plus_old, this%hm%bc%pml%points_number, 3, 3, &
1055 this%hm%bc%pml%conv_plus_old)
1058 if (this%hm%current_density_from_medium)
then
1060 call iter%start(this%interactions)
1061 do while (iter%has_next())
1062 interaction => iter%get_next()
1063 select type (interaction)
1065 call interaction%read_restart(this%gr, this%space, this%restart, err)
1074 call mxll_set_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
1075 if (read_previous_state)
then
1076 call mxll_set_batch(this%st%rs_state_prevb, this%st%rs_state_prev, this%gr%np, this%st%dim)
1079 if (this%tr_mxll%bc_plane_waves)
then
1080 call mxll_set_batch(this%st%rs_state_plane_wavesb, this%st%rs_state_plane_waves, this%gr%np, this%st%dim)
1083 this%st%fromScratch = .false.
1086 message(1) =
"Unable to read time-dependent Maxwell restart information: Starting from scratch"
1091 call profiling_out(trim(this%namespace%get())//
":"//
"RESTART_READ")
1105 this%kinetic_energy = this%hm%energy%energy
1115 call profiling_in(trim(this%namespace%get())//
":"//
"END_TIMESTEP")
1118 call energy_mxll_calc_batch(this%gr, this%st, this%hm, this%hm%energy, this%st%rs_stateb, this%st%rs_state_plane_wavesb)
1124 call profiling_out(trim(this%namespace%get())//
":"//
"END_TIMESTEP")
1131 real(real64),
intent(in) :: time
1132 complex(real64),
contiguous,
intent(inout) :: current(:, :)
1135 complex(real64),
allocatable :: current_density_ext(:, :)
1139 safe_allocate(current_density_ext(1:this%gr%np, 1:this%st%dim))
1141 if (this%hm%current_density_from_medium)
then
1143 call iter%start(this%interactions)
1144 do while (iter%has_next())
1145 select type (interaction => iter%get_next())
1147 call interaction%interpolate(time, current_density_ext)
1148 call lalg_axpy(this%gr%np, 3,
m_one, current_density_ext * this%hm%current_factor, current)
1153 if (this%hm%current_density_ext_flag)
then
1155 call lalg_axpy(this%gr%np, 3,
m_one, current_density_ext, current)
1157 safe_deallocate_a(current_density_ext)
1174 safe_deallocate_a(this%rs_state_init)
1179 call this%st%rs_stateb%end()
1180 call this%st%rs_state_prevb%end()
1181 call this%st%inhomogeneousb%end()
1182 if (this%tr_mxll%bc_plane_waves)
then
1183 call this%st%rs_state_plane_wavesb%end()
1190 call this%restart%end()
1191 call this%restart_dump%end()
scale a batch by a constant or vector
constant times a vector plus a vector
pure logical function, public accel_is_enabled()
integer, parameter, public accel_mem_read_only
This module defines the abstract interfact for algorithm factories.
This module implements the basic elements defining algorithms.
character(len=algo_label_len), parameter, public iteration_done
This module implements batches of mesh functions.
subroutine, public zbatch_init(this, dim, st_start, st_end, np, special, packed)
initialize a TYPE_CMPLX valued batch to given size without providing external memory
This module implements common operations on batches of mesh functions.
subroutine, public batch_set_zero(this, np, async)
fill all mesh functions of the batch with zero
This module handles the calculation mode.
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public get_rs_density_ext(st, space, mesh, time, rs_current_density_ext)
subroutine, public external_current_init(st, space, namespace, mesh)
This module implements the field transfer.
real(real64), parameter, public m_zero
real(real64), parameter, public m_fourth
complex(real64), parameter, public m_z0
real(real64), parameter, public m_half
real(real64), parameter, public p_c
Electron gyromagnetic ratio, see Phys. Rev. Lett. 130, 071801 (2023)
real(real64), parameter, public m_one
real(real64), parameter, public m_three
This module implements the underlying real-space grid.
subroutine, public grid_init_stage_1(gr, namespace, space, symm, latt, n_sites, site_position)
First stage of the grid initialization.
subroutine, public grid_init_stage_2(gr, namespace, space, mc, qvector)
Second stage of the grid initialization.
subroutine, public grid_end(gr)
finalize a grid object
subroutine, public hamiltonian_mxll_init(hm, namespace, gr, st)
Initializing the Maxwell Hamiltonian.
integer, parameter, public faraday_ampere
subroutine, public hamiltonian_mxll_end(hm)
integer, parameter, public faraday_ampere_medium
subroutine, public hamiltonian_mxll_update(this, time)
Maxwell Hamiltonian update (here only the time is updated, can maybe be added to another routine)
The Helmholtz decomposition is intended to contain "only mathematical" functions and procedures to co...
This module implements the index, used for the mesh points.
integer, parameter, public mxll_vec_pot_to_matter
integer, parameter, public linear_medium_to_em_field
integer, parameter, public lorentz_force
integer, parameter, public mxll_b_field_to_matter
integer, parameter, public mxll_e_field_to_matter
integer, parameter, public current_to_mxll_field
This module defines the abstract interaction_t class, and some auxiliary classes for interactions.
System information (time, memory, sysname)
This module is intended to contain "only mathematical" functions and procedures.
subroutine, public bc_mxll_init(bc, namespace, space, gr, st)
subroutine, public surface_grid_points_mapping(mesh, st, bounds)
subroutine, public bc_mxll_initialize_pml_simple(bc, space, gr, c_factor, dt)
subroutine, public inner_and_outer_points_mapping(mesh, st, bounds)
subroutine maxwell_update_interactions_start(this)
subroutine maxwell_exec_end_of_timestep_tasks(this)
subroutine maxwell_init_interaction(this, interaction)
subroutine maxwell_output_start(this)
subroutine maxwell_update_interactions_finish(this)
subroutine maxwell_init_interaction_as_partner(partner, interaction)
subroutine maxwell_output_finish(this)
subroutine maxwell_restart_write_data(this)
logical function maxwell_do_algorithmic_operation(this, operation, updated_quantities)
integer, parameter, public multigrid_mx_to_ma_large
subroutine maxwell_init_parallelization(this, grp)
subroutine maxwell_get_current(this, time, current)
subroutine, public maxwell_init(this, namespace)
subroutine maxwell_initialize(this)
subroutine maxwell_output_write(this)
logical function maxwell_is_tolerance_reached(this, tol)
class(maxwell_t) function, pointer maxwell_constructor(namespace)
subroutine maxwell_update_kinetic_energy(this)
logical function maxwell_restart_read_data(this)
subroutine maxwell_finalize(this)
subroutine maxwell_copy_quantities_to_interaction(partner, interaction)
subroutine, public mesh_interpolation_init(this, mesh)
This module defines the meshes, which are used in Octopus.
integer(int64) function, public mesh_global_index_from_coords(mesh, ix)
This function returns the true global index of the point for a given vector of integer coordinates.
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)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
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)
type(mpi_grp_t), public mpi_world
subroutine mpi_grp_init(grp, comm)
Initialize MPI group instance.
This module handles the communicators for the various parallelization strategies.
subroutine, public multicomm_end(mc)
subroutine, public multicomm_init(mc, namespace, base_grp, mode_para, n_node, index_range, min_range)
create index and domain communicators
integer, parameter, public mxll_field_total
integer, parameter, public mxll_field_trans
integer, parameter, public mxll_field_long
this module contains the low-level part of the output system
subroutine, public output_mxll_init(outp, namespace, space)
this module contains the output system
logical function, public parse_is_defined(namespace, name)
subroutine, public poisson_init(this, namespace, space, der, mc, stencil, qtot, label, solver, verbose, force_serial, force_cmplx)
subroutine, public poisson_end(this)
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.
character(len=algo_label_len), parameter, public exp_gauss1_start
character(len=algo_label_len), parameter, public exp_gauss1_finish
character(len=algo_label_len), parameter, public exp_gauss1_extrapolate
character(len=algo_label_len), parameter, public exp_gauss1_propagate
character(len=algo_label_len), parameter, public exp_gauss2_finish
character(len=algo_label_len), parameter, public exp_gauss2_propagate
character(len=algo_label_len), parameter, public exp_gauss2_extrapolate
character(len=algo_label_len), parameter, public exp_gauss2_start
character(len=algo_label_len), parameter, public expmid_extrapolate
character(len=algo_label_len), parameter, public expmid_finish
character(len=algo_label_len), parameter, public expmid_start
character(len=algo_label_len), parameter, public expmid_propagate
character(len=algo_label_len), parameter, public leapfrog_propagate
character(len=algo_label_len), parameter, public leapfrog_finish
character(len=algo_label_len), parameter, public leapfrog_start
subroutine, public transform_rs_densities(hm, mesh, rs_current_density, ff_density, sign)
subroutine, public energy_mxll_calc_batch(gr, st, hm, energy_mxll, rs_fieldb, rs_field_plane_wavesb)
integer, parameter, public rs_trans_forward
subroutine, public mxll_propagate_leapfrog(hm, namespace, gr, st, tr, time, dt, counter)
subroutine, public mxll_propagation_step(hm, namespace, gr, space, st, tr, rs_stateb, ff_rs_inhom_t1, ff_rs_inhom_t2, time, dt)
subroutine, public spatial_constant_calculation(constant_calc, st, gr, hm, time, dt, delay, rs_state, set_initial_state)
subroutine, public set_medium_rs_state(st, gr, hm)
subroutine, public mxll_propagate_expgauss1(hm, namespace, gr, st, tr, time, dt)
Exponential propagation scheme with Gauss collocation points, s=1.
subroutine, public energy_mxll_calc(gr, st, hm, energy_mxll, rs_field, rs_field_plane_waves)
subroutine, public mxll_propagate_expgauss2(hm, namespace, gr, st, tr, time, dt)
Exponential propagation scheme with Gauss collocation points, s=2.
subroutine, public propagator_mxll_init(gr, namespace, st, hm, tr)
This module implements the basic propagator framework.
character(len=algo_label_len), parameter, public store_current_status
This module defines the quantity_t class and the IDs for quantities, which can be exposed by a system...
Implementation details for regridding.
logical function, public clean_stop(comm)
returns true if a file named stop exists
integer, parameter, public restart_type_dump
integer, parameter, public restart_td
integer, parameter, public restart_type_load
This module is intended to contain "only mathematical" functions and procedures.
subroutine, public mxll_set_batch(rs_stateb, rs_state, np, dim, offset)
subroutine, public get_rs_state_at_point(rs_state_point, rs_state, pos, st, mesh)
subroutine, public get_electric_field_vector(rs_state_vector, electric_field_vector, ep_element)
subroutine, public get_transverse_rs_state(helmholtz, st, namespace)
subroutine, public mxll_get_batch(rs_stateb, rs_state, np, dim, offset)
subroutine, public get_rs_state_batch_selected_points(rs_state_point, rs_stateb, st, mesh)
subroutine, public states_mxll_end(st)
subroutine, public states_mxll_allocate(st, mesh)
Allocates the Maxwell states defined within a states_mxll_t structure.
subroutine, public states_mxll_init(st, namespace, space)
subroutine, public get_electric_field_state(rs_state, mesh, electric_field, ep_field, np)
subroutine, public get_magnetic_field_state(rs_state, mesh, rs_sign, magnetic_field, mu_field, np)
subroutine, public get_magnetic_field_vector(rs_state_vector, rs_sign, magnetic_field_vector, mu_element)
subroutine, public states_mxll_load(restart, st, mesh, namespace, space, zff, zff_dim, ierr, iter, lowest_missing, label, verbose)
subroutine, public states_mxll_dump(restart, st, space, mesh, zff, zff_dim, ierr, iter, verbose)
subroutine, public states_mxll_read_user_def(namespace, space, mesh, der, st, bc, user_def_rs_state)
This module implements the abstract system type.
subroutine, public system_init_parallelization(this, grp)
Basic functionality: copy the MPI group. This function needs to be implemented by extended types that...
subroutine, public system_end(this)
integer, parameter, public out_maxwell_max
subroutine, public td_write_mxll_end(writ)
subroutine, public td_write_mxll_init(writ, namespace, iter, dt, grp)
subroutine, public td_write_mxll_free_data(namespace, space, gr, st, hm, helmholtz, outp, iter, time)
subroutine, public td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
type(type_t), public type_integer
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.
Descriptor of one algorithmic operation.
Class to transfer a current to a Maxwell field.
These class extend the list and list iterator to make an interaction list.
abstract interaction class
surrogate interaction class to avoid circular dependencies between modules.
Lorenz force between a systems of particles and an electromagnetic field.
Class describing Maxwell systems.
This is defined even when running serial.
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
Implements the an exponential RK scheme with Gauss collocation points, s=1 see also Hochbruck,...
Implements the an exponential RK scheme with Gauss collocation points, s=2 see also Hochbruck,...
Implements the explicit exponential midpoint propagator (without predictor-corrector)
Implements a propagator for the leap frog algorithm.
Abstract class implementing propagators.
Systems (system_t) can expose quantities that can be used to calculate interactions with other system...
Abstract class for systems.