(git:34ef472)
cell_opt_utils.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief contains a functional that calculates the energy and its derivatives
10 !> for the geometry optimizer
11 !> \par History
12 !> 03.2008 - Teodoro Laino [tlaino] - University of Zurich - Cell Optimization
13 ! **************************************************************************************************
15  USE cell_types, ONLY: &
20  USE cp_files, ONLY: close_file,&
21  open_file
27  cp_logger_type,&
28  cp_to_string
29  USE input_constants, ONLY: fix_none,&
30  fix_x,&
31  fix_xy,&
32  fix_xz,&
33  fix_y,&
34  fix_yz,&
35  fix_z
38  enumeration_type
39  USE input_keyword_types, ONLY: keyword_get,&
40  keyword_type
43  section_type,&
44  section_vals_type,&
47  USE kinds, ONLY: default_path_length,&
49  dp
50  USE mathconstants, ONLY: sqrt3
51  USE mathlib, ONLY: angle
52  USE message_passing, ONLY: mp_para_env_type
53 #include "../base/base_uses.f90"
54 
55  IMPLICIT NONE
56  PRIVATE
57 
58  LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
59  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cell_opt_utils'
60 
61  PUBLIC :: get_dg_dh, gopt_new_logger_create, &
64 
65 CONTAINS
66 
67 ! **************************************************************************************************
68 !> \brief creates a new logger used for cell optimization algorithm
69 !> \param new_logger ...
70 !> \param root_section ...
71 !> \param para_env ...
72 !> \param project_name ...
73 !> \param id_run ...
74 !> \author Teodoro Laino [tlaino] - University of Zurich - 03.2008
75 ! **************************************************************************************************
76  SUBROUTINE gopt_new_logger_create(new_logger, root_section, para_env, project_name, &
77  id_run)
78  TYPE(cp_logger_type), POINTER :: new_logger
79  TYPE(section_vals_type), POINTER :: root_section
80  TYPE(mp_para_env_type), POINTER :: para_env
81  CHARACTER(len=default_string_length), INTENT(OUT) :: project_name
82  INTEGER, INTENT(IN) :: id_run
83 
84  CHARACTER(len=default_path_length) :: c_val, input_file_path, output_file_path
85  CHARACTER(len=default_string_length) :: label
86  INTEGER :: i, lp, unit_nr
87  TYPE(cp_logger_type), POINTER :: logger
88  TYPE(enumeration_type), POINTER :: enum
89  TYPE(keyword_type), POINTER :: keyword
90  TYPE(section_type), POINTER :: section
91 
92  NULLIFY (new_logger, logger, enum, keyword, section)
93  logger => cp_get_default_logger()
94 
95  CALL create_global_section(section)
96  keyword => section_get_keyword(section, "RUN_TYPE")
97  CALL keyword_get(keyword, enum=enum)
98  label = trim(enum_i2c(enum, id_run))
99  CALL section_release(section)
100 
101  ! Redirecting output of the sub_calculation to a different file
102  CALL section_vals_val_get(root_section, "GLOBAL%PROJECT_NAME", c_val=project_name)
103  input_file_path = trim(project_name)
104  lp = len_trim(input_file_path)
105  i = logger%iter_info%iteration(logger%iter_info%n_rlevel)
106  input_file_path(lp + 1:len(input_file_path)) = "-"//trim(label)//"-"//adjustl(cp_to_string(i))
107  lp = len_trim(input_file_path)
108  CALL section_vals_val_set(root_section, "GLOBAL%PROJECT_NAME", c_val=input_file_path(1:lp))
109  CALL section_vals_val_set(root_section, "GLOBAL%RUN_TYPE", i_val=id_run)
110 
111  ! Redirecting output into a new file
112  output_file_path = input_file_path(1:lp)//".out"
113  IF (para_env%is_source()) THEN
114  CALL open_file(file_name=output_file_path, file_status="UNKNOWN", &
115  file_action="WRITE", file_position="APPEND", unit_number=unit_nr)
116  ELSE
117  unit_nr = -1
118  END IF
119  CALL cp_logger_create(new_logger, para_env=para_env, default_global_unit_nr=unit_nr, &
120  close_global_unit_on_dealloc=.false.)
121  CALL section_vals_val_get(root_section, "GLOBAL%PROJECT", c_val=c_val)
122  IF (c_val /= "") THEN
123  CALL cp_logger_set(new_logger, local_filename=trim(c_val)//"_localLog")
124  END IF
125  new_logger%iter_info%project_name = c_val
126  CALL section_vals_val_get(root_section, "GLOBAL%PRINT_LEVEL", &
127  i_val=new_logger%iter_info%print_level)
128 
129  END SUBROUTINE gopt_new_logger_create
130 
131 ! **************************************************************************************************
132 !> \brief releases a new logger used for cell optimization algorithm
133 !> \param new_logger ...
134 !> \param root_section ...
135 !> \param para_env ...
136 !> \param project_name ...
137 !> \param id_run ...
138 !> \author Teodoro Laino [tlaino] - University of Zurich - 03.2008
139 ! **************************************************************************************************
140  SUBROUTINE gopt_new_logger_release(new_logger, root_section, para_env, project_name, id_run)
141  TYPE(cp_logger_type), POINTER :: new_logger
142  TYPE(section_vals_type), POINTER :: root_section
143  TYPE(mp_para_env_type), POINTER :: para_env
144  CHARACTER(len=default_string_length), INTENT(IN) :: project_name
145  INTEGER, INTENT(IN) :: id_run
146 
147  INTEGER :: unit_nr
148 
149  IF (para_env%is_source()) THEN
150  unit_nr = cp_logger_get_default_unit_nr(new_logger)
151  CALL close_file(unit_number=unit_nr)
152  END IF
153  CALL cp_logger_release(new_logger)
154  CALL section_vals_val_set(root_section, "GLOBAL%RUN_TYPE", i_val=id_run)
155  CALL section_vals_val_set(root_section, "GLOBAL%PROJECT_NAME", c_val=project_name)
156 
157  END SUBROUTINE gopt_new_logger_release
158 
159 ! **************************************************************************************************
160 !> \brief Reads the external pressure tensor
161 !> \param geo_section ...
162 !> \param cell ...
163 !> \param pres_ext ...
164 !> \param mtrx ...
165 !> \param rot ...
166 !> \author Teodoro Laino [tlaino] - University of Zurich - 03.2008
167 ! **************************************************************************************************
168  SUBROUTINE read_external_press_tensor(geo_section, cell, pres_ext, mtrx, rot)
169  TYPE(section_vals_type), POINTER :: geo_section
170  TYPE(cell_type), POINTER :: cell
171  REAL(kind=dp), INTENT(OUT) :: pres_ext
172  REAL(kind=dp), DIMENSION(3, 3), INTENT(OUT) :: mtrx
173  REAL(kind=dp), DIMENSION(3, 3), INTENT(IN) :: rot
174 
175  INTEGER :: i, ind, j
176  LOGICAL :: check
177  REAL(kind=dp), DIMENSION(3, 3) :: pres_ext_tens
178  REAL(kind=dp), DIMENSION(:), POINTER :: pvals
179 
180  NULLIFY (pvals)
181  mtrx = 0.0_dp
182  pres_ext_tens = 0.0_dp
183  pres_ext = 0.0_dp
184  CALL section_vals_val_get(geo_section, "EXTERNAL_PRESSURE", r_vals=pvals)
185  check = (SIZE(pvals) == 1) .OR. (SIZE(pvals) == 9)
186  IF (.NOT. check) &
187  cpabort("EXTERNAL_PRESSURE can have 1 or 9 components only!")
188 
189  IF (SIZE(pvals) == 9) THEN
190  ind = 0
191  DO i = 1, 3
192  DO j = 1, 3
193  ind = ind + 1
194  pres_ext_tens(j, i) = pvals(ind)
195  END DO
196  END DO
197  ! Also the pressure tensor must be oriented in the same canonical directions
198  ! of the simulation cell
199  pres_ext_tens = matmul(transpose(rot), pres_ext_tens)
200  DO i = 1, 3
201  pres_ext = pres_ext + pres_ext_tens(i, i)
202  END DO
203  pres_ext = pres_ext/3.0_dp
204  DO i = 1, 3
205  pres_ext_tens(i, i) = pres_ext_tens(i, i) - pres_ext
206  END DO
207  ELSE
208  pres_ext = pvals(1)
209  END IF
210 
211  IF (any(pres_ext_tens > 1.0e-5_dp)) THEN
212  mtrx = cell%deth*matmul(cell%h_inv, matmul(pres_ext_tens, transpose(cell%h_inv)))
213  END IF
214 
215  END SUBROUTINE read_external_press_tensor
216 
217 ! **************************************************************************************************
218 !> \brief Computes the derivatives for the cell
219 !> \param gradient ...
220 !> \param av_ptens ...
221 !> \param pres_ext ...
222 !> \param cell ...
223 !> \param mtrx ...
224 !> \param keep_angles ...
225 !> \param keep_symmetry ...
226 !> \param pres_int ...
227 !> \param pres_constr ...
228 !> \param constraint_id ...
229 !> \author Teodoro Laino [tlaino] - University of Zurich - 03.2008
230 ! **************************************************************************************************
231  SUBROUTINE get_dg_dh(gradient, av_ptens, pres_ext, cell, mtrx, keep_angles, &
232  keep_symmetry, pres_int, pres_constr, constraint_id)
233 
234  REAL(kind=dp), DIMENSION(:), POINTER :: gradient
235  REAL(kind=dp), DIMENSION(3, 3), INTENT(IN) :: av_ptens
236  REAL(kind=dp), INTENT(IN) :: pres_ext
237  TYPE(cell_type), POINTER :: cell
238  REAL(kind=dp), DIMENSION(3, 3), INTENT(IN) :: mtrx
239  LOGICAL, INTENT(IN), OPTIONAL :: keep_angles, keep_symmetry
240  REAL(kind=dp), INTENT(OUT) :: pres_int, pres_constr
241  INTEGER, INTENT(IN), OPTIONAL :: constraint_id
242 
243  INTEGER :: i, my_constraint_id
244  LOGICAL :: my_keep_angles, my_keep_symmetry
245  REAL(kind=dp), DIMENSION(3, 3) :: correction, pten_hinv_old, ptens
246 
247  my_keep_angles = .false.
248  IF (PRESENT(keep_angles)) my_keep_angles = keep_angles
249  my_keep_symmetry = .false.
250  IF (PRESENT(keep_symmetry)) my_keep_symmetry = keep_symmetry
251  gradient = 0.0_dp
252  IF (PRESENT(constraint_id)) THEN
253  my_constraint_id = constraint_id
254  ELSE
255  my_constraint_id = fix_none
256  END IF
257 
258  gradient = 0.0_dp
259 
260  ptens = av_ptens
261 
262  ! Evaluating the internal pressure
263  pres_int = 0.0_dp
264  DO i = 1, 3
265  pres_int = pres_int + ptens(i, i)
266  END DO
267  pres_int = pres_int/3.0_dp
268 
269  SELECT CASE (my_constraint_id)
270  CASE (fix_x)
271  pres_constr = ptens(2, 2) + ptens(3, 3)
272  CASE (fix_y)
273  pres_constr = ptens(1, 1) + ptens(3, 3)
274  CASE (fix_z)
275  pres_constr = ptens(1, 1) + ptens(2, 2)
276  CASE (fix_xy)
277  pres_constr = ptens(3, 3)
278  CASE (fix_xz)
279  pres_constr = ptens(2, 2)
280  CASE (fix_yz)
281  pres_constr = ptens(1, 1)
282  CASE (fix_none)
283  pres_constr = ptens(1, 1) + ptens(2, 2) + ptens(3, 3)
284  END SELECT
285  pres_constr = pres_constr/3.0_dp
286 
287  ptens(1, 1) = av_ptens(1, 1) - pres_ext
288  ptens(2, 2) = av_ptens(2, 2) - pres_ext
289  ptens(3, 3) = av_ptens(3, 3) - pres_ext
290 
291  pten_hinv_old = cell%deth*matmul(cell%h_inv, ptens)
292  correction = matmul(mtrx, cell%hmat)
293 
294  gradient(1) = pten_hinv_old(1, 1) - correction(1, 1)
295  gradient(2) = pten_hinv_old(2, 1) - correction(2, 1)
296  gradient(3) = pten_hinv_old(2, 2) - correction(2, 2)
297  gradient(4) = pten_hinv_old(3, 1) - correction(3, 1)
298  gradient(5) = pten_hinv_old(3, 2) - correction(3, 2)
299  gradient(6) = pten_hinv_old(3, 3) - correction(3, 3)
300 
301  CALL apply_cell_constraints(gradient, cell, my_keep_angles, my_keep_symmetry, my_constraint_id)
302 
303  gradient = -gradient
304 
305  END SUBROUTINE get_dg_dh
306 
307 ! **************************************************************************************************
308 !> \brief Apply cell constraints
309 !> \param gradient ...
310 !> \param cell ...
311 !> \param keep_angles ...
312 !> \param keep_symmetry ...
313 !> \param constraint_id ...
314 !> \author Matthias Krack (October 26, 2017, MK)
315 ! **************************************************************************************************
316  SUBROUTINE apply_cell_constraints(gradient, cell, keep_angles, keep_symmetry, constraint_id)
317 
318  REAL(kind=dp), DIMENSION(:), POINTER :: gradient
319  TYPE(cell_type), POINTER :: cell
320  LOGICAL, INTENT(IN) :: keep_angles, keep_symmetry
321  INTEGER, INTENT(IN) :: constraint_id
322 
323  REAL(kind=dp) :: a, a_length, ab_length, b_length, cosa, &
324  cosah, cosg, deriv_gamma, g, gamma, &
325  norm, norm_b, norm_c, sina, sinah, sing
326 
327  IF (keep_angles) THEN
328  ! If we want to keep the angles constant we have to project out the
329  ! components of the cell angles
330  norm_b = dot_product(cell%hmat(:, 2), cell%hmat(:, 2))
331  norm = dot_product(cell%hmat(1:2, 2), gradient(2:3))
332  gradient(2:3) = cell%hmat(1:2, 2)/norm_b*norm
333  norm_c = dot_product(cell%hmat(:, 3), cell%hmat(:, 3))
334  norm = dot_product(cell%hmat(1:3, 3), gradient(4:6))
335  gradient(4:6) = cell%hmat(1:3, 3)/norm_c*norm
336  ! Retain an exact orthorhombic cell
337  ! (off-diagonal elements must remain zero identically to keep QS fast)
338  IF (cell%orthorhombic) THEN
339  gradient(2) = 0.0_dp
340  gradient(4) = 0.0_dp
341  gradient(5) = 0.0_dp
342  END IF
343  END IF
344 
345  IF (keep_symmetry) THEN
346  SELECT CASE (cell%symmetry_id)
347  CASE (cell_sym_cubic, &
352  SELECT CASE (cell%symmetry_id)
353  CASE (cell_sym_cubic)
354  g = (gradient(1) + gradient(3) + gradient(6))/3.0_dp
355  gradient(1) = g
356  gradient(3) = g
357  gradient(6) = g
358  CASE (cell_sym_tetragonal_ab, &
361  SELECT CASE (cell%symmetry_id)
363  g = 0.5_dp*(gradient(1) + gradient(3))
364  gradient(1) = g
365  gradient(3) = g
367  g = 0.5_dp*(gradient(1) + gradient(6))
368  gradient(1) = g
369  gradient(6) = g
371  g = 0.5_dp*(gradient(3) + gradient(6))
372  gradient(3) = g
373  gradient(6) = g
374  END SELECT
375  CASE (cell_sym_orthorhombic)
376  ! Nothing else to do
377  END SELECT
378  gradient(2) = 0.0_dp
379  gradient(4) = 0.0_dp
380  gradient(5) = 0.0_dp
382  g = 0.5_dp*(gradient(1) + 0.5_dp*(gradient(2) + sqrt3*gradient(3)))
383  gradient(1) = g
384  gradient(2) = 0.5_dp*g
385  gradient(3) = sqrt3*gradient(2)
386  gradient(4) = 0.0_dp
387  gradient(5) = 0.0_dp
389  g = 0.5_dp*(gradient(1) - 0.5_dp*(gradient(2) - sqrt3*gradient(3)))
390  gradient(1) = g
391  gradient(2) = -0.5_dp*g
392  gradient(3) = -sqrt3*gradient(2)
393  gradient(4) = 0.0_dp
394  gradient(5) = 0.0_dp
395  CASE (cell_sym_rhombohedral)
396  a = (angle(cell%hmat(:, 3), cell%hmat(:, 2)) + &
397  angle(cell%hmat(:, 1), cell%hmat(:, 3)) + &
398  angle(cell%hmat(:, 1), cell%hmat(:, 2)))/3.0_dp
399  cosa = cos(a)
400  sina = sin(a)
401  cosah = cos(0.5_dp*a)
402  sinah = sin(0.5_dp*a)
403  norm = cosa/cosah
404  norm_c = sqrt(1.0_dp - norm*norm)
405  g = (gradient(1) + gradient(2)*cosa + gradient(3)*sina + &
406  gradient(4)*cosah*norm + gradient(5)*sinah*norm + gradient(6)*norm_c)/3.0_dp
407  gradient(1) = g
408  gradient(2) = g*cosa
409  gradient(3) = g*sina
410  gradient(4) = g*cosah*norm
411  gradient(5) = g*sinah*norm
412  gradient(6) = g*norm_c
413  CASE (cell_sym_monoclinic)
414  gradient(2) = 0.0_dp
415  gradient(5) = 0.0_dp
417  ! Cell symmetry with a = b, alpha = beta = 90 degree and gammma not equal 90 degree
418  a_length = sqrt(cell%hmat(1, 1)*cell%hmat(1, 1) + &
419  cell%hmat(2, 1)*cell%hmat(2, 1) + &
420  cell%hmat(3, 1)*cell%hmat(3, 1))
421  b_length = sqrt(cell%hmat(1, 2)*cell%hmat(1, 2) + &
422  cell%hmat(2, 2)*cell%hmat(2, 2) + &
423  cell%hmat(3, 2)*cell%hmat(3, 2))
424  ab_length = 0.5_dp*(a_length + b_length)
425  gamma = angle(cell%hmat(:, 1), cell%hmat(:, 2))
426  cosg = cos(gamma)
427  sing = sin(gamma)
428  ! Here, g is the average derivative of the cell vector length ab_length, and deriv_gamma is the derivative of the angle gamma
429  g = 0.5_dp*(gradient(1) + cosg*gradient(2) + sing*gradient(3))
430  deriv_gamma = (gradient(3)*cosg - gradient(2)*sing)/b_length
431  gradient(1) = g
432  gradient(2) = g*cosg - ab_length*sing*deriv_gamma
433  gradient(3) = g*sing + ab_length*cosg*deriv_gamma
434  gradient(4) = 0.0_dp
435  gradient(5) = 0.0_dp
436  CASE (cell_sym_triclinic)
437  ! Nothing to do
438  END SELECT
439  END IF
440 
441  SELECT CASE (constraint_id)
442  CASE (fix_x)
443  gradient(1:2) = 0.0_dp
444  gradient(4) = 0.0_dp
445  CASE (fix_y)
446  gradient(2:3) = 0.0_dp
447  gradient(5) = 0.0_dp
448  CASE (fix_z)
449  gradient(4:6) = 0.0_dp
450  CASE (fix_xy)
451  gradient(1:5) = 0.0_dp
452  CASE (fix_xz)
453  gradient(1:2) = 0.0_dp
454  gradient(4:6) = 0.0_dp
455  CASE (fix_yz)
456  gradient(2:6) = 0.0_dp
457  CASE (fix_none)
458  ! Nothing to do
459  END SELECT
460 
461  END SUBROUTINE apply_cell_constraints
462 
463 END MODULE cell_opt_utils
contains a functional that calculates the energy and its derivatives for the geometry optimizer
subroutine, public apply_cell_constraints(gradient, cell, keep_angles, keep_symmetry, constraint_id)
Apply cell constraints.
subroutine, public get_dg_dh(gradient, av_ptens, pres_ext, cell, mtrx, keep_angles, keep_symmetry, pres_int, pres_constr, constraint_id)
Computes the derivatives for the cell.
subroutine, public read_external_press_tensor(geo_section, cell, pres_ext, mtrx, rot)
Reads the external pressure tensor.
subroutine, public gopt_new_logger_release(new_logger, root_section, para_env, project_name, id_run)
releases a new logger used for cell optimization algorithm
subroutine, public gopt_new_logger_create(new_logger, root_section, para_env, project_name, id_run)
creates a new logger used for cell optimization algorithm
Handles all functions related to the CELL.
Definition: cell_types.F:15
integer, parameter, public cell_sym_monoclinic
Definition: cell_types.F:29
integer, parameter, public cell_sym_triclinic
Definition: cell_types.F:29
integer, parameter, public cell_sym_tetragonal_ab
Definition: cell_types.F:29
integer, parameter, public cell_sym_rhombohedral
Definition: cell_types.F:29
integer, parameter, public cell_sym_tetragonal_ac
Definition: cell_types.F:29
integer, parameter, public cell_sym_hexagonal_gamma_60
Definition: cell_types.F:29
integer, parameter, public cell_sym_orthorhombic
Definition: cell_types.F:29
integer, parameter, public cell_sym_hexagonal_gamma_120
Definition: cell_types.F:29
integer, parameter, public cell_sym_monoclinic_gamma_ab
Definition: cell_types.F:29
integer, parameter, public cell_sym_cubic
Definition: cell_types.F:29
integer, parameter, public cell_sym_tetragonal_bc
Definition: cell_types.F:29
Utility routines to open and close files. Tracking of preconnections.
Definition: cp_files.F:16
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
Definition: cp_files.F:308
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
Definition: cp_files.F:119
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
subroutine, public cp_logger_set(logger, local_filename, global_filename)
sets various attributes of the given logger
subroutine, public cp_logger_release(logger)
releases this logger
subroutine, public cp_logger_create(logger, para_env, print_level, default_global_unit_nr, default_local_unit_nr, global_filename, local_filename, close_global_unit_on_dealloc, iter_info, close_local_unit_on_dealloc, suffix, template_logger)
initializes a logger
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
Definition: gamma.F:15
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public fix_xz
integer, parameter, public fix_y
integer, parameter, public fix_none
integer, parameter, public fix_z
integer, parameter, public fix_xy
integer, parameter, public fix_yz
integer, parameter, public fix_x
builds the global input section for cp2k
subroutine, public create_global_section(section)
section to hold global settings for the whole program
represents an enumeration, i.e. a mapping between integers and strings
character(len=default_string_length) function, public enum_i2c(enum, i)
maps an integer to a string
represents keywords in an input
subroutine, public keyword_get(keyword, names, usage, description, type_of_var, n_var, default_value, lone_keyword_value, repeats, enum, citations)
...
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_set(section_vals, keyword_name, i_rep_section, i_rep_val, val, l_val, i_val, r_val, c_val, l_vals_ptr, i_vals_ptr, r_vals_ptr, c_vals_ptr)
sets the requested value
recursive subroutine, public section_release(section)
releases the given keyword list (see doc/ReferenceCounting.html)
recursive type(keyword_type) function, pointer, public section_get_keyword(section, keyword_name)
returns the requested keyword
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
integer, parameter, public default_string_length
Definition: kinds.F:57
integer, parameter, public default_path_length
Definition: kinds.F:58
Definition of mathematical constants and functions.
Definition: mathconstants.F:16
real(kind=dp), parameter, public sqrt3
Collection of simple mathematical functions and subroutines.
Definition: mathlib.F:15
pure real(kind=dp) function, public angle(a, b)
Calculation of the angle between the vectors a and b. The angle is returned in radians.
Definition: mathlib.F:175
Interface to the message passing library MPI.