ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/hydrodynamics/RoughShell.cpp
(Generate patch)

Comparing trunk/src/applications/hydrodynamics/RoughShell.cpp (file contents):
Revision 898 by tim, Wed Mar 15 15:51:44 2006 UTC vs.
Revision 1879 by gezelter, Sun Jun 16 15:15:42 2013 UTC

# Line 6 | Line 6
6   * redistribute this software in source and binary code form, provided
7   * that the following conditions are met:
8   *
9 < * 1. Acknowledgement of the program authors must be made in any
10 < *    publication of scientific results based in part on use of the
11 < *    program.  An acceptable form of acknowledgement is citation of
12 < *    the article in which the program was described (Matthew
13 < *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 < *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 < *    Parallel Simulation Engine for Molecular Dynamics,"
16 < *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 < *
18 < * 2. Redistributions of source code must retain the above copyright
9 > * 1. Redistributions of source code must retain the above copyright
10   *    notice, this list of conditions and the following disclaimer.
11   *
12 < * 3. Redistributions in binary form must reproduce the above copyright
12 > * 2. Redistributions in binary form must reproduce the above copyright
13   *    notice, this list of conditions and the following disclaimer in the
14   *    documentation and/or other materials provided with the
15   *    distribution.
# Line 37 | Line 28
28   * arising out of the use of or inability to use software, even if the
29   * University of Notre Dame has been advised of the possibility of
30   * such damages.
31 + *
32 + * SUPPORT OPEN SCIENCE!  If you use OpenMD or its source code in your
33 + * research, please cite the appropriate papers when you publish your
34 + * work.  Good starting points are:
35 + *                                                                      
36 + * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
37 + * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
38 + * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).          
39 + * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
40 + * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41   */
42  
43   #include "applications/hydrodynamics/RoughShell.hpp"
44 + #include "applications/hydrodynamics/ShapeBuilder.hpp"
45 + #include "brains/SimInfo.hpp"
46  
47 < namespace oopse {
48 <
49 < RoughShell::RoughShell(StuntDouble* sd, const DynamicProperty& extraParams) : HydrodynamicsModel(sd, extraParams), sdShape_(sd){
50 <    DynamicProperty::const_iterator iter = extraParams.find("Sigma");
51 <    if (iter != extraParams.end()) {
52 <        boost::any param = iter->second;
53 <        sigma_ = boost::any_cast<double>(param);
47 > namespace OpenMD {
48 >  
49 >  RoughShell::RoughShell(StuntDouble* sd, SimInfo* info) : ApproximationModel(sd, info){
50 >    shape_=ShapeBuilder::createShape(sd);
51 >    Globals* simParams = info->getSimParams();
52 >    if (simParams->haveBeadSize()) {
53 >      sigma_ = simParams->getBeadSize();
54      }else {
55 <        std::cout << "RoughShell Model Error\n" ;
55 >      
56      }
57 < }
58 <
59 < struct BeadLattice {
57 >  }
58 >  
59 >  struct BeadLattice {
60      Vector3d origin;
61 <    double radius;
61 >    RealType radius;
62      bool interior;
63 < };
64 <
65 < struct ExteriorFunctor : public std::unary_function<BeadLattice, bool>{
66 <
63 >  };
64 >  
65 >  struct ExteriorFunctor : public std::unary_function<BeadLattice, bool>{
66 >    
67      bool operator() (const BeadLattice& bead) {
68 <        return !bead.interior;
68 >      return !bead.interior;
69      }
70 <
71 < };
72 <
73 < struct InteriorFunctor  : public std::unary_function<BeadLattice, bool>{
74 <
70 >    
71 >  };
72 >  
73 >  struct InteriorFunctor  : public std::unary_function<BeadLattice, bool>{
74 >    
75      bool operator() (const BeadLattice& bead) {
76 <        return bead.interior;
76 >      return bead.interior;
77      }
78 <
79 < };
80 < bool RoughShell::createBeads(std::vector<BeadParam>& beads) {
81 <    std::pair<Vector3d, Vector3d> boxBoundary = sdShape_.getBox();
82 <    double len = boxBoundary.second[0] - boxBoundary.first[0];
83 <    int numLattices = static_cast<int>(len/sigma_) + 1;
78 >    
79 >  };
80 >  bool RoughShell::createBeads(std::vector<BeadParam>& beads) {
81 >    std::pair<Vector3d, Vector3d> boxBoundary = shape_->getBoundingBox();
82 >    RealType firstMin = std::min(std::min(boxBoundary.first[0], boxBoundary.first[1]), boxBoundary.first[2]);
83 >    RealType secondMax = std::max(std::max(boxBoundary.second[0], boxBoundary.second[1]), boxBoundary.second[2]);
84 >    RealType len = secondMax - firstMin;
85 >    int numLattices = static_cast<int>(len/sigma_) + 2;
86      Grid3D<BeadLattice>  grid(numLattices, numLattices, numLattices);
87 <
87 >    
88      //fill beads
89      for (int i = 0; i < numLattices; ++i) {
90 <        for (int j = 0; j < numLattices; ++j) {
91 <            for (int k = 0; k < numLattices; ++k) {
92 <                BeadLattice& currentBead = grid(i, j, k);
93 <                currentBead.origin = Vector3d(i*sigma_ + boxBoundary.first[0], j *sigma_ + boxBoundary.first[1], k*sigma_+ boxBoundary.first[2]);
94 <                currentBead.radius = sigma_;
95 <                currentBead.interior = sdShape_.isInterior(grid(i, j, k).origin);                
91 <            }
90 >      for (int j = 0; j < numLattices; ++j) {
91 >        for (int k = 0; k < numLattices; ++k) {
92 >          BeadLattice& currentBead = grid(i, j, k);
93 >          currentBead.origin = Vector3d((i-1)*sigma_ + boxBoundary.first[0], (j-1) *sigma_ + boxBoundary.first[1], (k-1)*sigma_+ boxBoundary.first[2]);
94 >          currentBead.radius = sigma_ / 2.0;
95 >          currentBead.interior = shape_->isInterior(grid(i, j, k).origin);                
96          }
97 +      }
98      }
99 <
99 >    
100      //remove embedded beads
101      for (int i = 0; i < numLattices; ++i) {
102 <        for (int j = 0; j < numLattices; ++j) {
103 <            for (int k = 0; k < numLattices; ++k) {
104 <                 std::vector<BeadLattice> neighborCells = grid.getAllNeighbors(i, j, k);
105 <                 //if one of its neighbor cells is exterior, current cell is on the surface
106 <
107 <                 std::vector<BeadLattice>::iterator ei = std::find_if(neighborCells.begin(), neighborCells.end(), ExteriorFunctor());                
108 <                 std::vector<BeadLattice>::iterator ii = std::find_if(neighborCells.begin(), neighborCells.end(), InteriorFunctor());                
109 <                
110 <                  if (ei != neighborCells.end() && ii != neighborCells.end()) {
111 <                      BeadParam surfaceBead;
112 <                      surfaceBead.atomName = "Bead";
113 <                      surfaceBead.pos = grid(i, j, k).origin;
114 <                      surfaceBead.radius = grid(i, j, k).radius;
110 <                      beads.push_back(surfaceBead);
111 <                  }
112 <
102 >      for (int j = 0; j < numLattices; ++j) {
103 >        for (int k = 0; k < numLattices; ++k) {
104 >          std::vector<BeadLattice> neighborCells = grid.getAllNeighbors(i, j, k);
105 >          //if one of its neighbor cells is exterior, current cell is on the surface
106 >          
107 >          if (grid(i, j, k).interior){
108 >            
109 >            bool allNeighBorIsInterior = true;
110 >            for (std::vector<BeadLattice>::iterator l = neighborCells.begin(); l != neighborCells.end(); ++l) {
111 >              if (!l->interior) {
112 >                allNeighBorIsInterior = false;
113 >                break;
114 >              }
115              }
116 +            
117 +            if (allNeighBorIsInterior)
118 +              continue;
119 +            
120 +            BeadParam surfaceBead;
121 +            surfaceBead.atomName = "H";
122 +            surfaceBead.pos = grid(i, j, k).origin;
123 +            surfaceBead.radius = grid(i, j, k).radius;
124 +            beads.push_back(surfaceBead);                    
125 +            
126 +          }
127          }
128 +      }
129      }
130 <    
130 >    
131      return true;
132 +  }
133 +  
134   }
119
120 }

Comparing trunk/src/applications/hydrodynamics/RoughShell.cpp (property svn:keywords):
Revision 898 by tim, Wed Mar 15 15:51:44 2006 UTC vs.
Revision 1879 by gezelter, Sun Jun 16 15:15:42 2013 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines