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
27#ifdef HAVE_OPENMP
28 use omp_lib
29#endif
30
31 implicit none
32
33 private
34
36 public :: &
37 conf_t, &
39 global_end, &
42 assert_die, &
44 operator(+), &
45 bitand, &
46 int32, int64, &
47 real32, real64, &
48 i4_to_i8, &
50 ! Make these kind variables from kind_oct_m public here so that they are
51 ! available basically everywhere in the code. They still need to be in a
52 ! separate module because they are also needed in some low-level modules.
53
54 integer, public, parameter :: MAX_PATH_LEN=512
55 integer, public, parameter :: MAX_OUTPUT_TYPES=45
56
58 type conf_t
59 logical :: devel_version
60 logical :: report_memory
61 character(len=256) :: share = share_dir
62 character(len=256) :: build_dir = build_dir
63 character(len=256) :: git_commit = git_commit
64 character(len=50) :: config_time = build_time
65 character(len=20) :: version = package_version
66 character(len=256) :: cc = cc
67 character(len=256) :: cxx = cxx
68 character(len=256) :: fc = fc
69 ! Split flag definitions in case they don`t fit in one line, following preprocessing
70 character(len=256) :: cflags = &
71 cflags //&
72 cflags_extra
73 character(len=256) :: cxxflags = &
74 cxxflags //&
75 cxxflags_extra
76 character(len=512) :: fcflags = &
77 fcflags //&
78 fcflags_extra
79 integer :: target_states_block_size = -1
80 contains
81 procedure :: init => conf_init
82 end type conf_t
83
85 type(conf_t), public :: conf
86
87 real(real64), public, parameter :: R_SMALL = 1e-8_real64
88
90 real(real64), public, parameter :: R_MIN_ATOM_DIST = 1e-3_real64
91
93 real(real64), public, parameter :: M_Pi = 3.1415926535897932384626433832795029_real64
94 real(real64), public, parameter :: M_E = 2.7182818284590452353602874713526625_real64
95 real(real64), public, parameter :: M_ZERO = 0.0_real64
96 real(real64), public, parameter :: M_ONE = 1.0_real64
97 real(real64), public, parameter :: M_TWO = 2.0_real64
98 real(real64), public, parameter :: M_THREE = 3.0_real64
99 real(real64), public, parameter :: M_FOUR = 4.0_real64
100 real(real64), public, parameter :: M_FIVE = 5.0_real64
101 real(real64), public, parameter :: M_HALF = 0.5_real64
102 real(real64), public, parameter :: M_THIRD = m_one/m_three
103 real(real64), public, parameter :: M_TWOTHIRD = m_two/m_three
104 real(real64), public, parameter :: M_FOURTH = m_one/m_four
105 complex(real64), public, parameter :: M_z0 = (0.0_real64, 0.0_real64)
106 complex(real64), public, parameter :: M_z1 = (1.0_real64, 0.0_real64)
107 complex(real64), public, parameter :: M_z2 = (2.0_real64, 0.0_real64)
108 complex(real64), public, parameter :: M_z2I = (0.0_real64, 2.0_real64)
109 complex(real64), public, parameter :: M_zI = (0.0_real64, 1.0_real64)
110
111 real(real64), public, parameter :: M_EPSILON = epsilon(m_one)
112 real(real64), public, parameter :: M_TINY = tiny(m_one)
113 real(real64), public, parameter :: M_HUGE = huge(m_one)
114 real(real64), public, parameter :: M_MIN_EXP_ARG = -650_real64
115 real(real64), public, parameter :: M_MAX_EXP_ARG = 700_real64
116
118 real(real64), public, parameter :: M_MIN_OCC = 1.0e-10_real64
120 real(real64), public, parameter :: M_MIN_DENSITY = 1.0e-20_real64
121
123 real(real64), public, parameter :: LMM_R_SINGLE_ATOM = 100.0_real64
124
126 real(real64), public, parameter :: P_a_B = 0.52917720859_real64
127 real(real64), public, parameter :: P_Ang = m_one / p_a_b
128 real(real64), public, parameter :: P_Ry = 13.60569193_real64
129 real(real64), public, parameter :: P_eV = m_one / p_ry
130 real(real64), public, parameter :: P_Kb = 8.617343e-5_real64/(m_two*p_ry)
131 real(real64), public, parameter :: P_c = 137.035999679_real64
132
133 real(real64), public, parameter :: P_g = 2.00231930436118_real64
134 real(real64), public, parameter :: P_PROTON_CHARGE = -1.0_real64
135 real(real64), public, parameter :: P_ep = m_one/(m_four*m_pi)
136 real(real64), public, parameter :: P_mu = m_four*m_pi/(p_c**2)
137
139 integer, public :: stderr, stdin, stdout
140
142 integer, public :: s_epoch_sec, s_epoch_usec
143
145 character(len=80), public :: sub_stack(50)
146 real(real64), public :: time_stack(50)
147 integer, public :: no_sub_stack = 0
150 logical, public :: in_profiling_mode = .false.
152 integer, public :: global_alloc_err
153 integer(int64), public :: global_sizeof
154 character(len=100), public :: global_alloc_errmsg
156 ! The code directories should be defined here, and not hard coded in the Fortran files.
157 character(len=*), public, parameter :: gs_dir = "gs/"
158 character(len=*), public, parameter :: td_dir = "td/"
159 character(len=*), public, parameter :: static_dir = "static/"
160 character(len=*), public, parameter :: em_resp_dir = "em_resp/"
161 character(len=*), public, parameter :: em_resp_fd_dir = "em_resp_fd/"
162 character(len=*), public, parameter :: kdotp_dir = "kdotp/"
163 character(len=*), public, parameter :: vib_modes_dir = "vib_modes/"
164 character(len=*), public, parameter :: vdw_dir = "vdw/"
165 character(len=*), public, parameter :: casida_dir = "casida/"
166 character(len=*), public, parameter :: oct_dir = "opt-control/"
167 character(len=*), public, parameter :: pcm_dir = "pcm/"
168 character(len=*), public, parameter :: partition_dir = "partition/"
172 type(mpi_comm), public, parameter :: serial_dummy_comm = mpi_comm_undefined
173
174 ! End of declaration of public objects.
175 ! ---------------------------------------------------------
176
177 interface optional_default
179 module procedure looptional_default, soptional_default
180 end interface optional_default
181
182
184 interface
185 subroutine assert_die(s, f, l)
186 implicit none
187 character(len=*), intent(in) :: s, f
188 integer, intent(in) :: l
189 end subroutine assert_die
190 end interface
192 interface operator (+)
193 module procedure cat
194 end interface operator (+)
196 interface bitand
197 module procedure bitand48
198 module procedure bitand84
199 module procedure bitand88
200 module procedure bitand44
201 end interface bitand
203 interface i4_to_i8
204 module procedure i4_to_i8_0, i4_to_i8_1
205 end interface i4_to_i8
207 interface i8_to_i4
208 module procedure i8_to_i4_0, i8_to_i4_1
209 end interface i8_to_i4
210
211contains
212
214 subroutine conf_init(this)
215 class(conf_t), intent(inout) :: this
217 character(len=256) :: share
218
219 ! Get the environment variable OCTOPUS_SHARE that overrides the default
220 call loct_getenv("OCTOPUS_SHARE", share)
221 if (share /= "") this%share = trim(share)
223 end subroutine conf_init
225
231 subroutine global_init(communicator)
232 type(mpi_comm), intent(in), optional :: communicator
233
234 type(mpi_comm) :: comm
236 if (present(communicator)) then
237 comm = communicator
238 else
239 call mpi_init_comm(comm)
240 endif
241
242 call init_octopus_globals(comm)
244 ! Order of call is important. mpi_world is used implicitly by blacs_init
247 end subroutine global_init
248
249
260 subroutine init_octopus_globals(comm)
261 type(mpi_comm), intent(in) :: comm
262
263 call mpi_grp_init(mpi_world, comm)
264
265 call mpi_world%barrier()
266 ! Get epoch time at node startup, just after the barrier to synchronize nodes first.
267 call loct_gettimeofday(s_epoch_sec, s_epoch_usec)
268
269 ! These defaults are initialised here because the Intel 2022a compiler complains:
270 ! "This array or function or substring is invalid in constant expressions"
271 ! This is not a problem with Intel 2023a, and so can be returned to hardware.F90
272 ! once Intel 2022a support is dropped
273 default_l1 = cache_t( 32*1024, 64)
274 default_l2 = cache_t(4096*1024, 64)
275
276 ! TODO(Alex) Issue 1013. Change hardware class to a free function, and make cache_t instance global.
279 call conf%init()
280
281 ! initialize info for the input variables
282 call varinfo_init(trim(conf%share)//'/varinfo')
283
284 end subroutine init_octopus_globals
286
288 subroutine global_end()
290 call varinfo_end()
291 call mpi_mod_end()
292
293 end subroutine global_end
294
295
296 real(real64) pure function doptional_default(opt, def) result(val)
297 real(real64), optional, intent(in) :: opt
298 real(real64), intent(in) :: def
299
300 val = def
301 if (present(opt)) val = opt
302 end function doptional_default
303
304 !----------------------------------------------------------
305
306 complex(real64) pure function zoptional_default(opt, def) result(val)
307 complex(real64), optional, intent(in) :: opt
308 complex(real64), intent(in) :: def
309
310 val = def
311 if (present(opt)) val = opt
312 end function zoptional_default
313
314 !----------------------------------------------------------
315
316 integer pure function ioptional_default(opt, def) result(val)
317 integer, optional, intent(in) :: opt
318 integer, intent(in) :: def
319
320 val = def
321 if (present(opt)) val = opt
322 end function ioptional_default
323
324 !----------------------------------------------------------
325
326 integer(int64) pure function loptional_default(opt, def) result(val)
327 integer(int64), optional, intent(in) :: opt
328 integer(int64), intent(in) :: def
329
330 val = def
331 if (present(opt)) val = opt
332 end function loptional_default
333
334 !----------------------------------------------------------
335
336 logical pure function looptional_default(opt, def) result(val)
337 logical, optional, intent(in) :: opt
338 logical, intent(in) :: def
339
340 val = def
341 if (present(opt)) val = opt
342 end function looptional_default
343
344 !----------------------------------------------------------
345
346 character(len=80) pure function soptional_default(opt, def) result(val)
347 character(len=*), optional, intent(in) :: opt
348 character(len=*), intent(in) :: def
349
350 val = def
351 if (present(opt)) val = opt
352 end function soptional_default
354 !-----------------------------------------------------------
355
356 logical &
357#ifndef have_openmp
358 pure &
359#endif
360 function not_in_openmp()
361
362#ifdef HAVE_OPENMP
363 not_in_openmp = .not. omp_in_parallel()
364#else
366#endif
367
368 end function not_in_openmp
369
370 !-----------------------------------------------------------
371
372 function cat(str1, str2)
373 character(len=*), intent(in) :: str1
374 character(len=*), intent(in) :: str2
375
376 character(len=len(str1) + len(str2)) :: cat
377 cat = str1//str2
378
379 end function cat
380
381 ! -----------------------------------------------------------
382
383 integer(int64) pure function bitand48(val1, val2)
384 integer(int32), intent(in) :: val1
385 integer(int64), intent(in) :: val2
386
387 bitand48 = iand(int(val1, int64), val2)
388
389 end function bitand48
390
391 ! -----------------------------------------------------------
392
393 integer(int64) pure function bitand84(val1, val2)
394 integer(int64), intent(in) :: val1
395 integer(int32), intent(in) :: val2
396
397 bitand84 = iand(val1, int(val2, int64))
398
399 end function bitand84
400
401 ! -----------------------------------------------------------
402
403 integer(int64) pure function bitand88(val1, val2)
404 integer(int64), intent(in) :: val1
405 integer(int64), intent(in) :: val2
406
407 bitand88 = iand(val1, val2)
408
409 end function bitand88
410
411 ! -----------------------------------------------------------
412
413 integer(int32) pure function bitand44(val1, val2)
414 integer(int32), intent(in) :: val1
415 integer(int32), intent(in) :: val2
416
417 bitand44 = iand(val1, val2)
418
419 end function bitand44
420
421 ! -----------------------------------------------------------
422
423 integer(int64) pure function i4_to_i8_0(ii)
424 integer(int32), intent(in) :: ii
425
426 i4_to_i8_0 = int(ii, int64)
427 end function i4_to_i8_0
428
429 ! -----------------------------------------------------------
430
431 integer(int32) pure function i8_to_i4_0(ii)
432 integer(int64), intent(in) :: ii
433
434 i8_to_i4_0 = int(ii, int32)
435 end function i8_to_i4_0
436
437 ! -----------------------------------------------------------
438
439 pure function i4_to_i8_1(ii)
440 integer(int32), intent(in) :: ii(:)
441 integer(int64) :: i4_to_i8_1(lbound(ii, 1, kind=int64):ubound(ii, 1, kind=int64))
442
443 i4_to_i8_1 = int(ii, int64)
444 end function i4_to_i8_1
445
446 ! -----------------------------------------------------------
447
448 pure function i8_to_i4_1(ii)
449 integer(int64), intent(in) :: ii(:)
450 integer(int32) :: i8_to_i4_1(lbound(ii, 1, kind=int64):ubound(ii, 1, kind=int64))
451
452 i8_to_i4_1 = int(ii, int32)
453 end function i8_to_i4_1
454end module global_oct_m
455
456!! Local Variables:
457!! mode: f90
458!! coding: utf-8
459!! End:
This function is defined in messages.F90.
Definition: global.F90:278
character(len= *), parameter, public em_resp_fd_dir
Definition: global.F90:254
integer(int32) pure function bitand44(val1, val2)
Definition: global.F90:507
subroutine, public global_end()
Finalise parser varinfo file, and MPI.
Definition: global.F90:382
pure integer(int32) function, dimension(lbound(ii, 1, kind=int64):ubound(ii, 1, kind=int64)) i8_to_i4_1(ii)
Definition: global.F90:542
character(len= *), parameter, public gs_dir
Definition: global.F90:250
integer(int64) pure function bitand88(val1, val2)
Definition: global.F90:497
integer(int64) pure function i4_to_i8_0(ii)
Definition: global.F90:517
integer pure function ioptional_default(opt, def)
Definition: global.F90:410
integer, public no_sub_stack
Definition: global.F90:240
character(len= *), parameter, public casida_dir
Definition: global.F90:258
integer(int64), public global_sizeof
Definition: global.F90:246
character(len= *), parameter, public pcm_dir
Definition: global.F90:260
integer(int64) pure function bitand84(val1, val2)
Definition: global.F90:487
character(len= *), parameter, public vib_modes_dir
Definition: global.F90:256
character(len= *), parameter, public partition_dir
Definition: global.F90:261
integer(int64) pure function loptional_default(opt, def)
Definition: global.F90:420
character(len= *), parameter, public kdotp_dir
Definition: global.F90:255
character(len=len(str1)+len(str2)) function cat(str1, str2)
Definition: global.F90:466
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:265
subroutine, public init_octopus_globals(comm)
Initialise Octopus-specific global constants and files. This routine performs no initialisation calls...
Definition: global.F90:354
logical pure function, public not_in_openmp()
Definition: global.F90:454
real(real64) pure function doptional_default(opt, def)
Definition: global.F90:390
logical pure function looptional_default(opt, def)
Definition: global.F90:430
integer(int32) pure function i8_to_i4_0(ii)
Definition: global.F90:525
character(len= *), parameter, public em_resp_dir
Definition: global.F90:253
character(len=100), public global_alloc_errmsg
Definition: global.F90:247
logical, public in_profiling_mode
Same for profiling mode.
Definition: global.F90:243
integer, public global_alloc_err
Definition: global.F90:245
character(len=80) pure function soptional_default(opt, def)
Definition: global.F90:440
character(len= *), parameter, public td_dir
Definition: global.F90:251
pure integer(int64) function, dimension(lbound(ii, 1, kind=int64):ubound(ii, 1, kind=int64)) i4_to_i8_1(ii)
Definition: global.F90:533
character(len= *), parameter, public static_dir
Definition: global.F90:252
subroutine, public global_init(communicator)
Initialise Octopus.
Definition: global.F90:325
complex(real64) pure function zoptional_default(opt, def)
Definition: global.F90:400
subroutine conf_init(this)
Initialiser for conf_t.
Definition: global.F90:308
character(len= *), parameter, public vdw_dir
Definition: global.F90:257
character(len= *), parameter, public oct_dir
Definition: global.F90:259
integer(int64) pure function bitand48(val1, val2)
Definition: global.F90:477
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
subroutine blacs_init()
Initialize BLACS to enable use of SCALAPACK.
Definition: mpi.F90:301
type(mpi_comm), parameter, public mpi_comm_undefined
used to indicate a communicator has not been initialized
Definition: mpi.F90:136
type(mpi_grp_t), public mpi_world
Definition: mpi.F90:266
subroutine mpi_mod_end()
Finalize MPI, and optionally BLACS.
Definition: mpi.F90:328
subroutine mpi_grp_init(grp, comm)
Initialize MPI group instance.
Definition: mpi.F90:346
subroutine mpi_init_comm(comm)
Wrapper for MPI_COMM_WORLD initialisation.
Definition: mpi.F90:282
Build configuration type.
Definition: global.F90:151
int true(void)