v2.1.1 2020-11-07
      * Reverse minor change in NCDefs.hh, which meant that client code which
        was including public NCrystal C++ headers was prevented from using constants
        like M_PI and friends (of course, usage of such constants is not
        portable, and thus not really recommended). Release 2.1.1 is otherwise
        completely identical to release 2.1.0.

v2.1.0 2020-11-06
      * Introduce the NCMAT v3 format, which supports @ATOMDB (github issue #21)
        and @CUSTOM_ sections (github issue #42). As usual, the file
        docs/ncmat_doc.md documents the new format in detail.
      * With the @ATOMDB section (and the related configuration parameter named
        atomdb, documented in NCMatCfg.hh), it is now possible to configure
        atomic compositions in a highly flexible manner. Thus, both enriched
        elements and impurities/dopants are now supported, and physics constants
        such as neutron scattering lengths can be overridden from the data file
        -- but most users will likely find plenty of materials in the internal
        database. This internal database has now been expanded with 261 isotopes
        in addition to the natural elements previously included (note that the
        constants for some natural elements have received slight tweaks for
        consistency).
      * The @CUSTOM sections provides a way to embed custom data in NCMAT files
        and having it end up on the Info object (accessible from
        C/C++/Python). This is mainly intended for people working on extending
        NCrystal with custom or experimental physics models, who need a
        mechanism for providing the extra data.  Note that by default NCrystal
        emits warnings when loading NCMAT files with @CUSTOM_ sections. This is
        because files with such sections are by their very nature associated
        with custom code development, and therefore can not be expected to
        provide consistent physics if shared with a wider community.  It is
        possible to silence these warnings, via the C++ API or an environment
        variable.
      * Support for using in-memory NCMAT data (github issue #20). This makes
        it possible to initialise materials from dynamic string-data in
        C++/Python/C, rather than needing on-disk files.
      * Add script ncrystal_ncmat2cpp which can be used to convert NCMAT files
        to C++ code which embeds the data directly in a binary, using the the
        new feature for in-memory NCMAT data.
      * Add CMake installation option for embedding the shipped .ncmat data
        files into the NCrystal shared library. Enable via CMake configuration
        flag -DEMBED_DATA=ON. The files are still accessible via their usual
        names in NCrystal cfg strings, e.g. createScatter("Al_sg225.ncmat") will
        still work, even if there will be no physical Al_sg225.ncmat file
        installed.
      * Added advanced C++ example which shows how it is possible to customize
        NCrystal and add a new physics model. The example also use the new
        features for in-memory files and @CUSTOM_ section in .ncmat files.
        The example is in the file examples/ncrystal_example_customphysics.cc
        (which compiles to the executable bin/ncrystal_example_customphysics
        when installing via CMake).
      * The internal database of elements and isotopes is now accessible also in
        the C and Python interfaces. In Python, one can iterate through all
        entries using the new module-level function named iterateAtomDB, or
        extract specific entries using the new module-level function named
        atomDB. The latter accepts either Z and A values, or strings such as
        "Al", "He3", etc.
      * The Python-API is made slightly more convenient, by equipping the
        Process and Scatter classes with new methods named xsect and
        genscat. These methods optionally accepts neutron wavelengths (by the wl
        parameter), and will delegate the calls to oriented and non-oriented
        functions depending on whether the parameter named direction was provided.
      * Various other improvements were done for the Python interface as well:
        AtomInfo, Compositions, and all Debye temperature methods are now
        accessible as well, there are now functionality for efficiently
        generating large amount of oriented scatterings, and finally all classes
        and methods now have proper doc-strings.
      * Various improvements were carried out in the C++ code: removed obsolete
        __cplusplus >= 201103L precompiler checks, added more string utility
        functions, made wl2ekin and ekin2wl constexpr, made createInfo(..)
        multi-thread safe, added NCRYSTAL_API macro to new classes and functions
        (including those introduced in v2.0.0). Remove custom UniquePtr class in
        favour of std::unique_ptr from C++11. Improve RCHolder class (*,->
        overloading, move semantics).
      * Fix radian->degree conversion in the plot of scatter angles versus
        wavelength provided by ncrystal_inspectfile (it was multiplying by 57
        instead of 180/pi which is 0.5% off).
      * Support the rare use-case of wanting HKL structure factors calculated
        with Debye-Waller factors forced to unity (github issue #22). Setting
        the NCRYSTAL_FILLHKL_FORCEUNITDEBYEWALLERFACTOR environment variable
        will now result in just this.
      * Parsing of NCMAT v1 files now more strictly adheres to the
        specification, and does not allow comments except as full-line comments
        before the first data section.
      * Info dumps will now detect and display simple fractions in atomic
        positions (e.g. "1/3" instead of "0.666667"). This only happens for
        denominators <=64 and for exact matches at full double-precision.
      * Internal NCrystal header files are now exposed in the internal sub-
        directory (github issue #46) with include statements like #include
        "NCrystal/internal/NCMath.hh" . These are meant to facilitate
        experimental development of new features, and are not guaranteed to
        present a stable API. They also do not in general contain NCRYSTAL_API
        statements needed for symbol visibility in certain builds.

v2.0.0 2020-08-13
      * Milestone 2.0.0 release!
      * The main feature of this release is that it finally brings proper
        state-of-the-art inelastic physics to NCrystal. Additionally, also
        incoherent-elastic scattering was cleaned up and made self-consistent,
        so NCrystal v2.0.0 can truly be said to be the release in which NCrystal
        finally moves beyond its former focus on Bragg diffraction. Additionally
        and also for the first time, NCrystal can now support the modelling of
        certain non-crystalline materials (e.g. liquids).
      * The actual changes between NCrystal v1.0.0 and v2.0.0 took place in ~500
        commits touching several hundreds of files, and are far too vast to list
        here in detail. However, the release announcement page for NCrystal
        2.0.0 attempts to provide a short summary of user-facing changes
        concerning physics capabilities, the materials data library, and the
        syntax of NCrystal configuration strings:
        https://github.com/mctools/ncrystal/wiki/Announcement-Release2.0.0
      * A few technical details warrent highlighting here though as they
        potentially impact deployment: Firstly, NCrystal now requires C++11 or
        later for compilation, the older standards C++98 and C++03 are no longer
        supported. Secondly, in order to support C++11, the standard NCrystal
        CMakeLists.txt file now requires CMake 3.1.0 or later (as opposed to the
        previous requirement of CMake 3.0.0). Finally, in order to backport
        std::span from C++20 for internal usage in NCrystal code, a single file
        (NCSpan.hh) is for now covered under the Boost Software License (the
        license text is included in the file NCSpan.hh itself). This license is
        even more permissive than the Apache 2.0 license which still covers the
        rest of the core NCrystal code, and as such this should not add any new
        licensing burdens to users.

v1.99.1 2020-08-11
      * Release candidate number 1 for the new major release v2.0.0. The only
        difference between this release and the release v2.0.0 is in a few
        pieces of documentation and changed wording in an error message. Thus,
        for all practical purposes it is identical to release v2.0.0.

v1.0.0 2019-07-05
      * Milestone 1.0.0 release!
      * Introduce new optional modelling of more realistic energy transfers in
        inelastic scattering which can be enabled by setting
        bkgd=phonondebye:modeldeltae. This feature is still to be considered
        highly experimental and unvalidated.
      * C-buffer length fixes for gcc 8.2.0.
      * Prefer importlib.import_module rather than exec in ncrystal_inspectfile

v0.9.19 2019-02-19
      * Default value of sccutoff parameter is moved slightly down, from 0.5Aa
        to 0.4Aa and to make the effect less complicated, fsquared values are no
        longer taken into account. The effect of the change is very small,
        influencing the single crystal mosaicity distributions slightly for
        neutrons with wavelengths below 1Aa.

v0.9.18 2019-01-24
      * SPACEGROUP field is now optional in .ncmat files (but is always provided
        in all official ones).
      * The loadNCMAT function now accepts std::string for convenience.

v0.9.17 2019-01-11
      * Change source for Quartz data file (results in small numerical changes only).
      * Add new datafile for Sodalite.
      * Updated year in copyright notice in all files.

v0.9.16 2018-12-18
      * Fix small mistake preventing compilation of McStas component.

v0.9.15 2018-12-18
      * Add three new materials, expanding coverage of data library: Uraninite,
        Aragonite and SiLu2O5.
      * Lower default dcutoff value for most .ncmat files to 0.1Aa, in response
        to validation plots of Uraninite.
      * Updated year in copyright notice in all files.
      * Laz/Lau file loader now deals correctly with missing lattice_b/lattice_c
        parameters, and performs sanity checks in all cases.
      * Provide convenience functions/methods to Info objects, providing
        d-spacing of a given hkl value.
      * FillHKL use numerically stable summation when calculating structure factors.
      * Add NCrystal version printout from the NCrystal_sample component in
        McStas. Also sanity check the header file and library versions found.
      * Add NCDebyeMSD utilities for getting mean squared atomic displacements
        in the Debye model and use in .ncmat factory (to replace isotropic
        Debye/Glauber model everywhere for consistency).
      * For cosmetic reasons, avoid signed negative zero in atomic positions.
      * Minor updates to .ncmat files (mostly cosmetic or rounding of numbers).

v0.9.14 2018-10-17
      * Minor change in Geant4 interface to support Geant4 10.4 and later releases.

v0.9.13 2018-09-27
      * Stop shipping hand-written .nxs files. Instead, attempt to auto-generate
        .nxs files from all shipped .ncmat files, and where possible ship
        those. This is done in order to ensure greater consistency and a lower
        burden of maintenance moving forward. During this process a few issues
        were found with Wyckoff positions in a few .nxs files, which should now
        be fixed by the new procedure.
      * Changed dcutoff for crystals with complex unit cells (like yttrium
        oxide) from 0.4Aa to 0.25Aa when loading from .ncmat. For all other
        .ncmat files in our data library, the value stays at 0.15Aa.
      * Fix LCBragg error in case of the double degenerate case where both
        neutron and lcaxis are parallel to (0,0,1).
      * Faster fillHKL function, in particular for very small dcutoff values.
      * The fillHKL function now supports the NCRYSTAL_FILLHKL_IGNOREFSQCUT
        environment variable, which can be used to disable the fsquarecut entirely.
      * Increased numerical stability in structure factor summation during
        PCBragg initialisation.
      * Phase out usage of non-standard constants like M_PI.
      * Increase MC overlay safety factor slightly for LCBragg scatter generation.
      * Improve colors and linestyles in ncrystal_inspectfile script.
      * LCBraggRef models use numerically stable summation.

v0.9.12 2018-08-28
      * Fix GaussMos cache-polution bug, where planes with similar d-spacing but
        different Fsquared could get wrong Q-factor in single crystals with large
        mosaicity.
      * Fix uninitialised variable in NCMatCfg.cc, affecting only floating point
        parameters not supporting units.
      * Allow re-seeding of the RandXRSR fallback RNG.
      * Add McStas example instrument file.
      * More checks for invalid geometry parameters in the McStas component.

v0.9.11 2018-08-18
      * Mark API functions and classes in an attempt to support Windows DLL
        builds and UNIX builds with -fvisibility=hidden (see github issue #17).
      * Add missing include in NCPCBragg.cc.

v0.9.10 2018-08-15
      * This release represents a large amount of work in many areas, and in
        particular focusing on aspects of Bragg diffraction in single crystals.
      * The Gaussian mosaicity modelling code was completely reimplemented,
        going back to the fundamental equations and making sure everything is
        carried out in a consistent and precise manner. Cross-section evaluation
        automatically selects between efficient numerical Romberg integrations
        and evaluation of new improved closed-form expressions, which takes the
        relevant spherically geometric into account. The code thus now
        gracefully handles everything from backscattering to forward scattering
        scenarios, and a large dynamic range of mosaicities, covering at least a
        range of 0.01arcseconds to tens of degrees.  Despite this, computational
        speed is also improved, thanks to various enhancements and in particular
        faster code for searching through the available plane normals. A new
        parameter, mosprec, can be used to tune the tradeoff between precision
        and speed. The default value of 1e-3 is likely adequate for almost all
        users.
      * Introducing a completely new and precise modelling of layered crystals,
        with the LCBragg class. This class, primarily intended to be used for
        modelling of Pyrolythic Graphite, by default takes the rotational
        aspects of such crystal into account using an from-first-principles
        approach to figuring out which sets of normals will contribute to the
        scattering cross-sections, and then finding the exact contribution
        through efficient numerical integrals. A crystal is considered to be a
        layered crystal if it has the lcaxis vector parameter set. Additionally,
        the lcmode parameter can be used to select slower reference parameters,
        which simply sample an SCBragg single-crystal instance many times, in
        different rotated systems.
      * Huge speedup when modelling low-wavelength (<1Aa) neutrons in single
        crystals: Approximate the very large number of very weak and
        uninteresting scatter planes at 2*d-spacings < 1Aa with an isotropic
        mosaicity distribution, which is a rather appropriate approximation due
        to the very large number of very weak planes involved. The cutoff value
        of dspacing=0.5Aa can be modified with the new sccutoff parameter.
      * Bragg diffraction in powders and polycrystals was never slow, but the
        PCbragg class was nonetheless rewritten to become even faster by working
        on energies directly, avoiding internal conversions to wavelength at
        each call.
      * Embedded an NCRYSTALMATCFG[lcaxis=0,0,1] statement in the data file
        C_sg194_pyrolytic_graphite.ncmat, so that it will by default be modelled
        as a layered crystal with the correct rotation axis, which is likely
        what almost all users will want.
      * Calling generateScattering where cross-sections are vanishing now
        generally leads to nothing happening (i.e. scatter_angle = 0 and
        delta_ekin=0) rather than the previous fallback of isotropic elastic
        scattering.
      * Retire RandSimple and introduce instead RandXRSR implementing the
        xoroshiro128+ generator. This means that the fall-back RNG option
        shipped with NCrystal is now not only fast, but also fully suitable for
        scientific work.
      * Fix bug in the NCrystal McStas component which resulted in wrong
        attenuation factors being calculated for the default absorption mode.
      * Changed the conversion constants used in the McStas component in order
        to make unit conversion issues in the NCrystal-McStas interface less
        likely to produce undesired imprecision. Further discussions with McStas
        devs will be needed in order to completely address the issue.
      * Code creating lattice rotation matrices was updated in order to avoid
        small rounding errors in the generated normals in most cases.
      * More sanity checks and input pruning of atomic positions and lattice
        structure loaded from input files. Also improved robustness of .nxs file
        loading.
      * Remove spurious ref-count increase in CalcBase::setRandomGenerator
        (thanks to A. Morozov for the report).
      * Fix windows builds (see github issue #17). Many thanks to A. Morozov for
        a detailed report.
      * Many general infrastructure improvements: Refactor random sampling
        algorithms from CalcBase objects (a necessary step for future enhanced
        MT support). Refactor orientation code from SCBragg (now used by both
        SCBragg and LCBragg). Refactor .ncmat loading code to disentangle the
        parsing code from the code. Lots of new utilities: Cubic splines,
        Romberg integration, root finding, derivative estimation. Single header
        NCDefs.hh providing all ubiquitous definitions and infrastructure
        related to memory handling and error reporting, and also handles
        includes which must get special treatment due to differences between
        platforms or C++ versions. Add UniquePtr (similar to C++11's
        unique_ptr). Add PlaneProvider (supported in PCBragg, SCBragg, LCBragg),
        for customizing which planes goes in which process. Avoid bind1st usage
        as it is removed in C++17. Custom functions for evaluating sine and
        cosine of angles in various ranges - between 5-10 times faster than the
        standard functions at 15 significant digits. Also add fast
        approximations for atan and exp. Performed careful changes to ncmin and
        ncmax functions with large performance implications (surprisingly,
        std::fmax generates very inefficient machine code:
        https://godbolt.org/g/Dxy52A ). Add helper class for efficiently
        generating sine and cosine values for all grid-points in a grid. PCBragg
        supports more custom constructors.

v0.9.9 2018-03-26
      * Expose loadNCMAT function to client C++ code, making it possible to work
        with .ncmat files completely independent from the factory
        infrastructure.
      * Cleanup internal .ncmat loading code, splitting out fillHKL to a new
        utility file and renaming old loader code to be purely a parser.
      * Allow Wyckoff positions and mean-squared-displacement parameters on
        NCInfo.
      * Rename standard factories to stdnxs, stdncmat, stdlaz, stdscat and
        stdabs respectively.
      * Allow factory-specific parameters to be passed along to info
        factories. Thus, expandhkl which was until now a global NCMatCfg
        parameter, is now a parameter specific to the stdncmat factory.  The
        stdnxs factory gets two flags: mcstaslike and fixpolyatom. The former
        makes nxs-provided bkgd curves use same composition as in the McStas nxs
        component (the default is to compose as in NXSG4).
      * Remove polyatom fix in wrapped nxslib code, so bkgd=external xs curves
        for .nxs files are now completely as in NXSG4, apart from the fact that
        our version contains fixes for crashes (reported upstream).
      * Rename NonOrientedScatter to IsotropicScatter.
      * Fix compilation error under some compilers in NCRCBase.hh.

v0.9.8 2018-03-19
      * Decouple PhononDebye background cross-section code from .ncmat format,
        making it the new default also for .nxs files. For .nxs files, it is
        still possible to select the old behaviour of using curves provided by
        nxslib itself by configuring those files with "bkgd=external".  A side
        benefit of this splitout can in some cases result in significant faster
        initialisation times when working with .ncmat files.
      * Major cleanup and renaming of configuration variables, in preparation of
        the 1.0.0 release milestone. The renames are: "mosaicity"->"mos",
        "orientationprimary"->"dir1", "orientationsecondary"->"dir2",
        "orientationtolerance"->"dirtol", "packingfactor"->"packfact",
        "dcutoffupper"->"dcutoffup", "scatterbkgdmodel"->"bkgd",
        "scatterfactory"->"scatfactory, "absorptionfactory"->"absnfactory" and
        "skippbragg" becomes "bragg" but with opposite logic, e.g. "bragg=0"
        disables Bragg diffraction. Removed entirely was the variables
        braggonly (use "bkgd=none" or "bkgd=0" instead now) and
        "nphonon". Experts can now instead tune parameters for specific
        background models by embedding them in the "bkgd" parameter value
        itself, e.g. "bkgd=phonondebye:nphonon@20".
      * Temporarily disable single-crystal speedup code while we investigate
        further, due to concerns that it is too aggresive (see github issue #13).

v0.9.7 2018-03-06
      * Don't produce floating point exception when loading .ncmat files with H,
        Li, Ti, V or Mn (github issue #8).
      * McStas component now actually applies requested packingfactor for powder
        materials (github issue #9).

v0.9.6 2018-02-07
      * Fix visualisation of box-shaped sample in McStas component.
      * Rename McStas component parameter multscatt to multscat.

v0.9.5 2018-02-05
      * Add support for python3 (github issue #6).

v0.9.4 2018-01-31
      * Correct version numbers.

v0.9.3 2018-01-31
      * NCrystal_sample.comp (McStas interface): Fix link flags on OSX
        (github issue #3) and compilation warnings (github issue #4).

v0.9.2 2018-01-23
      * Fix cross-section and material composition bugs in Geant4
        interface. Only affects Geant4 users.
      * CMakeLists.txt: Always use absolute rpath (needed on OSX).
      * Fix gcc7 compilation.

v0.9.1 2017-08-30
      * Proper behaviour of python interface if Numpy is absent.

v0.9.0 2017-08-30
      * First github based public release of NCrystal.

