Octopus
global.F90
Go to the documentation of this file.
1!! Copyright (C) 2002-2006 M. Marques, A. Castro, A. Rubio, G. Bertsch
2!!
3!! This program is free software; you can redistribute it and/or modify
4!! it under the terms of the GNU General Public License as published by
5!! the Free Software Foundation; either version 2, or (at your option)
6!! any later version.
7!!
8!! This program is distributed in the hope that it will be useful,
9!! but WITHOUT ANY WARRANTY; without even the implied warranty of
10!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11!! GNU General Public License for more details.
12!!
13!! You should have received a copy of the GNU General Public License
14!! along with this program; if not, write to the Free Software
15!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16!! 02110-1301, USA.
17!!
18
19#include "global.h"
20
21module global_oct_m
22 use, intrinsic :: iso_fortran_env
24 use loct_oct_m
25 use mpi_oct_m
26 use string_oct_m
28#ifdef HAVE_OPENMP
29 use omp_lib
30#endif
31
32 implicit none
33
34 private
35
37 public :: &
38 conf_t, &
40 global_end, &
43 assert_die, &
45 operator(+), &
46 bitand, &
47 int32, int64, &
48 real32, real64, &
49 i4_to_i8, &
51 ! Make these kind variables from kind_oct_m public here so that they are
52 ! available basically everywhere in the code. They still need to be in a
53 ! separate module because they are also needed in some low-level modules.
54
55 integer, public, parameter :: MAX_PATH_LEN=512
56 integer, public, parameter :: MAX_OUTPUT_TYPES=45
57
59 type conf_t
60 logical :: devel_version
61 logical :: report_memory
62 character(len=256) :: share = share_dir
63 character(len=256) :: build_dir = build_dir
64 character(len=256) :: git_commit = git_commit
65 character(len=50) :: config_time = build_time
66 character(len=20) :: version = package_version
67 character(len=256) :: cc = cc
68 character(len=256) :: cxx = cxx
69 character(len=256) :: fc = fc
70 ! Split flag definitions in case they don`t fit in one line, following preprocessing
71 character(len=256) :: cflags = &
72 cflags //&
73 cflags_extra
74 character(len=256) :: cxxflags = &
75 cxxflags //&
76 cxxflags_extra
77 character(len=512) :: fcflags = &
78 fcflags //&
79 fcflags_extra
80 integer :: target_states_block_size = -1
81 contains
82 procedure :: init => conf_init
83 end type conf_t
84
86 type(conf_t), public :: conf
87
88 real(real64), public, parameter :: R_SMALL = 1e-8_real64
89
91 real(real64), public, parameter :: R_MIN_ATOM_DIST = 1e-3_real64
92
94 real(real64), public, parameter :: M_Pi = 3.1415926535897932384626433832795029_real64
95 real(real64), public, parameter :: M_E = 2.7182818284590452353602874713526625_real64
96 real(real64), public, parameter :: M_ZERO = 0.0_real64
97 real(real64), public, parameter :: M_ONE = 1.0_real64
98 real(real64), public, parameter :: M_TWO = 2.0_real64
99 real(real64), public, parameter :: M_THREE = 3.0_real64
100 real(real64), public, parameter :: M_FOUR = 4.0_real64
101 real(real64), public, parameter :: M_FIVE = 5.0_real64
102 real(real64), public, parameter :: M_HALF = 0.5_real64
103 real(real64), public, parameter :: M_THIRD = m_one/m_three
104 real(real64), public, parameter :: M_TWOTHIRD = m_two/m_three
105 real(real64), public, parameter :: M_FOURTH = m_one/m_four
106 complex(real64), public, parameter :: M_z0 = (0.0_real64, 0.0_real64)
107 complex(real64), public, parameter :: M_z1 = (1.0_real64, 0.0_real64)
108 complex(real64), public, parameter :: M_z2 = (2.0_real64, 0.0_real64)
109 complex(real64), public, parameter :: M_z2I = (0.0_real64, 2.0_real64)
110 complex(real64), public, parameter :: M_zI = (0.0_real64, 1.0_real64)
111
112 real(real64), public, parameter :: M_EPSILON = epsilon(m_one)
113 real(real64), public, parameter :: M_TINY = tiny(m_one)
114 real(real64), public, parameter :: M_HUGE = huge(m_one)
115 real(real64), public, parameter :: M_MIN_EXP_ARG = -650_real64
116 real(real64), public, parameter :: M_MAX_EXP_ARG = 700_real64
117
119 real(real64), public, parameter :: M_MIN_OCC = 1.0e-10_real64
121 real(real64), public, parameter :: M_MIN_DENSITY = 1.0e-20_real64
123 real(real64), public, parameter :: M_DEGENERARY_THRESHOLD = 1.0e-6_real64
124
126 real(real64), public, parameter :: LMM_R_SINGLE_ATOM = 100.0_real64
127
129 real(real64), public, parameter :: P_a_B = 0.52917720859_real64
130 real(real64), public, parameter :: P_Ang = m_one / p_a_b
131 real(real64), public, parameter :: P_Ry = 13.60569193_real64
132 real(real64), public, parameter :: P_eV = m_one / p_ry
133 real(real64), public, parameter :: P_Kb = 8.617343e-5_real64/(m_two*p_ry)
134 real(real64), public, parameter :: P_c = 137.035999679_real64
135
136 real(real64), public, parameter :: P_g = 2.00231930436118_real64
137 real(real64), public, parameter :: P_PROTON_CHARGE = -1.0_real64
138 real(real64), public, parameter :: P_ep = m_one/(m_four*m_pi)
139 real(real64), public, parameter :: P_mu = m_four*m_pi/(p_c**2)
140
142 integer, public, parameter :: &
143 INDEPENDENT_PARTICLES = 2, &
144 hartree = 1, &
145 hartree_fock = 3, &
146 kohn_sham_dft = 4, &
148 rdmft = 7
149
151 integer, public :: stderr, stdin, stdout
152
154 integer, public :: s_epoch_sec, s_epoch_usec
157 character(len=80), public :: sub_stack(50)
158 real(real64), public :: time_stack(50)
159 integer, public :: no_sub_stack = 0
162 logical, public :: in_profiling_mode = .false.
164 integer, public :: global_alloc_err
165 integer(int64), public :: global_sizeof
166 character(len=100), public :: global_alloc_errmsg
167
168 ! The code directories should be defined here, and not hard coded in the Fortran files.
169 character(len=*), public, parameter :: gs_dir = "gs/"
170 character(len=*), public, parameter :: td_dir = "td/"
171 character(len=*), public, parameter :: static_dir = "static/"
172 character(len=*), public, parameter :: em_resp_dir = "em_resp/"
173 character(len=*), public, parameter :: em_resp_fd_dir = "em_resp_fd/"
174 character(len=*), public, parameter :: kdotp_dir = "kdotp/"
175 character(len=*), public, parameter :: vib_modes_dir = "vib_modes/"
176 character(len=*), public, parameter :: vdw_dir = "vdw/"
177 character(len=*), public, parameter :: casida_dir = "casida/"
178 character(len=*), public, parameter :: oct_dir = "opt-control/"
179 character(len=*), public, parameter :: pcm_dir = "pcm/"
180 character(len=*), public, parameter :: partition_dir = "partition/"
181 character(len=*), public, parameter :: iteration_dir = "iteration/"
182
185 type(mpi_comm), public, parameter :: serial_dummy_comm = mpi_comm_undefined
187 ! End of declaration of public objects.
188 ! ---------------------------------------------------------
193 end interface optional_default
197 interface
198 subroutine assert_die(s, f, l)
199 implicit none
200 character(len=*), intent(in) :: s, f
201 integer, intent(in) :: l
202 end subroutine assert_die
203 end interface
205 interface operator (+)
206 module procedure cat
207 end interface operator (+)
209 interface bitand
210 module procedure bitand48
211 module procedure bitand84
212 module procedure bitand88
213 module procedure bitand44
214 end interface bitand
215
216 interface i4_to_i8
217 module procedure i4_to_i8_0, i4_to_i8_1
218 end interface i4_to_i8
219
220 interface i8_to_i4
221 module procedure i8_to_i4_0, i8_to_i4_1
222 end interface i8_to_i4
223
224contains
227 subroutine conf_init(this)
228 class(conf_t), intent(inout) :: this
230 character(len=MAX_PATH_LEN) :: share
231 character(len=MAX_PATH_LEN) :: path_exe, dir_exe
233 ! First, get the environment variable OCTOPUS_SHARE that overrides the default
234 call loct_getenv("OCTOPUS_SHARE", share)
235 if (trim(share) /= "") then
236 this%share = trim(share)
237 return
238 end if
239 ! Second, try a share directory next to the binary; this makes it work in the build tree
240 call loct_executable_path(path_exe)
241 if (trim(path_exe) /= "") then
242 ! we got a useable path, search for the share folder
243 call loct_dirname(path_exe, dir_exe)
244 share = trim(dir_exe) // "/share"
245 if (loct_dir_exists(share)) then
246 this%share = trim(share)
247 return
248 end if
249 end if
250 ! Third, take the value from the configuration step, check if it exists
251 if (.not.loct_dir_exists(conf%share)) then
252 write(*, "(A)") "Error: could not find share directory."
253 write(*, "(A, A)") "Configured location: ", trim(conf%share)
254 stop
255 end if
256
257 end subroutine conf_init
258
265 subroutine global_init(communicator)
266 type(mpi_comm), intent(in), optional :: communicator
268 type(mpi_comm) :: comm
270 if (present(communicator)) then
271 comm = communicator
273 else
274 call mpi_init_comm(comm)
275 endif
277 call init_octopus_globals(comm)
278
279 ! Order of call is important. mpi_world is used implicitly by blacs_init
281
282 end subroutine global_init
283
284
295 subroutine init_octopus_globals(comm)
296 type(mpi_comm), intent(in) :: comm
297
298 character(len=256) :: path
299
301
302 call mpi_world%barrier()
303 ! Get epoch time at node startup, just after the barrier to synchronize nodes first.
304 call loct_gettimeofday(s_epoch_sec, s_epoch_usec)
305
306 ! These defaults are initialised here because the Intel 2022a compiler complains:
307 ! "This array or function or substring is invalid in constant expressions"
308 ! This is not a problem with Intel 2023a, and so can be returned to hardware.F90
309 ! once Intel 2022a support is dropped
310 default_l1 = cache_t( 32*1024, 64)
311 default_l2 = cache_t(4096*1024, 64)
312
313 ! TODO(Alex) Issue 1013. Change hardware class to a free function, and make cache_t instance global.
316 call conf%init()
317
318 ! initialize info for the input variables
319 path = trim(conf%share)//'/varinfo'
320 call varinfo_init(string_f_to_c(path))
321
322 end subroutine init_octopus_globals
323
324
326 subroutine global_end()
327
328 call varinfo_end()
329 call mpi_mod_end()
330
331 end subroutine global_end
332
333
334 real(real64) pure function doptional_default(opt, def) result(val)
335 real(real64), optional, intent(in) :: opt
336 real(real64), intent(in) :: def
337
338 val = def
339 if (present(opt)) val = opt
340 end function doptional_default
341
342 !----------------------------------------------------------
343
344 complex(real64) pure function zoptional_default(opt, def) result(val)
345 complex(real64), optional, intent(in) :: opt
346 complex(real64), intent(in) :: def
347
348 val = def
349 if (present(opt)) val = opt
350 end function zoptional_default
351
352 !----------------------------------------------------------
353
354 integer pure function ioptional_default(opt, def) result(val)
355 integer, optional, intent(in) :: opt
356 integer, intent(in) :: def
357
358 val = def
359 if (present(opt)) val = opt
360 end function ioptional_default
361
362 !----------------------------------------------------------
363
364 integer(int64) pure function loptional_default(opt, def) result(val)
365 integer(int64), optional, intent(in) :: opt
366 integer(int64), intent(in) :: def
367
368 val = def
369 if (present(opt)) val = opt
370 end function loptional_default
371
372 !----------------------------------------------------------
373
374 logical pure function looptional_default(opt, def) result(val)
375 logical, optional, intent(in) :: opt
376 logical, intent(in) :: def
377
378 val = def
379 if (present(opt)) val = opt
380 end function looptional_default
381
382 !----------------------------------------------------------
383
384 character(len=80) pure function soptional_default(opt, def) result(val)
385 character(len=*), optional, intent(in) :: opt
386 character(len=*), intent(in) :: def
387
388 val = def
389 if (present(opt)) val = opt
390 end function soptional_default
391
392 !-----------------------------------------------------------
393
394 logical &
395#ifndef have_openmp
396 pure &
397#endif
398 function not_in_openmp()
399
400#ifdef HAVE_OPENMP
401 not_in_openmp = .not. omp_in_parallel()
402#else
404#endif
405
406 end function not_in_openmp
407
408 !-----------------------------------------------------------
409
410 function cat(str1, str2)
411 character(len=*), intent(in) :: str1
412 character(len=*), intent(in) :: str2
413
414 character(len=len(str1) + len(str2)) :: cat
415 cat = str1//str2
416
417 end function cat
418
419 ! -----------------------------------------------------------
420
421 integer(int64) pure function bitand48(val1, val2)
422 integer(int32), intent(in) :: val1
423 integer(int64), intent(in) :: val2
424
425 bitand48 = iand(int(val1, int64), val2)
426
427 end function bitand48
428
429 ! -----------------------------------------------------------
430
431 integer(int64) pure function bitand84(val1, val2)
432 integer(int64), intent(in) :: val1
433 integer(int32), intent(in) :: val2
434
435 bitand84 = iand(val1, int(val2, int64))
436
437 end function bitand84
438
439 ! -----------------------------------------------------------
440
441 integer(int64) pure function bitand88(val1, val2)
442 integer(int64), intent(in) :: val1
443 integer(int64), intent(in) :: val2
444
445 bitand88 = iand(val1, val2)
446
447 end function bitand88
448
449 ! -----------------------------------------------------------
450
451 integer(int32) pure function bitand44(val1, val2)
452 integer(int32), intent(in) :: val1
453 integer(int32), intent(in) :: val2
454
455 bitand44 = iand(val1, val2)
456
457 end function bitand44
458
459 ! -----------------------------------------------------------
460
461 integer(int64) pure function i4_to_i8_0(ii)
462 integer(int32), intent(in) :: ii
463
464 i4_to_i8_0 = int(ii, int64)
465 end function i4_to_i8_0
466
467 ! -----------------------------------------------------------
468
469 integer(int32) pure function i8_to_i4_0(ii)
470 integer(int64), intent(in) :: ii
471
472 i8_to_i4_0 = int(ii, int32)
473 end function i8_to_i4_0
474
475 ! -----------------------------------------------------------
476
477 pure function i4_to_i8_1(ii)
478 integer(int32), intent(in) :: ii(:)
479 integer(int64) :: i4_to_i8_1(lbound(ii, 1, kind=int64):ubound(ii, 1, kind=int64))
480
481 i4_to_i8_1 = int(ii, int64)
482 end function i4_to_i8_1
483
484 ! -----------------------------------------------------------
485
486 pure function i8_to_i4_1(ii)
487 integer(int64), intent(in) :: ii(:)
488 integer(int32) :: i8_to_i4_1(lbound(ii, 1, kind=int64):ubound(ii, 1, kind=int64))
490 i8_to_i4_1 = int(ii, int32)
491 end function i8_to_i4_1
492end module global_oct_m
493
494!! Local Variables:
495!! mode: f90
496!! coding: utf-8
497!! End:
This function is defined in messages.F90.
Definition: global.F90:293
character(len= *), parameter, public em_resp_fd_dir
Definition: global.F90:268
integer(int32) pure function bitand44(val1, val2)
Definition: global.F90:547
subroutine, public global_end()
Finalise parser varinfo file, and MPI.
Definition: global.F90:422
pure integer(int32) function, dimension(lbound(ii, 1, kind=int64):ubound(ii, 1, kind=int64)) i8_to_i4_1(ii)
Definition: global.F90:582
character(len= *), parameter, public gs_dir
Definition: global.F90:264
integer(int64) pure function bitand88(val1, val2)
Definition: global.F90:537
integer(int64) pure function i4_to_i8_0(ii)
Definition: global.F90:557
character(len= *), parameter, public iteration_dir
Definition: global.F90:276
integer pure function ioptional_default(opt, def)
Definition: global.F90:450
integer, public no_sub_stack
Definition: global.F90:254
character(len= *), parameter, public casida_dir
Definition: global.F90:272
integer, parameter, public rdmft
Definition: global.F90:237
integer(int64), public global_sizeof
Definition: global.F90:260
character(len= *), parameter, public pcm_dir
Definition: global.F90:274
integer(int64) pure function bitand84(val1, val2)
Definition: global.F90:527
integer, parameter, public hartree_fock
Definition: global.F90:237
character(len= *), parameter, public vib_modes_dir
Definition: global.F90:270
character(len= *), parameter, public partition_dir
Definition: global.F90:275
integer(int64) pure function loptional_default(opt, def)
Definition: global.F90:460
character(len= *), parameter, public kdotp_dir
Definition: global.F90:269
character(len=len(str1)+len(str2)) function cat(str1, str2)
Definition: global.F90:506
type(mpi_comm), parameter, public serial_dummy_comm
Alias MPI_COMM_UNDEFINED for the specific use case of initialising Octopus utilities with no MPI supp...
Definition: global.F90:280
subroutine, public init_octopus_globals(comm)
Initialise Octopus-specific global constants and files. This routine performs no initialisation calls...
Definition: global.F90:391
real(real64), dimension(50), public time_stack
Definition: global.F90:253
logical pure function, public not_in_openmp()
Definition: global.F90:494
real(real64) pure function doptional_default(opt, def)
Definition: global.F90:430
logical pure function looptional_default(opt, def)
Definition: global.F90:470
integer, parameter, public generalized_kohn_sham_dft
Definition: global.F90:237
integer, parameter, public kohn_sham_dft
Definition: global.F90:237
integer(int32) pure function i8_to_i4_0(ii)
Definition: global.F90:565
character(len=80), dimension(50), public sub_stack
The stack.
Definition: global.F90:252
character(len= *), parameter, public em_resp_dir
Definition: global.F90:267
character(len=100), public global_alloc_errmsg
Definition: global.F90:261
logical, public in_profiling_mode
Same for profiling mode.
Definition: global.F90:257
integer, public global_alloc_err
Definition: global.F90:259
character(len=80) pure function soptional_default(opt, def)
Definition: global.F90:480
character(len= *), parameter, public td_dir
Definition: global.F90:265
pure integer(int64) function, dimension(lbound(ii, 1, kind=int64):ubound(ii, 1, kind=int64)) i4_to_i8_1(ii)
Definition: global.F90:573
character(len= *), parameter, public static_dir
Definition: global.F90:266
subroutine, public global_init(communicator)
Initialise Octopus.
Definition: global.F90:361
complex(real64) pure function zoptional_default(opt, def)
Definition: global.F90:440
subroutine conf_init(this)
Initialiser for conf_t.
Definition: global.F90:323
integer, parameter, public hartree
Definition: global.F90:237
character(len= *), parameter, public vdw_dir
Definition: global.F90:271
character(len= *), parameter, public oct_dir
Definition: global.F90:273
integer(int64) pure function bitand48(val1, val2)
Definition: global.F90:517
type(hardware_t), public cpu_hardware
Global instance of CPU hardware specification.
Definition: hardware.F90:61
type(cache_t), public default_l2
Definition: hardware.F90:65
type(cache_t), public default_l1
Defaults covers common chip specification for (l1, l2) cache.
Definition: hardware.F90:64
System information (time, memory, sysname)
Definition: loct.F90:117
subroutine, public loct_getenv(var, val)
Definition: loct.F90:364
subroutine, public loct_dirname(path, dir)
Definition: loct.F90:442
logical function, public loct_dir_exists(dirname)
Definition: loct.F90:349
character(kind=c_char, len=1) function, dimension(len_trim(f_string)+1), private string_f_to_c(f_string)
convert a Fortran string to a C string
Definition: loct.F90:240
subroutine, public loct_executable_path(fpath)
Definition: loct.F90:425
subroutine blacs_init()
Initialize BLACS to enable use of SCALAPACK.
Definition: mpi.F90:322
subroutine check_threading_support(comm)
Check that the threading support of the MPI library is consistent with the requested support from Oct...
Definition: mpi.F90:312
type(mpi_comm), parameter, public mpi_comm_undefined
used to indicate a communicator has not been initialized
Definition: mpi.F90:138
type(mpi_grp_t), public mpi_world
Definition: mpi.F90:272
subroutine mpi_mod_end()
Finalize MPI, and conditionally BLACS.
Definition: mpi.F90:328
subroutine mpi_grp_init(grp, comm)
Initialize MPI group instance.
Definition: mpi.F90:347
subroutine mpi_init_comm(comm)
Wrapper for MPI_COMM_WORLD initialisation.
Definition: mpi.F90:301
static double f(double w, void *p)
Build configuration type.
Definition: global.F90:154
int true(void)