Changeset e9ad43 for src


Ignore:
Timestamp:
Mar 30, 2012, 9:18:25 AM (13 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:
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)
Message:

FillRegularGridAction now expects the filler as selected molecule, all selected atoms are tesselated.

Location:
src/Actions/FillAction
Files:
2 edited

Legend:

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

    r345eda re9ad43  
    6666  AtomVector presentatoms = World::getInstance().getAllAtoms();
    6767
    68   // get selected atoms and find containing sphere
    69   World::AtomComposite atoms = World::getInstance().getSelectedAtoms();
    70   if (atoms.size() == 0) {
    71     ELOG(2, "No atoms selected, 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,");
    7272    return Action::failure;
    7373  }
    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.");
    12176
    12277  // 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;
    13082  if (params.SphereRadius != 0.) {
    13183    if ( molecules.size() == 0) {
     
    13385          << " != 0, but have not select any molecules.");
    13486    }
    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"));
    14289
    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);
    14894
    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 ) );
    15697  }
    15798
    15899  // create predicate, mesh, and filler
    159100  {
    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        );
    161106    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);
    165109    Mesh *mesh = new CubeMesh(params.counts, params.offset, World::getInstance().getDomain().getM());
    166     Filler *fillerFunction = new Filler(*mesh, Andpredicate);
    167110
    168111    // 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    }
    171119
    172120    // remove
    173     delete fillerFunction;
    174121    delete mesh;
    175122    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;
    185126  }
    186127
  • src/Actions/FillAction/FillRegularGridAction.def

    r345eda re9ad43  
    3030
    3131// 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 "\
     33fill the domain via a regularly sparsed grid of insertion points with the \
     34currently selected molecule. If atoms are selected, too, they are surrounded by \
     35a tesselated surface and only outside of the tesselation is filled."
    3336#undef SHORTFORM
Note: See TracChangeset for help on using the changeset viewer.