star-hitran

Load line-by-line data from the HITRAN database
git clone git://git.meso-star.fr/star-hitran.git
Log | Files | Refs | README | LICENSE

shtr_line_list_c.h (4027B)


      1 /* Copyright (C) 2022, 2025, 2026 |Méso|Star> (contact@meso-star.com)
      2  * Copyright (C) 2025, 2026 Université de Lorraine
      3  * Copyright (C) 2022 Centre National de la Recherche Scientifique
      4  * Copyright (C) 2022 Université Paul Sabatier
      5  *
      6  * This program is free software: you can redistribute it and/or modify
      7  * it under the terms of the GNU General Public License as published by
      8  * the Free Software Foundation, either version 3 of the License, or
      9  * (at your option) any later version.
     10  *
     11  * This program is distributed in the hope that it will be useful,
     12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     14  * GNU General Public License for more details.
     15  *
     16  * You should have received a copy of the GNU General Public License
     17  * along with this program. If not, see <http://www.gnu.org/licenses/>. */
     18 
     19 #ifndef SHTR_LINE_LIST_C_H
     20 #define SHTR_LINE_LIST_C_H
     21 
     22 #include "shtr.h"
     23 
     24 #include <rsys/dynamic_array.h>
     25 #include <rsys/ref_count.h>
     26 
     27 /*
     28  * Brief summary of the design
     29  *
     30  * Since the number of lines can be very large, one of the challenges is to
     31  * reduce the memory footprint. Several line parameters are therefore encoded
     32  * with reduced precision (see “struct line”).
     33  *
     34  * Lines are saved in memory blocks of BLOCK_SIZE, stored in a dynamic arrayf.
     35  * Using a dynamic array of memory blocks rather than a simple dynamic array of
     36  * contiguous bytes is motivated by the issue of additional memory overhead
     37  * associated with the use of dynamic arrays for which the overall number of
     38  * entries is unknown. On the worst case, the memory overhead here is equal to
     39  * twice the number of blocks multiplied by the size of a pointer, compared to
     40  * twice the size required to store all the lines.
     41  */
     42 
     43 /* Size in bytes of a memory block in which compressed data is stored */
     44 #define BLOCK_SIZE (1024*1024)
     45 
     46 struct line {
     47   double wavenumber; /* Central wavenumber in vacuum [cm^-1] */
     48   double intensity; /* Reference intensity [cm^-1/(molec.cm^2)] */
     49   float lower_state_energy; /* [cm^-1] */
     50   float delta_air; /* Air-pressure wavenumber shift [cm^-1.atm^-1] */
     51 
     52   /* Packed data on 4 bytes:
     53    * - gamma_air in fixed precision (integer: 0; fractional: 14)
     54    * - gamma_self in fixed precision (integer: 0; fractional: 14)
     55    * - isotope_id_local on 4 bits.
     56    *
     57    * Note that the The value of the isotopic index is _not_ the value of the
     58    * isotopic index read from the HITRAN file. The original value is in [0, 9]
     59    * with 0 actually meaning 10. Thus, once decoded, the index is located in [1,
     60    * 10]. The next member variable simply stores this index but decremented by
     61    * one in order to make it compatible with C indexing. As a result, it can be
     62    * used directly to index the 'isotopes' array of a 'shtr_molecule' data
     63    * structure loaded from an isotope metadata file */
     64   int32_t gair14_gself14_isoid4;
     65 
     66   /* Temperature-dependent exponent. This is actually a floating-point number
     67    * with the last 7 bits of the mantissa disabled. They store the molecule
     68    * identifier. */
     69   int32_t nair25_molid7;
     70 };
     71 #define LINE_NULL__ {0}
     72 static const struct line LINE_NULL = LINE_NULL__;
     73 
     74 STATIC_ASSERT(sizeof(struct line)==32, Unexpected_sizeof_struct_line);
     75 
     76 /* Generate the dynamic array of char*, the dynamic array of memory blocks */
     77 #define DARRAY_NAME charp
     78 #define DARRAY_DATA char*
     79 #include <rsys/dynamic_array.h>
     80 
     81 /* Version of the line list. One should increment it and perform a version
     82  * management onto serialized data when the line list structure is updated. */
     83 static const int SHTR_LINE_LIST_VERSION = 2;
     84 
     85 /* Forward declaration */
     86 struct cache;
     87 
     88 struct shtr_line_list {
     89   /* Lines sorted in ascending order wrt their wavenumber */
     90   struct darray_charp blocks; /* Memory where compressed lines are stored */
     91   size_t nlines; /* Overall number of lines */
     92 
     93   /* Informations on line parameters */
     94   struct shtr_line_list_info info;
     95 
     96   struct shtr* shtr;
     97   ref_T ref;
     98 };
     99 
    100 #endif /* SHTR_LINE_LIST_C_H */