From 382639f5d6be7c033847a65c4ad2a6b91a247cb1 Mon Sep 17 00:00:00 2001
From: Paul Dechamps <paul.dechamps@uliege.be>
Date: Mon, 11 Mar 2024 09:33:11 +0100
Subject: [PATCH] (fix) Small modifs

Ensure all numbers are doubles in Closures, Fluxes and Driver & debug info update in BoundaryLayer & ensure nIter in 3D rae test
---
 blast/interfaces/dart/DartAdjointInterface.py | 11 ++-
 blast/src/DBoundaryLayer.cpp                  | 13 +++-
 blast/src/DClosures.cpp                       | 78 +++++++++----------
 blast/src/DDriver.cpp                         | 21 ++---
 blast/src/DFluxes.cpp                         | 37 +++++----
 blast/tests/dart/rae2822_3D.py                |  4 +-
 6 files changed, 90 insertions(+), 74 deletions(-)

diff --git a/blast/interfaces/dart/DartAdjointInterface.py b/blast/interfaces/dart/DartAdjointInterface.py
index f21e495..f8ece62 100644
--- a/blast/interfaces/dart/DartAdjointInterface.py
+++ b/blast/interfaces/dart/DartAdjointInterface.py
@@ -55,14 +55,19 @@ class DartAdjointInterface():
                 blowing = self.__runViscous()
                 dRblw_v[:,iNo*nDim + iDim] = (blowing-saveBlw)/delta
                 self.iSolverAPI.solver.U[iNo][iDim] = savev[iNo*nDim + iDim]
-        
 
+        # dRblw_M[abs(dRblw_M) < 1e-10] = 0.
+        # dRblw_rho[abs(dRblw_rho) < 1e-10] = 0.
+        # dRblw_v[abs(dRblw_v) < 1e-10] = 0.
         
+        self.coupledAdjointSolver.setdRblw_M(dRblw_M)
+        self.coupledAdjointSolver.setdRblw_rho(dRblw_rho)
+        self.coupledAdjointSolver.setdRblw_v(dRblw_v)
 
     def __runViscous(self):
-        self.iSolverAPI.imposeInvBC(0)
+        self.iSolverAPI.imposeInvBC(1)
         # Run viscous solver.
-        exitCode = self.vSolver.run(0)
+        exitCode = self.vSolver.run(1)
         # Impose blowing boundary condition in the inviscid solver.
         self.iSolverAPI.imposeBlwVel()
 
