771{
772 typedef bg::model::point<NekDouble, 3, bg::cs::cartesian> BPoint;
773 typedef std::pair<BPoint, unsigned int> PointPair;
774
775 int i, j, n;
776 int nelmt;
777 int niso = iso.size();
778 int id1, id2;
779 Array<OneD, Array<OneD, int>> vidmap;
780
782 {
783 return;
784 }
786
787 vidmap = Array<OneD, Array<OneD, int>>(niso);
788
790 for (i = 0; i < niso; ++i)
791 {
793 {
795 }
796 }
797
799
801 for (i = 0; i < niso; ++i)
802 {
804 {
806 }
807 }
808
809 vector<vector<int>> isocon;
810 isocon.resize(niso);
811 vector<int> global_to_unique_map;
812 global_to_unique_map.resize(
m_nvert);
813
814 vector<pair<int, int>> global_to_iso_map;
815 global_to_iso_map.resize(
m_nvert);
816
817
818 id2 = 0;
819 std::vector<PointPair> inPoints;
820 for (i = 0; i < niso; ++i)
821 {
822 for (id1 = 0; id1 < iso[i]->m_nvert; ++id1)
823 {
824 inPoints.push_back(PointPair(
825 BPoint(iso[i]->
m_x[id1], iso[i]->
m_y[id1], iso[i]->
m_z[id1]),
826 id2));
827 global_to_unique_map[id2] = id2;
828 global_to_iso_map[id2] = make_pair(i, id1);
829 id2++;
830 }
831 }
832
833 if (verbose)
834 {
835 cout << "\t Process building tree ..." << endl;
836 }
837
838
839 bgi::rtree<PointPair, bgi::rstar<16>> rtree;
840 rtree.insert(inPoints.begin(), inPoints.end());
841
842
843 int unique_index = 0;
844 int prog = 0;
846 {
847 if (verbose)
848 {
850 prog);
851 }
852
853 BPoint queryPoint = inPoints[i].first;
854
855
856
857 if (global_to_unique_map[i] < unique_index)
858 {
859 }
860 else
861 {
862
863 std::vector<PointPair> result;
864 rtree.query(bgi::nearest(queryPoint, 10),
865 std::back_inserter(result));
866
867
868 set<int> samept;
869 int new_index = -1;
870 for (id1 = 0; id1 < result.size(); ++id1)
871 {
872 NekDouble dist = bg::distance(queryPoint, result[id1].first);
874 {
875 id2 = result[id1].second;
876 samept.insert(id2);
877
878 if (global_to_unique_map[id2] < unique_index)
879 {
880 new_index = global_to_unique_map[id2];
881 }
882 }
883 }
884 if (new_index == -1)
885 {
886 new_index = unique_index;
887 unique_index++;
888 }
889
890
891 global_to_unique_map[i] = new_index;
892 for (auto &it : samept)
893 {
894 global_to_unique_map[it] = new_index;
895 }
896 }
897 }
898
899 if (verbose)
900 {
901 cout << endl;
902 }
903
905
906 nelmt = 0;
907
908 int cnt = 0;
909 for (n = 0; n < niso; ++n)
910 {
911 for (i = 0; i < iso[n]->m_ntris; ++i, nelmt++)
912 {
913 for (j = 0; j < 3; ++j)
914 {
915 m_vid[3 * nelmt + j] =
916 global_to_unique_map[iso[n]->m_vid[3 * i + j] + cnt];
917 }
918 }
919 cnt += iso[n]->m_nvert;
920 }
921
923
927
929 for (i = 0; i < iso[0]->m_fields.size(); ++i)
930 {
932 }
933
934 for (n = 0; n < global_to_unique_map.size(); ++n)
935 {
936
937 m_x[global_to_unique_map[n]] = bg::get<0>(inPoints[n].first);
938 m_y[global_to_unique_map[n]] = bg::get<1>(inPoints[n].first);
939 m_z[global_to_unique_map[n]] = bg::get<2>(inPoints[n].first);
940
941 int isoid = global_to_iso_map[n].first;
942 int ptid = global_to_iso_map[n].second;
943 for (j = 0; j <
m_fields.size(); ++j)
944 {
945 m_fields[j][global_to_unique_map[n]] =
946 iso[isoid]->m_fields[j][ptid];
947 }
948 }
949}
int PrintProgressbar(const int position, const int goal, const std::string message, int lastprogress=-1)
Prints a progressbar.
static const NekDouble kNekZeroTol