55 openpmd_access_create, &
56 openpmd_attributable_type, openpmd_iteration_type, openpmd_mesh_type, &
57 openpmd_particle_species_type, &
58 openpmd_record_type, &
59 openpmd_series_create, openpmd_series_type, &
60 openpmd_type_int, openpmd_json_merge, openpmd_get_default_extension
64#include "../base/base_uses.f90"
69 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
70 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'cp_output_handling_openpmd'
79 TYPE(openpmd_series_type) :: series = openpmd_series_type()
80 TYPE(openpmd_iteration_type) :: iteration = openpmd_iteration_type()
83 CHARACTER(len=default_string_length) :: name_prefix =
""
84 REAL(kind=
dp),
DIMENSION(7) :: unit_dimension = [0, 0, 0, 0, 0, 0, 0]
85 REAL(kind=
dp) :: unit_si = 1
88 TYPE :: cp_openpmd_per_call_type
91 END TYPE cp_openpmd_per_call_type
93 TYPE :: cp_current_iteration_counter_type
94 INTEGER :: flat_iteration = 0
95 INTEGER,
ALLOCATABLE :: complex_iteration(:)
96 INTEGER :: complex_iteration_depth = 0
97 END TYPE cp_current_iteration_counter_type
99 TYPE :: cp_openpmd_per_callsite_value_type
101 TYPE(openpmd_series_type) :: output_series = openpmd_series_type()
105 TYPE(cp_current_iteration_counter_type) :: iteration_counter = cp_current_iteration_counter_type()
106 END TYPE cp_openpmd_per_callsite_value_type
108 TYPE :: cp_openpmd_per_callsite_type
109 CHARACTER(len=default_string_length) :: key =
""
110 TYPE(cp_openpmd_per_callsite_value_type) ::
value = cp_openpmd_per_callsite_value_type()
111 END TYPE cp_openpmd_per_callsite_type
120 TYPE(cp_openpmd_per_call_type),
ALLOCATABLE :: cp_openpmd_per_call(:)
121 INTEGER :: cp_num_openpmd_per_call = 0
122 INTEGER :: cp_capacity_openpmd_per_call = 0
129 TYPE(cp_openpmd_per_callsite_type),
ALLOCATABLE,
TARGET :: cp_openpmd_per_callsite(:)
130 INTEGER :: cp_num_openpmd_per_callsite = 0
131 INTEGER :: cp_capacity_openpmd_per_callsite = 0
145 INTEGER,
PARAMETER :: cp_allocation_size = 100
148 CHARACTER(len=*),
PARAMETER :: cp_default_backend_config = &
149 "[hdf5]"//new_line(
'a')// &
150 "# will be overridden by particle flushes"//new_line(
'a')// &
151 "independent_stores = false"//new_line(
'a')// &
152 "dont_warn_unused_keys = ['independent_stores']"//new_line(
'a')// &
153 ""//new_line(
'a')// &
154 "[adios2]"//new_line(
'a')// &
155 "# discard any attributes written on ranks other than 0"//new_line(
'a')// &
156 "attribute_writing_ranks = 0"//new_line(
'a')// &
157 "[adios2.engine]"//new_line(
'a')// &
158 "# CP2K generally has many small IO operations, "//new_line(
'a')// &
159 "# so stage IO memory to the buffer first and then "//new_line(
'a')// &
160 "# run it all at once, instead of writing to disk directly."//new_line(
'a')// &
161 "# Save memory by specifying 'disk' here instead."//new_line(
'a')// &
162 "# TODO: In future, maybe implement some input variable"//new_line(
'a')// &
163 "# to specify intervals at which to flush to disk."//new_line(
'a')// &
164 "preferred_flush_target = 'buffer'"//new_line(
'a')
166 CHARACTER(len=*),
PARAMETER :: cp_default_backend_config_non_windows = &
167 "# Raise the BufferChunkSize to the maximum (2GB), since large operations"//new_line(
'a')// &
168 "# improve IO performance and the allocation overhead only cuts into"//new_line(
'a')// &
169 "# virtual memory (except on Windows, hence do not do that there)"//new_line(
'a')// &
170 "[adios2.engine.parameters]"//new_line(
'a')// &
171 "BufferChunkSize = 2147381248"//new_line(
'a')
178#else ! defined(__OPENPMD)
199 FUNCTION cp_openpmd_add_unit_nr (key, value)
RESULT(index)
200 INTEGER,
INTENT(in) :: key
201 TYPE(cp_openpmd_per_call_value_type),
INTENT(in) :: value
204 LOGICAL :: check_capacity
208 DO i = 1, cp_num_openpmd_per_call
209 IF (cp_openpmd_per_call(i)%key == key)
THEN
210 cp_openpmd_per_call(i)%value =
value
216 IF (cp_capacity_openpmd_per_call == 0)
THEN
217 ALLOCATE (cp_openpmd_per_call(cp_allocation_size))
218 cp_capacity_openpmd_per_call = cp_allocation_size
222 check_capacity = cp_num_openpmd_per_call < cp_capacity_openpmd_per_call
223 cpassert(check_capacity)
226 cp_num_openpmd_per_call = cp_num_openpmd_per_call+1
227 cp_openpmd_per_call(cp_num_openpmd_per_call)%key = key
228 cp_openpmd_per_call(cp_num_openpmd_per_call)%value =
value
229 index = cp_num_openpmd_per_call
230 END FUNCTION cp_openpmd_add_unit_nr
237 FUNCTION cp_openpmd_get_index_unit_nr (key)
RESULT(index)
238 INTEGER,
INTENT(in) :: key
245 DO i = 1, cp_num_openpmd_per_call
246 IF (cp_openpmd_per_call(i)%key == key)
THEN
251 END FUNCTION cp_openpmd_get_index_unit_nr
254 INTEGER,
INTENT(in) :: key
255 TYPE(cp_openpmd_per_call_value_type) :: value
259 i = cp_openpmd_get_index_unit_nr(key)
262 value = cp_openpmd_per_call(i)%value
270 FUNCTION cp_openpmd_remove_unit_nr (key)
RESULT(was_found)
271 INTEGER,
INTENT(in) :: key
278 DO i = 1, cp_num_openpmd_per_call
279 IF (cp_openpmd_per_call(i)%key == key)
THEN
281 IF (i /= cp_num_openpmd_per_call)
THEN
283 cp_openpmd_per_call(i) = cp_openpmd_per_call(cp_num_openpmd_per_call)
286 cp_num_openpmd_per_call = cp_num_openpmd_per_call-1
287 IF (cp_num_openpmd_per_call == 0)
THEN
288 DEALLOCATE (cp_openpmd_per_call)
289 cp_capacity_openpmd_per_call = 0
294 END FUNCTION cp_openpmd_remove_unit_nr
304 FUNCTION cp_openpmd_add_filedata (key, value)
RESULT(index)
305 CHARACTER(len=default_string_length),
INTENT(in) :: key
306 TYPE(cp_openpmd_per_callsite_value_type),
INTENT(in) :: value
309 LOGICAL :: check_capacity
313 DO i = 1, cp_num_openpmd_per_callsite
314 IF (cp_openpmd_per_callsite(i)%key == key)
THEN
315 cp_openpmd_per_callsite(i)%value =
value
321 IF (cp_capacity_openpmd_per_callsite == 0)
THEN
322 ALLOCATE (cp_openpmd_per_callsite(cp_allocation_size))
323 cp_capacity_openpmd_per_callsite = cp_allocation_size
327 check_capacity = cp_num_openpmd_per_callsite < cp_capacity_openpmd_per_callsite
328 cpassert(check_capacity)
331 cp_num_openpmd_per_callsite = cp_num_openpmd_per_callsite+1
332 cp_openpmd_per_callsite(cp_num_openpmd_per_callsite)%key = key
333 cp_openpmd_per_callsite(cp_num_openpmd_per_callsite)%value =
value
334 index = cp_num_openpmd_per_callsite
335 END FUNCTION cp_openpmd_add_filedata
342 FUNCTION cp_openpmd_get_index_filedata (key)
RESULT(index)
343 CHARACTER(len=default_string_length),
INTENT(in) :: key
350 DO i = 1, cp_num_openpmd_per_callsite
351 IF (cp_openpmd_per_callsite(i)%key == key)
THEN
356 END FUNCTION cp_openpmd_get_index_filedata
358 FUNCTION cp_openpmd_get_value_filedata (key)
RESULT(value)
359 CHARACTER(len=default_string_length),
INTENT(in) :: key
360 TYPE(cp_openpmd_per_callsite_value_type) :: value
364 i = cp_openpmd_get_index_filedata(key)
367 value = cp_openpmd_per_callsite(i)%value
368 END FUNCTION cp_openpmd_get_value_filedata
375 FUNCTION cp_openpmd_remove_filedata (key)
RESULT(was_found)
376 CHARACTER(len=default_string_length),
INTENT(in) :: key
383 DO i = 1, cp_num_openpmd_per_callsite
384 IF (cp_openpmd_per_callsite(i)%key == key)
THEN
386 IF (i /= cp_num_openpmd_per_callsite)
THEN
388 cp_openpmd_per_callsite(i) = cp_openpmd_per_callsite(cp_num_openpmd_per_callsite)
391 cp_num_openpmd_per_callsite = cp_num_openpmd_per_callsite-1
392 IF (cp_num_openpmd_per_callsite == 0)
THEN
393 DEALLOCATE (cp_openpmd_per_callsite)
394 cp_capacity_openpmd_per_callsite = 0
399 END FUNCTION cp_openpmd_remove_filedata
413 FUNCTION cp_print_key_generate_openpmd_filename(logger, print_key, openpmd_basename, extension)
RESULT(filename)
414 TYPE(cp_logger_type),
POINTER :: logger
415 TYPE(section_vals_type),
POINTER :: print_key
416 CHARACTER(len=*),
INTENT(IN) :: openpmd_basename, extension
417 CHARACTER(len=default_path_length) :: filename
419 CHARACTER(len=default_path_length) :: outName, outPath, root
420 INTEGER :: my_ind1, my_ind2
424 IF (outpath(1:1) ==
'=')
THEN
425 cpassert(len(outpath) - 1 <= len(filename))
426 filename = outpath(2:)
429 IF (outpath ==
"__STD_OUT__") outpath =
""
430 outname = trim(outpath)
432 my_ind1 = index(outpath,
"/")
433 my_ind2 = len_trim(outpath)
434 IF (my_ind1 /= 0)
THEN
436 DO WHILE (index(outpath(my_ind1 + 1:my_ind2),
"/") /= 0)
437 my_ind1 = index(outpath(my_ind1 + 1:my_ind2),
"/") + my_ind1
439 IF (my_ind1 == my_ind2)
THEN
442 outname = outpath(my_ind1 + 1:my_ind2)
446 IF (.NOT. has_root)
THEN
447 root = trim(logger%iter_info%project_name)
448 ELSE IF (outname ==
"")
THEN
449 root = outpath(1:my_ind1)//trim(logger%iter_info%project_name)
451 root = outpath(1:my_ind1)
454 filename = adjustl(trim(root)//
"_"//trim(openpmd_basename)//trim(extension))
456 END FUNCTION cp_print_key_generate_openpmd_filename
465 FUNCTION cp_advance_iteration_number(logger, openpmd_file)
RESULT(did_advance_iteration)
466 TYPE(cp_logger_type),
POINTER :: logger
467 TYPE(cp_openpmd_per_callsite_value_type) :: openpmd_file
468 LOGICAL :: did_advance_iteration
473 did_advance_iteration = .false.
474 len =
SIZE(logger%iter_info%iteration)
475 IF (len /= openpmd_file%iteration_counter%complex_iteration_depth)
THEN
476 did_advance_iteration = .true.
477 openpmd_file%iteration_counter%complex_iteration_depth = len
478 ALLOCATE (openpmd_file%iteration_counter%complex_iteration(len))
480 did_advance_iteration &
481 = any(openpmd_file%iteration_counter%complex_iteration(1:len) &
482 /= logger%iter_info%iteration(1:len))
485 IF (.NOT. did_advance_iteration)
RETURN
487 openpmd_file%iteration_counter%flat_iteration = openpmd_file%iteration_counter%flat_iteration + 1
488 openpmd_file%iteration_counter%complex_iteration(1:len) &
489 = logger%iter_info%iteration(1:len)
491 END FUNCTION cp_advance_iteration_number
508 FUNCTION cp_openpmd_create_unit_nr_entry( &
509 openpmd_file_index, &
512 openpmd_unit_dimension, &
514 sim_time)
RESULT(res)
515 INTEGER :: openpmd_file_index
516 CHARACTER(len=*),
INTENT(IN) :: middle_name
517 TYPE(cp_logger_type),
POINTER :: logger
518 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
519 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
520 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
521 TYPE(cp_openpmd_per_call_value_type) :: res
523 LOGICAL :: opened_new_iteration
524 TYPE(openpmd_attributable_type) :: attr
525 TYPE(cp_openpmd_per_callsite_value_type),
POINTER :: opmd
527 opened_new_iteration = .false.
529 opmd => cp_openpmd_per_callsite(openpmd_file_index)%value
531 res%series = opmd%output_series
533 opened_new_iteration = cp_advance_iteration_number(logger, opmd)
535 res%iteration = opmd%output_series%write_iteration(opmd%iteration_counter%flat_iteration)
536 CALL res%iteration%set_time_unit_SI(
seconds)
537 res%name_prefix = trim(middle_name)
539 IF (opened_new_iteration)
THEN
541 IF (
PRESENT(sim_time))
THEN
542 CALL res%iteration%set_time(sim_time)
545 IF (
PRESENT(openpmd_unit_dimension))
THEN
546 res%unit_dimension = openpmd_unit_dimension
549 IF (
PRESENT(openpmd_unit_si))
THEN
550 res%unit_si = openpmd_unit_si
553 attr = res%iteration%as_attributable()
554 CALL attr%set_attribute_vec_int( &
555 "ndim_iteration_index", &
556 opmd%iteration_counter%complex_iteration)
558 END FUNCTION cp_openpmd_create_unit_nr_entry
564 FUNCTION cp_openpmd_get_openpmd_file_entry(openpmd_basename, filename, openpmd_config, logger, use_mpi)
RESULT(file_index)
565 CHARACTER(len=*),
INTENT(IN) :: openpmd_basename, filename, openpmd_config
566 TYPE(cp_logger_type),
POINTER :: logger
568 INTEGER :: file_index
569 CHARACTER(:),
ALLOCATABLE :: merged_config
571 CHARACTER(len=default_string_length) :: basename_copied
572 TYPE(cp_openpmd_per_callsite_value_type) :: emplace_new
575 TYPE(cp_openpmd_per_callsite_value_type) :: series_data
576 TYPE(openpmd_iteration_type) :: iteration
579 basename_copied =
' '
580 basename_copied(1:len_trim(openpmd_basename)) = trim(openpmd_basename)
582 file_index = cp_openpmd_get_index_filedata(basename_copied)
584 CALL timeset(
'openpmd_close_iterations', handle)
585 DO i = 1, cp_num_openpmd_per_callsite
586 IF (i /= file_index)
THEN
587 series_data = cp_openpmd_per_callsite(i)%value
588 iteration = series_data%output_series%get_iteration( &
589 series_data%iteration_counter%flat_iteration)
590 IF (.NOT. iteration%closed())
THEN
591 CALL iteration%close()
595 CALL timestop(handle)
597 IF (file_index /= -1)
RETURN
600 merged_config = openpmd_json_merge(cp_default_backend_config, cp_default_backend_config_non_windows)
602 merged_config = cp_default_backend_config
605 merged_config = openpmd_json_merge(merged_config, openpmd_config, logger%para_env)
606 emplace_new%output_series = openpmd_series_create( &
607 filename, openpmd_access_create, logger%para_env, merged_config)
609 merged_config = openpmd_json_merge(merged_config, openpmd_config)
610 emplace_new%output_series = openpmd_series_create( &
611 filename, openpmd_access_create, config=merged_config)
614 CALL emplace_new%output_series%set_software(
"CP2K",
cp2k_version)
616 DEALLOCATE (merged_config)
617 file_index = cp_openpmd_add_filedata(basename_copied, emplace_new)
618 END FUNCTION cp_openpmd_get_openpmd_file_entry
620#else ! defined(__OPENPMD)
623 INTEGER,
INTENT(in) :: key
628 cpabort(
"CP2K compiled without the openPMD-api")
640 DO i = 1, cp_num_openpmd_per_callsite
641 DEALLOCATE (cp_openpmd_per_callsite(i)%value%iteration_counter%complex_iteration)
642 CALL cp_openpmd_per_callsite(i)%value%output_series%close()
644 IF (
ALLOCATED(cp_openpmd_per_callsite))
THEN
645 DEALLOCATE (cp_openpmd_per_callsite)
647 cp_num_openpmd_per_callsite = 0
680 ignore_should_output, &
684 openpmd_unit_dimension, &
686 sim_time)
RESULT(res)
690 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
691 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: middle_name
692 LOGICAL,
INTENT(IN),
OPTIONAL :: ignore_should_output
693 LOGICAL,
INTENT(INOUT),
OPTIONAL :: mpi_io
694 CHARACTER(len=default_path_length),
INTENT(OUT), &
696 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: openpmd_basename
697 REAL(kind=
dp),
DIMENSION(7),
OPTIONAL,
INTENT(IN) :: openpmd_unit_dimension
698 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: openpmd_unit_si
699 REAL(kind=
dp),
OPTIONAL,
INTENT(IN) :: sim_time
704 CHARACTER(len=default_path_length) :: filename
706 CHARACTER(len=default_string_length) :: openpmd_config, outpath, file_extension
711 INTEGER :: openpmd_file_index, openpmd_call_index
718 IF (
PRESENT(mpi_io))
THEN
719#if defined(__parallel)
720 IF (logger%para_env%num_pe > 1 .AND. mpi_io)
THEN
732 cpassert(
ASSOCIATED(logger))
733 cpassert(basis_section%ref_count > 0)
734 cpassert(logger%ref_count > 0)
736 basis_section, print_key_path, used_print_key=print_key),
cp_p_file)
737 IF (
PRESENT(ignore_should_output)) my_should_output = my_should_output .OR. ignore_should_output
738 IF (.NOT. my_should_output)
RETURN
739 IF (logger%para_env%is_source() .OR. my_mpi_io)
THEN
744 IF (len_trim(openpmd_config) == 0)
THEN
747 openpmd_config =
"@"//trim(openpmd_config)
749 filename = cp_print_key_generate_openpmd_filename(logger, print_key, openpmd_basename, file_extension)
751 IF (
PRESENT(fout))
THEN
755 openpmd_file_index = cp_openpmd_get_openpmd_file_entry( &
756 openpmd_basename, filename, openpmd_config, logger, my_mpi_io)
758 OPEN (newunit=res, status=
'scratch', action=
'write')
762 output_info = cp_openpmd_create_unit_nr_entry( &
763 openpmd_file_index, &
766 openpmd_unit_dimension, &
769 openpmd_call_index = cp_openpmd_add_unit_nr( &
778 mark_used(basis_section)
779 mark_used(print_key_path)
780 mark_used(middle_name)
781 mark_used(ignore_should_output)
784 mark_used(openpmd_basename)
785 mark_used(openpmd_basename)
786 mark_used(openpmd_unit_dimension)
787 mark_used(openpmd_unit_si)
790 cpabort(
"CP2K compiled without the openPMD-api")
814 print_key_path, local, ignore_should_output, &
816 INTEGER,
INTENT(INOUT) :: unit_nr
817 TYPE(cp_logger_type),
POINTER :: logger
818 TYPE(section_vals_type),
INTENT(IN) :: basis_section
819 CHARACTER(len=*),
INTENT(IN),
OPTIONAL :: print_key_path
820 LOGICAL,
INTENT(IN),
OPTIONAL :: local, ignore_should_output, &
825 CHARACTER(len=default_string_length) :: outpath
826 LOGICAL :: my_local, my_mpi_io, &
828 TYPE(section_vals_type),
POINTER :: print_key
833 IF (
PRESENT(local)) my_local = local
834 IF (
PRESENT(mpi_io)) my_mpi_io = mpi_io
835 cpassert(
ASSOCIATED(logger))
836 cpassert(basis_section%ref_count > 0)
837 cpassert(logger%ref_count > 0)
838 my_should_output = btest(cp_print_key_should_output(logger%iter_info, basis_section, &
839 print_key_path, used_print_key=print_key), cp_p_file)
840 IF (
PRESENT(ignore_should_output)) my_should_output = my_should_output .OR. ignore_should_output
841 IF (my_should_output .AND. (my_local .OR. &
842 logger%para_env%is_source() .OR. &
844 CALL section_vals_val_get(print_key,
"FILENAME", c_val=outpath)
845 IF (cp_openpmd_remove_unit_nr(unit_nr))
THEN
851 cpassert(unit_nr == -1)
856 mark_used(basis_section)
857 mark_used(print_key_path)
859 mark_used(ignore_should_output)
861 cpabort(
"CP2K compiled without the openPMD-api")
868 TYPE(cp_openpmd_per_callsite_value_type) :: series_data
869 TYPE(openpmd_iteration_type) :: iteration
872 CALL timeset(
'openpmd_close_iterations', handle)
873 DO i = 1, cp_num_openpmd_per_callsite
874 series_data = cp_openpmd_per_callsite(i)%value
875 iteration = series_data%output_series%get_iteration( &
876 series_data%iteration_counter%flat_iteration)
877 IF (.NOT. iteration%closed())
THEN
878 CALL iteration%close()
881 CALL timestop(handle)
886 CHARACTER(len=default_string_length) :: extension
889 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...