- Timestamp:
- Mar 30, 2012, 9:18:25 AM (13 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:
- 7672551
- Parents:
- 345eda
- git-author:
- Frederik Heber <heber@…> (03/21/12 10:36:49)
- git-committer:
- Frederik Heber <heber@…> (03/30/12 09:18:25)
- Location:
- src/Actions/FillAction
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/FillAction/FillRegularGridAction.cpp
r345eda re9ad43 66 66 AtomVector presentatoms = World::getInstance().getAllAtoms(); 67 67 68 // get selected atoms and find containing sphere69 World::AtomComposite atoms = World::getInstance().getSelectedAtoms();70 if ( atoms.size() == 0) {71 ELOG( 2, "No atomsselected, aborting,");68 // get the filler molecule and move to origin 69 const std::vector< molecule *> molecules = World::getInstance().getSelectedMolecules(); 70 if (molecules.size() != 1) { 71 ELOG(1, "No exactly one molecule selected, aborting,"); 72 72 return Action::failure; 73 73 } 74 75 Vector center; 76 double radius = 0.; 77 { 78 center.Zero(); 79 for(World::AtomComposite::const_iterator iter = atoms.begin(); 80 iter != atoms.end(); ++iter) 81 center += (*iter)->getPosition(); 82 center *= 1./(double)atoms.size(); 83 for(World::AtomComposite::const_iterator iter = atoms.begin(); 84 iter != atoms.end(); ++iter) { 85 const Vector &position = (*iter)->getPosition(); 86 for (size_t i=0;i<NDIM;++i) { 87 const double temp_distance = fabs(position[i] - center[i]); 88 if (temp_distance > radius) 89 radius = temp_distance; 90 } 91 } 92 } 93 // always move cluster to be centered at origin 94 for(World::AtomComposite::iterator iter = atoms.begin(); 95 iter != atoms.end(); ++iter) 96 (*iter)->setPosition((*iter)->getPosition() - center); 97 if (radius == 0.) { // never have zero radius: set to one or less 98 ASSERT( (params.counts[0] != 0.) && (params.counts[1] != 0.) && (params.counts[2] != 0.), 99 "FillRegularGridAction::performCall() - counts must not be zero."); 100 const Vector diag(1./(double)(params.counts[0]+1), 1./(double)(params.counts[1]+1), 1./(double)(params.counts[2]+1)); 101 radius = std::min(1.,World::getInstance().getDomain().translateIn(diag).Norm()/2.); 102 } 103 // add some small boundary 104 radius += 1e+6*std::numeric_limits<double>::epsilon(); 105 radius = std::max(params.mindistance, radius); 106 LOG(2, "INFO: The " << atoms.size() << " are contained in a sphere at " 107 << center << " with radius " << radius << "."); 108 Shape *s = new Shape(Sphere(zeroVec, radius)); 109 LOG(2, "INFO: Created sphere at " << s->getCenter() << " and radius " << s->getRadius() << "."); 110 111 // create set of atomic ids 112 std::vector<atomId_t> atomIds(atoms.size(), (size_t)-1); 113 std::transform(atoms.begin(), atoms.end(), atomIds.begin(), 114 boost::bind(&atom::getId, _1) ); 115 Cluster::atomIdSet atomset(atomIds.begin(), atomIds.end()); 116 LOG(2, "INFO: Created atomset of size " << atomset.size() << "."); 117 118 // create cluster 119 ClusterInterface::Cluster_impl cluster(new Cluster(atomset, *s)); 120 LOG(2, "INFO: Created cluster of size " << atomset.size() << "."); 74 molecule *filler = *(molecules.begin()); 75 LOG(1, "INFO: Chosen molecule has " << filler->size() << " atoms."); 121 76 122 77 // check for selected molecules and create surfaces from them 123 const std::vector<molecule *> molecules = World::getInstance().getSelectedMolecules(); 124 typedef std::list<FillPredicate *> predicate_list_t; 125 typedef std::list<LinkedCell_deprecated *> LC_list_t; 126 typedef std::list<Tesselation *> Tesselation_list_t; 127 predicate_list_t surface_predicate_list; 128 LC_list_t LinkedCell_deprecated_list; 129 Tesselation_list_t Tesselation_list; 78 std::vector<atom *> atoms(World::getInstance().getSelectedAtoms()); 79 FillPredicate * surface_predicate = NULL; 80 LinkedCell_deprecated * LC = NULL; 81 Tesselation * TesselStruct = NULL; 130 82 if (params.SphereRadius != 0.) { 131 83 if ( molecules.size() == 0) { … … 133 85 << " != 0, but have not select any molecules."); 134 86 } 135 for (std::vector<molecule *>::const_iterator iter = molecules.begin(); 136 iter != molecules.end(); ++iter) { 137 // create adaptor for the current molecule 138 PointCloudAdaptor< molecule > cloud(*iter, (*iter)->name); 139 LinkedCell_deprecated_list.push_back( 140 new LinkedCell_deprecated(cloud, 2.*params.SphereRadius) 141 ); 87 // create adaptor for the selected atoms 88 PointCloudAdaptor< std::vector<atom *> > cloud(&atoms, std::string("Selected atoms")); 142 89 143 // create tesselation 144 Tesselation_list.push_back( 145 new Tesselation 146 ); 147 (*Tesselation_list.back())(cloud, params.SphereRadius); 90 // create tesselation 91 LC = new LinkedCell_deprecated(cloud, 2.*params.SphereRadius); 92 TesselStruct = new Tesselation; 93 (*TesselStruct)(cloud, params.SphereRadius); 148 94 149 // and create predicate 150 surface_predicate_list.push_back( 151 new FillPredicate( IsInsideSurface_FillPredicate( 152 *Tesselation_list.back(), 153 *LinkedCell_deprecated_list.back()) ) 154 ); 155 } 95 // and create predicate 96 surface_predicate = new FillPredicate( IsInsideSurface_FillPredicate( *TesselStruct, *LC ) ); 156 97 } 157 98 158 99 // create predicate, mesh, and filler 159 100 { 160 FillPredicate *voidnode_predicate = new FillPredicate( IsVoidNode_FillPredicate(*s) ); 101 FillPredicate *voidnode_predicate = new FillPredicate( 102 IsVoidNode_FillPredicate( 103 Sphere(zeroVec, params.mindistance) 104 ) 105 ); 161 106 FillPredicate Andpredicate = (*voidnode_predicate); 162 for (predicate_list_t::iterator iter = surface_predicate_list.begin(); 163 iter != surface_predicate_list.end(); ++iter) 164 Andpredicate = (Andpredicate) && !(**iter); 107 if (surface_predicate != NULL) 108 Andpredicate = (Andpredicate) && !(*surface_predicate); 165 109 Mesh *mesh = new CubeMesh(params.counts, params.offset, World::getInstance().getDomain().getM()); 166 Filler *fillerFunction = new Filler(*mesh, Andpredicate);167 110 168 111 // fill 169 CopyAtoms_withBonds copyMethod; 170 (*fillerFunction)(copyMethod, cluster); 112 { 113 Filler *fillerFunction = new Filler(*mesh, Andpredicate); 114 ClusterInterface::Cluster_impl cluster( new Cluster( filler->getAtomIds(), filler->getBoundingShape()) ); 115 CopyAtoms_withBonds copyMethod; 116 (*fillerFunction)(copyMethod, cluster); 117 delete fillerFunction; 118 } 171 119 172 120 // remove 173 delete fillerFunction;174 121 delete mesh; 175 122 delete voidnode_predicate; 176 for (LC_list_t::iterator iter = LinkedCell_deprecated_list.begin(); 177 iter != LinkedCell_deprecated_list.end(); ++iter) 178 delete (*iter); 179 LinkedCell_deprecated_list.clear(); 180 for (Tesselation_list_t::iterator iter = Tesselation_list.begin(); 181 iter != Tesselation_list.end(); ++iter) 182 delete (*iter); 183 Tesselation_list.clear(); 184 delete s; 123 delete surface_predicate; 124 delete LC; 125 delete TesselStruct; 185 126 } 186 127 -
src/Actions/FillAction/FillRegularGridAction.def
r345eda re9ad43 30 30 31 31 // finally the information stored in the ActionTrait specialization 32 #define DESCRIPTION "fill the domain via a regularly sparsed grid of insertion points for a cluster of atoms" 32 #define DESCRIPTION "\ 33 fill the domain via a regularly sparsed grid of insertion points with the \ 34 currently selected molecule. If atoms are selected, too, they are surrounded by \ 35 a tesselated surface and only outside of the tesselation is filled." 33 36 #undef SHORTFORM
Note:
See TracChangeset
for help on using the changeset viewer.