[cig-commits] [commit] master: Fix mesher element resizing (944961a)
cig_noreply at geodynamics.org
cig_noreply at geodynamics.org
Mon Jan 5 10:55:33 PST 2015
Repository : https://github.com/geodynamics/vq
On branch : master
Link : https://github.com/geodynamics/vq/compare/a77e0124f38a909b20a374ec686149d65dbca5b1...f26b7fa26e56a9309aa9658f7441dfd63922dee6
>---------------------------------------------------------------
commit 944961a35160bffdb0b92e493d498c5e3490009e
Author: Eric Heien <emheien at ucdavis.edu>
Date: Fri Jan 2 11:36:00 2015 -0800
Fix mesher element resizing
>---------------------------------------------------------------
944961a35160bffdb0b92e493d498c5e3490009e
quakelib/src/QuakeLibIO.cpp | 34 ++++++++++++++++------------------
src/mesher.cpp | 1 +
2 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/quakelib/src/QuakeLibIO.cpp b/quakelib/src/QuakeLibIO.cpp
index fb3d1a5..93aeb60 100644
--- a/quakelib/src/QuakeLibIO.cpp
+++ b/quakelib/src/QuakeLibIO.cpp
@@ -474,20 +474,20 @@ void quakelib::ModelWorld::create_section(std::vector<unsigned int> &unused_trac
// Initially we don't know the appropriate element size to exactly mesh
// the trace points. This is solved by starting with the user suggested
- // element size and iteratively adjusting it until the mesh fits the
- // trace exactly. Iterate for 10 steps or until relative error is below 0.1%.
+ // element size and slowly shrinking it down to half the original element size until the mesh fits the
+ // trace exactly.
double cur_elem_size_guess = element_size;
- double overshoot = DBL_MAX, undershoot = DBL_MAX, t_per_meter=1;
- unsigned int num_iters = 0;
+ double step_size = element_size/(2*1000);
+ double best_step = element_size, best_t = 0;
+ unsigned int best_elem_count = 0;
- while ((fmin(overshoot, undershoot)/t_per_meter)/element_size > 1e-3 && num_iters < 10) {
+ while (cur_elem_size_guess > element_size/2.0) {
double cur_t, next_t, sum_t=0;
elem_count = 0;
cur_t = 0;
while (cur_t < 1) {
next_t = spline.advance_element(cur_t, cur_elem_size_guess);
-
if (next_t < 1) {
sum_t += next_t-cur_t;
elem_count++;
@@ -497,19 +497,16 @@ void quakelib::ModelWorld::create_section(std::vector<unsigned int> &unused_trac
}
}
- t_per_meter = (sum_t/elem_count)/cur_elem_size_guess;
- overshoot = fabs(1-next_t)/elem_count;
- undershoot = fabs(1-cur_t)/elem_count;
-
- // If we're undershooting by less than we're overshooting, the best solution is to increase block size
- if (undershoot < overshoot) cur_elem_size_guess += undershoot/t_per_meter;
- // Otherwise we decrease block size
- else cur_elem_size_guess -= overshoot/t_per_meter;
-
- num_iters++;
+ // Record which element size got us closest to the end of the trace
+ if (cur_t > best_t) {
+ best_t = cur_t;
+ best_step = cur_elem_size_guess;
+ best_elem_count = elem_count;
+ }
+ cur_elem_size_guess -= step_size;
}
- double horiz_elem_size = cur_elem_size_guess;
+ double horiz_elem_size = best_step;
double vert_elem_size;
unsigned int cur_elem_ind, next_elem_ind;
double cur_t = 0, next_t;
@@ -522,7 +519,7 @@ void quakelib::ModelWorld::create_section(std::vector<unsigned int> &unused_trac
cur_elem_ind = 0;
unused_trace_pts.erase(0);
- for (i=0; i<elem_count; ++i) {
+ for (i=0; i<best_elem_count; ++i) {
// Get the next t value along the trace by advancing the element size
next_t = spline.advance_element(cur_t, horiz_elem_size);
@@ -548,6 +545,7 @@ void quakelib::ModelWorld::create_section(std::vector<unsigned int> &unused_trac
num_vert_elems = round(elem_depth/element_size);
vert_elem_size = elem_depth / num_vert_elems;
+ // TODO: change this to an assertion throw
if (num_vert_elems == 0) std::cerr << "WARNING: Depth is smaller than element size in trace segment "
<< next_elem_ind << ". Element size may be too big." << std::endl;
diff --git a/src/mesher.cpp b/src/mesher.cpp
index 0ce4069..0f2064c 100644
--- a/src/mesher.cpp
+++ b/src/mesher.cpp
@@ -344,6 +344,7 @@ int main (int argc, char **argv) {
std::cout << "File " << names[0] << " " << files[0][n] << " with type " << types[0][n] << "... ";
unused_trace_segments.clear();
+ // TODO: change these to fail if file is not in expected format
if (types[0][n] == "text") {
res = new_world.read_file_ascii(files[0][n]);
} else if (types[0][n] == "hdf5") {
More information about the CIG-COMMITS
mailing list