Changes in / [0af58f:551a58]
- Files:
-
- 18 added
- 49 edited
-
.gitignore (modified) (1 diff)
-
molecuilder/src/Makefile.am (modified) (3 diffs)
-
molecuilder/src/analysis_correlation.cpp (modified) (14 diffs)
-
molecuilder/src/analyzer.cpp (modified) (1 diff)
-
molecuilder/src/bondgraph.cpp (modified) (1 diff)
-
molecuilder/src/boundary.cpp (modified) (8 diffs)
-
molecuilder/src/boundary.hpp (modified) (3 diffs)
-
molecuilder/src/builder.cpp (modified) (10 diffs)
-
molecuilder/src/config.cpp (modified) (4 diffs)
-
molecuilder/src/gslmatrix.cpp (added)
-
molecuilder/src/gslmatrix.hpp (added)
-
molecuilder/src/gslvector.cpp (added)
-
molecuilder/src/gslvector.hpp (added)
-
molecuilder/src/helpers.hpp (modified) (1 diff)
-
molecuilder/src/joiner.cpp (modified) (1 diff)
-
molecuilder/src/linearsystemofequations.cpp (added)
-
molecuilder/src/linearsystemofequations.hpp (added)
-
molecuilder/src/memoryallocator.hpp (modified) (1 diff)
-
molecuilder/src/memoryusageobserver.cpp (modified) (1 diff)
-
molecuilder/src/molecule.cpp (modified) (2 diffs)
-
molecuilder/src/molecule.hpp (modified) (1 diff)
-
molecuilder/src/molecule_dynamics.cpp (modified) (1 diff)
-
molecuilder/src/molecule_fragmentation.cpp (modified) (1 diff)
-
molecuilder/src/molecule_geometry.cpp (modified) (1 diff)
-
molecuilder/src/molecule_graph.cpp (modified) (1 diff)
-
molecuilder/src/molecule_pointcloud.cpp (modified) (1 diff)
-
molecuilder/src/moleculelist.cpp (modified) (2 diffs)
-
molecuilder/src/parser.cpp (modified) (2 diffs)
-
molecuilder/src/periodentafel.cpp (modified) (1 diff)
-
molecuilder/src/tesselation.cpp (modified) (74 diffs)
-
molecuilder/src/tesselation.hpp (modified) (8 diffs)
-
molecuilder/src/tesselationhelpers.cpp (modified) (8 diffs)
-
molecuilder/src/tesselationhelpers.hpp (modified) (1 diff)
-
molecuilder/src/unittests/AnalysisCorrelationToPointUnitTest.cpp (modified) (1 diff)
-
molecuilder/src/unittests/AnalysisCorrelationToSurfaceUnitTest.cpp (modified) (1 diff)
-
molecuilder/src/unittests/AnalysisPairCorrelationUnitTest.cpp (modified) (1 diff)
-
molecuilder/src/unittests/Makefile.am (modified) (1 diff)
-
molecuilder/src/unittests/analysisbondsunittest.cpp (modified) (1 diff)
-
molecuilder/src/unittests/bondgraphunittest.cpp (modified) (1 diff)
-
molecuilder/src/unittests/gslmatrixsymmetricunittest.cpp (added)
-
molecuilder/src/unittests/gslmatrixsymmetricunittest.hpp (added)
-
molecuilder/src/unittests/gslmatrixunittest.cpp (added)
-
molecuilder/src/unittests/gslmatrixunittest.hpp (added)
-
molecuilder/src/unittests/gslvectorunittest.cpp (added)
-
molecuilder/src/unittests/gslvectorunittest.hpp (added)
-
molecuilder/src/unittests/linearsystemofequationsunittest.cpp (added)
-
molecuilder/src/unittests/linearsystemofequationsunittest.hpp (added)
-
molecuilder/src/unittests/listofbondsunittest.cpp (modified) (1 diff)
-
molecuilder/src/unittests/tesselation_boundarytriangleunittest.cpp (added)
-
molecuilder/src/unittests/tesselation_boundarytriangleunittest.hpp (added)
-
molecuilder/src/unittests/tesselation_insideoutsideunittest.cpp (added)
-
molecuilder/src/unittests/tesselation_insideoutsideunittest.hpp (added)
-
molecuilder/src/unittests/tesselationunittest.cpp (modified) (5 diffs)
-
molecuilder/src/unittests/tesselationunittest.hpp (modified) (2 diffs)
-
molecuilder/src/vector.cpp (modified) (9 diffs)
-
molecuilder/src/vector.hpp (modified) (1 diff)
-
molecuilder/tests/regression/Tesselation/1/post/NonConvexEnvelope.dat (modified) (2 diffs)
-
molecuilder/tests/regression/Tesselation/1/post/NonConvexEnvelope.r3d (modified) (2 diffs)
-
molecuilder/tests/regression/Tesselation/2/post/ConvexEnvelope.dat (modified) (2 diffs)
-
molecuilder/tests/regression/Tesselation/2/post/ConvexEnvelope.r3d (modified) (2 diffs)
-
molecuilder/tests/regression/Tesselation/2/post/NonConvexEnvelope.dat (modified) (2 diffs)
-
molecuilder/tests/regression/Tesselation/2/post/NonConvexEnvelope.r3d (modified) (2 diffs)
-
molecuilder/tests/regression/Tesselation/3/post/NonConvexEnvelope.dat (modified) (4 diffs)
-
molecuilder/tests/regression/Tesselation/3/post/NonConvexEnvelope.r3d (modified) (2 diffs)
-
molecuilder/tests/testsuite.at (modified) (5 diffs)
-
pcp/src/Makefile.am (modified) (1 diff)
-
util/src/Makefile.am (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
r0af58f r551a58 25 25 26 26 # ctags files 27 tags 27 *tags* 28 28 29 29 # exclude automake generated stuff -
molecuilder/src/Makefile.am
r0af58f r551a58 1 1 ATOMSOURCE = atom.cpp atom_atominfo.cpp atom_bondedparticle.cpp atom_bondedparticleinfo.cpp atom_graphnode.cpp atom_graphnodeinfo.cpp atom_particleinfo.cpp atom_trajectoryparticle.cpp atom_trajectoryparticleinfo.cpp 2 2 ATOMHEADER = atom.hpp atom_atominfo.hpp atom_bondedparticle.hpp atom_bondedparticleinfo.hpp atom_graphnode.hpp atom_graphnodeinfo.hpp atom_particleinfo.hpp atom_trajectoryparticle.hpp atom_trajectoryparticleinfo.hpp 3 4 LINALGSOURCE = gslmatrix.cpp gslvector.cpp linearsystemofequations.cpp 5 LINALGHEADER = gslmatrix.hpp gslvector.hpp linearsystemofequations.hpp 3 6 4 7 ANALYSISSOURCE = analysis_bonds.cpp analysis_correlation.cpp … … 11 14 INCLUDES = -I$(top_srcdir)/src/unittests 12 15 13 noinst_LIBRARIES = libmolecuilder.a 16 noinst_LIBRARIES = libmolecuilder.a libgslwrapper.a 14 17 bin_PROGRAMS = molecuilder joiner analyzer 15 18 molecuilderdir = ${bindir} 16 19 libmolecuilder_a_SOURCES = ${SOURCE} ${HEADER} 20 libgslwrapper_a_SOURCES = ${LINALGSOURCE} ${LINALGHEADER} 17 21 molecuilder_DATA = elements.db valence.db orbitals.db Hbonddistance.db Hbondangle.db 18 22 molecuilder_LDFLAGS = $(BOOST_LIB) 19 23 molecuilder_SOURCES = builder.cpp 20 molecuilder_LDADD = libmolecuilder.a 24 molecuilder_LDADD = libmolecuilder.a libgslwrapper.a 21 25 joiner_SOURCES = joiner.cpp datacreator.cpp parser.cpp datacreator.hpp helpers.hpp parser.hpp periodentafel.hpp 22 26 joiner_LDADD = libmolecuilder.a … … 28 32 FORCE: 29 33 $(srcdir)/.git-version: FORCE 30 @if (test -d $(top_srcdir)/../.git && cd $(srcdir) && git describe --tagsHEAD) > .git-version-t 2>/dev/null \34 @if (test -d $(top_srcdir)/../.git && cd $(srcdir) && git describe HEAD) > .git-version-t 2>/dev/null \ 31 35 && ! diff .git-version-t $(srcdir)/.git-version >/dev/null 2>&1; then \ 32 36 mv -f .git-version-t $(srcdir)/.git-version; \ -
molecuilder/src/analysis_correlation.cpp
r0af58f r551a58 10 10 #include "analysis_correlation.hpp" 11 11 #include "element.hpp" 12 #include "info.hpp" 12 13 #include "log.hpp" 13 14 #include "molecule.hpp" … … 28 29 PairCorrelationMap *PairCorrelation(MoleculeListClass * const &molecules, const element * const type1, const element * const type2 ) 29 30 { 31 Info FunctionInfo(__func__); 30 32 PairCorrelationMap *outmap = NULL; 31 33 double distance = 0.; … … 77 79 PairCorrelationMap *PeriodicPairCorrelation(MoleculeListClass * const &molecules, const element * const type1, const element * const type2, const int ranges[NDIM] ) 78 80 { 81 Info FunctionInfo(__func__); 79 82 PairCorrelationMap *outmap = NULL; 80 83 double distance = 0.; … … 154 157 CorrelationToPointMap *CorrelationToPoint(MoleculeListClass * const &molecules, const element * const type, const Vector *point ) 155 158 { 159 Info FunctionInfo(__func__); 156 160 CorrelationToPointMap *outmap = NULL; 157 161 double distance = 0.; … … 190 194 CorrelationToPointMap *PeriodicCorrelationToPoint(MoleculeListClass * const &molecules, const element * const type, const Vector *point, const int ranges[NDIM] ) 191 195 { 196 Info FunctionInfo(__func__); 192 197 CorrelationToPointMap *outmap = NULL; 193 198 double distance = 0.; … … 243 248 CorrelationToSurfaceMap *CorrelationToSurface(MoleculeListClass * const &molecules, const element * const type, const Tesselation * const Surface, const LinkedCell *LC ) 244 249 { 250 Info FunctionInfo(__func__); 245 251 CorrelationToSurfaceMap *outmap = NULL; 246 252 double distance = 0; … … 261 267 Log() << Verbose(3) << "Current atom is " << *Walker << "." << endl; 262 268 if ((type == NULL) || (Walker->type == type)) { 263 triangle = Surface->FindClosestTriangleTo Point(Walker->node, LC );269 triangle = Surface->FindClosestTriangleToVector(Walker->node, LC ); 264 270 if (triangle != NULL) { 265 271 distance = DistanceToTrianglePlane(Walker->node, triangle); … … 288 294 CorrelationToSurfaceMap *PeriodicCorrelationToSurface(MoleculeListClass * const &molecules, const element * const type, const Tesselation * const Surface, const LinkedCell *LC, const int ranges[NDIM] ) 289 295 { 296 Info FunctionInfo(__func__); 290 297 CorrelationToSurfaceMap *outmap = NULL; 291 298 double distance = 0; … … 320 327 checkX.AddVector(&periodicX); 321 328 checkX.MatrixMultiplication(FullMatrix); 322 triangle = Surface->FindClosestTriangleTo Point(&checkX, LC );329 triangle = Surface->FindClosestTriangleToVector(&checkX, LC ); 323 330 if (triangle != NULL) { 324 331 distance = DistanceToTrianglePlane(&checkX, triangle); … … 342 349 double GetBin ( const double value, const double BinWidth, const double BinStart ) 343 350 { 351 Info FunctionInfo(__func__); 344 352 double bin =(double) (floor((value - BinStart)/BinWidth)); 345 353 return (bin*BinWidth+BinStart); … … 353 361 void OutputCorrelation( ofstream * const file, const BinPairMap * const map ) 354 362 { 363 Info FunctionInfo(__func__); 355 364 *file << "# BinStart\tCount" << endl; 356 365 for (BinPairMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { … … 365 374 void OutputPairCorrelation( ofstream * const file, const PairCorrelationMap * const map ) 366 375 { 376 Info FunctionInfo(__func__); 367 377 *file << "# BinStart\tAtom1\tAtom2" << endl; 368 378 for (PairCorrelationMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { … … 377 387 void OutputCorrelationToPoint( ofstream * const file, const CorrelationToPointMap * const map ) 378 388 { 389 Info FunctionInfo(__func__); 379 390 *file << "# BinStart\tAtom::x[i]-point.x[i]" << endl; 380 391 for (CorrelationToPointMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { … … 392 403 void OutputCorrelationToSurface( ofstream * const file, const CorrelationToSurfaceMap * const map ) 393 404 { 405 Info FunctionInfo(__func__); 394 406 *file << "# BinStart\tTriangle" << endl; 395 407 for (CorrelationToSurfaceMap::const_iterator runner = map->begin(); runner != map->end(); ++runner) { -
molecuilder/src/analyzer.cpp
r0af58f r551a58 7 7 8 8 //============================ INCLUDES =========================== 9 10 #include <cstring> 9 11 10 12 #include "datacreator.hpp" -
molecuilder/src/bondgraph.cpp
r0af58f r551a58 35 35 /** Parses the bond lengths in a given file and puts them int a matrix form. 36 36 * Allocates \a MatrixContainer for BondGraph::BondLengthMatrix, using MatrixContainer::ParseMatrix(), 37 * but only if parsing is successful l. Otherwise variable is left as NULL.37 * but only if parsing is successful. Otherwise variable is left as NULL. 38 38 * \param *out output stream for debugging 39 39 * \param filename file with bond lengths to parse -
molecuilder/src/boundary.cpp
r0af58f r551a58 654 654 * \param *out output stream for debugging 655 655 * \param *mol molecule with atoms and bonds 656 * \param * &TesselStruct Tesselation with boundary triangles656 * \param *TesselStruct Tesselation with boundary triangles 657 657 * \param *filename prefix of filename 658 658 * \param *extraSuffix intermediate suffix 659 659 */ 660 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * &TesselStruct, const char *filename, const char *extraSuffix)660 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * const TesselStruct, const char *filename, const char *extraSuffix) 661 661 { 662 662 Info FunctionInfo(__func__); … … 789 789 * \param configuration contains box dimensions 790 790 * \param distance[NDIM] distance between filling molecules in each direction 791 * \param boundary length of boundary zone between molecule and filling mollecules 792 * \param epsilon distance to surface which is not filled 791 793 * \param RandAtomDisplacement maximum distance for random displacement per atom 792 794 * \param RandMolDisplacement maximum distance for random displacement per filler molecule … … 794 796 * \return *mol pointer to new molecule with filled atoms 795 797 */ 796 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, double distance[NDIM], double RandomAtomDisplacement, double RandomMolDisplacement,bool DoRandomRotation)798 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double boundary, const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation) 797 799 { 798 800 Info FunctionInfo(__func__); … … 817 819 for (MoleculeList::iterator ListRunner = List->ListOfMolecules.begin(); ListRunner != List->ListOfMolecules.end(); ListRunner++) { 818 820 Log() << Verbose(1) << "Pre-creating linked cell lists for molecule " << *ListRunner << "." << endl; 819 LCList[i] = new LinkedCell((*ListRunner), 5.); // get linked cell list 820 if (TesselStruct[i] == NULL) { 821 Log() << Verbose(1) << "Pre-creating tesselation for molecule " << *ListRunner << "." << endl; 822 FindNonConvexBorder((*ListRunner), TesselStruct[i], (const LinkedCell *&)LCList[i], 5., NULL); 823 } 821 LCList[i] = new LinkedCell((*ListRunner), 10.); // get linked cell list 822 Log() << Verbose(1) << "Pre-creating tesselation for molecule " << *ListRunner << "." << endl; 823 TesselStruct[i] = NULL; 824 FindNonConvexBorder((*ListRunner), TesselStruct[i], (const LinkedCell *&)LCList[i], 5., NULL); 824 825 i++; 825 826 } … … 835 836 FillerDistance.Init(distance[0], distance[1], distance[2]); 836 837 FillerDistance.InverseMatrixMultiplication(M); 837 Log() << Verbose(1) << "INFO: Grid steps are "; 838 for(int i=0;i<NDIM;i++) { 838 for(int i=0;i<NDIM;i++) 839 839 N[i] = (int) ceil(1./FillerDistance.x[i]); 840 Log() << Verbose(1) << N[i]; 841 if (i != NDIM-1) 842 Log() << Verbose(1)<< ", "; 843 else 844 Log() << Verbose(1) << "." << endl; 845 } 840 Log() << Verbose(1) << "INFO: Grid steps are " << N[0] << ", " << N[1] << ", " << N[2] << "." << endl; 846 841 847 842 // go over [0,1]^3 filler grid … … 859 854 // get linked cell list 860 855 if (TesselStruct[i] == NULL) { 861 eLog() << Verbose( 1) << "TesselStruct of " << (*ListRunner) << " is NULL. Didn't we pre-create it?" << endl;856 eLog() << Verbose(0) << "TesselStruct of " << (*ListRunner) << " is NULL. Didn't we pre-create it?" << endl; 862 857 FillIt = false; 863 858 } else { 864 FillIt = FillIt && (!TesselStruct[i]->IsInnerPoint(CurrentPosition, LCList[i])); 859 const double distance = (TesselStruct[i]->GetDistanceSquaredToSurface(CurrentPosition, LCList[i])); 860 FillIt = FillIt && (distance > boundary*boundary); 861 if (FillIt) { 862 Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is outer point." << endl; 863 } else { 864 Log() << Verbose(1) << "INFO: Position at " << CurrentPosition << " is inner point or within boundary." << endl; 865 break; 866 } 865 867 i++; 866 868 } … … 931 933 } 932 934 Free(&M); 935 936 // output to file 937 TesselStruct[0]->LastTriangle = NULL; 938 StoreTrianglesinFile(Filling, TesselStruct[0], "Tesselated", ".dat"); 939 933 940 for (size_t i=0;i<List->ListOfMolecules.size();i++) { 934 941 delete(LCList[i]); … … 1041 1048 // TesselStruct->RemoveDegeneratedTriangles(); 1042 1049 1050 // check envelope for consistency 1051 status = CheckListOfBaselines(TesselStruct); 1052 1053 // store before correction 1054 StoreTrianglesinFile(mol, (const Tesselation *&)TesselStruct, filename, ""); 1055 1043 1056 // correct degenerated polygons 1044 1057 TesselStruct->CorrectAllDegeneratedPolygons(); -
molecuilder/src/boundary.hpp
r0af58f r551a58 36 36 #define DEBUG 1 37 37 #define DoSingleStepOutput 0 38 #define SingleStepWidth 1 38 #define SingleStepWidth 10 39 39 40 40 #define DistancePair pair < double, atom* > … … 49 49 50 50 double ConvexizeNonconvexEnvelope(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename); 51 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, double distance[NDIM], double RandAtomDisplacement, double RandMolDisplacement,bool DoRandomRotation);51 molecule * FillBoxWithMolecule(MoleculeListClass *List, molecule *filler, config &configuration, const double distance[NDIM], const double boundary, const double RandomAtomDisplacement, const double RandomMolDisplacement, const bool DoRandomRotation); 52 52 void FindConvexBorder(const molecule* const mol, Tesselation *&TesselStruct, const LinkedCell *LCList, const char *filename); 53 53 Vector* FindEmbeddingHole(MoleculeListClass *mols, molecule *srcmol); … … 58 58 void PrepareClustersinWater(config *configuration, molecule *mol, double ClusterVolume, double celldensity); 59 59 bool RemoveAllBoundaryPoints(class Tesselation *&TesselStruct, const molecule * const mol, const char * const filename); 60 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * &TesselStruct, const char *filename, const char *extraSuffix);60 void StoreTrianglesinFile(const molecule * const mol, const Tesselation * const TesselStruct, const char *filename, const char *extraSuffix); 61 61 double VolumeOfConvexEnvelope(class Tesselation *TesselStruct, class config *configuration); 62 62 -
molecuilder/src/builder.cpp
r0af58f r551a58 49 49 50 50 using namespace std; 51 52 #include <cstring> 51 53 52 54 #include "analysis_correlation.hpp" … … 1410 1412 Log() << Verbose(0) << "\t-B xx xy xz yy yz zz\tBound atoms by domain with given symmetric matrix of (xx,xy,xz,yy,yz,zz)." << endl; 1411 1413 Log() << Verbose(0) << "\t-c x1 x2 x3\tCenter atoms in domain with a minimum distance to boundary of (x1,x2,x3)." << endl; 1412 Log() << Verbose(0) << "\t-C \tPair Correlation analysis." << endl;1414 Log() << Verbose(0) << "\t-C <Z> <output> <bin output>\tPair Correlation analysis." << endl; 1413 1415 Log() << Verbose(0) << "\t-d x1 x2 x3\tDuplicate cell along each axis by given factor." << endl; 1414 1416 Log() << Verbose(0) << "\t-D <bond distance>\tDepth-First-Search Analysis of the molecule, giving cycles and tree/back edges." << endl; 1415 1417 Log() << Verbose(0) << "\t-e <file>\tSets the databases path to be parsed (default: ./)." << endl; 1416 1418 Log() << Verbose(0) << "\t-E <id> <Z>\tChange atom <id>'s element to <Z>, <id> begins at 0." << endl; 1417 Log() << Verbose(0) << "\t-f/F <dist> <order>\tFragments the molecule in BOSSANOVA manner (with/out rings compressed) and stores config files in same dir as config (return code 0 - fragmented, 2 - no fragmentation necessary)." << endl; 1419 Log() << Verbose(0) << "\t-f <dist> <order>\tFragments the molecule in BOSSANOVA manner (with/out rings compressed) and stores config files in same dir as config (return code 0 - fragmented, 2 - no fragmentation necessary)." << endl; 1420 Log() << Verbose(0) << "\t-F <dist_x> <dist_y> <dist_z> <epsilon> <randatom> <randmol> <DoRotate>\tFilling Box with water molecules." << endl; 1418 1421 Log() << Verbose(0) << "\t-g <file>\tParses a bond length table from the given file." << endl; 1419 1422 Log() << Verbose(0) << "\t-h/-H/-?\tGive this help screen." << endl; 1423 Log() << Verbose(0) << "\t-I\t Dissect current system of molecules into a set of disconnected (subgraphs of) molecules." << endl; 1420 1424 Log() << Verbose(0) << "\t-L <step0> <step1> <prefix>\tStore a linear interpolation between two configurations <step0> and <step1> into single config files with prefix <prefix> and as Trajectories into the current config file." << endl; 1421 1425 Log() << Verbose(0) << "\t-m <0/1>\tCalculate (0)/ Align in(1) PAS with greatest EV along z axis." << endl; … … 1575 1579 else { 1576 1580 Log() << Verbose(2) << "File found and parsed." << endl; 1577 // @TODO rather do the dissection afterwards1578 // mol->SetNameFromFilename(argv[argptr]);1579 // molecules->ListOfMolecules.remove(mol);1580 // molecules->DissectMoleculeIntoConnectedSubgraphs(mol,&configuration);1581 // delete(mol);1582 // if (molecules->ListOfMolecules.size() != 0) {1583 // for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++)1584 // if ((*ListRunner)->ActiveFlag) {1585 // mol = *ListRunner;1586 // break;1587 // }1588 // }1589 1581 configPresent = present; 1590 1582 } … … 1665 1657 //argptr+=1; 1666 1658 break; 1659 case 'I': 1660 Log() << Verbose(1) << "Dissecting molecular system into a set of disconnected subgraphs ... " << endl; 1661 // @TODO rather do the dissection afterwards 1662 molecules->DissectMoleculeIntoConnectedSubgraphs(mol,&configuration); 1663 mol = NULL; 1664 if (molecules->ListOfMolecules.size() != 0) { 1665 for (MoleculeList::iterator ListRunner = molecules->ListOfMolecules.begin(); ListRunner != molecules->ListOfMolecules.end(); ListRunner++) 1666 if ((*ListRunner)->ActiveFlag) { 1667 mol = *ListRunner; 1668 break; 1669 } 1670 } 1671 if (mol == NULL) { 1672 mol = *(molecules->ListOfMolecules.begin()); 1673 mol->ActiveFlag = true; 1674 } 1675 break; 1667 1676 case 'C': 1668 1677 if (ExitFlag == 0) ExitFlag = 1; … … 1672 1681 performCriticalExit(); 1673 1682 } else { 1674 SaveFlag = false;1675 1683 ofstream output(argv[argptr+1]); 1676 1684 ofstream binoutput(argv[argptr+2]); … … 1692 1700 counter = 0; 1693 1701 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) { 1694 Actives[counter ] = (*BigFinder)->ActiveFlag;1702 Actives[counter++] = (*BigFinder)->ActiveFlag; 1695 1703 (*BigFinder)->ActiveFlag = (*BigFinder == Boundary) ? false : true; 1696 1704 } … … 1705 1713 binoutput.close(); 1706 1714 for (MoleculeList::iterator BigFinder = molecules->ListOfMolecules.begin(); BigFinder != molecules->ListOfMolecules.end(); BigFinder++) 1707 (*BigFinder)->ActiveFlag = Actives[counter ];1715 (*BigFinder)->ActiveFlag = Actives[counter++]; 1708 1716 Free(&Actives); 1709 1717 delete(LCList); … … 1728 1736 case 'F': 1729 1737 if (ExitFlag == 0) ExitFlag = 1; 1730 if (argptr+ 5>=argc) {1738 if (argptr+6 >=argc) { 1731 1739 ExitFlag = 255; 1732 eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> < randatom> <randmol> <DoRotate>" << endl;1740 eLog() << Verbose(0) << "Not enough or invalid arguments given for filling box with water: -F <dist_x> <dist_y> <dist_z> <boundary> <randatom> <randmol> <DoRotate>" << endl; 1733 1741 performCriticalExit(); 1734 1742 } else { … … 1738 1746 molecule *filler = new molecule(periode);; 1739 1747 molecule *Filling = NULL; 1740 atom *second = NULL, *third = NULL;1748 // atom *second = NULL, *third = NULL; 1741 1749 first = new atom(); 1742 first->type = periode->FindElement( 1);1743 first->x. Init(0.441, -0.143, 0.);1750 first->type = periode->FindElement(5); 1751 first->x.Zero(); 1744 1752 filler->AddAtom(first); 1745 second = new atom(); 1746 second->type = periode->FindElement(1); 1747 second->x.Init(-0.464, 1.137, 0.0); 1748 filler->AddAtom(second); 1749 third = new atom(); 1750 third->type = periode->FindElement(8); 1751 third->x.Init(-0.464, 0.177, 0.); 1752 filler->AddAtom(third); 1753 filler->AddBond(first, third, 1); 1754 filler->AddBond(second, third, 1); 1753 // first = new atom(); 1754 // first->type = periode->FindElement(1); 1755 // first->x.Init(0.441, -0.143, 0.); 1756 // filler->AddAtom(first); 1757 // second = new atom(); 1758 // second->type = periode->FindElement(1); 1759 // second->x.Init(-0.464, 1.137, 0.0); 1760 // filler->AddAtom(second); 1761 // third = new atom(); 1762 // third->type = periode->FindElement(8); 1763 // third->x.Init(-0.464, 0.177, 0.); 1764 // filler->AddAtom(third); 1765 // filler->AddBond(first, third, 1); 1766 // filler->AddBond(second, third, 1); 1755 1767 // call routine 1756 1768 double distance[NDIM]; 1757 1769 for (int i=0;i<NDIM;i++) 1758 1770 distance[i] = atof(argv[argptr+i]); 1759 Filling = FillBoxWithMolecule(molecules, filler, configuration, distance, atof(argv[argptr+3]), atof(argv[argptr+4]), ato i(argv[argptr+5]));1771 Filling = FillBoxWithMolecule(molecules, filler, configuration, distance, atof(argv[argptr+3]), atof(argv[argptr+4]), atof(argv[argptr+5]), atoi(argv[argptr+6])); 1760 1772 if (Filling != NULL) { 1773 Filling->ActiveFlag = false; 1761 1774 molecules->insert(Filling); 1762 1775 } … … 2107 2120 if (volume != -1) 2108 2121 ExitFlag = 255; 2109 eLog() << Verbose(0) << "Not enough arguments given for suspension: -u <density>" << endl;2122 eLog() << Verbose(0) << "Not enough or invalid arguments given for suspension: -u <density>" << endl; 2110 2123 performCriticalExit(); 2111 2124 } else { -
molecuilder/src/config.cpp
r0af58f r551a58 6 6 7 7 #include <stdio.h> 8 #include <cstring> 8 9 9 10 #include "atom.hpp" … … 27 28 char number1[8]; 28 29 char number2[8]; 29 c har *dummy1, *dummy2;30 const char *dummy1, *dummy2; 30 31 //Log() << Verbose(0) << s1 << " " << s2 << endl; 31 32 dummy1 = strchr(s1, '_')+sizeof(char)*5; // go just after "Ion_Type" … … 1074 1075 // don't do this here ... 1075 1076 //MolList->DissectMoleculeIntoConnectedSubgraphs(mol,this); 1076 1077 delete(mol); 1077 //delete(mol); 1078 1078 1079 delete(FileBuffer); 1079 1080 }; … … 2123 2124 } 2124 2125 line++; 2125 } while ( dummy1 != NULL && (dummy1[0] == '#') || (dummy1[0] == '\n'));2126 } while ((dummy1 != NULL) && ((dummy1[0] == '#') || (dummy1[0] == '\n'))); 2126 2127 dummy = dummy1; 2127 2128 } else { // simple int, strings or doubles start in the same line -
molecuilder/src/helpers.hpp
r0af58f r551a58 74 74 x = y; 75 75 y = tmp; 76 }; 77 78 /** returns greater of the two values. 79 * \param x first value 80 * \param y second value 81 * \return greater of the two (by operator>()) 82 */ 83 template <typename T> T Max(T x, T y) 84 { 85 if (x > y) 86 return x; 87 else return y; 88 }; 89 90 /** returns smaller of the two values. 91 * \param x first value 92 * \param y second value 93 * \return smaller of the two (by operator<()) 94 */ 95 template <typename T> T Min(T x, T y) 96 { 97 if (x < y) 98 return x; 99 else return y; 76 100 }; 77 101 -
molecuilder/src/joiner.cpp
r0af58f r551a58 7 7 8 8 //============================ INCLUDES =========================== 9 10 #include <cstring> 9 11 10 12 #include "datacreator.hpp" -
molecuilder/src/memoryallocator.hpp
r0af58f r551a58 16 16 #endif 17 17 18 #include <cstdlib> 18 19 #include <iostream> 19 20 #include <iomanip> -
molecuilder/src/memoryusageobserver.cpp
r0af58f r551a58 4 4 * This class represents a Singleton for observing memory usage. 5 5 */ 6 7 #include <cstdlib> 6 8 7 9 #include "log.hpp" -
molecuilder/src/molecule.cpp
r0af58f r551a58 4 4 * 5 5 */ 6 7 #include <cstring> 6 8 7 9 #include "atom.hpp" … … 587 589 else 588 590 molname = filename; // contains no slashes 589 c har *endname = strchr(molname, '.');591 const char *endname = strchr(molname, '.'); 590 592 if ((endname == NULL) || (endname < molname)) 591 593 length = strlen(molname); -
molecuilder/src/molecule.hpp
r0af58f r551a58 110 110 TesselPoint *GetPoint() const ; 111 111 TesselPoint *GetTerminalPoint() const ; 112 int GetMaxId() const; 112 113 void GoToNext() const ; 113 114 void GoToPrevious() const ; -
molecuilder/src/molecule_dynamics.cpp
r0af58f r551a58 370 370 371 371 // argument minimise the constrained potential in this injective PermutationMap 372 Log() << Verbose(1) << "Argument minimising the PermutationMap , at current potential " << OldPotential << " ..." << endl;372 Log() << Verbose(1) << "Argument minimising the PermutationMap." << endl; 373 373 OldPotential = 1e+10; 374 374 round = 0; 375 375 do { 376 Log() << Verbose(2) << "Starting round " << ++round << " ... " << endl;376 Log() << Verbose(2) << "Starting round " << ++round << ", at current potential " << OldPotential << " ... " << endl; 377 377 OlderPotential = OldPotential; 378 378 do { -
molecuilder/src/molecule_fragmentation.cpp
r0af58f r551a58 5 5 * Author: heber 6 6 */ 7 8 #include <cstring> 7 9 8 10 #include "atom.hpp" -
molecuilder/src/molecule_geometry.cpp
r0af58f r551a58 101 101 { 102 102 int Num = 0; 103 atom *ptr = start ->next; // start at first in list103 atom *ptr = start; // start at first in list 104 104 105 105 Center.Zero(); 106 106 107 if (ptr != end) { //list not empty?107 if (ptr->next != end) { //list not empty? 108 108 while (ptr->next != end) { // continue with second if present 109 109 ptr = ptr->next; -
molecuilder/src/molecule_graph.cpp
r0af58f r551a58 1117 1117 bool status = true; 1118 1118 if (ReferenceStack->IsEmpty()) { 1119 eLog() << Verbose(0) << "ReferenceStack is empty!" << endl; 1120 performCriticalExit(); 1119 Log() << Verbose(1) << "ReferenceStack is empty!" << endl; 1121 1120 return false; 1122 1121 } -
molecuilder/src/molecule_pointcloud.cpp
r0af58f r551a58 50 50 }; 51 51 52 /** Return the greatest index of all atoms in the list. 53 * \return greatest index 54 */ 55 int molecule::GetMaxId() const 56 { 57 return last_atom; 58 }; 59 52 60 /** Go to next atom. 53 61 * Stops at last one. -
molecuilder/src/moleculelist.cpp
r0af58f r551a58 4 4 * 5 5 */ 6 7 #include <cstring> 6 8 7 9 #include "atom.hpp" … … 402 404 input.open(line.c_str()); 403 405 if (input == NULL) { 404 eLog() << Verbose(0) << endl << "Unable to open " << line << ", is the directory correct?" << endl; 405 performCriticalExit(); 406 Log() << Verbose(1) << endl << "Unable to open " << line << ", is the directory correct?" << endl; 406 407 return false; 407 408 } -
molecuilder/src/parser.cpp
r0af58f r551a58 6 6 7 7 // ======================================= INCLUDES ========================================== 8 9 #include <cstring> 8 10 9 11 #include "helpers.hpp" … … 158 160 //Log() << Verbose(0) << "Opening " << name << " ... " << input << endl; 159 161 if (input == NULL) { 160 eLog() << Verbose( 0) << endl << "Unable to open " << name << ", is the directory correct?" << endl;161 performCriticalExit();162 eLog() << Verbose(1) << endl << "Unable to open " << name << ", is the directory correct?" << endl; 163 //performCriticalExit(); 162 164 return false; 163 165 } -
molecuilder/src/periodentafel.cpp
r0af58f r551a58 9 9 #include <iomanip> 10 10 #include <fstream> 11 #include <cstring> 11 12 12 13 #include "element.hpp" -
molecuilder/src/tesselation.cpp
r0af58f r551a58 35 35 * \param *Walker TesselPoint this boundary point represents 36 36 */ 37 BoundaryPointSet::BoundaryPointSet(TesselPoint * Walker) :37 BoundaryPointSet::BoundaryPointSet(TesselPoint * const Walker) : 38 38 LinesCount(0), 39 39 node(Walker), … … 61 61 * \param *line line to add 62 62 */ 63 void BoundaryPointSet::AddLine( class BoundaryLineSet *line)63 void BoundaryPointSet::AddLine(BoundaryLineSet * const line) 64 64 { 65 65 Info FunctionInfo(__func__); … … 105 105 * \param number number of the list 106 106 */ 107 BoundaryLineSet::BoundaryLineSet( class BoundaryPointSet *Point[2], const int number)107 BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point[2], const int number) 108 108 { 109 109 Info FunctionInfo(__func__); … … 115 115 Point[0]->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding. 116 116 Point[1]->AddLine(this); // 117 // set skipped to false 118 skipped = false; 119 // clear triangles list 120 Log() << Verbose(0) << "New Line with endpoints " << *this << "." << endl; 121 }; 122 123 /** Constructor of BoundaryLineSet with two endpoints. 124 * Adds line automatically to each endpoints' LineMap 125 * \param *Point1 first boundary point 126 * \param *Point2 second boundary point 127 * \param number number of the list 128 */ 129 BoundaryLineSet::BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number) 130 { 131 Info FunctionInfo(__func__); 132 // set number 133 Nr = number; 134 // set endpoints in ascending order 135 SetEndpointsOrdered(endpoints, Point1, Point2); 136 // add this line to the hash maps of both endpoints 137 Point1->AddLine(this); //Taken out, to check whether we can avoid unwanted double adding. 138 Point2->AddLine(this); // 117 139 // set skipped to false 118 140 skipped = false; … … 171 193 * \param *triangle to add 172 194 */ 173 void BoundaryLineSet::AddTriangle( class BoundaryTriangleSet *triangle)195 void BoundaryLineSet::AddTriangle(BoundaryTriangleSet * const triangle) 174 196 { 175 197 Info FunctionInfo(__func__); … … 182 204 * \return true - common endpoint present, false - not connected 183 205 */ 184 bool BoundaryLineSet::IsConnectedTo(c lass BoundaryLineSet *line)206 bool BoundaryLineSet::IsConnectedTo(const BoundaryLineSet * const line) const 185 207 { 186 208 Info FunctionInfo(__func__); … … 197 219 * \return true - triangles are convex, false - concave or less than two triangles connected 198 220 */ 199 bool BoundaryLineSet::CheckConvexityCriterion() 221 bool BoundaryLineSet::CheckConvexityCriterion() const 200 222 { 201 223 Info FunctionInfo(__func__); … … 221 243 int i=0; 222 244 class BoundaryPointSet *node = NULL; 223 for(TriangleMap:: iterator runner = triangles.begin(); runner != triangles.end(); runner++) {245 for(TriangleMap::const_iterator runner = triangles.begin(); runner != triangles.end(); runner++) { 224 246 //Log() << Verbose(0) << "INFO: NormalVector of " << *(runner->second) << " is " << runner->second->NormalVector << "." << endl; 225 247 NormalCheck.AddVector(&runner->second->NormalVector); … … 264 286 * \return true - point is of the line, false - is not 265 287 */ 266 bool BoundaryLineSet::ContainsBoundaryPoint(c lass BoundaryPointSet *point)288 bool BoundaryLineSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const 267 289 { 268 290 Info FunctionInfo(__func__); … … 277 299 * \return NULL - if endpoint not contained in BoundaryLineSet, or pointer to BoundaryPointSet otherwise 278 300 */ 279 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(c lass BoundaryPointSet *point)301 class BoundaryPointSet *BoundaryLineSet::GetOtherEndpoint(const BoundaryPointSet * const point) const 280 302 { 281 303 Info FunctionInfo(__func__); … … 317 339 * \param number number of triangle 318 340 */ 319 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet * line[3],int number) :341 BoundaryTriangleSet::BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number) : 320 342 Nr(number) 321 343 { … … 376 398 * \param &OtherVector direction vector to make normal vector unique. 377 399 */ 378 void BoundaryTriangleSet::GetNormalVector( Vector &OtherVector)400 void BoundaryTriangleSet::GetNormalVector(const Vector &OtherVector) 379 401 { 380 402 Info FunctionInfo(__func__); … … 388 410 }; 389 411 390 /** Finds the point on the triangle \a *BTS th e line defined by \a *MolCenter and \a *x crosses through.412 /** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses. 391 413 * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane 392 * Th is we test if it's really on the plane and whether it's inside the triangle on the plane or not.414 * Thus we test if it's really on the plane and whether it's inside the triangle on the plane or not. 393 415 * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line 394 416 * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between … … 400 422 * \return true - \a *Intersection contains intersection on plane defined by triangle, false - zero vector if outside of triangle. 401 423 */ 402 bool BoundaryTriangleSet::GetIntersectionInsideTriangle( Vector *MolCenter, Vector *x, Vector *Intersection)403 { 404 Info FunctionInfo(__func__);424 bool BoundaryTriangleSet::GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const 425 { 426 Info FunctionInfo(__func__); 405 427 Vector CrossPoint; 406 428 Vector helper; … … 411 433 } 412 434 435 Log() << Verbose(1) << "INFO: Triangle is " << *this << "." << endl; 436 Log() << Verbose(1) << "INFO: Line is from " << *MolCenter << " to " << *x << "." << endl; 437 Log() << Verbose(1) << "INFO: Intersection is " << *Intersection << "." << endl; 438 439 if (Intersection->DistanceSquared(endpoints[0]->node->node) < MYEPSILON) { 440 Log() << Verbose(1) << "Intersection coindices with first endpoint." << endl; 441 return true; 442 } else if (Intersection->DistanceSquared(endpoints[1]->node->node) < MYEPSILON) { 443 Log() << Verbose(1) << "Intersection coindices with second endpoint." << endl; 444 return true; 445 } else if (Intersection->DistanceSquared(endpoints[2]->node->node) < MYEPSILON) { 446 Log() << Verbose(1) << "Intersection coindices with third endpoint." << endl; 447 return true; 448 } 413 449 // Calculate cross point between one baseline and the line from the third endpoint to intersection 414 450 int i=0; … … 417 453 helper.CopyVector(endpoints[(i+1)%3]->node->node); 418 454 helper.SubtractVector(endpoints[i%3]->node->node); 455 CrossPoint.SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 456 const double s = CrossPoint.ScalarProduct(&helper)/helper.NormSquared(); 457 Log() << Verbose(1) << "INFO: Factor s is " << s << "." << endl; 458 if ((s < -MYEPSILON) || ((s-1.) > MYEPSILON)) { 459 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << "outside of triangle." << endl; 460 i=4; 461 break; 462 } 463 i++; 419 464 } else 420 i++;421 if (i>2)422 465 break; 423 } while ( CrossPoint.NormSquared() < MYEPSILON);466 } while (i<3); 424 467 if (i==3) { 425 eLog() << Verbose(0) << "Could not find any cross points, something's utterly wrong here!" << endl; 426 } 427 CrossPoint.SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 428 429 // check whether intersection is inside or not by comparing length of intersection and length of cross point 430 if ((CrossPoint.NormSquared() - helper.NormSquared()) < MYEPSILON) { // inside 468 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " inside of triangle." << endl; 431 469 return true; 432 } else { // outside!433 Intersection->Zero();470 } else { 471 Log() << Verbose(1) << "INFO: Crosspoint " << CrossPoint << " outside of triangle." << endl; 434 472 return false; 435 473 } 474 }; 475 476 /** Finds the point on the triangle \a *BTS through which the line defined by \a *MolCenter and \a *x crosses. 477 * We call Vector::GetIntersectionWithPlane() to receive the intersection point with the plane 478 * Thus we test if it's really on the plane and whether it's inside the triangle on the plane or not. 479 * The latter is done as follows: We calculate the cross point of one of the triangle's baseline with the line 480 * given by the intersection and the third basepoint. Then, we check whether it's on the baseline (i.e. between 481 * the first two basepoints) or not. 482 * \param *x point 483 * \param *ClosestPoint desired closest point inside triangle to \a *x, is absolute vector 484 * \return Distance squared between \a *x and closest point inside triangle 485 */ 486 double BoundaryTriangleSet::GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const 487 { 488 Info FunctionInfo(__func__); 489 Vector Direction; 490 491 // 1. get intersection with plane 492 Log() << Verbose(1) << "INFO: Looking for closest point of triangle " << *this << " to " << *x << "." << endl; 493 GetCenter(&Direction); 494 if (!ClosestPoint->GetIntersectionWithPlane(&NormalVector, endpoints[0]->node->node, x, &Direction)) { 495 ClosestPoint->CopyVector(x); 496 } 497 498 // 2. Calculate in plane part of line (x, intersection) 499 Vector InPlane; 500 InPlane.CopyVector(x); 501 InPlane.SubtractVector(ClosestPoint); // points from plane intersection to straight-down point 502 InPlane.ProjectOntoPlane(&NormalVector); 503 InPlane.AddVector(ClosestPoint); 504 505 Log() << Verbose(2) << "INFO: Triangle is " << *this << "." << endl; 506 Log() << Verbose(2) << "INFO: Line is from " << Direction << " to " << *x << "." << endl; 507 Log() << Verbose(2) << "INFO: In-plane part is " << InPlane << "." << endl; 508 509 // Calculate cross point between one baseline and the desired point such that distance is shortest 510 double ShortestDistance = -1.; 511 bool InsideFlag = false; 512 Vector CrossDirection[3]; 513 Vector CrossPoint[3]; 514 Vector helper; 515 for (int i=0;i<3;i++) { 516 // treat direction of line as normal of a (cut)plane and the desired point x as the plane offset, the intersect line with point 517 Direction.CopyVector(endpoints[(i+1)%3]->node->node); 518 Direction.SubtractVector(endpoints[i%3]->node->node); 519 // calculate intersection, line can never be parallel to Direction (is the same vector as PlaneNormal); 520 CrossPoint[i].GetIntersectionWithPlane(&Direction, &InPlane, endpoints[i%3]->node->node, endpoints[(i+1)%3]->node->node); 521 CrossDirection[i].CopyVector(&CrossPoint[i]); 522 CrossDirection[i].SubtractVector(&InPlane); 523 CrossPoint[i].SubtractVector(endpoints[i%3]->node->node); // cross point was returned as absolute vector 524 const double s = CrossPoint[i].ScalarProduct(&Direction)/Direction.NormSquared(); 525 Log() << Verbose(2) << "INFO: Factor s is " << s << "." << endl; 526 if ((s >= -MYEPSILON) && ((s-1.) <= MYEPSILON)) { 527 CrossPoint[i].AddVector(endpoints[i%3]->node->node); // make cross point absolute again 528 Log() << Verbose(2) << "INFO: Crosspoint is " << CrossPoint[i] << ", intersecting BoundaryLine between " << *endpoints[i%3]->node->node << " and " << *endpoints[(i+1)%3]->node->node << "." << endl; 529 const double distance = CrossPoint[i].DistanceSquared(x); 530 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 531 ShortestDistance = distance; 532 ClosestPoint->CopyVector(&CrossPoint[i]); 533 } 534 } else 535 CrossPoint[i].Zero(); 536 } 537 InsideFlag = true; 538 for (int i=0;i<3;i++) { 539 const double sign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+1)%3]); 540 const double othersign = CrossDirection[i].ScalarProduct(&CrossDirection[(i+2)%3]);; 541 if ((sign > -MYEPSILON) && (othersign > -MYEPSILON)) // have different sign 542 InsideFlag = false; 543 } 544 if (InsideFlag) { 545 ClosestPoint->CopyVector(&InPlane); 546 ShortestDistance = InPlane.DistanceSquared(x); 547 } else { // also check endnodes 548 for (int i=0;i<3;i++) { 549 const double distance = x->DistanceSquared(endpoints[i]->node->node); 550 if ((ShortestDistance < 0.) || (ShortestDistance > distance)) { 551 ShortestDistance = distance; 552 ClosestPoint->CopyVector(endpoints[i]->node->node); 553 } 554 } 555 } 556 Log() << Verbose(1) << "INFO: Closest Point is " << *ClosestPoint << " with shortest squared distance is " << ShortestDistance << "." << endl; 557 return ShortestDistance; 436 558 }; 437 559 … … 440 562 * \return true - line is of the triangle, false - is not 441 563 */ 442 bool BoundaryTriangleSet::ContainsBoundaryLine(c lass BoundaryLineSet *line)564 bool BoundaryTriangleSet::ContainsBoundaryLine(const BoundaryLineSet * const line) const 443 565 { 444 566 Info FunctionInfo(__func__); … … 453 575 * \return true - point is of the triangle, false - is not 454 576 */ 455 bool BoundaryTriangleSet::ContainsBoundaryPoint(c lass BoundaryPointSet *point)577 bool BoundaryTriangleSet::ContainsBoundaryPoint(const BoundaryPointSet * const point) const 456 578 { 457 579 Info FunctionInfo(__func__); … … 466 588 * \return true - point is of the triangle, false - is not 467 589 */ 468 bool BoundaryTriangleSet::ContainsBoundaryPoint(c lass TesselPoint *point)590 bool BoundaryTriangleSet::ContainsBoundaryPoint(const TesselPoint * const point) const 469 591 { 470 592 Info FunctionInfo(__func__); … … 479 601 * \return true - is the very triangle, false - is not 480 602 */ 481 bool BoundaryTriangleSet::IsPresentTupel(class BoundaryPointSet *Points[3]) 482 { 483 Info FunctionInfo(__func__); 603 bool BoundaryTriangleSet::IsPresentTupel(const BoundaryPointSet * const Points[3]) const 604 { 605 Info FunctionInfo(__func__); 606 Log() << Verbose(1) << "INFO: Checking " << Points[0] << "," << Points[1] << "," << Points[2] << " against " << endpoints[0] << "," << endpoints[1] << "," << endpoints[2] << "." << endl; 484 607 return (((endpoints[0] == Points[0]) 485 608 || (endpoints[0] == Points[1]) … … 501 624 * \return true - is the very triangle, false - is not 502 625 */ 503 bool BoundaryTriangleSet::IsPresentTupel(c lass BoundaryTriangleSet *T)626 bool BoundaryTriangleSet::IsPresentTupel(const BoundaryTriangleSet * const T) const 504 627 { 505 628 Info FunctionInfo(__func__); … … 523 646 * \return pointer third endpoint or NULL if line does not belong to triangle. 524 647 */ 525 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(c lass BoundaryLineSet *line)648 class BoundaryPointSet *BoundaryTriangleSet::GetThirdEndpoint(const BoundaryLineSet * const line) const 526 649 { 527 650 Info FunctionInfo(__func__); … … 540 663 * \param *center central point on return. 541 664 */ 542 void BoundaryTriangleSet::GetCenter(Vector * center)665 void BoundaryTriangleSet::GetCenter(Vector * const center) const 543 666 { 544 667 Info FunctionInfo(__func__); … … 547 670 center->AddVector(endpoints[i]->node->node); 548 671 center->Scale(1./3.); 672 Log() << Verbose(1) << "INFO: Center is at " << *center << "." << endl; 549 673 } 550 674 … … 1422 1546 TesselPoint *Walker = NULL; 1423 1547 Vector *Center = cloud->GetCenter(); 1424 list<BoundaryTriangleSet*>*triangles = NULL;1548 TriangleList *triangles = NULL; 1425 1549 bool AddFlag = false; 1426 1550 LinkedCell *BoundaryPoints = NULL; … … 1437 1561 Log() << Verbose(0) << "Current point is " << *Walker << "." << endl; 1438 1562 // get the next triangle 1439 triangles = FindClosestTrianglesTo Point(Walker->node, BoundaryPoints);1563 triangles = FindClosestTrianglesToVector(Walker->node, BoundaryPoints); 1440 1564 BTS = triangles->front(); 1441 1565 if ((triangles == NULL) || (BTS->ContainsBoundaryPoint(Walker))) { … … 1587 1711 bool insertNewLine = true; 1588 1712 1589 if (a->lines.find(b->node->nr) != a->lines.end()) { 1590 LineMap::iterator FindLine = a->lines.find(b->node->nr); 1713 LineMap::iterator FindLine = a->lines.find(b->node->nr); 1714 if (FindLine != a->lines.end()) { 1715 Log() << Verbose(1) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl; 1716 1591 1717 pair<LineMap::iterator,LineMap::iterator> FindPair; 1592 1718 FindPair = a->lines.equal_range(b->node->nr); 1593 Log() << Verbose(1) << "INFO: There is at least one line between " << *a << " and " << *b << ": " << *(FindLine->second) << "." << endl;1594 1719 1595 1720 for (FindLine = FindPair.first; FindLine != FindPair.second; FindLine++) { … … 1915 2040 double maxCoordinate[NDIM]; 1916 2041 BoundaryLineSet BaseLine; 1917 Vector Oben;1918 2042 Vector helper; 1919 2043 Vector Chord; 1920 2044 Vector SearchDirection; 1921 1922 Oben.Zero(); 2045 Vector CircleCenter; // center of the circle, i.e. of the band of sphere's centers 2046 Vector CirclePlaneNormal; // normal vector defining the plane this circle lives in 2047 Vector SphereCenter; 2048 Vector NormalVector; 2049 2050 NormalVector.Zero(); 1923 2051 1924 2052 for (i = 0; i < 3; i++) { … … 1955 2083 BTS = NULL; 1956 2084 for (int k=0;k<NDIM;k++) { 1957 Oben.Zero();1958 Oben.x[k] = 1.;2085 NormalVector.Zero(); 2086 NormalVector.x[k] = 1.; 1959 2087 BaseLine.endpoints[0] = new BoundaryPointSet(MaxPoint[k]); 1960 2088 Log() << Verbose(0) << "Coordinates of start node at " << *BaseLine.endpoints[0]->node << "." << endl; … … 1963 2091 ShortestAngle = 999999.; // This will contain the angle, which will be always positive (when looking for second point), when looking for third point this will be the quadrant. 1964 2092 1965 FindSecondPointForTesselation(BaseLine.endpoints[0]->node, Oben, Temporary, &ShortestAngle, RADIUS, LC); // we give same point as next candidate as its bonds are looked into in find_second_...2093 FindSecondPointForTesselation(BaseLine.endpoints[0]->node, NormalVector, Temporary, &ShortestAngle, RADIUS, LC); // we give same point as next candidate as its bonds are looked into in find_second_... 1966 2094 if (Temporary == NULL) // have we found a second point? 1967 2095 continue; 1968 2096 BaseLine.endpoints[1] = new BoundaryPointSet(Temporary); 1969 2097 1970 helper.CopyVector(BaseLine.endpoints[0]->node->node); 1971 helper.SubtractVector(BaseLine.endpoints[1]->node->node); 1972 helper.Normalize(); 1973 Oben.ProjectOntoPlane(&helper); 1974 Oben.Normalize(); 1975 helper.VectorProduct(&Oben); 2098 // construct center of circle 2099 CircleCenter.CopyVector(BaseLine.endpoints[0]->node->node); 2100 CircleCenter.AddVector(BaseLine.endpoints[1]->node->node); 2101 CircleCenter.Scale(0.5); 2102 2103 // construct normal vector of circle 2104 CirclePlaneNormal.CopyVector(BaseLine.endpoints[0]->node->node); 2105 CirclePlaneNormal.SubtractVector(BaseLine.endpoints[1]->node->node); 2106 2107 double radius = CirclePlaneNormal.NormSquared(); 2108 double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.); 2109 2110 NormalVector.ProjectOntoPlane(&CirclePlaneNormal); 2111 NormalVector.Normalize(); 1976 2112 ShortestAngle = 2.*M_PI; // This will indicate the quadrant. 1977 2113 1978 Chord.CopyVector(BaseLine.endpoints[0]->node->node); // bring into calling function 1979 Chord.SubtractVector(BaseLine.endpoints[1]->node->node); 1980 double radius = Chord.ScalarProduct(&Chord); 1981 double CircleRadius = sqrt(RADIUS*RADIUS - radius/4.); 1982 helper.CopyVector(&Oben); 1983 helper.Scale(CircleRadius); 1984 // Now, oben and helper are two orthonormalized vectors in the plane defined by Chord (not normalized) 2114 SphereCenter.CopyVector(&NormalVector); 2115 SphereCenter.Scale(CircleRadius); 2116 SphereCenter.AddVector(&CircleCenter); 2117 // Now, NormalVector and SphereCenter are two orthonormalized vectors in the plane defined by CirclePlaneNormal (not normalized) 1985 2118 1986 2119 // look in one direction of baseline for initial candidate 1987 SearchDirection.MakeNormalVector(&C hord, &Oben); // whether we look "left" first or "right" first is not important ...2120 SearchDirection.MakeNormalVector(&CirclePlaneNormal, &NormalVector); // whether we look "left" first or "right" first is not important ... 1988 2121 1989 2122 // adding point 1 and point 2 and add the line between them … … 1993 2126 //Log() << Verbose(1) << "INFO: OldSphereCenter is at " << helper << ".\n"; 1994 2127 CandidateForTesselation OptCandidates(&BaseLine); 1995 FindThirdPointForTesselation( Oben, SearchDirection, helper, OptCandidates, NULL, RADIUS, LC);2128 FindThirdPointForTesselation(NormalVector, SearchDirection, SphereCenter, OptCandidates, NULL, RADIUS, LC); 1996 2129 Log() << Verbose(0) << "List of third Points is:" << endl; 1997 2130 for (TesselPointList::iterator it = OptCandidates.pointlist.begin(); it != OptCandidates.pointlist.end(); it++) { … … 2167 2300 Vector CircleCenter; 2168 2301 Vector CirclePlaneNormal; 2169 Vector OldSphereCenter;2302 Vector RelativeSphereCenter; 2170 2303 Vector SearchDirection; 2171 2304 Vector helper; … … 2174 2307 double radius, CircleRadius; 2175 2308 2176 Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " of triangle " << T << "." << endl;2177 2309 for (int i=0;i<3;i++) 2178 if ((T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[0]->node) && (T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[1]->node)) 2310 if ((T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[0]->node) && (T.endpoints[i]->node != CandidateLine.BaseLine->endpoints[1]->node)) { 2179 2311 ThirdNode = T.endpoints[i]->node; 2312 break; 2313 } 2314 Log() << Verbose(0) << "Current baseline is " << *CandidateLine.BaseLine << " with ThirdNode " << *ThirdNode << " of triangle " << T << "." << endl; 2180 2315 2181 2316 // construct center of circle … … 2191 2326 radius = CirclePlaneNormal.ScalarProduct(&CirclePlaneNormal); 2192 2327 if (radius/4. < RADIUS*RADIUS) { 2328 // construct relative sphere center with now known CircleCenter 2329 RelativeSphereCenter.CopyVector(&T.SphereCenter); 2330 RelativeSphereCenter.SubtractVector(&CircleCenter); 2331 2193 2332 CircleRadius = RADIUS*RADIUS - radius/4.; 2194 2333 CirclePlaneNormal.Normalize(); 2195 2334 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2196 2335 2197 // construct old center 2198 GetCenterofCircumcircle(&OldSphereCenter, *T.endpoints[0]->node->node, *T.endpoints[1]->node->node, *T.endpoints[2]->node->node); 2199 helper.CopyVector(&T.NormalVector); // normal vector ensures that this is correct center of the two possible ones 2200 radius = CandidateLine.BaseLine->endpoints[0]->node->node->DistanceSquared(&OldSphereCenter); 2201 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 2202 OldSphereCenter.AddVector(&helper); 2203 OldSphereCenter.SubtractVector(&CircleCenter); 2204 Log() << Verbose(1) << "INFO: OldSphereCenter is at " << OldSphereCenter << "." << endl; 2205 2206 // construct SearchDirection 2207 SearchDirection.MakeNormalVector(&T.NormalVector, &CirclePlaneNormal); 2208 helper.CopyVector(CandidateLine.BaseLine->endpoints[0]->node->node); 2336 Log() << Verbose(1) << "INFO: OldSphereCenter is at " << T.SphereCenter << "." << endl; 2337 2338 // construct SearchDirection and an "outward pointer" 2339 SearchDirection.MakeNormalVector(&RelativeSphereCenter, &CirclePlaneNormal); 2340 helper.CopyVector(&CircleCenter); 2209 2341 helper.SubtractVector(ThirdNode->node); 2210 2342 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON)// ohoh, SearchDirection points inwards! 2211 2343 SearchDirection.Scale(-1.); 2212 SearchDirection.ProjectOntoPlane(&OldSphereCenter);2213 SearchDirection.Normalize();2214 2344 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2215 if (fabs( OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) {2345 if (fabs(RelativeSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { 2216 2346 // rotated the wrong way! 2217 2347 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are still not orthogonal!" << endl; … … 2219 2349 2220 2350 // add third point 2221 FindThirdPointForTesselation(T.NormalVector, SearchDirection, OldSphereCenter, CandidateLine, ThirdNode, RADIUS, LC);2351 FindThirdPointForTesselation(T.NormalVector, SearchDirection, T.SphereCenter, CandidateLine, ThirdNode, RADIUS, LC); 2222 2352 2223 2353 } else { … … 2332 2462 2333 2463 // fill the set of neighbours 2334 Center.CopyVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2335 Center.SubtractVector(TurningPoint->node); 2336 set<TesselPoint*> SetOfNeighbours; 2464 TesselPointSet SetOfNeighbours; 2337 2465 SetOfNeighbours.insert(CandidateLine.BaseLine->endpoints[1]->node); 2338 2466 for (TesselPointList::iterator Runner = CandidateLine.pointlist.begin(); Runner != CandidateLine.pointlist.end(); Runner++) 2339 2467 SetOfNeighbours.insert(*Runner); 2340 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, &Center);2468 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(&SetOfNeighbours, TurningPoint, CandidateLine.BaseLine->endpoints[1]->node->node); 2341 2469 2342 2470 // go through all angle-sorted candidates (in degenerate n-nodes case we may have to add multiple triangles) 2471 Log() << Verbose(0) << "List of Candidates for Turning Point: " << *TurningPoint << "." << endl; 2472 for (TesselPointList::iterator TesselRunner = connectedClosestPoints->begin(); TesselRunner != connectedClosestPoints->end(); ++TesselRunner) 2473 Log() << Verbose(0) << **TesselRunner << endl; 2343 2474 TesselPointList::iterator Runner = connectedClosestPoints->begin(); 2344 2475 TesselPointList::iterator Sprinter = Runner; … … 2350 2481 AddTesselationPoint((*Sprinter), 2); 2351 2482 2352 Center.CopyVector(&CandidateLine.OptCenter);2353 2483 // add the lines 2354 2484 AddTesselationLine(TPS[0], TPS[1], 0); … … 2359 2489 BTS = new class BoundaryTriangleSet(BLS, TrianglesOnBoundaryCount); 2360 2490 AddTesselationTriangle(); 2361 Center.Scale(-1.); 2491 BTS->GetCenter(&Center); 2492 Center.SubtractVector(&CandidateLine.OptCenter); 2493 BTS->SphereCenter.CopyVector(&CandidateLine.OptCenter); 2362 2494 BTS->GetNormalVector(Center); 2363 2495 … … 2365 2497 Runner = Sprinter; 2366 2498 Sprinter++; 2499 Log() << Verbose(0) << "Current Runner is " << **Runner << "." << endl; 2500 if (Sprinter != connectedClosestPoints->end()) 2501 Log() << Verbose(0) << " There are still more triangles to add." << endl; 2367 2502 } 2368 2503 delete(connectedClosestPoints); … … 2766 2901 Vector NewNormalVector; // normal vector of the Candidate's triangle 2767 2902 Vector helper, OptCandidateCenter, OtherOptCandidateCenter; 2903 Vector RelativeOldSphereCenter; 2904 Vector NewPlaneCenter; 2768 2905 double CircleRadius; // radius of this circle 2769 2906 double radius; 2907 double otherradius; 2770 2908 double alpha, Otheralpha; // angles (i.e. parameter for the circle). 2771 2909 int N[NDIM], Nlower[NDIM], Nupper[NDIM]; … … 2783 2921 CirclePlaneNormal.SubtractVector(CandidateLine.BaseLine->endpoints[1]->node->node); 2784 2922 2923 RelativeOldSphereCenter.CopyVector(&OldSphereCenter); 2924 RelativeOldSphereCenter.SubtractVector(&CircleCenter); 2925 2785 2926 // calculate squared radius TesselPoint *ThirdNode,f circle 2786 radius = CirclePlaneNormal. ScalarProduct(&CirclePlaneNormal);2787 if (radius /4.< RADIUS*RADIUS) {2788 CircleRadius = RADIUS*RADIUS - radius /4.;2927 radius = CirclePlaneNormal.NormSquared()/4.; 2928 if (radius < RADIUS*RADIUS) { 2929 CircleRadius = RADIUS*RADIUS - radius; 2789 2930 CirclePlaneNormal.Normalize(); 2790 //Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl;2931 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2791 2932 2792 2933 // test whether old center is on the band's plane 2793 if (fabs( OldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) {2794 eLog() << Verbose(1) << "Something's very wrong here: OldSphereCenter is not on the band's plane as desired by " << fabs(OldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl;2795 OldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal);2796 } 2797 radius = OldSphereCenter.ScalarProduct(&OldSphereCenter);2934 if (fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) { 2935 eLog() << Verbose(1) << "Something's very wrong here: RelativeOldSphereCenter is not on the band's plane as desired by " << fabs(RelativeOldSphereCenter.ScalarProduct(&CirclePlaneNormal)) << "!" << endl; 2936 RelativeOldSphereCenter.ProjectOntoPlane(&CirclePlaneNormal); 2937 } 2938 radius = RelativeOldSphereCenter.NormSquared(); 2798 2939 if (fabs(radius - CircleRadius) < HULLEPSILON) { 2799 //Log() << Verbose(1) << "INFO: OldSphereCenter is at " <<OldSphereCenter << "." << endl;2940 Log() << Verbose(1) << "INFO: RelativeOldSphereCenter is at " << RelativeOldSphereCenter << "." << endl; 2800 2941 2801 2942 // check SearchDirection 2802 //Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl;2803 if (fabs( OldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way!2943 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2944 if (fabs(RelativeOldSphereCenter.ScalarProduct(&SearchDirection)) > HULLEPSILON) { // rotated the wrong way! 2804 2945 eLog() << Verbose(1) << "SearchDirection and RelativeOldSphereCenter are not orthogonal!" << endl; 2805 2946 } … … 2832 2973 2833 2974 // check for three unique points 2834 Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " at " << *(Candidate->node)<< "." << endl;2975 Log() << Verbose(2) << "INFO: Current Candidate is " << *Candidate << " for BaseLine " << *CandidateLine.BaseLine << " with OldSphereCenter " << OldSphereCenter << "." << endl; 2835 2976 if ((Candidate != CandidateLine.BaseLine->endpoints[0]->node) && (Candidate != CandidateLine.BaseLine->endpoints[1]->node) ){ 2836 2977 2837 // construct both new centers2838 GetCenterofCircumcircle(&New SphereCenter, *CandidateLine.BaseLine->endpoints[0]->node->node, *CandidateLine.BaseLine->endpoints[1]->node->node, *Candidate->node);2839 OtherNewSphereCenter.CopyVector(&NewSphereCenter);2840 2841 if ( (NewNormalVector.MakeNormalVector(CandidateLine.BaseLine->endpoints[0]->node->node, CandidateLine.BaseLine->endpoints[1]->node->node, Candidate->node))2842 && (fabs(NewNormalVector. ScalarProduct(&NewNormalVector)) > HULLEPSILON)2978 // find center on the plane 2979 GetCenterofCircumcircle(&NewPlaneCenter, *CandidateLine.BaseLine->endpoints[0]->node->node, *CandidateLine.BaseLine->endpoints[1]->node->node, *Candidate->node); 2980 Log() << Verbose(1) << "INFO: NewPlaneCenter is " << NewPlaneCenter << "." << endl; 2981 2982 if (NewNormalVector.MakeNormalVector(CandidateLine.BaseLine->endpoints[0]->node->node, CandidateLine.BaseLine->endpoints[1]->node->node, Candidate->node) 2983 && (fabs(NewNormalVector.NormSquared()) > HULLEPSILON) 2843 2984 ) { 2844 helper.CopyVector(&NewNormalVector);2845 2985 Log() << Verbose(1) << "INFO: NewNormalVector is " << NewNormalVector << "." << endl; 2846 radius = CandidateLine.BaseLine->endpoints[0]->node->node->DistanceSquared(&NewSphereCenter); 2986 radius = CandidateLine.BaseLine->endpoints[0]->node->node->DistanceSquared(&NewPlaneCenter); 2987 Log() << Verbose(1) << "INFO: CircleCenter is at " << CircleCenter << ", CirclePlaneNormal is " << CirclePlaneNormal << " with circle radius " << sqrt(CircleRadius) << "." << endl; 2988 Log() << Verbose(1) << "INFO: SearchDirection is " << SearchDirection << "." << endl; 2989 Log() << Verbose(1) << "INFO: Radius of CircumCenterCircle is " << radius << "." << endl; 2847 2990 if (radius < RADIUS*RADIUS) { 2991 otherradius = CandidateLine.BaseLine->endpoints[1]->node->node->DistanceSquared(&NewPlaneCenter); 2992 if (fabs(radius - otherradius) > HULLEPSILON) { 2993 eLog() << Verbose(1) << "Distance to center of circumcircle is not the same from each corner of the triangle: " << fabs(radius-otherradius) << endl; 2994 } 2995 // construct both new centers 2996 NewSphereCenter.CopyVector(&NewPlaneCenter); 2997 OtherNewSphereCenter.CopyVector(&NewPlaneCenter); 2998 helper.CopyVector(&NewNormalVector); 2848 2999 helper.Scale(sqrt(RADIUS*RADIUS - radius)); 2849 Log() << Verbose(2) << "INFO: Distance of New CircleCenter to NewSphereCenter is " << helper.Norm()<< " with sphere radius " << RADIUS << "." << endl;3000 Log() << Verbose(2) << "INFO: Distance of NewPlaneCenter " << NewPlaneCenter << " to either NewSphereCenter is " << helper.Norm() << " of vector " << helper << " with sphere radius " << RADIUS << "." << endl; 2850 3001 NewSphereCenter.AddVector(&helper); 2851 NewSphereCenter.SubtractVector(&CircleCenter);2852 3002 Log() << Verbose(2) << "INFO: NewSphereCenter is at " << NewSphereCenter << "." << endl; 2853 2854 3003 // OtherNewSphereCenter is created by the same vector just in the other direction 2855 3004 helper.Scale(-1.); 2856 3005 OtherNewSphereCenter.AddVector(&helper); 2857 OtherNewSphereCenter.SubtractVector(&CircleCenter);2858 3006 Log() << Verbose(2) << "INFO: OtherNewSphereCenter is at " << OtherNewSphereCenter << "." << endl; 2859 3007 … … 2861 3009 Otheralpha = GetPathLengthonCircumCircle(CircleCenter, CirclePlaneNormal, CircleRadius, OtherNewSphereCenter, OldSphereCenter, NormalVector, SearchDirection); 2862 3010 alpha = min(alpha, Otheralpha); 3011 2863 3012 // if there is a better candidate, drop the current list and add the new candidate 2864 3013 // otherwise ignore the new candidate and keep the list … … 2892 3041 } 2893 3042 } 2894 2895 3043 } else { 2896 3044 Log() << Verbose(1) << "REJECT: NewSphereCenter " << NewSphereCenter << " for " << *Candidate << " is too far away: " << radius << "." << endl; … … 2936 3084 const BoundaryLineSet * lines[2] = { line1, line2 }; 2937 3085 class BoundaryPointSet *node = NULL; 2938 map<int, class BoundaryPointSet *>OrderMap;2939 pair<map<int, class BoundaryPointSet *>::iterator, bool>OrderTest;3086 PointMap OrderMap; 3087 PointTestPair OrderTest; 2940 3088 for (int i = 0; i < 2; i++) 2941 3089 // for both lines … … 2957 3105 }; 2958 3106 3107 /** Finds the boundary points that are closest to a given Vector \a *x. 3108 * \param *out output stream for debugging 3109 * \param *x Vector to look from 3110 * \return map of BoundaryPointSet of closest points sorted by squared distance or NULL. 3111 */ 3112 DistanceToPointMap * Tesselation::FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const 3113 { 3114 Info FunctionInfo(__func__); 3115 PointMap::const_iterator FindPoint; 3116 int N[NDIM], Nlower[NDIM], Nupper[NDIM]; 3117 3118 if (LinesOnBoundary.empty()) { 3119 eLog() << Verbose(1) << "There is no tesselation structure to compare the point with, please create one first." << endl; 3120 return NULL; 3121 } 3122 3123 // gather all points close to the desired one 3124 LC->SetIndexToVector(x); // ignore status as we calculate bounds below sensibly 3125 for(int i=0;i<NDIM;i++) // store indices of this cell 3126 N[i] = LC->n[i]; 3127 Log() << Verbose(1) << "INFO: Center cell is " << N[0] << ", " << N[1] << ", " << N[2] << " with No. " << LC->index << "." << endl; 3128 3129 DistanceToPointMap * points = new DistanceToPointMap; 3130 LC->GetNeighbourBounds(Nlower, Nupper); 3131 //Log() << Verbose(1) << endl; 3132 for (LC->n[0] = Nlower[0]; LC->n[0] <= Nupper[0]; LC->n[0]++) 3133 for (LC->n[1] = Nlower[1]; LC->n[1] <= Nupper[1]; LC->n[1]++) 3134 for (LC->n[2] = Nlower[2]; LC->n[2] <= Nupper[2]; LC->n[2]++) { 3135 const LinkedNodes *List = LC->GetCurrentCell(); 3136 //Log() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << endl; 3137 if (List != NULL) { 3138 for (LinkedNodes::const_iterator Runner = List->begin(); Runner != List->end(); Runner++) { 3139 FindPoint = PointsOnBoundary.find((*Runner)->nr); 3140 if (FindPoint != PointsOnBoundary.end()) { 3141 points->insert(DistanceToPointPair (FindPoint->second->node->node->DistanceSquared(x), FindPoint->second) ); 3142 Log() << Verbose(1) << "INFO: Putting " << *FindPoint->second << " into the list." << endl; 3143 } 3144 } 3145 } else { 3146 eLog() << Verbose(1) << "The current cell " << LC->n[0] << "," << LC->n[1] << "," << LC->n[2] << " is invalid!" << endl; 3147 } 3148 } 3149 3150 // check whether we found some points 3151 if (points->empty()) { 3152 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 3153 delete(points); 3154 return NULL; 3155 } 3156 return points; 3157 }; 3158 3159 /** Finds the boundary line that is closest to a given Vector \a *x. 3160 * \param *out output stream for debugging 3161 * \param *x Vector to look from 3162 * \return closest BoundaryLineSet or NULL in degenerate case. 3163 */ 3164 BoundaryLineSet * Tesselation::FindClosestBoundaryLineToVector(const Vector *x, const LinkedCell* LC) const 3165 { 3166 Info FunctionInfo(__func__); 3167 3168 // get closest points 3169 DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x,LC); 3170 if (points == NULL) { 3171 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 3172 return NULL; 3173 } 3174 3175 // for each point, check its lines, remember closest 3176 Log() << Verbose(1) << "Finding closest BoundaryLine to " << *x << " ... " << endl; 3177 BoundaryLineSet *ClosestLine = NULL; 3178 double MinDistance = -1.; 3179 Vector helper; 3180 Vector Center; 3181 Vector BaseLine; 3182 for (DistanceToPointMap::iterator Runner = points->begin(); Runner != points->end(); Runner++) { 3183 for (LineMap::iterator LineRunner = Runner->second->lines.begin(); LineRunner != Runner->second->lines.end(); LineRunner++) { 3184 // calculate closest point on line to desired point 3185 helper.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3186 helper.AddVector((LineRunner->second)->endpoints[1]->node->node); 3187 helper.Scale(0.5); 3188 Center.CopyVector(x); 3189 Center.SubtractVector(&helper); 3190 BaseLine.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3191 BaseLine.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3192 Center.ProjectOntoPlane(&BaseLine); 3193 const double distance = Center.NormSquared(); 3194 if ((ClosestLine == NULL) || (distance < MinDistance)) { 3195 // additionally calculate intersection on line (whether it's on the line section or not) 3196 helper.CopyVector(x); 3197 helper.SubtractVector((LineRunner->second)->endpoints[0]->node->node); 3198 helper.SubtractVector(&Center); 3199 const double lengthA = helper.ScalarProduct(&BaseLine); 3200 helper.CopyVector(x); 3201 helper.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3202 helper.SubtractVector(&Center); 3203 const double lengthB = helper.ScalarProduct(&BaseLine); 3204 if (lengthB*lengthA < 0) { // if have different sign 3205 ClosestLine = LineRunner->second; 3206 MinDistance = distance; 3207 Log() << Verbose(1) << "ACCEPT: New closest line is " << *ClosestLine << " with projected distance " << MinDistance << "." << endl; 3208 } else { 3209 Log() << Verbose(1) << "REJECT: Intersection is outside of the line section: " << lengthA << " and " << lengthB << "." << endl; 3210 } 3211 } else { 3212 Log() << Verbose(1) << "REJECT: Point is too further away than present line: " << distance << " >> " << MinDistance << "." << endl; 3213 } 3214 } 3215 } 3216 delete(points); 3217 // check whether closest line is "too close" :), then it's inside 3218 if (ClosestLine == NULL) { 3219 Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl; 3220 return NULL; 3221 } 3222 return ClosestLine; 3223 }; 3224 3225 2959 3226 /** Finds the triangle that is closest to a given Vector \a *x. 2960 3227 * \param *out output stream for debugging 2961 3228 * \param *x Vector to look from 2962 * \return list of BoundaryTriangleSet of nearest triangles or NULL in degenerate case. 2963 */ 2964 list<BoundaryTriangleSet*> * Tesselation::FindClosestTrianglesToPoint(const Vector *x, const LinkedCell* LC) const 2965 { 2966 Info FunctionInfo(__func__); 2967 TesselPoint *trianglePoints[3]; 2968 TesselPoint *SecondPoint = NULL; 2969 list<BoundaryTriangleSet*> *triangles = NULL; 2970 2971 if (LinesOnBoundary.empty()) { 2972 eLog() << Verbose(1) << "Error: There is no tesselation structure to compare the point with, please create one first."; 3229 * \return BoundaryTriangleSet of nearest triangle or NULL. 3230 */ 3231 TriangleList * Tesselation::FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const 3232 { 3233 Info FunctionInfo(__func__); 3234 3235 // get closest points 3236 DistanceToPointMap * points = FindClosestBoundaryPointsToVector(x,LC); 3237 if (points == NULL) { 3238 eLog() << Verbose(1) << "There is no nearest point: too far away from the surface." << endl; 2973 3239 return NULL; 2974 3240 } 2975 Log() << Verbose(1) << "Finding closest Tesselpoint to " << *x << " ... " << endl; 2976 trianglePoints[0] = FindClosestPoint(x, SecondPoint, LC); 2977 2978 // check whether closest point is "too close" :), then it's inside 2979 if (trianglePoints[0] == NULL) { 3241 3242 // for each point, check its lines, remember closest 3243 Log() << Verbose(1) << "Finding closest BoundaryTriangle to " << *x << " ... " << endl; 3244 LineSet ClosestLines; 3245 double MinDistance = 1e+16; 3246 Vector BaseLineIntersection; 3247 Vector Center; 3248 Vector BaseLine; 3249 Vector BaseLineCenter; 3250 for (DistanceToPointMap::iterator Runner = points->begin(); Runner != points->end(); Runner++) { 3251 for (LineMap::iterator LineRunner = Runner->second->lines.begin(); LineRunner != Runner->second->lines.end(); LineRunner++) { 3252 3253 BaseLine.CopyVector((LineRunner->second)->endpoints[0]->node->node); 3254 BaseLine.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3255 const double lengthBase = BaseLine.NormSquared(); 3256 3257 BaseLineIntersection.CopyVector(x); 3258 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[0]->node->node); 3259 const double lengthEndA = BaseLineIntersection.NormSquared(); 3260 3261 BaseLineIntersection.CopyVector(x); 3262 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3263 const double lengthEndB = BaseLineIntersection.NormSquared(); 3264 3265 if ((lengthEndA > lengthBase) || (lengthEndB > lengthBase) || ((lengthEndA < MYEPSILON) || (lengthEndB < MYEPSILON))) { // intersection would be outside, take closer endpoint 3266 const double lengthEnd = Min(lengthEndA, lengthEndB); 3267 if (lengthEnd - MinDistance < -MYEPSILON) { // new best line 3268 ClosestLines.clear(); 3269 ClosestLines.insert(LineRunner->second); 3270 MinDistance = lengthEnd; 3271 Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[0]->node << " is closer with " << lengthEnd << "." << endl; 3272 } else if (fabs(lengthEnd - MinDistance) < MYEPSILON) { // additional best candidate 3273 ClosestLines.insert(LineRunner->second); 3274 Log() << Verbose(1) << "ACCEPT: Line " << *LineRunner->second << " to endpoint " << *LineRunner->second->endpoints[1]->node << " is equally good with " << lengthEnd << "." << endl; 3275 } else { // line is worse 3276 Log() << Verbose(1) << "REJECT: Line " << *LineRunner->second << " to either endpoints is further away than present closest line candidate: " << lengthEndA << ", " << lengthEndB << ", and distance is longer than baseline:" << lengthBase << "." << endl; 3277 } 3278 } else { // intersection is closer, calculate 3279 // calculate closest point on line to desired point 3280 BaseLineIntersection.CopyVector(x); 3281 BaseLineIntersection.SubtractVector((LineRunner->second)->endpoints[1]->node->node); 3282 Center.CopyVector(&BaseLineIntersection); 3283 Center.ProjectOntoPlane(&BaseLine); 3284 BaseLineIntersection.SubtractVector(&Center); 3285 const double distance = BaseLineIntersection.NormSquared(); 3286 if (Center.NormSquared() > BaseLine.NormSquared()) { 3287 eLog() << Verbose(0) << "Algorithmic error: In second case we have intersection outside of baseline!" << endl; 3288 } 3289 if ((ClosestLines.empty()) || (distance < MinDistance)) { 3290 ClosestLines.insert(LineRunner->second); 3291 MinDistance = distance; 3292 Log() << Verbose(1) << "ACCEPT: Intersection in between endpoints, new closest line " << *LineRunner->second << " is " << *ClosestLines.begin() << " with projected distance " << MinDistance << "." << endl; 3293 } else { 3294 Log() << Verbose(2) << "REJECT: Point is further away from line " << *LineRunner->second << " than present closest line: " << distance << " >> " << MinDistance << "." << endl; 3295 } 3296 } 3297 } 3298 } 3299 delete(points); 3300 3301 // check whether closest line is "too close" :), then it's inside 3302 if (ClosestLines.empty()) { 2980 3303 Log() << Verbose(0) << "Is the only point, no one else is closeby." << endl; 2981 3304 return NULL; 2982 3305 } 2983 if (trianglePoints[0]->node->DistanceSquared(x) < MYEPSILON) { 2984 Log() << Verbose(1) << "Point is right on a tesselation point, no nearest triangle." << endl; 2985 PointMap::const_iterator PointRunner = PointsOnBoundary.find(trianglePoints[0]->nr); 2986 triangles = new list<BoundaryTriangleSet*>; 2987 if (PointRunner != PointsOnBoundary.end()) { 2988 for(LineMap::iterator LineRunner = PointRunner->second->lines.begin(); LineRunner != PointRunner->second->lines.end(); LineRunner++) 2989 for(TriangleMap::iterator TriangleRunner = LineRunner->second->triangles.begin(); TriangleRunner != LineRunner->second->triangles.end(); TriangleRunner++) 2990 triangles->push_back(TriangleRunner->second); 2991 triangles->sort(); 2992 triangles->unique(); 2993 } else { 2994 PointRunner = PointsOnBoundary.find(SecondPoint->nr); 2995 trianglePoints[0] = SecondPoint; 2996 if (PointRunner != PointsOnBoundary.end()) { 2997 for(LineMap::iterator LineRunner = PointRunner->second->lines.begin(); LineRunner != PointRunner->second->lines.end(); LineRunner++) 2998 for(TriangleMap::iterator TriangleRunner = LineRunner->second->triangles.begin(); TriangleRunner != LineRunner->second->triangles.end(); TriangleRunner++) 2999 triangles->push_back(TriangleRunner->second); 3000 triangles->sort(); 3001 triangles->unique(); 3002 } else { 3003 eLog() << Verbose(1) << "I cannot find a boundary point to the tessel point " << *trianglePoints[0] << "." << endl; 3004 return NULL; 3005 } 3006 } 3007 } else { 3008 set<TesselPoint*> *connectedPoints = GetAllConnectedPoints(trianglePoints[0]); 3009 TesselPointList *connectedClosestPoints = GetCircleOfSetOfPoints(connectedPoints, trianglePoints[0], x); 3010 delete(connectedPoints); 3011 if (connectedClosestPoints != NULL) { 3012 trianglePoints[1] = connectedClosestPoints->front(); 3013 trianglePoints[2] = connectedClosestPoints->back(); 3014 for (int i=0;i<3;i++) { 3015 if (trianglePoints[i] == NULL) { 3016 eLog() << Verbose(1) << "IsInnerPoint encounters serious error, point " << i << " not found." << endl; 3017 } 3018 //Log() << Verbose(1) << "List of triangle points:" << endl; 3019 //Log() << Verbose(2) << *trianglePoints[i] << endl; 3020 } 3021 3022 triangles = FindTriangles(trianglePoints); 3023 Log() << Verbose(1) << "List of possible triangles:" << endl; 3024 for(list<BoundaryTriangleSet*>::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) 3025 Log() << Verbose(2) << **Runner << endl; 3026 3027 delete(connectedClosestPoints); 3028 } else { 3029 triangles = NULL; 3030 eLog() << Verbose(2) << "There is no circle of connected points!" << endl; 3031 } 3032 } 3033 3034 if ((triangles == NULL) || (triangles->empty())) { 3035 eLog() << Verbose(1) << "There is no nearest triangle. Please check the tesselation structure."; 3036 delete(triangles); 3037 return NULL; 3038 } else 3039 return triangles; 3306 TriangleList * candidates = new TriangleList; 3307 for (LineSet::iterator LineRunner = ClosestLines.begin(); LineRunner != ClosestLines.end(); LineRunner++) 3308 for (TriangleMap::iterator Runner = (*LineRunner)->triangles.begin(); Runner != (*LineRunner)->triangles.end(); Runner++) { 3309 candidates->push_back(Runner->second); 3310 } 3311 return candidates; 3040 3312 }; 3041 3313 … … 3046 3318 * \return list of BoundaryTriangleSet of nearest triangles or NULL. 3047 3319 */ 3048 class BoundaryTriangleSet * Tesselation::FindClosestTriangleTo Point(const Vector *x, const LinkedCell* LC) const3320 class BoundaryTriangleSet * Tesselation::FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const 3049 3321 { 3050 3322 Info FunctionInfo(__func__); 3051 3323 class BoundaryTriangleSet *result = NULL; 3052 list<BoundaryTriangleSet*> *triangles = FindClosestTrianglesToPoint(x, LC); 3324 TriangleList *triangles = FindClosestTrianglesToVector(x, LC); 3325 TriangleList candidates; 3053 3326 Vector Center; 3054 3055 if (triangles == NULL) 3327 Vector helper; 3328 3329 if ((triangles == NULL) || (triangles->empty())) 3056 3330 return NULL; 3057 3331 3058 if (triangles->size() == 1) { // there is no degenerate case 3059 result = triangles->front(); 3060 Log() << Verbose(1) << "Normal Vector of this triangle is " << result->NormalVector << "." << endl; 3061 } else { 3062 result = triangles->front(); 3063 result->GetCenter(&Center); 3064 Center.SubtractVector(x); 3065 Log() << Verbose(1) << "Normal Vector of this front side is " << result->NormalVector << "." << endl; 3066 if (Center.ScalarProduct(&result->NormalVector) < 0) { 3067 result = triangles->back(); 3068 Log() << Verbose(1) << "Normal Vector of this back side is " << result->NormalVector << "." << endl; 3069 if (Center.ScalarProduct(&result->NormalVector) < 0) { 3070 eLog() << Verbose(1) << "Front and back side yield NormalVector in wrong direction!" << endl; 3071 } 3332 // go through all and pick the one with the best alignment to x 3333 double MinAlignment = 2.*M_PI; 3334 for (TriangleList::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) { 3335 (*Runner)->GetCenter(&Center); 3336 helper.CopyVector(x); 3337 helper.SubtractVector(&Center); 3338 const double Alignment = helper.Angle(&(*Runner)->NormalVector); 3339 if (Alignment < MinAlignment) { 3340 result = *Runner; 3341 MinAlignment = Alignment; 3342 Log() << Verbose(1) << "ACCEPT: Triangle " << *result << " is better aligned with " << MinAlignment << "." << endl; 3343 } else { 3344 Log() << Verbose(1) << "REJECT: Triangle " << *result << " is worse aligned with " << MinAlignment << "." << endl; 3072 3345 } 3073 3346 } 3074 3347 delete(triangles); 3348 3075 3349 return result; 3076 3350 }; 3077 3351 3078 /** Checks whether the provided Vector is within the tesselation structure. 3352 /** Checks whether the provided Vector is within the Tesselation structure. 3353 * Basically calls Tesselation::GetDistanceToSurface() and checks the sign of the return value. 3354 * @param point of which to check the position 3355 * @param *LC LinkedCell structure 3356 * 3357 * @return true if the point is inside the Tesselation structure, false otherwise 3358 */ 3359 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const 3360 { 3361 return (GetDistanceSquaredToSurface(Point, LC) < MYEPSILON); 3362 } 3363 3364 /** Returns the distance to the surface given by the tesselation. 3365 * Calls FindClosestTriangleToVector() and checks whether the resulting triangle's BoundaryTriangleSet#NormalVector points 3366 * towards or away from the given \a &Point. Additionally, we check whether it's normal to the normal vector, i.e. on the 3367 * closest triangle's plane. Then, we have to check whether \a Point is inside the triangle or not to determine whether it's 3368 * an inside or outside point. This is done by calling BoundaryTriangleSet::GetIntersectionInsideTriangle(). 3369 * In the end we additionally find the point on the triangle who was smallest distance to \a Point: 3370 * -# Separate distance from point to center in vector in NormalDirection and on the triangle plane. 3371 * -# Check whether vector on triangle plane points inside the triangle or crosses triangle bounds. 3372 * -# If inside, take it to calculate closest distance 3373 * -# If not, take intersection with BoundaryLine as distance 3374 * 3375 * @note distance is squared despite it still contains a sign to determine in-/outside! 3079 3376 * 3080 3377 * @param point of which to check the position 3081 3378 * @param *LC LinkedCell structure 3082 3379 * 3083 * @return true if the point is inside the tesselation structure, false otherwise3084 */ 3085 bool Tesselation::IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const3086 { 3087 Info FunctionInfo(__func__);3088 class BoundaryTriangleSet *result = FindClosestTriangleTo Point(&Point, LC);3380 * @return >0 if outside, ==0 if on surface, <0 if inside (Note that distance can be at most LinkedCell::RADIUS.) 3381 */ 3382 double Tesselation::GetDistanceSquaredToSurface(const Vector &Point, const LinkedCell* const LC) const 3383 { 3384 Info FunctionInfo(__func__); 3385 class BoundaryTriangleSet *result = FindClosestTriangleToVector(&Point, LC); 3089 3386 Vector Center; 3387 Vector helper; 3388 Vector DistanceToCenter; 3389 Vector Intersection; 3390 double distance = 0.; 3090 3391 3091 3392 if (result == NULL) {// is boundary point or only point in point cloud? 3092 3393 Log() << Verbose(1) << Point << " is the only point in vicinity." << endl; 3093 return false; 3394 return LC->RADIUS; 3395 } else { 3396 Log() << Verbose(1) << "INFO: Closest triangle found is " << *result << " with normal vector " << result->NormalVector << "." << endl; 3094 3397 } 3095 3398 3096 3399 result->GetCenter(&Center); 3097 3400 Log() << Verbose(2) << "INFO: Central point of the triangle is " << Center << "." << endl; 3098 Center.SubtractVector(&Point); 3099 Log() << Verbose(2) << "INFO: Vector from center to point to test is " << Center << "." << endl; 3100 if (Center.ScalarProduct(&result->NormalVector) > -MYEPSILON) { 3101 Log() << Verbose(1) << Point << " is an inner point." << endl; 3102 return true; 3401 DistanceToCenter.CopyVector(&Center); 3402 DistanceToCenter.SubtractVector(&Point); 3403 Log() << Verbose(2) << "INFO: Vector from point to test to center is " << DistanceToCenter << "." << endl; 3404 3405 // check whether we are on boundary 3406 if (fabs(DistanceToCenter.ScalarProduct(&result->NormalVector)) < MYEPSILON) { 3407 // calculate whether inside of triangle 3408 DistanceToCenter.CopyVector(&Point); 3409 Center.CopyVector(&Point); 3410 Center.SubtractVector(&result->NormalVector); // points towards MolCenter 3411 DistanceToCenter.AddVector(&result->NormalVector); // points outside 3412 Log() << Verbose(1) << "INFO: Calling Intersection with " << Center << " and " << DistanceToCenter << "." << endl; 3413 if (result->GetIntersectionInsideTriangle(&Center, &DistanceToCenter, &Intersection)) { 3414 Log() << Verbose(1) << Point << " is inner point: sufficiently close to boundary, " << Intersection << "." << endl; 3415 return 0.; 3416 } else { 3417 Log() << Verbose(1) << Point << " is NOT an inner point: on triangle plane but outside of triangle bounds." << endl; 3418 return false; 3419 } 3103 3420 } else { 3104 Log() << Verbose(1) << Point << " is NOT an inner point." << endl; 3105 return false; 3106 } 3107 } 3108 3109 /** Checks whether the provided TesselPoint is within the tesselation structure. 3110 * 3111 * @param *Point of which to check the position 3112 * @param *LC Linked Cell structure 3113 * 3114 * @return true if the point is inside the tesselation structure, false otherwise 3115 */ 3116 bool Tesselation::IsInnerPoint(const TesselPoint * const Point, const LinkedCell* const LC) const 3117 { 3118 Info FunctionInfo(__func__); 3119 return IsInnerPoint(*(Point->node), LC); 3120 } 3421 // calculate smallest distance 3422 distance = result->GetClosestPointInsideTriangle(&Point, &Intersection); 3423 Log() << Verbose(1) << "Closest point on triangle is " << Intersection << "." << endl; 3424 distance = Min(distance, (LC->RADIUS*LC->RADIUS)); 3425 3426 // then check direction to boundary 3427 if (DistanceToCenter.ScalarProduct(&result->NormalVector) > MYEPSILON) { 3428 Log() << Verbose(1) << Point << " is an inner point, " << distance << " below surface." << endl; 3429 return -distance; 3430 } else { 3431 Log() << Verbose(1) << Point << " is NOT an inner point, " << distance << " above surface." << endl; 3432 return +distance; 3433 } 3434 } 3435 }; 3121 3436 3122 3437 /** Gets all points connected to the provided point by triangulation lines. … … 3126 3441 * @return set of the all points linked to the provided one 3127 3442 */ 3128 set<TesselPoint*>* Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const3129 { 3130 Info FunctionInfo(__func__); 3131 set<TesselPoint*> *connectedPoints = new set<TesselPoint*>;3443 TesselPointSet * Tesselation::GetAllConnectedPoints(const TesselPoint* const Point) const 3444 { 3445 Info FunctionInfo(__func__); 3446 TesselPointSet *connectedPoints = new TesselPointSet; 3132 3447 class BoundaryPointSet *ReferencePoint = NULL; 3133 3448 TesselPoint* current; … … 3170 3485 } 3171 3486 3172 if (connectedPoints-> size() == 0) { // if have not found any points3487 if (connectedPoints->empty()) { // if have not found any points 3173 3488 eLog() << Verbose(1) << "We have not found any connected points to " << *Point<< "." << endl; 3174 3489 return NULL; … … 3191 3506 * @return list of the all points linked to the provided one 3192 3507 */ 3193 list<TesselPoint*> * Tesselation::GetCircleOfSetOfPoints(set<TesselPoint*>*SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const3508 TesselPointList * Tesselation::GetCircleOfConnectedTriangles(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const 3194 3509 { 3195 3510 Info FunctionInfo(__func__); 3196 3511 map<double, TesselPoint*> anglesOfPoints; 3197 list<TesselPoint*> *connectedCircle = new list<TesselPoint*>; 3198 Vector center; 3512 TesselPointList *connectedCircle = new TesselPointList; 3199 3513 Vector PlaneNormal; 3200 3514 Vector AngleZero; 3201 3515 Vector OrthogonalVector; 3202 3516 Vector helper; 3517 const TesselPoint * const TrianglePoints[3] = {Point, NULL, NULL}; 3518 TriangleList *triangles = NULL; 3203 3519 3204 3520 if (SetOfNeighbours == NULL) { … … 3209 3525 3210 3526 // calculate central point 3211 for (set<TesselPoint*>::const_iterator TesselRunner = SetOfNeighbours->begin(); TesselRunner != SetOfNeighbours->end(); TesselRunner++)3212 center.AddVector((*TesselRunner)->node);3213 //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size()3214 // << "; scale factor " << 1.0/connectedPoints.size();3215 center.Scale(1.0/SetOfNeighbours->size());3216 Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center<< "." << endl;3217 3218 // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points3219 PlaneNormal. CopyVector(Point->node);3220 PlaneNormal.SubtractVector(¢er);3527 triangles = FindTriangles(TrianglePoints); 3528 if ((triangles != NULL) && (!triangles->empty())) { 3529 for (TriangleList::iterator Runner = triangles->begin(); Runner != triangles->end(); Runner++) 3530 PlaneNormal.AddVector(&(*Runner)->NormalVector); 3531 } else { 3532 eLog() << Verbose(0) << "Could not find any triangles for point " << *Point << "." << endl; 3533 performCriticalExit(); 3534 } 3535 PlaneNormal.Scale(1.0/triangles->size()); 3536 Log() << Verbose(1) << "INFO: Calculated PlaneNormal of all circle points is " << PlaneNormal << "." << endl; 3221 3537 PlaneNormal.Normalize(); 3222 Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl;3223 3538 3224 3539 // construct one orthogonal vector … … 3246 3561 3247 3562 // go through all connected points and calculate angle 3248 for ( set<TesselPoint*>::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) {3563 for (TesselPointSet::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) { 3249 3564 helper.CopyVector((*listRunner)->node); 3250 3565 helper.SubtractVector(Point->node); … … 3262 3577 } 3263 3578 3579 /** Gets all points connected to the provided point by triangulation lines, ordered such that we have the circle round the point. 3580 * Maps them down onto the plane designated by the axis \a *Point and \a *Reference. The center of all points 3581 * connected in the tesselation to \a *Point is mapped to spherical coordinates with the zero angle being given 3582 * by the mapped down \a *Reference. Hence, the biggest and the smallest angles are those of the two shanks of the 3583 * triangle we are looking for. 3584 * 3585 * @param *SetOfNeighbours all points for which the angle should be calculated 3586 * @param *Point of which get all connected points 3587 * @param *Reference Reference vector for zero angle or NULL for no preference 3588 * @return list of the all points linked to the provided one 3589 */ 3590 TesselPointList * Tesselation::GetCircleOfSetOfPoints(TesselPointSet *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const 3591 { 3592 Info FunctionInfo(__func__); 3593 map<double, TesselPoint*> anglesOfPoints; 3594 TesselPointList *connectedCircle = new TesselPointList; 3595 Vector center; 3596 Vector PlaneNormal; 3597 Vector AngleZero; 3598 Vector OrthogonalVector; 3599 Vector helper; 3600 3601 if (SetOfNeighbours == NULL) { 3602 eLog() << Verbose(2) << "Could not find any connected points!" << endl; 3603 delete(connectedCircle); 3604 return NULL; 3605 } 3606 3607 // check whether there's something to do 3608 if (SetOfNeighbours->size() < 3) { 3609 for (TesselPointSet::iterator TesselRunner = SetOfNeighbours->begin(); TesselRunner != SetOfNeighbours->end(); TesselRunner++) 3610 connectedCircle->push_back(*TesselRunner); 3611 return connectedCircle; 3612 } 3613 3614 Log() << Verbose(1) << "INFO: Point is " << *Point << " and Reference is " << *Reference << "." << endl; 3615 // calculate central point 3616 3617 TesselPointSet::const_iterator TesselA = SetOfNeighbours->begin(); 3618 TesselPointSet::const_iterator TesselB = SetOfNeighbours->begin(); 3619 TesselPointSet::const_iterator TesselC = SetOfNeighbours->begin(); 3620 TesselB++; 3621 TesselC++; 3622 TesselC++; 3623 int counter = 0; 3624 while (TesselC != SetOfNeighbours->end()) { 3625 helper.MakeNormalVector((*TesselA)->node, (*TesselB)->node, (*TesselC)->node); 3626 Log() << Verbose(0) << "Making normal vector out of " << *(*TesselA) << ", " << *(*TesselB) << " and " << *(*TesselC) << ":" << helper << endl; 3627 counter++; 3628 TesselA++; 3629 TesselB++; 3630 TesselC++; 3631 PlaneNormal.AddVector(&helper); 3632 } 3633 //Log() << Verbose(0) << "Summed vectors " << center << "; number of points " << connectedPoints.size() 3634 // << "; scale factor " << counter; 3635 PlaneNormal.Scale(1.0/(double)counter); 3636 // Log() << Verbose(1) << "INFO: Calculated center of all circle points is " << center << "." << endl; 3637 // 3638 // // projection plane of the circle is at the closes Point and normal is pointing away from center of all circle points 3639 // PlaneNormal.CopyVector(Point->node); 3640 // PlaneNormal.SubtractVector(¢er); 3641 // PlaneNormal.Normalize(); 3642 Log() << Verbose(1) << "INFO: Calculated plane normal of circle is " << PlaneNormal << "." << endl; 3643 3644 // construct one orthogonal vector 3645 if (Reference != NULL) { 3646 AngleZero.CopyVector(Reference); 3647 AngleZero.SubtractVector(Point->node); 3648 AngleZero.ProjectOntoPlane(&PlaneNormal); 3649 } 3650 if ((Reference == NULL) || (AngleZero.NormSquared() < MYEPSILON )) { 3651 Log() << Verbose(1) << "Using alternatively " << *(*SetOfNeighbours->begin())->node << " as angle 0 referencer." << endl; 3652 AngleZero.CopyVector((*SetOfNeighbours->begin())->node); 3653 AngleZero.SubtractVector(Point->node); 3654 AngleZero.ProjectOntoPlane(&PlaneNormal); 3655 if (AngleZero.NormSquared() < MYEPSILON) { 3656 eLog() << Verbose(0) << "CRITIAL: AngleZero is 0 even with alternative reference. The algorithm has to be changed here!" << endl; 3657 performCriticalExit(); 3658 } 3659 } 3660 Log() << Verbose(1) << "INFO: Reference vector on this plane representing angle 0 is " << AngleZero << "." << endl; 3661 if (AngleZero.NormSquared() > MYEPSILON) 3662 OrthogonalVector.MakeNormalVector(&PlaneNormal, &AngleZero); 3663 else 3664 OrthogonalVector.MakeNormalVector(&PlaneNormal); 3665 Log() << Verbose(1) << "INFO: OrthogonalVector on plane is " << OrthogonalVector << "." << endl; 3666 3667 // go through all connected points and calculate angle 3668 pair <map<double, TesselPoint*>::iterator, bool > InserterTest; 3669 for (TesselPointSet::iterator listRunner = SetOfNeighbours->begin(); listRunner != SetOfNeighbours->end(); listRunner++) { 3670 helper.CopyVector((*listRunner)->node); 3671 helper.SubtractVector(Point->node); 3672 helper.ProjectOntoPlane(&PlaneNormal); 3673 double angle = GetAngle(helper, AngleZero, OrthogonalVector); 3674 if (angle > M_PI) // the correction is of no use here (and not desired) 3675 angle = 2.*M_PI - angle; 3676 Log() << Verbose(0) << "INFO: Calculated angle between " << helper << " and " << AngleZero << " is " << angle << " for point " << **listRunner << "." << endl; 3677 InserterTest = anglesOfPoints.insert(pair<double, TesselPoint*>(angle, (*listRunner))); 3678 if (!InserterTest.second) { 3679 eLog() << Verbose(0) << "GetCircleOfSetOfPoints() got two atoms with same angle: " << *((InserterTest.first)->second) << " and " << (*listRunner) << endl; 3680 performCriticalExit(); 3681 } 3682 } 3683 3684 for(map<double, TesselPoint*>::iterator AngleRunner = anglesOfPoints.begin(); AngleRunner != anglesOfPoints.end(); AngleRunner++) { 3685 connectedCircle->push_back(AngleRunner->second); 3686 } 3687 3688 return connectedCircle; 3689 } 3690 3264 3691 /** Gets all points connected to the provided point by triangulation lines, ordered such that we walk along a closed path. 3265 3692 * … … 3268 3695 * @return list of the all points linked to the provided one 3269 3696 */ 3270 list< list<TesselPoint*>*> * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const3697 list< TesselPointList *> * Tesselation::GetPathsOfConnectedPoints(const TesselPoint* const Point) const 3271 3698 { 3272 3699 Info FunctionInfo(__func__); 3273 3700 map<double, TesselPoint*> anglesOfPoints; 3274 list< list<TesselPoint*> *> *ListOfPaths = new list<list<TesselPoint*>*>;3275 list<TesselPoint*>*connectedPath = NULL;3701 list< TesselPointList *> *ListOfPaths = new list< TesselPointList *>; 3702 TesselPointList *connectedPath = NULL; 3276 3703 Vector center; 3277 3704 Vector PlaneNormal; … … 3310 3737 } else if (!LineRunner->second) { 3311 3738 LineRunner->second = true; 3312 connectedPath = new list<TesselPoint*>;3739 connectedPath = new TesselPointList; 3313 3740 triangle = NULL; 3314 3741 CurrentLine = runner->second; … … 3384 3811 * @return list of the closed paths 3385 3812 */ 3386 list< list<TesselPoint*>*> * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const3387 { 3388 Info FunctionInfo(__func__); 3389 list< list<TesselPoint*>*> *ListofPaths = GetPathsOfConnectedPoints(Point);3390 list< list<TesselPoint*> *> *ListofClosedPaths = new list<list<TesselPoint*>*>;3391 list<TesselPoint*>*connectedPath = NULL;3392 list<TesselPoint*>*newPath = NULL;3813 list<TesselPointList *> * Tesselation::GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const 3814 { 3815 Info FunctionInfo(__func__); 3816 list<TesselPointList *> *ListofPaths = GetPathsOfConnectedPoints(Point); 3817 list<TesselPointList *> *ListofClosedPaths = new list<TesselPointList *>; 3818 TesselPointList *connectedPath = NULL; 3819 TesselPointList *newPath = NULL; 3393 3820 int count = 0; 3394 3821 3395 3822 3396 list<TesselPoint*>::iterator CircleRunner;3397 list<TesselPoint*>::iterator CircleStart;3398 3399 for(list< list<TesselPoint*>*>::iterator ListRunner = ListofPaths->begin(); ListRunner != ListofPaths->end(); ListRunner++) {3823 TesselPointList::iterator CircleRunner; 3824 TesselPointList::iterator CircleStart; 3825 3826 for(list<TesselPointList *>::iterator ListRunner = ListofPaths->begin(); ListRunner != ListofPaths->end(); ListRunner++) { 3400 3827 connectedPath = *ListRunner; 3401 3828 … … 3406 3833 3407 3834 // go through list, look for reappearance of starting Point and create list 3408 list<TesselPoint*>::iterator Marker = CircleStart;3835 TesselPointList::iterator Marker = CircleStart; 3409 3836 for (CircleRunner = CircleStart; CircleRunner != connectedPath->end(); CircleRunner++) { 3410 3837 if ((*CircleRunner == *CircleStart) && (CircleRunner != CircleStart)) { // is not the very first point 3411 3838 // we have a closed circle from Marker to new Marker 3412 3839 Log() << Verbose(1) << count+1 << ". closed path consists of: "; 3413 newPath = new list<TesselPoint*>;3414 list<TesselPoint*>::iterator CircleSprinter = Marker;3840 newPath = new TesselPointList; 3841 TesselPointList::iterator CircleSprinter = Marker; 3415 3842 for (; CircleSprinter != CircleRunner; CircleSprinter++) { 3416 3843 newPath->push_back(*CircleSprinter); … … 3446 3873 * \return pointer to allocated list of triangles 3447 3874 */ 3448 set<BoundaryTriangleSet*>*Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const3449 { 3450 Info FunctionInfo(__func__); 3451 set<BoundaryTriangleSet*> *connectedTriangles = new set<BoundaryTriangleSet*>;3875 TriangleSet *Tesselation::GetAllTriangles(const BoundaryPointSet * const Point) const 3876 { 3877 Info FunctionInfo(__func__); 3878 TriangleSet *connectedTriangles = new TriangleSet; 3452 3879 3453 3880 if (Point == NULL) { … … 3498 3925 } 3499 3926 3500 list< list<TesselPoint*>*> *ListOfClosedPaths = GetClosedPathsOfConnectedPoints(point->node);3501 list<TesselPoint*>*connectedPath = NULL;3927 list<TesselPointList *> *ListOfClosedPaths = GetClosedPathsOfConnectedPoints(point->node); 3928 TesselPointList *connectedPath = NULL; 3502 3929 3503 3930 // gather all triangles 3504 3931 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) 3505 3932 count+=LineRunner->second->triangles.size(); 3506 map<class BoundaryTriangleSet *, int>Candidates;3933 TriangleMap Candidates; 3507 3934 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) { 3508 3935 line = LineRunner->second; 3509 3936 for (TriangleMap::iterator TriangleRunner = line->triangles.begin(); TriangleRunner != line->triangles.end(); TriangleRunner++) { 3510 3937 triangle = TriangleRunner->second; 3511 Candidates.insert( pair<class BoundaryTriangleSet *, int> (triangle, triangle->Nr) );3938 Candidates.insert( TrianglePair (triangle->Nr, triangle) ); 3512 3939 } 3513 3940 } … … 3516 3943 count=0; 3517 3944 NormalVector.Zero(); 3518 for ( map<class BoundaryTriangleSet *, int>::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) {3519 Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner-> first) << "." << endl;3520 NormalVector.SubtractVector(&Runner-> first->NormalVector); // has to point inward3521 RemoveTesselationTriangle(Runner-> first);3945 for (TriangleMap::iterator Runner = Candidates.begin(); Runner != Candidates.end(); Runner++) { 3946 Log() << Verbose(1) << "INFO: Removing triangle " << *(Runner->second) << "." << endl; 3947 NormalVector.SubtractVector(&Runner->second->NormalVector); // has to point inward 3948 RemoveTesselationTriangle(Runner->second); 3522 3949 count++; 3523 3950 } 3524 3951 Log() << Verbose(1) << count << " triangles were removed." << endl; 3525 3952 3526 list< list<TesselPoint*>*>::iterator ListAdvance = ListOfClosedPaths->begin();3527 list< list<TesselPoint*>*>::iterator ListRunner = ListAdvance;3528 map<class BoundaryTriangleSet *, int>::iterator NumberRunner = Candidates.begin();3529 list<TesselPoint*>::iterator StartNode, MiddleNode, EndNode;3953 list<TesselPointList *>::iterator ListAdvance = ListOfClosedPaths->begin(); 3954 list<TesselPointList *>::iterator ListRunner = ListAdvance; 3955 TriangleMap::iterator NumberRunner = Candidates.begin(); 3956 TesselPointList::iterator StartNode, MiddleNode, EndNode; 3530 3957 double angle; 3531 3958 double smallestangle; … … 3541 3968 3542 3969 // re-create all triangles by going through connected points list 3543 list<class BoundaryLineSet *>NewLines;3970 LineList NewLines; 3544 3971 for (;!connectedPath->empty();) { 3545 3972 // search middle node with widest angle to next neighbours … … 3647 4074 // maximize the inner lines (we preferentially created lines with a huge angle, which is for the tesselation not wanted though useful for the closing) 3648 4075 if (NewLines.size() > 1) { 3649 list<class BoundaryLineSet *>::iterator Candidate;4076 LineList::iterator Candidate; 3650 4077 class BoundaryLineSet *OtherBase = NULL; 3651 4078 double tmp, maxgain; 3652 4079 do { 3653 4080 maxgain = 0; 3654 for( list<class BoundaryLineSet *>::iterator Runner = NewLines.begin(); Runner != NewLines.end(); Runner++) {4081 for(LineList::iterator Runner = NewLines.begin(); Runner != NewLines.end(); Runner++) { 3655 4082 tmp = PickFarthestofTwoBaselines(*Runner); 3656 4083 if (maxgain < tmp) { … … 3694 4121 * Finds triangles belonging to the three provided points. 3695 4122 * 3696 * @param *Points[3] list, is expected to contain three points 4123 * @param *Points[3] list, is expected to contain three points (NULL means wildcard) 3697 4124 * 3698 4125 * @return triangles which belong to the provided points, will be empty if there are none, 3699 4126 * will usually be one, in case of degeneration, there will be two 3700 4127 */ 3701 list<BoundaryTriangleSet*>*Tesselation::FindTriangles(const TesselPoint* const Points[3]) const3702 { 3703 Info FunctionInfo(__func__); 3704 list<BoundaryTriangleSet*> *result = new list<BoundaryTriangleSet*>;4128 TriangleList *Tesselation::FindTriangles(const TesselPoint* const Points[3]) const 4129 { 4130 Info FunctionInfo(__func__); 4131 TriangleList *result = new TriangleList; 3705 4132 LineMap::const_iterator FindLine; 3706 4133 TriangleMap::const_iterator FindTriangle; 3707 4134 class BoundaryPointSet *TrianglePoints[3]; 4135 size_t NoOfWildcards = 0; 3708 4136 3709 4137 for (int i = 0; i < 3; i++) { 3710 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Points[i]->nr);3711 if (FindPoint != PointsOnBoundary.end()) {3712 TrianglePoints[i] = FindPoint->second;4138 if (Points[i] == NULL) { 4139 NoOfWildcards++; 4140 TrianglePoints[i] = NULL; 3713 4141 } else { 3714 TrianglePoints[i] = NULL; 3715 } 3716 } 3717 3718 // checks lines between the points in the Points for their adjacent triangles 3719 for (int i = 0; i < 3; i++) { 3720 if (TrianglePoints[i] != NULL) { 3721 for (int j = i+1; j < 3; j++) { 3722 if (TrianglePoints[j] != NULL) { 3723 for (FindLine = TrianglePoints[i]->lines.find(TrianglePoints[j]->node->nr); // is a multimap! 3724 (FindLine != TrianglePoints[i]->lines.end()) && (FindLine->first == TrianglePoints[j]->node->nr); 3725 FindLine++) { 3726 for (FindTriangle = FindLine->second->triangles.begin(); 3727 FindTriangle != FindLine->second->triangles.end(); 3728 FindTriangle++) { 3729 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 3730 result->push_back(FindTriangle->second); 4142 PointMap::const_iterator FindPoint = PointsOnBoundary.find(Points[i]->nr); 4143 if (FindPoint != PointsOnBoundary.end()) { 4144 TrianglePoints[i] = FindPoint->second; 4145 } else { 4146 TrianglePoints[i] = NULL; 4147 } 4148 } 4149 } 4150 4151 switch (NoOfWildcards) { 4152 case 0: // checks lines between the points in the Points for their adjacent triangles 4153 for (int i = 0; i < 3; i++) { 4154 if (TrianglePoints[i] != NULL) { 4155 for (int j = i+1; j < 3; j++) { 4156 if (TrianglePoints[j] != NULL) { 4157 for (FindLine = TrianglePoints[i]->lines.find(TrianglePoints[j]->node->nr); // is a multimap! 4158 (FindLine != TrianglePoints[i]->lines.end()) && (FindLine->first == TrianglePoints[j]->node->nr); 4159 FindLine++) { 4160 for (FindTriangle = FindLine->second->triangles.begin(); 4161 FindTriangle != FindLine->second->triangles.end(); 4162 FindTriangle++) { 4163 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 4164 result->push_back(FindTriangle->second); 4165 } 4166 } 3731 4167 } 4168 // Is it sufficient to consider one of the triangle lines for this. 4169 return result; 3732 4170 } 3733 4171 } 3734 // Is it sufficient to consider one of the triangle lines for this.3735 return result;3736 4172 } 3737 4173 } 3738 } 4174 break; 4175 case 1: // copy all triangles of the respective line 4176 { 4177 int i=0; 4178 for (; i < 3; i++) 4179 if (TrianglePoints[i] == NULL) 4180 break; 4181 for (FindLine = TrianglePoints[(i+1)%3]->lines.find(TrianglePoints[(i+2)%3]->node->nr); // is a multimap! 4182 (FindLine != TrianglePoints[(i+1)%3]->lines.end()) && (FindLine->first == TrianglePoints[(i+2)%3]->node->nr); 4183 FindLine++) { 4184 for (FindTriangle = FindLine->second->triangles.begin(); 4185 FindTriangle != FindLine->second->triangles.end(); 4186 FindTriangle++) { 4187 if (FindTriangle->second->IsPresentTupel(TrianglePoints)) { 4188 result->push_back(FindTriangle->second); 4189 } 4190 } 4191 } 4192 break; 4193 } 4194 case 2: // copy all triangles of the respective point 4195 { 4196 int i=0; 4197 for (; i < 3; i++) 4198 if (TrianglePoints[i] != NULL) 4199 break; 4200 for (LineMap::const_iterator line = TrianglePoints[i]->lines.begin(); line != TrianglePoints[i]->lines.end(); line++) 4201 for (TriangleMap::const_iterator triangle = line->second->triangles.begin(); triangle != line->second->triangles.end(); triangle++) 4202 result->push_back(triangle->second); 4203 result->sort(); 4204 result->unique(); 4205 break; 4206 } 4207 case 3: // copy all triangles 4208 { 4209 for (TriangleMap::const_iterator triangle = TrianglesOnBoundary.begin(); triangle != TrianglesOnBoundary.end(); triangle++) 4210 result->push_back(triangle->second); 4211 break; 4212 } 4213 default: 4214 eLog() << Verbose(0) << "Number of wildcards is greater than 3, cannot happen!" << endl; 4215 performCriticalExit(); 4216 break; 3739 4217 } 3740 4218 … … 3779 4257 * in the list, once as key and once as value 3780 4258 */ 3781 map<int, int>* Tesselation::FindAllDegeneratedLines()4259 IndexToIndex * Tesselation::FindAllDegeneratedLines() 3782 4260 { 3783 4261 Info FunctionInfo(__func__); 3784 4262 UniqueLines AllLines; 3785 map<int, int> * DegeneratedLines = new map<int, int>;4263 IndexToIndex * DegeneratedLines = new IndexToIndex; 3786 4264 3787 4265 // sanity check … … 3804 4282 3805 4283 Log() << Verbose(0) << "FindAllDegeneratedLines() found " << DegeneratedLines->size() << " lines." << endl; 3806 map<int,int>::iterator it;4284 IndexToIndex::iterator it; 3807 4285 for (it = DegeneratedLines->begin(); it != DegeneratedLines->end(); it++) { 3808 4286 const LineMap::const_iterator Line1 = LinesOnBoundary.find((*it).first); … … 3823 4301 * in the list, once as key and once as value 3824 4302 */ 3825 map<int, int>* Tesselation::FindAllDegeneratedTriangles()3826 { 3827 Info FunctionInfo(__func__); 3828 map<int, int>* DegeneratedLines = FindAllDegeneratedLines();3829 map<int, int> * DegeneratedTriangles = new map<int, int>;4303 IndexToIndex * Tesselation::FindAllDegeneratedTriangles() 4304 { 4305 Info FunctionInfo(__func__); 4306 IndexToIndex * DegeneratedLines = FindAllDegeneratedLines(); 4307 IndexToIndex * DegeneratedTriangles = new IndexToIndex; 3830 4308 3831 4309 TriangleMap::iterator TriangleRunner1, TriangleRunner2; … … 3833 4311 class BoundaryLineSet *line1 = NULL, *line2 = NULL; 3834 4312 3835 for ( map<int, int>::iterator LineRunner = DegeneratedLines->begin(); LineRunner != DegeneratedLines->end(); ++LineRunner) {4313 for (IndexToIndex::iterator LineRunner = DegeneratedLines->begin(); LineRunner != DegeneratedLines->end(); ++LineRunner) { 3836 4314 // run over both lines' triangles 3837 4315 Liner = LinesOnBoundary.find(LineRunner->first); … … 3854 4332 3855 4333 Log() << Verbose(0) << "FindAllDegeneratedTriangles() found " << DegeneratedTriangles->size() << " triangles:" << endl; 3856 map<int,int>::iterator it;4334 IndexToIndex::iterator it; 3857 4335 for (it = DegeneratedTriangles->begin(); it != DegeneratedTriangles->end(); it++) 3858 4336 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; … … 3868 4346 { 3869 4347 Info FunctionInfo(__func__); 3870 map<int, int>* DegeneratedTriangles = FindAllDegeneratedTriangles();4348 IndexToIndex * DegeneratedTriangles = FindAllDegeneratedTriangles(); 3871 4349 TriangleMap::iterator finder; 3872 4350 BoundaryTriangleSet *triangle = NULL, *partnerTriangle = NULL; 3873 4351 int count = 0; 3874 4352 3875 for ( map<int, int>::iterator TriangleKeyRunner = DegeneratedTriangles->begin();4353 for (IndexToIndex::iterator TriangleKeyRunner = DegeneratedTriangles->begin(); 3876 4354 TriangleKeyRunner != DegeneratedTriangles->end(); ++TriangleKeyRunner 3877 4355 ) { … … 3961 4439 // find nearest boundary point 3962 4440 class TesselPoint *BackupPoint = NULL; 3963 class TesselPoint *NearestPoint = FindClosest Point(point->node, BackupPoint, LC);4441 class TesselPoint *NearestPoint = FindClosestTesselPoint(point->node, BackupPoint, LC); 3964 4442 class BoundaryPointSet *NearestBoundaryPoint = NULL; 3965 4443 PointMap::iterator PointRunner; … … 4128 4606 4129 4607 /// 2. Go through all BoundaryPointSet's, check their triangles' NormalVector 4608 IndexToIndex *DegeneratedTriangles = FindAllDegeneratedTriangles(); 4130 4609 set < BoundaryPointSet *> EndpointCandidateList; 4131 4610 pair < set < BoundaryPointSet *>::iterator, bool > InsertionTester; … … 4138 4617 for (LineMap::const_iterator LineRunner = (Runner->second)->lines.begin(); LineRunner != (Runner->second)->lines.end(); LineRunner++) 4139 4618 for (TriangleMap::const_iterator TriangleRunner = (LineRunner->second)->triangles.begin(); TriangleRunner != (LineRunner->second)->triangles.end(); TriangleRunner++) { 4140 TriangleInsertionTester = TriangleVectors.insert( pair< int, Vector *> ((TriangleRunner->second)->Nr, &((TriangleRunner->second)->NormalVector)) ); 4141 if (TriangleInsertionTester.second) 4142 Log() << Verbose(1) << " Adding triangle " << *(TriangleRunner->second) << " to triangles to check-list." << endl; 4619 if (DegeneratedTriangles->find(TriangleRunner->second->Nr) == DegeneratedTriangles->end()) { 4620 TriangleInsertionTester = TriangleVectors.insert( pair< int, Vector *> ((TriangleRunner->second)->Nr, &((TriangleRunner->second)->NormalVector)) ); 4621 if (TriangleInsertionTester.second) 4622 Log() << Verbose(1) << " Adding triangle " << *(TriangleRunner->second) << " to triangles to check-list." << endl; 4623 } else { 4624 Log() << Verbose(1) << " NOT adding triangle " << *(TriangleRunner->second) << " as it's a simply degenerated one." << endl; 4625 } 4143 4626 } 4144 4627 // check whether there are two that are parallel … … 4213 4696 /// 4a. Gather all triangles of this polygon 4214 4697 TriangleSet *T = (*PolygonRunner)->GetAllContainedTrianglesFromEndpoints(); 4698 4699 // check whether number is bigger than 2, otherwise it's just a simply degenerated one and nothing to do. 4700 if (T->size() == 2) { 4701 Log() << Verbose(1) << " Skipping degenerated polygon, is just a (already simply degenerated) triangle." << endl; 4702 delete(T); 4703 continue; 4704 } 4705 4706 // check whether number is even 4707 // If this case occurs, we have to think about it! 4708 // The Problem is probably due to two degenerated polygons being connected by a bridging, non-degenerated polygon, as somehow one node has 4709 // connections to either polygon ... 4710 if (T->size() % 2 != 0) { 4711 eLog() << Verbose(0) << " degenerated polygon contains an odd number of triangles, probably contains bridging non-degenerated ones, too!" << endl; 4712 performCriticalExit(); 4713 } 4215 4714 4216 4715 TriangleSet::iterator TriangleWalker = T->begin(); // is the inner iterator … … 4259 4758 } 4260 4759 4261 map<int, int>* SimplyDegeneratedTriangles = FindAllDegeneratedTriangles();4760 IndexToIndex * SimplyDegeneratedTriangles = FindAllDegeneratedTriangles(); 4262 4761 Log() << Verbose(0) << "Final list of simply degenerated triangles found, containing " << SimplyDegeneratedTriangles->size() << " triangles:" << endl; 4263 map<int,int>::iterator it;4762 IndexToIndex::iterator it; 4264 4763 for (it = SimplyDegeneratedTriangles->begin(); it != SimplyDegeneratedTriangles->end(); it++) 4265 4764 Log() << Verbose(0) << (*it).first << " => " << (*it).second << endl; -
molecuilder/src/tesselation.hpp
r0af58f r551a58 52 52 // ======================================================= some template functions ========================================= 53 53 54 #define IndexToIndex map <int, int> 55 54 56 #define PointMap map < int, class BoundaryPointSet * > 55 57 #define PointSet set < class BoundaryPointSet * > … … 76 78 #define PolygonSet set < class BoundaryPolygonSet * > 77 79 #define PolygonList list < class BoundaryPolygonSet * > 80 81 #define DistanceToPointMap multimap <double, class BoundaryPointSet * > 82 #define DistanceToPointPair pair <double, class BoundaryPointSet * > 78 83 79 84 #define DistanceMultiMap multimap <double, pair < PointMap::iterator, PointMap::iterator> > … … 101 106 public: 102 107 BoundaryPointSet(); 103 BoundaryPointSet(TesselPoint * Walker);108 BoundaryPointSet(TesselPoint * const Walker); 104 109 ~BoundaryPointSet(); 105 110 106 void AddLine( class BoundaryLineSet *line);111 void AddLine(BoundaryLineSet * const line); 107 112 108 113 LineMap lines; … … 120 125 public: 121 126 BoundaryLineSet(); 122 BoundaryLineSet(class BoundaryPointSet *Point[2], const int number); 127 BoundaryLineSet(BoundaryPointSet * const Point[2], const int number); 128 BoundaryLineSet(BoundaryPointSet * const Point1, BoundaryPointSet * const Point2, const int number); 123 129 ~BoundaryLineSet(); 124 130 125 void AddTriangle( class BoundaryTriangleSet *triangle);126 bool IsConnectedTo(c lass BoundaryLineSet *line);127 bool ContainsBoundaryPoint(c lass BoundaryPointSet *point);128 bool CheckConvexityCriterion() ;129 class BoundaryPointSet *GetOtherEndpoint(c lass BoundaryPointSet *);131 void AddTriangle(BoundaryTriangleSet * const triangle); 132 bool IsConnectedTo(const BoundaryLineSet * const line) const; 133 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 134 bool CheckConvexityCriterion() const; 135 class BoundaryPointSet *GetOtherEndpoint(const BoundaryPointSet * const point) const; 130 136 131 137 class BoundaryPointSet *endpoints[2]; … … 142 148 public: 143 149 BoundaryTriangleSet(); 144 BoundaryTriangleSet(class BoundaryLineSet * line[3],int number);150 BoundaryTriangleSet(class BoundaryLineSet * const line[3], const int number); 145 151 ~BoundaryTriangleSet(); 146 152 147 void GetNormalVector(Vector &NormalVector); 148 void GetCenter(Vector *center); 149 bool GetIntersectionInsideTriangle(Vector *MolCenter, Vector *x, Vector *Intersection); 150 bool ContainsBoundaryLine(class BoundaryLineSet *line); 151 bool ContainsBoundaryPoint(class BoundaryPointSet *point); 152 bool ContainsBoundaryPoint(class TesselPoint *point); 153 class BoundaryPointSet *GetThirdEndpoint(class BoundaryLineSet *line); 154 bool IsPresentTupel(class BoundaryPointSet *Points[3]); 155 bool IsPresentTupel(class BoundaryTriangleSet *T); 153 void GetNormalVector(const Vector &NormalVector); 154 void GetCenter(Vector * const center) const; 155 bool GetIntersectionInsideTriangle(const Vector * const MolCenter, const Vector * const x, Vector * const Intersection) const; 156 double GetClosestPointInsideTriangle(const Vector * const x, Vector * const ClosestPoint) const; 157 bool ContainsBoundaryLine(const BoundaryLineSet * const line) const; 158 bool ContainsBoundaryPoint(const BoundaryPointSet * const point) const; 159 bool ContainsBoundaryPoint(const TesselPoint * const point) const; 160 class BoundaryPointSet *GetThirdEndpoint(const BoundaryLineSet * const line) const; 161 bool IsPresentTupel(const BoundaryPointSet * const Points[3]) const; 162 bool IsPresentTupel(const BoundaryTriangleSet * const T) const; 156 163 157 164 class BoundaryPointSet *endpoints[3]; 158 165 class BoundaryLineSet *lines[3]; 159 166 Vector NormalVector; 167 Vector SphereCenter; 160 168 int Nr; 161 169 }; … … 225 233 virtual TesselPoint *GetPoint() const { return NULL; }; 226 234 virtual TesselPoint *GetTerminalPoint() const { return NULL; }; 235 virtual int GetMaxId() const { return 0; }; 227 236 virtual void GoToNext() const {}; 228 237 virtual void GoToPrevious() const {}; … … 300 309 list<list<TesselPoint*> *> * GetClosedPathsOfConnectedPoints(const TesselPoint* const Point) const; 301 310 list<TesselPoint*> * GetCircleOfSetOfPoints(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference = NULL) const; 311 list<TesselPoint*> * GetCircleOfConnectedTriangles(set<TesselPoint*> *SetOfNeighbours, const TesselPoint* const Point, const Vector * const Reference) const; 302 312 class BoundaryPointSet *GetCommonEndpoint(const BoundaryLineSet * line1, const BoundaryLineSet * line2) const; 303 313 list<BoundaryTriangleSet*> *FindTriangles(const TesselPoint* const Points[3]) const; … … 305 315 class BoundaryTriangleSet * FindClosestTriangleToPoint(const Vector *x, const LinkedCell* LC) const; 306 316 bool IsInnerPoint(const Vector &Point, const LinkedCell* const LC) const; 307 bool IsInnerPoint(const TesselPoint * constPoint, const LinkedCell* const LC) const;317 double GetDistanceSquaredToSurface(const Vector &Point, const LinkedCell* const LC) const; 308 318 bool AddBoundaryPoint(TesselPoint * Walker, const int n); 319 DistanceToPointMap * FindClosestBoundaryPointsToVector(const Vector *x, const LinkedCell* LC) const; 320 BoundaryLineSet * FindClosestBoundaryLineToVector(const Vector *x, const LinkedCell* LC) const; 321 TriangleList * FindClosestTrianglesToVector(const Vector *x, const LinkedCell* LC) const; 322 BoundaryTriangleSet* FindClosestTriangleToVector(const Vector *x, const LinkedCell* LC) const; 309 323 310 324 // print for debugging -
molecuilder/src/tesselationhelpers.cpp
r0af58f r551a58 143 143 if (fabs(HalfplaneIndicator) < MYEPSILON) 144 144 { 145 if ((TempNormal.ScalarProduct(AlternativeDirection) <0 and AlternativeIndicator >0) or (TempNormal.ScalarProduct(AlternativeDirection) >0 andAlternativeIndicator <0))145 if ((TempNormal.ScalarProduct(AlternativeDirection) <0 && AlternativeIndicator >0) || (TempNormal.ScalarProduct(AlternativeDirection) >0 && AlternativeIndicator <0)) 146 146 { 147 147 TempNormal.Scale(-1); … … 150 150 else 151 151 { 152 if ( TempNormal.ScalarProduct(Direction)<0 && HalfplaneIndicator >0 || TempNormal.ScalarProduct(Direction)>0 && HalfplaneIndicator<0)152 if (((TempNormal.ScalarProduct(Direction)<0) && (HalfplaneIndicator >0)) || ((TempNormal.ScalarProduct(Direction)>0) && (HalfplaneIndicator<0))) 153 153 { 154 154 TempNormal.Scale(-1); … … 226 226 Vector helper; 227 227 double radius, alpha; 228 229 helper.CopyVector(&NewSphereCenter); 228 Vector RelativeOldSphereCenter; 229 Vector RelativeNewSphereCenter; 230 231 RelativeOldSphereCenter.CopyVector(&OldSphereCenter); 232 RelativeOldSphereCenter.SubtractVector(&CircleCenter); 233 RelativeNewSphereCenter.CopyVector(&NewSphereCenter); 234 RelativeNewSphereCenter.SubtractVector(&CircleCenter); 235 helper.CopyVector(&RelativeNewSphereCenter); 230 236 // test whether new center is on the parameter circle's plane 231 237 if (fabs(helper.ScalarProduct(&CirclePlaneNormal)) > HULLEPSILON) { … … 233 239 helper.ProjectOntoPlane(&CirclePlaneNormal); 234 240 } 235 radius = helper. ScalarProduct(&helper);241 radius = helper.NormSquared(); 236 242 // test whether the new center vector has length of CircleRadius 237 243 if (fabs(radius - CircleRadius) > HULLEPSILON) 238 244 eLog() << Verbose(1) << "The projected center of the new sphere has radius " << radius << " instead of " << CircleRadius << "." << endl; 239 alpha = helper.Angle(& OldSphereCenter);245 alpha = helper.Angle(&RelativeOldSphereCenter); 240 246 // make the angle unique by checking the halfplanes/search direction 241 247 if (helper.ScalarProduct(&SearchDirection) < -HULLEPSILON) // acos is not unique on [0, 2.*M_PI), hence extra check to decide between two half intervals 242 248 alpha = 2.*M_PI - alpha; 243 //Log() << Verbose(1) << "INFO: RelativeNewSphereCenter is " << helper << ", RelativeOldSphereCenter is " <<OldSphereCenter << " and resulting angle is " << alpha << "." << endl;244 radius = helper.Distance(& OldSphereCenter);249 Log() << Verbose(1) << "INFO: RelativeNewSphereCenter is " << helper << ", RelativeOldSphereCenter is " << RelativeOldSphereCenter << " and resulting angle is " << alpha << "." << endl; 250 radius = helper.Distance(&RelativeOldSphereCenter); 245 251 helper.ProjectOntoPlane(&NormalVector); 246 252 // check whether new center is somewhat away or at least right over the current baseline to prevent intersecting triangles 247 253 if ((radius > HULLEPSILON) || (helper.Norm() < HULLEPSILON)) { 248 //Log() << Verbose(1) << "INFO: Distance between old and new center is " << radius << " and between new center and baseline center is " << helper.Norm() << "." << endl;254 Log() << Verbose(1) << "INFO: Distance between old and new center is " << radius << " and between new center and baseline center is " << helper.Norm() << "." << endl; 249 255 return alpha; 250 256 } else { 251 //Log() << Verbose(1) << "INFO: NewSphereCenter " << helper << " is too close to OldSphereCenter" <<OldSphereCenter << "." << endl;257 Log() << Verbose(1) << "INFO: NewSphereCenter " << RelativeNewSphereCenter << " is too close to RelativeOldSphereCenter" << RelativeOldSphereCenter << "." << endl; 252 258 return 2.*M_PI; 253 259 } … … 552 558 * @return point which is second closest to the provided one 553 559 */ 554 TesselPoint* FindSecondClosest Point(const Vector* Point, const LinkedCell* const LC)560 TesselPoint* FindSecondClosestTesselPoint(const Vector* Point, const LinkedCell* const LC) 555 561 { 556 562 Info FunctionInfo(__func__); … … 607 613 * @return point which is closest to the provided one, NULL if none found 608 614 */ 609 TesselPoint* FindClosest Point(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC)615 TesselPoint* FindClosestTesselPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC) 610 616 { 611 617 Info FunctionInfo(__func__); … … 633 639 helper.CopyVector(Point); 634 640 helper.SubtractVector((*Runner)->node); 635 double currentNorm = helper. Norm();641 double currentNorm = helper.NormSquared(); 636 642 if (currentNorm < distance) { 637 643 secondDistance = distance; … … 860 866 } 861 867 *tecplot << "\", N=" << TesselStruct->PointsOnBoundary.size() << ", E=" << TesselStruct->TrianglesOnBoundary.size() << ", DATAPACKING=POINT, ZONETYPE=FETRIANGLE" << endl; 862 int i=0; 863 for (cloud->GoToFirst(); !cloud->IsEnd(); cloud->GoToNext(), i++); 868 int i=cloud->GetMaxId(); 864 869 int *LookupList = new int[i]; 865 870 for (cloud->GoToFirst(), i=0; !cloud->IsEnd(); cloud->GoToNext(), i++) -
molecuilder/src/tesselationhelpers.hpp
r0af58f r551a58 59 59 bool CheckLineCriteriaForDegeneratedTriangle(const BoundaryPointSet * const nodes[3]); 60 60 bool SortCandidates(const CandidateForTesselation* candidate1, const CandidateForTesselation *candidate2); 61 TesselPoint* FindClosest Point(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC);62 TesselPoint* FindSecondClosest Point(const Vector*, const LinkedCell* const LC);61 TesselPoint* FindClosestTesselPoint(const Vector* Point, TesselPoint *&SecondPoint, const LinkedCell* const LC); 62 TesselPoint* FindSecondClosestTesselPoint(const Vector*, const LinkedCell* const LC); 63 63 Vector * GetClosestPointBetweenLine(const BoundaryLineSet * const Base, const BoundaryLineSet * const OtherBase); 64 64 -
molecuilder/src/unittests/AnalysisCorrelationToPointUnitTest.cpp
r0af58f r551a58 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
molecuilder/src/unittests/AnalysisCorrelationToSurfaceUnitTest.cpp
r0af58f r551a58 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
molecuilder/src/unittests/AnalysisPairCorrelationUnitTest.cpp
r0af58f r551a58 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "analysis_correlation.hpp" -
molecuilder/src/unittests/Makefile.am
r0af58f r551a58 4 4 AM_CXXFLAGS = $(CPPUNIT_CFLAGS) 5 5 6 TESTS = ActOnAllUnitTest AnalysisBondsUnitTests AnalysisCorrelationToPointUnitTest AnalysisCorrelationToSurfaceUnitTest AnalysisPairCorrelationUnitTest BondGraphUnitTest InfoUnitTest ListOfBondsUnitTest LogUnitTest MemoryUsageObserverUnitTest MemoryAllocatorUnitTest StackClassUnitTest VectorUnitTest 6 TESTS = \ 7 ActOnAllUnitTest \ 8 AnalysisBondsUnitTests \ 9 AnalysisCorrelationToPointUnitTest \ 10 AnalysisCorrelationToSurfaceUnitTest \ 11 AnalysisPairCorrelationUnitTest \ 12 BondGraphUnitTest \ 13 GSLMatrixSymmetricUnitTest \ 14 GSLMatrixUnitTest \ 15 GSLVectorUnitTest \ 16 InfoUnitTest \ 17 LinearSystemOfEquationsUnitTest \ 18 ListOfBondsUnitTest \ 19 LogUnitTest \ 20 MemoryUsageObserverUnitTest \ 21 MemoryAllocatorUnitTest \ 22 StackClassUnitTest \ 23 TesselationUnitTest \ 24 Tesselation_BoundaryTriangleUnitTest \ 25 Tesselation_InOutsideUnitTest \ 26 VectorUnitTest 27 7 28 check_PROGRAMS = $(TESTS) 8 29 noinst_PROGRAMS = $(TESTS) 9 30 10 31 ActOnAllUnitTest_SOURCES = ../test/ActOnAllTest.hpp ActOnAllUnitTest.cpp ActOnAllUnitTest.hpp 11 ActOnAllUnitTest_LDADD = ../libmolecuilder.a 32 ActOnAllUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 12 33 13 34 AnalysisBondsUnitTests_SOURCES = analysisbondsunittest.cpp analysisbondsunittest.hpp 14 AnalysisBondsUnitTests_LDADD = ../libmolecuilder.a 35 AnalysisBondsUnitTests_LDADD = ../libmolecuilder.a ../libgslwrapper.a 15 36 16 37 AnalysisCorrelationToPointUnitTest_SOURCES = analysis_correlation.hpp AnalysisCorrelationToPointUnitTest.cpp AnalysisCorrelationToPointUnitTest.hpp 17 AnalysisCorrelationToPointUnitTest_LDADD = ../libmolecuilder.a 38 AnalysisCorrelationToPointUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 18 39 19 40 AnalysisCorrelationToSurfaceUnitTest_SOURCES = analysis_correlation.hpp AnalysisCorrelationToSurfaceUnitTest.cpp AnalysisCorrelationToSurfaceUnitTest.hpp 20 AnalysisCorrelationToSurfaceUnitTest_LDADD = ../libmolecuilder.a 41 AnalysisCorrelationToSurfaceUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 21 42 22 43 AnalysisPairCorrelationUnitTest_SOURCES = analysis_correlation.hpp AnalysisPairCorrelationUnitTest.cpp AnalysisPairCorrelationUnitTest.hpp 23 AnalysisPairCorrelationUnitTest_LDADD = ../libmolecuilder.a 44 AnalysisPairCorrelationUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 24 45 25 46 BondGraphUnitTest_SOURCES = bondgraphunittest.cpp bondgraphunittest.hpp 26 BondGraphUnitTest_LDADD = ../libmolecuilder.a 47 BondGraphUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 48 49 GSLMatrixSymmetricUnitTest_SOURCES = gslmatrixsymmetricunittest.cpp gslmatrixsymmetricunittest.hpp 50 GSLMatrixSymmetricUnitTest_LDADD = ../libgslwrapper.a 51 52 GSLMatrixUnitTest_SOURCES = gslmatrixunittest.cpp gslmatrixunittest.hpp 53 GSLMatrixUnitTest_LDADD = ../libgslwrapper.a 54 55 GSLVectorUnitTest_SOURCES = gslvectorunittest.cpp gslvectorunittest.hpp 56 GSLVectorUnitTest_LDADD = ../libgslwrapper.a 27 57 28 58 InfoUnitTest_SOURCES = infounittest.cpp infounittest.hpp 29 InfoUnitTest_LDADD = ../libmolecuilder.a 59 InfoUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 60 61 LinearSystemOfEquationsUnitTest_SOURCES = linearsystemofequationsunittest.cpp linearsystemofequationsunittest.hpp 62 LinearSystemOfEquationsUnitTest_LDADD = ../libgslwrapper.a ../libmolecuilder.a 30 63 31 64 ListOfBondsUnitTest_SOURCES = listofbondsunittest.cpp listofbondsunittest.hpp 32 ListOfBondsUnitTest_LDADD = ../libmolecuilder.a 65 ListOfBondsUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 33 66 34 67 LogUnitTest_SOURCES = logunittest.cpp logunittest.hpp 35 LogUnitTest_LDADD = ../libmolecuilder.a 68 LogUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 36 69 37 70 MemoryAllocatorUnitTest_SOURCES = memoryallocatorunittest.cpp memoryallocatorunittest.hpp 38 MemoryAllocatorUnitTest_LDADD = ../libmolecuilder.a 71 MemoryAllocatorUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 39 72 40 73 MemoryUsageObserverUnitTest_SOURCES = memoryusageobserverunittest.cpp memoryusageobserverunittest.hpp 41 MemoryUsageObserverUnitTest_LDADD = ../libmolecuilder.a 74 MemoryUsageObserverUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 42 75 43 76 StackClassUnitTest_SOURCES = stackclassunittest.cpp stackclassunittest.hpp 44 StackClassUnitTest_LDADD = ../libmolecuilder.a 77 StackClassUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 78 79 TesselationUnitTest_SOURCES = tesselationunittest.cpp tesselationunittest.hpp 80 TesselationUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 81 82 Tesselation_BoundaryTriangleUnitTest_SOURCES = tesselation_boundarytriangleunittest.cpp tesselation_boundarytriangleunittest.hpp 83 Tesselation_BoundaryTriangleUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 84 85 Tesselation_InOutsideUnitTest_SOURCES = tesselation_insideoutsideunittest.cpp tesselation_insideoutsideunittest.hpp 86 Tesselation_InOutsideUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 45 87 46 88 VectorUnitTest_SOURCES = vectorunittest.cpp vectorunittest.hpp 47 VectorUnitTest_LDADD = ../libmolecuilder.a 89 VectorUnitTest_LDADD = ../libmolecuilder.a ../libgslwrapper.a 48 90 49 91 -
molecuilder/src/unittests/analysisbondsunittest.cpp
r0af58f r551a58 14 14 #include <iostream> 15 15 #include <stdio.h> 16 #include <cstring> 16 17 17 18 #include "analysis_bonds.hpp" -
molecuilder/src/unittests/bondgraphunittest.cpp
r0af58f r551a58 14 14 #include <iostream> 15 15 #include <stdio.h> 16 #include <cstring> 16 17 17 18 #include "atom.hpp" -
molecuilder/src/unittests/listofbondsunittest.cpp
r0af58f r551a58 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cstring> 13 15 14 16 #include "listofbondsunittest.hpp" -
molecuilder/src/unittests/tesselationunittest.cpp
r0af58f r551a58 12 12 #include <cppunit/extensions/TestFactoryRegistry.h> 13 13 #include <cppunit/ui/text/TestRunner.h> 14 15 #include <cstring> 14 16 15 17 #include "defs.hpp" … … 30 32 class TesselPoint *Walker; 31 33 Walker = new TesselPoint; 32 Walker->node = new Vector(1., 0., 0.);33 Walker->Name = new char[3];34 Walker->node = new Vector(1., 0., -1.); 35 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 34 36 strcpy(Walker->Name, "1"); 35 37 Walker->nr = 1; 36 38 Corners.push_back(Walker); 37 39 Walker = new TesselPoint; 38 Walker->node = new Vector(-1., 1., 0.);39 Walker->Name = new char[3];40 Walker->node = new Vector(-1., 1., -1.); 41 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 40 42 strcpy(Walker->Name, "2"); 41 43 Walker->nr = 2; 42 44 Corners.push_back(Walker); 43 45 Walker = new TesselPoint; 44 Walker->node = new Vector(-1., -1., 0.);45 Walker->Name = new char[3];46 Walker->node = new Vector(-1., -1., -1.); 47 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 46 48 strcpy(Walker->Name, "3"); 47 49 Walker->nr = 3; … … 49 51 Walker = new TesselPoint; 50 52 Walker->node = new Vector(-1., 0., 1.); 51 Walker->Name = new char[3];53 Walker->Name = Malloc<char>(3, "TesselationTest::setUp"); 52 54 strcpy(Walker->Name, "4"); 53 55 Walker->nr = 4; … … 59 61 // create tesselation 60 62 TesselStruct = new Tesselation; 61 TesselStruct->PointsOnBoundary.clear();62 TesselStruct->LinesOnBoundary.clear();63 TesselStruct->TrianglesOnBoundary.clear();63 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->PointsOnBoundary.empty() ); 64 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->LinesOnBoundary.empty() ); 65 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->TrianglesOnBoundary.empty() ); 64 66 TesselStruct->FindStartingTriangle(SPHERERADIUS, LinkedList); 65 bool flag = false;66 67 67 LineMap::iterator baseline = TesselStruct->LinesOnBoundary.begin(); 68 while (baseline != TesselStruct->LinesOnBoundary.end()) { 69 if (baseline->second->triangles.size() == 1) { 70 flag = TesselStruct->FindNextSuitableTriangle(*(baseline->second), *(((baseline->second->triangles.begin()))->second), SPHERERADIUS, LinkedList); //the line is there, so there is a triangle, but only one. 68 CandidateForTesselation *baseline = NULL; 69 BoundaryTriangleSet *T = NULL; 70 bool OneLoopWithoutSuccessFlag = true; 71 bool TesselationFailFlag = false; 72 while ((!TesselStruct->OpenLines.empty()) && (OneLoopWithoutSuccessFlag)) { 73 // 2a. fill all new OpenLines 74 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 75 baseline = Runner->second; 76 if (baseline->pointlist.empty()) { 77 T = (((baseline->BaseLine->triangles.begin()))->second); 78 TesselationFailFlag = TesselStruct->FindNextSuitableTriangle(*baseline, *T, SPHERERADIUS, LinkedList); //the line is there, so there is a triangle, but only one. 79 } 71 80 } 72 baseline++; 73 if ((baseline == TesselStruct->LinesOnBoundary.end()) && (flag)) { 74 baseline = TesselStruct->LinesOnBoundary.begin(); // restart if we reach end due to newly inserted lines 75 flag = false; 81 82 // 2b. search for smallest ShortestAngle among all candidates 83 double ShortestAngle = 4.*M_PI; 84 for (CandidateMap::iterator Runner = TesselStruct->OpenLines.begin(); Runner != TesselStruct->OpenLines.end(); Runner++) { 85 if (Runner->second->ShortestAngle < ShortestAngle) { 86 baseline = Runner->second; 87 ShortestAngle = baseline->ShortestAngle; 88 } 89 } 90 if ((ShortestAngle == 4.*M_PI) || (baseline->pointlist.empty())) 91 OneLoopWithoutSuccessFlag = false; 92 else { 93 TesselStruct->AddCandidateTriangle(*baseline); 76 94 } 77 95 } … … 84 102 delete(TesselStruct); 85 103 for (LinkedNodes::iterator Runner = Corners.begin(); Runner != Corners.end(); Runner++) { 86 delete[]((*Runner)->Name);87 104 delete((*Runner)->node); 88 105 delete(*Runner); 89 106 } 90 107 Corners.clear(); 91 }; 92 93 /** UnitTest for Tesselation::IsInnerPoint() 94 */ 95 void TesselationTest::IsInnerPointTest() 96 { 97 // true inside points 98 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.,0.), LinkedList) ); 99 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.5,0.,0.), LinkedList) ); 100 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.5,0.), LinkedList) ); 101 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint(Vector(0.,0.,0.5), LinkedList) ); 102 103 // corners 104 for (LinkedNodes::iterator Runner = Corners.begin(); Runner != Corners.end(); Runner++) 105 CPPUNIT_ASSERT_EQUAL( true, TesselStruct->IsInnerPoint((*Runner), LinkedList) ); 106 107 // true outside points 108 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(0.,5.,0.), LinkedList) ); 109 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(0.,0.,5.), LinkedList) ); 110 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(1.,1.,1.), LinkedList) ); 111 112 // tricky point, there are three equally close triangles 113 CPPUNIT_ASSERT_EQUAL( false, TesselStruct->IsInnerPoint(Vector(5.,0.,0.), LinkedList) ); 114 108 MemoryUsageObserver::purgeInstance(); 109 logger::purgeInstance(); 110 errorLogger::purgeInstance(); 115 111 }; 116 112 -
molecuilder/src/unittests/tesselationunittest.hpp
r0af58f r551a58 21 21 { 22 22 CPPUNIT_TEST_SUITE( TesselationTest) ; 23 CPPUNIT_TEST ( IsInnerPointTest );24 23 CPPUNIT_TEST ( GetAllTrianglesTest ); 25 24 CPPUNIT_TEST ( ContainmentTest ); … … 29 28 void setUp(); 30 29 void tearDown(); 31 void IsInnerPointTest();32 30 void GetAllTrianglesTest(); 33 31 void ContainmentTest(); -
molecuilder/src/vector.cpp
r0af58f r551a58 8 8 #include "defs.hpp" 9 9 #include "helpers.hpp" 10 #include "memoryallocator.hpp" 10 #include "info.hpp" 11 #include "gslmatrix.hpp" 11 12 #include "leastsquaremin.hpp" 12 13 #include "log.hpp" 14 #include "memoryallocator.hpp" 13 15 #include "vector.hpp" 14 16 #include "verbose.hpp" 17 18 #include <gsl/gsl_linalg.h> 19 #include <gsl/gsl_matrix.h> 20 #include <gsl/gsl_permutation.h> 21 #include <gsl/gsl_vector.h> 15 22 16 23 /************************************ Functions for class vector ************************************/ … … 215 222 * \param *Origin first vector of line 216 223 * \param *LineVector second vector of line 217 * \return true - \a this contains intersection point on return, false - line is parallel to plane 224 * \return true - \a this contains intersection point on return, false - line is parallel to plane (even if in-plane) 218 225 */ 219 226 bool Vector::GetIntersectionWithPlane(const Vector * const PlaneNormal, const Vector * const PlaneOffset, const Vector * const Origin, const Vector * const LineVector) 220 227 { 228 Info FunctionInfo(__func__); 221 229 double factor; 222 230 Vector Direction, helper; … … 226 234 Direction.SubtractVector(Origin); 227 235 Direction.Normalize(); 228 //Log() << Verbose(4) << "INFO: Direction is " << Direction << "." << endl; 236 Log() << Verbose(1) << "INFO: Direction is " << Direction << "." << endl; 237 //Log() << Verbose(1) << "INFO: PlaneNormal is " << *PlaneNormal << " and PlaneOffset is " << *PlaneOffset << "." << endl; 229 238 factor = Direction.ScalarProduct(PlaneNormal); 230 if (fa ctor< MYEPSILON) { // Uniqueness: line parallel to plane?231 eLog() << Verbose(2) << "Line is parallel to plane, no intersection." << endl;239 if (fabs(factor) < MYEPSILON) { // Uniqueness: line parallel to plane? 240 Log() << Verbose(1) << "BAD: Line is parallel to plane, no intersection." << endl; 232 241 return false; 233 242 } … … 235 244 helper.SubtractVector(Origin); 236 245 factor = helper.ScalarProduct(PlaneNormal)/factor; 237 if (fa ctor< MYEPSILON) { // Origin is in-plane238 //Log() << Verbose(2) << "Origin of line is in-plane, simple." << endl;246 if (fabs(factor) < MYEPSILON) { // Origin is in-plane 247 Log() << Verbose(1) << "GOOD: Origin of line is in-plane." << endl; 239 248 CopyVector(Origin); 240 249 return true; … … 243 252 Direction.Scale(factor); 244 253 CopyVector(Origin); 245 //Log() << Verbose(4) << "INFO: Scaled direction is " << Direction << "." << endl;254 Log() << Verbose(1) << "INFO: Scaled direction is " << Direction << "." << endl; 246 255 AddVector(&Direction); 247 256 … … 250 259 helper.SubtractVector(PlaneOffset); 251 260 if (helper.ScalarProduct(PlaneNormal) < MYEPSILON) { 252 //Log() << Verbose(2) << "INFO: Intersection at " << *this << " is good." << endl;261 Log() << Verbose(1) << "GOOD: Intersection is " << *this << "." << endl; 253 262 return true; 254 263 } else { … … 286 295 287 296 /** Calculates the intersection of the two lines that are both on the same plane. 288 * We construct auxiliary plane with its vector normal to one line direction and the PlaneNormal, then a vector 289 * from the first line's offset onto the plane. Finally, scale by factor is 1/cos(angle(line1,line2..)) = 1/SP(...), and 290 * project onto the first line's direction and add its offset. 297 * This is taken from Weisstein, Eric W. "Line-Line Intersection." From MathWorld--A Wolfram Web Resource. http://mathworld.wolfram.com/Line-LineIntersection.html 291 298 * \param *out output stream for debugging 292 299 * \param *Line1a first vector of first line … … 299 306 bool Vector::GetIntersectionOfTwoLinesOnPlane(const Vector * const Line1a, const Vector * const Line1b, const Vector * const Line2a, const Vector * const Line2b, const Vector *PlaneNormal) 300 307 { 301 bool result = true; 302 Vector Direction, OtherDirection; 303 Vector AuxiliaryNormal; 304 Vector Distance; 305 const Vector *Normal = NULL; 306 Vector *ConstructedNormal = NULL; 307 bool FreeNormal = false; 308 309 // construct both direction vectors 310 Zero(); 311 Direction.CopyVector(Line1b); 312 Direction.SubtractVector(Line1a); 313 if (Direction.IsZero()) 308 Info FunctionInfo(__func__); 309 310 GSLMatrix *M = new GSLMatrix(4,4); 311 312 M->SetAll(1.); 313 for (int i=0;i<3;i++) { 314 M->Set(0, i, Line1a->x[i]); 315 M->Set(1, i, Line1b->x[i]); 316 M->Set(2, i, Line2a->x[i]); 317 M->Set(3, i, Line2b->x[i]); 318 } 319 320 //Log() << Verbose(1) << "Coefficent matrix is:" << endl; 321 //for (int i=0;i<4;i++) { 322 // for (int j=0;j<4;j++) 323 // cout << "\t" << M->Get(i,j); 324 // cout << endl; 325 //} 326 if (fabs(M->Determinant()) > MYEPSILON) { 327 Log() << Verbose(1) << "Determinant of coefficient matrix is NOT zero." << endl; 314 328 return false; 315 OtherDirection.CopyVector(Line2b); 316 OtherDirection.SubtractVector(Line2a); 317 if (OtherDirection.IsZero()) 329 } 330 Log() << Verbose(1) << "INFO: Line1a = " << *Line1a << ", Line1b = " << *Line1b << ", Line2a = " << *Line2a << ", Line2b = " << *Line2b << "." << endl; 331 332 333 // constuct a,b,c 334 Vector a; 335 Vector b; 336 Vector c; 337 Vector d; 338 a.CopyVector(Line1b); 339 a.SubtractVector(Line1a); 340 b.CopyVector(Line2b); 341 b.SubtractVector(Line2a); 342 c.CopyVector(Line2a); 343 c.SubtractVector(Line1a); 344 d.CopyVector(Line2b); 345 d.SubtractVector(Line1b); 346 Log() << Verbose(1) << "INFO: a = " << a << ", b = " << b << ", c = " << c << "." << endl; 347 if ((a.NormSquared() < MYEPSILON) || (b.NormSquared() < MYEPSILON)) { 348 Zero(); 349 Log() << Verbose(1) << "At least one of the lines is ill-defined, i.e. offset equals second vector." << endl; 350 return false; 351 } 352 353 // check for parallelity 354 Vector parallel; 355 double factor = 0.; 356 if (fabs(a.ScalarProduct(&b)*a.ScalarProduct(&b)/a.NormSquared()/b.NormSquared() - 1.) < MYEPSILON) { 357 parallel.CopyVector(Line1a); 358 parallel.SubtractVector(Line2a); 359 factor = parallel.ScalarProduct(&a)/a.Norm(); 360 if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) { 361 CopyVector(Line2a); 362 Log() << Verbose(1) << "Lines conincide." << endl; 363 return true; 364 } else { 365 parallel.CopyVector(Line1a); 366 parallel.SubtractVector(Line2b); 367 factor = parallel.ScalarProduct(&a)/a.Norm(); 368 if ((factor >= -MYEPSILON) && (factor - 1. < MYEPSILON)) { 369 CopyVector(Line2b); 370 Log() << Verbose(1) << "Lines conincide." << endl; 371 return true; 372 } 373 } 374 Log() << Verbose(1) << "Lines are parallel." << endl; 375 Zero(); 318 376 return false; 319 320 Direction.Normalize(); 321 OtherDirection.Normalize(); 322 323 //Log() << Verbose(4) << "INFO: Normalized Direction " << Direction << " and OtherDirection " << OtherDirection << "." << endl; 324 325 if (fabs(OtherDirection.ScalarProduct(&Direction) - 1.) < MYEPSILON) { // lines are parallel 326 if ((Line1a == Line2a) || (Line1a == Line2b)) 327 CopyVector(Line1a); 328 else if ((Line1b == Line2b) || (Line1b == Line2b)) 329 CopyVector(Line1b); 330 else 331 return false; 332 Log() << Verbose(4) << "INFO: Intersection is " << *this << "." << endl; 333 return true; 334 } else { 335 // check whether we have a plane normal vector 336 if (PlaneNormal == NULL) { 337 ConstructedNormal = new Vector; 338 ConstructedNormal->MakeNormalVector(&Direction, &OtherDirection); 339 Normal = ConstructedNormal; 340 FreeNormal = true; 341 } else 342 Normal = PlaneNormal; 343 344 AuxiliaryNormal.MakeNormalVector(&OtherDirection, Normal); 345 //Log() << Verbose(4) << "INFO: PlaneNormal is " << *Normal << " and AuxiliaryNormal " << AuxiliaryNormal << "." << endl; 346 347 Distance.CopyVector(Line2a); 348 Distance.SubtractVector(Line1a); 349 //Log() << Verbose(4) << "INFO: Distance is " << Distance << "." << endl; 350 if (Distance.IsZero()) { 351 // offsets are equal, match found 352 CopyVector(Line1a); 353 result = true; 354 } else { 355 CopyVector(Distance.Projection(&AuxiliaryNormal)); 356 //Log() << Verbose(4) << "INFO: Projected Distance is " << *this << "." << endl; 357 double factor = Direction.ScalarProduct(&AuxiliaryNormal); 358 //Log() << Verbose(4) << "INFO: Scaling factor is " << factor << "." << endl; 359 Scale(1./(factor*factor)); 360 //Log() << Verbose(4) << "INFO: Scaled Distance is " << *this << "." << endl; 361 CopyVector(Projection(&Direction)); 362 //Log() << Verbose(4) << "INFO: Distance, projected into Direction, is " << *this << "." << endl; 363 if (this->IsZero()) 364 result = false; 365 else 366 result = true; 367 AddVector(Line1a); 368 } 369 370 if (FreeNormal) 371 delete(ConstructedNormal); 372 } 373 if (result) 374 Log() << Verbose(4) << "INFO: Intersection is " << *this << "." << endl; 375 376 return result; 377 } 378 379 // obtain s 380 double s; 381 Vector temp1, temp2; 382 temp1.CopyVector(&c); 383 temp1.VectorProduct(&b); 384 temp2.CopyVector(&a); 385 temp2.VectorProduct(&b); 386 Log() << Verbose(1) << "INFO: temp1 = " << temp1 << ", temp2 = " << temp2 << "." << endl; 387 if (fabs(temp2.NormSquared()) > MYEPSILON) 388 s = temp1.ScalarProduct(&temp2)/temp2.NormSquared(); 389 else 390 s = 0.; 391 Log() << Verbose(1) << "Factor s is " << temp1.ScalarProduct(&temp2) << "/" << temp2.NormSquared() << " = " << s << "." << endl; 392 393 // construct intersection 394 CopyVector(&a); 395 Scale(s); 396 AddVector(Line1a); 397 Log() << Verbose(1) << "Intersection is at " << *this << "." << endl; 398 399 return true; 377 400 }; 378 401 … … 480 503 else 481 504 return false; 505 }; 506 507 /** Checks whether vector is normal to \a *normal. 508 * @return true - vector is normalized, false - vector is not 509 */ 510 bool Vector::IsEqualTo(const Vector * const a) const 511 { 512 bool status = true; 513 for (int i=0;i<NDIM;i++) { 514 if (fabs(x[i] - a->x[i]) > MYEPSILON) 515 status = false; 516 } 517 return status; 482 518 }; 483 519 -
molecuilder/src/vector.hpp
r0af58f r551a58 42 42 bool IsOne() const; 43 43 bool IsNormalTo(const Vector * const normal) const; 44 bool IsEqualTo(const Vector * const a) const; 44 45 45 46 void AddVector(const Vector * const y); -
molecuilder/tests/regression/Tesselation/1/post/NonConvexEnvelope.dat
r0af58f r551a58 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H08_ H09_ H11", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="test", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.78209 2.64589 2.64589 0 5 5 9.78209 2.64589 4.42589 0 … … 13 13 1 3 4 14 14 1 4 7 15 4 6 7 15 16 3 4 5 16 1 7 8 17 1 2 8 18 4 6 7 17 4 5 6 19 18 2 3 5 20 4 5 621 6 7 822 1 2 323 19 2 5 8 24 20 5 6 8 21 6 7 8 22 2 7 8 23 1 2 7 24 1 2 3 -
molecuilder/tests/regression/Tesselation/1/post/NonConvexEnvelope.r3d
r0af58f r551a58 34 34 1.37419 -0.89433 -0.89 0.12489 1.24767 -0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 35 35 1 36 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0.37 138 1.37419 -0.89433 -0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.39 140 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 0.89 1. 0. 0.41 142 36 0.12489 1.24767 -0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 1. 0. 0. 43 37 1 44 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-160.12489 1.24767 0.89 1. 0. 0.38 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0. 45 39 1 46 40 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 1. 0. 0. 47 41 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 42 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 0.89 1. 0. 0. 51 43 1 52 44 1.37419 -0.89433 0.89 0.12489 1.24767 0.89 -1.12431 -0.89433 0.89 1. 0. 0. 53 45 1 54 46 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 0.89 1. 0. 0. 47 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 53 1 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 55 55 9 56 56 # terminating special property … … 59 59 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0 60 60 2 61 -1.00456 0.23922 0.5933335 1 0 061 1.67084 -0.47478 -8.88178e-16 5 1 0 0 62 62 9 63 63 terminating special property -
molecuilder/tests/regression/Tesselation/2/post/ConvexEnvelope.dat
r0af58f r551a58 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H08_ H09_ H11", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="test", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.78209 2.64589 2.64589 0 5 5 9.78209 2.64589 4.42589 0 … … 13 13 1 3 4 14 14 1 4 7 15 4 6 7 15 16 3 4 5 16 1 7 8 17 1 2 8 18 4 6 7 17 4 5 6 19 18 2 3 5 20 4 5 621 6 7 822 1 2 323 19 2 5 8 24 20 5 6 8 21 6 7 8 22 2 7 8 23 1 2 7 24 1 2 3 -
molecuilder/tests/regression/Tesselation/2/post/ConvexEnvelope.r3d
r0af58f r551a58 34 34 1.37419 -0.89433 -0.89 0.12489 1.24767 -0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 35 35 1 36 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0.37 138 1.37419 -0.89433 -0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.39 140 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 0.89 1. 0. 0.41 142 36 0.12489 1.24767 -0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 1. 0. 0. 43 37 1 44 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-160.12489 1.24767 0.89 1. 0. 0.38 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0. 45 39 1 46 40 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 1. 0. 0. 47 41 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 42 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 0.89 1. 0. 0. 51 43 1 52 44 1.37419 -0.89433 0.89 0.12489 1.24767 0.89 -1.12431 -0.89433 0.89 1. 0. 0. 53 45 1 54 46 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 0.89 1. 0. 0. 47 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 53 1 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 55 55 9 56 56 # terminating special property … … 59 59 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0 60 60 2 61 -1.00456 0.23922 0.5933335 1 0 061 1.67084 -0.47478 -8.88178e-16 5 1 0 0 62 62 9 63 63 terminating special property -
molecuilder/tests/regression/Tesselation/2/post/NonConvexEnvelope.dat
r0af58f r551a58 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H08_ H09_ H11", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="test", N=8, E=12, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 9.78209 2.64589 2.64589 0 5 5 9.78209 2.64589 4.42589 0 … … 13 13 1 3 4 14 14 1 4 7 15 4 6 7 15 16 3 4 5 16 1 7 8 17 1 2 8 18 4 6 7 17 4 5 6 19 18 2 3 5 20 4 5 621 6 7 822 1 2 323 19 2 5 8 24 20 5 6 8 21 6 7 8 22 2 7 8 23 1 2 7 24 1 2 3 -
molecuilder/tests/regression/Tesselation/2/post/NonConvexEnvelope.r3d
r0af58f r551a58 34 34 1.37419 -0.89433 -0.89 0.12489 1.24767 -0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 35 35 1 36 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0.37 138 1.37419 -0.89433 -0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0.39 140 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 0.89 1. 0. 0.41 142 36 0.12489 1.24767 -0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 1. 0. 0. 43 37 1 44 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-160.12489 1.24767 0.89 1. 0. 0.38 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 1. 0. 0. 45 39 1 46 40 0.12489 1.24767 -0.89 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 1. 0. 0. 47 41 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 42 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 0.12489 1.24767 0.89 1. 0. 0. 51 43 1 52 44 1.37419 -0.89433 0.89 0.12489 1.24767 0.89 -1.12431 -0.89433 0.89 1. 0. 0. 53 45 1 54 46 0.12489 1.24767 0.89 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 0.89 1. 0. 0. 47 1 48 -2.01426 0.364321 -4.44089e-16 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 49 1 50 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 -1.12431 -0.89433 0.89 1. 0. 0. 51 1 52 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 -1.12431 -0.89433 -0.89 1. 0. 0. 53 1 54 1.37419 -0.89433 -0.89 1.37419 -0.89433 0.89 2.26414 0.364321 -4.44089e-16 1. 0. 0. 55 55 9 56 56 # terminating special property … … 59 59 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0 60 60 2 61 -1.00456 0.23922 0.5933335 1 0 061 1.67084 -0.47478 -8.88178e-16 5 1 0 0 62 62 9 63 63 terminating special property -
molecuilder/tests/regression/Tesselation/3/post/NonConvexEnvelope.dat
r0af58f r551a58 1 1 TITLE = "3D CONVEX SHELL" 2 2 VARIABLES = "X" "Y" "Z" "U" 3 ZONE T=" 0- H49_ H50_ H51", N=44, E=86, DATAPACKING=POINT, ZONETYPE=FETRIANGLE3 ZONE T="test", N=44, E=86, DATAPACKING=POINT, ZONETYPE=FETRIANGLE 4 4 6.9077 1.1106 0.1214 1 5 5 0.3612 -3.628 1.323 1 … … 28 28 2.8131 1.4776 2.5103 0 29 29 3.9137 2.2936 1.3739 0 30 2.159 2.5738 1.2698 230 2.159 2.5738 1.2698 5 31 31 3.6606 -0.4593 2.1396 2 32 32 3.2007 -1.4419 0.7311 4 33 -3.3002 2.3589 0.0094 533 -3.3002 2.3589 0.0094 8 34 34 -4.377 1.6962 -1.2433 3 35 35 5.2593 1.4547 -1.7445 0 … … 40 40 5.2727 1.6068 1.2828 2 41 41 -6.2394 4.6427 0.0632 0 42 -4.4738 4.5591 -0.1458 142 -4.4738 4.5591 -0.1458 3 43 43 -5.5506 3.8964 -1.3985 0 44 44 -6.7081 0.9923 0.6224 2 … … 49 49 1 32 44 50 50 1 32 35 51 32 33 4452 51 1 34 35 53 52 23 32 35 54 23 32 33 53 17 23 35 54 8 17 35 55 8 10 17 56 3 8 10 57 3 8 35 58 3 4 35 59 4 29 35 60 29 34 35 61 2 3 4 62 2 4 29 63 2 15 29 64 15 28 29 65 28 29 34 66 2 7 15 67 7 14 15 68 14 15 28 69 14 25 28 70 25 28 37 71 28 34 37 72 1 34 37 73 1 37 44 74 25 26 37 75 25 26 27 76 26 27 33 55 77 26 33 44 56 1 34 3757 29 34 3558 17 23 3559 18 23 3360 26 27 3361 78 26 37 44 62 1 37 4463 28 34 3764 28 29 3465 4 29 3566 17 18 2367 8 17 3568 18 27 3369 25 26 2770 25 26 3771 25 28 3772 15 28 2973 2 4 2974 3 4 3575 9 17 1876 8 10 1777 3 8 3578 16 18 2779 79 14 25 27 80 14 25 2881 14 15 2882 2 15 2983 2 3 484 9 10 1785 9 18 3186 3 8 1087 16 18 3088 16 27 3089 80 14 27 30 90 7 14 1591 2 7 1592 2 3 593 9 10 1294 9 19 3195 18 30 3196 3 10 1297 81 6 14 30 82 6 24 30 83 24 30 36 84 30 36 39 85 27 30 39 86 6 7 24 98 87 6 7 14 99 2 5 7100 3 5 12101 9 12 13102 9 13 19103 13 19 31104 30 31 39105 6 24 30106 6 7 24107 5 7 11108 5 12 22109 12 13 21110 13 21 31111 27 30 39112 31 39 40113 24 30 36114 88 7 11 24 115 5 11 22 116 12 21 22 117 21 31 43 118 31 40 43 119 40 42 43 120 41 42 43 121 21 41 43 122 20 21 41 89 11 20 24 123 90 20 24 41 124 91 24 36 41 125 92 36 41 42 93 11 20 22 94 5 11 22 95 5 7 11 96 2 5 7 97 27 30 39 98 16 27 30 99 16 18 30 100 16 18 27 101 18 27 33 102 18 23 33 103 36 38 39 126 104 36 38 42 105 18 30 31 106 30 31 39 107 31 39 40 108 9 18 31 109 9 17 18 110 17 18 23 111 9 19 31 112 9 13 19 113 13 19 31 114 13 21 31 115 21 31 43 116 31 40 43 117 9 12 13 118 9 10 12 119 9 10 17 120 12 13 21 121 12 21 22 122 5 12 22 123 3 5 12 124 2 3 5 125 3 10 12 126 20 21 22 127 20 21 41 128 21 41 43 129 41 42 43 130 23 32 33 131 32 33 44 132 40 42 43 127 133 38 40 42 128 134 38 39 40 129 36 38 39130 30 36 39131 27 30 39132 11 20 24133 11 20 22134 20 21 22 -
molecuilder/tests/regression/Tesselation/3/post/NonConvexEnvelope.r3d
r0af58f r551a58 160 160 7.33693 1.04442 0.0886712 5.68853 1.38852 -1.77723 5.55043 -0.952879 -0.490929 1. 0. 0. 161 161 1 162 7.33693 1.04442 0.0886712 6.17523 -0.969279 1.17127 5.55043 -0.952879 -0.490929 1. 0. 0. 163 1 164 3.62023 1.25552 -2.86813 5.68853 1.38852 -1.77723 5.55043 -0.952879 -0.490929 1. 0. 0. 165 1 166 1.76663 -0.360379 -2.99373 3.62023 1.25552 -2.86813 5.55043 -0.952879 -0.490929 1. 0. 0. 167 1 168 2.19193 -1.51408 -0.867629 1.76663 -0.360379 -2.99373 5.55043 -0.952879 -0.490929 1. 0. 0. 169 1 170 2.19193 -1.51408 -0.867629 0.450934 -2.72908 -2.23353 1.76663 -0.360379 -2.99373 1. 0. 0. 171 1 172 0.917634 -3.66448 -0.484829 2.19193 -1.51408 -0.867629 0.450934 -2.72908 -2.23353 1. 0. 0. 173 1 174 0.917634 -3.66448 -0.484829 2.19193 -1.51408 -0.867629 5.55043 -0.952879 -0.490929 1. 0. 0. 175 1 176 0.917634 -3.66448 -0.484829 1.92773 -2.57738 0.498071 5.55043 -0.952879 -0.490929 1. 0. 0. 177 1 178 1.92773 -2.57738 0.498071 3.62993 -1.50808 0.698371 5.55043 -0.952879 -0.490929 1. 0. 0. 179 1 180 3.62993 -1.50808 0.698371 6.17523 -0.969279 1.17127 5.55043 -0.952879 -0.490929 1. 0. 0. 181 1 182 0.790434 -3.69418 1.29027 0.917634 -3.66448 -0.484829 1.92773 -2.57738 0.498071 1. 0. 0. 183 1 184 0.790434 -3.69418 1.29027 1.92773 -2.57738 0.498071 3.62993 -1.50808 0.698371 1. 0. 0. 185 1 186 0.790434 -3.69418 1.29027 2.06173 -1.39848 1.79787 3.62993 -1.50808 0.698371 1. 0. 0. 187 1 188 2.06173 -1.39848 1.79787 4.08983 -0.525479 2.10687 3.62993 -1.50808 0.698371 1. 0. 0. 189 1 190 4.08983 -0.525479 2.10687 3.62993 -1.50808 0.698371 6.17523 -0.969279 1.17127 1. 0. 0. 191 1 192 0.790434 -3.69418 1.29027 -0.287266 -1.67078 2.48017 2.06173 -1.39848 1.79787 1. 0. 0. 193 1 194 -0.287266 -1.67078 2.48017 1.46453 0.112321 2.50927 2.06173 -1.39848 1.79787 1. 0. 0. 195 1 196 1.46453 0.112321 2.50927 2.06173 -1.39848 1.79787 4.08983 -0.525479 2.10687 1. 0. 0. 197 1 198 1.46453 0.112321 2.50927 3.24233 1.41142 2.47757 4.08983 -0.525479 2.10687 1. 0. 0. 199 1 200 3.24233 1.41142 2.47757 4.08983 -0.525479 2.10687 5.70193 1.54062 1.25007 1. 0. 0. 201 1 202 4.08983 -0.525479 2.10687 6.17523 -0.969279 1.17127 5.70193 1.54062 1.25007 1. 0. 0. 203 1 204 7.33693 1.04442 0.0886712 6.17523 -0.969279 1.17127 5.70193 1.54062 1.25007 1. 0. 0. 205 1 206 7.33693 1.04442 0.0886712 5.70193 1.54062 1.25007 7.56833 1.97852 -0.00632877 1. 0. 0. 207 1 208 3.24233 1.41142 2.47757 4.34293 2.22742 1.34117 5.70193 1.54062 1.25007 1. 0. 0. 209 1 210 3.24233 1.41142 2.47757 4.34293 2.22742 1.34117 2.58823 2.50762 1.23707 1. 0. 0. 211 1 212 4.34293 2.22742 1.34117 2.58823 2.50762 1.23707 5.11553 2.70122 -0.710229 1. 0. 0. 213 1 214 4.34293 2.22742 1.34117 5.11553 2.70122 -0.710229 7.56833 1.97852 -0.00632877 1. 0. 0. 215 1 216 4.34293 2.22742 1.34117 5.70193 1.54062 1.25007 7.56833 1.97852 -0.00632877 1. 0. 0. 217 1 218 1.46453 0.112321 2.50927 3.24233 1.41142 2.47757 2.58823 2.50762 1.23707 1. 0. 0. 219 1 220 1.46453 0.112321 2.50927 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 1. 0. 0. 221 1 222 -0.759066 -0.265179 1.48487 1.46453 0.112321 2.50927 -2.87097 2.29272 -0.0233288 1. 0. 0. 223 1 224 -0.759066 -0.265179 1.48487 -3.66127 0.565021 1.57007 -2.87097 2.29272 -0.0233288 1. 0. 0. 225 1 226 -3.66127 0.565021 1.57007 -2.87097 2.29272 -0.0233288 -4.83487 2.76522 1.41487 1. 0. 0. 227 1 228 -2.87097 2.29272 -0.0233288 -4.83487 2.76522 1.41487 -4.04457 4.49292 -0.178529 1. 0. 0. 229 1 230 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 -4.04457 4.49292 -0.178529 1. 0. 0. 231 1 232 -0.759066 -0.265179 1.48487 -0.287266 -1.67078 2.48017 -3.66127 0.565021 1.57007 1. 0. 0. 233 1 234 -0.759066 -0.265179 1.48487 -0.287266 -1.67078 2.48017 1.46453 0.112321 2.50927 1. 0. 0. 235 1 236 -0.287266 -1.67078 2.48017 -2.45927 -1.63678 1.72157 -3.66127 0.565021 1.57007 1. 0. 0. 237 1 238 -2.45927 -1.63678 1.72157 -4.75167 -1.93408 0.935971 -3.66127 0.565021 1.57007 1. 0. 0. 239 1 240 -4.75167 -1.93408 0.935971 -3.66127 0.565021 1.57007 -6.27887 0.926121 0.589671 1. 0. 0. 241 1 242 -3.66127 0.565021 1.57007 -4.83487 2.76522 1.41487 -6.27887 0.926121 0.589671 1. 0. 0. 243 1 244 -4.83487 2.76522 1.41487 -6.27887 0.926121 0.589671 -7.11497 2.49352 0.479071 1. 0. 0. 245 1 246 -2.45927 -1.63678 1.72157 -4.75167 -1.93408 0.935971 -3.90927 -3.49908 0.839771 1. 0. 0. 247 1 248 -1.52417 -3.64138 0.503471 -2.45927 -1.63678 1.72157 -3.90927 -3.49908 0.839771 1. 0. 0. 249 1 250 -1.52417 -3.64138 0.503471 -0.287266 -1.67078 2.48017 -2.45927 -1.63678 1.72157 1. 0. 0. 251 1 252 0.790434 -3.69418 1.29027 -1.52417 -3.64138 0.503471 -0.287266 -1.67078 2.48017 1. 0. 0. 253 1 254 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 -4.04457 4.49292 -0.178529 1. 0. 0. 255 1 256 1.15633 1.11082 0.326671 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 1. 0. 0. 257 1 258 1.15633 1.11082 0.326671 1.03283 1.01972 -2.14533 -2.87097 2.29272 -0.0233288 1. 0. 0. 259 1 260 1.15633 1.11082 0.326671 1.03283 1.01972 -2.14533 2.58823 2.50762 1.23707 1. 0. 0. 261 1 262 1.03283 1.01972 -2.14533 2.58823 2.50762 1.23707 5.11553 2.70122 -0.710229 1. 0. 0. 263 1 264 1.03283 1.01972 -2.14533 3.62023 1.25552 -2.86813 5.11553 2.70122 -0.710229 1. 0. 0. 265 1 266 -4.83487 2.76522 1.41487 -5.81017 4.57652 0.0304712 -4.04457 4.49292 -0.178529 1. 0. 0. 267 1 268 -4.83487 2.76522 1.41487 -5.81017 4.57652 0.0304712 -7.11497 2.49352 0.479071 1. 0. 0. 269 1 270 1.03283 1.01972 -2.14533 -2.87097 2.29272 -0.0233288 -3.94777 1.63002 -1.27603 1. 0. 0. 271 1 272 -2.87097 2.29272 -0.0233288 -3.94777 1.63002 -1.27603 -4.04457 4.49292 -0.178529 1. 0. 0. 273 1 274 -3.94777 1.63002 -1.27603 -4.04457 4.49292 -0.178529 -5.12137 3.83022 -1.43123 1. 0. 0. 275 1 276 -0.573766 -1.42458 -2.91753 1.03283 1.01972 -2.14533 -3.94777 1.63002 -1.27603 1. 0. 0. 277 1 278 -0.573766 -1.42458 -2.91753 1.76663 -0.360379 -2.99373 1.03283 1.01972 -2.14533 1. 0. 0. 279 1 280 1.76663 -0.360379 -2.99373 1.03283 1.01972 -2.14533 3.62023 1.25552 -2.86813 1. 0. 0. 281 1 282 -0.573766 -1.42458 -2.91753 -2.77417 -0.570279 -1.12083 -3.94777 1.63002 -1.27603 1. 0. 0. 283 1 284 -0.573766 -1.42458 -2.91753 -2.49667 -2.18078 -1.79993 -2.77417 -0.570279 -1.12083 1. 0. 0. 285 1 286 -2.49667 -2.18078 -1.79993 -2.77417 -0.570279 -1.12083 -3.94777 1.63002 -1.27603 1. 0. 0. 287 1 288 -2.49667 -2.18078 -1.79993 -4.17327 -2.53828 -0.635229 -3.94777 1.63002 -1.27603 1. 0. 0. 289 1 290 -4.17327 -2.53828 -0.635229 -3.94777 1.63002 -1.27603 -6.42617 1.74722 -0.982629 1. 0. 0. 291 1 292 -3.94777 1.63002 -1.27603 -5.12137 3.83022 -1.43123 -6.42617 1.74722 -0.982629 1. 0. 0. 293 1 294 -0.573766 -1.42458 -2.91753 -1.62867 -3.74268 -1.79493 -2.49667 -2.18078 -1.79993 1. 0. 0. 295 1 296 -0.573766 -1.42458 -2.91753 0.450934 -2.72908 -2.23353 -1.62867 -3.74268 -1.79493 1. 0. 0. 297 1 298 -0.573766 -1.42458 -2.91753 0.450934 -2.72908 -2.23353 1.76663 -0.360379 -2.99373 1. 0. 0. 299 1 300 -1.62867 -3.74268 -1.79493 -2.49667 -2.18078 -1.79993 -4.17327 -2.53828 -0.635229 1. 0. 0. 301 1 302 -1.62867 -3.74268 -1.79493 -4.17327 -2.53828 -0.635229 -3.90927 -3.49908 0.839771 1. 0. 0. 303 1 304 -1.52417 -3.64138 0.503471 -1.62867 -3.74268 -1.79493 -3.90927 -3.49908 0.839771 1. 0. 0. 305 1 306 0.917634 -3.66448 -0.484829 -1.52417 -3.64138 0.503471 -1.62867 -3.74268 -1.79493 1. 0. 0. 307 1 308 0.790434 -3.69418 1.29027 0.917634 -3.66448 -0.484829 -1.52417 -3.64138 0.503471 1. 0. 0. 309 1 310 0.917634 -3.66448 -0.484829 0.450934 -2.72908 -2.23353 -1.62867 -3.74268 -1.79493 1. 0. 0. 311 1 312 -4.75167 -1.93408 0.935971 -4.17327 -2.53828 -0.635229 -3.90927 -3.49908 0.839771 1. 0. 0. 313 1 314 -4.75167 -1.93408 0.935971 -4.17327 -2.53828 -0.635229 -6.27887 0.926121 0.589671 1. 0. 0. 315 1 316 -4.17327 -2.53828 -0.635229 -6.27887 0.926121 0.589671 -6.42617 1.74722 -0.982629 1. 0. 0. 317 1 318 -6.27887 0.926121 0.589671 -7.11497 2.49352 0.479071 -6.42617 1.74722 -0.982629 1. 0. 0. 319 1 320 3.62023 1.25552 -2.86813 5.68853 1.38852 -1.77723 5.11553 2.70122 -0.710229 1. 0. 0. 321 1 162 322 5.68853 1.38852 -1.77723 5.11553 2.70122 -0.710229 7.56833 1.97852 -0.00632877 1. 0. 0. 163 323 1 164 7.33693 1.04442 0.0886712 6.17523 -0.969279 1.17127 5.55043 -0.952879 -0.490929 1. 0. 0.165 1166 3.62023 1.25552 -2.86813 5.68853 1.38852 -1.77723 5.55043 -0.952879 -0.490929 1. 0. 0.167 1168 3.62023 1.25552 -2.86813 5.68853 1.38852 -1.77723 5.11553 2.70122 -0.710229 1. 0. 0.169 1170 4.34293 2.22742 1.34117 5.11553 2.70122 -0.710229 7.56833 1.97852 -0.00632877 1. 0. 0.171 1172 7.33693 1.04442 0.0886712 6.17523 -0.969279 1.17127 5.70193 1.54062 1.25007 1. 0. 0.173 1174 3.62993 -1.50808 0.698371 6.17523 -0.969279 1.17127 5.55043 -0.952879 -0.490929 1. 0. 0.175 1176 1.76663 -0.360379 -2.99373 3.62023 1.25552 -2.86813 5.55043 -0.952879 -0.490929 1. 0. 0.177 1178 1.03283 1.01972 -2.14533 3.62023 1.25552 -2.86813 5.11553 2.70122 -0.710229 1. 0. 0.179 1180 4.34293 2.22742 1.34117 2.58823 2.50762 1.23707 5.11553 2.70122 -0.710229 1. 0. 0.181 1182 4.34293 2.22742 1.34117 5.70193 1.54062 1.25007 7.56833 1.97852 -0.00632877 1. 0. 0.183 1184 7.33693 1.04442 0.0886712 5.70193 1.54062 1.25007 7.56833 1.97852 -0.00632877 1. 0. 0.185 1186 4.08983 -0.525479 2.10687 6.17523 -0.969279 1.17127 5.70193 1.54062 1.25007 1. 0. 0.187 1188 4.08983 -0.525479 2.10687 3.62993 -1.50808 0.698371 6.17523 -0.969279 1.17127 1. 0. 0.189 1190 1.92773 -2.57738 0.498071 3.62993 -1.50808 0.698371 5.55043 -0.952879 -0.490929 1. 0. 0.191 1192 1.76663 -0.360379 -2.99373 1.03283 1.01972 -2.14533 3.62023 1.25552 -2.86813 1. 0. 0.193 1194 2.19193 -1.51408 -0.867629 1.76663 -0.360379 -2.99373 5.55043 -0.952879 -0.490929 1. 0. 0.195 1196 1.03283 1.01972 -2.14533 2.58823 2.50762 1.23707 5.11553 2.70122 -0.710229 1. 0. 0.197 1198 3.24233 1.41142 2.47757 4.34293 2.22742 1.34117 2.58823 2.50762 1.23707 1. 0. 0.199 1200 3.24233 1.41142 2.47757 4.34293 2.22742 1.34117 5.70193 1.54062 1.25007 1. 0. 0.201 1202 3.24233 1.41142 2.47757 4.08983 -0.525479 2.10687 5.70193 1.54062 1.25007 1. 0. 0.203 1204 2.06173 -1.39848 1.79787 4.08983 -0.525479 2.10687 3.62993 -1.50808 0.698371 1. 0. 0.205 1206 0.790434 -3.69418 1.29027 1.92773 -2.57738 0.498071 3.62993 -1.50808 0.698371 1. 0. 0.207 1208 0.917634 -3.66448 -0.484829 1.92773 -2.57738 0.498071 5.55043 -0.952879 -0.490929 1. 0. 0.209 1210 -0.573766 -1.42458 -2.91753 1.76663 -0.360379 -2.99373 1.03283 1.01972 -2.14533 1. 0. 0.211 1212 2.19193 -1.51408 -0.867629 0.450934 -2.72908 -2.23353 1.76663 -0.360379 -2.99373 1. 0. 0.213 1214 0.917634 -3.66448 -0.484829 2.19193 -1.51408 -0.867629 5.55043 -0.952879 -0.490929 1. 0. 0.215 1216 1.15633 1.11082 0.326671 1.03283 1.01972 -2.14533 2.58823 2.50762 1.23707 1. 0. 0.217 1218 1.46453 0.112321 2.50927 3.24233 1.41142 2.47757 2.58823 2.50762 1.23707 1. 0. 0.219 1220 1.46453 0.112321 2.50927 3.24233 1.41142 2.47757 4.08983 -0.525479 2.10687 1. 0. 0.221 1222 1.46453 0.112321 2.50927 2.06173 -1.39848 1.79787 4.08983 -0.525479 2.10687 1. 0. 0.223 1224 0.790434 -3.69418 1.29027 2.06173 -1.39848 1.79787 3.62993 -1.50808 0.698371 1. 0. 0.225 1226 0.790434 -3.69418 1.29027 0.917634 -3.66448 -0.484829 1.92773 -2.57738 0.498071 1. 0. 0.227 1228 -0.573766 -1.42458 -2.91753 0.450934 -2.72908 -2.23353 1.76663 -0.360379 -2.99373 1. 0. 0.229 1230 -0.573766 -1.42458 -2.91753 1.03283 1.01972 -2.14533 -3.94777 1.63002 -1.27603 1. 0. 0.231 1232 0.917634 -3.66448 -0.484829 2.19193 -1.51408 -0.867629 0.450934 -2.72908 -2.23353 1. 0. 0.233 1234 1.15633 1.11082 0.326671 1.03283 1.01972 -2.14533 -2.87097 2.29272 -0.0233288 1. 0. 0.235 1236 1.15633 1.11082 0.326671 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 1. 0. 0.237 1238 1.46453 0.112321 2.50927 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 1. 0. 0.239 1240 -0.287266 -1.67078 2.48017 1.46453 0.112321 2.50927 2.06173 -1.39848 1.79787 1. 0. 0.241 1242 0.790434 -3.69418 1.29027 -0.287266 -1.67078 2.48017 2.06173 -1.39848 1.79787 1. 0. 0.243 1244 0.790434 -3.69418 1.29027 0.917634 -3.66448 -0.484829 -1.52417 -3.64138 0.503471 1. 0. 0.245 1246 -0.573766 -1.42458 -2.91753 0.450934 -2.72908 -2.23353 -1.62867 -3.74268 -1.79493 1. 0. 0.247 1248 -0.573766 -1.42458 -2.91753 -2.77417 -0.570279 -1.12083 -3.94777 1.63002 -1.27603 1. 0. 0.249 1250 1.03283 1.01972 -2.14533 -2.87097 2.29272 -0.0233288 -3.94777 1.63002 -1.27603 1. 0. 0.251 1252 0.917634 -3.66448 -0.484829 0.450934 -2.72908 -2.23353 -1.62867 -3.74268 -1.79493 1. 0. 0.253 1254 -0.759066 -0.265179 1.48487 1.46453 0.112321 2.50927 -2.87097 2.29272 -0.0233288 1. 0. 0.255 1256 -0.759066 -0.265179 1.48487 -0.287266 -1.67078 2.48017 1.46453 0.112321 2.50927 1. 0. 0.257 1258 0.790434 -3.69418 1.29027 -1.52417 -3.64138 0.503471 -0.287266 -1.67078 2.48017 1. 0. 0.259 1260 0.917634 -3.66448 -0.484829 -1.52417 -3.64138 0.503471 -1.62867 -3.74268 -1.79493 1. 0. 0.261 1262 -0.573766 -1.42458 -2.91753 -1.62867 -3.74268 -1.79493 -2.49667 -2.18078 -1.79993 1. 0. 0.263 1264 -0.573766 -1.42458 -2.91753 -2.49667 -2.18078 -1.79993 -2.77417 -0.570279 -1.12083 1. 0. 0.265 1266 -2.49667 -2.18078 -1.79993 -2.77417 -0.570279 -1.12083 -3.94777 1.63002 -1.27603 1. 0. 0.267 1268 -2.87097 2.29272 -0.0233288 -3.94777 1.63002 -1.27603 -4.04457 4.49292 -0.178529 1. 0. 0.269 1270 -0.759066 -0.265179 1.48487 -3.66127 0.565021 1.57007 -2.87097 2.29272 -0.0233288 1. 0. 0.271 1272 -0.759066 -0.265179 1.48487 -0.287266 -1.67078 2.48017 -3.66127 0.565021 1.57007 1. 0. 0.273 1274 -1.52417 -3.64138 0.503471 -0.287266 -1.67078 2.48017 -2.45927 -1.63678 1.72157 1. 0. 0.275 1276 -1.52417 -3.64138 0.503471 -1.62867 -3.74268 -1.79493 -3.90927 -3.49908 0.839771 1. 0. 0.277 1278 -1.62867 -3.74268 -1.79493 -2.49667 -2.18078 -1.79993 -4.17327 -2.53828 -0.635229 1. 0. 0.279 1280 -2.49667 -2.18078 -1.79993 -4.17327 -2.53828 -0.635229 -3.94777 1.63002 -1.27603 1. 0. 0.281 1282 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 -4.04457 4.49292 -0.178529 1. 0. 0.283 1284 -3.94777 1.63002 -1.27603 -4.04457 4.49292 -0.178529 -5.12137 3.83022 -1.43123 1. 0. 0.285 1286 -3.66127 0.565021 1.57007 -2.87097 2.29272 -0.0233288 -4.83487 2.76522 1.41487 1. 0. 0.287 1288 -0.287266 -1.67078 2.48017 -2.45927 -1.63678 1.72157 -3.66127 0.565021 1.57007 1. 0. 0.289 1290 -1.52417 -3.64138 0.503471 -2.45927 -1.63678 1.72157 -3.90927 -3.49908 0.839771 1. 0. 0.291 1292 -1.62867 -3.74268 -1.79493 -4.17327 -2.53828 -0.635229 -3.90927 -3.49908 0.839771 1. 0. 0.293 1294 -4.17327 -2.53828 -0.635229 -3.94777 1.63002 -1.27603 -6.42617 1.74722 -0.982629 1. 0. 0.295 1296 -3.94777 1.63002 -1.27603 -5.12137 3.83022 -1.43123 -6.42617 1.74722 -0.982629 1. 0. 0.297 1298 324 -5.12137 3.83022 -1.43123 -7.11497 2.49352 0.479071 -6.42617 1.74722 -0.982629 1. 0. 0. 299 325 1 300 -6.27887 0.926121 0.589671 -7.11497 2.49352 0.479071 -6.42617 1.74722 -0.982629 1. 0. 0.301 1302 -4.17327 -2.53828 -0.635229 -6.27887 0.926121 0.589671 -6.42617 1.74722 -0.982629 1. 0. 0.303 1304 -4.75167 -1.93408 0.935971 -4.17327 -2.53828 -0.635229 -6.27887 0.926121 0.589671 1. 0. 0.305 1306 -4.75167 -1.93408 0.935971 -3.66127 0.565021 1.57007 -6.27887 0.926121 0.589671 1. 0. 0.307 1308 -3.66127 0.565021 1.57007 -4.83487 2.76522 1.41487 -6.27887 0.926121 0.589671 1. 0. 0.309 1310 -4.83487 2.76522 1.41487 -6.27887 0.926121 0.589671 -7.11497 2.49352 0.479071 1. 0. 0.311 1312 -4.83487 2.76522 1.41487 -5.81017 4.57652 0.0304712 -7.11497 2.49352 0.479071 1. 0. 0.313 1314 326 -5.81017 4.57652 0.0304712 -5.12137 3.83022 -1.43123 -7.11497 2.49352 0.479071 1. 0. 0. 315 327 1 316 328 -5.81017 4.57652 0.0304712 -4.04457 4.49292 -0.178529 -5.12137 3.83022 -1.43123 1. 0. 0. 317 1318 -4.83487 2.76522 1.41487 -5.81017 4.57652 0.0304712 -4.04457 4.49292 -0.178529 1. 0. 0.319 1320 -2.87097 2.29272 -0.0233288 -4.83487 2.76522 1.41487 -4.04457 4.49292 -0.178529 1. 0. 0.321 1322 2.58823 2.50762 1.23707 -2.87097 2.29272 -0.0233288 -4.04457 4.49292 -0.178529 1. 0. 0.323 1324 -2.45927 -1.63678 1.72157 -4.75167 -1.93408 0.935971 -3.66127 0.565021 1.57007 1. 0. 0.325 1326 -2.45927 -1.63678 1.72157 -4.75167 -1.93408 0.935971 -3.90927 -3.49908 0.839771 1. 0. 0.327 1328 -4.75167 -1.93408 0.935971 -4.17327 -2.53828 -0.635229 -3.90927 -3.49908 0.839771 1. 0. 0.329 329 9 330 330 # terminating special property … … 333 333 25.0 0.6 -1.0 -1.0 -1.0 0.2 0 0 0 0 334 334 2 335 -4. 27807 -2.65715 0.3801715 1 0 0335 -4.99203 4.29989 -0.526429 5 1 0 0 336 336 9 337 337 terminating special property -
molecuilder/tests/testsuite.at
r0af58f r551a58 12 12 AT_CHECK([pwd],[ignore],[ignore]) 13 13 AT_CHECK([../../molecuilder -v], 0, [stdout], [ignore]) 14 AT_CHECK([fgrep molecuilder stdout], 0, [ignore], [ignore])14 AT_CHECK([fgrep olecuilder stdout], 0, [ignore], [ignore]) 15 15 AT_CHECK([../../molecuilder -h], 0, [stdout], [ignore]) 16 16 AT_CHECK([fgrep "Give this help screen" stdout], 0, [ignore], [ignore]) 17 AT_CHECK([../../molecuilder -e], 0, [ignore], [stderr])17 AT_CHECK([../../molecuilder -e], 255, [ignore], [stderr]) 18 18 AT_CHECK([fgrep "Not enough or invalid arguments" stderr], 0, [ignore], [ignore]) 19 19 AT_CHECK([../../molecuilder test.conf], 0, [stdout], [stderr]) … … 78 78 AT_SETUP([Simple configuration - invalid commands on present configs]) 79 79 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Simple_configuration/7/pre/test.conf .], 0) 80 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -t -s -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 81 AT_CHECK([fgrep -c "Not enough or invalid" stderr], 0, [9 82 ], [ignore]) 80 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -t], 255, [ignore], [stderr]) 81 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 82 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -s -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 83 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 84 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -b -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 85 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 86 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -E -c -b -a -U -T -u], 255, [ignore], [stderr]) 87 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 88 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -c -b -a -U -T -u], 255, [ignore], [stderr]) 89 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 90 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -b -a -U -T -u], 255, [ignore], [stderr]) 91 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 92 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -a -U -T -u], 255, [ignore], [stderr]) 93 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 94 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -U -T -u], 255, [ignore], [stderr]) 95 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 96 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -T -u], 255, [ignore], [stderr]) 97 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 98 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -u], 255, [ignore], [stderr]) 99 AT_CHECK([fgrep -c "CRITICAL: Not enough or invalid" stderr], 0, [ignore], [ignore]) 83 100 AT_CLEANUP 84 101 … … 88 105 AT_SETUP([Graph - DFS analysis]) 89 106 AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Graph/1/pre/test.conf .], 0) 90 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ - D 2.], 0, [stdout], [stderr])107 AT_CHECK([../../molecuilder test.conf -e ${abs_top_srcdir}/src/ -vvv -D 2.], 0, [stdout], [stderr]) 91 108 AT_CHECK([fgrep -c "No rings were detected in the molecular structure." stdout], 0, [1 92 109 ], [ignore]) … … 134 151 AT_CHECK([file=ConvexEnvelope.dat; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Tesselation/2/post/$file], 0, [ignore], [ignore]) 135 152 AT_CHECK([file=ConvexEnvelope.r3d; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Tesselation/2/post/$file], 0, [ignore], [ignore]) 136 AT_CHECK([fgrep " RESULT: The summed volume is 16.401577angstrom^3" stdout], 0, [ignore], [ignore])153 AT_CHECK([fgrep "tesselated volume area is 16.4016 angstrom^3" stdout], 0, [ignore], [ignore]) 137 154 AT_CHECK([diff ConvexEnvelope.dat NonConvexEnvelope.dat], 0, [ignore], [ignore]) 138 155 AT_CLEANUP … … 152 169 #AT_CHECK([file=ConvexEnvelope.dat; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Tesselation/4/post/$file], 0, [ignore], [ignore]) 153 170 #AT_CHECK([file=ConvexEnvelope.r3d; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/regression/Tesselation/4/post/$file], 0, [ignore], [ignore]) 154 #AT_CHECK([fgrep " RESULT: The summed volume is 16.401577angstrom^3" stdout], 0, [ignore], [ignore])171 #AT_CHECK([fgrep "tesselated volume area is 16.4016 angstrom^3" stdout], 0, [ignore], [ignore]) 155 172 #AT_CLEANUP 156 173 -
pcp/src/Makefile.am
r0af58f r551a58 7 7 FORCE: 8 8 $(srcdir)/.git-version: FORCE 9 @if (test -d $(top_srcdir)/../.git && cd $(srcdir) && git describe --tagsHEAD) > .git-version-t 2>/dev/null \9 @if (test -d $(top_srcdir)/../.git && cd $(srcdir) && git describe HEAD) > .git-version-t 2>/dev/null \ 10 10 && ! diff .git-version-t $(srcdir)/.git-version >/dev/null 2>&1; then \ 11 11 mv -f .git-version-t $(srcdir)/.git-version; \ -
util/src/Makefile.am
r0af58f r551a58 67 67 LinearlyInterpolateBetweenPCPConfigs.py \ 68 68 OutputRaster3DHeader.py \ 69 LinearlyInterpolateBetweenPCPConfigs.py \70 69 PairCorrelationTIP3toResiduum.py \ 71 70 PairCorrelationToCluster.py \ … … 75 74 ReMapDBondFileFromXYZ.py \ 76 75 ReMapDBondFile.py \ 77 RemoveConvexPart.py \78 RemoveRandomAtoms.py \79 76 RemoveConvexPart.py \ 80 77 RemoveRandomAtoms.py \ … … 87 84 FORCE: 88 85 $(srcdir)/.git-version: FORCE 89 @if (test -d $(top_srcdir)/../.git && cd $(srcdir) && git describe --tagsHEAD) > .git-version-t 2>/dev/null \86 @if (test -d $(top_srcdir)/../.git && cd $(srcdir) && git describe HEAD) > .git-version-t 2>/dev/null \ 90 87 && ! diff .git-version-t $(srcdir)/.git-version >/dev/null 2>&1; then \ 91 88 mv -f .git-version-t $(srcdir)/.git-version; \
Note:
See TracChangeset
for help on using the changeset viewer.
