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

Location:
src/Actions/FillAction
Files:
6 added
3 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified 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
  • TabularUnified src/Actions/FillAction/FillSurfaceAction.cpp

    r29b35e r55736b  
    4646#include "Filling/Mesh/MeshAdaptor.hpp"
    4747#include "Filling/Predicates/IsVoidNode_FillPredicate.hpp"
     48#include "Filling/Preparators/ShapeSurfaceFillerPreparator.hpp"
    4849#include "molecule.hpp"
    4950#include "Shapes/BaseShapes.hpp"
    5051#include "Shapes/ShapeRegistry.hpp"
     52#include "Shapes/ShapeType.hpp"
    5153#include "World.hpp"
    5254
     
    8183
    8284  // center filler's tip at origin
    83   Vector max;
    84   filler->CenterEdge(&max);
     85  filler->CenterEdge();
    8586
    8687  // determine center with respect to alignment axis
     
    9697  {
    9798    Vector translater = -1.*sum;
    98     filler->Translate(&translater);
    99   }
    100 
    101   // create predicate, mesh, and filler
    102   FillSurfaceState *UndoState = NULL;
    103   bool successflag = false;
    104   {
    105     FillPredicate *voidnode_predicate = new FillPredicate(
    106         IsVoidNode_FillPredicate(
    107             Sphere(zeroVec, params.mindistance.get())
    108             )
    109         );
    110 
    111 
    112     std::vector<Shape*> selectedShapes = ShapeRegistry::getInstance().getSelectedShapes();
    113     if (selectedShapes.size() != 1){
    114       STATUS("There has to be exactly 1 selected shape.");
     99    filler->Translate(translater);
     100  }
     101
     102  // prepare the filler preparator
     103  if (ShapeRegistry::getInstance().countSelectedShapes() != (size_t)1) {
     104    STATUS("Not exactly one shape selected.");
     105    return Action::failure;
     106  }
     107  const std::vector<Shape*> shapes = ShapeRegistry::getInstance().getSelectedShapes();
     108  const Shape &shape = **shapes.begin();
     109
     110  // hard check whether shape is of allowed type, not all are implemented
     111  // but these only fail with an assertion, hence not with disable-debug
     112  switch (shape.getType()) {
     113    case NowhereType:
     114    case EverywhereType:
     115      STATUS("The shape type "+toString(shape.getType())+" is currently not supported.");
     116      return Action::failure;
     117      break;
     118    default:
     119      break;
     120  }
     121
     122  ShapeSurfaceFillerPreparator filler_preparator(filler);
     123  if (params.SphereRadius.get() != 0.) {
     124    if (World::getInstance().beginAtomSelection() == World::getInstance().endAtomSelection()) {
     125      STATUS("You have given a sphere radius "+toString(params.SphereRadius.get())
     126          +" != 0, but have not select any atoms.");
    115127      return Action::failure;
    116128    }
    117 
    118     boost::function<const NodeSet ()> func =
    119         boost::bind(&Shape::getHomogeneousPointsOnSurface, boost::ref(*selectedShapes[0]), params.N.get());
    120     Mesh *mesh = new MeshAdaptor(func);
    121     Inserter *inserter = new Inserter(
    122         Inserter::impl_ptr(new SurfaceInserter(*selectedShapes[0], params.AlignedAxis.get())));
    123 
     129    std::vector<atom*> atoms(World::getInstance().getSelectedAtoms());
     130    filler_preparator.addSurfacePredicate(
     131        params.SphereRadius.get(),
     132        atoms);
     133  }
     134  filler_preparator.addVoidPredicate(params.mindistance.get());
     135  filler_preparator.addSurfaceRandomInserter(
     136      shape,
     137      params.AlignedAxis.get(),
     138      params.RandAtomDisplacement.get(),
     139      params.RandMoleculeDisplacement.get());
     140  filler_preparator.addShapeMesh(
     141      shape,
     142      params.N.get());
     143  if (!filler_preparator()) {
     144    STATUS("Filler was not fully constructed.");
     145    return Action::failure;
     146  }
     147
     148  // use filler
     149  bool successflag = false;
     150  FillSurfaceState *UndoState = NULL;
     151  {
    124152    // fill
    125153    {
    126       Filler *fillerFunction = new Filler(*mesh, *voidnode_predicate, *inserter);
     154      Filler *fillerFunction = filler_preparator.obtainFiller();
    127155      ClusterInterface::Cluster_impl cluster( new Cluster( filler->getAtomIds(), filler->getBoundingSphere() ) );
    128156      CopyAtoms_withBonds copyMethod;
     
    161189      }
    162190    }
    163 
    164     // remove
    165     delete mesh;
    166     delete inserter;
    167     delete voidnode_predicate;
    168191  }
    169192
  • TabularUnified src/Actions/FillAction/FillSurfaceAction.def

    r29b35e r55736b  
    2020// ValueStorage by the token "Z" -> first column: int, Z, "Z"
    2121// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
    22 #define paramtypes (unsigned int)(double)(Vector)
    23 #define paramtokens ("count")("min-distance")("Alignment-Axis")
    24 #define paramdescriptions ("number of instances to be added, changed according to geometric needs")("minimum distance between added instances")("The filler molecule is rotated relative to this alignment axis")
    25 #define paramdefaults (PARAM_DEFAULT(12))(PARAM_DEFAULT(1.))(NOPARAM_DEFAULT)
    26 #define paramreferences (N)(mindistance)(AlignedAxis)
     22#define paramtypes (unsigned int)(double)(double)(double)(double)(Vector)
     23#define paramtokens ("count")("min-distance")("tesselation-radius")("random-atom-displacement")("random-molecule-displacement")("Alignment-Axis")
     24#define paramdescriptions ("number of instances to be added, changed according to geometric needs")("minimum distance between added instances")("radius of rolling sphere in tesselating selected molecule's surfaces")("magnitude of random atom displacement")("magnitude of random molecule displacement")("The filler molecule is rotated relative to this alignment axis")
     25#define paramdefaults (PARAM_DEFAULT(12))(PARAM_DEFAULT(1.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(0.))(NOPARAM_DEFAULT)
     26#define paramreferences (N)(mindistance)(SphereRadius)(RandAtomDisplacement)(RandMoleculeDisplacement)(AlignedAxis)
    2727#define paramvalids \
    2828(DummyValidator< unsigned int >()) \
     29(BoxLengthValidator()) \
     30(BoxLengthValidator()) \
     31(BoxLengthValidator()) \
    2932(BoxLengthValidator()) \
    3033(VectorNotZeroValidator())
     
    3639#define CATEGORY Fill
    3740#define MENUNAME "fill"
    38 #define MENUPOSITION 1
     41#define MENUPOSITION 2
    3942#define ACTIONNAME Surface
    4043#define TOKEN "fill-surface"
Note: See TracChangeset for help on using the changeset viewer.