[us-commits] r2739 - in trunk: programs/us_fematch programs/us_mpi_analysis utils

svn at svn.aucsolutions.com svn at svn.aucsolutions.com
Wed Apr 24 13:57:08 MDT 2019


Author: gegorbet
Date: 2019-04-24 19:57:07 +0000 (Wed, 24 Apr 2019)
New Revision: 2739

Modified:
   trunk/programs/us_fematch/us_fematch.cpp
   trunk/programs/us_mpi_analysis/2dsa_master.cpp
   trunk/programs/us_mpi_analysis/2dsa_worker.cpp
   trunk/programs/us_mpi_analysis/us_mpi_analysis.cpp
   trunk/programs/us_mpi_analysis/us_mpi_analysis.h
   trunk/utils/us_astfem_rsa.cpp
Log:
mods to backend mpi_analysis to do fit-bottom and fit-meniscus+bottom

Modified: trunk/programs/us_fematch/us_fematch.cpp
===================================================================
--- trunk/programs/us_fematch/us_fematch.cpp	2019-04-24 06:11:54 UTC (rev 2738)
+++ trunk/programs/us_fematch/us_fematch.cpp	2019-04-24 19:57:07 UTC (rev 2739)
@@ -2087,7 +2087,8 @@
    simparams.radial_resolution = (double)( radhi - radlo ) / ( nconc - 1 );
 //   simparams.bottom            = simparams.bottom_position;
 DbgLv(1) << "SimMdl: simpoints" << simparams.simpoints
- << "rreso" << simparams.radial_resolution;
+ << "rreso" << simparams.radial_resolution
+ << "bottom_sim" << simparams.bottom << "bottom_dat" << edata->bottom;
    //simparams.meniscus          = 5.8;
 
    //sdata.scanData.resize( total_scans );

Modified: trunk/programs/us_mpi_analysis/2dsa_master.cpp
===================================================================
--- trunk/programs/us_mpi_analysis/2dsa_master.cpp	2019-04-24 06:11:54 UTC (rev 2738)
+++ trunk/programs/us_mpi_analysis/2dsa_master.cpp	2019-04-24 19:57:07 UTC (rev 2739)
@@ -22,12 +22,39 @@
    if ( mc_iterations > 1 )
       max_iterations   = max_iters_all > 1 ? max_iters_all : 5;
 
