diff --git a/legendre_integration.c b/legendre_integration.c
index 0bd565659d3def7a2e70c1c787dff007bdd8695d..3183e5f5dff72f3eaac7bb6ebcbcf354df772dbe 100644
--- a/legendre_integration.c
+++ b/legendre_integration.c
@@ -33,6 +33,9 @@ double legendre_integration_A(gsl_spline2d* Spline_I2d, double tau, double u, do
 
     status = gsl_spline2d_eval_e(Spline_I2d, tau, u_prime[ii], xacc_2d, yacc_2d, &Ik_l);
 
+    //printf("u %lf tau %lf Ik_l %5.4e\n", u_prime[ii], tau, Ik_l);
+
+
     if (Ik_l < 0)
     {
       printf("Warning: interpolated Ik_l < 0 for tau=%5.4f u_prime=%5.4f\n", tau, u_prime[ii]);
@@ -43,7 +46,7 @@ double legendre_integration_A(gsl_spline2d* Spline_I2d, double tau, double u, do
     {
       printf("Error at line %d\n", __LINE__);
       printf("File %s\n", __FILE__);
-      printf("tau=%5.4f u=%5.4f\n", tau, u_prime[ii]);
+      printf("tau=%5.4f u=%5.4f  I^{k}(l)=%5.4e\n", tau, u_prime[ii], Ik_l);
 
       exit(1);
     }
diff --git a/main_program.c b/main_program.c
index 75196361c2c95231d177292579182d31a43974b5..aa9bf093b71ca598ba357527bdb37ce4747bb9cb 100644
--- a/main_program.c
+++ b/main_program.c
@@ -213,7 +213,7 @@ int main(int argc, char* argv[])
       exit(1);
     }
 
-    solve_rte(kiter, seed);
+    optimize_taustep(kiter, seed);
   }
   else if (strcmp(method, "st85") == 0)
   {
diff --git a/solve_rte.c b/solve_rte.c
index e57a9fbd7a8b8334eac17b09620f342a3dcc8a31..a39d4e8f7cf79596702347f4303487a482d7ee96 100644
--- a/solve_rte.c
+++ b/solve_rte.c
@@ -1,4 +1,5 @@
 #include "iteration_functions.h"
+#include <gsl/gsl_interp2d.h>
 
 double I0_center_updown(double tau, double u);
 double I0_upward(double tau, double u);
@@ -11,12 +12,28 @@ double tau0;
 
 /*================================================================================*/
 
-void solve_rte(int k_iter, int seed_distribution)
+void optimize_taustep(int k_iter, int seed_distribution)
 {
+  Nstep_tau = 100;
+
+  tau0 = disktau / 2.;
+
+  while (solve_rte(k_iter, seed_distribution, Nstep_tau))
+  {
+    Nstep_tau = (int)Nstep_tau * 1.2;
+  }
+}
+
+/*================================================================================*/
+
+int solve_rte(int k_iter, int seed_distribution, int Nstep_tau)
+{
+
+  printf("\n\nReceveing Nstep_tau %d\n", Nstep_tau);
   int ii, jj, kk, status;
 
   Nstep_mu = 30;
-  Nstep_tau = 100;
+  /* Nstep_tau = 100;*/
 
   tau0 = disktau / 2.;
 
@@ -47,7 +64,6 @@ void solve_rte(int k_iter, int seed_distribution)
   {
     array_mu[ii - 1] = roots[ii];
     array_weights[ii - 1] = weights[ii];
-
     // printf("%lf 1 \n", array_mu[ii - 1]);
   }
 
@@ -109,6 +125,9 @@ void solve_rte(int k_iter, int seed_distribution)
       }
     }
   }
+
+
+
   /*=================================================================*/
   /*Setup for 2D interpolation*/
   /*=================================================================*/
@@ -129,10 +148,8 @@ void solve_rte(int k_iter, int seed_distribution)
   xacc_2d = gsl_interp_accel_alloc();
   yacc_2d = gsl_interp_accel_alloc();
 
