Spaces:
Sleeping
Sleeping
File size: 3,413 Bytes
0835c28 72ce0ab 0835c28 72ce0ab ef04811 72ce0ab 3bffa8c 72ce0ab 3bffa8c 72ce0ab | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | import json
import math
import shutil
from pathlib import Path
import bpy
import numpy as np
from sympy import nsolve, solve
from sympy.abc import x
from app.api_models import Predict2dInput
def particle_size_from_re(re: float, u: float, nu: float) -> list:
return nsolve(((u * x) / nu - re), x, 0)
def eps_from_d(dp: float, k: float) -> list:
return solve((dp ** 2 * x ** 3) / (180 * (1 - x) ** 2) - k, x)
def f_from_eps(eps: float) -> float:
return 1.8 / math.sqrt(180 * eps ** 5) * eps
def get_f_from_d(d: float, u: float, re: float) -> float:
nu = 1489.4e-6
k = 1 / d
dp = particle_size_from_re(re, u, nu)
eps = eps_from_d(dp, k)[0].n(chop=True)
return float(f_from_eps(eps) / math.sqrt(k))
def copy_config_with_boundary_conditions(config_path: Path, data_path: Path, input_data: Predict2dInput):
with open(config_path, 'r') as file:
config = json.load(file)
config["cfd params"]["coeffs"][0]["d"] = [input_data.d, input_data.d, 0]
config["cfd params"]["inlet"] = [input_data.inlet_u]
config["cfd params"]["angle"] = [input_data.inlet_angle, input_data.inlet_angle, 0]
re = 0.8 if "pipn" in input_data.model else 13.428
f = get_f_from_d(input_data.d, 0.2, re)
config["cfd params"]["coeffs"][0]["f"] = [f, f, 0]
with open(data_path / "config.json", 'w') as f:
f.write(json.dumps(config))
def create_session_folders(assets_dir: str, session_dir: str, predict_input: Predict2dInput):
assets_dir = Path(assets_dir)
session_dir = Path(session_dir)
session_dir.mkdir(parents=True, exist_ok=True)
shutil.copytree(assets_dir / "openfoam-case-template", session_dir / "assets" / "openfoam-case-template")
split_dir = session_dir / "assets" / "meshes" / "split"
split_dir.mkdir(exist_ok=True, parents=True)
shutil.copy(assets_dir / "transforms.json", split_dir)
data_dir = session_dir / "data"
data_dir.mkdir(parents=True, exist_ok=True)
model_dir = "pipn" if "pipn" in predict_input.model else "pi-gano"
shutil.copy(assets_dir / model_dir / "data_config.json", session_dir / "assets")
copy_config_with_boundary_conditions(assets_dir / "config.json",
session_dir / "assets" / "meshes" / "split",
predict_input)
def path_to_obj(x: list[float], y: list[float], dest_path: str):
bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete()
mesh = bpy.data.meshes.new("mesh")
obj = bpy.data.objects.new("object", mesh)
coords = [(x, y, 0.05) for (x, y) in zip(x, y)]
edges = [(i, (i + 1) % len(x)) for i in range(len(x))]
face = np.arange(len(x))
mesh.from_pydata(coords, edges, [face])
mesh.update()
bpy.context.collection.objects.link(obj)
bpy.context.view_layer.objects.active = obj
obj.select_set(True)
bpy.ops.object.editmode_toggle()
bpy.ops.mesh.extrude_region_move(
TRANSFORM_OT_translate={"value": (-0, -0, -0.1),
"constraint_axis": (False, False, True)})
bpy.ops.object.editmode_toggle()
bpy.ops.wm.obj_export(filepath=f'{dest_path}/mesh.obj',
forward_axis='Y',
up_axis='Z',
export_materials=False,
export_selected_objects=True)
bpy.ops.object.delete()
|