93 integer,
parameter,
public :: &
94 MULTIGRID_MX_TO_MA_EQUAL = 1, &
100 type(space_t) :: space
101 type(states_mxll_t) :: st
102 type(hamiltonian_mxll_t) :: hm
104 type(output_t) :: outp
105 type(multicomm_t) :: mc
107 type(mesh_interpolation_t) :: mesh_interpolate
109 type(propagator_mxll_t) :: tr_mxll
110 type(td_write_t) :: write_handler
111 type(c_ptr) :: output_handle
113 complex(real64),
allocatable :: ff_rs_inhom_t1(:,:), ff_rs_inhom_t2(:,:)
114 complex(real64),
allocatable :: rs_state_init(:,:)
115 type(time_interpolation_t),
pointer :: current_interpolation
116 real(real64) :: bc_bounds(2, 3), dt_bounds(2, 3)
117 integer :: energy_update_iter
118 type(restart_t) :: restart_dump
119 type(restart_t) :: restart
121 type(lattice_vectors_t) :: latt
123 type(helmholtz_decomposition_t) :: helmholtz
125 logical :: write_previous_state = .false.
147 procedure maxwell_constructor
154 class(maxwell_t),
pointer :: sys
155 type(namespace_t),
intent(in) :: namespace
156 type(mpi_grp_t),
intent(in) :: grp
170 class(maxwell_t),
intent(inout) :: this
171 type(namespace_t),
intent(in) :: namespace
172 type(mpi_grp_t),
intent(in) :: grp
179 this%namespace = namespace
180 call this%init_parallelization(grp)
184 this%space =
space_t(this%namespace)
190 call this%quantities%add(
quantity_t(
"E field", updated_on_demand = .false.))
191 call this%quantities%add(
quantity_t(
"B field", updated_on_demand = .false.))
192 call this%quantities%add(
quantity_t(
"vector potential", updated_on_demand = .false.))
215 select type (interaction)
217 call interaction%init(this%gr)
219 call interaction%init(this%gr, this%st%dim)
220 call interaction%init_space_latt(this%space, this%latt)
224 select type (prop => this%algo)
234 message(1) =
"The chosen propagator does not yet support interaction interpolation"
237 call interaction%init_interpolation(depth, interaction%label, cmplx=.
true.)
239 this%hm%current_density_from_medium = .
true.
241 message(1) =
"Trying to initialize an unsupported interaction by Maxwell."
252 integer(int64) :: index_range(4)
253 integer :: ierr, ip, pos_index, rankmin
261 index_range(1) = this%gr%np_global
262 index_range(2) = this%st%nst
264 index_range(4) = 100000
268 index_range, (/ 5000, 1, 1, 1 /))
270 call mpi_grp_init(this%st%system_grp, this%mc%master_comm)
276 this%st%energy_rate =
m_zero
277 this%st%delta_energy =
m_zero
278 this%st%energy_via_flux_calc =
m_zero
279 this%st%trans_energy_rate =
m_zero
280 this%st%trans_delta_energy =
m_zero
281 this%st%trans_energy_via_flux_calc =
m_zero
282 this%st%plane_waves_energy_rate =
m_zero
283 this%st%plane_waves_delta_energy =
m_zero
284 this%st%plane_waves_energy_via_flux_calc =
m_zero
286 safe_allocate(this%rs_state_init(1:this%gr%np_part, 1:this%st%dim))
287 this%rs_state_init(:,:) =
m_z0
289 this%energy_update_iter = 1
291 call poisson_init(this%st%poisson, this%namespace, this%space, this%gr%der, this%mc, this%gr%stencil)
293 call bc_mxll_init(this%hm%bc, this%namespace, this%space, this%gr, this%st)
294 this%bc_bounds(:,1:3) = this%hm%bc%bc_bounds(:,1:3)
296 this%dt_bounds(2, 1:3) = this%bc_bounds(1, 1:3)
297 this%dt_bounds(1, 1:3) = this%bc_bounds(1, 1:3) - this%gr%der%order * this%gr%spacing(1:3)
303 this%hm%propagation_apply = .
true.
306 do ip = 1, this%st%selected_points_number
307 pos_index =
mesh_nearest_point(this%gr, this%st%selected_points_coordinate(:,ip), dmin, rankmin)
308 if (this%gr%mpi_grp%rank == rankmin)
then
309 this%st%selected_points_map(ip) = pos_index
311 this%st%selected_points_map(ip) = -1
316 this%st%selected_points_number)
317 call accel_write_buffer(this%st%buff_selected_points_map, this%st%selected_points_number, &
318 this%st%selected_points_map)
321 this%hm%plane_waves_apply = .
true.
322 this%hm%spatial_constant_apply = .
true.
328 call zbatch_init(this%st%rs_stateb, 1, 1, this%st%dim, this%gr%np_part)
329 if (this%st%pack_states)
call this%st%rs_stateb%do_pack()
330 call this%st%rs_stateb%copy_to(this%st%rs_state_prevb)
331 call this%st%rs_stateb%copy_to(this%st%inhomogeneousb)
332 if (this%tr_mxll%bc_plane_waves)
then
333 call this%st%rs_stateb%copy_to(this%st%rs_state_plane_wavesb)
339 call this%helmholtz%init(this%namespace, this%gr, this%mc, this%space)
348 real(real64) :: courant
355 select type (algo => this%algo)
364 m_one/this%gr%spacing(3)**2))
367 write(
message(1),
'(a)')
'The timestep is too large compared to the Courant-Friedrichs-Lewy'
368 write(
message(2),
'(a)')
'stability condition. Time propagation might not be stable.'
372 if (
parse_is_defined(this%namespace,
'UserDefinedInitialMaxwellStates'))
then
377 this%st%rs_state(:,:) = this%st%rs_state + this%rs_state_init
378 if (this%tr_mxll%bc_plane_waves)
then
379 this%st%rs_state_plane_waves(:,:) = this%rs_state_init
385 if (this%tr_mxll%bc_constant)
then
387 algo%dt,
m_zero, this%st%rs_state, set_initial_state = .
true.)
392 if (
parse_is_defined(this%namespace,
'UserDefinedInitialMaxwellStates'))
then
393 safe_deallocate_a(this%rs_state_init)
399 call energy_mxll_calc(this%gr, this%st, this%hm, this%hm%energy, this%st%rs_state, &
400 this%st%rs_state_plane_waves)
404 this%st%selected_points_coordinate(:,:), this%st, this%gr)
406 call mxll_set_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
408 if (this%tr_mxll%bc_plane_waves)
then
409 call mxll_set_batch(this%st%rs_state_plane_wavesb, this%st%rs_state_plane_waves, this%gr%np, this%st%dim)
422 character(len=:),
allocatable,
intent(out) :: updated_quantities(:)
424 complex(real64),
allocatable :: charge_density_ext(:)
425 real(real64) :: current_time
428 call profiling_in(trim(this%namespace%get())//
":"//trim(operation%id))
430 current_time = this%iteration%value()
432 select type (algo => this%algo)
436 select case (operation%id)
441 safe_allocate(this%ff_rs_inhom_t1(1:this%gr%np_part, 1:this%hm%dim))
442 safe_allocate(this%ff_rs_inhom_t2(1:this%gr%np_part, 1:this%hm%dim))
445 safe_deallocate_a(this%ff_rs_inhom_t1)
446 safe_deallocate_a(this%ff_rs_inhom_t2)
449 if (this%hm%current_density_ext_flag .or. this%hm%current_density_from_medium)
then
450 call this%get_current(current_time, this%st%rs_current_density_t1)
451 call this%get_current(current_time+algo%dt, this%st%rs_current_density_t2)
458 safe_allocate(charge_density_ext(1:this%gr%np))
461 charge_density_ext =
m_z0
468 safe_deallocate_a(charge_density_ext)
472 this%st%rs_stateb, this%ff_rs_inhom_t1, this%ff_rs_inhom_t2, current_time, algo%dt)
474 updated_quantities = [
character(16) ::
"E field",
"B field",
"vector potential"]
477 if (any(this%hm%bc%bc_ab_type == option__maxwellabsorbingboundaries__cpml))
then
484 if (this%hm%current_density_ext_flag .or. this%hm%current_density_from_medium)
then
485 call this%get_current(current_time, this%st%rs_current_density_t1)
486 call mxll_set_batch(this%st%inhomogeneousb, this%st%rs_current_density_t1, this%gr%np, this%st%dim)
491 current_time, algo%dt, this%iteration%counter())
493 updated_quantities = [
character(16) ::
"E field",
"B field",
"vector potential"]
496 safe_allocate(this%ff_rs_inhom_t1(1:this%gr%np_part, 1:this%hm%dim))
497 if (any(this%hm%bc%bc_ab_type == option__maxwellabsorbingboundaries__cpml))
then
502 safe_deallocate_a(this%ff_rs_inhom_t1)
505 if (this%hm%current_density_ext_flag .or. this%hm%current_density_from_medium)
then
506 call this%get_current(current_time+algo%dt*
m_half, this%st%rs_current_density_t1)
514 current_time, algo%dt)
516 updated_quantities = [
character(16) ::
"E field",
"B field",
"vector potential"]
519 safe_allocate(this%ff_rs_inhom_t1(1:this%gr%np_part, 1:this%hm%dim))
520 safe_allocate(this%ff_rs_inhom_t2(1:this%gr%np_part, 1:this%hm%dim))
521 if (any(this%hm%bc%bc_ab_type == option__maxwellabsorbingboundaries__cpml))
then
526 safe_deallocate_a(this%ff_rs_inhom_t1)
527 safe_deallocate_a(this%ff_rs_inhom_t2)
530 if (this%hm%current_density_ext_flag .or. this%hm%current_density_from_medium)
then
531 call this%get_current(current_time+algo%dt*(
m_half-
sqrt(
m_three)/6.0_real64), this%st%rs_current_density_t1)
532 call this%get_current(current_time+algo%dt*(
m_half+
sqrt(
m_three)/6.0_real64), this%st%rs_current_density_t2)
546 current_time, algo%dt)
548 updated_quantities = [
character(16) ::
"E field",
"B field",
"vector potential"]
560 call profiling_out(trim(this%namespace%get())//
":"//trim(operation%id))
567 real(real64),
intent(in) :: tol
583 select type (interaction)
587 call interaction%init_from_partner(partner%gr, partner%space, partner%namespace)
589 call interaction%init_from_partner(partner%gr, partner%space, partner%namespace)
591 call interaction%init_from_partner(partner%gr, partner%space, partner%namespace)
593 message(1) =
"Unsupported interaction."
602 class(
maxwell_t),
intent(inout) :: partner
606 complex(real64) :: interpolated_value(3)
607 real(real64),
allocatable :: b_field(:,:), vec_pot(:,:)
610 call profiling_in(trim(partner%namespace%get())//
":"//
"COPY_QUANTITY_INTER")
612 select type (interaction)
614 call mxll_get_batch(partner%st%rs_stateb, partner%st%rs_state, partner%gr%np, partner%st%dim)
616 do ip = 1, interaction%system_np
618 interaction%system_pos(:, ip), interpolated_value(1))
620 interaction%system_pos(:, ip), interpolated_value(2))
622 interaction%system_pos(:, ip), interpolated_value(3))
628 call mxll_get_batch(partner%st%rs_stateb, partner%st%rs_state, partner%gr%np, partner%st%dim)
629 select case (interaction%type)
639 call partner%helmholtz%get_long_field(partner%namespace, partner%st%rs_state_long, total_field=partner%st%rs_state)
643 message(1) =
"Unknown type of field requested by interaction."
646 call interaction%do_mapping()
649 call mxll_get_batch(partner%st%rs_stateb, partner%st%rs_state, partner%gr%np, partner%st%dim)
650 safe_allocate(b_field(1:partner%gr%np_part, 1:partner%gr%box%dim))
651 safe_allocate(vec_pot(1:partner%gr%np_part, 1:partner%gr%box%dim))
654 partner%st%mu(1:partner%gr%np), partner%gr%np)
656 call partner%helmholtz%get_vector_potential(partner%namespace, vec_pot, trans_field=b_field)
660 interaction%partner_field(1:partner%gr%np,1:partner%gr%box%dim) = &
661 vec_pot(1:partner%gr%np,1:partner%gr%box%dim)
662 safe_deallocate_a(b_field)
663 safe_deallocate_a(vec_pot)
664 call interaction%do_mapping()
667 call mxll_get_batch(partner%st%rs_stateb, partner%st%rs_state, partner%gr%np, partner%st%dim)
669 interaction%partner_field, partner%st%mu(1:partner%gr%np), partner%gr%np)
670 call interaction%do_mapping()
673 message(1) =
"Unsupported interaction."
677 call profiling_out(trim(partner%namespace%get())//
":"//
"COPY_QUANTITY_INTER")
685 real(real64) :: itr_value
688 call profiling_in(trim(this%namespace%get())//
":"//
"OUTPUT_START")
690 select type (algo => this%algo)
692 call mxll_get_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
694 call td_write_mxll_init(this%write_handler, this%namespace, this%iteration%counter(), algo%dt, &
696 if (this%st%fromScratch)
then
697 call td_write_mxll_iter(this%write_handler, this%space, this%gr, this%st, this%hm, this%helmholtz, algo%dt, &
698 this%iteration%counter(), this%namespace)
699 itr_value = this%iteration%value()
701 this%outp, this%iteration%counter(), itr_value)
706 call profiling_out(trim(this%namespace%get())//
":"//
"OUTPUT_START")
714 logical :: stopping, reached_output_interval
715 real(real64) :: itr_value
719 call profiling_in(trim(this%namespace%get())//
":"//
"OUTPUT_WRITE")
721 select type (algo => this%algo)
725 call td_write_mxll_iter(this%write_handler, this%space, this%gr, this%st, this%hm, this%helmholtz, algo%dt, &
726 this%iteration%counter(), this%namespace)
728 reached_output_interval = .false.
730 if (this%outp%output_interval(iout) > 0)
then
731 if (mod(this%iteration%counter(), this%outp%output_interval(iout)) == 0)
then
732 reached_output_interval = .
true.
738 if (reached_output_interval .or. stopping)
then
739 call mxll_get_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
741 itr_value = this%iteration%value()
743 this%outp, this%iteration%counter(), itr_value)
748 call profiling_out(trim(this%namespace%get())//
":"//
"OUTPUT_WRITE")
761 select type (algo => this%algo)
776 integer :: int_counter
781 call iter%start(this%interactions)
782 do while (iter%has_next())
783 select type (interaction => iter%get_next())
785 int_counter = int_counter + 1
789 if (int_counter /= 0 .and. .not.
allocated(this%hm%medium_boxes))
then
790 safe_allocate(this%hm%medium_boxes(1:int_counter))
791 this%hm%calc_medium_box = .
true.
808 call iter%start(this%interactions)
809 do while (iter%has_next())
810 select type (interaction => iter%get_next())
812 if (
allocated(this%hm%medium_boxes) .and. .not. this%hm%medium_boxes_initialized)
then
814 this%hm%medium_boxes(iint) = interaction%medium_box
819 if (
allocated(this%hm%medium_boxes) .and. .not. this%hm%medium_boxes_initialized)
then
821 this%hm%medium_boxes_initialized = .
true.
824 if (this%hm%medium_boxes_initialized .and. this%hm%operator ==
faraday_ampere)
then
825 message(1) =
"A linear medium has been defined in the input file but the Hamiltonian"
826 message(2) =
"type you specified is not capable of dealing with the medium."
827 message(3) =
"Please use MaxwellHamiltonianOperator = faraday_ampere_medium or simple to enable"
828 message(4) =
"the medium propagation."
832 if (.not. this%hm%medium_boxes_initialized .and. &
835 message(1) =
"The variable MaxwellHamiltonianOperator has been defined as faraday_ampere_medium"
836 message(2) =
"in the input file but neither a medium boundary nor a linear medium system"
837 message(3) =
"has been defined. Please either use a different option for"
838 message(4) =
"MaxwellHamiltonianOperator or define a Maxwell medium."
849 integer :: ierr, err, zff_dim, id, id1, id2, ip_in, offset, iout
850 logical :: pml_check, write_previous_state
851 complex(real64),
allocatable :: zff(:,:)
856 call profiling_in(trim(this%namespace%get())//
":"//
"RESTART_WRITE")
862 if (this%write_handler%out(iout)%write)
then
863 call write_iter_flush(this%write_handler%out(iout)%handle)
868 if (.not. this%restart_dump%skip())
then
869 pml_check = any(this%hm%bc%bc_ab_type(1:3) == option__maxwellabsorbingboundaries__cpml)
871 message(1) =
"Debug: Writing td_maxwell restart."
874 if (this%tr_mxll%bc_plane_waves)
then
875 zff_dim = 2 * this%st%dim
877 zff_dim = 1 * this%st%dim
880 zff_dim = zff_dim + 18
882 select type (prop => this%algo)
884 write_previous_state = .
true.
885 zff_dim = zff_dim + this%st%dim
887 write_previous_state = .false.
891 this%hm%bc%pml%points_number, 3, 3, this%hm%bc%pml%conv_plus)
893 this%hm%bc%pml%points_number, 3, 3, this%hm%bc%pml%conv_minus)
896 call mxll_get_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
897 if (write_previous_state)
then
898 call mxll_get_batch(this%st%rs_state_prevb, this%st%rs_state_prev, this%gr%np, this%st%dim)
901 safe_allocate(zff(1:this%gr%np,1:zff_dim))
904 zff(1:this%gr%np, 1:this%st%dim) = this%st%rs_state(1:this%gr%np, 1:this%st%dim)
905 if (this%tr_mxll%bc_plane_waves)
then
906 call mxll_get_batch(this%st%rs_state_plane_wavesb, this%st%rs_state_plane_waves, &
907 this%gr%np, this%st%dim)
908 zff(1:this%gr%np, this%st%dim+1:this%st%dim+this%st%dim) = &
909 this%st%rs_state_plane_waves(1:this%gr%np, 1:this%st%dim)
910 offset = 2*this%st%dim
919 do ip_in = 1, this%hm%bc%pml%points_number
920 zff(ip_in, offset+id) = this%hm%bc%pml%conv_plus(ip_in, id1, id2)
921 zff(ip_in, offset+9+id) = this%hm%bc%pml%conv_minus(ip_in, id1, id2)
927 if (write_previous_state)
then
928 zff(1:this%gr%np, offset+1:offset+this%st%dim) = &
929 this%st%rs_state_prev(1:this%gr%np, 1:this%st%dim)
932 call states_mxll_dump(this%restart_dump, this%st, this%space, this%gr, zff, zff_dim, err, this%iteration%counter())
933 if (err /= 0) ierr = ierr + 1
935 if (this%hm%current_density_from_medium)
then
937 call iter%start(this%interactions)
938 do while (iter%has_next())
939 interaction => iter%get_next()
940 select type (interaction)
942 call interaction%write_restart(this%gr, this%space, this%restart_dump, err)
945 if (err /= 0) ierr = ierr + 1
948 message(1) =
"Debug: Writing td_maxwell restart done."
951 safe_deallocate_a(zff)
954 message(1) =
"Unable to write time-dependent Maxwell restart information."
959 call profiling_out(trim(this%namespace%get())//
":"//
"RESTART_WRITE")
968 integer :: ierr, err, zff_dim, id, id1, id2, ip_in, offset
969 logical :: pml_check, read_previous_state
970 complex(real64),
allocatable :: zff(:,:)
975 call profiling_in(trim(this%namespace%get())//
":"//
"RESTART_READ")
977 if (.not. this%restart%skip())
then
979 pml_check = any(this%hm%bc%bc_ab_type(1:3) == option__maxwellabsorbingboundaries__cpml)
981 if (this%restart%skip())
then
983 call profiling_out(trim(this%namespace%get())//
":"//
"RESTART_READ")
988 message(1) =
"Debug: Reading td_maxwell restart."
991 if (this%tr_mxll%bc_plane_waves)
then
992 zff_dim = 2 * this%st%dim
994 zff_dim = 1 * this%st%dim
997 zff_dim = zff_dim + 18
999 select type (prop => this%algo)
1001 read_previous_state = .
true.
1002 zff_dim = zff_dim + this%st%dim
1004 read_previous_state = .false.
1007 safe_allocate(zff(1:this%gr%np,1:zff_dim))
1009 call states_mxll_load(this%restart, this%st, this%gr, this%namespace, this%space, zff, &
1010 zff_dim, err, label =
": td_maxwell")
1011 this%st%rs_current_density_restart = .
true.
1013 this%st%rs_state(1:this%gr%np,1:this%st%dim) = zff(1:this%gr%np, 1:this%st%dim)
1014 if (this%tr_mxll%bc_plane_waves)
then
1015 this%st%rs_state_plane_waves(1:this%gr%np,1:this%st%dim) = &
1016 zff(1:this%gr%np,this%st%dim+1:this%st%dim+3)
1017 offset = 2*this%st%dim
1019 offset = this%st%dim
1026 do ip_in = 1, this%hm%bc%pml%points_number
1027 this%hm%bc%pml%conv_plus(ip_in,id1,id2) = zff(ip_in, offset+ id)
1028 this%hm%bc%pml%conv_minus(ip_in,id1,id2) = zff(ip_in, offset+9+id)
1032 this%hm%bc%pml%conv_plus_old = this%hm%bc%pml%conv_plus
1033 this%hm%bc%pml%conv_minus_old = this%hm%bc%pml%conv_minus
1034 offset = offset + 18
1036 if (read_previous_state)
then
1037 this%st%rs_state_prev(1:this%gr%np, 1:this%st%dim) = &
1038 zff(1:this%gr%np, offset+1:offset+this%st%dim)
1045 message(1) =
"Debug: Reading td restart done."
1048 safe_deallocate_a(zff)
1051 call accel_write_buffer(this%hm%bc%pml%buff_conv_plus, this%hm%bc%pml%points_number, 3, 3, &
1052 this%hm%bc%pml%conv_plus)
1053 call accel_write_buffer(this%hm%bc%pml%buff_conv_minus, this%hm%bc%pml%points_number, 3, 3, &
1054 this%hm%bc%pml%conv_minus)
1055 call accel_write_buffer(this%hm%bc%pml%buff_conv_plus_old, this%hm%bc%pml%points_number, 3, 3, &
1056 this%hm%bc%pml%conv_plus_old)
1059 if (this%hm%current_density_from_medium)
then
1061 call iter%start(this%interactions)
1062 do while (iter%has_next())
1063 interaction => iter%get_next()
1064 select type (interaction)
1066 call interaction%read_restart(this%gr, this%space, this%restart, err)
1075 call mxll_set_batch(this%st%rs_stateb, this%st%rs_state, this%gr%np, this%st%dim)
1076 if (read_previous_state)
then
1077 call mxll_set_batch(this%st%rs_state_prevb, this%st%rs_state_prev, this%gr%np, this%st%dim)
1080 if (this%tr_mxll%bc_plane_waves)
then
1081 call mxll_set_batch(this%st%rs_state_plane_wavesb, this%st%rs_state_plane_waves, this%gr%np, this%st%dim)
1084 this%st%fromScratch = .false.
1087 message(1) =
"Unable to read time-dependent Maxwell restart information: Starting from scratch"
1092 call profiling_out(trim(this%namespace%get())//
":"//
"RESTART_READ")
1106 this%kinetic_energy = this%hm%energy%energy
1116 call profiling_in(trim(this%namespace%get())//
":"//
"END_TIMESTEP")
1119 call energy_mxll_calc_batch(this%gr, this%st, this%hm, this%hm%energy, this%st%rs_stateb, this%st%rs_state_plane_wavesb)
1125 call profiling_out(trim(this%namespace%get())//
":"//
"END_TIMESTEP")
1132 real(real64),
intent(in) :: time
1133 complex(real64),
contiguous,
intent(inout) :: current(:, :)
1136 complex(real64),
allocatable :: current_density_ext(:, :)
1140 safe_allocate(current_density_ext(1:this%gr%np, 1:this%st%dim))
1142 if (this%hm%current_density_from_medium)
then
1144 call iter%start(this%interactions)
1145 do while (iter%has_next())
1146 select type (interaction => iter%get_next())
1148 call interaction%interpolate(time, current_density_ext)
1149 call lalg_axpy(this%gr%np, 3,
m_one, current_density_ext * this%hm%current_factor, current)
1154 if (this%hm%current_density_ext_flag)
then
1156 call lalg_axpy(this%gr%np, 3,
m_one, current_density_ext, current)
1158 safe_deallocate_a(current_density_ext)
1175 safe_deallocate_a(this%rs_state_init)
1180 call this%st%rs_stateb%end()
1181 call this%st%rs_state_prevb%end()
1182 call this%st%inhomogeneousb%end()
1183 if (this%tr_mxll%bc_plane_waves)
then
1184 call this%st%rs_state_plane_wavesb%end()
1191 call this%restart%end()
1192 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, grp, 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)
integer, parameter, public mxll_bc_medium
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)
class(maxwell_t) function, pointer maxwell_constructor(namespace, grp)
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_get_current(this, time, current)
subroutine, public maxwell_init(this, namespace, grp)
subroutine maxwell_initialize(this)
subroutine maxwell_output_write(this)
logical function maxwell_is_tolerance_reached(this, tol)
subroutine maxwell_init_parallelization(this)
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
Maxwell-field-to-matter interactions.
integer, parameter, public mxll_field_trans
integer, parameter, public mxll_field_long
integer, parameter, public mxll_field_total
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_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), parameter, 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.
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
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.