-  step_tau = (2 * tau0) / (Nstep_tau - 1);
+  step_tau = (2 * tau0) / Nstep_tau;
 
-  // printf("Step tau %5.4f\n", step_tau);
-  /*double check_val=0;*/
 
   Iklr_intensity* ptr_data = malloc(sizeof(Iklr_intensity));
   Iklr_intensity* params;
@@ -173,13 +190,23 @@ void solve_rte(int k_iter, int seed_distribution)
     ptr_data->Spline_I2d_r_upstream = Spline_I2d_r_upstream;
     ptr_data->Spline_I2d_r_downstream = Spline_I2d_r_downstream;
 
+
+
+
+    printf("CHECK HERE !\n");
+    double zio=0;
+        int status = gsl_spline2d_eval_extrap_e(Spline_I2d_l_downstream, 2*tau0, 0.5, xacc_2d, yacc_2d, &zio);
+
+       printf("================> status %d val %lf\n", status, zio);
+
+
     /*=======================================================================*/
     /*Solve the RTE at the quadrature points*/
     /*=======================================================================*/
 
     status = GSL_SUCCESS + 1;
 
-    gsl_set_error_handler_off();
+    //gsl_set_error_handler_off();
 
     for (jj = 0; jj < Nstep_mu; jj++)
     {
@@ -204,53 +231,26 @@ void solve_rte(int k_iter, int seed_distribution)
       y[2] = 0;
       y[3] = 0;
 
-      /*   h_step=1e-7;
-         gsl_odeiv_evolve * e_rte       = gsl_odeiv_evolve_alloc (4);
-         gsl_odeiv_control * c_rte      = gsl_odeiv_control_y_new (1e-8, 1e-8);
-         gsl_odeiv_step * s_rte         = gsl_odeiv_step_alloc (T, 4);
-   */
       gsl_odeiv2_system sys = {RTE_Equations, jac, 4, params};
-      gsl_odeiv2_driver* d = gsl_odeiv2_driver_alloc_y_new(&sys, gsl_odeiv2_step_rk4, step_tau, 1e-4, 1e-4);
+      gsl_odeiv2_driver* d = gsl_odeiv2_driver_alloc_y_new(&sys, gsl_odeiv2_step_rk4, step_tau, 1e-7, 1e-7);
 
       while (tau < 2 * tau0)
       {
-        status = gsl_odeiv2_driver_apply_fixed_step(d, &tau, step_tau, 5, y);
-
-        while (status != GSL_SUCCESS)
-        {
-          tau = 0;
-          step_tau = step_tau * 0.75;
-          printf("step_tau now is %lf\n", step_tau);
-
-          // gsl_odeiv2_driver_free(d);
+        // printf("tau prima %lf\n", tau);
 
-          gsl_odeiv2_driver* d =
-              gsl_odeiv2_driver_alloc_y_new(&sys, gsl_odeiv2_step_rk8pd, step_tau, 1e-3, 1e-3);
-
-          status = gsl_odeiv2_driver_apply_fixed_step(d, &tau, step_tau, 5, y);
-        }
-
-        idx = set_array_idx(tau_prev, tau, array_tau, Nstep_tau);
+        status = gsl_odeiv2_driver_apply_fixed_step(d, &tau, step_tau, 5, y);
 
         if (status)
         {
           printf("Error during integration: %s\n", gsl_strerror(status));
-          printf("Status %d\n", status);
-          exit(1);
+          // printf("Status %d\n", status);
+          return (1);
         }
 
-        // printf("tau_prev=%lf tau=%lf idx %d\n", tau_prev, tau, idx);
-
-        // status = gsl_odeiv_evolve_apply(e_rte, c_rte, s_rte, &sys, &tau, 2*tau0, &h_step, y);
-
-        // printf("tau=%lf  y[0]=%4.3e  y[1]=%4.3e y[2]=%4.3e y[3]=%4.3e idx %d\n", tau, y[0], y[1],
-        // y[2], y[3], idx);
+        idx = set_array_idx(tau_prev, tau, array_tau, Nstep_tau);
 
         if (idx > 0)
         {
-          // printf("tau=%lf  y[0]=%4.3e  y[1]=%4.3e y[2]=%4.3e y[3]=%4.3e idx %d\n", tau, y[0], y[1],
-          //      y[2], y[3], idx);
-
           ptr_Iklr[kk].Il_matrix_upstream[idx][jj] = y[0];
           ptr_Iklr[kk].Ir_matrix_upstream[idx][jj] = y[1];
 
@@ -263,10 +263,6 @@ void solve_rte(int k_iter, int seed_distribution)
 
       gsl_odeiv2_driver_free(d);
 
-      // gsl_odeiv_evolve_free (e_rte);
-      // gsl_odeiv_control_free (c_rte);
-      // gsl_odeiv_step_free (s_rte);
-
     } // End of loop over array_mu
 
   } // End of loop over k_iter
@@ -276,7 +272,20 @@ void solve_rte(int k_iter, int seed_distribution)
 
   compute_results(1, k_iter, Nstep_tau, Nstep_mu, array_mu, array_weights, ptr_Iklr, ptr_a, ptr_b);
 
-  exit(1);
+  free(Il_upstream_za);
+  free(Il_downstream_za);
+  free(Ir_upstream_za);
+  free(Ir_downstream_za);
+  free(array_tau);
+  free(ptr_Iklr);
+
+  gsl_spline2d_free(Spline_I2d_l_upstream);
+  gsl_spline2d_free(Spline_I2d_l_downstream);
+  gsl_spline2d_free(Spline_I2d_r_upstream);
+  gsl_spline2d_free(Spline_I2d_r_downstream);
+
+
+  return 0;
 }
 
 /*================================================================================*/
