Boost logo

Boost :

From: Andy Little (andy_at_[hidden])
Date: 2004-01-07 05:23:34


"David B. Held" <dheld_at_[hidden]> wrote in message
news:btgjns$do1$1_at_sea.gmane.org...
> "Andy Little" <andy_at_[hidden]> wrote in message
> news:btgigm$bfq$1_at_sea.gmane.org...
> >
> > "Daniel Frey" <daniel.frey_at_[hidden]> wrote
> >
> > > > Speed s = 2 m / s;
> > [...]
> > q_velocity::m_div_s s(2);
>
> If I had to choose between the two, I'd pick the first one, hands down.
> Why? Well, it all goes back to expressing the solution in the language
> of the problem domain. Granted, this is an extreme (ab)use of
> operator overloading, but if it lets us write expressions that almost
> look natural, why shouldn't we take advantage?

chord_omega CBladeCalcDoc::getChordOmega(const double& r)const
{
 const double& tip_r = rotordialog.m_outer_dia/2000.0L;
 const double rr = r/1000;
 const double& tsr = rotordialog.m_tsr;
 const double& ellipticality = rotordialog.m_ellipticality;
 const double& Vin_y= rotordialog.m_vw;
 const double dr = get_dr()/1000.0L;
 const double dt = 1.0L;

 // could simplify to vout_y = vin_y*(1/3 + ellipticality *(2/3 -
sqrt(1-r^2/R^2))
 const double Vout_y = Vin_y * ((rr < tip_r)
  ?1.0L-((2.0L/3.0L)*(1.0L - ellipticality) +
   (ellipticality * sqrt(1.0L - (rr*rr)/(tip_r*tip_r))))
  :1.0L-((2.0L/3.0L)*(1.0L - ellipticality)) );
 const double Vb_y = (Vin_y + Vout_y)/2.0L;
 const double mass = Vb_y * 2 * PI * (rr) * rotordialog.m_rho_air * dr;
 const double Fb_y = mass * (Vin_y - Vout_y)/dt;
 double Vout_x=0;
 double oldVout_x=0;
 const double cl = rotordialog.m_cl;
 const double drag_coeff = rotordialog.m_cd/cl;
 for (int i =0;i < 1000;++i){
  const double Vb_x = Vout_x/2.0L + Vin_y * tsr * (rr/tip_r);
  const double beta = atan2(Vb_y,Vb_x);
  const double sinbeta = sin(beta);
  const double cosbeta = cos(beta);
  const double Lift = Fb_y/(cosbeta + drag_coeff * sinbeta);
  const double Fb_x = Lift * (sinbeta - drag_coeff * cosbeta);
  oldVout_x = Vout_x;
  Vout_x= Fb_x/mass;
  if ( abs(Vout_x - oldVout_x) < 0.0001L * Vin_y){
   double chord = Lift /
    ((Vb_x * Vb_x + Vb_y * Vb_y) *0.5* rotordialog.m_rho_air* cl *dr *
rotordialog.m_numblades);
   return chord_omega(chord * 1000,beta - rotordialog.m_alpha *
0.017453293L);
  }
 }
 return chord_omega(0,0);//fail
}

Feel free to recode in your 'problem domain' with m and s my friend. I'll
take my syntax .

BTW what about performance? Or doesnt that matter?

regards
Andy Little


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk