From 8ff650cd1d6c989096b4ec7eea358a5011449fe0 Mon Sep 17 00:00:00 2001
From: Robert Izzard <r.izzard@surrey.ac.uk>
Date: Thu, 22 Jul 2021 17:43:37 +0100
Subject: [PATCH] add log_arrows option to put arrows into the log file

add colour%d option to allow the user to override the ANSI colours
---
 src/API/binary_c_API_debug_fprintf.c          |  30 +++---
 src/API/binary_c_API_log.c                    |   4 +-
 src/API/binary_c_API_make_logstring.c         |  27 ++---
 src/RLOF/RLOF_adaptive_mass_transfer_rate.c   |  14 +--
 src/RLOF/RLOF_adaptive_mass_transfer_rate2.c  |  24 ++---
 .../RLOF_instantaneous_mass_transfer_rate.c   |  16 +--
 src/binary_c_debug.h                          |   2 +-
 src/binary_c_physical_constants.h             |   8 ++
 src/binary_c_string_macros.h                  |  12 +--
 src/binary_c_structures.h                     |  13 ++-
 src/buffering/binary_c_fail_printf.c          |  16 +--
 .../common_envelope_evolution_BSE.c           |  16 +--
 src/debug/debug_colours.h                     |  12 +--
 src/disc/cbdisc_eccentricity_pumping_rate.c   |  12 +--
 src/disc/disc_F_bisector.c                    |   3 +-
 src/disc/disc_J_bisector.c                    |   3 +-
 src/disc/disc_M_bisector.c                    |   3 +-
 src/disc/disc_bisection_rooter.c              |   3 +-
 src/disc/disc_build_disc_zones.c              |   8 +-
 src/disc/disc_calc_disc_structure.c           |   9 +-
 src/disc/disc_calculate_derived_variables.c   |   5 +-
 src/disc/disc_check_power_laws.c              |  18 ++--
 src/disc/disc_convergence_status.c            |   3 +-
 src/disc/disc_debug.h                         |   2 +-
 src/disc/disc_derivatives.c                   |  13 ++-
 src/disc/disc_determine_zone_radii.c          |  19 ++--
 src/disc/disc_initial_structure.c             |   2 +-
 src/disc/disc_initialize_disc.c               |   4 +-
 src/disc/disc_inner_edge_mass_loss.c          |   4 +-
 src/disc/disc_logging.c                       |  13 ++-
 src/disc/disc_new_zone_list.c                 |   3 +-
 src/disc/disc_nsector.c                       |   2 +-
 src/disc/disc_outer_edge_mass_loss.c          |   2 +-
 src/disc/disc_photoevaporation.c              |  35 +++---
 src/disc/disc_prototypes.h                    |  73 ++++++++-----
 src/disc/disc_quadsector.c                    |   2 +-
 src/disc/disc_set_disc_initial_guess.c        |   3 +-
 src/disc/disc_setup_zones.c                   |   5 +-
 src/disc/disc_show_disc.c                     |  10 +-
 src/disc/disc_show_thermal_zones.c            |  11 +-
 src/disc/disc_structure_functions.c           |  30 ++++--
 src/disc/disc_trisector.c                     |   2 +-
 src/disc/disc_zone_crossing_radii.c           |   3 +-
 src/disc/evolve_disc.c                        |   5 +-
 src/ensemble/ensemble_disc_log.c              |   6 +-
 src/evolution/apply_derivatives.c             |   4 +-
 src/evolution/evolve_system_binary_c.c        |   4 +-
 src/evolution/time_evolution.h                |   6 +-
 src/evolution/update_the_time.c               |   4 +-
 src/logging/ansi_colours.h                    | 100 ++++++++++--------
 src/logging/log_every_timestep.c              |  18 ++++
 src/logging/logfile_macros.h                  |   8 +-
 src/logging/logfile_string.c                  |  72 ++++++++++---
 src/logging/logging_prototypes.h              |   2 +
 src/logging/logwrap.c                         |   1 +
 src/logging/open_log_files.c                  |  43 ++++++--
 src/logging/output_to_detailed_logfile.c      |  18 ++--
 src/logging/output_to_logfile.c               |   4 +-
 src/logging/show_derivatives.c                |  12 +--
 src/maths/apply_derivative.c                  |   4 +-
 src/memory/build_store_contents.c             |  21 +++-
 src/memory/free_store_contents.c              |  17 ++-
 src/perl/scripts/rename_variable.pl           |  27 +++--
 src/setup/argument_setting_functions.c        |   8 +-
 src/setup/cmd_line_args_list.h                |  21 +++-
 src/setup/cmd_line_function_macros.h          |   4 +-
 src/setup/cmd_line_macros.h                   |   2 +
 src/setup/derived_arguments.c                 |  22 +++-
 src/setup/parse_arguments.c                   |  21 ++--
 src/setup/set_default_preferences.c           |   3 +-
 src/setup/setup_prototypes.h                  |   1 +
 src/setup/version.c                           |  24 +++++
 src/stellar_timescales/stellar_timescales.c   |   4 +-
 src/timestep/stellar_timestep.c               |  12 +--
 .../timestep_increment_fixed_timesteps.c      |   2 +-
 src/wind/wind_postAGB.c                       |   8 +-
 tbse                                          |   5 +-
 77 files changed, 667 insertions(+), 345 deletions(-)

diff --git a/src/API/binary_c_API_debug_fprintf.c b/src/API/binary_c_API_debug_fprintf.c
index ea42e82b5..d27f1ea27 100644
--- a/src/API/binary_c_API_debug_fprintf.c
+++ b/src/API/binary_c_API_debug_fprintf.c
@@ -11,13 +11,13 @@ void binary_c_API_function Gnu_format_args(4,5)
                                const char * const format,
                                ...)
 {
-    /* 
-     * This function should not be called directly! 
+    /*
+     * This function should not be called directly!
      * Use the Dprint macro instead.
      *
      * filename is the source code file with the Dprint statement
      *
-     * fileline is the line at which the Dprint statement occurs 
+     * fileline is the line at which the Dprint statement occurs
      *
      * format is the (printf) format string
      *
@@ -28,10 +28,10 @@ void binary_c_API_function Gnu_format_args(4,5)
      * Model_Time Filename : Line : message
      *
      */
-    double t = stardata!=NULL ? stardata->model.time : -1.0;
+    const double t = stardata!=NULL ? stardata->model.time : -1.0;
     va_list args;
     va_start(args,format);
-  
+
     /* s contains the message */
     char s[MAX_DEBUG_PRINT_SIZE],sid[14],f[MAX_DEBUG_PRINT_SIZE];
     vsnprintf(s,MAX_DEBUG_PRINT_SIZE,format,args);
@@ -51,7 +51,7 @@ void binary_c_API_function Gnu_format_args(4,5)
     /* make the filename, remove nan e.g. in remnant (replace with n_n) */
 
 #ifdef DEBUG_COLOURS
-    snprintf(f,MAX_DEBUG_PRINT_SIZE,"%s%-40.40s",RED,filename);
+    snprintf(f,MAX_DEBUG_PRINT_SIZE,"%s%-40.40s",stardata->store->colours[RED],filename);
 #else
     snprintf(f,MAX_DEBUG_PRINT_SIZE,"%-40.40s",filename);
 #endif
@@ -65,17 +65,17 @@ void binary_c_API_function Gnu_format_args(4,5)
 #ifdef DEBUG_COLOURS
 #ifdef DEBUG_LINENUMBERS
     _printf("%s%s%g %d %s%s :%s% 6d%s : %s\n",
-            CYAN,sid,t,
-	    stardata != NULL ? stardata->model.intpol : 0,
-            YELLOW,f,
-            GREEN,fileline,
-            COLOUR_RESET,s);
+            stardata->store->colours[CYAN],sid,t,
+        stardata != NULL ? stardata->model.intpol : 0,
+            stardata->store->colours[YELLOW],f,
+            stardata->store->colours[GREEN],fileline,
+            stardata->store->colours[COLOUR_RESET],s);
 #else
     _printf("%s%s%g %d %s%s%s : %s\n",
-            CYAN,sid,t,
-	    stardata != NULL ? stardata->model.intpol : 0,
-            YELLOW,f,
-            COLOUR_RESET,s);
+            stardata->store->colours[CYAN],sid,t,
+        stardata != NULL ? stardata->model.intpol : 0,
+            stardata->store->colours[YELLOW],f,
+            stardata->store->colours[COLOUR_RESET],s);
 #endif //DEBUG_LINENUMBERS
 #else
 
diff --git a/src/API/binary_c_API_log.c b/src/API/binary_c_API_log.c
index 343f20792..06364511b 100644
--- a/src/API/binary_c_API_log.c
+++ b/src/API/binary_c_API_log.c
@@ -35,6 +35,7 @@ void binary_c_API_function binary_c_API_log(struct stardata_t * const stardata,
                       stardata->star[1].stellar_type,
                       stardata->star[1].hybrid_HeCOWD,
                       stardata->common.orbit.separation,
+                      stardata->common.orbit.period,
                       stardata->common.orbit.eccentricity,
                       Is_not_zero(stardata->star[0].roche_radius) ? (stardata->star[0].radius/stardata->star[0].roche_radius) : 0.0,
                       Is_not_zero(stardata->star[1].roche_radius) ? (stardata->star[1].radius/stardata->star[1].roche_radius) : 0.0,
@@ -61,6 +62,7 @@ char * binary_c_API_logstring(struct stardata_t * const stardata,
                           stardata->star[1].stellar_type,
                           stardata->star[1].hybrid_HeCOWD,
                           stardata->common.orbit.separation,
+                          stardata->common.orbit.period,
                           stardata->common.orbit.eccentricity,
                           Is_not_zero(stardata->star[0].roche_radius) ? (stardata->star[0].radius/stardata->star[0].roche_radius) : 0.0,
                           Is_not_zero(stardata->star[1].roche_radius) ? (stardata->star[1].radius/stardata->star[1].roche_radius) : 0.0,
@@ -98,7 +100,7 @@ void binary_c_API_function binary_c_API_open_log(struct stardata_t * const stard
     binary_c_API_open_logfile(stardata,filename);
 
     fprintf(stardata->model.api_log_fp,
-            "      TIME      M1       M2   K1 K2        SEP    ECC  R1/ROL1 R2/ROL2  TYPE\n");
+            "      TIME      M1       M2   K1 K2        SEP    PER    ECC  R1/ROL1 R2/ROL2  TYPE\n");
 }
 
 
diff --git a/src/API/binary_c_API_make_logstring.c b/src/API/binary_c_API_make_logstring.c
index 0e940ef5c..81a0d10c6 100644
--- a/src/API/binary_c_API_make_logstring.c
+++ b/src/API/binary_c_API_make_logstring.c
@@ -18,18 +18,19 @@ char * binary_c_API_make_logstring(struct stardata_t * const stardata,
     APIDebug("API::binary_c_api_log API LOG to string at t=%g\n",stardata->model.time);
     Boolean skip MAYBE_UNUSED;
     return logfile_string(stardata->model.time,
-                                stardata->star[0].mass,
-                                stardata->star[1].mass,
-                                stardata->star[0].stellar_type,
-                                stardata->star[0].hybrid_HeCOWD,
-                                stardata->star[1].stellar_type,
-                                stardata->star[1].hybrid_HeCOWD,
-                                stardata->common.orbit.separation,
-                                stardata->common.orbit.eccentricity,
-                                Is_not_zero(stardata->star[0].roche_radius) ? (stardata->star[0].radius/stardata->star[0].roche_radius) : 0.0,
-                                Is_not_zero(stardata->star[1].roche_radius) ? (stardata->star[1].radius/stardata->star[1].roche_radius) : 0.0,
-                                locations[loc],
-                                stardata,
-                                &skip);
+                          stardata->star[0].mass,
+                          stardata->star[1].mass,
+                          stardata->star[0].stellar_type,
+                          stardata->star[0].hybrid_HeCOWD,
+                          stardata->star[1].stellar_type,
+                          stardata->star[1].hybrid_HeCOWD,
+                          stardata->common.orbit.separation,
+                          stardata->common.orbit.period,
+                          stardata->common.orbit.eccentricity,
+                          Is_not_zero(stardata->star[0].roche_radius) ? (stardata->star[0].radius/stardata->star[0].roche_radius) : 0.0,
+                          Is_not_zero(stardata->star[1].roche_radius) ? (stardata->star[1].radius/stardata->star[1].roche_radius) : 0.0,
+                          locations[loc],
+                          stardata,
+                          &skip);
 }
 #endif // BINARY_C_API
diff --git a/src/RLOF/RLOF_adaptive_mass_transfer_rate.c b/src/RLOF/RLOF_adaptive_mass_transfer_rate.c
index cae50ce65..e85163118 100644
--- a/src/RLOF/RLOF_adaptive_mass_transfer_rate.c
+++ b/src/RLOF/RLOF_adaptive_mass_transfer_rate.c
@@ -58,7 +58,7 @@ double RLOF_adaptive_mass_transfer_rate(const double r,
     {
         mdot = menv / dynamical_timescale(star);
         stardata->common.mdot_RLOF_adaptive=mdot;
-        fprintf(stderr,"%s conv check : eject all env%s\n",YELLOW,COLOUR_RESET);
+        fprintf(stderr,"%s conv check : eject all env%s\n",stardata->store->colours[YELLOW],stardata->store->colours[COLOUR_RESET]);
     }
     else
 #endif // ADAPTIVE_RLOF_CONVECTIVE_CHECK
@@ -231,7 +231,7 @@ double RLOF_adaptive_mass_transfer_rate(const double r,
                     Dprint("DR/DM < 0 : use BSE formula\n");
                     mdot = mdotBSE;
                     use_BSE = TRUE;
-                    fprintf(stderr,"%sdr/dm<0 use BSE%s\n",RED,COLOUR_RESET);
+                    fprintf(stderr,"%sdr/dm<0 use BSE%s\n",stardata->store->colours[RED],stardata->store->colours[COLOUR_RESET]);
 #ifdef ADAPTIVE_RLOF_LOG
                     stardata->common.used_rate = RLOF_RATE_BSE;
 #endif // ADAPTIVE_RLOF_LOG
@@ -243,7 +243,7 @@ double RLOF_adaptive_mass_transfer_rate(const double r,
                     pstar->mass = star->core_mass[ID_core(pstar->stellar_type)];
 
                     Dprint("DR/DM = %g < 0 : %seject all the envelope%s menv=%g dt=%g dr=%g dm=%g\n",
-                           dr/dm,MAGENTA,COLOUR_RESET,
+                           dr/dm,stardata->store->colours[MAGENTA],stardata->store->colours[COLOUR_RESET],
                            star->mass-Outermost_core_mass(star),
                            dt,
                            dr,
@@ -310,11 +310,11 @@ double RLOF_adaptive_mass_transfer_rate(const double r,
                         Dprint("Break : better than threshold (check1=%d check2=%d)\n\n",check1,check2);
                         /*fprintf(stderr,"%st=%g Converged m=%g (was %g) r=%g roche_radius=%g dm/dr=%g%s (%d iterations)\n",
 
-                          GREEN,
+                          stardata->store->colours[GREEN],
                           stardata->model.time,
                           pstar->mass,mass,
                           pstar->radius,target_radius,dmdr,
-                          COLOUR_RESET,i);
+                          stardata->store->colours[COLOUR_RESET],i);
                         */
 #ifdef PRETTYLOG
                         status=STATUS_CONVERGED;
@@ -351,7 +351,7 @@ double RLOF_adaptive_mass_transfer_rate(const double r,
                     use_BSE=TRUE;
                     mdot = mdotBSE;
 #ifdef SHOW_WARNINGS
-                    fprintf(stderr,"%sFailed dr=0%s (%d iterations)\n",RED,COLOUR_RESET,i);
+                    fprintf(stderr,"%sFailed dr=0%s (%d iterations)\n",stardata->store->colours[RED],stardata->store->colours[COLOUR_RESET],i);
 #endif
 #ifdef PRETTYLOG
                     status=STATUS_DR_ZERO;
@@ -370,7 +370,7 @@ double RLOF_adaptive_mass_transfer_rate(const double r,
             {
                 pstar->mass=0.0;
 #ifdef SHOW_WARNINGS
-                fprintf(stderr,"%sFailed dm<0%s (%d iterations)\n",RED,COLOUR_RESET,i);
+                fprintf(stderr,"%sFailed dm<0%s (%d iterations)\n",stardata->store->colours[RED],stardata->store->colours[COLOUR_RESET],i);
 #endif
                 Dprint("pstar->mass < 0 error in RLOF_mass_transfer rate : continuing...\n");
 #ifdef PRETTYLOG
diff --git a/src/RLOF/RLOF_adaptive_mass_transfer_rate2.c b/src/RLOF/RLOF_adaptive_mass_transfer_rate2.c
index 429ed7b0d..736cb03e5 100644
--- a/src/RLOF/RLOF_adaptive_mass_transfer_rate2.c
+++ b/src/RLOF/RLOF_adaptive_mass_transfer_rate2.c
@@ -80,9 +80,9 @@ double RLOF_adaptive_mass_transfer_rate2(const double r MAYBE_UNUSED,
     stardata->model.adapting_RLOF2 = TRUE;
 
     if(vb)printf("\n\n%s** %u  **********************************************************%s\n\nfirst a = %30.20e, r = %30.20e, star->radius = %30.20e, target_radius = %30.20e Rexcess %g\n",
-           RED,
+           stardata->store->colours[RED],
            stardata->model.adaptive_RLOF2_adapt_count,
-           COLOUR_RESET,
+           stardata->store->colours[COLOUR_RESET],
            stardata->common.orbit.separation,
            r,
            star->radius,
@@ -106,8 +106,8 @@ double RLOF_adaptive_mass_transfer_rate2(const double r MAYBE_UNUSED,
                  star->adaptive2_Mdot_high,
                  star->adaptive2_Rexcess_low,
                  star->adaptive2_Rexcess_high,
-                 GREEN,
-                 COLOUR_RESET,
+                 stardata->store->colours[GREEN],
+                 stardata->store->colours[COLOUR_RESET],
                  Yesno(star->adaptive2_converged)
         );
 
@@ -213,8 +213,8 @@ double RLOF_adaptive_mass_transfer_rate2_update(struct stardata_t * const starda
                  star->adaptive2_Mdot_high,
                  star->adaptive2_Rexcess_low,
                  star->adaptive2_Rexcess_high,
-                 GREEN,
-                 COLOUR_RESET,
+                 stardata->store->colours[GREEN],
+                 stardata->store->colours[COLOUR_RESET],
                  epsR,
                  epstarget_radius,
                  eps,
@@ -553,10 +553,10 @@ double _RLOF_adaptive_mass_transfer_rate2(const double r,
                   star->adaptive2_mdot
         );
     rif(vb)printf("ADAP %s%d:%u%s M = %15.12g %15.12g ; mdot was %g : maxmdot = %g, dt = %g : R=%15.12g RL=%15.12g eps=%g ",
-                  RED,
+                  stardata->store->colours[RED],
                   stardata->model.model_number,
                   stardata->model.adaptive_RLOF2_adapt_count,
-                  COLOUR_RESET,
+                  stardata->store->colours[COLOUR_RESET],
                   mass,
                   star->mass,
                   mdot,
@@ -709,10 +709,10 @@ double _RLOF_adaptive_mass_transfer_rate2(const double r,
          * then convergence is stuck
          */
         rif(vb)printf("%sMdot now == mdot previous : reduce from %g to %g!%s\n",
-                      YELLOW,
+                      stardata->store->colours[YELLOW],
                       newMdot,
                       newMdot*0.9,
-                      COLOUR_RESET);
+                      stardata->store->colours[COLOUR_RESET]);
 
         newMdot *= r < target_radius ? 1.1 : 0.9;
     }
@@ -750,7 +750,7 @@ double _RLOF_adaptive_mass_transfer_rate2(const double r,
     star->adaptive2_mdot = mdot;
 
     rif(vb)printf("%smdot = %g (change of %g) : converged? %s (dt = %g, zoomfac %g, M will be %g, R/RL-1 = %g < %g) %s\n",
-                  star->adaptive2_converged == TRUE ? CYAN : COLOUR_RESET,
+                  star->adaptive2_converged == TRUE ? stardata->store->colours[CYAN] : stardata->store->colours[COLOUR_RESET],
                   star->adaptive2_mdot,
                   star->adaptive2_mdot/stardata->previous_stardata->star[star->starnum].derivative[DERIVATIVE_STELLAR_MASS_RLOF_LOSS] - 1.0,
                   Yesno(star->adaptive2_converged),
@@ -759,7 +759,7 @@ double _RLOF_adaptive_mass_transfer_rate2(const double r,
                   star->mass - mdot * dt,
                   r/target_radius-1.0,
                   THRESHOLD,
-                  COLOUR_RESET
+                  stardata->store->colours[COLOUR_RESET]
         );
 
 
diff --git a/src/RLOF/RLOF_instantaneous_mass_transfer_rate.c b/src/RLOF/RLOF_instantaneous_mass_transfer_rate.c
index 09bdfc40c..08caae794 100644
--- a/src/RLOF/RLOF_instantaneous_mass_transfer_rate.c
+++ b/src/RLOF/RLOF_instantaneous_mass_transfer_rate.c
@@ -234,9 +234,9 @@ double Pure_function RLOF_instantaneous_mass_transfer_rate(
             {
                 Dprint("t=%g %sLimit mass-transfer to %g x Menv%s (menv=%g, mdot was %g now %g) dt=%g\n",
                        stardata->model.time,
-                       YELLOW,
+                       stardata->store->colours[YELLOW],
                        ADAPTIVE_RLOF_MAX_ENV_FRAC,
-                       COLOUR_RESET,menv,
+                       stardata->store->colours[COLOUR_RESET],menv,
                        mdot,
                        envelope_limit,
                        dt);
@@ -335,9 +335,9 @@ double Pure_function RLOF_instantaneous_mass_transfer_rate(
 #warning This static int should not be here!
                 static int zerocount=0;
                 zerocount = (Is_zero(mdot)) ? zerocount+1 : 0;
-                const char *colours[] = {MAGENTA,GREEN,RED,RED,YELLOW,RED};
+                const char *colours[] = {stardata->store->colours[MAGENTA],stardata->store->colours[GREEN],stardata->store->colours[RED],stardata->store->colours[RED],stardata->store->colours[YELLOW],stardata->store->colours[RED]};
                 const char *statstrings[] = {"","Cnvrgd","dmdr<0","dr=0","WDenv","mt<0"};
-                const char *capcolours[] = {GREEN,BRIGHT_YELLOW,BRIGHT_RED};
+                const char *capcolours[] = {stardata->store->colours[GREEN],stardata->store->colours[BRIGHT_YELLOW],stardata->store->colours[BRIGHT_RED]};
                 const char *capstrings[] = {"   ","(T)","(E)"};
                 const char *rolmov[] = {"(Detaching)","(Attaching)"};
                 const double tdyn_local = dynamical_timescale(star);
@@ -362,12 +362,12 @@ double Pure_function RLOF_instantaneous_mass_transfer_rate(
                         capcolours[cap],
                         cap,
                         capstrings[cap],
-                        CYAN,
+                        stardata->store->colours[CYAN],
                         stardata->common.suggested_timestep,
                         donor->tkh,
                         zerocount,
                         radius_mass_derivative(stardata,donor,donor->mass),
-                        COLOUR_RESET);
+                        stardata->store->colours[COLOUR_RESET]);
             }
 #endif // PRETTYLOG
 
@@ -384,9 +384,9 @@ double Pure_function RLOF_instantaneous_mass_transfer_rate(
             if(unlikely(mdot<0.0)) mdot=0.0;
 
             Dprint("%sFINAL MDOT RLOF = %g (final R=%g RL=%g)%s\n",
-                   YELLOW,mdot,
+                   stardata->store->colours[YELLOW],mdot,
                    donor->radius,roche_radius,
-                   COLOUR_RESET);
+                   stardata->store->colours[COLOUR_RESET]);
         }
 
 
diff --git a/src/binary_c_debug.h b/src/binary_c_debug.h
index 5cf5947ec..b74b8954d 100644
--- a/src/binary_c_debug.h
+++ b/src/binary_c_debug.h
@@ -78,7 +78,7 @@
  * the same, but stardata is defined everywhere as a global
  * variable.
  */
-#define Debug_expression (stardata->model.model_number>=349)
+#define Debug_expression (TRUE)
 
 /*
  * If you define Debug_stop_expression, and it is at any time TRUE,
diff --git a/src/binary_c_physical_constants.h b/src/binary_c_physical_constants.h
index 5961b9ab9..5bfda9959 100644
--- a/src/binary_c_physical_constants.h
+++ b/src/binary_c_physical_constants.h
@@ -186,6 +186,8 @@
 
 /* one year in seconds */
 //#define YEAR_LENGTH_IN_SECONDS (sqrt( Pow2(TWOPI) * Pow3(ASTRONOMICAL_UNIT) /(GRAVITATIONAL_CONSTANT * M_SUN)))
+
+/* This number is the above pre-computed */
 #define YEAR_LENGTH_IN_SECONDS (3.155324093699018657207489013672e+07)
 
 /* year in days */
@@ -194,6 +196,12 @@
 /* year in hours */
 #define YEAR_LENGTH_IN_HOURS ((YEAR_LENGTH_IN_SECONDS)/(HOUR_LENGTH_IN_SECONDS))
 
+/* day in hours */
+#define DAY_LENGTH_IN_HOURS (DAY_LENGTH_IN_SECONDS/HOUR_LENGTH_IN_SECONDS)
+
+/* day in years */
+#define DAY_LENGTH_IN_YEARS (1.0/YEAR_LENGTH_IN_DAYS)
+
 /* Rsun in km */
 #define R_SUN_KM (R_SUN*1e-5)
 
diff --git a/src/binary_c_string_macros.h b/src/binary_c_string_macros.h
index 7fdb14182..1096fb661 100644
--- a/src/binary_c_string_macros.h
+++ b/src/binary_c_string_macros.h
@@ -40,29 +40,29 @@ enum {
 /*
  * Macros to say yes/no, true/false, in captials and colour too
  */
-#define _POSITIVE_COLOUR BRIGHT_GREEN
-#define _NEGATIVE_COLOUR BRIGHT_RED
+#define _POSITIVE_COLOUR stardata->store->colours[BRIGHT_GREEN]
+#define _NEGATIVE_COLOUR stardata->store->colours[BRIGHT_RED]
 
 #define Yesno(B) ((B)==TRUE ? "Yes" : "No")
 #define YESNO(B) ((B)==TRUE ? "YES" : "NO")
 #define Colouryesno(X)                                  \
     ((X)==FALSE ? _NEGATIVE_COLOUR : _POSITIVE_COLOUR), \
         Yesno(X),                                       \
-        COLOUR_RESET
+        stardata->store->colours[COLOUR_RESET]
 #define ColourYESNO(X)                                  \
     ((X)==FALSE ? _NEGATIVE_COLOUR : _POSITIVE_COLOUR), \
         YESNO(X),                                       \
-        COLOUR_RESET
+        stardata->store->colours[COLOUR_RESET]
 #define Truefalse(B) ((B)==TRUE ? "True" : "False")
 #define TRUEFALSE(B) ((B)==TRUE ? "TRUE" : "FALSE")
 #define Colourtruefalse(X)                              \
     ((X)==FALSE ? _NEGATIVE_COLOUR : _POSITIVE_COLOUR), \
         Truefalse(X),                                   \
-        COLOUR_RESET
+        stardata->store->colours[COLOUR_RESET]
 #define ColourTRUEFALSE(X)                              \
     ((X)==FALSE ? _NEGATIVE_COLOUR : _POSITIVE_COLOUR), \
         TRUEFALSE(X),                                   \
-        COLOUR_RESET
+        stardata->store->colours[COLOUR_RESET]
 
 
 /*
diff --git a/src/binary_c_structures.h b/src/binary_c_structures.h
index 7a09ab655..69ded460a 100644
--- a/src/binary_c_structures.h
+++ b/src/binary_c_structures.h
@@ -268,6 +268,12 @@ struct store_t {
 
     /* log file labels */
     const char *label[NLOG_LABEL];
+    char * upchar;
+    char * downchar;
+    char * nochangechar;
+#ifdef USE_ANSI_COLOURS
+    char ** colours;
+#endif
 
     /*
      * Data tables
@@ -1009,6 +1015,7 @@ struct preferences_t {
     char stardata_dump_filename[STRING_LENGTH];
     char stardata_load_filename[STRING_LENGTH];
 
+
 #ifdef FILE_LOG
     /* file log name */
     char log_filename[STRING_LENGTH];
@@ -1048,6 +1055,7 @@ struct preferences_t {
     int nelemans_n_comenvs;
 
     int PN_Hall_fading_time_algorithm;
+    int colours[NUM_ANSI_COLOURS];
 
 #ifdef DISCS
     int cbdisc_eccentricity_pumping_method;
@@ -1226,6 +1234,7 @@ struct preferences_t {
     Third_dredge_up_algorithm AGB_3dup_algorithm;
 
     /* Boolean parameters */
+    Boolean show_version;
     Boolean tasks[BINARY_C_TASK_NUMBER];
     Boolean require_drdm;
     Boolean save_pre_events_stardata;
@@ -1259,8 +1268,10 @@ struct preferences_t {
     /* stop evolution and return on event */
     Boolean stop_at_event;
 
+#ifdef FILE_LOG
     Boolean colour_log;
-
+    Boolean log_arrows;
+#endif // FILE_LOG
     Boolean force_circularization_on_RLOF;
     Boolean speedtests;
 
diff --git a/src/buffering/binary_c_fail_printf.c b/src/buffering/binary_c_fail_printf.c
index 2b404726b..c883b6cc7 100644
--- a/src/buffering/binary_c_fail_printf.c
+++ b/src/buffering/binary_c_fail_printf.c
@@ -71,7 +71,7 @@ void Gnu_format_args(4,5) No_return
     /* make the filename, remove nan e.g. in remnant (replace with n_n) */
     char f[MAX_DEBUG_PRINT_SIZE];
 #ifdef DEBUG_COLOURS
-    snprintf(f,MAX_DEBUG_PRINT_SIZE,"%s%-40.40s",RED,filename);
+    snprintf(f,MAX_DEBUG_PRINT_SIZE,"%s%-40.40s",stardata->store->colours[RED],filename);
 #else
     snprintf(f,MAX_DEBUG_PRINT_SIZE,"%-40.40s",filename);
 #endif
@@ -85,15 +85,15 @@ void Gnu_format_args(4,5) No_return
 #ifdef DEBUG_COLOURS
 #ifdef DEBUG_LINENUMBERS
     PRINT2("%sbinary_c_fail: %s%g %s% 6d%s : %s : %s%s\n",
-           CYAN,sid,t,
-           GREEN,fileline,
-           YELLOW,f,
-           COLOUR_RESET,s);
+           stardata->store->colours[CYAN],sid,t,
+           stardata->store->colours[GREEN],fileline,
+           stardata->store->colours[YELLOW],f,
+           stardata->store->colours[COLOUR_RESET],s);
 #else
     PRINT2("%sbinary_c_fail: %s%g %s%s%s : %s\n",
-           CYAN,sid,t,
-           YELLOW,f,
-           COLOUR_RESET,s);
+           stardata->store->colours[CYAN],sid,t,
+           stardata->store->colours[YELLOW],f,
+           stardata->store->colours[COLOUR_RESET],s);
 #endif //DEBUG_LINENUMBERS
 #else
 
diff --git a/src/common_envelope/common_envelope_evolution_BSE.c b/src/common_envelope/common_envelope_evolution_BSE.c
index 91def3ac7..8e8c838cf 100644
--- a/src/common_envelope/common_envelope_evolution_BSE.c
+++ b/src/common_envelope/common_envelope_evolution_BSE.c
@@ -3566,7 +3566,7 @@ void Gnu_format_args(4,5) mixdebug_fprintf(struct stardata_t * const stardata,
     /* make the filename, remove nan e.g. in remnant (replace with n_n) */
     char f[MAX_DEBUG_PRINT_SIZE];
 #ifdef DEBUG_COLOURS
-    snprintf(f,MAX_DEBUG_PRINT_SIZE,"%s%-40.40s",RED,filename);
+    snprintf(f,MAX_DEBUG_PRINT_SIZE,"%s%-40.40s",stardata->store->colours[RED],filename);
 #else
     snprintf(f,MAX_DEBUG_PRINT_SIZE,"%-40.40s",filename);
 #endif
@@ -3581,15 +3581,15 @@ void Gnu_format_args(4,5) mixdebug_fprintf(struct stardata_t * const stardata,
 #ifdef DEBUG_COLOURS
 #ifdef DEBUG_LINENUMBERS
     Dprint("%s%g %s%s :%s% 6d%s : %s\n",
-           CYAN,stardata->model.time,
-           YELLOW,f,
-           GREEN,fileline,
-           COLOUR_RESET,s);
+           stardata->store->colours[CYAN],stardata->model.time,
+           stardata->store->colours[YELLOW],f,
+           stardata->store->colours[GREEN],fileline,
+           stardata->store->colours[COLOUR_RESET],s);
 #else
     Dprint("%s%g %s%s%s : %s\n",
-           CYAN,stardata->model.time,
-           YELLOW,f,
-           COLOUR_RESET,s);
+           stardata->store->colours[CYAN],stardata->model.time,
+           stardata->store->colours[YELLOW],f,
+           stardata->store->colours[COLOUR_RESET],s);
 #endif //DEBUG_LINENUMBERS
 #else
 
diff --git a/src/debug/debug_colours.h b/src/debug/debug_colours.h
index e7e2b9901..73138ac86 100644
--- a/src/debug/debug_colours.h
+++ b/src/debug/debug_colours.h
@@ -3,12 +3,12 @@
 #define DEBUG_COLOURS_H
 
 #ifdef DEBUG_COLOURS
-#define COLOUR_TIME CYAN
-#define COLOUR_LINENUMBERS GREEN
-#define COLOUR_ENDLINE COLOUR_RESET
-#define COLOUR_FILENAME RED
-#define COLOUR_CALLER YELLOW
-#define COLOUR_FLOAT_BITSTRING MAGENTA
+#define COLOUR_TIME stardata->store->colours[CYAN]
+#define COLOUR_LINENUMBERS stardata->store->colours[GREEN]
+#define COLOUR_ENDLINE stardata->store->colours[COLOUR_RESET]
+#define COLOUR_FILENAME stardata->store->colours[RED]
+#define COLOUR_CALLER stardata->store->colours[YELLOW]
+#define COLOUR_FLOAT_BITSTRING stardata->store->colours[MAGENTA]
 #else
 #define COLOUR_TIME ""
 #define COLOUR_LINENUMBERS ""
diff --git a/src/disc/cbdisc_eccentricity_pumping_rate.c b/src/disc/cbdisc_eccentricity_pumping_rate.c
index c8b82af95..a9024fb0f 100644
--- a/src/disc/cbdisc_eccentricity_pumping_rate.c
+++ b/src/disc/cbdisc_eccentricity_pumping_rate.c
@@ -10,11 +10,11 @@ static void resonance_radii(const struct binary_system_t * binary,
                             double *r_inner,
                             double *r_outer);
 
-void cbdisc_eccentricity_pumping_rate(struct stardata_t * stardata,
-                                      struct disc_t * disc,
-                                      const struct binary_system_t * binary,
-                                      double * dedt,
-                                      double * dJdt)
+void cbdisc_eccentricity_pumping_rate(struct stardata_t * const stardata,
+                                      struct disc_t * const disc,
+                                      const struct binary_system_t * const binary,
+                                      double * const dedt,
+                                      double * const dJdt)
 {
 //#undef DISC_DEBUG
 //#define DISC_DEBUG 2
@@ -69,7 +69,7 @@ void cbdisc_eccentricity_pumping_rate(struct stardata_t * stardata,
          */
         if(Is_zero(disc->RJhalf))
         {
-            disc->RJhalf = disc_half_angular_momentum_radius(disc,binary);
+            disc->RJhalf = disc_half_angular_momentum_radius(stardata,disc,binary);
         }
 
         double R = disc->RJhalf;
diff --git a/src/disc/disc_F_bisector.c b/src/disc/disc_F_bisector.c
index a8e6709a7..049b865d1 100644
--- a/src/disc/disc_F_bisector.c
+++ b/src/disc/disc_F_bisector.c
@@ -15,6 +15,7 @@ double disc_F_bisector(const double Rin,
      * Rin at fixed Rout and mass (i.e. Tvisc0)
      */
     Map_GSL_params(p,args);
+    Map_varg(struct stardata_t *,stardata,args);
     Map_varg(struct disc_t *,disc,args);
     Map_varg(struct binary_system_t *,binary,args);
     Map_varg(double,Routfac,args);
@@ -62,7 +63,7 @@ double disc_F_bisector(const double Rin,
     }
     else
     {
-        status = disc_build_disc_zones(disc,binary);
+        status = disc_build_disc_zones(stardata,disc,binary);
 
         if(status == DISC_ZONES_OK)
         {
diff --git a/src/disc/disc_J_bisector.c b/src/disc/disc_J_bisector.c
index f7739d797..701de102e 100644
--- a/src/disc/disc_J_bisector.c
+++ b/src/disc/disc_J_bisector.c
@@ -11,6 +11,7 @@ double disc_J_bisector(const double Rout,
      * Bisect for J at fixed M (i.e. sigma0) and Rin (i.e. ang mom flux)
      */
     Map_GSL_params(p,args);
+    Map_varg(struct stardata_t *,stardata,args);
     Map_varg(struct disc_t *,disc,args);
     Map_varg(struct binary_system_t *,binary,args);
     va_end(args);
@@ -24,7 +25,7 @@ double disc_J_bisector(const double Rout,
     /*
      * update zone radii and power laws
      */
-    int status = disc_build_disc_zones(disc,binary);
+    int status = disc_build_disc_zones(stardata,disc,binary);
     double ret;
     if(status==DISC_ZONES_OK)
     {
diff --git a/src/disc/disc_M_bisector.c b/src/disc/disc_M_bisector.c
index 3902ec006..975c1e669 100644
--- a/src/disc/disc_M_bisector.c
+++ b/src/disc/disc_M_bisector.c
@@ -7,6 +7,7 @@ double disc_M_bisector(const double Tvisc0,
                        void * p)
 {
     Map_GSL_params(p,args);
+    Map_varg(struct stardata_t *,stardata,args);
     Map_varg(struct disc_t *,disc,args);
     Map_varg(struct binary_system_t *,binary,args);
     va_end(args);
@@ -38,7 +39,7 @@ double disc_M_bisector(const double Tvisc0,
          * also sets sigma0. Return -1.0 on failure.
          */
 
-        int status = disc_build_disc_zones(disc,binary);
+        int status = disc_build_disc_zones(stardata,disc,binary);
 
         if(status == DISC_ZONES_OK)
         {
diff --git a/src/disc/disc_bisection_rooter.c b/src/disc/disc_bisection_rooter.c
index b8608064d..5e1f066c7 100644
--- a/src/disc/disc_bisection_rooter.c
+++ b/src/disc/disc_bisection_rooter.c
@@ -332,7 +332,7 @@ static double disc_nsector_wrapper(const double x,
     /*
      * Function to be called by generic_bisect()
      */
-    Discdebug(2,"in disc_nsector_wrapper\n");
+
 
     Map_GSL_params(p,args);
     Map_varg(const int,n,args);
@@ -343,6 +343,7 @@ static double disc_nsector_wrapper(const double x,
     Map_varg(struct stardata_t *,stardata,args);
     Map_varg(int *,failed,args);
     va_end(args);
+    Discdebug(2,"in disc_nsector_wrapper\n");
 
     const double parameter_value[1] = { x };
     double residual[1];
diff --git a/src/disc/disc_build_disc_zones.c b/src/disc/disc_build_disc_zones.c
index 546baa809..2c9d3bdaf 100644
--- a/src/disc/disc_build_disc_zones.c
+++ b/src/disc/disc_build_disc_zones.c
@@ -3,13 +3,15 @@ No_empty_translation_unit_warning;
 
 #ifdef DISCS
 
-int disc_build_disc_zones(struct disc_t * const disc,
+int disc_build_disc_zones(struct stardata_t * const stardata,
+                          struct disc_t * const disc,
                           const struct binary_system_t * const binary)
 {
     /*
      * Make a new zone list in a disc and zone it.
      */
-    const Boolean status = disc_new_zone_list(disc,
+    const Boolean status = disc_new_zone_list(stardata,
+                                              disc,
                                               binary,
                                               disc->thermal_zones);
 
@@ -17,7 +19,7 @@ int disc_build_disc_zones(struct disc_t * const disc,
 
     if(status == DISC_ZONES_OK)
     {
-        disc_setup_zones(disc,binary);
+        disc_setup_zones(stardata,disc,binary);
     }
     return status;
 }
diff --git a/src/disc/disc_calc_disc_structure.c b/src/disc/disc_calc_disc_structure.c
index a29d48ca0..2b6a20b61 100644
--- a/src/disc/disc_calc_disc_structure.c
+++ b/src/disc/disc_calc_disc_structure.c
@@ -257,7 +257,7 @@ int disc_calc_disc_structure(const struct binary_system_t * const binary,
          */
         if(disc->converged)
         {
-            disc_calculate_derived_variables(disc,binary);
+            disc_calculate_derived_variables(stardata,disc,binary);
         }
 
 
@@ -269,7 +269,7 @@ int disc_calc_disc_structure(const struct binary_system_t * const binary,
         /*
          * Check convergence status
          */
-        disc_convergence_status("calc_structure_return",disc,binary);
+        disc_convergence_status(stardata,"calc_structure_return",disc,binary);
 
         /*
          * Check the solution is a local minimum
@@ -690,7 +690,8 @@ static double converge_with_torque(const int n,
             disc->guess = iguess;
 
             /* set the initial guess number iguess */
-            disc_set_disc_initial_guess(disc,
+            disc_set_disc_initial_guess(stardata,
+                                        disc,
                                         iguess,
                                         n,
                                         parameter_types,
@@ -836,7 +837,7 @@ static double converge_with_torque(const int n,
              */
             if(SHOW_CONVERGED_DISC_STRUCTURE &&
                Disc_is_disc(disc))
-                disc_show_disc(disc,binary);
+                disc_show_disc(stardata,disc,binary);
 
 #ifdef CONVERGENCE_LOG
             if(convlog_fp)fclose(convlog_fp);
diff --git a/src/disc/disc_calculate_derived_variables.c b/src/disc/disc_calculate_derived_variables.c
index 6e19f83eb..b1bdc5d84 100644
--- a/src/disc/disc_calculate_derived_variables.c
+++ b/src/disc/disc_calculate_derived_variables.c
@@ -8,7 +8,8 @@ No_empty_translation_unit_warning;
  * that are required by other parts of the disc code.
  */
 
-void disc_calculate_derived_variables(struct disc_t * const disc,
+void disc_calculate_derived_variables(struct stardata_t * const stardata,
+                                      struct disc_t * const disc,
                                       const struct binary_system_t * const binary)
 {
     if(Disc_is_disc(disc))
@@ -16,7 +17,7 @@ void disc_calculate_derived_variables(struct disc_t * const disc,
         disc->Hin = disc_scale_height(disc->Rin,disc,binary);
         Discdebug(1,"Hin = %g\n",disc->Hin);
 
-        disc->RJhalf = disc_half_angular_momentum_radius(disc,binary);
+        disc->RJhalf = disc_half_angular_momentum_radius(stardata,disc,binary);
         Discdebug(1,"RJhalf = %g cf Rin = %g\n",disc->RJhalf, disc->Rin);
 
         if(Is_not_zero(disc->RJhalf))
diff --git a/src/disc/disc_check_power_laws.c b/src/disc/disc_check_power_laws.c
index a5016fb23..41be8bb5c 100644
--- a/src/disc/disc_check_power_laws.c
+++ b/src/disc/disc_check_power_laws.c
@@ -55,7 +55,7 @@ void disc_check_power_laws(const struct disc_t * const d,
             if(Less_or_equal(PL->R0,0.0) || Less_or_equal(PL->R1,0.0))
             {
                 if(output==TRUE)
-                    printf("%s >> PLAW ERROR R0 <= 0 or R1 <= 0 %s\n",RED,COLOUR_RESET);
+                    printf("%s >> PLAW ERROR R0 <= 0 or R1 <= 0 %s\n",stardata->store->colours[RED],stardata->store->colours[COLOUR_RESET]);
                 fail=TRUE;
             }
 
@@ -67,23 +67,23 @@ void disc_check_power_laws(const struct disc_t * const d,
             {
                 if(output==TRUE)
                     printf("%s >> power law evaluated at R0 (%g) does not equal A0 (%g) %s\n",
-                           RED,
+                           stardata->store->colours[RED],
                            power_law(PL,PL->R0),
                            PL->A0,
-                           COLOUR_RESET);
+                           stardata->store->colours[COLOUR_RESET]);
                 fail=TRUE;
             }
             if(!Fequal(power_law(PL,PL->R1)/PL->A1,1.0))
             {
                 if(output==TRUE)
                     printf("%s >> power law evaluated at R1 (%g) does not equal A1 (%g) %% error = %g cf TINY=%g %g %s\n",
-                           RED,
+                           stardata->store->colours[RED],
                            power_law(PL,PL->R1),
                            PL->A1,
                            power_law(PL,PL->R1)/PL->A1-1.0,
                            TINY,
                            fabs(power_law(PL,PL->R1) - PL->A1),
-                           COLOUR_RESET);
+                           stardata->store->colours[COLOUR_RESET]);
                 fail=TRUE;
             }
 
@@ -102,13 +102,13 @@ void disc_check_power_laws(const struct disc_t * const d,
                 {
                     if(output==TRUE)
                         printf("%s >> PLAW ERROR : A0[%d]=%20.12e != A1[%d]=%20.12e (diff %g)%s\n",
-                               RED,
+                               stardata->store->colours[RED],
                                i,
                                PL->A0,
                                i-1,
                                prevPL->A1,
                                PL->A0/prevPL->A1 - 1.0,
-                               COLOUR_RESET
+                               stardata->store->colours[COLOUR_RESET]
                             );
                     fail=TRUE;
                 }
@@ -120,8 +120,8 @@ void disc_check_power_laws(const struct disc_t * const d,
                 {
                     if(output==TRUE)
                         printf("%s >> PLAW ERROR : exponent magntiude should descend outwards%s\n",
-                               RED,
-                               COLOUR_RESET);
+                               stardata->store->colours[RED],
+                               stardata->store->colours[COLOUR_RESET]);
                     fail=TRUE;
                 }
             }
diff --git a/src/disc/disc_convergence_status.c b/src/disc/disc_convergence_status.c
index 2171a9789..94e5795ab 100644
--- a/src/disc/disc_convergence_status.c
+++ b/src/disc/disc_convergence_status.c
@@ -4,7 +4,8 @@ No_empty_translation_unit_warning;
 
 #ifdef DISCS
 
-void disc_convergence_status(const char * const s,
+void disc_convergence_status(struct stardata_t * const stardata,
+                             const char * const s,
                              const struct disc_t * const disc,
                              const struct binary_system_t * const binary)
 {
diff --git a/src/disc/disc_debug.h b/src/disc/disc_debug.h
index 1976758e3..6d197bfd4 100644
--- a/src/disc/disc_debug.h
+++ b/src/disc/disc_debug.h
@@ -20,7 +20,7 @@
                 __FILE__,                       \
                 COLOUR_LINENUMBERS,             \
                 __LINE__,                       \
-                COLOUR_RESET);                  \
+                stardata->store->colours[COLOUR_RESET]);                  \
         fprintf(DISC_DEBUG_STREAM,__VA_ARGS__); \
         fflush(DISC_DEBUG_STREAM);              \
     }
diff --git a/src/disc/disc_derivatives.c b/src/disc/disc_derivatives.c
index d9ff51539..01026016a 100644
--- a/src/disc/disc_derivatives.c
+++ b/src/disc/disc_derivatives.c
@@ -27,7 +27,7 @@ void disc_derivatives(struct disc_t * const disc,
     /*
      * Update derived variables, just in case
      */
-    disc_calculate_derived_variables(disc,binary);
+    disc_calculate_derived_variables(stardata,disc,binary);
 
     /*
      * Reset evaporation boundaries : they'll
@@ -119,7 +119,8 @@ void disc_derivatives(struct disc_t * const disc,
                                                                 disc->Rin,
                                                                 Revap)
                                 * stardata->preferences->cbdisc_mass_loss_inner_L2_cross_multiplier;
-                            Revap = disc_mass_radius(disc,
+                            Revap = disc_mass_radius(stardata,
+                                                     disc,
                                                      binary,
                                                      dm);
                             Revap = multiplier * Revap +
@@ -188,7 +189,7 @@ void disc_derivatives(struct disc_t * const disc,
              * Set up the Owen+ (2012) disc evaporation function
              * for the current disc and binary system.
              */
-            disc_Owen_2012_normalize(disc,binary);
+            disc_Owen_2012_normalize(stardata,disc,binary);
 
             if(Is_really_not_zero(disc->Owen2012_norm))
             {
@@ -350,6 +351,7 @@ void disc_derivatives(struct disc_t * const disc,
                       disc->Rout / R_SUN);
 
             double jdot = disc_Owen_2012_angmom_integral(
+                stardata,
                 disc,
                 binary,
                 (Is_zero(disc->Revap_in) ? disc->Rin : Min(disc->Revap_in,disc->Rin)),
@@ -556,7 +558,7 @@ void disc_derivatives(struct disc_t * const disc,
                         (P_ISM/Max(1e-3,Min(fsmooth,1.0))) : P_ISM;
 
                     double P = disc_pressure(disc->Rout,disc,binary);
-                    double R = disc_pressure_radius(disc,binary,Ptarget);
+                    double R = disc_pressure_radius(stardata,disc,binary,Ptarget);
                     double M = disc_partial_mass(disc,R,disc->Rout);
                     double J = disc_partial_angular_momentum(disc,binary,R,disc->Rout);
                     double f = - stardata->preferences->cbdisc_mass_loss_ISM_ram_pressure_multiplier;
@@ -612,7 +614,8 @@ void disc_derivatives(struct disc_t * const disc,
                      * Interpolate according to the multiplier.
                      */
                     double R =
-                        disc_pressure_radius(disc,binary,P_ISM) * multiplier
+                        disc_pressure_radius(stardata,
+                                             disc,binary,P_ISM) * multiplier
                         +
                         disc->Rout * (1.0 - multiplier);
 
diff --git a/src/disc/disc_determine_zone_radii.c b/src/disc/disc_determine_zone_radii.c
index 973fddcfa..3fdc0986e 100644
--- a/src/disc/disc_determine_zone_radii.c
+++ b/src/disc/disc_determine_zone_radii.c
@@ -12,7 +12,8 @@ No_empty_translation_unit_warning;
  * Determine disc zone radii
  */
 
-Boolean disc_determine_zone_radii(struct disc_t * const disc)
+Boolean disc_determine_zone_radii(struct stardata_t * const stardata,
+                                  struct disc_t * const disc)
 {
     int method = _NEW;
 
@@ -63,7 +64,10 @@ Boolean disc_determine_zone_radii(struct disc_t * const disc)
             printf("Initial 3-zone setup (disc->Rin=%g disc->Rout=%g)\n",
                    disc->Rin,
                    disc->Rout);
-            disc_show_thermal_zones(disc,P,nzones);
+            disc_show_thermal_zones(stardata,
+                                    disc,
+                                    P,
+                                    nzones);
         }
 
         /*
@@ -88,7 +92,7 @@ Boolean disc_determine_zone_radii(struct disc_t * const disc)
         if(DEBUG_ZONE_RADII)
         {
             printf("Perhaps removed inner radiative zone?\n");
-            disc_show_thermal_zones(disc,P,nzones);
+            disc_show_thermal_zones(stardata,disc,P,nzones);
         }
 
         /* make sure all radii are in the disc */
@@ -101,7 +105,7 @@ Boolean disc_determine_zone_radii(struct disc_t * const disc)
         if(DEBUG_ZONE_RADII)
         {
             printf("Make sure all radii are in the disc\n");
-            disc_show_thermal_zones(disc,P,nzones);
+            disc_show_thermal_zones(stardata,disc,P,nzones);
         }
 
         /* eliminate zones with zero or negative width */
@@ -124,7 +128,7 @@ Boolean disc_determine_zone_radii(struct disc_t * const disc)
         if(DEBUG_ZONE_RADII)
         {
             printf("Eliminated zones with <=0 width\n");
-            disc_show_thermal_zones(disc,P,nzones);
+            disc_show_thermal_zones(stardata,disc,P,nzones);
         }
 
 
@@ -158,7 +162,10 @@ Boolean disc_determine_zone_radii(struct disc_t * const disc)
         if(DEBUG_ZONE_RADII)
         {
             printf("Final disc setup (%u zones)\n",disc->n_thermal_zones);
-            disc_show_thermal_zones(disc,disc->thermal_zones,disc->n_thermal_zones);
+            disc_show_thermal_zones(stardata,
+                                    disc,
+                                    disc->thermal_zones,
+                                    disc->n_thermal_zones);
         }
     }
 
diff --git a/src/disc/disc_initial_structure.c b/src/disc/disc_initial_structure.c
index d3c9901e1..5793d8213 100644
--- a/src/disc/disc_initial_structure.c
+++ b/src/disc/disc_initial_structure.c
@@ -109,7 +109,7 @@ void disc_initial_structure(struct disc_t * const disc,
     }
     Safe_free(s);
 
-    disc_convergence_status("Initial",disc,binary);
+    disc_convergence_status(stardata,"Initial",disc,binary);
     Discdebug(1,"initret ");
 }
 
diff --git a/src/disc/disc_initialize_disc.c b/src/disc/disc_initialize_disc.c
index fe223c8f0..5b770c99d 100644
--- a/src/disc/disc_initialize_disc.c
+++ b/src/disc/disc_initialize_disc.c
@@ -87,7 +87,9 @@ void disc_initialize_disc(struct stardata_t * const stardata,
 
         if(DISC_DEBUG)
         {
-            disc_show_disc(disc,binary);
+            disc_show_disc(stardata,
+                           disc,
+                           binary);
         }
 
         if(binary != binary_in)
diff --git a/src/disc/disc_inner_edge_mass_loss.c b/src/disc/disc_inner_edge_mass_loss.c
index c868acdfe..1313b60c2 100644
--- a/src/disc/disc_inner_edge_mass_loss.c
+++ b/src/disc/disc_inner_edge_mass_loss.c
@@ -90,10 +90,10 @@ double disc_inner_edge_mass_loss(struct stardata_t * const stardata,
             Discdebug(1,
                       "Tried to remove more than limits allow : adjust\n");
 
-            double R_M = disc_mass_radius(olddisc,binary,dm);
+            const double R_M = disc_mass_radius(stardata,olddisc,binary,dm);
             Discdebug(1,"R_M = %g\n",R_M);
 
-            double R_J = disc_angular_momentum_radius(olddisc,binary,dj);
+            const double R_J = disc_angular_momentum_radius(stardata,olddisc,binary,dj);
             Discdebug(1,"R_J = %g\n",R_J);
 
             newdisc->Revap_in = Min(R_M,R_J);
diff --git a/src/disc/disc_logging.c b/src/disc/disc_logging.c
index 92b08a672..b963cd14f 100644
--- a/src/disc/disc_logging.c
+++ b/src/disc/disc_logging.c
@@ -200,7 +200,7 @@ void disc_logging(struct stardata_t * const stardata,
                         const double P_ISM = disc->PISM;
                         const double R_ISM = disc->RISM;
                         const double Revap_in = disc->Revap_in;
-                        const double min_Toomre_Q = disc_minimum_Toomre_Q(disc,b);
+                        const double min_Toomre_Q = disc_minimum_Toomre_Q(stardata,disc,b);
 
                         //Printf("DISC_ECC %g\n",
                         //stardata->common.orbit.eccentricity);
@@ -658,8 +658,8 @@ void disc_logging(struct stardata_t * const stardata,
                     const double R_ISM = disc->RISM;
                     const double Revap_in = disc->Revap_in;
                     const double Revap_out = disc->Revap_out;
-                    const double RMhalf = disc_half_mass_radius(disc,b);
-                    const double RJhalf = disc_half_angular_momentum_radius(disc,b);
+                    const double RMhalf = disc_half_mass_radius(stardata,disc,b);
+                    const double RJhalf = disc_half_angular_momentum_radius(stardata,disc,b);
                     const double Mdotwind =
                         Disc_Mdot(DISC_LOSS_GLOBAL)+
                         Disc_Mdot(DISC_LOSS_ISM)+
@@ -679,11 +679,14 @@ void disc_logging(struct stardata_t * const stardata,
                     const double hwind = Is_really_not_zero(Mdotwind) ?
                         (Jdotwind / Mdotwind) : 0.0;
 
-                    const double min_Toomre_Q = disc_minimum_Toomre_Q(disc,b);
+                    const double min_Toomre_Q = disc_minimum_Toomre_Q(stardata,disc,b);
 
                     /* zone crossing radii */
                     double * RZcross;
-                    disc_zone_crossing_radii(disc,b,&RZcross);
+                    disc_zone_crossing_radii(stardata,
+                                             disc,
+                                             b,
+                                             &RZcross);
 
                     /* output */
                     binary_c_filter_fprintf(
diff --git a/src/disc/disc_new_zone_list.c b/src/disc/disc_new_zone_list.c
index 4bb2c8def..71dd80f53 100644
--- a/src/disc/disc_new_zone_list.c
+++ b/src/disc/disc_new_zone_list.c
@@ -3,7 +3,8 @@
 No_empty_translation_unit_warning;
 
 #ifdef DISCS
-Boolean disc_new_zone_list(struct disc_t * const disc,
+Boolean disc_new_zone_list(struct stardata_t * const stardata,
+                           struct disc_t * const disc,
                            const struct binary_system_t * const binary,
                            struct disc_thermal_zone_t * const thermal_zones)
 {
diff --git a/src/disc/disc_nsector.c b/src/disc/disc_nsector.c
index 60da83472..d592db8fa 100644
--- a/src/disc/disc_nsector.c
+++ b/src/disc/disc_nsector.c
@@ -187,7 +187,7 @@ void disc_nsector2(struct stardata_t * stardata MAYBE_UNUSED,
               disc->Rout
         );
 
-    int status = disc_build_disc_zones(disc,binary);
+    int status = disc_build_disc_zones(stardata,disc,binary);
     unsigned int i;
 
     if(DISC_DEBUG>=2)
diff --git a/src/disc/disc_outer_edge_mass_loss.c b/src/disc/disc_outer_edge_mass_loss.c
index 36add72ad..00ebc2a60 100644
--- a/src/disc/disc_outer_edge_mass_loss.c
+++ b/src/disc/disc_outer_edge_mass_loss.c
@@ -75,7 +75,7 @@ double disc_outer_edge_mass_loss(struct stardata_t * const stardata,
              */
             newdisc->Revap_out = Max(
                 newdisc->Rin,
-                disc_mass_radius(olddisc,binary,olddisc->M - dm)
+                disc_mass_radius(stardata,olddisc,binary,olddisc->M - dm)
                 //,disc_angular_momentum_radius(olddisc,binary,olddisc->J - dj)
                 );
 
diff --git a/src/disc/disc_photoevaporation.c b/src/disc/disc_photoevaporation.c
index 0e09f74c3..bdcb342a4 100644
--- a/src/disc/disc_photoevaporation.c
+++ b/src/disc/disc_photoevaporation.c
@@ -11,7 +11,8 @@ No_empty_translation_unit_warning;
  * based on Owen, Clarke and Ercolano (2012, MNRAS 433, 1880).
  */
 
-double disc_Owen_2012_total_mdot(const struct binary_system_t * const binary)
+double disc_Owen_2012_total_mdot(struct stardata_t * const stardata,
+                                 const struct binary_system_t * const binary)
 {
     /*
      * Equation B4 of Owen et al. (2012) gives the total
@@ -151,8 +152,9 @@ double disc_Owen_2012_sigmadot(struct disc_t * const disc,
     return sigmadot;
 }
 
-void disc_Owen_2012_normalize(struct disc_t * disc,
-                              const struct binary_system_t * binary)
+void disc_Owen_2012_normalize(struct stardata_t * const stardata,
+                              struct disc_t * const disc,
+                              const struct binary_system_t * const binary)
 {
     /*
      * Re-calculate the Owen 2012 normalization for the
@@ -160,7 +162,7 @@ void disc_Owen_2012_normalize(struct disc_t * disc,
      * Do this from 0 to 100AU, this should be sufficient.
      */
     disc->Owen2012_norm = 1.0;
-    const double total_mdot = disc_Owen_2012_total_mdot(binary);
+    const double total_mdot = disc_Owen_2012_total_mdot(stardata,binary);
 
     /*
      * Calculate disc mass loss timescale, if it's longer
@@ -263,8 +265,9 @@ double disc_Owen_2012_sigmadot_integral(struct disc_t * disc,
 }
 
 
-double disc_Owen_2012_angmom_integral(struct disc_t * disc,
-                                      const struct binary_system_t * binary,
+double disc_Owen_2012_angmom_integral(struct stardata_t * const stardata,
+                                      struct disc_t * const disc,
+                                      const struct binary_system_t * const binary,
                                       const double Rin,
                                       const double Rout)
 {
@@ -276,13 +279,14 @@ double disc_Owen_2012_angmom_integral(struct disc_t * disc,
     return
         Is_really_zero(disc->Owen2012_norm) ? 0.0 :
         GSL_integrator(Rin,
-                          Rout,
-                          PHOTOEVAPORATION_GSL_INTEGRAL_TOLERANCE,
-                          &error,
-                          GSL_INTEGRATOR_QAG,
-                          &Owen2012_angmom_f,
-                          disc,
-                          binary);
+                       Rout,
+                       PHOTOEVAPORATION_GSL_INTEGRAL_TOLERANCE,
+                       &error,
+                       GSL_INTEGRATOR_QAG,
+                       &Owen2012_angmom_f,
+                       stardata,
+                       disc,
+                       binary);
 }
 
 
@@ -290,8 +294,9 @@ static double Owen2012_angmom_f(double x,
                                 void *params)
 {
     Map_GSL_params(params,args);
-    Map_varg(struct disc_t *,disc,args);
-    Map_varg(struct binary_system_t *,binary,args);
+    Map_varg(struct stardata_t const *,stardata,args);
+    Map_varg(struct disc_t DISC_CONST *,disc,args);
+    Map_varg(struct binary_system_t const *,binary,args);
     va_end(args);
     const double R = x;
     const double h = disc_specific_angular_momentum(R,binary);
diff --git a/src/disc/disc_prototypes.h b/src/disc/disc_prototypes.h
index 549b86150..0903f5e80 100644
--- a/src/disc/disc_prototypes.h
+++ b/src/disc/disc_prototypes.h
@@ -80,7 +80,8 @@ double disc_velocity(const double radius,
 double disc_gravitational_pressure(const double radius,
                                    DISC_CONST struct disc_t * const disc,
                                    const struct binary_system_t * const binary);
-double disc_pressure_radius(struct disc_t * const disc,
+double disc_pressure_radius(struct stardata_t * const stardata,
+                            struct disc_t * const disc,
                             const struct binary_system_t * const binary,
                             const double P);
 double disc_scale_height(const double radius,
@@ -93,7 +94,8 @@ double disc_critical_surface_density_for_gravitational_collapse(const double rad
 double disc_Toomre_Q(const double radius,
                      struct disc_t * const disc,
                      const struct binary_system_t * const binary);
-double disc_minimum_Toomre_Q(const struct disc_t * const disc,
+double disc_minimum_Toomre_Q(struct stardata_t * const stardata,
+                             const struct disc_t * const disc,
                              const struct binary_system_t * const binary);
 
 double disc_opacity(const double radius,
@@ -163,19 +165,23 @@ double generic_power_law(double radius,
 Disc_zone_counter disc_nearest_zone_n(const double radius,
                                       const struct disc_t * const disc);
 
-void cbdisc_eccentricity_pumping_rate(struct stardata_t * stardata,
-                                      struct disc_t * disc,
-                                      const struct binary_system_t * binary,
-                                      double * edot,
-                                      double * jdot);
-double disc_half_angular_momentum_radius(const struct disc_t * const disc,
+void cbdisc_eccentricity_pumping_rate(struct stardata_t * const stardata,
+                                      struct disc_t * const disc,
+                                      const struct binary_system_t * const binary,
+                                      double * const edot,
+                                      double * const jdot);
+double disc_half_angular_momentum_radius(struct stardata_t * const stardata,
+                                         const struct disc_t * const disc,
                                          const struct binary_system_t * const binary);
-double disc_half_mass_radius(const struct disc_t * const disc,
+double disc_half_mass_radius(struct stardata_t * stardata,
+                             const struct disc_t * const disc,
                              const struct binary_system_t * const binary);
-double disc_mass_radius(const struct disc_t * const disc,
+double disc_mass_radius(struct stardata_t * stardata,
+                        const struct disc_t * const disc,
                         const struct binary_system_t * const binary,
                         const double m);
-double disc_angular_momentum_radius(const struct disc_t * const disc,
+double disc_angular_momentum_radius(struct stardata_t * const stardata,
+                                    const struct disc_t * const disc,
                                     const struct binary_system_t * const binary,
                                     const double j);
 double disc_inner_edge_accretion_f(struct stardata_t * stardata);
@@ -184,7 +190,8 @@ double Pure_function disc_angular_momentum_flux(const double radius,
                                                 const struct disc_t * const disc,
                                                 const struct binary_system_t * const binary);
 
-double disc_Owen_2012_total_mdot(const struct binary_system_t * const binary);
+double disc_Owen_2012_total_mdot(struct stardata_t * const stardata,
+                                 const struct binary_system_t * const binary);
 
 double disc_Owen_2012_sigmadot(struct disc_t * const disc,
                                const struct binary_system_t * const binary,
@@ -197,32 +204,38 @@ double disc_Owen_2012_sigmadot_integral(struct disc_t * disc,
                                         const struct binary_system_t * binary,
                                         const double Rin,
                                         const double Rout);
-void disc_Owen_2012_normalize(struct disc_t * disc,
-                              const struct binary_system_t * binary);
+void disc_Owen_2012_normalize(struct stardata_t * const stardata,
+                              struct disc_t * const disc,
+                              const struct binary_system_t * const binary);
 
 double disc_Owen_2012_mdot(struct disc_t * disc,
                            const struct binary_system_t * binary,
                            const double Rin,
                            const double Rout);
 
-double disc_Owen_2012_angmom_integral(struct disc_t * disc,
-                                      const struct binary_system_t * binary,
+double disc_Owen_2012_angmom_integral(struct stardata_t * const stardata,
+                                      struct disc_t * const disc,
+                                      const struct binary_system_t * const binary,
                                       const double Rin,
                                       const double Rout);
 
 
-void disc_show_thermal_zones(struct disc_t * disc,
+void disc_show_thermal_zones(struct stardata_t * const stardata,
+                             struct disc_t * const disc,
                              const struct disc_thermal_zone_t * zones,
                              const int n);
-void disc_show_disc(struct disc_t * disc,
-                    const struct binary_system_t * binary);
+void disc_show_disc(struct stardata_t * const stardata,
+                    struct disc_t * const disc,
+                    const struct binary_system_t * const binary);
 
 double disc_Rcross(const struct disc_thermal_zone_t * const z1,
                    const struct disc_thermal_zone_t * const z2);
-Boolean disc_determine_zone_radii(struct disc_t * const disc);
+Boolean disc_determine_zone_radii(struct stardata_t * const stardata,
+                                  struct disc_t * const disc);
 
 
-int disc_build_disc_zones(struct disc_t * const disc,
+int disc_build_disc_zones(struct stardata_t * const stardata,
+                          struct disc_t * const disc,
                           const struct binary_system_t * const binary);
 
 void disc_initial_radiative_guesses(const struct binary_system_t * const binary,
@@ -233,7 +246,8 @@ double disc_ring_radius(const struct disc_t * const disc,
 
 void disc_make_derived_powerlaws(struct disc_t * const disc,
                                  const struct binary_system_t * const binary);
-Boolean disc_new_zone_list(struct disc_t * const disc,
+Boolean disc_new_zone_list(struct stardata_t * const stardata,
+                           struct disc_t * const disc,
                            const struct binary_system_t * const binary,
                            struct disc_thermal_zone_t * const thermal_zones);
 
@@ -315,7 +329,8 @@ void disc_nsector(unsigned int n,
                   double * residual,
                   void * p);
 
-void disc_convergence_status(const char * const s,
+void disc_convergence_status(struct stardata_t * const stardata,
+                             const char * const s,
                              const struct disc_t * const disc,
                              const struct binary_system_t * const binary);
 
@@ -379,7 +394,8 @@ void disc_edge_stripping(struct stardata_t * const stardata,
                          struct disc_t * const olddisc,
                          const struct binary_system_t * const binary);
 
-void disc_calculate_derived_variables(struct disc_t * const disc,
+void disc_calculate_derived_variables(struct stardata_t * const stardata,
+                                      struct disc_t * const disc,
                                       const struct binary_system_t * const binary);
 
 void disc_edge_loss_angular_momentum_flux(struct disc_t * const disc,
@@ -394,7 +410,8 @@ void disc_mass_changes(struct stardata_t * const stardata,
 Boolean disc_rezone(struct disc_t * const disc,
                     const struct binary_system_t * const binary);
 
-void disc_setup_zones(struct disc_t * const disc,
+void disc_setup_zones(struct stardata_t * const stardata,
+                      struct disc_t * const disc,
                       const struct binary_system_t * const binary);
 
 void disc_set_temperature_power_laws(struct disc_t * const disc);
@@ -428,7 +445,8 @@ int disc_setup_convergence_parameter_types_and_constraints(struct stardata_t * c
 //#pragma GCC diagnostic push
 //#pragma GCC diagnostic ignored "-Wpedantic"
 
-void disc_set_disc_initial_guess(struct disc_t * const disc,
+void disc_set_disc_initial_guess(struct stardata_t * const stardata,
+                                 struct disc_t * const disc,
                                  const int iguess,
                                  int n,/* VLA initial_guesses REQUIRES this to be type int, not const int */
                                  const disc_parameter * const parameter_types,
@@ -483,7 +501,8 @@ void disc_equation_checker(const double r,
 int disc_n_valid_zones(const struct disc_t * const disc);
 
 
-void disc_zone_crossing_radii(struct disc_t  * const disc,
+void disc_zone_crossing_radii(struct stardata_t * const stardata,
+                              struct disc_t  * const disc,
                               const struct binary_system_t * const binary,
                               double ** radii_p);
 
diff --git a/src/disc/disc_quadsector.c b/src/disc/disc_quadsector.c
index aad30bd24..1ee6c88e3 100644
--- a/src/disc/disc_quadsector.c
+++ b/src/disc/disc_quadsector.c
@@ -95,7 +95,7 @@ void disc_quadsector2(struct stardata_t * stardata MAYBE_UNUSED,
      * so is not a static function.
      */
 
-    int status = disc_build_disc_zones(disc,binary);
+    int status = disc_build_disc_zones(stardata,disc,binary);
 
     Discdebug(2,
               "Quadsector: Built disc zones: %s : Rin=%g Rout=%g\n",
diff --git a/src/disc/disc_set_disc_initial_guess.c b/src/disc/disc_set_disc_initial_guess.c
index 7050b7c59..3081a7f51 100644
--- a/src/disc/disc_set_disc_initial_guess.c
+++ b/src/disc/disc_set_disc_initial_guess.c
@@ -9,7 +9,8 @@ No_empty_translation_unit_warning;
 #endif
 #include "disc_constraints.h"
 
-void disc_set_disc_initial_guess(struct disc_t * const disc,
+void disc_set_disc_initial_guess(struct stardata_t * const stardata,
+                                 struct disc_t * const disc,
                                  const int iguess,
                                  int n,/* VLA initial_guesses REQUIRES this to be type int, not const int */
                                  const disc_parameter * const parameter_types,
diff --git a/src/disc/disc_setup_zones.c b/src/disc/disc_setup_zones.c
index 1578ab76e..31af879a5 100644
--- a/src/disc/disc_setup_zones.c
+++ b/src/disc/disc_setup_zones.c
@@ -2,7 +2,8 @@
 No_empty_translation_unit_warning;
 
 #ifdef DISCS
-void disc_setup_zones(struct disc_t * const disc,
+void disc_setup_zones(struct stardata_t * const stardata,
+                      struct disc_t * const disc,
                       const struct binary_system_t * const binary)
 {
     /*
@@ -10,7 +11,7 @@ void disc_setup_zones(struct disc_t * const disc,
      * derive the various power laws in the disc,
      * perhaps check them for consistency.
      */
-    if(disc_determine_zone_radii(disc) == TRUE)
+    if(disc_determine_zone_radii(stardata,disc) == TRUE)
     {
         disc_make_derived_powerlaws(disc,binary);
 
diff --git a/src/disc/disc_show_disc.c b/src/disc/disc_show_disc.c
index a6abbc138..3ed34ba7a 100644
--- a/src/disc/disc_show_disc.c
+++ b/src/disc/disc_show_disc.c
@@ -3,8 +3,9 @@ No_empty_translation_unit_warning;
 
 #ifdef DISCS
 
-void disc_show_disc(struct disc_t * disc,
-                    const struct binary_system_t * binary)
+void disc_show_disc(struct stardata_t * const stardata,
+                    struct disc_t * const disc,
+                    const struct binary_system_t * const binary)
 {
     printf("===========================================================\n");
     printf("DISC %p at lifetime = %20.12g (%g 20.12y), M=%g (%g Msun), J=%g, F=%g, alpha=%g, gamma=%g, torqueF=%g, fuv=%g, kappa=%g, Rin=%g cm (%g Rsun %g AU), Rout=%g (%g Rsun %g AU), dt=%g, Tvisc0=%g, sigma0=%g, mu=%g, T(Rin)=%g; H(in)/R(in)=%g L=%g L_sun : solver %s guess %d\n",
@@ -32,7 +33,10 @@ void disc_show_disc(struct disc_t * disc,
            Solver_string(disc->solver),
            disc->guess
         );
-    disc_show_thermal_zones(disc,disc->thermal_zones,disc->n_thermal_zones);
+    disc_show_thermal_zones(stardata,
+                            disc,
+                            disc->thermal_zones,
+                            disc->n_thermal_zones);
     double _M = disc_total_mass(disc);
     double _J = disc_total_angular_momentum(disc,binary);
     double _F = disc_total_angular_momentum_flux(disc,binary);
diff --git a/src/disc/disc_show_thermal_zones.c b/src/disc/disc_show_thermal_zones.c
index 54814d896..5d688a65a 100644
--- a/src/disc/disc_show_thermal_zones.c
+++ b/src/disc/disc_show_thermal_zones.c
@@ -5,7 +5,8 @@ No_empty_translation_unit_warning;
 /*
  * show disc thermal zone structure
  */
-void disc_show_thermal_zones(struct disc_t * disc,
+void disc_show_thermal_zones(struct stardata_t * const stardata,
+                             struct disc_t * const disc,
                              const struct disc_thermal_zone_t * zones,
                              const int n)
 {
@@ -27,8 +28,8 @@ void disc_show_thermal_zones(struct disc_t * disc,
         }
     }
 
-#define NORMAL_COLOUR(z) (z->valid==TRUE ? BRIGHT_GREEN : RED)
-#define ERROR_COLOUR (YELLOW)
+#define NORMAL_COLOUR(z) (z->valid==TRUE ? stardata->store->colours[BRIGHT_GREEN] : stardata->store->colours[RED])
+#define ERROR_COLOUR (stardata->store->colours[YELLOW])
 #define ASSERT_COLOUR(A) ((A)==TRUE ? (ERROR_COLOUR) : "")
 
     for(i=0;i<max;i++)
@@ -86,7 +87,7 @@ void disc_show_thermal_zones(struct disc_t * disc,
             printf(": prefactor=%g exponent=%g%s Tstart=%g (from A0=%g R0=%g %s exponent=%g) T(rstart)=%g Sigma(rstart)=%g [zone M=%20.10g Msun] %s\n",
                    z->Tlaw.A0,
                    z->Tlaw.exponent,
-                   CYAN,
+                   stardata->store->colours[CYAN],
                    (
                        Is_really_zero(z->Tlaw.A1) ?
                        // power law not yet complete
@@ -100,7 +101,7 @@ void disc_show_thermal_zones(struct disc_t * disc,
                    power_law(&z->Tlaw,z->rstart),
                    power_law(&z->power_laws[POWER_LAW_SIGMA],z->rstart),
                    dmzone/M_SUN,
-                   COLOUR_RESET
+                   stardata->store->colours[COLOUR_RESET]
                 );
             fflush(stdout);
         }
diff --git a/src/disc/disc_structure_functions.c b/src/disc/disc_structure_functions.c
index 8bd48f294..7dad8579a 100644
--- a/src/disc/disc_structure_functions.c
+++ b/src/disc/disc_structure_functions.c
@@ -211,7 +211,8 @@ double disc_Toomre_Q(const double radius,
 static double Toomre_Q_minimizer(double x,
                                  void * params);
 
-double disc_minimum_Toomre_Q(const struct disc_t * const disc,
+double disc_minimum_Toomre_Q(struct stardata_t * const stardata,
+                             const struct disc_t * const disc,
                              const struct binary_system_t * const binary)
 {
     /*
@@ -413,7 +414,8 @@ double disc_viscous_timescale(const double radius,
         (Pow2(radius)/(5.0 * disc_kinematic_viscosity(radius,disc,binary)));
 }
 
-double disc_half_angular_momentum_radius(const struct disc_t * const disc,
+double disc_half_angular_momentum_radius(struct stardata_t * const stardata,
+                                         const struct disc_t * const disc,
                                          const struct binary_system_t * const binary)
 {
     /*
@@ -421,7 +423,10 @@ double disc_half_angular_momentum_radius(const struct disc_t * const disc,
      * momentum radius.
      */
 
-    double rjhalf = disc_angular_momentum_radius(disc,binary,disc->J*0.5);
+    double rjhalf = disc_angular_momentum_radius(stardata,
+                                                 disc,
+                                                 binary,
+                                                 disc->J*0.5);
 
     /*
      * On error, return the previous value, which may be zero.
@@ -440,7 +445,8 @@ double disc_half_angular_momentum_radius(const struct disc_t * const disc,
 
 }
 
-double disc_angular_momentum_radius(const struct disc_t * const disc,
+double disc_angular_momentum_radius(struct stardata_t * const stardata,
+                                    const struct disc_t * const disc,
                                     const struct binary_system_t * const binary,
                                     const double j)
 {
@@ -480,6 +486,7 @@ double disc_angular_momentum_radius(const struct disc_t * const disc,
                                         DISC_BISECT_RJ_ATTEMPTS,
                                         DISC_BISECT_RJ_USELOG,
                                         1.0,
+                                        stardata,
                                         disc,
                                         binary,
                                   j);
@@ -500,7 +507,8 @@ double disc_angular_momentum_radius(const struct disc_t * const disc,
     return radius;
 }
 
-double disc_half_mass_radius(const struct disc_t * const disc,
+double disc_half_mass_radius(struct stardata_t * const stardata,
+                             const struct disc_t * const disc,
                              const struct binary_system_t * const binary)
 {
 
@@ -510,12 +518,14 @@ double disc_half_mass_radius(const struct disc_t * const disc,
      *
      * Returns 0.0 on error.
      */
-    return disc_mass_radius(disc,
+    return disc_mass_radius(stardata,
+                            disc,
                             binary,
                             disc->M*0.5);
 }
 
-double disc_mass_radius(const struct disc_t * const disc,
+double disc_mass_radius(struct stardata_t * const stardata,
+                        const struct disc_t * const disc,
                         const struct binary_system_t * const binary,
                         const double m)
 {
@@ -549,6 +559,7 @@ double disc_mass_radius(const struct disc_t * const disc,
             DISC_BISECT_RM_ATTEMPTS,
             DISC_BISECT_RM_USELOG,
             1.0,
+            stardata,
             disc,
             binary,
             m);
@@ -578,6 +589,7 @@ static double disc_angular_momentum_radius_bisector(const double r,
      * Bisect the half angular momentum radius
      */
     Map_GSL_params(p,args);
+    Map_varg(struct stardata_t *,stardata,args);
     Map_varg(struct disc_t *,disc,args);
     Map_varg(struct binary_system_t *,binary,args);
     Map_varg(const double,j,args);
@@ -622,6 +634,7 @@ static double disc_mass_radius_bisector(const double r,
      * Bisect for a given mass
      */
     Map_GSL_params(p,args);
+    Map_varg(struct stardata_t *,stardata,args);
     Map_varg(struct disc_t *,disc,args);
     Map_varg(struct binary_system_t *, binary,args);
     Map_varg(const double,m,args);
@@ -647,7 +660,8 @@ static double disc_mass_radius_bisector(const double r,
 }
 
 
-double disc_pressure_radius(struct disc_t * const disc,
+double disc_pressure_radius(struct stardata_t * const stardata,
+                            struct disc_t * const disc,
                             const struct binary_system_t * const binary,
                             const double P)
 {
diff --git a/src/disc/disc_trisector.c b/src/disc/disc_trisector.c
index 3799c93e4..b9b19bd21 100644
--- a/src/disc/disc_trisector.c
+++ b/src/disc/disc_trisector.c
@@ -97,7 +97,7 @@ void disc_trisector2(struct stardata_t * stardata MAYBE_UNUSED,
      * called from elsewhere for debugging purposes,
      * so is not a static function.
      */
-    int status = disc_build_disc_zones(disc,binary);
+    int status = disc_build_disc_zones(stardata,disc,binary);
 
     DD("Trisector: Built disc zones: %s : Rin=%g Rout=%g Rsun\n",
        status==DISC_ZONES_OK ? "ok" : "failed",
diff --git a/src/disc/disc_zone_crossing_radii.c b/src/disc/disc_zone_crossing_radii.c
index c38837cb0..d36de3267 100644
--- a/src/disc/disc_zone_crossing_radii.c
+++ b/src/disc/disc_zone_crossing_radii.c
@@ -4,6 +4,7 @@ No_empty_translation_unit_warning;
 #ifdef DISCS
 
 void disc_zone_crossing_radii(
+    struct stardata_t * const stardata,
     struct disc_t  * const disc,
     const struct binary_system_t * const binary,
     double ** radii_p
@@ -18,7 +19,7 @@ void disc_zone_crossing_radii(
         Malloc(sizeof(struct disc_thermal_zone_t)*
                (DISCS_MAX_N_ZONES));
 
-    if(disc_new_zone_list(disc,binary,P) == DISC_ZONES_OK)
+    if(disc_new_zone_list(stardata,disc,binary,P) == DISC_ZONES_OK)
     {
         Disc_zone_counter i,j,current=0;
 
diff --git a/src/disc/evolve_disc.c b/src/disc/evolve_disc.c
index 39293742c..5c1fb20d0 100644
--- a/src/disc/evolve_disc.c
+++ b/src/disc/evolve_disc.c
@@ -69,7 +69,10 @@ void evolve_disc(struct stardata_t * const stardata,
              * sure the code is working
              */
 
-            disc_convergence_status("post-init-binary-structure",disc,&binary);
+            disc_convergence_status(stardata,
+                                    "post-init-binary-structure",
+                                    disc,
+                                    &binary);
 
             /* choose the most evolved star */
             const Star_number nstar = stardata->star[0].stellar_type > stardata->star[1].stellar_type ? 0 : 1;
diff --git a/src/ensemble/ensemble_disc_log.c b/src/ensemble/ensemble_disc_log.c
index 2e76e1954..50924baba 100644
--- a/src/ensemble/ensemble_disc_log.c
+++ b/src/ensemble/ensemble_disc_log.c
@@ -108,8 +108,8 @@ void ensemble_disc_log(struct stardata_t * const stardata,
             const double Tin = disc_inner_edge_temperature(disc);
             const double Tout = disc_outer_edge_temperature(disc);
             const double Idisc = disc_total_moment_of_inertia(disc);
-            const double RMhalf = disc_half_mass_radius(disc,b);
-            const double RJhalf = disc_half_angular_momentum_radius(disc,b);
+            const double RMhalf = disc_half_mass_radius(stardata,disc,b);
+            const double RJhalf = disc_half_angular_momentum_radius(stardata,disc,b);
             const Star_number overflower = stardata->model.comenv_overflower;
             const double Mdotwind =
                 Disc_Mdot(DISC_LOSS_GLOBAL)+
@@ -127,7 +127,7 @@ void ensemble_disc_log(struct stardata_t * const stardata,
                 Disc_Jdot(DISC_LOSS_OUTER_EDGE_STRIP);
             const double hwind = Is_really_not_zero(Mdotwind) ?
                 (Jdotwind / Mdotwind) : 0.0;
-            const double min_Toomre_Q = disc_minimum_Toomre_Q(disc,b);
+            const double min_Toomre_Q = disc_minimum_Toomre_Q(stardata,disc,b);
             const double HRin = Disc_scale_height_ratio(in);
             const double HRout = Disc_scale_height_ratio(out);
             if(disc->firstlog == TRUE)
diff --git a/src/evolution/apply_derivatives.c b/src/evolution/apply_derivatives.c
index 7de062283..1e73d287e 100644
--- a/src/evolution/apply_derivatives.c
+++ b/src/evolution/apply_derivatives.c
@@ -94,13 +94,13 @@ int apply_derivatives(struct stardata_t * const stardata,
         retval = SYSTEM_ACTION_CONTINUE_RLOF;
     }
     Dprint("%snew dM/dt M1=%g M2=%g RLOF %g separation %30.20e, new Jorb %30.20e\n%s",
-           MAGENTA,
+           stardata->store->colours[MAGENTA],
            stardata->star[0].mass,
            stardata->star[1].mass,
            stardata->star[1].derivative[DERIVATIVE_STELLAR_MASS_RLOF_LOSS],
            stardata->common.orbit.separation,
            stardata->common.orbit.angular_momentum,
-           COLOUR_RESET);
+           stardata->store->colours[COLOUR_RESET]);
 
     return retval;
 }
diff --git a/src/evolution/evolve_system_binary_c.c b/src/evolution/evolve_system_binary_c.c
index 143fd4c2e..7c3382f81 100644
--- a/src/evolution/evolve_system_binary_c.c
+++ b/src/evolution/evolve_system_binary_c.c
@@ -11,13 +11,13 @@ No_empty_translation_unit_warning;
 /* eprint is the local debugging statement */
 #define eprint(...)                                                     \
     fprintf(stdout,"%sZOOM dt_zoomfac %g : M1 %g %g : ",                \
-            YELLOW,                                                     \
+            stardata->store->colours[YELLOW],                                                     \
             stardata->model.dt_zoomfac,                                 \
             stardata->star[0].mass,                                     \
             stardata->star[0].phase_start_mass);                        \
     fprintf(stdout,__VA_ARGS__);                                        \
     fflush(stdout);                                                     \
-    fprintf(stdout,"%s",COLOUR_RESET);
+    fprintf(stdout,"%s",stardata->store->colours[COLOUR_RESET]);
 #undef eprint
 #define eprint(...) /* do nothing */
 
diff --git a/src/evolution/time_evolution.h b/src/evolution/time_evolution.h
index 43e2eab75..4a40ce2cb 100644
--- a/src/evolution/time_evolution.h
+++ b/src/evolution/time_evolution.h
@@ -5,7 +5,7 @@
 /*
  * Macros used in time_evolution.c
  */
-//#define eprint(...) printf("%s",MAGENTA);printf(__VA_ARGS__);printf("M1=%g\n",stardata->star[0].phase_start_mass);printf("%s",COLOUR_RESET);fflush(stdout);
+//#define eprint(...) printf("%s",stardata->store->colours[MAGENTA]);printf(__VA_ARGS__);printf("M1=%g\n",stardata->star[0].phase_start_mass);printf("%s",stardata->store->colours[COLOUR_RESET]);fflush(stdout);
 #define eprint(...) /* do nothing */
 
 #define Modulate_solver_timestep(F)             \
@@ -22,8 +22,8 @@
 
 
 #ifdef NEW_ADAPTIVE_RLOF_CODE
-#define __X1 printf("%s FIRST pre-RLOF STEP %s\n",RED,COLOUR_RESET);
-#define __X2 printf("%s DONE FIRST STEP %s\n",RED,COLOUR_RESET);
+#define __X1 printf("%s FIRST pre-RLOF STEP %s\n",stardata->store->colours[RED],stardata->store->colours[COLOUR_RESET]);
+#define __X2 printf("%s DONE FIRST STEP %s\n",stardata->store->colours[RED],stardata->store->colours[COLOUR_RESET]);
 #else // NEW_ADAPTIVE_RLOF_CODE
 #define __X1 /* do nothing */
 #define __X2 /* do nothing */
diff --git a/src/evolution/update_the_time.c b/src/evolution/update_the_time.c
index 0c63e32be..a6abd61b6 100644
--- a/src/evolution/update_the_time.c
+++ b/src/evolution/update_the_time.c
@@ -17,10 +17,10 @@ void update_the_time(struct stardata_t * RESTRICT const stardata)
     if(stardata->preferences->timestep_logging == TRUE)
     {
         printf("%sincrease time by dtm=%30.12e to %30.12e (log=%30.20g)%s\n",
-               GREEN,
+               stardata->store->colours[GREEN],
                stardata->model.dtm,
                stardata->model.time,
                log10(Max(1e-99,stardata->model.time)),
-               COLOUR_RESET);
+               stardata->store->colours[COLOUR_RESET]);
     }
 }
diff --git a/src/logging/ansi_colours.h b/src/logging/ansi_colours.h
index 83251ee46..a3ea4488e 100644
--- a/src/logging/ansi_colours.h
+++ b/src/logging/ansi_colours.h
@@ -1,3 +1,9 @@
+#pragma once
+
+#ifndef ANSI_COLOURS_H
+#define ANSI_COLOURS_H
+
+
 #ifdef USE_ANSI_COLOURS
 
 /*
@@ -7,52 +13,60 @@
  * character, also written (in non-ISO, but works
  * in gcc and clang) \e
  */
+#define ANSI_COLOURS_LIST                       \
+    X( BLACK, "\x1B[0;30m")                      \
+    X( RED, "\x1B[0;31m")                        \
+    X( GREEN, "\x1B[0;32m")                      \
+    X( YELLOW, "\x1B[0;33m")                     \
+    X( ORANGE, "\x1B[0;33m")                     \
+    X( BLUE, "\x1B[0;34m")                       \
+    X( MAGENTA, "\x1B[0;35m")                    \
+    X( CYAN, "\x1B[0;36m")                       \
+    X( WHITE, "\x1B[0;37m")                      \
+    X( BOLD, "\x1B[0;1m")                        \
+    X( BRIGHT_RED, "\x1B[1;31m")                 \
+    X( BRIGHT_GREEN, "\x1B[1;32m")               \
+    X( BRIGHT_YELLOW, "\x1B[1;33m")              \
+    X( BRIGHT_BLUE, "\x1B[1;34m")                \
+    X( BRIGHT_MAGENTA, "\x1B[1;35m")             \
+    X( BRIGHT_CYAN, "\x1B[1;36m")                \
+    X( BRIGHT_WHITE, "\x1B[1;37m")               \
+    X( BRIGHT_BOLD, "\x1B[1;1m")                 \
+    X( UNDERLINE, "\x1B[0;4m")                   \
+    X( COLOUR_RESET, "\x1B[0;0m")
 
-#define BLACK "\x1B[0;30m"
-
-#define RED "\x1B[0;31m"
-#define GREEN "\x1B[0;32m"
-#define YELLOW "\x1B[0;33m"
-#define ORANGE "\x1B[0;33m"
-#define BLUE "\x1B[0;34m"
-#define MAGENTA "\x1B[0;35m"
-#define CYAN "\x1B[0;36m"
-#define WHITE "\x1B[0;37m"
-#define BOLD "\x1B[0;1m"
-
-#define BRIGHT_RED "\x1B[1;31m"
-#define BRIGHT_GREEN "\x1B[1;32m"
-#define BRIGHT_YELLOW "\x1B[1;33m"
-#define BRIGHT_BLUE "\x1B[1;34m"
-#define BRIGHT_MAGENTA "\x1B[1;35m"
-#define BRIGHT_CYAN "\x1B[1;36m"
-#define BRIGHT_WHITE "\x1B[1;37m"
-#define BRIGHT_BOLD "\x1B[1;1m"
-
-#define UNDERLINE "\x1B[0;4m"
-
-#define COLOUR_RESET "\x1B[0;0m"
 #define DEBUG_COLOURS
 
 #define FILE_LOG_COLOURS
 #else//USE_ANSI_COLOURS
-#define BLACK ""
-#define RED ""
-#define BRIGHT_RED ""
-#define GREEN ""
-#define BRIGHT_GREEN ""
-#define YELLOW ""
-#define BRIGHT_YELLOW ""
-#define BLUE ""
-#define BRIGHT_BLUE ""
-#define MAGENTA ""
-#define BRIGHT_MAGENTA ""
-#define CYAN ""
-#define BRIGHT_CYAN ""
-#define WHITE ""
-#define BRIGHT_WHITE ""
-#define BOLD ""
-#define BRIGHT_BOLD ""
-#define UNDERLINE ""
-#define COLOUR_RESET ""
+#define ANSI_COLOURS_LIST                       \
+    X( BLACK, "" )                              \
+        X( RED, "" )                            \
+        X( BRIGHT_RED, "" )                     \
+        X( GREEN, "" )                          \
+        X( BRIGHT_GREEN, "" )                   \
+        X( YELLOW, "" )                         \
+        X( BRIGHT_YELLOW, "" )                  \
+        X( BLUE, "" )                           \
+        X( BRIGHT_BLUE, "" )                    \
+        X( MAGENTA, "" )                        \
+    X( BRIGHT_MAGENTA, "" )                     \
+    X( CYAN, "" )                               \
+    X( BRIGHT_CYAN, "" )                        \
+    X( WHITE, "" )                              \
+    X( BRIGHT_WHITE, "" )                       \
+    X( BOLD, "" )                               \
+    X( BRIGHT_BOLD, "" )                        \
+    X( UNDERLINE, "" )                          \
+    X( COLOUR_RESET, "" )
+
 #endif//USE_ANSI_COLOURS
+
+
+
+#undef X
+#define X(COLOUR,STRING) COLOUR,
+enum { ANSI_COLOURS_LIST NUM_ANSI_COLOURS };
+#undef X
+
+#endif // ANSI_COLOURS_H
diff --git a/src/logging/log_every_timestep.c b/src/logging/log_every_timestep.c
index d3f3a1961..bf8b6b60c 100644
--- a/src/logging/log_every_timestep.c
+++ b/src/logging/log_every_timestep.c
@@ -3075,4 +3075,22 @@ void log_every_timestep(struct stardata_t * RESTRICT const stardata)
            stardata->star[0].derivative[DERIVATIVE_STELLAR_MASS_WIND_LOSS]
         );
 */
+
+    /*
+    static int xxx = 0;
+    static double tcomenv = 0.0;
+    if(xxx==0 && stardata->model.comenv_count == 1)
+    {
+        tcomenv = stardata->model.time;
+        printf("COMENV %g\n",tcomenv);
+        xxx = 1;
+    }
+    if(xxx==1 && Teff(0)>60000)
+    {
+        printf("COMENV HOT %g : %g\n",
+               stardata->model.time,
+               1e6*(stardata->model.time - tcomenv));
+        xxx=2;
+    }
+    */
 }
diff --git a/src/logging/logfile_macros.h b/src/logging/logfile_macros.h
index ec63b258f..fa76e62fa 100644
--- a/src/logging/logfile_macros.h
+++ b/src/logging/logfile_macros.h
@@ -33,9 +33,9 @@
 #define prevstring (stardata->common.file_log_prevstring)
 
 #define Log_RLOF_colour(X)                          \
-    File_log_colour((X) < 0.8 ? GREEN :             \
-                    (X) < 0.9 ? YELLOW :            \
-                    (X) < 0.999 ? BRIGHT_YELLOW :   \
-                    BRIGHT_RED)
+    File_log_colour((X) < 0.8 ? stardata->store->colours[GREEN] :             \
+                    (X) < 0.9 ? stardata->store->colours[YELLOW] :            \
+                    (X) < 0.999 ? stardata->store->colours[BRIGHT_YELLOW] :   \
+                    stardata->store->colours[BRIGHT_RED])
 
 #endif // LOGFILE_MACROS_H
diff --git a/src/logging/logfile_string.c b/src/logging/logfile_string.c
index 6ca8e56af..45d0c3777 100644
--- a/src/logging/logfile_string.c
+++ b/src/logging/logfile_string.c
@@ -16,6 +16,7 @@ char * logfile_string(const double time,
                       const Stellar_type stellar_type1,
                       const Boolean hybrid2,
                       const double sep,
+                      const double per,
                       const double ecc,
                       const double r1_rol, /* r1/roche_radius */
                       const double r2_rol, /* r2/roche_radius */
@@ -54,8 +55,18 @@ char * logfile_string(const double time,
 #if (DEBUG==1)
         char teststring[STRING_LENGTH];
         snprintf(teststring,STRING_LENGTH,
-                 "%11.4lf  %9.3lf  %9.3lf  %i  %i  %13.3lf %6.2lf  %.3lf %.3lf  %s\n",
-                 time,m1,m2,stellar_type0,stellar_type1,sep,ecc,Min(999.0,r1_rol),Min(999.0,r2_rol),type);
+                 "%11.4lf  %9.3lf  %9.3lf  %i  %i  %13.3lf %6.2lf %6.2lf  %.3lf %.3lf  %s\n",
+                 time,
+                 m1,
+                 m2,
+                 stellar_type0,
+                 stellar_type1,
+                 sep,
+                 per,
+                 ecc,
+                 Min(999.0,r1_rol),
+                 Min(999.0,r2_rol),
+                 type);
         Dprint("FP output to log file \"%s\"\n",teststring);
 #endif /*DEBUG*/
 
@@ -74,19 +85,41 @@ char * logfile_string(const double time,
             cached = FALSE;
         }
 
+        const char * const up = stardata->store->upchar;
+        const char * const down = stardata->store->downchar;
+        const char * const nochange = stardata->store->nochangechar;
+
+#define _Rising_or_falling(NOW,PREV) (                                  \
+            stardata->preferences->log_arrows == TRUE ?                 \
+            (                                                           \
+                (stardata->previous_stardata==NULL||stardata->model.model_number==0) ? " " : \
+                Fequal((NOW),(PREV)) ? nochange                         \
+                : (NOW) > (PREV) ? up : down                            \
+                ) : ""                                                  \
+            )
+
+#define Rising_or_falling(VAR)                                  \
+        _Rising_or_falling(stardata->VAR,                       \
+                           stardata->previous_stardata->VAR)
+#define Rising_or_falling_ratio(VAR1,VAR2)                      \
+        _Rising_or_falling(stardata->VAR1/stardata->VAR2,       \
+                           stardata->previous_stardata->VAR1/   \
+                           stardata->previous_stardata->VAR2)
+
 #ifdef TRIPLE
         /*
          * triple-star log
          */
         snprintf(logstring,
                  LOGSTRINGLENGTH,
-                 "%11.7lf %9.5lf %9.5lf %3s %3s %13.8le %10.8le %12.7lf %12.7lf  %12.7lf %s",
+                 "%11.7lf %9.5lf %9.5lf %3s %3s %13.8le %10.8le %10.8le %12.7lf %12.7lf  %12.7lf %s",
                  time,
                  m1,
                  m2,
                  c1,
                  c2,
                  (NEITHER_STAR_MASSLESS ? sep : -1.0),
+                 per,
                  ecc,
                  stardata->common.orbit.inclination,
                  stardata->common.orbit.longitude_of_ascending_node,
@@ -95,27 +128,42 @@ char * logfile_string(const double time,
 #else
         snprintf(logstring,
                  LOGSTRINGLENGTH,
-                 "%s%11.4lf%s%9.3lf%9.3lf%s%3s%3s%s%13.5g%6.2lf%s%s%8.3lf%s%s%8.3lf  %s%s%s",
-                 File_log_colour(ORANGE),
+                 "%s%11.4lf%s%9.3lf%s%s%9.3lf%s%s%3s%s%s%3s%s%s%13.5g%s%s%8.3g%c%s%s%6.2lf%s%s%s%s%8.3lf%s%s%s%8.3lf%s  %s%s%s",
+                 File_log_colour(stardata->store->colours[ORANGE]),
                  time,
-                 File_log_colour(RED),
+                 File_log_colour(stardata->store->colours[RED]),
                  m1,
+                 Rising_or_falling(star[0].mass),
+                 File_log_colour(stardata->store->colours[RED]),
                  m2,
-                 File_log_colour(WHITE),
+                 Rising_or_falling(star[1].mass),
+                 File_log_colour(stardata->store->colours[WHITE]),
                  c1,
+                 Rising_or_falling(star[0].stellar_type),
+                 File_log_colour(stardata->store->colours[WHITE]),
                  c2,
-                 File_log_colour(YELLOW),
+                 Rising_or_falling(star[1].stellar_type),
+                 File_log_colour(stardata->store->colours[YELLOW]),
                  (NEITHER_STAR_MASSLESS ? sep : -1.0),
+                 Rising_or_falling(common.orbit.separation),stardata->store->colours[YELLOW],
+                 (NEITHER_STAR_MASSLESS && per > 0.0)
+                 ? (per < DAY_LENGTH_IN_YEARS ? (per*YEAR_LENGTH_IN_HOURS) : per < 1.0 ? (per*YEAR_LENGTH_IN_DAYS) : per < 1e3 ? per : per<1e3 ? (per*1e-3) : per < 1e6 ? (per*1e-6) : (per*1e-9) )
+                 : -1.0,
+                 (NEITHER_STAR_MASSLESS && per>0.0) ? (per<DAY_LENGTH_IN_YEARS ? 'h' : per < 1.0 ? 'd' : per < 1e3 ? 'y' : per < 1e6 ? 'k' : per < 1e9 ? 'M' : 'G') : ' ',
+                 Rising_or_falling(common.orbit.period),stardata->store->colours[YELLOW],
                  (NEITHER_STAR_MASSLESS ? ecc : -1.0),
-                 File_log_colour(r1_rol < 1.0 ? COLOUR_RESET : UNDERLINE),
+                 Rising_or_falling(common.orbit.eccentricity),stardata->store->colours[YELLOW],
+                 File_log_colour(r1_rol < 1.0 ? stardata->store->colours[COLOUR_RESET] : stardata->store->colours[UNDERLINE]),
                  Log_RLOF_colour(r1_rol),
                  (NEITHER_STAR_MASSLESS ? Min(999.0,r1_rol) : 0.0),
-                 File_log_colour(r2_rol < 1.0 ? COLOUR_RESET : UNDERLINE),
+                 Rising_or_falling_ratio(star[0].radius,star[0].roche_radius),
+                 File_log_colour(r2_rol < 1.0 ? stardata->store->colours[COLOUR_RESET] : stardata->store->colours[UNDERLINE]),
                  Log_RLOF_colour(r2_rol),
                  (NEITHER_STAR_MASSLESS ? Min(999.0,r2_rol) : 0.0),
-                 File_log_colour(CYAN),
+                 Rising_or_falling_ratio(star[1].radius,star[1].roche_radius),
+                 File_log_colour(stardata->store->colours[CYAN]),
                  type,
-                 File_log_colour(COLOUR_RESET));
+                 File_log_colour(stardata->store->colours[COLOUR_RESET]));
 #endif // TRIPLE
 
 #ifdef CIRCUMBINARY_DISK_DERMINE
diff --git a/src/logging/logging_prototypes.h b/src/logging/logging_prototypes.h
index 60daec45c..5337225eb 100644
--- a/src/logging/logging_prototypes.h
+++ b/src/logging/logging_prototypes.h
@@ -14,6 +14,7 @@ void output_to_logfile(FILE * const fp,
                        const Stellar_type stellar_type1,
                        const Boolean hybrid2,
                        const double sep,
+                       const double per,
                        const double ecc,
                        const double r1_rol, /* r1/roche_radius */
                        const double r2_rol, /* r2/roche_radius */
@@ -30,6 +31,7 @@ char * logfile_string(const double time,
                       const Stellar_type stellar_type1,
                       const Boolean hybrid2,
                       const double sep,
+                      const double per,
                       const double ecc,
                       const double r1_rol, /* r1/roche_radius */
                       const double r2_rol, /* r2/roche_radius */
diff --git a/src/logging/logwrap.c b/src/logging/logwrap.c
index 5c84b3671..9e7f60c7d 100644
--- a/src/logging/logwrap.c
+++ b/src/logging/logwrap.c
@@ -18,6 +18,7 @@ void logwrap(struct stardata_t * RESTRICT const stardata,
                       stardata->star[1].stellar_type,
                       stardata->star[1].stellar_type==COWD ? stardata->star[1].hybrid_HeCOWD : FALSE,
                       stardata->common.orbit.separation,
+                      stardata->common.orbit.period,
                       stardata->common.orbit.eccentricity,
                       (Is_zero(stardata->star[0].roche_radius) ? 0.0 :
                        Max(0.0,stardata->star[0].radius/stardata->star[0].roche_radius)),
diff --git a/src/logging/open_log_files.c b/src/logging/open_log_files.c
index 2dc2f7401..3ad788844 100644
--- a/src/logging/open_log_files.c
+++ b/src/logging/open_log_files.c
@@ -32,6 +32,8 @@ void open_log_files(FILE *(*log_fp),
     }
 #endif
 
+    const char * const logspace = stardata->preferences->log_arrows == TRUE ? " " : "";
+
     if(unlikely(Strings_equal(stardata->preferences->log_filename,
                               "/dev/null")))
     {
@@ -43,13 +45,16 @@ void open_log_files(FILE *(*log_fp),
     {
         /* redirect output to stdout */
         *log_fp=stdout;
-        fprintf(*log_fp,"%s      TIME      M1       M2   K1 K2        SEP    ECC  R1/ROL1 R2/ROL2  TYPE",
-                File_log_colour(WHITE)
+        fprintf(*log_fp,"%s      TIME      M1       M2   K1 K2        SEP%s      PER%s    ECC%s  R1/ROL1 R2/ROL2  TYPE",
+                File_log_colour(stardata->store->colours[WHITE]),
+                logspace,
+                logspace,
+                logspace
             );
 #ifdef CIRCUMBINARY_DISK_DERMINE
         fprintf(*log_fp,"     MCBDISK");
 #endif
-        fprintf(*log_fp,"%s\n",File_log_colour(COLOUR_RESET));
+        fprintf(*log_fp,"%s\n",File_log_colour(stardata->store->colours[COLOUR_RESET]));
 #ifdef FILE_LOG_FLUSH
         fflush(*log_fp);
 #endif
@@ -59,14 +64,23 @@ void open_log_files(FILE *(*log_fp),
     {
         /* redirect output to stderr */
         *log_fp=stderr;
-        fprintf(*log_fp,"      TIME      M1       M2   K1 K2        SEP    ECC  R1/ROL1 R2/ROL2  TYPE%s",
-                File_log_colour(WHITE)
+        fprintf(*log_fp,"      TIME      M1%s       M2%s   K1%s K2%s        SEP%s      PER%s    ECC%s  R1/ROL1%s R2/ROL2%s  TYPE%s",
+                File_log_colour(stardata->store->colours[WHITE]),
+                logspace,
+                logspace,
+                logspace,
+                logspace,
+                logspace,
+                logspace,
+                logspace,
+                logspace,
+                logspace
                                 );
 #ifdef CIRCUMBINARY_DISK_DERMINE
         fprintf(*log_fp,"     MCBDISK");
 #endif // CIRCUMBINARY_DISK_DERMINE
         fprintf(*log_fp,"%s\n",
-                File_log_colour(COLOUR_RESET)
+                File_log_colour(stardata->store->colours[COLOUR_RESET])
             );
 #ifdef FILE_LOG_FLUSH
         fflush(*log_fp);
@@ -91,13 +105,22 @@ void open_log_files(FILE *(*log_fp),
         else
         {
             fprintf(*log_fp,
-                    "%s      TIME      M1       M2   K1  K2           SEP   ECC  R1/ROL1 R2/ROL2  TYPE RANDOM_SEED=%ld RANDOM_COUNT=%ld%s",
-                    File_log_colour(WHITE),
+                    "%s      TIME      M1%s       M2%s   K1%s  K2%s           SEP%s      PER%s   ECC%s  R1/ROL1%s R2/ROL2%s  TYPE RANDOM_SEED=%ld RANDOM_COUNT=%ld%s",
+                    File_log_colour(stardata->store->colours[WHITE]),
+                    logspace,
+                    logspace,
+                    logspace,
+                    logspace,
+                    logspace,
+                    logspace,
+                    logspace,
+                    logspace,
+                    logspace,
                     (stardata->preferences->cmd_line_random_seed != 0 ?
                      (long int)stardata->preferences->cmd_line_random_seed :
                      (long int)stardata->common.random_seed),
                     stardata->common.random_buffer.count,
-                    File_log_colour(COLOUR_RESET)
+                    File_log_colour(stardata->store->colours[COLOUR_RESET])
                 );
 #ifdef CIRCUMBINARY_DISK_DERMINE
             fprintf(*log_fp,"     MCBDISK");
@@ -110,7 +133,7 @@ void open_log_files(FILE *(*log_fp),
                         stardata->preferences->repeat);
             }
 #endif//LOG_REPEAT_NUMBER
-            fprintf(*log_fp,"%s\n",File_log_colour(COLOUR_RESET));
+            fprintf(*log_fp,"%s\n",File_log_colour(stardata->store->colours[COLOUR_RESET]));
 #ifdef FILE_LOG_FLUSH
             fflush(*log_fp);
 #endif // FILE_LOG_FLUSH
diff --git a/src/logging/output_to_detailed_logfile.c b/src/logging/output_to_detailed_logfile.c
index 4b873f81d..3c418d7fa 100644
--- a/src/logging/output_to_detailed_logfile.c
+++ b/src/logging/output_to_detailed_logfile.c
@@ -15,18 +15,18 @@ No_empty_translation_unit_warning;
     if(stardata->star[(A)].stellar_type<15)                             \
     {                                                                   \
     printf("%s% 3d% 6.2f% 6.2f % 4.1f % 4.1f %s% 5.2f",                 \
-           (A)==0 ? RED : YELLOW ,                                      \
+           (A)==0 ? stardata->store->colours[RED] : stardata->store->colours[YELLOW] ,                                      \
            stardata->star[(A)].stellar_type,                            \
            Min(99.99,stardata->star[(A)].mass),                         \
            Min(99.99,Outermost_core_mass(stardata->star[(A)]),          \
                log10(stardata->star[(A)].radius),                       \
                log10(stardata->star[(A)].luminosity),                   \
-               (char*)(stardata->star[(A)].radius/stardata->star[(A)].roche_radius>0.99 ? ((A)==0 ? BRIGHT_RED : BRIGHT_YELLOW) : COLOUR_RESET) , \
+               (char*)(stardata->star[(A)].radius/stardata->star[(A)].roche_radius>0.99 ? ((A)==0 ? stardata->store->colours[BRIGHT_RED] : stardata->store->colours[BRIGHT_YELLOW]) : stardata->store->colours[COLOUR_RESET]) , \
                stardata->star[(A)].radius/stardata->star[(A)].roche_radius); \
            }                                                            \
     else                                                                \
     {                                                                   \
-        printf("%s  *     *     *    *    *     * ",(A)==0 ? RED : YELLOW); \
+        printf("%s  *     *     *    *    *     * ",(A)==0 ? stardata->store->colours[RED] : stardata->store->colours[YELLOW]); \
     }
 
 #define LOGSPEC(A,B) if(stardata->model.(A)) printf("%s ",(B));
@@ -72,11 +72,11 @@ void output_to_detailed_compact_logfile(struct stardata_t * stardata)
             if(stardata->star[k].stellar_type<15)
             {
                 v=Min(9.99,stardata->star[k].v_eq/stardata->star[k].v_crit_eq);
-                printf("%s%.2f ", v>0.99 ? BRIGHT_GREEN : GREEN,v);
+                printf("%s%.2f ", v>0.99 ? stardata->store->colours[BRIGHT_GREEN] : stardata->store->colours[GREEN],v);
             }
             else
             {
-                printf("%s  * ",COLOUR_RESET);
+                printf("%s  * ",stardata->store->colours[COLOUR_RESET]);
             }
         }
     }
@@ -92,13 +92,13 @@ void output_to_detailed_compact_logfile(struct stardata_t * stardata)
     {
         // binaries only
         double Iorb = (1.0/3.0) * M_SUN*stardata->star[0].mass*stardata->star[1].mass/(stardata->star[0].mass + stardata->star[1].mass) * Pow2(stardata->common.orbit.separation*R_SUN);
-        printf("%s% 6.2f %6.2f ", Iorb>3.0*(I[1]+I[2]) || stardata->model.sgl ? MAGENTA : BRIGHT_MAGENTA,
+        printf("%s% 6.2f %6.2f ", Iorb>3.0*(I[1]+I[2]) || stardata->model.sgl ? stardata->store->colours[MAGENTA] : stardata->store->colours[BRIGHT_MAGENTA],
                log10(stardata->common.orbit.angular_momentum*ANGULAR_MOMENTUM_CGS),
                log10(Iorb));
     }
     else
     {
-        printf("%s     *      * ",MAGENTA);
+        printf("%s     *      * ",stardata->store->colours[MAGENTA]);
     }
 
     Starloop(k)
@@ -114,7 +114,7 @@ void output_to_detailed_compact_logfile(struct stardata_t * stardata)
     }
 
     /* messages */
-    printf("%s",BRIGHT_CYAN);
+    printf("%s",stardata->store->colours[BRIGHT_CYAN]);
     if(stardata->model.in_RLOF)
     {
 #define ALMOST1 (1.0-1e-10)
@@ -139,7 +139,7 @@ void output_to_detailed_compact_logfile(struct stardata_t * stardata)
     LOGSPEC(novae,"Novae");
     LOGSPEC(coalesce,"Merger");
 
-    printf("%s\n",COLOUR_RESET);
+    printf("%s\n",stardata->store->colours[COLOUR_RESET]);
 }
 
 #endif// DETAILED_COMPACT_LOG
diff --git a/src/logging/output_to_logfile.c b/src/logging/output_to_logfile.c
index 0dd368137..204167c8e 100644
--- a/src/logging/output_to_logfile.c
+++ b/src/logging/output_to_logfile.c
@@ -17,6 +17,7 @@ void output_to_logfile(FILE * const fp,
                        const Stellar_type stellar_type1,
                        const Boolean hybrid2,
                        const double sep,
+                       const double per,
                        const double ecc,
                        const double r1_rol, /* r1/roche_radius */
                        const double r2_rol, /* r2/roche_radius */
@@ -45,6 +46,7 @@ void output_to_logfile(FILE * const fp,
                                       stellar_type1,
                                       hybrid2,
                                       sep,
+                                      per,
                                       ecc,
                                       r1_rol,
                                       r2_rol,
@@ -79,7 +81,7 @@ void output_to_logfile(FILE * const fp,
 #ifdef FILE_LOG_ECHO
     /* echo to stdout */
 #ifdef FILE_LOG_COLOURS
-    printf("%s%s%s\n",YELLOW,logstring,COLOUR_RESET);
+    printf("%s%s%s\n",stardata->store->colours[YELLOW],logstring,stardata->store->colours[COLOUR_RESET]);
 #else
     printf("%s\n",logstring);
 #endif // FILE_LOG_COLOURS
diff --git a/src/logging/show_derivatives.c b/src/logging/show_derivatives.c
index 29a5b406b..1d9a5bff2 100644
--- a/src/logging/show_derivatives.c
+++ b/src/logging/show_derivatives.c
@@ -32,7 +32,7 @@ void show_derivatives(struct stardata_t * RESTRICT const stardata)
            (STAR)->angular_momentum,                                    \
            (STAR)->omega,                                               \
            moment_of_inertia((STAR),((STAR)->radius)),                  \
-           COLOUR_RESET                                                 \
+           stardata->store->colours[COLOUR_RESET]                                                 \
         )
 
     Starloop(n)
@@ -41,7 +41,7 @@ void show_derivatives(struct stardata_t * RESTRICT const stardata)
         _show_star(star,"","Star");
         if(prev != NULL)
         {
-            _show_star(&prev->star[n],YELLOW,"Prev");
+            _show_star(&prev->star[n],stardata->store->colours[YELLOW],"Prev");
         }
     }
 
@@ -83,14 +83,14 @@ void show_derivatives(struct stardata_t * RESTRICT const stardata)
             }
             if(prev != NULL)
             {
-                Printf("%s",YELLOW);
+                Printf("%s",stardata->store->colours[YELLOW]);
                 Starloop(n)
                 {
                     Printf("% 20g %% : ",
                            Percent_diff(stardata->star[n].derivative[d],
                                         prev->star[n].derivative[d]));
                 }
-                Printf("%s",COLOUR_RESET);
+                Printf("%s",stardata->store->colours[COLOUR_RESET]);
             }
             Printf("\n");
         }
@@ -112,14 +112,14 @@ void show_derivatives(struct stardata_t * RESTRICT const stardata)
         (STARDATA)->common.orbit.eccentricity,                          \
         (STARDATA)->common.orbit.angular_momentum,                      \
         (STARDATA)->common.orbit.angular_frequency,                     \
-        COLOUR_RESET                                                    \
+        stardata->store->colours[COLOUR_RESET]                                                    \
         )
 
     Printf("************************************************************\n");
     _show_system(stardata,"","Orbit and System Derivatives");
     if(prev != NULL)
     {
-        _show_system(prev,YELLOW,"Previous ...                ");
+        _show_system(prev,stardata->store->colours[YELLOW],"Previous ...                ");
     }
 
     for(d=0;d<DERIVATIVE_SYSTEM_NUMBER;d++)
diff --git a/src/maths/apply_derivative.c b/src/maths/apply_derivative.c
index cbabf5252..e4a9d0f09 100644
--- a/src/maths/apply_derivative.c
+++ b/src/maths/apply_derivative.c
@@ -66,9 +66,9 @@ No_empty_translation_unit_warning;
         if(nd==(Aprint_n) &&                                            \
            d==(Aprint_array))                                           \
         {                                                               \
-            printf("%s",RED);                                           \
+            printf("%s",stardata->store->colours[RED]);                                           \
             printf(__VA_ARGS__);                                        \
-            printf("%s",COLOUR_RESET);                                  \
+            printf("%s",stardata->store->colours[COLOUR_RESET]);                                  \
             fflush(NULL);                                               \
         }                                                               \
     }
diff --git a/src/memory/build_store_contents.c b/src/memory/build_store_contents.c
index 71b95c8ac..4ba43d9e9 100644
--- a/src/memory/build_store_contents.c
+++ b/src/memory/build_store_contents.c
@@ -54,7 +54,7 @@ void build_store_contents(struct store_t * RESTRICT const store)
     if(store->built==FALSE)
     {
         store->built = TRUE;
-        int i;
+
 #ifdef NUCSYN
         nucsyn_build_store_contents(store);
 #endif // NUCSYN
@@ -62,6 +62,18 @@ void build_store_contents(struct store_t * RESTRICT const store)
         MINT_init_store(store);
 #endif//MINT
 
+#undef X
+#define X(COLOUR,STRING) STRING,
+        static char * const colour_strings[] = { ANSI_COLOURS_LIST };
+        store->colours = Malloc(sizeof(char*)*NUM_ANSI_COLOURS);
+        for(int i=0;i<NUM_ANSI_COLOURS;i++)
+        {
+            if(asprintf(&store->colours[i],
+                        "%s",
+                        colour_strings[i])==0){}
+        }
+#undef X
+
         /*
          * Set up collision stellar (k) type matrix
          */
@@ -75,7 +87,7 @@ void build_store_contents(struct store_t * RESTRICT const store)
         const_collision_matrix[HeWD][HeWD]=HeMS;
 #endif // ALLOW_HeWD_SUPERNOVAE
         size_t x = COLLISION_MATRIX_SIZE*sizeof(Stellar_type);
-        for(i=0;i<COLLISION_MATRIX_SIZE;i++)
+        for(int i=0;i<COLLISION_MATRIX_SIZE;i++)
         {
             store->collision_matrix[i] = Malloc(x);
             memcpy(store->collision_matrix[i],
@@ -84,10 +96,13 @@ void build_store_contents(struct store_t * RESTRICT const store)
         }
 
 #ifdef FILE_LOG
+        if(asprintf(&store->upchar, "%s%s",store->colours[GREEN],"🠕")==0){}
+        if(asprintf(&store->downchar, "%s%s",store->colours[RED],"🠗")==0){}
+        if(asprintf(&store->nochangechar," ")==0){}
 #undef X
 #define X(CODE,STRING) #STRING,
         static const char * const_label[STRING_LENGTH] = { LOG_LABELS_LIST };
-        for(i=0;i<NLOG_LABEL;i++)
+        for(int i=0;i<NLOG_LABEL;i++)
         {
             store->label[i] = const_label[i];
         }
diff --git a/src/memory/free_store_contents.c b/src/memory/free_store_contents.c
index 1677f16c2..4194c4561 100644
--- a/src/memory/free_store_contents.c
+++ b/src/memory/free_store_contents.c
@@ -18,10 +18,13 @@ void free_store_contents(struct store_t * RESTRICT const store)
     {
 #ifdef NUCSYN
         nucsyn_free_store_contents(store);
-#endif
-
-        int kt;
-        for(kt=0;kt<COLLISION_MATRIX_SIZE;kt++)
+#endif//NUCSYN
+        for(int i=0;i<NUM_ANSI_COLOURS;i++)
+        {
+            Store_free(colours[i]);
+        }
+        Store_free(colours);
+        for(int kt=0;kt<COLLISION_MATRIX_SIZE;kt++)
         {
             Store_free(collision_matrix[kt]);
         }
@@ -29,7 +32,11 @@ void free_store_contents(struct store_t * RESTRICT const store)
         Delete_data_table(store->jaschek_jaschek_dwarf);
         Delete_data_table(store->jaschek_jaschek_giant);
         Delete_data_table(store->jaschek_jaschek_supergiant);
-
+#ifdef FILE_LOG
+        Store_free(upchar);
+        Store_free(downchar);
+        Store_free(nochangechar);
+#endif//FILE_LOG
 #ifdef USE_2012_MAIN_SEQUENCE_LIFETIMES_TABLE
         Delete_data_table(store->massive_MS_lifetimes);
 #endif
diff --git a/src/perl/scripts/rename_variable.pl b/src/perl/scripts/rename_variable.pl
index 0dfbd7fdc..76d3e8643 100755
--- a/src/perl/scripts/rename_variable.pl
+++ b/src/perl/scripts/rename_variable.pl
@@ -61,19 +61,25 @@ foreach my $file (`ls $paths`)
     chomp $file;
     my $x = slurp($file);
 
-    if($opts{bounds} && $x=~s/\b$oldname\b/$newname/eeg)
+    if($opts{bounds})
     {
-        if(!$opts{dryrun})
+        if($x=~s/\b{wb}$oldname\b{wb}/$newname/eeg)
         {
-            print "Renamed in $file\n";
-            dumpfile($file,$x);
-        }
-        else
-        {
-            print "Would have renamed in $file (but didn't)\n";
+            if(!$opts{dryrun})
+            {
+                print "Renamed in $file\n";
+                dumpfile($file,$x);
+            }
+            else
+            {
+                print "Would have renamed in $file (but didn't)\n";
+                print "############################################################\n";
+                print $x;
+                print "############################################################\n";
+            }
         }
     }
-    elsif(!$opts{bounds} && $x=~s/$oldname/$newname/g)
+    elsif($x=~s/$oldname/$newname/g)
     {
         if(!$opts{dryrun})
         {
@@ -83,6 +89,9 @@ foreach my $file (`ls $paths`)
         else
         {
             print "Would have renamed in $file (but didn't)\n";
+            print "############################################################\n";
+            print $x;
+            print "############################################################\n";
         }
     }
 }
diff --git a/src/setup/argument_setting_functions.c b/src/setup/argument_setting_functions.c
index 343971844..fde61bcaf 100644
--- a/src/setup/argument_setting_functions.c
+++ b/src/setup/argument_setting_functions.c
@@ -514,10 +514,16 @@ void dummyfunc(ARG_SUBROUTINE_DECLARATION)
 
 void binary_c_version_internal(ARG_SUBROUTINE_DECLARATION)
 {
-    /* allocations are for the isotope list */
+    /* show version information */
     version(stardata);
 }
 
+void binary_c_set_version_boolean(ARG_SUBROUTINE_DECLARATION)
+{
+    /* allocations are for the isotope list */
+    stardata->preferences->show_version = TRUE;
+}
+
 void version_only(ARG_SUBROUTINE_DECLARATION)
 {
     stardata->preferences->speedtests = FALSE;
diff --git a/src/setup/cmd_line_args_list.h b/src/setup/cmd_line_args_list.h
index 069b9d289..06baf892d 100644
--- a/src/setup/cmd_line_args_list.h
+++ b/src/setup/cmd_line_args_list.h
@@ -3518,6 +3518,16 @@ BATCHMODE_ARGS
         1.0
         CMD_LINE_ARG_T_OPTIONAL_ARGS },
 
+{
+    ARG_SECTION_OUTPUT,
+        "log_arrows",
+        "Add arrows to the output log to show whether values are increasing or decreasing.",
+        ARG_BOOLEAN ,
+        "",
+        LOG_ARROWS_VAR,
+        1.0
+        CMD_LINE_ARG_T_OPTIONAL_ARGS },
+
 {
     ARG_SECTION_OUTPUT,
         "stopfile",
@@ -4373,7 +4383,7 @@ ARG_FLOAT_SCANF,
         "Display binary_c version and build information. Also performs timing tests.",
         ARG_SUBROUTINE,
         "Ignore",
-        Sub(binary_c_version_internal),
+        Sub(binary_c_set_version_boolean),
         1.0
         CMD_LINE_ARG_T_OPTIONAL_ARGS },
 {
@@ -4611,3 +4621,12 @@ ARG_FLOAT_SCANF,
         Var(stardata->preferences->wind_LBV_luminosity_lower_limit),
         1.0
         CMD_LINE_ARG_T_OPTIONAL_ARGS },
+{
+    ARG_SECTION_STARS,
+        "colour%d",
+        "Sets colour %d (0 to NUM_ANSI_COLOURS-1) to the extended ANSI set colour you choose (1-255, 0 means ignore). The colour numbers are defined in src/logging/ansi_colours.h",
+        ARG_INTEGER_SCANF,
+        WTTS_USE_DEFAULT,
+        Var(stardata->preferences->colours),
+        1.0
+        CMD_LINE_ARG_T_OPTIONAL_ARGS },
diff --git a/src/setup/cmd_line_function_macros.h b/src/setup/cmd_line_function_macros.h
index fe1f9187c..bd0d2c609 100644
--- a/src/setup/cmd_line_function_macros.h
+++ b/src/setup/cmd_line_function_macros.h
@@ -195,8 +195,8 @@
                 "The value provided for argument \"%s\" overflowed or underflowed.\n", \
                 a->name);                                               \
         }                                                               \
-        Cprint("Set %s to %d\n",                                        \
-               cmd_line_args[i].name,                                   \
+        Cprint("Set %s + %zu to %d\n",                                  \
+               cmd_line_args[i].name,offset,                            \
                *((int*) cmd_line_args[i].pointer + offset));            \
     }
 
diff --git a/src/setup/cmd_line_macros.h b/src/setup/cmd_line_macros.h
index b5c8536ed..f70191d4c 100644
--- a/src/setup/cmd_line_macros.h
+++ b/src/setup/cmd_line_macros.h
@@ -14,10 +14,12 @@
 #ifdef FILE_LOG
 #define COLOUR_LOG Var(stardata->preferences->colour_log)
 #define LOG_FILENAME_VAR Var(stardata->preferences->log_filename)
+#define LOG_ARROWS_VAR Var(stardata->preferences->log_arrows)
 #define API_LOG_FILENAME_PREFIX_VAR Var(stardata->preferences->api_log_filename_prefix)
 #else
 #define COLOUR_LOG Not_used_arg
 #define LOG_FILENAME_VAR Not_used_arg
+#define LOG_ARROWS_VAR Not_used_arg
 #define API_LOG_FILENAME_PREFIX_VAR Not_used_arg
 #endif
 
diff --git a/src/setup/derived_arguments.c b/src/setup/derived_arguments.c
index 4fd437737..07b73d147 100644
--- a/src/setup/derived_arguments.c
+++ b/src/setup/derived_arguments.c
@@ -22,7 +22,27 @@ void derived_arguments(struct stardata_t * stardata)
      * Note: we cannot set the spin rate of the star because
      *       we don't yet know its radius. This comes later.
      */
-    struct preferences_t * p = stardata->preferences;
+    struct preferences_t * const p = stardata->preferences;
+
+    /*
+     * Set ANSI colours in the store if overridden
+     */
+    for(int i=1; i<NUM_ANSI_COLOURS; i++)
+    {
+        if(p->colours[i] != 0)
+        {
+            Safe_free(stardata->store->colours[i]);
+            if(asprintf(
+                    &stardata->store->colours[i],
+                    "\033[38;5;%dm",
+                    p->colours[i])
+               ==0)
+            {
+
+                /* ignore errors */
+            }
+        }
+    }
 
     /*
      * Set the stellar masses and construct the
diff --git a/src/setup/parse_arguments.c b/src/setup/parse_arguments.c
index 0550c988f..bc4ca336a 100644
--- a/src/setup/parse_arguments.c
+++ b/src/setup/parse_arguments.c
@@ -325,13 +325,12 @@ void parse_arguments(const int start,
 
             for(i=0; i<arg_count; i++)
             {
-                /*
-                  Dprint("CF %s %s : is scanf? %d\n",
+                Cprint("CF %s %s : is scanf? %d\n",
                        arg,
                        cmd_line_args[i].name,
                        Argtype_is_scanf(cmd_line_args[i].type)
                     );
-                */
+
                 if(
                     Strings_equal(arg,
                                   cmd_line_args[i].name)
@@ -344,7 +343,7 @@ void parse_arguments(const int start,
                     )
 
                 {
-                    Dprint("match \"%s\" (at arg table %u, type %d %s, pointer %p, function_pointer? %s, size %zu expected %zu (%s) : cf log_filename at %p) repeat = %d\n",
+                    Cprint("match \"%s\" (at arg table %u, type %d %s, pointer %p, function_pointer? %s, size %zu expected %zu (%s) : cf log_filename at %p) repeat = %d, offset = %zu\n",
                            arg,
                            i,
                            cmd_line_args[i].type,
@@ -357,7 +356,8 @@ void parse_arguments(const int start,
                            arg_type_sizeof[cmd_line_args[i].type] == 0 ? "Unknown size" :
                            cmd_line_args[i].varsize == arg_type_sizeof[cmd_line_args[i].type] ? "OK" : "NOT OK",
                            (void*)&(stardata->preferences->log_filename),
-                           stardata->preferences->repeat
+                           stardata->preferences->repeat,
+                           offset
                         );
 
                     success = TRUE;
@@ -528,6 +528,12 @@ void parse_arguments(const int start,
                stardata->star[0].mass,
                stardata->star[1].mass
             );
+
+    if(stardata->preferences->show_version == TRUE)
+    {
+        version(stardata);
+    }
+
 }
 
 /********************************************************************/
@@ -544,11 +550,12 @@ static Boolean match_scanf(const char * const arg,
      *       pattern that is commonly used. The integer should
      *       always be positive, however,
      */
-    const int matching_int = 0;
+    int matching_int = -1;
     const int scantest = sscanf(arg,
                                 cmd_line_arg->name,
                                 &matching_int);
-    if(scantest > 0)
+    //printf("arg %s name %s matching int %d scantest %d\n",arg,cmd_line_arg->name,matching_int,scantest);
+    if(scantest > 0 && matching_int >= 0)
     {
         /*
          * Normal sscanf succeeded
diff --git a/src/setup/set_default_preferences.c b/src/setup/set_default_preferences.c
index 66326c959..06dde76e1 100644
--- a/src/setup/set_default_preferences.c
+++ b/src/setup/set_default_preferences.c
@@ -373,9 +373,10 @@ preferences->WD_accretion_rate_novae_upper_limit_other_donor = ACCRETION_RATE_NO
             DEFAULT_LOG_OUTPUT_FILENAME,
             STRING_LENGTH);
     /*
-     * Don't colour logs by default
+     * Don't colour logs or add arrows by default
      */
     preferences->colour_log = FALSE;
+    preferences->log_arrows = FALSE;
 #endif
 
     preferences->wind_angular_momentum_loss = WIND_ANGMOM_LOSS_BSE;
diff --git a/src/setup/setup_prototypes.h b/src/setup/setup_prototypes.h
index 33a9abc84..d8ffdc540 100644
--- a/src/setup/setup_prototypes.h
+++ b/src/setup/setup_prototypes.h
@@ -44,6 +44,7 @@ void list_available_args(ARG_SUBROUTINE_DECLARATION);
 void list_available_args_and_exit(ARG_SUBROUTINE_DECLARATION) No_return;
 void dummyfunc(ARG_SUBROUTINE_DECLARATION);
 void binary_c_version_internal(ARG_SUBROUTINE_DECLARATION);
+void binary_c_set_version_boolean(ARG_SUBROUTINE_DECLARATION);
 void version_only(ARG_SUBROUTINE_DECLARATION);
 void dumpversion(ARG_SUBROUTINE_DECLARATION) No_return;
 double set_effective_metallicity(ARG_SUBROUTINE_DECLARATION);
diff --git a/src/setup/version.c b/src/setup/version.c
index 8bce3226c..138dca4e6 100644
--- a/src/setup/version.c
+++ b/src/setup/version.c
@@ -1239,6 +1239,30 @@ void version(struct stardata_t * RESTRICT const stardata)
 #endif
     Macrotest(ALPHA_ARGS);
     Macrotest(USE_ANSI_COLOURS);
+    Show_int_macro(NUM_ANSI_COLOURS);
+
+
+#undef X
+#define X(COLOUR,STRING) STRING,
+        static char * const colour_strings[] = { ANSI_COLOURS_LIST };
+#undef X
+#define X(COLOUR,STRING) #COLOUR,
+        static char * const colour_enums[] = { ANSI_COLOURS_LIST };
+#undef X
+
+    for(int i=0;i<NUM_ANSI_COLOURS;i++)
+    {
+        printf("ANSI colour %d %s : Default is %s%s%s, we are using %s%s%s.\n",
+               i,
+               colour_enums[i],
+               colour_strings[i],
+               colour_strings[i]+1,
+               colour_strings[COLOUR_RESET],
+               stardata->store->colours[i],
+               stardata->store->colours[i]+1,
+               colour_strings[COLOUR_RESET]
+            );
+    }
     Macrotest(USE_POINTER_LOOPS);
 
     Macrotest(__NATIVE_PRINTF__);
diff --git a/src/stellar_timescales/stellar_timescales.c b/src/stellar_timescales/stellar_timescales.c
index 208685580..0a30daae8 100644
--- a/src/stellar_timescales/stellar_timescales.c
+++ b/src/stellar_timescales/stellar_timescales.c
@@ -88,9 +88,9 @@ No_empty_translation_unit_warning;
             Dprint_no_newline("%10u = %20s = %s%12.12e%s %s",           \
                               i,                                        \
                               S[i],                                     \
-                              ((i>0 && B[i]<B[i-1]) ? BRIGHT_YELLOW : ""), \
+                              ((i>0 && B[i]<B[i-1]) ? stardata->store->colours[BRIGHT_YELLOW] : ""), \
                               B[i],                                     \
-                              COLOUR_RESET,                             \
+                              stardata->store->colours[COLOUR_RESET],                             \
                               i==A?"":":");                             \
         }                                                               \
         Dprint("%s","");                                                \
diff --git a/src/timestep/stellar_timestep.c b/src/timestep/stellar_timestep.c
index 0252b669e..0efba17e7 100644
--- a/src/timestep/stellar_timestep.c
+++ b/src/timestep/stellar_timestep.c
@@ -145,7 +145,7 @@ void stellar_timestep(Timestep_prototype_args)
     {
         fprintf(stdout,
                 "%sstellar_timestep at t=%23.15g model %d reject_same %s reject_shorten %s out star %d stellar_type %d (m=%g mc=%g L=%g R=%g RL=%g (1-R/RL=%g) minit=%g menv=%g SN=%d J*=%g; a=%g e=%g Jorb=%g, ω*=%g ωorb=%g tcirc=%g y), age=%20.12g, tm=%20.12g, tn=%20.12g    >>> %sdt=%20.12g Myr%s <<<    time_remaining=%g : set by %s%s%s (%d) : logtnow=%g logtnext=%g (Fequal? %s Times_are_equal? %s : diff %g) triggerd? %d %s\n",
-                YELLOW,
+                stardata->store->colours[YELLOW],
                 stardata->model.time,
                 stardata->model.model_number,
                 Truefalse(stardata->model.reject_same_timestep),
@@ -178,13 +178,13 @@ void stellar_timestep(Timestep_prototype_args)
                 0.0,
 #endif
 
-                BRIGHT_RED,
+                stardata->store->colours[BRIGHT_RED],
                 *dt,
-                YELLOW,
+                stardata->store->colours[YELLOW],
                 *time_remaining,
-                BRIGHT_MAGENTA,
+                stardata->store->colours[BRIGHT_MAGENTA],
                 Dt_limit_string(abs(star->dtlimiter)),
-                YELLOW,
+                stardata->store->colours[YELLOW],
                 star->dtlimiter,
                 log10(stardata->model.time),
                 log10(stardata->model.time + *dt),
@@ -195,7 +195,7 @@ void stellar_timestep(Timestep_prototype_args)
                 log10(stardata->model.time) -
                 log10(stardata->model.time + *dt),
                 stardata->model.fixed_timestep_triggered,
-                COLOUR_RESET
+                stardata->store->colours[COLOUR_RESET]
             );
     }
     if(allocated_timescales == TRUE)
diff --git a/src/timestep/timestep_increment_fixed_timesteps.c b/src/timestep/timestep_increment_fixed_timesteps.c
index d6f5de872..1a65106bd 100644
--- a/src/timestep/timestep_increment_fixed_timesteps.c
+++ b/src/timestep/timestep_increment_fixed_timesteps.c
@@ -48,7 +48,7 @@ void timestep_increment_fixed_timesteps(struct stardata_t * RESTRICT const stard
                 t->next = (t->logarithmic ? log10(stardata->model.time) : stardata->model.time)
                     + t->step;
 
-                Dprint("%sincrement t->next to %30.20g%s\n",MAGENTA,t->next,COLOUR_RESET);
+                Dprint("%sincrement t->next to %30.20g%s\n",stardata->store->colours[MAGENTA],t->next,stardata->store->colours[COLOUR_RESET]);
             }
             t->previous_test = t->logarithmic ? log10(stardata->model.time) : stardata->model.time;
         }
diff --git a/src/wind/wind_postAGB.c b/src/wind/wind_postAGB.c
index 57b223e41..079a56bcd 100644
--- a/src/wind/wind_postAGB.c
+++ b/src/wind/wind_postAGB.c
@@ -46,7 +46,8 @@ double wind_postAGB(WIND_PROTOTYPE_ARGS)
             if(
                 (
                     stellar_type < HeWD &&
-                    teff > 10e3)
+                    teff > 10e3
+                    )
                 ||
                 (
                     WHITE_DWARF(stellar_type) &&
@@ -84,10 +85,13 @@ double wind_postAGB(WIND_PROTOTYPE_ARGS)
         }
     }
 
-    printf("KRITCKA %30.20e %g %g %g\n",
+    /*
+    printf("POSTAGBWIND %30.20e %g %g %g %g\n",
            stardata->model.time,
            teff,
            star->luminosity,
+           stardata->common.ndiscs > 0 ? (stardata->common.discs[0].lifetime/YEAR_LENGTH_IN_SECONDS) : -1.0,
            mdot);
+    */
     return mdot;
 }
diff --git a/tbse b/tbse
index 7bf358db9..9ac2e7e49 100755
--- a/tbse
+++ b/tbse
@@ -1018,7 +1018,7 @@ VWIND_MULTIPLIER=1.0
 WIND_GAS_TO_DUST_RATIO=200.0
 
 # Tout and Pringle (1992) magnetic wind multiplier (0.0)
-TOUT_PRINGLE_1992_MULTIPLIER=1.0
+TOUT_PRINGLE_1992_MULTIPLIER=0.0
 
 # Wind during the first Giant Branch:
 #
@@ -1828,6 +1828,8 @@ INTERNAL_BUFFERING=INTERNAL_BUFFERING_OFF
 
 # output log : set LOG_FILENAME to /dev/null for no logging
 LOG_FILENAME="/tmp/c_log2.out"
+# use arrows to show if values are rising or falling
+LOG_ARROWS=True
 # colour the log output (using ANSI codes) ?
 COLOUR_LOG=True
 
@@ -2272,6 +2274,7 @@ $NUCMULTS \
 --comenv_ns_accretion_mass $CE_NS_ACC_MASS \
 --CRAP_parameter $CRAP_PARAMETER \
 --log_filename $LOG_FILENAME \
+--log_arrows $LOG_ARROWS \
 --colour_log $COLOUR_LOG \
 --lambda_multiplier $LAMBDA_MULT \
 --hachisu_disk_wind $HACHISU_DISK_WIND \
-- 
GitLab