+   menibott_ndx        = 0;
+   meniscus_run        = 0;
+   bottom_run          = 0;
+   if ( fit_mb_select == 0 )
+   {
+      menibott_count      = 1;
+      meniscus_points     = 1;
+      bottom_points       = 1;
+   }
+   else if ( fit_menbot )
+   {
+      menibott_count      = meniscus_points * bottom_points;
+   }
+   else if ( fit_meni )
+   {
+      menibott_count      = meniscus_points;
+      bottom_points       = 1;
+   }
+   else if ( fit_bott )
+   {
+      menibott_count      = bottom_points;
+      meniscus_points     = 1;
+   }
+
    while ( true )
    {
       int worker;
-      meniscus_value   = meniscus_values.size() == 1 ?
-                         data_sets[ current_dataset ]->run_data.meniscus :
-                         meniscus_values[ meniscus_run ];
+      meniscus_value       = ( meniscus_points == 1 )
+                           ? data_sets[ current_dataset ]->run_data.meniscus
+                           : meniscus_values[ meniscus_run ];
+      bottom_value       = ( bottom_points == 1 )
+                           ? data_sets[ current_dataset ]->run_data.bottom
+                           : bottom_values  [ bottom_run   ];
 //if ( max_depth > 1 )
 // DbgLv(1) << " master loop-TOP:  jq-empty?" << job_queue.isEmpty() << "   areReady?" << worker_status.contains(READY)
 //    << "  areWorking?" << worker_status.contains(WORKING);
@@ -64,11 +91,23 @@
             progress     += "; MonteCarlo: "
                             + QString::number( mc_iteration + 1 );
 
-         else if ( meniscus_values.size() > 1 )
+         else if ( fit_menbot )
             progress     += "; Meniscus: "
-               + QString::number( meniscus_value, 'f', 3 )
+               + QString::number( meniscus_value, 'f', 4 )
+               + "; Bottom: "
+               + QString::number( bottom_value,   'f', 4 )
+               + QString().sprintf( "  ( m%2d b%2d )",
+                    ( meniscus_run + 1 ), ( bottom_run + 1 ) );
+         else if ( fit_meni )
+            progress     += "; Meniscus: "
+               + QString::number( meniscus_value, 'f', 4 )
                + tr( " (%1 of %2)" ).arg( meniscus_run + 1 )
-                                    .arg( meniscus_values.size() );
+                                    .arg( meniscus_points );
+         else if ( fit_bott )
+            progress     += "; Bottom: "
+               + QString::number( bottom_value,   'f', 4 )
+               + tr( " (%1 of %2)" ).arg( bottom_run + 1 )
+                                    .arg( bottom_points );
          else
             progress     += "; RMSD: "
                + QString::number( sqrt( simulation_values.variance ) );
@@ -121,7 +160,7 @@
             write_output();
 
          // Fit meniscus
-         if ( ( meniscus_run + 1 ) < meniscus_values.size() )
+         if ( ( menibott_ndx + 1 ) < menibott_count )
          {
             set_meniscus();
          }
@@ -178,27 +217,39 @@
 DbgLv(1) << " master loop-BOT:    cds kds" << current_dataset << count_datasets;
             if ( current_dataset < count_datasets )
             {
+               menibott_ndx    = 0;
                meniscus_run    = 0;
+               bottom_run      = 0;
                iterations      = 1;
                mc_iteration    = 0;
 
-               if ( meniscus_points > 1 )
-               {  // Reset the range of fit-meniscus points for this data set
+               if ( menibott_count > 1 )
+               {  // Reset the range of fit-meniscus/bottom points for this data set
                   US_DataIO::EditedData* edata
                                   = &data_sets[ current_dataset ]->run_data;
-                  double men_str  = edata->meniscus - meniscus_range / 2.0;
-                  double men_inc  = meniscus_range / ( meniscus_points - 1.0 );
                   double dat_str  = edata->radius( 0 );
+                  double men_dpt  = ( meniscus_points > 1 ) ?
+                                    (double)( meniscus_points - 1 ) : 1;
+                  double bot_dpt  = ( bottom_points > 1 ) ?
+                                    (double)( bottom_points   - 1 ) : 1;
+                  double men_str  = edata->meniscus - ( meniscus_range * 0.5 );
+                  double bot_str  = edata->bottom   - ( bottom_range   * 0.5 );
+                  double men_inc  = meniscus_range / men_dpt;
+                  double bot_inc  = bottom_range   / bot_dpt;
                   double men_end  = men_str + meniscus_range - men_inc;
                   if ( men_end >= dat_str )
                   {  // Adjust first meniscus so range remains below data range
-                     men_end         = dat_str - men_inc / 2.0;
+                     men_end         = dat_str - ( men_inc * 0.5 );
                      men_str         = men_end - meniscus_range + men_inc;
                   }
                   for ( int ii = 0; ii < meniscus_points; ii++ )
                      meniscus_values[ ii ] = men_str + men_inc * ii;
-DbgLv(1) << " master loop-BOT:     menpt" << meniscus_points << "mv0 mvn"
+                  for ( int ii = 0; ii < bottom_points; ii++ )
+                     bottom_values[ ii ]   = bot_str + bot_inc * ii;
+DbgLv(0) << " master loop-BOT:     menpt" << meniscus_points << "mv0 mvn"
  << meniscus_values[0] << meniscus_values[meniscus_points-1]
+ << "botpt" << bottom_points << "bv0 bvn"
+ << bottom_values[0] << bottom_values[bottom_points-1]
  << "gcores_count" << gcores_count;
                }
 
@@ -267,10 +318,10 @@
 {
    calculated_solutes.clear();
    orig_solutes.clear();
-   simulation_values.noisflag    = parameters[ "tinoise_option" ].toInt() > 0 ?
-                                   1 : 0;
-   simulation_values.noisflag   += parameters[ "rinoise_option" ].toInt() > 0 ?
-                                   2 : 0;
+   simulation_values.noisflag    = ( parameters[ "tinoise_option" ].toInt() > 0 ?
+                                     1 : 0 )
+                                 + ( parameters[ "rinoise_option" ].toInt() > 0 ?
+                                     2 : 0 );
    simulation_values.dbg_level   = dbg_level;
    simulation_values.dbg_timing  = dbg_timing;
 DbgLv(0) << "DEBUG_LEVEL" << simulation_values.dbg_level;
@@ -305,7 +356,6 @@
 
       int    nsstep   = (int)( s_pts );
       int    nkstep   = (int)( ff0_pts );
-      //grid_reps       = US_Math2::best_grid_reps( nsstep, nkstep );
 
 DbgLv(0) << "InSol: nss nks" << s_pts << ff0_pts << nsstep << nkstep << "grid_reps" << grid_reps;
       US_Solute::init_solutes( s_min,   s_max,   nsstep,
@@ -535,8 +585,30 @@
 // Reset for a fit-meniscus iteration
 void US_MPI_Analysis::set_meniscus( void )
 {
-   meniscus_run++;
+   menibott_ndx++;
 
+   if ( fit_menbot )
+   {
+      meniscus_run   = menibott_ndx / meniscus_points;
+      bottom_run     = menibott_ndx % meniscus_points;
+   }
+   else if ( fit_meni )
+   {
+      meniscus_run   = menibott_ndx;
+   }
+   else if ( fit_bott )
+   {
+      bottom_run     = menibott_ndx;
+   }
+   else
+   {
+DbgLv(0) << "FMB:set_meniscus: HUH????: mb m b:"
+ << fit_menbot << fit_meni << fit_bott;
+   }
+DbgLv(0) << "FMB:set_meniscus:  mb_ndx men_run bot_run"
+ << menibott_ndx << meniscus_run << bottom_run << "mb m b mbc"
+ << fit_menbot << fit_meni << fit_bott << menibott_count;
+
    // We incremented meniscus_run above.  Just rerun from the beginning.
    for ( int i = 0; i < orig_solutes.size(); i++ )
    {
@@ -823,6 +895,7 @@
    job.mpi_job.dataset_offset = current_dataset;
    job.mpi_job.dataset_count  = datasets_to_process;
    job.mpi_job.meniscus_value = meniscus_value;
+   job.mpi_job.bottom_value   = bottom_value;
    max_experiment_size        = min_experiment_size;
 
    QVector< US_Solute > prev_solutes = simulation_values.solutes;
@@ -863,6 +936,7 @@
    job.mpi_job.command        = MPI_Job::PROCESS;
    job.mpi_job.length         = job.solutes.size();
    job.mpi_job.meniscus_value = meniscus_value;
+   job.mpi_job.bottom_value   = bottom_value;
    job.mpi_job.solution       = mc_iteration;
    job.mpi_job.dataset_offset = current_dataset;
    job.mpi_job.dataset_count  = datasets_to_process;
@@ -1135,9 +1209,12 @@
       Sa_Job job;
       job.solutes          = calculated_solutes[ depth ];
       job.mpi_job.depth    = next_depth;
-      meniscus_value       = ( meniscus_values.size() == 1 )
+      meniscus_value       = ( meniscus_points == 1 )
                            ? data_sets[ current_dataset ]->run_data.meniscus
                            : meniscus_values[ meniscus_run ];
+      bottom_value         = ( bottom_points == 1 )
+                           ? data_sets[ current_dataset ]->run_data.bottom
+                           : bottom_values  [ bottom_run   ];
       qSort( job.solutes );
 DbgLv(1) << "Mast:   queue LAST ns=" << job.solutes.size() << "  d=" << depth+1
  << max_depth << "  nsvs=" << simulation_values.solutes.size();

Modified: trunk/programs/us_mpi_analysis/2dsa_worker.cpp
===================================================================
--- trunk/programs/us_mpi_analysis/2dsa_worker.cpp	2019-04-24 06:11:54 UTC (rev 2738)
+++ trunk/programs/us_mpi_analysis/2dsa_worker.cpp	2019-04-24 19:57:07 UTC (rev 2739)
@@ -38,13 +38,18 @@
  << "command" << job.command;
 
       meniscus_value     = job.meniscus_value;
+      bottom_value       = job.bottom_value;
       int offset         = job.dataset_offset;
       int dataset_count  = job.dataset_count;
       int job_length     = job.length;
+      int noisflag       = ( parameters[ "tinoise_option" ].toInt() > 0 ?  1 : 0 )
+                         + ( parameters[ "rinoise_option" ].toInt() > 0 ?  2 : 0 );
 DbgLv(1) << "w:" << my_rank << ": offs cnt" << offset << dataset_count;
 
       data_sets[ offset ]->run_data.meniscus  = meniscus_value;
+      data_sets[ offset ]->run_data.bottom    = bottom_value;
       data_sets[ offset ]->simparams.meniscus = meniscus_value;
+      data_sets[ offset ]->simparams.bottom   = bottom_value;
 
       switch( job.command )
       {
@@ -52,10 +57,7 @@
          case MPI_Job::PROCESS:  // Process solutes
             {
                US_SolveSim::Simulation simulation_values;
-               simulation_values.noisflag    =
-                  parameters[ "tinoise_option" ].toInt() > 0 ?  1 : 0;
-               simulation_values.noisflag   +=
-                  parameters[ "rinoise_option" ].toInt() > 0 ?  2 : 0;
+               simulation_values.noisflag    = noisflag;
                simulation_values.dbg_level   = dbg_level;
                simulation_values.dbg_timing  = dbg_timing;
 
@@ -80,10 +82,11 @@
  int nn = simulation_values.solutes.size() - 1;
  int mm = nn/2;
  DbgLv(1) << "w:" << my_rank << ": offs dscnt" << offset << dataset_count
-  << "vbar s20wc bott"
+  << "vbar s20wc cpbott dabott"
   << data_sets[offset]->vbar20
   << data_sets[offset]->s20w_correction
-  << data_sets[offset]->centerpiece_bottom;
+  << data_sets[offset]->centerpiece_bottom
+  << data_sets[offset]->run_data.bottom;
  DbgLv(1) << "w:" << my_rank << ": sol0 solm soln"
   << simulation_values.solutes[0].s << simulation_values.solutes[0].k
   << simulation_values.solutes[mm].s << simulation_values.solutes[mm].k

Modified: trunk/programs/us_mpi_analysis/us_mpi_analysis.cpp
===================================================================
--- trunk/programs/us_mpi_analysis/us_mpi_analysis.cpp	2019-04-24 06:11:54 UTC (rev 2738)
+++ trunk/programs/us_mpi_analysis/us_mpi_analysis.cpp	2019-04-24 19:57:07 UTC (rev 2739)
@@ -302,11 +302,53 @@
    mc_iterations   = parameters[ "mc_iterations" ].toInt();
    mc_iterations   = qMax( mc_iterations, 1 );
 
+   // Set Fit-Meniscus/Bottom parameters
+   fit_mb_select   = parameters[ "fit_mb_select"   ].toInt();
    meniscus_range  = parameters[ "meniscus_range"  ].toDouble();
    meniscus_points = parameters[ "meniscus_points" ].toInt();
-   meniscus_points = qMax( meniscus_points, 1 );
-   meniscus_range  = ( meniscus_points > 1 ) ? meniscus_range : 0.0;
+   fit_mb_select   = ( meniscus_points > 1 ) ? fit_mb_select : 0;
+   fit_meni        = ( ( fit_mb_select & 1 ) != 0 );
+   fit_bott        = ( ( fit_mb_select & 2 ) != 0 );
+   fit_menbot      = ( fit_meni  &&  fit_bott );
+if (my_rank==0) {
+DbgLv(0) << "FMB: fit_mb_select" << fit_mb_select
+ << "    fit_meni _bott _menbot" << fit_meni << fit_bott << fit_menbot; }
 
+   if ( fit_menbot )
+   {  // Meniscus-and-bottom fit iterations will be run
+      bottom_range    = meniscus_range;
+      bottom_points   = meniscus_points;
+      menibott_count  = meniscus_points * bottom_points;
+   }
+
+   else if ( fit_meni )
+   {  // Meniscus-only fit iterations will be run
+      bottom_range    = 0.0;
+      bottom_points   = 1;
+      menibott_count  = meniscus_points;
+   }
+
+   else if ( fit_bott )
+   {  // Bottom-only fit iterations will be run
+      bottom_range    = meniscus_range;
+      bottom_points   = meniscus_points;
+      meniscus_range  = 0.0;
+      meniscus_points = 1;
+      menibott_count  = bottom_points;
+   }
+
+   else
+   {  // No meniscus/bottom fit
+      meniscus_range  = 0.0;
+      meniscus_points = 1;
+      bottom_range    = 0.0;
+      bottom_points   = 1;
+      menibott_count  = 1;
+   }
+if (my_rank==0) {
+DbgLv(0) << "FMB: meni range points" << meniscus_range << meniscus_points
+ << "  bott range points" << bottom_range << bottom_points; }
+
    // Do some parameter checking
    count_datasets     = data_sets.size();
    is_global_fit      = US_Util::bool_flag( parameters[ "global_fit" ] );
@@ -379,17 +421,20 @@
    double meniscus_start = data_sets[ 0 ]->run_data.meniscus 
                          - meniscus_range / 2.0;
    
-   double dm             = ( meniscus_points > 1 )
-                         ? meniscus_range / ( meniscus_points - 1 ): 0.0;
+   double dmen           = fit_meni ?
+                           ( meniscus_range / ( meniscus_points - 1 ) ) :
+                           0.0;
 
-   for ( int i = 0; i < meniscus_points; i++ )
+   for ( int ii = 0; ii < meniscus_points; ii++ )
    {
-      meniscus_values[ i ]  = meniscus_start + dm * i;
+      meniscus_values[ ii ]  = meniscus_start + dmen * ii;
    }
 
    // Get lower limit of data and last (largest) meniscus value
    double start_range    = data_sets[ 0 ]->run_data.radius( 0 );
    double last_meniscus  = meniscus_values[ meniscus_points - 1 ];
+if (my_rank==0) {
+ DbgLv(0) << "FMB: meniscus:  start delta" << meniscus_start << dmen; }
 
    if ( last_meniscus >= start_range )
    {
@@ -400,13 +445,30 @@
          qDebug() << " meniscus_start" << meniscus_start;
          qDebug() << " meniscus_range" << meniscus_range;
          qDebug() << " meniscus_points" << meniscus_points;
-         qDebug() << " dm" << dm;
+         qDebug() << " meniscus delta" << dmen;
          qDebug() << " last_meniscus" << last_meniscus;
          qDebug() << " left_data" << start_range;
       }
       abort( "Meniscus value extends into data" );
    }
 
+   // Calculate bottom values
+   bottom_values.resize( bottom_points );
+
+   double bottom_start = data_sets[ 0 ]->run_data.bottom 
+                         - bottom_range / 2.0;
+   
+   double dbot         = fit_bott ?
+                         ( bottom_range / ( bottom_points - 1 ) ) :
+                         0.0;
+
+   for ( int ii = 0; ii < bottom_points; ii++ )
+   {
+      bottom_values[ ii ]  = bottom_start + dbot * ii;
+   }
+if (my_rank==0) {
+ DbgLv(0) << "FMB: bottom:  start delta" << bottom_start << dbot; }
+
    population              = parameters[ "population"     ].toInt();
    generations             = parameters[ "generations"    ].toInt();
    crossover               = parameters[ "crossover"      ].toInt();
@@ -691,6 +753,7 @@
 DbgLv(0) << "rank" << my_rank << ": ee" << ee << "tmst_file" << ds->tmst_file
  << "ssp count" << ds->simparams.sim_speed_prof.count();
 
+#if 0
       // If EditedData has a bottom, use that to adjust bottom_position
       US_DataIO::EditedData* edata = &ds->run_data;
 
@@ -713,6 +776,7 @@
   << "adj.bottom_pos" << ds->simparams.bottom_position;
          }
       }
+#endif
    }  // END: datasets loop to upload timestate
 //DbgLv(0) << "rank" << my_rank << ": simSpeed :TM:" << ELAPSED_SECS;
 //   }
@@ -890,7 +954,9 @@
       parameters[ "p_mutate_sk"  ] = "20";
 
    count_calc_residuals = 0;   // Internal instrumentation
+   menibott_ndx         = 0;
    meniscus_run         = 0;
+   bottom_run           = 0;
    mc_iteration         = 0;
 
    // Determine masters-group count and related controls
@@ -1424,6 +1490,7 @@
    US_SolveSim::Simulation sim = simulation_values;
 
    double save_meniscus = meniscus_value;
+   double save_bottom   = bottom_value;
    US_Model::AnalysisType mdl_type = model_type( analysis_type );
    int mxdssz   = -1;
 
@@ -1494,6 +1561,8 @@
 DbgLv(1) << "WrO: meniscus_run" << meniscus_run << "mvsz" << meniscus_values.size();
    meniscus_value  = meniscus_run < meniscus_values.size() 
                      ? meniscus_values[ meniscus_run ] : save_meniscus;
+   bottom_value    = bottom_run < bottom_values.size() 
+                     ? bottom_values[ bottom_run ] : save_bottom;
 
    if ( mdl_type == US_Model::PCSA )
    {
@@ -1510,6 +1579,7 @@
 DbgLv(1) << "WrO: wr_model  mdl_type" << mdl_type;
    write_model( sim, mdl_type );
    meniscus_value  = save_meniscus;
+   bottom_value    = save_bottom;
 
 DbgLv(1) << "WrO: wr_noise";
    if (  parameters[ "tinoise_option" ].toInt() > 0 )
@@ -1924,9 +1994,12 @@
    model.analysis    = type;
    QString runID     = edata->runID;
 
-   if ( meniscus_points > 1 ) 
+   if ( fit_meni )
       model.global      = US_Model::MENISCUS;
 
+   else if ( fit_bott )
+      model.global      = US_Model::BOTTOM;
+
    else if ( is_global_fit )
    {
       model.global      = US_Model::GLOBAL;
@@ -1937,9 +2010,11 @@
 
    else
       model.global      = US_Model::NONE; 
-DbgLv(1) << "wrMo:  is_glob glob_sols" << is_global_fit << glob_sols;
+DbgLv(0) << "wrMo:  is_glob glob_sols" << is_global_fit << glob_sols
+ << "f_men f_bot" << fit_meni << fit_bott << "m.glob" << model.global;
 
    model.meniscus    = meniscus_value;
+   model.bottom      = fit_bott ? bottom_value : 0.0;
    model.variance    = sim.variance;
 
    // demo1_veloc. 1A999. e201101171200_a201101171400_2DSA us3-0000003           .model
@@ -1962,10 +2037,19 @@
 
    if ( mc_iterations > 1 )
       iterID.sprintf( "mc%04d", mc_iter );
-   else if (  meniscus_points > 1 )
+   else if ( fit_menbot )
+      iterID.sprintf( "i%02d-m%05db%05d", 
+              menibott_ndx + 1,
+              (int)( meniscus_value * 10000 ),
+              (int)( bottom_value * 10000 ) );
+   else if (  fit_meni )
       iterID.sprintf( "i%02d-m%05d", 
               meniscus_run + 1,
-              (int)(meniscus_value * 10000 ) );
+              (int)( meniscus_value * 10000 ) );
+   else if (  fit_bott )
+      iterID.sprintf( "i%02d-b%05d", 
+              bottom_run + 1,
+              (int)( bottom_value * 10000 ) );
    else
       iterID = "i01";
 
@@ -1980,7 +2064,7 @@
    double  vbar20    = data_sets[ current_dataset ]->vbar20;
 
    model.description = runID + "." + tripleID + "." + analyID + ".model";
-DbgLv(1) << "wrMo: model descr" << model.description;
+DbgLv(0) << "wrMo: model descr" << model.description;
 
    // Save as class variable for later reference
    modelGUID         = model.modelGUID;
@@ -2054,8 +2138,8 @@
 
    int run     = 1;
 
-   if ( meniscus_run > 0 ) 
-       run        = meniscus_run + 1;
+   if ( menibott_ndx > 0 ) 
+       run        = menibott_ndx + 1;
    else if ( mc_iterations > 0 )
        run        = mc_iter;
 
@@ -2065,6 +2149,7 @@
                << ";MC_iteration="   << mc_iter
                << ";variance="       << sim.variance
                << ";run="            << runstring
+               << ";bottom_value="   << bottom_value
                << "\n";
    fileo.close();
 }
@@ -2118,9 +2203,19 @@
    if ( mc_iterations > 1 )           // MonteCarlo iteration
       iterID.sprintf( "mc%04d", mc_iteration + 1 );
 
-   else if (  meniscus_points > 1 )   // Fit meniscus
-      iterID.sprintf( "i%02d-m%05d", meniscus_run + 1,
-              (int)(meniscus_values[ meniscus_run ] * 10000 ) );
+   else if ( fit_menbot )             // Meniscus+Bottom fit
+      iterID.sprintf( "i%02d-m%05db%05d", 
+              menibott_ndx + 1,
+              (int)( meniscus_value * 10000 ),
+              (int)( bottom_value * 10000 ) );
+   else if (  fit_meni )              // Meniscus fit
+      iterID.sprintf( "i%02d-m%05d", 
+              meniscus_run + 1,
+              (int)( meniscus_value * 10000 ) );
+   else if (  fit_bott )              // Bottom fit
+      iterID.sprintf( "i%02d-b%05d", 
+              bottom_run + 1,
+              (int)( bottom_value * 10000 ) );
 
    else                               // Non-iterative single
       iterID = "i01";
@@ -2402,10 +2497,19 @@
 
    if ( mc_iterations > 1 )
       iterID.sprintf( "mc%04d", mc_iter );
-   else if (  meniscus_points > 1 )
+   else if ( fit_menbot )
+      iterID.sprintf( "i%02d-m%05db%05d", 
+              menibott_ndx + 1,
+              (int)( meniscus_value * 10000 ),
+              (int)( bottom_value * 10000 ) );
+   else if (  fit_meni )
       iterID.sprintf( "i%02d-m%05d", 
               meniscus_run + 1,
-              (int)(meniscus_value * 10000 ) );
+              (int)( meniscus_value * 10000 ) );
+   else if (  fit_bott )
+      iterID.sprintf( "i%02d-b%05d", 
+              bottom_run + 1,
+              (int)( bottom_value * 10000 ) );
    else
       iterID = "i01";
 
@@ -2489,8 +2593,8 @@
 
    int run     = 1;
 
-   if ( meniscus_run > 0 ) 
-       run        = meniscus_run + 1;
+   if ( menibott_ndx > 0 ) 
+       run        = menibott_ndx + 1;
    else if ( mc_iterations > 0 )
        run        = mc_iter;
 
@@ -2500,6 +2604,7 @@
                << ";MC_iteration="   << mc_iter
                << ";variance="       << sim.variance
                << ";run="            << runstring
+               << ";bottom_value="   << bottom_value
                << "\n";
    fileo.close();
 }

Modified: trunk/programs/us_mpi_analysis/us_mpi_analysis.h
===================================================================
--- trunk/programs/us_mpi_analysis/us_mpi_analysis.h	2019-04-24 06:11:54 UTC (rev 2738)
+++ trunk/programs/us_mpi_analysis/us_mpi_analysis.h	2019-04-24 19:57:07 UTC (rev 2739)
@@ -95,17 +95,8 @@
     QList< int >        ds_points;
     QVector< double >   gl_nnls_a;
     QVector< double >   gl_nnls_b;
-    int                 max_depth;
-    int                 worknext;
-    enum                WorkerStatus { INIT, READY, WORKING };
-    enum                PMGTag { ADATESIZE=1000, ADATE, STARTITER, STARTLAST,
-                                 UDPSIZE, UDPMSG, DONEITER, DONELAST };
-                        
-    int                 meniscus_points;
-    int                 meniscus_run;
-    double              meniscus_range;   // Only used by master
-    double              meniscus_value;   // Only used by worker
     QVector< double >   meniscus_values;
+    QVector< double >   bottom_values;
 
     QVector< double >   concentrations;
     QVector< double >   maxods;
@@ -113,6 +104,30 @@
     QVector< double >   sigmas;
     QVector< long >     work_rss;
 
+    double              meniscus_range;   // Only used by master
+    double              meniscus_value;   // Only used by worker
+    double              bottom_range;     // Only used by master
+    double              bottom_value;     // Only used by worker
+
+    int                 max_depth;
+    int                 worknext;
+    int                 fit_mb_select;    // Fit meniscus/bottom selection (0-3)
+    int                 menibott_ndx;
+    int                 meniscus_run;
+    int                 bottom_run;
+    int                 menibott_count;
+    int                 meniscus_points;
+    int                 bottom_points;
+    int                 set_count;
+
+    enum                WorkerStatus { INIT, READY, WORKING };
+    enum                PMGTag { ADATESIZE=1000, ADATE, STARTITER, STARTLAST,
+                                 UDPSIZE, UDPMSG, DONEITER, DONELAST };
+
+    bool                fit_meni;         // Fit-meniscus flag
+    bool                fit_bott;         // Fit-bottom flag
+    bool                fit_menbot;       // Fit-meniscus+bottom flag
+
     US_DataIO::RawData* res_data;        // Populated in calc_residuals
     US_DataIO::RawData* sim_data;        // Populated in calc_residuals
     US_DataIO::RawData  sim_data1;       // Simulation for mc iteration 1
@@ -142,7 +157,6 @@
     QDateTime           submitTime;
     QDateTime           startTime;
 
-    int                 set_count;
     QList< DATASET* >   data_sets;
 
     class MPI_Job
@@ -159,6 +173,7 @@
             Command command;
             int     depth;
             double  meniscus_value;
+            double  bottom_value;
             int     dataset_offset;
             int     dataset_count;
 
@@ -169,6 +184,7 @@
                 command        = IDLE;
                 depth          = 0;
                 meniscus_value = 0.0;
+                bottom_value   = 0.0;
                 dataset_offset = 0;
                 dataset_count  = 1;
             };
@@ -294,7 +310,7 @@
       public:
        int    generation;  // From worker: -1 = final; From master: 1 = done
        int    size;        // Number of solutes in the following vector or
-                           // or genes requested for emmigration
+                           // or genes requested for emigration
        double fitness;     // Fitness of best result
     };
 

Modified: trunk/utils/us_astfem_rsa.cpp
===================================================================
--- trunk/utils/us_astfem_rsa.cpp	2019-04-24 06:11:54 UTC (rev 2738)
+++ trunk/utils/us_astfem_rsa.cpp	2019-04-24 19:57:07 UTC (rev 2739)
@@ -957,7 +957,9 @@
          // Time left to be simulated after accelaration zone
          duration   = time2 - current_time;
 
+#if 0
          adjust_limits( sp->rotorspeed ); // Does rotor stretch
+#endif
 
          //duration      = time2 - time0;
          //delay         = time1 - time0;



More information about the us-commits mailing list