@@ -295,15 +304,14 @@ int RTE_Equations(double s, const double y[], double f[], void* params)
   gsl_spline2d* Spline_I2d_r_upstream = ((Iklr_intensity*)params)->Spline_I2d_r_upstream;
   gsl_spline2d* Spline_I2d_r_downstream = ((Iklr_intensity*)params)->Spline_I2d_r_downstream;
 
-  if (s > 2 * tau0 - 1e-5)
-  {
-    s = 2 * tau0;
-  }
 
   /*==============================================*/
   /*Equation for I_l  upstream*/
   /*==============================================*/
 
+  //printf("UNO  s=%10.7f\n", 2*tau0);
+
+
   f[0] = -1 / u * y[0] +
          3 / (8 * u) *
              (legendre_integration_A(Spline_I2d_l_upstream, s, u, array_u, weights_u) +
@@ -312,10 +320,16 @@ int RTE_Equations(double s, const double y[], double f[], void* params)
               legendre_integration_B(Spline_I2d_r_upstream, s, u, array_u, weights_u) +
               legendre_integration_B(Spline_I2d_r_downstream, 2 * tau0 - s, u, array_u, weights_u));
 
+
+
+
+
   /*==============================================*/
   /*Equation for I_r upstream*/
   /*==============================================*/
 
+
+
   f[1] = -1 / u * y[1] +
          3 / (8 * u) *
              (legendre_integration_C(Spline_I2d_l_upstream, s, u, array_u, weights_u) +
@@ -327,6 +341,8 @@ int RTE_Equations(double s, const double y[], double f[], void* params)
   /*Equation for I_l downstream*/
   /*==============================================*/
 
+
+
   f[2] = -1 / u * y[2] +
          3 / (8 * u) *
              (legendre_integration_A(Spline_I2d_l_downstream, s, u, array_u, weights_u) +
@@ -339,6 +355,8 @@ int RTE_Equations(double s, const double y[], double f[], void* params)
   /*Equation for I_r downstream*/
   /*==============================================*/
 
+
+
   f[3] = -1 / u * y[3] +
          3 / (8 * u) *
              (legendre_integration_C(Spline_I2d_l_downstream, s, u, array_u, weights_u) +