Changeset 55736b for src/Actions/FillAction
- Timestamp:
- Sep 15, 2014, 2:22:29 PM (11 years ago)
- 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. - Location:
- src/Actions/FillAction
- Files:
-
- 6 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified src/Actions/FillAction/FillRegularGridAction.cpp ¶
r29b35e r55736b 44 44 #include "Filling/Cluster.hpp" 45 45 #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" 54 47 #include "molecule.hpp" 55 48 #include "MoleculeListClass.hpp" 56 49 #include "Parser/FormatParserInterface.hpp" 57 50 #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"63 51 #include "World.hpp" 64 65 52 66 53 #include <algorithm> … … 92 79 LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms."); 93 80 94 // c heck for selected molecules and create surfaces from them95 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); 99 86 if (params.SphereRadius.get() != 0.) { 100 if ( atoms.size() == 0) {87 if (World::getInstance().beginAtomSelection() == World::getInstance().endAtomSelection()) { 101 88 STATUS("You have given a sphere radius "+toString(params.SphereRadius.get()) 102 89 +" != 0, but have not select any atoms."); 103 90 return Action::failure; 104 91 } 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; 118 113 FillRegularGridState *UndoState = NULL; 119 bool successflag = false;120 114 { 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 139 115 // 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 } 180 139 } 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 } 189 155 } 190 156 -
TabularUnified src/Actions/FillAction/FillSurfaceAction.cpp ¶
r29b35e r55736b 46 46 #include "Filling/Mesh/MeshAdaptor.hpp" 47 47 #include "Filling/Predicates/IsVoidNode_FillPredicate.hpp" 48 #include "Filling/Preparators/ShapeSurfaceFillerPreparator.hpp" 48 49 #include "molecule.hpp" 49 50 #include "Shapes/BaseShapes.hpp" 50 51 #include "Shapes/ShapeRegistry.hpp" 52 #include "Shapes/ShapeType.hpp" 51 53 #include "World.hpp" 52 54 … … 81 83 82 84 // center filler's tip at origin 83 Vector max; 84 filler->CenterEdge(&max); 85 filler->CenterEdge(); 85 86 86 87 // determine center with respect to alignment axis … … 96 97 { 97 98 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."); 115 127 return Action::failure; 116 128 } 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 { 124 152 // fill 125 153 { 126 Filler *fillerFunction = new Filler(*mesh, *voidnode_predicate, *inserter);154 Filler *fillerFunction = filler_preparator.obtainFiller(); 127 155 ClusterInterface::Cluster_impl cluster( new Cluster( filler->getAtomIds(), filler->getBoundingSphere() ) ); 128 156 CopyAtoms_withBonds copyMethod; … … 161 189 } 162 190 } 163 164 // remove165 delete mesh;166 delete inserter;167 delete voidnode_predicate;168 191 } 169 192 -
TabularUnified src/Actions/FillAction/FillSurfaceAction.def ¶
r29b35e r55736b 20 20 // ValueStorage by the token "Z" -> first column: int, Z, "Z" 21 21 // "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) 27 27 #define paramvalids \ 28 28 (DummyValidator< unsigned int >()) \ 29 (BoxLengthValidator()) \ 30 (BoxLengthValidator()) \ 31 (BoxLengthValidator()) \ 29 32 (BoxLengthValidator()) \ 30 33 (VectorNotZeroValidator()) … … 36 39 #define CATEGORY Fill 37 40 #define MENUNAME "fill" 38 #define MENUPOSITION 141 #define MENUPOSITION 2 39 42 #define ACTIONNAME Surface 40 43 #define TOKEN "fill-surface"
Note:
See TracChangeset
for help on using the changeset viewer.