                    =======================================
                    Lunar Gravitational Maps 2026 (LGM2026)
                    =======================================


                                1. Introduction
                                ===============

LGM2026 are maps of the lunar gravitational field at the lunar topography and 
on its circumscribing sphere.  Depicted are the gravitational potential, the 
gravitational vector and the gravitational tensor at the spatial resolution of 
128 pixels per degree (~250 m at the equator).  LGM2026 relies on observed 
GRAIL gravity (harmonic degrees up 500, wavelengths up to 11 km at the equator) 
and gravity modeled from topography using 3D density (harmonic degrees beyond 
500, wavelengths shorter than 11 km at the equator).  The maps on the 
circumscribing sphere have been transformed into a spherical harmonic expansion 
of the lunar gravitational field up to degree 11519.


1.1 Recommendation
------------------

Before working with LGM2026 data, read at least Section 3.2.


1.2 Evaluation points
---------------------

The resolution of LGM2026 is 1/128 degree, so that each map consists of
23040 x 46080 pixels that are organized in a 2D grid.  For the grid 
registration, the pixel registration is used (in the jargon of Generic Mapping 
Tools), that is, all data refer to the pixel centers.

Vertically, the points of the lunar surface gravitational maps reside 
0.1 m above the lunar topography as represented by the LDEM128_PA_pixel_202405  
model (Neumann, 2024).  The points on the circumscribing sphere have a constant 
spherical radius of 1749 km.

Neumann, 2024; LOLA MOON_PA gridded dataset [Data set].  NASA Goddard Space 
    Flight Center Planetary Geodesy Data Archive.  doi: 
    https://doi.org/10.60903/LOLA_PA


1.3 Coordinate system of the maps
---------------------------------

All maps use the Moon's principal axes coordinate system.


1.4 Coordinate system of the gravitational vector and tensor
------------------------------------------------------------

The gravitational vector and the gravitational tensor are expressed in the 
local north-oriented reference frame (LNOF), which has the origin at the 
evaluation point, the x-axis points to the north, the y-axis points to the west 
and the z-axis points radially outwards.


1.5 Gravitational field
-----------------------

LGM2026 shows quantities of the gravitational field.  Neither the centrifugal 
field nor the normal gravity field are accounted for in LGM2026.  Given that 
the position of all LGM2026 points is published along with the maps, these 
contributions can be easily evaluated whenever necessary.


1.6 Accuracy
------------

The accuracy of the LGM2026 surface maps is estimated as follows:

    * 13 m**2 * s**-2 for the gravitational potential; once the normal 
      gravitational potential is subtracted, the accuracy improves by 3 to 
      4 orders of magnitude,

    * 2 mGal for the gravitational vector (1 mGal = 10**-5 m * s**-2),

    * 220 E for the diagonal elements of the gravitational tensor and a few 
      tens of E for the off-diagonal elements (1 E = 10**-9 s**-2).

The maps on the circumscribing sphere should be more accurate than the surface 
maps at least by 2 orders of magnitude for the gravitational potential, 1 order 
of magnitude for the gravitational vector and 2 orders of magnitude for the 
gravitational tensor.


1.7 Limitations
---------------

* Beyond degree 500, that is, at wavelengths shorter than ~11 km at the 
  equator, LGM2026 does not incorporate any observed gravitational data and 
  therefore it must not be geophysically or geologically interpreted at these 
  scales.

* Noise is present in the grids on the circumscribing sphere at scales shorter 
  than ~9 km for the gravitational potential, ~2 km for the gravitational 
  vector and ~650 meters for the gravitational tensor.  The surface maps are 
  not affected by this issue.

* The LDEM128_PA_pixel_202405 topography model contains artifacts which 
  propagated into LGM2026.  The artifacts are found mostly (but not only) at 
  latitudes beyond +-60 degree towards the poles.


1.8 Citation
------------

