Merge pull request #2082 from JoePfeiffer/fix-2032
Tell user about zero-area fins and keep them from crashing simulation with NaN error
This commit is contained in:
commit
8d6cb3fdbc
@ -1888,6 +1888,7 @@ Warning.PODSET_FORWARD = In-line podset forward of parent airframe component
|
|||||||
Warning.PODSET_OVERLAP = In-line podset overlaps parent airframe component
|
Warning.PODSET_OVERLAP = In-line podset overlaps parent airframe component
|
||||||
Warning.THICK_FIN = Thick fins may not simulate accurately.
|
Warning.THICK_FIN = Thick fins may not simulate accurately.
|
||||||
Warning.JAGGED_EDGED_FIN = Jagged-edged fin predictions may be inaccurate.
|
Warning.JAGGED_EDGED_FIN = Jagged-edged fin predictions may be inaccurate.
|
||||||
|
Warning.ZERO_AREA_FIN = Fins with zero area will not affect aerodynamics
|
||||||
Warning.LISTENERS_AFFECTED = Listeners modified the flight simulation
|
Warning.LISTENERS_AFFECTED = Listeners modified the flight simulation
|
||||||
Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING = Recovery device opened while motor still burning.
|
Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING = Recovery device opened while motor still burning.
|
||||||
Warning.FILE_INVALID_PARAMETER = Invalid parameter encountered, ignoring.
|
Warning.FILE_INVALID_PARAMETER = Invalid parameter encountered, ignoring.
|
||||||
|
@ -382,6 +382,10 @@ public abstract class Warning {
|
|||||||
////Jagged-edged fin predictions may be inaccurate.
|
////Jagged-edged fin predictions may be inaccurate.
|
||||||
public static final Warning JAGGED_EDGED_FIN = new Other(trans.get("Warning.JAGGED_EDGED_FIN"));
|
public static final Warning JAGGED_EDGED_FIN = new Other(trans.get("Warning.JAGGED_EDGED_FIN"));
|
||||||
|
|
||||||
|
/** A <code>Warning</code> that the fins have a zero area. */
|
||||||
|
////Fins with no area will not affect aerodynamics
|
||||||
|
public static final Warning ZERO_AREA_FIN = new Other(trans.get("Warning.ZERO_AREA_FIN"));
|
||||||
|
|
||||||
/** A <code>Warning</code> that simulation listeners have affected the simulation */
|
/** A <code>Warning</code> that simulation listeners have affected the simulation */
|
||||||
////Listeners modified the flight simulation
|
////Listeners modified the flight simulation
|
||||||
public static final Warning LISTENERS_AFFECTED = new Other(trans.get("Warning.LISTENERS_AFFECTED"));
|
public static final Warning LISTENERS_AFFECTED = new Other(trans.get("Warning.LISTENERS_AFFECTED"));
|
||||||
|
@ -84,7 +84,9 @@ public class FinSetCalc extends RocketComponentCalc {
|
|||||||
public void calculateNonaxialForces(FlightConditions conditions, Transformation transform,
|
public void calculateNonaxialForces(FlightConditions conditions, Transformation transform,
|
||||||
AerodynamicForces forces, WarningSet warnings) {
|
AerodynamicForces forces, WarningSet warnings) {
|
||||||
|
|
||||||
if (span < 0.001) {
|
warnings.addAll(geometryWarnings);
|
||||||
|
|
||||||
|
if (finArea < MathUtil.EPSILON) {
|
||||||
forces.setCm(0);
|
forces.setCm(0);
|
||||||
forces.setCN(0);
|
forces.setCN(0);
|
||||||
forces.setCNa(0);
|
forces.setCNa(0);
|
||||||
@ -96,12 +98,6 @@ public class FinSetCalc extends RocketComponentCalc {
|
|||||||
forces.setCyaw(0);
|
forces.setCyaw(0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((bodyRadius > 0) && (thickness > bodyRadius / 2)){
|
|
||||||
// Add warnings (radius/2 == diameter/4)
|
|
||||||
warnings.add(Warning.THICK_FIN);
|
|
||||||
}
|
|
||||||
warnings.addAll(geometryWarnings);
|
|
||||||
|
|
||||||
//////// Calculate CNa. /////////
|
//////// Calculate CNa. /////////
|
||||||
|
|
||||||
@ -241,18 +237,27 @@ public class FinSetCalc extends RocketComponentCalc {
|
|||||||
|
|
||||||
Coordinate[] points = component.getFinPoints();
|
Coordinate[] points = component.getFinPoints();
|
||||||
|
|
||||||
// Check for jagged edges
|
// Check geometry
|
||||||
geometryWarnings.clear();
|
geometryWarnings.clear();
|
||||||
boolean down = false;
|
boolean down = false;
|
||||||
for (int i = 1; i < points.length; i++) {
|
for (int i = 1; i < points.length; i++) {
|
||||||
if ((points[i].y > points[i - 1].y + 0.001) && down) {
|
if ((points[i].y > points[i - 1].y + 0.001) && down) {
|
||||||
geometryWarnings.add(Warning.JAGGED_EDGED_FIN);
|
geometryWarnings.add(Warning.JAGGED_EDGED_FIN, component.toString());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (points[i].y < points[i - 1].y - 0.001) {
|
if (points[i].y < points[i - 1].y - 0.001) {
|
||||||
down = true;
|
down = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (finArea < MathUtil.EPSILON) {
|
||||||
|
geometryWarnings.add(Warning.ZERO_AREA_FIN, component.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((bodyRadius > 0) && (thickness > bodyRadius / 2)){
|
||||||
|
// Add warnings (radius/2 == diameter/4)
|
||||||
|
geometryWarnings.add(Warning.THICK_FIN, component.toString());
|
||||||
|
}
|
||||||
|
|
||||||
// Calculate the chord lead and trail positions and length
|
// Calculate the chord lead and trail positions and length
|
||||||
|
|
||||||
@ -365,7 +370,6 @@ public class FinSetCalc extends RocketComponentCalc {
|
|||||||
macLead *= dy;
|
macLead *= dy;
|
||||||
area *= dy;
|
area *= dy;
|
||||||
rollSum *= dy;
|
rollSum *= dy;
|
||||||
|
|
||||||
macLength /= area;
|
macLength /= area;
|
||||||
macSpan /= area;
|
macSpan /= area;
|
||||||
macLead /= area;
|
macLead /= area;
|
||||||
@ -614,6 +618,11 @@ public class FinSetCalc extends RocketComponentCalc {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double calculateFrictionCD(FlightConditions conditions, double componentCf, WarningSet warnings) {
|
public double calculateFrictionCD(FlightConditions conditions, double componentCf, WarningSet warnings) {
|
||||||
|
// a fin with 0 area contributes no drag
|
||||||
|
if (finArea < MathUtil.EPSILON) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
double cd = componentCf * (1 + 2 * thickness / macLength) * 2 * finArea / conditions.getRefArea();
|
double cd = componentCf * (1 + 2 * thickness / macLength) * 2 * finArea / conditions.getRefArea();
|
||||||
return cd;
|
return cd;
|
||||||
}
|
}
|
||||||
@ -622,6 +631,11 @@ public class FinSetCalc extends RocketComponentCalc {
|
|||||||
public double calculatePressureCD(FlightConditions conditions,
|
public double calculatePressureCD(FlightConditions conditions,
|
||||||
double stagnationCD, double baseCD, WarningSet warnings) {
|
double stagnationCD, double baseCD, WarningSet warnings) {
|
||||||
|
|
||||||
|
// a fin with 0 area contributes no drag
|
||||||
|
if (finArea < MathUtil.EPSILON) {
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
double mach = conditions.getMach();
|
double mach = conditions.getMach();
|
||||||
double cd = 0;
|
double cd = 0;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user