- Timestamp:
- Aug 18, 2009, 8:42:39 AM (15 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 99c484
- Parents:
- 093645
- Location:
- src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/boundary.cpp
r093645 r0077b5 620 620 } 621 621 622 //CalculateConcavityPerBoundaryPoint(out, TesselStruct); 623 StoreTrianglesinFile(out, mol, filename, "-first"); 624 622 625 // First step: RemovePointFromTesselatedSurface 623 626 PointRunner = TesselStruct->PointsOnBoundary.begin(); … … 641 644 } 642 645 643 644 // // print all lines 645 // LineRunner = TesselStruct->LinesOnBoundary.begin(); 646 // LineAdvance = LineRunner; // we need an advanced line, as the LineRunner might get removed 647 // *out << Verbose(1) << "Printing all boundary lines for debugging." << endl; 648 // while (LineRunner != TesselStruct->LinesOnBoundary.end()) { 649 // LineAdvance++; 650 // line = LineRunner->second; 651 // *out << Verbose(2) << "INFO: Current line is " << *line << "." << endl; 652 // if (LineAdvance != TesselStruct->LinesOnBoundary.end()) 653 // *out << Verbose(2) << "INFO: Next line will be " << *(LineAdvance->second) << "." << endl; 654 // LineRunner = LineAdvance; 655 // } 656 // 657 // // print all triangles 658 // TriangleRunner = TesselStruct->TrianglesOnBoundary.begin(); 659 // TriangleAdvance = TriangleRunner; // we need an advanced line, as the LineRunner might get removed 660 // *out << Verbose(1) << "Printing all boundary triangles for debugging." << endl; 661 // while (TriangleRunner != TesselStruct->TrianglesOnBoundary.end()) { 662 // TriangleAdvance++; 663 // *out << Verbose(2) << "INFO: Current triangle is " << *(TriangleRunner->second) << "." << endl; 664 // if (TriangleAdvance != TesselStruct->TrianglesOnBoundary.end()) 665 // *out << Verbose(2) << "INFO: Next triangle will be " << *(TriangleAdvance->second) << "." << endl; 666 // TriangleRunner = TriangleAdvance; 667 // } 646 //CalculateConcavityPerBoundaryPoint(out, TesselStruct); 647 StoreTrianglesinFile(out, mol, filename, "-second"); 668 648 669 649 // second step: PickFarthestofTwoBaselines … … 674 654 line = LineRunner->second; 675 655 *out << Verbose(1) << "INFO: Picking farthest baseline for line is " << *line << "." << endl; 676 if (LineAdvance != TesselStruct->LinesOnBoundary.end())677 656 // take highest of both lines 678 TesselStruct->PickFarthestofTwoBaselines(out, line); 657 if (TesselStruct->IsConvexRectangle(out, line) == NULL) 658 TesselStruct->PickFarthestofTwoBaselines(out, line); 679 659 LineRunner = LineAdvance; 680 660 } 681 661 682 // calculate remaining concavity 683 for (PointRunner = TesselStruct->PointsOnBoundary.begin(); PointRunner != TesselStruct->PointsOnBoundary.end(); PointRunner++) { 684 point = PointRunner->second; 685 *out << Verbose(1) << "INFO: Current point is " << *point << "." << endl; 686 point->value = 0; 687 for (LineMap::iterator LineRunner = point->lines.begin(); LineRunner != point->lines.end(); LineRunner++) { 688 line = LineRunner->second; 689 *out << Verbose(2) << "INFO: Current line of point " << *point << " is " << *line << "." << endl; 690 if (!line->CheckConvexityCriterion(out)) 691 point->value += 1; 692 } 693 } 694 695 // 4. Store triangles in tecplot file 696 if (filename != NULL) { 697 if (DoTecplotOutput) { 698 string OutputName(filename); 699 OutputName.append("_intermed"); 700 OutputName.append(TecplotSuffix); 701 ofstream *tecplot = new ofstream(OutputName.c_str()); 702 write_tecplot_file(out, tecplot, mol->TesselStruct, mol, 0); 703 tecplot->close(); 704 delete(tecplot); 705 } 706 if (DoRaster3DOutput) { 707 string OutputName(filename); 708 OutputName.append("_intermed"); 709 OutputName.append(Raster3DSuffix); 710 ofstream *rasterplot = new ofstream(OutputName.c_str()); 711 write_raster3d_file(out, rasterplot, mol->TesselStruct, mol); 712 rasterplot->close(); 713 delete(rasterplot); 714 } 715 } 662 //CalculateConcavityPerBoundaryPoint(out, TesselStruct); 663 StoreTrianglesinFile(out, mol, filename, "-third"); 716 664 717 665 // third step: IsConvexRectangle … … 735 683 } 736 684 685 CalculateConcavityPerBoundaryPoint(out, TesselStruct); 686 687 // end 688 *out << Verbose(0) << "End of ConvexizeNonconvexEnvelope" << endl; 689 return volume; 690 }; 691 692 /** Calculates the concavity for each of the BoundaryPointSet's in a Tesselation. 693 * Sets BoundaryPointSet::value equal to the number of connected lines that are not convex. 694 * \param *out output stream for debugging 695 * \param *TesselStruct pointer to Tesselation structure 696 */ 697 void CalculateConcavityPerBoundaryPoint(ofstream *out, class Tesselation *TesselStruct) 698 { 699 class BoundaryPointSet *point = NULL; 700 class BoundaryLineSet *line = NULL; 737 701 // calculate remaining concavity 738 for (Point Runner = TesselStruct->PointsOnBoundary.begin(); PointRunner != TesselStruct->PointsOnBoundary.end(); PointRunner++) {702 for (PointMap::iterator PointRunner = TesselStruct->PointsOnBoundary.begin(); PointRunner != TesselStruct->PointsOnBoundary.end(); PointRunner++) { 739 703 point = PointRunner->second; 740 704 *out << Verbose(1) << "INFO: Current point is " << *point << "." << endl; … … 747 711 } 748 712 } 749 713 }; 714 715 /** Stores triangles to file. 716 * \param *out output stream for debugging 717 * \param *mol molecule with atoms and bonds 718 * \param *filename prefix of filename 719 * \param *extraSuffix intermediate suffix 720 */ 721 void StoreTrianglesinFile(ofstream *out, molecule *mol, const char *filename, const char *extraSuffix) 722 { 750 723 // 4. Store triangles in tecplot file 751 724 if (filename != NULL) { 752 725 if (DoTecplotOutput) { 753 726 string OutputName(filename); 727 OutputName.append(extraSuffix); 754 728 OutputName.append(TecplotSuffix); 755 729 ofstream *tecplot = new ofstream(OutputName.c_str()); … … 760 734 if (DoRaster3DOutput) { 761 735 string OutputName(filename); 736 OutputName.append(extraSuffix); 762 737 OutputName.append(Raster3DSuffix); 763 738 ofstream *rasterplot = new ofstream(OutputName.c_str()); … … 767 742 } 768 743 } 769 770 // end771 *out << Verbose(0) << "End of ConvexizeNonconvexEnvelope" << endl;772 return volume;773 744 }; 774 745 -
src/boundary.hpp
r093645 r0077b5 42 42 void Find_next_suitable_point(class BoundaryTriangleSet *BaseTriangle, class BoundaryLineSet *BaseLine, atom*& OptCandidate, Vector *OptCandidateCenter, double *ShortestAngle, const double RADIUS, LinkedCell *LC); 43 43 Boundaries *GetBoundaryPoints(ofstream *out, molecule *mol); 44 void CalculateConcavityPerBoundaryPoint(ofstream *out, class Tesselation *TesselStruct); 45 void StoreTrianglesinFile(ofstream *out, molecule *mol, const char *filename, const char *extraSuffix); 46 44 47 45 48 #endif /*BOUNDARY_HPP_*/ -
src/tesselation.cpp
r093645 r0077b5 1751 1751 class BoundaryPointSet *Spot = NULL; 1752 1752 class BoundaryLineSet *OtherBase; 1753 Vector *ClosestPoint [2];1753 Vector *ClosestPoint; 1754 1754 1755 1755 int m=0; … … 1764 1764 1765 1765 // get the closest point on each line to the other line 1766 ClosestPoint[0] = GetClosestPointBetweenLine(out, Base, OtherBase); 1767 ClosestPoint[1] = GetClosestPointBetweenLine(out, OtherBase, Base); 1766 ClosestPoint = GetClosestPointBetweenLine(out, Base, OtherBase); 1768 1767 1769 1768 // delete the temporary other base line 1769 delete(ClosestPoint); 1770 1770 delete(OtherBase); 1771 1771 1772 1772 // get the distance vector from Base line to OtherBase line 1773 Vector DistanceToIntersection, BaseLine; 1773 Vector DistanceToIntersection[2], BaseLine; 1774 double distance[2]; 1774 1775 BaseLine.CopyVector(Base->endpoints[1]->node->node); 1775 1776 BaseLine.SubtractVector(Base->endpoints[0]->node->node); 1776 DistanceToIntersection.CopyVector(ClosestPoint[0]); 1777 DistanceToIntersection.SubtractVector(Base->endpoints[0]->node->node); 1778 Spot = Base->endpoints[1]; 1779 if (BaseLine.ScalarProduct(&DistanceToIntersection) < -MYEPSILON) { 1780 DistanceToIntersection.CopyVector(ClosestPoint[0]); 1781 DistanceToIntersection.SubtractVector(Base->endpoints[1]->node->node); 1782 Spot = Base->endpoints[0]; 1783 if (BaseLine.ScalarProduct(&DistanceToIntersection) < -MYEPSILON) { 1784 *out << Verbose(3) << "ERROR: Something's very wrong here, both SKPs return negative?!" << endl; 1785 return NULL; 1786 } 1787 } 1788 if ((BaseLine.NormSquared() - DistanceToIntersection.NormSquared()) < -MYEPSILON) { // distance is smaller: concave 1789 *out << Verbose(3) << "INFO: Rectangle of triangles of base line " << *Base << " is concave: Base line squared length " << BaseLine.NormSquared() << " against Distance to intersection squared " << DistanceToIntersection.NormSquared() << "." << endl; 1777 for (int i=0;i<2;i++) { 1778 DistanceToIntersection[i].CopyVector(ClosestPoint); 1779 DistanceToIntersection[i].SubtractVector(Base->endpoints[i]->node->node); 1780 distance[i] = BaseLine.ScalarProduct(&DistanceToIntersection[i]); 1781 } 1782 if ((distance[0] * distance[1]) > MYEPSILON) { // have same sign? 1783 *out << Verbose(3) << "REJECT: Both SKPs have same sign: " << distance[0] << " and " << distance[1] << ". " << *Base << " is concave." << endl; 1784 if (distance[0] < distance[1]) { 1785 Spot = Base->endpoints[0]; 1786 } else { 1787 Spot = Base->endpoints[1]; 1788 } 1790 1789 return Spot; 1791 } else { // base line is longer: convex1792 *out << Verbose(3) << " INFO: Rectangle of triangles of base line " << *Base << " is concave." << endl;1790 } else { // different sign, i.e. we are in between 1791 *out << Verbose(3) << "ACCEPT: Rectangle of triangles of base line " << *Base << " is convex." << endl; 1793 1792 return NULL; 1794 1793 } … … 1796 1795 }; 1797 1796 1797 void Tesselation::PrintAllBoundaryPoints(ofstream *out) 1798 { 1799 // print all lines 1800 *out << Verbose(1) << "Printing all boundary points for debugging:" << endl; 1801 for (PointMap::iterator PointRunner = PointsOnBoundary.begin();PointRunner != PointsOnBoundary.end(); PointRunner++) 1802 *out << Verbose(2) << *(PointRunner->second) << endl; 1803 }; 1804 1805 void Tesselation::PrintAllBoundaryLines(ofstream *out) 1806 { 1807 // print all lines 1808 *out << Verbose(1) << "Printing all boundary lines for debugging:" << endl; 1809 for (LineMap::iterator LineRunner = LinesOnBoundary.begin(); LineRunner != LinesOnBoundary.end(); LineRunner++) 1810 *out << Verbose(2) << *(LineRunner->second) << endl; 1811 }; 1812 1813 void Tesselation::PrintAllBoundaryTriangles(ofstream *out) 1814 { 1815 // print all triangles 1816 *out << Verbose(1) << "Printing all boundary triangles for debugging:" << endl; 1817 for (TriangleMap::iterator TriangleRunner = TrianglesOnBoundary.begin(); TriangleRunner != TrianglesOnBoundary.end(); TriangleRunner++) 1818 *out << Verbose(2) << *(TriangleRunner->second) << endl; 1819 }; 1798 1820 1799 1821 /** For a given boundary line \a *Base and its two triangles, picks the central baseline that is "higher". … … 1826 1848 Distance.SubtractVector(ClosestPoint[0]); 1827 1849 1828 // delete the temporary other base line 1850 // delete the temporary other base line and the closest points 1851 delete(ClosestPoint[0]); 1852 delete(ClosestPoint[1]); 1829 1853 delete(OtherBase); 1830 1854 … … 1843 1867 BaseLineNormal.AddVector(&(runner->second->NormalVector)); 1844 1868 } 1845 BaseLineNormal.Scale( -1./2.); // has to point inside for BoundaryTriangleSet::GetNormalVector()1869 BaseLineNormal.Scale(1./2.); 1846 1870 1847 1871 if (Distance.ScalarProduct(&BaseLineNormal) > MYEPSILON) { // Distance points outwards, hence OtherBase higher than Base -> flip … … 1866 1890 // construct the plane of the two baselines (i.e. take both their directional vectors) 1867 1891 Vector Normal; 1868 Vector OtherBaseline;1869 Normal.CopyVector(Base->endpoints[1]->node->node);1870 Normal.SubtractVector(Base->endpoints[0]->node->node);1892 Vector Baseline, OtherBaseline; 1893 Baseline.CopyVector(Base->endpoints[1]->node->node); 1894 Baseline.SubtractVector(Base->endpoints[0]->node->node); 1871 1895 OtherBaseline.CopyVector(OtherBase->endpoints[1]->node->node); 1872 1896 OtherBaseline.SubtractVector(OtherBase->endpoints[0]->node->node); 1897 Normal.CopyVector(&Baseline); 1873 1898 Normal.VectorProduct(&OtherBaseline); 1874 1899 Normal.Normalize(); 1875 1876 // project one offset point of OtherBase onto this plane 1900 *out << Verbose(4) << "First direction is " << Baseline << ", second direction is " << OtherBaseline << ", normal of intersection plane is " << Normal << "." << endl; 1901 1902 // project one offset point of OtherBase onto this plane (and add plane offset vector) 1877 1903 Vector NewOffset; 1878 1904 NewOffset.CopyVector(OtherBase->endpoints[0]->node->node); 1879 1905 NewOffset.ProjectOntoPlane(&Normal); 1880 Vector NewDirection; 1881 NewDirection.CopyVector(OtherBase->endpoints[1]->node->node); 1882 NewDirection.ProjectOntoPlane(&Normal); 1906 NewOffset.AddVector(Base->endpoints[0]->node->node); 1883 1907 1884 1908 // calculate the intersection between this projected baseline and Base 1885 1909 Vector *Intersection = new Vector; 1886 Intersection->GetIntersectionOfTwoLinesOnPlane(out, Base->endpoints[0]->node->node, Base->endpoints[1]->node->node, &NewOffset, &NewDirection, &Normal); 1910 Intersection->GetIntersectionOfTwoLinesOnPlane(out, Base->endpoints[0]->node->node, Base->endpoints[1]->node->node, &NewOffset, &OtherBaseline, &Normal); 1911 Normal.CopyVector(Intersection); 1912 Normal.SubtractVector(Base->endpoints[0]->node->node); 1913 *out << Verbose(3) << "Found closest point on " << *Base << " at " << *Intersection << ", factor in line is " << fabs(Normal.ScalarProduct(&Baseline)/Baseline.NormSquared()) << "." << endl; 1887 1914 1888 1915 return Intersection; … … 2938 2965 double getAngle(const Vector &point, const Vector &reference, const Vector OrthogonalVector) 2939 2966 { 2940 if (reference.Is Null())2967 if (reference.IsZero()) 2941 2968 return M_PI; 2942 2969 2943 2970 // calculate both angles and correct with in-plane vector 2944 if (point.Is Null())2971 if (point.IsZero()) 2945 2972 return M_PI; 2946 2973 double phi = point.Angle(&reference); -
src/tesselation.hpp
r093645 r0077b5 227 227 bool IsInnerPoint(ofstream *out, TesselPoint *Point, LinkedCell* LC); 228 228 bool AddBoundaryPoint(TesselPoint *Walker, int n); 229 230 // print for debugging 231 void PrintAllBoundaryPoints(ofstream *out); 232 void PrintAllBoundaryLines(ofstream *out); 233 void PrintAllBoundaryTriangles(ofstream *out); 234 229 235 230 236 PointMap PointsOnBoundary;
Note:
See TracChangeset
for help on using the changeset viewer.