diff --git a/flow360/component/simulation/user_code/core/types.py b/flow360/component/simulation/user_code/core/types.py index 4ceb96017..3eacd96bb 100644 --- a/flow360/component/simulation/user_code/core/types.py +++ b/flow360/component/simulation/user_code/core/types.py @@ -828,7 +828,9 @@ def _serializer(value, info) -> dict: pass if isinstance(evaluated, Number): - serialized.evaluated_value = evaluated + serialized.evaluated_value = ( + evaluated if not np.isnan(evaluated) else None # NaN-None handling + ) elif isinstance(evaluated, unyt_array): if evaluated.size == 1: serialized.evaluated_value = ( @@ -845,6 +847,8 @@ def _serializer(value, info) -> dict: serialized.evaluated_units = str(evaluated.units.expr) else: serialized = SerializedValueOrExpression(type_name="number") + # Note: NaN handling should be unnecessary since it would + # have end up being expression first so not reaching here. if isinstance(value, (Number, List)): serialized.value = value elif isinstance(value, unyt_array): diff --git a/tests/simulation/test_expressions.py b/tests/simulation/test_expressions.py index 865c3b3df..1a9fd2d11 100644 --- a/tests/simulation/test_expressions.py +++ b/tests/simulation/test_expressions.py @@ -1,6 +1,6 @@ import json import re -from typing import Annotated +from typing import Annotated, Optional import numpy as np import pydantic as pd @@ -433,17 +433,21 @@ def test_serializer( ): class TestModel(Flow360BaseModel): field: ValueOrExpression[VelocityType] = pd.Field() + non_dim_field: Optional[ValueOrExpression[float]] = pd.Field(default=None) x = UserVariable(name="x", value=4) + cp = UserVariable(name="my_cp", value=solution.Cp) - model = TestModel(field=x * u.m / u.s + 4 * x**2 * u.m / u.s) + model = TestModel(field=x * u.m / u.s + 4 * x**2 * u.m / u.s, non_dim_field=cp) assert str(model.field) == "x * u.m / u.s + 4 * x ** 2 * u.m / u.s" - serialized = model.model_dump(exclude_none=True) + serialized = model.model_dump() assert serialized["field"]["type_name"] == "expression" assert serialized["field"]["expression"] == "x * u.m / u.s + 4 * x ** 2 * u.m / u.s" + assert serialized["non_dim_field"]["expression"] == "my_cp" + assert serialized["non_dim_field"]["evaluated_value"] == None # Not NaN anymore model = TestModel(field=4 * u.m / u.s)