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