Changes in / [ab1932:edb93c]
- Location:
- src
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
src/atom.cpp
rab1932 redb93c 113 113 }; 114 114 115 ostream & operator << (ostream &ost, const atom &a) 115 ostream & operator << (ostream &ost, const atom &a) 116 116 { 117 117 ost << "[" << a.Name << "|" << &a << "]"; … … 123 123 * \return true - this one's is smaller, false - not 124 124 */ 125 bool atom::Compare( constatom &ptr)125 bool atom::Compare(atom &ptr) 126 126 { 127 127 if (nr < ptr.nr) -
src/atom.hpp
rab1932 redb93c 54 54 bool OutputXYZLine(ofstream *out) const; 55 55 atom *GetTrueFather(); 56 bool Compare( constatom &ptr);56 bool Compare(atom &ptr); 57 57 58 58 private: -
src/boundary.cpp
rab1932 redb93c 739 739 FillerDistance.InverseMatrixMultiplication(M); 740 740 for(int i=0;i<NDIM;i++) 741 N[i] = (int)ceil(1./FillerDistance.x[i]);741 N[i] = ceil(1./FillerDistance.x[i]); 742 742 743 743 // go over [0,1]^3 filler grid … … 813 813 return Filling; 814 814 }; 815 816 815 817 816 /** Tesselates the non convex boundary by rolling a virtual sphere along the surface of the molecule. … … 957 956 cout << Verbose(2) << "None." << endl; 958 957 959 // Tests the IsInnerAtom() function.960 Vector x (0, 0, 0);961 cout << Verbose(0) << "Point to check: " << x << endl;962 cout << Verbose(0) << "Check: IsInnerPoint() returns " << IsInnerPoint(x, Tess, LCList)963 << "for vector " << x << "." << endl;964 TesselPoint* a = Tess->PointsOnBoundary.begin()->second->node;965 cout << Verbose(0) << "Point to check: " << *a << " (on boundary)." << endl;966 cout << Verbose(0) << "Check: IsInnerAtom() returns " << IsInnerPoint(a, Tess, LCList)967 << "for atom " << a << " (on boundary)." << endl;968 LinkedNodes *List = NULL;969 for (int i=0;i<NDIM;i++) { // each axis970 LCList->n[i] = LCList->N[i]-1; // current axis is topmost cell971 for (LCList->n[(i+1)%NDIM]=0;LCList->n[(i+1)%NDIM]<LCList->N[(i+1)%NDIM];LCList->n[(i+1)%NDIM]++)972 for (LCList->n[(i+2)%NDIM]=0;LCList->n[(i+2)%NDIM]<LCList->N[(i+2)%NDIM];LCList->n[(i+2)%NDIM]++) {973 List = LCList->GetCurrentCell();974 //cout << Verbose(2) << "Current cell is " << LC->n[0] << ", " << LC->n[1] << ", " << LC->n[2] << " with No. " << LC->index << "." << endl;975 if (List != NULL) {976 for (LinkedNodes::iterator Runner = List->begin();Runner != List->end();Runner++) {977 if (Tess->PointsOnBoundary.find((*Runner)->nr) == Tess->PointsOnBoundary.end()) {978 a = *Runner;979 i=3;980 for (int j=0;j<NDIM;j++)981 LCList->n[j] = LCList->N[j];982 break;983 }984 }985 }986 }987 }988 cout << Verbose(0) << "Check: IsInnerPoint() returns " << IsInnerPoint(a, Tess, LCList)989 << "for atom " << a << " (inside)." << endl;990 991 992 958 if (freeTess) 993 959 delete(Tess); -
src/linkedcell.cpp
rab1932 redb93c 147 147 * \return if the atom is also found in this cell - true, else - false 148 148 */ 149 bool LinkedCell::SetIndexToNode( constTesselPoint *Walker)149 bool LinkedCell::SetIndexToNode(TesselPoint *Walker) 150 150 { 151 151 bool status = false; … … 164 164 }; 165 165 166 /** Calculates the interval bounds of the linked cell grid.167 * \param *lower lower bounds168 * \param *upper upper bounds169 */170 void LinkedCell::GetNeighbourBounds(int lower[NDIM], int upper[NDIM])171 {172 for (int i=0;i<NDIM;i++) {173 lower[i] = ((n[i]-1) >= 0) ? n[i]-1 : 0;174 upper[i] = ((n[i]+1) < N[i]) ? n[i]+1 : N[i]-1;175 //cout << " [" << Nlower[i] << "," << Nupper[i] << "] ";176 // check for this axis whether the point is outside of our grid177 if (n[i] < 0)178 upper[i] = lower[i];179 if (n[i] > N[i])180 lower[i] = upper[i];181 182 //cout << "axis " << i << " has bounds [" << lower[i] << "," << upper[i] << "]" << endl;183 }184 };185 186 166 /** Calculates the index for a given Vector *x. 187 167 * \param *x Vector with coordinates 188 168 * \return Vector is inside bounding box - true, else - false 189 169 */ 190 bool LinkedCell::SetIndexToVector( constVector *x)170 bool LinkedCell::SetIndexToVector(Vector *x) 191 171 { 192 172 bool status = true; -
src/linkedcell.hpp
rab1932 redb93c 46 46 ~LinkedCell(); 47 47 LinkedNodes* GetCurrentCell(); 48 bool SetIndexToNode( constTesselPoint *Walker);49 bool SetIndexToVector( constVector *x);48 bool SetIndexToNode(TesselPoint *Walker); 49 bool SetIndexToVector(Vector *x); 50 50 bool CheckBounds(); 51 void GetNeighbourBounds(int lower[NDIM], int upper[NDIM]);52 51 53 52 // not implemented yet -
src/molecules.hpp
rab1932 redb93c 104 104 element *type; 105 105 }; 106 106 107 107 108 #define MaxThermostats 6 //!< maximum number of thermostat entries in Ions#ThermostatNames and Ions#ThermostatImplemented … … 139 140 140 141 molecule(periodentafel *teil); 141 virtual~molecule();142 ~molecule(); 142 143 143 144 // re-definition of virtual functions from PointCloud -
src/parser.hpp
rab1932 redb93c 55 55 56 56 MatrixContainer(); 57 virtual~MatrixContainer();57 ~MatrixContainer(); 58 58 59 59 bool InitialiseIndices(class MatrixContainer *Matrix = NULL); -
src/tesselation.cpp
rab1932 redb93c 1693 1693 CirclePlaneNormal.SubtractVector(BaseLine->endpoints[1]->node->node); 1694 1694 1695 // calculate squared radius TesselPoint*ThirdNode,f circle1695 // calculate squared radius atom *ThirdNode,f circle 1696 1696 radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 1697 1697 if (radius/4. < RADIUS*RADIUS) { … … 1914 1914 /** Sort function for the candidate list. 1915 1915 */ 1916 bool sortCandidates(CandidateForTesselation* candidate1, CandidateForTesselation* candidate2) 1917 { 1916 bool sortCandidates(CandidateForTesselation* candidate1, CandidateForTesselation* candidate2) { 1918 1917 Vector BaseLineVector, OrthogonalVector, helper; 1919 1918 if (candidate1->BaseLine != candidate2->BaseLine) { // sanity check … … 1955 1954 return phi < psi; 1956 1955 }; 1957 1958 1959 /**1960 * Checks whether the provided atom is within the tesselation structure.1961 *1962 * @param *Atom of which to check the position1963 * @param tesselation structure1964 *1965 * @return true if the atom is inside the tesselation structure, false otherwise1966 */1967 bool IsInnerPoint(TesselPoint *Atom, class Tesselation *Tess, LinkedCell* LC)1968 {1969 if (Tess->LinesOnBoundary.begin() == Tess->LinesOnBoundary.end()) {1970 cout << Verbose(0) << "Error: There is no tesselation structure to compare the point with, "1971 << "please create one first.";1972 exit(1);1973 }1974 1975 class TesselPoint *trianglePoints[3];1976 trianglePoints[0] = findClosestAtom(Atom, LC);1977 // check whether closest atom is "too close" :), then it's inside1978 if (trianglePoints[0]->node->DistanceSquared(Atom->node) < MYEPSILON)1979 return true;1980 list<TesselPoint*> *connectedClosestPoints = Tess->getClosestConnectedAtoms(trianglePoints[0], Atom);1981 trianglePoints[1] = connectedClosestPoints->front();1982 trianglePoints[2] = connectedClosestPoints->back();1983 for (int i=0;i<3;i++) {1984 if (trianglePoints[i] == NULL) {1985 cout << Verbose(1) << "IsInnerPoint encounters serious error, point " << i << " not found." << endl;1986 }1987 1988 cout << Verbose(1) << "List of possible atoms:" << endl;1989 cout << *trianglePoints[i] << endl;1990 1991 // for(list<TesselPoint*>::iterator runner = connectedClosestPoints->begin(); runner != connectedClosestPoints->end(); runner++)1992 // cout << Verbose(2) << *(*runner) << endl;1993 }1994 delete(connectedClosestPoints);1995 1996 list<BoundaryTriangleSet*> *triangles = Tess->FindTriangles(trianglePoints);1997 1998 if (triangles->empty()) {1999 cout << Verbose(0) << "Error: There is no nearest triangle. Please check the tesselation structure.";2000 exit(1);2001 }2002 2003 Vector helper;2004 helper.CopyVector(Atom->node);2005 2006 // Only in case of degeneration, there will be two different scalar products.2007 // If at least one scalar product is positive, the point is considered to be outside.2008 bool status = (helper.ScalarProduct(&triangles->front()->NormalVector) < 0)2009 && (helper.ScalarProduct(&triangles->back()->NormalVector) < 0);2010 delete(triangles);2011 return status;2012 }2013 2014 /**2015 * Finds the atom which is closest to the provided one.2016 *2017 * @param atom to which to find the closest other atom2018 * @param linked cell structure2019 *2020 * @return atom which is closest to the provided one2021 */2022 TesselPoint* findClosestAtom(const TesselPoint* Atom, LinkedCell* LC)2023 {2024 LinkedNodes *List = NULL;2025 TesselPoint* closestAtom = NULL;2026 double distance = 1e16;2027 Vector helper;2028 int N[NDIM], Nlower[NDIM], Nupper[NDIM];2029 2030 LC->SetIndexToVector(Atom->node); // ignore status as we calculate bounds below sensibly2031 for(int i=0;i<NDIM;i++) // store indices of this cell2032 N[i] = LC->n[i];2033 //cout << Verbose(2) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl;2034 2035 LC->GetNeighbourBounds(Nlower, Nupper);2036 //cout << endl;2037 for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++)2038 for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++)2039 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) {2040 List = LC->GetCurrentCell();2041 //cout << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl;2042 if (List != NULL) {2043 for (LinkedNodes::iterator Runner = List->begin(); Runner != List->end(); Runner++) {2044 helper.CopyVector(Atom->node);2045 helper.SubtractVector((*Runner)->node);2046 double currentNorm = helper. Norm();2047 if (currentNorm < distance) {2048 distance = currentNorm;2049 closestAtom = (*Runner);2050 }2051 }2052 } else {2053 cerr << "ERROR: The current cell " << LC->n[0] << "," << LC->n[1] << ","2054 << LC->n[2] << " is invalid!" << endl;2055 }2056 }2057 2058 return closestAtom;2059 }2060 2061 /**2062 * Gets all atoms connected to the provided atom by triangulation lines.2063 *2064 * @param atom of which get all connected atoms2065 * @param atom to be checked whether it is an inner atom2066 *2067 * @return list of the two atoms linked to the provided one and closest to the atom to be checked,2068 */2069 list<TesselPoint*> * Tesselation::getClosestConnectedAtoms(TesselPoint* Atom, TesselPoint* AtomToCheck)2070 {2071 list<TesselPoint*> connectedAtoms;2072 map<double, TesselPoint*> anglesOfAtoms;2073 map<double, TesselPoint*>::iterator runner;2074 LineMap::iterator findLines = LinesOnBoundary.begin();2075 list<TesselPoint*>::iterator listRunner;2076 Vector center, planeNorm, currentPoint, OrthogonalVector, helper;2077 TesselPoint* current;2078 bool takeAtom = false;2079 2080 planeNorm.CopyVector(Atom->node);2081 planeNorm.SubtractVector(AtomToCheck->node);2082 planeNorm.Normalize();2083 2084 while (findLines != LinesOnBoundary.end()) {2085 takeAtom = false;2086 2087 if (findLines->second->endpoints[0]->Nr == Atom->nr) {2088 takeAtom = true;2089 current = findLines->second->endpoints[1]->node;2090 } else if (findLines->second->endpoints[1]->Nr == Atom->nr) {2091 takeAtom = true;2092 current = findLines->second->endpoints[0]->node;2093 }2094 2095 if (takeAtom) {2096 connectedAtoms.push_back(current);2097 currentPoint.CopyVector(current->node);2098 currentPoint.ProjectOntoPlane(&planeNorm);2099 center.AddVector(¤tPoint);2100 }2101 2102 findLines++;2103 }2104 2105 cout << "Summed vectors " << center << "; number of atoms " << connectedAtoms.size()2106 << "; scale factor " << 1.0/connectedAtoms.size();2107 2108 center.Scale(1.0/connectedAtoms.size());2109 listRunner = connectedAtoms.begin();2110 2111 cout << " calculated center " << center << endl;2112 2113 // construct one orthogonal vector2114 helper.CopyVector(AtomToCheck->node);2115 helper.ProjectOntoPlane(&planeNorm);2116 OrthogonalVector.MakeNormalVector(¢er, &helper, (*listRunner)->node);2117 while (listRunner != connectedAtoms.end()) {2118 double angle = getAngle(*((*listRunner)->node), *(AtomToCheck->node), center, OrthogonalVector);2119 cout << "Calculated angle " << angle << " for atom " << **listRunner << endl;2120 anglesOfAtoms.insert(pair<double, TesselPoint*>(angle, (*listRunner)));2121 listRunner++;2122 }2123 2124 list<TesselPoint*> *result = new list<TesselPoint*>;2125 runner = anglesOfAtoms.begin();2126 cout << "First value is " << *runner->second << endl;2127 result->push_back(runner->second);2128 runner = anglesOfAtoms.end();2129 runner--;2130 cout << "Second value is " << *runner->second << endl;2131 result->push_back(runner->second);2132 2133 cout << "List of closest atoms has " << result->size() << " elements, which are "2134 << *(result->front()) << " and " << *(result->back()) << endl;2135 2136 return result;2137 }2138 2139 /**2140 * Finds triangles belonging to the three provided atoms.2141 *2142 * @param atom list, is expected to contain three atoms2143 *2144 * @return triangles which belong to the provided atoms, will be empty if there are none,2145 * will usually be one, in case of degeneration, there will be two2146 */2147 list<BoundaryTriangleSet*> *Tesselation::FindTriangles(TesselPoint* Points[3])2148 {2149 list<BoundaryTriangleSet*> *result = new list<BoundaryTriangleSet*>;2150 LineMap::iterator FindLine;2151 PointMap::iterator FindPoint;2152 TriangleMap::iterator FindTriangle;2153 class BoundaryPointSet *TrianglePoints[3];2154 2155 for (int i = 0; i < 3; i++) {2156 FindPoint = PointsOnBoundary.find(Points[i]->nr);2157 if (FindPoint != PointsOnBoundary.end()) {2158 TrianglePoints[i] = FindPoint->second;2159 } else {2160 TrianglePoints[i] = NULL;2161 }2162 }2163 2164 // checks lines between the points in the Points for their adjacent triangles2165 for (int i = 0; i < 3; i++) {2166 if (TrianglePoints[i] != NULL) {2167 for (int j = i; j < 3; j++) {2168 if (TrianglePoints[j] != NULL) {2169 FindLine = TrianglePoints[i]->lines.find(TrianglePoints[j]->node->nr);2170 if (FindLine != TrianglePoints[i]->lines.end()) {2171 for (; FindLine->first == TrianglePoints[j]->node->nr; FindLine++) {2172 FindTriangle = FindLine->second->triangles.begin();2173 for (; FindTriangle != FindLine->second->triangles.end(); FindTriangle++) {2174 if ((2175 (FindTriangle->second->endpoints[0] == TrianglePoints[0])2176 || (FindTriangle->second->endpoints[0] == TrianglePoints[1])2177 || (FindTriangle->second->endpoints[0] == TrianglePoints[2])2178 ) && (2179 (FindTriangle->second->endpoints[1] == TrianglePoints[0])2180 || (FindTriangle->second->endpoints[1] == TrianglePoints[1])2181 || (FindTriangle->second->endpoints[1] == TrianglePoints[2])2182 ) && (2183 (FindTriangle->second->endpoints[2] == TrianglePoints[0])2184 || (FindTriangle->second->endpoints[2] == TrianglePoints[1])2185 || (FindTriangle->second->endpoints[2] == TrianglePoints[2])2186 )2187 ) {2188 result->push_back(FindTriangle->second);2189 }2190 }2191 }2192 // Is it sufficient to consider one of the triangle lines for this.2193 return result;2194 2195 }2196 }2197 }2198 }2199 }2200 2201 return result;2202 }2203 2204 /**2205 * Gets the angle between a point and a reference relative to the provided center.2206 *2207 * @param point to calculate the angle for2208 * @param reference to which to calculate the angle2209 * @param center for which to calculate the angle between the vectors2210 * @param OrthogonalVector helps discern between [0,pi] and [pi,2pi] in acos()2211 *2212 * @return angle between point and reference2213 */2214 double getAngle(Vector point, Vector reference, Vector center, Vector OrthogonalVector)2215 {2216 Vector ReferenceVector, helper;2217 cout << Verbose(2) << reference << " is our reference " << endl;2218 cout << Verbose(2) << center << " is our center " << endl;2219 // create baseline vector2220 ReferenceVector.CopyVector(&reference);2221 ReferenceVector.SubtractVector(¢er);2222 if (ReferenceVector.IsNull())2223 return M_PI;2224 2225 // calculate both angles and correct with in-plane vector2226 helper.CopyVector(&point);2227 helper.SubtractVector(¢er);2228 if (helper.IsNull())2229 return M_PI;2230 double phi = ReferenceVector.Angle(&helper);2231 if (OrthogonalVector.ScalarProduct(&helper) > 0) {2232 phi = 2.*M_PI - phi;2233 }2234 2235 cout << Verbose(2) << point << " has angle " << phi << endl;2236 2237 return phi;2238 }2239 2240 /**2241 * Checks whether the provided point is within the tesselation structure.2242 *2243 * This is a wrapper function for IsInnerAtom, so it can be used with a simple2244 * vector, too.2245 *2246 * @param point of which to check the position2247 * @param tesselation structure2248 *2249 * @return true if the point is inside the tesselation structure, false otherwise2250 */2251 bool IsInnerPoint(Vector Point, class Tesselation *Tess, LinkedCell* LC)2252 {2253 TesselPoint *temp_atom = new TesselPoint;2254 bool status = false;2255 temp_atom->node->CopyVector(&Point);2256 2257 status = IsInnerPoint(temp_atom, Tess, LC);2258 delete(temp_atom);2259 2260 return status;2261 }2262 -
src/tesselation.hpp
rab1932 redb93c 150 150 public: 151 151 PointCloud(); 152 virtual~PointCloud();152 ~PointCloud(); 153 153 154 154 virtual Vector *GetCenter(ofstream *out) { return NULL; }; … … 208 208 bool CorrectConcaveBaselines(ofstream *out); 209 209 210 list<TesselPoint*> * getClosestConnectedAtoms(TesselPoint* Atom, TesselPoint* AtomToCheck);211 list<BoundaryTriangleSet*> *FindTriangles(TesselPoint* Points[3]);212 213 210 PointMap PointsOnBoundary; 214 211 LineMap LinesOnBoundary; … … 227 224 bool CheckLineCriteriaforDegeneratedTriangle(class BoundaryPointSet *nodes[3]); 228 225 bool sortCandidates(class CandidateForTesselation* candidate1, class CandidateForTesselation* candidate2); 229 TesselPoint* findClosestAtom(const TesselPoint* Atom, LinkedCell* LC); 230 double getAngle(Vector point, Vector reference, Vector center, Vector OrthogonalVector); 231 bool IsInnerPoint(Vector Point, class Tesselation *Tess, LinkedCell* LC) ; 232 bool IsInnerPoint(TesselPoint *Atom, class Tesselation *Tess, LinkedCell* LC); 226 233 227 234 228 #endif /* TESSELATION_HPP_ */ -
src/vector.cpp
rab1932 redb93c 349 349 }; 350 350 351 /** Checks whether vector has all components zero.352 * @return true - vector is zero, false - vector is not353 */354 bool Vector::IsNull()355 {356 return (fabs(x[0]+x[1]+x[2]) < MYEPSILON);357 };358 359 351 /** Calculates the angle between this and another vector. 360 352 * \param *y array to second vector … … 465 457 }; 466 458 467 ostream& operator<<(ostream& ost, constVector& m)459 ostream& operator<<(ostream& ost,Vector& m) 468 460 { 469 461 ost << "("; -
src/vector.hpp
rab1932 redb93c 28 28 double NormSquared() const; 29 29 double Angle(const Vector *y) const; 30 bool IsNull();31 30 32 31 void AddVector(const Vector *y); … … 63 62 }; 64 63 65 ostream & operator << (ostream& ost, constVector &m);64 ostream & operator << (ostream& ost, Vector &m); 66 65 //Vector& operator+=(Vector& a, const Vector& b); 67 66 //Vector& operator*=(Vector& a, const double m);
Note:
See TracChangeset
for help on using the changeset viewer.