calculate_stability_derivatives
Calculate longitudinal stability derivatives for aircraft wings based on wing configuration and flight conditions to analyze aerodynamic stability.
Instructions
Calculate basic longitudinal stability derivatives for a wing.
Args: wing_config: Wing configuration parameters flight_conditions: Flight conditions
Returns: JSON string with stability derivatives
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| wing_config | Yes | ||
| flight_conditions | Yes |
Implementation Reference
- The primary handler function for the MCP tool 'calculate_stability_derivatives'. It wraps the core implementation from integrations.aero, handles errors, and returns a formatted JSON string response.def calculate_stability_derivatives(wing_config: dict, flight_conditions: dict) -> str: """Calculate basic longitudinal stability derivatives for a wing. Args: wing_config: Wing configuration parameters flight_conditions: Flight conditions Returns: JSON string with stability derivatives """ try: from ..integrations.aero import calculate_stability_derivatives as _stability result = _stability(wing_config, flight_conditions) return json.dumps(result, indent=2) except ImportError: return "Stability analysis not available - install aerodynamics packages" except Exception as e: logger.error(f"Stability analysis error: {str(e)}", exc_info=True) return f"Stability analysis error: {str(e)}"
- aerospace_mcp/fastmcp_server.py:102-102 (registration)Registration of the 'calculate_stability_derivatives' tool in the FastMCP server.mcp.tool(calculate_stability_derivatives)
- Core implementation of stability derivatives calculation using simplified lifting line theory approximations, including lift curve slope (CL_alpha) and pitching moment slope (CM_alpha). Accepts WingGeometry and flight conditions.def calculate_stability_derivatives( geometry: WingGeometry, alpha_deg: float = 2.0, mach: float = 0.2 ) -> StabilityDerivatives: """ Calculate basic longitudinal stability derivatives. Args: geometry: Wing geometry alpha_deg: Reference angle of attack mach: Mach number Returns: StabilityDerivatives object """ # Calculate wing area and aspect ratio S = geometry.span_m * (geometry.chord_root_m + geometry.chord_tip_m) / 2 AR = geometry.span_m**2 / S # Get airfoil data airfoil_data = AIRFOIL_DATABASE.get( geometry.airfoil_root, AIRFOIL_DATABASE["NACA2412"] ) # 3D lift curve slope e = 0.85 # Oswald efficiency beta = math.sqrt(max(0.01, 1 - mach**2)) CL_alpha_2d = airfoil_data["cl_alpha"] CL_alpha = CL_alpha_2d / (1 + CL_alpha_2d / (math.pi * AR * e)) / beta # Pitching moment slope (simplified) # Typically negative for stable aircraft CM_alpha = -0.1 * CL_alpha # Rough approximation return StabilityDerivatives( CL_alpha=CL_alpha, CM_alpha=CM_alpha, CL_alpha_dot=None, # Would need unsteady analysis CM_alpha_dot=None, )
- Pydantic schema for output stability derivatives (CL_alpha, CM_alpha, etc.).class StabilityDerivatives(BaseModel): """Longitudinal stability derivatives.""" CL_alpha: float = Field(..., description="Lift curve slope (per radian)") CM_alpha: float = Field(..., description="Pitching moment curve slope") CL_alpha_dot: float | None = Field(None, description="CL due to alpha rate") CM_alpha_dot: float | None = Field(None, description="CM due to alpha rate")
- Pydantic schema for input wing geometry used in stability derivatives and other aero analyses.class WingGeometry(BaseModel): """Wing planform geometry definition.""" span_m: float = Field(..., gt=0, description="Wing span in meters") chord_root_m: float = Field(..., gt=0, description="Root chord in meters") chord_tip_m: float = Field(..., gt=0, description="Tip chord in meters") sweep_deg: float = Field( 0.0, ge=-45, le=45, description="Quarter-chord sweep in degrees" ) dihedral_deg: float = Field( 0.0, ge=-15, le=15, description="Dihedral angle in degrees" ) twist_deg: float = Field( 0.0, ge=-10, le=10, description="Geometric twist (tip relative to root)" ) airfoil_root: str = Field("NACA2412", description="Root airfoil name") airfoil_tip: str = Field("NACA2412", description="Tip airfoil name")