\r
//TODO Amount<Volume> volumeBurnt = motor.getGrain().volume(prev.regression).minus(motor.getGrain().volume(next.regression));\r
Amount<Volume> volumeBurnt = motor.getGrain().surfaceArea(prev.regression).times(regStep).to(Volume.UNIT);\r
- \r
log.info("Volume Burnt: " + volumeBurnt.to(SI.MILLIMETER.pow(3)));\r
\r
Amount<MassFlowRate> mGenRate = volumeBurnt.times(motor.getFuel().getIdealDensity().times(motor.getFuel().getDensityRatio())).divide(dt).to(MassFlowRate.UNIT);\r
- \r
log.debug("Mass Gen Rate: " + mGenRate);\r
\r
+ //Calculate specific gas constant\r
Amount specificGasConstant = Constants.R.divide(motor.getFuel().getCombustionProduct().getEffectiveMolarWeight());\r
+ //This unit conversion helps JScience to convert nozzle flow rate to\r
+ //kg/s a little later on I verified the conversion by hand and\r
+ //JScience checks it too.\r
+ specificGasConstant = convertSpecificGasConstantUnits(specificGasConstant);\r
+ \r
+ //Calculate chamber temperature\r
Amount<Temperature> chamberTemp = motor.getFuel().getCombustionProduct().getIdealCombustionTemperature().times(motor.getFuel().getCombustionEfficiency());\r
\r
Amount<MassFlowRate> mNozzle;\r
{\r
Amount<Pressure> pDiff = prev.chamberPressure.minus(atmosphereicPressure);\r
- \r
- //pDiff = Amount.valueOf(.7342, MPA).minus(atmosphereicPressure);\r
- \r
log.debug("Pdiff: " + pDiff);\r
- \r
Amount<Area> aStar = motor.getNozzle().throatArea();\r
- \r
double k = motor.getFuel().getCombustionProduct().getRatioOfSpecificHeats();\r
- \r
- log.debug("K: " + k);\r
- \r
- double kSide = Math.sqrt(k) * Math.pow((2/(k+1)) , (((k+1)/2)/(k-1))); //Math.pow(2/k+1, (k+1)/(2*(k-1)));\r
- \r
- log.debug("K-Part: (good)" + kSide);\r
- \r
- \r
- \r
- //This unit conversion helps JScience to convert nozzle flow rate to\r
- //kg/s a little later on I verified the conversion by hand and\r
- //JScience checks it too.\r
- specificGasConstant = convertSpecificGasConstantUnits(specificGasConstant);\r
- \r
- log.debug("Specific Gas Constant: (good)" + specificGasConstant);\r
- \r
+ double kSide = Math.sqrt(k) * Math.pow((2/(k+1)) , (((k+1)/2)/(k-1)));\r
Amount sqrtPart = specificGasConstant.times(chamberTemp).sqrt();\r
-\r
- //Unit x = SI.JOULE.divide(SI.KILOGRAM).root(2);\r
- \r
- //sqrtPart = sqrtPart.times(Amount.valueOf(1, x));\r
- \r
- log.debug("Square Root Part: " + sqrtPart);\r
- \r
mNozzle = pDiff.times(aStar).times(kSide).divide(sqrtPart).to(MassFlowRate.UNIT);\r
- \r
- log.debug("Nozzle Flow: " + mNozzle);\r
- \r
- log.debug("Nozzle Flow: " + mNozzle.to(MassFlowRate.UNIT));\r
- \r
- \r
- \r
- \r
+ log.debug("Mass Exit Rate: " + mNozzle.to(MassFlowRate.UNIT)); \r
}\r
\r
Amount<MassFlowRate> massStorageRate = mGenRate.minus(mNozzle);\r
\r
- log.debug("Chamber Product rate: " + massStorageRate);\r
- \r
+ log.debug("Mass Storage Rate: " + massStorageRate);\r
+\r
next.chamberProduct = prev.chamberProduct.plus(massStorageRate.times(dt));\r
\r
+ //Product can not go negative!\r
+ if ( next.chamberProduct.isLessThan(Amount.valueOf(0, SI.KILOGRAM)) )\r
+ next.chamberProduct = Amount.valueOf(0, SI.KILOGRAM);\r
+ \r
log.debug("Chamber Product: " + next.chamberProduct);\r
\r
Amount<VolumetricDensity> combustionProductDensity = next.chamberProduct.divide(motor.getChamber().chamberVolume().minus(motor.getGrain().volume(next.regression))).to(VolumetricDensity.UNIT);\r
\r
next.thrust = motor.getNozzle().thrust(next.chamberPressure, atmosphereicPressure, atmosphereicPressure, motor.getFuel().getCombustionProduct().getRatioOfSpecificHeats2Phase());\r
\r
- if ( next.chamberPressure.approximates(atmosphereicPressure)){\r
+ if ( i > 100 && next.chamberPressure.approximates(atmosphereicPressure)){\r
log.info("Pressure at Patm on step " + i);\r
break;\r
}\r