diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,1444 +1,1450 @@ +2020-05-28 Andy Buckley + + * Separate caching of x and Q2 variables in the + LogBicubicInterpolator: evidence suggests that these may be + updated at very different rates. + 2020-05-27 Andy Buckley * Add simple caching to the LogBicubicInterpolator -- will cache contiguous calls of the same (x,Q). Credit to Dmitri Konstantinov and Grigorii Latyshev for the patch. Needs thread-safety work. Significant CPU savings in many contexts. 2019-12-17 Andy Buckley * Add a Python mapping of the findFile() function. 2019-09-04 Andy Buckley * Add convenience accessor attributes to PDFUncertainty in Python. 2019-08-14 Andy Buckley * Fix lhapdf script handling of unknown index file and data directory paths. Thanks to Mateusz Ploskon. 2019-07-30 Andy Buckley * Use ast abstract syntax tree standard module rather than yaml to parse metadata value strings in Python. * Make PDFInfo Python mapping inherit from Info. * Change annotation storage to be pure YAML format rather than hand-rolled approximation for limited types. * Upgrade bundled yaml-cpp to v0.6.0 to solve parsing issues with complex types (thanks to Zahari Kassabov.) 2019-07-08 Andy Buckley * Actually delete the previous AlphaS object when calling PDF::setAlphaS(). 2019-06-04 Graeme Watt * Modify lhapdf script to support Content-Length in HTTP header not given as a list so that file size is calculated correctly for CERN EOS. 2019-05-21 Andy Buckley * Add a couple of extra trim() calls to path strings given to the Fortran API. 2019-05-11 Andy Buckley * Apply lhapdf script improvement from Ivan Razumov / Genser. 2019-05-10 Andy Buckley * Version 6.2.2! 2019-05-08 Andy Buckley * Don't pop the final path entry off in the pathsPrepend and pathsAppend functions: the compile-time fallback may have been disabled. 2019-05-02 Andy Buckley * Add a 'show' option to the lhapdf script. * Adapt MPI file-reading patch from Stefan Hoeche. Enable with --enable-mpi to configure. * Rewrite the lhapdf data-manager script to use argparse, for compatibility with Python 3. 2019-03-29 Andy Buckley * Apply compiler optimisation bypass "volatile" hack to default data path insertion. Thanks to Zahari Kassabov. 2018-12-17 Andy Buckley * Add legend PDF name aliasing to plotpdfs 2018-11-01 Graeme Watt * Explicitly catch x > xMax error in ContinuationExtrapolator. 2018-10-24 Graeme Watt * Don't require the presence of Content-Length in HTTP header. 2018-10-19 Andy Buckley * Utils.h: Fix separator bug in join() function. Thanks to Dmitry Kalinkin. 2018-08-20 Andy Buckley * Remove 'const's from return-by-value types in KnotArray.h, to keep icpc happy. 2018-05-16 Andy Buckley * Add lhapdf_lambda4/5 functions in the Fortran interface. * Remove unwanted pid argument from the Fortran xfx*_stdpartons functions. 2018-01-25 Andy Buckley * Move Config::get() static function from header to .cc, since a singleton needs to only 'live' in one compilation unit. 2017-09-05 Andy Buckley * Version 6.2.1! 2017-09-04 Andy Buckley * Fix signed/unsigned comparison in Fortran interface. 2017-08-31 Andy Buckley * Fix ccstr_to_fstr function, and hence several problems in the LHAGlue Fortran interface. 2017-08-28 Andy Buckley * Use lhapdf Python module in lhapdf script, to avoid YAML-parsing problems. 2017-08-27 Andy Buckley * Extend Python xfxQ and xfxQ2 functions to allow multiple PID values and 2-arg versions which return all PIDs. 2017-08-25 Andy Buckley * Make alphaS, interpolator, and extrapolator setting eager rather than lazy. * Remove unique_ptr from the public PDF.h header for now, for C++98 API compatibility. 2017-08-10 Andy Buckley * Eliminate C++11 features from headers, and moving some oversized inlines into .cc files. 2017-07-13 Andy Buckley * Version 6.2.0 release. 2017-07-11 Andy Buckley * Add warning printouts and some verbosity control to the LHAGlue Fortran setlhaparm function. 2017-07-09 Andy Buckley * Provide lookupPDF and lookupLHAPDFID functions accepting a single setname/mem string. * Finally removed Boost multi_array... and it was sooooo easy. Sorry for the delay! Validated. 2016-08-17 Andy Buckley * All Boost usage removed except multi_array. * Propagate C++11 compiler definition to Cython build and lhapdf-config; add --cxx flag to lhapdf-config. 2016-08-16 Andy Buckley * Add normal and chi-squared quantile functions, and incomplete gamma functions, extracted and converted by Graeme Watt based on ROOT and Cephes code. * Require C++11, and starting to remove Boost. 2016-02-16 Andy Buckley * Add x-grouped xf vs Q plots to plotpdfs, and allow the user to control which plot groups to make. 2016-02-09 Andy Buckley * Improvements to plotpdfs script. * Move scripts for installation into a bin directory. 2016-02-08 Andy Buckley * Corrections in the lhapdf manager script for Python3 compatibility. Thanks to Frank Siegert. 2015-12-22 Andy Buckley * Version 6.1.6 release! 2015-12-21 Andy Buckley * Add canonical PDF.orderQCD property to Python PDF, to replace PDF.qcdOrder. * Add PDF::quarkMass and PDF::quarkThreshold methods to C++ and Python. * Fix quark integer ID mapping to Down/Up metadata keys in AlphaS factory routine. 2015-12-18 Andy Buckley * Add a cstr_to_fstr function to LHAGlue.cc, for improved C++ to Fortran string conversion (handling length limits, padding rather than zero-termination, etc.) 2015-12-17 Andy Buckley * Add PDF::print() protection against being unable to read the PDF set index file, so there isn't a crash for the trivial reason of on-screen printout formatting when the data path is restricted with trailing ::. 2015-12-16 Andy Buckley * Fixes to the lhapdf script. Thanks again to Dmitry Kalinkin for a patch. * Add missing getlam4 and getlam5 functions to Fortran interface. Thanks to Dmitry Kalinkin for the patch. * Update Cython and Python interfaces to support Python3 syntax. Thanks to Vitaly Yermolchyk for the patches! * Update to even newer boost.m4 2015-12-03 Andy Buckley * Don't append the install prefix to path searches if $LHAPDF_DATA_PATH ends with a double-colon, ::. * De-inline the availablePDFSets() function, and veto duplicate set names. 2015-09-23 Graeme Watt * Determine number of parameter variation members by counting number of "+" signs in ErrorType, e.g. "replicas+as+mc+mb+mt". * Added a new checkPdfType() member function to PDFSet class. 2015-07-17 Graeme Watt * Added support for combined PDF+alphaS sets via new ErrorType values, i.e. "replicas+as", "hessian+as" and "symmhessian+as". 2015-04-10 Andy Buckley * Updating AUTHORS notice to final EPJC paper reference, and adding a final citation reminder message via the Config destructor. 2015-03-20 Andy Buckley * src/Factories.cc: Adding a set of expandPDFsStr(), decodePDFStr and decodePDFsStr functions to be used for handling more general PDF strings of the sort that will be used in the CompositePDF factory system. * Adding a default constructor and knotarrays() accessor to GridPDF, as requested by Nathan Hartland. 2015-01-09 Graeme Watt * Remove abs(...) twice in function PDFSet::randomValueFromHessian to correct a mistake in Eq. (6.5) of arXiv:1205.4024v2. The correction is necessary to ensure that correlations are preserved when converting a Hessian PDF set to a Monte Carlo PDF set. 2014-12-23 Andy Buckley * 6.1.5 release. 2014-12-22 Andy Buckley * Better error handling in PDF index lookup, including clearer reporting of set-unmatched PDF IDs and member numbers which are out of range for a valid set. * Restoring original active set member in LHAGlue metadata get* functions which were previously switching focus as a result of calling loadMember() to get numerical grid data. * Making LHAGlue Fortran interface switch the current set slot more coherently (has_photon is the exception). * Attempt to use Threshold* metadata keys for Fortran getthresholdm_ and old C++ wrapper getThreshold. Not yet fully supported in the rest of the system but we may as well pre-empt it while editing LHAGlue.cc. * Add missing getdescm_ and getdesc_ Fortran functions. * Add missing Fortran getdatapath function, cf. LHAPDF5 but with colon separators between multiple paths if appropriate. * Add Fortran lhapdf_getpdfsetlist function, returning the list of available PDF sets as a space-separated string. Note the lhapdf_ prefix -- this is the intended 'namespace' form for a new Fortran interface at some point. 2014-12-18 Andy Buckley * Remove obsolete config flags from lhapdf.conf * examples/compatibility.cc: Simplify compatibility macro checking. 2014-10-29 Andy Buckley * Add parsing and use of the internal PID data line in GridPDF.cc, in preference to the PDF::flavors() method. This fixes a bug, since flavors() was sorting the list, meaning that data files without monotonically sorted PID columns would wrongly assign PDFs to PIDs. 2014-10-08 Graeme Watt * Added new ContinuationExtrapolator to provide same extrapolation as in the MSTW standalone code (and LHAPDF5 when using MSTW sets). 2014-10-03 Andy Buckley * Better code organisation and protection against out-of-bounds array accesses in log-bicubic interpolator. 2014-08-28 Graeme Watt * Fallback to bilinear interpolator if using bicubic interpolator with only 2 or 3 Q2 knots in a subgrid. 2014-08-26 Andy Buckley * Improve LHAGlue info messages to not specify that particular generators are being used. 2014-08-19 Andy Buckley * LHAPDF 6.1.4 release 2014-08-15 Andy Buckley * Adding multiset variants of the 5 getmin/max LHAGlue functions. * Adding the 'unofficial' getminmax Fortran function to LHAGlue.cc (thanks to Andrey Sapronov for the report and patch). 2014-07-18 Andy Buckley * Treat PID 0 as an alias for 21 in PDF::hasFlavor as well as the PDF::xf* functions. Thanks to Nathan Hartland for the report. 2014-07-10 Andy Buckley * Clarify in lhapdf script help that 'list' by default shows all available sets, not those installed on the user's system. 2014-07-09 Andy Buckley * Update CONFIGFLAGS docs to fix some errors w.r.t. actual flag usage. * Treat a DataVersion of 0 as unvalidated: valid numbers now start at 1. * Remove the LHAPDF ID from the warning printout about unvalidated PDFs, since in that case there will usually be no standard ID number and it just gets unhelpfully reported as -1. * Detect and report improperly terminated grid files (ones missing a --- final line). * Replace asserts with exceptions and improve subgrid error reporting in GridPDF. * Report the value of Q2 that causes a subgrid-finding failure. * Improve testgrid to use PDFNAME/MEMNUM arg syntax. 2014-07-7 David Grellscheid * Forbid compilation if the demon combination of Boost < 1.47 and GCC >= 4.6, with a serious bug in BOOST_FOREACH, is found: http://code-muse.com/2013/08/06/boostforeach-and-compiler-bugs 2014-06-18 Karl Nordstrom * Improved AlphaS ODE solver performance. 2014-06-17 Andy Buckley * 6.1.3 release! * tests/Makefile.am: Add appropriate programs to "make installcheck". 2014-06-17 David Grellscheid * wrappers/python/Makefile.am: 'make distcheck' and out-of-source builds should work now. 2014-06-16 Andy Buckley * Add CVMFS and AFS downloading (by preference) to the lhapdf script, as well as user-configurable download sources and tarball removal. * Fix bug in PDF::qcdOrder method, and deprecate that method in favour of orderQCD (to match AlphaS and the flag name). * Further improvements to error messages when trying to load an invalid PDF. * Tweak output of testalphas.cc * Adding first make check targets (requires CT10nlo to be installed). 2014-06-15 Andy Buckley * Flavour thresholds in alpha_s solvers, and threshold subgrids from ODE solver (by Karl Nordstrom) * Add accessors to a PDF's AlphaS object and to an AlphaS' QCD order. 2014-06-12 Andy Buckley * Bump version number for next release. * Add mapping of reweighting functions into Python. 2014-06-11 Andy Buckley * Fix compiler warnings re. unused variables in LHAGlue.h and AlphaS.h headers. 2014-06-09 David Grellscheid * Fix attempted use of non-existent std::vector::find method. 2014-05-29 Andy Buckley * Change source name of analyticpdf example. * Adding a mini-constructor to PDF to make sure that _forcePos is set to a sane default value. 2014-05-28 Andy Buckley * 6.1.2 release! 2014-05-28 James Ferrando * Fix HWLHAPDF behaviour in pdfset 2014-05-27 Andy Buckley * 6.1.1 release! 2014-05-26 James Ferrando * Modify printout in PDFLIB backwards compatibility routine to avoid confusion for some HERWIG use cases 2014-05-22 Andy Buckley * Adding warnings about mismatching alpha_s in reweighting, with a default tolerance of 5%. 2014-05-20 Andy Buckley * Add LHAPDF/Reweighting.h with a few handy functions for doing 'naive' PDF reweighting. 2014-05-19 Andy Buckley * Replace all internal uses of "foreach" with explicit BOOST_FOREACH until C++11. 2014-05-17 Andy Buckley * Remigrate all NNPDF sets to remove duplicate Qmax points. 2014-05-10 Andy Buckley * Adding initLHAPDF() and a few other do-nothing compatibility functions. 2014-04-25 Andy Buckley * 6.1.0 release! 2014-04-24 Andy Buckley * Return -1 for errorConfLevel on replica PDF sets. * Mapping uncertainty functions into Python. 2014-04-21 Andy Buckley * Derive LHAPDF_VERSION_CODE integer using a Mac-safe sed regex. 2014-04-17 Andy Buckley * Fix pdfsets.index parsing (column order) in lhapdf script. * Supporting the pkg-config type --cflags and --libs switches on lhapdf-config. 2014-04-16 Andy Buckley * Adding an LHAPDF5 compatibility mode flag, Pythia6LambdaV5Compat, which sets all LambdaQCD common block values to 0.192 as was historically the case for PYTHIA6's use of LHAPDF. This behaviour is definitely physically incorrect, as well as against the spirit of the PYTHIA6 steering flags, but it is the long-term behaviour of PYTHIA6+LHAPDF and many PYTHIA6 MC tunes have been built around this behaviour. This flag is set 'true' by default to minimise user surprise -- if you want LHAPDF to report correct (i.e. varying by PDF) values to PYTHIA6, then explicitly set this flag to be false in lhapdf.conf or similar. 2014-04-15 Andy Buckley * Adding a single-string "dir style" SETNAME/NMEM syntax for accessing a PDF set+member. 2014-04-14 Andy Buckley * Adding the namespace protection workaround for Boost described at http://www.boost.org/doc/libs/1_55_0/doc/html/foreach.html * Adding AlphaS_FlavorScheme and AlphaS_NumFlavors metadata flags as optional specific versions for use by the AlphaS system, particularly if the alpha_s QCD evolution doesn't match that of the PDF itself. 2014-04-13 Andy Buckley * Adding a lhapdf.pc file for use by pkg-config * Check for sizes of subgrids required by each interpolator algorithm (linear ipol requires >= 2 knots, cubic requires >= 4). * Renumberings of several MRST and MSTW sets's global IDs: MRST2004qed_proton 20461->20463 MRST2004qed_neutron 20462->20465 MSTW2008lo90cl 21041->21050 MSTW2008nlo90cl 21141->21150 MSTW2008nnlo90cl 21241->21250 MSTW2008lo90cl_nf3 23041->23050 MSTW2008lo90cl_nf4 23141->23150 MSTW2008nlo90cl_nf3 23241->23250 MSTW2008nlo90cl_nf4 23341->23350 MSTW2008nnlo90cl_nf3 23541->23550 MSTW2008nnlo90cl_nf4 23641->23650 * Updates to the CONFIGFLAGS documention, removing some unused flags and adding the new Note flag. * Printing out a Note metadata entry on set initialization, if one is found. * Removing the metadata() functions from Info, since they were unused and did not respect the cascading design. 2014-03-25 Andy Buckley * More tweaking of the uncertainty function behaviour. * Adding in_range, in_open_range, in_closed_range functions. 2014-03-24 Andy Buckley * Removing compatibility auto-cast of PDFUncertainty to vector, converting remaining functions to use the struct, rationalising the previously split uncertainty() implementation, and code tidying. * Converting the uncertainty functions to add a no-copy version and to return a new struct rather than a vector. 2014-03-23 Andy Buckley * Moving new uncertainty functions into a new PDFSet.cc file to keep header clean. * Removing now unnecessary cmake check from configure and the docs. 2014-03-19 Andy Buckley * Convert lhapdf-yaml-cpp building to use libtool, avoiding linking portability issues. Re-enable static library building since the necessary symbols now seem to be present (and the libtool warning has also disappeared). 2014-03-16 Andy Buckley * Disable static library build for now, until we can figure out how to portably pull symbols from yaml-cpp into both shared and static libs via libtool. 2014-03-15 Andy Buckley * Adding more compatibility functions: getDescription, getLam4,5, and getOrderPDF functions in old C++ wrapper. 2014-03-15 Graeme Watt * Adding new example programs testpdfunc and hessian2replicas, functions for PDF uncertainties in PDFSet.h, and backwards compatibility functions (+ getnset_, getnmem_) in LHAGlue.cc. 2014-03-13 Andy Buckley * Adding implementations of getnf_, setpdfpath_ and placeholder getnset_, getnmem_ LHAGLUE functions. 2014-03-07 Andy Buckley * Doc updates, and added script and current output to generate a PDF sets list Doxygen/HTML input from sets found on the developer system. * Add a third column to the pdfsets.index file for version comparison by the manager script. 2014-03-05 Andy Buckley * Protect LHAGlue initialisation from unset Lambda values. 2014-02-12 Andy Buckley * Adding mkindex script, to generate pdfsets.index automatically from metadata. * Adding lhapdfID (using SetIndex) to PDFSet and mapping it and dataversion into Python. 2014-01-29 Andy Buckley * Adding the SetIndex and Parent metadata fields, and updating the creategrids script, pdfsets.index and tomigrate files accordingly. * Removing the external yaml-cpp build option, and improving/clarifying the internal yaml-cpp build and linking. 2014-01-27 Andy Buckley * Tweaks for better variable-passing to cmake in the bundled yaml-cpp build. 2014-01-22 Andy Buckley * configure.ac: Remove opportunistic C++11 build, until this becomes mandatory (with removalof Boost). Anyone who wants C++11 can explicitly set the CXXFLAGS (and DYLDFLAGS for pre-Mavericks Macs) 2013-12-20 Andy Buckley * Version 6.0.5 release. * Internally rename libyaml-cpp.a to liblhapdf-yaml-cpp.a to definitely avoid picking up one from the system. * Adding comment and empty line support to PDF index parsing, and updating pdfsets.index with missing PDFs and assigning LHAPDF IDs to ABM12, new MRST QED and MSTW sets, new NNPDF23 QED sets, and the first ATLAS PDF sets. 2013-12-19 Andy Buckley * Changing the YAML functions to operate in a mangled namespace if using the LHAPDF bundled version (a bit of sed and preprocessor: not too evil!) * Merging in the first version of the lhapdf manager script by David Hall. Thanks! * Further tweaking of the grid numerics parsing, using a variation on Gavin Salam's FastIStringStream class. 2013-12-17 Andy Buckley * Replacing use of the tokenizing istringstream in GridPDF.cc with basic ifstream seetg and tellg calls for initialisation speed improvement: thanks to David Grellscheid for the suggestion and implementation help! 2013-12-14 Andy Buckley * Adding a --disable-lhaglue-cxx configure switch and machinery to use it (disables building of LHAPDF5 C++ compatibility routines.) * Adding requested xfxphoton and getqmass_ functions and various Fortran wrapper fixes. 2013-12-13 Andy Buckley * Adding a typedef of auto_ptr as unique_ptr if not in C++0x or later. * Adding -DNDEBUG to the CXXFLAGS if not in debug mode. * Use C++11 compilation if available. 2013-12-11 Andy Buckley * Removing checking for and linking against Boost filesystem and system libs! * Replacing use of boost::filesystem::path and functions with home-made versions. * Adding use of a built-in yaml-cpp (0.3.0) if --with-yaml-cpp (or similar configure flags) are not specified. * Using intermediate static libs to build the source files that depend on YAML and Boost path stuff separately from the others. 2013-11-07 Andy Buckley * Adding -Qunused-arguments to CPPFLAGS (to keep clang++ quiet). 2013-11-04 Andy Buckley * Removing OpenMP directives: the One Definition Rule makes this usage dangerous/illegal, and I think we've agreed among developers to leave decisions about how to multithread up to the user for their specific case. 2013-10-28 Andy Buckley * tests/: adding testing of all available PDF sets' central info systems. * Factories.*: mkPDFInfo now returns PDFInfo* rather than Info*. 2013-10-18 Andy Buckley * Adding OpenMP directives to all-flavour functions in PDF.h. I don't see a big speed difference in profiling, though: -Ofast gives a much bigger speed-up. 2013-10-10 Andy Buckley * Small improvements to the banner messages when loading a whole PDF set. 2013-10-09 Andy Buckley * Version 6.0.4 release. * Being a wee bit smart and dropping the verbosity level temporarily when loading a whole set, to avoid flooding the terminal. * Tweaking banner and PDF printouts. * Adding verbosity() and setVerbosity() functions. 2013-10-07 James Ferrando * Fixed handling of Fortran string-in-common-block objects in the initPDFSet routine * Added missing initPDFSet variants w.r.t. lhapdf5. 2013-10-07 Andy Buckley * Adding banner printout if Verbosity > 0, and extra arg on print() methods. * More Cython mapping improvements -- PDFs can now return their parent set or info objects. * Improving error messages when PDF data files are not found. * Fixing various aspects of Info, PDFSet, PDFInfo mapping to Python. * src/LHAGlue.cc: Removing erroneous if "protection" blocks which broke PDF set re-initialisation. 2013-09-30 Andy Buckley * Version 6.0.3 release. 2013-09-26 Andy Buckley * Fixing and extending Cython wrappers for Info and subclasses. * Adding print() and dataversion() functions on PDF and PDFSet. 2013-09-25 Andy Buckley * Adding machinery for migration of the MRST2004qed set to creategrids. * Many improvements to creategrids correctness, efficiency, etc. 2013-09-23 Andy Buckley * Add mkPDFs templated vector-filling functions and update the testpdfset example program. * Add the -avoid-version flag to libtool. 2013-09-22 Andy Buckley * Change implementation of forced positivity to use an int value to allow for better caching and distinguishing between forced-positive and forced-positive-definite. The flag has been renamed to ForcePositive, to indicate that it triggers an action rather than just being some manually provided information about the PDF in question. 2013-09-06 James Ferrando * Modified PDFLIB comaptibility function to handle format of input arrays from POWHEG. 2013-09-03 Andy Buckley * Fixed misnaming in the automatic rewriting of cteq6ll -> cteq6l1. 2013-08-30 Steve Lloyd * Added functionality for forcing a loaded GridPDF to return positive definite values through the flag "PositiveDefinite" in the set metadata. This is to prevent overshooting in to negative values when interpolating/extrapolating. Updated creategrids script with a --force-pos-def flag to reflect this change. 2013-08-30 Andy Buckley * Adding do-nothing overloadings of the 2-arg fallback version of get_entry() to PDFSet and PDFInfo: it turns out that inheritance and multiple dispatch of class methods don't automatically play as nicely as you might think! 2013-08-29 Andy Buckley * 6.0.2 patch release. * Updating the version for the latest patch, and being more pessimistic about Boost compatibility: assuming that Boost 1.49 is the oldest compatible release until we hear otherwise. * Reworking the validation system to use 0 rather than 21 for the gluon ID (a simplification due to v5/v6 compatibility) and to allow building of top PDF validation plots. * Removing builds of examples and tests directories from the top-level default make target. 2013-08-29 James Ferrando * Fix some reference-type arguments in 'Fortran' functions to be const. * LHAGlue.h, LHAGlue.cpp: Fortran backwards compatibility routines for FEWZ 3.1, and a fix to the C++ backwards compatibility routines for getting min and max x and Q2. 2013-08-28 Andy Buckley * Removing necessity of Cython for tarball builds. 2013-08-16 Karl Nordstrom * Adding log-Q gradient extrapolation in AlphaS_Ipol. 2013-08-16 Andy Buckley * 6.0.1 patch release. * Disabling installation of the not-to-be-used 'sets' directory. 2013-08-11 Andy Buckley * Fixing an off-by-one error in alpha_s subgrid array creation. 2013-08-08 James Ferrando * Added several backwards-compatibility updates for fortran and C++ interfaces based on 6.0.0 feedback from David Hall and Marek Schoenherr. 2013-08-07 Andy Buckley * 6.0.0 release! 2013-08-06 Andy Buckley * Various remaining build system tweaks and updating the version code to 6.0.0rc in anticipation of release! * Added the lhaglue_get_current_pdf(nset=1) function for C++ access to the currently-used PDF via LHAGlue (intended as a workaround for cases where the old LHAPDF banner was grepped to work out the PDF identities). 2013-08-05 Andy Buckley * Adding subgridded alpha_s interpolation. * Enhancing plotting and comparison scripts for alpha_s comparison. 2013-07-31 Andy Buckley * Changing the Q2Min,Max flags to QMin,Max for better readability, etc. PDF and creategrids updated. 2013-07-30 Andy Buckley * Adding a migration/cmpplotv5v6 batch script and improving the accuracy measure definition. 2013-07-29 Andy Buckley * Changing the data format to list PDF Q knot values rather than Q2, for readability. * Fixing creategrids to respect flavour thresholds and subgrids with a --subgrids flag. 2013-07-12 Andy Buckley * Version number bump and tag as 6.0.0b3. Nearly ready for stable release! * Renaming LambdaX config flags to AlphaS_LambdaX, since their use is alpha_s-specific. 2013-07-10 Andy Buckley * Adding --top flag to creategrids, for dumping the 13-flavour NNPDF grids. * Adding dumping of alpha_s values to dumpv5v6. Some apparent alpha_s ipol problems for CTEQ6L1. 2013-07-08 Andy Buckley * Adding factory methods for making AlphaS objects direct from set names / member numbers. * Adding/updating NumFlavors + FlavorScheme metadata flags and add TODOs to respect them. * Updated ipol alpha_s solver to operate in log space: smoother behaviour now. * Karl made ODE and interpolation alpha_s solvers work nicely. * Adding fallback/default-return variants of the Info get_entry and get_entry_as methods. 2013-07-05 Andy Buckley * Many improvements to the creategrids migration script. * Populating many of the for-migration PDF entries in pdfsets.index. * Changing .lha data file extension to .dat to avoid clashing with LHA archive format. 2013-07-04 Andy Buckley * Write out AlphaS_Ipol info from creategrids if possible. * Use a more accurate MZ in lhapdf.conf and creategrids. * Add handling of MinLHAPDFVersion and DataVersion flags if present. * Fix LHAPDF_VERSION_CODE to be an int rather than string. * Renaming Info::metadata() to Info::get_entry(), plus Info::get_entry_as(), etc. 2013-07-03 Andy Buckley * Adding two PDF-level Info factory functions. * Using the cached/precomputed log(x) and log(Q2) values in the log-bicubic interpolator. Looks like an immediate factor of 5 speed-up :-D * Adding log(x) and log(Q2) knot position accessors to KnotArray1F and KnotArrayNF. * Adding log(x) and log(Q2) knot position arrays to KnotArray1F. * Converting the KnotArrayNF typedef to be a fully-fledged class. 2013-06-19 Andy Buckley * 6.0.0b2 release. * TODO list updated. * Adding PDFSet.mkPDF(mem) to the Python wrapper. * Various build tweaks for lxplus6 compatibility. * Reworking the connection of AlphaS to the Factory and PDF system a bit, and tweaking the tests. 2013-06-15 Andy Buckley * Adding Config.h, the Config class, and improved singleton mechanism for getting the global configuration object. Plus some testing of the globalness and persistency of config settings in tests/testinfo.cc 2013-06-12 Andy Buckley * Mapping addition of PDFSet, more factory functions, and related changes into Python. 2013-06-11 Andy Buckley * Adding default values to PDF::xMin/Max and PDF::q2Min/Max. 2013-06-10 Andy Buckley * Bump version number for 6.0.0 beta2 (hopefully to be released soon). * Adding an availablePDFSets() function. 2013-06-09 Andy Buckley * Adding an LHAPDF_VERSION_CODE macro for version detection. * Moving contents of Config.h -> Version.h (leaving Config.h name free for potential Info subclass). * Adding PDFSet::mkPDF(int). * Renaming return-type specialisations of Info::metadata() to metadata_to(), to avoid nasty template/untemplated method resolution errors once inheritance got involved. * Removing various deprecated path constructors and general related API rehashing. * Adding Info::metadata_local(key) * Renaming config() to getConfig() and moving to Factories, to match getPDFSet(name). * Using a new info cascading system including PDFSet. * Adding singleton system for PDFSet, and a dedicated PDFInfo type for member info. 2013-06-07 Andy Buckley * Rename ImplicitFlavorAction config flag to UndefFlavorAction * More build system tweaks, including removal of yaml-cpp flags from build of example programs that link against libLHAPDF. * Moving broken -I/-L and -D flag settings from configure.ac to selected Makefile.am's * Adding PDFSet, and migrating examples/testpdfset.cc to use it. 2013-05-17 Andy Buckley * Treat a request for PID = 0 as if PID 21 (gluon) had been requested. Useful for backward compatibility, but also just for convenience since it's much easier to just loop from -6 to 6 than to have to skip 0 and add 21 as a special case. 2013-05-12 Andy Buckley * Adding x/Q2/Q min/max (virtual) functions to the PDF interface. Default implementations use metadata keys only. * Adding in-place filling functions for map and vector PDF value containers, on the PDF interface. 2013-05-11 Andy Buckley * configure.ac, src/Info.cc: Re-adding yaml-cpp 0.3.x support via version detection in the configure script. 2013-05-07 Andy Buckley * src/Info.cc: Converting the YAML reading to use the yaml-cpp v0.5.x API. * Tweaking and fixing tests and build config. 2013-04-17 Andy Buckley * Adding a PDF set usage example (uses C++11 for now, for fun!) 2013-04-11 Andy Buckley * Rename of wrapper dir from cython -> python (reflect the target, not the way of achieving it). * Python extension build env fix 2013-04-10 Andy Buckley * Improving creategrids to use xmin and qmin/max when dumping LHpdf files and to allow a manual override for LHgrid dumps. CTEQ6L1 looking *almost* publicly acceptable now. * examples/: Resurrecting old testpdf.cc as an example (used by Doxygen) * migration/: Using compatibility stuff to improve dumpv5v6.cc * Adding LHAPDF_MAJOR_VERSION macro and examples/compatibility.cc * AUTHORS list tweak since James added substantial code for Fortran compatibility. * Adding copyright etc. notices to each file header. * Adding LHAPDF.h convenience header. 2013-04-09 Andy Buckley * Fix ctypes handling in creategrids * Adding ignoring (and writing) of a 3rd grid block line, to specify "internal flavor" ID codes. Not actually parsed or used... yet. * Cleaning up LHAGlue compilation warnings * Config flag updates and clarifications, and adding API mechanisms for numMembers and LHAPDF ID lookup. 2013-04-08 Andy Buckley * Further improved creategrid, comparison, and plotting scripts. Better high-xipol knots -> much better agreement. Nearly done. 2013-04-08 James Ferrando * Fortran PDFLIB function mapping works now: good agreement with LHA5 via PYTHIA6. 2013-04-05 Andy Buckley * migration/plotv5v6 improvements with line styles and labels. * Improved/fixed migration/creategrid which excludes grid points at x=0 (which screwed up handing over to extrapolation) and fixes numpy array manipulation. Low-x behaviour is now good, high-x needs some inspection: getting close to acceptable at last! * Fixes to dumpv5v6.cc flavour ID and output filenames. 2013-04-04 Andy Buckley * Re-enabling the -Wno-long-long flag if possible, to avoid build warnings stemming from yaml-cpp. 2013-04-03 Andy Buckley * migration/: Many updates to comparison scripts, and adding a plotv5v6 script and new README instructions. * migration/: Combined dumpv5.cc and dumpv6.cc into a single dumpv5v6.cc, with the version selected by a preprocessor macro. 2013-04-02 Andy Buckley * Build system fixes... *finally* working on lxplus! :-) 2013-03-25 Andy Buckley * Re-wrangling dump, comparison, and migration scripts. * Fixing accidental shift of LHAGlue default member from 0 -> 1. The default index = 1 should only apply to the multiset index used by non-multiset functions. 2013-03-24 Andy Buckley * Removing uses of Boost range algorithms -- nice, but apparently introduces a bit too much sensitivity on Boost version for some Mac and SL systems. * Adding a NotImplementedError! * Adding main PDFLIB functions as implemented in PYTHIA6's pdfdummies.f. 2013-03-23 Andy Buckley * Adding non-multiset versions of LHAGlue.cc functions. * Use 1 rather than 0 as the lowest (and default) multi-set index in LHAGlue.cc. 2013-03-15 Andy Buckley * Using much cleverer Boost discovery macros (with a slight fix) from https://github.com/tsuna/boost.m4. Need to feed back the fix... * Adding --with-boost-lib, --with-boost-inc, and --with-yaml-cpp-lib, --with-yaml-cpp-inc configure flags, particularly for use on systems where Boost's install is a bit borked and there is no common prefix dir for which $prefix/lib and $prefix/include are valid dirs. 2013-03-05 Andy Buckley * Convert LHAGlue.cc to load the 0th member on set initialisation, plus some other tweaks (this matches the v5 behaviour _and_ makes it much harder to get into an inconsistent state). 2013-03-03 Andy Buckley * Remove -ansi from the compiler setup (the long long in some yaml-cpp versions is causing trouble, at least on Macs with gcc 4.2) 2013-03-02 Andy Buckley * Adding an example script for using the Python wrapper, and improving/fixing the mkPDF mapping. 2013-03-01 Andy Buckley * Some LHAGlue fixes and improvements. * Fixing environment variable updating for path handling. * Adding Cython docstrings and path/version functions. * Integrating the Cython extension build into the autotools build/install. * Path handling and PDF data file search error reporting fixes/improvements. * Add a fallback to use LHAPATH if LHAPDF_DATA_PATH is undefined. (pre-deprecated?) * Re-enabling Cython mapping (only the basic functionality subset). * Adding LHAPDF::version() function. * Adding configure testing for -mt versions of Boost (file)system libs. 2013-02-28 Andy Buckley * Adding name+member and LHAPDF ID constructors for Info. * Moving config() out of Info. 2013-02-27 Andy Buckley * Implemented PDF::setname() and PDF::memberid(). 2013-02-26 Andy Buckley * Adding a lhapdf-config build assistant script. * Adding hacky first implementations of log-space interpolators. Separation of x and Q2 ipol seems ever more likely. * Started work on new LaTeX manual/paper, based on previous contribution from Ben and Marek. * Cleaning up defunct wrappers directories. * Fixing a bug in handling of nearest knot lookup for underflow x/Q2 requests. 2013-02-15 Andy Buckley * Adding installation and usage instructions to the Doxy manual. 2013-02-13 Andy Buckley * Fixing install path data lookup to include the 'LHAPDF' part. * Fixed use of interpolation up to the last knot (in Q2, at least) by making KnotArray1F::x/q2below never return the last index. 2013-02-12 Andy Buckley * Now installing pdfsets.index into the share dir. * Now installing lhapdf.conf into the share dir. * Header dependence reduction and include statement clean-up. * Reworking Interpolator and GridPDF interfaces to centralise index finding. KnotArray1F and NF are now defined as non-inner classes in a separate KnotArray.h header. 2013-02-11 Andy Buckley * Adding a new implementation of NearestPointExtrapolator. 2013-02-04 Andy Buckley * Adding migration/testpdf.cc and corresponding README instructions. * Removed debug printout from GridPDF.cc and re-added xKnots() and q2Knots() methods. * Updated creategrids script to new format. * Creating the migration directory. 2013-01-29 Andy Buckley * Updates to TODOs, CONFIGFLAGS, DESIGN, etc. after first dev meeting. * More Doxygen: making the namespace and free functions documented, with grouping. 2013-01-28 Andy Buckley * Adding backward compatibility special case treatment for the "cteq6ll" misspelling from prehistory. * Adding setting of available AlphaS params in the PDF interface. * Adding search path set/append/prepend functions, using the LHAPDF_DATA_PATH env variable. * More methods, and public access to most data members on AlphaS. 2013-01-25 Andy Buckley * Adding sorting of the flavor array when reading from metadata (and use of Boost range sort) * Fixed clearing of temp double* array variable so subgrid loading now works. Interpolation across subgrid boundaries not tested! * Added two more ways to assign the grid data arrays, but the original way seems fine. Now defining the grid data x/Q2 loop order. * Fixed the AnalyticPDF example: now simpler _and_ it works :) * A bit of virtual function rethinking on PDF. 2013-01-23 Andy Buckley * Adding code to allow comments in the grid data blocks. * Some DESIGN doc cleanup. * Moving tests and their output data files into the tests/ dir. * Build system tweaks: adding --with args to configure for Boost and yaml-cpp, and a 'doxy' target. 2013-01-22 Andy Buckley * Removing defunct data and knot members from GridPDF. * Including general doc files in Doxygen output and finessing Doxygen comments. * Adding Doxyfile.in with basic Doxy config. * Adding initial CONFIGFLAGS and CODINGSTYLE doc files. * AlphaS_ODE reworking -- lots needed. 2013-01-21 Andy Buckley * Adding an empty AlphaS_Ipol and making AlphaS_Analytic work with a smooth Lambda4/5 transition. * First PDF interpolation test added to testgrid.cc. Looks like it works! * Refactoring of the bicubic interpolator. * Fixed multi_array reshaping in PDFGrid loading. * Removing PDFSet files. * Disabling PWD searching due to infinite loop in calls to paths(). 2013-01-20 Andy Buckley * More alpha_s calculator evolution, mainly file splitting and adding more data members. 2013-01-19 Andy Buckley * Making inter/extrapolator loading lazy (and neater as a consequence!) * Renaming PDFGrid -> GridPDF. 2013-01-13 Andy Buckley * Using std::auto_ptr to handle Interpolator/Extrapolator assignment to PDFGrid, and cleaning up the interface and implementation a bit. * Using boost::shared_ptr to implement the memory handling in LHAGLUE. NB. not std::auto_ptr, or boost::scoped_ptr, and although std::unique_ptr would be ideal it requires C++11. * Adding alpha_s(Q2) calculation mechanism to the PDF interface. AlphaS calculation is not yet properly implemented and tested, though, cf. grid interpolation! * Adding src/Factories.cc to hide the implementation details / dependencies for factory users. * Added Info::metadata template specialisation to handle true/false/on/off/yes/no as well as 0/1 strings. * Add src/Paths.cc to avoid circular header dependencies. * Add LHAPDF_{INSTALL,DATA}_PREFIX variables and PwdInSearchPath config flag, and use them in search path determination. 2013-01-11 Andy Buckley * Start of the AlphaS refactoring. * Metadata methods and flavour list caching added to PDF. * Renaming PDFInfo.h/.cc to just Info.h/.cc * Renaming LHAPDFConfig.h -> Config.h * DESIGN doc updates. * Factory renaming and adding factory functions for PDF construction. * PDF and PDFInfo extra constructors from LHAPDF ID code. * Moving PDFInfo YAML reading into a new PDFInfo.cc to avoid an API header dependency. * Refactoring PDF filename construction etc. to minimise code duplication. * Adding the PDFIndex.h header and index lookup functions. * Adding the start of the LHA Fortran wrapper, based on the Py8 wrapper by Steve and Martin. 2013-01-10 Andy Buckley * More PDFGrid data loading development: improvements to the API and the data parser now works. * Adding the error extrapolator to the extrapolator factory function. 2013-01-09 Andy Buckley * A few tweaks to the info/data loader system: PDF loading from set name + member ID with cascading info/set/config levels WORKS! * Adding more constructors for PDFGrid, calling the new ones on PDF to populate the Info class. * Adding the EXAMPLEPDF directory for testing. 2013-01-08 Andy Buckley * Adding example lhapdf.conf. * Inlining, clean-up and other tweaks. * Adding PDF base constructors with loading apparatus for info from member files + discovery and loading of set-level info. 2013-01-07 Andy Buckley * Adding to_str variants for both single objects and for vectors of objects which are convertible to string via lexical_cast. * Adding the YAML parser operation to the Info class (and its subclasses). * Removing Types.h in favour of split Utils.h and Exceptions.h * include/LHAPDF/Paths.h: Adding path searching machinery (using Boost.Filesystem). 2013-01-02 Andy Buckley * Adding some of the necessary infrastructure for subgrids, and rewriting the grid format parser to handle separated subgrid blocks. Boost.MultiArray being used for the internal storage in place of the dynamically allocated C arrays. Metadata methods are currently disabled for porting to the cascading Info system. 2013-01-01 Andy Buckley * Major restructuring of the API: lots of subtle problems with the first attempt, and room for improvement. Painful, but worth the reworking to get it right. Lots left to do... see the TODO and DESIGN files for the ideas and tasks. 2012-10-22 Andy Buckley * Start of autotools build system on top of initial summer student work by Martin and Steve. diff --git a/src/LogBicubicInterpolator.cc b/src/LogBicubicInterpolator.cc --- a/src/LogBicubicInterpolator.cc +++ b/src/LogBicubicInterpolator.cc @@ -1,184 +1,187 @@ // -*- C++ -*- // // This file is part of LHAPDF // Copyright (C) 2012-2019 The LHAPDF collaboration (see AUTHORS for details) // #include "LHAPDF/LogBicubicInterpolator.h" #include namespace LHAPDF { namespace { // Unnamed namespace /// One-dimensional linear interpolation for y(x) inline double _interpolateLinear(double x, double xl, double xh, double yl, double yh) { assert(x >= xl); assert(xh >= x); return yl + (x - xl) / (xh - xl) * (yh - yl); } /// One-dimensional cubic interpolation inline double _interpolateCubic(double T, double VL, double VDL, double VH, double VDH) { // Pre-calculate powers of T const double t2 = T*T; const double t3 = t2*T; // Calculate left point const double p0 = (2*t3 - 3*t2 + 1)*VL; const double m0 = (t3 - 2*t2 + T)*VDL; // Calculate right point const double p1 = (-2*t3 + 3*t2)*VH; const double m1 = (t3 - t2)*VDH; return p0 + m0 + p1 + m1; } /// Calculate adjacent d(xf)/dx at all grid locations for fixed iq2 + /// + /// @todo Store pre-cached dlogxs, dlogq2s on subgrids, to replace these denominators? Any real speed gain for the extra memory? double _dxf_dlogx(const KnotArray1F& subgrid, size_t ix, size_t iq2) { const size_t nxknots = subgrid.xs().size(); - /// @todo Store pre-cached dlogxs, dlogq2s on subgrids, to replace these denominators? Any real speed gain for the extra memory? if (ix != 0 && ix != nxknots-1) { //< If central, use the central difference /// @note We evaluate the most likely condition first to help compiler branch prediction const double lddx = (subgrid.xf(ix, iq2) - subgrid.xf(ix-1, iq2)) / (subgrid.logxs()[ix] - subgrid.logxs()[ix-1]); const double rddx = (subgrid.xf(ix+1, iq2) - subgrid.xf(ix, iq2)) / (subgrid.logxs()[ix+1] - subgrid.logxs()[ix]); return (lddx + rddx) / 2.0; } else if (ix == 0) { //< If at leftmost edge, use forward difference return (subgrid.xf(ix+1, iq2) - subgrid.xf(ix, iq2)) / (subgrid.logxs()[ix+1] - subgrid.logxs()[ix]); } else if (ix == nxknots-1) { //< If at rightmost edge, use backward difference return (subgrid.xf(ix, iq2) - subgrid.xf(ix-1, iq2)) / (subgrid.logxs()[ix] - subgrid.logxs()[ix-1]); } else { throw LogicError("We shouldn't be able to get here!"); } } } - /// @brief Caching of interpolation weights + /// @brief Caching of interpolation params /// /// @todo Flavour-specific XQ caching? /// @todo Make thread-safe: mutex or thread-specific singletons? /// @todo Improve isSet locking: only false once, but tested and re-set every time -- use a better singleton instantiation scheme static struct XQ2Cache { // Defining params from last call (initialised to unphysical settings, so first call will set the cache) double x = -1; size_t ix = 0; double q2 = -1; size_t iq2 = 0; // Cached params double logx; double logq2; double dlogx_1; double tlogx; double dlogq_0; double dlogq_1; double dlogq_2; double tlogq; } _interpolateXQ2_cache; double LogBicubicInterpolator::_interpolateXQ2(const KnotArray1F& subgrid, double x, size_t ix, double q2, size_t iq2) const { // Raise an error if there are too few knots even for a linear fall-back const size_t nxknots = subgrid.logxs().size(); const size_t nq2knots = subgrid.logq2s().size(); if (nxknots < 4) throw GridError("PDF subgrids are required to have at least 4 x-knots for use with LogBicubicInterpolator"); if (nq2knots < 2) throw GridError("PDF subgrids are required to have at least 2 Q-knots for use with LogBicubicInterpolator"); // Check x and q index ranges -- we always need i and i+1 indices to be valid const size_t ixmax = nxknots - 1; const size_t iq2max = nq2knots - 1; if (ix+1 > ixmax) // also true if ix is off the end throw GridError("Attempting to access an x-knot index past the end of the array, in linear fallback mode"); if (iq2+1 > iq2max) // also true if iq2 is off the end throw GridError("Attempting to access an Q-knot index past the end of the array, in linear fallback mode"); - /// @todo Mutex for thread safety?? Thread-specific caches? + // Update the cache: separately for x and Q since they can be varied very differently + /// @todo Mutex for thread safety?? Thread-specific caches? More than one cache? /// @todo Fuzzy testing? - if (_interpolateXQ2_cache.x != x || _interpolateXQ2_cache.q2 != q2 || - _interpolateXQ2_cache.ix != ix || _interpolateXQ2_cache.iq2 != iq2) { + if (_interpolateXQ2_cache.x != x || _interpolateXQ2_cache.ix != ix) { _interpolateXQ2_cache.logx = log(x); - _interpolateXQ2_cache.logq2 = log(q2); _interpolateXQ2_cache.dlogx_1 = subgrid.logxs()[ix+1] - subgrid.logxs()[ix]; _interpolateXQ2_cache.tlogx = (_interpolateXQ2_cache.logx - subgrid.logxs()[ix]) / _interpolateXQ2_cache.dlogx_1; + } + if (_interpolateXQ2_cache.q2 != q2 || _interpolateXQ2_cache.iq2 != iq2) { + _interpolateXQ2_cache.logq2 = log(q2); _interpolateXQ2_cache.dlogq_0 = (iq2 != 0) ? subgrid.logq2s()[iq2] - subgrid.logq2s()[iq2-1] : -1; //< Don't evaluate (or use) if iq2-1 < 0 _interpolateXQ2_cache.dlogq_1 = subgrid.logq2s()[iq2+1] - subgrid.logq2s()[iq2]; _interpolateXQ2_cache.dlogq_2 = (iq2+1 != iq2max ) ? subgrid.logq2s()[iq2+2] - subgrid.logq2s()[iq2+1] : -1; //< Don't evaluate (or use) if iq2+2 > iq2max _interpolateXQ2_cache.tlogq = (_interpolateXQ2_cache.logq2 - subgrid.logq2s()[iq2]) / _interpolateXQ2_cache.dlogq_1; } const double logx = _interpolateXQ2_cache.logx; const double logq2 = _interpolateXQ2_cache.logq2; // Fall back to LogBilinearInterpolator if either 2 or 3 Q-knots if (nq2knots < 4) { // First interpolate in x const double logx0 = subgrid.logxs()[ix]; const double logx1 = subgrid.logxs()[ix+1]; const double f_ql = _interpolateLinear(logx, logx0, logx1, subgrid.xf(ix, iq2), subgrid.xf(ix+1, iq2)); const double f_qh = _interpolateLinear(logx, logx0, logx1, subgrid.xf(ix, iq2+1), subgrid.xf(ix+1, iq2+1)); // Then interpolate in Q2, using the x-ipol results as anchor points return _interpolateLinear(logq2, subgrid.logq2s()[iq2], subgrid.logq2s()[iq2+1], f_ql, f_qh); } // else proceed with cubic interpolation: // Pre-calculate parameters /// @todo Cache these between calls, re-using if x == x_prev and Q2 == Q2_prev const double dlogx_1 = _interpolateXQ2_cache.dlogx_1; const double tlogx = _interpolateXQ2_cache.tlogx; const double dlogq_0 = _interpolateXQ2_cache.dlogq_0; //< Don't evaluate (or use) if iq2-1 < 0 const double dlogq_1 = _interpolateXQ2_cache.dlogq_1; const double dlogq_2 = _interpolateXQ2_cache.dlogq_2; //< Don't evaluate (or use) if iq2+2 > iq2max const double tlogq = _interpolateXQ2_cache.tlogq; /// @todo Statically pre-compute the whole nx * nq gradiant array? I.e. _dxf_dlogx for all points in all subgrids. Memory ~doubling :-/ Could cache them as they are used... // Points in Q2 double vl = _interpolateCubic(tlogx, subgrid.xf(ix, iq2), _dxf_dlogx(subgrid, ix, iq2) * dlogx_1, subgrid.xf(ix+1, iq2), _dxf_dlogx(subgrid, ix+1, iq2) * dlogx_1); double vh = _interpolateCubic(tlogx, subgrid.xf(ix, iq2+1), _dxf_dlogx(subgrid, ix, iq2+1) * dlogx_1, subgrid.xf(ix+1, iq2+1), _dxf_dlogx(subgrid, ix+1, iq2+1) * dlogx_1); // Derivatives in Q2 double vdl, vdh; if (iq2 > 0 && iq2+1 < iq2max) { // Central difference for both q /// @note We evaluate the most likely condition first to help compiler branch prediction double vll = _interpolateCubic(tlogx, subgrid.xf(ix, iq2-1), _dxf_dlogx(subgrid, ix, iq2-1) * dlogx_1, subgrid.xf(ix+1, iq2-1), _dxf_dlogx(subgrid, ix+1, iq2-1) * dlogx_1); vdl = ( (vh - vl)/dlogq_1 + (vl - vll)/dlogq_0 ) / 2.0; double vhh = _interpolateCubic(tlogx, subgrid.xf(ix, iq2+2), _dxf_dlogx(subgrid, ix, iq2+2) * dlogx_1, subgrid.xf(ix+1, iq2+2), _dxf_dlogx(subgrid, ix+1, iq2+2) * dlogx_1); vdh = ( (vh - vl)/dlogq_1 + (vhh - vh)/dlogq_2 ) / 2.0; } else if (iq2 == 0) { // Forward difference for lower q vdl = (vh - vl) / dlogq_1; // Central difference for higher q double vhh = _interpolateCubic(tlogx, subgrid.xf(ix, iq2+2), _dxf_dlogx(subgrid, ix, iq2+2) * dlogx_1, subgrid.xf(ix+1, iq2+2), _dxf_dlogx(subgrid, ix+1, iq2+2) * dlogx_1); vdh = (vdl + (vhh - vh)/dlogq_2) / 2.0; } else if (iq2+1 == iq2max) { // Backward difference for higher q vdh = (vh - vl) / dlogq_1; // Central difference for lower q double vll = _interpolateCubic(tlogx, subgrid.xf(ix, iq2-1), _dxf_dlogx(subgrid, ix, iq2-1) * dlogx_1, subgrid.xf(ix+1, iq2-1), _dxf_dlogx(subgrid, ix+1, iq2-1) * dlogx_1); vdl = (vdh + (vl - vll)/dlogq_0) / 2.0; } else throw LogicError("We shouldn't be able to get here!"); vdl *= dlogq_1; vdh *= dlogq_1; return _interpolateCubic(tlogq, vl, vdl, vh, vdh); } }