Bucha, B. 2026.  Lunar gravitational maps from GRAIL gravity, LRO and Kaguya 
    topography and 3D crustal density.  Submitted to Icarus.


1.9 Contact
-----------

Blazej Bucha, blazej.bucha@stuba.sk


                           2. Input Data and Methods
                           =========================

LGM2026 has two main constituents.

    * Long wavelengths are derived from the Kaula-constrained GRGM1200B 
      (Goossens et al, 2020) up to degree 500 (~11 km at the equator).  
      GRGM1200B is a spherical harmonic model of the lunar gravitational field 
      derived from GRAIL observations.

    * Short-scale gravitational signals were obtained by gravity-forward 
      modeling of lunar topography using 3D crustal density model.  The 
      topography was represented by LDEM128_PA_pixel_202405 model (Neumann, 
      2024) and the crustal density model was due to Goossens et al. (2020) 
      (the 3D linear density variant with the cap radius of 15 deg and the 
      degree range 250--650).

The long wavelength component of LGM2026 was obtained by spherical harmonic 
synthesis of GRGM1200B up to degree 500.

The short-scale signals were obtained by residual terrain modeling (RTM) using 
3D variable density.  Near-zone gravitational effects (up to 10 deg from 
evaluation points) were forward-modeled using tesseroids with radially variable 
density.  Far-zone gravitational effects (beyond 10 deg) were obtained by 
a spherical harmonic gravity-forward modeling modified to spherical caps and 3D 
densities.  The low-frequency RTM correction was applied to all LGM2026 
quantities.  The high-frequency RTM correction was not relevant due to the use 
of the spherical-harmonic-based spectral gravity-forward modeling.

Goossens S., Sabaka T. J., Wieczorek M. A., Neumann G. A., Mazarico E., Lemoine 
    F. G., Nicholas J. B., Smith D. E., Zuber M. T. (2020) High-resolution 
    gravity field models from GRAIL data and implications for models of the 
    density structure of the Moon's crust. Journal of Geophysical Research: 
    Planets 125:e2019JE006086, https://doi.org/10.1029/2019JE006086


                        3. Structure of the repository
                        ==============================

