/* eta is a measure of efficiency of the boat, from .01 for racing boats to .5 for heavy cruisers */ void BoatPlan::ComputeBoatSpeeds(Boat &boat) { csvFileName = _("<Computed>"); for(int VWi = 0; VWi < num_wind_speeds; VWi++) for(int Wi = 0; Wi <= DEGREE_COUNT/2; Wi++) { double VW = wind_speeds[VWi]; double W = Wi * DEGREE_STEP; double B, VB, A, VA; BoatSteadyState(deg2rad(W), VW, B, VB, A, VA, boat); Set(Wi, VWi, VB); if(W != 0) Set(DEGREE_COUNT-Wi, VWi, VB); } CalculateVMG(); computed = true; }
/* eta is a measure of efficiency of the boat, from .01 for racing boats to .5 for heavy cruisers */ void BoatPlan::ComputeBoatSpeeds(Boat &boat, PolarMethod method, int speed) { // fileFileName = _T(""); if(/*polarmethod == FROM_FILE ||*/ wind_speeds.size() != num_computed_wind_speeds || degree_steps.size() != computed_degree_count) { wind_speeds.clear(); degree_steps.clear(); for(unsigned int Wi = 0; Wi < computed_degree_count; Wi++) degree_steps.push_back(computed_degree_step*Wi); UpdateDegreeStepLookup(); for(unsigned int VWi = 0; VWi < num_computed_wind_speeds; VWi++) { wind_speeds.push_back(SailingWindSpeed(computed_wind_speeds[VWi])); wind_speeds[VWi].speeds.clear(); for(unsigned int Wi = 0; Wi < computed_degree_count; Wi++) wind_speeds[VWi].speeds.push_back(SailingWindSpeed::SailingSpeed(0, degree_steps[Wi])); } } // for IMF computation double SADR = boat.SailAreaDisplacementRatio(); double lwl_ft = boat.lwl_ft; double hull_speed = boat.HullSpeed(); int VW1i, VW2i; if(speed == -1) // all speeds VW1i = 0, VW2i = wind_speeds.size() - 1; else ClosestVWi(speed, VW1i, VW2i); for(int VWi = VW1i; VWi <= VW2i; VWi++) { for(unsigned int Wi = 0; Wi <= computed_degree_count/2; Wi++) { double VW = wind_speeds[VWi].VW; double W = Wi * computed_degree_step; double B, VB, A, VA; switch(method) { case TRANSFORM: BoatSteadyState(deg2rad(W), VW, B, VB, A, VA, boat); break; case IMF: { if(fabsf(W) < 30) VB = 0; else { double base_speed = 2.62 + .066*SADR + .051*lwl_ft; double b = 1 / sqrt(VW + 3); VB = base_speed*(sin(deg2rad(W)/2) + b*cos(deg2rad(W))) * sqrt(20*VW) / 8; if(VB > hull_speed) VB = hull_speed; } } default: printf("BoatPlan::ComputeBoatSpeeds called with invalid method: %d\n", method); return; } Set(Wi, VWi, VB, W); if(W != 0) // assume symmetric performance Set(computed_degree_count-Wi, VWi, VB, DEGREES-W); } CalculateVMG(VWi); } polarmethod = method; }