Changeset 57fda0
- Timestamp:
- Sep 14, 2016, 6:42:53 PM (8 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_StructOpt_integration_tests, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, GeometryObjects, Gui_displays_atomic_force_velocity, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, RotateToPrincipalAxisSystem_UndoRedo, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, Ubuntu_1604_changes, stable
- Children:
- b839fb
- Parents:
- 6a5eb2
- git-author:
- Frederik Heber <heber@…> (06/06/16 14:46:53)
- git-committer:
- Frederik Heber <heber@…> (09/14/16 18:42:53)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Fragmentation/Summation/SetValues/SamplingGrid.cpp
r6a5eb2 r57fda0 45 45 #include <boost/assign.hpp> 46 46 #include <boost/bind.hpp> 47 #include <boost/shared_ptr.hpp> 48 47 49 #include <algorithm> 48 50 #include <limits> … … 158 160 } 159 161 162 static void getDownsampledGrid( 163 const SamplingGrid &_reference_grid, 164 const SamplingGrid &_grid, 165 boost::shared_ptr<SamplingGrid> &_weight_downsampled) 166 { 167 static const double round_offset( 168 (std::numeric_limits<size_t>::round_style == std::round_toward_zero) ? 169 0.5 : 0.); // need offset to get to round_toward_nearest behavior 170 const int surplus_level = _reference_grid.getSurplusLevel(_grid)+round_offset; 171 // need to downsample first 172 _weight_downsampled.reset(new SamplingGrid); // may use default cstor as downsample does all settings 173 SamplingGrid::downsample(*_weight_downsampled, _grid, _reference_grid.level-surplus_level); 174 } 175 160 176 SamplingGrid& SamplingGrid::operator*=(const SamplingGrid& other) 161 177 { 162 178 // check that grids are compatible 163 if (isEquivalent(other)) { 164 /// get minimum of window 165 double min_begin_window[NDIM]; 166 double min_end_window[NDIM]; 167 bool doShrink = false; 168 for (size_t index=0; index<NDIM;++index) { 169 if (begin_window[index] <= other.begin_window[index]) { 170 min_begin_window[index] = other.begin_window[index]; 171 doShrink = true; 172 } else { 173 min_begin_window[index] = begin_window[index]; 174 } 175 if (end_window[index] <= other.end_window[index]) { 176 min_end_window[index] = end_window[index]; 177 } else { 178 min_end_window[index] = other.end_window[index]; 179 doShrink = true; 180 } 181 } 182 LOG(4, "DEBUG: min begin is " << min_begin_window[0] << "," << min_begin_window[1] << "," << min_begin_window[2] << "."); 183 LOG(4, "DEBUG: min end is " << min_end_window[0] << "," << min_end_window[1] << "," << min_end_window[2] << "."); 184 if (doShrink) 185 shrinkWindow(min_begin_window, min_end_window); 186 addWindowOntoWindow( 187 other.begin_window, 188 other.end_window, 189 begin_window, 190 end_window, 191 sampled_grid, 192 other.sampled_grid, 193 boost::bind(multiplyElements, _1, _2, 1.), 194 sourcewindow); 195 } else { 196 ASSERT(0, "SamplingGrid::operator*=() - multiplying incongruent grids is so far not in the cards."); 197 } 179 ASSERT(isCompatible(other), 180 "SamplingGrid::operator*=() - multiplying incomatible grids is so far not in the cards."); 181 const SamplingGrid *other_grid = &other; 182 boost::shared_ptr<SamplingGrid> other_downsampled; 183 if (!isEquivalent(other)) { 184 getDownsampledGrid(*this, other, other_downsampled); 185 other_grid = other_downsampled.get(); 186 } 187 /// get minimum of window 188 double min_begin_window[NDIM]; 189 double min_end_window[NDIM]; 190 bool doShrink = false; 191 for (size_t index=0; index<NDIM;++index) { 192 if (begin_window[index] <= other.begin_window[index]) { 193 min_begin_window[index] = other.begin_window[index]; 194 doShrink = true; 195 } else { 196 min_begin_window[index] = begin_window[index]; 197 } 198 if (end_window[index] <= other.end_window[index]) { 199 min_end_window[index] = end_window[index]; 200 } else { 201 min_end_window[index] = other.end_window[index]; 202 doShrink = true; 203 } 204 } 205 LOG(4, "DEBUG: min begin is " << min_begin_window[0] << "," << min_begin_window[1] << "," << min_begin_window[2] << "."); 206 LOG(4, "DEBUG: min end is " << min_end_window[0] << "," << min_end_window[1] << "," << min_end_window[2] << "."); 207 if (doShrink) 208 shrinkWindow(min_begin_window, min_end_window); 209 addWindowOntoWindow( 210 other_grid->begin_window, 211 other_grid->end_window, 212 begin_window, 213 end_window, 214 sampled_grid, 215 other_grid->sampled_grid, 216 boost::bind(multiplyElements, _1, _2, 1.), 217 sourcewindow); 218 198 219 return *this; 199 220 } … … 201 222 void SamplingGrid::superposeOtherGrids(const SamplingGrid &other, const double prefactor) 202 223 { 203 /// check that grids are compatible 204 if (isEquivalent(other)) { 205 /// get maximum of window 206 double max_begin_window[NDIM]; 207 double max_end_window[NDIM]; 208 bool doExtend = false; 209 for (size_t index=0; index<NDIM;++index) { 210 if (begin_window[index] >= other.begin_window[index]) { 211 max_begin_window[index] = other.begin_window[index]; 212 doExtend = true; 213 } else { 214 max_begin_window[index] = begin_window[index]; 215 } 216 if (end_window[index] >= other.end_window[index]) { 217 max_end_window[index] = end_window[index]; 218 } else { 219 max_end_window[index] = other.end_window[index]; 220 doExtend = true; 221 } 222 } 223 LOG(4, "DEBUG: max begin is " << max_begin_window[0] << "," << max_begin_window[1] << "," << max_begin_window[2] << "."); 224 LOG(4, "DEBUG: max end is " << max_end_window[0] << "," << max_end_window[1] << "," << max_end_window[2] << "."); 225 if (doExtend) 226 extendWindow(max_begin_window, max_end_window); 227 /// and copy other into larger window, too 228 addOntoWindow(other.begin_window, other.end_window, other.sampled_grid, prefactor); 229 } else { 230 ASSERT(0, "SamplingGrid::superposeOtherGrids() - superposing incompatible grids is so far not in the cards."); 231 } 224 // check that grids are compatible 225 ASSERT(isCompatible(other), 226 "SamplingGrid::superposeOtherGrids() - superposing incompatible grids is so far not in the cards."); 227 const SamplingGrid *other_grid = &other; 228 boost::shared_ptr<SamplingGrid> other_downsampled; 229 if (!isEquivalent(other)) { 230 getDownsampledGrid(*this, other, other_downsampled); 231 other_grid = other_downsampled.get(); 232 } 233 /// get maximum of window 234 double max_begin_window[NDIM]; 235 double max_end_window[NDIM]; 236 bool doExtend = false; 237 for (size_t index=0; index<NDIM;++index) { 238 if (begin_window[index] >= other.begin_window[index]) { 239 max_begin_window[index] = other.begin_window[index]; 240 doExtend = true; 241 } else { 242 max_begin_window[index] = begin_window[index]; 243 } 244 if (end_window[index] >= other.end_window[index]) { 245 max_end_window[index] = end_window[index]; 246 } else { 247 max_end_window[index] = other.end_window[index]; 248 doExtend = true; 249 } 250 } 251 LOG(4, "DEBUG: max begin is " << max_begin_window[0] << "," << max_begin_window[1] << "," << max_begin_window[2] << "."); 252 LOG(4, "DEBUG: max end is " << max_end_window[0] << "," << max_end_window[1] << "," << max_end_window[2] << "."); 253 if (doExtend) 254 extendWindow(max_begin_window, max_end_window); 255 /// and copy other into larger window, too 256 addOntoWindow(other_grid->begin_window, other_grid->end_window, other_grid->sampled_grid, prefactor); 232 257 } 233 258 … … 262 287 double SamplingGrid::integral(const SamplingGrid &weight) const 263 288 { 264 if (isEquivalent(weight)) { 265 const double volume_element = getVolume()/(double)getTotalGridPoints(); 266 double int_value = 0.; 267 sampledvalues_t::const_iterator iter = sampled_grid.begin(); 268 sampledvalues_t::const_iterator weightiter = weight.sampled_grid.begin(); 269 for (;iter != sampled_grid.end();++iter,++weightiter) 270 int_value += (*weightiter) * (*iter); 271 int_value *= volume_element; 272 //LOG(2, "DEBUG: SamplingGrid::integral() is " << scientific << setprecision(13) << int_value << "."); 273 return int_value; 274 } else 275 return 0.; 276 } 289 // check that grids are compatible 290 ASSERT(isCompatible(weight), 291 "SamplingGrid::integral() - integrating with weights from incompatible grids is so far not in the cards."); 292 const SamplingGrid *weight_grid = &weight; 293 boost::shared_ptr<SamplingGrid> weight_downsampled; 294 if (!isEquivalent(weight)) { 295 getDownsampledGrid(*this, weight, weight_downsampled); 296 weight_grid = weight_downsampled.get(); 297 } 298 const double volume_element = getVolume()/(double)getTotalGridPoints(); 299 double int_value = 0.; 300 sampledvalues_t::const_iterator iter = sampled_grid.begin(); 301 sampledvalues_t::const_iterator weightiter = weight_grid->sampled_grid.begin(); 302 for (;iter != sampled_grid.end();++iter,++weightiter) 303 int_value += (*weightiter) * (*iter); 304 int_value *= volume_element; 305 //LOG(2, "DEBUG: SamplingGrid::integral() is " << scientific << setprecision(13) << int_value << "."); 306 return int_value; 307 } 308 277 309 void SamplingGrid::setWindowSize( 278 310 const double _begin_window[NDIM],
Note:
See TracChangeset
for help on using the changeset viewer.