49#include "./base/base_uses.f90"
57 CHARACTER(LEN=default_path_length) :: optimize_file_name =
""
59 CHARACTER(LEN=default_path_length) :: ref_traj_file_name =
""
60 CHARACTER(LEN=default_path_length) :: ref_force_file_name =
""
61 CHARACTER(LEN=default_path_length) :: ref_cell_file_name =
""
63 INTEGER :: group_size = -1
65 REAL(KIND=
dp) :: energy_weight = -1.0_dp
66 REAL(KIND=
dp) :: shift_mm = -1.0_dp
67 REAL(KIND=
dp) :: shift_qm = -1.0_dp
68 LOGICAL :: shift_average = .false.
69 INTEGER :: frame_start = -1, frame_stop = -1, frame_stride = -1, frame_count = -1
73 CHARACTER(LEN=default_string_length) :: label =
""
74 REAL(KIND=
dp) ::
value = -1.0_dp
75 LOGICAL :: fixed = .false.
79 INTEGER :: method = -1
81 CHARACTER(LEN=default_path_length) :: project_name =
""
82 TYPE(fm_env_type) :: fm_env = fm_env_type()
83 TYPE(variable_type),
DIMENSION(:),
ALLOCATABLE :: variables
84 REAL(KIND=
dp) :: rhobeg = -1.0_dp, rhoend = -1.0_dp
85 INTEGER :: maxfun = -1
86 INTEGER :: iter_start_val = -1
87 REAL(KIND=
dp) :: randomize_variables = -1.0_dp
88 REAL(KIND=
dp) :: start_time = -1.0_dp, target_time = -1.0_dp
91 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'optimize_input'
107 CHARACTER(len=*),
PARAMETER :: routinen =
'run_optimize_input'
109 INTEGER :: handle, i_var
110 REAL(kind=
dp) :: random_number, seed(3, 2)
111 TYPE(oi_env_type) :: oi_env
114 CALL timeset(routinen, handle)
118 CALL parse_input(oi_env, root_section)
121 IF (oi_env%randomize_variables .NE. 0.0_dp)
THEN
122 seed = real(oi_env%seed, kind=
dp)
124 DO i_var = 1,
SIZE(oi_env%variables, 1)
125 IF (.NOT. oi_env%variables(i_var)%fixed)
THEN
127 random_number = rng_stream%next()
128 oi_env%variables(i_var)%value = oi_env%variables(i_var)%value* &
129 (1.0_dp + (2*random_number - 1.0_dp)*oi_env%randomize_variables/100.0_dp)
135 SELECT CASE (oi_env%method)
137 CALL force_matching(oi_env, input_declaration, root_section, para_env)
142 CALL timestop(handle)
154 SUBROUTINE force_matching(oi_env, input_declaration, root_section, para_env)
155 TYPE(oi_env_type) :: oi_env
160 CHARACTER(len=*),
PARAMETER :: routinen =
'force_matching'
162 CHARACTER(len=default_path_length) :: input_path, output_path
163 CHARACTER(len=default_string_length), &
164 ALLOCATABLE,
DIMENSION(:, :) :: initial_variables
165 INTEGER :: color, energies_unit, handle, history_unit, i_atom, i_el, i_frame, i_free_var, &
166 i_var, ierr, mepos_master, mepos_minion, n_atom, n_el, n_frames, n_free_var, n_groups, &
167 n_var, new_env_id, num_pe_master, output_unit, restart_unit, state
168 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: free_var_index
169 INTEGER,
DIMENSION(:),
POINTER :: group_distribution
170 LOGICAL :: should_stop
171 REAL(kind=
dp) :: e1, e2, e3, e4, e_pot, energy_weight, &
172 re, rf, shift_mm, shift_qm, t1, t2, &
174 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: force, free_vars, pos
175 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy_traj, energy_traj_read, energy_var
176 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: cell_traj, cell_traj_read, force_traj, &
177 force_traj_read, force_var, pos_traj, &
180 TYPE(
mp_comm_type) :: mpi_comm_master, mpi_comm_minion, &
181 mpi_comm_minion_primus
185 CALL timeset(routinen, handle)
191 IF (output_unit > 0)
THEN
192 WRITE (output_unit,
'(T2,A)')
'FORCE_MATCHING| good morning....'
197 NULLIFY (cell_traj_read, force_traj_read, pos_traj_read, energy_traj_read)
198 CALL read_reference_data(oi_env, para_env, force_traj_read, pos_traj_read, energy_traj_read, cell_traj_read)
199 n_atom =
SIZE(pos_traj_read, 2)
202 IF (oi_env%fm_env%frame_stop < 0) oi_env%fm_env%frame_stop =
SIZE(pos_traj_read, 3)
204 IF (oi_env%fm_env%frame_count > 0)
THEN
205 oi_env%fm_env%frame_stride = (oi_env%fm_env%frame_stop - oi_env%fm_env%frame_start + 1 + &
206 oi_env%fm_env%frame_count - 1)/(oi_env%fm_env%frame_count)
208 n_frames = (oi_env%fm_env%frame_stop - oi_env%fm_env%frame_start + oi_env%fm_env%frame_stride)/oi_env%fm_env%frame_stride
210 ALLOCATE (force_traj(3, n_atom, n_frames), pos_traj(3, n_atom, n_frames), energy_traj(n_frames))
211 IF (
ASSOCIATED(cell_traj_read))
ALLOCATE (cell_traj(3, 3, n_frames))
214 DO i_frame = oi_env%fm_env%frame_start, oi_env%fm_env%frame_stop, oi_env%fm_env%frame_stride
215 n_frames = n_frames + 1
216 force_traj(:, :, n_frames) = force_traj_read(:, :, i_frame)
217 pos_traj(:, :, n_frames) = pos_traj_read(:, :, i_frame)
218 energy_traj(n_frames) = energy_traj_read(i_frame)
219 IF (
ASSOCIATED(cell_traj)) cell_traj(:, :, n_frames) = cell_traj_read(:, :, i_frame)
221 DEALLOCATE (force_traj_read, pos_traj_read, energy_traj_read)
222 IF (
ASSOCIATED(cell_traj_read))
DEALLOCATE (cell_traj_read)
225 ALLOCATE (pos(n_el), force(n_el))
226 ALLOCATE (energy_var(n_frames), force_var(3, n_atom, n_frames))
229 mpi_comm_master = para_env
230 num_pe_master = para_env%num_pe
231 mepos_master = para_env%mepos
232 ALLOCATE (group_distribution(0:num_pe_master - 1))
233 IF (oi_env%fm_env%group_size > para_env%num_pe) oi_env%fm_env%group_size = para_env%num_pe
235 CALL mpi_comm_minion%from_split(mpi_comm_master, n_groups, group_distribution, subgroup_min_size=oi_env%fm_env%group_size)
236 mepos_minion = mpi_comm_minion%mepos
238 IF (mepos_minion == 0) color = 1
239 CALL mpi_comm_minion_primus%from_split(mpi_comm_master, color)
242 n_var =
SIZE(oi_env%variables, 1)
243 ALLOCATE (initial_variables(2, n_var))
246 initial_variables(1, i_var) = oi_env%variables(i_var)%label
247 WRITE (initial_variables(2, i_var), *) oi_env%variables(i_var)%value
248 IF (.NOT. oi_env%variables(i_var)%fixed) n_free_var = n_free_var + 1
250 ALLOCATE (free_vars(n_free_var), free_var_index(n_free_var))
253 IF (.NOT. oi_env%variables(i_var)%fixed)
THEN
254 i_free_var = i_free_var + 1
255 free_var_index(i_free_var) = i_var
256 free_vars(i_free_var) = oi_env%variables(free_var_index(i_free_var))%value
261 input_path = oi_env%fm_env%optimize_file_name
262 WRITE (output_path,
'(A,I0,A)') trim(oi_env%project_name)//
"-worker-", group_distribution(mepos_master),
".out"
265 energy_weight = oi_env%fm_env%energy_weight
266 shift_mm = oi_env%fm_env%shift_mm
267 shift_qm = oi_env%fm_env%shift_qm
269 IF (para_env%is_source())
THEN
271 ostate%nvar = n_free_var
272 ostate%rhoend = oi_env%rhoend
273 ostate%rhobeg = oi_env%rhobeg
274 ostate%maxfun = oi_env%maxfun
276 ostate%unit = output_unit
280 IF (output_unit > 0)
THEN
281 WRITE (output_unit,
'(T2,A,T60,I20)')
'FORCE_MATCHING| number of atoms per frame ', n_atom
282 WRITE (output_unit,
'(T2,A,T60,I20)')
'FORCE_MATCHING| number of frames ', n_frames
283 WRITE (output_unit,
'(T2,A,T60,I20)')
'FORCE_MATCHING| number of parallel groups ', n_groups
284 WRITE (output_unit,
'(T2,A,T60,I20)')
'FORCE_MATCHING| number of variables ', n_var
285 WRITE (output_unit,
'(T2,A,T60,I20)')
'FORCE_MATCHING| number of free variables ', n_free_var
286 WRITE (output_unit,
'(T2,A,A)')
'FORCE_MATCHING| optimize file name ', trim(input_path)
287 WRITE (output_unit,
'(T2,A,T60,F20.12)')
'FORCE_MATCHING| accuracy', ostate%rhoend
288 WRITE (output_unit,
'(T2,A,T60,F20.12)')
'FORCE_MATCHING| step size', ostate%rhobeg
289 WRITE (output_unit,
'(T2,A,T60,I20)')
'FORCE_MATCHING| max function evaluation', ostate%maxfun
290 WRITE (output_unit,
'(T2,A,T60,L20)')
'FORCE_MATCHING| shift average', oi_env%fm_env%shift_average
291 WRITE (output_unit,
'(T2,A)')
'FORCE_MATCHING| initial values:'
293 WRITE (output_unit,
'(T2,A,1X,E28.16)') trim(oi_env%variables(i_var)%label), oi_env%variables(i_var)%value
295 WRITE (output_unit,
'(T2,A)')
'FORCE_MATCHING| switching to POWELL optimization of the free parameters'
296 WRITE (output_unit,
'()')
297 WRITE (output_unit,
'(T2,A20,A20,A11,A11)')
'iteration number',
'function value',
'time',
'time Force'
306 IF (para_env%is_source()) state = ostate%state
307 CALL para_env%bcast(state)
312 CALL cp_iterate(logger%iter_info, last=.false.)
315 DO i_free_var = 1, n_free_var
316 WRITE (initial_variables(2, free_var_index(i_free_var)), *) free_vars(i_free_var)
317 oi_env%variables(free_var_index(i_free_var))%value = free_vars(i_free_var)
321 CALL create_force_env(new_env_id=new_env_id, input_declaration=input_declaration, &
322 input_path=input_path, output_path=output_path, &
323 mpi_comm=mpi_comm_minion, initial_variables=initial_variables, ierr=ierr)
331 DO i_frame = group_distribution(mepos_master) + 1, n_frames, n_groups
334 IF (
ASSOCIATED(cell_traj))
THEN
335 CALL set_cell(env_id=new_env_id, new_cell=cell_traj(:, :, i_frame), ierr=ierr)
340 DO i_atom = 1, n_atom
341 pos(i_el + 1) = pos_traj(1, i_atom, i_frame)
342 pos(i_el + 2) = pos_traj(2, i_atom, i_frame)
343 pos(i_el + 3) = pos_traj(3, i_atom, i_frame)
349 CALL calc_force(env_id=new_env_id, pos=pos, n_el_pos=n_el, e_pot=e_pot, force=force, n_el_force=n_el, ierr=ierr)
354 energy_var(i_frame) = e_pot
356 DO i_atom = 1, n_atom
357 force_var(1, i_atom, i_frame) = force(i_el + 1)
358 force_var(2, i_atom, i_frame) = force(i_el + 2)
359 force_var(3, i_atom, i_frame) = force(i_el + 3)
370 IF (mepos_minion == 0)
THEN
371 CALL mpi_comm_minion_primus%sum(energy_var)
372 CALL mpi_comm_minion_primus%sum(force_var)
376 IF (para_env%is_source())
THEN
377 rf = sqrt(sum((force_var - force_traj)**2)/(real(n_frames, kind=
dp)*real(n_atom, kind=
dp)))
378 IF (oi_env%fm_env%shift_average)
THEN
379 shift_mm = sum(energy_var)/n_frames
380 shift_qm = sum(energy_traj)/n_frames
382 re = sqrt(sum(((energy_var - shift_mm) - (energy_traj - shift_qm))**2)/n_frames)
383 ostate%f = energy_weight*re + rf
385 WRITE (output_unit,
'(T2,I20,F20.12,F11.3,F11.3)') oi_env%iter_start_val + ostate%nf, ostate%f, t2 - t1, t5
393 IF (history_unit > 0)
THEN
394 WRITE (unit=history_unit, fmt=
"(I20,F20.12,1000F20.12)") oi_env%iter_start_val + ostate%nf, ostate%f, free_vars
399 energies_unit =
cp_print_key_unit_nr(logger, root_section,
"OPTIMIZE_INPUT%FORCE_MATCHING%COMPARE_ENERGIES", &
400 file_position=
"REWIND", extension=
".dat")
401 IF (energies_unit > 0)
THEN
402 WRITE (unit=energies_unit, fmt=
"(A20,A20,A20,A20)")
"#frame",
"ref",
"fit",
"diff"
403 DO i_frame = 1, n_frames
404 e1 = energy_traj(i_frame) - shift_qm
405 e2 = energy_var(i_frame) - shift_mm
406 WRITE (unit=energies_unit, fmt=
"(I20,F20.12,F20.12,F20.12)") i_frame, e1, e2, e1 - e2
412 energies_unit =
cp_print_key_unit_nr(logger, root_section,
"OPTIMIZE_INPUT%FORCE_MATCHING%COMPARE_FORCES", &
413 file_position=
"REWIND", extension=
".dat")
414 IF (energies_unit > 0)
THEN
415 WRITE (unit=energies_unit, fmt=
"(A20,A20,A20,A20)")
"#frame",
"normalized diff",
"diff",
"ref",
"ref sum"
416 DO i_frame = 1, n_frames
417 e1 = sqrt(sum((force_var(:, :, i_frame) - force_traj(:, :, i_frame))**2))
418 e2 = sqrt(sum((force_traj(:, :, i_frame))**2))
419 e3 = sqrt(sum(sum(force_traj(:, :, i_frame), dim=2)**2))
420 e4 = sqrt(sum(sum(force_var(:, :, i_frame), dim=2)**2))
421 WRITE (unit=energies_unit, fmt=
"(I20,F20.12,F20.12,F20.12,2F20.12)") i_frame, e1/e2, e1, e2, e3, e4
427 restart_unit =
cp_print_key_unit_nr(logger, root_section,
"OPTIMIZE_INPUT%RESTART", extension=
".restart", &
428 file_position=
"REWIND", do_backup=.true.)
429 IF (restart_unit > 0)
THEN
431 CALL section_vals_val_set(oi_section,
"ITER_START_VAL", i_val=oi_env%iter_start_val + ostate%nf)
433 DO i_free_var = 1, n_free_var
434 CALL section_vals_val_set(variable_section,
"VALUE", i_rep_section=free_var_index(i_free_var), &
435 r_val=free_vars(i_free_var))
444 IF (state == -1)
EXIT
446 CALL external_control(should_stop,
"OPTIMIZE_INPUT", target_time=oi_env%target_time, start_time=oi_env%start_time)
448 IF (should_stop)
EXIT
451 IF (para_env%is_source())
THEN
454 CALL para_env%bcast(free_vars)
459 IF (para_env%is_source())
THEN
463 CALL para_env%bcast(free_vars)
464 DO i_free_var = 1, n_free_var
465 WRITE (initial_variables(2, free_var_index(i_free_var)), *) free_vars(i_free_var)
466 oi_env%variables(free_var_index(i_free_var))%value = free_vars(i_free_var)
468 IF (para_env%is_source())
THEN
469 WRITE (output_unit,
'(T2,A)')
''
470 WRITE (output_unit,
'(T2,A,T60,F20.12)')
'FORCE_MATCHING| optimal function value found so far:', ostate%fopt
471 WRITE (output_unit,
'(T2,A)')
'FORCE_MATCHING| optimal variables found so far:'
473 WRITE (output_unit,
'(T2,A,1X,E28.16)') trim(oi_env%variables(i_var)%label), oi_env%variables(i_var)%value
480 IF (
ASSOCIATED(cell_traj))
DEALLOCATE (cell_traj)
481 DEALLOCATE (pos, force, force_traj, pos_traj, force_var)
482 DEALLOCATE (group_distribution, energy_traj, energy_var)
483 CALL mpi_comm_minion%free()
484 CALL mpi_comm_minion_primus%free()
486 CALL timestop(handle)
488 END SUBROUTINE force_matching
500 SUBROUTINE read_reference_data(oi_env, para_env, force_traj, pos_traj, energy_traj, cell_traj)
501 TYPE(oi_env_type) :: oi_env
503 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: force_traj, pos_traj
504 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energy_traj
505 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: cell_traj
507 CHARACTER(len=*),
PARAMETER :: routinen =
'read_reference_data'
509 CHARACTER(len=default_path_length) :: filename
510 CHARACTER(len=default_string_length) :: aa
511 INTEGER :: cell_itimes, handle, i, iframe, &
512 n_frames, n_frames_current, nread, &
514 LOGICAL :: at_end, test_ok
515 REAL(kind=
dp) :: cell_time, trj_epot, trj_time, vec(3), &
519 CALL timeset(routinen, handle)
526 NULLIFY (pos_traj, energy_traj, force_traj)
527 filename = oi_env%fm_env%ref_traj_file_name
528 IF (filename .EQ.
"") &
529 cpabort(
"The reference trajectory file name is empty")
530 CALL parser_create(local_parser, filename, para_env=para_env)
534 READ (local_parser%input_line, fmt=
"(I8)") nread
535 n_frames = n_frames + 1
537 IF (n_frames > n_frames_current)
THEN
538 n_frames_current = 5*(n_frames_current + 10)/3
539 CALL reallocate(pos_traj, 1, 3, 1, nread, 1, n_frames_current)
548 READ (local_parser%input_line(1:len_trim(local_parser%input_line)), *) aa, vec
549 pos_traj(:, i, n_frames) = vec*
bohr
555 n_frames_current = n_frames
556 CALL reallocate(energy_traj, 1, n_frames_current)
557 CALL reallocate(force_traj, 1, 3, 1, nread, 1, n_frames_current)
558 CALL reallocate(pos_traj, 1, 3, 1, nread, 1, n_frames_current)
561 filename = oi_env%fm_env%ref_force_file_name
562 IF (filename .EQ.
"") &
563 cpabort(
"The reference force file name is empty")
564 CALL parser_create(local_parser, filename, para_env=para_env)
565 DO iframe = 1, n_frames
567 READ (local_parser%input_line, fmt=
"(I8)") nread
572 READ (local_parser%input_line, fmt=
"(T6,I8,T23,F12.3,T41,F20.10)", err=999) trj_itimes, trj_time, trj_epot
575 IF (.NOT. test_ok)
THEN
576 cpabort(
"Could not parse the title line of the trajectory file")
578 energy_traj(iframe) = trj_epot
583 READ (local_parser%input_line(1:len_trim(local_parser%input_line)), *) aa, vec
584 force_traj(:, i, iframe) = vec
591 filename = oi_env%fm_env%ref_cell_file_name
592 IF (filename .NE.
"")
THEN
593 CALL parser_create(local_parser, filename, para_env=para_env)
594 ALLOCATE (cell_traj(3, 3, n_frames))
595 DO iframe = 1, n_frames
597 CALL parse_cell_line(local_parser%input_line, cell_itimes, cell_time, cell_traj(:, :, iframe), vol)
602 CALL timestop(handle)
604 END SUBROUTINE read_reference_data
612 SUBROUTINE parse_input(oi_env, root_section)
613 TYPE(oi_env_type) :: oi_env
616 CHARACTER(len=*),
PARAMETER :: routinen =
'parse_input'
618 INTEGER :: handle, ivar, n_var
622 CALL timeset(routinen, handle)
627 walltime=oi_env%target_time)
638 CALL section_vals_get(variable_section, explicit=explicit, n_repetition=n_var)
640 ALLOCATE (oi_env%variables(1:n_var))
643 r_val=oi_env%variables(ivar)%value)
645 l_val=oi_env%variables(ivar)%fixed)
647 c_val=oi_env%variables(ivar)%label)
652 SELECT CASE (oi_env%method)
655 CALL section_vals_val_get(fm_section,
"REF_TRAJ_FILE_NAME", c_val=oi_env%fm_env%ref_traj_file_name)
656 CALL section_vals_val_get(fm_section,
"REF_FORCE_FILE_NAME", c_val=oi_env%fm_env%ref_force_file_name)
657 CALL section_vals_val_get(fm_section,
"REF_CELL_FILE_NAME", c_val=oi_env%fm_env%ref_cell_file_name)
658 CALL section_vals_val_get(fm_section,
"OPTIMIZE_FILE_NAME", c_val=oi_env%fm_env%optimize_file_name)
674 CALL timestop(handle)
676 END SUBROUTINE parse_input
Handles all functions related to the CELL.
subroutine, public parse_cell_line(input_line, cell_itimes, cell_time, h, vol)
Read cell info from a line (parsed from a file)
some minimal info about CP2K, including its version and license
subroutine, public write_restart_header(iunit)
Writes the header for the restart file.
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
subroutine, public cp_rm_iter_level(iteration_info, level_name, n_rlevel_att)
Removes an iteration level.
subroutine, public cp_add_iter_level(iteration_info, level_name, n_rlevel_new)
Adds an iteration level.
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_read_line(parser, nline, at_end)
Read the next line from a logical unit "unit" (I/O node only). Skip (nline-1) lines and skip also all...
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_release(parser)
releases the parser
subroutine, public parser_create(parser, file_name, unit_nr, para_env, end_section_label, separator_chars, comment_char, continuation_char, quote_char, section_char, parse_white_lines, initial_variables, apply_preprocessing)
Start a parser run. Initial variables allow to @SET stuff before opening the file.
Sets up and terminates the global environment variables.
subroutine, public cp2k_get_walltime(section, keyword_name, walltime)
reads the Walltime also in format HH:MM:SS
interface to use cp2k as library
recursive subroutine, public destroy_force_env(env_id, ierr, q_finalize)
deallocates the force_env with the given id
recursive subroutine, public create_force_env(new_env_id, input_declaration, input_path, output_path, mpi_comm, output_unit, owns_out_unit, input, ierr, work_dir, initial_variables)
creates a new force environment using the given input, and writing the output to the given output uni...
subroutine, public set_cell(env_id, new_cell, ierr)
sets a new cell
recursive subroutine, public calc_force(env_id, pos, n_el_pos, e_pot, force, n_el_force, ierr)
returns the energy of the configuration given by the positions passed as argument
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Utility routines for the memory handling.
Interface to the message passing library MPI.
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.
integer, parameter, public uniform
Definition of physical constants:
real(kind=dp), parameter, public bohr
subroutine, public powell_optimize(n, x, optstate)
...
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment