From b40b0702d2a250e038bec7de2f2f1132853643e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ole=20Sch=C3=BCtt?= Date: Sat, 13 Jul 2024 21:08:47 +0200 Subject: [PATCH] Docs: Generate units.md from cp2k_input.xml --- docs/generate_input_reference.py | 23 +++++++ docs/units.md | 108 ------------------------------- src/common/cp_units.F | 100 +++++++++------------------- src/start/cp2k_runs.F | 12 +--- 4 files changed, 54 insertions(+), 189 deletions(-) delete mode 100644 docs/units.md diff --git a/docs/generate_input_reference.py b/docs/generate_input_reference.py index cea67d97cb..0b397ec57b 100755 --- a/docs/generate_input_reference.py +++ b/docs/generate_input_reference.py @@ -27,6 +27,7 @@ def main() -> None: locale.setlocale(locale.LC_ALL, locale="C.UTF8") # needed for strptime root = ET.parse(cp2k_input_xml_fn).getroot() build_bibliography(root, output_dir) + build_units_reference(root, output_dir) build_input_reference(root, output_dir) @@ -73,6 +74,28 @@ def build_bibliography(root: ET.Element, output_dir: Path) -> None: write_file(output_dir / "bibliography.md", "\n".join(output)) +# ====================================================================================== +def build_units_reference(root: ET.Element, output_dir: Path) -> None: + output = [] + output += ["%", "% This file was created by generate_input_reference.py", "%"] + output += ["# Units", "", "Units of measurement available in CP2K's input.", ""] + + for unit_kind in root.findall("UNIT_KIND"): + kind = unit_kind.attrib.get("name") + assert kind + article = "an" if kind[0] in "aeiou" else "a" + output += [f"## {kind.capitalize()}", ""] + output += [f"Possible units of measurement for {article} {kind}."] + output += [f"The `[{kind}]` entry acts like a dummy flag (assumes the"] + output += [f"unit of measurement of {kind} is in internal units),"] + output += [f"useful for dimensional analysis.", ""] + for unit in unit_kind.findall("UNIT"): + output += [f"- `{get_text(unit)}`"] + output += [""] + + write_file(output_dir / "units.md", "\n".join(output)) + + # ====================================================================================== def build_input_reference(root: ET.Element, output_dir: Path) -> None: num_files_written = process_section(root, ("CP2K_INPUT",), False, output_dir) diff --git a/docs/units.md b/docs/units.md deleted file mode 100644 index 69c60109ef..0000000000 --- a/docs/units.md +++ /dev/null @@ -1,108 +0,0 @@ -# Units - -CP2K Available Units of Measurement - -## Energy - -Possible units of measurement for Energies. The `[energy]` entry acts like a dummy flag (assumes the -unit of measurement of energy is in internal units), useful for dimensional analysis. - -- `hartree` -- `wavenumber_e` -- `joule` -- `kcalmol` -- `kjmol` -- `Ry` -- `eV` -- `keV` -- `K_e` -- `energy` - -## Length - -Possible units of measurement for Lengths. The `[length]` entry acts like a dummy flag (assumes the -unit of measurement of length is in internal units), useful for dimensional analysis. - -- `bohr` -- `m` -- `pm` -- `nm` -- `angstrom` -- `length` - -## Temperature - -Possible units of measurement for Temperature. The `[temperature]` entry acts like a dummy flag -(assumes the unit of measurement of temperature is in internal units), useful for dimensional -analysis. - -- `K` -- `au_temp` -- `temperature` - -## Pressure - -Possible units of measurement for Pressure. The `[pressure]` entry acts like a dummy flag (assumes -the unit of measurement of pressure is in internal units), useful for dimensional analysis. - -- `bar` -- `atm` -- `kbar` -- `Pa` -- `MPa` -- `GPa` -- `au_p` -- `pressure` - -## Angle - -Possible units of measurement for Angles. The `[angle]` entry acts like a dummy flag (assumes the -unit of measurement of angle is in internal units), useful for dimensional analysis. - -- `rad` -- `deg` -- `angle` - -## Time - -Possible units of measurement for Time. The `[time]` entry acts like a dummy flag (assumes the unit -of measurement of time is in internal units), useful for dimensional analysis. - -- `s` -- `fs` -- `ps` -- `au_t` -- `wavenumber_t` -- `time` - -## Mass - -Possible units of measurement for Masses. The `[mass`\] entry acts like a dummy flag (assumes the -unit of measurement of mass is in internal units), useful for dimensional analysis. - -- `kg` -- `amu` -- `m_e` -- `mass` - -## Potential - -Possible units of measurement for potentials. The `[potential]` entry acts like a dummy flag -(assumes the unit of measurement of potential is in internal units), useful for dimensional -analysis. - -- `volt` -- `au_pot` -- `potential` - -## Force - -Possible units of measurement for forces. The `[force]` entry acts like a dummy flag (assumes the -unit of measurement of force is in internal units), useful for dimensional analysis. - -- `N` -- `Newton` -- `mN` -- `mNewton` -- `au_f` -- `force` diff --git a/src/common/cp_units.F b/src/common/cp_units.F index be625f1f0d..83e482b499 100644 --- a/src/common/cp_units.F +++ b/src/common/cp_units.F @@ -121,7 +121,7 @@ MODULE cp_units PUBLIC :: cp_unit_create, cp_unit_release, & cp_unit_to_cp2k, cp_unit_from_cp2k, cp_unit_desc, & cp_unit_set_create, cp_unit_set_release, & - cp_unit_to_cp2k1, cp_unit_from_cp2k1, cp_unit_compatible, print_all_units + cp_unit_to_cp2k1, cp_unit_from_cp2k1, cp_unit_compatible, export_units_as_xml ! ************************************************************************************************** !> \brief stores a unit @@ -1308,88 +1308,46 @@ CONTAINS END SUBROUTINE cp_unit_set_release ! ************************************************************************************************** -!> \brief Prints info on all available units in CP2K -!> \param unit_nr ... -!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008 +!> \brief Exports all available units as XML. +!> \param iw ... +!> \author Ole Schuett ! ************************************************************************************************** - SUBROUTINE print_all_units(unit_nr) - INTEGER, INTENT(IN) :: unit_nr + SUBROUTINE export_units_as_xml(iw) + INTEGER, INTENT(IN) :: iw - CALL print_section_unit(unit_label="Undefined", description="If the default unit "// & - "of a keyword is explicitly undefined, all possible units of measurement can "// & - "be used to define a proper value.", & - units_set=s2a("internal_cp2k"), unit_nr=unit_nr) + CALL format_units_as_xml("energy", s2a("hartree", "wavenumber_e", "joule", "kcalmol", & + "kjmol", "Ry", "eV", "keV", "K_e"), iw) + CALL format_units_as_xml("length", s2a("bohr", "m", "pm", "nm", "angstrom"), iw) + CALL format_units_as_xml("temperature", s2a("K", "au_temp"), iw) + CALL format_units_as_xml("pressure", s2a("bar", "atm", "kbar", "Pa", "MPa", "GPa", "au_p"), iw) + CALL format_units_as_xml("angle", s2a("rad", "deg"), iw) + CALL format_units_as_xml("time", s2a("s", "fs", "ps", "au_t", "wavenumber_t"), iw) + CALL format_units_as_xml("mass", s2a("kg", "amu", "m_e"), iw) + CALL format_units_as_xml("potential", s2a("volt", "au_pot"), iw) + CALL format_units_as_xml("force", s2a("N", "Newton", "mN", "mNewton", "au_f"), iw) - CALL print_section_unit(unit_label="Energy", description="Possible units of measurement "// & - "for Energies. The [energy] entry acts like a dummy flag (assumes the unit of "// & - "measurement of energy is in internal units), useful for dimensional analysis.", & - units_set=s2a("hartree", "wavenumber_e", "joule", "kcalmol", "kjmol", "Ry", & - "eV", "keV", "K_e", "energy"), unit_nr=unit_nr) - - CALL print_section_unit(unit_label="Length", description="Possible units of measurement "// & - "for Lengths. The [length] entry acts like a dummy flag (assumes the unit of "// & - "measurement of length is in internal units), useful for dimensional analysis.", & - units_set=s2a("bohr", "m", "pm", "nm", "angstrom", "length"), unit_nr=unit_nr) - - CALL print_section_unit(unit_label="Temperature", description="Possible units of measurement "// & - "for Temperature. The [temperature] entry acts like a dummy flag (assumes the unit of "// & - "measurement of temperature is in internal units), useful for dimensional analysis.", & - units_set=s2a("K", "au_temp", "temperature"), unit_nr=unit_nr) - - CALL print_section_unit(unit_label="Pressure", description="Possible units of measurement "// & - "for Pressure. The [pressure] entry acts like a dummy flag (assumes the unit of "// & - "measurement of pressure is in internal units), useful for dimensional analysis.", & - units_set=s2a("bar", "atm", "kbar", "Pa", "MPa", "GPa", "au_p", "pressure"), & - unit_nr=unit_nr) - - CALL print_section_unit(unit_label="Angle", description="Possible units of measurement "// & - "for Angles. The [angle] entry acts like a dummy flag (assumes the unit of "// & - "measurement of angle is in internal units), useful for dimensional analysis.", & - units_set=s2a("rad", "deg", "angle"), unit_nr=unit_nr) - - CALL print_section_unit(unit_label="Time", description="Possible units of measurement "// & - "for Time. The [time] entry acts like a dummy flag (assumes the unit of "// & - "measurement of time is in internal units), useful for dimensional analysis.", & - units_set=s2a("s", "fs", "ps", "au_t", "wavenumber_t", "time"), unit_nr=unit_nr) - - CALL print_section_unit(unit_label="Mass", description="Possible units of measurement "// & - "for Masses. The [mass] entry acts like a dummy flag (assumes the unit of "// & - "measurement of mass is in internal units), useful for dimensional analysis.", & - units_set=s2a("kg", "amu", "m_e", "mass"), unit_nr=unit_nr) - - CALL print_section_unit(unit_label="Potential", description="Possible units of measurement "// & - "for potentials. The [potential] entry acts like a dummy flag (assumes the unit of "// & - "measurement of potential is in internal units), useful for dimensional analysis.", & - units_set=s2a("volt", "au_pot", "potential"), unit_nr=unit_nr) - - CALL print_section_unit(unit_label="Force", description="Possible units of measurement "// & - "for forces. The [force] entry acts like a dummy flag (assumes the unit of "// & - "measurement of force is in internal units), useful for dimensional analysis.", & - units_set=s2a("N", "Newton", "mN", "mNewton", "au_f", "force"), unit_nr=unit_nr) - - END SUBROUTINE print_all_units + END SUBROUTINE export_units_as_xml ! ************************************************************************************************** -!> \brief Prints info on all available units in CP2K - Low level -!> \param unit_label ... -!> \param description ... +!> \brief Format units as xml. +!> \param unit_kind ... !> \param units_set ... -!> \param unit_nr ... -!> \author Teodoro Laino [tlaino] - University of Zurich 10.2008 +!> \param iw ... +!> \author Ole Schuett ! ************************************************************************************************** - SUBROUTINE print_section_unit(unit_label, description, units_set, unit_nr) - CHARACTER(LEN=*), INTENT(IN) :: unit_label, description + SUBROUTINE format_units_as_xml(unit_kind, units_set, iw) + CHARACTER(LEN=*), INTENT(IN) :: unit_kind CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: units_set - INTEGER, INTENT(IN) :: unit_nr + INTEGER, INTENT(IN) :: iw INTEGER :: i - WRITE (unit_nr, FMT='(A)') "

"//TRIM(unit_label)//"

" - WRITE (unit_nr, FMT='(A)') description//"
" + WRITE (iw, FMT='(T2,A)') '' DO i = 1, SIZE(units_set) - WRITE (unit_nr, FMT='(A)') "
"//TRIM(units_set(i))//"
" + WRITE (iw, FMT='(T3,A)') ''//TRIM(units_set(i))//'' END DO - WRITE (unit_nr, FMT='(A)') "

" - END SUBROUTINE print_section_unit + WRITE (iw, FMT='(T3,A)') ''//TRIM(unit_kind)//'' ! internal unit + WRITE (iw, FMT='(T2,A)') '' + END SUBROUTINE format_units_as_xml END MODULE cp_units diff --git a/src/start/cp2k_runs.F b/src/start/cp2k_runs.F index 9784b6c66d..8977fb2638 100644 --- a/src/start/cp2k_runs.F +++ b/src/start/cp2k_runs.F @@ -43,7 +43,7 @@ MODULE cp2k_runs USE cp_units, ONLY: cp_unit_set_create,& cp_unit_set_release,& cp_unit_set_type,& - print_all_units + export_units_as_xml USE dbm_api, ONLY: dbm_library_print_stats USE environment, ONLY: cp2k_finalize,& cp2k_init,& @@ -914,6 +914,7 @@ CONTAINS " "//TRIM(compile_revision)//"" CALL export_references_as_xml(unit_number) + CALL export_units_as_xml(unit_number) DO i = 1, root_section%n_subsections CALL write_section_xml(root_section%subsections(i)%section, 1, unit_number) @@ -923,15 +924,6 @@ CONTAINS CALL close_file(unit_number=unit_number) CALL section_release(root_section) - ! Units - CALL open_file(unit_number=unit_number, file_name="units.html", & - file_action="WRITE", file_status="REPLACE") - WRITE (unit_number, FMT='(A)') "The cp2k units list" - WRITE (unit_number, FMT='(A)') "

CP2K Available Units of Measurement

" - CALL print_all_units(unit_nr=unit_number) - WRITE (unit_number, FMT='(A)') "" - CALL close_file(unit_number=unit_number) - END SUBROUTINE write_xml_file ! **************************************************************************************************