@@ -140,49 +140,51 @@ void rt::Btree::Build(Mesh& mesh, int levels)
140140 if (output) FSLogger::Write (" Splitting levels : %d\n " , levels);
141141 int m = 0 ;
142142 std::vector<rt::Btree::Block*> leaves;
143- # pragma omp parallel shared(leaves )
143+ if (ntriangles > 0 )
144144 {
145- // the the number of threads in this parallel region
146- int numThreads = omp_get_num_threads ();
147-
148- // only execute in parallel if it's worth it
149- if ((levels < 2 ) || (numThreads < 2 ))
150- {
151- // let's do it in serial
152- #pragma omp master
153- for (int i = 0 ; i < ntriangles; ++i)
154- {
155- rt::Tri& tri = mesh.triangle (i);
156- root->add (&tri, levels);
157- }
158- }
159- else
145+ #pragma omp parallel shared(leaves)
160146 {
161- // create initial split
162- #pragma omp single
163- {
164- m = (int )log2 (numThreads);
165- if (m > levels - 1 ) m = levels - 1 ;
166- int actualThreads = (int )pow (2 , m);
167- if (output) FSLogger::Write (" Using %d threads.\n " , actualThreads);
168- root->split (m);
169- leaves = rt::Btree::leaves ();
170- }
147+ // the the number of threads in this parallel region
148+ int numThreads = omp_get_num_threads ();
171149
172- // loop over all the triangles and sort them in the blocks
173- int threadId = omp_get_thread_num ();
174- if ((threadId >= 0 ) && (threadId < (int )leaves.size ()))
150+ // only execute in parallel if it's worth it
151+ if ((levels < 2 ) || (numThreads < 2 ))
175152 {
153+ // let's do it in serial
154+ #pragma omp master
176155 for (int i = 0 ; i < ntriangles; ++i)
177156 {
178157 rt::Tri& tri = mesh.triangle (i);
179- if (intersectBox (leaves[threadId]->box , tri))
180- leaves[threadId]->add (&tri, levels - m);
158+ root->add (&tri, levels);
159+ }
160+ }
161+ else
162+ {
163+ // create initial split
164+ #pragma omp single
165+ {
166+ m = (int )log2 (numThreads);
167+ if (m > levels - 1 ) m = levels - 1 ;
168+ int actualThreads = (int )pow (2 , m);
169+ if (output) FSLogger::Write (" Using %d threads.\n " , actualThreads);
170+ root->split (m);
171+ leaves = rt::Btree::leaves ();
172+ }
173+
174+ // loop over all the triangles and sort them in the blocks
175+ int threadId = omp_get_thread_num ();
176+ if ((threadId >= 0 ) && (threadId < (int )leaves.size ()))
177+ {
178+ for (int i = 0 ; i < ntriangles; ++i)
179+ {
180+ rt::Tri& tri = mesh.triangle (i);
181+ if (intersectBox (leaves[threadId]->box , tri))
182+ leaves[threadId]->add (&tri, levels - m);
183+ }
181184 }
182185 }
183186 }
184187 }
185-
186188 int nrblocks = (int )blocks ();
187189 if (output) FSLogger::Write (" Nr. of blocks : %d\n " , nrblocks);
188190 if (output) FSLogger::Write (" Nr. of triangles in BTree : %d\n " , (int )root->size ());
0 commit comments