The structure of the LGM2026 repository is as follows:

    .
    |-- docs                            -- Directory with a research paper
    |   |                                  on LGM2026
    |   `-- lgm2026.pdf                 -- Manuscript on LGM2026
    |-- grids                           -- Directory with LGM2026 grids
    |   |-- checksums.zip               -- Check sums for all h5 files from 
    |   |                                  this directory
    |   |-- figures.zip                 -- Simple plots of data from the h5 
    |   |                                  files
    |   |-- N00E000.h5                  -- 36 HDF5 files with LGM2026 grids
    |   |-- N00E060.h5
    |   |-- ...
    |   `-- S90E300.h5
    |-- LICENSE                         -- CC BY 4.0 license, under which 
    |                                      LGM2026 data are published
    |-- README                          -- This file
    |-- software                        -- Directory with codes to read LGM2026
    |   `-- read_lgm2026.py             -- Example LGM2026 data reading in 
    |                                      Python
    `-- spherical-harmonic-coefficients -- Directory with spherical harmonic
    |   |                                  coefficients
    |   |-- checksums.zip               -- Checksums for "lgm2026.gfc"
    |   |-- figures.zip                 -- Plot of degree amplitudes of LGM2026
    |   `-- lgm2026.gfc                 -- Spherical harmonic coefficients of 
    |                                      the gravitational field up to degree 
    |                                      11519
    `-- visualization                   -- Directory with visualizations
        `-- lgm2026.mp4                 -- Video visualization of LGM2026


The size of the entire LGM2026 repository is about 167 GB.

LGM2026 grids are stored in the "./grids" folder using the HDF5 file format 
(suffix "h5"; see Section 3.1).  Each "h5" data file (4.6 GB) contains all 
LGM2026 maps within a range 30 degrees in latitude and 60 degrees in longitude 
(3840 by 7680 pixels).  The files are named by the coordinates of the 
south-westernmost pixel corner.  The pattern is

    [N|S]xxEyyy.h5

where

    "N" and "S" denote the northern and southern hemisphere, respectively,

    "xx" is the latitude of the southernmost pixel grid line,

    "E" denotes longitudes measured positively to the east and

    "yyy" is the longitude of the westernmost pixel grid line.

For instance, the latitude and the longitude of the south-westernmost (bottom 
left) pixel corner of the region in "N60E180.h5" is 60 deg and 180 deg, 
respectively.  For this tile, the latitude and the longitude of the 
south-westernmost pixel center are thus "60 + 1 / (2 * 128)" deg and "180 
+ 1 / (2 * 128)" deg, respectively.

The spherical harmonic coefficients of the lunar external gravitational field 
up to degree 11519 are stored in "spherical-harmonic-coefficients/lgm2026.gfc".  
The file format is defined by International Center for Global Earth Models 
(ICGEM; https://icgem.gfz.de/home).


3.1 Structure of HDF5 files
---------------------------

HDF5 is an open format to store and organize large datasets 
(https://www.hdfgroup.org/).  It organizes "datasets" into containers called 
"groups".  The datasets and groups may have attached small objects to them 
called "attributes".  HDF5 can be read by all commonly used programming 
languages.

All "h5" files in "./grids" share the same structure.  The first-level groups 
are:

    "/position"                     -- 3D position of evaluation points

    "/gravitational-field"          -- Full-scale gravitational maps
                                       (the main product)

    "/residual-gravitational-field" -- Residual gravitational maps from RTM
                                       (a by-product)

Each first-level group contains two second-level groups:

    "topography" -- Data associated with the maps residing at the lunar 
                    topography

    "sphere" -- Data associated with the maps residing on the circumscribing
                sphere

The second-level groups:

    "/position/topography"

    "/position/sphere"

contain three datasets:

    "latitude"  -- Spherical latitude of LGM2026 points
                   (centers of the pixels)

    "longitude" -- Spherical longitude of LGM2026 points
                   (centers of the pixels)

    "radius"    -- Spherical radius of LGM2026 points
                   (the vertical offset of 0.1 m mentioned in Section 1.2 is 
                   already accounted for in this dataset; do not add the
                   0.1 m offset)

The second-level groups:

    "/gravitational-field/topography"

    "/gravitational-field/sphere"

    "/residual-gravitational-field/topography"

    "/residual-gravitational-field/sphere"

contain 10 datasets (all in single precision):

    "v"   -- The gravitational potential

    "vx"  -- The x-element of the gravitational vector

    "vy"  -- The y-element of the gravitational vector

    "vz"  -- The z-element of the gravitational vector

    "vxx" -- The xx-element of the gravitational tensor

    "vxy" -- The xy-element of the gravitational tensor

    "vxz" -- The xz-element of the gravitational tensor

    "vyy" -- The yy-element of the gravitational tensor

    "vyz" -- The yz-element of the gravitational tensor

    "vzz" -- The zz-element of the gravitational tensor

Each dataset (including those in the "/position" group) has two attributes:

    "unit"   -- Physical unit of the dataset as a string

    "offset" -- Value that must be added to the associated dataset.  It may or 
                may not be zero.  The offset value of the same dataset (e.g., 
                "/gravitational-field/topography/vz") may vary between the 
                tiles.

                A simple rule that ensures proper data reading is to *always* 
                add the offset value to the dataset, be the offset zero or not, 
                and to always use only that offset, which is found in the same 
                tile as the dataset.

All floating points in the datasets and attributes are stored in single 
precision except for the "latitude" and "longitude" datasets and their "offset" 
attributes, which are stored in double precision.

A brief listing of the groups and datasets of each h5 file reads:

    /                                            Group
    /gravitational-field                         Group
    /gravitational-field/sphere                  Group
    /gravitational-field/sphere/v                Dataset {3840, 7680}
    /gravitational-field/sphere/vx               Dataset {3840, 7680}
    /gravitational-field/sphere/vxx              Dataset {3840, 7680}
    /gravitational-field/sphere/vxy              Dataset {3840, 7680}
    /gravitational-field/sphere/vxz              Dataset {3840, 7680}
    /gravitational-field/sphere/vy               Dataset {3840, 7680}
    /gravitational-field/sphere/vyy              Dataset {3840, 7680}
    /gravitational-field/sphere/vyz              Dataset {3840, 7680}
    /gravitational-field/sphere/vz               Dataset {3840, 7680}
    /gravitational-field/sphere/vzz              Dataset {3840, 7680}
    /gravitational-field/topography              Group
    /gravitational-field/topography/v            Dataset {3840, 7680}
    /gravitational-field/topography/vx           Dataset {3840, 7680}
    /gravitational-field/topography/vxx          Dataset {3840, 7680}
    /gravitational-field/topography/vxy          Dataset {3840, 7680}
    /gravitational-field/topography/vxz          Dataset {3840, 7680}
    /gravitational-field/topography/vy           Dataset {3840, 7680}
    /gravitational-field/topography/vyy          Dataset {3840, 7680}
    /gravitational-field/topography/vyz          Dataset {3840, 7680}
    /gravitational-field/topography/vz           Dataset {3840, 7680}
    /gravitational-field/topography/vzz          Dataset {3840, 7680}
    /position                                    Group
    /position/sphere                             Group
    /position/sphere/latitude                    Dataset {3840}
    /position/sphere/longitude                   Dataset {7680}
    /position/sphere/radius                      Dataset {SCALAR}
    /position/topography                         Group
    /position/topography/latitude                Dataset {3840}
    /position/topography/longitude               Dataset {7680}
    /position/topography/radius                  Dataset {3840, 7680}
    /residual-gravitational-field                Group
    /residual-gravitational-field/sphere         Group
    /residual-gravitational-field/sphere/v       Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vx      Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vxx     Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vxy     Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vxz     Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vy      Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vyy     Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vyz     Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vz      Dataset {3840, 7680}
    /residual-gravitational-field/sphere/vzz     Dataset {3840, 7680}
    /residual-gravitational-field/topography     Group
    /residual-gravitational-field/topography/v   Dataset {3840, 7680}
    /residual-gravitational-field/topography/vx  Dataset {3840, 7680}
    /residual-gravitational-field/topography/vxx Dataset {3840, 7680}
    /residual-gravitational-field/topography/vxy Dataset {3840, 7680}
    /residual-gravitational-field/topography/vxz Dataset {3840, 7680}
    /residual-gravitational-field/topography/vy  Dataset {3840, 7680}
    /residual-gravitational-field/topography/vyy Dataset {3840, 7680}
    /residual-gravitational-field/topography/vyz Dataset {3840, 7680}
    /residual-gravitational-field/topography/vz  Dataset {3840, 7680}
    /residual-gravitational-field/topography/vzz Dataset {3840, 7680}

A more lengthy list that shows not only the groups and datasets but also the 
attributes and the data types reads (for "N60E000.h5" as an example):

    HDF5 "./grids/N60E000.h5" {
    GROUP "/" {
       GROUP "gravitational-field" {
          GROUP "sphere" {
             DATASET "v" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vx" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxx" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vyy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vyz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vzz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
          }
          GROUP "topography" {
             DATASET "v" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vx" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxx" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vyy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vyz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vzz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
          }
       }
       GROUP "position" {
          GROUP "sphere" {
             DATASET "latitude" {
                DATATYPE  H5T_IEEE_F64LE
                DATASPACE  SIMPLE { ( 3840 ) / ( 3840 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F64LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "longitude" {
                DATATYPE  H5T_IEEE_F64LE
                DATASPACE  SIMPLE { ( 7680 ) / ( 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F64LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "radius" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SCALAR
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
          }
          GROUP "topography" {
             DATASET "latitude" {
                DATATYPE  H5T_IEEE_F64LE
                DATASPACE  SIMPLE { ( 3840 ) / ( 3840 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F64LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "longitude" {
                DATATYPE  H5T_IEEE_F64LE
                DATASPACE  SIMPLE { ( 7680 ) / ( 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F64LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "radius" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
          }
       }
       GROUP "residual-gravitational-field" {
          GROUP "sphere" {
             DATASET "v" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vx" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxx" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vyy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vyz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vzz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
          }
          GROUP "topography" {
             DATASET "v" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vx" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxx" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vxz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vyy" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vyz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
             DATASET "vzz" {
                DATATYPE  H5T_IEEE_F32LE
                DATASPACE  SIMPLE { ( 3840, 7680 ) / ( 3840, 7680 ) }
                ATTRIBUTE "offset" {
                   DATATYPE  H5T_IEEE_F32LE
                   DATASPACE  SCALAR
                }
                ATTRIBUTE "unit" {
                   DATATYPE  H5T_STRING {
                      STRSIZE H5T_VARIABLE;
                      STRPAD H5T_STR_NULLTERM;
                      CSET H5T_CSET_UTF8;
                      CTYPE H5T_C_S1;
                   }
                   DATASPACE  SCALAR
                }
             }
          }
       }
    }
    }

All array elements in the 2D datasets are stored first along latitude parallels 
(west to east) and then along meridians (north to south).  The first record is 
for the north-westernmost pixel.  If you read the files in programming 
languages that store arrays in the column-major format (Fortran, Julia, GNU 
Octave, MATLAB, ...), you may need to transpose the arrays after the reading to 
get the shape of 3840 by 7680 as shown above.  Programming languages following 
the row-major data storing method (C, C++, NumPy in Python, etc.) should load 
the arrays in the 3840 by 7680 shape by default.


3.2 Data processing
-------------------

Except for the "latitude" and "longitude" datasets and their "offset" 
attributes, all floating points are stored in single precision (32 bits, see 
Section 3.1).  In order not to loose accuracy when adding offsets to datasets, 
the following approach is recommended for the single precision datasets.

    1) Read your dataset in single precision.

    2) Cast your dataset to double precision.

       Naturally, this will almost certainly create garbage digits beyond the 
       7th digit or so, because the datasets cannot be represented exactly in 
       single precision.  But this is okay because, as long as the offsets have 
       not been applied, the single precision datasets are not accurate to that 
       many digits anyway.

    3) Read your offset in single precision.

    4) Cast your offset to double precision.

       This can be done exactly without any artificial digits (unlike in the 
       step 2), because all offsets take values that can be represented in 
       single precision exactly.

    5) Add your double precision offset to your double precision dataset.

    6) From now on, use only the double precision output from step 5) in your 
       code.

Without the casts, you may loose accuracy.  For instance, the gravitational 
potential may be rounded to integer values if not explicitly cast to double 
precision, simply because there are not enough bits in single precision to 
store the digits after the decimal point.


3.3 Example read in Python
--------------------------

See "./software/read_lgm2026.py".


                                    Funding
                                    =======

Funded by the EU NextGenerationEU through the Recovery and Resilience Plan for 
Slovakia under the project No. 09I03-03-V04-00273.



                                  Disclaimer
                                  ==========

The dataset provided here is offered "as-is" and without any warranties of any 
kind, either express or implied, including but not limited to the accuracy, 
completeness, reliability, or fitness for a particular purpose.  By using this 
dataset, you agree to assume all risks associated with its use.  Neither the 
dataset creator nor Slovak University of Technology in Bratislava take any 
responsibility for any damages, losses, or legal issues arising from the use of 
these data.
