From 3b9f366fde2608cc1bcf551f95abee523c85abcb Mon Sep 17 00:00:00 2001 From: Angran Li Date: Wed, 18 Jun 2025 03:13:40 +0000 Subject: [PATCH 1/2] Initial implementation --- .../component/simulation/outputs/outputs.py | 9 +- .../translator/solver_translator.py | 9 +- .../translator/user_expression_utils.py | 281 +++++++----------- .../user_code/variables/solution.py | 46 +-- 4 files changed, 138 insertions(+), 207 deletions(-) diff --git a/flow360/component/simulation/outputs/outputs.py b/flow360/component/simulation/outputs/outputs.py index aa4d0614d..14d9521f0 100644 --- a/flow360/component/simulation/outputs/outputs.py +++ b/flow360/component/simulation/outputs/outputs.py @@ -36,7 +36,7 @@ GhostSurface, Surface, ) -from flow360.component.simulation.unit_system import LengthType +from flow360.component.simulation.unit_system import LengthType, unit_system_manager from flow360.component.simulation.user_code.core.types import ( SolverVariable, UserVariable, @@ -129,8 +129,13 @@ def _convert_solver_variables_as_user_variables(cls, value): # Handle both dict/list (deserialization) and UniqueItemList (python object) def solver_variable_to_user_variable(item): if isinstance(item, SolverVariable): + if unit_system_manager.current is None: + raise ValueError( + f"Solver variable {item.name} cannot be used without a unit system." + ) + unit_system_name = unit_system_manager.current.name name = item.name.split(".")[-1] if "." in item.name else item.name - return UserVariable(name=name, value=item) + return UserVariable(name=f"{name}_{unit_system_name}", value=item) return item # If input is a dict (from deserialization so no SolverVariable expected) diff --git a/flow360/component/simulation/translator/solver_translator.py b/flow360/component/simulation/translator/solver_translator.py index e9723f62b..53327ecb1 100644 --- a/flow360/component/simulation/translator/solver_translator.py +++ b/flow360/component/simulation/translator/solver_translator.py @@ -580,14 +580,7 @@ def _prepare_prepending_code(expression: Expression): for name in expression.solver_variable_names(): if not udf_prepending_code.get(name): continue - if name.split(".")[-1] == variable.name: - # Avoid duplicate declaration if the intermediate variable name is - # the same as the solver_name. - prepending_code.append(udf_prepending_code[name]["computation"]) - continue - prepending_code.append( - udf_prepending_code[name]["declaration"] + udf_prepending_code[name]["computation"] - ) + prepending_code.append(udf_prepending_code[name]) prepending_code = "".join(prepending_code) return prepending_code diff --git a/flow360/component/simulation/translator/user_expression_utils.py b/flow360/component/simulation/translator/user_expression_utils.py index 04e5184d2..0c49e98b0 100644 --- a/flow360/component/simulation/translator/user_expression_utils.py +++ b/flow360/component/simulation/translator/user_expression_utils.py @@ -3,178 +3,111 @@ import numpy as np udf_prepending_code = { - "solution.Cp": { - "declaration": "double Cp;", - "computation": "Cp = (primitiveVars[4] - pressureFreestream) / (0.5 * MachRef * MachRef);", - }, - "solution.Cpt": { - "declaration": "double Cpt;", - "computation": "double MachTmp = sqrt(primitiveVars[1] * primitiveVars[1] + " - + "primitiveVars[2] * primitiveVars[2] + primitiveVars[3] * primitiveVars[3]) / " - + "sqrt(1.4 * primitiveVars[4] / primitiveVars[0]);" - + "Cpt = (1.4 * primitiveVars[4] * pow(1.0 + (1.4 - 1.0) / 2. * MachTmp * MachTmp," - + "1.4 / (1.4 - 1.0)) - pow(1.0 + (1.4 - 1.0) / 2. * MachRef * MachRef," - + "1.4 / (1.4 - 1.0))) / (0.5 * 1.4 * MachRef * MachRef);", - }, - "solution.grad_density": { - "declaration": "double gradDensity[3];", - "computation": " gradDensity[0] = gradPrimitive[0][0];" - + "gradDensity[1] = gradPrimitive[0][1];" - + "gradDensity[2] = gradPrimitive[0][2];", - }, - "solution.grad_u": { - "declaration": "double gradVelocityX[3];", - "computation": "gradVelocityX[0] = gradPrimitive[1][0] * velocityScale;" - + "gradVelocityX[1] = gradPrimitive[1][1] * velocityScale;" - + "gradVelocityX[2] = gradPrimitive[1][2] * velocityScale;", - }, - "solution.grad_v": { - "declaration": "double gradVelocityY[3];", - "computation": "gradVelocityY[0] = gradPrimitive[2][0] * velocityScale;" - + "gradVelocityY[1] = gradPrimitive[2][1] * velocityScale;" - + "gradVelocityY[2] = gradPrimitive[2][2] * velocityScale;", - }, - "solution.grad_w": { - "declaration": "double gradVelocityZ[3];", - "computation": "gradVelocityZ[0] = gradPrimitive[3][0] * velocityScale;" - + "gradVelocityZ[1] = gradPrimitive[3][1] * velocityScale;" - + "gradVelocityZ[2] = gradPrimitive[3][2] * velocityScale;", - }, - "solution.grad_pressure": { - "declaration": "double gradPressure[3];", - "computation": "gradPressure[0] = gradPrimitive[4][0]; " - + "gradPressure[1] = gradPrimitive[4][1]; " - + "gradPressure[2] = gradPrimitive[4][2];", - }, - "solution.Mach": { - "declaration": "double Mach;", - "computation": "Mach = usingLiquidAsMaterial ? 0 : " - + "sqrt(primitiveVars[1] * primitiveVars[1] + " - + "primitiveVars[2] * primitiveVars[2] + " - + "primitiveVars[3] * primitiveVars[3]) / " - + "sqrt(1.4 * primitiveVars[4] / primitiveVars[0]);", - }, - "solution.mut_ratio": { - "declaration": "double mutRatio;", - "computation": "mutRatio = mut / mu;", - }, - "solution.nu_hat": { - "declaration": "double nuHat;", - "computation": "nuHat = SpalartAllmaras_solution * velocityScale;", - }, - "solution.turbulence_kinetic_energy": { - "declaration": "double turbulenceKineticEnergy;", - "computation": "turbulenceKineticEnergy = kOmegaSST_solution[0] * pow(velocityScale, 2);", - }, - "solution.specific_rate_of_dissipation": { - "declaration": "double specificRateOfDissipation;", - "computation": "specificRateOfDissipation = kOmegaSST_solution[1] * velocityScale;", - }, - "solution.velocity": { - "declaration": "double velocity[3];", - "computation": "velocity[0] = primitiveVars[1] * velocityScale;" - + "velocity[1] = primitiveVars[2] * velocityScale;" - + "velocity[2] = primitiveVars[3] * velocityScale;", - }, - "solution.velocity_magnitude": { - "declaration": "double velocityMagnitude;", - "computation": "double velocityTmp[3];velocityTmp[0] = primitiveVars[1] * velocityScale;" - + "velocityTmp[1] = primitiveVars[2] * velocityScale;" - + "velocityTmp[2] = primitiveVars[3] * velocityScale;" - + "velocityMagnitude = magnitude(velocityTmp);", - }, - "solution.qcriterion": { - "declaration": "double qcriterion;", - "computation": "double ux = gradPrimitive[1][0];" - + "double uy = gradPrimitive[1][1];" - + "double uz = gradPrimitive[1][2];" - + "double vx = gradPrimitive[2][0];" - + "double vy = gradPrimitive[2][1];" - + "double vz = gradPrimitive[2][2];" - + "double wx = gradPrimitive[3][0];" - + "double wy = gradPrimitive[3][1];" - + "double wz = gradPrimitive[3][2];" - + "double str11 = ux;" - + "double str22 = vy;" - + "double str33 = wz;" - + "double str12 = 0.5 * (uy + vx);" - + "double str13 = 0.5 * (uz + wx);" - + "double str23 = 0.5 * (vz + wy);" - + "double str_norm = str11 * str11 + str22 * str22 + str33 * str33 + " - + "2 * (str12 * str12) + 2 * (str13 * str13) + 2 * (str23 * str23);" - + "double omg12 = 0.5 * (uy - vx);" - + "double omg13 = 0.5 * (uz - wx);" - + "double omg23 = 0.5 * (vz - wy);" - + "double omg_norm = 2 * (omg12 * omg12) + 2 * (omg13 * omg13) + 2 * (omg23 * omg23);" - + "qcriterion = 0.5 * (omg_norm - str_norm) * (velocityScale * velocityScale);", - }, - "solution.entropy": { - "declaration": "double entropy;", - "computation": "entropy = log(primitiveVars[4] / (1.0 / 1.4) / pow(primitiveVars[0], 1.4));", - }, - "solution.temperature": { - "declaration": "double temperature;", - "computation": f"double epsilon = {np.finfo(np.float64).eps};" - "temperature = (primitiveVars[0] < epsilon && HeatEquation_solution != nullptr) ? " - "HeatEquation_solution[0] : primitiveVars[4] / (primitiveVars[0] * (1.0 / 1.4));", - }, - "solution.vorticity": { - "declaration": "double vorticity[3];", - "computation": "vorticity[0] = (gradPrimitive[3][1] - gradPrimitive[2][2]) * velocityScale;" - + "vorticity[1] = (gradPrimitive[1][2] - gradPrimitive[3][0]) * velocityScale;" - + "vorticity[2] = (gradPrimitive[2][0] - gradPrimitive[1][1]) * velocityScale;", - }, - "solution.vorticity_magnitude": { - "declaration": "double vorticityMagnitude;", - "computation": "double vorticityTmp[3];" - + "vorticityTmp[0] = (gradPrimitive[3][1] - gradPrimitive[2][2]) * velocityScale;" - + "vorticityTmp[1] = (gradPrimitive[1][2] - gradPrimitive[3][0]) * velocityScale;" - + "vorticityTmp[2] = (gradPrimitive[2][0] - gradPrimitive[1][1]) * velocityScale;" - + "vorticityMagnitude = magnitude(vorticityTmp);", - }, - "solution.CfVec": { - "declaration": "double CfVec[3];", - "computation": "for (int i = 0; i < 3; i++)" - + "{CfVec[i] = wallShearStress[i] / (0.5 * MachRef * MachRef);}", - }, - "solution.Cf": { - "declaration": "double Cf;", - "computation": "Cf = magnitude(wallShearStress) / (0.5 * MachRef * MachRef);", - }, - "solution.node_forces_per_unit_area": { - "declaration": "double nodeForcesPerUnitArea[3];", - "computation": "double normalMag = magnitude(nodeNormals);" - + "for (int i = 0; i < 3; i++){nodeForcesPerUnitArea[i] = " - + "((primitiveVars[4] - pressureFreestream) * nodeNormals[i] / normalMag + wallViscousStress[i])" - + " * (velocityScale * velocityScale);}", - }, - "solution.heat_transfer_coefficient_static_temperature": { - "declaration": "double heatTransferCoefficientStaticTemperature;", - "computation": "double temperatureTmp = " - + "primitiveVars[4] / (primitiveVars[0] * 1.0 / 1.4);" - + f"double epsilon = {np.finfo(np.float64).eps};" - + "double temperatureSafeDivide = (temperatureTmp - 1.0 < 0) ? " - + "temperatureTmp - 1.0 - epsilon : " - + "temperatureTmp - 1.0 + epsilon;" - + "heatTransferCoefficientStaticTemperature = " - + "abs(temperatureTmp - 1.0) > epsilon ? " - + "- wallHeatFlux / temperatureSafeDivide : 1.0 / epsilon;", - }, - "solution.heat_transfer_coefficient_total_temperature": { - "declaration": "double heatTransferCoefficientTotalTemperature;", - "computation": "double temperatureTmp = " - + "primitiveVars[4] / (primitiveVars[0] * 1.0 / 1.4);" - + "double temperatureTotal = 1.0 + (1.4 - 1.0) / 2.0 * MachRef * MachRef;" - + f"double epsilon = {np.finfo(np.float64).eps};" - + "double temperatureSafeDivide = (temperatureTmp - temperatureTotal < 0) ? " - + "temperatureTmp - temperatureTotal - epsilon : " - + "temperatureTmp - temperatureTotal + epsilon;" - + "double heatTransferCoefficientTotalTemperature = " - + "abs(temperatureTmp - temperatureTotal) > epsilon ? " - + "temperatureTotal = - wallHeatFlux / temperatureSafeDivide : 1.0 / epsilon;", - }, - "solution.wall_shear_stress_magnitude": { - "declaration": "double wallShearStressMagnitude;", - "computation": "wallShearStressMagnitude = magnitude(wallShearStress);", - }, + "solution.Cp": "double ___Cp = (primitiveVars[4] - pressureFreestream) / (0.5 * MachRef * MachRef);", + "solution.Cpt": "double ___MachTmp = sqrt(primitiveVars[1] * primitiveVars[1] + " + + "primitiveVars[2] * primitiveVars[2] + primitiveVars[3] * primitiveVars[3]) / " + + "sqrt(1.4 * primitiveVars[4] / primitiveVars[0]);" + + "double ___Cpt = (1.4 * primitiveVars[4] * pow(1.0 + (1.4 - 1.0) / 2. * ___MachTmp * ___MachTmp," + + "1.4 / (1.4 - 1.0)) - pow(1.0 + (1.4 - 1.0) / 2. * MachRef * MachRef," + + "1.4 / (1.4 - 1.0))) / (0.5 * 1.4 * MachRef * MachRef);", + "solution.grad_density": "double ___grad_density[3]; ___grad_density[0] = gradPrimitive[0][0];" + + "___grad_density[1] = gradPrimitive[0][1];" + + "___grad_density[2] = gradPrimitive[0][2];", + "solution.grad_u": "double ___grad_u[3];" + + "___grad_u[0] = gradPrimitive[1][0] * velocityScale;" + + "___grad_u[1] = gradPrimitive[1][1] * velocityScale;" + + "___grad_u[2] = gradPrimitive[1][2] * velocityScale;", + "solution.grad_v": "double ___grad_v[3];" + + "___grad_v[0] = gradPrimitive[2][0] * velocityScale;" + + "___grad_v[1] = gradPrimitive[2][1] * velocityScale;" + + "___grad_v[2] = gradPrimitive[2][2] * velocityScale;", + "solution.grad_w": "double ___grad_w[3];" + + "___grad_w[0] = gradPrimitive[3][0] * velocityScale;" + + "___grad_w[1] = gradPrimitive[3][1] * velocityScale;" + + "___grad_w[2] = gradPrimitive[3][2] * velocityScale;", + "solution.grad_pressure": "double ___grad_pressure[3];" + + "___grad_pressure[0] = gradPrimitive[4][0];" + + "___grad_pressure[1] = gradPrimitive[4][1];" + + "___grad_pressure[2] = gradPrimitive[4][2];", + "solution.Mach": "double ___Mach;" + + "___Mach = usingLiquidAsMaterial ? 0 : " + + "sqrt(primitiveVars[1] * primitiveVars[1] + " + + "primitiveVars[2] * primitiveVars[2] + " + + "primitiveVars[3] * primitiveVars[3]) / " + + "sqrt(1.4 * primitiveVars[4] / primitiveVars[0]);", + "solution.mut_ratio": "double ___mut_ratio; ___mut_ratio = mut / mu;", + "solution.nu_hat": "double ___nu_hat;___nu_hat = solutionTurbulence * velocityScale;", + "solution.turbulence_kinetic_energy": "double ___turbulence_kinetic_energy;" + "___turbulence_kinetic_energy = solutionTurbulence[0] * pow(velocityScale, 2);", + "solution.specific_rate_of_dissipation": "double ___specific_rate_of_dissipation;" + + "___specific_rate_of_dissipation = solutionTurbulence[1] * velocityScale;", + "solution.velocity": "double ___velocity[3];" + + "___velocity[0] = primitiveVars[1] * velocityScale;" + + "___velocity[1] = primitiveVars[2] * velocityScale;" + + "___velocity[2] = primitiveVars[3] * velocityScale;", + "solution.qcriterion": "double ___qcriterion;" + + "double ___ux = gradPrimitive[1][0];" + + "double ___uy = gradPrimitive[1][1];" + + "double ___uz = gradPrimitive[1][2];" + + "double ___vx = gradPrimitive[2][0];" + + "double ___vy = gradPrimitive[2][1];" + + "double ___vz = gradPrimitive[2][2];" + + "double ___wx = gradPrimitive[3][0];" + + "double ___wy = gradPrimitive[3][1];" + + "double ___wz = gradPrimitive[3][2];" + + "double ___str11 = ___ux;" + + "double ___str22 = ___vy;" + + "double ___str33 = ___wz;" + + "double ___str12 = 0.5 * (___uy + ___vx);" + + "double ___str13 = 0.5 * (___uz + ___wx);" + + "double ___str23 = 0.5 * (___vz + ___wy);" + + "double ___str_norm = ___str11 * ___str11 + ___str22 * ___str22 + ___str33 * ___str33 + " + + "2 * (___str12 * ___str12) + 2 * (___str13 * ___str13) + 2 * (___str23 * ___str23);" + + "double ___omg12 = 0.5 * (___uy - ___vx);" + + "double ___omg13 = 0.5 * (___uz - ___wx);" + + "double ___omg23 = 0.5 * (___vz - ___wy);" + + "double ___omg_norm = 2 * (___omg12 * ___omg12) + 2 * (___omg13 * ___omg13) + 2 * (___omg23 * ___omg23);" + + "___qcriterion = 0.5 * (___omg_norm - ___str_norm) * (velocityScale * velocityScale);", + "solution.entropy": "double ___entropy;" + + "___entropy = log(primitiveVars[4] / (1.0 / 1.4) / pow(primitiveVars[0], 1.4));", + "solution.temperature": "double ___temperature;" + + f"double ___epsilon = {np.finfo(np.float64).eps};" + "___temperature = (primitiveVars[0] < ___epsilon && HeatEquation_solution != nullptr) ? " + "HeatEquation_solution[0] : primitiveVars[4] / (primitiveVars[0] * (1.0 / 1.4));", + "solution.vorticity": "double ___vorticity[3];" + + "___vorticity[0] = (gradPrimitive[3][1] - gradPrimitive[2][2]) * velocityScale;" + + "___vorticity[1] = (gradPrimitive[1][2] - gradPrimitive[3][0]) * velocityScale;" + + "___vorticity[2] = (gradPrimitive[2][0] - gradPrimitive[1][1]) * velocityScale;", + "solution.CfVec": "double ___CfVec[3]; for (int i = 0; i < 3; i++)" + + "{___CfVec[i] = wallShearStress[i] / (0.5 * MachRef * MachRef);}", + "solution.Cf": "double ___Cf;" + + "___Cf = magnitude(wallShearStress) / (0.5 * MachRef * MachRef);", + "solution.node_forces_per_unit_area": "double ___node_forces_per_unit_area[3];" + + "double ___normalMag = magnitude(nodeNormals);" + + "for (int i = 0; i < 3; i++){___node_forces_per_unit_area[i] = " + + "((primitiveVars[4] - pressureFreestream) * nodeNormals[i] / ___normalMag + wallViscousStress[i])" + + " * (velocityScale * velocityScale);}", + "solution.heat_transfer_coefficient_static_temperature": "double ___heat_transfer_coefficient_static_temperature;" + + "double ___temperatureTmp = " + + "primitiveVars[4] / (primitiveVars[0] * 1.0 / 1.4);" + + f"double ___epsilon = {np.finfo(np.float64).eps};" + + "double ___temperatureSafeDivide = (___temperatureTmp - 1.0 < 0) ? " + + "___temperatureTmp - 1.0 - ___epsilon : " + + "___temperatureTmp - 1.0 + ___epsilon;" + + "___heat_transfer_coefficient_static_temperature = " + + "abs(___temperatureTmp - 1.0) > ___epsilon ? " + + "- wallHeatFlux / ___temperatureSafeDivide : 1.0 / ___epsilon;", + "solution.heat_transfer_coefficient_total_temperature": "double ___heat_transfer_coefficient_total_temperature;" + + "double ___temperatureTmp = " + + "primitiveVars[4] / (primitiveVars[0] * 1.0 / 1.4);" + + "double ___temperatureTotal = 1.0 + (1.4 - 1.0) / 2.0 * MachRef * MachRef;" + + f"double ___epsilon = {np.finfo(np.float64).eps};" + + "double ___temperatureSafeDivide = (___temperatureTmp - ___temperatureTotal < 0) ? " + + "___temperatureTmp - ___temperatureTotal - ___epsilon : " + + "___temperatureTmp - ___temperatureTotal + ___epsilon;" + + "double ___heat_transfer_coefficient_total_temperature = " + + "abs(___temperatureTmp - ___temperatureTotal) > ___epsilon ? " + + "___temperatureTotal = - wallHeatFlux / ___temperatureSafeDivide : 1.0 / ___epsilon;", + "solution.wall_shear_stress_magnitude": "double ___wall_shear_stress_magnitude;" + + "___wall_shear_stress_magnitude = magnitude(wallShearStress);", } diff --git a/flow360/component/simulation/user_code/variables/solution.py b/flow360/component/simulation/user_code/variables/solution.py index 86f9e69b8..9ca910689 100644 --- a/flow360/component/simulation/user_code/variables/solution.py +++ b/flow360/component/simulation/user_code/variables/solution.py @@ -35,50 +35,50 @@ Cp = SolverVariable( name="solution.Cp", value=float("NaN"), - solver_name="Cp", + solver_name="___Cp", variable_type="Volume", ) Cpt = SolverVariable( name="solution.Cpt", value=float("NaN"), - solver_name="Cpt", + solver_name="___Cpt", variable_type="Volume", ) grad_density = SolverVariable( name="solution.grad_density", value=[float("NaN"), float("NaN"), float("NaN")] * u.kg / u.m**4, - solver_name="gradDensity", + solver_name="___grad_density", variable_type="Volume", ) grad_u = SolverVariable( name="solution.grad_u", value=[float("NaN"), float("NaN"), float("NaN")] / u.s, - solver_name="gradVelocityX", + solver_name="___grad_u", variable_type="Volume", ) grad_v = SolverVariable( name="solution.grad_v", value=[float("NaN"), float("NaN"), float("NaN")] / u.s, - solver_name="gradVelocityY", + solver_name="___grad_v", variable_type="Volume", ) grad_w = SolverVariable( name="solution.grad_w", value=[float("NaN"), float("NaN"), float("NaN")] / u.s, - solver_name="gradVelocityZ", + solver_name="___grad_w", variable_type="Volume", ) grad_pressure = SolverVariable( name="solution.grad_pressure", value=[float("NaN"), float("NaN"), float("NaN")] * u.Pa / u.m, - solver_name="gradPressure", + solver_name="___grad_pressure", variable_type="Volume", ) Mach = SolverVariable( name="solution.Mach", value=float("NaN"), - solver_name="Mach", + solver_name="___Mach", variable_type="Volume", ) mut = SolverVariable( @@ -90,25 +90,25 @@ mut_ratio = SolverVariable( name="solution.mut_ratio", value=float("NaN"), - solver_name="mutRatio", + solver_name="___mut_ratio", variable_type="Volume", ) nu_hat = SolverVariable( name="solution.nu_hat", value=float("NaN") * u.m**2 / u.s, - solver_name="nuHat", + solver_name="___nu_hat", variable_type="Volume", ) turbulence_kinetic_energy = SolverVariable( name="solution.turbulence_kinetic_energy", value=float("NaN") * u.J / u.kg, - solver_name="turbulenceKineticEnergy", + solver_name="___turbulence_kinetic_energy", variable_type="Volume", ) # k specific_rate_of_dissipation = SolverVariable( name="solution.specific_rate_of_dissipation", value=float("NaN") / u.s, - solver_name="specificRateOfDissipation", + solver_name="___specific_rate_of_dissipation", variable_type="Volume", ) # Omega amplification_factor = SolverVariable( @@ -134,7 +134,7 @@ velocity = SolverVariable( name="solution.velocity", value=[float("NaN"), float("NaN"), float("NaN")] * u.m / u.s, - solver_name="velocity", + solver_name="___velocity", variable_type="Volume", ) pressure = SolverVariable( @@ -147,25 +147,25 @@ qcriterion = SolverVariable( name="solution.qcriterion", value=float("NaN") / u.s**2, - solver_name="qcriterion", + solver_name="___qcriterion", variable_type="Volume", ) entropy = SolverVariable( name="solution.entropy", value=float("NaN") * u.J / u.K, - solver_name="entropy", + solver_name="___entropy", variable_type="Volume", ) temperature = SolverVariable( name="solution.temperature", value=float("NaN") * u.K, - solver_name="temperature", + solver_name="___temperature", variable_type="Volume", ) vorticity = SolverVariable( name="solution.vorticity", value=[float("NaN"), float("NaN"), float("NaN")] / u.s, - solver_name="vorticity", + solver_name="___vorticity", variable_type="Volume", ) wall_distance = SolverVariable( @@ -179,13 +179,13 @@ CfVec = SolverVariable( name="solution.CfVec", value=[float("NaN"), float("NaN"), float("NaN")], - solver_name="CfVec", + solver_name="___CfVec", variable_type="Surface", ) Cf = SolverVariable( name="solution.Cf", value=float("NaN"), - solver_name="Cf", + solver_name="___Cf", variable_type="Surface", ) heatflux = SolverVariable( @@ -203,7 +203,7 @@ node_forces_per_unit_area = SolverVariable( name="solution.node_forces_per_unit_area", value=[float("NaN"), float("NaN"), float("NaN")] * u.Pa, - solver_name="nodeForcesPerUnitArea", + solver_name="___node_forces_per_unit_area", variable_type="Surface", ) y_plus = SolverVariable( @@ -212,19 +212,19 @@ wall_shear_stress_magnitude = SolverVariable( name="solution.wall_shear_stress_magnitude", value=float("NaN") * u.Pa, - solver_name="wallShearStressMagnitude", + solver_name="___wall_shear_stress_magnitude", variable_type="Surface", ) heat_transfer_coefficient_static_temperature = SolverVariable( name="solution.heat_transfer_coefficient_static_temperature", value=float("NaN") * u.W / (u.m**2 * u.K), - solver_name="heatTransferCoefficientStaticTemperature", + solver_name="___heat_transfer_coefficient_static_temperature", variable_type="Surface", ) heat_transfer_coefficient_total_temperature = SolverVariable( name="solution.heat_transfer_coefficient_total_temperature", value=float("NaN") * u.W / (u.m**2 * u.K), - solver_name="heatTransferCoefficientTotalTemperature", + solver_name="___heat_transfer_coefficient_total_temperature", variable_type="Surface", ) From 39830286d426193ee681d0297eec50268c177f1f Mon Sep 17 00:00:00 2001 From: Angran Li Date: Wed, 18 Jun 2025 03:13:55 +0000 Subject: [PATCH 2/2] Fix unit test --- tests/simulation/test_expressions.py | 4 ++-- .../translator/ref/Flow360_expression_udf.json | 14 +++++++------- .../translator/ref/Flow360_user_variable.json | 16 ++++++++-------- .../translator/test_output_translation.py | 2 +- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/simulation/test_expressions.py b/tests/simulation/test_expressions.py index 1a9fd2d11..3252d8b98 100644 --- a/tests/simulation/test_expressions.py +++ b/tests/simulation/test_expressions.py @@ -1055,7 +1055,7 @@ def test_udf_generator(): # velocity scale = 100 m/s, assert ( result.expression - == "double velocity[3];velocity[0] = primitiveVars[1] * velocityScale;velocity[1] = primitiveVars[2] * velocityScale;velocity[2] = primitiveVars[3] * velocityScale;velocity_in_SI[0] = (velocity[0] * 100.0); velocity_in_SI[1] = (velocity[1] * 100.0); velocity_in_SI[2] = (velocity[2] * 100.0);" + == "double ___velocity[3];___velocity[0] = primitiveVars[1] * velocityScale;___velocity[1] = primitiveVars[2] * velocityScale;___velocity[2] = primitiveVars[3] * velocityScale;velocity_in_SI[0] = (___velocity[0] * 100.0); velocity_in_SI[1] = (___velocity[1] * 100.0); velocity_in_SI[2] = (___velocity[2] * 100.0);" ) vel_cross_vec = UserVariable( @@ -1064,7 +1064,7 @@ def test_udf_generator(): result = user_variable_to_udf(vel_cross_vec, input_params=params) assert ( result.expression - == "double velocity[3];velocity[0] = primitiveVars[1] * velocityScale;velocity[1] = primitiveVars[2] * velocityScale;velocity[2] = primitiveVars[3] * velocityScale;vel_cross_vec[0] = ((((velocity[1] * 3) * 0.001) - ((velocity[2] * 2) * 0.001)) * 10.0); vel_cross_vec[1] = ((((velocity[2] * 1) * 0.001) - ((velocity[0] * 3) * 0.001)) * 10.0); vel_cross_vec[2] = ((((velocity[0] * 2) * 0.001) - ((velocity[1] * 1) * 0.001)) * 10.0);" + == "double ___velocity[3];___velocity[0] = primitiveVars[1] * velocityScale;___velocity[1] = primitiveVars[2] * velocityScale;___velocity[2] = primitiveVars[3] * velocityScale;vel_cross_vec[0] = ((((___velocity[1] * 3) * 0.001) - ((___velocity[2] * 2) * 0.001)) * 10.0); vel_cross_vec[1] = ((((___velocity[2] * 1) * 0.001) - ((___velocity[0] * 3) * 0.001)) * 10.0); vel_cross_vec[2] = ((((___velocity[0] * 2) * 0.001) - ((___velocity[1] * 1) * 0.001)) * 10.0);" ) vel_cross_vec = UserVariable( diff --git a/tests/simulation/translator/ref/Flow360_expression_udf.json b/tests/simulation/translator/ref/Flow360_expression_udf.json index 884469911..32d8355cc 100644 --- a/tests/simulation/translator/ref/Flow360_expression_udf.json +++ b/tests/simulation/translator/ref/Flow360_expression_udf.json @@ -80,8 +80,8 @@ "boundaries": {}, "volumeOutput": { "outputFields": [ - "Mach", - "velocity", + "Mach_SI", + "velocity_SI", "uuu" ], "outputFormat": "paraview", @@ -94,16 +94,16 @@ }, "userDefinedFields": [ { - "name": "Mach", - "expression": "Mach = usingLiquidAsMaterial ? 0 : sqrt(primitiveVars[1] * primitiveVars[1] + primitiveVars[2] * primitiveVars[2] + primitiveVars[3] * primitiveVars[3]) / sqrt(1.4 * primitiveVars[4] / primitiveVars[0]);Mach = (Mach * 1);" + "name": "Mach_SI", + "expression": "double ___Mach;___Mach = usingLiquidAsMaterial ? 0 : sqrt(primitiveVars[1] * primitiveVars[1] + primitiveVars[2] * primitiveVars[2] + primitiveVars[3] * primitiveVars[3]) / sqrt(1.4 * primitiveVars[4] / primitiveVars[0]);Mach_SI = (___Mach * 1);" }, { - "name": "velocity", - "expression": "velocity[0] = primitiveVars[1] * velocityScale;velocity[1] = primitiveVars[2] * velocityScale;velocity[2] = primitiveVars[3] * velocityScale;velocity[0] = (velocity[0] * 340.2940058082124); velocity[1] = (velocity[1] * 340.2940058082124); velocity[2] = (velocity[2] * 340.2940058082124);" + "name": "velocity_SI", + "expression": "double ___velocity[3];___velocity[0] = primitiveVars[1] * velocityScale;___velocity[1] = primitiveVars[2] * velocityScale;___velocity[2] = primitiveVars[3] * velocityScale;velocity_SI[0] = (___velocity[0] * 340.2940058082124); velocity_SI[1] = (___velocity[1] * 340.2940058082124); velocity_SI[2] = (___velocity[2] * 340.2940058082124);" }, { "name": "uuu", - "expression": "double velocity[3];velocity[0] = primitiveVars[1] * velocityScale;velocity[1] = primitiveVars[2] * velocityScale;velocity[2] = primitiveVars[3] * velocityScale;uuu[0] = (velocity[0] * 340.2940058082124); uuu[1] = (velocity[1] * 340.2940058082124); uuu[2] = (velocity[2] * 340.2940058082124);" + "expression": "double ___velocity[3];___velocity[0] = primitiveVars[1] * velocityScale;___velocity[1] = primitiveVars[2] * velocityScale;___velocity[2] = primitiveVars[3] * velocityScale;uuu[0] = (___velocity[0] * 340.2940058082124); uuu[1] = (___velocity[1] * 340.2940058082124); uuu[2] = (___velocity[2] * 340.2940058082124);" } ], "usingLiquidAsMaterial": false, diff --git a/tests/simulation/translator/ref/Flow360_user_variable.json b/tests/simulation/translator/ref/Flow360_user_variable.json index 52980cbd9..da8ecfe89 100644 --- a/tests/simulation/translator/ref/Flow360_user_variable.json +++ b/tests/simulation/translator/ref/Flow360_user_variable.json @@ -97,19 +97,19 @@ "name": "velocity_magnitude" }, { - "expression": "Mach = usingLiquidAsMaterial ? 0 : sqrt(primitiveVars[1] * primitiveVars[1] + primitiveVars[2] * primitiveVars[2] + primitiveVars[3] * primitiveVars[3]) / sqrt(1.4 * primitiveVars[4] / primitiveVars[0]);Mach = (Mach * 1);", - "name": "Mach" + "expression": "double ___Mach;___Mach = usingLiquidAsMaterial ? 0 : sqrt(primitiveVars[1] * primitiveVars[1] + primitiveVars[2] * primitiveVars[2] + primitiveVars[3] * primitiveVars[3]) / sqrt(1.4 * primitiveVars[4] / primitiveVars[0]);Mach_SI = (___Mach * 1);", + "name": "Mach_SI" }, { - "expression": "velocity[0] = primitiveVars[1] * velocityScale;velocity[1] = primitiveVars[2] * velocityScale;velocity[2] = primitiveVars[3] * velocityScale;velocity[0] = (velocity[0] * 200.0); velocity[1] = (velocity[1] * 200.0); velocity[2] = (velocity[2] * 200.0);", - "name": "velocity" + "expression": "double ___velocity[3];___velocity[0] = primitiveVars[1] * velocityScale;___velocity[1] = primitiveVars[2] * velocityScale;___velocity[2] = primitiveVars[3] * velocityScale;velocity_SI[0] = (___velocity[0] * 200.0); velocity_SI[1] = (___velocity[1] * 200.0); velocity_SI[2] = (___velocity[2] * 200.0);", + "name": "velocity_SI" }, { - "expression": "double velocity[3];velocity[0] = primitiveVars[1] * velocityScale;velocity[1] = primitiveVars[2] * velocityScale;velocity[2] = primitiveVars[3] * velocityScale;uuu[0] = (velocity[0] * 0.0002); uuu[1] = (velocity[1] * 0.0002); uuu[2] = (velocity[2] * 0.0002);", + "expression": "double ___velocity[3];___velocity[0] = primitiveVars[1] * velocityScale;___velocity[1] = primitiveVars[2] * velocityScale;___velocity[2] = primitiveVars[3] * velocityScale;uuu[0] = (___velocity[0] * 0.0002); uuu[1] = (___velocity[1] * 0.0002); uuu[2] = (___velocity[2] * 0.0002);", "name": "uuu" }, { - "expression": "double velocity[3];velocity[0] = primitiveVars[1] * velocityScale;velocity[1] = primitiveVars[2] * velocityScale;velocity[2] = primitiveVars[3] * velocityScale;my_var[0] = (((((2.0 * 1.0) / 200.0) * velocity[2]) - (((3.0 * 1.0) / 200.0) * velocity[1])) * 40000.0); my_var[1] = (((((3.0 * 1.0) / 200.0) * velocity[0]) - (((1.0 * 1.0) / 200.0) * velocity[2])) * 40000.0); my_var[2] = (((((1.0 * 1.0) / 200.0) * velocity[1]) - (((2.0 * 1.0) / 200.0) * velocity[0])) * 40000.0);", + "expression": "double ___velocity[3];___velocity[0] = primitiveVars[1] * velocityScale;___velocity[1] = primitiveVars[2] * velocityScale;___velocity[2] = primitiveVars[3] * velocityScale;my_var[0] = (((((2.0 * 1.0) / 200.0) * ___velocity[2]) - (((3.0 * 1.0) / 200.0) * ___velocity[1])) * 40000.0); my_var[1] = (((((3.0 * 1.0) / 200.0) * ___velocity[0]) - (((1.0 * 1.0) / 200.0) * ___velocity[2])) * 40000.0); my_var[2] = (((((1.0 * 1.0) / 200.0) * ___velocity[1]) - (((2.0 * 1.0) / 200.0) * ___velocity[0])) * 40000.0);", "name": "my_var" } ], @@ -121,8 +121,8 @@ "animationFrequencyTimeAverageOffset": 0, "computeTimeAverages": false, "outputFields": [ - "Mach", - "velocity", + "Mach_SI", + "velocity_SI", "uuu", "my_var" ], diff --git a/tests/simulation/translator/test_output_translation.py b/tests/simulation/translator/test_output_translation.py index 8f69bb811..3918e6d8e 100644 --- a/tests/simulation/translator/test_output_translation.py +++ b/tests/simulation/translator/test_output_translation.py @@ -1254,7 +1254,7 @@ def test_dimensioned_output_fields_translation(vel_in_km_per_hr): }, { "name": "velocity_in_km_per_hr", - "expression": "double velocity[3];velocity[0] = primitiveVars[1] * velocityScale;velocity[1] = primitiveVars[2] * velocityScale;velocity[2] = primitiveVars[3] * velocityScale;velocity_in_km_per_hr[0] = (velocity[0] * 3600.0); velocity_in_km_per_hr[1] = (velocity[1] * 3600.0); velocity_in_km_per_hr[2] = (velocity[2] * 3600.0);", + "expression": "double ___velocity[3];___velocity[0] = primitiveVars[1] * velocityScale;___velocity[1] = primitiveVars[2] * velocityScale;___velocity[2] = primitiveVars[3] * velocityScale;velocity_in_km_per_hr[0] = (___velocity[0] * 3600.0); velocity_in_km_per_hr[1] = (___velocity[1] * 3600.0); velocity_in_km_per_hr[2] = (___velocity[2] * 3600.0);", }, { "name": "velocity_m_per_s",