Skip to content

Commit 285faf7

Browse files
committed
add kratos into the same Snakefile as fenics, still WIP due to a single python function
1 parent 5e9e614 commit 285faf7

File tree

6 files changed

+59
-26
lines changed

6 files changed

+59
-26
lines changed

benchmarks/linear-elastic-plate-with-hole/FEniCS/fenics/environment_simulation.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ channel_priority: strict
77
dependencies:
88
- python=3.12
99
- fenics-dolfinx=0.9.*
10-
- h5py
1110
- libadios2=2.10.1
1211
- petsc4py
1312
- pint

benchmarks/linear-elastic-plate-with-hole/FEniCS/generate_config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def get_configuration(file):
4646
"result_dir": result_dir,
4747
"configuration_to_parameter_file": configuration_to_parameter_file,
4848
"configurations": list(configurations.values()),
49-
"tools": ["fenics"],
49+
"tools": ["fenics", "kratos"],
5050
"benchmark": "linear-elastic-plate-with-hole"
5151
}
5252
with open("workflow_config.json", "w") as f:
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import json
2+
3+
result_dir = config["result_dir"]
4+
configuration_to_parameter_file = config["configuration_to_parameter_file"]
5+
configurations = config["configurations"]
6+
tool = "kratos"
7+
8+
kratos_input_template = "{tool}/input_template.json"
9+
kratos_material_template = "{tool}/StructuralMaterials_template.json"
10+
11+
rule run_simulation:
12+
input:
13+
script = "{tool}/run_simulation.py",
14+
parameters = lambda wildcards: configuration_to_parameter_file[wildcards.configuration],
15+
mesh = f"{result_dir}/mesh/mesh_{{configuration}}.msh",
16+
kratos_input_template = kratos_input_template,
17+
kratos_material_template = kratos_material_template,
18+
output:
19+
mdpa = f"{result_dir}/{{tool}}/mesh_{{configuration}}.mdpa",
20+
kratos_inputfile = f"{result_dir}/{{tool}}/ProjectParameters_{{configuration}}.json",
21+
kratos_materialfile = f"{result_dir}/{{tool}}/MaterialParameters_{{configuration}}.json",
22+
zip = f"{result_dir}/{{tool}}/solution_field_data_{{configuration}}.zip",
23+
metrics = f"{result_dir}/{{tool}}/solution_metrics_{{configuration}}.json",
24+
conda:
25+
"environment_simulation.yml",
26+
shell:
27+
"""
28+
python3 {input.script} \
29+
--input_parameter_file {input.parameters} \
30+
--input_mesh_file {input.mesh} \
31+
--input_kratos_input_template {input.kratos_input_template} \
32+
--input_material_template {input.kratos_material_template} \
33+
--output_mdpa_file {output.mdpa} \
34+
--output_kratos_inputfile {output.kratos_inputfile} \
35+
--output_kratos_materialfile {output.kratos_materialfile} \
36+
--output_solution_file_zip {output.zip} \
37+
--output_metrics_file {output.metrics}
38+
"""

benchmarks/linear-elastic-plate-with-hole/FEniCS/kratos/environment_simulation.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ channels:
33
- conda-forge
44
dependencies:
55
- python=3.10
6+
- meshio
67
- python-gmsh
78
- pint
8-
- meshio
9+
- pyvista
910
- pip
1011
- pip:
1112
- KratosMultiphysics-all
13+
- sympy

benchmarks/linear-elastic-plate-with-hole/FEniCS/kratos/run_simulation.py

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ def msh_to_mdpa(parameter_file: str, mesh_file: str, mdpa_file: str):
133133

