From cd4e1753abbc99c8bf0695775ae87b0b0f69b92d Mon Sep 17 00:00:00 2001 From: Tristan Youngs Date: Fri, 15 May 2026 14:00:26 +0100 Subject: [PATCH] DoubleKeyedMap::clear() should not decide mirrored status. --- src/classes/histogramSet.cpp | 6 +- src/classes/neutronWeights.cpp | 8 +-- src/classes/neutronWeights.h | 8 +-- src/classes/partialSet.cpp | 24 +++---- src/classes/partialSetAccumulator.cpp | 12 ++-- src/classes/xRayWeights.cpp | 4 +- src/classes/xRayWeights.h | 4 +- src/modules/epsr/functions.cpp | 2 +- src/modules/epsr/process.cpp | 2 +- src/templates/doubleKeyedMap.h | 6 +- tests/data/species/ppScaleFactorTest.toml | 88 +++++++++++++++++++++++ 11 files changed, 124 insertions(+), 40 deletions(-) create mode 100644 tests/data/species/ppScaleFactorTest.toml diff --git a/src/classes/histogramSet.cpp b/src/classes/histogramSet.cpp index 90646a06b8..f3a67097fa 100644 --- a/src/classes/histogramSet.cpp +++ b/src/classes/histogramSet.cpp @@ -17,9 +17,9 @@ void HistogramSet::initialise(const std::vector &types, double { atomTypes_ = types; - fullHistograms_.clear(triangular_); - boundHistograms_.clear(triangular_); - unboundHistograms_.clear(triangular_); + fullHistograms_ = DoubleKeyedMap(triangular_); + boundHistograms_ = DoubleKeyedMap(triangular_); + unboundHistograms_ = DoubleKeyedMap(triangular_); dissolve::for_each_pair( ParallelPolicies::seq, atomTypes_, diff --git a/src/classes/neutronWeights.cpp b/src/classes/neutronWeights.cpp index 3ba0632756..6fafcaaca2 100644 --- a/src/classes/neutronWeights.cpp +++ b/src/classes/neutronWeights.cpp @@ -69,10 +69,10 @@ void NeutronWeights::calculateWeightingMatrices(const std::map concentrationProducts_; + DoubleKeyedMap concentrationProducts_{true}; // Bound coherent product matrix (bi * bj) - DoubleKeyedMap boundCoherentProducts_; + DoubleKeyedMap boundCoherentProducts_{true}; // Full scattering weights - DoubleKeyedMap weights_; + DoubleKeyedMap weights_{true}; // Intramolecular scattering weights - DoubleKeyedMap intramolecularWeights_; + DoubleKeyedMap intramolecularWeights_{true}; // Bound coherent average squared scattering (**2) double boundCoherentSquareOfAverage_; // Bound coherent squared average scattering () diff --git a/src/classes/partialSet.cpp b/src/classes/partialSet.cpp index 6754231028..d2c9892382 100644 --- a/src/classes/partialSet.cpp +++ b/src/classes/partialSet.cpp @@ -23,9 +23,9 @@ void PartialSet::initialise(const KeyedVector &speciesPopu triangular_ = triangular; - partials_.clear(triangular_); - boundPartials_.clear(triangular_); - unboundPartials_.clear(triangular_); + partials_ = DoubleKeyedMap(triangular_); + boundPartials_ = DoubleKeyedMap(triangular_); + unboundPartials_ = DoubleKeyedMap(triangular_); // Create data for partials and set tags dissolve::for_each_pair( @@ -58,9 +58,9 @@ void PartialSet::initialise(const KeyedVector &realSpec triangular_ = triangular; - partials_.clear(triangular_); - boundPartials_.clear(triangular_); - unboundPartials_.clear(triangular_); + partials_ = DoubleKeyedMap(triangular_); + boundPartials_ = DoubleKeyedMap(triangular_); + unboundPartials_ = DoubleKeyedMap(triangular_); // Create data for partials and set tags dissolve::for_each_pair( @@ -90,9 +90,9 @@ void PartialSet::initialise(const PartialSet &partialSet) triangular_ = partialSet.triangular_; rho_ = partialSet.rho_; - partials_.clear(triangular_); - boundPartials_.clear(triangular_); - unboundPartials_.clear(triangular_); + partials_ = DoubleKeyedMap(triangular_); + boundPartials_ = DoubleKeyedMap(triangular_); + unboundPartials_ = DoubleKeyedMap(triangular_); // Template data from source PartialSet and set tags dissolve::for_each_pair( @@ -491,9 +491,9 @@ bool PartialSet::deserialise(LineParser &parser, const CoreData &coreData) } // Clear partials - partials_.clear(triangular_); - boundPartials_.clear(triangular_); - unboundPartials_.clear(triangular_); + partials_ = DoubleKeyedMap(triangular_); + boundPartials_ = DoubleKeyedMap(triangular_); + unboundPartials_ = DoubleKeyedMap(triangular_); if (parser.getArgsDelim(LineParser::Defaults) != LineParser::Success) return false; diff --git a/src/classes/partialSetAccumulator.cpp b/src/classes/partialSetAccumulator.cpp index 7cb4f58e4e..b0da84a5be 100644 --- a/src/classes/partialSetAccumulator.cpp +++ b/src/classes/partialSetAccumulator.cpp @@ -12,9 +12,9 @@ void PartialSetAccumulator::operator+=(const PartialSet &source) // If this is the first accumulation, initialise our maps with the "mirrored" state of the source if (nAccumulated_ == 0) { - partials_.clear(source.partials().mirroredAreEquivalent()); - boundPartials_.clear(source.boundPartials().mirroredAreEquivalent()); - unboundPartials_.clear(source.unboundPartials().mirroredAreEquivalent()); + partials_ = DoubleKeyedMap(source.partials().mirroredAreEquivalent()); + boundPartials_ = DoubleKeyedMap(source.boundPartials().mirroredAreEquivalent()); + unboundPartials_ = DoubleKeyedMap(source.unboundPartials().mirroredAreEquivalent()); } // Full partials @@ -144,9 +144,9 @@ bool PartialSetAccumulator::deserialise(LineParser &parser) auto mirroredEquivalent = parser.argb(2); // Clear data - partials_.clear(mirroredEquivalent); - boundPartials_.clear(mirroredEquivalent); - unboundPartials_.clear(mirroredEquivalent); + partials_ = DoubleKeyedMap(mirroredEquivalent); + boundPartials_ = DoubleKeyedMap(mirroredEquivalent); + unboundPartials_ = DoubleKeyedMap(mirroredEquivalent); if (nAccumulated_ == 0) return true; diff --git a/src/classes/xRayWeights.cpp b/src/classes/xRayWeights.cpp index f9a244fac0..1ef044961f 100644 --- a/src/classes/xRayWeights.cpp +++ b/src/classes/xRayWeights.cpp @@ -46,8 +46,8 @@ bool XRayWeights::setUp(const std::map &speciesPopulati // Set up weights matrices auto nTypes = typeFractions_.size(); - concentrationProducts_.clear(true); - preFactors_.clear(true); + concentrationProducts_.clear(); + preFactors_.clear(); // Determine atomic concentration products and full pre-factor dissolve::for_each_pair(ParallelPolicies::seq, typeFractions_, diff --git a/src/classes/xRayWeights.h b/src/classes/xRayWeights.h index f0cbeaeab0..ff74320923 100644 --- a/src/classes/xRayWeights.h +++ b/src/classes/xRayWeights.h @@ -27,9 +27,9 @@ class XRayWeights // Form factor data for atom types std::map> formFactorData_; // Concentration product matrix (ci * cj) - DoubleKeyedMap concentrationProducts_; + DoubleKeyedMap concentrationProducts_{true}; // Pre-factors matrix (ci * cj * [2-dij]) - DoubleKeyedMap preFactors_; + DoubleKeyedMap preFactors_{true}; public: // Set-up from supplied species populations and form factors diff --git a/src/modules/epsr/functions.cpp b/src/modules/epsr/functions.cpp index fb6dae3123..e47a99a0ea 100644 --- a/src/modules/epsr/functions.cpp +++ b/src/modules/epsr/functions.cpp @@ -29,7 +29,7 @@ void EPSRModule::updateDeltaSQ(GenericList &processingData, // Realise the DeltaSQ array auto deltaSQ = processingData.realise>("DeltaSQ", name_, GenericItem::ItemFlag::NoFlags); - deltaSQ.clear(true); + deltaSQ = DoubleKeyedMap(true); for (auto &[key, calcSQ] : calculatedSQ) { diff --git a/src/modules/epsr/process.cpp b/src/modules/epsr/process.cpp index 25832f1807..9199d9cbce 100644 --- a/src/modules/epsr/process.cpp +++ b/src/modules/epsr/process.cpp @@ -214,7 +214,7 @@ Module::ExecutionResult EPSRModule::process(Dissolve &dissolve) // Create storage for our summed UnweightedSQ auto &calculatedUnweightedSQ = moduleData.realise>("UnweightedSQ", name_); - calculatedUnweightedSQ.clear(true); + calculatedUnweightedSQ = DoubleKeyedMap(true); dissolve::for_each_pair( ParallelPolicies::par, atomTypes, [&](int indexI, auto atI, int indexJ, auto atJ) { calculatedUnweightedSQ[{atI->name(), atJ->name()}].setTag(std::format("{}-{}", atI->name(), atJ->name())); }); diff --git a/src/templates/doubleKeyedMap.h b/src/templates/doubleKeyedMap.h index 67fa9883cb..644cd78fba 100644 --- a/src/templates/doubleKeyedMap.h +++ b/src/templates/doubleKeyedMap.h @@ -61,11 +61,7 @@ template class DoubleKeyedMap : public Serialisable<> public: // Clear data - void clear(bool mirrored = false) - { - data_.clear(); - mirroredAreEquivalent_ = mirrored; - } + void clear() { data_.clear(); } // Return whether the mirrored key pairs A-B and B-A are equivalent bool mirroredAreEquivalent() const { return mirroredAreEquivalent_; } // Set / overwrite key diff --git a/tests/data/species/ppScaleFactorTest.toml b/tests/data/species/ppScaleFactorTest.toml new file mode 100644 index 0000000000..24fd4f3deb --- /dev/null +++ b/tests/data/species/ppScaleFactorTest.toml @@ -0,0 +1,88 @@ + +[species] +name = "Unnamed" + +[species.atomTypes] + +[species.atomTypes.C1] +z = "C" +charge = -0.1 +form = "LJ" + +[species.atomTypes.C1.parameters] +epsilon = 1.0 +sigma = 3.0 + +[species.atomTypes.C2] +z = "C" +charge = 0.1 +form = "LJ" + +[species.atomTypes.C2.parameters] +epsilon = 1.0 +sigma = 3.0 + + +[[species.atoms]] +index = 1 +z = "C" +r = [ +-1.39, +0.0, +0.0, +] +q = -0.2 +type = "C1" +[[species.atoms]] +index = 2 +z = "C" +r = [ +-0.695, +1.20378, +0.0, +] +q = 0.2 +type = "C2" +[[species.atoms]] +index = 3 +z = "C" +r = [ +0.695, +1.20378, +0.0, +] +q = 0.2 +type = "C2" +[[species.atoms]] +index = 4 +z = "C" +r = [ +1.39, +0.0, +0.0, +] +q = -0.2 +type = "C1" + +[[species.bonds]] +form = "None" +i = 1 +j = 2 +[[species.bonds]] +form = "None" +i = 2 +j = 3 +[[species.bonds]] +form = "None" +i = 3 +j = 4 + +[[species.torsions]] +form = "None" +i = 1 +j = 2 +k = 3 +l = 4 +q14 = 0.5 +v14 = 0.5 +