private double CalcP(int currentAngle, DataPolitropsOfComprassionAndExpansion.Iterator iterBeg, DataPolitropsOfComprassionAndExpansion.Iterator iterEnd) { if (currentAngle < 180) { return(CalcPolitrops.KoefPa); } if (currentAngle >= 180 && currentAngle < 360) { return(CalcPolitrops.DataPolitrops.PressureOnLineCompression[iterEnd.next()]); } if (DataSpecificForces.Angles[DataSpecificForces.Angles.Count - 1] == 360 && DataSpecificForces.Angles[DataSpecificForces.Angles.Count - 2] != 360) // last record with 360 degree with pressure compression { return(CalcPolitrops.DataPolitrops.PressureOnLineCompression[iterEnd.next()]); } else if (DataSpecificForces.Angles[DataSpecificForces.Angles.Count - 1] == 360 && DataSpecificForces.Angles[DataSpecificForces.Angles.Count - 2] == 360) // add repeated record with 360 degree with pressure expansion { return(CalcPolitrops.DataPolitrops.PressureOnLineExpansion[iterBeg.next()]); } if (currentAngle > 360 && currentAngle <= 540) { return(CalcPolitrops.DataPolitrops.PressureOnLineExpansion[iterBeg.next()]); } if (currentAngle > 540) { return(CalcPolitrops.KoefPa); } return(0.0); }
private double CalcPForLamdaEqualOne(int deltaAngle, int currentAngle, DataPolitropsOfComprassionAndExpansion.Iterator iterEnd) { if (currentAngle < 180) { return(CalcPolitrops.KoefPa); } if (currentAngle >= 180 && currentAngle <= 360) { return(CalcPolitrops.DataPolitrops.PressureOnLineCompression[iterEnd.next()]); } else //обратный расчет)) { int indexOfRecordOn360Degree = 360 / deltaAngle; int offSet = (currentAngle - 360) / deltaAngle; return(this.DataSpecificForces.P[indexOfRecordOn360Degree - offSet]); } }
private void CalcDataOfSpecificForces(int deltaAngle, double lambdaDegreeIncreasePressure, CancellationToken token) { // casual calc if (lambdaDegreeIncreasePressure != 1.0) { DataPolitropsOfComprassionAndExpansion.Iterator iterOfEndPolitropsData = CalcPolitrops.DataPolitrops.getIterator(DataPolitropsOfComprassionAndExpansion.IterPosition.End); DataPolitropsOfComprassionAndExpansion.Iterator iterOfStartPolitropsData = CalcPolitrops.DataPolitrops.getIterator(DataPolitropsOfComprassionAndExpansion.IterPosition.Start); for (int currentAngle = START_ANGLE; currentAngle <= END_ANGLE; currentAngle += deltaAngle) { //кут в радианах double currentAngleInRad = currentAngle * (PI / 180.0); //кути this.DataSpecificForces.Angles.Add(currentAngle); //тиск газів на поршень double p = CalcP(currentAngle, iterOfStartPolitropsData, iterOfEndPolitropsData); this.DataSpecificForces.P.Add(p); //тиск газів зі сторони картера double pr = p - CalcSpecificForces.P0; this.DataSpecificForces.Pr.Add(Round(pr, 3)); //прискорення поршня double j = calcJ(currentAngleInRad); this.DataSpecificForces.J.Add(Round(j, 3)); //питомы сили інерції мас double pj = calcPj(j); this.DataSpecificForces.Pj.Add(Round(pj, 3)); //сумарна питома сила double pSum = pj + pr; this.DataSpecificForces.Psum.Add(Round(pSum, 3)); //tgBeta double cosBeta = Sqrt(1 - CalcPolitrops.LAMBDA * CalcPolitrops.LAMBDA * Sin(currentAngleInRad) * Sin(currentAngleInRad)); double beta = Math.Acos(cosBeta); double tanBeta = Tan(beta); this.DataSpecificForces.TgBeta.Add(Round(tanBeta, 3)); //N сила що спрямована нормально до осі циліндра this.DataSpecificForces.N.Add(Round(pSum * tanBeta, 3)); //cosBeta this.DataSpecificForces.CosBeta.Add(Round(cosBeta, 3)); //K сила що діє вздовж осі циліндра this.DataSpecificForces.K.Add(Round(pSum / cosBeta, 3)); //sin(phi+beta)/cos(beta) this.DataSpecificForces.SinPhiPlBetaOnCosBeta.Add(Round(Sin(currentAngleInRad + beta) / cosBeta, 3)); //T тангенціальна сила this.DataSpecificForces.T.Add(Round(pSum * (Sin(currentAngleInRad + beta) / cosBeta), 3)); //cos(phi+beta)/cos(beta) this.DataSpecificForces.CosPhiPlBetaOnCosBeta.Add(Round(Cos(currentAngleInRad + beta) / cosBeta, 3)); //Z нормальна сила спрямована вздовж кривошипа this.DataSpecificForces.Z.Add(Round(pSum * (Cos(currentAngleInRad * beta) / cosBeta), 3)); //cancel execute calc func if (token.IsCancellationRequested) { token.ThrowIfCancellationRequested(); } if (DataSpecificForces.Angles[DataSpecificForces.Angles.Count - 1] == 360 && DataSpecificForces.Angles[DataSpecificForces.Angles.Count - 2] != 360) // add repeated record with 360 degree with pressure expansion { currentAngle -= deltaAngle; } } } else // specific Calc for lamda == 1.0 { DataPolitropsOfComprassionAndExpansion.Iterator iterOfEndPolitropsData = CalcPolitrops.DataPolitrops.getIterator(DataPolitropsOfComprassionAndExpansion.IterPosition.End); for (int currentAngle = START_ANGLE, iterIndex = 0; currentAngle <= END_ANGLE - 5; //not get 720 degree currentAngle += deltaAngle, iterIndex++) { //кут в радианах double currentAngleInRad = currentAngle * (PI / 180.0); //кути this.DataSpecificForces.Angles.Add(currentAngle); //тиск газів на поршень double p = CalcPForLamdaEqualOne(deltaAngle, currentAngle, iterOfEndPolitropsData); this.DataSpecificForces.P.Add(p); //тиск газів зі сторони картера double pr = p - CalcSpecificForces.P0; this.DataSpecificForces.Pr.Add(Round(pr, 3)); //прискорення поршня double j = calcJ(currentAngleInRad); this.DataSpecificForces.J.Add(Round(j, 3)); //питомы сили інерції мас double pj = calcPj(j); this.DataSpecificForces.Pj.Add(Round(pj, 3)); //сумарна питома сила double pSum = pj + pr; this.DataSpecificForces.Psum.Add(Round(pSum, 3)); //tgBeta double cosBeta = Sqrt(1 - CalcPolitrops.LAMBDA * CalcPolitrops.LAMBDA * Sin(currentAngleInRad) * Sin(currentAngleInRad)); double beta = Math.Acos(cosBeta); double tanBeta = Tan(beta); this.DataSpecificForces.TgBeta.Add(Round(tanBeta, 3)); //N сила що спрямована нормально до осі циліндра this.DataSpecificForces.N.Add(Round(pSum * tanBeta, 3)); //cosBeta this.DataSpecificForces.CosBeta.Add(Round(cosBeta, 3)); //K сила що діє вздовж осі циліндра this.DataSpecificForces.K.Add(Round(pSum / cosBeta, 3)); //sin(phi+beta)/cos(beta) this.DataSpecificForces.SinPhiPlBetaOnCosBeta.Add(Round(Sin(currentAngleInRad + beta) / cosBeta, 3)); //T тангенціальна сила this.DataSpecificForces.T.Add(Round(pSum * (Sin(currentAngleInRad + beta) / cosBeta), 3)); //cos(phi+beta)/cos(beta) this.DataSpecificForces.CosPhiPlBetaOnCosBeta.Add(Round(Cos(currentAngleInRad + beta) / cosBeta, 3)); //Z нормальна сила спрямована вздовж кривошипа this.DataSpecificForces.Z.Add(Round(pSum * (Cos(currentAngleInRad * beta) / cosBeta), 3)); //cancel execute calc func if (token.IsCancellationRequested) { token.ThrowIfCancellationRequested(); } } } }