56 openpmd_access_create, &
57 openpmd_attributable_type, openpmd_iteration_type, openpmd_mesh_type, &
58 openpmd_particle_species_type, &
59 openpmd_record_type, &
60 openpmd_series_create, openpmd_series_type, &
61 openpmd_type_int, openpmd_json_merge, openpmd_get_default_extension
65#include "../base/base_uses.f90"
70 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
71 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'cp_output_handling_openpmd'
80 TYPE(openpmd_series_type) :: series = openpmd_series_type()
81 TYPE(openpmd_iteration_type) :: iteration = openpmd_iteration_type()
84 CHARACTER(len=default_string_length) :: name_prefix =
""
85 REAL(kind=
dp),
DIMENSION(7) :: unit_dimension = [0, 0, 0, 0, 0, 0, 0]
86 REAL(kind=
dp) :: unit_si = 1
89 TYPE :: cp_openpmd_per_call_type
92 END TYPE cp_openpmd_per_call_type
94 TYPE :: cp_current_iteration_counter_type
95 INTEGER :: flat_iteration = 0
96 INTEGER,
ALLOCATABLE :: complex_iteration(:)
97 INTEGER :: complex_iteration_depth = 0
98 END TYPE cp_current_iteration_counter_type
100 TYPE :: cp_openpmd_per_callsite_value_type
102 TYPE(openpmd_series_type) :: output_series = openpmd_series_type()
106 TYPE(cp_current_iteration_counter_type) :: iteration_counter = cp_current_iteration_counter_type()
107 END TYPE cp_openpmd_per_callsite_value_type
109 TYPE :: cp_openpmd_per_callsite_type
110 CHARACTER(len=default_string_length) :: key =
""
111 TYPE(cp_openpmd_per_callsite_value_type) ::
value = cp_openpmd_per_callsite_value_type()
112 END TYPE cp_openpmd_per_callsite_type
121 TYPE(cp_openpmd_per_call_type),
ALLOCATABLE :: cp_openpmd_per_call(:)
122 INTEGER :: cp_num_openpmd_per_call = 0
123 INTEGER :: cp_capacity_openpmd_per_call = 0
130 TYPE(cp_openpmd_per_callsite_type),
ALLOCATABLE,
TARGET :: cp_openpmd_per_callsite(:)
131 INTEGER :: cp_num_openpmd_per_callsite = 0
132 INTEGER :: cp_capacity_openpmd_per_callsite = 0
146 INTEGER,
PARAMETER :: cp_allocation_size = 100
149 CHARACTER(len=*),
PARAMETER :: cp_default_backend_config = &
150 "[hdf5]"//new_line(
'a')// &
151 "# will be overridden by particle flushes"//new_line(
'a')// &
152 "independent_stores = false"//new_line(
'a')// &
153 "dont_warn_unused_keys = ['independent_stores']"//new_line(
'a')// &
154 ""//new_line(
'a')// &
155 "[adios2]"//new_line(
'a')// &
156 "# discard any attributes written on ranks other than 0"//new_line(
'a')// &
157 "attribute_writing_ranks = 0"//new_line(
'a')// &
158 "[adios2.engine]"//new_line(
'a')// &
159 "# CP2K generally has many small IO operations, "//new_line(
'a')// &
160 "# so stage IO memory to the buffer first and then "//new_line(
'a')// &
161 "# run it all at once, instead of writing to disk directly."//new_line(
'a')// &
162 "# Save memory by specifying 'disk' here instead."//new_line(
'a')// &
163 "# TODO: In future, maybe implement some input variable"//new_line(
'a')// &
164 "# to specify intervals at which to flush to disk."//new_line(
'a')// &
165 "preferred_flush_target = 'buffer'"//new_line(
'a')
167 CHARACTER(len=*),
PARAMETER :: cp_default_backend_config_non_windows = &
168 "# Raise the BufferChunkSize to the maximum (2GB), since large operations"//new_line(
'a')// &
169 "# improve IO performance and the allocation overhead only cuts into"//new_line(
'a')// &
170 "# virtual memory (except on Windows, hence do not do that there)"//new_line(
'a')// &
171 "[adios2.engine.parameters]"//new_line(
'a')// &
172 "BufferChunkSize = 2147381248"//new_line(
'a')
179#else ! defined(__OPENPMD)
200 FUNCTION cp_openpmd_add_unit_nr (key, value)
RESULT(index)
201 INTEGER,
INTENT(in) :: key
202 TYPE(cp_openpmd_per_call_value_type),
INTENT(in) :: value
205 LOGICAL :: check_capacity
209 DO i = 1, cp_num_openpmd_per_call
210 IF (cp_openpmd_per_call(i)%key == key)
THEN
211 cp_openpmd_per_call(i)%value =
value
217 IF (cp_capacity_openpmd_per_call == 0)
THEN
218 ALLOCATE (cp_openpmd_per_call(cp_allocation_size))
219 cp_capacity_openpmd_per_call = cp_allocation_size
223 check_capacity = cp_num_openpmd_per_call < cp_capacity_openpmd_per_call
224 cpassert(check_capacity)
227 cp_num_openpmd_per_call = cp_num_openpmd_per_call+1
228 cp_openpmd_per_call(cp_num_openpmd_per_call)%key = key
229 cp_openpmd_per_call(cp_num_openpmd_per_call)%value =
value
230 index = cp_num_openpmd_per_call
231 END FUNCTION cp_openpmd_add_unit_nr
238 FUNCTION cp_openpmd_get_index_unit_nr (key)
RESULT(index)
239 INTEGER,
INTENT(in) :: key
246 DO i = 1, cp_num_openpmd_per_call
247 IF (cp_openpmd_per_call(i)%key == key)
THEN
252 END FUNCTION cp_openpmd_get_index_unit_nr
255 INTEGER,
INTENT(in) :: key
256 TYPE(cp_openpmd_per_call_value_type) :: value
260 i = cp_openpmd_get_index_unit_nr(key)
263 value = cp_openpmd_per_call(i)%value
271 FUNCTION cp_openpmd_remove_unit_nr (key)
RESULT(was_found)
272 INTEGER,
INTENT(in) :: key
279 DO i = 1, cp_num_openpmd_per_call
280 IF (cp_openpmd_per_call(i)%key == key)
THEN
282 IF (i /= cp_num_openpmd_per_call)
THEN
284 cp_openpmd_per_call(i) = cp_openpmd_per_call(cp_num_openpmd_per_call)
287 cp_num_openpmd_per_call = cp_num_openpmd_per_call-1
288 IF (cp_num_openpmd_per_call == 0)
THEN
289 DEALLOCATE (cp_openpmd_per_call)
290 cp_capacity_openpmd_per_call = 0
295 END FUNCTION cp_openpmd_remove_unit_nr
305 FUNCTION cp_openpmd_add_filedata (key, value)
RESULT(index)
306 CHARACTER(len=default_string_length),
INTENT(in) :: key
307 TYPE(cp_openpmd_per_callsite_value_type),
INTENT(in) :: value
310 LOGICAL :: check_capacity
314 DO i = 1, cp_num_openpmd_per_callsite
315 IF (cp_openpmd_per_callsite(i)%key == key)
THEN
316 cp_openpmd_per_callsite(i)%value =
value
322 IF (cp_capacity_openpmd_per_callsite == 0)
THEN
323 ALLOCATE (cp_openpmd_per_callsite(cp_allocation_size))
324 cp_capacity_openpmd_per_callsite = cp_allocation_size
328 check_capacity = cp_num_openpmd_per_callsite < cp_capacity_openpmd_per_callsite
329 cpassert(check_capacity)
332 cp_num_openpmd_per_callsite = cp_num_openpmd_per_callsite+1
333 cp_openpmd_per_callsite(cp_num_openpmd_per_callsite)%key = key
334 cp_openpmd_per_callsite(cp_num_openpmd_per_callsite)%value =
value
335 index = cp_num_openpmd_per_callsite
336 END FUNCTION cp_openpmd_add_filedata
343 FUNCTION cp_openpmd_get_index_filedata (key)
RESULT(index)
344 CHARACTER(len=default_string_length),
INTENT(in) :: key
351 DO i = 1, cp_num_openpmd_per_callsite
352 IF (cp_openpmd_per_callsite(i)%key == key)
THEN
357 END FUNCTION cp_openpmd_get_index_filedata
359 FUNCTION cp_openpmd_get_value_filedata (key)
RESULT(value)
360 CHARACTER(len=default_string_length),
INTENT(in) :: key
361 TYPE(cp_openpmd_per_callsite_value_type) :: value
365 i = cp_openpmd_get_index_filedata(key)
368 value = cp_openpmd_per_callsite(i)%value
369 END FUNCTION cp_openpmd_get_value_filedata
376 FUNCTION cp_openpmd_remove_filedata (key)
RESULT(was_found)
377 CHARACTER(len=default_string_length),
INTENT(in) :: key
384 DO i = 1, cp_num_openpmd_per_callsite
385 IF (cp_openpmd_per_callsite(i)%key == key)
THEN
387 IF (i /= cp_num_openpmd_per_callsite)
THEN
389 cp_openpmd_per_callsite(i) = cp_openpmd_per_callsite(cp_num_openpmd_per_callsite)
392 cp_num_openpmd_per_callsite = cp_num_openpmd_per_callsite-1
393 IF (cp_num_openpmd_per_callsite == 0)
THEN
394 DEALLOCATE (cp_openpmd_per_callsite)
395 cp_capacity_openpmd_per_callsite = 0
400 END FUNCTION cp_openpmd_remove_filedata
414 FUNCTION cp_print_key_generate_openpmd_filename(logger, print_key, openpmd_basename, extension)
RESULT(filename)
415 TYPE(cp_logger_type),
POINTER :: logger
416 TYPE(section_vals_type),
POINTER :: print_key
417 CHARACTER(len=*),
INTENT(IN) :: openpmd_basename, extension
418 CHARACTER(len=default_path_length) :: filename
420 CHARACTER(len=default_path_length) :: outName, outPath, root
421 INTEGER :: my_ind1, my_ind2
425 IF (outpath(1:1) ==
'=')
THEN
426 cpassert(len(outpath) - 1 <= len(filename))
427 filename = outpath(2:)
430 IF (outpath ==
"__STD_OUT__") outpath =
""
431 outname = trim(outpath)
433 my_ind1 = index(outpath,
"/")
434 my_ind2 = len_trim(outpath)
435 IF (my_ind1 /= 0)
THEN
437 DO WHILE (index(outpath(my_ind1 + 1:my_ind2),
"/") /= 0)
438 my_ind1 = index(outpath(my_ind1 + 1:my_ind2),
"/") + my_ind1
440 IF (my_ind1 == my_ind2)
THEN
443 outname = outpath(my_ind1 + 1:my_ind2)
447 IF (.NOT. has_root)
THEN
448 root = trim(logger%iter_info%project_name)
449 ELSE IF (outname ==
"")
THEN
450 root = outpath(1:my_ind1)//trim(logger%iter_info%project_name)
452 root = outpath(1:my_ind1)
455 filename = adjustl(trim(root)//
"_"//trim(openpmd_basename)//trim(extension))
457 END FUNCTION cp_print_key_generate_openpmd_filename
466 FUNCTION cp_advance_iteration_number(logger, openpmd_file)
RESULT(did_advance_iteration)
467 TYPE(cp_logger_type),
POINTER :: logger
468 TYPE(cp_openpmd_per_callsite_value_type) :: openpmd_file
469 LOGICAL :: did_advance_iteration
474 did_advance_iteration = .false.
475 len =
SIZE(logger%iter_info%iteration)
476 IF (len /= openpmd_file%iteration_counter%complex_iteration_depth)
THEN
477 did_advance_iteration = .true.
478 openpmd_file%iteration_counter%complex_iteration_depth = len
479 ALLOCATE (openpmd_file%iteration_counter%complex_iteration(len))
481 did_advance_iteration &
482 = any(openpmd_file%iteration_counter%complex_iteration(1:len) &
483 /= logger%iter_info%iteration(1:len))
486 IF (.NOT. did_advance_iteration)
RETURN
488 openpmd_file%iteration_counter%flat_iteration = openpmd_file%iteration_counter%flat_iteration + 1
489 openpmd_file%iteration_counter%complex_iteration(1:len) &
490 = logger%iter_info%iteration(1:len)
492 END FUNCTION cp_advance_iteration_number
509 FUNCTION cp_openpmd_create_unit_nr_entry( &
510 openpmd_file_index, &
513 openpmd_unit_dimension, &
515 sim_time)
RESULT(res)
516 INTEGER :: openpmd_file_index
517 CHARACTER(len=*),
INTENT(IN) :: middle_name
518 TYPE(cp_logger_type),
POINTER :: logger
519 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
520 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
521 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
522 TYPE(cp_openpmd_per_call_value_type) :: res
524 LOGICAL :: opened_new_iteration
525 TYPE(openpmd_attributable_type) :: attr
526 TYPE(cp_openpmd_per_callsite_value_type),
POINTER :: opmd
528 opened_new_iteration = .false.
530 opmd => cp_openpmd_per_callsite(openpmd_file_index)%value
532 res%series = opmd%output_series
534 opened_new_iteration = cp_advance_iteration_number(logger, opmd)
536 res%iteration = opmd%output_series%write_iteration(opmd%iteration_counter%flat_iteration)
537 CALL res%iteration%set_time_unit_SI(
seconds)
538 res%name_prefix = trim(middle_name)
540 IF (opened_new_iteration)
THEN
542 IF (
PRESENT(sim_time))
THEN
543 CALL res%iteration%set_time(sim_time)
546 IF (
PRESENT(openpmd_unit_dimension))
THEN
547 res%unit_dimension = openpmd_unit_dimension
550 IF (
PRESENT(openpmd_unit_si))
THEN
551 res%unit_si = openpmd_unit_si
554 attr = res%iteration%as_attributable()
555 CALL attr%set_attribute_vec_int( &
556 "ndim_iteration_index", &
557 opmd%iteration_counter%complex_iteration)
559 END FUNCTION cp_openpmd_create_unit_nr_entry
565 FUNCTION cp_openpmd_get_openpmd_file_entry(openpmd_basename, filename, openpmd_config, logger, use_mpi)
RESULT(file_index)
566 CHARACTER(len=*),
INTENT(IN) :: openpmd_basename, filename, openpmd_config
567 TYPE(cp_logger_type),
POINTER :: logger
569 INTEGER :: file_index
570 CHARACTER(:),
ALLOCATABLE :: merged_config
572 CHARACTER(len=default_string_length) :: basename_copied
573 TYPE(cp_openpmd_per_callsite_value_type) :: emplace_new
576 TYPE(cp_openpmd_per_callsite_value_type) :: series_data
577 TYPE(openpmd_iteration_type) :: iteration
580 basename_copied =
' '
581 basename_copied(1:len_trim(openpmd_basename)) = trim(openpmd_basename)
583 file_index = cp_openpmd_get_index_filedata(basename_copied)
585 CALL timeset(
'openpmd_close_iterations', handle)
586 DO i = 1, cp_num_openpmd_per_callsite
587 IF (i /= file_index)
THEN
588 series_data = cp_openpmd_per_callsite(i)%value
589 iteration = series_data%output_series%get_iteration( &
590 series_data%iteration_counter%flat_iteration)
591 IF (.NOT. iteration%closed())
THEN
592 CALL iteration%close()
596 CALL timestop(handle)
598 IF (file_index /= -1)
RETURN
601 merged_config = openpmd_json_merge(cp_default_backend_config, cp_default_backend_config_non_windows)
603 merged_config = cp_default_backend_config
606 merged_config = openpmd_json_merge(merged_config, openpmd_config, logger%para_env)
607 emplace_new%output_series = openpmd_series_create( &
608 filename, openpmd_access_create, logger%para_env, merged_config)
610 merged_config = openpmd_json_merge(merged_config, openpmd_config)
611 emplace_new%output_series = openpmd_series_create( &
612 filename, openpmd_access_create, config=merged_config)
615 CALL emplace_new%output_series%set_software(
"CP2K",
cp2k_version)
617 DEALLOCATE (merged_config)
618 file_index = cp_openpmd_add_filedata(basename_copied, emplace_new)
619 END FUNCTION cp_openpmd_get_openpmd_file_entry
621#else ! defined(__OPENPMD)
624 INTEGER,
INTENT(in) :: key
629 cpabort(
"CP2K compiled without the openPMD-api")
641 DO i = 1, cp_num_openpmd_per_callsite
642 DEALLOCATE (cp_openpmd_per_callsite(i)%value%iteration_counter%complex_iteration)
643 CALL cp_openpmd_per_callsite(i)%value%output_series%close()
645 IF (
ALLOCATED(cp_openpmd_per_callsite))
THEN
646 DEALLOCATE (cp_openpmd_per_callsite)
648 cp_num_openpmd_per_callsite = 0
681 ignore_should_output, &
685 openpmd_unit_dimension, &
687 sim_time)
RESULT(res)
691 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
692 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
693 LOGICAL,
INTENT(IN),
OPTIONAL :: ignore_should_output
694 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
695 CHARACTER(len=default_path_length),
INTENT(OUT), &
697 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
698 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
699 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
700 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
705 CHARACTER(len=default_path_length) :: filename
707 CHARACTER(len=default_string_length) :: openpmd_config, outpath, file_extension
712 INTEGER :: openpmd_file_index, openpmd_call_index
719 IF (
PRESENT(mpi_io))
THEN
720#if defined(__parallel)
721 IF (logger%para_env%num_pe > 1 .AND. mpi_io)
THEN
733 cpassert(
ASSOCIATED(logger))
734 cpassert(basis_section%ref_count > 0)
735 cpassert(logger%ref_count > 0)
737 basis_section, print_key_path, used_print_key=print_key),
cp_p_file)
738 IF (
PRESENT(ignore_should_output)) my_should_output = my_should_output .OR. ignore_should_output
739 IF (.NOT. my_should_output)
RETURN
740 IF (logger%para_env%is_source() .OR. my_mpi_io)
THEN
745 IF (len_trim(openpmd_config) == 0)
THEN
748 openpmd_config =
"@"//trim(openpmd_config)
750 filename = cp_print_key_generate_openpmd_filename(logger, print_key, openpmd_basename, file_extension)
752 IF (
PRESENT(fout))
THEN
756 openpmd_file_index = cp_openpmd_get_openpmd_file_entry( &
757 openpmd_basename, filename, openpmd_config, logger, my_mpi_io)
759 OPEN (newunit=res, status=
'scratch', action=
'write')
763 output_info = cp_openpmd_create_unit_nr_entry( &
764 openpmd_file_index, &
767 openpmd_unit_dimension, &
770 openpmd_call_index = cp_openpmd_add_unit_nr( &
779 mark_used(basis_section)
780 mark_used(print_key_path)
781 mark_used(middle_name)
782 mark_used(ignore_should_output)
785 mark_used(openpmd_basename)
786 mark_used(openpmd_basename)
787 mark_used(openpmd_unit_dimension)
788 mark_used(openpmd_unit_si)
791 cpabort(
"CP2K compiled without the openPMD-api")
815 print_key_path, local, ignore_should_output, &
817 INTEGER,
INTENT(INOUT) :: unit_nr
818 TYPE(cp_logger_type),
POINTER :: logger
819 TYPE(section_vals_type),
INTENT(IN) :: basis_section
820 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
821 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, &
826 CHARACTER(len=default_string_length) :: outpath
827 LOGICAL :: my_local, my_mpi_io, &
829 TYPE(section_vals_type),
POINTER :: print_key
834 IF (
PRESENT(local)) my_local = local
835 IF (
PRESENT(mpi_io)) my_mpi_io = mpi_io
836 cpassert(
ASSOCIATED(logger))
837 cpassert(basis_section%ref_count > 0)
838 cpassert(logger%ref_count > 0)
839 my_should_output = btest(cp_print_key_should_output(logger%iter_info, basis_section, &
840 print_key_path, used_print_key=print_key), cp_p_file)
841 IF (
PRESENT(ignore_should_output)) my_should_output = my_should_output .OR. ignore_should_output
842 IF (my_should_output .AND. (my_local .OR. &
843 logger%para_env%is_source() .OR. &
845 CALL section_vals_val_get(print_key,
"FILENAME", c_val=outpath)
846 IF (cp_openpmd_remove_unit_nr(unit_nr))
THEN
852 cpassert(unit_nr == -1)
857 mark_used(basis_section)
858 mark_used(print_key_path)
860 mark_used(ignore_should_output)
862 cpabort(
"CP2K compiled without the openPMD-api")
869 TYPE(cp_openpmd_per_callsite_value_type) :: series_data
870 TYPE(openpmd_iteration_type) :: iteration
873 CALL timeset(
'openpmd_close_iterations', handle)
874 DO i = 1, cp_num_openpmd_per_callsite
875 series_data = cp_openpmd_per_callsite(i)%value
876 iteration = series_data%output_series%get_iteration( &
877 series_data%iteration_counter%flat_iteration)
878 IF (.NOT. iteration%closed())
THEN
879 CALL iteration%close()
882 CALL timestop(handle)
887 CHARACTER(len=default_string_length) :: extension
890 extension = openpmd_get_default_extension()
some minimal info about CP2K, including its version and license
character(len= *), parameter, public cp2k_version
Utility routines to open and close files. Tracking of preconnections.
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.
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.
Collection of routines to handle the iteration info.
character(len=default_path_length), dimension(19), parameter, public each_possible_labels
subroutine, public cp_iteration_info_retain(iteration_info)
retains the iteration_info (see doc/ReferenceCounting.html)
subroutine, public cp_iteration_info_release(iteration_info)
releases the iteration_info (see doc/ReferenceCounting.html)
character(len=default_path_length), dimension(19), parameter, public each_desc_labels
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
integer function, public cp_logger_get_unit_nr(logger, local)
returns the unit nr for the requested kind of log.
subroutine, public cp_logger_generate_filename(logger, res, root, postfix, local)
generates a unique filename (ie adding eventual suffixes and process ids)
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
subroutine, public cp_openpmd_close_iterations()
character(len=default_string_length) function, public cp_openpmd_get_default_extension()
integer function, public cp_openpmd_print_key_unit_nr(logger, basis_section, print_key_path, middle_name, ignore_should_output, mpi_io, fout, openpmd_basename, openpmd_unit_dimension, openpmd_unit_si, sim_time)
...
subroutine, public cp_openpmd_output_finalize()
Close all outputs.
type(cp_openpmd_per_call_value_type) function, public cp_openpmd_get_value_unit_nr(key)
subroutine, public cp_openpmd_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, mpi_io)
should be called after you finish working with a unit obtained with cp_openpmd_print_key_unit_nr,...
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
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_mov(source, target)
...
Utility routines for the memory handling.
Interface to the message passing library MPI.
subroutine, public mp_file_delete(filepath, info)
Deletes a file. Auxiliary routine to emulate 'replace' action for mp_file_open. Only the master proce...
subroutine, public mp_file_get_amode(mpi_io, replace, amode, form, action, status, position)
(parallel) Utility routine to determine MPI file access mode based on variables
Definition of physical constants:
real(kind=dp), parameter, public seconds
Utilities for string manipulations.
subroutine, public compress(string, full)
Eliminate multiple space characters in a string. If full is .TRUE., then all spaces are eliminated.
contains the information about the current state of the program to be able to decide if output is nec...
type of a logger, at the moment it contains just a print level starting at which level it should be l...