Ignore:
Timestamp:
Sep 15, 2014, 2:22:29 PM (11 years ago)
Author:
Frederik Heber <heber@…>
Branches:
Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, 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_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
Children:
b73545
Parents:
29b35e (diff), 5a9f4c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'Cleanup_old_code' into stable

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/FillAction/FillRegularGridAction.cpp

    r29b35e r55736b  
    4444#include "Filling/Cluster.hpp"
    4545#include "Filling/Filler.hpp"
    46 #include "Filling/Inserter/Inserter.hpp"
    47 #include "Filling/Inserter/RandomInserter.hpp"
    48 #include "Filling/Mesh/CubeMesh.hpp"
    49 #include "Filling/Predicates/IsInsideSurface_FillPredicate.hpp"
    50 #include "Filling/Predicates/IsVoidNode_FillPredicate.hpp"
    51 #include "Filling/Predicates/Ops_FillPredicate.hpp"
    52 #include "LinkedCell/linkedcell.hpp"
    53 #include "LinkedCell/PointCloudAdaptor.hpp"
     46#include "Filling/Preparators/BoxFillerPreparator.hpp"
    5447#include "molecule.hpp"
    5548#include "MoleculeListClass.hpp"
    5649#include "Parser/FormatParserInterface.hpp"
    5750#include "Parser/FormatParserStorage.hpp"
    58 #include "Shapes/BaseShapes.hpp"
    59 #include "Tesselation/tesselation.hpp"
    60 #include "Tesselation/BoundaryLineSet.hpp"
    61 #include "Tesselation/BoundaryTriangleSet.hpp"
    62 #include "Tesselation/CandidateForTesselation.hpp"
    6351#include "World.hpp"
    64 
    6552
    6653#include <algorithm>
     
    9279  LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms.");
    9380
    94   // check for selected molecules and create surfaces from them
    95   std::vector<atom *> atoms(World::getInstance().getSelectedAtoms());
    96   FillPredicate * surface_predicate = NULL;
    97   LinkedCell_deprecated * LC = NULL;
    98   Tesselation * TesselStruct = NULL;
     81  // center filler's tip at origin
     82  filler->CenterEdge();
     83
     84  // prepare the filler preparator
     85  BoxFillerPreparator filler_preparator(filler);
    9986  if (params.SphereRadius.get() != 0.) {
    100     if ( atoms.size() == 0) {
     87    if (World::getInstance().beginAtomSelection() == World::getInstance().endAtomSelection()) {
    10188      STATUS("You have given a sphere radius "+toString(params.SphereRadius.get())
    10289          +" != 0, but have not select any atoms.");
    10390      return Action::failure;
    10491    }
    105     // create adaptor for the selected atoms
    106     PointCloudAdaptor< std::vector<atom *> > cloud(&atoms, std::string("Selected atoms"));
    107 
    108     // create tesselation
    109     LC = new LinkedCell_deprecated(cloud, 2.*params.SphereRadius.get());
    110     TesselStruct = new Tesselation;
    111     (*TesselStruct)(cloud, params.SphereRadius.get());
    112 
    113     // and create predicate
    114     surface_predicate = new FillPredicate( IsInsideSurface_FillPredicate( *TesselStruct, *LC ) );
    115   }
    116 
    117   // create predicate, mesh, and filler
     92    std::vector<atom*> atoms(World::getInstance().getSelectedAtoms());
     93    filler_preparator.addSurfacePredicate(
     94        params.SphereRadius.get(),
     95        atoms);
     96  }
     97  filler_preparator.addVoidPredicate(params.mindistance.get());
     98  filler_preparator.addRandomInserter(
     99      params.RandAtomDisplacement.get(),
     100      params.RandMoleculeDisplacement.get(),
     101      params.DoRotate.get());
     102  filler_preparator.addCubeMesh(
     103      params.counts.get(),
     104      params.offset.get(),
     105      World::getInstance().getDomain().getM());
     106  if (!filler_preparator()) {
     107    STATUS("Filler was not fully constructed.");
     108    return Action::failure;
     109  }
     110
     111  // use filler
     112  bool successflag = false;
    118113  FillRegularGridState *UndoState = NULL;
    119   bool successflag = false;
    120114  {
    121     FillPredicate *voidnode_predicate = new FillPredicate(
    122         IsVoidNode_FillPredicate(
    123             Sphere(zeroVec, params.mindistance.get())
    124             )
    125         );
    126     FillPredicate Andpredicate = (*voidnode_predicate);
    127     if (surface_predicate != NULL)
    128       Andpredicate = (Andpredicate) && !(*surface_predicate);
    129     Mesh *mesh = new CubeMesh(params.counts.get(), params.offset.get(), World::getInstance().getDomain().getM());
    130     Inserter *inserter = new Inserter(
    131         Inserter::impl_ptr(
    132             new RandomInserter(
    133                 params.RandAtomDisplacement.get(),
    134                 params.RandMoleculeDisplacement.get(),
    135                 params.DoRotate.get())
    136             )
    137         );
    138 
    139115    // fill
    140     {
    141       Filler *fillerFunction = new Filler(*mesh, Andpredicate, *inserter);
    142       // TODO: When molecule::getBoundingSphere() does not use a sphere anymore,
    143       // we need to check whether we rotate the molecule randomly. For this to
    144       // work we need a sphere!
    145       const Shape s = filler->getBoundingSphere(params.RandAtomDisplacement.get());
    146       ClusterInterface::Cluster_impl cluster( new Cluster(filler->getAtomIds(), s) );
    147       CopyAtoms_withBonds copyMethod;
    148       Filler::ClusterVector_t ClonedClusters;
    149       successflag = (*fillerFunction)(copyMethod, cluster, ClonedClusters);
    150       delete fillerFunction;
    151 
    152       // append each cluster's atoms to clonedatoms (however not selected ones)
    153       std::vector<const atom *> clonedatoms;
    154       std::vector<AtomicInfo> clonedatominfos;
    155       for (Filler::ClusterVector_t::const_iterator iter = ClonedClusters.begin();
    156           iter != ClonedClusters.end(); ++iter) {
    157         const AtomIdSet &atoms = (*iter)->getAtomIds();
    158         clonedatoms.reserve(clonedatoms.size()+atoms.size());
    159         for (AtomIdSet::const_iterator atomiter = atoms.begin(); atomiter != atoms.end(); ++atomiter)
    160           if (!filler->containsAtom(*atomiter)) {
    161             clonedatoms.push_back( *atomiter );
    162             clonedatominfos.push_back( AtomicInfo(*(*atomiter)) );
    163           }
    164       }
    165       std::vector< BondInfo > clonedbonds;
    166       StoreBondInformationFromAtoms(clonedatoms, clonedbonds);
    167       LOG(2, "DEBUG: There are " << clonedatominfos.size() << " newly created atoms.");
    168 
    169       if (!successflag) {
    170         STATUS("Insertion failed, removing inserted clusters, translating original one back");
    171         RemoveAtomsFromAtomicInfo(clonedatominfos);
    172         clonedatoms.clear();
    173         SetAtomsFromAtomicInfo(movedatoms);
    174       } else {
    175         std::vector<Vector> MovedToVector(filler->size(), zeroVec);
    176         std::transform(filler->begin(), filler->end(), MovedToVector.begin(),
    177             boost::bind(&AtomInfo::getPosition, _1) );
    178         UndoState = new FillRegularGridState(clonedatominfos,clonedbonds,movedatoms,MovedToVector,params);
    179       }
     116    Filler *fillerFunction = filler_preparator.obtainFiller();
     117    // TODO: When molecule::getBoundingSphere() does not use a sphere anymore,
     118    // we need to check whether we rotate the molecule randomly. For this to
     119    // work we need a sphere!
     120    const Shape s = filler->getBoundingSphere(params.RandAtomDisplacement.get());
     121    ClusterInterface::Cluster_impl cluster( new Cluster(filler->getAtomIds(), s) );
     122    CopyAtoms_withBonds copyMethod;
     123    Filler::ClusterVector_t ClonedClusters;
     124    successflag = (*fillerFunction)(copyMethod, cluster, ClonedClusters);
     125    delete fillerFunction;
     126
     127    // append each cluster's atoms to clonedatoms (however not selected ones)
     128    std::vector<const atom *> clonedatoms;
     129    std::vector<AtomicInfo> clonedatominfos;
     130    for (Filler::ClusterVector_t::const_iterator iter = ClonedClusters.begin();
     131        iter != ClonedClusters.end(); ++iter) {
     132      const AtomIdSet &atoms = (*iter)->getAtomIds();
     133      clonedatoms.reserve(clonedatoms.size()+atoms.size());
     134      for (AtomIdSet::const_iterator atomiter = atoms.begin(); atomiter != atoms.end(); ++atomiter)
     135        if (!filler->containsAtom(*atomiter)) {
     136          clonedatoms.push_back( *atomiter );
     137          clonedatominfos.push_back( AtomicInfo(*(*atomiter)) );
     138        }
    180139    }
    181 
    182     // remove
    183     delete mesh;
    184     delete inserter;
    185     delete voidnode_predicate;
    186     delete surface_predicate;
    187     delete LC;
    188     delete TesselStruct;
     140    std::vector< BondInfo > clonedbonds;
     141    StoreBondInformationFromAtoms(clonedatoms, clonedbonds);
     142    LOG(2, "DEBUG: There are " << clonedatominfos.size() << " newly created atoms.");
     143
     144    if (!successflag) {
     145      STATUS("Insertion failed, removing inserted clusters, translating original one back");
     146      RemoveAtomsFromAtomicInfo(clonedatominfos);
     147      clonedatoms.clear();
     148      SetAtomsFromAtomicInfo(movedatoms);
     149    } else {
     150      std::vector<Vector> MovedToVector(filler->size(), zeroVec);
     151      std::transform(filler->begin(), filler->end(), MovedToVector.begin(),
     152          boost::bind(&AtomInfo::getPosition, _1) );
     153      UndoState = new FillRegularGridState(clonedatominfos,clonedbonds,movedatoms,MovedToVector,params);
     154    }
    189155  }
    190156
Note: See TracChangeset for help on using the changeset viewer.