134134
def create_kratos_input(
135135
parameter_file: str,
136-
mesh_file: str,
136+
mdpa_file: str,
137137
kratos_input_template_file: str,
138138
kratos_material_template_file: str,
139139
kratos_input_file: str,
@@ -199,8 +199,9 @@ def create_kratos_input(
199199

200200
with open(kratos_input_template_file) as f:
201201
project_parameters_string = f.read()
202+
#remove the file extension .mdpa
202203
project_parameters_string = project_parameters_string.replace(
203-
r"{{MESH_FILE}}", mesh_file
204+
r"{{MESH_FILE}}", os.path.splitext(mdpa_file)[0]
204205
)
205206
project_parameters_string = project_parameters_string.replace(
206207
r"{{MATERIAL_FILE}}", kratos_material_file
@@ -282,9 +283,9 @@ def create_kratos_input(
282283

283284
create_kratos_input(
284285
parameter_file=args.input_parameter_file,
285-
mesh_file=args.input_mesh_file,
286-
input_template_file=args.input_kratos_input_template,
287-
material_template_file=args.input_kratos_material_template,
286+
mdpa_file=args.output_mdpa_file,
287+
kratos_input_template_file=args.input_kratos_input_template, # <-- fixed argument name
288+
kratos_material_template_file=args.input_material_template,
288289
kratos_input_file=args.output_kratos_inputfile,
289290
kratos_material_file=args.output_kratos_materialfile,
290291
)
@@ -306,7 +307,7 @@ def create_kratos_input(
306307
parameters = json.load(f)
307308
config = parameters["configuration"]
308309
output_dir = Path(os.path.dirname(os.path.abspath(args.output_kratos_inputfile))) / str(config)
309-
mesh = pyvista.read("Structure_0_1.vtk")
310+
mesh = pyvista.read(str(output_dir / "Structure_0_1.vtk"))
310311
max_von_mises_stress = float(mesh["VON_MISES_STRESS"].max())
311312
print("Max Von Mises Stress:", max_von_mises_stress)
312313
metrics = {
@@ -315,15 +316,9 @@ def create_kratos_input(
315316
with open(args.output_metrics_file, "w") as f:
316317
json.dump(metrics, f, indent=4)
317318

318-
file_patterns = [
319-
str(output_dir / "Structure_0_1.vtk"),
320-
]
319+
files_to_store = [str(output_dir / "Structure_0_1.vtk")]
321320

322-
files_to_store = []
323-
for pattern in file_patterns:
324-
files_to_store.extend(Path().glob(pattern))
325-
326321
import zipfile
327322
with zipfile.ZipFile(args.output_solution_file_zip, "w") as zipf:
328323
for filepath in files_to_store:
329-
zipf.write(filepath, arcname=f"result_{config}.vtk")
324+
zipf.write(filepath, arcname=f"result_{config}.vtk")

benchmarks/linear-elastic-plate-with-hole/FEniCS/plateWithHoleSolution.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,14 @@ def displacement_symbolic_str(self, X_str: str, Y_str: str):
119119
ux, uy = self.displacement_symbolic()
120120
# Define symbols
121121
x, y = sp.symbols('x y')
122-
# Substitute variable names
123-
subs = {x: sp.Symbol(X_str), y: sp.Symbol(Y_str)}
124-
ux_sub = ux.subs(subs)
125-
uy_sub = uy.subs(subs)
126-
# Convert to string
127-
ux_str = str(ux_sub)
128-
uy_str = str(uy_sub)
122+
E, nu, a, T = sp.symbols('E nu a T')
123+
subs_vars = {x: sp.Symbol(X_str), y: sp.Symbol(Y_str)}
124+
subs_params = {E: self.E, nu: self.nu, a: self.radius, T: self.load}
125+
ux_sub = ux.subs(subs_vars).subs(subs_params)
126+
uy_sub = uy.subs(subs_vars).subs(subs_params)
127+
# Convert to string using sympy.sstr for single-line output with **
128+
ux_str = sp.sstr(ux_sub)
129+
uy_str = sp.sstr(uy_sub)
129130
return ux_str, uy_str
130131

131132
def stress(self, x: np.ndarray) -> np.ndarray:
@@ -141,5 +142,3 @@ def stress(self, x: np.ndarray) -> np.ndarray:
141142
sxy = self.sxy_func(arr[0], arr[1])
142143
syy = self.syy_func(arr[0], arr[1])
143144
return sxx, sxy, syy
144-
145-

0 commit comments

Comments
 (0)