Exemplo n.º 1
0
/* ********************************************************************* */
int PressureFix(Map_param *par)
/*!
 * Fix p to a small value, solve for the square of velocity by using
 * secant algorithm applied to Eq (9) of Mignone, Plewa \& Bodo (2005).
 * This step involved re-computing W at each step of the iteration.
 * Once the root has been found, we recompute total energy E.
 * Return 0 if succesful, 1 otherwise.
 *
 *********************************************************************** */
{
  int    k, done=0;
  double v2, v2c, fc, f, dW, S2_W2;
  double fmin, fmax, v2min, v2max;
  
  par->prs = g_smallPressure; 

  v2max = 1.0-1.e-8;
  v2c = 0.95;
  fc  = VelocitySquareFunc(v2c, par);
  v2  = 0.96;
  for (k = 1; k < MAX_ITER; k++){
    f   = VelocitySquareFunc(v2, par);
    if (done == 1) break;
    dW  = (v2 - v2c)/(f - fc)*f;
    v2c = v2; fc = f;
    v2 -= dW;
    v2 = MIN(v2max,v2);
    v2 = MAX(v2, 0.0);
    if (fabs(f) < 1.e-9) done = 1;
  }
  if (v2 >= 1.0 || k >= MAX_ITER) {
    print ("! PressureFix: too many iter while fixing p , v^2 = %f\n", v2);
    return (1);
  }

/* -- Redefine energy, density and entropy -- */
  
  par->E   = par->W - par->prs;
  par->rho = par->D/par->lor;

#if ENTROPY_SWITCH
{
  double rho = par->rho;
  double th  = par->prs/rho; 
  #if EOS == IDEAL
  par->sigma_c = par->prs*par->lor/pow(rho,g_gamma-1);
  #elif EOS == TAUB
  th = par->prs/rho;  
  par->sigma_c = par->prs*par->lor/pow(rho,2.0/3.0)*(1.5*th + sqrt(2.25*th*th + 1.0);
  #endif
}
#endif

  return(0);  /* -- success -- */
} 
Exemplo n.º 2
0
/* ********************************************************************* */
int PressureFix(Map_param *par)
/*!
 *
 *********************************************************************** */
{
  int    k, done=0;
  double v2, v2c, fc, f, dW, S2_W2;
  double fmin, fmax, v2min, v2max;
  
  par->prs = g_smallPressure; 

  v2max = 1.0-1.e-8;
  v2c = 0.95;
  fc  = VelocitySquareFunc(v2c, par);
  v2  = 0.96;
  for (k = 1; k < MAX_ITER; k++){
    f   = VelocitySquareFunc(v2, par);
    if (done == 1) break;
    dW  = (v2 - v2c)/(f - fc)*f;
    v2c = v2; fc = f;
    v2 -= dW;
    v2 = MIN(v2max,v2);
    v2 = MAX(v2, 0.0);
    if (fabs(f) < 1.e-9) done = 1;
  }
  if (v2 >= 1.0 || k >= MAX_ITER) {
    print ("! PressureFix: too many iter while fixing p , v^2 = %f\n", v2);
    return (1);
  }
/*
v2min = 0.0;
for (k = 1; k < MAX_ITER; k++){
  v2c = 0.5*(v2min + v2max);
  fc  = FUNV2(v2c, p, u, m2, S2, Bmag2); 
  if (fc*fmin > 0.0){
    v2min = v2c; fmin  = fc;
  }else{
    v2max = v2c; fmax  = fc;
  }
  if (fabs(fc) < 1.e-9) break;
}    
if (fabs (v2c-v2) > 1.e-8) {
 print ("! Solution mismatch\n");
 QUIT_PLUTO(1);
}
*/

/* -----------------------------------------------------
         redefine energy and proper density 
   ----------------------------------------------------- */
  
  S2_W2 = par->S2/(par->W*par->W); 
  #if SUBTRACT_DENSITY == YES
   par->E = par->W - par->D - par->prs + 0.5*(1.0 + v2)*par->B2 - 0.5*S2_W2;
  #else
   par->E = par->W - par->prs + 0.5*(1.0 + v2)*par->B2 - 0.5*S2_W2;
  #endif
  par->rho = par->D/par->lor;

  return(0);  /* -- success -- */
}