Octopus
gauge_field.F90
Go to the documentation of this file.
1!! Copyright (C) 2008 X. Andrade
2!! Copyright (C) 2020 N. Tancogne-Dejean
3!!
4!! This program is free software; you can redistribute it and/or modify
5!! it under the terms of the GNU General Public License as published by
6!! the Free Software Foundation; either version 2, or (at your option)
7!! any later version.
8!!
9!! This program is distributed in the hope that it will be useful,
10!! but WITHOUT ANY WARRANTY; without even the implied warranty of
11!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12!! GNU General Public License for more details.
13!!
14!! You should have received a copy of the GNU General Public License
15!! along with this program; if not, write to the Free Software
16!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17!! 02110-1301, USA.
18!!
19
20#include "global.h"
21
24 use debug_oct_m
25 use global_oct_m
26 use grid_oct_m
29 use, intrinsic :: iso_fortran_env
31 use mesh_oct_m
34 use mpi_oct_m
36 use parser_oct_m
40 use space_oct_m
43 use unit_oct_m
46
47 implicit none
48
49 private
50
51 public :: &
70
71 type, extends(interaction_partner_t) :: gauge_field_t
72 private
73 type(space_t), public :: space
74 real(real64), allocatable :: vecpot(:)
75 real(real64), allocatable :: vecpot_vel(:)
76 real(real64), allocatable :: vecpot_acc(:)
77 real(real64), allocatable :: vecpot_kick(:)
78 real(real64), allocatable :: force(:)
79 real(real64) :: wp2
80 logical :: with_gauge_field = .false.
81 integer :: dynamics
82 real(real64) :: kicktime
83
84 real(real64) :: volume
85
86 contains
87 procedure :: init_interaction_as_partner => gauge_field_init_interaction_as_partner
88 procedure :: copy_quantities_to_interaction => gauge_field_copy_quantities_to_interaction
90 end type gauge_field_t
91
92 interface gauge_field_t
93 module procedure gauge_field_init
94 end interface gauge_field_t
95
96
97contains
98
99 ! ---------------------------------------------------------
100 function gauge_field_init(namespace, volume) result(this)
101 class(gauge_field_t), pointer :: this
102 type(namespace_t), intent(in) :: namespace
103 real(real64), intent(in) :: volume
104
105 integer :: ii
106 type(block_t) :: blk
107 logical :: default_gauge_field_propagate
108
109 push_sub(gauge_field_init)
110
111 safe_allocate(this)
112
113 this%namespace = namespace_t("GaugeField", parent=namespace)
114
115 ! Temporary initialization of the space.
116 ! This will be inherited from system_t once this is turned into a system
117 this%space = space_t(namespace)
118
119 this%with_gauge_field = .false.
120
121 this%volume = volume
122
123 safe_allocate(this%vecpot(1:this%space%dim))
124 safe_allocate(this%vecpot_vel(1:this%space%dim))
125 safe_allocate(this%vecpot_acc(1:this%space%dim))
126 safe_allocate(this%vecpot_kick(1:this%space%dim))
127 safe_allocate(this%force(1:this%space%dim))
128 this%vecpot = m_zero
129 this%vecpot_vel = m_zero
130 this%vecpot_acc = m_zero
131 this%vecpot_kick = m_zero
132 this%force = m_zero
133
134 !%Variable GaugeFieldDynamics
135 !%Type integer
136 !%Default polarization
137 !%Section Hamiltonian
138 !%Description
139 !% This variable select the dynamics of the gauge field used to
140 !% apply a finite electric field to periodic systems in
141 !% time-dependent runs.
142 !%Option none 0
143 !% The gauge field does not have dynamics. The induced polarization field is zero.
144 !%Option polarization 1
145 !% The gauge field follows the dynamic described in
146 !% Bertsch et al, Phys. Rev. B 62 7998 (2000).
147 !%End
148 call parse_variable(namespace, 'GaugeFieldDynamics', option__gaugefielddynamics__polarization, this%dynamics)
149
150 !%Variable GaugeVectorField
151 !%Type block
152 !%Section Hamiltonian
153 !%Description
154 !% The gauge vector field is used to include a uniform (but time-dependent)
155 !% external electric field in a time-dependent run for
156 !% a periodic system. An optional second row specifies the initial
157 !% value for the time derivative of the gauge field (which is set
158 !% to zero by default). By default this field is not included.
159 !% If <tt>KPointsUseSymmetries = yes</tt>, then <tt>SymmetryBreakDir</tt>
160 !% must be set in the same direction.
161 !% This is used with utility <tt>oct-dielectric_function</tt>
162 !% according to GF Bertsch, J-I Iwata, A Rubio, and K Yabana,
163 !% <i>Phys. Rev. B</i> <b>62</b>, 7998-8002 (2000).
164 !%
165 !% Note that if present and non-zero, this automatically implies
166 !% <tt>GaugeFieldPropagate = yes</tt>.
167 !% However, this could be turned off by <tt>GaugeFieldPropagate</tt>.
168 !%End
170 ! Read the initial gauge vector field
171 default_gauge_field_propagate = .false.
172 if (parse_block(namespace, 'GaugeVectorField', blk) == 0) then
174 do ii = 1, this%space%dim
175 call parse_block_float(blk, 0, ii - 1, this%vecpot_kick(ii))
176 end do
178 ! By default, we activate GaugeFieldPropagate
179 if (norm2(this%vecpot_kick(1:this%space%dim)) > m_epsilon) then
180 default_gauge_field_propagate = .true.
181 end if
184 if (.not. this%space%is_periodic()) then
185 message(1) = "GaugeVectorField is intended for periodic systems."
186 call messages_warning(1, namespace=namespace)
187 end if
188
189 end if
190
191 !%Variable GaugeFieldPropagate
192 !%Type logical
193 !%Default no
194 !%Section Hamiltonian
195 !%Description
196 !% Propagate the gauge field with initial condition set by GaugeVectorField or zero if not specified
197 !%End
198 call parse_variable(namespace, 'GaugeFieldPropagate', default_gauge_field_propagate, this%with_gauge_field)
199
200
201 !%Variable GaugeFieldDelay
202 !%Type float
203 !%Default 0.
204 !%Section Hamiltonian
205 !%Description
206 !% The application of the gauge field acts as a probe of the system. For dynamical
207 !% systems one can apply this probe with a delay relative to the start of the simulation.
208 !%End
209 call parse_variable(namespace, 'GaugeFieldDelay', m_zero, this%kicktime)
210
211 if (abs(this%kicktime) <= m_epsilon) then
212 this%vecpot(1:this%space%dim) = this%vecpot_kick(1:this%space%dim)
213 end if
214
215 pop_sub(gauge_field_init)
216 end function gauge_field_init
217
218 ! ---------------------------------------------------------
219 subroutine gauge_field_check_symmetries(this, kpoints)
220 type(gauge_field_t), intent(in) :: this
221 type(kpoints_t), intent(in) :: kpoints
222
223 integer :: iop
224
226
227 if (kpoints%use_symmetries) then
228 do iop = 1, symmetries_number(kpoints%symm)
229 if (iop == symmetries_identity_index(kpoints%symm)) cycle
230 if (.not. symm_op_invariant_cart(kpoints%symm%ops(iop), this%vecpot_kick, 1e-5_real64)) then
231 message(1) = "The GaugeVectorField breaks (at least) one of the symmetries used to reduce the k-points."
232 message(2) = "Set SymmetryBreakDir equal to GaugeVectorField."
233 call messages_fatal(2, namespace=this%namespace)
234 end if
235 end do
236 end if
237
239 end subroutine gauge_field_check_symmetries
240
241
242 ! ---------------------------------------------------------
243 subroutine gauge_field_end(this)
244 type(gauge_field_t), intent(inout) :: this
245
246 push_sub(gauge_field_end)
247
248 this%with_gauge_field = .false.
249 safe_deallocate_a(this%vecpot)
250 safe_deallocate_a(this%vecpot_vel)
251 safe_deallocate_a(this%vecpot_acc)
252 safe_deallocate_a(this%vecpot_kick)
253 safe_deallocate_a(this%force)
254
255 pop_sub(gauge_field_end)
256 end subroutine gauge_field_end
257
258
259 ! ---------------------------------------------------------
260 logical pure function gauge_field_is_propagated(this) result(is_propagated)
261 type(gauge_field_t), intent(in) :: this
262
263 is_propagated = this%with_gauge_field
264 end function gauge_field_is_propagated
265
266 ! ---------------------------------------------------------
267 logical pure function gauge_field_is_used(this) result(is_used)
268 type(gauge_field_t), intent(in) :: this
269
270 is_used = this%with_gauge_field .or. (norm2(this%vecpot_kick(1:this%space%dim)) > m_epsilon)
271 end function gauge_field_is_used
272
273
274
275 ! ---------------------------------------------------------
276 subroutine gauge_field_set_vec_pot(this, vec_pot)
277 type(gauge_field_t), intent(inout) :: this
278 real(real64), intent(in) :: vec_pot(:)
279
281 this%vecpot(1:this%space%dim) = vec_pot(1:this%space%dim)
282
284 end subroutine gauge_field_set_vec_pot
285
286
287 ! ---------------------------------------------------------
288 subroutine gauge_field_set_vec_pot_vel(this, vec_pot_vel)
289 type(gauge_field_t), intent(inout) :: this
290 real(real64), intent(in) :: vec_pot_vel(:)
291
293 this%vecpot_vel(1:this%space%dim) = vec_pot_vel(1:this%space%dim)
294
296 end subroutine gauge_field_set_vec_pot_vel
297
298
299 ! ---------------------------------------------------------
300 subroutine gauge_field_get_vec_pot(this, vec_pot)
301 type(gauge_field_t), intent(in) :: this
302 real(real64), intent(out) :: vec_pot(:)
303
305 vec_pot(1:this%space%dim) = this%vecpot(1:this%space%dim)
306
308 end subroutine gauge_field_get_vec_pot
309
310
311 ! ---------------------------------------------------------
312 subroutine gauge_field_get_vec_pot_vel(this, vec_pot_vel)
313 type(gauge_field_t), intent(in) :: this
314 real(real64), intent(out) :: vec_pot_vel(:)
315
317 vec_pot_vel(1:this%space%dim) = this%vecpot_vel(1:this%space%dim)
318
320 end subroutine gauge_field_get_vec_pot_vel
321
322
323 ! ---------------------------------------------------------
324 subroutine gauge_field_get_vec_pot_acc(this, vec_pot_acc)
325 type(gauge_field_t), intent(in) :: this
326 real(real64), intent(out) :: vec_pot_acc(:)
327
329 vec_pot_acc(1:this%space%dim) = this%vecpot_acc(1:this%space%dim)
330
332 end subroutine gauge_field_get_vec_pot_acc
333
334 ! ---------------------------------------------------------
335 subroutine gauge_field_propagate(this, dt, time)
336 type(gauge_field_t), intent(inout) :: this
337 real(real64), intent(in) :: dt
338 real(real64), intent(in) :: time
339
340 logical, save :: warning_shown = .false.
341 integer :: idim
342
343 push_sub(gauge_field_propagate)
344
345 this%vecpot_acc(1:this%space%dim) = this%force(1:this%space%dim)
346
347 ! apply kick, in case kicktime=0 the kick has already been applied
348 if (this%kicktime > m_zero .and. time-dt <= this%kicktime .and. time > this%kicktime) then
349 this%vecpot(1:this%space%dim) = this%vecpot(1:this%space%dim) + this%vecpot_kick(1:this%space%dim)
350 call messages_write(' ---------------- Applying gauge kick ----------------')
351 call messages_info(namespace=this%namespace)
352 end if
353
354 this%vecpot(1:this%space%dim) = this%vecpot(1:this%space%dim) + dt * this%vecpot_vel(1:this%space%dim) + &
355 m_half * dt**2 * this%force(1:this%space%dim)
356
357 !In the case of a kick, the induced field could not be higher than the initial kick
358 do idim = 1, this%space%dim
359 if (.not. warning_shown .and. abs(this%vecpot_kick(idim)) > m_epsilon .and. &
360 abs(this%vecpot(idim))> abs(this%vecpot_kick(idim))*1.01 .and. .not. this%kicktime > m_zero) then
361
362 warning_shown = .true.
363
364 write(message(1),'(a)') 'It seems that the gauge-field might be diverging. You should probably check'
365 write(message(2),'(a)') 'the simulation parameters, in particular the number of k-points.'
366 call messages_warning(2, namespace=this%namespace)
367 end if
368 end do
369 pop_sub(gauge_field_propagate)
370 end subroutine gauge_field_propagate
372 ! ---------------------------------------------------------
373 subroutine gauge_field_init_vec_pot(this, qtot)
374 type(gauge_field_t), intent(inout) :: this
375 real(real64), intent(in) :: qtot
376
378
379 this%wp2 = m_four*m_pi*qtot/this%volume
380
381 write (message(1), '(a,f12.6,a)') "Info: Electron-gas plasmon frequency", &
382 units_from_atomic(units_out%energy, sqrt(this%wp2)), " ["//trim(units_abbrev(units_out%energy))//"]"
383 call messages_info(1, namespace=this%namespace)
384
386 end subroutine gauge_field_init_vec_pot
387
388 ! ---------------------------------------------------------
389 real(real64) function gauge_field_get_energy(this) result(energy)
390 type(gauge_field_t), intent(in) :: this
391
392 push_sub(gauge_field_get_energy)
393
394 if(allocated(this%vecpot_vel)) then
395 energy = this%volume / (8.0_real64 * m_pi * p_c**2) * sum(this%vecpot_vel(1:this%space%dim)**2)
396 else
397 energy = m_zero
398 end if
399
401 end function gauge_field_get_energy
402
403
404 ! ---------------------------------------------------------
405 subroutine gauge_field_dump(restart, gfield, ierr)
406 type(restart_t), intent(in) :: restart
407 type(gauge_field_t), intent(in) :: gfield
408 integer, intent(out) :: ierr
409
410 integer :: err
411 real(real64), allocatable :: vecpot(:,:)
412
413 push_sub(gauge_field_dump)
414
415 ierr = 0
416
417 if (restart%skip()) then
418 pop_sub(gauge_field_dump)
419 return
420 end if
421
422 message(1) = "Debug: Writing gauge field restart."
423 call messages_info(1, namespace=gfield%namespace, debug_only=.true.)
424
425 safe_allocate(vecpot(1:gfield%space%dim, 1:2))
426 vecpot = m_zero
427 call gauge_field_get_vec_pot(gfield, vecpot(:, 1))
428 call gauge_field_get_vec_pot_vel(gfield, vecpot(:, 2))
429
430 call restart%write_binary("gauge_field", 2*gfield%space%dim, vecpot, err)
431 safe_deallocate_a(vecpot)
432 if (err /= 0) ierr = ierr + 1
433
434 message(1) = "Debug: Writing gauge field restart done."
435 call messages_info(1, namespace=gfield%namespace, debug_only=.true.)
436
437 pop_sub(gauge_field_dump)
438 end subroutine gauge_field_dump
439
440
441 ! ---------------------------------------------------------
442 subroutine gauge_field_load(restart, gfield, ierr)
443 type(restart_t), intent(in) :: restart
444 type(gauge_field_t), intent(inout) :: gfield
445 integer, intent(out) :: ierr
446
447 integer :: err
448 real(real64), allocatable :: vecpot(:,:)
449
450 push_sub(gauge_field_load)
451
452 ierr = 0
453
454 if (restart%skip()) then
455 ierr = -1
456 pop_sub(gauge_field_load)
457 return
458 end if
459
460 message(1) = "Debug: Reading gauge field restart."
461 call messages_info(1, namespace=gfield%namespace, debug_only=.true.)
462
463 safe_allocate(vecpot(1:gfield%space%dim, 1:2))
464 call restart%read_binary("gauge_field", 2*gfield%space%dim, vecpot, err)
465 if (err /= 0) ierr = ierr + 1
466
467 call gauge_field_set_vec_pot(gfield, vecpot(:,1))
468 call gauge_field_set_vec_pot_vel(gfield, vecpot(:,2))
469 safe_deallocate_a(vecpot)
470
471 message(1) = "Debug: Reading gauge field restart done."
472 call messages_info(1, namespace=gfield%namespace, debug_only=.true.)
473
474 pop_sub(gauge_field_load)
475 end subroutine gauge_field_load
476
477 ! ---------------------------------------------------------
478
479 subroutine gauge_field_get_force(this, gr, spin_channels, current, lrc_alpha, proca_a_zero, proca_a_one)
480 type(gauge_field_t), intent(inout) :: this
481 type(grid_t), intent(in) :: gr
482 integer, intent(in) :: spin_channels
483 real(real64), intent(in) :: current(:,:,:)
484 real(real64), optional, intent(in) :: lrc_alpha
485 real(real64), optional, intent(in) :: proca_a_zero
486 real(real64), optional, intent(in) :: proca_a_one
487
488 integer :: idir, ispin
489 real(real64) :: lrc_alpha_
490 real(real64) :: proca_a_zero_
491 real(real64) :: proca_a_one_
492
493 push_sub(gauge_field_get_force)
494
495 lrc_alpha_ = optional_default(lrc_alpha, m_zero)
496 proca_a_zero_ = optional_default(proca_a_zero, m_zero)
497 proca_a_one_ = optional_default(proca_a_one, m_zero)
498 select case (this%dynamics)
499 case (option__gaugefielddynamics__none)
500 this%force(1:this%space%dim) = m_zero
501
502 case (option__gaugefielddynamics__polarization)
503 do idir = 1, this%space%periodic_dim
504 this%force(idir) = m_zero
505 do ispin = 1, spin_channels
506 ! If the absolute value of lrc_alpha_ is finite (lrc_alpha can be negative), we apply
507 ! the Proca equation a_2*d^2A/dt^2+a_1*dA/dt+a_0*A=4*Pi*c*J(t)/V.
508 ! Here, lrc_alpha=4*Pi/a_2, proca_a_zero=a_0/(4*Pi), and a_1 can be always set to 0.
509 ! For more details, see reference J. K. Dewhurst <i>et al.</i>, <i>Phys. Rev. B</i> 111, L060302 (2025).
510 if(abs(lrc_alpha_) > m_epsilon) then
511 this%force(idir) = this%force(idir) + &
512 lrc_alpha*p_c/this%volume*dmf_integrate(gr, current(:, idir, ispin)) + &
513 lrc_alpha*proca_a_zero_*this%vecpot_kick(idir) - &
514 lrc_alpha*proca_a_zero_*this%vecpot(idir) - lrc_alpha*proca_a_one_*this%vecpot_vel(idir)
515 else
516 this%force(idir) = this%force(idir) - &
517 m_four*m_pi*p_c/this%volume*dmf_integrate(gr, current(:, idir, ispin))
518 endif
519 end do
520 end do
521
522 case default
523 assert(.false.)
524 end select
525
526 pop_sub(gauge_field_get_force)
527 end subroutine gauge_field_get_force
528
529 ! ---------------------------------------------------------
530
531 subroutine gauge_field_do_algorithmic_operation(this, operation, dt, time)
532 class(gauge_field_t), intent(inout) :: this
533 type(algorithmic_operation_t), intent(in) :: operation
534 real(real64), intent(in) :: dt
535 real(real64), intent(in) :: time
536
538
539 select case (operation%id)
540 case (verlet_start)
541 !Does nothing at the moment
542 case (verlet_finish)
543 !Does nothing at the moment
544 case (verlet_update_pos)
545 !This is inside the gauge_field_propagate routine at the moment
546 case (verlet_compute_acc)
547 call gauge_field_propagate(this, dt, time)
548
549 case (verlet_compute_vel)
550 this%vecpot_vel(1:this%space%dim) = this%vecpot_vel(1:this%space%dim) + &
551 m_half * dt * (this%vecpot_acc(1:this%space%dim) + this%force(1:this%space%dim))
552 case default
553 message(1) = "Unsupported TD operation."
554 call messages_fatal(1, namespace=this%namespace)
555 end select
556
559
560
561 ! ---------------------------------------------------------
562 subroutine gauge_field_output_write(this, out_gauge, iter)
563 type(gauge_field_t), intent(in) :: this
564 type(c_ptr), intent(inout) :: out_gauge
565 integer, intent(in) :: iter
566
567 integer :: idir
568 character(len=50) :: aux
569 real(real64) :: temp(this%space%dim)
570
571 if (.not. mpi_world%is_root()) return ! only first node outputs
572
575 if (iter == 0) then
576 call write_iter_clear(out_gauge)
577 call write_iter_string(out_gauge,'################################################################################')
578 call write_iter_nl(out_gauge)
579 call write_iter_string(out_gauge,'# HEADER')
580 call write_iter_nl(out_gauge)
581
582 ! first line: column names
583 call write_iter_header_start(out_gauge)
584
585 do idir = 1, this%space%dim
586 write(aux, '(a2,i1,a1)') 'A(', idir, ')'
587 call write_iter_header(out_gauge, aux)
588 end do
589 do idir = 1, this%space%dim
590 write(aux, '(a6,i1,a1)') 'dA/dt(', idir, ')'
591 call write_iter_header(out_gauge, aux)
592 end do
593 do idir = 1, this%space%dim
594 write(aux, '(a10,i1,a1)') 'd^2A/dt^2(', idir, ')'
595 call write_iter_header(out_gauge, aux)
596 end do
597 call write_iter_nl(out_gauge)
598
599 ! second line: units
600 !call write_iter_string(out_gauge, '#[Iter n.]')
601 !call write_iter_header(out_gauge, '[' // trim(units_abbrev(units_out%time)) // ']')
602 !call write_iter_string(out_gauge, &
603 ! 'A Vector potential in ' // trim(units_abbrev(units_out%length)) &
604 ! 'A dot in ' // trim(units_abbrev(units_out%length)) &
605 ! 'A dot dot in ' // trim(units_abbrev(units_out%length))
606 !call write_iter_nl(out_gauge)
607
608 call write_iter_string(out_gauge,'################################################################################')
609 call write_iter_nl(out_gauge)
610
611 end if
612
613 call write_iter_start(out_gauge)
614
615 do idir = 1, this%space%dim
616 temp(idir) = units_from_atomic(units_out%energy, this%vecpot(idir))
617 end do
618 call write_iter_double(out_gauge, temp, this%space%dim)
619
620 do idir = 1, this%space%dim
621 temp(idir) = units_from_atomic(units_out%energy / units_out%time, this%vecpot_vel(idir))
622 end do
623 call write_iter_double(out_gauge, temp, this%space%dim)
624
625 do idir = 1, this%space%dim
626 temp(idir) = units_from_atomic(units_out%energy / units_out%time**2, this%vecpot_acc(idir))
627 end do
628 call write_iter_double(out_gauge, temp, this%space%dim)
629
630 call write_iter_nl(out_gauge)
631
633 end subroutine gauge_field_output_write
634
635 ! ---------------------------------------------------------
636 subroutine gauge_field_finalize(this)
637 type(gauge_field_t), intent(inout) :: this
638
639 push_sub(gauge_field_finalize)
640
641 call gauge_field_end(this)
642
643 pop_sub(gauge_field_finalize)
644 end subroutine gauge_field_finalize
645
646 ! ---------------------------------------------------------
647 subroutine gauge_field_init_interaction_as_partner(partner, interaction)
648 class(gauge_field_t), intent(in) :: partner
649 class(interaction_surrogate_t), intent(inout) :: interaction
650
652
653 select type (interaction)
654 class default
655 message(1) = "Unsupported interaction."
656 call messages_fatal(1)
657 end select
658
661
662 ! ---------------------------------------------------------
663 subroutine gauge_field_copy_quantities_to_interaction(partner, interaction)
664 class(gauge_field_t), intent(inout) :: partner
665 class(interaction_surrogate_t), intent(inout) :: interaction
666
668
669 select type (interaction)
670 class default
671 message(1) = "Unsupported interaction."
672 call messages_fatal(1)
673 end select
674
677
678end module gauge_field_oct_m
679
680!! Local Variables:
681!! mode: f90
682!! coding: utf-8
683!! End:
double sqrt(double __x) __attribute__((__nothrow__
This module implements the basic elements defining algorithms.
Definition: algorithm.F90:143
subroutine, public gauge_field_set_vec_pot_vel(this, vec_pot_vel)
subroutine, public gauge_field_output_write(this, out_gauge, iter)
subroutine, public gauge_field_set_vec_pot(this, vec_pot)
subroutine gauge_field_finalize(this)
subroutine, public gauge_field_get_vec_pot_acc(this, vec_pot_acc)
subroutine, public gauge_field_load(restart, gfield, ierr)
subroutine gauge_field_copy_quantities_to_interaction(partner, interaction)
subroutine, public gauge_field_end(this)
subroutine, public gauge_field_get_vec_pot(this, vec_pot)
subroutine, public gauge_field_do_algorithmic_operation(this, operation, dt, time)
subroutine, public gauge_field_check_symmetries(this, kpoints)
subroutine, public gauge_field_get_vec_pot_vel(this, vec_pot_vel)
subroutine, public gauge_field_get_force(this, gr, spin_channels, current, lrc_alpha, proca_a_zero, proca_a_one)
class(gauge_field_t) function, pointer, public gauge_field_init(namespace, volume)
subroutine, public gauge_field_dump(restart, gfield, ierr)
subroutine gauge_field_init_interaction_as_partner(partner, interaction)
logical pure function, public gauge_field_is_propagated(this)
logical pure function, public gauge_field_is_used(this)
subroutine, public gauge_field_init_vec_pot(this, qtot)
real(real64) function, public gauge_field_get_energy(this)
subroutine gauge_field_propagate(this, dt, time)
real(real64), parameter, public m_zero
Definition: global.F90:190
real(real64), parameter, public m_epsilon
Definition: global.F90:206
This module implements the underlying real-space grid.
Definition: grid.F90:119
This module defines classes and functions for interaction partners.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
Definition: mesh.F90:120
subroutine, public messages_warning(no_lines, all_nodes, namespace)
Definition: messages.F90:531
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
Definition: messages.F90:162
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
Definition: messages.F90:416
integer function, public parse_block(namespace, name, blk, check_varinfo_)
Definition: parser.F90:621
integer pure function, public symmetries_identity_index(this)
Definition: symmetries.F90:591
integer pure function, public symmetries_number(this)
Definition: symmetries.F90:545
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
Definition: unit.F90:134
This module defines the unit system, used for input and output.
Explicit interfaces to C functions, defined in write_iter_low.cc.
Definition: write_iter.F90:116
abstract class for general interaction partners
int true(void)