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
183 call parse_block_end(blk)
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
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
370 end subroutine gauge_field_propagate
371
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)
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(restart)) 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 drestart_write_binary(restart, "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(restart)) 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 drestart_read_binary(restart, "gauge_field", 2*gfield%space%dim, vecpot, err)
465 if (err /= 0) ierr = ierr + 1
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)
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
486 integer :: idir, ispin
487 real(real64) :: lrc_alpha_
488
489 push_sub(gauge_field_get_force)
490
491 lrc_alpha_ = optional_default(lrc_alpha, m_zero)
492
493 select case (this%dynamics)
494 case (option__gaugefielddynamics__none)
495 this%force(1:this%space%dim) = m_zero
496
497 case (option__gaugefielddynamics__polarization)
498 do idir = 1, this%space%periodic_dim
499 this%force(idir) = m_zero
500 do ispin = 1, spin_channels
501 if(lrc_alpha_ > m_epsilon) then
502 this%force(idir) = this%force(idir) + &
503 lrc_alpha*p_c/this%volume*dmf_integrate(gr, current(:, idir, ispin))
504 else
505 this%force(idir) = this%force(idir) - &
506 m_four*m_pi*p_c/this%volume*dmf_integrate(gr, current(:, idir, ispin))
507 endif
508 end do
509 end do
510
511 case default
512 assert(.false.)
513 end select
514
515 pop_sub(gauge_field_get_force)
516 end subroutine gauge_field_get_force
517
518 ! ---------------------------------------------------------
519
520 subroutine gauge_field_do_algorithmic_operation(this, operation, dt, time)
521 class(gauge_field_t), intent(inout) :: this
522 type(algorithmic_operation_t), intent(in) :: operation
523 real(real64), intent(in) :: dt
524 real(real64), intent(in) :: time
525
527
528 select case (operation%id)
529 case (verlet_start)
530 !Does nothing at the moment
531 case (verlet_finish)
532 !Does nothing at the moment
533 case (verlet_update_pos)
534 !This is inside the gauge_field_propagate routine at the moment
535 case (verlet_compute_acc)
536 call gauge_field_propagate(this, dt, time)
537
538 case (verlet_compute_vel)
539 this%vecpot_vel(1:this%space%dim) = this%vecpot_vel(1:this%space%dim) + &
540 m_half * dt * (this%vecpot_acc(1:this%space%dim) + this%force(1:this%space%dim))
541 case default
542 message(1) = "Unsupported TD operation."
543 call messages_fatal(1, namespace=this%namespace)
544 end select
545
548
549
550 ! ---------------------------------------------------------
551 subroutine gauge_field_output_write(this, out_gauge, iter)
552 type(gauge_field_t), intent(in) :: this
553 type(c_ptr), intent(inout) :: out_gauge
554 integer, intent(in) :: iter
555
556 integer :: idir
557 character(len=50) :: aux
558 real(real64) :: temp(this%space%dim)
559
560 if (.not. mpi_grp_is_root(mpi_world)) return ! only first node outputs
561
563
564 if (iter == 0) then
565 call write_iter_clear(out_gauge)
566 call write_iter_string(out_gauge,'################################################################################')
567 call write_iter_nl(out_gauge)
568 call write_iter_string(out_gauge,'# HEADER')
569 call write_iter_nl(out_gauge)
570
571 ! first line: column names
572 call write_iter_header_start(out_gauge)
573
574 do idir = 1, this%space%dim
575 write(aux, '(a2,i1,a1)') 'A(', idir, ')'
576 call write_iter_header(out_gauge, aux)
577 end do
578 do idir = 1, this%space%dim
579 write(aux, '(a6,i1,a1)') 'dA/dt(', idir, ')'
580 call write_iter_header(out_gauge, aux)
581 end do
582 do idir = 1, this%space%dim
583 write(aux, '(a10,i1,a1)') 'd^2A/dt^2(', idir, ')'
584 call write_iter_header(out_gauge, aux)
585 end do
586 call write_iter_nl(out_gauge)
587
588 ! second line: units
589 !call write_iter_string(out_gauge, '#[Iter n.]')
590 !call write_iter_header(out_gauge, '[' // trim(units_abbrev(units_out%time)) // ']')
591 !call write_iter_string(out_gauge, &
592 ! 'A Vector potential in ' // trim(units_abbrev(units_out%length)) &
593 ! 'A dot in ' // trim(units_abbrev(units_out%length)) &
594 ! 'A dot dot in ' // trim(units_abbrev(units_out%length))
595 !call write_iter_nl(out_gauge)
596
597 call write_iter_string(out_gauge,'################################################################################')
598 call write_iter_nl(out_gauge)
599
600 end if
601
602 call write_iter_start(out_gauge)
603
604 do idir = 1, this%space%dim
605 temp(idir) = units_from_atomic(units_out%energy, this%vecpot(idir))
606 end do
607 call write_iter_double(out_gauge, temp, this%space%dim)
608
609 do idir = 1, this%space%dim
610 temp(idir) = units_from_atomic(units_out%energy / units_out%time, this%vecpot_vel(idir))
611 end do
612 call write_iter_double(out_gauge, temp, this%space%dim)
614 do idir = 1, this%space%dim
615 temp(idir) = units_from_atomic(units_out%energy / units_out%time**2, this%vecpot_acc(idir))
616 end do
617 call write_iter_double(out_gauge, temp, this%space%dim)
618
619 call write_iter_nl(out_gauge)
620
622 end subroutine gauge_field_output_write
623
624 ! ---------------------------------------------------------
625 subroutine gauge_field_finalize(this)
626 type(gauge_field_t), intent(inout) :: this
627
628 push_sub(gauge_field_finalize)
629
630 call gauge_field_end(this)
631
632 pop_sub(gauge_field_finalize)
633 end subroutine gauge_field_finalize
634
635 ! ---------------------------------------------------------
636 subroutine gauge_field_init_interaction_as_partner(partner, interaction)
637 class(gauge_field_t), intent(in) :: partner
638 class(interaction_surrogate_t), intent(inout) :: interaction
639
641
642 select type (interaction)
643 class default
644 message(1) = "Unsupported interaction."
645 call messages_fatal(1)
646 end select
647
650
651 ! ---------------------------------------------------------
652 subroutine gauge_field_copy_quantities_to_interaction(partner, interaction)
653 class(gauge_field_t), intent(inout) :: partner
654 class(interaction_surrogate_t), intent(inout) :: interaction
655
657
658 select type (interaction)
659 class default
660 message(1) = "Unsupported interaction."
661 call messages_fatal(1)
662 end select
663
666
667end module gauge_field_oct_m
668
669!! Local Variables:
670!! mode: f90
671!! coding: utf-8
672!! End:
double sqrt(double __x) __attribute__((__nothrow__
This module implements the basic elements defining algorithms.
Definition: algorithm.F90:141
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_force(this, gr, spin_channels, current, lrc_alpha)
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:188
real(real64), parameter, public m_epsilon
Definition: global.F90:204
This module implements the underlying real-space grid.
Definition: grid.F90:117
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:118
subroutine, public messages_warning(no_lines, all_nodes, namespace)
Definition: messages.F90:537
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
Definition: messages.F90:160
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
Definition: messages.F90:414
integer function, public parse_block(namespace, name, blk, check_varinfo_)
Definition: parser.F90:618
integer pure function, public symmetries_identity_index(this)
Definition: symmetries.F90:586
integer pure function, public symmetries_number(this)
Definition: symmetries.F90:540
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
Definition: unit.F90:132
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:114
abstract class for general interaction partners
int true(void)