From 8e89a11a0a834e49eabbf51db49cb06c63f7801a Mon Sep 17 00:00:00 2001
From: Pedro Gonnet <pedro.gonnet@durham.ac.uk>
Date: Mon, 15 Apr 2013 09:20:42 +0000
Subject: [PATCH] cleaned up interactions a bit.

Former-commit-id: 44037b8733d6d59be889c05a38a47cb09c65750f
---
 src/runner_iact.h | 148 +++++++++++++++++++++++++++-------------------
 1 file changed, 86 insertions(+), 62 deletions(-)

diff --git a/src/runner_iact.h b/src/runner_iact.h
index f3e0af15d6..a8090d1606 100644
--- a/src/runner_iact.h
+++ b/src/runner_iact.h
@@ -44,18 +44,25 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_density ( float r
     float xi, xj;
     float h_inv, hg_inv;
     float wi, wj, wi_dx, wj_dx;
+    float mi, mj;
     float dvdr;
-    float curlvr[3];
+    float dv[3], curlvr[3];
     int k;
     
+    /* Get the masses. */
+    mi = pi->mass; mj = pj->mass;
+    
     /* Compute dv dot r */
-    dvdr = ( pi->v[0] - pj->v[0] ) * dx[0] + ( pi->v[1] - pj->v[1] ) * dx[1] + ( pi->v[2] - pj->v[2] ) * dx[2];
+    dv[0] = pi->v[0] - pj->v[0];
+    dv[1] = pi->v[1] - pj->v[1];
+    dv[2] = pi->v[2] - pj->v[2];
+    dvdr = dv[0]*dx[0] + dv[1]*dx[1] + dv[2]*dx[2];
     dvdr *= ri;
 
     /* Compute dv cross r */
-    curlvr[0] = ( pi->v[1] - pj->v[1] ) * dx[2] - ( pi->v[2] - pj->v[2] ) * dx[1];
-    curlvr[1] = ( pi->v[2] - pj->v[2] ) * dx[0] - ( pi->v[0] - pj->v[0] ) * dx[2];
-    curlvr[2] = ( pi->v[0] - pj->v[0] ) * dx[1] - ( pi->v[1] - pj->v[1] ) * dx[0];
+    curlvr[0] = dv[1]*dx[2] - dv[2]*dx[1];
+    curlvr[1] = dv[2]*dx[0] - dv[0]*dx[2];
+    curlvr[2] = dv[0]*dx[1] - dv[1]*dx[0];
     for ( k = 0 ; k < 3 ; k++ )
         curlvr[k] *= ri;
             
@@ -66,15 +73,15 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_density ( float r
         xi = r * hg_inv;
         kernel_deval( xi , &wi , &wi_dx );
         
-        pi->rho += pj->mass * wi;
-        pi->rho_dh -= pj->mass * ( 3.0*wi + xi*wi_dx );
+        pi->rho += mj * wi;
+        pi->rho_dh -= mj * ( 3.0*wi + xi*wi_dx );
         pi->density.wcount += wi * ( 4.0f * M_PI / 3.0f * kernel_igamma3 );
         pi->density.wcount_dh -= xi * h_inv * wi_dx * ( 4.0f * M_PI / 3.0f * kernel_igamma3 );
         // pi->icount += 1;
 
-	    pi->density.div_v += pj->mass * dvdr * wi_dx;
+	    pi->density.div_v += mj * dvdr * wi_dx;
 	    for ( k = 0 ; k < 3 ; k++ )
-	        pi->density.curl_v[k] += pj->mass * curlvr[k] * wi_dx;
+	        pi->density.curl_v[k] += mj * curlvr[k] * wi_dx;
             
         }
 
@@ -85,15 +92,15 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_density ( float r
         xj = r * hg_inv;
         kernel_deval( xj , &wj , &wj_dx );
         
-        pj->rho += pi->mass * wj;
-        pj->rho_dh -= pi->mass * ( 3.0*wj + xj*wj_dx );
+        pj->rho += mi * wj;
+        pj->rho_dh -= mi * ( 3.0*wj + xj*wj_dx );
         pj->density.wcount += wj * ( 4.0f * M_PI / 3.0f * kernel_igamma3 );
         pj->density.wcount_dh -= xj * h_inv * wj_dx * ( 4.0f * M_PI / 3.0f * kernel_igamma3 );
         // pj->icount += 1;
         
-	    pj->density.div_v += pi->mass * dvdr * wj_dx;
+	    pj->density.div_v += mi * dvdr * wj_dx;
 	    for ( k = 0 ; k < 3 ; k++ )
-	        pj->density.curl_v[k] += pi->mass * curlvr[k] * wj_dx;
+	        pj->density.curl_v[k] += mi * curlvr[k] * wj_dx;
             
         }
         
@@ -109,7 +116,7 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_vec_density ( flo
     vector r, ri, xi, xj, hi, hj, hi_inv, hj_inv, hig_inv, hjg_inv, wi, wj, wi_dx, wj_dx;
     vector rhoi, rhoj, rhoi_dh, rhoj_dh, wcounti, wcountj, wcounti_dh, wcountj_dh;
     vector mi, mj, wscale;
-    vector dx[3];
+    vector dx[3], dv[3];
     vector vi[3], vj[3];    
     vector dvdr, div_vi, div_vj;
     vector curlvr[3], curl_vi[3], curl_vj[3];
@@ -154,14 +161,19 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_vec_density ( flo
     kernel_deval_vec( &xi , &wi , &wi_dx );
     kernel_deval_vec( &xj , &wj , &wj_dx );
 
+    /* Compute dv. */
+    dv[0].v = vi[0].v - vj[0].v;
+    dv[1].v = vi[1].v - vj[1].v;
+    dv[2].v = vi[2].v - vj[2].v;
+
     /* Compute dv dot r */
-    dvdr.v = ( (vi[0].v - vj[0].v) * dx[0].v ) + ( (vi[1].v - vj[1].v) * dx[1].v ) + ( (vi[2].v - vj[2].v) * dx[2].v );
+    dvdr.v = ( dv[0].v * dx[0].v ) + ( dv[1].v * dx[1].v ) + ( dv[2].v * dx[2].v );
     dvdr.v = dvdr.v * ri.v;
 
     /* Compute dv cross r */
-    curlvr[0].v = ( vi[1].v - vj[1].v ) * dx[2].v - ( vi[2].v - vj[2].v ) * dx[1].v;
-    curlvr[1].v = ( vi[2].v - vj[2].v ) * dx[0].v - ( vi[0].v - vj[0].v ) * dx[2].v;
-    curlvr[2].v = ( vi[0].v - vj[0].v ) * dx[1].v - ( vi[1].v - vj[1].v ) * dx[0].v;
+    curlvr[0].v = dv[1].v * dx[2].v - dv[2].v * dx[1].v;
+    curlvr[1].v = dv[2].v * dx[0].v - dv[0].v * dx[2].v;
+    curlvr[2].v = dv[0].v * dx[1].v - dv[1].v * dx[0].v;
     for ( k = 0 ; k < 3 ; k++ )
         curlvr[k].v *= ri.v;    
 
@@ -220,24 +232,31 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_nonsym_density (
     float xi;
     float h_inv, hg_inv;
     float wi, wi_dx;
+    float mj;
     float dvdr;
-    float curlvr[3];
+    float dv[3], curlvr[3];
     int k;
 
     if ( r2 < hi*hi ) {
         
+        /* Get the masses. */
+        mj = pj->mass;
+    
         /* Get r and r inverse. */
         r = sqrtf( r2 );
         ri = 1.0f / r;
     
         /* Compute dv dot r */
-        dvdr = ( pi->v[0] - pj->v[0] ) * dx[0] + ( pi->v[1] - pj->v[1] ) * dx[1] + ( pi->v[2] - pj->v[2] ) * dx[2];
+        dv[0] = pi->v[0] - pj->v[0];
+        dv[1] = pi->v[1] - pj->v[1];
+        dv[2] = pi->v[2] - pj->v[2];
+        dvdr = dv[0]*dx[0] + dv[1]*dx[1] + dv[2]*dx[2];
         dvdr *= ri;
 
         /* Compute dv cross r */
-        curlvr[0] = ( pi->v[1] - pj->v[1] ) * dx[2] - ( pi->v[2] - pj->v[2] ) * dx[1];
-        curlvr[1] = ( pi->v[2] - pj->v[2] ) * dx[0] - ( pi->v[0] - pj->v[0] ) * dx[2];
-        curlvr[2] = ( pi->v[0] - pj->v[0] ) * dx[1] - ( pi->v[1] - pj->v[1] ) * dx[0];
+        curlvr[0] = dv[1]*dx[2] - dv[2]*dx[1];
+        curlvr[1] = dv[2]*dx[0] - dv[0]*dx[2];
+        curlvr[2] = dv[0]*dx[1] - dv[1]*dx[0];
         for ( k = 0 ; k < 3 ; k++ )
             curlvr[k] *= ri;
             
@@ -246,15 +265,15 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_nonsym_density (
         xi = r * hg_inv;
         kernel_deval( xi , &wi , &wi_dx );
         
-        pi->rho += pj->mass * wi;
-        pi->rho_dh -= pj->mass * ( 3.0*wi + xi*wi_dx );
+        pi->rho += mj * wi;
+        pi->rho_dh -= mj * ( 3.0*wi + xi*wi_dx );
         pi->density.wcount += wi * ( 4.0f * M_PI / 3.0f * kernel_igamma3 );
         pi->density.wcount_dh -= xi * h_inv * wi_dx * ( 4.0f * M_PI / 3.0f * kernel_igamma3 );
         // pi->icount += 1;
 
-	    pi->density.div_v += pj->mass * dvdr * wi_dx;
+	    pi->density.div_v += mj * dvdr * wi_dx;
 	    for ( k = 0 ; k < 3 ; k++ )
-	        pi->density.curl_v[k] += pj->mass * curlvr[k] * wi_dx;
+	        pi->density.curl_v[k] += mj * curlvr[k] * wi_dx;
             
         }
 
@@ -271,7 +290,7 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_nonsym_vec_densit
     vector r, ri, xi, hi, hi_inv, hig_inv, wi, wi_dx;
     vector rhoi, rhoi_dh, wcounti, wcounti_dh, div_vi;
     vector mj, wscale;
-    vector dx[3];
+    vector dx[3], dv[3];
     vector vi[3], vj[3];
     vector dvdr;
     vector curlvr[3], curl_vi[3];
@@ -305,15 +324,20 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_nonsym_vec_densit
     xi.v = r.v * hig_inv.v;
 
     kernel_deval_vec( &xi , &wi , &wi_dx );
+    
+    /* Compute dv. */
+    dv[0].v = vi[0].v - vj[0].v;
+    dv[1].v = vi[1].v - vj[1].v;
+    dv[2].v = vi[2].v - vj[2].v;
 
     /* Compute dv dot r */
-    dvdr.v = ( (vi[0].v - vj[0].v) * dx[0].v ) + ( (vi[1].v - vj[1].v) * dx[1].v ) + ( (vi[2].v - vj[2].v) * dx[2].v );
+    dvdr.v = ( dv[0].v * dx[0].v ) + ( dv[1].v * dx[1].v ) + ( dv[2].v * dx[2].v );
     dvdr.v = dvdr.v * ri.v;
 
     /* Compute dv cross r */
-    curlvr[0].v = ( vi[1].v - vj[1].v ) * dx[2].v - ( vi[2].v - vj[2].v ) * dx[1].v;
-    curlvr[1].v = ( vi[2].v - vj[2].v ) * dx[0].v - ( vi[0].v - vj[0].v ) * dx[2].v;
-    curlvr[2].v = ( vi[0].v - vj[0].v ) * dx[1].v - ( vi[1].v - vj[1].v ) * dx[0].v;
+    curlvr[0].v = dv[1].v * dx[2].v - dv[2].v * dx[1].v;
+    curlvr[1].v = dv[2].v * dx[0].v - dv[0].v * dx[2].v;
+    curlvr[2].v = dv[0].v * dx[1].v - dv[1].v * dx[0].v;
     for ( k = 0 ; k < 3 ; k++ )
         curlvr[k].v *= ri.v;    
 
@@ -356,10 +380,17 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_force ( float r2
     float hi_inv, hi2_inv;
     float hj_inv, hj2_inv;
     float wi, wj, wi_dx, wj_dx, wi_dr, wj_dr, w, dvdr;
+    float mi, mj, POrho2i, POrho2j, rhoi, rhoj;
     float v_sig, omega_ij, Pi_ij;
     float f;
     int k;
     
+    /* Get some values in local variables. */
+    mi = pi->mass; mj = pj->mass;
+    rhoi = pi->rho; rhoj = pj->rho;
+    POrho2i = pi->force.POrho2;
+    POrho2j = pj->force.POrho2;
+    
     /* Get the kernel for hi. */
     hi_inv = kernel_igamma / hi;
     hi2_inv = hi_inv * hi_inv;
@@ -382,43 +413,36 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_force ( float r2
     omega_ij = fminf( dvdr , 0.f );
     
     /* Compute signal velocity */
-    v_sig = pi->force.c + pj->force.c - 3.*omega_ij;
+    v_sig = pi->force.c + pj->force.c - 3.0f*omega_ij;
 
     /* Compute viscosity tensor */
-    Pi_ij = -const_viscosity_alpha * v_sig * omega_ij / (pi->rho + pj->rho);
+    Pi_ij = -const_viscosity_alpha * v_sig * omega_ij / ( rhoi + rhoj );
 
     /* Apply balsara switch */
     Pi_ij *= ( pi->force.balsara + pj->force.balsara );
 
     /* Get the common factor out. */
-    w = ri * ( ( pi->force.POrho2 * wi_dr + pj->force.POrho2 * wj_dr ) + 0.25f * Pi_ij * ( wi_dr + wj_dr ) );
+    w = ri * ( ( POrho2i * wi_dr + POrho2j * wj_dr ) + 0.25f * Pi_ij * ( wi_dr + wj_dr ) );
 
     /* Use the force, Luke! */
     for ( k = 0 ; k < 3 ; k++ ) {
         f = dx[k] * w;
-        pi->a[k] -= pj->mass * f;
-        pj->a[k] += pi->mass * f;
+        pi->a[k] -= mj * f;
+        pj->a[k] += mi * f;
         }
                 
     /* Get the time derivative for u. */
-    pi->force.u_dt += pj->mass * dvdr * ( pi->force.POrho2 * wi_dr + 0.125f * Pi_ij * ( wi_dr + wj_dr ) );
-    pj->force.u_dt += pi->mass * dvdr * ( pj->force.POrho2 * wj_dr + 0.125f * Pi_ij * ( wi_dr + wj_dr ) );
+    pi->force.u_dt += mj * dvdr * ( POrho2i * wi_dr + 0.125f * Pi_ij * ( wi_dr + wj_dr ) );
+    pj->force.u_dt += mi * dvdr * ( POrho2j * wj_dr + 0.125f * Pi_ij * ( wi_dr + wj_dr ) );
     
     /* Get the time derivative for h. */
-    pi->force.h_dt -= pj->mass * dvdr / pj->rho * wi_dr;
-    pj->force.h_dt -= pi->mass * dvdr / pi->rho * wj_dr;
+    pi->force.h_dt -= mj * dvdr / rhoj * wi_dr;
+    pj->force.h_dt -= mi * dvdr / rhoi * wj_dr;
     
     /* Update the signal velocity. */
     pi->force.v_sig = fmaxf( pi->force.v_sig , v_sig );
     pj->force.v_sig = fmaxf( pj->force.v_sig , v_sig );
     
-    #ifdef HIST
-    if ( hi > hj )
-        runner_hist_hit( hi / hj );
-    else
-        runner_hist_hit( hj / hi );
-    #endif
-    
     }
     
 
@@ -586,10 +610,17 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_nonsym_force ( fl
     float hi_inv, hi2_inv;
     float hj_inv, hj2_inv;
     float wi, wj, wi_dx, wj_dx, wi_dr, wj_dr, w, dvdr;
+    float mj, POrho2i, POrho2j, rhoi, rhoj;
     float v_sig, omega_ij, Pi_ij;
     float f;
     int k;
     
+    /* Get some values in local variables. */
+    mj = pj->mass;
+    rhoi = pi->rho; rhoj = pj->rho;
+    POrho2i = pi->force.POrho2;
+    POrho2j = pj->force.POrho2;
+    
     /* Get the kernel for hi. */
     hi_inv = kernel_igamma / hi;
     hi2_inv = hi_inv * hi_inv;
@@ -612,40 +643,33 @@ __attribute__ ((always_inline)) INLINE static void runner_iact_nonsym_force ( fl
     omega_ij = fminf( dvdr , 0.f );
     
     /* Compute signal velocity */
-    v_sig = pi->force.c + pj->force.c - 3.*omega_ij;
+    v_sig = pi->force.c + pj->force.c - 3.0f*omega_ij;
 
     /* Compute viscosity tensor */
-    Pi_ij = -const_viscosity_alpha * v_sig * omega_ij / (pi->rho + pj->rho);
+    Pi_ij = -const_viscosity_alpha * v_sig * omega_ij / ( rhoi + rhoj );
 
     /* Apply balsara switch */
-    Pi_ij *= (pi->force.balsara + pj->force.balsara);
+    Pi_ij *= ( pi->force.balsara + pj->force.balsara );
 
     /* Get the common factor out. */
-    w = ri * ( ( pi->force.POrho2 * wi_dr + pj->force.POrho2 * wj_dr ) + 0.25f * Pi_ij * ( wi_dr + wj_dr ) );
+    w = ri * ( ( POrho2i * wi_dr + POrho2j * wj_dr ) + 0.25f * Pi_ij * ( wi_dr + wj_dr ) );
 
     /* Use the force, Luke! */
     for ( k = 0 ; k < 3 ; k++ ) {
         f = dx[k] * w;
-        pi->a[k] -= pj->mass * f;
+        pi->a[k] -= mj * f;
         }
                 
     /* Get the time derivative for u. */
-    pi->force.u_dt += pj->mass * dvdr * ( pi->force.POrho2 * wi_dr + 0.125f * Pi_ij * ( wi_dr + wj_dr ) );
+    pi->force.u_dt += mj * dvdr * ( POrho2i * wi_dr + 0.125f * Pi_ij * ( wi_dr + wj_dr ) );
     
     /* Get the time derivative for h. */
-    pi->force.h_dt -= pj->mass * dvdr / pj->rho * wi_dr;
+    pi->force.h_dt -= mj * dvdr / rhoj * wi_dr;
     
     /* Update the signal velocity. */
     pi->force.v_sig = fmaxf( pi->force.v_sig , v_sig );
     pj->force.v_sig = fmaxf( pj->force.v_sig , v_sig );
     
-    #ifdef HIST
-    if ( hi > hj )
-        runner_hist_hit( hi / hj );
-    else
-        runner_hist_hit( hj / hi );
-    #endif
-    
     }
     
 
-- 
GitLab