diff --git a/blast/src/DBoundaryLayer.cpp b/blast/src/DBoundaryLayer.cpp
index 804d780..dae9606 100644
--- a/blast/src/DBoundaryLayer.cpp
+++ b/blast/src/DBoundaryLayer.cpp
@@ -70,6 +70,8 @@ void BoundaryLayer::setMesh(std::vector<double> x,
  */
 void BoundaryLayer::setStagBC(double Re)
 {
+    if (name != "upper" && name != "lower")
+        std::cout << "Warning: Imposing stagnation boundary condition on " << name << std::endl;
     double dv0 = (blEdge->getVt(1) - blEdge->getVt(0)) / (mesh->getLoc(1) - mesh->getLoc(0));
     if (dv0 > 0)
         u[0] = sqrt(0.075 / (Re * dv0)); // Theta
@@ -196,5 +198,14 @@ void BoundaryLayer::printSolution(size_t iPoint) const
               << std::setw(10) << "dStar (old) " << blEdge->getDeltaStar(iPoint) << "\n"
               << std::setw(10) << "vt " << blEdge->getVt(iPoint) << "\n"
               << std::setw(10) << "Me " << blEdge->getMe(iPoint) << "\n"
-              << std::setw(10) << "rhoe " << blEdge->getRhoe(iPoint) << std::endl;
+              << std::setw(10) << "rhoe " << blEdge->getRhoe(iPoint) << "\n"
+              << std::setw(10) << "Hstar " << Hstar[iPoint] << "\n" 
+              << std::setw(10) << "Hstar2 " << Hstar2[iPoint] << "\n"
+              << std::setw(10) << "Hk " << Hk[iPoint] << "\n"
+              << std::setw(10) << "cf " << cf[iPoint] << "\n"
+              << std::setw(10) << "cd " << cd[iPoint] << "\n"
+              << std::setw(10) << "delta " << delta[iPoint] << "\n"
+              << std::setw(10) << "ctEq " << ctEq[iPoint] << "\n"
+              << std::setw(10) << "us " << us[iPoint] << "\n"
+              << std::setw(10) << "Ret " << Ret[iPoint] << "\n" << std::endl;
 }
\ No newline at end of file
diff --git a/blast/src/DClosures.cpp b/blast/src/DClosures.cpp
index c411d1c..0d384a5 100644
--- a/blast/src/DClosures.cpp
+++ b/blast/src/DClosures.cpp
@@ -21,7 +21,7 @@ void Closures::laminarClosures(std::vector<double> &closureVars, double theta,
     H = std::max(H, 1.00005);
 
     // Kinematic shape factor H*.
-    double Hk = (H - 0.29 * Me * Me) / (1 + 0.113 * Me * Me);
+    double Hk = (H - 0.29 * Me * Me) / (1. + 0.113 * Me * Me);
     if (name == "wake")
         Hk = std::max(Hk, 1.00005);
     else
@@ -31,7 +31,7 @@ void Closures::laminarClosures(std::vector<double> &closureVars, double theta,
     double Hstar2 = (0.064 / (Hk - 0.8) + 0.251) * Me * Me;
 
     // Boundary layer thickness.
-    double delta = std::min((3.15 + H + (1.72 / (Hk - 1))) * theta, 12 * theta);
+    double delta = std::min((3.15 + H + (1.72 / (Hk - 1.))) * theta, 12. * theta);
 
     double Hstar = 0.;
     double Hks = Hk - 4.35;
@@ -41,7 +41,7 @@ void Closures::laminarClosures(std::vector<double> &closureVars, double theta,
         Hstar = 1.528 + 0.015 * Hks * Hks / Hk;
 
     // Whitfield's minor additional compressibility correction.
-    Hstar = (Hstar + 0.028 * Me * Me) / (1 + 0.014 * Me * Me);
+    Hstar = (Hstar + 0.028 * Me * Me) / (1. + 0.014 * Me * Me);
 
     // Friction coefficient.
     double tmp = 0.;
@@ -60,18 +60,18 @@ void Closures::laminarClosures(std::vector<double> &closureVars, double theta,
     // Dissipation coefficient.
     double Cd = 0.;
     if (Hk < 4)
-        Cd = (0.00205 * std::pow(4.0 - Hk, 5.5) + 0.207) * (Hstar / (2 * Ret));
+        Cd = (0.00205 * std::pow(4.0 - Hk, 5.5) + 0.207) * (Hstar / (2. * Ret));
     else
     {
-        double HkCd = (Hk - 4) * (Hk - 4);
+        double HkCd = (Hk - 4.) * (Hk - 4.);
         double denCd = 1 + 0.02 * HkCd;
-        Cd = (-0.0016 * HkCd / denCd + 0.207) * (Hstar / (2 * Ret));
+        Cd = (-0.0016 * HkCd / denCd + 0.207) * (Hstar / (2. * Ret));
     }
 
     // Wake relations.
     if (name == "wake")
     {
-        Cd = 2 * (1.10 * (1.0 - 1.0 / Hk) * (1.0 - 1.0 / Hk) / Hk) * (Hstar / (2 * Ret));
+        Cd = 2. * (1.10 * (1.0 - 1.0 / Hk) * (1.0 - 1.0 / Hk) / Hk) * (Hstar / (2. * Ret));
         cf = 0.;
     }
 
@@ -98,7 +98,7 @@ void Closures::turbulentClosures(std::vector<double> &closureVars, double theta,
     Ct = std::min(Ct, 0.3);
     // Ct = std::max(std::min(Ct, 0.30), 0.0000001);
 
-    double Hk = (H - 0.29 * Me * Me) / (1 + 0.113 * Me * Me);
+    double Hk = (H - 0.29 * Me * Me) / (1. + 0.113 * Me * Me);
     if (name == "wake")
         Hk = std::max(Hk, 1.00005);
     else
@@ -106,34 +106,34 @@ void Closures::turbulentClosures(std::vector<double> &closureVars, double theta,
 
     double Hstar2 = ((0.064 / (Hk - 0.8)) + 0.251) * Me * Me;
     double gamma = 1.4 - 1.;
-    double Fc = std::sqrt(1 + 0.5 * gamma * Me * Me);
+    double Fc = std::sqrt(1. + 0.5 * gamma * Me * Me);
 
     double H0 = 0.;
-    if (Ret <= 400)
+    if (Ret <= 400.)
         H0 = 4.0;
     else
-        H0 = 3 + (400 / Ret);
-    if (Ret <= 200)
-        Ret = 200;
+        H0 = 3 + (400. / Ret);
+    if (Ret <= 200.)
+        Ret = 200.;
 
     double Hstar = 0.;
     if (Hk <= H0)
-        Hstar = ((0.5 - 4 / Ret) * ((H0 - Hk) / (H0 - 1)) * ((H0 - Hk) / (H0 - 1))) * (1.5 / (Hk + 0.5)) + 1.5 + 4 / Ret;
+        Hstar = ((0.5 - 4. / Ret) * ((H0 - Hk) / (H0 - 1.)) * ((H0 - Hk) / (H0 - 1.))) * (1.5 / (Hk + 0.5)) + 1.5 + 4. / Ret;
     else
-        Hstar = (Hk - H0) * (Hk - H0) * (0.007 * std::log(Ret) / ((Hk - H0 + 4 / std::log(Ret)) * (Hk - H0 + 4 / std::log(Ret))) + 0.015 / Hk) + 1.5 + 4 / Ret;
+        Hstar = (Hk - H0) * (Hk - H0) * (0.007 * std::log(Ret) / ((Hk - H0 + 4. / std::log(Ret)) * (Hk - H0 + 4. / std::log(Ret))) + 0.015 / Hk) + 1.5 + 4. / Ret;
 
     // Whitfield's minor additional compressibility correction.
-    Hstar = (Hstar + 0.028 * Me * Me) / (1 + 0.014 * Me * Me);
+    Hstar = (Hstar + 0.028 * Me * Me) / (1. + 0.014 * Me * Me);
 
     double logRt = std::log(Ret / Fc);
     logRt = std::max(logRt, 3.0);
     double arg = std::max(-1.33 * Hk, -20.0);
 
     // Equivalent normalized wall slip velocity.
-    double us = (Hstar / 2) * (1 - 4 * (Hk - 1) / (3 * H));
+    double us = (Hstar / 2.) * (1. - 4. * (Hk - 1.) / (3. * H));
 
     // Boundary layer thickness.
-    double delta = std::min((3.15 + H + (1.72 / (Hk - 1))) * theta, 12 * theta);
+    double delta = std::min((3.15 + H + (1.72 / (Hk - 1.))) * theta, 12. * theta);
 
     double Ctcon = 0.5 / (6.7 * 6.7 * 0.75);
     double Hkc = 0.;
@@ -158,30 +158,30 @@ void Closures::turbulentClosures(std::vector<double> &closureVars, double theta,
             us = 0.99995;
         n = 2.0;  // two wake halves
         cf = 0.0; // no friction inside the wake
-        Hkc = Hk - 1;
+        Hkc = Hk - 1.;
         Cdw = 0.0;                                                                                 // Wall contribution.
         Cdd = (0.995 - us) * Ct * Ct;                                                              // Turbulent outer layer contribution.
         Cdl = 0.15 * (0.995 - us) * (0.995 - us) / Ret;                                            // Laminar stress contribution to outer layer.
-        ctEq = std::sqrt(4 * Hstar * Ctcon * ((Hk - 1) * Hkc * Hkc) / ((1 - us) * (Hk * Hk) * H)); // Here it is ctEq^0.5.
+        ctEq = std::sqrt(4. * Hstar * Ctcon * ((Hk - 1.) * Hkc * Hkc) / ((1. - us) * (Hk * Hk) * H)); // Here it is ctEq^0.5.
     }
     else
     {
         if (us > 0.95)
             us = 0.98;
         n = 1.0;
-        cf = (1 / Fc) * (0.3 * std::exp(arg) * std::pow(logRt / 2.3026, (-1.74 - 0.31 * Hk)) + 0.00011 * (std::tanh(4 - (Hk / 0.875)) - 1));
-        Hkc = std::max(Hk - 1 - 18 / Ret, 0.01);
+        cf = (1. / Fc) * (0.3 * std::exp(arg) * std::pow(logRt / 2.3026, (-1.74 - 0.31 * Hk)) + 0.00011 * (std::tanh(4. - (Hk / 0.875)) - 1.));
+        Hkc = std::max(Hk - 1. - 18. / Ret, 0.01);
         // Dissipation coefficient.
-        Hmin = 1 + 2.1 / std::log(Ret);
-        Fl = (Hk - 1) / (Hmin - 1);
+        Hmin = 1. + 2.1 / std::log(Ret);
+        Fl = (Hk - 1.) / (Hmin - 1.);
         Dfac = 0.5 + 0.5 * std::tanh(Fl);
         Cdw = 0.5 * (cf * us) * Dfac;
         Cdd = (0.995 - us) * Ct * Ct;
         Cdl = 0.15 * (0.995 - us) * (0.995 - us) / Ret;
-        ctEq = std::sqrt(Hstar * Ctcon * ((Hk - 1) * Hkc * Hkc) / ((1 - us) * (Hk * Hk) * H)); // Here it is ctEq^0.5
+        ctEq = std::sqrt(Hstar * Ctcon * ((Hk - 1.) * Hkc * Hkc) / ((1. - us) * (Hk * Hk) * H)); // Here it is ctEq^0.5
         //ctEq = std::sqrt(Hstar * 0.015/(1-us) * (Hk-1)*(Hk-1)*(Hk-1)/(Hk*Hk*H)); // Drela 1987
     }
-    if (n * Hstar * Ctcon * ((Hk - 1) * Hkc * Hkc) / ((1 - us) * (Hk * Hk) * H) < 0)
+    if (n * Hstar * Ctcon * ((Hk - 1.) * Hkc * Hkc) / ((1. - us) * (Hk * Hk) * H) < 0.)
         std::cout << "Negative sqrt encountered " << std::endl;
 
     // Dissipation coefficient.
@@ -205,31 +205,31 @@ void Closures::turbulentClosures(double &closureVars, double theta, double H, do
     H = std::max(H, 1.00005);
     Ct = std::min(Ct, 0.3);
 
-    double Hk = (H - 0.29 * Me * Me) / (1 + 0.113 * Me * Me);
+    double Hk = (H - 0.29 * Me * Me) / (1. + 0.113 * Me * Me);
     if (name == "wake")
         Hk = std::max(Hk, 1.00005);
     else
         Hk = std::max(Hk, 1.05000);
 
     double H0 = 0.;
-    if (Ret <= 400)
+    if (Ret <= 400.)
         H0 = 4.0;
     else
-        H0 = 3 + (400 / Ret);
-    if (Ret <= 200)
-        Ret = 200;
+        H0 = 3 + (400. / Ret);
+    if (Ret <= 200.)
+        Ret = 200.;
 
     double Hstar = 0.;
     if (Hk <= H0)
-        Hstar = ((0.5 - 4 / Ret) * ((H0 - Hk) / (H0 - 1)) * ((H0 - Hk) / (H0 - 1))) * (1.5 / (Hk + 0.5)) + 1.5 + 4 / Ret;
+        Hstar = ((0.5 - 4. / Ret) * ((H0 - Hk) / (H0 - 1.)) * ((H0 - Hk) / (H0 - 1.))) * (1.5 / (Hk + 0.5)) + 1.5 + 4. / Ret;
     else
-        Hstar = (Hk - H0) * (Hk - H0) * (0.007 * std::log(Ret) / ((Hk - H0 + 4 / std::log(Ret)) * (Hk - H0 + 4 / std::log(Ret))) + 0.015 / Hk) + 1.5 + 4 / Ret;
+        Hstar = (Hk - H0) * (Hk - H0) * (0.007 * std::log(Ret) / ((Hk - H0 + 4. / std::log(Ret)) * (Hk - H0 + 4. / std::log(Ret))) + 0.015 / Hk) + 1.5 + 4. / Ret;
 
     // Whitfield's minor additional compressibility correction.
     Hstar = (Hstar + 0.028 * Me * Me) / (1 + 0.014 * Me * Me);
 
     // Equivalent normalized wall slip velocity.
-    double us = (Hstar / 2) * (1 - 4 * (Hk - 1) / (3 * H));
+    double us = (Hstar / 2.) * (1. - 4. * (Hk - 1.) / (3. * H));
 
     double Ctcon = 0.5 / (6.7 * 6.7 * 0.75);
 
@@ -240,17 +240,17 @@ void Closures::turbulentClosures(double &closureVars, double theta, double H, do
     {
         if (us > 0.99995)
             us = 0.99995;
-        Hkc = Hk - 1;
-        ctEq = std::sqrt(4 * Hstar * Ctcon * ((Hk - 1) * Hkc * Hkc) / ((1 - us) * (Hk * Hk) * H)); // Here it is ctEq^0.5
+        Hkc = Hk - 1.;
+        ctEq = std::sqrt(4. * Hstar * Ctcon * ((Hk - 1.) * Hkc * Hkc) / ((1. - us) * (Hk * Hk) * H)); // Here it is ctEq^0.5
     }
     else
     {
         if (us > 0.95)
             us = 0.98;
-        Hkc = std::max(Hk - 1 - 18 / Ret, 0.01);
-        ctEq = std::sqrt(Hstar * Ctcon * ((Hk - 1) * Hkc * Hkc) / ((1 - us) * (Hk * Hk) * H)); // Here it is ctEq^0.5
+        Hkc = std::max(Hk - 1. - 18. / Ret, 0.01);
+        ctEq = std::sqrt(Hstar * Ctcon * ((Hk - 1.) * Hkc * Hkc) / ((1. - us) * (Hk * Hk) * H)); // Here it is ctEq^0.5
     }
-    if (Hstar * Ctcon * ((Hk - 1) * Hkc * Hkc) / ((1 - us) * (Hk * Hk) * H) < 0)
+    if (Hstar * Ctcon * ((Hk - 1.) * Hkc * Hkc) / ((1. - us) * (Hk * Hk) * H) < 0.)
         std::cout << "Negative sqrt encountered " << std::endl;
 
     closureVars = ctEq;
diff --git a/blast/src/DDriver.cpp b/blast/src/DDriver.cpp
index b937b4f..d41f579 100644
--- a/blast/src/DDriver.cpp
+++ b/blast/src/DDriver.cpp
@@ -161,7 +161,7 @@ int Driver::run(unsigned int const couplIter)
             else
             {
                 tSolver->setCFL0(CFL0);
-                tSolver->setitFrozenJac(5);
+                tSolver->setitFrozenJac(1);
                 tSolver->setinitSln(true);
 
                 // Keyword annoncing iteration safety level.
@@ -262,15 +262,15 @@ int Driver::run(unsigned int const couplIter)
 void Driver::checkWaves(size_t iPoint, BoundaryLayer *bl)
 {
 
-    double logRet_crit = 2.492 * std::pow(1 / (bl->Hk[iPoint] - 1), 0.43) + 0.7 * (std::tanh(14 * (1 / (bl->Hk[iPoint] - 1)) - 9.24) + 1.0);
+    double logRet_crit = 2.492 * std::pow(1. / (bl->Hk[iPoint] - 1.), 0.43) + 0.7 * (std::tanh(14. * (1. / (bl->Hk[iPoint] - 1)) - 9.24) + 1.0);
 
-    if (bl->Ret[iPoint] > 0) // Avoid log of negative number.
+    if (bl->Ret[iPoint] > 0.) // Avoid log of negative number.
     {
         if (std::log10(bl->Ret[iPoint]) <= logRet_crit - 0.08)
-            bl->u[iPoint * bl->getnVar() + 2] = 0; // Set N to 0 at that point if waves do not grow.
+            bl->u[iPoint * bl->getnVar() + 2] = 0.; // Set N to 0 at that point if waves do not grow.
     }
     else
-        bl->u[iPoint * bl->getnVar() + 2] = 0; // Set N to 0 at that point if waves do not grow.
+        bl->u[iPoint * bl->getnVar() + 2] = 0.; // Set N to 0 at that point if waves do not grow.
 }
 
 /**
@@ -323,11 +323,12 @@ void Driver::averageTransition(size_t iPoint, BoundaryLayer *bl, int forced)
         std::cout << "Warning: Transition point turbulent computation terminated with exit code " << exitCode << std::endl;
 
     // Average both solutions (Now solution @ iPoint is the turbulent solution).
-    bl->u[iPoint * nVar + 0] = avLam * lamSol[0] + avTurb * bl->u[(iPoint)*nVar + 0]; // Theta.
-    bl->u[iPoint * nVar + 1] = avLam * lamSol[1] + avTurb * bl->u[(iPoint)*nVar + 1]; // H.
-    bl->u[iPoint * nVar + 2] = 9.;                                                    // N.
-    bl->u[iPoint * nVar + 3] = avLam * lamSol[3] + avTurb * bl->u[(iPoint)*nVar + 3]; // ue.
-    bl->u[iPoint * nVar + 4] = avTurb * bl->u[(iPoint)*nVar + 4];                     // Ct.
+    // bl->u[iPoint * nVar + 0] = avLam * lamSol[0] + avTurb * bl->u[(iPoint)*nVar + 0]; // Theta.
+    // bl->u[iPoint * nVar + 1] = avLam * lamSol[1] + avTurb * bl->u[(iPoint)*nVar + 1]; // H.
+    // bl->u[iPoint * nVar + 2] = 9.;                                                    // N.
+    // bl->u[iPoint * nVar + 3] = avLam * lamSol[3] + avTurb * bl->u[(iPoint)*nVar + 3]; // ue.
+    // bl->u[iPoint * nVar + 4] = avTurb * bl->u[(iPoint)*nVar + 4];                     // Ct.
+    bl->u[iPoint*nVar+2] = 9.;
 
     // Recompute closures. (The turbulent BC @ iPoint - 1 does not influence laminar closure relations).
     std::vector<double> lamParam(8, 0.);
diff --git a/blast/src/DFluxes.cpp b/blast/src/DFluxes.cpp
index c3beca0..d159130 100644
--- a/blast/src/DFluxes.cpp
+++ b/blast/src/DFluxes.cpp
@@ -147,23 +147,22 @@ VectorXd Fluxes::blLaws(size_t iPoint, BoundaryLayer *bl, std::vector<double> u)
     double usa = bl->us[iPoint];
 
     // Space part.
-    spaceVector(0) = dt_dx + (2 + u[1] - Mea * Mea) * (u[0] / u[3]) * due_dx - cfa / 2;
-    spaceVector(1) = u[0] * dHstar_dx + (2 * Hstar2a + Hstara * (1 - u[1])) * u[0] / u[3] * due_dx - 2 * cda + Hstara * cfa / 2;
+    spaceVector(0) = dt_dx + (2. + u[1] - Mea * Mea) * (u[0] / u[3]) * due_dx - cfa / 2.;
+    spaceVector(1) = u[0] * dHstar_dx + (2 * Hstar2a + Hstara * (1 - u[1])) * u[0] / u[3] * due_dx - 2. * cda + Hstara * cfa / 2.;
     spaceVector(2) = dN_dx - ax;
     spaceVector(3) = due_dx - c * (u[1] * dt_dx + u[0] * dH_dx) - dueExt_dx + cExt * ddeltaStarExt_dx;
 
     if (bl->regime[iPoint] == 1)
-        spaceVector(4) = (2 * deltaa / u[4]) * dct_dx - 5.6 * (ctEqa - u[4] * dissipRatio) - 2 * deltaa * (4 / (3 * u[1] * u[0]) * (cfa / 2 - (((Hka - 1) / (6.7 * Hka * dissipRatio)) * ((Hka - 1) / (6.7 * Hka * dissipRatio)))) - 1 / u[3] * due_dx);
+        spaceVector(4) = (2. * deltaa / u[4]) * dct_dx - 5.6 * (ctEqa - u[4] * dissipRatio) - 2. * deltaa * (4. / (3. * u[1] * u[0]) * (cfa / 2. - (((Hka - 1.) / (6.7 * Hka * dissipRatio)) * ((Hka - 1.) / (6.7 * Hka * dissipRatio)))) - 1. / u[3] * due_dx);
 
     // Time part.
     timeMatrix(0, 0) = u[1] / u[3];
     timeMatrix(0, 1) = u[0] / u[3];
     timeMatrix(0, 3) = u[0] * u[1] / (u[3] * u[3]);
 
-    timeMatrix(1, 0) = (1 + u[1] * (1 - Hstara)) / u[3];
-    timeMatrix(1, 1) = (1 - Hstara) * u[0] / u[3];
-    timeMatrix(1, 3) = (2 - Hstara * u[1]) * u[0] / (u[3] * u[3]);
-
+    timeMatrix(1, 0) = (1. + u[1] * (1. - Hstara)) / u[3];
+    timeMatrix(1, 1) = (1. - Hstara) * u[0] / u[3];
+    timeMatrix(1, 3) = (2. - Hstara * u[1]) * u[0] / (u[3] * u[3]);
     timeMatrix(2, 2) = 1.;
 
     timeMatrix(3, 0) = -c * u[1];
@@ -172,8 +171,8 @@ VectorXd Fluxes::blLaws(size_t iPoint, BoundaryLayer *bl, std::vector<double> u)
 
     if (bl->regime[iPoint] == 1)
     {
-        timeMatrix(4, 3) = 2 * deltaa / (usa * u[3] * u[3]);
-        timeMatrix(4, 4) = 2 * deltaa / (u[3] * u[4] * usa);
+        timeMatrix(4, 3) = 2. * deltaa / (usa * u[3] * u[3]);
+        timeMatrix(4, 4) = 2. * deltaa / (u[3] * u[4] * usa);
     }
     else
         timeMatrix(4, 4) = 1.0;
@@ -194,7 +193,7 @@ double Fluxes::amplificationRoutine(double Hk, double Ret, double theta) const
     double dgr = 0.08;
     double Hk1 = 3.5;
     double Hk2 = 4.;
-    double Hmi = (1 / (Hk - 1));
+    double Hmi = (1. / (Hk - 1.));
     double logRet_crit = 2.492 * std::pow(1 / (Hk - 1.), 0.43) + 0.7 * (std::tanh(14 * Hmi - 9.24) + 1.0); // value at which the amplification starts to grow
 
     double ax = 0.;
@@ -204,19 +203,19 @@ double Fluxes::amplificationRoutine(double Hk, double Ret, double theta) const
         ax = 0.;
     else
     {
-        double rNorm = (std::log10(Ret) - (logRet_crit - dgr)) / (2 * dgr);
+        double rNorm = (std::log10(Ret) - (logRet_crit - dgr)) / (2. * dgr);
         double Rfac = 0.;
         if (rNorm <= 0)
             Rfac = 0.;
         if (rNorm >= 1)
             Rfac = 1.;
         else
-            Rfac = 3 * rNorm * rNorm - 2 * rNorm * rNorm * rNorm;
+            Rfac = 3. * rNorm * rNorm - 2 * rNorm * rNorm * rNorm;
 
         // Normal envelope amplification rate
-        double m = -0.05 + 2.7 * Hmi - 5.5 * Hmi * Hmi + 3 * Hmi * Hmi * Hmi + 0.1 * std::exp(-20 * Hmi);
+        double m = -0.05 + 2.7 * Hmi - 5.5 * Hmi * Hmi + 3. * Hmi * Hmi * Hmi + 0.1 * std::exp(-20. * Hmi);
         double arg = 3.87 * Hmi - 2.52;
-        double dndRet = 0.028 * (Hk - 1) - 0.0345 * std::exp(-(arg * arg));
+        double dndRet = 0.028 * (Hk - 1.) - 0.0345 * std::exp(-(arg * arg));
         ax = (m * dndRet / theta) * Rfac;
 
         // Set correction for separated profiles
@@ -224,17 +223,17 @@ double Fluxes::amplificationRoutine(double Hk, double Ret, double theta) const
         {
             double Hnorm = (Hk - Hk1) / (Hk2 - Hk1);
             double Hfac = 0.;
-            if (Hnorm >= 1)
+            if (Hnorm >= 1.)
                 Hfac = 1.;
             else
-                Hfac = 3 * Hnorm * Hnorm - 2 * Hnorm * Hnorm * Hnorm;
+                Hfac = 3. * Hnorm * Hnorm - 2. * Hnorm * Hnorm * Hnorm;
             double ax1 = ax;
-            double gro = 0.3 + 0.35 * std::exp(-0.15 * (Hk - 5));
+            double gro = 0.3 + 0.35 * std::exp(-0.15 * (Hk - 5.));
             double tnr = std::tanh(1.2 * (std::log10(Ret) - gro));
-            double ax2 = (0.086 * tnr - 0.25 / std::pow((Hk - 1), 1.5)) / theta;
+            double ax2 = (0.086 * tnr - 0.25 / std::pow((Hk - 1.), 1.5)) / theta;
             if (ax2 < 0.)
                 ax2 = 0.;
-            ax = Hfac * ax2 + (1 - Hfac) * ax1;
+            ax = Hfac * ax2 + (1. - Hfac) * ax1;
             if (ax < 0.)
                 ax = 0.;
         }
diff --git a/blast/tests/dart/rae2822_3D.py b/blast/tests/dart/rae2822_3D.py
index 92add20..1b01e12 100644
--- a/blast/tests/dart/rae2822_3D.py
+++ b/blast/tests/dart/rae2822_3D.py
@@ -105,8 +105,8 @@ def cfgBlast(verb):
         'saveTag': 4,
 
         'Verb': verb,       # Verbosity level of the solver
-        'couplIter': 50,    # Maximum number of iterations
-        'couplTol' : 5e-2,  # Tolerance of the VII methodology
+        'couplIter': 5,    # Maximum number of iterations
+        'couplTol' : 1e-4,  # Tolerance of the VII methodology
         'iterPrint': 1,     # int, number of iterations between outputs
         'resetInv' : False, # bool, flag to reset the inviscid calculation at every iteration.
         'xtrF' : [0., 0.],  # Forced transition location
-- 
GitLab