225 lines
7.2 KiB
Python
225 lines
7.2 KiB
Python
"""
|
|
Endpoints pour les calculs de proprietes thermodynamiques
|
|
"""
|
|
|
|
from fastapi import APIRouter, HTTPException, status
|
|
|
|
from app.models.properties import (
|
|
PropertyCalculationRequest,
|
|
PropertyCalculationResponse,
|
|
SaturationRequest,
|
|
SaturationResponse
|
|
)
|
|
from app.services.thermodynamics import get_thermodynamics_service
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post(
|
|
"/calculate",
|
|
response_model=PropertyCalculationResponse,
|
|
summary="Calculer les proprietes thermodynamiques",
|
|
description="Calcule les proprietes thermodynamiques d'un refrigerant selon differents parametres d'entree"
|
|
)
|
|
async def calculate_properties(request: PropertyCalculationRequest):
|
|
"""
|
|
Calcule les proprietes thermodynamiques d'un refrigerant.
|
|
|
|
Types de calcul disponibles:
|
|
- **px**: A partir de pression et qualite
|
|
- **pT**: A partir de pression et temperature
|
|
- **ph**: A partir de pression et enthalpie
|
|
- **Tx**: A partir de temperature et qualite
|
|
|
|
Args:
|
|
request: Parametres du calcul
|
|
|
|
Returns:
|
|
PropertyCalculationResponse: Proprietes calculees
|
|
|
|
Raises:
|
|
400: Parametres invalides
|
|
404: Refrigerant non trouve
|
|
500: Erreur de calcul
|
|
"""
|
|
try:
|
|
service = get_thermodynamics_service()
|
|
|
|
if request.calculation_type == "px":
|
|
if request.pressure is None or request.quality is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Pression et qualite requises pour le calcul px"
|
|
)
|
|
result = service.calculate_from_px(
|
|
request.refrigerant,
|
|
request.pressure,
|
|
request.quality
|
|
)
|
|
|
|
elif request.calculation_type == "pT":
|
|
if request.pressure is None or request.temperature is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Pression et temperature requises pour le calcul pT"
|
|
)
|
|
result = service.calculate_from_pT(
|
|
request.refrigerant,
|
|
request.pressure,
|
|
request.temperature
|
|
)
|
|
|
|
elif request.calculation_type == "ph":
|
|
if request.pressure is None or request.enthalpy is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Pression et enthalpie requises pour le calcul ph"
|
|
)
|
|
result = service.calculate_from_ph(
|
|
request.refrigerant,
|
|
request.pressure,
|
|
request.enthalpy
|
|
)
|
|
|
|
elif request.calculation_type == "Tx":
|
|
if request.temperature is None or request.quality is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail="Temperature et qualite requises pour le calcul Tx"
|
|
)
|
|
result = service.calculate_from_Tx(
|
|
request.refrigerant,
|
|
request.temperature,
|
|
request.quality
|
|
)
|
|
|
|
else:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=f"Type de calcul invalide: {request.calculation_type}"
|
|
)
|
|
|
|
return result
|
|
|
|
except HTTPException:
|
|
raise
|
|
except ValueError as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail=str(e)
|
|
)
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Erreur lors du calcul des proprietes: {str(e)}"
|
|
)
|
|
|
|
|
|
@router.post(
|
|
"/saturation",
|
|
response_model=SaturationResponse,
|
|
summary="Proprietes de saturation",
|
|
description="Obtient les proprietes de saturation (liquide et vapeur) a une pression donnee"
|
|
)
|
|
async def get_saturation_properties(request: SaturationRequest):
|
|
"""
|
|
Obtient les proprietes de saturation d'un refrigerant.
|
|
|
|
Retourne les proprietes du liquide sature et de la vapeur saturee
|
|
a la pression specifiee, ainsi que la temperature de saturation
|
|
et la chaleur latente de vaporisation.
|
|
|
|
Args:
|
|
request: Refrigerant et pression
|
|
|
|
Returns:
|
|
SaturationResponse: Proprietes de saturation
|
|
|
|
Raises:
|
|
404: Refrigerant non trouve
|
|
500: Erreur de calcul
|
|
"""
|
|
try:
|
|
service = get_thermodynamics_service()
|
|
result = service.get_saturation_properties(
|
|
request.refrigerant,
|
|
request.pressure
|
|
)
|
|
return result
|
|
|
|
except ValueError as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
detail=str(e)
|
|
)
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
detail=f"Erreur lors du calcul des proprietes de saturation: {str(e)}"
|
|
)
|
|
|
|
|
|
@router.get(
|
|
"/",
|
|
summary="Information sur les endpoints de proprietes",
|
|
description="Retourne la liste des endpoints disponibles pour les calculs de proprietes"
|
|
)
|
|
async def properties_info():
|
|
"""
|
|
Retourne les informations sur les endpoints disponibles.
|
|
|
|
Returns:
|
|
dict: Liste des endpoints et leurs descriptions
|
|
"""
|
|
return {
|
|
"endpoints": [
|
|
{
|
|
"path": "/api/v1/properties/calculate",
|
|
"method": "POST",
|
|
"description": "Calcule les proprietes thermodynamiques",
|
|
"calculation_types": [
|
|
{
|
|
"type": "px",
|
|
"description": "A partir de pression et qualite",
|
|
"required": ["pressure", "quality"]
|
|
},
|
|
{
|
|
"type": "pT",
|
|
"description": "A partir de pression et temperature",
|
|
"required": ["pressure", "temperature"]
|
|
},
|
|
{
|
|
"type": "ph",
|
|
"description": "A partir de pression et enthalpie",
|
|
"required": ["pressure", "enthalpy"]
|
|
},
|
|
{
|
|
"type": "Tx",
|
|
"description": "A partir de temperature et qualite",
|
|
"required": ["temperature", "quality"]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"path": "/api/v1/properties/saturation",
|
|
"method": "POST",
|
|
"description": "Obtient les proprietes de saturation",
|
|
"required": ["refrigerant", "pressure"]
|
|
}
|
|
],
|
|
"units": {
|
|
"pressure": "Pa (Pascal)",
|
|
"temperature": "K (Kelvin)",
|
|
"enthalpy": "J/kg",
|
|
"entropy": "J/kg.K",
|
|
"density": "kg/m3",
|
|
"quality": "0-1 (sans dimension)"
|
|
},
|
|
"example": {
|
|
"refrigerant": "R134a",
|
|
"calculation_type": "px",
|
|
"pressure": 500000,
|
|
"quality": 0.5
|
|
}
|
|
} |