[us-commits] r2737 - in trunk: programs/us_2dsa utils
svn at svn.aucsolutions.com
svn at svn.aucsolutions.com
Tue Apr 23 11:05:19 MDT 2019
Author: gegorbet
Date: 2019-04-23 17:05:18 +0000 (Tue, 23 Apr 2019)
New Revision: 2737
Modified:
trunk/programs/us_2dsa/us_analysis_control_2d.cpp
trunk/utils/us_math2.cpp
Log:
2dsa mods to grid_point,grid_repetitions logic for greater responsiveness to user-given parameters
Modified: trunk/programs/us_2dsa/us_analysis_control_2d.cpp
===================================================================
--- trunk/programs/us_2dsa/us_analysis_control_2d.cpp 2019-04-22 18:10:33 UTC (rev 2736)
+++ trunk/programs/us_2dsa/us_analysis_control_2d.cpp 2019-04-23 17:05:18 UTC (rev 2737)
@@ -771,20 +771,41 @@
// Reset memory estimate when grid steps, threads or repetitions changes
void US_AnalysisControl2D::grid_change()
{
- int nsteps = (int)ct_nstepss ->value(); // # steps s
- int nstepk = (int)ct_nstepsk ->value(); // # steps k
- int nthrd = (int)ct_thrdcnt ->value(); // # threads
- int nscan = edata->scanCount(); // # scans
- int nconc = edata->pointCount(); // # concentrations
- int ntconc = nconc * nscan; // # total readings
+ static int ksteps = 0;
+ static int kstepk = 0;
+ int nsteps = (int)ct_nstepss ->value(); // # steps s
+ int nstepk = (int)ct_nstepsk ->value(); // # steps k
+ int nthrd = (int)ct_thrdcnt ->value(); // # threads
+ int nscan = edata->scanCount(); // # scans
+ int nconc = edata->pointCount(); // # concentrations
+ int ntconc = nconc * nscan; // # total readings
double megas = sq( 1024.0 );
+ ksteps = ( ksteps == 0 ) ? nsteps : ksteps;
+ kstepk = ( kstepk == 0 ) ? nstepk : kstepk;
+// int jsteps = nsteps;
+// int jstepk = nstepk;
- int ngrrep = US_Math2::best_grid_reps( nsteps, nstepk );
+DbgLv(1) << "GC: 1) nss nsk" << nsteps << nstepk;
+ int ngrrep = US_Math2::best_grid_reps( nsteps, nstepk );
+DbgLv(1) << "GC: 2)ngrrep" << ngrrep << "nss nsk" << nsteps << nstepk;
+ if ( nsteps != ksteps )
+ { // S grid points just changed: adjust K points
+ nstepk = ( nstepk / ngrrep ) * ngrrep;
+ ngrrep = US_Math2::best_grid_reps( nsteps, nstepk );
+DbgLv(1) << "GC: 3)ngrrep" << ngrrep << "nss nsk" << nsteps << nstepk;
+ }
+ else if ( nstepk != kstepk )
+ { // K grid points just changed: adjust S points
+ nsteps = ( nsteps / ngrrep ) * ngrrep;
+ ngrrep = US_Math2::best_grid_reps( nsteps, nstepk );
+DbgLv(1) << "GC: 4)ngrrep" << ngrrep << "nss nsk" << nsteps << nstepk;
+ }
+
// Adjust grid points to be multiples of grid repetitions
- nsteps = ( ( nsteps + ngrrep - 1 ) / ngrrep ) * ngrrep;
- nstepk = ( ( nstepk + ngrrep - 1 ) / ngrrep ) * ngrrep;
-DbgLv(1) << "GC: ngrrep" << ngrrep << "nss nks" << nsteps << nstepk;
+ nsteps = ( ( nsteps + ngrrep / 2 ) / ngrrep ) * ngrrep;
+ nstepk = ( ( nstepk + ngrrep / 2 ) / ngrrep ) * ngrrep;
+DbgLv(1) << "GC: 5)ngrrep" << ngrrep << "nss nks" << nsteps << nstepk;
ct_nstepss->disconnect();
ct_nstepss->setValue( nsteps );
@@ -811,10 +832,10 @@
const double x_fact = 17.20;
const double y_fact = 2.28;
const int nxdata = 4;
- int nsstep = ( nsteps / ngrrep ) * ( nstepk / ngrrep );
+ int nsbpts = ( nsteps / ngrrep ) * ( nstepk / ngrrep );
int noif = ( ck_tinoise->isChecked() ? 1 : 0 ) +
( ck_rinoise->isChecked() ? 2 : 0 );
- int ndatas = nsstep + nxdata + noif;
+ int ndatas = nsbpts + nxdata + noif;
double mdata = ( (double)ntconc * ndatas * sizeof( double ) ) / megas;
double tdata = x_fact + mdata * y_fact;
memneed = baserss + qRound( tdata * (double)nthrd );
@@ -843,6 +864,10 @@
te_status ->setText( gmsg );
le_gridreps->setText( tr( "%1 -> %2 %3-point subgrids" )
.arg( ngrrep ).arg( nsubg ).arg( nspts ) );
+
+ // Save grid points to detect any further user resets
+ ksteps = nsteps;
+ kstepk = nstepk;
}
// Adjust s-limit ranges when s-limit value changes
Modified: trunk/utils/us_math2.cpp
===================================================================
--- trunk/utils/us_math2.cpp 2019-04-22 18:10:33 UTC (rev 2736)
+++ trunk/utils/us_math2.cpp 2019-04-23 17:05:18 UTC (rev 2737)
@@ -1460,15 +1460,64 @@
const int min_reps = 1; // Repetitions at least 1
const int max_reps = 160; // Repetitions at most 160
+qDebug() << "BGR: IN";
// Insure grid points are within reasonable limits
ngrid_s = qMin( max_grid, qMax( min_grid, ngrid_s ) );
ngrid_k = qMin( max_grid, qMax( min_grid, ngrid_k ) );
int ngrid_s_i = ngrid_s;
int ngrid_k_i = ngrid_k;
+qDebug() << "BGR: ngrid_s_i" << ngrid_s_i << "ngrid_k_i" << ngrid_k_i;
- // Compute the initial best grid-repetitions value
- int nreps_g = qRound( pow( (double)( ngrid_s * ngrid_k ), 0.25 ) );
+ // Build the list of repetition values that divide into s grid points
+ QList< int > reps;
+
+ for ( int jreps = min_reps; jreps <= max_reps; jreps++ )
+ {
+ int jgrid_s = ( ngrid_s / jreps ) * jreps;
+
+ if ( jgrid_s == ngrid_s )
+ { // Save a repetition that divides evenly into S grid points
+ reps << jreps;
+qDebug() << "BGR: jgrid_s" << jgrid_s << "jreps" << jreps;
+ }
+ }
+
+ // Find the repetitions and k grid points that work best
+ int kdiff = 99999;
+ int kreps = reps[ 0 ];
+ int kgrid_k = ngrid_k;
+
+ for ( int ii = 0; ii < reps.count(); ii++ )
+ {
+ int jreps = reps[ ii ];
+ int dim_s = ngrid_s / jreps;
+ int dim_k = ngrid_k / jreps;
+ int jgrid_k = dim_k * jreps;
+ int nsubgs = jreps * jreps;
+ int subgsz = dim_s * dim_k;
+ int jdiff = qAbs( nsubgs - subgsz );
+qDebug() << "BGR: ii" << ii << "jreps" << jreps << "jgrid_k" << jgrid_k;
+
+ if ( jdiff < kdiff )
+ { // Count and size of subgrid closely matched
+ kdiff = jdiff;
+ kreps = jreps;
+ kgrid_k = jgrid_k;
+qDebug() << "BGR: ii" << ii << "kdiff" << kdiff;
+ }
+ }
+
+ ngrid_k = kgrid_k;
+ int nreps_g = kreps;
+ int nsubg_s = ngrid_s / nreps_g;
+ int nsubg_k = ngrid_k / nreps_g;
+qDebug() << "BGR: ngrid_s" << ngrid_s << "ngrid_k ngrid_k_i" << ngrid_k << ngrid_k_i;
+qDebug() << "BGR: nsubgs" << (nreps_g*nreps_g) << "subgsz" << (nsubg_s*nsubg_k)
+ << "totgsz" << (ngrid_s*ngrid_k) << "nreps_g" << nreps_g;
+
+#if 0
double grfact = 1.0;
+qDebug() << "BGR: nreps_g" << nreps_g;
// If debug text modifies grid-rep factor, apply it
QStringList tgrfact = US_Settings::debug_text();
@@ -1478,26 +1527,23 @@
grfact = QString( tgrfact[ ii ]) .section( "=", 1, 1 ).toDouble();
}
nreps_g = qRound( grfact * nreps_g );
+qDebug() << "BGR: grfact" << grfact << "nreps_g" << nreps_g;
+#endif
- // Compute the initial sub-grid point counts in each dimension,
- // insuring the next highest integers are used.
- int nsubg_s = ( ngrid_s + nreps_g - 1 ) / nreps_g;
- int nsubg_k = ( ngrid_k + nreps_g - 1 ) / nreps_g;
-
// Adjust values until the product yields no more than 200 sub-grid points
- while ( ( nsubg_s * nsubg_k ) > max_subg && nreps_g < max_reps )
+ while ( ( nsubg_s * nsubg_k ) > max_subg || nreps_g < min_reps )
{ // Increase grid-reps and recompute sub-grid points
nreps_g++;
- nsubg_s = ( ngrid_s + nreps_g - 1 ) / nreps_g;
- nsubg_k = ( ngrid_k + nreps_g - 1 ) / nreps_g;
+ nsubg_s = ngrid_s / nreps_g;
+ nsubg_k = ngrid_k / nreps_g;
}
// Adjust values until the product yields no less than 40 sub-grid points
- while ( ( nsubg_s * nsubg_k ) < min_subg && nreps_g > min_reps )
+ while ( ( nsubg_s * nsubg_k ) < min_subg || nreps_g > max_reps )
{ // Decrease grid-reps and recompute sub-grid points
nreps_g--;
- nsubg_s = ( ngrid_s + nreps_g - 1 ) / nreps_g;
- nsubg_k = ( ngrid_k + nreps_g - 1 ) / nreps_g;
+ nsubg_s = ngrid_s / nreps_g;
+ nsubg_k = ngrid_k / nreps_g;
}
// Recalculate the total grid points in each dimension
@@ -1505,16 +1551,6 @@
ngrid_s = nsubg_s * nreps_g;
ngrid_k = nsubg_k * nreps_g;
- if ( ngrid_s < ngrid_s_i )
- { // If S grid points less than user-given, bump by grid reps
- ngrid_s += nreps_g;
- }
-
- if ( ngrid_k < ngrid_k_i )
- { // If K grid points less than user-given, bump by grid reps
- ngrid_k += nreps_g;
- }
-
// Return the computed number of grid repetitions
return nreps_g;
}
More information about the us-commits
mailing list