diff --git a/.gitignore b/.gitignore
index 9c7dc41..b054c25 100644
--- a/.gitignore
+++ b/.gitignore
@@ -221,3 +221,7 @@ polyMesh/
# Jupyter Notebook checkpoints
.ipynb_checkpoints/
+
+# Time step folders
+[0-9][0-9]*
+0/
diff --git a/.history/run/meshMotion/diff_20251110174819.psvm b/.history/run/meshMotion/diff_20251110174819.psvm
new file mode 100644
index 0000000..e69de29
diff --git a/.history/run/meshMotion/diff_20251110174823.psvm b/.history/run/meshMotion/diff_20251110174823.psvm
new file mode 100644
index 0000000..053b553
--- /dev/null
+++ b/.history/run/meshMotion/diff_20251110174823.psvm
@@ -0,0 +1,22746 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/Allrun_20251031183301.LaplaceMeshMotion b/.history/run/meshMotion/wingMotion/Allrun_20251031183301.LaplaceMeshMotion
new file mode 100644
index 0000000..da86f9a
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/Allrun_20251031183301.LaplaceMeshMotion
@@ -0,0 +1,34 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+
+
+echo Copy the template case and set dynamicMesh for Machine Learning
+(
+ cp -r ellipsoid3D
+
+ echo Set mesh motion settings to Laplace mesh motion
+ cp constant/dynamicMeshDict.MachineLearningMeshMotion constant/dynamicMeshDict
+
+ runParallel $(getApplication)
+
+ cd ..
+
+ echo Copy data for comparison
+ cp -r wingMotion2D_pimpleFoam mesh-motion_Laplace
+
+ echo Reset mesh motion settings
+ git checkout wingMotion2D_pimpleFoam/constant/dynamicMeshDict
+
+ echo Create .foam file visualization in ParaView
+ touch mesh-motion_Laplace/laplace.foam
+
+ echo Generate mesh quality metrics
+ mpirun -np 4 checkMesh \
+ -case mesh-motion_Laplace \
+ -writeFields '(nonOrthoAngle skewness)' -parallel
+)
+
+#------------------------------------------------------------------------------
diff --git a/.history/run/meshMotion/wingMotion/Allrun_20251110174730.PinnMeshMotion b/.history/run/meshMotion/wingMotion/Allrun_20251110174730.PinnMeshMotion
new file mode 100644
index 0000000..e69de29
diff --git a/.history/run/meshMotion/wingMotion/Allrun_20251110174734.PinnMeshMotion b/.history/run/meshMotion/wingMotion/Allrun_20251110174734.PinnMeshMotion
new file mode 100644
index 0000000..1f28beb
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/Allrun_20251110174734.PinnMeshMotion
@@ -0,0 +1,40 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+./Allclean
+
+./Allrun.pre
+
+echo Delete previous results mesh-motion_Pinn
+rm -rf mesh-motion_Pinn
+
+echo Use the constant/dynamicMesh.laplace settings and run the solver locally
+(
+ cd wingMotion2D_pimpleFoam || exit
+
+ echo Set mesh motion settings to Pinn mesh motion
+ cp constant/dynamicMeshDict.PinnMeshMotion constant/dynamicMeshDict
+
+ cd ..
+
+ echo Run the SmartSim python script that implements the Pinn+CFD algorithm
+ python openfoam-smartsim-wingmotion_pinn.py
+
+ echo Copy data for comparison
+ cp -r mesh-motion mesh-motion_Pinn
+
+ echo Reset mesh motion settings
+ git checkout wingMotion2D_pimpleFoam/constant/dynamicMeshDict
+
+ echo Create .foam file for visualization in ParaView
+ touch mesh-motion_Pinn/of_model/pinn.foam
+
+ echo Generating mesh quality metrics
+ mpirun -np 4 checkMesh \
+ -case mesh-motion_Pinn/of_model \
+ -writeFields '(nonOrthoAngle skewness)' -parallel
+)
+
+#------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/Allrun_20251110175752.LaplaceMeshMotion b/.history/run/meshMotion/wingMotion/Allrun_20251110175752.LaplaceMeshMotion
new file mode 100644
index 0000000..a8aac54
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/Allrun_20251110175752.LaplaceMeshMotion
@@ -0,0 +1,38 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+./Allclean
+
+./Allrun.pre
+
+rm -rf mesh-motion_Laplace
+
+echo Use the constant/dynamicMesh.laplace settings and run the solver locally
+(
+ cd wingMotion2D_pimpleFoam || exit
+
+ echo Set mesh motion settings to Laplace mesh motion
+ cp constant/dynamicMeshDict.LaplaceMeshMotion constant/dynamicMeshDict
+
+ runParallel $(getApplication)
+
+ cd ..
+
+ echo Copy data for comparison
+ cp -r wingMotion2D_pimpleFoam mesh-motion_Laplace
+
+ echo Reset mesh motion settings
+ git checkout wingMotion2D_pimpleFoam/constant/dynamicMeshDict
+
+ echo Create .foam file visualization in ParaView
+ touch mesh-motion_Laplace/laplace.foam
+
+ echo Generate mesh quality metrics
+ mpirun -np 4 checkMesh \
+ -case mesh-motion_Laplace \
+ -writeFields '(nonOrthoAngle skewness)' -parallel
+)
+
+#------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/README_20250630110441.md b/.history/run/meshMotion/wingMotion/README_20250630110441.md
new file mode 100644
index 0000000..e94aa28
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/README_20250630110441.md
@@ -0,0 +1,31 @@
+# Running
+
+The 2D wing is rapidly translated and rotated, causing significant mesh deformation. The deformation is implemented as
+
+1. Laplace deformation available in OpenFOAM
+2. MLP Machine-Learning deformation, combining Pytorch and OpenFOAM via SmartSim/SmartRedis.
+
+To run Laplace deformation make sure SmartSim env and OpenFOAM env are sourced, then
+
+```
+wingMotion> ./Allrun.LaplaceMeshMotion
+```
+
+this creates `mesh-motion_Laplace` - a folder that is an OpenFOAM simulation, for Laplace deformation, we don't need SmartSim/SmartRedis.
+
+Tor run the SmartSim MLP mesh deformation, run
+
+```
+wingMotion> ./Allrun.MachineLearningMeshMotion
+```
+
+which creates `mesh-motion_MachineLearning`, which has sub-folders for the SmartSim orchestrator, for the openfoam model (`of_model`, OpenFOAM simulation case), and the MLP training script (`training_app`).
+
+
+Both `Allrun.LaplaceMeshMotion` and `Allrun.MachineLearningMeshMotion` will compute mesh quality metrics (most important ones are non-orthogonality and skewness), and `.foam` files that ParaView needs to recognize OpenFOAM folders. A paraview state file is prepared that compares the decrease in non-orthogonality, visualizing the difference between Laplace non-orthogonality and MLP non-orthogonality, run it as
+
+```
+wingMotion> paraview --state=visualize-non-orth-difference.pvsm
+```
+
+This will show how the Laplace causes an increase of non-orthogonality at the worst possible place - next to the airfoil. The increase is up to 35 degrees, w.r.t a simple MLP.
diff --git a/.history/run/meshMotion/wingMotion/README_20250923215408.md b/.history/run/meshMotion/wingMotion/README_20250923215408.md
new file mode 100644
index 0000000..78b4008
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/README_20250923215408.md
@@ -0,0 +1,31 @@
+# Running
+
+The 2D wing is rapidly translated and rotated, causing significant mesh deformation. The deformation is implemented as
+
+1. Laplace deformation available in OpenFOAM
+2. MLP Machine-Learning deformation, combining Pytorch and OpenFOAM via SmartSim/SmartRedis.
+
+To run Laplace deformation make sure SmartSim env and OpenFOAM env are sourced, then
+
+```
+wingMotion> ./Allrun.LaplaceMeshMotion
+```
+
+this creates `mesh-motion_Laplace` - a folder that is an OpenFOAM simulation, for Laplace deformation, we don't need SmartSim/SmartRedis.
+
+Tor run the SmartSim MLP mesh deformation, run
+
+```
+wingMotion> ./Allrun.MachineLearningMeshMotion
+```
+
+which creates `mesh-motion_MachineLearning`, which has sub-folders for the SmartSim orchestrator, for the openfoam model (`of_model`, OpenFOAM simulation case), and the MLP training script (`training_app`).
+
+
+Both `Allrun.LaplaceMeshMotion` and `Allrun.MachineLearningMeshMotion` will compute mesh quality metrics (most important ones are non-orthogonality and skewness), and `.foam` files that ParaView needs to recognize OpenFOAM folders. A paraview state file is prepared that compares the decrease in non-orthogonality, visualizing the difference between Laplace non-orthogonality and MLP non-orthogonality, run it as
+
+```
+wingMotion> paraview --state=diff.pvsm
+```
+
+This will show how the Laplace causes an increase of non-orthogonality at the worst possible place - next to the airfoil. The increase is up to 35 degrees, w.r.t a simple MLP.
diff --git a/.history/run/meshMotion/wingMotion/diff_20250923194602.pvsm b/.history/run/meshMotion/wingMotion/diff_20250923194602.pvsm
new file mode 100644
index 0000000..e5f66a8
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/diff_20250923194602.pvsm
@@ -0,0 +1,30781 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.history/run/meshMotion/wingMotion/diff_20250923194649.pvsm b/.history/run/meshMotion/wingMotion/diff_20250923194649.pvsm
new file mode 100644
index 0000000..4fe29a1
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/diff_20250923194649.pvsm
@@ -0,0 +1,30781 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.history/run/meshMotion/wingMotion/diff_20250923194700.pvsm b/.history/run/meshMotion/wingMotion/diff_20250923194700.pvsm
new file mode 100644
index 0000000..4fe29a1
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/diff_20250923194700.pvsm
@@ -0,0 +1,30781 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.history/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn_20251009152821.py b/.history/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn_20251009152821.py
new file mode 100644
index 0000000..0f23269
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn_20251009152821.py
@@ -0,0 +1,321 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # calculate strain components
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=1e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 5000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = max(0.001, 0.01 * epoch / epochs + 0.001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # if epoch % 1000 == 0 or epoch == epochs - 1:
+ # print(f"[Epoch {epoch}]")
+ # print(f" Data Loss : {data_loss.item():.6e}")
+ # print(f" PINN Loss : {p_loss.item():.6e}")
+ # print(f" Physics Weight : {physics_weight:.4f}")
+ # print(f" Data Weight : {data_weight:.4f}")
+ # print(f" Validation RMSE: {rmse_loss_val:.6e}")
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn_20251009153012.py b/.history/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn_20251009153012.py
new file mode 100644
index 0000000..58d13b0
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn_20251009153012.py
@@ -0,0 +1,321 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # calculate strain components
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=2e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 5000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = max(0.001, 0.01 * epoch / epochs + 0.001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # if epoch % 1000 == 0 or epoch == epochs - 1:
+ # print(f"[Epoch {epoch}]")
+ # print(f" Data Loss : {data_loss.item():.6e}")
+ # print(f" PINN Loss : {p_loss.item():.6e}")
+ # print(f" Physics Weight : {physics_weight:.4f}")
+ # print(f" Data Weight : {data_weight:.4f}")
+ # print(f" Validation RMSE: {rmse_loss_val:.6e}")
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152408.py b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152408.py
new file mode 100644
index 0000000..4d3731d
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152408.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152416.py b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152416.py
new file mode 100644
index 0000000..dc30e01
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152416.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152417.py b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152417.py
new file mode 100644
index 0000000..dc30e01
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152417.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152642.py b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152642.py
new file mode 100644
index 0000000..6af1722
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113152642.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_20251113154454.py b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113154454.py
new file mode 100644
index 0000000..4ba54f3
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113154454.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_20251113154459.py b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113154459.py
new file mode 100644
index 0000000..4ba54f3
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_20251113154459.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_new_20250924113817.py b/.history/run/meshMotion/wingMotion/mesh_trainer_new_20250924113817.py
new file mode 100644
index 0000000..8a8fad7
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_new_20250924113817.py
@@ -0,0 +1,250 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+from typing import Union
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+ # self._model_buffer = io.BytesIO()
+ # self._model.eval()
+ # # Prepare a sample input
+ # example_forward_input = torch.rand(2).to(device)
+ # # Convert the PyTorch model to TorchScript
+ # model_script = torch.jit.trace(self._model, example_forward_input)
+ # # Save the TorchScript model to a buffer
+ # torch.jit.save(model_script, self._model_buffer)
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_new_20250924121433.py b/.history/run/meshMotion/wingMotion/mesh_trainer_new_20250924121433.py
new file mode 100644
index 0000000..a210ed7
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_new_20250924121433.py
@@ -0,0 +1,241 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+from typing import Union
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250724233003.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250724233003.py
new file mode 100644
index 0000000..23da997
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250724233003.py
@@ -0,0 +1,281 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001335.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001335.py
new file mode 100644
index 0000000..915e89d
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001335.py
@@ -0,0 +1,333 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Provide stopping control for iterative optimization tasks."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ ):
+ """Initialize a new controller instance.
+
+ :param patience: number of iterations to wait for an improved
+ loss value before stopping; defaults to 40
+ :type patience: int, optional
+ :param min_delta: minimum relative reduction of the loss value
+ considered as an improvement; avoids overly long optimization
+ with marginal improvements per iteration; defaults to 1.0e-4
+ :type min_delta: float, optional
+ :param checkpoint: path at which to store the best known state
+ of the model; the state is not saved if None; defaults to None
+ :type checkpoint: Union[str, None], optional
+ :param model: instance of PyTorch model; the model's state dict is
+ saved upon improvement of the loss function is a valid checkpoint
+ is provided; defaults to None
+ :type model: Union[pt.nn.Module, None], optional
+ """
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def __call__(self, loss: float) -> bool:
+ """_summary_
+
+ :param loss: new loss value
+ :type loss: float
+ :return: boolean flag indicating if the optimization can be stopped
+ :rtype: bool
+ """
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._chp is not None and self._model is not None:
+ torch.save(self._model.state_dict(), self._chp)
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001342.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001342.py
new file mode 100644
index 0000000..0201241
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001342.py
@@ -0,0 +1,333 @@
+import argparse
+from smartredis import Client
+import torch as pt
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Provide stopping control for iterative optimization tasks."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ ):
+ """Initialize a new controller instance.
+
+ :param patience: number of iterations to wait for an improved
+ loss value before stopping; defaults to 40
+ :type patience: int, optional
+ :param min_delta: minimum relative reduction of the loss value
+ considered as an improvement; avoids overly long optimization
+ with marginal improvements per iteration; defaults to 1.0e-4
+ :type min_delta: float, optional
+ :param checkpoint: path at which to store the best known state
+ of the model; the state is not saved if None; defaults to None
+ :type checkpoint: Union[str, None], optional
+ :param model: instance of PyTorch model; the model's state dict is
+ saved upon improvement of the loss function is a valid checkpoint
+ is provided; defaults to None
+ :type model: Union[pt.nn.Module, None], optional
+ """
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def __call__(self, loss: float) -> bool:
+ """_summary_
+
+ :param loss: new loss value
+ :type loss: float
+ :return: boolean flag indicating if the optimization can be stopped
+ :rtype: bool
+ """
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._chp is not None and self._model is not None:
+ torch.save(self._model.state_dict(), self._chp)
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001401.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001401.py
new file mode 100644
index 0000000..c30d43d
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001401.py
@@ -0,0 +1,333 @@
+import argparse
+from smartredis import Client
+import torch as pt
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from type import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Provide stopping control for iterative optimization tasks."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ ):
+ """Initialize a new controller instance.
+
+ :param patience: number of iterations to wait for an improved
+ loss value before stopping; defaults to 40
+ :type patience: int, optional
+ :param min_delta: minimum relative reduction of the loss value
+ considered as an improvement; avoids overly long optimization
+ with marginal improvements per iteration; defaults to 1.0e-4
+ :type min_delta: float, optional
+ :param checkpoint: path at which to store the best known state
+ of the model; the state is not saved if None; defaults to None
+ :type checkpoint: Union[str, None], optional
+ :param model: instance of PyTorch model; the model's state dict is
+ saved upon improvement of the loss function is a valid checkpoint
+ is provided; defaults to None
+ :type model: Union[pt.nn.Module, None], optional
+ """
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def __call__(self, loss: float) -> bool:
+ """_summary_
+
+ :param loss: new loss value
+ :type loss: float
+ :return: boolean flag indicating if the optimization can be stopped
+ :rtype: bool
+ """
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._chp is not None and self._model is not None:
+ torch.save(self._model.state_dict(), self._chp)
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001420.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001420.py
new file mode 100644
index 0000000..e5e5e72
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001420.py
@@ -0,0 +1,333 @@
+import argparse
+from smartredis import Client
+import torch as pt
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Provide stopping control for iterative optimization tasks."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ ):
+ """Initialize a new controller instance.
+
+ :param patience: number of iterations to wait for an improved
+ loss value before stopping; defaults to 40
+ :type patience: int, optional
+ :param min_delta: minimum relative reduction of the loss value
+ considered as an improvement; avoids overly long optimization
+ with marginal improvements per iteration; defaults to 1.0e-4
+ :type min_delta: float, optional
+ :param checkpoint: path at which to store the best known state
+ of the model; the state is not saved if None; defaults to None
+ :type checkpoint: Union[str, None], optional
+ :param model: instance of PyTorch model; the model's state dict is
+ saved upon improvement of the loss function is a valid checkpoint
+ is provided; defaults to None
+ :type model: Union[pt.nn.Module, None], optional
+ """
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def __call__(self, loss: float) -> bool:
+ """_summary_
+
+ :param loss: new loss value
+ :type loss: float
+ :return: boolean flag indicating if the optimization can be stopped
+ :rtype: bool
+ """
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._chp is not None and self._model is not None:
+ torch.save(self._model.state_dict(), self._chp)
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001431.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001431.py
new file mode 100644
index 0000000..84e46cb
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001431.py
@@ -0,0 +1,333 @@
+import argparse
+from smartredis import Client
+import torch as pt
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Provide stopping control for iterative optimization tasks."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[nn.Module, None] = None,
+ ):
+ """Initialize a new controller instance.
+
+ :param patience: number of iterations to wait for an improved
+ loss value before stopping; defaults to 40
+ :type patience: int, optional
+ :param min_delta: minimum relative reduction of the loss value
+ considered as an improvement; avoids overly long optimization
+ with marginal improvements per iteration; defaults to 1.0e-4
+ :type min_delta: float, optional
+ :param checkpoint: path at which to store the best known state
+ of the model; the state is not saved if None; defaults to None
+ :type checkpoint: Union[str, None], optional
+ :param model: instance of PyTorch model; the model's state dict is
+ saved upon improvement of the loss function is a valid checkpoint
+ is provided; defaults to None
+ :type model: Union[pt.nn.Module, None], optional
+ """
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def __call__(self, loss: float) -> bool:
+ """_summary_
+
+ :param loss: new loss value
+ :type loss: float
+ :return: boolean flag indicating if the optimization can be stopped
+ :rtype: bool
+ """
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._chp is not None and self._model is not None:
+ torch.save(self._model.state_dict(), self._chp)
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001446.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001446.py
new file mode 100644
index 0000000..91315d0
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001446.py
@@ -0,0 +1,333 @@
+import argparse
+from smartredis import Client
+import torch as pt
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Provide stopping control for iterative optimization tasks."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[nn.Module, None] = None,
+ ):
+ """Initialize a new controller instance.
+
+ :param patience: number of iterations to wait for an improved
+ loss value before stopping; defaults to 40
+ :type patience: int, optional
+ :param min_delta: minimum relative reduction of the loss value
+ considered as an improvement; avoids overly long optimization
+ with marginal improvements per iteration; defaults to 1.0e-4
+ :type min_delta: float, optional
+ :param checkpoint: path at which to store the best known state
+ of the model; the state is not saved if None; defaults to None
+ :type checkpoint: Union[str, None], optional
+ :param model: instance of PyTorch model; the model's state dict is
+ saved upon improvement of the loss function is a valid checkpoint
+ is provided; defaults to None
+ :type model: Union[pt.nn.Module, None], optional
+ """
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def __call__(self, loss: float) -> bool:
+ """_summary_
+
+ :param loss: new loss value
+ :type loss: float
+ :return: boolean flag indicating if the optimization can be stopped
+ :rtype: bool
+ """
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._chp is not None and self._model is not None:
+ pt.save(self._model.state_dict(), self._chp)
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001543.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001543.py
new file mode 100644
index 0000000..0766834
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250830001543.py
@@ -0,0 +1,339 @@
+import argparse
+from smartredis import Client
+import torch as pt
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Provide stopping control for iterative optimization tasks."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[nn.Module, None] = None,
+ ):
+ """Initialize a new controller instance.
+
+ :param patience: number of iterations to wait for an improved
+ loss value before stopping; defaults to 40
+ :type patience: int, optional
+ :param min_delta: minimum relative reduction of the loss value
+ considered as an improvement; avoids overly long optimization
+ with marginal improvements per iteration; defaults to 1.0e-4
+ :type min_delta: float, optional
+ :param checkpoint: path at which to store the best known state
+ of the model; the state is not saved if None; defaults to None
+ :type checkpoint: Union[str, None], optional
+ :param model: instance of PyTorch model; the model's state dict is
+ saved upon improvement of the loss function is a valid checkpoint
+ is provided; defaults to None
+ :type model: Union[pt.nn.Module, None], optional
+ """
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def __call__(self, loss: float) -> bool:
+ """_summary_
+
+ :param loss: new loss value
+ :type loss: float
+ :return: boolean flag indicating if the optimization can be stopped
+ :rtype: bool
+ """
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._chp is not None and self._model is not None:
+ pt.save(self._model.state_dict(), self._chp)
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-4,
+ checkpoint="best_model.pt",
+ model=model
+ )
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150700.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150700.py
new file mode 100644
index 0000000..f5c8ce0
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150700.py
@@ -0,0 +1,334 @@
+import argparse
+from smartredis import Client
+import torch as pt
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-4,
+ checkpoint="best_model.pt",
+ model=model
+ )
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150715.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150715.py
new file mode 100644
index 0000000..9230547
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150715.py
@@ -0,0 +1,334 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-4,
+ checkpoint="best_model.pt",
+ model=model
+ )
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150752.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150752.py
new file mode 100644
index 0000000..f9f2ab9
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150752.py
@@ -0,0 +1,335 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ early_stopper = EarlyStopping(
+ patience=40,
+ min_delta=1e-3,
+ checkpoint="best_model.pt",
+ model=model,
+ target_loss=1e-4
+ )
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 2 * 1e-04):
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150837.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150837.py
new file mode 100644
index 0000000..7a67728
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150837.py
@@ -0,0 +1,337 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ early_stopper = EarlyStopping(
+ patience=40,
+ min_delta=1e-3,
+ checkpoint="best_model.pt",
+ model=model,
+ target_loss=1e-4
+ )
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0] * 5
+ phys_w = weights[1] * 0.1
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}, RMSE={rmse_loss_val.item():.6e}")
+ early_stopper.reset()
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150908.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150908.py
new file mode 100644
index 0000000..d200f9f
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn1_20250904150908.py
@@ -0,0 +1,337 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+from typing import Union
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class SoftAdapt:
+ def __init__(self, beta=10.0):
+ self.prev_losses = None
+ self.beta = beta
+
+ def get_weights(self, current_losses):
+ current_losses = np.array(current_losses)
+ if self.prev_losses is None:
+ self.prev_losses = current_losses
+ return [1.0 / len(current_losses)] * len(current_losses)
+
+ deltas = self.prev_losses - current_losses
+ self.prev_losses = current_losses
+ weights = np.exp(-self.beta * deltas)
+ weights = weights / np.sum(weights)
+ return weights.tolist()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ early_stopper = EarlyStopping(
+ patience=40,
+ min_delta=1e-3,
+ checkpoint="best_model.pt",
+ model=model,
+ target_loss=1e-4
+ )
+ softadapt = SoftAdapt(beta=5)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ validation_rmse = []
+ model.train()
+ epochs = 15000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ loss_max = {
+ "mse": 1.0,
+ "phys": 1.0,
+ }
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ # ---- 加入标准化处理 ----
+ alpha = 0.1
+ loss_max["mse"] = (1 - alpha) * loss_max["mse"] + alpha * mse_loss.item()
+ loss_max["phys"] = max(loss_max["phys"], phys_loss.item())
+ mse_loss_norm = mse_loss.item() / loss_max["mse"]
+ phys_loss_norm = phys_loss.item() / loss_max["phys"]
+
+ # Get adaptive weights from SoftAdapt
+ weights = softadapt.get_weights([mse_loss_norm, phys_loss_norm])
+
+ mse_w = weights[0]
+ phys_w = weights[1]
+ total = mse_w + phys_w
+ mse_w /= total
+ phys_w /= total
+ # Weighted total loss
+ # loss_train = weights[0] * mse_loss + weights[1] * phys_loss
+ loss_train = mse_w * mse_loss + phys_w * phys_loss
+
+ # Backward pass
+ loss_train.backward()
+
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}, RMSE={rmse_loss_val.item():.6e}")
+ early_stopper.reset()
+ break
+ if epoch % 5000 == 0 or epoch == epochs - 1:
+ print(f"Epoch {epoch}: weights = {weights}, mse = {mse_loss.item():.6e}, phys = {phys_loss.item():.6e}, RMSE = {validation_rmse[-1]}")
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250726205748.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250726205748.py
new file mode 100644
index 0000000..b58a28a
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250726205748.py
@@ -0,0 +1,239 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ validation_amse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ loss_train = 0.95 * mse_loss + 0.05 * phys_loss
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ amse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(amse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ validation_amse.append(amse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+ ##TODO 1. amse 2. early stop
+ if epoch % 10000 == 0:
+ print(f"Epoch {epoch}, RMSE: {rmse_loss_val:.4e}, AMSE: {amse_loss_val:.4e}, Data Loss: {mse_loss.item():.4e}, Phys Loss: {phys_loss.item():.4e}")
+
+ print (f"RMSE {validation_rmse[-1]}, AMSE {validation_amse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151440.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151440.py
new file mode 100644
index 0000000..cedcab0
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151440.py
@@ -0,0 +1,286 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ validation_amse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ loss_train = 0.95 * mse_loss + 0.05 * phys_loss
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ amse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(amse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ validation_amse.append(amse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+ ##TODO 1. amse 2. early stop
+ if epoch % 10000 == 0:
+ print(f"Epoch {epoch}, RMSE: {rmse_loss_val:.4e}, AMSE: {amse_loss_val:.4e}, Data Loss: {mse_loss.item():.4e}, Phys Loss: {phys_loss.item():.4e}")
+
+ print (f"RMSE {validation_rmse[-1]}, AMSE {validation_amse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151518.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151518.py
new file mode 100644
index 0000000..25ee02d
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151518.py
@@ -0,0 +1,293 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ # Make sure all datasets are avaialble in the smartredis database.
+ early_stopper = EarlyStopping(
+ patience=40,
+ min_delta=1e-3,
+ checkpoint="best_model.pt",
+ model=model,
+ target_loss=1e-4
+ )
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ validation_amse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ loss_train = 0.95 * mse_loss + 0.05 * phys_loss
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ amse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(amse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ validation_amse.append(amse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+ ##TODO 1. amse 2. early stop
+ if epoch % 10000 == 0:
+ print(f"Epoch {epoch}, RMSE: {rmse_loss_val:.4e}, AMSE: {amse_loss_val:.4e}, Data Loss: {mse_loss.item():.4e}, Phys Loss: {phys_loss.item():.4e}")
+
+ print (f"RMSE {validation_rmse[-1]}, AMSE {validation_amse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151520.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151520.py
new file mode 100644
index 0000000..fba45e1
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151520.py
@@ -0,0 +1,293 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ # Make sure all datasets are avaialble in the smartredis database.
+ early_stopper = EarlyStopping(
+ patience=40,
+ min_delta=1e-3,
+ checkpoint="best_model.pt",
+ model=model,
+ target_loss=1e-4
+ )
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ validation_amse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ loss_train = 0.95 * mse_loss + 0.05 * phys_loss
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ amse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(amse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ validation_amse.append(amse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+ ##TODO 1. amse 2. early stop
+ if epoch % 10000 == 0:
+ print(f"Epoch {epoch}, RMSE: {rmse_loss_val:.4e}, AMSE: {amse_loss_val:.4e}, Data Loss: {mse_loss.item():.4e}, Phys Loss: {phys_loss.item():.4e}")
+
+ print (f"RMSE {validation_rmse[-1]}, AMSE {validation_amse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151557.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151557.py
new file mode 100644
index 0000000..339f62e
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904151557.py
@@ -0,0 +1,295 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+from sklearn.metrics import mean_squared_error
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ # Make sure all datasets are avaialble in the smartredis database.
+ early_stopper = EarlyStopping(
+ patience=40,
+ min_delta=1e-3,
+ checkpoint="best_model.pt",
+ model=model,
+ target_loss=1e-4
+ )
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ validation_amse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ loss_train = 0.95 * mse_loss + 0.05 * phys_loss
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ amse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(amse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ validation_amse.append(amse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}, RMSE={rmse_loss_val.item():.6e}")
+ early_stopper.reset()
+ break
+ ##TODO 1. amse 2. early stop
+ if epoch % 10000 == 0:
+ print(f"Epoch {epoch}, RMSE: {rmse_loss_val:.4e}, AMSE: {amse_loss_val:.4e}, Data Loss: {mse_loss.item():.4e}, Phys Loss: {phys_loss.item():.4e}")
+
+ print (f"RMSE {validation_rmse[-1]}, AMSE {validation_amse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904152101.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904152101.py
new file mode 100644
index 0000000..fc04f75
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn2_20250904152101.py
@@ -0,0 +1,298 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ checkpoint: Union[str, None] = None,
+ model: Union[torch.nn.Module, None] = None,
+ target_loss: float = 1e-4,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._chp = checkpoint
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._target_loss = target_loss
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ # 阈值停止
+ if loss <= self._target_loss:
+ print(f"[EarlyStopping] Target loss reached: {loss:.6e}")
+ self._stop = True
+ return self._stop
+
+ # 相对改善判断
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ # if self._chp is not None and self._model is not None:
+ # torch.save(self._model.state_dict(), self._chp)
+ # print(f"[EarlyStopping] Improvement detected: {loss:.6e}, counter reset")
+ else:
+ self._counter += 1
+ print(f"[EarlyStopping] No improvement: {loss:.6e}, counter={self._counter}")
+ if self._counter >= self._patience:
+ print(f"[EarlyStopping] Patience exceeded: stopping training")
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+
+ # Small strain tensor components
+ eps_xx = dux_dx # ε_xx
+ eps_yy = duy_dy # ε_yy
+ eps_xy = 0.5 * (dux_dy + duy_dx) # ε_xy = ε_yx
+
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ pinn_loss_value = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return pinn_loss_value
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.SiLU()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+ # Make sure all datasets are avaialble in the smartredis database.
+ early_stopper = EarlyStopping(
+ patience=40,
+ min_delta=1e-3,
+ checkpoint="best_model.pt",
+ model=model,
+ target_loss=1e-4
+ )
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+ points_train = points_train.clone().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ validation_amse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute individual loss terms
+ mse_loss = loss_func(displ_pred, displ_train)
+ phys_loss = pinn_loss(points_train, displ_pred)
+
+ loss_train = 0.95 * mse_loss + 0.05 * phys_loss
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ amse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(amse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ validation_amse.append(amse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}, RMSE={rmse_loss_val.item():.6e}")
+ early_stopper.reset()
+ break
+ ##TODO 1. amse 2. early stop
+ if epoch % 10000 == 0:
+ print(f"Epoch {epoch}, RMSE: {rmse_loss_val:.4e}, AMSE: {amse_loss_val:.4e}, Data Loss: {mse_loss.item():.4e}, Phys Loss: {phys_loss.item():.4e}")
+
+ print (f"RMSE {validation_rmse[-1]}, AMSE {validation_amse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2).to(device)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "GPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251110174933.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251110174933.py
new file mode 100644
index 0000000..62c1042
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251110174933.py
@@ -0,0 +1,327 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 50))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+ if local_time_index == 1:
+ epochs = 10000
+ else:
+ epochs = 1000
+ # Annealing schedule parameters
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251110175047.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251110175047.py
new file mode 100644
index 0000000..f8b0f3d
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251110175047.py
@@ -0,0 +1,327 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+ if local_time_index == 1:
+ epochs = 10000
+ else:
+ epochs = 1000
+ # Annealing schedule parameters
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251113150828.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251113150828.py
new file mode 100644
index 0000000..74ede46
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251113150828.py
@@ -0,0 +1,327 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+ if local_time_index == 1:
+ epochs = 10000
+ else:
+ epochs = 1000
+ # Annealing schedule parameters
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251113161016.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251113161016.py
new file mode 100644
index 0000000..1fac9ab
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251113161016.py
@@ -0,0 +1,328 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # calculate strain components
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=1e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 5000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = max(0.0001, 0.001 * epoch / epochs + 0.0001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # if epoch % 1000 == 0 or epoch == epochs - 1:
+ # print(f"[Epoch {epoch}]")
+ # print(f" Data Loss : {data_loss.item():.6e}")
+ # print(f" PINN Loss : {p_loss.item():.6e}")
+ # print(f" Physics Weight : {physics_weight:.4f}")
+ # print(f" Data Weight : {data_weight:.4f}")
+ # print(f" Validation RMSE: {rmse_loss_val:.6e}")
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114115416.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114115416.py
new file mode 100644
index 0000000..3bddc3c
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114115416.py
@@ -0,0 +1,328 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # calculate strain components
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=1e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 10000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 10000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 5000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = max(0.0001, 0.001 * epoch / epochs + 0.0001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # if epoch % 1000 == 0 or epoch == epochs - 1:
+ # print(f"[Epoch {epoch}]")
+ # print(f" Data Loss : {data_loss.item():.6e}")
+ # print(f" PINN Loss : {p_loss.item():.6e}")
+ # print(f" Physics Weight : {physics_weight:.4f}")
+ # print(f" Data Weight : {data_weight:.4f}")
+ # print(f" Validation RMSE: {rmse_loss_val:.6e}")
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114115638.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114115638.py
new file mode 100644
index 0000000..016e553
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114115638.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 5000
+ # Annealing schedule parameters
+ T_start = 0
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114121934.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114121934.py
new file mode 100644
index 0000000..0738006
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114121934.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=10):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 2000
+ # Annealing schedule parameters
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=200,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114133914.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114133914.py
new file mode 100644
index 0000000..8e50456
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114133914.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=10):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 2000
+ # Annealing schedule parameters
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=200,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 50000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 50000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114133918.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114133918.py
new file mode 100644
index 0000000..f496a4c
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114133918.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=10):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 2000
+ # Annealing schedule parameters
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=200,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 50000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 50000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114134223.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114134223.py
new file mode 100644
index 0000000..15ed5e3
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114134223.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 5000
+ # Annealing schedule parameters
+ T_start = 0
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114152045.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114152045.py
new file mode 100644
index 0000000..c3c12c0
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114152045.py
@@ -0,0 +1,327 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+# from adam_lbfgs import Adam_LBFGS
+from torch.optim import Adam, LBFGS, Optimizer
+
+class Adam_LBFGS(Optimizer):
+ def __init__(self, params, switch_epochs, adam_params, lbfgs_params):
+ # defaults = dict(switch_epoch=switch_epoch, adam_params=adam_params, lbfgs_params=lbfgs_params)
+
+ self.switch_epochs = sorted(switch_epochs)
+ self.params = list(params)
+ self.adam = Adam(self.params, **adam_params)
+ self.lbfgs_params = lbfgs_params
+ # self.lbfgs = LBFGS(self.params, **lbfgs_params)
+
+ super(Adam_LBFGS, self).__init__(self.params, defaults={})
+
+ self.state['epoch'] = 0
+ def reset_epoch(self):
+ self.state['epoch'] = 0
+
+ def step(self, closure=None):
+ if self.state['epoch'] < self.switch_epochs[0]:
+ self.adam.step(closure)
+ else:
+ # (Re)start LBFGS optimizer
+ if self.state['epoch'] in self.switch_epochs:
+ print(f'Starting LBFGS optimizer at epoch {self.state["epoch"]}')
+ self.lbfgs = LBFGS(self.params, **self.lbfgs_params)
+ self.lbfgs.step(closure)
+ self.state['epoch'] += 1
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # calculate strain components
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ switch_epochs = [150] # 第 200 个 epoch 开始用 LBFGS
+ adam_params = {'lr': 1e-4}
+ lbfgs_params = {'lr': 1, 'max_iter': 20, 'history_size': 10}
+ optimizer = Adam_LBFGS(model.parameters(), switch_epochs, adam_params, lbfgs_params)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 5000
+ n_epochs = 0
+ rmse_loss_val = 1
+ optimizer.reset_epoch()
+ for epoch in range(epochs):
+ def closure(epoch=epoch):
+ optimizer.zero_grad()
+ # Forward pass
+ displ_pred = model(points_train)
+
+ # Compute losses
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Physics weight annealing
+ physics_weight = max(0.0001, 0.001 * epoch / epochs + 0.0001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ print(f"[Epoch {epoch}] loss = {loss_train.item():.6e}")
+ loss_train.backward()
+ return loss_train
+
+ optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ print(f"[Epoch {epoch}] Validation RMSE: {rmse_loss_val:.6e}")
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # if epoch % 1000 == 0 or epoch == epochs - 1:
+ # print(f"[Epoch {epoch}]")
+ # print(f" Data Loss : {data_loss.item():.6e}")
+ # print(f" PINN Loss : {p_loss.item():.6e}")
+ # print(f" Physics Weight : {physics_weight:.4f}")
+ # print(f" Data Weight : {data_weight:.4f}")
+ # print(f" Validation RMSE: {rmse_loss_val:.6e}")
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114152812.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114152812.py
new file mode 100644
index 0000000..7e5c679
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114152812.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 5000
+ # Annealing schedule parameters
+ T_start = 0
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154525.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154525.py
new file mode 100644
index 0000000..8001927
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154525.py
@@ -0,0 +1,323 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 5000
+ # Annealing schedule parameters
+ T_start = 0
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154833.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154833.py
new file mode 100644
index 0000000..6e05aba
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154833.py
@@ -0,0 +1,323 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 10000
+ # Annealing schedule parameters
+ T_start = 0
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154854.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154854.py
new file mode 100644
index 0000000..fd46157
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn_20251114154854.py
@@ -0,0 +1,323 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 10000
+ # Annealing schedule parameters
+ T_start = 50
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn___20251113150827.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn___20251113150827.py
new file mode 100644
index 0000000..74ede46
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn___20251113150827.py
@@ -0,0 +1,327 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+ if local_time_index == 1:
+ epochs = 10000
+ else:
+ epochs = 1000
+ # Annealing schedule parameters
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/mesh_trainer_pinn___20251113161201.py b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn___20251113161201.py
new file mode 100644
index 0000000..1fac9ab
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/mesh_trainer_pinn___20251113161201.py
@@ -0,0 +1,328 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # calculate strain components
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=1e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 5000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = max(0.0001, 0.001 * epoch / epochs + 0.0001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # if epoch % 1000 == 0 or epoch == epochs - 1:
+ # print(f"[Epoch {epoch}]")
+ # print(f" Data Loss : {data_loss.item():.6e}")
+ # print(f" PINN Loss : {p_loss.item():.6e}")
+ # print(f" Physics Weight : {physics_weight:.4f}")
+ # print(f" Data Weight : {data_weight:.4f}")
+ # print(f" Validation RMSE: {rmse_loss_val:.6e}")
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/.history/run/meshMotion/wingMotion/script_20250917142100.py b/.history/run/meshMotion/wingMotion/script_20250917142100.py
new file mode 100644
index 0000000..e69de29
diff --git a/.history/run/meshMotion/wingMotion/script_20250917142110.py b/.history/run/meshMotion/wingMotion/script_20250917142110.py
new file mode 100644
index 0000000..57b018a
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/script_20250917142110.py
@@ -0,0 +1,12 @@
+from paraview.simple import *
+
+# 读取 OpenFOAM 文件
+reader = OpenDataFile("/home/jin/case/cavity.foam")
+
+# 显示数据
+view = GetActiveViewOrCreate("RenderView")
+display = Show(reader, view)
+
+# 渲染一张图片
+Render(view)
+WriteImage("cavity.png")
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/script_20250917142201.py b/.history/run/meshMotion/wingMotion/script_20250917142201.py
new file mode 100644
index 0000000..cd41121
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/script_20250917142201.py
@@ -0,0 +1,12 @@
+from paraview.simple import *
+
+# 读取 OpenFOAM 文件
+reader = OpenDataFile("/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion_Pinn/of_model/pinn.foam")
+
+# 显示数据
+view = GetActiveViewOrCreate("RenderView")
+display = Show(reader, view)
+
+# 渲染一张图片
+Render(view)
+WriteImage("cavity.png")
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/script_20250917142258.py b/.history/run/meshMotion/wingMotion/script_20250917142258.py
new file mode 100644
index 0000000..d273b32
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/script_20250917142258.py
@@ -0,0 +1,12 @@
+from paraview.simple import *
+
+# 读取 OpenFOAM 文件
+reader = OpenDataFile("/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion_Pinn/of_model/pinn.foam")
+
+# 显示数据
+view = GetActiveViewOrCreate("RenderView")
+display = Show(reader, view)
+
+# 渲染一张图片
+Render(view)
+SaveScreenshot("cavity.png", view, ImageResolution=[1920, 1080])
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/script_20250917142314.py b/.history/run/meshMotion/wingMotion/script_20250917142314.py
new file mode 100644
index 0000000..d273b32
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/script_20250917142314.py
@@ -0,0 +1,12 @@
+from paraview.simple import *
+
+# 读取 OpenFOAM 文件
+reader = OpenDataFile("/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion_Pinn/of_model/pinn.foam")
+
+# 显示数据
+view = GetActiveViewOrCreate("RenderView")
+display = Show(reader, view)
+
+# 渲染一张图片
+Render(view)
+SaveScreenshot("cavity.png", view, ImageResolution=[1920, 1080])
\ No newline at end of file
diff --git a/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250630110441.pvsm b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250630110441.pvsm
new file mode 100644
index 0000000..c821973
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250630110441.pvsm
@@ -0,0 +1,12381 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917082515.pvsm b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917082515.pvsm
new file mode 100644
index 0000000..5175b19
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917082515.pvsm
@@ -0,0 +1,12381 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917085054.pvsm b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917085054.pvsm
new file mode 100644
index 0000000..c821973
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917085054.pvsm
@@ -0,0 +1,12381 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917172434.pvsm b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917172434.pvsm
new file mode 100644
index 0000000..5175b19
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917172434.pvsm
@@ -0,0 +1,12381 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917172826.pvsm b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917172826.pvsm
new file mode 100644
index 0000000..c821973
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/visualize-non-orth-difference_20250917172826.pvsm
@@ -0,0 +1,12381 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20250630110441 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20250630110441
new file mode 100644
index 0000000..7d0f170
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20250630110441
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (36 24 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110182637 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110182637
new file mode 100644
index 0000000..365f6cb
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110182637
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (18 12 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110182651 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110182651
new file mode 100644
index 0000000..365f6cb
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110182651
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (18 12 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183109 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183109
new file mode 100644
index 0000000..26196e0
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183109
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) ((72 48 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183329 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183329
new file mode 100644
index 0000000..7d0f170
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183329
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (36 24 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183731 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183731
new file mode 100644
index 0000000..1ae8125
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110183731
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (54 36 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110193916 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110193916
new file mode 100644
index 0000000..7d0f170
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251110193916
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (36 24 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113125222 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113125222
new file mode 100644
index 0000000..1ae8125
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113125222
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (54 36 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113154438 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113154438
new file mode 100644
index 0000000..365f6cb
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113154438
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (18 12 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113165956 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113165956
new file mode 100644
index 0000000..7d0f170
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113165956
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (36 24 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113170033 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113170033
new file mode 100644
index 0000000..2c077e6
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113170033
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (45 30 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113185053 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113185053
new file mode 100644
index 0000000..7d0f170
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113185053
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (36 24 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113185730 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113185730
new file mode 100644
index 0000000..eea0b69
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113185730
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (50 35 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113190835 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113190835
new file mode 100644
index 0000000..365f6cb
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113190835
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (18 12 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113190839 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113190839
new file mode 100644
index 0000000..365f6cb
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251113190839
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (18 12 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114123430 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114123430
new file mode 100644
index 0000000..eea0b69
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114123430
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (50 35 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114152121 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114152121
new file mode 100644
index 0000000..7f81802
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114152121
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (15 12 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114154311 b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114154311
new file mode 100644
index 0000000..eea0b69
--- /dev/null
+++ b/.history/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict_20251114154311
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (50 35 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/Allclean b/run/meshMotion/cylinderMotion/Allclean
new file mode 100755
index 0000000..df2b362
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/Allclean
@@ -0,0 +1,9 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions
+#------------------------------------------------------------------------------
+
+rm -rf cylinderMotionExperiment
+rm -f *.out *.err log*.* *.log *.dat
+
+#------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/run/meshMotion/cylinderMotion/Allrun b/run/meshMotion/cylinderMotion/Allrun
new file mode 100755
index 0000000..221562a
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/Allrun
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions
+#------------------------------------------------------------------------------
+
+./Allclean
+
+python cylinder-motion.py
+
+#------------------------------------------------------------------------------
\ No newline at end of file
diff --git a/run/meshMotion/cylinderMotion/cylinder-motion.py b/run/meshMotion/cylinderMotion/cylinder-motion.py
new file mode 100644
index 0000000..9e5cfd0
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder-motion.py
@@ -0,0 +1,253 @@
+#!/usr/bin/env python
+
+# Parsing OpenFOAM configuration files
+from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
+import os
+import sys
+import pandas as pd
+
+# SmartSim
+from smartsim import Experiment
+from smartredis import Client
+
+from matplotlib import pyplot as plt
+from matplotlib import rcParams
+rcParams["figure.dpi"] = 200
+
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+
+# For calling pre-processing scripts
+import subprocess
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def visualization_points(n_points):
+
+ domain_min = [-3, -3, 0]
+ domain_max = [3, 3, 0]
+ radius = 1
+
+ # Generate grid of points
+ x = np.linspace(domain_min[0], domain_max[0], n_points)
+ y = np.linspace(domain_min[1], domain_max[1], n_points)
+ xx, yy = np.meshgrid(x, y)
+ grid_points = np.column_stack((xx.ravel(), yy.ravel(), np.zeros(n_points**2)))
+
+ # Filter out points within the circle
+ norm = np.linalg.norm(grid_points[:, :2], axis=1)
+ visualization_points = grid_points[norm > radius]
+
+ return visualization_points
+
+
+exp = Experiment("cylinderMotionExperiment", launcher="local")
+
+db = exp.create_database(port=8000, # database port
+ interface="lo") # network interface to use
+exp.start(db)
+
+# Connect the python client to the smartredis database
+client = Client(address=db.get_address()[0], cluster=False)
+
+num_mpi_ranks = 4
+
+of_rs = exp.create_run_settings(exe="moveDynamicMesh", exe_args="-case cylinder -parallel",
+ run_command="mpirun",
+ run_args={"np": f"{num_mpi_ranks}"})
+
+of_model = exp.create_model(name="of_model", run_settings=of_rs)
+
+try:
+ # Pre-process: clean existing data in cylinder.
+ res_allrun_clean = subprocess.call(['bash', 'cylinder/Allclean'])
+ print(f'Allrun.pre in cylinder executed with return code: {res_allrun_clean}')
+ # Pre-process: create a mesh and decompose the solution domain of cylinder
+ # - Pre-processing does not interact with ML, so SmartSim models are not used.
+ res_allrun_pre = subprocess.call(['bash', 'cylinder/Allrun.pre'])
+ print(f'Allrun.pre in cylinder executed with return code: {res_allrun_pre}')
+
+ # Run the experiment
+ exp.start(of_model, block=False)
+
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ learning_rate = 1e-02
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+ epochs = 100000
+ n_epochs = 0
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ n_epochs = n_epochs + 1
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-03):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Visualize validation RMSE
+ #plt.loglog()
+ #plt.title("Validation loss RMSE")
+ #plt.xlabel("Epochs")
+ #plt.plot(validation_rmse)
+ #plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 100):
+ print ("End time reached.")
+ break
+
+except Exception as e:
+ print("Caught an exception: ", str(e))
+
+finally:
+ exp.stop(db)
\ No newline at end of file
diff --git a/run/meshMotion/cylinderMotion/cylinder/0.orig/pointDisplacement b/run/meshMotion/cylinderMotion/cylinder/0.orig/pointDisplacement
new file mode 100644
index 0000000..ab67e67
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/0.orig/pointDisplacement
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+
+ cylinder
+ {
+ type solidBodyMotionDisplacement;
+
+ solidBodyMotionFunction oscillatingLinearMotion;
+
+ oscillatingLinearMotionCoeffs
+ {
+ amplitude (0 1 0); // Amplitude of oscillation in x direction
+ omega 4; // Angular frequency in rad/s
+ phase 0; // Phase shift in radians (optional)
+ }
+
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (1 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ //omega 1; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+
+ oscillatingRotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega 1.5; // rad/s, 1rad/s=9.5rpm
+ amplitude (0 0 30); // max amplitude (degrees)
+ }
+ }
+
+ inlet
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+
+ walls
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+
+ frontAndBack
+ {
+ type empty;
+ }
+
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/Allclean b/run/meshMotion/cylinderMotion/cylinder/Allclean
new file mode 100755
index 0000000..fb1f384
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/Allclean
@@ -0,0 +1,8 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions
+#------------------------------------------------------------------------------
+
+cleanCase0
+
+#------------------------------------------------------------------------------
diff --git a/run/meshMotion/cylinderMotion/cylinder/Allrun.post b/run/meshMotion/cylinderMotion/cylinder/Allrun.post
new file mode 100755
index 0000000..a55743b
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/Allrun.post
@@ -0,0 +1,8 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+runApplication mpirun -np 4 checkMesh -constant -writeAllFields -parallel
+
+#------------------------------------------------------------------------------
diff --git a/run/meshMotion/cylinderMotion/cylinder/Allrun.pre b/run/meshMotion/cylinderMotion/cylinder/Allrun.pre
new file mode 100755
index 0000000..2a55bb5
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/Allrun.pre
@@ -0,0 +1,12 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+restore0Dir
+
+runApplication blockMesh
+
+runApplication decomposePar
+
+#------------------------------------------------------------------------------
diff --git a/run/meshMotion/cylinderMotion/cylinder/constant/dynamicMeshDict b/run/meshMotion/cylinderMotion/cylinder/constant/dynamicMeshDict
new file mode 100644
index 0000000..39802a9
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/constant/dynamicMeshDict
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim mesh motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// OpenFOAM mesh motion
+//motionSolverLibs (fvMotionSolvers);
+//motionSolver displacementLaplacian;
+//displacementLaplacianCoeffs
+//{
+// diffusivity inverseDistance (cylinder);
+//}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/constant/g b/run/meshMotion/cylinderMotion/cylinder/constant/g
new file mode 100644
index 0000000..51218d5
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/constant/g
@@ -0,0 +1,21 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class uniformDimensionedVectorField;
+ object g;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -2 0 0 0 0];
+value (0 0 -9.8);
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/constant/transportProperties b/run/meshMotion/cylinderMotion/cylinder/constant/transportProperties
new file mode 100644
index 0000000..9762d17
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/constant/transportProperties
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+rhoInf 1.2;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/constant/turbulenceProperties b/run/meshMotion/cylinderMotion/cylinder/constant/turbulenceProperties
new file mode 100644
index 0000000..6f6dba7
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/constant/turbulenceProperties
@@ -0,0 +1,20 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType laminar;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/system/blockMeshDict b/run/meshMotion/cylinderMotion/cylinder/system/blockMeshDict
new file mode 100644
index 0000000..e8a4d1d
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/system/blockMeshDict
@@ -0,0 +1,114 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+r 1;
+a #eval{1./sqrt(2)*$r};
+b #eval{3*$r};
+
+n 16;
+
+vertices
+(
+ (-$b -$b 0) // 0
+ ( $b -$b 0) // 1
+ (-$a -$a 0) // 2
+ ( $a -$a 0) // 3
+ (-$a $a 0) // 4
+ ( $a $a 0) // 5
+ (-$b $b 0) // 6
+ ( $b $b 0) // 7
+
+ (-$b -$b 1) // 8
+ ( $b -$b 1) // 9
+ (-$a -$a 1) // 10
+ ( $a -$a 1) // 11
+ (-$a $a 1) // 12
+ ( $a $a 1) // 13
+ (-$b $b 1) // 14
+ ( $b $b 1) // 15
+);
+
+blocks
+(
+ hex (0 1 3 2 8 9 11 10) ($n $n 1) simpleGrading (1 1 1)
+ hex (1 7 5 3 9 15 13 11) ($n $n 1) simpleGrading (1 1 1)
+ hex (7 6 4 5 15 14 12 13) ($n $n 1) simpleGrading (1 1 1)
+ hex (6 0 2 4 14 8 10 12) ($n $n 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+ arc 2 3 origin (0 0 0)
+ arc 3 5 origin (0 0 0)
+ arc 5 4 origin (0 0 0)
+ arc 4 2 origin (0 0 0)
+
+ arc 10 11 origin (0 0 1)
+ arc 11 13 origin (0 0 1)
+ arc 13 12 origin (0 0 1)
+ arc 12 10 origin (0 0 1)
+);
+
+boundary
+(
+ walls
+ {
+ type wall;
+ faces
+ (
+ (0 2)
+ (2 2)
+ );
+ }
+ cylinder
+ {
+ type wall;
+ faces
+ (
+ (0 3)
+ (1 3)
+ (2 3)
+ (3 3)
+ );
+ }
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (1 2)
+ );
+ }
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (3 2)
+ );
+ }
+);
+
+defaultPatch
+{
+ type empty;
+ name frontAndBack;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/system/controlDict b/run/meshMotion/cylinderMotion/cylinder/system/controlDict
new file mode 100644
index 0000000..7d1a97f
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/system/controlDict
@@ -0,0 +1,60 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application moveDynamicMesh;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 1;
+
+deltaT 1e-01;
+
+//writeControl adjustable;
+//writeInterval 0.05;
+
+writeControl timeStep;
+writeInterval 1;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable yes;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+maxDeltaT 0.1;
+
+DebugSwitches
+{
+ displacementLaplacian 1;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/system/decomposeParDict b/run/meshMotion/cylinderMotion/cylinder/system/decomposeParDict
new file mode 100644
index 0000000..798c95c
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n ( 2 2 1 );
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/system/fvSchemes b/run/meshMotion/cylinderMotion/cylinder/system/fvSchemes
new file mode 100644
index 0000000..d6d082d
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/system/fvSchemes
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss upwind;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinder/system/fvSolution b/run/meshMotion/cylinderMotion/cylinder/system/fvSolution
new file mode 100644
index 0000000..0c3e16b
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinder/system/fvSolution
@@ -0,0 +1,79 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ p
+ {
+ solver PBiCGStab;
+ tolerance 0;
+ relTol 0.1;
+ smoother GaussSeidel;
+ preconditioner DIC;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ U
+ {
+ solver smoothSolver;
+ smoother GaussSeidel;
+ tolerance 1e-05;
+ relTol 0.01;
+ }
+
+ UFinal
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ cacheAgglomeration true;
+ nCellsInCoarsestLevel 10;
+ agglomerator faceAreaPair;
+ mergeLevels 1;
+ }
+
+ cellDisplacementFinal
+ {
+ $cellDisplacement;
+ tolerance 1e-06;
+ relTol 0;
+ }
+}
+
+PIMPLE
+{
+ momentumPredictor yes;
+ nOuterCorrectors 1;
+ nCorrectors 2;
+ nNonOrthogonalCorrectors 0;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/manifest.json b/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..93a2ded
--- /dev/null
+++ b/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/manifest.json
@@ -0,0 +1,92 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "cylinderMotionExperiment",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "37755ce",
+ "timestamp": 1761598029919685939,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/cylinderMotionExperiment/37755ce/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/cylinderMotionExperiment/37755ce/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/cylinderMotionExperiment/37755ce/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "2713",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "566a318",
+ "timestamp": 1761598030553112680,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/of_model",
+ "exe_args": [
+ "-case",
+ "cylinder",
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/moveDynamicMesh"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "np": "4"
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": []
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/cylinderMotionExperiment/566a318/model/of_model",
+ "step_id": null,
+ "task_id": "2929",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/cylinderMotionExperiment/566a318/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/cylinderMotion/cylinderMotionExperiment/.smartsim/telemetry/cylinderMotionExperiment/566a318/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/Allclean b/run/meshMotion/wingMotion/Allclean
new file mode 100755
index 0000000..f483280
--- /dev/null
+++ b/run/meshMotion/wingMotion/Allclean
@@ -0,0 +1,14 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions
+#------------------------------------------------------------------------------
+
+rm -rf mesh-motion
+
+( cd wingMotion_snappyHexMesh && cleanCase && rm -rf constant )
+
+( cd wingMotion2D_simpleFoam && cleanCase0 )
+
+( cd wingMotion2D_pimpleFoam && cleanCase0 )
+
+#------------------------------------------------------------------------------
diff --git a/run/meshMotion/wingMotion/Allrun.LaplaceMeshMotion b/run/meshMotion/wingMotion/Allrun.LaplaceMeshMotion
new file mode 100755
index 0000000..1d50c28
--- /dev/null
+++ b/run/meshMotion/wingMotion/Allrun.LaplaceMeshMotion
@@ -0,0 +1,38 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+./Allclean
+
+./Allrun.pre
+
+rm -rf mesh-motion_Laplace
+
+echo Use the constant/dynamicMesh.laplace settings and run the solver locally
+(
+ cd wingMotion2D_pimpleFoam || exit
+
+ echo Set mesh motion settings to Laplace mesh motion
+ cp constant/dynamicMeshDict.LaplaceMeshMotion constant/dynamicMeshDict
+
+ runParallel $(getApplication)
+
+ cd ..
+
+ echo Copy data for comparison
+ cp -r wingMotion2D_pimpleFoam mesh-motion_Laplace
+
+ echo Reset mesh motion settings
+ git checkout wingMotion2D_pimpleFoam/constant/dynamicMeshDict
+
+ echo Create .foam file visualization in ParaView
+ touch mesh-motion_Laplace/laplace.foam
+
+ echo Generate mesh quality metrics
+ mpirun -np 4 checkMesh \
+ -case mesh-motion_Laplace \
+ -writeFields '(nonOrthoAngle skewness)' -parallel
+)
+
+#------------------------------------------------------------------------------
diff --git a/run/meshMotion/wingMotion/Allrun.MachineLearningMeshMotion b/run/meshMotion/wingMotion/Allrun.MachineLearningMeshMotion
new file mode 100755
index 0000000..7355dd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/Allrun.MachineLearningMeshMotion
@@ -0,0 +1,40 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+./Allclean
+
+./Allrun.pre
+
+echo Delete previous results mesh-motion_MachineLearning
+rm -rf mesh-motion_MachineLearning
+
+echo Use the constant/dynamicMesh.laplace settings and run the solver locally
+(
+ cd wingMotion2D_pimpleFoam || exit
+
+ echo Set mesh motion settings to MachineLearning mesh motion
+ cp constant/dynamicMeshDict.MachineLearningMeshMotion constant/dynamicMeshDict
+
+ cd ..
+
+ echo Run the SmartSim python script that implements the ML+CFD algorithm
+ python openfoam-smartsim-wingmotion.py
+
+ echo Copy data for comparison
+ cp -r mesh-motion mesh-motion_MachineLearning
+
+ echo Reset mesh motion settings
+ git checkout wingMotion2D_pimpleFoam/constant/dynamicMeshDict
+
+ echo Create .foam file for visualization in ParaView
+ touch mesh-motion_MachineLearning/of_model/machine-learning.foam
+
+ echo Generating mesh quality metrics
+ mpirun -np 4 checkMesh \
+ -case mesh-motion_MachineLearning/of_model \
+ -writeFields '(nonOrthoAngle skewness)' -parallel
+)
+
+#------------------------------------------------------------------------------
diff --git a/run/meshMotion/wingMotion/Allrun.PinnMeshMotion b/run/meshMotion/wingMotion/Allrun.PinnMeshMotion
new file mode 100755
index 0000000..ed0218d
--- /dev/null
+++ b/run/meshMotion/wingMotion/Allrun.PinnMeshMotion
@@ -0,0 +1,40 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+./Allclean
+
+./Allrun.pre
+
+echo Delete previous results mesh-motion_Pinn
+rm -rf mesh-motion_Pinn
+
+echo Use the constant/dynamicMesh.laplace settings and run the solver locally
+(
+ cd wingMotion2D_pimpleFoam || exit
+
+ echo Set mesh motion settings to Pinn mesh motion
+ cp constant/dynamicMeshDict.PinnMeshMotion constant/dynamicMeshDict
+
+ cd ..
+
+ echo Run the SmartSim python script that implements the Pinn+CFD algorithm
+ python openfoam-smartsim-wingmotion_pinn.py
+
+ echo Copy data for comparison
+ cp -r mesh-motion mesh-motion_Pinn
+
+ echo Reset mesh motion settings
+ git checkout wingMotion2D_pimpleFoam/constant/dynamicMeshDict
+
+ echo Create .foam file for visualization in ParaView
+ touch mesh-motion_Pinn/of_model/pinn.foam
+
+ echo Generating mesh quality metrics
+ mpirun -np 4 checkMesh \
+ -case mesh-motion_Pinn/of_model \
+ -writeFields '(nonOrthoAngle skewness)' -parallel
+)
+
+#------------------------------------------------------------------------------
diff --git a/run/meshMotion/wingMotion/Allrun.pre b/run/meshMotion/wingMotion/Allrun.pre
new file mode 100755
index 0000000..fb3f919
--- /dev/null
+++ b/run/meshMotion/wingMotion/Allrun.pre
@@ -0,0 +1,53 @@
+#!/bin/sh
+cd "${0%/*}" || exit # Run from this directory
+. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
+#------------------------------------------------------------------------------
+
+echo Make 3D mesh in slab of cells.
+(
+ cd wingMotion_snappyHexMesh || exit
+
+ mkdir -p constant/triSurface
+
+ cp -rf \
+ "$FOAM_TUTORIALS"/resources/geometry/wing_5degrees.obj.gz \
+ constant/triSurface/
+
+ runApplication blockMesh
+
+ runApplication snappyHexMesh -overwrite
+)
+
+echo Make a 2D mesh by extruding a patch and solve to steady state.
+(
+ cd wingMotion2D_simpleFoam || exit
+
+ runApplication extrudeMesh
+
+ runApplication createPatch -overwrite
+
+ restore0Dir
+
+ runApplication simpleFoam
+)
+
+echo Copy mesh from the steady state case, map the results to a mesh motion case, then solve transient.
+(
+ cd wingMotion2D_pimpleFoam || exit
+
+ rm -rf constant/polyMesh
+
+ cp -rf \
+ ../wingMotion2D_simpleFoam/constant/polyMesh \
+ constant
+
+ restore0Dir
+
+ runApplication mapFields ../wingMotion2D_simpleFoam -sourceTime latestTime -consistent
+
+ mv -f 0/pointDisplacement.unmapped 0/pointDisplacement
+
+ runApplication decomposePar
+)
+
+#------------------------------------------------------------------------------
diff --git a/run/meshMotion/wingMotion/README.md b/run/meshMotion/wingMotion/README.md
new file mode 100644
index 0000000..78b4008
--- /dev/null
+++ b/run/meshMotion/wingMotion/README.md
@@ -0,0 +1,31 @@
+# Running
+
+The 2D wing is rapidly translated and rotated, causing significant mesh deformation. The deformation is implemented as
+
+1. Laplace deformation available in OpenFOAM
+2. MLP Machine-Learning deformation, combining Pytorch and OpenFOAM via SmartSim/SmartRedis.
+
+To run Laplace deformation make sure SmartSim env and OpenFOAM env are sourced, then
+
+```
+wingMotion> ./Allrun.LaplaceMeshMotion
+```
+
+this creates `mesh-motion_Laplace` - a folder that is an OpenFOAM simulation, for Laplace deformation, we don't need SmartSim/SmartRedis.
+
+Tor run the SmartSim MLP mesh deformation, run
+
+```
+wingMotion> ./Allrun.MachineLearningMeshMotion
+```
+
+which creates `mesh-motion_MachineLearning`, which has sub-folders for the SmartSim orchestrator, for the openfoam model (`of_model`, OpenFOAM simulation case), and the MLP training script (`training_app`).
+
+
+Both `Allrun.LaplaceMeshMotion` and `Allrun.MachineLearningMeshMotion` will compute mesh quality metrics (most important ones are non-orthogonality and skewness), and `.foam` files that ParaView needs to recognize OpenFOAM folders. A paraview state file is prepared that compares the decrease in non-orthogonality, visualizing the difference between Laplace non-orthogonality and MLP non-orthogonality, run it as
+
+```
+wingMotion> paraview --state=diff.pvsm
+```
+
+This will show how the Laplace causes an increase of non-orthogonality at the worst possible place - next to the airfoil. The increase is up to 35 degrees, w.r.t a simple MLP.
diff --git a/run/meshMotion/wingMotion/adam_lbfgs.py b/run/meshMotion/wingMotion/adam_lbfgs.py
new file mode 100644
index 0000000..aca334f
--- /dev/null
+++ b/run/meshMotion/wingMotion/adam_lbfgs.py
@@ -0,0 +1,27 @@
+from torch.optim import Adam, LBFGS, Optimizer
+
+class Adam_LBFGS(Optimizer):
+ def __init__(self, params, switch_epochs, adam_params, lbfgs_params):
+ # defaults = dict(switch_epoch=switch_epoch, adam_params=adam_params, lbfgs_params=lbfgs_params)
+
+ self.switch_epochs = sorted(switch_epochs)
+ self.params = list(params)
+ self.adam = Adam(self.params, **adam_params)
+ self.lbfgs_params = lbfgs_params
+ # self.lbfgs = LBFGS(self.params, **lbfgs_params)
+
+ super(Adam_LBFGS, self).__init__(self.params, defaults={})
+
+ self.state['epoch'] = 0
+
+ def step(self, closure=None):
+ if self.state['epoch'] < self.switch_epochs[0]:
+ self.adam.step(closure)
+ else:
+ # (Re)start LBFGS optimizer
+ if self.state['epoch'] in self.switch_epochs:
+ print(f'Starting LBFGS optimizer at epoch {self.state["epoch"]}')
+ self.lbfgs = LBFGS(self.params, **self.lbfgs_params)
+ self.lbfgs.step(closure)
+
+ self.state['epoch'] += 1
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/annealing_scheduler.py b/run/meshMotion/wingMotion/annealing_scheduler.py
new file mode 100644
index 0000000..74f5e1e
--- /dev/null
+++ b/run/meshMotion/wingMotion/annealing_scheduler.py
@@ -0,0 +1,13 @@
+import numpy as np
+
+def annealing_weight(epoch, T_start, T_end, sharpness=10):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # 标准化到 [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+ # S 型函数,中心点在 0.5
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5))))
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/config/ml_diff.pvsm b/run/meshMotion/wingMotion/config/ml_diff.pvsm
new file mode 100644
index 0000000..0bb31b1
--- /dev/null
+++ b/run/meshMotion/wingMotion/config/ml_diff.pvsm
@@ -0,0 +1,13141 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/run/meshMotion/wingMotion/config/pinn_diff.pvsm b/run/meshMotion/wingMotion/config/pinn_diff.pvsm
new file mode 100644
index 0000000..5b6f722
--- /dev/null
+++ b/run/meshMotion/wingMotion/config/pinn_diff.pvsm
@@ -0,0 +1,12725 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/run/meshMotion/wingMotion/diff.pvsm b/run/meshMotion/wingMotion/diff.pvsm
new file mode 100644
index 0000000..a36fa4b
--- /dev/null
+++ b/run/meshMotion/wingMotion/diff.pvsm
@@ -0,0 +1,22746 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/run/meshMotion/wingMotion/diff_Pinn-ML.png b/run/meshMotion/wingMotion/diff_Pinn-ML.png
new file mode 100644
index 0000000..5b0b8bb
Binary files /dev/null and b/run/meshMotion/wingMotion/diff_Pinn-ML.png differ
diff --git a/run/meshMotion/wingMotion/diff_pinn-laplace_histogram.png b/run/meshMotion/wingMotion/diff_pinn-laplace_histogram.png
new file mode 100644
index 0000000..8e6e10b
Binary files /dev/null and b/run/meshMotion/wingMotion/diff_pinn-laplace_histogram.png differ
diff --git a/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..2b576d6
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "3a20faf",
+ "timestamp": 1763131824571748748,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "17744",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "f94ddb1",
+ "timestamp": 1763131824816057662,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model",
+ "step_id": null,
+ "task_id": "17938",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "9bf91a5",
+ "timestamp": 1763131825020185598,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app",
+ "step_id": null,
+ "task_id": "17970",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..d24ec34
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763131814691,
+ "job_id": 17744,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 17744 started child process 17811"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..fcec659
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763140806080,
+ "job_id": 17744,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 17811 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/start.json
new file mode 100644
index 0000000..566aa49
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763131825020185598,
+ "job_id": 17970,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/stop.json
new file mode 100644
index 0000000..8ecc7fc
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763140802863,
+ "job_id": 17970,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 18020 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/start.json
new file mode 100644
index 0000000..7636598
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763131824816057662,
+ "job_id": 17938,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/stop.json
new file mode 100644
index 0000000..8ea9154
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763140799784,
+ "job_id": 17938,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 18004 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion/smartsim_params.txt
new file mode 100644
index 0000000..2f1ce94
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 14/11/2025 15:50:24
diff --git a/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..fd46157
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,323 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 10000
+ # Annealing schedule parameters
+ T_start = 50
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/laplace.foam b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/laplace.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Laplace_medium/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..1f40786
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "0371b04",
+ "timestamp": 1763118342179572267,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/0371b04/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/0371b04/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/0371b04/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "18537",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "76887b3",
+ "timestamp": 1763118342408733761,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/76887b3/model/of_model",
+ "step_id": null,
+ "task_id": "18737",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/76887b3/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/76887b3/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "ced73c9",
+ "timestamp": 1763118342613484260,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app",
+ "step_id": null,
+ "task_id": "18775",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app/start.json
new file mode 100644
index 0000000..b72a8fb
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763118342613484260,
+ "job_id": 18775,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app/stop.json
new file mode 100644
index 0000000..76a8443
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/.smartsim/telemetry/mesh-motion/ced73c9/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763118448352,
+ "job_id": 18775,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 18819 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/machine-learning.foam b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/machine-learning.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/smartsim_params.txt
new file mode 100644
index 0000000..a31d099
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 14/11/2025 12:05:42
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning/training_app/mesh_trainer.py b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/training_app/mesh_trainer.py
new file mode 100644
index 0000000..be1a601
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning/training_app/mesh_trainer.py
@@ -0,0 +1,276 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-2,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ )
+ # Backward pass and optimization
+ data_loss.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..349d112
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "096bb6e",
+ "timestamp": 1763055304218613622,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/096bb6e/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/096bb6e/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/096bb6e/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "22056",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "02e61f6",
+ "timestamp": 1763055304457500388,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/02e61f6/model/of_model",
+ "step_id": null,
+ "task_id": "22239",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/02e61f6/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/02e61f6/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "fb8a9d9",
+ "timestamp": 1763055304661730969,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app",
+ "step_id": null,
+ "task_id": "22271",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app/start.json
new file mode 100644
index 0000000..5d177b5
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763055304661730969,
+ "job_id": 22271,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app/stop.json
new file mode 100644
index 0000000..28420da
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/.smartsim/telemetry/mesh-motion/fb8a9d9/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763055452495,
+ "job_id": 22271,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 22315 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/machine-learning.foam b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/machine-learning.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/smartsim_params.txt
new file mode 100644
index 0000000..7901d37
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 13/11/2025 18:35:04
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/training_app/mesh_trainer.py b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/training_app/mesh_trainer.py
new file mode 100644
index 0000000..4ba54f3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_1/training_app/mesh_trainer.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..58ad300
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "bbcb8be",
+ "timestamp": 1761742540866367801,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/bbcb8be/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/bbcb8be/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/bbcb8be/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "11838",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "ad88d44",
+ "timestamp": 1761742541105643650,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model",
+ "step_id": null,
+ "task_id": "12065",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "64a87f3",
+ "timestamp": 1761742541309886268,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/64a87f3/model/training_app",
+ "step_id": null,
+ "task_id": "12110",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/64a87f3/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/64a87f3/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model/start.json
new file mode 100644
index 0000000..072527c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761742541105643650,
+ "job_id": 12065,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model/stop.json
new file mode 100644
index 0000000..ccbe128
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/ad88d44/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761742772294,
+ "job_id": 12065,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 12144 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/bbcb8be/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/bbcb8be/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..1c53873
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/.smartsim/telemetry/mesh-motion/bbcb8be/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761742531041,
+ "job_id": 11838,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 11838 started child process 11905"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/machine-learning.foam b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/machine-learning.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/smartsim_params.txt
new file mode 100644
index 0000000..0d92f6c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 29/10/2025 13:55:40
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/training_app/mesh_trainer.py b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/training_app/mesh_trainer.py
new file mode 100644
index 0000000..bbf3e8e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_2/training_app/mesh_trainer.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..4bed46f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "cd99d5b",
+ "timestamp": 1761512338556104783,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "20652",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "e776498",
+ "timestamp": 1761512338799254633,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e776498/model/of_model",
+ "step_id": null,
+ "task_id": "20844",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e776498/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e776498/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "d046f5f",
+ "timestamp": 1761512339003715175,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app",
+ "step_id": null,
+ "task_id": "20876",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..30464fc
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761512328713,
+ "job_id": 20652,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 20652 started child process 20724"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..d3527cb
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/cd99d5b/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761513741328,
+ "job_id": 20652,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 20724 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app/start.json
new file mode 100644
index 0000000..aa1199c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761512339003715175,
+ "job_id": 20876,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app/stop.json
new file mode 100644
index 0000000..40be843
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/d046f5f/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761513736143,
+ "job_id": 20876,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 20920 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/e776498/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/e776498/model/of_model/start.json
new file mode 100644
index 0000000..72bb116
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/e776498/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761512338799254633,
+ "job_id": 20844,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/e776498/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/e776498/model/of_model/stop.json
new file mode 100644
index 0000000..37e4dd3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/.smartsim/telemetry/mesh-motion/e776498/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761513734554,
+ "job_id": 20844,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 20910 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/machine-learning.foam b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/machine-learning.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/smartsim_params.txt
new file mode 100644
index 0000000..0855f9f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 26/10/2025 21:58:58
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/training_app/mesh_trainer.py b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/training_app/mesh_trainer.py
new file mode 100644
index 0000000..16da6ee
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_Tanh/training_app/mesh_trainer.py
@@ -0,0 +1,198 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 1000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {loss_train.item()}, "
+ )
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..cff9f24
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "61dc57f",
+ "timestamp": 1763057354000304929,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/61dc57f/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/61dc57f/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/61dc57f/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "10128",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "2d83c38",
+ "timestamp": 1763057354227910826,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model",
+ "step_id": null,
+ "task_id": "10323",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "b78dd3e",
+ "timestamp": 1763057354431653996,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app",
+ "step_id": null,
+ "task_id": "10355",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model/start.json
new file mode 100644
index 0000000..507927b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763057354227910826,
+ "job_id": 10323,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model/stop.json
new file mode 100644
index 0000000..b00b740
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/2d83c38/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763057435193,
+ "job_id": 10323,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 10389 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app/start.json
new file mode 100644
index 0000000..19e6fa9
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763057354431653996,
+ "job_id": 10355,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app/stop.json
new file mode 100644
index 0000000..efc2d1c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/.smartsim/telemetry/mesh-motion/b78dd3e/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763057435728,
+ "job_id": 10355,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 10407 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/machine-learning.foam b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/machine-learning.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/smartsim_params.txt
new file mode 100644
index 0000000..9e92064
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 13/11/2025 19:09:14
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/training_app/mesh_trainer.py b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/training_app/mesh_trainer.py
new file mode 100644
index 0000000..4ba54f3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_coarse/training_app/mesh_trainer.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..d60d529
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "6ee7504",
+ "timestamp": 1763056966527212646,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "4279",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "9710a3c",
+ "timestamp": 1763056966775470464,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9710a3c/model/of_model",
+ "step_id": null,
+ "task_id": "4472",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9710a3c/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9710a3c/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "525e789",
+ "timestamp": 1763056966979378837,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/525e789/model/training_app",
+ "step_id": null,
+ "task_id": "4504",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/525e789/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/525e789/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..eebc0e3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763056956683,
+ "job_id": 4279,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 4279 started child process 4354"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..9eda3d3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/.smartsim/telemetry/mesh-motion/6ee7504/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763057232538,
+ "job_id": 4279,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 4354 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/machine-learning.foam b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/machine-learning.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/smartsim_params.txt
new file mode 100644
index 0000000..96e66f2
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 13/11/2025 19:02:46
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/training_app/mesh_trainer.py b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/training_app/mesh_trainer.py
new file mode 100644
index 0000000..4ba54f3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_fine/training_app/mesh_trainer.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..061b80d
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "ad89aaa",
+ "timestamp": 1763056320332703324,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "28276",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "5774451",
+ "timestamp": 1763056320573229347,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/5774451/model/of_model",
+ "step_id": null,
+ "task_id": "28462",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/5774451/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/5774451/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "2ab04b6",
+ "timestamp": 1763056320777003702,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app",
+ "step_id": null,
+ "task_id": "28494",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app/start.json
new file mode 100644
index 0000000..d162a5b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763056320777003702,
+ "job_id": 28494,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app/stop.json
new file mode 100644
index 0000000..3b5ae5d
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/2ab04b6/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763056505930,
+ "job_id": 28494,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 28534 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..697edb5
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763056310484,
+ "job_id": 28276,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 28276 started child process 28343"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..238d2ec
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/.smartsim/telemetry/mesh-motion/ad89aaa/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763056511283,
+ "job_id": 28276,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 28343 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/machine-learning.foam b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/machine-learning.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/smartsim_params.txt
new file mode 100644
index 0000000..0693be4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 13/11/2025 18:52:00
diff --git a/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/training_app/mesh_trainer.py b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/training_app/mesh_trainer.py
new file mode 100644
index 0000000..4ba54f3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_MachineLearning_medium/training_app/mesh_trainer.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..0a4a9ce
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "8dea09f",
+ "timestamp": 1761692634600104608,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "14646",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "6511d64",
+ "timestamp": 1761692634836153568,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/6511d64/model/of_model",
+ "step_id": null,
+ "task_id": "14849",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/6511d64/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/6511d64/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "9e4f13b",
+ "timestamp": 1761692635040435158,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app",
+ "step_id": null,
+ "task_id": "14881",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..2a12101
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761692624714,
+ "job_id": 14646,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 14646 started child process 14724"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..f100973
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/8dea09f/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761704459730,
+ "job_id": 14646,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 14724 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app/start.json
new file mode 100644
index 0000000..a920269
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761692635040435158,
+ "job_id": 14881,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app/stop.json
new file mode 100644
index 0000000..e1b42dc
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/.smartsim/telemetry/mesh-motion/9e4f13b/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761704452746,
+ "job_id": 14881,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 14933 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/pinn.foam b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/pinn.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/smartsim_params.txt
new file mode 100644
index 0000000..7dc3baf
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 29/10/2025 00:03:54
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_2/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..016e553
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_2/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 5000
+ # Annealing schedule parameters
+ T_start = 0
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..642a914
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "ae58b5a",
+ "timestamp": 1761513936816320025,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "8878",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "61276d8",
+ "timestamp": 1761513937058249685,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/61276d8/model/of_model",
+ "step_id": null,
+ "task_id": "9064",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/61276d8/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/61276d8/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "e4e70a5",
+ "timestamp": 1761513937263794796,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app",
+ "step_id": null,
+ "task_id": "9096",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..4720132
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761513926976,
+ "job_id": 8878,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 8878 started child process 8954"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..1d8485b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/ae58b5a/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761517873372,
+ "job_id": 8878,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 8954 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app/start.json
new file mode 100644
index 0000000..aad3fb2
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761513937263794796,
+ "job_id": 9096,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app/stop.json
new file mode 100644
index 0000000..33e1a97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/.smartsim/telemetry/mesh-motion/e4e70a5/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761517866791,
+ "job_id": 9096,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 9140 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/pinn.foam b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/pinn.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/smartsim_params.txt
new file mode 100644
index 0000000..84b9f5a
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 26/10/2025 22:25:36
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_4/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..0fe7b3e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_4/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,324 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=10):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # 标准化到 [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+ # S 型函数,中心点在 0.5
+ return float(1 / ((1 + np.exp(-sharpness * (x - 0.5))) * 10))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ T_start: int = 0,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._T_start = T_start
+ self._epoch = 0
+ self._max_epochs = max_epochs
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ self._epoch += 1
+
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ if self._epoch > self._T_start:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+ print(f"epoch: {self._epoch}")
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=1e-3,
+ model=model,
+ T_start=200
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 2000
+ n_epochs = 0
+ rmse_loss_val = 1
+ T_start = 0.1 * epochs
+ T_end = epochs
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..86b467c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "9edbddf",
+ "timestamp": 1761568812018785328,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9edbddf/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9edbddf/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9edbddf/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "4378",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "3e2798c",
+ "timestamp": 1761568812270504636,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model",
+ "step_id": null,
+ "task_id": "4564",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "daf1714",
+ "timestamp": 1761568812475530431,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/daf1714/model/training_app",
+ "step_id": null,
+ "task_id": "4596",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/daf1714/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/daf1714/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model/start.json
new file mode 100644
index 0000000..5b13963
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761568812270504636,
+ "job_id": 4564,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model/stop.json
new file mode 100644
index 0000000..fe437f5
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/3e2798c/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761570887364,
+ "job_id": 4564,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 4630 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/9edbddf/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/9edbddf/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..3c28641
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/9edbddf/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761568802151,
+ "job_id": 4378,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 4378 started child process 4445"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/daf1714/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/daf1714/model/training_app/start.json
new file mode 100644
index 0000000..432e000
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/daf1714/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761568812475530431,
+ "job_id": 4596,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/daf1714/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/daf1714/model/training_app/stop.json
new file mode 100644
index 0000000..0822370
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/.smartsim/telemetry/mesh-motion/daf1714/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761570890238,
+ "job_id": 4596,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 4640 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/pinn.foam b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/pinn.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/smartsim_params.txt
new file mode 100644
index 0000000..fa7d91b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 27/10/2025 13:40:12
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_5/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..1f5b499
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_5/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,331 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0 # epochs to start checking for early stopping
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+ epochs = 5000
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+ epochs = early_stopper._max_epochs
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = max(0.0001, 0.001 * epoch / epochs + 0.0001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..9e71d98
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "cb2289d",
+ "timestamp": 1761580754723787284,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "21163",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "9a583c3",
+ "timestamp": 1761580754963769537,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model",
+ "step_id": null,
+ "task_id": "21357",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "8c97f1a",
+ "timestamp": 1761580755167810653,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app",
+ "step_id": null,
+ "task_id": "21389",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app/start.json
new file mode 100644
index 0000000..e4041f8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761580755167810653,
+ "job_id": 21389,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app/stop.json
new file mode 100644
index 0000000..114df0a
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/8c97f1a/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761585867447,
+ "job_id": 21389,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 21433 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model/start.json
new file mode 100644
index 0000000..70de492
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761580754963769537,
+ "job_id": 21357,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model/stop.json
new file mode 100644
index 0000000..9f78404
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/9a583c3/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761585863885,
+ "job_id": 21357,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 21423 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..d91c476
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761580744880,
+ "job_id": 21163,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 21163 started child process 21230"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..f52aaf7
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/.smartsim/telemetry/mesh-motion/cb2289d/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761585873602,
+ "job_id": 21163,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 21230 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/pinn.foam b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/pinn.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/smartsim_params.txt
new file mode 100644
index 0000000..a5e2edc
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 27/10/2025 16:59:14
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_6/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..0738006
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_6/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=10):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 100))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 2000
+ # Annealing schedule parameters
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=200,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..097772b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "4bb49d8",
+ "timestamp": 1761665063648359068,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/4bb49d8/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/4bb49d8/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/4bb49d8/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "9229",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "1bc0975",
+ "timestamp": 1761665063881948551,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model",
+ "step_id": null,
+ "task_id": "9415",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "e58215d",
+ "timestamp": 1761665064086101871,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e58215d/model/training_app",
+ "step_id": null,
+ "task_id": "9447",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e58215d/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/e58215d/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model/start.json
new file mode 100644
index 0000000..95829ca
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761665063881948551,
+ "job_id": 9415,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model/stop.json
new file mode 100644
index 0000000..b1806ae
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/1bc0975/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761667566111,
+ "job_id": 9415,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 9481 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/4bb49d8/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/4bb49d8/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..033ba7d
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/4bb49d8/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761665053811,
+ "job_id": 9229,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 9229 started child process 9299"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/e58215d/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/e58215d/model/training_app/start.json
new file mode 100644
index 0000000..76e6631
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/e58215d/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761665064086101871,
+ "job_id": 9447,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/e58215d/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/e58215d/model/training_app/stop.json
new file mode 100644
index 0000000..b44370a
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/.smartsim/telemetry/mesh-motion/e58215d/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761667568769,
+ "job_id": 9447,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 9485 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/pinn.foam b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/pinn.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/smartsim_params.txt
new file mode 100644
index 0000000..68b3e35
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 28/10/2025 16:24:23
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_7/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..1fac9ab
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_7/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,328 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # calculate strain components
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=1e-3,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 5000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = max(0.0001, 0.001 * epoch / epochs + 0.0001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # if epoch % 1000 == 0 or epoch == epochs - 1:
+ # print(f"[Epoch {epoch}]")
+ # print(f" Data Loss : {data_loss.item():.6e}")
+ # print(f" PINN Loss : {p_loss.item():.6e}")
+ # print(f" Physics Weight : {physics_weight:.4f}")
+ # print(f" Data Weight : {data_weight:.4f}")
+ # print(f" Validation RMSE: {rmse_loss_val:.6e}")
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..35bef40
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "22da623",
+ "timestamp": 1761686535180762095,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/22da623/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/22da623/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/22da623/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "32219",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "64fb096",
+ "timestamp": 1761686535418371977,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/64fb096/model/of_model",
+ "step_id": null,
+ "task_id": "32464",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/64fb096/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/64fb096/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "aa7a47f",
+ "timestamp": 1761686535623127408,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app",
+ "step_id": null,
+ "task_id": "32496",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app/start.json
new file mode 100644
index 0000000..a958163
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1761686535623127408,
+ "job_id": 32496,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app/stop.json
new file mode 100644
index 0000000..74094f6
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/.smartsim/telemetry/mesh-motion/aa7a47f/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1761688466127,
+ "job_id": 32496,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 32540 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/pinn.foam b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/pinn.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/smartsim_params.txt
new file mode 100644
index 0000000..cb1215f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 28/10/2025 22:22:15
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_8/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..15ed5e3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_8/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 5000
+ # Annealing schedule parameters
+ T_start = 0
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..de0f381
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "cd6ee3b",
+ "timestamp": 1763130515631499417,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "3899",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "0b8cf26",
+ "timestamp": 1763130515858262211,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model",
+ "step_id": null,
+ "task_id": "4109",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "84b680b",
+ "timestamp": 1763130516062307497,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/84b680b/model/training_app",
+ "step_id": null,
+ "task_id": "4148",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/84b680b/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/84b680b/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model/start.json
new file mode 100644
index 0000000..3c623cc
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763130515858262211,
+ "job_id": 4109,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model/stop.json
new file mode 100644
index 0000000..1c9c5ae
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/0b8cf26/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763131123073,
+ "job_id": 4109,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 4182 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..fc99f06
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763130505768,
+ "job_id": 3899,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 3899 started child process 3976"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..5210f90
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/.smartsim/telemetry/mesh-motion/cd6ee3b/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763131126980,
+ "job_id": 3899,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 3976 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/pinn.foam b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/pinn.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/smartsim_params.txt
new file mode 100644
index 0000000..6fd34e0
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 14/11/2025 15:28:35
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..7e5c679
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_coarse/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,325 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 5000
+ # Annealing schedule parameters
+ T_start = 0
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/manifest.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/manifest.json
new file mode 100644
index 0000000..2b576d6
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/manifest.json
@@ -0,0 +1,133 @@
+{
+ "schema info": {
+ "schema_name": "entity manifest",
+ "version": "0.0.4"
+ },
+ "experiment": {
+ "name": "mesh-motion",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion",
+ "launcher": "Local",
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/logs/smartsim.err"
+ },
+ "runs": [
+ {
+ "run_id": "3a20faf",
+ "timestamp": 1763131824571748748,
+ "model": [],
+ "orchestrator": [
+ {
+ "name": "orchestrator",
+ "type": "redis",
+ "interface": [
+ "lo"
+ ],
+ "shards": [
+ {
+ "name": "orchestrator_0",
+ "hostname": "127.0.0.1",
+ "port": 8000,
+ "cluster": false,
+ "conf_file": null,
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/orchestrator_0.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/orchestrator_0.err",
+ "memory_file": "",
+ "client_file": "",
+ "client_count_file": "",
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0",
+ "step_id": null,
+ "task_id": "17744",
+ "managed": false
+ }
+ }
+ ]
+ }
+ ],
+ "ensemble": []
+ },
+ {
+ "run_id": "f94ddb1",
+ "timestamp": 1763131824816057662,
+ "model": [
+ {
+ "name": "of_model",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/of_model",
+ "exe_args": [
+ "-parallel"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/OpenFOAM/OpenFOAM-v2412/platforms/linux64GccDPInt32Opt/bin/pimpleFoam"
+ ],
+ "run_command": "/usr/bin/mpirun",
+ "run_args": {
+ "n": 4
+ }
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model",
+ "step_id": null,
+ "task_id": "17938",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/of_model.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/of_model.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ },
+ {
+ "run_id": "9bf91a5",
+ "timestamp": 1763131825020185598,
+ "model": [
+ {
+ "name": "training_app",
+ "path": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/training_app",
+ "exe_args": [
+ "mesh_trainer_pinn.py",
+ "4"
+ ],
+ "run_settings": {
+ "exe": [
+ "/home/jin/miniconda3/envs/customMLP/bin/python"
+ ],
+ "run_command": null,
+ "run_args": {}
+ },
+ "batch_settings": {},
+ "params": {},
+ "files": {
+ "Symlink": [],
+ "Configure": [],
+ "Copy": [
+ "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh_trainer_pinn.py"
+ ]
+ },
+ "colocated_db": {},
+ "telemetry_metadata": {
+ "status_dir": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app",
+ "step_id": null,
+ "task_id": "17970",
+ "managed": false
+ },
+ "out_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/training_app.out",
+ "err_file": "/home/jin/OpenFOAM/openfoam-smartsim/run/meshMotion/wingMotion/mesh-motion/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/training_app.err"
+ }
+ ],
+ "orchestrator": [],
+ "ensemble": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/start.json
new file mode 100644
index 0000000..d24ec34
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763131814691,
+ "job_id": 17744,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "start",
+ "detail": "Proxy process 17744 started child process 17811"
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/stop.json
new file mode 100644
index 0000000..fcec659
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/3a20faf/database/orchestrator/orchestrator_0/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763140806080,
+ "job_id": 17744,
+ "step_id": "",
+ "type": "dbnode",
+ "action": "stop",
+ "detail": "Process 17811 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/start.json
new file mode 100644
index 0000000..566aa49
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763131825020185598,
+ "job_id": 17970,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/stop.json
new file mode 100644
index 0000000..8ecc7fc
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/9bf91a5/model/training_app/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763140802863,
+ "job_id": 17970,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 18020 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/start.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/start.json
new file mode 100644
index 0000000..7636598
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/start.json
@@ -0,0 +1,8 @@
+{
+ "timestamp": 1763131824816057662,
+ "job_id": 17938,
+ "step_id": "",
+ "type": "model",
+ "action": "start",
+ "detail": ""
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/stop.json b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/stop.json
new file mode 100644
index 0000000..8ea9154
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/.smartsim/telemetry/mesh-motion/f94ddb1/model/of_model/stop.json
@@ -0,0 +1,9 @@
+{
+ "timestamp": 1763140799784,
+ "job_id": 17938,
+ "step_id": "",
+ "type": "model",
+ "action": "stop",
+ "detail": "Process 18004 finished with return code: 0",
+ "return_code": 0
+}
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/U b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/initialConditions b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/k b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/nut b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/omega b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/p b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/pointDisplacement b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/transportProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/turbulenceProperties b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/pinn.foam b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/pinn.foam
new file mode 100644
index 0000000..e69de29
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/controlDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/decomposeParDict b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/ensightWrite b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/fvSchemes b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/fvSolution b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/of_model/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/smartsim_params.txt b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/smartsim_params.txt
new file mode 100644
index 0000000..2f1ce94
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/smartsim_params.txt
@@ -0,0 +1 @@
+Generation start date and time: 14/11/2025 15:50:24
diff --git a/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/training_app/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/training_app/mesh_trainer_pinn.py
new file mode 100644
index 0000000..fd46157
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh-motion_Pinn_fine/training_app/mesh_trainer_pinn.py
@@ -0,0 +1,323 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 10000
+ # Annealing schedule parameters
+ T_start = 50
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh_trainer.py b/run/meshMotion/wingMotion/mesh_trainer.py
new file mode 100644
index 0000000..be1a601
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh_trainer.py
@@ -0,0 +1,276 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-2,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ )
+ # Backward pass and optimization
+ data_loss.backward()
+ optimizer.step()
+
+ # for epoch in range(epochs):
+ # # Define closure function for L-BFGS
+ # def closure():
+ # optimizer.zero_grad()
+
+ # # Forward pass on the training data
+ # displ_pred = model(points_train)
+
+ # # Compute loss on the training data with annealed weight
+ # data_loss = loss_func(displ_pred, displ_train)
+ # p_loss = pinn_loss(points_train, displ_pred)
+
+ # # Annealed weight: start with high physics weight, gradually decrease
+ # # Physics weight decreases from 1.0 to 0.01 over training
+ # physics_weight = max(0.01, 1.0 * (1.0 - epoch / epochs))
+ # data_weight = 1.0
+
+ # loss_train = data_weight * data_loss + physics_weight * p_loss
+ # loss_train.backward()
+ # return loss_train
+
+ # # L-BFGS optimization step
+ # optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh_trainer_old.py b/run/meshMotion/wingMotion/mesh_trainer_old.py
new file mode 100644
index 0000000..4ba54f3
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh_trainer_old.py
@@ -0,0 +1,193 @@
+import argparse
+from smartredis import Client
+import torch
+import torch.nn as nn
+import numpy as np
+import io
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+
+from sklearn.metrics import mean_squared_error
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.ReLU())
+
+ # Initialize the optimizer
+ learning_rate = 1e-03
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 100, 10000);
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))
+ validation_rmse = []
+ model.train()
+ epochs = 100000
+ n_epochs = 0
+ rmse_loss_val = 1
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data
+ loss_train = loss_func(displ_pred, displ_train)
+
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ validation_rmse.append(rmse_loss_val)
+ if (rmse_loss_val < 1e-04):
+ break
+
+ print (f"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}")
+ # Uncomment to visualize validation RMSE
+ # plt.loglog()
+ # plt.title("Validation loss RMSE")
+ # plt.xlabel("Epochs")
+ # plt.plot(validation_rmse)
+ # plt.show()
+
+ # Store the model into SmartRedis
+ model.eval() # TEST
+ # Prepare a sample input
+ example_forward_input = torch.rand(2)
+ # Convert the PyTorch model to TorchScript
+ model_script = torch.jit.trace(model, example_forward_input)
+ # Save the TorchScript model to a buffer
+ model_buffer = io.BytesIO()
+ torch.jit.save(model_script, model_buffer)
+ # Set the model in the SmartRedis database
+ print("Saving model MLP")
+ client.set_model("MLP", model_buffer.getvalue(), "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh_trainer_pinn.py b/run/meshMotion/wingMotion/mesh_trainer_pinn.py
new file mode 100644
index 0000000..fd46157
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh_trainer_pinn.py
@@ -0,0 +1,323 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+import matplotlib.pyplot as plt
+
+from sklearn.metrics import mean_squared_error
+
+def annealing_weight(epoch, T_start, T_end, sharpness=3):
+
+ if epoch < T_start:
+ return 0.0
+ else:
+ # set range [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+
+ return float(1 / (1 + np.exp(-sharpness * (x - 0.5)) * 1000))
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ epochs = 10000
+ # Annealing schedule parameters
+ T_start = 50
+ T_end = 0.5 * epochs
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), epoch):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
\ No newline at end of file
diff --git a/run/meshMotion/wingMotion/mesh_trainer_pinn__2.py b/run/meshMotion/wingMotion/mesh_trainer_pinn__2.py
new file mode 100644
index 0000000..4413310
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh_trainer_pinn__2.py
@@ -0,0 +1,307 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ max_epochs: int = 10000
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+ self._epoch = 0,
+ self._best_loss_epoch = 0
+ self._max_epochs = max_epochs
+ self._T_start = 0 # epochs to start checking for early stopping
+
+ def __call__(self, loss: float, epoch) -> bool:
+ """Check if training should stop."""
+ self._epoch = epoch
+ if self._epoch >= self._max_epochs:
+ self._stop = True
+ print(f"epoch: {self._epoch} reached max epochs.")
+ if self._epoch >= self._T_start:
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ self._best_loss_epoch = self._epoch
+ if self._model is not None:
+ self._save_model()
+ else:
+ self._counter += 1
+ if self._counter > self._patience:
+ self._stop = True
+
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._epoch = 0
+
+ def _save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # 计算应变
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ learning_rate = 1e-04
+ optimizer = optim.Adam(model.parameters(), lr=learning_rate)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+ epochs = 5000
+ early_stopper = EarlyStopping(
+ patience=50,
+ min_delta=1e-3,
+ model=model,
+ max_epochs=epochs
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ n_epochs = 0
+ rmse_loss_val = 1
+ epochs = early_stopper._max_epochs
+ for epoch in range(epochs):
+ # Zero the gradients
+ optimizer.zero_grad()
+
+ # Forward pass on the training data
+ displ_pred = model(points_train)
+
+ # Compute loss on the training data with annealed weight
+ data_loss = loss_func(displ_pred, displ_train)
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Annealed weight: start with high physics weight, gradually decrease
+ # Physics weight increase from 0.01 to 0.1 over training
+ physics_weight = max(0.0001, 0.001 * epoch / epochs + 0.0001)
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ # Backward pass and optimization
+ loss_train.backward()
+ optimizer.step()
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if early_stopper(rmse_loss_val.item(), n_epochs):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, the epochs of smallest loss: {early_stopper._best_loss_epoch}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/mesh_trainer_pinn_lbfgs.py b/run/meshMotion/wingMotion/mesh_trainer_pinn_lbfgs.py
new file mode 100644
index 0000000..a876bba
--- /dev/null
+++ b/run/meshMotion/wingMotion/mesh_trainer_pinn_lbfgs.py
@@ -0,0 +1,346 @@
+import argparse
+from smartredis import Client
+import torch as torch
+import torch.nn as nn
+import numpy as np
+import io
+from typing import Union
+from sklearn.model_selection import train_test_split
+import torch.optim as optim
+import matplotlib
+matplotlib.use('Agg')
+# from adam_lbfgs import Adam_LBFGS
+from torch.optim import Adam, LBFGS, Optimizer
+
+def annealing_weight(epoch, T_start, T_end, sharpness=10):
+
+ if epoch < T_start:
+ return 0.0
+ elif epoch > T_end:
+ return 1.0
+ else:
+ # 标准化到 [0,1]
+ x = (epoch - T_start) / (T_end - T_start)
+ # S 型函数,中心点在 0.5
+ return float(x)/10
+
+class Adam_LBFGS(Optimizer):
+ def __init__(self, params, switch_epochs, adam_params, lbfgs_params):
+ # defaults = dict(switch_epoch=switch_epoch, adam_params=adam_params, lbfgs_params=lbfgs_params)
+
+ self.switch_epochs = sorted(switch_epochs)
+ self.params = list(params)
+ self.adam = Adam(self.params, **adam_params)
+ self.lbfgs_params = lbfgs_params
+ # self.lbfgs = LBFGS(self.params, **lbfgs_params)
+
+ super(Adam_LBFGS, self).__init__(self.params, defaults={})
+
+ self.state['epoch'] = 0
+ def reset_epoch(self):
+ self.state['epoch'] = 0
+
+ def step(self, closure=None):
+ if self.state['epoch'] < self.switch_epochs[0]:
+ self.adam.step(closure)
+ else:
+ # (Re)start LBFGS optimizer
+ if self.state['epoch'] in self.switch_epochs:
+ print(f'Starting LBFGS optimizer at epoch {self.state["epoch"]}')
+ self.lbfgs = LBFGS(self.params, **self.lbfgs_params)
+ self.lbfgs.step(closure)
+ self.state['epoch'] += 1
+
+class EarlyStopping:
+ """Early stopping with absolute threshold and patience-based logic."""
+
+ def __init__(
+ self,
+ patience: int = 40,
+ min_delta: float = 1.0e-4,
+ model: Union[nn.Module, None] = None,
+ ):
+ self._patience = patience
+ self._min_delta = min_delta
+ self._model = model
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+ self._model_buffer = None
+ self._model_script = None
+
+ def __call__(self, loss: float) -> bool:
+ """Check if training should stop."""
+ if loss < self._best_loss * (1.0 - self._min_delta):
+ self._best_loss = loss
+ self._counter = 0
+ if self._model is not None:
+ self.save_model()
+
+ else:
+ self._counter += 1
+ if self._counter >= self._patience:
+ self._stop = True
+ return self._stop
+ def reset(self):
+ """Reset the early stopping state."""
+ self._model.train()
+ self._best_loss = float("inf")
+ self._counter = 0
+ self._stop = False
+
+ def save_model(self):
+ self._model.eval()
+ with io.BytesIO() as buffer:
+
+ if self._model_buffer:
+ self._model_buffer = None
+
+ # save the model in the buffer
+ example_forward_input = torch.rand(2).to(device)
+
+ # Convert the PyTorch model to TorchScript
+ if self._model_script is None:
+ self._model_script = torch.jit.trace(self._model, example_forward_input)
+ torch.jit.save(self._model_script, buffer)
+ self._model_buffer = buffer.getvalue()
+
+class MLP(nn.Module):
+ def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):
+ super(MLP, self).__init__()
+
+ layers = []
+ layers.append(nn.Linear(input_size, layer_width))
+ layers.append(activation_fn)
+
+ for _ in range(num_layers - 2):
+ layers.append(nn.Linear(layer_width, layer_width))
+ layers.append(activation_fn)
+
+ layers.append(nn.Linear(layer_width, output_size))
+ self.layers = nn.Sequential(*layers)
+
+ def forward(self, x):
+ return self.layers(x)
+
+def sort_tensors_by_names(tensors, tensor_names):
+ # Pair each tensor with its name and sort by the name
+ pairs = sorted(zip(tensor_names, tensors))
+
+ # Extract the sorted tensors
+ tensor_names_sorted, tensors_sorted = zip(*pairs)
+
+ # Convert back to list if needed
+ tensor_names_sorted = list(tensor_names_sorted)
+ tensors_sorted = list(tensors_sorted)
+
+ return tensors_sorted, tensor_names_sorted
+
+def pinn_loss(points, displ_pred):
+ """
+ points: [N, 2] tensor, input coordinates (x, y)
+ displ_pred: [N, 2] tensor, predicted displacements (u_x, u_y)
+ """
+ assert points.shape[1] == 2 and displ_pred.shape[1] == 2, "Expecting 2D input and displacement"
+
+ # 开启自动求导
+ points.requires_grad_(True)
+
+ u_x = displ_pred[:, 0:1]
+ u_y = displ_pred[:, 1:2]
+
+ ones = torch.ones_like(u_x)
+
+ # ∂u_x/∂x, ∂u_x/∂y
+ grad_u_x = torch.autograd.grad(u_x, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ dux_dx = grad_u_x[:, 0:1]
+ dux_dy = grad_u_x[:, 1:2]
+
+ # ∂u_y/∂x, ∂u_y/∂y
+ grad_u_y = torch.autograd.grad(u_y, points, grad_outputs=ones, create_graph=True, retain_graph=True)[0]
+ duy_dx = grad_u_y[:, 0:1]
+ duy_dy = grad_u_y[:, 1:2]
+ # calculate strain components
+ eps_xx = dux_dx
+ eps_yy = duy_dy
+ eps_xy = 0.5 * (dux_dy + duy_dx)
+ # Frobenius norm squared
+ eps_squared = eps_xx**2 + eps_yy**2 + 2 * eps_xy**2
+
+ loss = torch.mean(eps_squared) # or torch.sum(eps_squared)
+
+ return loss
+
+device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
+
+def train(num_mpi_ranks):
+ client = Client()
+ torch.set_default_dtype(torch.float64)
+
+ # Initialize the model
+ model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Tanh()).to(device)
+
+ # Initialize the optimizer
+ switch_epochs = [100] # 第 100 个 epoch 开始用 LBFGS
+ adam_params = {'lr': 1e-3}
+ lbfgs_params = {'lr': 1, 'max_iter': 20, 'history_size': 10}
+ optimizer = Adam_LBFGS(model.parameters(), switch_epochs, adam_params, lbfgs_params)
+
+ # # L-BFGS optimizer (currently active)
+ # optimizer = optim.LBFGS(model.parameters(), lr=1.0, max_iter=20, tolerance_grad=1e-7, tolerance_change=1e-9, history_size=100)
+
+ early_stopper = EarlyStopping(
+ patience=100,
+ min_delta=1e-2,
+ model=model
+ )
+ # Make sure all datasets are avaialble in the smartredis database.
+ local_time_index = 1
+ while True:
+
+ print (f"Time step {local_time_index}")
+ # Fetch datasets from SmartRedis
+
+ # - Poll until the points datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ points_updated = client.poll_list_length("pointsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not points_updated):
+ raise ValueError("Points dataset list not updated.")
+
+ # - Poll until the displacements datasets are written by OpenFOAM
+ # print (f"dataset_list_length {dataset_list_length}") # Debug info
+ displacements_updated = client.poll_list_length("displacementsDatasetList",
+ num_mpi_ranks, 10, 5000)
+ if (not displacements_updated):
+ raise ValueError("Displacements dataset list not updated.")
+
+ # - Get the points and displacements datasets from SmartRedis
+ points_datasets = client.get_datasets_from_list("pointsDatasetList")
+ displacements_datasets = client.get_datasets_from_list("displacementsDatasetList")
+
+ # - Agglomerate all tensors from points and displacements datasets:
+ # sort tensors by their names to ensure matching patches of same MPI ranks
+ points = []
+ points_names = []
+ displacements = []
+ displacements_names = []
+
+ # Agglomerate boudary points and displacements for training.
+ # TODO(TM): for mesh motion, send points_MPI_r, displacements_MPI_r and
+ # train the MLP directly on the tensors, there is no need to
+ # differentiate the BCs, as values are used for the training.
+ for points_dset, displs_dset in zip(points_datasets, displacements_datasets):
+ points_tensor_names = points_dset.get_tensor_names()
+ displs_tensor_names = displs_dset.get_tensor_names()
+ for points_name,displs_name in zip(points_tensor_names,displs_tensor_names):
+ patch_points = points_dset.get_tensor(points_name)
+ points.append(patch_points)
+ points_names.append(points_name)
+
+ patch_displs = displs_dset.get_tensor(displs_name)
+ displacements.append(patch_displs)
+ displacements_names.append(displs_name)
+
+ points, points_names = sort_tensors_by_names(points, points_names)
+ displacements, displacements_names = sort_tensors_by_names(displacements, displacements_names)
+
+ # - Reshape points and displacements into [N_POINTS,SPATIAL_DIMENSION] tensors
+ # This basically agglomerates data from OpenFOAM boundary patches into a list
+ # of boundary points (unstructured) and a list of respective point displacements.
+ points = torch.from_numpy(np.vstack(points))
+ displacements = torch.from_numpy(np.vstack(displacements))
+
+ # TODO(TM): hardcoded x,y coordinates, make the OF client store polymesh::solutionD
+ # and use solutionD non-zero values for sampling vector coordinates.
+ points = points[:, :2]
+ displacements = displacements[:, :2]
+
+ # Split training and validation data
+ points_train, points_val, displ_train, displ_val = train_test_split(points, displacements,
+ test_size=0.2, random_state=42)
+
+ points_train = points_train.clone().detach().to(device).requires_grad_(True)
+ displ_train = displ_train.to(device)
+ points_val = points_val.to(device)
+ displ_val = displ_val.to(device)
+
+ # PYTORCH Training Loop
+ loss_func = nn.MSELoss()
+
+ model.train()
+ if local_time_index == 1:
+ epochs = 10000
+ else:
+ epochs = 1000
+ n_epochs = 0
+ rmse_loss_val = 1
+ optimizer.reset_epoch()
+ T_start = 0.1 * epochs
+ T_end = 0.5 * epochs
+ for epoch in range(epochs):
+ def closure(epoch=epoch):
+ optimizer.zero_grad()
+ # Forward pass
+ displ_pred = model(points_train)
+
+ # Compute losses
+ data_loss = loss_func(displ_pred, displ_train)
+
+ p_loss = pinn_loss(points_train, displ_pred)
+
+ # Physics weight annealing
+ physics_weight = annealing_weight(epoch, T_start, T_end, sharpness=10)
+
+ data_weight = 1.0
+
+ loss_train = data_weight * data_loss + physics_weight * p_loss
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(
+ f"[Epoch {epoch}/{epochs}] "
+ f"total loss: {loss_train.item()}, "
+ f"data loss: {data_loss.item()}, "
+ f"physics loss: {p_loss.item()}, "
+ f"physics_weight: {physics_weight}"
+ )
+ loss_train.backward()
+ return loss_train
+
+ optimizer.step(closure)
+
+ n_epochs = n_epochs + 1
+ # Forward pass on the validation data, with torch.no_grad() for efficiency
+ with torch.no_grad():
+ displ_pred_val = model(points_val)
+ mse_loss_val = loss_func(displ_pred_val, displ_val)
+ rmse_loss_val = torch.sqrt(mse_loss_val)
+ if epoch % 50 == 0 or epoch == epochs - 1:
+ print(f"[Epoch {epoch}] Validation RMSE: {rmse_loss_val:.6e}")
+ if early_stopper(rmse_loss_val.item()):
+ print(f"Training stopped at epoch {epoch}")
+ print (f"RMSE {early_stopper._best_loss}, number of epochs {n_epochs}")
+ early_stopper.reset()
+ break
+
+ # Store the model into SmartRedis
+ client.set_model("MLP", early_stopper._model_buffer, "TORCH", "CPU")
+
+ # Update the model in smartredis
+ client.put_tensor("model_updated", np.array([0.]))
+
+ # Delete dataset lists for the next time step
+ client.delete_list("pointsDatasetList")
+ client.delete_list("displacementsDatasetList")
+
+ # Update time index
+ local_time_index = local_time_index + 1
+ if client.poll_key("end_time_index", 10, 10):
+ print ("End time reached.")
+ break
+
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Training script for mesh motion")
+ parser.add_argument("mpi_ranks", help="number of mpi ranks", type=int)
+ args = parser.parse_args()
+
+ train(args.mpi_ranks)
diff --git a/run/meshMotion/wingMotion/openfoam-smartsim-wingmotion.py b/run/meshMotion/wingMotion/openfoam-smartsim-wingmotion.py
new file mode 100644
index 0000000..1a1b5d4
--- /dev/null
+++ b/run/meshMotion/wingMotion/openfoam-smartsim-wingmotion.py
@@ -0,0 +1,67 @@
+#!/usr/bin/env python
+# coding: utf-8
+
+# In[1]:
+
+
+#!/usr/bin/python3
+
+import os
+import sys
+
+from smartsim import Experiment
+import time
+
+# SLURM CLUSTER
+# exp = Experiment("mesh-motion", launcher="slurm")
+
+# LOCAL RUN
+exp = Experiment("mesh-motion", launcher="local")
+
+# SLURM CLUSTER
+#db = exp.create_database(port=8000, # database port
+# interface="bond0") # cluster's high-speed interconnect
+
+# LOCAL RUN
+db = exp.create_database(port=8000, # database port
+ interface="lo") # local network
+
+exp.generate(db, overwrite=True)
+exp.start(db)
+print(f"Database started at: {db.get_address()}")
+
+num_mpi_ranks = 4
+
+# SLURM CLUSTER
+# of_rs = exp.create_run_settings(exe="pimpleFoam", exe_args="-parallel")
+# LOCAL RUN
+of_rs = exp.create_run_settings(exe="pimpleFoam", exe_args="-parallel",
+ run_command="mpirun",
+ run_args={"n": f"{num_mpi_ranks}"})
+of_rs.set_tasks(num_mpi_ranks)
+of_rs.set_nodes(1)
+of_model = exp.create_model(name="of_model", run_settings=of_rs)
+of_model.attach_generator_files(to_copy="wingMotion2D_pimpleFoam")
+
+training_rs = exp.create_run_settings(exe="python", exe_args=f"mesh_trainer.py {num_mpi_ranks}")
+training_rs.set_tasks(1)
+training_rs.set_nodes(1)
+training_app = exp.create_model(name="training_app", run_settings=training_rs)
+training_app.attach_generator_files(to_copy="mesh_trainer.py")
+exp.generate(training_app, overwrite=True)
+
+
+try:
+ # Run the experiment
+ print("Starting the OpenFOAM case")
+ exp.generate(of_model, overwrite=True)
+ exp.start(of_model, block=False)
+ print("Starting the training script")
+ exp.start(training_app, block=True)
+
+except Exception as e:
+ print("Caught an exception: ", str(e))
+
+finally:
+ exp.stop(db)
+
diff --git a/run/meshMotion/wingMotion/openfoam-smartsim-wingmotion_pinn.py b/run/meshMotion/wingMotion/openfoam-smartsim-wingmotion_pinn.py
new file mode 100644
index 0000000..c1dae2f
--- /dev/null
+++ b/run/meshMotion/wingMotion/openfoam-smartsim-wingmotion_pinn.py
@@ -0,0 +1,72 @@
+#!/usr/bin/env python
+# coding: utf-8
+
+# In[1]:
+
+
+#!/usr/bin/python3
+
+import os
+import sys
+
+from smartsim import Experiment
+import time
+from pathlib import Path
+
+# SLURM CLUSTER
+# exp = Experiment("mesh-motion", launcher="slurm")
+
+# LOCAL RUN
+exp = Experiment("mesh-motion", launcher="local")
+
+# SLURM CLUSTER
+#db = exp.create_database(port=8000, # database port
+# interface="bond0") # cluster's high-speed interconnect
+
+# LOCAL RUN
+db = exp.create_database(port=8000, # database port
+ interface="lo") # local network
+
+exp.generate(db, overwrite=True)
+exp.start(db)
+print(f"Database started at: {db.get_address()}")
+
+num_mpi_ranks = 4
+
+# SLURM CLUSTER
+# of_rs = exp.create_run_settings(exe="pimpleFoam", exe_args="-parallel")
+# LOCAL RUN
+
+
+project_root = Path(__file__).parent.resolve()
+
+of_rs = exp.create_run_settings(exe="pimpleFoam", exe_args="-parallel",
+ run_command="mpirun",
+ run_args={"n": f"{num_mpi_ranks}"})
+of_rs.set_tasks(num_mpi_ranks)
+of_rs.set_nodes(1)
+of_model = exp.create_model(name="of_model", run_settings=of_rs)
+of_model.attach_generator_files(to_copy="wingMotion2D_pimpleFoam")
+
+training_rs = exp.create_run_settings(exe="python", exe_args=f"mesh_trainer_pinn.py {num_mpi_ranks}")
+training_rs.set_tasks(1)
+training_rs.set_nodes(1)
+training_app = exp.create_model(name="training_app", run_settings=training_rs)
+training_app.attach_generator_files(to_copy="mesh_trainer_pinn.py")
+exp.generate(training_app, overwrite=True)
+
+
+try:
+ # Run the experiment
+ print("Starting the OpenFOAM case")
+ exp.generate(of_model, overwrite=True)
+ exp.start(of_model, block=False)
+ print("Starting the training script")
+ exp.start(training_app, block=True)
+
+except Exception as e:
+ print("Caught an exception: ", str(e))
+
+finally:
+ exp.stop(db)
+
diff --git a/run/meshMotion/wingMotion/pinn_surface.png b/run/meshMotion/wingMotion/pinn_surface.png
new file mode 100644
index 0000000..6dbb176
Binary files /dev/null and b/run/meshMotion/wingMotion/pinn_surface.png differ
diff --git a/run/meshMotion/wingMotion/rescale_Pinn-ML.png b/run/meshMotion/wingMotion/rescale_Pinn-ML.png
new file mode 100644
index 0000000..92c4888
Binary files /dev/null and b/run/meshMotion/wingMotion/rescale_Pinn-ML.png differ
diff --git a/run/meshMotion/wingMotion/result/clipped sphere/clipped diff Pinn_ML.png b/run/meshMotion/wingMotion/result/clipped sphere/clipped diff Pinn_ML.png
new file mode 100644
index 0000000..9ca793b
Binary files /dev/null and b/run/meshMotion/wingMotion/result/clipped sphere/clipped diff Pinn_ML.png differ
diff --git a/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation Laplace.png b/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation Laplace.png
new file mode 100644
index 0000000..32471e7
Binary files /dev/null and b/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation Laplace.png differ
diff --git a/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation ML.png b/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation ML.png
new file mode 100644
index 0000000..8403f0a
Binary files /dev/null and b/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation ML.png differ
diff --git a/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation Pinn.png b/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation Pinn.png
new file mode 100644
index 0000000..bd7d80b
Binary files /dev/null and b/run/meshMotion/wingMotion/result/clipped sphere/clipped mesh deformation Pinn.png differ
diff --git a/run/meshMotion/wingMotion/result/clipped sphere/clipped non-orth.png b/run/meshMotion/wingMotion/result/clipped sphere/clipped non-orth.png
new file mode 100644
index 0000000..e3e838e
Binary files /dev/null and b/run/meshMotion/wingMotion/result/clipped sphere/clipped non-orth.png differ
diff --git a/run/meshMotion/wingMotion/result/clipped sphere/new clipped non-orth.png b/run/meshMotion/wingMotion/result/clipped sphere/new clipped non-orth.png
new file mode 100644
index 0000000..990505f
Binary files /dev/null and b/run/meshMotion/wingMotion/result/clipped sphere/new clipped non-orth.png differ
diff --git a/run/meshMotion/wingMotion/result/diff ML - Laplace.png b/run/meshMotion/wingMotion/result/diff ML - Laplace.png
new file mode 100644
index 0000000..ae16946
Binary files /dev/null and b/run/meshMotion/wingMotion/result/diff ML - Laplace.png differ
diff --git a/run/meshMotion/wingMotion/result/diff Pinn - Laplace.png b/run/meshMotion/wingMotion/result/diff Pinn - Laplace.png
new file mode 100644
index 0000000..61c7c59
Binary files /dev/null and b/run/meshMotion/wingMotion/result/diff Pinn - Laplace.png differ
diff --git a/run/meshMotion/wingMotion/result/diff Pinn - ML.png b/run/meshMotion/wingMotion/result/diff Pinn - ML.png
new file mode 100644
index 0000000..29ca2b9
Binary files /dev/null and b/run/meshMotion/wingMotion/result/diff Pinn - ML.png differ
diff --git a/run/meshMotion/wingMotion/result/mesh deforamtion ML.png b/run/meshMotion/wingMotion/result/mesh deforamtion ML.png
new file mode 100644
index 0000000..ee80336
Binary files /dev/null and b/run/meshMotion/wingMotion/result/mesh deforamtion ML.png differ
diff --git a/run/meshMotion/wingMotion/result/mesh deformation Laplace.png b/run/meshMotion/wingMotion/result/mesh deformation Laplace.png
new file mode 100644
index 0000000..42ddf71
Binary files /dev/null and b/run/meshMotion/wingMotion/result/mesh deformation Laplace.png differ
diff --git a/run/meshMotion/wingMotion/result/mesh deformation Pinn.png b/run/meshMotion/wingMotion/result/mesh deformation Pinn.png
new file mode 100644
index 0000000..42354ac
Binary files /dev/null and b/run/meshMotion/wingMotion/result/mesh deformation Pinn.png differ
diff --git a/run/meshMotion/wingMotion/result/mesh resolutions/ml.png b/run/meshMotion/wingMotion/result/mesh resolutions/ml.png
new file mode 100644
index 0000000..8815a94
Binary files /dev/null and b/run/meshMotion/wingMotion/result/mesh resolutions/ml.png differ
diff --git a/run/meshMotion/wingMotion/result/mesh resolutions/ml.png:Zone.Identifier b/run/meshMotion/wingMotion/result/mesh resolutions/ml.png:Zone.Identifier
new file mode 100644
index 0000000..d6c1ec6
Binary files /dev/null and b/run/meshMotion/wingMotion/result/mesh resolutions/ml.png:Zone.Identifier differ
diff --git a/run/meshMotion/wingMotion/result/mesh resolutions/pinn new.png b/run/meshMotion/wingMotion/result/mesh resolutions/pinn new.png
new file mode 100644
index 0000000..fc7eecf
Binary files /dev/null and b/run/meshMotion/wingMotion/result/mesh resolutions/pinn new.png differ
diff --git a/run/meshMotion/wingMotion/result/mesh resolutions/pinn.png b/run/meshMotion/wingMotion/result/mesh resolutions/pinn.png
new file mode 100644
index 0000000..99222dd
Binary files /dev/null and b/run/meshMotion/wingMotion/result/mesh resolutions/pinn.png differ
diff --git a/run/meshMotion/wingMotion/result/non-orth..png b/run/meshMotion/wingMotion/result/non-orth..png
new file mode 100644
index 0000000..59c0d32
Binary files /dev/null and b/run/meshMotion/wingMotion/result/non-orth..png differ
diff --git a/run/meshMotion/wingMotion/run-wingmotion-slurm.sbatch b/run/meshMotion/wingMotion/run-wingmotion-slurm.sbatch
new file mode 100644
index 0000000..f0a3c09
--- /dev/null
+++ b/run/meshMotion/wingMotion/run-wingmotion-slurm.sbatch
@@ -0,0 +1,29 @@
+#!/bin/bash
+####---------------------------------------------------------------------------
+#### Set SLURM / Job parameters
+####---------------------------------------------------------------------------
+### Set the account from which HPC resources are used. For now, this is
+### fixed for our project.
+#SBATCH -A special00004
+### Set a name identifying the job
+#SBATCH -J wingMotion
+### Do not send email notifcations, check job status with 'squeue`
+#SBATCH --mail-type=NONE
+### Set the number of processes. This is equivalent to the number of
+### cores used usually
+#SBATCH -n 4
+### Set the amount of memory per core in megabyte
+#SBATCH --mem-per-cpu=500
+### Set a run time limit for the job. This limit must not exceed the limit
+### of the chosen partition, e.g. on test30m the runtime limit is
+### 30 minutes.
+### The format is hh:mm:ss
+#SBATCH -t 02:00:00
+
+####---------------------------------------------------------------------------
+#### The actual command to submit as job
+####---------------------------------------------------------------------------
+python openfoam-smartsim-wingmotion-slurm.py
+### Afterwards, check the slurm log of the job. It should contain
+### 4 lines show 'Hello world'.
+
diff --git a/run/meshMotion/wingMotion/visualize-non-orth-difference.pvsm b/run/meshMotion/wingMotion/visualize-non-orth-difference.pvsm
new file mode 100644
index 0000000..c821973
--- /dev/null
+++ b/run/meshMotion/wingMotion/visualize-non-orth-difference.pvsm
@@ -0,0 +1,12381 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/U b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/U
new file mode 100644
index 0000000..6cdf9d8
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/U
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type movingWallVelocity;
+ value uniform (0 0 0);
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/initialConditions b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/k b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/nut b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/omega b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/p b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/pointDisplacement b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/pointDisplacement
new file mode 100644
index 0000000..0f0aa97
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/0.orig/pointDisplacement
@@ -0,0 +1,68 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class pointVectorField;
+ object pointDisplacement;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 0 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ wing
+ {
+ type solidBodyMotionDisplacement;
+ solidBodyMotionFunction multiMotion;
+ multiMotionCoeffs
+ {
+ translation
+ {
+ solidBodyMotionFunction linearMotion;
+ linearMotionCoeffs
+ {
+ velocity (2 0 0);
+ }
+ }
+ rotation
+ {
+ solidBodyMotionFunction rotatingMotion;
+ rotatingMotionCoeffs
+ {
+ origin (0 0 0);
+ axis (0 0 1);
+ omega -3; // rad/s, 1rad/s=9.5rpm
+ }
+ }
+ }
+ }
+
+ front
+ {
+ type empty;
+ }
+
+ back
+ {
+ type empty;
+ }
+
+ ".*"
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict
new file mode 100644
index 0000000..0467222
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim mesh motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// OpenFOAM mesh motion
+//motionSolverLibs (fvMotionSolvers);
+//motionSolver displacementLaplacian;
+//displacementLaplacianCoeffs
+//{
+// diffusivity inverseDistance (wing);
+//}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.LaplaceMeshMotion b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.LaplaceMeshMotion
new file mode 100644
index 0000000..dfebe85
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.LaplaceMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// OpenFOAM Laplace Equation mesh motion
+motionSolverLibs (fvMotionSolvers);
+motionSolver displacementLaplacian;
+displacementLaplacianCoeffs
+{
+ diffusivity inverseDistance (wing);
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.MachineLearningMeshMotion b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.MachineLearningMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.MachineLearningMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.PinnMeshMotion b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.PinnMeshMotion
new file mode 100644
index 0000000..f48b88b
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/dynamicMeshDict.PinnMeshMotion
@@ -0,0 +1,28 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2206 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object dynamicMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+
+dynamicFvMesh dynamicMotionSolverFvMesh;
+
+// SmartSim Machine Learning Mesh Motion
+motionSolverLibs (smartSimMotionSolvers);
+solver displacementSmartSim;
+displacementSmartSimCoeffs
+{
+ clusterMode off;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/transportProperties b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/turbulenceProperties b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/controlDict b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/controlDict
new file mode 100644
index 0000000..1ff0d57
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/controlDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application pimpleFoam;
+
+startFrom startTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 0.15;
+//endTime 1e-2; // For debugging
+
+deltaT 1e-5;
+
+// Testing
+
+writeControl adjustable;
+writeInterval 0.5e-2;
+
+//writeInterval 1e-03; // For debugging
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 10;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+adjustTimeStep yes;
+
+maxCo 0.9;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/decomposeParDict b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/decomposeParDict
new file mode 100644
index 0000000..70834d1
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 4;
+
+method simple;
+
+coeffs
+{
+ n (2 2 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/ensightWrite b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/ensightWrite
new file mode 100644
index 0000000..b0be31b
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/ensightWrite
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+ensightWrite
+{
+ type ensightWrite;
+ libs (utilityFunctionObjects);
+ log true;
+
+ fields (U p);
+
+ format ascii;
+
+ overwrite true;
+
+ writeControl onEnd;
+
+ consecutive false;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/fvSchemes b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/fvSchemes
new file mode 100644
index 0000000..340d831
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss linearUpwind grad(U);
+
+ turbulence Gauss limitedLinear 1;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/fvSolution b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/fvSolution
new file mode 100644
index 0000000..fbf9c4c
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_pimpleFoam/system/fvSolution
@@ -0,0 +1,92 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "pcorr.*"
+ {
+ solver GAMG;
+ tolerance 0.02;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+
+ p
+ {
+ $pcorr;
+ tolerance 1e-7;
+ relTol 0.01;
+ }
+
+ pFinal
+ {
+ $p;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ "(U|k|omega)"
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-06;
+ relTol 0.1;
+ }
+
+ "(U|k|omega)Final"
+ {
+ $U;
+ tolerance 1e-06;
+ relTol 0;
+ }
+
+ cellDisplacement
+ {
+ solver GAMG;
+ tolerance 1e-5;
+ relTol 0;
+ smoother GaussSeidel;
+ }
+}
+
+PIMPLE
+{
+ correctPhi yes;
+ nOuterCorrectors 2;
+ nCorrectors 1;
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/U b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/U
new file mode 100644
index 0000000..4829779
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/U
@@ -0,0 +1,43 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform $flowVelocity;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue uniform (0 0 0);
+ value $internalField;
+ }
+
+ wing
+ {
+ type noSlip;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/fixedInlet b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/fixedInlet
new file mode 100644
index 0000000..4c91f75
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/fixedInlet
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+inlet
+{
+ type fixedValue;
+ value $internalField;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/frontBackTopBottomPatches b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/frontBackTopBottomPatches
new file mode 100644
index 0000000..f04679f
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/frontBackTopBottomPatches
@@ -0,0 +1,24 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+topAndBottom
+{
+ type slip;
+}
+
+front
+{
+ type empty;
+}
+
+back
+{
+ type empty;
+}
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/initialConditions b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/initialConditions
new file mode 100644
index 0000000..aba475e
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/include/initialConditions
@@ -0,0 +1,15 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+//flowVelocity (100 0 0);
+flowVelocity (1 0 0);
+pressure 0;
+turbulentKE 37;
+turbulentOmega 32;
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/k b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/k
new file mode 100644
index 0000000..bc24799
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/k
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object k;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $turbulentKE;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type kqRWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/nut b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/nut
new file mode 100644
index 0000000..6feb07f
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/nut
@@ -0,0 +1,37 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object nut;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 2 -1 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ wing
+ {
+ type nutkWallFunction;
+ value uniform 0;
+ }
+
+ "(front|back|topAndBottom|inlet|outlet)"
+ {
+ type calculated;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/omega b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/omega
new file mode 100644
index 0000000..a1bc245
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/omega
@@ -0,0 +1,44 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object omega;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 0 -1 0 0 0 0];
+
+internalField uniform $turbulentOmega;
+
+boundaryField
+{
+ #include "include/fixedInlet"
+
+ outlet
+ {
+ type inletOutlet;
+ inletValue $internalField;
+ value $internalField;
+ }
+
+ wing
+ {
+ type omegaWallFunction;
+ value $internalField;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/p b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/p
new file mode 100644
index 0000000..0d71694
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/0.orig/p
@@ -0,0 +1,45 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "include/initialConditions"
+
+dimensions [0 2 -2 0 0 0 0];
+
+internalField uniform $pressure;
+
+boundaryField
+{
+ inlet
+ {
+ type zeroGradient;
+ }
+
+ outlet
+ {
+ type fixedValue;
+ value $internalField;
+ }
+
+ wing
+ {
+ type zeroGradient;
+ }
+
+ #include "include/frontBackTopBottomPatches"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/constant/transportProperties b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/constant/transportProperties
new file mode 100644
index 0000000..4908cd4
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/constant/transportProperties
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+transportModel Newtonian;
+
+nu 1e-05;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/constant/turbulenceProperties b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/constant/turbulenceProperties
new file mode 100644
index 0000000..e5d396e
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/constant/turbulenceProperties
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType RAS;
+
+RAS
+{
+ RASModel kOmegaSST;
+
+ turbulence on;
+
+ printCoeffs on;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/controlDict b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/controlDict
new file mode 100644
index 0000000..2decc11
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/controlDict
@@ -0,0 +1,53 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application simpleFoam;
+
+startFrom latestTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 3000;
+
+deltaT 1;
+
+writeControl runTime;
+
+writeInterval 100;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+functions
+{
+ #include "forces"
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/createPatchDict b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/createPatchDict
new file mode 100644
index 0000000..b28c411
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/createPatchDict
@@ -0,0 +1,56 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object createPatchDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+pointSync false;
+
+patches
+(
+ {
+ // Name of new patch
+ name front;
+
+ // Type of new patch
+ patchInfo
+ {
+ type empty;
+ }
+
+ // How to construct: either from 'patches' or 'set'
+ constructFrom patches;
+
+ // If constructFrom = patches : names of patches. Wildcards allowed.
+ patches (symFront);
+ }
+ {
+ // Name of new patch
+ name back;
+
+ // Type of new patch
+ patchInfo
+ {
+ type empty;
+ }
+
+ // How to construct: either from 'patches' or 'set'
+ constructFrom patches;
+
+ // If constructFrom = patches : names of patches. Wildcards allowed.
+ patches (symBack);
+ }
+);
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/extrudeMeshDict b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/extrudeMeshDict
new file mode 100644
index 0000000..8df067b
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/extrudeMeshDict
@@ -0,0 +1,53 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object extrudeMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// What to extrude:
+// patch : from patch of another case ('sourceCase')
+// mesh : as above but with original case included
+// surface : from externally read surface
+
+constructFrom patch;
+sourceCase "../wingMotion_snappyHexMesh";
+sourcePatches (symFront);
+
+// If construct from patch: patch to use for back (can be same as sourcePatch)
+exposedPatchName symBack;
+
+// Flip surface normals before usage. Valid only for extrude from surface or
+// patch.
+flipNormals false;
+
+//- Linear extrusion in point-normal direction
+extrudeModel linearNormal;
+
+nLayers 1;
+
+expansionRatio 1.0;
+
+linearNormalCoeffs
+{
+ thickness 0.05;
+}
+
+// Do front and back need to be merged? Usually only makes sense for 360
+// degree wedges.
+mergeFaces false; //true;
+
+// Merge small edges. Fraction of bounding box.
+mergeTol 0;
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/forces b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/forces
new file mode 100644
index 0000000..14e4cc9
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/forces
@@ -0,0 +1,25 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+
+forces
+{
+ type forces;
+ libs (forces);
+
+ writeControl timeStep;
+ writeInterval 10;
+ log false;
+
+ patches (wing);
+ rho rhoInf;
+ rhoInf 1;
+ CofR (0.4974612746 -0.01671895744 0.125);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/fvSchemes b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/fvSchemes
new file mode 100644
index 0000000..3936530
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/fvSchemes
@@ -0,0 +1,63 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default steadyState;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+ grad(p) Gauss linear;
+ grad(U) Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) bounded Gauss linearUpwind grad(U);
+
+ turbulence bounded Gauss upwind;
+ div(phi,k) $turbulence;
+ div(phi,omega) $turbulence;
+
+ div((nuEff*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear corrected;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+wallDist
+{
+ method meshWave;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/fvSolution b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/fvSolution
new file mode 100644
index 0000000..0fb7a28
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion2D_simpleFoam/system/fvSolution
@@ -0,0 +1,79 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ p
+ {
+ solver GAMG;
+ tolerance 1e-7;
+ relTol 0.1;
+ smoother GaussSeidel;
+ }
+
+ U
+ {
+ solver smoothSolver;
+ smoother GaussSeidel;
+ tolerance 1e-8;
+ relTol 0.1;
+ nSweeps 1;
+ }
+
+ k
+ {
+ solver smoothSolver;
+ smoother GaussSeidel;
+ tolerance 1e-8;
+ relTol 0.1;
+ nSweeps 1;
+ }
+
+ omega
+ {
+ solver smoothSolver;
+ smoother GaussSeidel;
+ tolerance 1e-8;
+ relTol 0.1;
+ nSweeps 1;
+ }
+}
+
+SIMPLE
+{
+ nNonOrthogonalCorrectors 0;
+}
+
+relaxationFactors
+{
+ fields
+ {
+ p 0.3;
+ }
+ equations
+ {
+ "(U|k|omega)" 0.7;
+ "(U|k|omega)Final" 1.0;
+ }
+}
+
+cache
+{
+ grad(U);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/constant/triSurface/wing_5degrees.obj.gz b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/constant/triSurface/wing_5degrees.obj.gz
new file mode 100644
index 0000000..c5dc5fd
Binary files /dev/null and b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/constant/triSurface/wing_5degrees.obj.gz differ
diff --git a/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict
new file mode 100644
index 0000000..eea0b69
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/blockMeshDict
@@ -0,0 +1,94 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+scale 1;
+
+vertices
+(
+ (-1.2 -2.2 -0.1)
+ ( 5 -2.2 -0.1)
+ ( 5 2.2 -0.1)
+ (-1.2 2.2 -0.1)
+ (-1.2 -2.2 0.1)
+ ( 5 -2.2 0.1)
+ ( 5 2.2 0.1)
+ (-1.2 2.2 0.1)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (50 35 1) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ topAndBottom
+ {
+ type patch;
+ faces
+ (
+ (3 7 6 2)
+ (1 5 4 0)
+ );
+ }
+
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (2 6 5 1)
+ );
+ }
+
+ symFront
+ {
+ type symmetryPlane;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+
+ symBack
+ {
+ type symmetryPlane;
+ faces
+ (
+ (0 3 2 1)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/controlDict b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/controlDict
new file mode 100644
index 0000000..b21f6d5
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/controlDict
@@ -0,0 +1,75 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application snappyHexMesh;
+
+startFrom latestTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 100;
+
+deltaT 1;
+
+writeControl runTime;
+
+writeInterval 1;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression off;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable true;
+
+functions
+{
+ surfaceDistance1
+ {
+ type surfaceDistance;
+ libs (fieldFunctionObjects);
+
+ geometry
+ {
+ wing_5degrees.obj.gz
+ {
+ type triSurfaceMesh;
+ name wing;
+ }
+ }
+
+ calculateCells true;
+ region region0; // 区域名
+ enabled true;
+ log true;
+ timeStart 0;
+ timeEnd 100;
+ executeControl timeStep;
+ executeInterval 1;
+ writeControl timeStep;
+ writeInterval 1;
+ }
+}
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/decomposeParDict b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/decomposeParDict
new file mode 100644
index 0000000..cfe2304
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/decomposeParDict
@@ -0,0 +1,27 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 3;
+
+method simple;
+
+coeffs
+{
+ n (1 3 1);
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/fvSchemes b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/fvSchemes
new file mode 100644
index 0000000..f2a5359
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/fvSchemes
@@ -0,0 +1,58 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+}
+
+divSchemes
+{
+ default none;
+
+ div(phi,U) Gauss limitedLinearV 1;
+
+ turbulence Gauss upwind;
+ div(phi,k) $turbulence;
+ div(phi,epsilon) $turbulence;
+ div(phi,R) $turbulence;
+ div(R) Gauss linear;
+
+ div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear limited corrected 0.5;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default corrected;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/fvSolution b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/fvSolution
new file mode 100644
index 0000000..f270f85
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/fvSolution
@@ -0,0 +1,50 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ p
+ {
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-12;
+ relTol 0;
+ }
+
+ rho
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-08;
+ relTol 0;
+ }
+
+ "(U|e|k|epsilon|R)"
+ {
+ $p;
+ tolerance 1e-08;
+ relTol 0;
+ }
+}
+
+PISO
+{
+ nCorrectors 2;
+ nNonOrthogonalCorrectors 2;
+}
+
+
+// ************************************************************************* //
diff --git a/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/snappyHexMeshDict b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/snappyHexMeshDict
new file mode 100644
index 0000000..454a4a5
--- /dev/null
+++ b/run/meshMotion/wingMotion/wingMotion_snappyHexMesh/system/snappyHexMeshDict
@@ -0,0 +1,319 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: v2312 |
+| \\ / A nd | Website: www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object snappyHexMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+// Which of the steps to run
+castellatedMesh true;
+snap true;
+addLayers true;
+
+
+// Geometry. Definition of all surfaces. All surfaces are of class
+// searchableSurface.
+// Surfaces are used
+// - to specify refinement for any mesh cell intersecting it
+// - to specify refinement for any mesh cell inside/outside/near
+// - to 'snap' the mesh boundary to the surface
+geometry
+{
+ wing_5degrees.obj
+ {
+ type triSurfaceMesh;
+ name wing;
+ }
+
+ refinementBox
+ {
+ type box;
+ min (-1 -1 -1);
+ max ( 5 1 1);
+ }
+}
+
+
+// Settings for the castellatedMesh generation.
+castellatedMeshControls
+{
+
+ // Refinement parameters
+ // ~~~~~~~~~~~~~~~~~~~~~
+
+ // If local number of cells is >= maxLocalCells on any processor
+ // switches from from refinement followed by balancing
+ // (current method) to (weighted) balancing before refinement.
+ maxLocalCells 100000;
+
+ // Overall cell limit (approximately). Refinement will stop immediately
+ // upon reaching this number so a refinement level might not complete.
+ // Note that this is the number of cells before removing the part which
+ // is not 'visible' from the keepPoint. The final number of cells might
+ // actually be a lot less.
+ maxGlobalCells 2000000;
+
+ // The surface refinement loop might spend lots of iterations refining just
+ // a few cells. This setting will cause refinement to stop if <=
+ // minimumRefine are selected for refinement. Note: it will at least do one
+ // iteration (unless the number of cells to refine is 0)
+ minRefinementCells 100;
+
+ // Number of buffer layers between different levels.
+ // 1 means normal 2:1 refinement restriction, larger means slower
+ // refinement.
+ nCellsBetweenLevels 8;
+
+
+
+ // Explicit feature edge refinement
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ // Specifies a level for any cell intersected by its edges.
+ // This is a featureEdgeMesh, read from constant/triSurface for now.
+ features ();
+
+
+
+ // Surface based refinement
+ // ~~~~~~~~~~~~~~~~~~~~~~~~
+
+ // Specifies two levels for every surface. The first is the minimum level,
+ // every cell intersecting a surface gets refined up to the minimum level.
+ // The second level is the maximum level. Cells that 'see' multiple
+ // intersections where the intersections make an
+ // angle > resolveFeatureAngle get refined up to the maximum level.
+
+ refinementSurfaces
+ {
+ wing
+ {
+ // Surface-wise min and max refinement level
+ level (5 5);
+ }
+ }
+
+ // Resolve sharp angles on fridges
+ resolveFeatureAngle 30;
+
+
+ // Region-wise refinement
+ // ~~~~~~~~~~~~~~~~~~~~~~
+
+ // Specifies refinement level for cells in relation to a surface. One of
+ // three modes
+ // - distance. 'levels' specifies per distance to the surface the
+ // wanted refinement level. The distances need to be specified in
+ // descending order.
+ // - inside. 'levels' is only one entry and only the level is used. All
+ // cells inside the surface get refined up to the level. The surface
+ // needs to be closed for this to be possible.
+ // - outside. Same but cells outside.
+
+ refinementRegions
+ {
+ refinementBox
+ {
+ mode inside;
+ levels ((1e15 2));
+ }
+ }
+
+
+ // Mesh selection
+ // ~~~~~~~~~~~~~~
+
+ // After refinement patches get added for all refinementSurfaces and
+ // all cells intersecting the surfaces get put into these patches. The
+ // section reachable from the locationInMesh is kept.
+ // NOTE: This point should never be on a face, always inside a cell, even
+ // after refinement.
+ locationInMesh (-0.5 0 0);
+
+
+ // Whether any faceZones (as specified in the refinementSurfaces)
+ // are only on the boundary of corresponding cellZones or also allow
+ // free-standing zone faces. Not used if there are no faceZones.
+ allowFreeStandingZoneFaces true;
+}
+
+
+
+// Settings for the snapping.
+snapControls
+{
+ //- Number of patch smoothing iterations before finding correspondence
+ // to surface
+ nSmoothPatch 3;
+
+ //- Relative distance for points to be attracted by surface feature point
+ // or edge. True distance is this factor times local
+ // maximum edge length.
+ tolerance 4.0;
+
+ //- Number of mesh displacement relaxation iterations.
+ nSolveIter 30;
+
+ //- Maximum number of snapping relaxation iterations. Should stop
+ // before upon reaching a correct mesh.
+ nRelaxIter 5;
+}
+
+
+
+// Settings for the layer addition.
+addLayersControls
+{
+ // Are the thickness parameters below relative to the undistorted
+ // size of the refined cell outside layer (true) or absolute sizes (false).
+ relativeSizes true;
+
+ // Per final patch (so not geometry!) the layer information
+ layers
+ {
+ wing
+ {
+ nSurfaceLayers 4;
+ }
+ }
+
+ // Expansion factor for layer mesh
+ expansionRatio 1.3;
+
+ // Wanted thickness of final added cell layer. If multiple layers
+ // is the thickness of the layer furthest away from the wall.
+ // Relative to undistorted size of cell outside layer.
+ // See relativeSizes parameter.
+ finalLayerThickness 0.7;
+
+ // Minimum thickness of cell layer. If for any reason layer
+ // cannot be above minThickness do not add layer.
+ // Relative to undistorted size of cell outside layer.
+ // See relativeSizes parameter.
+ minThickness 0.25;
+
+ // If points get not extruded do nGrow layers of connected faces that are
+ // also not grown. This helps convergence of the layer addition process
+ // close to features.
+ // Note: changed(corrected) w.r.t 1.7.x! (didn't do anything in 1.7.x)
+ nGrow 0;
+
+ // Advanced settings
+
+ // When not to extrude surface. 0 is flat surface, 90 is when two faces
+ // are perpendicular
+ featureAngle 170;
+
+ // Maximum number of snapping relaxation iterations. Should stop
+ // before upon reaching a correct mesh.
+ nRelaxIter 5;
+
+ // Number of smoothing iterations of surface normals
+ nSmoothSurfaceNormals 1;
+
+ // Number of smoothing iterations of interior mesh movement direction
+ nSmoothNormals 3;
+
+ // Smooth layer thickness over surface patches
+ nSmoothThickness 10;
+
+ // Stop layer growth on highly warped cells
+ maxFaceThicknessRatio 0.5;
+
+ // Reduce layer growth where ratio thickness to medial
+ // distance is large
+ maxThicknessToMedialRatio 0.3;
+
+ // Angle used to pick up medial axis points
+ // Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x.
+ minMedialAxisAngle 90;
+
+ // Create buffer region for new layer terminations
+ nBufferCellsNoExtrude 0;
+
+
+ // Overall max number of layer addition iterations. The mesher will exit
+ // if it reaches this number of iterations; possibly with an illegal
+ // mesh.
+ nLayerIter 50;
+}
+
+
+
+// Generic mesh quality settings. At any undoable phase these determine
+// where to undo.
+meshQualityControls
+{
+ //- Maximum non-orthogonality allowed. Set to 180 to disable.
+ maxNonOrtho 65;
+
+ //- Max skewness allowed. Set to <0 to disable.
+ maxBoundarySkewness 20;
+ maxInternalSkewness 4;
+
+ //- Max concaveness allowed. Is angle (in degrees) below which concavity
+ // is allowed. 0 is straight face, <0 would be convex face.
+ // Set to 180 to disable.
+ maxConcave 80;
+
+ //- Minimum pyramid volume. Is absolute volume of cell pyramid.
+ // Set to a sensible fraction of the smallest cell volume expected.
+ // Set to very negative number (e.g. -1E30) to disable.
+ minVol 1e-13;
+
+ //- Minimum quality of the tet formed by the face-centre
+ // and variable base point minimum decomposition triangles and
+ // the cell centre. Set to very negative number (e.g. -1E30) to
+ // disable.
+ // <0 = inside out tet,
+ // 0 = flat tet
+ // 1 = regular tet
+ minTetQuality 1e-30;
+
+ //- Minimum face area. Set to <0 to disable.
+ minArea -1;
+
+ //- Minimum face twist. Set to <-1 to disable. dot product of face normal
+ // and face centre triangles normal
+ minTwist 0.05;
+
+ //- Minimum normalised cell determinant
+ // 1 = hex, <= 0 = folded or flattened illegal cell
+ minDeterminant 0.001;
+
+ //- minFaceWeight (0 -> 0.5)
+ minFaceWeight 0.05;
+
+ //- minVolRatio (0 -> 1)
+ minVolRatio 0.01;
+
+ //must be >0 for Fluent compatibility
+ minTriangleTwist -1;
+
+
+ // Advanced
+
+ //- Number of error distribution iterations
+ nSmoothScale 4;
+ //- Amount to scale back displacement at error points
+ errorReduction 0.75;
+}
+
+
+// Advanced
+
+// Merge tolerance. Is fraction of overall bounding box of initial mesh.
+// Note: the write tolerance needs to be higher than this.
+mergeTolerance 1e-6;
+
+
+// ************************************************************************* //
diff --git a/src/displacementSmartSimMotionSolver/displacementSmartSimMotionSolver.C b/src/displacementSmartSimMotionSolver/displacementSmartSimMotionSolver.C
index 8079ea7..7466fd0 100644
--- a/src/displacementSmartSimMotionSolver/displacementSmartSimMotionSolver.C
+++ b/src/displacementSmartSimMotionSolver/displacementSmartSimMotionSolver.C
@@ -184,7 +184,7 @@ void Foam::displacementSmartSimMotionSolver::solve()
client_.append_to_list("pointsDatasetList", pointsDataset);
client_.append_to_list("displacementsDatasetList", displacementsDataset);
- bool model_updated = client_.poll_key("model_updated", 10, 10000);
+ bool model_updated = client_.poll_key("model_updated", 100, 1000000);
if (! model_updated)
{
FatalErrorInFunction
diff --git a/src/displacementSmartSimMotionSolver/pytorchApproximationModels/.gitignore b/src/displacementSmartSimMotionSolver/pytorchApproximationModels/.gitignore
new file mode 100644
index 0000000..227c989
--- /dev/null
+++ b/src/displacementSmartSimMotionSolver/pytorchApproximationModels/.gitignore
@@ -0,0 +1,3 @@
+*.png
+*.csv
+*.pth
diff --git a/src/displacementSmartSimMotionSolver/pytorchApproximationModels/rbf_network.py b/src/displacementSmartSimMotionSolver/pytorchApproximationModels/rbf_network.py
new file mode 100644
index 0000000..14dcc9b
--- /dev/null
+++ b/src/displacementSmartSimMotionSolver/pytorchApproximationModels/rbf_network.py
@@ -0,0 +1,97 @@
+import torch
+import torch.nn as nn
+
+import torch
+
+# Define various RBF functions with enforced compact support
+def gaussian_rbf(r):
+ """Infinitely smooth Gaussian RBF."""
+ return torch.exp(-r**2)
+
+def wendland_d2_c2_rbf(r):
+ """
+ Wendland's C^2 RBF for d=2.
+ Compactly supported, continuously differentiable (C^2).
+
+ Formula: (1 - r)^4_+ (4r + 1)
+ """
+ mask = (r < 1).float()
+ rm = (1 - r).clamp(min=0.0)
+ return mask * rm**4 * (4 * r + 1)
+
+def wendland_d2_c4_rbf(r):
+ """
+ Wendland's C^4 RBF for d=2.
+ Compactly supported, twice continuously differentiable (C^4).
+
+ Formula: (1 - r)^6_+ (35r^2 + 18r + 3)
+ """
+ mask = (r < 1).float()
+ rm = (1 - r).clamp(min=0.0)
+ return mask * rm**6 * (35 * r**2 + 18 * r + 3)
+
+def multiquadric_rbf(r):
+ """Multiquadric RBF with compact support."""
+ mask = (r < 1).float()
+ return mask * torch.sqrt(1 + r**2)
+
+def inverse_multiquadric_rbf(r):
+ """Inverse multiquadric RBF with compact support."""
+ mask = (r < 1).float()
+ return mask / torch.sqrt(1 + r**2)
+
+# Create an RBF function dictionary
+rbf_dict = {
+ "gaussian": gaussian_rbf,
+ "wendland_d2_c2": wendland_d2_c2_rbf,
+ "wendland_d2_c4": wendland_d2_c4_rbf,
+ "multiquadric": multiquadric_rbf,
+ "inverse_multiquadric": inverse_multiquadric_rbf
+}
+
+class RadialBasisFunctionNetwork(nn.Module):
+ def __init__(self, centers, r_max, rbf_dict, rbf_type):
+ """
+ Generalized RBF network with user-selectable RBF functions.
+
+ Parameters:
+ centers (torch.Tensor): shape (num_centers, dimension), RBF centers.
+ r_max (float): radius of compact support (applies to all RBFs).
+ rbf_dict (dict): Dictionary mapping RBF type names to function implementations.
+ rbf_type (str): Type of RBF function to use (must be in rbf_dict).
+ """
+ super().__init__()
+
+ self.centers = centers.clone().detach() # Fixed RBF centers
+ self.r_max = r_max
+ self.num_centers, self.dimension = centers.shape
+ self.rbf_type = rbf_type.lower() # Store selected RBF type as an attribute
+
+ # Ensure rbf_type is valid
+ if self.rbf_type not in rbf_dict:
+ raise ValueError(f"Invalid RBF type '{self.rbf_type}'. Available options: {list(rbf_dict.keys())}")
+
+ self.rbf_function = rbf_dict[self.rbf_type] # Store selected RBF function
+
+ # Trainable parameters (weights for RBFs) - match Wendland's model!
+ self.weights = nn.Parameter(torch.zeros(self.num_centers)) # Initialize to zeros
+ self.a0 = nn.Parameter(torch.tensor(0.0)) # Bias term initialized as 0 (like Wendland)
+
+ def rbf(self, x):
+ """
+ Compute the RBF values for input x using the selected RBF function.
+ """
+ r = torch.cdist(x, self.centers) / self.r_max # Compute normalized distance
+ return self.rbf_function(r) # Apply the selected RBF function
+
+ def forward(self, x):
+ """
+ Forward pass: Compute RBF output.
+ """
+ rbf_output = self.rbf(x)
+ rbf_term = rbf_output @ self.weights
+ return self.a0 + rbf_term # No polynomial correction term
+
+ def get_rbf_type(self):
+ """Return the currently selected RBF type."""
+ return self.rbf_type
diff --git a/src/displacementSmartSimMotionSolver/pytorchApproximationModels/test_rbf_network_stream_function.py b/src/displacementSmartSimMotionSolver/pytorchApproximationModels/test_rbf_network_stream_function.py
new file mode 100644
index 0000000..d80bbb7
--- /dev/null
+++ b/src/displacementSmartSimMotionSolver/pytorchApproximationModels/test_rbf_network_stream_function.py
@@ -0,0 +1,243 @@
+import numpy as np
+import matplotlib.pyplot as plt
+import torch
+import torch.nn as nn
+import torch.optim as optim
+import csv
+import pandas as pd
+import os
+
+from rbf_network import rbf_dict, RadialBasisFunctionNetwork
+
+def psi(x, y):
+ """
+ Compute the stream function ψ(x, y) for the given domain.
+ """
+ return np.sin(np.pi * x)**2 * np.sin(np.pi * y)**2
+
+def compute_velocity(x, y, psi_values):
+ """
+ Compute velocity field (u, v) from stream function ψ.
+ """
+ dy, dx = np.gradient(psi_values, y[:, 0], x[0, :])
+ u = dy # u = ∂ψ/∂y
+ v = -dx # v = -∂ψ/∂x
+ return u, v
+
+def visualize_psi(x, y, psi_values, rbf_type, centers, title):
+ plt.figure(figsize=(6, 6))
+ plt.contourf(x, y, psi_values, levels=20, cmap='viridis')
+ plt.colorbar(label='ψ')
+ plt.title(title + f"-rbf_type_{rbf_type}-num_centers_{len(centers)}")
+ plt.xlabel('x')
+ plt.ylabel('y')
+ plt.grid()
+
+ # Plot centers
+ centers_np = centers.numpy() # Convert from torch tensor to numpy
+ plt.scatter(centers_np[:, 0], centers_np[:, 1], color='white', marker='x', s=100, linewidths=2, label='Centers')
+ plt.legend()
+
+ fig_name = title.replace(" ", "-")
+ plt.savefig(f"{fig_name}-rbf_type_{rbf_type}-num_centers_{len(centers)}.png", dpi=200)
+
+def visualize_velocity_field(x, y, u, v, rbf_type, num_centers, title="Velocity"):
+ plt.figure(figsize=(6, 6))
+ plt.quiver(x, y, u, v)
+ plt.title(f"{title}-{rbf_type}-n_centers_{num_centers}")
+ plt.xlabel('x')
+ plt.ylabel('y')
+ plt.grid()
+ fig_name = title.replace(" ", "-")
+ plt.savefig(f"{fig_name}-rbf_type_{rbf_type}-num_centers_{num_centers}.png", dpi=200)
+
+def generate_centers(num_centers):
+ """
+ Generate grid-based RBF centers within the domain [0, 1] x [0, 1].
+ """
+ x = np.linspace(0, 1, num_centers)
+ y = np.linspace(0, 1, num_centers)
+ X, Y = np.meshgrid(x, y)
+ centers = np.vstack([X.ravel(), Y.ravel()]).T
+ return torch.tensor(centers, dtype=torch.float32)
+
+def estimate_convergence_order(csv_filename):
+ """
+ Opens a CSV file containing numerical convergence results and estimates the
+ convergence order for each error column using log-log error reduction.
+
+ The last row's convergence order is set equal to the second-to-last row.
+
+ Parameters:
+ csv_filename (str): The path to the CSV file to process.
+ """
+ # Load the CSV file
+ df = pd.read_csv(csv_filename)
+
+ # Ensure required columns exist
+ required_columns = {"point_dist", "err_mean", "err_max"}
+ if not required_columns.issubset(df.columns):
+ raise ValueError(f"Missing required columns in CSV: {required_columns - set(df.columns)}")
+
+ # List of error columns to process
+ error_columns = ["err_mean", "err_max"]
+
+ for error_col in error_columns:
+ convergence_orders = [] # Store convergence orders for this error type
+
+ for i in range(len(df) - 1): # Iterate up to the second-to-last row
+ h_coarse, h_fine = df.iloc[i]["point_dist"], df.iloc[i + 1]["point_dist"]
+ err_coarse, err_fine = df.iloc[i][error_col], df.iloc[i + 1][error_col]
+
+ if err_coarse > 0 and err_fine > 0: # Avoid log errors due to zero or negative values
+ p = np.log(err_coarse / err_fine) / np.log(h_coarse / h_fine)
+ convergence_orders.append(p)
+ else:
+ convergence_orders.append(np.nan)
+
+ # Ensure last row gets the same convergence order as the previous row
+ convergence_orders.append(convergence_orders[-1] if len(convergence_orders) > 0 else np.nan)
+
+ # Add convergence order column to DataFrame
+ df[f"{error_col}_convergence_order"] = convergence_orders
+
+ # Save the updated CSV file
+ df.to_csv(csv_filename, index=False)
+
+ print(f"Updated {csv_filename} with convergence orders for {error_columns}.")
+
+def main(num_points, rbf_type):
+ # Generate training data
+ x = np.linspace(0, 1, num_points)
+ y = np.linspace(0, 1, num_points)
+ X, Y = np.meshgrid(x, y)
+ xy_train = np.column_stack((X.flatten(), Y.flatten()))
+ psi_train = psi(xy_train[:, 0], xy_train[:, 1])
+
+ # Convert training data to torch tensors
+ x_train = torch.tensor(xy_train, dtype=torch.float32)
+ y_train = torch.tensor(psi_train, dtype=torch.float32)
+
+ # Generate centers
+ centers = x_train
+ print(centers.shape)
+
+ # Gaussian 3d-order support
+ #r_max = 2.5 / num_points
+ r_max = 2.5 / num_points
+
+ # Initialize model
+ model = RadialBasisFunctionNetwork(centers, r_max, rbf_dict, rbf_type=rbf_type)
+
+ # Optimizer and loss
+ optimizer = optim.Adam(model.parameters(), lr=0.05)
+ criterion = torch.nn.MSELoss()
+
+ # Training loop
+ epochs = 4000
+ best_loss = float("inf") # Initialize best loss to a large value
+ best_model_state = None # Store best model state
+ stop_loss = 1e-08
+
+ for epoch in range(epochs):
+ model.train()
+ optimizer.zero_grad()
+ output = model(x_train)
+ loss = criterion(output, y_train)
+ loss.backward()
+ optimizer.step()
+
+ # Save the model if it has the lowest loss so far
+ if loss.item() < best_loss:
+ best_loss = loss.item()
+ best_model_state = model.state_dict().copy() # Copy best model state
+
+ # Early stopping criterion
+ if loss.item() < stop_loss:
+ print(f"Stopping early at epoch {epoch + 1} due to reaching loss {loss.item()} < {stop_loss}")
+ break
+
+ # Print progress every 50 epochs
+ if epoch == 1 or (epoch + 1) % 50 == 0:
+ print(f'Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.14f}, Best Loss: {best_loss:.14f}')
+
+ # Restore the best model state if training didn't reach convergence
+ if best_model_state:
+ model.load_state_dict(best_model_state)
+ print(f"Restored best model with loss: {best_loss:.14f}")
+
+ # Save the best model to file
+ torch.save(best_model_state, "best_rbf_model.pth")
+ print("Best model saved as 'best_rbf_model.pth'.")
+
+ # Generate validation data
+ num_points_val = 100
+ x_val = np.linspace(0, 1, num_points_val)
+ y_val = np.linspace(0, 1, num_points_val)
+ X_val, Y_val = np.meshgrid(x_val, y_val)
+ xy_val = np.column_stack((X_val.flatten(), Y_val.flatten()))
+ psi_val = psi(X_val, Y_val)
+
+ # Evaluate predictions at validation points
+ model.eval()
+ with torch.no_grad():
+ x_val = torch.tensor(xy_val, dtype=torch.float32)
+ pred = model(x_val).numpy()
+
+ # Reshape for visualization
+ psi_pred = pred.reshape(X_val.shape)
+
+ # Visualize actual and predicted stream functions
+ visualize_psi(X_val, Y_val, psi_val, rbf_type,
+ centers, title="Actual Stream Function")
+ visualize_psi(X_val, Y_val, psi_pred, rbf_type,
+ centers, title="Predicted Stream Function")
+
+ err_val = np.abs(psi_pred - psi_val) / np.max(psi_val)
+ visualize_psi(X_val, Y_val, err_val, rbf_type, centers,
+ title="Stream Function Relative Error")
+
+ # Define the filename
+ csv_filename = "stream_function_validation.csv"
+
+ # Define the header and the values to be appended
+ header = ["model_rbf_type", "num_points", "support_radius",
+ "point_dist", "err_mean", "err_max"]
+
+ data = [model.rbf_type, num_points, r_max, 1.0 / num_points,
+ np.mean(err_val), np.max(err_val)]
+
+ # Check if file exists
+ file_exists = os.path.isfile(csv_filename)
+
+ # Open file in append mode
+ with open(csv_filename, mode='a', newline='') as file:
+ writer = csv.writer(file)
+
+ # If the file doesn't exist, write the header first
+ if not file_exists:
+ writer.writerow(header)
+
+ # Append the data row
+ writer.writerow(data)
+
+ print(f"Appended to {csv_filename}: {data}")
+
+ # Compute and visualize actual and predicted velocity fields
+ u_val, v_val = compute_velocity(X_val, Y_val, psi_val)
+ visualize_velocity_field(X_val, Y_val, u_val, v_val, rbf_type, num_points,
+ title="Velocity Field")
+
+ u_pred, v_pred = compute_velocity(X_val, Y_val, psi_pred)
+ visualize_velocity_field(X_val, Y_val, u_pred, v_pred, rbf_type, num_points,
+ title="Predicted Velocity Field")
+
+if __name__ == "__main__":
+
+ # Run the parameter study
+ for rbf_type in ["gaussian"]:
+ for num_points in [4,8,16,32]:
+ main(num_points, rbf_type)
+
+ # Estimate convergence order
+ estimate_convergence_order("stream_function_validation.csv")
\ No newline at end of file
diff --git a/src/displacementSmartSimMotionSolver/pytorchApproximationModels/test_rbf_network_stream_function_boundary.py b/src/displacementSmartSimMotionSolver/pytorchApproximationModels/test_rbf_network_stream_function_boundary.py
new file mode 100644
index 0000000..b498147
--- /dev/null
+++ b/src/displacementSmartSimMotionSolver/pytorchApproximationModels/test_rbf_network_stream_function_boundary.py
@@ -0,0 +1,219 @@
+import numpy as np
+import matplotlib.pyplot as plt
+import torch
+import torch.nn as nn
+import torch.optim as optim
+import csv
+import os
+
+from rbf_network import rbf_dict, RadialBasisFunctionNetwork
+
+
+def velocity_u(x, y):
+ return (np.sin(np.pi * x) ** 2) * np.sin(2 * np.pi * y) * np.pi
+
+def velocity_v(x, y):
+ return -np.sin(2 * np.pi * x) * (np.sin(np.pi * y) ** 2) * np.pi
+
+def generate_boundary_points(num_rays, R, C):
+ theta = np.linspace(0, 2 * np.pi, num_rays, endpoint=False)
+
+ circle_x = C[0] + R * np.cos(theta)
+ circle_y = C[1] + R * np.sin(theta)
+ circle_boundary = np.column_stack((circle_x, circle_y))
+
+ outer_boundary = []
+ for t in theta:
+ dx, dy = np.cos(t), np.sin(t)
+ intersections = []
+
+ if dx != 0:
+ for x_edge in [0.0, 1.0]:
+ s = (x_edge - C[0]) / dx
+ y = C[1] + s * dy
+ if 0 <= y <= 1 and s > 0:
+ intersections.append([x_edge, y])
+ if dy != 0:
+ for y_edge in [0.0, 1.0]:
+ s = (y_edge - C[1]) / dy
+ x = C[0] + s * dx
+ if 0 <= x <= 1 and s > 0:
+ intersections.append([x, y_edge])
+
+ if intersections:
+ dists = [np.linalg.norm(np.array(p) - np.array(C)) for p in intersections]
+ outer_point = intersections[np.argmin(dists)]
+ outer_boundary.append(outer_point)
+
+ outer_boundary = np.array(outer_boundary)
+ boundary_points = np.vstack([outer_boundary, circle_boundary])
+ return torch.tensor(boundary_points, dtype=torch.float32)
+
+
+def filter_inside_circle(points, R, C):
+ distances = np.sqrt((points[:, 0] - C[0]) ** 2 + (points[:, 1] - C[1]) ** 2)
+ return points[distances > R]
+
+
+def visualize_velocity_field_with_mask(x, y, u, v, rbf_type, centers, title, R, C):
+ fig, ax = plt.subplots(figsize=(6, 6))
+ ax.set_aspect('equal')
+ ax.quiver(x, y, u, v, scale=40)
+
+ circle = plt.Circle(C, R, color='white', zorder=10)
+ ax.add_patch(circle)
+
+ num_centers = len(centers)
+ s_max, s_min = 100, 25
+ num_min, num_max = 16, 128
+ s = s_max - (s_max - s_min) * (num_centers - num_min) / (num_max - num_min)
+ s = max(s_min, min(s_max, s))
+
+ centers_np = centers.numpy()
+ ax.scatter(centers_np[:, 0], centers_np[:, 1], color='k', marker='x', s=s, linewidths=2, label='Centers')
+ ax.legend()
+ ax.set_title(f"{title} {rbf_type.upper()} {num_centers}")
+ ax.set_xlabel('x')
+ ax.set_ylabel('y')
+ ax.grid(True)
+
+ fig_name = title.replace(" ", "-")
+ plt.savefig(f"{fig_name}-rbf_type_{rbf_type}-num_centers_{num_centers}.png", dpi=200)
+ plt.close(fig)
+
+def visualize_velocity_error_norm(x, y, u_pred, v_pred, rbf_type, centers, title, R, C):
+ """
+ Visualize the 2-norm of the velocity error at validation points.
+ """
+ # Exact velocity
+ u_true = velocity_u(x, y)
+ v_true = velocity_v(x, y)
+
+ error_norm = np.sqrt((u_pred - u_true)**2 + (v_pred - v_true)**2)
+
+ fig, ax = plt.subplots(figsize=(6, 6))
+ ax.set_aspect("equal")
+
+ # Plot error as color scatter
+ sc = ax.scatter(x, y, c=error_norm, cmap='magma', s=10)
+ plt.colorbar(sc, ax=ax, label="||u_pred - u_true||")
+
+ # Mask the circle area in white
+ circle = plt.Circle(C, R, color='white', zorder=10)
+ ax.add_patch(circle)
+
+ # Plot centers
+ num_centers = len(centers)
+ s_max, s_min = 100, 25
+ num_min, num_max = 16, 128
+ s = s_max - (s_max - s_min) * (num_centers - num_min) / (num_max - num_min)
+ s = max(s_min, min(s_max, s))
+ centers_np = centers.numpy()
+ ax.scatter(centers_np[:, 0], centers_np[:, 1], color='k', marker='x', s=s, linewidths=2, label='Centers')
+
+ ax.set_title(f"{title} {rbf_type.upper()} {num_centers}")
+ ax.set_xlabel("x")
+ ax.set_ylabel("y")
+ ax.grid(True)
+ ax.legend()
+
+ fig_name = f"{title.replace(' ', '-')}-rbf_type_{rbf_type}-num_centers_{num_centers}.png"
+ plt.savefig(fig_name, dpi=200)
+ plt.close(fig)
+
+
+def main(num_points, rbf_type):
+ R = 0.15
+ C = (0.5, 0.75)
+
+ centers = generate_boundary_points(num_points, R=R, C=C)
+
+ num_points_val = 100
+ x_val = np.linspace(0, 1, num_points_val)
+ y_val = np.linspace(0, 1, num_points_val)
+ X_val, Y_val = np.meshgrid(x_val, y_val)
+ xy_val = np.column_stack((X_val.flatten(), Y_val.flatten()))
+ xy_val_filtered = filter_inside_circle(xy_val, R=R, C=C)
+
+ # Training data (u, v)
+ x_train = centers
+ u_train = torch.tensor(velocity_u(centers[:, 0], centers[:, 1]), dtype=torch.float32)
+ v_train = torch.tensor(velocity_v(centers[:, 0], centers[:, 1]), dtype=torch.float32)
+
+ # Fit two RBF models: one for u, one for v
+ r_max = 3 / num_points
+
+ def train_component_model(y_train):
+ model = RadialBasisFunctionNetwork(x_train, r_max, rbf_dict, rbf_type=rbf_type)
+ optimizer = optim.Adam(model.parameters(), lr=0.05)
+ criterion = nn.MSELoss()
+ best_loss = float("inf")
+ best_model_state = None
+ stop_loss = 1e-6
+ epochs = 4000
+
+ for epoch in range(epochs):
+ model.train()
+ optimizer.zero_grad()
+ output = model(x_train)
+ loss = criterion(output, y_train)
+ loss.backward()
+ optimizer.step()
+
+ if loss.item() < best_loss:
+ best_loss = loss.item()
+ best_model_state = model.state_dict().copy()
+
+ if loss.item() < stop_loss:
+ break
+
+ if best_model_state:
+ model.load_state_dict(best_model_state)
+ model.eval()
+ return model
+
+ model_u = train_component_model(u_train)
+ model_v = train_component_model(v_train)
+
+ # Predict velocities at validation points
+ with torch.no_grad():
+ x_val_torch = torch.tensor(xy_val_filtered, dtype=torch.float32)
+ u_pred = model_u(x_val_torch).numpy()
+ v_pred = model_v(x_val_torch).numpy()
+
+ # Visualize velocity field
+ visualize_velocity_field_with_mask(
+ xy_val_filtered[:, 0], xy_val_filtered[:, 1], u_pred, v_pred,
+ rbf_type, centers, title="Velocity Field", R=R, C=C
+ )
+
+ # Visualize 2-norm error
+ visualize_velocity_error_norm(
+ xy_val_filtered[:, 0], xy_val_filtered[:, 1], u_pred, v_pred,
+ rbf_type, centers, title="Velocity Error Norm", R=R, C=C
+ )
+
+ # Save mean/max error if desired
+ u_true = velocity_u(xy_val_filtered[:, 0], xy_val_filtered[:, 1])
+ v_true = velocity_v(xy_val_filtered[:, 0], xy_val_filtered[:, 1])
+ err_u = np.abs(u_pred - u_true) / (np.max(np.abs(u_true)) + 1e-12)
+ err_v = np.abs(v_pred - v_true) / (np.max(np.abs(v_true)) + 1e-12)
+
+ csv_filename = "velocity_validation.csv"
+ header = ["model_rbf_type", "num_points", "r_max", "err_mean_u", "err_max_u", "err_mean_v", "err_max_v"]
+ data = [rbf_type, num_points, r_max, np.mean(err_u), np.max(err_u), np.mean(err_v), np.max(err_v)]
+
+ file_exists = os.path.isfile(csv_filename)
+ with open(csv_filename, mode='a', newline='') as file:
+ writer = csv.writer(file)
+ if not file_exists:
+ writer.writerow(header)
+ writer.writerow(data)
+
+ print(f"Appended to {csv_filename}: {data}")
+
+
+if __name__ == "__main__":
+ for rbf_type in ["gaussian", "wendland_d2_c4"]:
+ for num_points in [16, 32, 64, 128]:
+ main(num_points, rbf_type)
diff --git a/tutorials/meshMotion/openfoam-smartsim-mesh-motion.ipynb b/tutorials/meshMotion/openfoam-smartsim-mesh-motion.ipynb
index 99de26e..70ef518 100644
--- a/tutorials/meshMotion/openfoam-smartsim-mesh-motion.ipynb
+++ b/tutorials/meshMotion/openfoam-smartsim-mesh-motion.ipynb
@@ -10,133 +10,33 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "SmartRedis Library@09-47-22:WARNING: Environment variable SR_LOG_FILE is not set. Defaulting to stdout\n",
- "SmartRedis Library@09-47-22:WARNING: Environment variable SR_LOG_LEVEL is not set. Defaulting to INFO\n",
- "{'torch'}\n",
- "09:49:31 mma120347 SmartSim[391567] INFO of_model(391814): Completed\n"
+ "SmartRedis Library@12-18-00:WARNING: Environment variable SR_LOG_FILE is not set. Defaulting to stdout\n",
+ "SmartRedis Library@12-18-00:WARNING: Environment variable SR_LOG_LEVEL is not set. Defaulting to INFO\n",
+ "Cleaning case /home/MMAuser/Projects/research/openfoam/openfoam-smartsim/tutorials/meshMotion/spinningDisk\n",
+ "Allrun.pre in spinningDisk executed with return code: 0\n",
+ "Running blockMesh on /home/MMAuser/Projects/research/openfoam/openfoam-smartsim/tutorials/meshMotion/spinningDisk\n",
+ "Running decomposePar on /home/MMAuser/Projects/research/openfoam/openfoam-smartsim/tutorials/meshMotion/spinningDisk\n"
]
- }
- ],
- "source": [
- "#!/usr/bin/python3\n",
- "\n",
- "# Parsing OpenFOAM configuration files\n",
- "from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile\n",
- "import os\n",
- "import sys\n",
- "import pandas as pd\n",
- "\n",
- "# SmartSim\n",
- "from smartsim import Experiment\n",
- "from smartredis import Client\n",
- "\n",
- "from matplotlib import pyplot as plt\n",
- "from matplotlib import rcParams\n",
- "rcParams[\"figure.dpi\"] = 200\n",
- "\n",
- "import torch\n",
- "import torch.nn as nn\n",
- "import numpy as np\n",
- "import io\n",
- "from sklearn.model_selection import train_test_split\n",
- "import torch.optim as optim \n",
- "\n",
- "from sklearn.metrics import mean_squared_error\n",
- "from sklearn.preprocessing import MinMaxScaler,StandardScaler\n",
- "\n",
- "# For calling pre-processing scripts\n",
- "import subprocess\n",
- "\n",
- "class MLP(nn.Module):\n",
- " def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):\n",
- " super(MLP, self).__init__()\n",
- "\n",
- " layers = []\n",
- " layers.append(nn.Linear(input_size, layer_width))\n",
- " layers.append(activation_fn)\n",
- "\n",
- " for _ in range(num_layers - 2):\n",
- " layers.append(nn.Linear(layer_width, layer_width))\n",
- " layers.append(activation_fn)\n",
- "\n",
- " layers.append(nn.Linear(layer_width, output_size))\n",
- " self.layers = nn.Sequential(*layers)\n",
- "\n",
- " def forward(self, x):\n",
- " return self.layers(x)\n",
- " \n",
- "def sort_tensors_by_names(tensors, tensor_names):\n",
- " # Pair each tensor with its name and sort by the name\n",
- " pairs = sorted(zip(tensor_names, tensors))\n",
- "\n",
- " # Extract the sorted tensors\n",
- " tensor_names_sorted, tensors_sorted = zip(*pairs)\n",
- "\n",
- " # Convert back to list if needed\n",
- " tensor_names_sorted = list(tensor_names_sorted)\n",
- " tensors_sorted = list(tensors_sorted)\n",
- "\n",
- " return tensors_sorted, tensor_names_sorted\n",
- "\n",
- "def visualization_points(n_points):\n",
- "\n",
- " domain_min = [-3, -3, 0]\n",
- " domain_max = [3, 3, 0]\n",
- " radius = 1\n",
- "\n",
- " # Generate grid of points\n",
- " x = np.linspace(domain_min[0], domain_max[0], n_points)\n",
- " y = np.linspace(domain_min[1], domain_max[1], n_points)\n",
- " xx, yy = np.meshgrid(x, y)\n",
- " grid_points = np.column_stack((xx.ravel(), yy.ravel(), np.zeros(n_points**2)))\n",
- "\n",
- " # Filter out points within the circle\n",
- " norm = np.linalg.norm(grid_points[:, :2], axis=1)\n",
- " visualization_points = grid_points[norm > radius]\n",
- "\n",
- " return visualization_points\n",
- "\n",
- "\n",
- "exp = Experiment(\"mesh-motion\", launcher=\"local\")\n",
- "\n",
- "db = exp.create_database(port=8000, # database port\n",
- " interface=\"lo\") # network interface to use\n",
- "exp.start(db)\n",
- "\n",
- "# Connect the python client to the smartredis database\n",
- "client = Client(address=db.get_address()[0], cluster=False)\n",
- "\n",
- "num_mpi_ranks = 4\n",
- "\n",
- "of_rs = exp.create_run_settings(exe=\"moveDynamicMesh\", exe_args=\"-case spinningDisk -parallel\", \n",
- " run_command=\"mpirun\", \n",
- " run_args={\"np\": f\"{num_mpi_ranks}\"})\n",
- "\n",
- "of_model = exp.create_model(name=\"of_model\", run_settings=of_rs)"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": 2,
- "id": "a7838a43",
- "metadata": {},
- "outputs": [
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "Restore 0/ from 0.orig/\n"
+ ]
+ },
{
"name": "stdout",
"output_type": "stream",
"text": [
- "Cleaning case /home/MMAuser/Projects/research/openfoam/openfoam-smartsim/tutorials/meshMotion/spinningDisk\n",
- "Allrun.pre in spinningDisk executed with return code: 0\n",
- "Restore 0/ from 0.orig/\n",
- "Running blockMesh on /home/MMAuser/Projects/research/openfoam/openfoam-smartsim/tutorials/meshMotion/spinningDisk\n",
- "Running decomposePar on /home/MMAuser/Projects/research/openfoam/openfoam-smartsim/tutorials/meshMotion/spinningDisk\n",
"Allrun.pre in spinningDisk executed with return code: 0\n",
- "Time step 1\n"
+ "Time step 1\n",
+ "RMSE 0.0035360381339663675, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACa7UlEQVR4nOzdd3iV9f3/8ddZ2QtCFiTMMIMKCqgIIirgHl9XVcRVa61aa7G2tRa1/XVYte5qq9aBu1q31o0MRZChGGZkJQTIIHuecf/+CBxyJyEDTnKfc/J8XFeunPt97nOf9w2IOS8+w2YYhiEAAAAAAAAEhN3qBgAAAAAAAMIJYQsAAAAAAEAAEbYAAAAAAAAEEGELAAAAAABAABG2AAAAAAAABBBhCwAAAAAAQAARtgAAAAAAAAQQYQsAAAAAAEAAEbYAAAAAAAAEEGELAAAAAABAABG2AAAAAAAABBBhCwAAAAAAQAARtgAAAAAAAAQQYQsAAAAAAEAAEbYAAAAAAAAEEGELAAAAAABAABG2AAAAAAAABBBhCwAAAAAAQAARtgAAAAAAAAQQYQsAAAG2YMEC2Ww22Ww2nXDCCQc8b985NpstYO99xRVX+K/5zDPPBOy6gbZ161Z/n4MHD7a6nR4TKr8/AADg0BC2AABCwi233GL6cG4YxkFdZ8+ePYqMjOQDLxDknnnmGVMg2fIrMjJSqampmjhxon72s59p4cKFnb5287Bv31dqaqo8Hk+nr+H1epWRkdHqOlu3bu3wtfn5+frTn/6kWbNmKSsrS7GxsXK5XEpKStKoUaN02mmn6Xe/+53eeecdVVdXd+k+uvK1YMGCTt8vAKBrCFsAACHh8ssv9z/etm2bvvjii4O6zssvv6zGxkZJUmxsrM4///yA9Neb9dZRKrBWY2OjiouL9c033+ixxx7TtGnTNH36dOXn5x/U9YqLi/XBBx90+vwPP/xQu3bt6tJ71NfX65ZbbtGQIUN0++2366OPPlJBQYFqa2vl8XhUUVGhDRs26IMPPtCf//xnnXXWWerbt6+++uqrrt4OAMBiTqsbAACgMw477DCNHz9eq1atkiQ999xz7U7ROZDnnnvO//i8885TXFxcoFoE0E3i4+M1Z84cU62+vl7btm3TkiVLVFdXJ6lpCt+JJ56opUuXKjk5ucvv89xzz+nMM8/s9Lld0djYqLPPPlsfffSRvxYREaEJEyZo2LBhiomJUWVlpbZu3arVq1f778ntdqumpqZT7zFnzhzFx8d3uqcBAwZ06R4AAJ1H2AIACBmXX365P2x5/fXX9eijjyo6OrrTr9+4caO+/vpr0/WsdLBTocLBoUwFQ+/Tt29fPfLII20+V1paqp/97Gd69dVXJUl5eXm688479fDDD3f6+mPGjNHatWv1zjvvqLy8XElJSe2eX1FRobfeesv02o789a9/9QctNptNt956q37zm9+0+V5ut1sLFizQq6++qpdeeqnT93HXXXcxugwAggTTiAAAIeOSSy6Ry+WSJFVWVurNN9/s0uub/0v0wIEDNX369EC2B8ACycnJevHFFzVx4kR/7emnn5bb7e70NS677DJJUkNDg1555ZUOz3/11VdVX18vSa1G3LTF7Xbr/vvv9x//4Q9/0F//+tcDhjoul0szZszQE088oYKCAo0fP74TdwEACCaELQCAkJGSkqJTTz3Vf9yVYfyGYej555/3H1922WUB3QUIgHUcDoduuOEG/3FNTY1WrFjR6ddfcsklcjqbBnx35u+Vfee4XC5dcsklHZ6/bNkylZeX+19z0003dbq3pKSkg5oSBQCwFmELACCkNJ/68/HHH3d6gcovvvhC27Zt8x+3/NfoiooKvfTSS7r22mt19NFHq1+/foqIiFBCQoKGDRumiy++WK+++qp8Pl9gbkRd3/r5zTff1Nlnn60BAwYoMjJSmZmZmjFjhubPn9+lXVQkqa6uTm+++aZ+/vOfa8qUKUpLS1NERITi4uI0ePBgnXvuuXrqqaf8iwm3Zd9uMUOGDPHXtm3bdsCdT5o7mEV1ly5dqhtuuEE5OTnq06ePoqKilJmZqVNOOUWPPPJIp9a1uPPOO/3ve+edd0qSPB6PnnvuOZ188sn+X9uMjAydc845evfddzvVW3eprq7WQw89pFmzZikzM1NRUVHq06ePxo4dqxtuuME0La4j+fn5uuuuu3T88ccrLS1NkZGRioiIUHJyso444ghdcskleuyxx9r9b8rtduv555/X//3f/2no0KGKi4uT0+lUfHy8srOzNWvWLM2bN0/Lli0LxO13ybhx40zHhYWFnX5tamqqTjnlFEnSl19+qR9++OGA527ZskVLliyRJJ1yyilKSUnp8Po7duzwP+7bt2+X1lUBAIQoAwCAENLQ0GD07dvXkGRIMu67775Ove7KK6/0v+bYY481Pff6668bkZGR/ufb+zriiCOMzZs3t/ten3/+uf/8adOmHfC85tdtT1VVlXHaaae129eUKVOMnTt3Gpdffrm/9vTTT7d5vaVLlxpxcXGdut/BgwcbK1eubPM6Tz/9dKeu0dY9btmyxV8fNGhQu/dfXV1tXHTRRR1ePyMjw3j//ffbvdYdd9zhP/+OO+4wCgoKjMmTJ7d73SuvvNLwer3tXrezOvP7s88777xjpKend3jfl1xyiVFTU9Putf75z38a0dHRnfp9Ou6449q8xoYNG4zRo0d3+vd706ZNB/vLZBiG+c9XR39GDMMwNm7caHr/F1544YDnNv/zJ8moq6szXn31Vf/xvHnzDvjaO++803/ef/7zH6Ours50rS1btrR6zX/+8x//8zabzaiuru7ML0GHWt5HW+8NALAGC+QCAEJKRESELr74Yj366KOSmobz//KXv2z3NXV1dXrttdf8xy0Xxi0qKlJDQ4MkKTMzU2PGjFF6erpiYmJUXV2tdevWaeXKlTIMQ99++62OP/54rV69ukeG9rvdbp1++ulauHChv5aenq7jjz9e8fHxysvL0+LFi7V48WKde+65Gjp0aIfXLCsrU3V1taSmf9HPyclRZmamYmNjVVtbq7y8PC1btkwej0dbt27VtGnTtHLlSmVnZ5uuM3r0aF1//fWqqqryT6toa9eYQ1FbW6sTTzzRNFKif//+mjp1quLi4vz37/V6tXPnTp111ll66aWXOrWld3V1tU455RR9//33iomJ0dSpU5WVlaWqqip9/vnnKioqktS0/sfIkSP161//OmD31ZFXXnlFl156qbxer6SmaTJTpkxRdna2qqurtWjRIv/IjRdffFFbtmzRZ599pqioqFbXevPNN3Xttdf6jxMSEnTssccqMzNTTqdTFRUV2rhxo77//vsDjmSqqqrSySef7N9W2W63a/z48Ro9erTi4uJUW1urHTt26Ntvv1VJSUmgfzk6peVIlrS0tC69/qyzzlJSUpLKy8v1/PPP+0dBtbTvz3qfPn105plndmqh52HDhvkfG4ahv/3tb7rrrru61B8AIMRYHPYAANBly5YtM/1r7nfffdfu+S+88IL/3MjISKOsrMz0/Ntvv2385S9/afdf4jdv3mzMmjXLf52rr776gOcGcmTLH/7wB9O/iP/pT38yPB6P6ZwNGzYYRxxxhCHJiIiI6NTIlttuu81Ys2bNAd939+7dxmWXXea/1kknnXTAc7sySqWrr7nuuuv85zkcDuOBBx5oNcpk48aNxlFHHeU/LyEh4YD/wt98ZMu+0UyXX365UVpaajqvpqbGuPjii/3nxsXFBWQ0QmdGtuTl5ZlGHk2aNKnVn02v12vcd999ht1u95934403tnm9cePG+c+54YYbDjgKpqqqynj11VeNX//6162ee+CBB/zXGDNmjLF+/fo2r+Hz+Yxly5YZ1113nbF9+/Z2fiU61tWRLb/97W/957tcLmPPnj0HPLetkS2GYRg/+clP/LWFCxe2et2iRYv8z1977bWGYRidGtni8/mMwYMHm/5bnj17tvHVV18ZPp+vc78gnbgPRrYAQPAgbAEAhKTm0xluueWWds9tHpJceOGFB/2ejY2NxuGHH25IMqKiog74YS5QYUt5ebkRExPjP+fOO+884LWKioqMjIwM0zU7mqbSGaeeeqr/emvXrm3znO4KW/Ly8kxhwiOPPHLA6+3Zs8f0YfbKK69s87zmYYsk4+KLLz7gNevq6oysrCz/uS+//HKn7q09nQlb5syZ4z8nOzvbKC8vP+D1/v73v/vPtdvtraa4VVVV+Z/Pyso66A/25513nv86H3/88UFdo6u6ErasXbvWiI+P959/ySWXtHv+gcKWJUuW+Gs//vGPW73ummuu8T//5ZdfGobRubDFMAzjtddeM5237ys5Odk47bTTjHnz5hnvvPNOuyFRR/cxZ84c4/rrr+/U1wMPPNDp9wEAdB1hCwAgJP31r3/1f8Do379/q9Ee+xQWFhoOh8N/7nvvvXdI73v33Xf7r/X222+3eU6gwpZ//OMf/uczMzONhoaGdnv717/+FfCw5ZVXXvFf76GHHmrznO4KW37961/7zxk3blyHQUHzXiMjI9sMKZqHLREREcbOnTvbveatt97qP/+Xv/xlp+6tPR2FLWVlZab1g/773/+2ez2v12vk5OT4z//Nb35jen7Hjh2mX8ODNWPGDP91Vq9efdDX6YqOwpb6+npjw4YNxt/+9jcjKSnJf+6oUaOMXbt2tXvtA4UthmEY2dnZhiQjMTHRVK+rq/O/z/Dhw031zo4uefLJJ42oqKg2Q5fmo14mTZpkPPzww6b378x9dOWrvb+bAACHjjVbAAAhafbs2brtttvk8/lUWFioTz75RLNmzWp13gsvvOBf9yI9Pb3Nc5orLy/X0qVLlZubq9LSUlVXV5t2IFq/fr3/8erVq3XmmWcG6I5a+/zzz/2PL7roIkVERLR7/o9+9CPdcMMN7e4g1FJtba2WLl2qNWvWqLi4WFVVVf5fL8m8i8rq1as733wAfPbZZ/7HV1xxRYe7Np177rnq27ev9uzZo4aGBn311Vf+HWbaMmXKFKWnp7d7zfHjx/sfb926tXONH4Ivv/zSv35Qv379OvzzZbfbddVVV2nu3LmSzH9m9l0jKipK9fX1+v7777VkyRIdd9xxXe4rKyvL//jxxx/XY4891uVrHIp9u1y1x26365xzztGjjz7a5fVamrvssst0xx13qKKiQm+99ZYuuugiSdJbb73l3775sssuO6hrX3311ZoxY4buvvtuvfTSSyorK2t1jmEYWrZsmZYtW6a7775b8+fP1wknnHCwtwMAsAhhCwAgJA0YMEAnn3yyPvroI0nS/Pnz2wxS9i1mKUmXXnqpHA5Hm9crKCjQb37zG7322mv+D7sd6e6FQFetWuV/fOyxx3Z4fnx8vMaOHauVK1d2eO6ePXs0b948Pffcc6qqqupUPz258KlhGKZwZ/LkyR2+xuVyadKkSfrf//4nSVq5cmW7Ycthhx3W4TWbL4JcWVnZ4fmHqvnv+aRJk+R0dvyjWvPwZNWqVTIMwx9MRERE6JxzztHLL78sj8ejE088URdddJHOP/98HX/88UpKSupUXxdeeKH+/e9/S2oKW1asWKHLL79cs2bNarVwslXOOussPfXUU52+pwO57LLLdOedd8owDD333HP+sGXf3yU2m+2gwxZJGjhwoB599FHdf//9+vrrr7Vo0SItX75cK1as8C9AvE9BQYFmzJih9957TzNnzuzw2lu2bOn0VuoAgO5F2AIACFmXX365P2x54403VF1drbi4OP/zq1at0po1a0znt2XVqlU66aST2vxX5vZ0NqQ4WMXFxf7HAwcO7NRrBg4c2GHYsm3bNh1//PHavn17l/rp7vttrqKiQm632388aNCgTr2u+QfNjsKhxMTEDq/ncrn8j5v3012a/54fzD03NjaqqqpKCQkJ/tr999+vFStWaNOmTWpsbNT8+fM1f/582e125eTkaOrUqZoxY4ZOPfVURUZGtvkes2bN0o033qiHH35YkrR8+XItX75cUtOuP1OmTNEJJ5ygc845R5mZmV297Q613OXK4/GosLBQq1atUkFBgaSmXZc2b96sTz/9VP369Tvo9xoyZIimTJmiRYsW6aOPPtLu3bslyf93zdSpUwMSaERERGjq1KmaOnWqv7Z161a99tpreuCBB/yjyjwej+bMmaPNmzcrJibmkN8XANAz7FY3AADAwTr33HP9Hypra2tN2ztL5lEt48ePb3MkQ0NDg8477zx/0JKSkqLbb79dn3/+ufLz81VTUyOfzyejaZ0zPf300/7XNp9e1B32bc8sqdMfsmJjYzs855JLLvEHLfHx8br55pv1v//9T5s3b1Z1dbW8Xq//fptPS+nu+22u+b1Lnbuvlud1FA51NC3FCs3v+2DuWWp93+np6frmm290++23m6bX+Hw+rVmzRv/4xz907rnnKiMjQ3/9619N08iae+ihh/Tf//5XkyZNMtV3796t119/XTfeeKMGDhyo888/v8tBXkf69u2rRx55xP/1+OOP6+2339aWLVv01FNP+be8/u677wKy9fi+YNbj8ejFF1/Uiy++KI/HY3quOwwePFi33HKL1q5da5o6tHv3br3yyivd9r4AgMAjbAEAhKzo6GhdcMEF/uP58+f7H3s8Hr300kv+4wN9QHr99de1ZcsWSU1Tk7799lv98Y9/1AknnKDMzEzFxMSYPpT35OiO5qN0amtrO/Wampqadp//8ssv9eWXX/qvv3TpUv3973/XrFmzNGTIEMXGxspu3//jQU/eb3PN713q+L7aOi8+Pj6gPfWE5vd9MPcstX3fCQkJ+uMf/6gdO3Zo6dKluueee3TOOeeYRoCUlZXpt7/9rc477zwZhtHme5177rn6+uuvtW3bNj377LO69tprNWbMGP/zhmHo9ddf15FHHqmNGzd2qv9D4XQ6ddVVV+nJJ5/01z744AM9++yzh3TdCy64QNHR0ZKaQtt912v5d053SUhI0Pz5803THhctWtTt7wsACBzCFgBASGseoixYsMC/5sGHH37oH/7vcrl0ySWXtPn6Tz/91P/4F7/4hTIyMtp9v23bth1qy52WkpLif9zZkQIt13xoqfn9Xn755aYPym3pyfttLjEx0TSFp7P333wR20OZSmKVg/k9b37PERER7YZMDodDRx99tG655Ra98cYb2r17txYtWqSzzjrLf85bb72l119/vd33HDhwoObMmaPHH39cubm52r59u+666y7/CKzS0lL98pe/7FT/gXDppZea7uH3v/+96uvrD/p6CQkJOvvssyU1LQz97bffSpLOOeecHgvxMjMzlZOT4z/euXNnj7wvACAwCFsAACFtypQpGjp0qKSmaRHPP/+8JPMUolNPPdX0Iba5wsJC/+POLJi6cOHCQ2m3S5rvhLN06dIOz6+urtb333/f7jndcb/dMR3HZrNp3Lhx/uN9o3Ha4/F4/OuISNKRRx4Z8L66W/Pf82XLlh1wSk9zzX9txo8f36XfD7vdrilTpujNN9/UjBkz/PW3336709eQmnYrmjdvnv71r3/5ax999FGnF5sOhL/97W/+kSD5+fl6/PHHD+l6bU1HCsQUpa7YNz1K0gHX0wEABCfCFgBASLPZbKYPQPPnz1dFRYXpw2J7ayw0nzLT0VSdFStWmD7Md7fp06f7H7/yyisdLtD6yiuvdPjhtiv3W1hYqLfeeqvDPpt/IAzkIrInnnii//Gzzz57wKkt+7z55psqLS3199SZHZyCzeTJk/0fqouLi/Xee++1e77P5zOtI9T816wrbDabaZvpfaPCuqr56BK32609e/Yc1HUOxsiRI/WjH/3If3zPPfccUtgzc+ZM09bgGRkZpkCquzU0NJi2mu/sItkAgOBA2AIACHlz5szx/2v+unXrdOutt/qnEPTt21dnnHHGAV+7b1SM1P6/5tfW1uonP/lJgDrunEsuucQ/LSM/P1933333Ac8tLS3VvHnzOrxmZ+/X6/XqJz/5iRobGzu8ZlJSkj/EKS4uDljgcs011/ivu3LlStOoiZbKy8t16623+o8vvvjiTu02FGySkpL8Ww1L0q9+9at218155JFH/Dtu2e32Vn9Gq6qqOvV7KJmnoKWmppqe6+y2382vYbfbTVtn94Tbb7/d/2emsLDQtJZLVzkcDv+2zMuXL9fChQsPuHV8R77++mvde++9nV57SWoaqdN8u/H2tjEHAAQfwhYAQMgbMmSIafvU5h/KL774YkVERBzwtc3/Nf/ZZ5/Vfffd12rqRl5enmbOnKmVK1d2eoeYQEhMTDQFCPPmzdPdd9/dqr9NmzZpxowZKiwsbPdeJen000/3B1MLFizQLbfcorq6OtM5u3bt0nnnnaf33nuvU/cbGRmp4cOHS2oazfDmm2925vY6NGzYMF177bX+4xtuuEGPPvpoq12R9v3+7FvoOCEhoVPBU7CaN2+ef6HcjRs3atasWdq8ebPpHJ/PpwcffNC0Lsr111/fakviFStWaPDgwbrzzju1du3aNt/P6/XqlVde8W/rLDVNvWvu2GOP1SWXXKIPPvjggOHNxo0bTaPITjrppA7/PAbaqFGjdOGFF/qP77777k6HTW3Jzs7WhAkTNGHCBGVnZx/0dcrKyvSrX/1KgwcP1i9/+UutXLnygCO1SkpKdPPNN5v+DI8fP56wBQBCjNPqBgAACITLL7+8zfVFOtqmdebMmTr++OO1cOFCGYahW265RY8++qiOPPJIJSYmatOmTfryyy/l9Xo1YMAA3XTTTaYApLv99re/1ccff6wlS5bIMAz95je/0YMPPqhp06YpLi5OeXl5WrRokbxer44++mgNGzZML7744gGvN2rUKF122WX+NW3uu+8+vfjii5o4caJSU1O1detWLVy4UI2NjYqPj9c999yjn/70px32ed555+nPf/6zpKbFSp955hllZ2ebFrm99957u3z/9957r7755hstX75cHo9HN9xwg/76179qypQpiouL0w8//KCFCxf6Ayin06mnnnqqVegQSoYNG6Ynn3xSl156qbxer7766iuNHDlSU6dO1bBhw1RdXa1FixZpx44d/tccc8wx+tvf/tbm9Xbu3Km77rpLd911l9LT0zVu3Dilp6fL6XRq9+7dWrFihWktn6lTp5qm40hNIdpLL72kl156SdHR0Tr88MM1dOhQJSQkqKysTJs3b9Y333zjPz86Ovqgfr8D4fe//71effVV+Xw+5efn65lnnunxUWkHUlxcrPvvv1/333+/EhMTddRRRykjI0Px8fGqrq7Wpk2btGLFCv8205KUlpamF154wTQF8EDuuOOOLi3gO336dJ133nkHdS8AgA4YAACEgcrKSiMmJsaQ5P8aPXp0p167a9cu48gjjzS9tuXXmDFjjNzcXOPpp5/21y6//PI2r/f555/7z5k2bdoB37f59dtTUVFhnHLKKe32N3nyZKOwsNC4/PLL/bWnn366zevV1NQYM2fObPd6mZmZxuLFizt9L+Xl5caoUaPavWZzW7Zs8dcHDRrU7v1XVVUZF154YbvXlmRkZGQY77//frvXuuOOO/zn33HHHe2eaxid/73srM78/uzzzjvvGGlpaR3e98UXX2zU1NS0eY2lS5caTqezw2vs+zr//PONysrKVtcZO3Zsp68xZMgQY8mSJYf8a9X8v7WO/oy0dMEFF5j6cbvdpueb//mTZNTV1R10n3V1daZrbdmypdU569evN6ZNm2Y4HI5O/zpKMk499VRj8+bNB3zvlvfR1a+bbrrpoO8bANA+RrYAAMJCfHy8zj33XL3wwgv+WkejWvZJS0vTl19+qSeffFIvv/yyvv/+e9XW1io1NVUjR47URRddpEsvvVQxMTFatmxZd93CASUkJOiDDz7Qf//7Xz3zzDNavny59uzZo379+mn06NG69NJLNXv2bNMokvbExMTogw8+0Isvvqhnn31Wq1atUmVlpfr166ehQ4fqvPPO0xVXXKE+ffpowYIFnbpmYmKili9frn/84x967733tG7dOpWXlwdk/Za4uDi98sor+sUvfqH58+drwYIFKiwsVF1dnfr166exY8fqjDPO0FVXXdWj07y62xlnnKG8vDz9+9//1rvvvqvc3FyVlJQoOjpa/fv31/Tp0zVnzhwdffTRB7zG0UcfraKiIn3yySdavHixVq1apR9++EGlpaXyer1KSEjQsGHDdMwxx2j27NmaNGlSm9dZvXq1li5dqs8//1zLli3Thg0bVFhYqNraWsXExPhHzJx11lm68MILLd855/e//71ee+01GYahLVu2aP78+bryyist62fkyJFasGCBSkpKtGDBAi1evFhr1qxRXl6eSktLVV9fr5iYGPXp00ejRo3SpEmTdOGFF3ZqxzAAQHCyGUYHS/sDAAAAAACg01ggFwAAAAAAIIAIWwAAAAAAAAKIsAUAAAAAACCACFsAAAAAAAACiLAFAAAAAAAggAhbAAAAAAAAAoiwBQAAAAAAIIAIWwAAAAAAAAKIsAUAAAAAACCACFsAAAAAAAACiLAFAAAAAAAggAhbAAAAAAAAAoiwBQAAAAAAIICcVjeAttXX12vNmjWSpJSUFDmd/FYBAAAAABBoHo9HxcXFkqTDDjtMUVFRh3xNPsEHqTVr1mjSpElWtwEAAAAAQK+xbNkyTZw48ZCvwzQiAAAAAACAAGJkS5BKSUnxP162bJkyMjIs7AYAAAAAgPC0c+dO/8yS5p/FDwVhS5BqvkZLRkaGMjMzLewGAAAAAIDwF6j1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+uWzn/1sHnnkkXKXB+3e8uXLc8EFF+TQQw/NgAED0qVLl/Tr1y8HH3xwJk6cmJUrV5a7RKg4V155ZaqqqlJVVZWHH3643OVskqpSqVQqdxGQJA888ECOOuqodOnSJSeddFK22267/PrXv87s2bPzgx/8IBdeeGG5S4R2rba2NrNnz07v3r3TtWvXzJ49OxMnTswZZ5xR7tKgInz729/OlVdemV133TWf+MQn0qdPn8yaNSu//e1vUyqVcvPNN+fEE08sd5nQbi1YsCADBw7MiBEjMmjQoPTp0yfvvPNO7r777syePTtHHnlk7r777nTo4PfV0BKeeeaZDB8+PNXV1VmyZElmzpyZAw44oNxlbTRhC61CfX19Bg8enDlz5uThhx/OsGHDkiQLFy7MiBEj8uqrr+aFF17ITjvtVN5CoR279957s/vuu2ennXbKFVdckYsuukjYAi3oN7/5TXr16pXDDjus0fYHH3wwo0ePTrdu3TJv3rx07ty5TBVC+7Z69erU19enU6dOjbbX19fniCOOyNSpU3PHHXdkzJgxZaoQKsfKlStzwAEHpKamJrvvvntuuummNhe2iGVpFe6///689NJLOeWUUxqCliTp0aNHLr744tTV1eXGG28sX4FQAQ4//HCBJpTRZz7zmSZBS5KMHDkyo0aNyjvvvJOnn366DJVBZejQoUOToCVJqqur80//9E9JkhdffLGly4KKdNlll+XZZ5/NDTfckI4dO5a7nM0ibCFvvvlm7rjjjlxyySX5h3/4h/Tu3bvhvrhN/Y327Nmzc+GFF2bw4MHp2rVrdthhh+y33375/ve/n6VLl67zuKlTpyZJjjzyyCZjRx11VJJk2rRpm1QLtBWtoQeh0rX2PqypqUny/l/6oD1qzT24evXq/Pd//3eSZM8999zk46EtaE09+MQTT+Syyy7L+PHjM2TIkM28ovLzjU0+9KEPFXKeKVOm5LTTTsuiRYsati1dujSPP/54Hn/88UyYMCF33nlndttttybHzpo1K0my++67Nxnr169funXr1rAPtDetoQeh0rXmPvzrX/+ae++9N/3798/QoUMLqRNam9bUg3V1dfnud7+bUqmUt956K/fdd1+ee+65jBs3LqNHjy6kTmhtWksPrlixIqeffnqGDRuWb37zm4XUVC5mttDIRz7ykWZnl2zIk08+mRNPPDGLFi1Kt27dctlll2XGjBm57777cs455yRJXnjhhYwZMybvvfdek+MXLlyY5P3bhprTvXv3hn2gPStXDwJ/15r6cOXKlfn85z+fFStW5Morr2yzU6lhU5S7B+vq6vKv//qvufTSS3P11Vfn+eefz9e//vVcd911m31N0JaUswcvueSSzJo1KxMnTmz733klKt4ll1xSmjJlSumNN94olUql0iuvvFJKUkpSGjt27EadY+TIkaUkperq6tKMGTOajH/ve99rOOf48eObjB9xxBGlJKVZs2Y1e/4BAwaUunfvvtHXBG1Ja+jBtV1++eWlJKWJEyduwpVA29Ua+3DVqlWlU045pZSkdM4552zK5UCb01p78LXXXiv9+7//e6lnz56lgw8+uLRw4cJNuSxoM1pDD86YMaPUoUOH0qWXXtpo+9ixY0tJSjNnztzk6yonYQtNbGpjPfLIIw37n3vuuc3us2rVqtIee+xRSlLq2bNnqa6urtH48ccfX0pSevzxx5s9vlu3bqWBAwdu8rVAW1SOHlybsIVKV+4+XLVqVcMPl6eddlpp1apVm3sp0CaVuwfXdtttt5WSlL75zW9u9DHQlrV0D65cubK0++67l4YNG9akN9tq2OI2IrbYb3/724blcePGNbtPhw4dcvrppydJ3n333TzwwAONxj94Vktzz2V54403snjx4maf5wIU04PAlimyD1evXp1x48blxhtvzMknn5xJkyalQwc/ssH6bO3vwg9uqfjgpQ5AY1vag4sXL86sWbPy1FNPpVOnTg0P562qqmp4K+2BBx6YqqqqRp/VmvnmZotNnz49SdK1a9fsu+++69xvzddZPvTQQ82O3XPPPU2O+93vftfkeODviuhBYMsU1YcfBC2TJ0/OiSeemF/84hdt/551aAFb+7tw7ty5Sf7+ZjCgsS3twc6dO+ess85q9s8Hv3T/x3/8x5x11lmpra3dOhdRMG8jYov95S9/SZLstttu630l5eDBg5sc84HRo0dnl112yc0335wvf/nLGTZsWJL3H5z73e9+N506dWpIQYHGiuhBYMsU0YerV6/OmWeemcmTJ+eEE07ITTfdJGiBjVRED/75z39ObW1ttt1220bbly5dmgsuuCBJcvTRRxdVMrQrW9qD22yzTSZMmNDsMWeccUZmzZqViy66KAcccEBBFW99wha2yPLly7NgwYIkyY477rjefbfffvt07do1S5YsyWuvvdZorLq6OhMmTMhRRx2VQw89NCeddFK22267/PrXv87s2bPzgx/8oM0kmNCSiurBJJkwYULDbyWefvrphm0fTJk+5JBDcvbZZxdYPbQPRfXhpZdemhtvvDHdunXLoEGD8p3vfKfJ8ccdd1zDLySA9xXVg7fddlt+9KMf5ZBDDkltbW26d++e119/PXfffXfeeuutjBw5Ml/72te22nVAW1Xkz6PtibCFLbLmK7u6deu2wf0/aKzFixc3GRs1alSmT5+e8ePH59Zbb83KlSszdOjQXHnllTnxxBMLrRvaiyJ7cPr06Q33xH7goYceajTFU9gCTRXVh6+++mqS9+9bv+yyy5o9tra2VtgCaymqB4855pjMnTs3M2bMyMyZM7N48eL06NEje+21V0466aSceeaZ6/2NPVSqIn8ebU/834Itsnz58oblTp06bXD/zp07J0mWLVvW7PiIESNy9913F1McVIAie3DSpEmZNGlSYbVBpSiqD/UgbJ6ienD48OEZPnx4scVBBSj674Rra6vfjx6Qyxbp0qVLw3JdXd0G91+xYkWS9+/JA7acHoTy04dQXnoQyksPNk/YwhbZbrvtGpY3ZhrYkiVLkmzc9DJgw/QglJ8+hPLSg1BeerB5wha2SJcuXdKrV68kyZw5c9a77zvvvNPQWAMHDtzqtUEl0INQfvoQyksPQnnpweYJW9hiQ4YMSZK8+OKLqa+vX+d+zz33XMPyHnvssdXrgkqhB6H89CGUlx6E8tKDTQlb2GKHHHJIkveng/3hD39Y537Tpk1rWD744IO3el1QKfQglJ8+hPLSg1BeerApYQtb7LjjjmtYnjhxYrP7rF69OpMnT06S9OzZM6NGjWqJ0qAi6EEoP30I5aUHobz0YFPCFrbYiBEjMnLkyCTJ9ddfn5kzZzbZ54c//GH+8pe/JEm+8pWvpKampkVrhPZMD0L56UMoLz0I5aUHm6oqlUqlchdBeU2fPj0vvvhiw/qCBQvyjW98I8n7U7vOPvvsRvufccYZTc7x5JNP5uCDD86yZcvSrVu3XHzxxRk1alSWLVuWW265Jdddd12SZNCgQXn88ccbPbEaKp0ehPLTh1BeehDKSw8WT9hCzjjjjNx4440bvf+6/pOZMmVKTjvttCxatKjZ8UGDBuXOO+/Mbrvttll1QnulB6H89CGUlx6E8tKDxXMbEYU59thj86c//Slf+9rXMmjQoGy77bbp2bNnhg8fniuvvDJPPvlkRTQVlIsehPLTh1BeehDKSw/+nZktAAAAAAUyswUAAACgQMIWAAAAgAIJWwAAAAAKJGwBAAAAKJCwBQAAAKBAwhYAAACAAglbAAAAAAokbAEAAAAokLAFAAAAoEDCFgAAAIACCVsAAAAACiRsAQAAACiQsAUAAACgQMIWAAAAgAIJWwAAAAAKJGwBAAAAKJCwBQAAAKBAwhYAgFbs1VdfTVVVVaqqqjJp0qRylwMAbARhCwDQKk2dOrUhZNjYP1/96lfLXTYAgLAFAAAAoEjV5S4AAGBDzjvvvHzxi1/c4H69e/dugWoAANZP2AIAtHp9+/bNnnvuWe4yAAA2ituIAAAAAAokbAEA2q3a2tpUVVXljDPOSJI89thjOfnkkzNw4MB06dIlAwcOzLhx4/Lcc89t1PmmTJmS448/PjvuuGM6d+6cXr165cADD8wVV1yRxYsXb9Q5nnnmmXzpS1/K0KFDs/3226empib9+vXL4Ycfnu9973uZN2/eBs/x+9//Pscee2z69euXzp07Z+edd855552XOXPmrPe4uXPn5tvf/nY+/vGPp0ePHqmpqcmHPvShDB06NCeffHImTZqURYsWbdR1AADrVlUqlUrlLgIAYG1Tp07NqFGjkiTjx4/Pv/zLv2zyOWprazN79uyMHTs2hx56aM4999zU19c32a9z5875xS9+kRNOOKHZ8yxfvjynnHJKbr/99nV+1oABA3LnnXdm2LBhzY6vWrUq3/jGN3LVVVdlfT9+jR07ttErnl999dXsvPPOSZKJEyfm+eefzxVXXNHssX369Mm0adOyxx57NBl78MEHc8wxx2wwTJkyZUqOOeaY9e4DAKyfZ7YAAO3eU089lZtvvjl9+/bNRRddlBEjRmT58uW56667ctVVV2XFihU59dRTs/POO2f48OFNjh87dmxD0LL33nvnwgsvzB577JG33347t9xySyZNmpS5c+dm9OjR+dOf/pQPf/jDTc7xhS98ITfccEOSpH///jn//PNz0EEHpUePHpk/f34effTR/OpXv1rvdfz85z/PjBkzcthhh+Xcc8/NoEGD8u6772by5MmZPHly5s+fnzPPPDMzZ85sdNyKFSty0kknZdGiRdluu+1y3nnnZdSoUenbt2/q6uryyiuvZMaMGesNkwCAjWdmCwDQKq05s2Vj30b00Y9+NDU1NQ3rH8xsSZKddtopDz/8cPr169fomAceeCBHHnlk6uvrs99+++XRRx9tNH7nnXc2zPQYPXp07rrrrnTq1KnRPj//+c/zhS98IUnyuc99Lrfeemuj8f/6r//Kpz/96STJgQcemLvuuis9e/Zs9hpee+21DBw4sGF9zZktSXLOOefk2muvTVVVVaPjzjnnnEyYMCFJ8sQTT2SfffZpGLv//vszevToJOufuVJfX5+lS5eme/fuzY4DABtH2AIAtEprhi0b65VXXkltbW3D+pphy69+9at89rOfbfa4L37xi7nmmmuSvP9clzVntxx99NG5++67U1NTk5deeqlRELKmI444Ivfee2+qq6vz17/+Nf37928YO+iggzJz5sxsu+22mTVrVgYMGLDR17Rm2NK/f/+88sor6dy5c5P9nn/++QwePDhJ8pOf/CRf/vKXG8ZuvvnmnHrqqUmShQsXClMAYCvzgFwAoN3bfvvtG2aWNOfMM89sWL733nsbluvr6zNt2rQkyZFHHrnOoCV5f2bJB8dMnTq1Yftbb72Vhx9+OEly4oknblLQsrbjjz++2aAleX9WT7du3ZIkL7/8cqOxNYOfiRMnbvbnAwAbR9gCALR648ePT6lU2uCfNWe1rGmfffZJdfW6H1U3bNiwhluDnn766YbtL7/8cpYuXZok2X///ddb45rjzzzzTMPyU0891fBA3JEjR67/Qjfgg5kr67L99tsnSd57771G2w855JDssssuSZKvfvWrGTFiRC6//PI89NBDqaur26KaAICmhC0AQLvXt2/f9Y5XV1dnhx12SJK8/fbbDdvXXN7QOdZ8Fsyaxy1YsKBhec0ZJptj2223Xe94hw7v/2i3atWqRttramoyZcqUhrcUPfbYY7n44otzyCGHpGfPnvnUpz6Vm2++uclxAMDmEbYAAO3e2g+TLdc5ymnIkCF5+umnc/vtt+fMM8/MbrvtliRZtmxZfve73+XUU0/N/vvvnzfffLPMlQJA2ydsAQDavb/97W/rHa+vr2+YjfLBDJe1lzd0jjfeeKPZ43r37t2wPG/evI0reCvp2LFjjjvuuFx//fWZNWtW5s6dmxtuuCH77rtvkuQPf/hDzj333LLWCADtgbAFAGj3nnrqqdTX169z/I9//GPDs0v23HPPhu277LJLw607jzzyyHo/Y81XRq95jn322adhVsz//M//bHrxW1H//v0zbty4zJw5Mx//+MeTJHfccUeWLVtW5soAoG0TtgAA7d7bb7+dKVOmrHP8hhtuaFg+/PDDG5arq6tz2GGHJUl+//vfZ86cOes8x4QJExqO+cQnPtGwfYcddshBBx2UJLntttsyd+7czbqGrammpqbhOuvr6/Puu++WtyAAaOOELQBARbjggguavRVo2rRpue6665Ik++67b/bbb79G4//8z/+cJKmrq8tZZ52VlStXNjnHDTfckHvuuSdJ8pnPfKbJg3C/9a1vJUmWLl2aE044IQsXLlxnnesLdDbXgw8+mBdffHGd43V1dQ2vuO7WrVv69OlTeA0AUEnW/Q5EAIBW4s0332z0OuV12WabbbLrrrs22b733nvnz3/+c/bdd99cdNFFGTFiRFasWJG77rorP/7xj1NfX5/q6upcffXVTY4dM2ZMTjjhhPzyl7/MPffckwMOOCAXXHBBBg8enHfeeSe33HJLw8yYHXbYIT/60Y+anOPYY4/NWWedleuvvz4zZszIkCFDcv755+fggw9O9+7ds2DBgjz++OO59dZbs/fee2fSpEmb/g9pPe67777827/9W0aOHJkxY8Zkr732Sp8+fbJs2bK88MIL+Y//+I888cQTSZKzzjprva/JBgA2zDcpANDqXXPNNbnmmms2uN/ee++dp556qsn2YcOG5fzzz895552X888/v8l4p06dcuONN2b//fdv9ryTJ09OfX19br/99jzxxBM57bTTmuwzYMCA3Hnnnfnwhz/c7DmuvfbabLPNNrn66qszd+7cXHzxxeu8hq1h9erVmTZtWsMMluZ8+tOfzuWXX75VPh8AKomwBQCoCGeffXb23HPP/PjHP8706dOzYMGC9OnTJ6NHj863vvWtDBkyZJ3HdunSJb/5zW8yZcqUTJo0KQ8//HAWLFiQrl27ZtCgQTnuuONy/vnnp1u3bus8R8eOHfOzn/0s48aNy7XXXpupU6fm9ddfT11dXXr16pW99torn/rUp/L5z3++8Gv/+te/nr322iv33ntvnnzyycydO7fhFc/9+vXLiBEjcvrpp2fMmDGFfzYAVKKqUqlUKncRAABbQ21tbWbPnp2xY8cWfmsOAMC6eEAuAAAAQIGELQAAAAAFErYAAAAAFEjYAgAAAFAgYQsAAABAgbyNCAAAAKBAZrYAAAAAFEjYAgAAAFAgYQsAAABAgYQtAAAAAAUStgAAAAAUSNgCAAAAUCBhCwAAAECBhC0AAAAABRK2AAAAABRI2AIAAABQIGELAAAAQIGELQAAAAAFErYAAAAAFEjYAgAAAFAgYQsAAABAgYQtAAAAAAUStgAAAAAUSNgCAAAAUCBhCwAAAECB/j/JbHJuF9bIuwAAAABJRU5ErkJggg==",
+ "image/png": "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/vlqve6mm25yv+a8884zPff5558bgYGB7udP99WzZ09j9+7dp32v+fPnu88fPnz4Kc8rf93TycnJMS6++OLT9jVkyBAjNTXVmDJlirs2ffr0Sq+3fPlyIywsrFr326ZNG2Pt2rWVXmf69OnVukZl97hnzx53vXXr1qe9/9zcXOO6666r8vqxsbHGd999d9prPf744+7zH3/8cSMlJcUYNGjQaa970003GaWlpae9bnVV5+dz3DfffGPExMRUed8TJkww8vLyTnutN9980wgODq7Wz2nw4MGVXmP79u1G165dq/3z3rlz55n+MRmGYf77VdXfEcMwjB07dpje//333z/lueX//kkyCgoKjE8++cR9PG3atFO+9oknnnCf9+mnnxoFBQWma+3Zs6fCaz799FP38zabzcjNza3OH0GVTr6Pyt4bAGANFsgFAPiUgIAA3XDDDXrttdcklQ3nv//++0/7moKCAn322Wfu45MXxk1LS1NRUZEkKS4uTt26dVNMTIxCQkKUm5urrVu3au3atTIMQxs2bNCwYcO0fv36Ohna73Q6dckll2jhwoXuWkxMjIYNG6bw8HAlJSVp8eLFWrx4sa688kq1a9euymtmZGQoNzdXUtlv9BMSEhQXF6fQ0FDl5+crKSlJK1euVElJifbu3avhw4dr7dq16tChg+k6Xbt21d13362cnBz3tIrKdo05G/n5+Tr//PNNIyVatGihoUOHKiwszH3/paWlSk1N1eWXX64PP/ywWlt65+bm6qKLLtLmzZsVEhKioUOHKj4+Xjk5OZo/f77S0tIkla3/0blzZz3yyCMeu6+qfPzxx7rxxhtVWloqqWyazJAhQ9ShQwfl5uZq0aJF7pEbH3zwgfbs2aNffvlFQUFBFa41Z84c3X777e7jiIgInXfeeYqLi5PD4VBWVpZ27NihzZs3n3IkU05Oji688EL3tsp2u129e/dW165dFRYWpvz8fB04cEAbNmzQkSNHPP3HUS0nj2SJjo6u0esvv/xyRUZGKjMzU++99557FNTJjv9db9y4sS677LJqLfTcvn1792PDMPTPf/5TTz75ZI36AwD4GIvDHgAAamzlypWm3+Zu3LjxtOe///777nMDAwONjIwM0/Nff/218Y9//OO0v4nfvXu3MWbMGPd1brnlllOe68mRLU899ZTpN+JPP/20UVJSYjpn+/btRs+ePQ1JRkBAQLVGtvz5z382Nm3adMr3PXz4sDFp0iT3tS644IJTnluTUSo1fc2dd97pPs/Pz8948cUXK4wy2bFjh9G3b1/3eREREaf8DX/5kS3HRzNNmTLFOHr0qOm8vLw844YbbnCfGxYW5pHRCNUZ2ZKUlGQaeTRgwIAKfzdLS0uN559/3rDb7e7zfv/731d6vV69ernPueeee045CiYnJ8f45JNPjEceeaTCcy+++KL7Gt26dTO2bdtW6TVcLpexcuVK48477zT2799/mj+JqtV0ZMuf/vQn9/n+/v7GsWPHTnluZSNbDMMwbrvtNndt4cKFFV63aNEi9/O33367YRhGtUa2uFwuo02bNqb/LU+cONFYtmyZ4XK5qvcHUo37YGQLAHgPwhYAgE8qP53hwQcfPO255UOSa6+99ozfs7i42DjnnHMMSUZQUNApP8x5KmzJzMw0QkJC3Oc88cQTp7xWWlqaERsba7pmVdNUqmPs2LHu623ZsqXSc2orbElKSjKFCa+++uopr3fs2DHTh9mbbrqp0vPKhy2SjBtuuOGU1ywoKDDi4+Pd53700UfVurfTqU7YMnnyZPc5HTp0MDIzM095vX//+9/uc+12e4Upbjk5Oe7n4+Pjz/iD/fjx493X+d///ndG16ipmoQtW7ZsMcLDw93nT5gw4bTnnypsWbJkibv2u9/9rsLrbr31VvfzS5cuNQyjemGLYRjGZ599Zjrv+FeTJk2Miy++2Jg2bZrxzTffnDYkquo+Jk+ebNx9993V+nrxxRer/T4AgJojbAEA+KRnnnnG/QGjRYsWFUZ7HHfw4EHDz8/Pfe7cuXPP6n2fffZZ97W+/vrrSs/xVNjy+uuvu5+Pi4szioqKTtvbW2+95fGw5eOPP3Zf7+WXX670nNoKWx555BH3Ob169aoyKCjfa2BgYKUhRfmwJSAgwEhNTT3tNR9++GH3+ffff3+17u10qgpbMjIyTOsHffHFF6e9XmlpqZGQkOA+/9FHHzU9f+DAAdOf4ZkaNWqU+zrr168/4+vURFVhS2FhobF9+3bjn//8pxEZGek+t0uXLsahQ4dOe+1ThS2GYRgdOnQwJBmNGjUy1QsKCtzv07FjR1O9uqNL3n77bSMoKKjS0KX8qJcBAwYYr7zyiun9q3MfNfk63X+bAABnjzVbAAA+aeLEifrzn/8sl8ulgwcP6qefftKYMWMqnPf++++7172IiYmp9JzyMjMztXz5ciUmJuro0aPKzc017UC0bds29+P169frsssu89AdVTR//nz34+uuu04BAQGnPf/666/XPffcc9odhE6Wn5+v5cuXa9OmTUpPT1dOTo77z0sy76Kyfv366jfvAb/88ov78dSpU6vctenKK69UVFSUjh07pqKiIi1btsy9w0xlhgwZopiYmNNes3fv3u7He/furV7jZ2Hp0qXu9YOaNm1a5d8vu92um2++WQ888IAk89+Z49cICgpSYWGhNm/erCVLlmjw4ME17is+Pt79+I033tB//vOfGl/jbBzf5ep07Ha7xo0bp9dee63G67WUN2nSJD3++OPKysrSV199peuuu06S9NVXX7m3b540adIZXfuWW27RqFGj9Oyzz+rDDz9URkZGhXMMw9DKlSu1cuVKPfvss5o9e7ZGjBhxprcDALAIYQsAwCe1bNlSF154oX788UdJ0uzZsysNUo4vZilJN954o/z8/Cq9XkpKih599FF99tln7g+7VanthUDXrVvnfnzeeedVeX54eLi6d++utWvXVnnusWPHNG3aNM2aNUs5OTnV6qcuFz41DMMU7gwaNKjK1/j7+2vAgAH6/vvvJUlr1649bdjSo0ePKq9ZfhHk7OzsKs8/W+V/5gMGDJDDUfU/1cqHJ+vWrZNhGO5gIiAgQOPGjdNHH32kkpISnX/++bruuut09dVXa9iwYYqMjKxWX9dee63effddSWVhy5o1azRlyhSNGTOmwsLJVrn88sv1zjvvVPueTmXSpEl64oknZBiGZs2a5Q5bjv+3xGaznXHYIkmtWrXSa6+9phdeeEErVqzQokWLtGrVKq1Zs8a9APFxKSkpGjVqlObOnavRo0dXee09e/ZUeyt1AEDtImwBAPisKVOmuMOWL7/8Urm5uQoLC3M/v27dOm3atMl0fmXWrVunCy64oNLfMp9OdUOKM5Wenu5+3KpVq2q9plWrVlWGLfv27dOwYcO0f//+GvVT2/dbXlZWlpxOp/u4devW1Xpd+Q+aVYVDjRo1qvJ6/v7+7sfl+6kt5X/mZ3LPxcXFysnJUUREhLv2wgsvaM2aNdq5c6eKi4s1e/ZszZ49W3a7XQkJCRo6dKhGjRqlsWPHKjAwsNL3GDNmjH7/+9/rlVdekSStWrVKq1atklS268+QIUM0YsQIjRs3TnFxcTW97SqdvMtVSUmJDh48qHXr1iklJUVS2a5Lu3fv1s8//6ymTZue8Xu1bdtWQ4YM0aJFi/Tjjz/q8OHDkuT+b83QoUM9EmgEBARo6NChGjp0qLu2d+9effbZZ3rxxRfdo8pKSko0efJk7d69WyEhIWf9vgCAumG3ugEAAM7UlVde6f5QmZ+fb9reWTKPaundu3elIxmKioo0fvx4d9DSrFkzPfbYY5o/f76Sk5OVl5cnl8slo2ydM02fPt392vLTi2rD8e2ZJVX7Q1ZoaGiV50yYMMEdtISHh+u+++7T999/r927dys3N1elpaXu+y0/LaW277e88vcuVe++Tj6vqnCoqmkpVih/32dyz1LF+46JidHq1av12GOPmabXuFwubdq0Sa+//rquvPJKxcbG6plnnjFNIyvv5Zdf1hdffKEBAwaY6ocPH9bnn3+u3//+92rVqpWuvvrqGgd5VYmKitKrr77q/nrjjTf09ddfa8+ePXrnnXfcW15v3LjRI1uPHw9mS0pK9MEHH+iDDz5QSUmJ6bna0KZNGz344IPasmWLaerQ4cOH9fHHH9fa+wIAPI+wBQDgs4KDg3XNNde4j2fPnu1+XFJSog8//NB9fKoPSJ9//rn27NkjqWxq0oYNG/R///d/GjFihOLi4hQSEmL6UF6XozvKj9LJz8+v1mvy8vJO+/zSpUu1dOlS9/WXL1+uf//73xozZozatm2r0NBQ2e0n/nlQl/dbXvl7l6q+r8rOCw8P92hPdaH8fZ/JPUuV33dERIT+7//+TwcOHNDy5cv13HPPady4caYRIBkZGfrTn/6k8ePHyzCMSt/ryiuv1IoVK7Rv3z7NnDlTt99+u7p16+Z+3jAMff755+rTp4927NhRrf7PhsPh0M0336y3337bXZs3b55mzpx5Vte95pprFBwcLKkstD1+vZP/m1NbIiIiNHv2bNO0x0WLFtX6+wIAPIewBQDg08qHKAsWLHCvefDDDz+4h//7+/trwoQJlb7+559/dj/+4x//qNjY2NO+3759+8625Wpr1qyZ+3F1RwqcvObDycrf75QpU0wflCtTl/dbXqNGjUxTeKp7/+UXsT2bqSRWOZOfefl7DggIOG3I5Ofnp4EDB+rBBx/Ul19+qcOHD2vRokW6/PLL3ed89dVX+vzzz0/7nq1atdLkyZP1xhtvKDExUfv379eTTz7pHoF19OhR3X///dXq3xNuvPFG0z389a9/VWFh4RlfLyIiQldccYWksoWhN2zYIEkaN25cnYV4cXFxSkhIcB+npqbWyfsCADyDsAUA4NOGDBmidu3aSSqbFvHee+9JMk8hGjt2rOlDbHkHDx50P67OgqkLFy48m3ZrpPxOOMuXL6/y/NzcXG3evPm059TG/dbGdBybzaZevXq5j4+PxjmdkpIS9zoiktSnTx+P91Xbyv/MV65cecopPeWV/7Pp3bt3jX4edrtdQ4YM0Zw5czRq1Ch3/euvv672NaSy3YqmTZumt956y1378ccfq73YtCf885//dI8ESU5O1htvvHFW16tsOpInpijVxPHpUZJOuZ4OAMA7EbYAAHyazWYzfQCaPXu2srKyTB8WT7fGQvkpM1VN1VmzZo3pw3xtGzlypPvxxx9/XOUCrR9//HGVH25rcr8HDx7UV199VWWf5T8QenIR2fPPP9/9eObMmaec2nLcnDlzdPToUXdP1dnBydsMGjTI/aE6PT1dc+fOPe35LpfLtI5Q+T+zmrDZbKZtpo+PCqup8qNLnE6njh07dkbXOROdO3fW9ddf7z5+7rnnzirsGT16tGlr8NjYWFMgVduKiopMW81Xd5FsAIB3IGwBAPi8yZMnu3+bv3XrVj388MPuKQRRUVG69NJLT/na46NipNP/Nj8/P1+33XabhzqungkTJrinZSQnJ+vZZ5895blHjx7VtGnTqrxmde+3tLRUt912m4qLi6u8ZmRkpDvESU9P91jgcuutt7qvu3btWtOoiZNlZmbq4Ycfdh/fcMMN1dptyNtERka6txqWpIceeui06+a8+uqr7h237HZ7hb+jOTk51foZSuYpaM2bNzc9V91tv8tfw263m7bOrguPPfaY++/MwYMHTWu51JSfn597W+ZVq1Zp4cKFp9w6viorVqzQv/71r2qvvSSVjdQpv9346bYxBwB4H8IWAIDPa9u2rWn71PIfym+44QYFBASc8rXlf5s/c+ZMPf/88xWmbiQlJWn06NFau3ZttXeI8YRGjRqZAoRp06bp2WefrdDfzp07NWrUKB08ePC09ypJl1xyiTuYWrBggR588EEVFBSYzjl06JDGjx+vuXPnVut+AwMD1bFjR0lloxnmzJlTndurUvv27XX77be7j++55x699tprFXZFOv7zOb7QcURERLWCJ281bdo090K5O3bs0JgxY7R7927TOS6XSy+99JJpXZS77767wpbEa9asUZs2bfTEE09oy5Ytlb5faWmpPv74Y/e2zlLZ1LvyzjvvPE2YMEHz5s07ZXizY8cO0yiyCy64oMq/j57WpUsXXXvtte7jZ599ttphU2U6dOigfv36qV+/furQocMZXycjI0MPPfSQ2rRpo/vvv19r16495UitI0eO6L777jP9He7duzdhCwD4GIfVDQAA4AlTpkypdH2RqrZpHT16tIYNG6aFCxfKMAw9+OCDeu2119SnTx81atRIO3fu1NKlS1VaWqqWLVvq3nvvNQUgte1Pf/qT/ve//2nJkiUyDEOPPvqoXnrpJQ0fPlxhYWFKSkrSokWLVFpaqoEDB6p9+/b64IMPTnm9Ll26aNKkSe41bZ5//nl98MEH6t+/v5o3b669e/dq4cKFKi4uVnh4uJ577jndcccdVfY5fvx4/f3vf5dUtljpjBkz1KFDB9Mit//6179qfP//+te/tHr1aq1atUolJSW655579Mwzz2jIkCEKCwvTrl27tHDhQncA5XA49M4771QIHXxJ+/bt9fbbb+vGG29UaWmpli1bps6dO2vo0KFq3769cnNztWjRIh04cMD9mnPPPVf//Oc/K71eamqqnnzyST355JOKiYlRr169FBMTI4fDocOHD2vNmjWmtXyGDh1qmo4jlYVoH374oT788EMFBwfrnHPOUbt27RQREaGMjAzt3r1bq1evdp8fHBx8Rj9vT/jrX/+qTz75RC6XS8nJyZoxY0adj0o7lfT0dL3wwgt64YUX1KhRI/Xt21exsbEKDw9Xbm6udu7cqTVr1ri3mZak6Ohovf/++6YpgKfy+OOP12gB35EjR2r8+PFndC8AgCoYAADUA9nZ2UZISIghyf3VtWvXar320KFDRp8+fUyvPfmrW7duRmJiojF9+nR3bcqUKZVeb/78+e5zhg8ffsr3LX/908nKyjIuuuii0/Y3aNAg4+DBg8aUKVPctenTp1d6vby8PGP06NGnvV5cXJyxePHiat9LZmam0aVLl9Nes7w9e/a4661btz7t/efk5BjXXnvtaa8tyYiNjTW+++67017r8ccfd5//+OOPn/Zcw6j+z7K6qvPzOe6bb74xoqOjq7zvG264wcjLy6v0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5syZ6acUvfLKK3HdddfFoEGDom3btnH66afHgw8+WGo/AGDfCFsAgHrvqzeTzdQxMqlHjx6xdOnSePTRR+PSSy+Nrl27RkTE1q1b48knn4wLL7ww+vfvHx9//HGGKwWAuk/YAgDUex999FGF88XFxenVKF+ucPnq6z0d48MPPyxzvw4dOqRfr127tnIFV5NGjRrF2WefHffdd18UFBTEmjVrYsqUKdGnT5+IiPj73/8e48aNy2iNAFAfCFsAgHpvyZIlUVxcXO78a6+9lr53Sc+ePdPjhx12WPrSnZdeeqnCc+z+yOjdj3HMMcekV8U8//zze198NercuXOMGTMmFixYEMcee2xERDz22GOxdevWDFcGAHWbsAUAqPc++eSTmDlzZrnzU6ZMSb8+5ZRT0q9zcnLipJNOioiIp59+OlavXl3uMSZPnpze5+STT06P77fffnHCCSdERMQjjzwSa9as2afPUJ1yc3PTn7O4uDg+++yzzBYEAHWcsAUAaBCuuuqqMi8Fmjt3btx7770REdGnT5847rjjSsz/27/9W0REFBYWxtixY6OoqKjUMaZMmRJPPfVURER85zvfKXUj3J/97GcREbFly5Y499xzY+PGjeXWWVGgs69eeOGFeOedd8qdLywsTD/iumXLltGxY8fEawCAhqT8ZyACANQSH3/8cYnHKZenWbNm8bWvfa3U+NFHHx1vvPFG9OnTJyZMmBD9+vWL7du3x+OPPx533HFHFBcXR05OTtx1112l9h0xYkSce+658Yc//CGeeuqpGDBgQFx11VXRvXv3+PTTT+Ohhx5Kr4zZb7/94le/+lWpY5x55pkxduzYuO+++2L+/PnRo0ePGD9+fAwcODBat24d69evj0WLFsXDDz8cRx99dEybNm3v/5Iq8Mwzz8RNN90UgwcPjhEjRsRRRx0VHTt2jK1bt8bbb78dv/vd7+LVV1+NiIixY8dW+JhsAGDPfJMCALXe3XffHXffffcetzv66KNjyZIlpcZ79+4d48ePjyuuuCLGjx9far5x48Yxffr06N+/f5nHnTFjRhQXF8ejjz4ar776alx00UWltunSpUvMmjUrDjzwwDKPcc8990SzZs3irrvuijVr1sR1111X7meoDjt37oy5c+emV7CU5ayzzopbbrmlWs4PAA2JsAUAaBAuu+yy6NmzZ9xxxx0xb968WL9+fXTs2DGGDh0aP/vZz6JHjx7l7tu0adP485//HDNnzoxp06bFwoULY/369dGiRYvo1q1bnH322TF+/Pho2bJlucdo1KhR/OY3v4kxY8bEPffcE3PmzIkPPvggCgsLo3379nHUUUfF6aefHhdffHHin/2aa66Jo446KmbPnh2LFy+ONWvWpB/x3KlTp+jXr19ccsklMWLEiMTPDQANUVYqlUpluggAgOqQn58fq1atilGjRiV+aQ4AQHncIBcAAAAgQcIWAAAAgAQJWwAAAAASJGwBAAAASJCwBQAAACBBnkYEAAAAkCArWwAAAAASJGwBAAAASJCwBQAAACBBwhYAAACABAlbAAAAABIkbAEAAABIkLAFAAAAIEHCFgAAAIAECVsAAAAAEiRsAQAAAEiQsAUAAAAgQcIWAAAAgAQJWwAAAAASJGwBAAAASJCwBQAAACBBwhYAAACABAlbAAAAABIkbAEAAABIkLAFAAAAIEH/H/AYJqh4UsWcAAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -149,12 +49,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 2\n"
+ "Time step 2\n",
+ "RMSE 0.0038884239869881013, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACXDUlEQVR4nOzdd3Qc5d328WuLtOqSe5Pce8Pd2LhgeseEFopNewmBkIcECCEJNYE8lBAggYTkgVBMrwZiOtjY2Bh3495lS5ZtWb1LW+b9Q/ZaI8nSSlppdlffzzk62rl35p7f2IajvXQXm2EYhgAAAAAAABAUdqsLAAAAAAAAiCSELQAAAAAAAEFE2AIAAAAAABBEhC0AAAAAAABBRNgCAAAAAAAQRIQtAAAAAAAAQUTYAgAAAAAAEESELQAAAAAAAEFE2AIAAAAAABBEhC0AAAAAAABBRNgCAAAAAAAQRIQtAAAAAAAAQUTYAgAAAAAAEESELQAAAAAAAEFE2AIAAAAAABBEhC0AAAAAAABBRNgCAAAAAAAQRIQtAAAAAAAAQUTYAgAAAAAAEESELQAABNGiRYtks9lks9l08sknH/e8o+fYbLag3fvaa6/19/nSSy8Frd9gS09P99fZt29fq8tpM+Hy9wMAAFqOsAUAEPLuvPNO04dzwzCa1U9eXp5cLhcfeIEQ99JLL5kCydpfLpdLXbt21cSJE3XLLbdo8eLFAfddM+w7+tW1a1d5PJ6A+/B6verRo0edftLT0xu9NiMjQw8//LDOPPNMpaWlKT4+XlFRUUpJSdHQoUN1zjnn6A9/+IM+/vhjlZSUNOk5mvK1aNGigJ8XANB0hC0AgJB3zTXX+F/v3btX3377bbP6efPNN1VVVSVJio+P1yWXXBKU+tqz9jpKBdaqqqrS4cOHtWrVKv3zn//UzJkzNWvWLGVkZDSrv8OHD+vTTz8N+PzPP/9cBw8ebNI9KioqdOedd6pfv36655579MUXXygzM1NlZWXyeDwqLCzUtm3b9Omnn+rPf/6zLrjgAnXs2FHff/99Ux8HABACnFYXAABAY0aNGqWxY8dq7dq1kqRXXnmlwSk6x/PKK6/4X1988cVKSEgIVokAWkliYqLmzp1raquoqNDevXu1dOlSlZeXS6qewnfKKado+fLl6tSpU5Pv88orr+j8888P+NymqKqq0oUXXqgvvvjC3xYdHa0JEyZowIABiouLU1FRkdLT07Vu3Tr/M7ndbpWWlgZ0j7lz5yoxMTHgmnr16tWkZwAANA1hCwAgLFxzzTX+sOW9997Ts88+q9jY2ICv3759u3744QdTf1Zq7lSoSNCSqWBofzp27Khnnnmm3vdyc3N1yy236O2335Yk7dy5Uw888ID+/ve/B9z/8OHDtXnzZn388ccqKChQSkpKg+cXFhbqww8/NF3bmEceecQftNhsNt111126++67672X2+3WokWL9Pbbb+uNN94I+DkefPBBRpcBQAhhGhEAICxceeWVioqKkiQVFRVp/vz5Tbq+5m+ie/furVmzZgWzPAAW6NSpk15//XVNnDjR3/biiy/K7XYH3MecOXMkSZWVlXrrrbcaPf/tt99WRUWFJNUZcVMft9utJ5980n/8xz/+UY888shxQ52oqCidfvrp+r//+z9lZmZq7NixATwFACDUELYAAMJCly5ddPbZZ/uPmzKM3zAMvfrqq/7jOXPmBHUXIADWcTgcuvXWW/3HpaWlWr16dcDXX3nllXI6qwd7B/L/laPnREVF6corr2z0/BUrVqigoMB/zW233RZwbSkpKc2aEgUAsB5hCwAgbNSc+vPll18GvEDlt99+q7179/qPa/82urCwUG+88YZuuukmTZ48WZ07d1Z0dLSSkpI0YMAAXXHFFXr77bfl8/mC8yBq+tbP8+fP14UXXqhevXrJ5XIpNTVVp59+uubNm9ekXVQkqby8XPPnz9f//M//aNq0aerWrZuio6OVkJCgvn376qKLLtILL7zgX0y4Pkd3i+nXr5+/be/evcfd+aSm5iyqu3z5ct16660aMWKEOnTooJiYGKWmpuqss87SM888E9C6Fg888ID/vg888IAkyePx6JVXXtFpp53m/7Pt0aOHZs+erf/+978B1dZaSkpK9Le//U1nnnmmUlNTFRMTow4dOmjkyJG69dZbTdPiGpORkaEHH3xQM2bMULdu3eRyuRQdHa1OnTrphBNO0JVXXql//vOfDf435Xa79eqrr+onP/mJ+vfvr4SEBDmdTiUmJmrgwIE688wzdd9992nFihXBePwmGTNmjOk4Kysr4Gu7du2qs846S5K0bNky7dq167jn7tmzR0uXLpUknXXWWerSpUuj/e/fv9//umPHjk1aVwUAEMYMAADCRGVlpdGxY0dDkiHJeOKJJwK67rrrrvNfM2XKFNN77733nuFyufzvN/R1wgknGLt3727wXgsXLvSfP3PmzOOeV7PfhhQXFxvnnHNOg3VNmzbNOHDggHHNNdf421588cV6+1u+fLmRkJAQ0PP27dvXWLNmTb39vPjiiwH1Ud8z7tmzx9/ep0+fBp+/pKTEuPzyyxvtv0ePHsYnn3zSYF/333+///z777/fyMzMNKZOndpgv9ddd53h9Xob7DdQgfz9HPXxxx8b3bt3b/S5r7zySqO0tLTBvv71r38ZsbGxAf09nXTSSfX2sW3bNmPYsGEB/33v2LGjuX9MhmGY/3019m/EMAxj+/btpvu/9tprxz235r8/SUZ5ebnx9ttv+4/vu+++4177wAMP+M975513jPLyclNfe/bsqXPNO++843/fZrMZJSUlgfwRNKr2c9R3bwCAdVggFwAQNqKjo3XFFVfo2WeflVQ9nP/2229v8Jry8nK9++67/uPaC+NmZ2ersrJSkpSamqrhw4ere/fuiouLU0lJibZs2aI1a9bIMAytX79eM2bM0Lp169pkaL/b7da5556rxYsX+9u6d++uGTNmKDExUTt37tR3332n7777ThdddJH69+/faJ/5+fkqKSmRVP0b/REjRig1NVXx8fEqKyvTzp07tWLFCnk8HqWnp2vmzJlas2aNBg4caOpn2LBh+sUvfqHi4mL/tIr6do1pibKyMp1yyimmkRI9e/bU9OnTlZCQ4H9+r9erAwcO6IILLtAbb7wR0JbeJSUlOuuss7Rx40bFxcVp+vTpSktLU3FxsRYuXKjs7GxJ1et/DBkyRL/97W+D9lyNeeutt3TVVVfJ6/VKqp4mM23aNA0cOFAlJSVasmSJf+TG66+/rj179uibb75RTExMnb7mz5+vm266yX+clJSkKVOmKDU1VU6nU4WFhdq+fbs2btx43JFMxcXFOu200/zbKtvtdo0dO1bDhg1TQkKCysrKtH//fq1fv145OTnB/uMISO2RLN26dWvS9RdccIFSUlJUUFCgV1991T8Kqraj/9Y7dOig888/P6CFngcMGOB/bRiGHnvsMT344INNqg8AEIYsDnsAAGiSFStWmH6b++OPPzZ4/muvveY/1+VyGfn5+ab3P/roI+N///d/G/xN/O7du40zzzzT388NN9xw3HODObLlj3/8o+k34g8//LDh8XhM52zbts044YQTDElGdHR0QCNbfv/73xsbNmw47n0PHTpkzJkzx9/XqaeeetxzmzJKpanX3Hzzzf7zHA6H8dRTT9UZZbJ9+3Zj/Pjx/vOSkpKO+xv+miNbjo5muuaaa4zc3FzTeaWlpcYVV1zhPzchISEooxECGdmyc+dO08ijSZMm1fm36fV6jSeeeMKw2+3+8375y1/W29+YMWP859x6663HHQVTXFxsvP3228Zvf/vbOu899dRT/j6GDx9ubN26td4+fD6fsWLFCuPmm2829u3b18CfROOaOrLld7/7nf/8qKgoIy8v77jn1jeyxTAM42c/+5m/bfHixXWuW7Jkif/9m266yTAMI6CRLT6fz+jbt6/pv+Wrr77a+P777w2fzxfYH0gAz8HIFgAILYQtAICwU3M6w5133tnguTVDkssuu6zZ96yqqjJGjx5tSDJiYmKO+2EuWGFLQUGBERcX5z/ngQceOG5f2dnZRo8ePUx9NjZNJRBnn322v7/NmzfXe05rhS07d+40hQnPPPPMcfvLy8szfZi97rrr6j2vZtgiybjiiiuO22d5ebmRlpbmP/fNN98M6NkaEkjYMnfuXP85AwcONAoKCo7b31//+lf/uXa7vc4Ut+LiYv/7aWlpzf5gf/HFF/v7+fLLL5vVR1M1JWzZvHmzkZiY6D//yiuvbPD844UtS5cu9bf9v//3/+pcd+ONN/rfX7ZsmWEYgYUthmEY7777rum8o1+dOnUyzjnnHOO+++4zPv744wZDosaeY+7cucYvfvGLgL6eeuqpgO8DAGgewhYAQNh55JFH/B8wevbsWWe0x1FZWVmGw+Hwn7tgwYIW3ffRRx/19/XRRx/Ve06wwpZ//OMf/vdTU1ONysrKBmv797//HfSw5a233vL397e//a3ec1orbPntb3/rP2fMmDGNBgU1a3W5XPWGFDXDlujoaOPAgQMN9nnXXXf5z7/99tsDeraGNBa25Ofnm9YPev/99xvsz+v1GiNGjPCff/fdd5ve379/v+nPsLlOP/10fz/r1q1rdj9N0VjYUlFRYWzbts147LHHjJSUFP+5Q4cONQ4ePNhg38cLWwzDMAYOHGhIMpKTk03t5eXl/vsMGjTI1B7o6JLnn3/eiImJqTd0qTnqZdKkScbf//530/0DeY6mfDX0/yYAQHCwZgsAIOxcffXV+v3vfy+fz6esrCx99dVXOvPMM+uc99prr/nXvejevXu959RUUFCg5cuXa9OmTcrNzVVJSYlpB6KtW7f6X69bt07nn39+kJ6oroULF/pfX3755YqOjm7w/J/+9Ke69dZbG9xBqLaysjItX75cGzZs0OHDh1VcXOz/85LMu6isW7cu8OKD4JtvvvG/vvbaaxvdtemiiy5Sx44dlZeXp8rKSn3//ff+HWbqM23aNHXv3r3BPseOHet/nZ6eHljhLbBs2TL/+kGdO3du9N+X3W7X9ddfrzvuuEOS+d/M0T5iYmJUUVGhjRs3aunSpTrppJOaXFdaWpr/9XPPPad//vOfTe6jJY7uctUQu92u2bNn69lnn23yei01zZkzR/fff78KCwv14Ycf6vLLL5ckffjhh/7tm+fMmdOsvm+44QadfvrpevTRR/XGG28oPz+/zjmGYWjFihVasWKFHn30Uc2bN08nn3xycx8HAGAhwhYAQNjp1auXTjvtNH3xxReSpHnz5tUbpBxdzFKSrrrqKjkcjnr7y8zM1N133613333X/2G3Ma29EOjatWv9r6dMmdLo+YmJiRo5cqTWrFnT6Ll5eXm677779Morr6i4uDigetpy4VPDMEzhztSpUxu9JioqSpMmTdJnn30mSVqzZk2DYcuoUaMa7bPmIshFRUWNnt9SNf/OJ02aJKez8R/TaoYna9eulWEY/mAiOjpas2fP1ptvvimPx6NTTjlFl19+uS655BLNmDFDKSkpAdV12WWX6T//+Y+k6rBl9erVuuaaa3TmmWfWWTjZKhdccIFeeOGFgJ/peObMmaMHHnhAhmHolVde8YctR/9fYrPZmh22SFLv3r317LPP6sknn9QPP/ygJUuWaOXKlVq9erV/AeKjMjMzdfrpp2vBggU644wzGu17z549AW+lDgBofYQtAICwdM011/jDlg8++EAlJSVKSEjwv7927Vpt2LDBdH591q5dq1NPPbXe3zI3JNCQorkOHz7sf927d++Arundu3ejYcvevXs1Y8YM7du3r0n1tPbz1lRYWCi32+0/7tOnT0DX1fyg2Vg4lJyc3Gh/UVFR/tc162ktNf/Om/PMVVVVKi4uVlJSkr/tySef1OrVq7Vjxw5VVVVp3rx5mjdvnux2u0aMGKHp06fr9NNP19lnny2Xy1XvPc4880z98pe/1N///ndJ0sqVK7Vy5UpJ1bv+TJs2TSeffLJmz56t1NTUpj52o2rvcuXxeJSVlaW1a9cqMzNTUvWuS7t379bXX3+tzp07N/te/fr107Rp07RkyRJ98cUXOnTokCT5/18zffr0oAQa0dHRmj59uqZPn+5vS09P17vvvqunnnrKP6rM4/Fo7ty52r17t+Li4lp8XwBA27FbXQAAAM1x0UUX+T9UlpWVmbZ3lsyjWsaOHVvvSIbKykpdfPHF/qClS5cuuueee7Rw4UJlZGSotLRUPp9PRvUaZ3rxxRf919acXtQajm7PLCngD1nx8fGNnnPllVf6g5bExET9+te/1meffabdu3erpKREXq/X/7w1p6W09vPWVPPZpcCeq/Z5jYVDjU1LsULN527OM0t1n7t79+5atWqV7rnnHtP0Gp/Ppw0bNugf//iHLrroIvXo0UOPPPKIaRpZTX/729/0/vvva9KkSab2Q4cO6b333tMvf/lL9e7dW5dcckmTg7zGdOzYUc8884z/67nnntNHH32kPXv26IUXXvBvef3jjz8GZevxo8Gsx+PR66+/rtdff10ej8f0Xmvo27ev7rzzTm3evNk0dejQoUN66623Wu2+AIDWQdgCAAhLsbGxuvTSS/3H8+bN87/2eDx64403/MfH+4D03nvvac+ePZKqpyatX79ef/rTn3TyyScrNTVVcXFxpg/lbTm6o+YonbKysoCuKS0tbfD9ZcuWadmyZf7+ly9frr/+9a8688wz1a9fP8XHx8tuP/ajQVs+b001n11q/LnqOy8xMTGoNbWFms/dnGeW6n/upKQk/elPf9L+/fu1fPlyPf7445o9e7ZpBEh+fr5+97vf6eKLL5ZhGPXe66KLLtIPP/ygvXv36uWXX9ZNN92k4cOH+983DEPvvfeexo0bp+3btwdUf0s4nU5df/31ev755/1tn376qV5++eUW9XvppZcqNjZWUnVoe7S/2v/PaS1JSUmaN2+eadrjkiVLWv2+AIDgImwBAIStmiHKokWL/GsefP755/7h/1FRUbryyivrvf7rr7/2v/7Vr36lHj16NHi/vXv3trTkgHXp0sX/OtCRArXXfKit5vNec801pg/K9WnL560pOTnZNIUn0OevuYhtS6aSWKU5f+c1nzk6OrrBkMnhcGjy5Mm688479cEHH+jQoUNasmSJLrjgAv85H374od57770G79m7d2/NnTtXzz33nDZt2qR9+/bpwQcf9I/Ays3N1e233x5Q/cFw1VVXmZ7h3nvvVUVFRbP7S0pK0oUXXiipemHo9evXS5Jmz57dZiFeamqqRowY4T8+cOBAm9wXABA8hC0AgLA1bdo09e/fX1L1tIhXX31VknkK0dlnn236EFtTVlaW/3UgC6YuXry4JeU2Sc2dcJYvX97o+SUlJdq4cWOD57TG87bGdBybzaYxY8b4j4+OxmmIx+PxryMiSePGjQt6Xa2t5t/5ihUrjjulp6aafzZjx45t0t+H3W7XtGnTNH/+fJ1++un+9o8++ijgPqTq3Yruu+8+/fvf//a3ffHFFwEvNh0Mjz32mH8kSEZGhp577rkW9VffdKRgTFFqiqPToyQddz0dAEDoImwBAIQtm81m+gA0b948FRYWmj4sNrTGQs0pM41N1Vm9erXpw3xrmzVrlv/1W2+91egCrW+99VajH26b8rxZWVn68MMPG62z5gfCYC4ie8opp/hfv/zyy8ed2nLU/PnzlZub668pkB2cQs3UqVP9H6oPHz6sBQsWNHi+z+czrSNU88+sKWw2m2mb6aOjwpqq5ugSt9utvLy8ZvXTHEOGDNFPf/pT//Hjjz/eorDnjDPOMG0N3qNHD1Mg1doqKytNW80Hukg2ACB0ELYAAMLa3Llz/b/N37Jli+666y7/FIKOHTvqvPPOO+61R0fFSA3/Nr+srEw/+9nPglRxYK688kr/tIyMjAw9+uijxz03NzdX9913X6N9Bvq8Xq9XP/vZz1RVVdVonykpKf4Q5/Dhw0ELXG688UZ/v2vWrDGNmqitoKBAd911l//4iiuuCGi3oVCTkpLi32pYkn7zm980uG7OM888499xy2631/k3WlxcHNDfoWSegta1a1fTe4Fu+12zD7vdbto6uy3cc889/n8zWVlZprVcmsrhcPi3ZV65cqUWL1583K3jG/PDDz/oL3/5S8BrL0nVI3Vqbjfe0DbmAIDQRNgCAAhr/fr1M22fWvND+RVXXKHo6OjjXlvzt/kvv/yynnjiiTpTN3bu3KkzzjhDa9asCXiHmGBITk42BQj33XefHn300Tr17dixQ6effrqysrIafFZJOvfcc/3B1KJFi3TnnXeqvLzcdM7Bgwd18cUXa8GCBQE9r8vl0qBBgyRVj2aYP39+II/XqAEDBuimm27yH99666169tln6+yKdPTv5+hCx0lJSQEFT6Hqvvvu8y+Uu337dp155pnavXu36Ryfz6enn37atC7KL37xizpbEq9evVp9+/bVAw88oM2bN9d7P6/Xq7feesu/rbNUPfWupilTpujKK6/Up59+etzwZvv27aZRZKeeemqj/x6DbejQobrsssv8x48++mjAYVN9Bg4cqAkTJmjChAkaOHBgs/vJz8/Xb37zG/Xt21e333671qxZc9yRWjk5Ofr1r39t+jc8duxYwhYACENOqwsAAKClrrnmmnrXF2lsm9YzzjhDM2bM0OLFi2UYhu688049++yzGjdunJKTk7Vjxw4tW7ZMXq9XvXr10m233WYKQFrb7373O3355ZdaunSpDMPQ3XffraefflozZ85UQkKCdu7cqSVLlsjr9Wry5MkaMGCAXn/99eP2N3ToUM2ZM8e/ps0TTzyh119/XRMnTlTXrl2Vnp6uxYsXq6qqSomJiXr88cf185//vNE6L774Yv35z3+WVL1Y6UsvvaSBAweaFrn9y1/+0uTn/8tf/qJVq1Zp5cqV8ng8uvXWW/XII49o2rRpSkhI0K5du7R48WJ/AOV0OvXCCy/UCR3CyYABA/T888/rqquuktfr1ffff68hQ4Zo+vTpGjBggEpKSrRkyRLt37/ff82JJ56oxx57rN7+Dhw4oAcffFAPPvigunfvrjFjxqh79+5yOp06dOiQVq9ebVrLZ/r06abpOFJ1iPbGG2/ojTfeUGxsrEaPHq3+/fsrKSlJ+fn52r17t1atWuU/PzY2tll/38Fw77336u2335bP51NGRoZeeumlNh+VdjyHDx/Wk08+qSeffFLJyckaP368evToocTERJWUlGjHjh1avXq1f5tpSerWrZtee+010xTA47n//vubtIDvrFmzdPHFFzfrWQAAATAAAAhzRUVFRlxcnCHJ/zVs2LCArj148KAxbtw407W1v4YPH25s2rTJePHFF/1t11xzTb39LVy40H/OzJkzj3vfmv03pLCw0DjrrLMarG/q1KlGVlaWcc011/jbXnzxxXr7Ky0tNc4444wG+0tNTTW+++67gJ+loKDAGDp0aIN91rRnzx5/e58+fRp8/uLiYuOyyy5rsG9JRo8ePYxPPvmkwb7uv/9+//n3339/g+caRuB/l4EK5O/nqI8//tjo1q1bo899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",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAAqBJJREFUeJzs3Xd8VfX9x/H3zd4JSRiBBAKEvbdMBQX3oIgUZGkdbbW1jlq1itrW/rTVauu2WhkKigsHanGAssPeK4SEhJ295z2/PyjXnOzATc69yev5ePDoPZ8z7ucCRe6b77AZhmEIAAAAAAAATuFhdQMAAAAAAADNCWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAABOtmrVKtlsNtlsNl1yySU1XnfuGpvN5rT3njt3ruOZ8+fPd9pznS0pKcnRZ2xsrNXtNBl3+fUBAAAXhrAFAOAWHnjgAdOXc8Mwzus5GRkZ8vX15Qsv4OLmz59vCiQr//D19VWbNm00bNgw/frXv9aPP/5Y72dXDPvO/WjTpo3Kysrq/Yzy8nJFRUVVeU5SUlKd96akpOipp57S5ZdfrpiYGAUGBsrb21thYWHq2bOnrrrqKv3xj3/U559/rry8vAZ9job8WLVqVb0/LwCgYQhbAABuYc6cOY7XycnJ+uGHH87rOe+9955KSkokSYGBgbrxxhud0l9L1lJHqcBaJSUlOnPmjDZv3qxXX31VF198scaPH6+UlJTzet6ZM2f01Vdf1fv6//73vzp58mSD3qOoqEgPPPCAOnfurEcffVQrVqxQamqqCgoKVFZWpuzsbB04cEBfffWV/vrXv+q6665TeHi41q9f39CPAwCwmJfVDQAAUB/9+vXToEGDtG3bNknSwoULa52iU5OFCxc6Xk+ZMkVBQUHOahFAIwkODtbs2bNNtaKiIiUnJ2vt2rUqLCyUdHYK34QJE7RhwwZFREQ0+H0WLlyoa6+9tt7XNkRJSYmuv/56rVixwlHz8fHR0KFD1bVrVwUEBCgnJ0dJSUnavn274zOVlpYqPz+/Xu8xe/ZsBQcH17unDh06NOgzAADqj7AFAOA25syZ4whbPvroI7388svy9/ev9/0HDx7Uxo0bTc+z0vlOhWoOLmQqGFqe8PBwvfTSS9WeS09P169//WstXbpUkpSQkKAnnnhCL774Yr2f37t3b+3du1eff/65srKyFBYWVuv12dnZ+vTTT0331uXpp592BC02m00PPvigHnrooWrfq7S0VKtWrdLSpUu1ZMmSen+OJ598ktFlAOAimEYEAHAbM2bMkLe3tyQpJydHy5Yta9D9Ff8lumPHjho/frwz2wNggYiICC1evFjDhg1z1N5++22VlpbW+xmzZs2SJBUXF+v999+v8/qlS5eqqKhIkqqMuKlOaWmpnn/+ecfxn/70Jz399NM1hjre3t6aOHGi/v3vfys1NVWDBg2qx6cAALgSwhYAgNto3bq1rrzySsdxQ4bxG4ahd955x3E8a9Ysp+4CBMA6np6euvvuux3H+fn52rJlS73vnzFjhry8zg74rs+fK+eu8fb21owZM+q8Pj4+XllZWY577rnnnnr3FhYWdl5TogAA1iJsAQC4lYpTf7755pt6L1D5ww8/KDk52XFc+V+js7OztWTJEt15550aMWKEIiMj5ePjo5CQEHXt2lXTp0/X0qVLZbfbnfNB1PCtn5ctW6brr79eHTp0kK+vr6KjozVx4kQtWrSoQbuoSFJhYaGWLVum3/72txozZozatm0rHx8fBQUFKTY2VpMnT9Zbb73lWEy4Oud2i+ncubOjlpycXOPOJxWdz6K6GzZs0N13360+ffqoVatW8vPzU3R0tK644gq99NJL9VrX4oknnnC87xNPPCFJKisr08KFC3XZZZc5fm6joqJ0ww036IsvvqhXb40lLy9P//rXv3T55ZcrOjpafn5+atWqlfr27au7777bNC2uLikpKXryySc1btw4tW3bVr6+vvLx8VFERIQGDBigGTNm6NVXX631/1OlpaV655139LOf/UxdunRRUFCQvLy8FBwcrLi4OF1++eWaN2+e4uPjnfHxG2TgwIGm4+PHj9f73jZt2uiKK66QJK1bt06HDx+u8dojR45o7dq1kqQrrrhCrVu3rvP5x44dc7wODw9v0LoqAAA3ZQAA4EaKi4uN8PBwQ5IhyXjuuefq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Ip379Tm30HFISEi9gidXNW/ePMdCuQcPHtTll1+uxMRE0zV2u13//Oc/Teui3HXXXVW2JN6yZYtiY2P1xBNPaO/evdW+X3l5ud5//33Hts7S2al3FY0cOVIzZszQV199VWN4c/DgQdMosksvvbTO34/O1rNnT910002O42eeeabeYVN14uLiNHToUA0dOlRxcXHn/ZzMzEz9/ve/V2xsrO677z5t3bq1xpFaaWlpuvfee02/hwcNGkTYAgBuxsvqBgAAcIY5c+ZUu75IXdu0Tpo0SePGjdOPP/4owzD0wAMP6OWXX9bgwYMVGhqqQ4cOad26dSovL1eHDh10zz33mAKQxvbwww/rm2++0dq1a2UYhh566CH985//1MUXX6ygoCAlJCRo9erVKi8v14gRI9S1a1ctXry4xuf17NlTs2bNcqxp89xzz2nx4sUaNmyY2rRpo6SkJP34448qKSlRcHCw/v73v+uXv/xlnX1OmTJFf/3rXyWdXax0/vz5iouLMy1y++yzzzb48z/77LPavHmzNm3apLKyMt199916+umnNWbMGAUFBenw4cP68ccfHQGUl5eX3nrrrSqhgzvp2rWr3nzzTd18880qLy/X+vXr1aNHD40dO1Zdu3ZVXl6eVq9erWPHjjnuueiii/S3v/2t2uedOHFCTz75pJ588km1a9dOAwcOVLt27eTl5aVTp05py5YtprV8xo4da5qOI50N0ZYsWaIlS5bI399f/fv3V5cuXRQSEqLMzEwlJiZq8+bNjuv9/f3P69fbGR577DEtXbpUdrtdKSkpmj9/fpOPSqvJmTNn9Pzzz+v5559XaGiohgwZoqioKAUHBysvL0+HDh3Sli1bHNtMS1Lbtm317rvvmqYA1uTxxx9v0AK+48eP15QpU87rswAA6mAAANAM5OTkGAEBAYYkx49evXrV696TJ08agwcPNt1b+Ufv3r2NPXv2GG+//bajNmfOnGqft3LlSsc1F198cY3vW/H5tcnOzjauuOKKWvsbNWqUcfz4cWPOnDmO2ttvv13t8/Lz841JkybV+rzo6GhjzZo19f4sWVlZRs+ePWt9ZkVHjhxx1Dt16lTr58/NzTVuuummWp8tyYiKijK+/PLLWp/1+OOPO65//PHHa73WMOr/a1lf9fn1Oefzzz832rZtW+fnnj59upGfn1/tMzZs2GB4eXnV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r1yx2+1KT09XzZo1Cz0PAABKh7AFAAC4pKvDltI6cuSIwsLCHO+vDlu++OILPfTQQ4X2e/LJJ/Xee+9Juryvy9WrWwYMGKClS5fK19dXP//8c74g5Gp33nmnli9fLh8fHx09elQhISGOc927d9fGjRtVrVo1xcfHq1GjRqX+TFeHLSEhITpy5Ij8/f0LtDtw4IBat24tSfrb3/6mZ555xnFuwYIFeuSRRyRJqamphCkAADgZG+QCAAC3V7t2bcfKksKMGjXK8Xr58uWO13a7XWvWrJEk9evXr8igRbq8suRKn9WrVzuOnzlzRps2bZIkDR48uExBy7UGDhxYaNAiXV7VExgYKEk6fPhwvnNXBz9z584t9/UBAEDpELYAAACXN23aNBmGUeI/V69qudrNN98sH5+it6rr1KmT49aguLg4x/HDhw8rPT1dktS1a9dia7z6/J49exyvd+3a5dgQt1evXsV/0BJcWblSlNq1a0uSLl68mO94z5491axZM0nSc889p4iICM2YMUPr169XdnZ2hWoCAAAFEbYAAAC3V79+/WLP+/j4qE6dOpKks2fPOo5f/bqkMa7eC+bqfikpKY7XV68wKY9q1aoVe97L6/KPdrm5ufmO+/r6atGiRY6nFG3dulVTpkxRz549FRQUpLvuuksLFiwo0A8AAJQPYQsAAHB7124ma9UYVmrbtq3i4uL09ddfa9SoUWrRooUkKSMjQ99++60eeeQRde3aVadOnbK4UgAAqj7CFgAA4PZ++eWXYs/b7XbHapQrK1yufV3SGCdPniy0X7169RyvT5w4UbqCncTb21v333+/PvroI8XHxys5OVlz5sxR586dJUnbt2/XuHHjLK0RAAB3QNgCAADc3q5du2S324s8/+OPPzr2LmnXrp3jeLNmzRy37mzevLnYa1z9yOirx7j55psdq2J++OGHshfvRCEhIRo5cqQ2btyoW265RZK0ePFiZWRkWFwZAABVG2ELAABwe2fPntWiRYuKPD9nzhzH6759+zpe+/j4qHfv3pKk77//XklJSUWOMXv2bEef22+/3XG8Tp066t69uyTps88+U3Jycrk+gzP5+vo6Pqfdbtf58+etLQgAgCqOsAUAAHiEiRMnFnor0Jo1a/TBBx9Ikjp37qwuXbrkO//UU09JkrKzszV69Gjl5OQUGGPOnDn67rvvJEkPPvhggY1wX375ZUlSenq6Bg0apNTU1CLrLC7QKa+1a9fq0KFDRZ7Pzs52POI6MDBQwcHBptcAAIAnKfoZiAAAAC7i1KlT+R6nXJTrrrtOzZs3L3C8Y8eO+umnn9S5c2dNnjxZERERysrK0pIlS/T222/LbrfLx8dH77zzToG+UVFRGjRokD7//HN999136tatmyZOnKjWrVvr3LlzWrhwoWNlTJ06dfTWW28VGOPee+/V6NGj9dFHH2nDhg1q27atJkyYoB49eqhmzZpKSUnRtm3b9Omnn6pjx46KiYkp+/9IxVixYoX+/Oc/q1evXoqKilKHDh0UHBysjIwMHTx4UP/617+0Y8cOSdLo0aOLfUw2AAAoGd+kAADA5b333nt67733SmzXsWNH7dq1q8DxTp06acKECRo/frwmTJhQ4Lyfn5/mzZunrl27Fjru/PnzZbfb9fXXX2vHjh169NFHC7Rp1KiRYmNjdf311xc6xvvvv6/rrrtO77zzjpKTkzVlypQiP4Mz5OXlac2aNY4VLIW57777NGPGDKdcHwAAT0LYAgAAPMKYMWPUrl07vf3221q3bp1SUlIUHBysyMhIvfzyy2rbtm2RfQMCAvTVV19p0aJFiomJ0aZNm5SSkqLq1aurVatWuv/++zVhwgQFBgYWOYa3t7f+8Y9/aOTIkXr//fe1evVqHT9+XNnZ2apbt646dOigu+66S4899pjpn/2FF15Qhw4dtHz5cu3cuVPJycmORzw3bNhQERERevzxxxUVFWX6tQEA8EQ2wzAMq4sAAABwhrCwMCUmJmr48OGm35oDAABQFDbIBQAAAAAAMBFhCwAAAAAAgIkIWwAAAAAAAExE2AIAAAAAAGAiwhYAAAAAAAAT8TQiAAAAAAAAE7GyBQAAAAAAwESELQAAAAAAACYibAEAAAAAADARYQsAAAAAAICJCFsAAAAAAABMRNgCAAAAAABgIsIWAAAAAAAAExG2AAAAAAAAmIiwBQAAAAAAwESELQAAAAAAACYibAEAAAAAADARYQsAAAAAAICJCFsAAAAAAABMRNgCAAAAAABgIsIWAAAAAAAAExG2AAAAAAAAmIiwBQAAAAAAwESELQAAAAAAACYibAEAAAAAADDR/wHw1/18mXShEwAAAABJRU5ErkJggg==",
"text/plain": [
""
]
@@ -167,12 +68,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 3\n"
+ "Time step 3\n",
+ "RMSE 0.0042332879843025775, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "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ajIyMzMNSYYk4+GHHw7pdTfddFPgNVOnTjU99+abbxrx8fGB59v7Gj9+vLF9+/Z23+urr74KnH/qqace9ryW121PTU2N8a1vfavduqZNm2YUFRUZN9xwQ2Ds2WefbfN6CxcuNFJSUkK638GDBxvLly9v8zrPPvtsSNdo6x537NgRGB80aFC7919bW2tcddVVHV4/JyfH+PDDD9u91r333hs4/9577zUKCwuNk046qd3r3nTTTYbP52v3uqEK5edz0HvvvWdkZ2d3eN8zZ8406urq2r3WP/7xDyMxMTGkn9PJJ5/c5jU2bdpkjBkzJuSf95YtW470j8kwDPPfr47+jhiGYWzevNn0/i+99NJhz23590+S0dDQYLz++uuB43vuueewr73vvvsC5/3nP/8xGhoaTNfasWNHq9f85z//CTxvs9mM2traUP4IOhR8H229NwDAOjTIBQBEDZfLpauvvlqPP/64pObp/D/96U/bfU1DQ4PeeOONwHFwY9x9+/apqalJkpSbm6uxY8cqOztbSUlJqq2t1YYNG7R8+XIZhqFVq1bplFNO0cqVK7tlar/H49H555+vOXPmBMays7N1yimnKDU1VVu3btW8efM0b948XXrppRo6dGiH16yoqFBtba2k5n/Rz8/PV25urpKTk1VfX6+tW7dq8eLF8nq92rlzp0499VQtX75cw4cPN11nzJgxuu2221RTUxNYVtHWrjFHo76+XmeccYZppkT//v01ffp0paSkBO7f5/OpqKhIF110kV555ZWQtvSura3Vueeeq7Vr1yopKUnTp09XXl6eampq9NVXX2nfvn2Smvt/jBo1Sj//+c/Ddl8dee2113TNNdfI5/NJal4mM23aNA0fPly1tbWaO3duYObGyy+/rB07dujLL79UQkJCq2u9/fbbuvXWWwPHaWlpmjp1qnJzc+V0OlVVVaXNmzdr7dq1h53JVFNTo7POOiuwrbLdbtfEiRM1ZswYpaSkqL6+Xnv27NGqVatUWloa7j+OkATPZOnXr1+nXn/RRRcpIyNDlZWVevHFFwOzoIId/Lveq1cvXXjhhSE1eh42bFjgsWEY+tOf/qT777+/U/UBAKKQxWEPAACdsnjxYtO/5q5evbrd81966aXAufHx8UZFRYXp+Xfffdf44x//2O6/xG/fvt2YMWNG4Drf/e53D3tuOGe2/Pa3vzX9i/jvf/97w+v1ms7ZtGmTMX78eEOS4XK5QprZ8stf/tJYs2bNYd+3pKTEuO666wLXOvPMMw97bmdmqXT2Nd///vcD5zkcDuORRx5pNctk8+bNxnHHHRc4Ly0t7bD/wt9yZsvB2Uw33HCDUVZWZjqvrq7OuPrqqwPnpqSkhGU2QigzW7Zu3WqaeTRlypRWfzd9Pp/x8MMPG3a7PXDeD3/4wzavN2HChMA5t99++2FnwdTU1Bivv/668fOf/7zVc4888kjgGmPHjjU2btzY5jX8fr+xePFi4/vf/76xe/fudv4kOtbZmS2/+MUvAufHxcUZ5eXlhz23rZkthmEY3/ve9wJjc+bMafW6uXPnBp6/9dZbDcMwQprZ4vf7jcGDB5v+t3zttdca33zzjeH3+0P7AwnhPpjZAgCRhbAFABB1Wi5nuOuuu9o9t2VIcuWVVx7xe7rdbuPYY481JBkJCQmH/TAXrrClsrLSSEpKCpxz3333HfZa+/btM3JyckzX7GiZSijOO++8wPXWr1/f5jldFbZs3brVFCY89thjh71eeXm56cPsTTfd1OZ5LcMWScbVV1992Gs2NDQYeXl5gXNfffXVkO6tPaGELddff33gnOHDhxuVlZWHvd5f/vKXwLl2u73VEreamprA83l5eUf8wf6yyy4LXOezzz47omt0VmfClvXr1xupqamB82fOnNnu+YcLW+bPnx8Y+3//7/+1et0tt9wSeH7BggWGYYQWthiGYbzxxhum8w5+ZWVlGd/61reMe+65x3jvvffaDYk6uo/rr7/euO2220L6euSRR0J+HwDAkSFsAQBEnQceeCDwAaN///6tZnsctHfvXsPhcATO/eCDD47qfR988MHAtd599902zwlX2PLEE08Ens/NzTWamprare2f//xn2MOW1157LXC9v//9722e01Vhy89//vPAORMmTOgwKGhZa3x8fJshRcuwxeVyGUVFRe1e82c/+1ng/J/+9Kch3Vt7OgpbKioqTP2D3nrrrXav5/P5jPz8/MD5d999t+n5PXv2mP4Mj9TZZ58duM7KlSuP+Dqd0VHY0tjYaGzatMn405/+ZGRkZATOHT16tFFcXNzutQ8XthiGYQwfPtyQZKSnp5vGGxoaAu8zYsQI03ios0uefvppIyEhoc3QpeWslylTphiPPvqo6f1DuY/OfLX33yYAQHjQswUAEHWuvfZa/fKXv5Tf79fevXv1+eefa8aMGa3Oe+mllwJ9L7Kzs9s8p6XKykotXLhQ69atU1lZmWpra007EG3cuDHweOXKlbrwwgvDdEetffXVV4HHV111lVwuV7vnf+c739Htt9/e7g5Cwerr67Vw4UKtWbNG+/fvV01NTeDPSzLvorJy5crQiw+DL7/8MvD4xhtv7HDXpksvvVSZmZkqLy9XU1OTvvnmm8AOM22ZNm2asrOz273mxIkTA4937twZWuFHYcGCBYH+Qb179+7w75fdbtfNN9+sO++8U5L578zBayQkJKixsVFr167V/PnzdfLJJ3e6rry8vMDjp556Sk8++WSnr3E0Du5y1R673a5LLrlEjz/+eKf7tbR03XXX6d5771VVVZXeeecdXXXVVZKkd955J7B983XXXXdE1/7ud7+rs88+Ww8++KBeeeUVVVRUtDrHMAwtXrxYixcv1oMPPqhZs2bptNNOO9LbAQBYiLAFABB1BgwYoLPOOkuffvqpJGnWrFltBikHm1lK0jXXXCOHw9Hm9QoLC3X33XfrjTfeCHzY7UhXNwJdsWJF4PHUqVM7PD81NVXHHHOMli9f3uG55eXluueee/TCCy+opqYmpHq6s/GpYRimcOekk07q8DVxcXGaMmWKPv74Y0nS8uXL2w1bxo0b1+E1WzZBrq6u7vD8o9XyZz5lyhQ5nR3/mtYyPFmxYoUMwwgEEy6XS5dccoleffVVeb1enXHGGbrqqqt0+eWX65RTTlFGRkZIdV155ZX697//Lak5bFm2bJluuOEGzZgxo1XjZKtcdNFFeuaZZ0K+p8O57rrrdN9998kwDL3wwguBsOXgf0tsNtsRhy2SNHDgQD3++OP661//qkWLFmnu3LlasmSJli1bFmhAfFBhYaHOPvtsffDBBzrnnHM6vPaOHTtC3kodAND1CFsAAFHphhtuCIQt//3vf1VbW6uUlJTA8ytWrNCaNWtM57dlxYoVOvPMM9v8V+b2hBpSHKn9+/cHHg8cODCk1wwcOLDDsGXXrl065ZRTtHv37k7V09X321JVVZU8Hk/geNCgQSG9ruUHzY7CofT09A6vFxcXF3jcsp6u0vJnfiT37Ha7VVNTo7S0tMDYX//6Vy1btkxbtmyR2+3WrFmzNGvWLNntduXn52v69Ok6++yzdd555yk+Pr7N95gxY4Z++MMf6tFHH5UkLVmyREuWLJHUvOvPtGnTdNppp+mSSy5Rbm5uZ2+7Q8G7XHm9Xu3du1crVqxQYWGhpOZdl7Zv364vvvhCvXv3PuL3GjJkiKZNm6a5c+fq008/VUlJiSQF/lszffr0sAQaLpdL06dP1/Tp0wNjO3fu1BtvvKFHHnkkMKvM6/Xq+uuv1/bt25WUlHTU7wsA6D52qwsAAOBIXHrppYEPlfX19abtnSXzrJaJEye2OZOhqalJl112WSBo6dOnj37961/rq6++UkFBgerq6uT3+2U09zjTs88+G3hty+VFXeHg9sySQv6QlZyc3OE5M2fODAQtqamp+slPfqKPP/5Y27dvV21trXw+X+B+Wy5L6er7banlvUuh3VfweR2FQx0tS7FCy/s+knuWWt93dna2li5dql//+tem5TV+v19r1qzRE088oUsvvVQ5OTl64IEHTMvIWvr73/+ut956S1OmTDGNl5SU6M0339QPf/hDDRw4UJdffnmng7yOZGZm6rHHHgt8PfXUU3r33Xe1Y8cOPfPMM4Etr1evXh2WrccPBrNer1cvv/yyXn75ZXm9XtNzXWHw4MG66667tH79etPSoZKSEr322mtd9r4AgK5B2AIAiEqJiYm64oorAsezZs0KPPZ6vXrllVcCx4f7gPTmm29qx44dkpqXJq1atUq/+93vdNpppyk3N1dJSUmmD+XdObuj5Syd+vr6kF5TV1fX7vMLFizQggULAtdfuHCh/vKXv2jGjBkaMmSIkpOTZbcf+tWgO++3pZb3LnV8X22dl5qaGtaaukPL+z6Se5bavu+0tDT97ne/0549e7Rw4UI99NBDuuSSS0wzQCoqKvSLX/xCl112mQzDaPO9Lr30Ui1atEi7du3S888/r1tvvVVjx44NPG8Yht58801NmjRJmzdvDqn+o+F0OnXzzTfr6aefDox99NFHev7554/quldccYUSExMlNYe2B68X/N+crpKWlqZZs2aZlj3OnTu3y98XABBehC0AgKjVMkSZPXt2oOfBJ598Epj+HxcXp5kzZ7b5+i+++CLw+Mc//rFycnLafb9du3Ydbckh69OnT+BxqDMFgns+BGt5vzfccIPpg3JbuvN+W0pPTzct4Qn1/ls2sT2apSRWOZKfect7drlc7YZMDodDJ5xwgu666y7997//VUlJiebOnauLLroocM4777yjN998s933HDhwoK6//no99dRTWrdunXbv3q37778/MAOrrKxMP/3pT0OqPxyuueYa0z385je/UWNj4xFfLy0tTRdffLGk5sbQq1atkiRdcskl3Rbi5ebmKj8/P3BcVFTULe8LAAgfwhYAQNSaNm2ahg4dKql5WcSLL74oybyE6LzzzjN9iG1p7969gcehNEydM2fO0ZTbKS13wlm4cGGH59fW1mrt2rXtntMV99sVy3FsNpsmTJgQOD44G6c9Xq830EdEkiZNmhT2urpay5/54sWLD7ukp6WWfzYTJ07s1M/Dbrdr2rRpevvtt3X22WcHxt99992QryE171Z0zz336J///Gdg7NNPPw252XQ4/OlPfwrMBCkoKNBTTz11VNdrazlSOJYodcbB5VGSDttPBwAQuQhbAABRy2azmT4AzZo1S1VVVaYPi+31WGi5ZKajpTrLli0zfZjvaqeffnrg8WuvvdZhg9bXXnutww+3nbnfvXv36p133umwzpYfCMPZRPaMM84IPH7++ecPu7TloLfffltlZWWBmkLZwSnSnHTSSYEP1fv379cHH3zQ7vl+v9/UR6jln1ln2Gw20zbTB2eFdVbL2SUej0fl5eVHdJ0jMWrUKH3nO98JHD/00ENHFfacc845pq3Bc3JyTIFUV2tqajJtNR9qk2wAQOQgbAEARLXrr78+8K/5GzZs0M9+9rPAEoLMzExdcMEFh33twVkxUvv/ml9fX6/vfe97Yao4NDNnzgwsyygoKNCDDz542HPLysp0zz33dHjNUO/X5/Ppe9/7ntxud4fXzMjICIQ4+/fvD1vgcssttwSuu3z5ctOsiWCVlZX62c9+Fji++uqrQ9ptKNJkZGQEthqWpP/93/9tt2/OY489Fthxy263t/o7WlNTE9LPUDIvQevbt6/puVC3/W55Dbvdbto6uzv8+te/Dvyd2bt3r6mXS2c5HI7AtsxLlizRnDlzDrt1fEcWLVqkP//5zyH3XpKaZ+q03G68vW3MAQCRibAFABDVhgwZYto+teWH8quvvloul+uwr235r/nPP/+8Hn744VZLN7Zu3apzzjlHy5cvD3mHmHBIT083BQj33HOPHnzwwVb1bdmyRWeffbb27t3b7r1K0vnnnx8IpmbPnq277rpLDQ0NpnOKi4t12WWX6YMPPgjpfuPj4zVixAhJzbMZ3n777VBur0PDhg3TrbfeGji+/fbb9fjjj7faFengz+dgo+O0tLSQgqdIdc899wQa5W7evFkzZszQ9u3bTef4/X797W9/M/VFue2221ptSbxs2TINHjxY9913n9avX9/m+/l8Pr322muBbZ2l5qV3LU2dOlUzZ87URx99dNjwZvPmzaZZZGeeeWaHfx/DbfTo0bryyisDxw8++GDIYVNbhg8fruOPP17HH3+8hg8ffsTXqaio0P/+7/9q8ODB+ulPf6rly5cfdqZWaWmpfvKTn5j+Dk+cOJGwBQCikNPqAgAAOFo33HBDm/1FOtqm9ZxzztEpp5yiOXPmyDAM3XXXXXr88cc1adIkpaena8uWLVqwYIF8Pp8GDBigO+64wxSAdLVf/OIX+uyzzzR//nwZhqG7775bf/vb33TqqacqJSVFW7du1dy5c+Xz+XTCCSdo2LBhevnllw97vdGjR+u6664L9LR5+OGH9fLLL2vy5Mnq27evdu7cqTlz5sjtdis1NVUPPfSQ/ud//qfDOi+77DL94Q9/kNTcrPS5557T8OHDTU1u//znP3f6/v/85z9r6dKlWrJkibxer26//XY98MADmjZtmlJSUrRt2zbNmTMnEEA5nU4988wzrUKHaDJs2DA9/fTTuuaaa+Tz+fTNN99o1KhRmj59uoYNG6ba2lrNnTtXe/bsCbzmxBNP1J/+9Kc2r1dUVKT7779f999/v7KzszVhwgRlZ2fL6XSqpKREy5YtM/XymT59umk5jtQcor3yyit65ZVXlJiYqGOPPVZDhw5VWlqaKioqtH37di1dujRwfmJi4hH9vMPhN7/5jV5//XX5/X4VFBToueee6/ZZaYezf/9+/fWvf9Vf//pXpaen67jjjlNOTo5SU1NVW1urLVu2aNmyZYFtpiWpX79+eumll0xLAA/n3nvv7VQD39NPP12XXXbZEd0LACAEBgAAUa66utpISkoyJAW+xowZE9Jri4uLjUmTJpleG/w1duxYY926dcazzz4bGLvhhhvavN5XX30VOOfUU0897Pu2vH57qqqqjHPPPbfd+k466SRj7969xg033BAYe/bZZ9u8Xl1dnXHOOee0e73c3Fxj3rx5Id9LZWWlMXr06Hav2dKOHTsC44MGDWr3/mtqaowrr7yy3WtLMnJycowPP/yw3Wvde++9gfPvvffe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ZHXu3Fnh4eFOx0+bNs0RtPTt21dPPfWUevTooe+//14bNmxQQkKCsrOzFRUVpS+++EIdOnRwGuPRRx/VmjVrJElBQUGaN2+ehgwZopYtW+rChQvat2+f3nnnnUqv480331RqaqruuusuzZkzR6Ghobp8+bISExOVmJioCxcuaMaMGUpLSytz3LVr1zRp0iRduXJFzZs319y5cxUZGal27dqpsLBQp06dUmpqaqVhEgAAqDpmtgAAAJdUemZLVd9GdPvtt8tqtTq+vjGzRZI6deqkPXv2KDAwsMwxn376qUaPHi2bzaYBAwZo3759ZbZv2rTJMdMjKipKmzdvlpeXV5l93nzzTT366KOSpF/96ld6++23y2z/8MMPdd9990mSBg8erM2bN8vf37/cazh9+rSCg4MdX5ee2SJJs2fP1qpVq2SxWMocN3v2bMXFxUmSDh48qH79+jm27dixQ1FRUZIqn7lis9mUl5enFi1alLsdAABUDWELAABwSaXDlqo6deqUQkJCHF+XDlveeecdPfDAA+Ue99hjj2nlypWSrj/XpfTslrFjx2rLli2yWq369ttvywQhpY0aNUrbtm2Tp6envvvuOwUFBTm2DRkyRGlpaWrWrJnS09PVvn37Kl9T6bAlKChIp06dkre3t9N+x48fV/fu3SVJf/7zn/X44487tq1fv16TJ0+WJOXm5hKmAABQx3hALgAAaPRatWrlmFlSnhkzZjiWt23b5li22WxKSUmRJI0ePbrCoEW6PrPkxjHJycmO9RcvXtSePXskSRMnTqxW0PJTDz74YLlBi3R9Vo+fn58k6eTJk2W2lQ5+4uPja3x+AABQNYQtAADA5S1evFh2u/2mf0rPaimtX79+8vSs+FF1YWFhjluDjhw54lh/8uRJ5eXlSZIGDhxYaY2ltx89etSxfPjwYccDcYcPH175hd7EjZkrFWnVqpUk6YcffiizftiwYbrtttskSU888YQiIiK0bNky7d69W4WFhbWqCQAAOCNsAQAAjV67du0q3e7p6anWrVtLkr7//nvH+tLLNxuj9LNgSh+Xk5PjWC49w6QmmjVrVul2D4/r39oVFxeXWW+1WpWUlOR4S9H+/fu1cOFCDRs2TP7+/rrnnnu0fv16p+MAAEDNELYAAIBG76cPkzVrDDP17NlTR44c0fvvv68ZM2aoa9eukqT8/Hx9/PHHmjx5sgYOHKjz58+bXCkAAA0fYQsAAGj0/v3vf1e63WazOWaj3Jjh8tPlm41x7ty5co9r27atY/ns2bNVK7iONGnSROPHj9fq1auVnp6u7OxsrVmzRv3795ckffbZZ5ozZ46pNQIA0BgQtgAAgEbv8OHDstlsFW7//PPPHc8u6dWrl2P9bbfd5rh1Z+/evZWeo/Qro0uP0a9fP8esmH/961/VL74OBQUFKSYmRmlpabrzzjslSR999JHy8/NNrgwAgIaNsAUAADR633//vZKSkircvmbNGsfyyJEjHcuenp666667JEmffPKJsrKyKhwjLi7Occzdd9/tWN+6dWsNGTJEkrRx40ZlZ2fX6BrqktVqdVynzWbT5cuXzS0IAIAGjrAFAAC4hfnz55d7K1BKSoreeOMNSVL//v01YMCAMtt//etfS5IKCws1c+ZMFRUVOY2xZs0abd26VZJ0//33Oz0I97nnnpMk5eXlacKECcrNza2wzsoCnZrauXOnTpw4UeH2wsJCxyuu/fz8FBAQYHgNAAC4k4rfgQgAAOAizp8/X+Z1yhVp2rSpunTp4rS+b9+++uqrr9S/f38tWLBAERERunbtmjZv3qxXX31VNptNnp6eeu2115yOjY6O1oQJE/T3v/9dW7du1aBBgzR//nx1795dly5d0oYNGxwzY1q3bq1XXnnFaYxx48Zp5syZWr16tVJTU9WzZ0/NmzdPQ4cOVYsWLZSTk6MDBw7o7bffVt++fZWQkFD9v6RKbN++Xb///e81fPhwRUdHq0+fPgoICFB+fr6++eYb/e1vf9PBgwclSTNnzqz0NdkAAODm+CQFAAAub+XKlVq5cuVN9+vbt68OHz7stD4sLEzz5s3T3LlzNW/ePKftXl5eWrt2rQYOHFjuuImJibLZbHr//fd18OBBTZkyxWmf9u3ba9OmTerQoUO5Y6xatUpNmzbVa6+9puzsbC1cuLDCa6gLJSUlSklJccxgKc99992nZcuW1cn5AQBwJ4QtAADALcyaNUu9evXSq6++ql27diknJ0cBAQGKiorSc889p549e1Z4rI+Pj9577z0lJSUpISFBe/bsUU5Ojnx9fRUaGqrx48dr3rx58vPzq3CMJk2a6C9/+YtiYmK0atUqJScn68yZMyosLFSbNm3Up08f3XPPPXrkkUcMv/ann35affr00bZt23To0CFlZ2c7XvEcGBioiIgITZ06VdHR0YafGwAAd2Sx2+12s4sAAACoCyEhIcrMzNS0adMMvzUHAACgIjwgFwAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMxNuIAAAAAAAADMTMFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBA/wulfVw/AcN8EQAAAABJRU5ErkJggg==",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAAqN9JREFUeJzs3Xd4VGXexvF7Jr0HSAKBhBp679JBkaKL4iIiqIB91762VVex7OprWXtZ10VpNlAUQcS20nvvEEJNSIAQSO+Zef9gGXNIh0nOTPL9XBfXznmeZ878DrDI3DzFYrfb7QIAAAAAAIBTWM0uAAAAAAAAoDYhbAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAwMmWLVsmi8Uii8WioUOHljnu/BiLxeK0z546darjnjNnznTafZ3tyJEjjjqbN29udjk1xl1+fQAAwKUhbAEAuIVHH33U8OXcbrdf1H3OnDkjHx8fvvACLm7mzJmGQPLCHz4+PoqIiFDv3r11zz33aMWKFZW+d/Gw7/yPiIgIFRYWVvoeRUVFioyMLHGfI0eOVPje+Ph4vfjiixo5cqSio6MVEBAgLy8vhYaGql27drrqqqv0t7/9TYsWLVJmZmaVnqMqP5YtW1bp5wUAVA1hCwDALUyZMsXx+ujRo1q+fPlF3efLL79Ufn6+JCkgIEDXX3+9U+qry+rqLBWYKz8/X8nJydq0aZP+9a9/aciQIRo2bJji4+Mv6n7JyclasmRJpcf/9NNPOnHiRJU+Izc3V48++qhatGihp59+Wj///LMSEhKUnZ2twsJCpaWlaf/+/VqyZIleeuklXXPNNapfv77Wrl1b1ccBAJjM0+wCAACojM6dO6t79+7aunWrJGn27NnlLtEpy+zZsx2vx40bp8DAQGeVCKCaBAUFafLkyYa23NxcHT16VKtXr1ZOTo6kc0v4Lr/8cq1bt04NGjSo8ufMnj1bY8aMqfTYqsjPz9e1116rn3/+2dHm7e2tXr16qVWrVvL391d6erqOHDmibdu2OZ6poKBAWVlZlfqMyZMnKygoqNI1NWnSpErPAACoPMIWAIDbmDJliiNsmT9/vt5//335+flV+v2xsbFav3694X5mutilULXBpSwFQ91Tv359vffee6X2paSk6J577tG8efMkSXFxcXruuef07rvvVvr+HTp00J49e7Ro0SKlpqYqNDS03PFpaWn67rvvDO+tyMsvv+wIWiwWix5//HE98cQTpX5WQUGBli1bpnnz5umLL76o9HM8//zzzC4DABfBMiIAgNuYNGmSvLy8JEnp6elasGBBld5f/F+imzZtqmHDhjmzPAAmaNCggT7//HP17t3b0TZjxgwVFBRU+h633HKLJCkvL09z586tcPy8efOUm5srSSVm3JSmoKBAb775puP6hRde0Msvv1xmqOPl5aUrr7xS//nPf5SQkKDu3btX4ikAAK6EsAUA4DbCw8M1evRox3VVpvHb7XZ9+umnjutbbrnFqacAATCPh4eH7rvvPsd1VlaWNm/eXOn3T5o0SZ6e5yZ8V+bPlfNjvLy8NGnSpArHb9iwQampqY73PPjgg5WuLTQ09KKWRAEAzEXYAgBwK8WX/vzyyy+V3qBy+fLlOnr0qOP6wn+NTktL0xdffKG7775bffv2VVhYmLy9vRUcHKxWrVpp4sSJmjdvnmw2m3MeRFU/+nnBggW69tpr1aRJE/n4+CgqKkpXXnml5syZU6VTVCQpJydHCxYs0AMPPKCBAweqYcOG8vb2VmBgoJo3b67rrrtOH3/8sWMz4dKcPy2mRYsWjrajR4+WefJJcRezqe66det03333qWPHjqpXr558fX0VFRWlUaNG6b333qvUvhbPPfec43Ofe+45SVJhYaFmz56t4cOHO35uIyMjNXbsWH3//feVqq26ZGZm6p133tHIkSMVFRUlX19f1atXT506ddJ9991nWBZXkfj4eD3//PMaPHiwGjZsKB8fH3l7e6tBgwbq2rWrJk2apH/961/l/n+qoKBAn376qf74xz+qZcuWCgwMlKenp4KCghQTE6ORI0dq2rRp2rBhgzMev0q6detmuE5MTKz0eyMiIjRq1ChJ0po1a3Tw4MEyxx4+fFirV6+WJI0aNUrh4eEV3v/48eOO1/Xr16/SvioAADdlBwDAjeTl5dnr169vl2SXZH/99dcr9b5bb73V8Z5+/foZ+ubPn2/38fFx9Jf3o2vXrvZDhw6V+1lLly51jB8yZEiZ44rftzwZGRn2q666qty6Bg4caE9KSrJPmTLF0TZjxoxS77du3Tp7YGBgpZ63efPm9i1btpR6nxkzZlTqHqU94+HDhx3tzZo1K/f5MzMz7RMmTKjw/pGRkfYffvih3Hs9++yzjvHPPvusPSEhwd6/f/9y73vrrbfai4qKyr1vZVXm1+e8RYsW2Rs1alThc0+aNMmelZVV7r3+/e9/2/38/Cr16zRgwIBS77F//357+/btK/3rfeDAgYv9abLb7cbfXxX9HrHb7fbY2FjD53/22Wdlji3++0+SPScnxz5v3jzH9bRp08p873PPPecY99VXX9lzcnIM9zp8+HCJ93z11VeOfovFYs/MzKzMT0GFLnyO0j4bAGAONsgFALgVb29vTZw4Ue+//76kc9P5H3744XLfk5OTo6+//tpxfeHGuKdOnVJeXp4kKSoqSh06dFCjRo3k7++vzMxM7d27V1u2bJHdbtf27ds1ePBgbdu2rUam9hcUFOjqq6/WihUrHG2NGjXS4MGDFRQUpLi4OK1atUqrVq3Sddddp5YtW1Z4z7NnzyozM1PSuX/R79ixo6KiohQQEKDs7GzFxcVpw4YNKiws1JEjRzRkyBBt2bJFMTExhvu0b99e9957rzIyMhzLKko7NeZSZGdn6/LLLzfMlGjcuLEGDRqkwMBAx/MXFRUpKSlJ11xzjb744otKHemdmZmpUaNGadeuXfL399egQYMUHR2tjIwMLV26VKdOnZJ0bv+Ptm3b6q9//avTnqsic+fO1U033aSioiJJ55bJDBw4UDExMcrMzNTKlSsdMzc+//xzHT58WL/99pt8fX1L3GvBggW6++67HdfBwcHq16+foqKi5OnpqbS0NMXGxmrXrl1lzmTKyMjQ8OHDHccqW61Wde/eXe3bt1dgYKCys7N1/Phxbd++XadPn3b2T0elXDiTpWHDhlV6/zXXXKPQ0FClpqbq008/dcyCutD53+v16tXTmDFjKrXRc6tWrRyv7Xa7Xn31VT3//PNVqg8A4GZMDnsAAKiyDRs2GP41d8eOHeWO/+yzzxxjfXx87GfPnjX0L1y40P5///d/5f5L/KFDh+wjR4503Of2228vc6wzZ7a88MILhn8Rf/HFF+2FhYWGMfv377d37drVLsnu7e1dqZktTz31lH3nzp1lfu7Jkyftt9xyi+NeV1xxRZljqzJLparv+fOf/+wY5+HhYX/rrbdKzDKJjY219+zZ0zEuODi4zH/hLz6z5fxspilTpthTUlIM47KysuwTJ050jA0MDHTKbITKzGyJi4szzDzq06dPid+bRUVF9tdff91utVod4+6///5S79etWzfHmPvuu6/MWTAZGRn2efPm2f/617+W6Hvrrbcc9+jQoYN93759pd7DZrPZN2zYYP/zn/9sP3bsWDk/ExWr6syWJ5980jHey8vLfubMmTLHljazxW632++66y5H24oVK0q8b+XKlY7+u+++22632ys1s8Vms9mbN29u+P/yzTffbF+7dq3dZrNV7iekEs/BzBYAcB2ELQAAt1R8OcOjjz5a7tjiIckNN9xw0Z+Zn59v79Kli12S3dfXt8wvc84KW1JTU+3+/v6OMc8991yZ9zp16pQ9MjLScM+KlqlUxujRox3327NnT6ljqitsiYuLM4QJ7733Xpn3O3PmjOHL7K233lrquOJhiyT7xIkTy7xnTk6OPTo62jH2yy+/rNSzlacyYcvkyZMdY2JiYuypqall3u+NN95wjLVarSWWuGVkZDj6o6OjL/qL/bhx4xz3+eWXXy7qHlVVlbBlz5499qCgIMf4SZMmlTu+rLBl9erVjrY77rijxPvuvPNOR/+aNWvsdnvlwha73W7/+uuvDePO/2jQoIH9qquusk+bNs2+aNGickOiip5j8uTJ9nvvvbdSP956661Kfw4AoOoIWwAAbunll192fMFo3Lhxidke5yUmJto9PDwcYxcvXnxJn/vKK6847rVw4cJSxzgrbPnggw8c/VFRUfa8vLxya/voo4+cHrbMnTvXcb933nmn1DHVFbb89a9/dYzp1q1bhUFB8Vp9fHxKDSmKhy3e3t72pKSkcu/5+OOPO8Y//PDDlXq28lQUtpw9e9awf9A333xT7v2KiorsHTt2dIx/4oknDP3Hjx83/BxerCuvvNJxn23btl30faqiorAlNzfXvn//fvurr75qDw0NdYxt166d/cSJE+Xeu6ywxW6322NiYuyS7CEhIYb2nJwcx+e0bt3a0F7Z2SXTp0+3+/r6lhq6FJ/10qdPH/u7775r+PzKPEdVfpT3ZxMA4NKxZwsAwC3dfPPNeuqpp2Sz2ZSYmKhff/1VI0eOLDHus88+c+x70ahRo1LHFJeamqp169Zp9+7dSklJUWZmpuEEon379jleb9u2TWPGjHHSE5W0dOlSx+sJEybI29u73PE33nij7rvvvnJPELpQdna21q1bp507dyo5OVkZGRmOny/JeIrKtm3bKl+8E/z222+O11OnTq3w1KbrrrtO9evX15kzZ5SXl6e1a9c6TpgpzcCBA9WoUaNy79m9e3fH6yNHjlSu8EuwZs0ax/5BYWFhFf7+slqtuu222/TII49IMv6eOX8PX19f5ebmateuXVq9erUGDBhQ5bqio6Mdrz/88EP961//qvI9LsX5U67KY7VaNXbsWL3//vtV3q+luFtuuUXPPvus0tLS9N1332nChAmSpO+++85xfPMtt9xyUfe+/fbbdeWVV+qVV17RF198obNnz5YYY7fbtWHDBm3YsEGvvPKK5syZo6FDh17s4wAATELYAgBwS02aNNHw4cP1888/S5LmzJlTapByfjNLSbrpppvk4eFR6v0SEhL0xBNP6Ouvv3Z82a1IdW8EunXrVsfrfv36VTg+KChInTp10pYtWyoce+bMGU2bNk2zZ89WRkZGpeqpyY1P7Xa7Idzp379/he/x8vJSnz599OOPP0qStmzZUm7Y0rlz5wrvWXwT5PT09ArHX6riv+Z9+vSRp2fFf1UrHp5s3bpVdrvdEUx4e3tr7Nix+vLLL1VYWKjLL79cEyZM0PXXX6/BgwcrNDS0UnXdcMMN+uSTTySdC1s2b96sKVOmaOTIkSU2TjbLNddco48//rjSz1SWW265Rc8995zsdrtmz57tCFvO/1lisVguOmyRpKZNm+r999/Xm2++qfXr12vlypXauHGjNm/e7NiA+LyEhARdeeWVWrx4sUaMGFHhvQ8fPlzpo9QBANWLsAUA4LamTJniCFu+/fZbZWZmKjAw0NG/detW7dy50zC+NFu3btUVV1xR6r8yl6eyIcXFSk5Odrxu2rRppd7TtGnTCsOWo0ePavDgwTp27FiV6qnu5y0uLS1NBQUFjutmzZpV6n3Fv2hWFA6FhIRUeD8vLy/H6+L1VJfiv+YX88z5+fnKyMhQcHCwo+3NN9/U5s2bdeDAAeXn52vOnDmaM2eOrFarOnbsqEGDBunKK6/U6NGj5ePjU+pnjBw5Uvfff7/effddSdLGjRu1ceNGSedO/Rk4cKCGDh2qsWPHKioqqqqPXaELT7kqLCxUYmKitm7dqoSEBEnnTl06dOiQ/vvf/yosLOyiP6tFixYaOHCgVq5cqZ9//lknT56UJMefNYMGDXJKoOHt7a1BgwZp0KBBjrYjR47o66+/1ltvveWYVVZYWKjJkyfr0KFD8vf3v+TPBQDUDKvZBQAAcLGuu+46x5fK7Oxsw/HOknFWS/fu3UudyZCXl6dx48Y5gpbw8HA9/fTTWrp0qeLj45WVlSWbzSb7uX3ONGPGDMd7iy8vqg7nj2eWVOkvWQEBARWOmTRpkiNoCQoK0l/+8hf9+OOPOnTokDIzM1VUVOR43uLLUqr7eYsr/uxS5Z7rwnEVhUMVLUsxQ/Hnvphnlko+d6NGjbRp0yY9/fTThuU1NptNO3fu1AcffKDrrrtOkZGRevnllw3LyIp755139M0336hPnz6G9pMnT2r+/Pm6//771bRpU11//fVVDvIqUr9+fb333nuOHx9++KEWLlyow4cP6+OPP3Yceb1jxw6nHD1+PpgtLCzU559/rs8//1yFhYWGvurQvHlzPfroo9qzZ49h6dDJkyc1d+7cavtcAIDzEbYAANyWn5+fxo8f77ieM2eO43VhYaG++OILx3VZX5Dmz5+vw4cPSzq3NGn79u36+9//rqFDhyoqKkr+/v6GL+U1Obuj+Cyd7OzsSr0nKyur3P41a9ZozZo1jvuvW7dOb7zxhkaOHKkWLVooICBAVuvvfz2oyectrvizSxU/V2njgoKCnFpTTSj+3BfzzFLpzx0cHKy///3vOn78uNatW6fXXntNY8eONcwAOXv2rJ588kmNGzdOdru91M+67rrrtH79eh09elSzZs3S3XffrQ4dOjj67Xa75s+frx49eig2NrZS9V8KT09P3XbbbZo+fbqjbcmSJZo1a9Yl3Xf8+PHy8/OTdC60PX+/C//MqS7BwcGaM2eOYdnjypUrq/1zAQDOQ9gCAHBrxUOUZcuWOfY8+OmnnxzT/728vDRp0qRS3//f//7X8fqhhx5SZGRkuZ939OjRSy250sLDwx2vKztT4MI9Hy5U/HmnTJli+KJcmpp83uJCQkIMS3gq+/zFN7G9lKUkZrmYX/Piz+zt7V1uyOTh4aG+ffvq0Ucf1bfffquTJ09q5cqVuuaaaxxjvvvuO82fP7/cz2zatKkmT56sDz/8ULt379axY8f0/PPPO2ZgpaSk6OGHH65U/c5w0003GZ7hmWeeUW5u7kXfLzg4WNdee62kcxtDb9++XZI0duzYGgvxoqKi1LFjR8d1UlJSjXwuAMA5CFsAAG5t4MCBatmypaRzyyI+/fRTScYlRKNHjzZ8iS0uMTHR8boyG6auWLHiUsqtkuIn4axbt67C8ZmZmdq1a1e5Y6rjeatjOY7FYlG3bt0c1+dn45SnsLDQsY+IJPXo0cPpdVW34r/mGzZsKHNJT3HFf266d+9epV8Pq9WqgQMHasGCBbryyisd7QsXLqz0PaRzpxVNmzZNH330kaPt559/rvRm087w6quvOmaCxMfH68MPP7yk+5W2HMkZS5Sq4vzyKEll7qcDAHBNhC0AALdmsVgMX4DmzJmjtLQ0w5fF8vZYKL5kpqKlOps3bzZ8ma9uw4YNc7yeO3duhRu0zp07t8Ivt1V53sTERH333XcV1ln8C6EzN5G9/PLLHa9nzZpV5tKW8xYsWKCUlBRHTZU5wcnV9O/f3/GlOjk5WYsXLy53vM1mM+wjVPznrCosFovhmOnzs8KqqvjskoKCAp05c+ai7nMx2rZtqxtvvNFx/dprr11S2DNixAjD0eCRkZGGQKq65eXlGY6ar+wm2QAA10DYAgBwe5MnT3b8a/7evXv1+OOPO5YQ1K9fX3/4wx/KfO/5WTFS+f+an52drbvuustJFVfOpEmTHMsy4uPj9corr5Q5NiUlRdOmTavwnpV93qKiIt11113Kz8+v8J6hoaGOECc5Odlpgcudd97puO+WLVsMsyYulJqaqscff9xxPXHixEqdNuRqQkNDHUcNS9Jjjz1W7r457733nuPELavVWuL3aEZGRqV+DSXjErSIiAhDX2WP/S5+D6vVajg6uyY8/fTTjt8ziYmJhr1cqsrDw8NxLPPGjRu1YsWKMo+Or8j69ev1z3/+s9J7L0nnZuoUP268vGPMAQCuh7AFAOD2WrRoYTg+tfiX8okTJ8rb27vM9xb/1/xZs2bp9ddfL7F0Iy4uTiNGjNCWLVsqfUKMM4SEhBgChGnTpumVV14pUd+BAwd05ZVXKjExsdxnlaSrr77aEUwtW7ZMjz76qHJycgxjTpw4oXHjxmnx4sWVel4fHx+1bt1a0rnZDAsWLKjM41WoVatWuvvuux3X9913n95///0SpyKd//U5v9FxcHBwpYInVzVt2jTHRrmxsbEaOXKkDh06ZBhjs9n09ttvG/ZFuffee0scSbx582Y1b95czz33nPbs2VPq5xUVFWnu3LmOY52lc0vviuvXr58mTZqkJUuWlBnexMbGGmaRXXHFFRX+fnS2du3a6YYbbnBcv/LKK5UOm0oTExOjXr16qVevXoqJibno+5w9e1aPPfaYmjdvrocfflhbtmwpc6bW6dOn9Ze//MXwe7h79+6ELQDgZjzNLgAAAGeYMmVKqfuLVHRM64gRIzR48GCtWLFCdrtdjz76qN5//3316NFDISEhOnDggNasWaOioiI1adJEDz74oCEAqW5PPvmkfvnlF61evVp2u11PPPGE3n77bQ0ZMkSBgYGKi4vTypUrVVRUpL59+6pVq1b6/PPPy7xfu3btdMsttzj2tHn99df1+eefq3fv3oqIiNCRI0e0YsUK5efnKygoSK+99pr+9Kc/VVjnuHHj9NJLL0k6t1npzJkzFRMTY9jk9p///GeVn/+f//ynNm3apI0bN6qwsFD33XefXn75ZQ0cOFCBgYE6ePCgVqxY4QigPD099fHHH5cIHdxJq1atNH36dN10000qKirS2rVr1bZtWw0aNEitWrVSZmamVq5cqePHjzvec9lll+nVV18t9X5JSUl6/vnn9fzzz6tRo0bq1q2bGjVqJE9PT508eVKbN2827OUzaNAgw3Ic6VyI9sUXX+iLL76Qn5+funTpopYtWyo4OFhnz57VoUOHtGnTJsd4Pz+/i/r1doZnnnlG8+bNk81mU3x8vGbOnFnjs9LKkpycrDfffFNvvvmmQkJC1LNnT0VGRiooKEiZmZk6cOCANm/e7DhmWpIaNmyozz77zLAEsCzPPvtslTbwHTZsmMaNG3dRzwIAqIAdAIBaID093e7v72+X5PjRvn37Sr33xIkT9h49ehjee+GPDh062Hfv3m2fMWOGo23KlCml3m/p0qWOMUOGDCnzc4vfvzxpaWn2UaNGlVtf//797YmJifYpU6Y42mbMmFHq/bKysuwjRowo935RUVH2VatWVfpZUlNT7e3atSv3nsUdPnzY0d6sWbNynz8jI8N+ww03lHtvSfbIyEj7Dz/8UO69nn32Wcf4Z599ttyxdnvlfy0rqzK/PuctWrTI3rBhwwqfe+LEifasrKxS77Fu3Tq7p6dnhfc4/+P666+3p6enl7hPp06dKn2PFi1a2FevXn3JP1fF/79W0e+RC40fP95QT0FBgaG/+O8/SfacnJyLrjMnJ8dwr8OHD5cYs2/fPvuQIUPsHh4elf55lGQfPXq0/dChQ2V+9oXPUdUfDz744EU/NwCgfMxsAQDUCkFBQbruuuv02WefOdoqmtVyXsOGDbVmzRpNnz5dX375pXbt2qXs7GxFRESobdu2mjBhgm666Sb5+/trw4YN1fUIZQoODtaSJUv0zTffaObMmdq4caPOnDmjsLAwtW/fXjfddJNuvvlmwyyS8vj7+2vJkiX6/PPPNWvWLG3dulXp6ekKCwtTy5YtNW7cOE2dOlX16tXTsmXLKnXPkJAQbdy4UR988IEWL16svXv3KjU11Sn7twQGBmru3Ll66KGHNGfOHC1btkyJiYnKyclRWFiYOnXqpD/84Q+67bbbanSZV3X7wx/+oLi4OH3yySf6/vvvtXv3bp0+fVp+fn5q3Lixhg0bpsmTJ6tv375l3qNv3746deqUfv31V61atUpbt27VwYMHlZKSoqKiIgUHB6tVq1a67LLLdPPNN6tPnz6l3mfbtm1at26dli5dqg0bNmj//v1KTExUdna2/P39HTNmrrnmGt1www2mn5zzzDPP6Ouvv5bdbtfhw4c1Z84c3XrrrabV07ZtWy1btkynT5/WsmXLtGrVKu3cuVNxcXFKSUlRbm6u/P39Va9ePbVr1059+vTRDTfcUKkTwwAArslit1ewtT8AAAAAAAAqjQ1yAQAAAAAAnIiwBQAAAAAAwIkIWwAAAAAAAJyIsAUAAAAAAMCJCFsAAAAAAACciLAFAAAAAADAiQhbAAAAAAAAnIiwBQAAAAAAwIkIWwAAAAAAAJyIsAUAAAAAAMCJCFsAAAAAAACciLAFAAAAAADAiQhbAAAAAAAAnMjT7AJQutzcXO3cuVOSFB4eLk9PfqkAAAAAAHC2wsJCJScnS5I6d+4sX1/fS74n3+Bd1M6dO9WnTx+zywAAAAAAoM7YsGGDevfufcn3YRkRAAAAAACAEzGzxUWFh4c7Xm/YsEGRkZEmVgMAAAAAQO2UlJTkWFlS/Lv4pSBscVHF92iJjIxUVFSUidUAAAAAAFD7OWu/VJYRAQAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWFLJX366ae6++671atXL/n4+MhisWjmzJlmlwUAAAAAAFyMp9kFuIunn35aR48eVVhYmCIjI3X06FGzSwIAAAAAAC6ImS2VNH36dB05ckTJycn605/+ZHY5AAAAAADARTGzpZKGDx9udgkAAAAAAMANVPvMllOnTun777/XtGnTNHr0aIWFhclischisWjq1KlVutfRo0f1yCOPqF27dgoICFD9+vXVu3dvvfbaa8rOzq6eBwAAAAAAAKiCap/Z0rBhQ6fcZ9GiRbr55puVnp7uaMvOztamTZu0adMmTZ8+XYsXL1ZMTIxTPs+VvPHLfoWEpZldRqX5e3uocaifGof6KSrUT03q+cnfm0lUAAAAAIC6oUa/ATdt2lTt2rXTzz//XKX3bd26VRMmTFBOTo4CAwP15JNPatiwYcrJydGXX36p//znP4qNjdXVV1+tTZs2KSgoqJqewBzzNibIMzjX7DIuSai/l5qE+qnJ+RCm3u+vm9TzU4MAb1ksFrPLBAAAAADgklV72DJt2jT17t1bvXv3VsOGDXXkyBG1aNGiSvd48MEHlZOTI09PT/3888/q16+fo+/yyy9X69at9fjjjys2Nlavv/66nnvuuRL3eOSRR5SXl1elz2zdunWV6kTZUrMLlJpdoN2J6aX2+3haz4UxxUOYYsFMoxBfeXmwnzMAAAAAwPVVe9jy/PPPX9L7N2zYoJUrV0qSbr/9dkPQct4jjzyiGTNmaO/evXr77bf1t7/9TV5eXoYx//73v5WVlVXpz73++usJW2pQXqFNh05n6dDp0n+NLBapYZCvMYypd26Z0vnXgT4sVQIAAAAAmM/lv50uWLDA8frWW28tdYzVatXkyZP15JNPKjU1VUuXLtWIESMMYzIzM6uzzGp1bffGCm7gnL1vqpvdfm4Wy/HUHB1PzdGZrHyn3fdEeq5OpOdq89GzpY4J8fNyzIiJquenxqG+ahLqf+5/6/kpLMBHVitLlQAAAAAA1cvlw5ZVq1ZJkgICAtSzZ88yxw0ZMsTxevXq1SXCFnf25Oj2ioqKMruMi5KTX6TjqTlK/F/4cvzsudcJ/3t9Ij1XRTa7Uz4rLadAaTkF2ptU+lIlb0+rGof4lliqdP46MsRP3p4sVQIAAAAAXBqXD1v27t0rSYqJiZGnZ9nltmvXrsR7YD4/bw/FRAQqJiKw1P4im10n03MdgUzC2Zzfw5n/vc7OL3JKLfmFNh1JydaRlNKPCbdYpIggnxIhTPFlS8G+XqW+FwAAAACA81w6bMnNzdXp06clqcKZHfXq1VNAQICysrIUHx/v9FqmT5/umGWzc+dOR9uyZcskSQMHDtQdd9xR6fslJCSU25+UlHRxhboZD6vFcUx0aex2u9JyCpRw9oLZMWm/hzGnM523VOlkep5Opudp67HUUscE+Xo6Apgm9UrOjgkPZKkSAAAAANR1Lh22ZGRkOF4HBpY+M6K482FLdezPsmrVKs2aNcvQtnr1aq1evdpxXZWwJTo62mm11WYWi0Wh/t4K9fdWpyYhpY7JLShyBDG/z4jJ1fHUbB1PzVFSaq4KnbRUKSO3UPtOZGjfiYxS+709rIoM9VXjkN/DmNYRgRoYE6Z6Ad5OqQEAAAAA4NpcOmzJzc11vPb2rviLqo+PjyQpJyfH6bXMnDlTM2fOdPp9cel8vTzUMjxQLcPLXqqUnJH3v/Al939hTLYSHa9zlJlX6JRa8otsOpqSraMXLFWyWKSuUaEa2jZcQ9tGqHOTEHkwAwYAAAAAaiWXDlt8fX0dr/PzK14qkpeXJ0ny8yt9SYorqWipU1JSkvr06VND1dRuHlaLGoX4qlGIr3o2K9lvt9uVnlvo2Lz3ePEf/wtjkjPyLqkGu13aFp+qbfGpeuvXA6rn76XBbcI1pE24BrcJV1igzyXdHwAAAADgOlw6bAkKCnK8rszSoKysLEmVW3JkNnc9Xag2slgsCvHzUoiflzo0Di51TF5hkZJSc0uEMOfDmaTUXOUX2Sr9mWezC/TdtkR9ty1RktQlKkRD2oRraNtwdY0KlacHpyIBAAAAgLty6bDF19dXDRo0UEpKSoUbyp49e9YRtrAfCpzNx9NDzcMC1DwsoNR+m82u05l5SrjgJKUjKdnaePiMcgrKP1FpR0KadiSk6d3f4hTi56WBrcM09H8zXyKCfct9LwAAAADAtbh02CJJHTp00MqVKxUXF6fCwsIyj3/et2+f43X79u1rqjxAkmS1WhQR7KuIYF/1aFrP0JdbUKRNR85q2f5TWhabrLhT5c/SSssp0OIdSVq849yJVB0igzW07bngpUezevJi1gsAAAAAuDSXD1sGDhyolStXKisrS5s3b1bfvn1LHbd8+XLH6wEDBtRUeUCFfL08NLB1mAa2DtPTkhLOZmt5bLKW7U/WmrjTysovf9bLnqR07UlK1wfLDirIx1MDW4dpSJtwDWkbrsgQ19+fCAAAAADqGpcPW8aOHav/+7//kyTNmDGj1LDFZrNp9uzZkqTQ0FANGzasRmsEqiKqnr9u6ttMN/VtpvxCmzYdPaPlsclavj+5zCOlz8vIK9SSXSe0ZNcJSVK7RkGO4KVXs/ry9mTWCwAAAACYzeXDlj59+mjQoEFauXKlPv74Y02ZMkX9+vUzjHn99de1d+9eSdKDDz4oLy8vM0oFqszb06r+rcLUv1WYnhzdXklpOVrxv1kvqw6cVkYFR1LvO5GhfScy9O8VhxTg7aH+MWGOJUdR9fxr6CkAAAAAAMVZ7Ha7vTo/YNWqVYqLi3Ncnz59Wo899pikc8t97rjjDsP4qVOnlrjH1q1bNWDAAOXk5CgwMFBPPfWUhg0bppycHH355Zf66KOPJElt2rTRpk2bDKcYuauEhATHRr/x8fGcXlQHFRTZtPVYqpbtP6XlscnanZhepffHRASe22S3bbj6tKgvH0+PaqoUAAAAANxXdXz/rvawZerUqZo1a1alx5dVzqJFi3TzzTcrPb30L5xt2rTR4sWLFRMTc1F1uhrCFlzoVHruueVGsclaeeC00nIKKv1ePy8P9W/VQEPahmtomwg1bcCsFwAAAACQquf7t8svIzpvzJgx2rFjh95++20tXrxYCQkJ8vb2VkxMjMaPH6/77rtP/v58gUTtFRHsq/G9ojW+V7QKi2zanpCq5fuTtSw2WTsS0sp9b05Bkf6775T+u++UpN1qGRagwW3CNbRtuC5r2UC+Xsx6AQAAAABnqfaZLbg4zGxBVZzOzNPKA+f2elkRm6yz2ZWf9RIR5KOXx3XW5e0aVmOFAAAAAOCa6vTMFgBlCwv00XXdo3Rd9ygV2ezaeTzNsdfLtvhUlRepnsrI020zN2lKv2Z68qr2zHIBAAAAgEtE2ALUMh5Wi7pFh6pbdKgeGt5GZ7PyteLAub1eVsQm63Rmfqnvm7X2qNYdOqN3JnZX20buv8k0AAAAAJiFsAWo5eoFeOvabk10bbcmstns2p2YruWxp/TLnpPafsFeL/tPZmjMe6v01Oh2mtK/uSwWi0lVAwAAAID7sppdAICaY7Va1DkqRPdd3loL7h2gf4ztJF8v4x8D+YU2Pbdoj26buVGnM/NMqhQAAAAA3BdhC1BHWSwW3XxZM31//0C1jwwu0b90f7JGvbVSy/afMqE6AAAAAHBfhC1AHRcTEaQF9/bX7QNblOg7nZmnqTM26vlFu5VbUGRCdQAAAADgfghbAMjH00PP/KGDZt/WR2GBPiX6Z6w+orHvr1bsyQwTqgMAAAAA90LYAsBhcJtw/fTQIF3RLqJE374TGRrz7irNWXtE9vLOkgYAAACAOo7TiFxEx44dDdcFBQUmVYK6rkGgj6ZP6aU5647qxcV7lVdoc/TlFdr0zHe7tTw2Wa+M66IGpcyCAQAAAIC6jpktAEqwWCya3K+5Ft0/UO0aBZXo/3XvKY16e6VWHkg2oToAAAAAcG0WO+sBXFJCQoKio6MlSfHx8YqKijK5ItRVuQVFeuXHfZqx+kip/XcMbKHHRrWVj6dHzRYGAAAAAE5QHd+/mdkCoFy+Xh56dkxHzbi1t8ICvUv0T191WNe9v0Zxp9g8FwAAAAAkwhYAlTSsbYSWPDhYQ9uGl+jbk5SuP7y7Sp+tP8rmuQAAAADqPMIWAJUWHuSjGVN767kxHeTtafzjI7fApr99u0t3zdmsM1n5JlUIAAAAAOYjbAFQJRaLRVMHtNDC+waoTcPAEv2/7DmpUW+t0Oq40yZUBwAAAADmI2wBcFHaNQrWwvsGakq/ZiX6TmXk6eaP1+v/ftir/GJHRwMAAABAXUDYAuCi+Xp56PlrO+njKb1UP8C4ea7dLv17xSH98V+rdTA506QKAQAAAKDmEbYAuGRXtG+oHx8apMFtSm6eu+t4uv7wzip9ueEYm+cCAAAAqBMIWwA4RUSQr2ZO7a1n/tBB3h7GP1pyCor0xDc79edPtyg1m81zAQAAANRuhC0AnMZqtej2gS307b39FRNRcvPcH3ef0Ki3Vmp3YpoJ1QEAAABAzSBsAeB0HRuHaNF9A3XzZU1L9J1Iz9XUGRt1PDXHhMoAAAAAoPoRtgCoFn7eHvrH2M766JaequfvZehLzsjTbTM2KiO3wKTqAAAAAKD6ELYAqFYjOjbSjw8NVs9m9Qzt+09m6J7PtqigiKOhAQAAANQuhC0Aql3DYF99MqW3WoUHGNpXHjitZxfu5pQiAAAAALUKYQuAGhHi76UZU/uoQYC3of3z9cf0n5WHTKoKAAAAAJyPsAVAjWnawF//mdJLPp7GP3pe+mGfluxMMqkqAAAAAHAuwhYANapH03p644ZuJdofmrtNW4+drfmCAAAAAMDJCFsA1Liru0TqidHtDG15hTbdOXuT4s9km1QVAAAAADgHYQsAU9w9uKUm9ok2tJ3OzNdtMzcqLYcjoQEAAAC4L8IWAKawWCx64dpOGtQ6zNB+4FSm7vlsM0dCAwAAAHBbhC0ATOPlYdX7N/VQm4aBhvbVcSn627c7ORIaAAAAgFvyNLsAnNOxY0fDdUEByyhQNwT7eumTqb019v01Op2Z52iftylBzRoE6N5hMSZWBwAAAABVx8wWAKaLquevj6f0kq+X8Y+k137ar0XbE02qCgAAAAAuDjNbXMTu3bsN1wkJCYqOji5jNFD7dI0O1VsTuuvPn21W8dVDj3y1XY1DfdWzWX3zigMAAACAKmBmCwCXMapTI/3tqvaGtvxCm+6cvVlHU7JMqgoAAAAAqoawBYBLuX1gC91yWTND25msfN06c6NSs/NNqgoAAAAAKo+wBYBLsVgsenZMBw1tG25oP5ScpbvnbFZ+IUdCAwAAAHBthC0AXI6nh1XvTeqhdo2CDO3rD5/RE9/s4EhoAAAAAC6NsAWASwr08dSMW3urYbCPof2bLcf17m9xJlUFAAAAABUjbAHgsiJD/PTxlN7y9/YwtL/xS6wWbD1uUlUAAAAAUD7CFgAurVOTEL07sbusFmP741/v0IbDZ8wpCgAAAADKQdgCwOVd0b6hpv2hg6Etv8imu+Zs0qHkTJOqAgAAAIDSEbYAcAtTB7TQrQOaG9pSswt028yNOpPFkdAAAAAAXAdhCwC38fTVHTS8fYSh7UhKtu6avUm5BUUmVQUAAAAARoQtANyGh9Wit2/srk5Ngg3tm46e1eNfcyQ0AAAAANdA2ALArQT4eOrjKb0VGeJraF+4PVFv//eASVUBAAAAwO8IWwC4nYbBvvpkam8FXHAk9Fu/HtCPu5JMqgoAAAAAziFsAeCW2kcG6/2bepQ4Evrhedu170S6OUUBAAAAgAhbALixoW0j9PTVxiOhs/OLdMesTZxQBAAAAMA0hC0A3NqtA5prfM8oQ1vC2Rzd89lmFRTZTKoKAAAAQF1G2ALArVksFv3juk7q0TTU0L7u0Bm9sGiPOUUBAAAAqNMIWwC4PR9PD314S081CjaeUDRn3VF9vv6YSVUBAAAAqKsIWwDUChFBvvpock/5eBr/WJv23S5tOHzGpKoAAAAA1EWELQBqjS5RoXr1+i6GtkKbXX/+dLMSzmabVBUAAACAuoawBUCtcm23Jrp7SEtDW0pWvu6avVnZ+YUmVQUAAACgLiFsAVDrPD6ynYa1DTe07UlK12Nf7ZDdbjepKgAAAAB1BWELgFrHw2rR2xO7q1V4gKF98c4kvfdbnElVAQAAAKgrCFsA1ErBvl76z+ReCvL1NLS//kusft59wqSqAAAAANQFnhUPQU3o2LGj4bqgoMCkSoDao2V4oN6b1EO3ztggW7HVQ3+Zu03f3DNAbRsFmVccAAAAgFqLmS0AarUhbcL15Oj2hras/CLdOXuTzmblm1QVAAAAgNqMmS0uYvfu3YbrhIQERUdHm1QNULvcMaiF9ial65utxx1tx85k674vtmjWrX3k6UHuDAAAAMB5+IYBoNazWCx66Y+d1TU61NC+Oi5F/1i815yiAAAAANRahC0A6gRfLw99dEtPRQT5GNpnrjmiuRuPmVQVAAAAgNqIsAVAndEw2Ff/vqWnvD2Nf/Q9vWCXNh05Y1JVAAAAAGobwhYAdUr3pvX08h87G9oKiuz606eblZiaY1JVAAAAAGoTwhYAdc4fe0TpzkEtDG2nM/N115xNyskvMqkqAAAAALUFYQuAOumJ0e01uE24oW3X8XQ99vV2FdnsJlUFAAAAoDYgbAFQJ3lYLXr3xu5qERZgaP9+R5Im/mcdS4oAAAAAXDTCFgB1Voi/l/4zuZeCfDwN7RsOn9Got1Zoyc4kkyoDAAAA4M4IWwDUaTERgXpnUnd5Wi2G9vTcQv35sy168psdys4vNKk6AAAAAO6IsAVAnTesbYTm3n2ZmoT6lej7YkO8xry7SrsT00yoDAAAAIA7ImwBAEk9m9XXDw8O0piujUv0HUzO0nXvr9H0lYdkY/NcAAAAABUgbAGA/wnx89I7N3bTa9d3kb+3h6Evv8imfyzeq1tnblRyRp5JFQIAAABwB4QtAFCMxWLR+F7RWvzAIHWJCinRvzw2WaPfXqFl+0+ZUB0AAAAAd0DYAgClaBEWoK//1F93D2lZou90Zr6mztioFxbtUV5hkQnVAQAAAHBlhC0AUAZvT6ueHN1en97eVxFBPiX6P1l9WGPfX6O4UxkmVAcAAADAVRG2AEAFBrYO05IHB2l4+4gSfXuT0vWHd1fp8/XHZLezeS4AAAAAwhYAqJQGgT76z+ReeuHajvL2NP7RmVtg01Pf7tSUGRv1464Tyi1gaREAAABQl3maXQAAuAuLxaLJ/Zqrb4sGuv+LLYo9mWnoXxGbrBWxyQry8dTITo10TdfG6t+qgTw9yLUBAACAuoSwBQCqqG2jIC28b6Be+mGvZq89WqI/I69QX29O0NebExQW6K2rO0fqmm6N1aNpPVksFhMqBgAAAFCTCFsA4CL4ennohWs7aXDrcD0+f4fOZOWXOu50Zr5mrT2qWWuPqkmon67p1ljXdG2sdo2CCF4AAACAWspiZ0dHl5SQkKDo6GhJUnx8vKKiokyuCEBZ0nMLtGh7ohZuS9SGI2dUmT9VW0cE6pqujfXHnlFqEupX/UUCAAAAKFV1fP8mbHFRhC2Ae0pKy9H325O0cHuidh5Pq3C8t6dVL47tpPG9omugOgAAAAAXqo7v3ywjAgAnigzx052DW+rOwS11KDlTi7YnaeH24zqYnFXq+PxCmx77eoeOpmTr4SvbyGplaREAAADg7ghbAKCatAwP1IPDW+uBK2K0JyldC7cnatG2RCWm5ZYY+97SOB1JydI/x3eVr5eHCdUCAAAAcBbCFgCoZhaLRR0bh6hj4xD9dWQ7bT52Vl9sOKZvthw3jPt+R5ISU3P0n8m91CDQx6RqAQAAAFwqq9kFAEBdYrVa1Lt5fb1xQze9eF0neVywbGjLsVSN/WC14k5lmFQhAAAAgEtF2AIAJrmpbzN9MrW3An2Mkwzjz+Toug/WaE3caZMqAwAAAHApCFsAwERD2oRr/p/7lzj+OSO3UJM/2aB5G+NNqgwAAADAxWLPFhfRsWNHw3VBQYFJlQCoaW0bBenbe/vrzlmbtD3h9+OiC212PT5/h46kZOnREW05qQgAAABwE8xsAQAXEBHkqy/v6qdRHRuV6Ptg2UHd/8VW5RYUmVAZAAAAgKpiZouL2L17t+E6ISFB0dHRJlUDwAx+3h764KYeeuXHffr3ikOGvsU7k3T8fycVhQdxUhEAAADgypjZAgAuxGq16Mmr2uv//ti5xElF2+JTdfP09cxwAQAAAFwcYQsAuKCJfZpq5q29FXTBSUX7T2Zo3iY2zQUAAABcGWELALioQa3DNf+ekicVfbD0oPIKmd0CAAAAuCrCFgBwYW0aBumNG7oa2k6k53IkNAAAAODCCFsAwMX1bdlA/Vo2MLS9z+wWAAAAwGURtgCAG3hweGvDNbNbAAAAANdF2AIAbuCylg10Wcv6hrYPljG7BQAAAHBFhC0A4CYevKKN4TopLVfzNiWYVA0AAACAshC2AICb6Neq5OyWfy2NY3YLAAAA4GIIWwDAjVw4uyUxLVdfMbsFAAAAcCmELQDgRvq1aqC+LS7Yu2VpnPILbSZVBAAAAOBChC0A4GYuPJkoMS1XX23mZCIAAADAVRC2AICb6deygfqUmN1ykNktAAAAgIsgbAEAN2OxWPTQFcbZLcdTc/T1ZvZuAQAAAFwBYQsAuKF+rRqoT3Pj7Jb32bsFAAAAcAmELQDghiwWS4m9W46n5mj+Fma3AAAAAGYjbAEAN9W/VQP1bl7P0MbsFgAAAMB8hC0A4KYsFosevKKNoS3hbI6+YXYLAAAAYCrCFgBwYwNiGqhXM+PslveWxqmgiNktAAAAgFkIWwDAjZW2dwuzWwAAAABzEbYAgJsbGBOmnhfMbnn3N2a3AAAAAGYhbAEAN3du75aSs1sWbks0qSIAAACgbiNsAYBaYFDrMPVoGmpoW7DtuDnFAAAAAHUcYQsA1AIWi0W3DWxhaFtzMEUpmXkmVQQAAADUXYQtAFBLXN4uQn5eHo7rIptdP+4+YWJFAAAAQN1E2AIAtYS/t6cubx9haFu8I8mkagAAAIC6i7AFAGqRMV0iDdfrDqUoOYOlRAAAAEBNImwBgFpkaNsI+Xv/vpTIZhdLiQAAAIAaRtgCALWIr5eHhrdvaGj7fjtHQAMAAAA1ibAFAGqZqy9YSrThyBmdSs81qRoAAACg7iFsAYBaZkibcAX6eDqu7XZpyS6WEgEAAAA1hbAFAGoZXy8PXdnBuJSIU4kAAACAmkPYAgC10NWdjUuJNh49oxNpLCUCAAAAaoJnxUNQEzp27Gi4LigoMKkSALXBoDZhCvLxVEZeoaRzS4l+2Jmk2wa2MLkyAAAAoPZjZgsA1EI+nh66suMFS4l2spQIAAAAqAnMbHERu3fvNlwnJCQoOjrapGoA1AZjujTWN1uOO643Hz2rxNQcNQ71M7EqAAAAoPZjZgsA1FIDYsIU7GvM1H9gdgsAAABQ7QhbAKCW8va0amTHRoa27zmVCAAAAKh2hC0AUItd3cV4KtG2+FTFn8k2qRoAAACgbiBsAYBabEBMmEL9vQxtS3YxuwUAAACoToQtAFCLeXlYNeqCpUSLWUoEAAAAVCvCFgCo5S5cSrQ9IY2lRAAAAEA1ImwBgFquX8sGqnfBUiI2ygUAAACqD2ELANRynh5WjepknN2yeGeiSdUAAAAAtR9hCwDUAWMuWEq063i6jpzOMqkaAAAAoHYjbAGAOqBPi/oKC/Q2tC3eyVIiAAAAoDoQtgBAHXBuKRGnEgEAAAA1gbAFAOqIqzs3NlzvSUrXoeRMk6oBAAAAai/CFgCoI/q0qK/wIB9DW22e3VJYZNO2+FStiE1WRm6B2eUAAACgDvE0uwAAQM3wsFp0VadGmrX2qKNt4fZE3Xd5jCwWi4mVOYfdbtfRlGytjDutVQeSteZgijJyCyVJzRr46/M7L1OTUD+TqwQAAEBdQNgCAHXI1V0aG8KWA6cyteVYqno2q2diVZcu/ky2Hpm3XRuOnCm1/2hKth74Yqu+vOsyeXkwqRMAAADVi79xAkAd0qtZPTVr4G9o+3LDMZOqcY4zWfm65eP1ZQYt520+elZv/BJbQ1UBAACgLiNsAYA6xGq1aELvaEPb9zuS3HZPk7zCIt09Z5OOpGRXavy/lh3U8tjkaq4KAAAAdR1hCwDUMdf3jJKH9fc9WnIKirRwe6KJFV0cu92ux7/eoY1Hzhra6wd4a2y3xvrn+K6aMbW3vDyM+9E8PHebTqXn1mSpAAAAqGMIWwCgjokI8tUV7SIMbV9uiDepmov31q8H9N02Y0gUGeKrJQ8O0ls3dtf1PaM0rF2Enhjd3jAmJStfD365TUU2e02WCwAAgDqEsAUA6qCJfZoarnceT9Ou42kmVVN1325N0Nv/PWBoC/D20CdTe6thsK+h/bYBzTW8fUND29pDKXr3N+P7AQAAAGchbAGAOmhwm3BFhhhDibkb3WN2y9qDKXr86x2GNqtFem9SD7WPDC4x3mKx6J/ju6jxBc/73m9xSkrLqdZaAQAAUDcRtgBAHeRhtWh8L+NGuQu2HVdOfpFJFVXOj7uSNHXGBhUUGZcAPX9NRw27YGlUcaH+3npnYnfDXjWFNrsWbnO/vWoAAADg+ghbAKCOuqFXlCzF9o7NyC3U4p1J5hVUDrvdrukrD+nPn21RXqHN0HfbgBa6pV/zCu/Rq3l9jevRxNDmjhsDAwAAwPURtgBAHRVVz1+DW4cb2r7ccMykaspWZLPr+UV79I/Fe2W/YE/bkR0b6m9Xty/9jaW4tpsxbNmdmK64U5nOKBMAAABwIGwBgDpsYh/jUqJNR88q7lSGSdWUlJNfpD99ulkz1xwp0TexT7Ten9TDsDSoIpe1bKDwIB9DG7NbAAAA4GyeZhcAADDP5e0aKizQW6cz8x1tX26I19N/6OD0z4o9maEPlx/UjoQ0eXlY5edlla+Xx/9+WOXlYVV2fpEycguUmVeojNxCncnKV0ZuYYl7PTayre4Z2koWS+WDFuncXjV/6BKpGauPONoWbU/UX4a3rvK9AAAAgLIQtgBAHebtadW4nlH69/JDjrb5WxL02Ki28vH0cMpn2Gx2zVp7RP+3ZJ/yL9hvpaq8Pax6bXyXEsuBquKaro0NYcvh01nadTxdnaNCLqk2AAAA4DyWEQFAHXdj76aG67PZBfplz0mn3PtUeq6mztyo5xftueSgJdjXU3Nu73NJQYskdYsOVdP6/oa277Ydv6R7AgAAAMURtgBAHdciLECXtaxvaPtyQ/wl3/en3Sc08q0VWhGbfMn36hAZrG/u6a++LRtc8r0sFouu6drY0Pb9jiTZbPYy3gEAAABUDcuIAAC6sXdTrTt0xnG9Ku60jqVkq2kD/3LeVbqsvEL9/fs9+nJj6YHN1P7N1TU6RLkFNuXkFym3sEi5BTblFRYpwNtTgT6eCvI9/8NLYYE+atMw0Kl7qlzTrbHeWxrnuD6RnqsNR87oMieEOQAAAABhCwBAozo1UshCL6XlFDja5m2K16Mj21bpPkdTsjR1xkYdPp1Voq9hsI9eH99NA1uHXXK9l6pNwyC1axSkfSd+P3npu22JhC0AAABwCpYRAQDk6+Wh67ob90L5anO8Cosqv8/KsZRs3fjRulKDltGdGunHBwe7RNBy3jXdjEuJluxKuuR9ZQAAAACJsAUA8D839ok2XJ9Mz9PS/ZXbbyX+TLYm/medktJyDe0B3h567fou+uCmHqoX4O20Wp1hTBdj2JKaXaBVcZe+vwwAAABA2AIAkCS1axSsbtGhhrYvNxyr8H3HU3M0afo6HU/NMbS3jwzWDw8O0vhe0U7db8VZouv7q0fTUEPbwm2J5hQDAACAWoWwBQDgMPGC2S1L95/Scwt3K+Fsdqnjk9JyNPGjdYo/UzJo+fyOvmrWIKDaanWGC08lWhabrCJOJQIAAMAlImwBADj8oUtjBXh7OK5tdmnmmiMa8toyPfTlVu1JTHf0nUzP1cSP1unYGWMQ065RkD67o6/LLRsqzZUdGxmuU7MLtC0+1ZxiAAAAUGsQtgAAHAJ8PDW+V3SJ9iKbXQu2Jeqqd1Zqyicb9NPuE5r40TodSTEGLa0jAvXpHX1V3w2CFklqEuqntg2DDG3L9p8yqRoAAADUFoQtAACDx0a21YRe0fKwlr7PyvLYZN09Z7MOXXDqUKvwAH1+52UKC/SpiTKdZmjbcMP1UsIWAAAAXCLCFgCAQYCPp165vouWPzZUtw5oLj8vjwrf0zIsQF/ceZnCg9wraJGkoW0jDNe7jqfrVEZuGaMBAACAihG2AABKFVXPX8+O6ag1T1yuvwxvU+bSoOYN/PX5nZcpIti3hit0jl7N6ynQx9PQtrySR14DAAAApSFsAQCUq16Atx4c3lqr/3q5Xri2o6Lq+Tn6WoSdWzrUKMQ9gxZJ8vKwalDrMEPbMsIWAAAAXALPiocAACD5eXtocr/mmtSnqdYfPqMzWfka0bGhfDwrXmbk6oa1jdCSXScc1ysOJKugyCYvD/5NAgAAAFVH2OIiOnbsaLguKCgwqRIAKJ+nh1UDYsIqHuhGhlywSW5GbqG2HD2rvi0bmFQRAAAA3Bn/ZAcAqPMaBvuqQ2SwoW0pS4kAAABwkZjZ4iJ2795tuE5ISFB0dLRJ1QBA3TOsXbj2JKU7rpftP6UnRrczsSIAAAC4K2a2AACgc/u2FLfvRIaS0nJMqgYAAADujLAFAABJ3aJDFeLnZWjjVCIAAABcDMIWAAB0buPfC4+AXrrvlEnVAAAAwJ0RtgAA8D8XLiVaFXdaeYVFJlUDAAAAd0XYAgDA/wxpGy6L5ffr7PwirTpw2ryCAAAA4JYIWwAA+J+wQB/1bFrP0LZ4Z5JJ1QAAAMBdEbYAAFDMVZ0jDde/7D7JUiIAAABUCWELAADFXBi2ZOQVspQIAAAAVULYAgBAMY1CfNWrGUuJAAAAcPEIWwAAuABLiQAAAHApCFsAALgAS4kAAABwKQhbAAC4AEuJAAAAcCkIWwAAKEWJpUR7WEoEAACAyiFsAQCgFCWWEuWylAgAAACVQ9gCAEApWEoEAACAi0XYAgBAGVhKBAAAgItB2AIAQBlKW0r0A7NbAAAAUAHCFgAAytAoxFd9WtQ3tP1r2UHZbHaTKgIAAIA7IGwBAKActw9sYbiOPZmp3/adMqkaAAAAuAPCFgAAynFl+4ZqHRFoaPtgWZzsdma3AAAAoHSELQAAlMNqtehPQ1oZ2rYcS9X6w2dMqggAAACujrAFAIAKXNOtsZqE+hnaPlh20KRqAAAA4OoIWwAAqICXh1V3DW5paFsRm6xdx9NMqggAAACujLAFAIBKuKFXtBoEeBva/sXsFgAAAJSCsAUAgErw8/bQbRecTPTDriQdTM40qSIAAAC4KsIWAAAq6ebLminQx9NxbbdL7/8WZ2JFAAAAcEWELQAAVFKIn5cm92tmaFuw7biOnM4yqSIAAAC4IsIWAACq4I5BLeXv7eG4ttml95YyuwUAAAC/I2wBAKAK6gd465YLZrd8u/W4jqYwuwUAAADnELYAAFBFdw1qKT+v32e3FNns+mApJxMBAADgHMIWAACqqEGgT4nZLfO3JCj+TLZJFQEAAMCVELYAAHAR7hzUUr5ev/9ntNBm1wfL2LsFAAAAhC0AAFyU8CAf3dTXOLvl680JSs7IM6kiAAAAuArCFgAALtLdg1vKx/P3/5QWFNn17dYEEysCAACAKyBsAQDgIkUE++rqzpGGtrkb42W3202qCAAAAK6AsAUAgEtwQ+9ow/XB5CxtOZZqTjEAAABwCYQtAABcgr4t6qtZA39D27yN8SZVAwAAAFdA2AIAwCWwWCy6oZdxdsv3OxKVlVdoUkUAAAAwG2ELAACXaFyPKFktv19n5Rdp8Y4k8woCAACAqQhbAAC4RI1CfDW0bYShbe4mlhIBAADUVYQtAAA4wYVLiTYfPau4U5kmVQMAAAAzEbYAAOAEV7SPUFigt6HtK2a3AAAA1EmELQAAOIGXh1XXdW9iaJu/JUEFRTaTKgIAAIBZCFsAAHCSCb2NS4lOZ+brt32nTKoGAAAAZiFsAQDASWIigtSjaaihbd5GlhIBAADUNYQtAAA40YWzW5buP6WT6bkmVQMAAAAzELYAAOBEV3dpLH9vD8e1zX5u7xYAAADUHYQtAAA4UaCPp/7QJdLQ9tWmBNntdpMqAgAAQE0jbAEAwMlu6GVcSnT4dJY2HD5jUjUAAACoaYQtAAA4Wc9m9dQyPMDQNncTG+UCAADUFYQtAAA4mcVi0YQLZrf8sDNJ6bkFJlUEAACAmkTYAgBANfhjjyh5Wi2O69wCm17/ab+JFQEAAKCmeJpdAAAAtVF4kI+u7NBQS3adcLTNWntUIzs1Uv9WYYaxx1Ky9e5vB7T+8BnlF9pUaLPJ18tDf+zeRA8NbyNrsdAGAAAAro+ZLQAAVJPHR7WTr5fxP7WPf71DWXmFjusfdibp6ndW6qvNCTp2Jlsn0nN1OjNfCWdz9M5vcfr3ikM1XTYAAAAuEWELAADVpEVYgB4f2c7QlnA2R9O+260fdyXpr1/v0D2fbVFGsfDlQq//vF/b41OruVIAAAA4E8uIXETHjh0N1wUFbKIIALXB1P7N9eOuE9pw5Pejn+dvSdD8LQmVen+hza4Hv9yq7x8YpEAf/rMNAADgDpjZAgBANbJaLXr1+i7y8/KocOx13Zto1m19NKVfM0P7kZRsPbdwd3WVCAAAACfjn8hcxO7dxr9EJyQkKDo6uozRAAB30jwsQH8d1VbPLdpTar+fl4deuLajru8ZJYvFov6tGmjH8TRtPZbqGPP15gSN7dZEA1uHlXoPAAAAuA5mtgAAUAMm92uu2wa0kI+nVZ5Wi5qE+qlP8/qa0q+ZFj8wUON7RctiOXfqkJeHVW9P6F5i2dCn646aUToAAACqiJktAADUAKvVomljOuhvV7eXJHlUcJxz0wb+enREG8NsmF/3ntTpzDyFBfpUa60AAAC4NMxsAQCgBnlYLRUGLef9sWeU4ejoQptd3245Xl2lAQAAwEkIWwAAcFHBvl66qlOkoW3epnjZ7XaTKgIAAEBlELYAAODCxvcybpZ+4FSmtsanmlMMAAAAKoWwBQAAF3ZZy/pq1sDf0DZvY7xJ1QAAAKAyCFsAAHBhFotFN1wwu2XR9kRl5xeaVBEAAAAqQtgCAICLG9cjSsX31M3KL9KPu06YVxAAAADKRdgCAICLaxTiq8Ftwg1ti7YnmlQNAAAAKkLYAgCAGxjbrYnheuWB0zqblW9SNQAAACgPYQsAAG5geIeG8vH8/T/bhTa7ftzNUiIAAABXRNgCAIAbCPTx1BXtIwxtLCUCAABwTYQtAAC4iTFdGhuu1x5K0an0XJOqAQAAQFkIWwAAcBPD2kUowNvDcW23S4t3JplYEQAAAEpD2AIAgJvw9fLQiI6NDG0sJQIAAHA9hC0AALiRMV0jDddbjqXqyOksk6oBAABAaQhbAABwIwNjwhXq72Vom7H6sEnVAAAAoDSELQAAuBFvT6vG94wytM3blKC07AKTKgIAAMCFCFsAAHAzUwe0kIfV4rjOKSjS5xuOmVgRAAAAiiNsAQDAzTQJ9dNVnY17t8xcc1j5hTaTKgIAAEBxnmYXAAAAqu72gS0MJxGdTM/TDzuTNLZ7kyrfKzu/UP9efkixJzPUJNRPbRoGaWjbcEUE+zqzZAAAgDqDsAUAADfULTpUvZvX08YjZx1t7/x2QCM6NpS/d+X/834yPVe3z9qoXcfTDe1+Xh767M6+6tG0ntNqBgAAqCtYRgQAgJu6Y1BLw/Wh5Cw99c1O2e32Sr1/b1K6rn1vdYmgRTq3D8zDc7cpJ7/IKbUCAADUJYQtAAC4qeHtG6pTk2BD24JtiZXaLPfI6SzdNH29TqTnlj0mJVtv/LL/kusEAACoawhbAABwUx5Wi96d2ENBPsZlQ88v3KMfdyWV+b7TmXmaMmODzmTll+jz9TL+1eDjVYe15djZEuMAAABQNsIWAADcWIuwAL02vouhLb/Ipj99ukVPL9ip3ALjMqDE1BzdOmOjjqZkG9p7NaunLc9cqe/vHyhvz9//emCzSy//sK/6HgAAAKAWImwBAMDNjeoUqdsHtijR/um6Yxr06lK9898DWncoRV9uOKbRb6/UzuNphnEdIoM187Y+qh/grZiIID00vLWhf8ORMzqUnFmtzwAAAFCbcBoRAAC1wBOj2yklM08LtiUa2pMz8vTGL7Flvq9JqJ9m3tpbgcWWIt0xsKWmrzxsWGb09eYEPT6qnfMLBwAAqIWY2QIAQC3g5WHVmxO66dVxXeTn5VGp9zQJ9dPs2/soItjX0O7tadV13ZsY2uZvSVCRrXKnHAEAANR1hC0AANQSFotFN/SO1qL7B6h/qwbljr26c6R+eHCQWoUHlto/vleU4fpkep5WHEh2Wq0AAAC1GcuIAACoZWIigvT5nZdp1/E0fbL6sFbEJiu/0KZgPy81CfXTxD5NdW23xrJYLGXeo12jYHWJCtGOhN/3d/lqU7yGtY2oiUcAAABwa4QtAADUUp2ahOiNG7pd9PvH94wyhC2/7jmljNwCBfl6OaE6AACA2otlRAAAoFTXdG0iL4/fZ7/kF9n0275TJlYEAADgHghbAABAqUL8vTQwJszQtmTnCZOqAQAAcB+ELQAAoEyjO0UarpfFnlJ2fqFJ1QAAALgHwhYAAFCmKzs0lIf196VEuQU2LdvPqUQAAADlIWwBAABlqhfgXeIY6R92JplUDQAAgHsgbAEAAOW6cCnRb/tOKSe/yKRqAAAAXB9hCwAAKNeIjg1VbCWRsvOL9Ovek+YVBAAA4OIIWwAAQLnCAn004IJTib7bdtykagAAAFwfYQsAAKjQtd2aGK6X7U/Wmax8k6oBAABwbYQtAACgQiM7NpSP5+9/bSi02bWYjXIBAABKRdgCAAAqFOTrpeEdGhravtvKUiIAAIDSELYAAIBKGXvBUqJNR8/qwMkMk6oBAABwXYQtAACgUoa0CVc9fy9D20crDplUDQAAgOsibAEAAJXi7WnVzZc1M7Qt2HZcJ9NzTaoIAADANRG2AACASpvSv7m8i22UW1Bk1yerD5tYEQAAgOshbAEAAJUWFuij8T2jDG2frTumU8xuAQAAcCBsAQAAVXLnoJayWH6/zswr1LMLd5tXEAAAgIshbAEAAFXSPCxA13U3nky0ZNcJ/bgryaSKAAAAXAthCwAAqLKnr+6g+gHehrYnvtmpvUnpJlUEAADgOghbAABAldUP8NazYzoY2lKzC3Tz9PXaFp/qaEtMzdF/VhzSte+vVtfnf9aIN5frsa+2K/ZkRg1XDAAAUHM8zS4AAAC4p2u6NtbiHUn6ec9JR1tKVr7Gvr9abRoGysvDqt2JxpkuaTkFij2ZqYXbE/XOxO4a2bFRTZcNAABQ7ZjZAgAALorFYtFbN3ZTnxb1S/TFnswsEbQUl1do058/3azvth2vzhIBAABMQdgCAAAumr+3pz6Z2lu9mtWr8nttdumJ+Tt1LCW7GioDAAAwD2ELAAC4JIE+nvrszr56bGRbBfuWXKEc5Oup8T2j9NJ1nTW0bbihL6egSH+dv0N2u72mygUAAKh27NkCAAAumY+nh+4dFqObL2umZftP6VR6nqxWi1qE+WtATJh8PD0kSRP7ROuJ+Ts1d1O8471rD6Vo7sZ43dinqVnlAwAAOBVhCwAAcJoQPy9d261Jmf0Wi0XPjOmgVXGndTw1x9H+6k/7NbpzpEL8vGqiTAAAgGrFMiIAAFCjAn089dIfOxvazmTl653/HjCpIgAAAOcibAEAADVuSJtwjejQ0NA2a80RxZ3KNKkiAAAA5yFsAQAApnj66g7y9vj9ryKFNrv+sXiPiRUBAAA4B2ELAAAwRdMG/rpjUAtD27L9yfpt30mTKgIAAHAOwhYAAGCae4bFKCLIx9D2zILdSssuMKkiAACAS0fYAgAATBPo46m/jmpnaDuemqPHvt4uu91uUlUAAACXhrAFAACY6rruTdSnRX1D2897Turv3+8lcAEAAG6JsAUAAJjKarXo7Ru7qZ6/l6H9k9WH9fC87UrLYUkRAABwL55mFwAAABAZ4qc3J3TTrTM3qvhklm+3Htey/af0hy6N1aZRkIJ9PeVptcrb06q2DYPUtIG/eUUDAACUgbAFAAC4hKFtI/TWhG56eN52Fdl+T1zOZhdozrqjpb6nb4v6enxUW/VsVr/UfgAAADOwjAgAALiMa7s10fuTuivA26NS49cfPqMJ/16nrzcnVHNlAAAAlUfYAgAAXMqoTpH6+eEhGt4+olLjC212PfrVds3bFF/NlQEAAFQOy4gAAIDLaRLqp+lTeuvw6Sx9vz1RuxPTdSI9V7kFRSoosul4ao5yC2yG9zz97S61jghU96b1TKoaAADgHMIWAADgslqEBej+K1qXaM8tKNKrP+7XJ6sPO9ryi2y657Mt+vHBwQq54GQjAACAmsQyIgAA4HZ8vTw0bUwH3T6whaE9KS1XT327U/biRxoBAADUMMIWAADgtp4c3U6XtTSeRLR4ZxIb5gIAAFMRtgAAALfl6WHVWxO6K/SCZUPPLtytI6ezTKoKAADUdYQtAADArTUK8dXLf+xiaMvOL9KdszcpLafApKoAAEBdRtgCAADc3qhOjXRj72hD24FTmbp95kadzco3qSoAAFBXEbYAAIBaYdqYDmrTMNDQtunoWY15b5W+2ZKgM1n5bJwLAABqBEc/u4iOHTsargsKmPYMAEBV+Ht76pOpvXXdB2uUnJHnaE84m6OH522XJHl7WhUe6KOYiED1b9VAE3pHK9Tf26ySAQBALcXMFgAAUGtE1fPX7Nv6qGGwT6n9+YU2HU/N0fLYZP3fkn0a+MpSzVl7hBkvAADAqSx2/nbhkhISEhQdfW7teXx8vKKiokyuCAAA93EiLVf3f7FFG4+crdT4G3tH66XrOstqtVRzZQAAwNVUx/dvZrYAAIBap1GIr+bd3U8f3txDg1qHycez/L/yfLkxXi98v4cZLgAAwCnYswUAANRKFotFozpFalSnSOUX2nQyPVenM/OUcDZHP+85qUXbEw3jZ645osgQX909pJVJFQMAgNqCsAUAANR63p5WRdf3V3R9f3VvWk9jujbW6E6N9MAXW1Vo+302y/8t2aewQB+N68nyXQAAcPFYRgQAAOqkqzpH6p/ju5Zof3z+Dv2464QJFQEAgNqCsAUAANRZY7s30ZOj2xnaimx2PfDFVi3df8qkqgAAgLsjbAEAAHXaXYNb6s5BLQxt+UU23TFrkz5cflCFRTaTKgMAAO6KsAUAANRpFotFT13VXhP7RBvai2x2vbxkn0a8tUJfbDim3IIikyoEAADuhrAFAADUeRaLRf8Y21ljuzUu0XcoOUtPfrNTA17+TW//ekCZeYUmVAgAANwJYQsAAIAkD6tFb9zQTQ9c0brU/pSsfL35a6yGvrZUv+07WcPVAQAAd0LYAgAA8D9Wq0UPX9lGX/2pn9pHBpc65nRmvm6buUkfLIur4eoAAIC7IGwBAAC4QO/m9fXDAwM167Y+GhDToNQxr/64X2/+ElvDlQEAAHfgaXYBAAAArshisWhIm3ANaROuvUnpennJPi2PTTaMefu/BxTs56XbB7Yo4y4AAKAuYmYLAABABdpHBmvmrb311FXtSvT9/fs9mrcp3oSqAACAqyJsAQAAqASLxaK7BrfSi9d1KtH3xPwdWrIzyYSqAACAKyJsAQAAqIKb+jbTX0cZZ7jY7NIDX27ViguWGQEAgLqJsAUAAKCK/jy0lf40pJWhraDIrrvnbNbagykmVQUAAFwFYQsAAMBF+OuotprUt6mhLaegSDdNX6c3f4lVYZHNpMoAAIDZCFsAAAAugsVi0d+v7aQxXRsb2m32c6cUXfXOSq08wLIiAADqIsIWAACAi+RhteiNG7pqePuIEn2xJzN1y8cb9OhX25WdX2hCdQAAwCyELQAAAJfAy8Oqf9/SS4+OaCMPq6VE/9ebEzTpP+uVmp1vQnUAAMAMhC0AAACXyMNq0X2Xt9b8P/dXx8bBJfq3xadqyoyNyspjhgsAAHUBYQsAAICTdIsO1cL7Buql6zor0MfT0Lc9PlV3zdmkvMIik6oDAAA1hbAFAADAiTysFk3q21QL7h2gRsG+hr7VcSl68IttnFQEAEAtR9gCAABQDWIiAvXpHX1VP8Db0P7j7hN68pudstnsJlUGAACqG2ELAABANYmJCNSsW/uUWFL01eYE3fPZFuXks6QIAIDaiLAFAACgGnWOCtH0Kb3k7Wn8a9ePu09owkdrdSo916TKAABAdSFsAQAAqGaXtWygDyb1kOcFR0PvSEjT2PdXa09iukmVAQCA6kDYAgAAUAOGd2io2bf1UbCvcUlRYlquxn+4Rr/tO2lSZQAAwNkIWwAAAGpI/5gwfXPPADWt729oz8ov0h2zNmn6ykOy29k4FwAAd0fYAgAAUINiIgK14N4B6tWsnqHdZpf+sXivXv1pP4ELAABujrAFAACghtUP8Nand/TVtd0al+j717KD+ufPBC4AALgzwhYAAAAT+Hp56K0J3fTIlW1K9L2/9KBe/zmWwAUAADdF2AIAAGASi8Wi+69orVev7yKL8aAivbc0Tm/+QuACAIA7ImwBAAAw2Q29ovXKH7uUaH/ntzi9xh4uAAC4HcIWAAAAF3BD72i9Mq5zifYPlh3U0wt2qchG4AIAgLsgbAEAAHARE3o31ct/LBm4fLb+mB6au035hTYTqgIAAFVF2AIAAOBCbuzTVK9e30XWC/ZwWbQ9UTd/vF4n0nLNKQwAAFQaYQsAAICLuaFXtN6f1ENeHsbEZcPhM7rqnZVauv+USZUBAIDKIGwBAABwQaM7R+qTqb3l5+VhaD+Tla9bZ2zUSz/sZVkRAAAuirAFAADARQ1qHa4v77pMTUL9SvR9tOKQrv9wjY6czjKhMgAAUB7CFgAAABfWNTpUix8YqBEdGpbo25GQpqvfWamF2xNNqAwAAJSFsAUAAMDFhfp769+39NRzYzrI28P417es/CI98MVWvfrjPtk4HhoAAJdA2AIAAOAGLBaLpg5ooW/u6a+WYQEl+j9YdlB3zN6kUxmcVgQAgNkIWwAAANxIpyYhWnT/QI3vGVWi77d9p3TlGyu0YOtx2e3McgEAwCyELQAAAG4mwMdTr43vqn+M7SRPq/F46LScAj00d5vunL1Zp9KZ5QIAgBkIWwAAANzUzZc10+zb+ygs0LtE3697T+qKN5brPysOKa+wyITqAACouwhbAAAA3Fj/VmH6+S9DNKZr4xJ9GbmFevGHvRrx5gr9uCuJpUUAANQQwhYAAAA3Vz/AW+9O7K4Pb+5R6iyXoynZ+tOnW3TjR+u06sBpFRbZTKgSAIC6w9PsAgAAAOAcozpFqm+LBvr793v0zdbjJfrXHz6j9R+vV1igt0Z1aqQ/dGms3s3ry+OCfV8AAMClsdiZT+qSEhISFB0dLUmKj49XVFTJEwcAAADKsvXYWf39+z3aciy13HHhQT66vG2ELmtVX/1ahqlRiG/NFAgAgIuoju/fhC0uirAFAABcKrvdru93JOnlJft0PDWnUu9pHRGoIF9PeXtaFRboo5iIQLVrFKwmoX5q3TBQvl4eTqktJTNPe5MyZLPblZyRp6X7TynuVKYSzuYop6BIDYN8VGCzy9vDqkGtw9S3ZX21CAtU5yYhzMQBADgVYUsdQtgCAACcJbegSJ+vP6ZvtiZo1/H0i76Pj6dVg9uEa0zXxoqu56d6/t5qFOJbIoDJyC3QruPpstvtCvX31smMXO0/kaF1h1J0NCVb6TkFSsnKv6gaGof46rKWDdQ5KkSDWocpLNBHof4l96kBAKCyCFvqEMIWAABQHY6cztLinUn6fkeS9iZdfPBynsUiNQ7xU6i/l2x2qbDIpoPJmbLV4N8wL2tZX2O6Ntbg1uGKru9fcx8MAKgVCFvqEMIWAABQ3Q4mZ2r5/mStPZSi9YdSlJ5baHZJl8RikXo3q6+h7cI1pktjRdXzk8XCkiMAQPkIW+oQwhYAAFCTCops2nosVUdTspRfZFNugU0JZ7O1OzFdCWeydSI91+mzVbw9rPL2tMrf20NdokI1tG24WoYFyM/bQ8kZefL0sGj9oTNaf/iMElNzdCojr0r3D/L11GUtG6hP8/pq3TBQdruUlV+oQa3DFeLn5dyHAQC4rer4/s3RzwAAAJCXh1V9WtRXnxb1S+1Pyy7QD7uS9MPOJB1KzlJyZp7yC21l3s/DapG/t4cycgsV5OOp1g0D1bZRkPq0qK/wQF+FBXkrJjxQnh7Wcuu6vF1DSec2+90an6otR89qeWyy1h5MUWEF6U9GbqF+2XNSv+w5WaLvzkEtNK5nlNo1Ci73HgAAXAxmtrgoZrYAAABXl5FboKMp2Yo/k62cgiKdX7HTMNhX3aPryc/bQ0U2u6wWOX05T25BkTJyC7X2UIp+2n1CK2KTlXERy6B6NaunIW3C1SU6VD2ahirIlxkvAFDXsIyoDiFsAQAAqLzcgiKtOnBai3eem32TV86sm7JYLVKbhkHq16qBBrcJ19A24ez5AgB1AGFLHULYAgAAcHFyC4p0KDlLn60/qp92n1B2fpGy84uqfJ+ezerp7Ru7qUkoG+0CQG1G2FKHELYAAAA4z+nMPB08lam3fj2gtYdSqvTeIW3C9c6N3RXizxIjAKiN2CAXAAAAuAhhgT4KC/TRF3c1UJHNrrScAv20+4T2JaVra3yqdiSklfne5bHJuuKN5bp7cEuN6dpYjUJ8a7ByAIA7YmaLi2JmCwAAQM05m5WvWWuPaO3BFK0/fKbcsZ2aBOuJUe01sHVYDVUHAKhO1fH9u/yz9gAAAIA6oF6Atx4a3kZz7+6nGbf2VqPgsmev7DqersmfrNeM1YfFv1sCAEpD2AIAAAAUM6xthNY9dYWWPzZU/Vs1KHWMzS49v2iPps7YqMTUnBquEADg6ghbAAAAgFI0axCgz++8TPP/3F9jujZWgLdHiTHLY5PV/+XfdNP0ddqTmG5ClQAAV0TYAgAAAJSjZ7N6endid217doTuGtyy1DGr41J01Tsr9Y/v9+hsVn4NVwgAcDWELQAAAEAleHlY9dRV7TXrtj6KCPIpdcz0VYd1+evLFHcqo4arAwC4EsIWAAAAoAqGtAnXjw8N1o29o0vtP5tdoOFvrNBn64+ygS4A1FGELQAAAEAV1Q/w1svjumj7syN0RbuIUsf87dtdmjpjo06l59ZwdQAAsxG2AAAAABcpxM9L/5ncS8+O6VBq//LYZA15bZkWbk+s4coAAGYibAEAAAAugdVq0a0DWui/jwxRi7CAEv05BUV64IuteuvXWBXZWFYEAHUBYQsAAADgBK3CA/XbI0P0l+FtZLWU7H/r1wPq+OyP+mLDsZovDgBQowhbAAAAACexWCx6cHhrfX//II3q2KhEf26BTU9+s1PL9p8yoToAQE0hbAEAAACcrEPjYP3r5h56YnS7Uvsf/HKblhK4AECtRdgCAAAAVAOLxaI/DWmldyZ2V6CPp6EvLadAt83cqDnrjppUHQCgOhG2AAAAANXomq6NtePZEeoaHWpot9ulZxbs0serDptTGACg2hC2AAAAANXMarVoxtTe6tWsXom+v3+/Rx+tOGhCVQCA6kLYAgAAANSA+gHemnd3P91/eUyJvpd+2Kf7Pt+i1Ox8EyoDADgbYQsAAABQQ6xWix4Z0bbUjXO/35GkSf9Zr9yCIhMqAwA4E2ELAAAAUMP+NKSVHryidYn2PUnpunP2Jma4AICbI2wBAAAATPDQ8NZ66qp28rBaDO0rD5zW1e+s0s6ENJMqAwBcKsIWAAAAwAQWi0V3DW6lBfcMkI+n8a/lx1NzNGn6OsWfyTapOgDApSBsAQAAAEzUOSpEM2/to7BAb0N7Rm6hpn23S3a73aTKAAAXi7AFAAAAMFm/Vg20+IFB6t3ceDT00v3J+n5HkklVAQAuFmELAAAA4AIaBvvq46m9FR7kY2if9t0unUrPNakqAMDFIGwBAAAAXESwr5eeG9PR0HY2u0DPL9pjUkUAgItB2AIAAAC4kKs6N9JVnRsZ2hbvTNLagykmVQQAqCrCFgAAAMCFWCwWvTi2s+r5exnan1+0W4VFNpOqAgBUBWELAAAA4GLqBXjr4RFtDW37TmTo4XnbVWTjdCIAcHWELQAAAIALmtg7Wu0aBRnaFm5P1Oy1R8wpCABQaYQtAAAAgAvy9LDqpT92lpeHxdD+wbKDyswrNKkqAEBlELYAAAAALqpH03r65/iuhrbkjDzdMWsj+7cAgAsjbAEAAABc2LXdmqhfywaGtnWHzujfKw6ZVBEAoCKELQAAAICL+8d1nRR6welEb/0aq8Ons0yqCABQHsIWAAAAwMW1Cg/Ux1N6yVps+5aCIrs+XXfUvKIAAGUibAEAAADcQM9m9TWlf3ND27xN8UrNzjenIABAmQhbAAAAADcxuV9zw3VGbqH+/OkWFdns5hQEACgVYQsAAADgJlqEBWho23BD29pDKfpy4zGTKgIAlIawBQAAAHAjL17XWf7eHoa2lxbv5ShoAHAhhC0AAACAG2kS6qenrmpvaMvKL9IjX203qSIAwIUIWwAAAAA3M6F3tOoHeBvavtuWqDUHT5tUEQCgOMIWAAAAwM14eVj15Oh2Jdpf+XE/y4kAwAUQtgAAAABuaHyvaD02sq2hbXt8qv46f6fsdk4nAgAzEbYAAAAAbmpC72gFXLBZ7vwtCfp03VGTKgIASIQtAAAAgNsKC/TRa+O7ytvD+Nf6Z77breZPLNbiHUkmVQYAdRthCwAAAODGruocqTcndCu1797Pt+iPH6xWVl5hzRYFAHUcYQsAAADg5q7uEqmbL2taat+WY6nq+OxPijuVUcNVAUDdRdgCAAAA1AIvXNNJw9qGl9k//I0VOnCSwAUAagJhCwAAAFALWK0W/evmnhrePqLMMVe+uUIbDp+pwaoAoG4ibAEAAABqCV8vD02f0lsb/naF2jUKKnXMDf9eq8/Wc1oRAFQnwhYAAACglokI8tUPDwzSmK6NS+3/27e79M2WhBquCgDqDsIWAAAAoBayWi16d2J3Lbh3QKn9j329Q6vjTtdwVQBQNxC2AAAAALVYt+hQbZ82QkMv2Dy3yGbXPZ9t0ZHTWSZVBgC1F2ELAAAAUMuF+HtpxtTeum1AC0N7Wk6Bhv5zmVIy80yqDABqJ8IWAAAAoA6wWCx6+ur2GtmxYYm+kW+tVFp2gQlVAUDtRNgCAAAA1BFWq0Vv3NBNbRsaTyo6nZmnF77fI7vdblJlAFC7ELYAAAAAdUiAj6deHtdZFouxff6WBPV+8b86mZ5rTmEAUIsQtgAAAAB1TPem9fT2jd1LtJ/OzNP1H65hhgsAXCLCFgAAAKAOuqZrY706rkuJ9vgzObrl4w0ELgBwCQhbAAAAgDrqht7RemJ0uxLtq+JO65nvdhG4AMBFImwBAAAA6rA/DWml0Z0alWj/dN0x9X3pvyqyEbgAQFURtgAAAAB13PuTeujqLpEl2k9l5GkaM1wAoMoIWyrh+PHjeuuttzRixAg1bdpU3t7eatSokcaNG6f169ebXR4AAABwSaxWi96f1EMPDW9dou+z9cf07m9xJlQFAO6LsKUS3n33Xf3lL3/RoUOHNGLECD3yyCMaOHCgvvvuO/Xv319z5841u0QAAADgkj00vI0ubxdRov2NX2I1Y/VhEyoCAPdksTMnsELffPONGjRooCFDhhjaV65cqSuuuEKBgYFKSkqSj4+P0z4zISFB0dHRkqT4+HhFRUU57d4AAABAeZ5buFsz1xwp0f7P8V11fU/+XgqgdqmO79/MbKmEP/7xjyWCFkkaNGiQhg0bprNnz2rnzp0mVAYAAAA433PXdNTTV7cv0f7419v1464kEyoCAPdS7WHLqVOn9P3332vatGkaPXq0wsLCZLFYZLFYNHXq1Crd6+jRo3rkkUfUrl07BQQEqH79+urdu7dee+01ZWdnV88DVMDLy0uS5OnpacrnAwAAANXhjkEt9djItoY2m1164IttWnkg2aSqAMA9VHtC0LBhQ6fcZ9GiRbr55puVnp7uaMvOztamTZu0adMmTZ8+XYsXL1ZMTIxTPq8yjh07pl9//VWRkZHq3LlzjX0uAAAAUBPuGdpK6bkF+vfyQ462/CKb7pq9WZ/e0Uc9m9U3sToAcF01uoyoadOmGjFiRJXft3XrVk2YMEHp6ekKDAzUiy++qDVr1ui///2v7rzzTklSbGysrr76amVkZDi77FIVFBTolltuUV5enl555RV5eHjUyOcCAAAANcViseiJUe00sU9TQ3tOQZGmztio3YlpJlUGAK6t2me2TJs2Tb1791bv3r3VsGFDHTlyRC1atKjSPR588EHl5OTI09NTP//8s/r16+fou/zyy9W6dWs9/vjjio2N1euvv67nnnuuxD0eeeQR5eXlVekzW7cuefSdJNlsNk2dOlUrVqzQnXfeqVtuuaVKzwMAAAC4C4vFon+M7aTMvEIt2p7oaM/ILdTEj9bpx4cGq3Gon4kVAoDrqfHTiIqHLVOmTNHMmTPLHb9hwwb17dtXknT33Xfrww8/LDHGZrOpU6dO2rt3r0JDQ3Xq1CnHXirnBQYGKisrq9J1Ll26VEOHDi31s2677TbNmjVLN998s2bNmiWr1fkThDiNCAAAAK6koMimu+ds1m/7TpXo+/XhIYqJCDShKgC4dHXyNKIFCxY4Xt96662ljrFarZo8ebIkKTU1VUuXLi0xJjMzU3a7vdI/ygpabr31Vs2aNUsTJ07UzJkzqyVoAQAAAFyNl4dVH9zUQ31alNynZfgby3UmK9+EqgDANbl8UrBq1SpJUkBAgHr27FnmuOJHM69evdrpdZwPWmbPnq0JEyZozpw57NMCAACAOsXXy0P/uqmHmjfwL9HX4++/KCO3wISqAMD1uHzYsnfvXklSTExMuccrt2vXrsR7nOX80qHZs2dr/Pjx+vTTTwlaAAAAUCc1CPTR9Cm9S+37y9ztKrLV6C4FAOCSqn2D3EuRm5ur06dPS1KFa6bq1aungIAAZWVlKT4+3ql1vPDCC5o1a5YCAwPVpk0b/eMf/ygxZuzYserWrVul75mQkFBuf1JSUlXLBAAAAGpETESgPr+jryZNX29o/3XvST27cJf+fm0nWSwWk6oDAPO5dNhS/BjnwMCKN9w6H7ZkZmY6tY4jR45IOrfvy4svvljqmObNm1cpbDm/+Q4AAADgjvrHhJUauHy67pg2HTmrHx4YJKuVwAVA3eTSy4hyc3Mdr729vSsc7+PjI0nKyclxah0zZ86scEPdqVOnOvUzAQAAAFfXPyZMs27rowszlX0nMtR+2o/KL7SZUxgAmMylZ7b4+vo6XufnV7y7eV5eniTJz8+v2mpyloqWOiUlJalPnz41VA0AAABwcYa0Cdd7k3rovs+3qPh2LXmFNrV5eonuGxaj4R0aqlt0qGk1AkBNc+mwJSgoyPG6MkuDsrKyJFVuyZHZnHFuNwAAAOAKruocqSdHt9eLP5Q8qOK9pXH694qDWnDvAHVsHGJCdQBQ81x6GZGvr68aNGggqeINZc+ePesIW9gPBQAAAKhZdwxqoas7R5baV1Bk1x2zNtVwRQBgHpcOWySpQ4cOkqS4uDgVFhaWOW7fvn2O1+3bt6/2ugAAAAD8zmKx6L1J3XVj79L/4TMpLVf7TqTXcFUAYA6XD1sGDhwo6dwSoc2bN5c5bvny5Y7XAwYMqPa6AAAAABhZLBa9PK6LbhvQotT+UW+tlK34xi4AUEu5fNgyduxYx+sZM2aUOsZms2n27NmSpNDQUA0bNqwmSgMAAABQimljOuiTqb1K7Xtu0e4argYAap7Lhy19+vTRoEGDJEkff/yx1q5dW2LM66+/rr17z23G9eCDD8rLy6tGawQAAABgdHm7hrqpb9MS7bPXHtXstUdqviAAqEHVfhrRqlWrFBcX57g+ffq043VcXJxmzpxpGD916tQS93j77bc1YMAA5eTkaMSIEXrqqac0bNgw5eTk6Msvv9RHH30kSWrTpo0eeeSRankOAAAAAFXz4nWdtf9EhjYdPWtof3bhboX4eenabk1MqgwAqpfFbrdX66LJqVOnatasWZUeX1Y5ixYt0s0336z09NI31WrTpo0WL16smJiYi6rT1SQkJDhOVYqPj+eoaAAAALit137ap/eXHizR/sq4zprQu+TsFwCoSdXx/dvllxGdN2bMGO3YsUN/+ctf1KZNG/n7+ys0NFS9evXSK6+8oq1bt9aaoAUAAACoTR4b2U53D25Zov2v83dq5urDJlQEANWr2me24OIwswUAAAC1SZHNrns+26yfdp8s0ff8NR01pX/zmi8KAFTHZ7YAAAAAcF8eVov+dVNPjetR8kvMswt364EvtppQFQBUD8IWAAAAADXCarXoteu7aHSnRiX6Fm5P1Feb4k2oCgCcj7AFAAAAQI2xWi1668ZupfY99vUO/WfFoZotCACqAWELAAAAgBrl4+mhuBdHq23DoBJ9L/6wV9O+22VCVQDgPIQtAAAAAGqcp4dV3z8wUB0bB5fom732qN757wETqgIA5yBsAQAAAGAKLw+rFtw7QGGB3iX63vglVvd+vsWEqgDg0hG2AAAAADCNl4dVq5+4vNQZLot3JOn9pXEmVAUAl4awBQAAAICpfDw9tPC+geoWHVqi781fYhV7MqPmiwKAS+BpdgE4p2PHjobrgoICkyoBAAAAap6H1aL5f+6vvi/9qtOZ+Y72QptdUz7ZoG/u6a/IED8TKwSAymNmCwAAAACX4GG1aPljw0q0J6XlavLHG5SWzT9IAnAPhC0uYvfu3YYfv/32m9klAQAAADUuwMdTe18YpWYN/A3tB05l6p7PNyu/0GZSZQBQeYQtAAAAAFyKn7eHFtwzQK3CAwztq+NS9B4b5gJwA4QtAAAAAFxOvQBvzb69rxoEGI+Ffue/BzRj9WGTqgKAyiFsAQAAAOCSmoT66d2J3WWxGNufX7RHczceM6coAKgEwhYAAAAALqt/TJjuHRpTov2v83fqaEqWCRUBQMUIWwAAAAC4tIevbKO+LeqXaB/y2jKlZOaZUBEAlI+wBQAAAIBLs1otmnlrn1L7xn6wWnmFRTVcEQCUj7AFAAAAgMvz8/bQlmeuVKCPp6E9/kyO2j79o3ILCFwAuA7CFgAAAABuoX6At76867JS+9o986PyC201XBEAlI6wBQAAAIDb6NQkRJ/f2bfUvjZPL5Hdbq/higCgJMIWAAAAAG6lf6swvXBtx1L7Xvlxfw1XAwAlEbYAAAAAcDuT+zXXw1e2KdH+4fKDevKbHSZUBAC/I2wBAAAA4JYeuKK1PKyWEu1fbIhX7xd/1efrj+mjFQeVll1gQnUA6jLCFgAAAABuK/Yfo9UhMrhEe3JGnp76dqde+mGfrv9wjWw29nIBUHMIWwAAAAC4LQ+rRT88OEjdm4aWOebAqUytPni65ooCUOcRtgAAAABwe2UdCX3ey0v21VAlAEDYAgAAAKAW8PH00JZnriyzf3diugqLbDVYEYC6jLAFAAAAQK1QP8BbG/82vMz+mL8tqcFqANRlhC0AAAAAao3wIB/FvTi6zP7mTyyuwWoA1FWELQAAAABqFU8Pq3Y+N6LM/ls+Xl+D1QCoiwhbAAAAANQ6Qb5e2vf3UaX2rTxwWn+Zu61mCwJQpxC2AAAAAKiVfL08dPClq0rt+3brcU37blcNVwSgrvA0uwCc07FjR8N1QUGBSZUAAAAAtYeH1aJDL12llk/9UKJv9tqj6tQ4RDf0jjahMgC1GTNbAAAAANRqVqtFsf8ofdPcx+fv0CerDtdwRQBqO2a2uIjdu3cbrhMSEhQdTcIOAAAAOIO3p1Xbp41Q1xd+LtH3wvd7FB7kozFdG5tQGYDaiJktAAAAAOqEEH8vbX56eKl993+xVftPZNRwRQBqK8IWAAAAAHVGg0AfbXjqilL7Rr61QkU2ew1XBKA2ImwBAAAAUKdEBPtqxtTepfa1euoH2QhcAFwiwhYAAAAAdc6wdhG6d1irUvv+On9HDVcDoLYhbAEAAABQJz02sp3Gdiu5Ke5XmxP03bbjJlQEoLYgbAEAAABQZ711Y3f9aUjJGS5Pf7tLyRl5JlQEoDYgbAEAAABQpz0xup36tqhvaMvIK9SEj9bKbmf/FgBVR9gCAAAAoM778q7L5O1p/Hp0KDlLw/65zJyCALg1whYAAAAAdZ7FYtGKx4YpyNfT0H4kJVs/7T5hUlUA3BVhCwAAAABIahTiqzdu6Fai/e45m7VgKxvmAqg8whYAAAAA+J8rOzRU64jAEu0Pzd2ms1n5JlQEwB0RtgAAAABAMT8+NFi+XiW/KnX/+y+y2dgwF0DFCFsAAAAAoBgPq0U/PTS41L4Br/xG4AKgQoQtAAAAAHCBZg0C9OyYDiXak9Jy1fKpHwhcAJSLsAUAAAAASnHrgBYa1yOq1L6WT/0gu53ABUDpCFsAAAAAoAyv39BVV3eJLLVvwkfrlFtQpB93ndCu42k1XBkAV+ZZ8RAAAAAAqLven9RDAd7bNW9TgqF9w+EzavfMj5Iki0V6ZVwX3dAr2owSAbgYZrYAAAAAQAVevb5ruf12u/TaT/trqBoAro6wBQAAAAAqIfYfo8vtT87Iq6FKALg6whYAAAAAqARvT6viXiw/cIk7lVlD1QBwZYQtAAAAAFBJnh5WfX5H3zL7h7+xvAarAfD/7d15dBRl2v7xq0NCAgQIq4BEAwKy70T2xSAikXHDAQVlU3lxeN0XYBxQFAjj/ptxGBUhoMOrjtsYARUQEAj7omEPS2JCQAhLICQk6aR/fzC0id2dtbqr0/39nMM53fU8VXU3zj1NrjxV5a0IWwAAAACgDHq3qK9H+jd3Ob7/xAUPVgPAGxG2AAAAAEAZTR/WRm+P6ux07La31yvXWuDZggB4FR797CXatWtX5H1eXp5JlQAAAAAojTs6X6v8Apue+vQnh7FWL6zQ7hm3KKx6VRMqA2A2VrYAAAAAQDnd3bWp7ou8zulY51krlZlj9XBFALwBK1u8xN69e4u8T01NVXh4uEnVAAAAACituXd3UE5evr7YddxhrP3M77T2mYGKqF/DhMoAmIWVLQAAAABQQW+M7KzGtUOcjg18ba1Sz2V5uCIAZiJsAQAAAAADrH9ukMuxvvPW6HJevgerAWAmwhYAAAAAMEBglQAlxUSraqDzH7Na/+VbXbjMgzAAf0DYAgAAAAAGOvTKbbo2rJrTsY4vfq9zl3I9XBEATyNsAQAAAACDbZx6s8uxLi+v1KmLlz1YDQBPI2wBAAAAADdIiol2ORY5e7WGvLnOg9UA8CTCFgAAAABwkwMvD3U5dujXTE2M3ebBagB4CmELAAAAALhJSFAV7XhhsMvx1QdO6ejpTA9WBMATCFsAAAAAwI3qhQbrp5lDXI7f/DqXEwG+hrAFAAAAANysdrUgHZ0zTKN6hDsdX55wwsMVAXAnwhYAAAAA8ICAAIti7umol+9s7zD26L92mlARAHchbAEAAAAAD3qg5/VOt89ets/DlQBwF8IWAAAAAPCwv9ze1mHb++uP6XxWrgnVADAaYQsAAAAAeNjYXs5Xt3SetVI2m00bEtM14z979MXOVNlsNg9XB6CiAs0uAAAAAAD8TWCVAG3782D1mL3KYazZtOX210s2Jcuab9MfXdxYF4B3YmULAAAAAJigQc1gvXxHuxLnvfvjEQ9UA8BIhC0AAAAAYJIHekWUOOfI6UvuLwSAoQhbAAAAAMBEe166tcQ5+QXctwWoTAhbAAAAAMBEocGB2jo9qtg5W46d8VA1AIxA2AIAAAAAJmtYK0Rv/LGTy/H739/iwWoAVBRhCwAAAAB4gbu7NtX80V1djg//2wYPVgOgIghbAAAAAMBL3Nahsebc1cHpWMLxDO1IPufhigCUB2ELAAAAAHiR+2+6To/0b+507M9fJni4GgDlQdgCAAAAAF5m+rA2mnpba4ftB05eVAFPJgK8HmELAAAAAHih/xlwg+7ucq3D9g2H002oBkBZELYAAAAAgJeaN6Kjw7YHF26VzcbqFsCbEbYAAAAAgJcKqhKg6I6NHbb/39YUE6oBUFqELQAAAADgxR7seb3DtuncKBfwaoFmF4Ar2rVrV+R9Xl6eSZUAAAAA8CY3Na/ndPvKfb/qlrbXeLgaAKXByhYAAAAA8HILx3V32Pbwku0mVAKgNFjZ4iX27t1b5H1qaqrCw8NNqgYAAACAN7m5tfMVLMfSL6lZ/RoergZASVjZAgAAAACVwKAbGzhue22t5wsBUCLCFgAAAACoBBaM7eF0+9Itv3i4EgAlIWwBAAAAgEqgSoBFo2+6zmH79C8TZLPZTKgIgCuELQAAAABQSbz4h3ZOt98wfbmHKwFQHMIWAAAAAKgkgqoE6PGolg7bC2zSukOnTagIgDOELQAAAABQiTx5Syun28cu3Kpca4GHqwHgDGELAAAAAFQyibNvc7q91QsruH8L4AUIWwAAAACgkgmqEqCZw9s6HWs2bbnSzmfb38cfTtfE2G2a8Z89ung5z1MlAn6NsAUAAAAAKqGxvSJcjvWO+UGSdPZSrh5cuFWrD5zSkk3JmrN8v4eqA/wbYQsAAAAAVEIBARYdfGWoy/Gpn/+sDzYclbXgt8uK/m9riidKA/weYQsAAAAAVFLBgVVcBi4fb0vRO2uOeLgiABJhCwAAAABUasGBVRQ7vofZZQAohLAFAAAAACq5gTc21PzRXc0uA8B/EbYAAAAAgA+4rUNjPTm4VYnzMnOsHqgG8G+ELQAAAADgIx4f3FLVgqoUO+fr3WkeqgbwX4QtAAAAAOBD9r/s+glFkjT9ywQPVQL4L8IWAAAAAPAxx+YOK3b87KVcD1UC+CfCFgAAAADwMRaLRUkx0S7Hu7680oPVAP6HsAUAAAAAfFRxgYvNZvNgJYB/IWwBAAAAAB/mKnB5e3WihysB/AdhCwAAAAD4uMTZtzlse2tVorYlnTWhGsD3EbYAAAAAgI8LquL8R797/7lJR09nergawPcRtgAAAACAH/jnmG5Ot9/8+joPVwL4PsIWAAAAAPADQ9s3cjkWMXUZN8wFDETYAgAAAAB+4uArQ12ONZu2XId+veh07HJevj7fkarv954klAFKgbAFAAAAAPxEcGAV/TRziMvxIW/+qPyComGKzWbTmAVb9PS/f9IjH+7QnOX73V0mUOkRtgAAAACAH6ldLUiLxvVwOX7D9OVF3u9KOa/tyefs799ff8xttQG+grAFAAAAAPzMoNYN9dd7Orocj5i6zL7CZf+JC54qC/AZhC0AAAAA4If+2CNcK5/s73L86gqXggLHe7Rw3xageIQtAAAAAOCnWl5TUxun3uxyPGLqMlmdhC2/v68LgKIIWwAAAADAj10bVk0rHu/ncvyluH0O2y5bC9xZElDpEbYAAAAAgJ9r07iWZg5vW+r5q/f/6sZqgMqPsAUAAAAAoPF9msliKd3c1ftPubcYoJIjbAEAAAAASJKOzY1Ws/o1Spz39U9pHqgGqLwCzS4AV7Rr167I+7y8PJMqAQAAAODP1jwzUEs2JWnGf/YWOy9i6jJtf2Gw6ocGe6gyoPJgZQsAAAAAoIgHe0Xow4mRJc7r/soqRUxdpouX+WUxUJjFxgPSvVJqaqrCw8MlSSkpKWratKnJFQEAAADwN7nWArV6YUWp5q59ZqAiXFyCdPR0prJy89WuSS1ZSntjGD8XfyRdX+w8rtaNamp8n2aqEsDfm7u44+dvLiMCAAAAADhVNTBAx+YO05Slu7Qs4USxcwe+tlafT+6tbtfXKbL9/R+Pavby/ZKkkd3DNW9ER7fV6yuOpV/S6AVbdHVpRH6BTZMG3FCuY+1Ny9DnO46reYMauj/yOgUQ2ngElxEBAAAAAFyyWCx6Z3RX7Zt1a4lz75kfrxe//u1eLzabTf9cd8T+/pPtKUr89aJb6vQlr353QIWvQZm74kC5jnPqwmXd9U68Fm48phe+2qN3fzxqUIUoCWELAAAAAKBE1asGKikmWn1a1Ct2Xmx8kv69PUWSVGCTzlzKLTKecDzDbTX6igMnjQmk/r7msHLzC+zv531bvtAGZUfYAgAAAAAotX891FO7Z9xS7JxnP/tZ3+45KWtBgcMYt2wpmVF/RXvTLhQ7np6Zo4ysPKWczeImxwbjni0AAAAAgDIJq15VSTHRsuYXqMWfnd9A938+2qEfnx3ksN1iWJTguwI8kEjFrDhQ5BKvujWqasHY7up6XZ1i9kJpsbIFAAAAAFAugVUCtHlalMvx/q+ucdjGypaSJZ7KdOvx085nFwlaJOnspVzNWbbfref1J4QtAAAAAIBya1Q7RD/NHFLq+WsOnHJjNf7jREa2Us5mlXm/jOw8/Wd3mtOx7cnnlGPNV8yKAxr13iYtjk+SrfCdelFqXEYEAAAAAKiQ2tWClBQTrYipy0qc+9XuNL01qosHqvJdsRuPadY3+1Rgk6YMaqFnbr1RBQU2xf2cpj9/uUcWi9Qjoq7O/u7mxJLUZdb3KigmP/nX5l/sq142Hz2rlg1D1btFfXd9FJ/FyhYAAAAAgCFWPz3A7BIqpVxrgY6czizVTWqt+QV6MW6fPTD5+5rDOncpV7O+2afHP96tzByrLl626ocDp3Qs/ZLD/sUFLZI065t9Rd7fv2CLIqYu06P/2qHLefml/kz+jrAFAAAAAGCIGxqEau0zAw051raks3pnzWHtTjlvyPG8VUZ2nu6ZH6+o19dp8BvrdNDFY58XbTwma36BLuU4Bh6Pf7JbsfFJbq1zecJJrd7/2yVgBQU2/d/WX/TG9weVeq7slzP5OsIWAAAAAIBhIurX0PrnHJ9CVBbxR9L1x3c36dXvDuqe+fE+Hbh8ui1FCcczJEm/XsjRq98dcDrvpbh9eilun9OxHw+ddlt9hT372U/212+sPKRpXyTo//1wWLf/bYOyc1n1UhhhCwAAAADAUOF1q+vJwa1cjl/KsRa7/9TPE3T1vqz5BTa9+PVeI8vzKm+sPFTk/ar9rm8g/OHmZA14zfEJT56SlZuvXb+ck3Tl8qWrzmfl6eNtv5hVllcibAEAAAAAGO7xwS1djrWb+V2x+/7yu6fs+PLKlrI6n1XyfV3c6ZEPdyjfyY1fXF3+5K8IWwAAAAAAbnFs7jCXY768WsWXnb6Yo5X7fnXYzhOiiyJsAQAAAAC4hcViUVJMtNOx2Pgkfbo9xcMVGWfP8QyNXrBZD3ywRftPXDC7HI/6n492OGzbmnTWhEq8F2ELAAAAAMCtPn6kp9Ptz332s9Z56OauRrLZbJr8rx3aePiM1iem609Ld8pms+nspVydvZRrdnmmOJZ+STv/ez+XXGuB00uN/AlhCwAAAADArXo2r+dybOzCrTp14bIHq6m4w6cylXI22/7+6OlLmrN8v3rMXqUes1dp4YZjJlZnnulfJOj5z35WqxdWaMCra/xuxU9hhC0AAAAAALfb+ucol2ORc1br6OlMD1ZTMTnWAodt768/pvwCm/ILbJr1zT5dziv+Ucg51nzN+/aAskuYV5kcOHlRn/z30rDUc9l6a9WhEvbwXYQtAAAAAAC3a1gzRD/NGOJy/ObX12nswq0erKj8SnOJTNKZS8WOf7gpWfPXHjGqJK/03V7HG+n6C8IWAAAAAIBH1K4epJnD27ocX3fotCKmLnM6duriZdlcPPLGZrPpu70n9e/tKSWuKDHCyVJc9lTS03leWbbfoGrgjQhbAAAAAAAeM75PMw3r0KjM+0XOXq0pS3c5HZv04Q5N+nCHnv3sZ7X+y7cuQxmjWEoxp4BnIfs1whYAAAAAgEe9c39XDWl7TZn3W5ZwQkec3Nvl+31FL1dZc/BUuWsrDYul5LiloODKU3mcBT8HT150R1nwIoQtAAAAAACPslgseu/B7rqry7Vl3vcvX+0pcc5LcfvKU1aplWblzPC/b1CrF1Zo8kc7i1zalJ6Zoz/8fYM7y4MXCDS7AAAAAACAf3pzZGf1aVFfz/z7p1LvE3/kTIlzsnId79uSkZ2nKUt3asPhdPVtUV9/v6+ralcPKlO90pWwZFfK+VLP/3bvSf1w4JQa1Q7RzuRzWnfotNOnGcG3ELYAAAAAAEwzoltT9bqhnvrE/ODW83y167jWJ6ZLktYnpuuLXaka36dZmY6xNy1DYxZs0bmsvDLt9+i/dpZpPio/LiMCAAAAAJjq2rBqSoqJ1lsjO5dqfsTUZXrx670uxxvXDnHYNvN388tzqdHc5QfKHLTAPxG2AAAAAAC8wp1drtXyx/qVam5sfJLuf3+zsp1cMlS7WtkvDyqNDYfT3XJc+B7CFgAAAACA12jbpJaOzhlWqrnxR84oLSPbYTtPXXY0eeAN+kOnJmaX4Te4ZwsAAAAAwKsEBFiUFBOtiKnLSpwb9fo6h20nCgUwudYCWQtKf0PaggKbfkw8rfTMXNWtEaT2TWqrYS3Hy5K8wage4fp4W4r9/SP9m+u9H4/a38fc3UGjIq8rss/M4W3V7ZVVHqvRXxG2AAAAAAC8UmkDl987cvqSNh05o+UJJ/Th5mSX8258YYVyrAWacXtbTeh75Wa5z3z2k77YebzIvFVP9VeLhjXLXIe7LBzXXTe3vkaSFHNPxyJjD/a6XisSTqpFw1ANat3QYd96ocFKionW85/9rE+2pziMwxhcRgQAAAAA8FqvjuhY8iQn7nt/c7FBiyT7I5hnfbNPKWezlHY+2yFokaRhb28oVw3ucODlofagxZmmdarr4f7NnQYthc0b0VFJMdH6x+iuRpcIEbYAAAAAALzYvd3DtfrpAW4/z93z4/VSnPMnHOXmF2jNwVNur6Ek8VNvVkhQFUOPOaxDYz0e1dLQY4KwBQAAAADg5W5oEKqkmGi3nuP0xRx9t/dXl+PjF21z6/lL8uHESDUJq+aWYz/cv7muqRXslmP7K8IWAAAAAAC8XK/m9dx27NDgQMVPjdLM4W3ddg5/Q9gCAAAAAKgUjpTykdC+KLCKe398rxJg0fg+zdS6kffcCLgyI2wBAAAAAFQKVf77SOg3R3YyuxSPurdbU4+d69URnRQazIOLK4q/QQAAAABApXJXl6Z6KW6fzmflmV2KWzVvUEOv3NFevVvU99g5OzStrW+f6KdDv15Uh2vDFBIUoA4vfu+x8/sKwhYAAAAAQKWze8YQZWTnqdNLvhcEuPtmwCVpWqe6mtapbmoNlR2XEQEAAAAAKqXa1YK0dXqU2WUYpvv1dZQ4+zazy3AwaUBzs0uodFjZAgAAAACotBrWClFSTLTSM3PU/ZVVZpdTIZ9N7m12CU5NHdpafVvU16WcfA1u01A/H8/QhsR0vbHykNmleS1WtgAAAAAAKr36ocE6WomfVnRru2vMLsEli8Wifi0baGj7RgqsEqCu19XRY1EtzS7Lq7GyxUu0a9euyPu8PN++0RMAAAAAGC3gv08ripi6zOxSyqRZ/Rp6e1QXs8sos+eHtta8bw+4HP/L7W09WI13IWwBAAAAAPiUtc8M1MDX1ppdRqkcfGWoggOrmF1GuUzq31zpmTn6YMMxjeoRrjl3dVCBzaatx86qbmhVtW5Uy+wSTWOx2Ww2s4uAo9TUVIWHh0uSUlJS1LSp556rDgAAAAC+IiE1Q0dOZ+qJT3abXYqDLdOjdE2tELPL8Hvu+PmblS0AAAAAAJ/VoWltdWhaW4NubKjBb67T6Ys5Zpek+Kk3q1GtEAUEWMwuBW5C2AIAAAAA8Hm1q195THTMtwf07rqjbj/f9GGtlZWbr3G9IxRWvarbzwfvQtgCAAAAAPALFotF025ro2m3tZEkpWfm6NSFHLW6JlSBVQKUdj5bvWN+KNex/zmmqw79mqlDv17UiG5NNfDGhkaWjkqGsAUAAAAA4Jfqhwarfmiw/X2TsGpKiomWJD3x8S59tTutVMcZfdN1impzjYa2b+yWOlH5ELYAAAAAAPA7b43qordGddGJjGzNWX5AcT/9FrxsnHqzrg2rZmJ18HaELQAAAAAAuNC4djX97b4u+tt9XcwuBZVIgNkFAAAAAAAA+BLCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGCjS7ADhntVrtr0+cOGFiJQAAAAAA+K7CP3MX/lm8IghbvNTp06ftryMjI02sBAAAAAAA/3D69GlFRERU+DhcRgQAAAAAAGAgi81ms5ldBBxdvnxZCQkJkqQGDRooMND1IqSbb75ZkvTDDz+U+vhl3ac080+cOGFfhbN161Y1bty41PX4qvL8t/EkT9fnrvMZcdyKHsPdfUgPlg896JnzGXXcihyH70LvRR965nxmfxeWd1++C92PHvTM+fgu/E1l7EOr1Wq/uqRDhw4KCQmp8DG5jMhLhYSEqEePHqWaGxQUJElq2rRpqY9f1n3KOr9x48ZlqsdXlee/jSd5uj53nc+I41b0GO7uQ3qwfOhBz5zPqONW5Dh8F3ov+tAz5zP7u7C8+/Jd6H70oGfOx3ehc5WpD424dKgwLiMCAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADMQNcmGY1NRUhYeHS5JSUlIqzbV5gK+gBwHz0YeAuehBwHz04RWsbAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMxD1bAAAAAAAADMTKFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhb4FW2bdumYcOGKSwsTDVq1FDPnj316aefml0W4Bc++ugjTZo0Sd27d1dwcLAsFotiY2PNLgvwG8ePH9dbb72lIUOG6LrrrlPVqlXVqFEj3XPPPdqyZYvZ5QE+7/Lly3rqqafUv39/NWnSRCEhIWrUqJH69OmjRYsWKS8vz+wSAb8zb948WSwWWSwWbd682exyysRis9lsZhcBSNKaNWt06623KiQkRKNGjVLNmjX1+eefKzk5Wa+99pqefvpps0sEfFpERISSk5NVv3591ahRQ8nJyVq0aJHGjRtndmmAX5g6darmzZunG264QQMHDlSDBg2UmJior776SjabTUuXLtXIkSPNLhPwWenp6QoPD1dkZKRatWqlBg0a6Ny5c1qxYoWSk5M1ZMgQrVixQgEB/L4a8IQ9e/aoe/fuCgwM1KVLl7Rp0yb17NnT7LJKjbAFXsFqtap169ZKTU3V5s2b1blzZ0lSRkaGIiMjlZSUpEOHDun66683t1DAh61atUotW7bU9ddfr5iYGE2bNo2wBfCgL774QvXq1dOAAQOKbF+/fr2ioqIUGhqqEydOKDg42KQKAd9WUFAgq9WqqlWrFtlutVp1yy23aO3atfrmm28UHR1tUoWA/8jLy1PPnj0VFBSkli1b6qOPPqp0YQuxLLzCDz/8oCNHjuj++++3By2SVLt2bU2fPl25ublavHixeQUCfmDw4MEEmoCJ7r77boegRZL69eunQYMG6dy5c0pISDChMsA/BAQEOAQtkhQYGKi77rpLknT48GFPlwX4pdmzZ2vv3r1auHChqlSpYnY55ULYAp06dUrffPONZsyYodtuu03169e3XxdX1t9oJycn6+mnn1br1q1Vo0YN1a1bVz169NCrr76qrKwsl/utXbtWkjRkyBCHsVtvvVWStG7dujLVAlQW3tCDgL/z9j4MCgqSdOWHPsAXeXMPFhQU6Ntvv5UktW/fvsz7A5WBN/Xgzp07NXv2bM2cOVNt27Yt5ycyH9/Y0DXXXGPIceLi4jRmzBhduHDBvi0rK0vbt2/X9u3btWDBAi1btkwtWrRw2DcxMVGS1LJlS4exRo0aKTQ01D4H8DXe0IOAv/PmPvzll1+0atUqNW7cWB06dDCkTsDbeFMP5ubmas6cObLZbDpz5oxWr16tAwcOaPz48YqKijKkTsDbeEsP5uTk6MEHH1Tnzp313HPPGVKTWVjZgiKuu+46p6tLSrJr1y6NHDlSFy5cUGhoqGbPnq34+HitXr1aDz/8sCTp0KFDio6O1sWLFx32z8jIkHTlsiFnatWqZZ8D+DKzehDAb7ypD/Py8vTAAw8oJydH8+bNq7RLqYGyMLsHc3Nz9dJLL2nWrFl65513dPDgQT3zzDN67733yv2ZgMrEzB6cMWOGEhMTtWjRosr/nWeD35sxY4YtLi7OdvLkSZvNZrMdO3bMJskmyTZ27NhSHaNfv342SbbAwEBbfHy8w/hf//pX+zFnzpzpMH7LLbfYJNkSExOdHr9Jkya2WrVqlfozAZWJN/Tg782dO9cmybZo0aIyfBKg8vLGPszPz7fdf//9Nkm2hx9+uCwfB6h0vLUHU1JSbP/4xz9sYWFhtj59+tgyMjLK8rGASsMbejA+Pt4WEBBgmzVrVpHtY8eOtUmybdq0qcyfy0yELXBQ1sbasmWLff6kSZOczsnPz7e1adPGJskWFhZmy83NLTI+YsQImyTb9u3bne4fGhpqCw8PL/NnASojM3rw9whb4O/M7sP8/Hz7Py7HjBljy8/PL+9HASols3vw9z799FObJNtzzz1X6n2AyszTPZiXl2dr2bKlrXPnzg69WVnDFi4jQoV99dVX9tfjx493OicgIEAPPvigJOn8+fNas2ZNkfGr92pxdl+WkydPKjMz0+n9XAAY04MAKsbIPiwoKND48eO1ePFi3XfffYqNjVVAAP9kA4rj7u/Cq5dUXH2oA4CiKtqDmZmZSkxM1O7du1W1alX7zXktFov9qbS9evWSxWIpci5vxjc3KmzDhg2SpBo1aqhbt24u5xV+nOXGjRudjn3//fcO+3333XcO+wP4jRE9CKBijOrDq0HLkiVLNHLkSH344YeV/5p1wAPc/V2YlpYm6bcngwEoqqI9GBwcrIkTJzr9c/WX7n/4wx80ceJERUREuOdDGIynEaHC9u/fL0lq0aJFsY+kbN26tcM+V0VFRal58+ZaunSpHnvsMXXu3FnSlRvnzpkzR1WrVrWnoACKMqIHAVSMEX1YUFCgCRMmaMmSJbr33nv10UcfEbQApWRED+7bt08RERGqXr16ke1ZWVl66qmnJEnDhg0zqmTAp1S0B6tVq6YFCxY43WfcuHFKTEzUtGnT1LNnT4Mqdj/CFlTI5cuXlZ6eLklq2rRpsXPr1KmjGjVq6NKlS0pJSSkyFhgYqAULFujWW29V//79NWrUKNWsWVOff/65kpOT9dprr1WaBBPwJKN6UJIWLFhg/61EQkKCfdvVJdN9+/bVQw89ZGD1gG8wqg9nzZqlxYsXKzQ0VK1atdIrr7zisP+dd95p/4UEgCuM6sFPP/1Ub7zxhvr27auIiAjVqlVLx48f14oVK3TmzBn169dPTz75pNs+B1BZGfnvUV9C2IIKKfzIrtDQ0BLnX22szMxMh7FBgwZpw4YNmjlzpj755BPl5eWpQ4cOmjdvnkaOHGlo3YCvMLIHN2zYYL8m9qqNGzcWWeJJ2AI4MqoPk5KSJF25bn327NlO942IiCBsAX7HqB68/fbblZaWpvj4eG3atEmZmZmqXbu2OnbsqFGjRmnChAnF/sYe8FdG/nvUl/D/FqiQy5cv219XrVq1xPnBwcGSpOzsbKfjkZGRWrFihTHFAX7AyB6MjY1VbGysYbUB/sKoPqQHgfIxqge7d++u7t27G1sc4AeM/pnw9yrr9yM3yEWFhISE2F/n5uaWOD8nJ0fSlWvyAFQcPQiYjz4EzEUPAuaiB50jbEGF1KxZ0/66NMvALl26JKl0y8sAlIweBMxHHwLmogcBc9GDzhG2oEJCQkJUr149SVJqamqxc8+dO2dvrPDwcLfXBvgDehAwH30ImIseBMxFDzpH2IIKa9u2rSTp8OHDslqtLucdOHDA/rpNmzZurwvwF/QgYD76EDAXPQiYix50RNiCCuvbt6+kK8vBduzY4XLeunXr7K/79Onj9roAf0EPAuajDwFz0YOAuehBR4QtqLA777zT/nrRokVO5xQUFGjJkiWSpLCwMA0aNMgTpQF+gR4EzEcfAuaiBwFz0YOOCFtQYZGRkerXr58k6YMPPtCmTZsc5rz++uvav3+/JOnxxx9XUFCQR2sEfBk9CJiPPgTMRQ8C5qIHHVlsNpvN7CJgrg0bNujw4cP29+np6Xr22WclXVna9dBDDxWZP27cOIdj7Nq1S3369FF2drZCQ0M1ffp0DRo0SNnZ2fr444/13nvvSZJatWql7du3F7ljNeDv6EHAfPQhYC56EDAXPWg8whZo3LhxWrx4cannu/qfTFxcnMaMGaMLFy44HW/VqpWWLVumFi1alKtOwFfRg4D56EPAXPQgYC560HhcRgTDDB8+XD///LOefPJJtWrVStWrV1dYWJi6d++uefPmadeuXX7RVIBZ6EHAfPQhYC56EDAXPfgbVrYAAAAAAAAYiJUtAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIEIWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQIQtAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIEIWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQIQtAAAAAAAABiJsAQAA8GJJSUmyWCyyWCyKjY01uxwAAFAKhC0AAMArrV271h4ylPbPE088YXbZAAAAhC0AAAAAAABGCjS7AAAAgJJMnjxZjz76aInz6tev74FqAAAAikfYAgAAvF7Dhg3Vvn17s8sAAAAoFS4jAgAAAAAAMBBhCwAA8FkRERGyWCwaN26cJGnbtm267777FB4erpCQEIWHh2v8+PE6cOBAqY4XFxenESNGqGnTpgoODla9evXUq1cvxcTEKDMzs1TH2LNnj/73f/9XHTp0UJ06dRQUFKRGjRpp8ODB+utf/6oTJ06UeIyVK1dq+PDhatSokYKDg9WsWTNNnjxZqampxe6XlpamqVOnqmvXrqpdu7aCgoJ0zTXXqEOHDrrvvvsUGxurCxculOpzAAAA1yw2m81mdhEAAAC/t3btWg0aNEiSNHPmTL344otlPkZERISSk5M1duxY9e/fX5MmTZLVanWYFxwcrA8//FD33nuv0+NcvnxZ999/v7788kuX52rSpImWLVumzp07Ox3Pz8/Xs88+q7feekvF/fNr7NixRR7xnJSUpGbNmkmSFi1apIMHDyomJsbpvg0aNNC6devUpk0bh7H169fr9ttvLzFMiYuL0+23317sHAAAUDzu2QIAAHze7t27tXTpUjVs2FDTpk1TZGSkLl++rOXLl+utt95STk6ORo8erWbNmql79+4O+48dO9YetHTq1ElPP/202rRpo7Nnz+rjjz9WbGys0tLSFBUVpZ9//lnXXnutwzEeeeQRLVy4UJLUuHFjTZkyRb1791bt2rV1+vRpbd26VZ999lmxn+P9999XfHy8BgwYoEmTJqlVq1Y6f/68lixZoiVLluj06dOaMGGCNm3aVGS/nJwcjRo1ShcuXFDNmjU1efJkDRo0SA0bNlRubq6OHTum+Pj4YsMkAABQeqxsAQAAXqnwypbSPo3oxhtvVFBQkP391ZUtknT99ddr8+bNatSoUZF91qxZoyFDhshqtapHjx7aunVrkfFly5bZV3pERUVp+fLlqlq1apE577//vh555BFJ0h//+Ed98sknRca//vpr3XHHHZKkXr16afny5QoLC3P6GVJSUhQeHm5/X3hliyQ9/PDDevfdd2WxWIrs9/DDD2vBggWSpJ07d6pLly72sR9++EFRUVGSil+5YrValZWVpVq1ajkdBwAApUPYAgAAvFLhsKW0jh07poiICPv7wmHLZ599pnvuucfpfo8++qjmz58v6cp9XQqvbhk2bJhWrFihoKAgHTlypEgQUtgtt9yiVatWKTAwUL/88osaN25sH+vdu7c2bdqk6tWrKzExUU2aNCn1ZyoctjRu3FjHjh1TcHCww7yDBw+qdevWkqS3335bjz32mH1s6dKlGj16tCQpIyODMAUAADfjBrkAAMDn1alTx76yxJkJEybYX69atcr+2mq1at26dZKkIUOGuAxapCsrS67us3btWvv2M2fOaPPmzZKkkSNHlilo+b0RI0Y4DVqkK6t6QkNDJUlHjx4tMlY4+Fm0aFG5zw8AAEqHsAUAAHi9mTNnymazlfin8KqWwrp06aLAQNe3quvcubP90qCEhAT79qNHjyorK0uSdNNNNxVbY+HxPXv22F/v3r3bfkPcfv36Ff9BS3B15YorderUkSRdvHixyPa+ffuqefPmkqQnnnhCkZGRmjt3rjZu3Kjc3NwK1QQAABwRtgAAAJ/XsGHDYscDAwNVt25dSdLZs2ft2wu/LukYhe8FU3i/9PR0++vCK0zKo3r16sWOBwRc+addfn5+ke1BQUGKi4uzP6Vo27Ztmj59uvr27auwsDANHTpUS5cuddgPAACUD2ELAADweb+/maxZxzBT27ZtlZCQoC+//FITJkxQixYtJEnZ2dn67rvvNHr0aN100006deqUyZUCAFD5EbYAAACf9+uvvxY7brVa7atRrq5w+f3rko5x8uRJp/vVr1/f/vrEiROlK9hNqlSpojvvvFMffPCBEhMTlZaWpoULF6pbt26SpB07dmjSpEmm1ggAgC8gbAEAAD5v9+7dslqtLsd/+ukn+71L2rdvb9/evHlz+6U7W7ZsKfYchR8ZXfgYXbp0sa+K+fHHH8tevBs1btxY48eP16ZNm9S1a1dJ0jfffKPs7GyTKwMAoHIjbAEAAD7v7NmziouLczm+cOFC++vBgwfbXwcGBmrAgAGSpJUrVyo1NdXlMRYsWGDfZ+DAgfbtdevWVe/evSVJn376qdLS0sr1GdwpKCjI/jmtVqvOnz9vbkEAAFRyhC0AAMAvPPXUU04vBVq3bp3ee+89SVK3bt3Uo0ePIuN/+tOfJEm5ubmaOHGi8vLyHI6xcOFCff/995Kku+++2+FGuM8//7wkKSsrS/fee68yMjJc1llcoFNe69ev1+HDh12O5+bm2h9xHRoaqgYNGhheAwAA/sT1MxABAAC8xKlTp4o8TtmVatWq6YYbbnDY3qlTJ+3bt0/dunXTtGnTFBkZqZycHC1fvlxvvvmmrFarAgMD9c477zjsGx0drXvvvVf//ve/9f3336tnz5566qmn1Lp1a507d04ff/yxfWVM3bp19cYbbzgcY/jw4Zo4caI++OADxcfHq23btpoyZYr69OmjWrVqKT09Xdu3b9cnn3yiTp06KTY2tux/ScVYvXq1Xn75ZfXr10/R0dHq2LGjGjRooOzsbB06dEj//Oc/tXPnTknSxIkTi31MNgAAKBnfpAAAwOvNnz9f8+fPL3Fep06dtHv3boftnTt31pQpUzR58mRNmTLFYbxq1apavHixbrrpJqfHXbJkiaxWq7788kvt3LlTY8aMcZjTpEkTLVu2TNdee63TY7z77ruqVq2a3nnnHaWlpWn69OkuP4M7FBQUaN26dfYVLM7ccccdmjt3rlvODwCAPyFsAQAAfuGhhx5S+/bt9eabb2rDhg1KT09XgwYNFBUVpeeff15t27Z1uW9ISIi++OILxcXFKTY2Vps3b1Z6erpq1KihVq1a6c4779SUKVMUGhrq8hhVqlTR3/72N40fP17vvvuu1q5dq+PHjys3N1f16tVTx44dNXToUD3wwAOGf/ZnnnlGHTt21KpVq7Rr1y6lpaXZH/HcqFEjRUZG6sEHH1R0dLTh5wYAwB9ZbDabzewiAAAA3CEiIkLJyckaO3as4ZfmAAAAuMINcgEAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQDyNCAAAAAAAwECsbAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMRNgCAAAAAABgIMIWAAAAAAAAAxG2AAAAAAAAGIiwBQAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMRNgCAAAAAABgIMIWAAAAAAAAAxG2AAAAAAAAGIiwBQAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAM9P8BccfJLTxjtnMAAAAASUVORK5CYII=",
"text/plain": [
""
]
@@ -185,12 +87,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 4\n"
+ "Time step 4\n",
+ "RMSE 0.004599838015005501, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACXuElEQVR4nOzdd3hb5d3/8Y9kec8kTmwndvYehAAJIwl7QxlllbDpbumE0kUZ7a/PA20pu9A+UEbYBRr2JiGb7JA405l2vPe2Nc7vDyeKj7xkW/aRrPfrunxF59bR0ffYKbU+ue/vbTMMwxAAAAAAAAACwm51AQAAAAAAAAMJYQsAAAAAAEAAEbYAAAAAAAAEEGELAAAAAABAABG2AAAAAAAABBBhCwAAAAAAQAARtgAAAAAAAAQQYQsAAAAAAEAAEbYAAAAAAAAEEGELAAAAAABAABG2AAAAAAAABBBhCwAAAAAAQAARtgAAAAAAAAQQYQsAAAAAAEAAEbYAAAAAAAAEEGELAAAAAABAABG2AAAAAAAABBBhCwAAAAAAQAARtgAAAAAAAAQQYQsAAAG0ZMkS2Ww22Ww2nX766R2ed+Qcm80WsPe++eabvdd87rnnAnbdQNu/f7+3ztGjR1tdTr8JlZ8PAADoPcIWAEDQu+OOO0wfzg3D6NF1ysvLFR0dzQdeIMg999xzpkDS9ys6OlrDhg3T7Nmz9aMf/UhLly71+9qtw74jX8OGDZPL5fL7Gm63WxkZGW2us3///i5fm5ubqz//+c8677zzlJWVpfj4eEVGRiolJUWTJ0/WhRdeqN///vd69913VVtb26376M7XkiVL/L5fAED3EbYAAILeTTfd5H184MABffnllz26zquvvqrm5mZJUnx8vK688sqA1BfOwnWWCqzV3NyskpISrVu3Tk8++aROO+00nXHGGcrNze3R9UpKSvThhx/6ff7HH3+swsLCbr1HY2Oj7rjjDo0ZM0Z33XWXPvnkE+Xl5am+vl4ul0tVVVXauXOnPvzwQ/3P//yPLrnkEg0ePFirVq3q7u0AAIKAw+oCAADoyowZMzRr1ixt3LhRkvTCCy90ukSnIy+88IL38RVXXKGEhIRAlQigjyQmJurGG280jTU2NurAgQNasWKFGhoaJLUs4TvzzDO1evVqDRkypNvv88ILL+gb3/iG3+d2R3Nzsy699FJ98skn3rGoqCidcMIJGjdunOLi4lRdXa39+/dr06ZN3ntyOp2qq6vz6z1uvPFGJSYm+l3TiBEjunUPAIDuIWwBAISEm266yRu2vPnmm3riiScUGxvr9+t37dqlr776ynQ9K/V0KdRA0JulYAg/gwcP1uOPP97uc2VlZfrRj36k119/XZKUk5Oje++9V4899pjf1586daq2bdumd999V5WVlUpJSen0/KqqKr399tum13bl/vvv9wYtNptNd955p37zm9+0+15Op1NLlizR66+/rldeecXv+7jvvvuYXQYAQYRlRACAkLBgwQJFRkZKkqqrq7Vo0aJuvb71v0SPHDlSZ5xxRiDLA2CBIUOG6OWXX9bs2bO9Y88++6ycTqff17jhhhskSU1NTXrttde6PP/1119XY2OjJLWZcdMep9Ophx56yHv8xz/+Uffff3+HoU5kZKTOOecc/d///Z/y8vI0a9YsP+4CABBsCFsAACFh6NChuuCCC7zH3ZnGbxiGXnzxRe/xDTfcENBdgABYJyIiQrfddpv3uK6uTuvXr/f79QsWLJDD0TLZ25//rhw5JzIyUgsWLOjy/DVr1qiystL7mp/97Gd+15aSktKjJVEAAOsRtgAAQkbrpT+ffvqp3w0qv/zySx04cMB77Puv0VVVVXrllVf0/e9/XyeeeKJSU1MVFRWlpKQkjRs3Ttdee61ef/11eTyewNyIur/186JFi3TppZdqxIgRio6OVmZmps455xwtXLiwW7uoSFJDQ4MWLVqkn/70p5o3b57S0tIUFRWlhIQEjR49WpdffrmeeeYZbzPh9hzZLWbMmDHesQMHDnS480lrPWmqu3r1at12222aNm2aBg0apJiYGGVmZur888/X448/7ldfi3vvvdf7vvfee68kyeVy6YUXXtDZZ5/t/d5mZGTosssu03vvvedXbX2ltrZWjz76qM477zxlZmYqJiZGgwYN0vTp03XbbbeZlsV1JTc3V/fdd59OPfVUpaWlKTo6WlFRURoyZIhmzpypBQsW6Mknn+z0f1NOp1MvvviivvnNb2rs2LFKSEiQw+FQYmKixo8fr/POO09333231qxZE4jb75Zjjz3WdJyfn+/3a4cNG6bzzz9fkrRy5Urt2bOnw3P37dunFStWSJLOP/98DR06tMvrHzp0yPt48ODB3eqrAgAIYQYAACGiqanJGDx4sCHJkGQ8+OCDfr3ulltu8b7m5JNPNj335ptvGtHR0d7nO/uaOXOmsXfv3k7fa/Hixd7zTzvttA7Pa33dztTU1BgXXnhhp3XNmzfPKCgoMG666Sbv2LPPPtvu9VavXm0kJCT4db+jR482NmzY0O51nn32Wb+u0d497tu3zzs+atSoTu+/trbWuOaaa7q8fkZGhvHBBx90eq177rnHe/4999xj5OXlGaecckqn173lllsMt9vd6XX95c/P54h3333XSE9P7/K+FyxYYNTV1XV6rX/+859GbGysXz+nuXPntnuNnTt3GlOmTPH757179+6efpsMwzD//erq74hhGMauXbtM7//SSy91eG7rv3+SjIaGBuP111/3Ht99990dvvbee+/1nvef//zHaGhoMF1r3759bV7zn//8x/u8zWYzamtr/fkWdMn3Ptp7bwCAdWiQCwAIGVFRUbr22mv1xBNPSGqZzv/LX/6y09c0NDTojTfe8B77NsYtLi5WU1OTJCkzM1NTp05Venq64uLiVFtbq+3bt2vDhg0yDEObN2/Wqaeeqk2bNvXL1H6n06mLLrpIS5cu9Y6lp6fr1FNPVWJionJycrR8+XItX75cl19+ucaOHdvlNSsqKlRbWyup5V/0p02bpszMTMXHx6u+vl45OTlas2aNXC6X9u/fr9NOO00bNmzQ+PHjTdeZMmWKfvzjH6umpsa7rKK9XWN6o76+XmeeeaZppsTw4cM1f/58JSQkeO/f7XaroKBAl1xyiV555RW/tvSura3V+eefr61btyouLk7z589XVlaWampqtHjxYhUXF0tq6f8xadIk/frXvw7YfXXltdde03XXXSe32y2pZZnMvHnzNH78eNXW1mrZsmXemRsvv/yy9u3bpy+++EIxMTFtrrVo0SJ9//vf9x4nJSXp5JNPVmZmphwOh6qqqrRr1y5t3bq1w5lMNTU1Ovvss73bKtvtds2aNUtTpkxRQkKC6uvrdejQIW3evFmlpaWB/nb4xXcmS1paWrdef8kllyglJUWVlZV68cUXvbOgfB35uz5o0CB94xvf8KvR87hx47yPDcPQX/7yF913333dqg8AEIIsDnsAAOiWNWvWmP419+uvv+70/Jdeesl7bnR0tFFRUWF6/p133jH+93//t9N/id+7d69x3nnnea/z7W9/u8NzAzmz5Y9//KPpX8T//Oc/Gy6Xy3TOzp07jZkzZxqSjKioKL9mtvzud78ztmzZ0uH7FhUVGTfccIP3WmeddVaH53Znlkp3X/PDH/7Qe15ERITx8MMPt5llsmvXLuP444/3npeUlNThv/C3ntlyZDbTTTfdZJSVlZnOq6urM6699lrvuQkJCQGZjeDPzJacnBzTzKM5c+a0+bvpdruNBx980LDb7d7zfvKTn7R7vWOPPdZ7zm233dbhLJiamhrj9ddfN37961+3ee7hhx/2XmPq1KnGjh072r2Gx+Mx1qxZY/zwhz80Dh482Ml3omvdndny29/+1nt+ZGSkUV5e3uG57c1sMQzD+N73vucdW7p0aZvXLVu2zPv897//fcMwDL9mtng8HmP06NGm/y1ff/31xqpVqwyPx+PfN8SP+2BmCwAEF8IWAEDIab2c4Y477uj03NYhydVXX93j92xubjaOOeYYQ5IRExPT4Ye5QIUtlZWVRlxcnPece++9t8NrFRcXGxkZGaZrdrVMxR8XXHCB93rbtm1r95y+CltycnJMYcLjjz/e4fXKy8tNH2ZvueWWds9rHbZIMq699toOr9nQ0GBkZWV5z3311Vf9urfO+BO23Hjjjd5zxo8fb1RWVnZ4vb///e/ec+12e5slbjU1Nd7ns7KyevzB/oorrvBe59NPP+3RNbqrO2HLtm3bjMTERO/5CxYs6PT8jsKWFStWeMe+853vtHndd7/7Xe/zK1euNAzDv7DFMAzjjTfeMJ135GvIkCHGhRdeaNx9993Gu+++22lI1NV93HjjjcaPf/xjv74efvhhv98HANAzhC0AgJBz//33ez9gDB8+vM1sjyPy8/ONiIgI77nvv/9+r973gQce8F7rnXfeafecQIUt//jHP7zPZ2ZmGk1NTZ3W9q9//SvgYctrr73mvd6jjz7a7jl9Fbb8+te/9p5z7LHHdhkUtK41Ojq63ZCiddgSFRVlFBQUdHrNO++803v+L3/5S7/urTNdhS0VFRWm/kFvvfVWp9dzu93GtGnTvOf/5je/MT1/6NAh0/ewp8455xzvdTZt2tTj63RHV2FLY2OjsXPnTuMvf/mLkZKS4j138uTJRmFhYafX7ihsMQzDGD9+vCHJSE5ONo03NDR432fChAmmcX9nlzz99NNGTExMu6FL61kvc+bMMR577DHT+/tzH9356uy/TQCAwKBnCwAg5Fx//fX63e9+J4/Ho/z8fH322Wc677zz2pz30ksveftepKent3tOa5WVlVq9erWys7NVVlam2tpa0w5EO3bs8D7etGmTvvGNbwTojtpavHix9/E111yjqKioTs//1re+pdtuu63THYR81dfXa/Xq1dqyZYtKSkpUU1Pj/X5J5l1UNm3a5H/xAfDFF194H998881d7tp0+eWXa/DgwSovL1dTU5NWrVrl3WGmPfPmzVN6enqn15w1a5b38f79+/0rvBdWrlzp7R+Umpra5d8vu92uW2+9Vbfffrsk89+ZI9eIiYlRY2Ojtm7dqhUrVmju3LndrisrK8v7+KmnntKTTz7Z7Wv0xpFdrjpjt9t12WWX6Yknnuh2v5bWbrjhBt1zzz2qqqrS22+/rWuuuUaS9Pbbb3u3b77hhht6dO1vf/vbOuecc/TAAw/olVdeUUVFRZtzDMPQmjVrtGbNGj3wwANauHChTj/99J7eDgDAQoQtAICQM2LECJ199tn65JNPJEkLFy5sN0g50sxSkq677jpFRES0e728vDz95je/0RtvvOH9sNuVvm4EunHjRu/jk08+ucvzExMTNX36dG3YsKHLc8vLy3X33XfrhRdeUE1NjV/19GfjU8MwTOHOKaec0uVrIiMjNWfOHH300UeSpA0bNnQatsyYMaPLa7ZuglxdXd3l+b3V+mc+Z84cORxd/5rWOjzZuHGjDMPwBhNRUVG67LLL9Oqrr8rlcunMM8/UNddcoyuvvFKnnnqqUlJS/Krr6quv1r///W9JLWHL+vXrddNNN+m8885r0zjZKpdccomeeeYZv++pIzfccIPuvfdeGYahF154wRu2HPlvic1m63HYIkkjR47UE088oYceekhfffWVli1bprVr12r9+vXeBsRH5OXl6ZxzztH777+vc889t8tr79u3z++t1AEAfY+wBQAQkm666SZv2PLf//5XtbW1SkhI8D6/ceNGbdmyxXR+ezZu3Kizzjqr3X9l7oy/IUVPlZSUeB+PHDnSr9eMHDmyy7DlwIEDOvXUU3Xw4MFu1dPX99taVVWVnE6n93jUqFF+va71B82uwqHk5OQurxcZGel93LqevtL6Z96Te25ublZNTY2SkpK8Yw899JDWr1+v3bt3q7m5WQsXLtTChQtlt9s1bdo0zZ8/X+ecc44uuOACRUdHt/se5513nn7yk5/osccekyStXbtWa9euldSy68+8efN0+umn67LLLlNmZmZ3b7tLvrtcuVwu5efna+PGjcrLy5PUsuvS3r179fnnnys1NbXH7zVmzBjNmzdPy5Yt0yeffKKioiJJ8v63Zv78+QEJNKKiojR//nzNnz/fO7Z//3698cYbevjhh72zylwul2688Ubt3btXcXFxvX5fAED/sVtdAAAAPXH55Zd7P1TW19ebtneWzLNaZs2a1e5MhqamJl1xxRXeoGXo0KG66667tHjxYuXm5qqurk4ej0dGS48zPfvss97Xtl5e1BeObM8sye8PWfHx8V2es2DBAm/QkpiYqF/84hf66KOPtHfvXtXW1srtdnvvt/WylL6+39Za37vk3335ntdVONTVshQrtL7vntyz1Pa+09PTtW7dOt11112m5TUej0dbtmzRP/7xD11++eXKyMjQ/fffb1pG1tqjjz6qt956S3PmzDGNFxUV6c0339RPfvITjRw5UldeeWW3g7yuDB48WI8//rj366mnntI777yjffv26ZlnnvFuef31118HZOvxI8Gsy+XSyy+/rJdfflkul8v0XF8YPXq07rjjDm3bts20dKioqEivvfZan70vAKBvELYAAEJSbGysrrrqKu/xwoULvY9dLpdeeeUV73FHH5DefPNN7du3T1LL0qTNmzfrT3/6k04//XRlZmYqLi7O9KG8P2d3tJ6lU19f79dr6urqOn1+5cqVWrlypff6q1ev1t///nedd955GjNmjOLj42W3H/3VoD/vt7XW9y51fV/tnZeYmBjQmvpD6/vuyT1L7d93UlKS/vSnP+nQoUNavXq1/vrXv+qyyy4zzQCpqKjQb3/7W11xxRUyDKPd97r88sv11Vdf6cCBA3r++ef1/e9/X1OnTvU+bxiG3nzzTR133HHatWuXX/X3hsPh0K233qqnn37aO/bhhx/q+eef79V1r7rqKsXGxkpqCW2PXM/3vzl9JSkpSQsXLjQte1y2bFmfvy8AILAIWwAAIat1iLJkyRJvz4OPP/7YO/0/MjJSCxYsaPf1n3/+uffxz3/+c2VkZHT6fgcOHOhtyX4bOnSo97G/MwV8ez74an2/N910k+mDcnv6835bS05ONi3h8ff+Wzex7c1SEqv05Gfe+p6joqI6DZkiIiJ04okn6o477tB///tfFRUVadmyZbrkkku857z99tt68803O33PkSNH6sYbb9RTTz2l7OxsHTx4UPfdd593BlZZWZl++ctf+lV/IFx33XWme/jDH/6gxsbGHl8vKSlJl156qaSWxtCbN2+WJF122WX9FuJlZmZq2rRp3uOCgoJ+eV8AQOAQtgAAQta8efM0duxYSS3LIl588UVJ5iVEF1xwgelDbGv5+fnex/40TF26dGlvyu2W1jvhrF69usvza2trtXXr1k7P6Yv77YvlODabTccee6z3+MhsnM64XC5vHxFJOu644wJeV19r/TNfs2ZNh0t6Wmv9vZk1a1a3fh52u13z5s3TokWLdM4553jH33nnHb+vIbXsVnT33XfrX//6l3fsk08+8bvZdCD85S9/8c4Eyc3N1VNPPdWr67W3HCkQS5S648jyKEkd9tMBAAQvwhYAQMiy2WymD0ALFy5UVVWV6cNiZz0WWi+Z6Wqpzvr1600f5vvaGWec4X382muvddmg9bXXXuvyw2137jc/P19vv/12l3W2/kAYyCayZ555pvfx888/3+HSliMWLVqksrIyb03+7OAUbE455RTvh+qSkhK9//77nZ7v8XhMfYRaf8+6w2azmbaZPjIrrLtazy5xOp0qLy/v0XV6YtKkSfrWt77lPf7rX//aq7Dn3HPPNW0NnpGRYQqk+lpTU5Npq3l/m2QDAIIHYQsAIKTdeOON3n/N3759u+68807vEoLBgwfr4osv7vC1R2bFSJ3/a359fb2+973vBahi/yxYsMC7LCM3N1cPPPBAh+eWlZXp7rvv7vKa/t6v2+3W9773PTU3N3d5zZSUFG+IU1JSErDA5bvf/a73uhs2bDDNmvBVWVmpO++803t87bXX+rXbULBJSUnxbjUsSb/61a867Zvz+OOPe3fcstvtbf6O1tTU+PUzlMxL0IYNG2Z6zt9tv1tfw263m7bO7g933XWX9+9Mfn6+qZdLd0VERHi3ZV67dq2WLl3a4dbxXfnqq6/0t7/9ze/eS1LLTJ3W2413to05ACA4EbYAAELamDFjTNuntv5Qfu211yoqKqrD17b+1/znn39eDz74YJulGzk5OTr33HO1YcMGv3eICYTk5GRTgHD33XfrgQceaFPf7t27dc455yg/P7/Te5Wkiy66yBtMLVmyRHfccYcaGhpM5xQWFuqKK67Q+++/79f9RkdHa8KECZJaZjMs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/YiwBQAAAAE3JCFaM0Ykm8aW7iq1qBoAAPoXYQsAAAD6hO+uRPRtAQCEC8IWAAAA9Anfvi3bC6pVUtNkUTUAAPQfwhY/HDp0SA8//LDOPfdcjRw5UlFRUUpPT9cVV1yhr776yuryAAAAgtKsrBQlRDtMYyv3sJQIADDwEbb44bHHHtMvfvEL7d27V+eee65uv/12zZs3T2+//bZOOeUUvfbaa1aXCAAAEHQcEXadNHawaWxFDmELAGDgc3R9CubMmaMlS5botNNOM40vW7ZMZ511ln74wx/qsssuU3R0tEUVAgAABKdTxqXqs+3F3uMVOWUyDEO21lsVAQAwwDCzxQ/f/OY32wQtkjR//nydccYZqqio0JYtWyyoDAAAILjNm5BqOj5U2aADZfUWVQMAQP/o87CluLhY7733nu6++25dcMEFSk1Nlc1mk81m080339ytax04cEC33367Jk+erPj4eA0ePFizZ8/WX//6V9XXW/N/2pGRkZIkh4NJQgAAAL4mDEvQ0ETz7N8V9G0BAAxwfZ4QpKWlBeQ67777rq6//npVV1d7x+rr67Vu3TqtW7dOTz/9tN5//32NHz8+IO/nj4MHD+qzzz5TRkaGZsyY0W/vCwAAECpsNpvmjhuiRZvyvWMrckp13YmjLKwKAIC+1a/LiEaOHKlzzz2326/buHGjrrnmGlVXVyshIUF//vOftXLlSn3++ef67ne/K0natWuXLrroItXU1AS67HY5nU7dcMMNampq0gMPPKCIiIh+eV8AAIBQc8p481KilXvK5PEYFlUDAEDf6/OZLXfffbdmz56t2bNnKy0tTfv379eYMWO6dY2f/exnamhokMPh0CeffKKTTz7Z+9yZZ56pCRMm6M4779SuXbv04IMP6t57721zjdtvv11NTU3des8JEya0+5zH49HNN9+spUuX6rvf/a5uuOGGbt0PAABAOJnrE7ZU1ju1raBa00ckW1QRAAB9q8/Dlvvuu69Xr1+zZo2WLVsmSfr2t79tClqOuP322/Xss89q+/bteuSRR/T73//e20vliH/+85+qq6vz+32vvPLKdsMWj8ejW2+9VS+//LKuv/56PfXUU928IwAAgPAyIiVWY1Ljta/06O9iK3JKCVsAAANW0O9GtGjRIu/jW265pd1z7Ha7brzxRklSZWWlFi9e3Oac2tpaGYbh99fp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",
+ "image/png": "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8irWzJannnrK2LVrV4Hve+bMGWPChAmOew0cOLDAsSWZpVLSa+655x7HOHd3d+PNN9/MM8vk4MGDRufOnR3jAgMDC/wJf+6ZLX/OZpo0aZJx7tw507iUlBRj7NixjrH+/v5OmY1QnJktUVFRpplH3bp1y/N3Mycnx5g2bZrh5ubmGHf//ffne78OHTo4xkyZMqXAWTBJSUnGl19+afz973/P0/fmm2867tGqVStj//79+d7DbrcbGzduNO655x7j+PHjhfxOFK2kM1v+8Y9/OMZ7enoa58+fL3BsfjNbDMMw7rrrLkfbypUr81y3atUqR//dd99tGIZRrJktdrvdaNiwoem/5VtuucVYt26dYbfbi/cbUoznYGYLALgWwhYAQIWTeznDY489VujY3CHJTTfdVOr3zMzMNNq1a2dIMnx8fAr8MOessCUhIcHw9fV1jHnuuecKvNfZs2eNsLAw0z2LWqZSHFdddZXjfnv37s13TFmFLVFRUaYw4d133y3wfufPnzd9mJ08eXK+43KHLZKMsWPHFnjPtLQ0IyIiwjH2iy++KNazFaY4YcvEiRMdYyIjI42EhIQC7/f66687xrq5ueVZ4paUlOToj4iIKPUH+9GjRzvu8+uvv5bqHiVVkrBl7969RkBAgGP8uHHjCh1fUNiyZs0aR9sdd9yR57o777zT0b927VrDMIoXthiGYSxYsMA07s9fNWvWNIYPH25MnTrV+P777wsNiYp6jokTJxr33XdfsX69+eabxX4fAEDpELYAACqcl156yfEBo27dunlme/zp5MmThru7u2Ps4sWLL+t9X375Zce9vvvuu3zHOCtsef/99x394eHhRkZGRqG1ffTRR04PW+bPn++439tvv53vmLIKW/7+9787xnTo0KHIoCB3rd7e3vmGFLnDFi8vL+PUqVOF3vOJJ55wjH/kkUeK9WyFKSpsuXDhgmn/oG+++abQ++Xk5BitW7d2jH/yySdN/SdOnDD9HpbW4MGDHffZvn17qe9TEkWFLenp6caBAweMV155xahevbpjbIsWLYzTp08Xeu+CwhbDMIzIyEhDkhEUFGRqT0tLc7xP06ZNTe3FnV3yySefGD4+PvmGLrlnvXTr1s145513TO9fnOcoya/C/m0CADgHe7YAACqcW265RU899ZTsdrtOnjyp3377TUOHDs0z7vPPP3fse1GnTp18x+SWkJCg9evXa8+ePTp37pySk5NNJxDt37/f8fX27dt1zTXXOOmJ8lq2bJnj6zFjxsjLy6vQ8TfffLOmTJlS6AlCl0pNTdX69eu1a9cuxcXFKSkpyfH7JZlPUdm+fXvxi3eC33//3fH1rbfeWuSpTaNGjVJwcLDOnz+vjIwMrVu3znHCTH769OmjOnXqFHrPjh07Or4+evRo8Qq/DGvXrnXsHxQSElLk3y83NzfddtttevTRRyWZ/878eQ8fHx+lp6dr9+7dWrNmjXr37l3iuiIiIhxff/jhh/rggw9KfI/L8ecpV4Vxc3PTyJEj9d5775V4v5bcJkyYoGeffVaJiYlatGiRxowZI0latGiR4/jmCRMmlOret99+uwYPHqyXX35Z8+bN04ULF/KMMQxDGzdu1MaNG/Xyyy9rzpw5uuKKK0r7OAAACxG2AAAqnHr16mnQoEFasmSJJGnOnDn5Bil/bmYpSePHj5e7u3u+94uNjdWTTz6pBQsWOD7sFqWsNwLdtm2b4+uePXsWOT4gIEBt2rTR1q1bixx7/vx5TZ06VbNnz1ZSUlKx6inPjU8NwzCFO7169SryGk9PT3Xr1k0///yzJGnr1q2Fhi1t27Yt8p65N0G+ePFikeMvV+4/827dusnDo+hv03KHJ9u2bZNhGI5gwsvLSyNHjtQXX3yh7OxsXXnllRozZoxuuOEG9evXT9WrVy9WXTfddJM+/fRTSX+ELVu2bNGkSZM0dOjQPBsnW+Xaa6/V9OnTi/1MBZkwYYKee+45GYah2bNnO8KWP/8tsdlspQ5bJKl+/fp677339MYbb2jDhg1atWqVNm3apC1btjg2IP5TbGysBg8erMWLF2vIkCFF3vvIkSPFPkodAFD2CFsAABXSpEmTHGHLt99+q+TkZPn7+zv6t23bpl27dpnG52fbtm0aOHBgvj9lLkxxQ4rSiouLc3xdv379Yl1Tv379IsOWY8eOqV+/fjp+/HiJ6inr580tMTFRWVlZjtcNGjQo1nW5P2gWFQ4FBQUVeT9PT0/H17nrKSu5/8xL88yZmZlKSkpSYGCgo+2NN97Qli1bdOjQIWVmZmrOnDmaM2eO3Nzc1Lp1a/Xt21eDBw/WVVddJW9v73zfY+jQobr//vv1zjvvSJI2bdqkTZs2Sfrj1J8+ffroiiuu0MiRIxUeHl7Sxy7SpadcZWdn6+TJk9q2bZtiY2Ml/XHqUnR0tJYuXaqQkJBSv1ejRo3Up08frVq1SkuWLNGZM2ckyfFvTd++fZ0SaHh5ealv377q27evo+3o0aNasGCB3nzzTcessuzsbE2cOFHR0dHy9fW97PcFAJQfN6sLAACgNEaNGuX4UJmammo63lkyz2rp2LFjvjMZMjIyNHr0aEfQUqtWLT399NNatmyZYmJilJKSIrvdLuOPPc40Y8YMx7W5lxeVhT+PZ5ZU7A9Zfn5+RY4ZN26cI2gJCAjQww8/rJ9//lnR0dFKTk5WTk6O43lzL0sp6+fNLfezS8V7rkvHFRUOFbUsxQq5n7s0zyzlfe46depo8+bNevrpp03La+x2u3bt2qX3339fo0aNUlhYmF566SXTMrLc3n77bX3zzTfq1q2bqf3MmTP6+uuvdf/996t+/fq64YYbShzkFSU4OFjvvvuu49eHH36o7777TkeOHNH06dMdR17v3LnTKUeP/xnMZmdna+7cuZo7d66ys7NNfWWhYcOGeuyxx7R3717T0qEzZ85o/vz5Zfa+AICyQdgCAKiQqlWrphtvvNHxes6cOY6vs7OzNW/ePMfrgj4gff311zpy5IikP5Ym7dixQ//61790xRVXKDw8XL6+vqYP5eU5uyP3LJ3U1NRiXZOSklJo/9q1a7V27VrH/devX6/XX39dQ4cOVaNGjeTn5yc3t7++NSjP580t97NLRT9XfuMCAgKcWlN5yP3cpXlmKf/nDgwM1L/+9S+dOHFC69ev16uvvqqRI0eaZoBcuHBB//jHPzR69GgZhpHve40aNUobNmzQsWPHNGvWLN19991q1aqVo98wDH399dfq1KmTDh48WKz6L4eHh4duu+02ffLJJ462n376SbNmzbqs+954442qVq2apD9C2z/vd+m/OWUlMDBQc+bMMS17XLVqVZm/LwDAuQhbAAAVVu4QZfny5Y49D3755RfH9H9PT0+NGzcu3+uXLl3q+Pqhhx5SWFhYoe937Nixyy252GrVquX4urgzBS7d8+FSuZ930qRJpg/K+SnP580tKCjItISnuM+fexPby1lKYpXS/JnnfmYvL69CQyZ3d3d1795djz32mL799ludOXNGq1at0rXXXusYs2jRIn399deFvmf9+vU1ceJEffjhh9qzZ4+OHz+u559/3jED69y5c3rkkUeKVb8zjB8/3vQMzzzzjNLT00t9v8DAQF133XWS/tgYeseOHZKkkSNHlluIFx4ertatWztenzp1qlzeFwDgPIQtAIAKq0+fPmrcuLGkP5ZFfPbZZ5LMS4iuuuoq04fY3E6ePOn4ujgbpq5cufJyyi2R3CfhrF+/vsjxycnJ2r17d6FjyuJ5y2I5js1mU4cOHRyv/5yNU5js7GzHPiKS1KlTJ6fXVdZy/5lv3LixwCU9ueX+venYsWOJ/jzc3NzUp08fLVy4UIMHD3a0f/fdd8W+h/THaUVTp07VRx995GhbsmRJsTebdoZXXnnFMRMkJiZGH3744WXdL7/lSM5YolQSfy6PklTgfjoAANdF2AIAqLBsNpvpA9CcOXOUmJho+rBY2B4LuZfMFLVUZ8uWLaYP82VtwIABjq/nz59f5Aat8+fPL/LDbUme9+TJk1q0aFGRdeb+QOjMTWSvvPJKx9ezZs0qcGnLnxYuXKhz5845airOCU6uplevXo4P1XFxcVq8eHGh4+12u2kfody/ZyVhs9lMx0z/OSuspHLPLsnKytL58+dLdZ/SaN68uW6++WbH61dfffWywp4hQ4aYjgYPCwszBVJlLSMjw3TUfHE3yQYAuA7CFgBAhTZx4kTHT/P37dunJ554wrGEIDg4WFdffXWB1/45K0Yq/Kf5qampuuuuu5xUcfGMGzfOsSwjJiZGL7/8coFjz507p6lTpxZ5z+I+b05Oju666y5lZmYWec/q1as7Qpy4uDinBS533nmn475bt241zZq4VEJCgp544gnH67FjxxbrtCFXU716dcdRw5L0+OOPF7pvzrvvvus4ccvNzS3P39GkpKRi/RlK5iVotWvXNvUV99jv3Pdwc3MzHZ1dHp5++mnH35mTJ0+a9nIpKXd3d8exzJs2bdLKlSsLPDq+KBs2bNBrr71W7L2XpD9m6uQ+brywY8wBAK6JsAUAUKE1atTIdHxq7g/lY8eOlZeXV4HX5v5p/qxZszRt2rQ8SzeioqI0ZMgQbd26tdgnxDhDUFCQKUCYOnWqXn755Tz1HTp0SIMHD9bJkycLfVZJGjFihCOYWr58uR577DGlpaWZxpw+fVqjR4/W4sWLi/W83t7eatq0qaQ/ZjMsXLiwOI9XpCZNmujuu+92vJ4yZYree++9PKci/fnn8+dGx4GBgcUKnlzV1KlTHRvlHjx4UEOHDlV0dLRpjN1u11tvvWXaF+W+++7LcyTxli1b1LBhQz333HPau3dvvu+Xk5Oj+fPnO451lv5Yepdbz549NW7cOP30008FhjcHDx40zSIbOHBgkX8fna1Fixa66aabHK9ffvnlYodN+YmMjFSXLl3UpUsXRUZGlvo+Fy5c0OOPP66GDRvqkUce0datWwucqRUfH6+HH37Y9He4Y8eOhC0AUAF5WF0AAACXa9KkSfnuL1LUMa1DhgxRv379tHLlShmGoccee0zvvfeeOnXqpKCgIB06dEhr165VTk6O6tWrpwcffNAUgJS1f/zjH/r111+1Zs0aGYahJ598Um+99Zb69+8vf39/RUVFadWqVcrJyVH37t3VpEkTzZ07t8D7tWjRQhMmTHDsaTNt2jTNnTtXXbt2Ve3atXX06FGtXLlSmZmZCggI0Kuvvqq//e1vRdY5evRovfjii5L+2Kx05syZioyMNG1y+9prr5X4+V977TVt3rxZmzZtUnZ2tqZMmaKXXnpJffr0kb+/vw4fPqyVK1c6AigPDw9Nnz49T+hQkTRp0kSffPKJxo8fr5ycHK1bt07NmzdX37591aRJEyUnJ2vVqlU6ceKE45oePXrolVdeyfd+p06d0vPPP6/nn39ederUUYcOHVSnTh15eHjozJkz2rJli2kvn759+5qW40h/hGjz5s3TvHnzVK1aNbVr106NGzdWYGCgLly4oOjoaG3evNkxvlq1aqX683aGZ555Rl9++aXsdrtiYmI0c+bMcp+VVpC4uDi98cYbeuONNxQUFKTOnTsrLCxMAQEBSk5O1qFDh7RlyxbHMdOSFBoaqs8//9y0BLAgzz77bIk28B0wYIBGjx5dqmcBABSDAQBABXfx4kXD19fXkOT41bJly2Jde/r0aaNTp06may/91apVK2PPnj3GjBkzHG2TJk3K937Lli1zjOnfv3+B75v7/oVJTEw0hg0bVmh9vXr1Mk6ePGlMmjTJ0TZjxox875eSkmIMGTKk0PuFh4cbq1evLvazJCQkGC1atCj0nrkdOXLE0d6gQYNCnz8pKcm46aabCr23JCMsLMz48ccfC73Xs88+6xj/7LPPFjrWMIr/Z1lcxfnz+dP3339vhIaGFvncY8eONVJSUvK9x/r16w0PD48i7/HnrxtuuMG4ePFinvu0adOm2Pdo1KiRsWbNmsv+vcr931pRf0cudeONN5rqycrKMvXn/vsnyUhLSyt1nWlpaaZ7HTlyJM+Y/fv3G/379zfc3d2L/fsoybjqqquM6OjoAt/70uco6a8HH3yw1M8NACgaM1sAABVeQECARo0apc8//9zRVtSslj+FhoZq7dq1+uSTT/TFF19o9+7dSk1NVe3atdW8eXONGTNG48ePl6+vrzZu3FhWj1CgwMBA/fTTT/rmm280c+ZMbdq0SefPn1dISIhatmyp8ePH65ZbbjHNIimMr6+vfvrpJ82dO1ezZs3Stm3bdPHiRYWEhKhx48YaPXq0br31VtWoUUPLly8v1j2DgoK0adMmvf/++1q8eLH27dunhIQEp+zf4u/vr/nz5+uhhx7SnDlztHz5cp08eVJpaWkKCQlRmzZtdPXVV+u2224r12VeZe3qq69WVFSUPv30U/3www/as2eP4uPjVa1aNdWtW1cDBgzQxIkT1b179wLv0b17d509e1a//fabVq9erW3btunw4cM6d+6ccnJyFBgYqCZNmqhHjx665ZZb1K1bt3zvs337dq1fv17Lli3Txo0bdeDAAZ08eVKpqany9fV1zJi59tprddNNN1l+cs4zzzyjBQsWyDAMHTlyRHPmzNHkyZMtq6d58+Zavny54uPjtXz5cq1evVq7du1SVFSUzp07p/T0dPn6+qpGjRpq0aKFunXrpptuuqlYJ4YBAFyXzTCK2N4fAAAAAAAAxcYGuQAAAAAAAE5E2AIAAAAAAOBEhC0AAAAAAABORNgCAAAAAADgRIQtAAAAAAAATkTYAgAAAAAA4ESELQAAAAAAAE5E2AIAAAAAAOBEhC0AAAAAAABORNgCAAAAAADgRIQtAAAAAAAATkTYAgAAAAAA4ESELQAAAAAAAE7kYXUByF96erp27dolSapVq5Y8PPijAgAAAADA2bKzsxUXFydJatu2rXx8fC77nnyCd1G7du1St27drC4DAAAAAIAqY+PGjeratetl34dlRAAAAAAAAE7EzBYXVatWLcfXGzduVFhYmIXVAAAAAABQOZ06dcqxsiT3Z/HLQdjionLv0RIWFqbw8HALqwEAAAAAoPJz1n6pLCMCAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiD6sLwB9at25tep2VlWVRJQAAAAAA4HIwswUAAAAAAMCJmNniIvbs2WN6HRsbq4iICIuqAQAAAAAApcXMFgAAAAAAACdiZksFsPJgnGpd9LS6jGKxSWobHqTQQB+rSwEAAAAAwBKELRXAEwt2yiPwpNVllMjYbvX15FUtFFStYoREAAAAAAA4C8uIUCbmbTyuQa+v0OKdp2QYhtXlAAAAAABQbghbUGbikjJ039ytumPWZp1ISLO6HAAAAAAAygXLiCqAetWrybu6r9VlFMuZi+nKyLab2pbuP6t1r6/Qo0Oa69ZeDeXuZrOoOgAAAAAAyh5hSwXw9b29FB4ebnUZxXIiIU3PLNyt3/efNbWnZuboXz/s1aLtJ/TiqLZqUy/IogoBAAAAAChbLCOCU9WrXk3TJ3XRe+M6KcTfO0//zthEXffeGv33x31Kzcy2oEIAAAAAAMoWYQuczmazaUS7MC19pL/Gdqufpz/Hbuh/K6M15I2VWnEwzoIKAQAAAAAoO4QtKDNBvp767/Vt9dXfeiqytn+e/tgLaZr06UY9+MU2xSdnWFAhAAAAAADOR9iCMte1YbAWP9BHDw9qJi/3vH/lFm0/qYHTVujLzTEcEw0AAAAAqPAIW1AuvD3c9eCgpvrxwb7q1ig4T39iWpaeWLBTYz9er+i4ZAsqBAAAAADAOQhbUK4ia/vrizt76OXRbRXok/cwrPXR5zXsrVV6Z+khZV5yhDQAAAAAABUBYQvKnZubTWO61tdvj/bXNe3r5unPzLZr2q8HNeLtVdp89LwFFQIAAAAAUHqELbBM7QAfvTO2o2ZM7qp61avl6T90Nlk3fLhO//x2lxLTsiyoEAAAAACAkiNsgeUGNK+tXx/ppzv7NpKbLW//5xuOa/DrK/TTrlNsoAsAAAAAcHmELXAJvl4e+ueIVvpuSh+1qReYp/9sUobu+Xyr7py9WScT0iyoEAAAAACA4iFsgUtpUy9IC+/tradHtFQ1T/c8/b/tO6vBr6/QjDVHlGNnlgsAAAAAwPUQtsDleLi76Y6+jbXk4X66onmtPP0pmTl6/vu9uv79Ndp78qIFFQIAAAAAUDDCFrisiGBfzbi1q94Z21Eh/l55+nfEJuqad1frpZ/2Ky0zx4IKAQAAAADIi7AFLs1ms+ma9nW19JErNLZbRJ7+HLuhD1cc1pA3V2jlwTgLKgQAAAAAwIywBRVCkK+n/nt9O82/q4ca1/LL0x9zPk0TP92oh+dv17nkDAsqBAAAAADgD4QtqFC6N66pnx7sqwcHNpWne95zor/ddkIDX1+hBVtiOSYaAAAAAGAJwhZUON4e7np4cDP99GBfdW1YI09/QmqWHvtqh8Z/skFH4lMsqBAAAAAAUJURtqDCiqwdoPl39dR/r2+rAB+PPP1rD5/T0DdX6r1lUcrMtltQIQAAAACgKiJsQYXm5mbT2G71tfSR/hrRLixPf2a2Xa/+ckDXvLNaW45dsKBCAAAAAEBVQ9iCSqF2oI/eG9dJ0yd1Ud0gnzz9B84k6YYP1+qZhbt1MT3LggoBAAAAAFUFYQsqlYEtQ/XrI/11e59Gcrtk/1zDkOasP6bBr6/Qz7tPW1MgAAAAAKDSI2xBpePn7aFnrm6lRff1Ueu6gXn6z1zM0N8+26I7Z2/WqcQ0CyoEAAAAAFRmhC2otNqGB2nRfb31z+EtVc3TPU//r3vPaPDrKzVr7VHl2DkmGgAAAADgHIQtqNQ83N10Z7/GWvJwP/VvVitPf3JGtp79bo9Gf7BW+05dtKBCAAAAAEBlQ9iCKiEi2FczJ3fVWzd3UE0/rzz922MSdM07q/Xyz/uVnpVjQYUAAAAAgMqCsAVVhs1m03Ud6mnpo/01pktEnv5su6EPlh/W0DdXavWheAsqBAAAAABUBoQtqHKq+3rp5Rvaad6dPdQ4xC9P/7Fzqbpl+gY98uV2nU/JtKBCAAAAAEBFRtiCKqtnk5r68cG+euDKSHm62/L0f7P1hAZOW66vt8TKMNhAFwAAAABQPIQtqNJ8PN31yJDm+vGBvurSoEae/gupWXr0qx26ZfoGHY1PsaBCAAAAAEBFQ9gCSGoaGqAv7+6p/4xqowBvjzz9a6LOaeibK/X+8ihl5dgtqBAAAAAAUFEQtgD/z83NpvHdG+i3R/treNs6efozsu165ecDuuad1dp2/IIFFQIAAAAAKgLCFuASoYE+en98Z308sYvCgnzy9O8/naTrP1irZxftVlJ6lgUVAgAAAABcGWELUIDBrUL16yP9Nbl3Q9ku2T/XMKRZ645p8Osr9cue09YUCAAAAABwSYQtQCH8vT307DWt9e29vdUyLDBP/+mL6bp7zhbdPWezTiemW1AhAAAAAMDVELYAxdAhorq+m9Jb/7iqhXw88/5n88ueMxr0+grNWXdUdjvHRAMAAABAVUbYAhSTp7ub7u7fREse6q++TUPy9CdnZOuZRXt0w4drdeB0kgUVAgAAAABcAWELUEL1a/pq9m3d9OaYDqrp55Wnf+vxBI14e5Ve/WW/0rNyLKgQAAAAAGAlwhagFGw2m0Z2rKffHumvGzuH5+nPtht6b9lhDXtzpdZGxVtQIQAAAADAKoQtwGWo4eelV29sr7l3dFfDmr55+o+eS9X46Rv01eYYC6oDAAAAAFiBsAVwgl6RIfr5oX6aMiBSHm7mc6INQ3rq211aH33OouoAAAAAAOWJsAVwEh9Pdz02tLkWP9BXnepXN/Vl5Rj622dbdOxcijXFAQAAAADKDWEL4GTN6wRowd966bbejUztCalZum3mJiWmZVlUGQAAAACgPBC2AGXAzc2mf45oqUEta5vaD8elaMrcrcrOsVtUGQAAAACgrBG2AGXE3c2mN2/uqBZ1Akztqw7F618/7LWoKgAAAABAWSNsAcqQv7eHPpnURSH+Xqb2WeuOac66o9YUBQAAAAAoU4QtQBkLr+Gr/03oIi8P839uz32/V6sOxVlUFQAAAACgrBC2AOWgc4MaemV0O1Nbjt3QvZ9vVdTZZIuqAgAAAACUBcIWoJyM7FhP918ZaWpLSs/WHbM26UJKpkVVAQAAAACcjbAFKEcPD2qm4W3rmNqOnkvVPZ9vUWY2JxQBAAAAQGVA2AKUIzc3m6bd2EFt6wWZ2tdHn9ez3+2WYRgWVQYAAAAAcBbCFqCcVfNy18cTuyg00NvUPm9jjKavPmJRVQAAAAAAZyFsASxQJ8hHH0/sIh9P83+CL/64T7/vP2NRVQAAAAAAZyBsASzSLry6Xr+pg6nNbkgPzNuuA6eTrCkKAAAAAHDZPKwuAH9o3bq16XVWVpZFlaA8DW8bpkcHN9O0Xw862pIzsnX7rE1aeF9vhfh7F3I1AAAAAMAVMbMFsNiUKyN1XYe6prbYC2n625wtysjOsagqAAAAAEBpMbPFRezZs8f0OjY2VhERERZVg/Jks9n08uh2On4+VduOJzjaNx+7oH98vUvTbmovm81mXYEAAAAAgBJhZgvgAnw83fXRhC6qG+Rjav9m2wl9sOKwRVUBAAAAAEqDsAVwEbUCvDX91q7y9XI3tb/y8wH9vPu0RVUBAAAAAEqKsAVwIS3DAvXWzR116aqhh+dv1+4TidYUBQAAAAAoEcIWwMUMbhWqJ4e1MLWlZeXoztmbdfZiukVVAQAAAACKi7AFcEF39WusGzuHm9pOJabrztmblZ7FCUUAAAAA4MoIWwAXZLPZ9J9RbdWtUbCpfUdsoh77aocMw7CoMgAAAABAUQhbABfl5eGmD2/prPrBvqb2H3ae0pu/HbKoKgAAAABAUQhbABcW7Oel6ZO6KMDbw9T+1tJD+m7HSYuqAgAAAAAUhrAFcHFNQwP0zriOcrvkhKLHv9qh7TEJltQEAAAAACgYYQtQAVzRvLamXt3K1JaRbdedszfrZEKaRVUBAAAAAPJD2AJUEJN6NdT47vVNbXFJGbpj1malZGRbVBUAAAAA4FKELUAFYbPZ9Ny1rdU7sqapfe+pi3p4/nbZ7VXvhKKY86mav+m4Zqw5osNxyVaXAwAAAACSJI+ihwBwFZ7ubnp/XGeNen+NouNTHO1L9p7Rq0sO6O/DWlhYXdm7mJ6ldYfPafWheK06FKej51IdfUHVPLXgbz3VNDTAwgoBAAAAgLAFqHCCfD01/dauGvneGiWmZTnaP1h+WE1q+euGzuEWVudcWTl2bY9J0KpD8Vp9KE47YhOVU8AMnsS0LL30035Nv7VrOVcJAAAAAGaELUAF1CjETx/c0kkTp29Udq7w4R/f7FSDmr7q2jDYwupKzzAMRcen/P/MlXitjz6n5BLsR7N0/1ltOXZenRtUzOcHAAAAUDkQtgAVVK8mIXrhujZ66ttdjrasHEN3z9miRff1VkSwr4XVFd/5lEytifpjWdDqQ/E6mZh+Wfd75ecD+uKuHrLZbEUPBgAAAIAyQNgCVGDjutdX1NlkfbrmiKPtfEqmbp+1SV/f00sBPp4WVpe/9KwcbTl24Y+lQVFx2nPyoowS7O3r5e6mro1qqE9kLfVtGqL10ef078X7HP0bjpzXqkPx6tesVhlUDwAAAABFI2wBKrh/jmip6PhkLT8Q52g7eCZZD8zbpk8mdZW7m/UzPFIysvXdjpP6afdpbTxyTulZ9hJd36JOgPo2DVGfprXUrWGwqnm5O/oia/vr09VHTDNiXv3lgPo2DWF2CwAAAABLELYAFZy7m03vjO2o0R+s1cEzfx1/vOxAnF78cZ+eubqVZbUdPJOkz9Yf0zdbT5Ro75XaAd7q2/SPmSu9I0NUK8C7wLE+nu56aFAzPfH1TkfbrhOJ+mXPaQ1rE3ZZ9QMAAABAaRC2AJVAgI+npk/qquveW6PzKZmO9umrjyiytr/GdqtfbrVkZtv1y57TmrP+mDYeOV+sa6p5uqtH42D1+f+ApWlt/xLNSrm+Uz19uOKw6Tjs15Yc1OBWdVxiZg8AAACAqoWwBagkIoJ99b8JnTX+4w3KzPlrmc4zC3erQU1f9WoSUqbvfyIhTXM3HNP8TbGKT84odKzNJrWrF6Q+TUPUt2ktdapfQ14ebqV+bw93Nz0ypJmmzN3maIs6m6yF205odCU6ChsAAABAxUDYAlQiXRsG68Xr2+qxr3Y42rLthu75bKsW3tdbjUL8nPp+druhlYfi9Nn6Y/p9/1nZC9no1s0mXdmitkZ1DFfvyJqq7uvl1FqGtwlTq7DD2nvqoqPtjd8O6pr2dS8ryAEAAACAkiJsASqZGzqHK+pssj5ccdjRlpiWpdtnbtK39/ZWkO/ln1B0PiVTX22O0ecbjuv4+dRCx4b4e2lM1wiN7VZf4TXK7jhqNzebHh/aXJNnbnK0xV5I0xebjmtiz4Zl9r4AAAAAcCnCFqASemJoc0XHJWvJ3jOOtuj4FN07d4tmTu4mT/eSz/QwDENbjyfos/XHtHjXKWVmF36iULdGwbqlRwMNa12n3GaWXNG8lro2rKFNRy842t5eGqUbOofL14t/7gAAAACUD+bWA5WQm5tNb4zpoJZhgab2NVHn9Pz3e2QYhaz3uURKRrbmbjiu4W+v1ugP1urbbScKDFr8vT00sWcD/fJQP315d09dW85LeGw2mx4f2sLUFp+coVlrj5VbDQAAAADAj3qBSsrP20PTJ3XRde+tUVzSXxvWfrb+uJrWDtCkXg0Lvf5QrmObk4o4trlFnQBN6NlAIzvUk5+3tf+sdGsUrP7NamnFwThH24crDmtc9/oKqnb5S6gAAAAAoCiELUAlVrd6NX08sYvG/G+dMnLNRnn++z1qGOKn/s1qmcaX5NhmL3c3jWgXplt61Fen+jVKdFRzWXtsSHNT2JKYlqWPV0brsaHNLawKAAAAQFVB2AJUch0iquvVG9vrgXl/HYtsN6Qpn2/VN/f2UtPQAJ1ISNO8Dcf1xaaYIo9tjgiupvHdG+jGzuGq6e9d1uWXStvwIA1vW0c/7jrtaPt0zRFN6tVQtQJcs2YAAAAAlQdhC1AFXNu+rg6fTdZbSw852pIysnXbrE1qHhqo3/efKfTYZptNGtiitsb3aKD+TWvJzc11ZrEU5JHBzfXz7tOO50rNzNH7y6P07DWtrS0MAAAAQKVH2AJUEQ8ObKqouGQt3nnK0RZzPk0x59MKvKa8jm0uC5G1/TW6U7i+2hLraPt8/XHd0bex6lWvZmFlAAAAACo7TiMCqgg3N5um3dhe7cODihzbrVGw3h7bUWufHKjHh7aocEHLnx4c1FSe7n/NwsnMsevt3w4VcgUAAAAAXD7CFqAK8fF018cTu6hOoE+ePquPbS4L4TV8Nb57A1PbV1tidDgu2aKKAAAAAFQFFfuTFIASqx3oo5m3dVXz0ABJfxzb/J9RbbT+qYF64bo2al4nwOIKneu+AZGq5unueG03pNd/PWhhRQAAAAAqO/ZsAaqgFnUC9eODfWUYhjzcK3fmWivAW7f1aaj3lh12tC3eeUr39E9Um3pFL6kCAAAAgJKq3J+yABTI3c1W6YOWP93Vt4kCfczZ8rQlByyqBgAAAEBlVzU+aQGo0oJ8PXV3/yamtmUH4rTp6HmLKgIAAABQmRG2AKgSJvduqBB/L1PbKz/vl2EYFlUEAAAAoLIibAFQJfh6eWjKgEhT26ajF7TiYJxFFQEAAACorAhbAFQZY7vXV73q1Uxtr/5yQHY7s1sAAAAAOA9hC4Aqw9vDXQ8Nampq23Pyon7ec9qiigAAAABURoQtAKqUUR3rqUktP1Pba0sOKDvHblFFAAAAACobwhYAVYqHu5seHdLc1BYdl6Jvtp2wqCIAAAAAlQ1hC4AqZ1jrOmpTL9DU9tZvh5SRnWNRRQAAAAAqE8IWAFWOm5tNjw9tYWo7kZCmeRuOW1QRAAAAgMqEsAVAldSvaYi6NQo2tb27LEqpmdkWVQQAAACgsiBsAVAl2Ww2PT7UvHdLfHKmZqw5ak1BAAAAACoNwhYAVVbXhsEa0LyWqe3DFYeVmJZlUUUAAAAAKgPCFgBV2qUnEyWlZ+vn3acsqgYAAABAZUDYAqBKa1MvSINahpraFu86bVE1AAAAACoDwhYAVd417cNMr9dGxSshNdOiagAAAABUdIQtAKq8gS1D5e3x1z+H2XZDS/acsbAiAAAAABUZYQuAKs/f20NXXLJR7uJd7NsCAAAAoHQIWwBA0vC25qVEa1hKBAAAAKCUCFsAQH8sJfJiKREAAAAAJyBsAQD9/1KiZiwlAgAAAHD5CFsA4P+NaMdSIgAAAACXj7AFAP5fvkuJ9rKUCAAAAEDJELYAwP/z9/ZQ/0uWEv3IUiIAAAAAJUTYAgC5jMjnVKLE1CyLqgEAAABQERG2AEAuA1vWNi0lysoxtGTvaQsrAgAAAFDRELYAQC4BPp4sJQIAAABwWQhbAOASly4lWs1SIgAAAAAlQNgCAJdgKREAAACAy0HYAgCXCPDxVL+mLCUCAAAAUDqELQCQjxHt6pher46KV2IaS4kAAAAAFI2wBQDyMbBlqLzczUuJft17xsKKAAAAAFQUhC0AkI9AH0/1axZiamMpEQAAAIDiIGwBgAKMaGc+lWjVoTiWEgEAAAAoEmELABQgv6VEv7GUCAAAAEARCFsAoAAsJQIAAABQGoQtAFCI4W3NS4lWspQIAAAAQBEIWwCgEINasZQIAAAAQMkQtgBAIQJ9PNW3KUuJAAAAABQfYQsAFOHSpUSrDsXrYjpLiQAAAADkj7AFAIowqFWoPN1tjteZOXaWEgEAAAAoEGELABQhqJqn+jatZWpjKREAAACAghC2AEAxjLj0VKKDLCUCAAAAkD/CFgAohvyWEi3dx1IiAAAAAHl5WF0A/tC6dWvT66wsfmIOuJI/lxL9vv+so23xztMa1THcwqoAAAAAuCJmtgBAMV16KtHKg3EsJQIAAACQBzNbXMSePXtMr2NjYxUREWFRNQDyM/j/lxJl5RiS/lpK5CqzW7Jz7FpxME6nEtM1oEVt1atezeqSAAAAgCqJsAUAiimomqf6RIZo2YE4R5srLCVKzsjWFxuPa8aaozqRkCZJcnezaUTbMN3Zt7HahgdZWh8AAABQ1RC2AEAJDG8bZgpbVh6KU1J6lgJ8PMu9ltOJ6Zqx9ojmbjiupPRsU1+O3dB3O07qux0n1aNxsO7s21gDmteWm5utgLsBAAAAcBbCFgAogSGt6ugp911/LSXKtmvpvrMa2bFeudWw9+RFfbIqWt/tOKlsu1Hk+PXR57U++rya1PLTnX0ba2THevLxdC+HSgEAAICqiQ1yAaAEgnw91TsyxNS2eNepMn9fwzC04mCcJkzfoOFvr9I3204UGLR4FDB75XBcip78Zpf6vPy73vrtkM6nZJZlyQAAAECVxcwWACihEW3DtDzXUqIVB8t2KdH2mAQ9+fVO7T+dVOAYm00a0ipUd/VrrMhaAfp84zHNXHNUZ5My8oyNT87UG78d1PTV0Xr9pg4a1Cq0TOoGAAAAqipmtgBACQ1pVUee7n/NHsnMtuv3/WfL5L2iziZp3MfrCwxavD3cdEuP+vr90Sv0vwld1LlBsIJ8PXXvFZFa9fcBeu3G9moeGpDvtRfTs3XnnM16Z+khGUbRy5EAAAAAFA8zWwCghP5cSpR7dssPO0/pug7O3bclNTNb93y2VamZOXn6avp5aVKvhrqlRwMF+3nle723h7tu6Byu0Z3qaeWheH28Mlqro+JNYwxDmvbrQe09dVGv3dheft78bwEAAAC4XHxXDQClMLyMlxIZhqGnv92tQ2eTTe2N/3+T21El2OTWZrOpf7Na6t+slvaevKg3fzuoJXvPmMb8tPu0jsSn6KMJXVS/pq9TngEAAACoqlhGBAClMKRVqGkjWmcvJfpyc4y+2XbC1NYyLFA/PtBXY7vVL/VpQq3qBup/EzrrqeEtdOk+uvtPJ+na91Zr9aH4/C8GAAAAUCyELQBQCtV9vfKeSrTTOacS7T15UVMX7TG1+Xt76P3xnZxyZLPNZtNd/ZpoxuRuCvQxT3BMSM3SxE836JNV0ezjAgAAAJQSYQsAlNKItmGm18sPxunMxfTLumdSepbum7tVGdl2U/vLo9upUYjfZd37Uv2b1dJ3U/qoWai/qd1uSP9evE+PfrlD6Vl594sBAAAAUDjCFgAopSGt8y4lGv7WKi07ULrlRIZh6Mmvd+lIfIqp/dZeDTWiXVgBV12ehiF++ube3hraOu/xz99sO6HJMzYpK8eez5UAAAAACkLYAgClVN3XS1c0r21qO5eSqckzNulfP+xVRnbJZoXMXndMi3eZlyK1j6iup4a3vOxaC+Pv7aEPxnfWw4Oa5elbF31Ob/x6sEzfHwAAAKhsCFsA4DK8cF1r1Qn0ydM+ffURjf5graLjkvO5Kq8dMQn69+K9pragap56d2xHeXmU/T/Vbm42PTioqT6a0Fl+XuZ9YT5YcVgrD8YVcCUAAACASxG2AMBlqFu9mn58sK8Gtcy7DGf3iYu6+p3VWrAlttDNZhNTs3Tv51uVlWMe8/pN7RURXL7HMA9pXUef3dFdnu5/LY8yDOmRL7fr7GXuRwMAAABUFYQtAHCZgv289PHEznrhutZ5ZqGkZubosa926KH525WUnpXnWsMw9OhX23UiIc3Ufnf/xhqYT4BTHjrWr6G/D2thaotPztRD87crx84JRQAAAEBRCFsAwAlsNpsm9myoRff1VmRt/zz9i7af1Ii3V2t7TIKp/eNV0fptn3lD3a4Na+ixIc3Lstwi3d6nkQa2MO9Hs/bwOb2/LMqiigAAAICKg7AFAJyoZVigvpvSW2O7ReTpO34+VTd8sFYfrjgsu93Q5qPn9fLPB0xjgv289M7YTvJ0t/afZ5vNptdubK+wIPN+NG/8dlAbos9ZVBUAAABQMRC2AICT+Xp56L/Xt9P74zsp0MfD1JdtN/TST/s18dONmjJ3m2lZjs0mvXVzB9UJyrvhrhVq+Hnp7bEd5Z7reGu7IT3wxTadT8m0sDIAAADAtRG2AEAZGd42TD8+2FddGtTI07c6Kl6nL9lw9oErm6pv01rlVV6xdG0YrEcGm4+EPnMxQ499tUN29m8BAAAA8kXYAgBlKLyGr764q4ceuDJSNlvB43pH1tQDA5uWX2ElcE//JuoTGWJq+33/WU1ffcSiigAAAADXRtgCAGXMw91Njwxprrl39FCdwLxLhGoHeOvNMeblOq7Ezc2m18e0V4i/t6n95Z/3a9vxCxZVBQAAALguwhYAKCc9m9TUTw/21eBWfx3p7OXhpnfGdlStAO9CrrRe7QAfvTmmg2l2Trbd0GNf7eA4aAAAAOASHkUPAQA4Sw0/L300obN+339Wu09c1KBWtdW6bpDVZRVLn6Yhuu+KSL2b6/jnw3Ep+nXvaQ1rE2ZhZQAAAIBrYWYLAJQzm82mgS1D9eCgphUmaPnTQ4OaqkWdAFPbB8sPyzCY3QIAAAD8ibAFAFBsHu5uundApKltR2yi1kWfs6giAAAAwPUQtgAASmR4mzqKCK5mavtg+WGLqgEAAABcD2ELAKBEPNzddFe/Jqa2VYfitftEokUVAQAAAK6FsAUAUGI3dg5XiL+Xqe3DFcxuAQAAACTCFgBAKfh4umty70amth93ndKxcykWVQQAAAC4DsIWAECp3NK9gfy83B2v7Yb00cpoCysCAAAAXANhCwCgVIJ8PTW+RwNT21dbYhWXlGFRRQAAAIBrIGwBAJTabb0bydPd5nidmW3XjDVHLKwIAAAAsB5hCwCg1OoE+ej6juGmtjnrjykpPcuiigAAAADrEbYAAC7LXf0by/bX5BYlpWdr7obj1hUEAAAAWIywBQBwWZrU8tfQVnVMbdNXH1FGdo5FFQEAAADWImwBAFy2v13RxPT6bFKGvt16wqJqAAAAAGsRtgAALluHiOrq2bimqe2jldHKsRsWVQQAAABYh7AFAOAUl85uiY5P0YqDZy2qBgAAALAOYQsAwCn6NQ1Ry7BAUxsb5QIAAKAqImwBADiFzWbTxJ4NTG2/7z+rkwlpFlUEAAAAWIOwBQDgNNe2ryt/bw/Ha7shfbEpxsKKAAAAgPJH2AIAcBo/bw+N7FjX1DZ/03Fl59gtqggAAAAof4QtAACnGtfNvJTozMUMLd3PRrkAAACoOghbAABO1apuoDrWr25q+5yNcgEAAFCFELYAAJxufHfz7JaVB+N0/FyqRdUAAAAA5YuwBQDgdFe3C1Ogj4epbd4mZrcAAACgaiBsAQA4nY+nu0Z3Dje1fbU5RpnZbJQLAACAyo+wBQBQJsZ3r296HZ+cqSV7T1tUDQAAAFB+CFsAAGUisnaAujUKNrV9vp6lRAAAAKj8CFsAAGXm0tkt66LP6XBcskXVAAAAAOWDsAUAUGaGtamjYD8vU9s8joEGAABAJUfYAgAoM94e7rrxko1yF2yNVXpWjkUVAQAAAGWPsAUAUKbGdjMvJUpIzdJPu09ZVA0AAABQ9ghbAABlqmGIn/pEhpjaPmOjXAAAAFRihC0AgDI37pKNcrccu6CdsQnWFAMAAACUMcIWAECZG9wqVKGB3qa26auPWFQNAAAAULYIWwAAZc7T3U2TejU0tS3eeUonE9KsKQgAAAAoQ4QtAIByMa5bfVXzdHe8zrYbmrXuqHUFAQAAAGWEsAUAUC6q+3rpxi7mY6DnbjiulIxsiyoCAAAAygZhCwCg3Ezu3Ug221+vk9Kz9dXmGOsKAgAAAMoAYQsAoNw0CvHToJahprZP1xxVjt2wqCIAAADA+QhbAADl6o4+jUyvj59P1a97z1hUDQAAAOB8hC0AgHLVrVGw2tYLMrVNXx1tUTUAAACA8xG2AADKlc1m0x19zbNbNh29oO0xCdYUBAAAADgZYQsAoNwNbxumOoE+prbpq49YVA0AAADgXIQtAIBy5+nuplt7NzS1/bjrlE4kpFlTEAAAAOBEhC0AAEuM7Vpfvl7ujtc5dkOz1h61riAAAADASQhbAACWCPL11E1dIkxt8zYc18X0LIsqAgAAAJyDsAUAYJnJvRvKZvvrdVJGtt749aB1BQEAAABOQNgCALBMg5p+Gta6jqlt1tqj2n0i0aKKAAAAgMtH2AIAsNSTV7WQt8df/zuyG9LTC3fLbjcsrAoAAAAoPcIWAIClGtT0030DIk1t22MS9MWmGIsqAgAAAC4PYQsAwHJ392+sRiF+praXf96v+OQMiyoCAAAASo+wBQBgOW8Pd/3rujamtsS0LL30036LKgIAAABKj7AFAOAS+jQN0TXt65raFmyJ1cYj5y2qCAAAACgdwhYAgMt4ekRL+Xt7mNsW7lJWjt2iigAAAICSI2wBALiM0EAfPTqkmant4Jlkfbr6iEUVAQAAACVH2AIAcCkTejRQ67qBprbXlhzQvI3HLaoIAAAAKBnCFgCAS/Fwd9O/R7aRzfZXW1aOoX98s0vPLNzNkiIAAAC4PMIWAIDL6Vi/hm7t1TBP+5z1xzT+kw0cCQ0AAACXRtgCAHBJT49opbv6Nc7TvvHIeV337hrtPpFoQVUAAABA0QhbAAAuyd3NpqeGt9SbYzrI28P8v6sTCWm64cO1mrnmiHLshkUVAgAAAPkjbAEAuLSRHetpwd96KSzIx9SenmXXc9/v1egP1urA6SSLqgMAAADyImwBALi8tuFB+m5KH3VpUCNP3/aYBI14e5WmLTmg9KwcC6oDAAAAzAhbAAAVQq0Ab829s4cm9myQpy/bbuid36M0/O1V2hGTUP7FAQAAALkQtgAAKgwvDze9cF0bzbuzhxqF+OXpj45L0fhPNmjPSTbPBQAAgHUIWwAAFU7PJjX104N9dd+AJvJws5n6kjOydeuMTYo5n2pRdQAAAKjqCFsAABWSj6e7Hh/aQt/f30ftw4NMfXFJGZr06UadT8m0qDoAAABUZYQtAIAKrWVYoObf3VPdGwWb2qPjU3T7rE1Ky2TTXAAAAJQvwhYAQIXn4+mujyZ2UYs6Aab2bccTNGXuVmXn2PO9zjAM/bb3jKYtOaDf959Rjt0oj3IBAABQyXlYXQAAAM4QVM1TMyd30/Xvr9HJxHRH+9L9ZzV55iY9MriZOtb/6+jo/acvaurCPdp49LyjLbxGNd3So4HGdIlQDT+vcq0fAAAAlYfNMAx+jOeCYmNjFRERIUmKiYlReHi4xRUBQMVw6EySbvhwnRLTsvL09YkM0Z39GmvlwTjNXHu0wJks3h5uur5TuJ68qoWCqnmWdckAAACwUFl8/mZmCwCgUmkaGqBPJnXRLZ9sUEa2efnQ6qh4rY6KL/IeGdl2zdt4XCkZ2Xp7bMeyKhUAAACVFHu2AAAqna4Ng/XRxC4KLuZSIF8v93zbf9x1Shcu40SjHTEJuuqtVbpy2nL9vPt0qe8DAACAioWwBQBQKfVvVkurnhigfw5vqVoB3vmO8fJw0wMDm2rrM4P1zb29NLJDXbm72Rz92XZDP+4+Var3T87I1uSZm7Tv1EVFx6Xons+36MddpbsXAAAAKhaWEQEAKi0/bw/d2a+xJvRsoK82x+jDFdE6kZAmSRrQvJaeu7a1GtT0kyR1ql9DnerXUFaOocW5QpFF209qfPcGJX7vz9Yf0/lcs2IMQ3roi+2q4eulnk1qXuaTAQAAwJURtgAAKj0fT3dN6NlQY7rW1/aYBAVW81Dz0ADZbLY8Y6/tUNcUtmw8cl4nE9JUt3q1Yr9felaOPlkVnac9M8euu2Zv1hd391DrukGlexgAAAC4PJYRAQCqDC8PN3VrFKwWdQLzDVok6YrmtRTgY/5ZxPc7Tpbofb7YeFzxyfnv9ZKUka1Jn25SfHJGie4JAACAioOwBQCAXLw93DW8TZipbdH24octGdk5+t9K86wWL3fz/27jkzM0ffWR0hcJAAAAl0bYAgDAJa7rUNf0eu+pizp0JqlY136z9YROJaab2j69tau6Nwo2tS3dd+byigQAAIDLImwBAOAS3RvXVO1LTjD6rhhLibJz7Ppg+WFTW7dGwerTNERPDGthaj94JlmxF1Ivv1gAAAC4HMIWAAAu4e5m0zXtzbNbFm0/KcMwCr1u8a5TOn7eHKDcf2WkJKlDRHXV8PU09S0/EOeEagEAAOBqCFsAAMjHpUuJjp9P1faYhEKv+XbbCdPr9hHV1ScyRNIfAU7/ZrVM/csPnL38QgEAAOByCFsAAMhH23pBahTiZ2orbKPcpPQsrY06Z2qb3Kuh6dSjAS1qm/rXRJ1TelaOE6oFAACAKyFsAQAgHzabTddespToh52nlJ1jz3f88gNxyszV5+lu05UtzeFKv6a15JbrxOm0rBxtOHLeeUUDAADAJRC2AABQgGsvWUoUn5yhddHn8h37y57Tptc9m4Qo0Me8R0sNPy91rF/D1LZsP0uJAAAAKhvCFgAACtCklr/a1gsyteW3lCgjOyfPZrdDW4fme88Bzdm3BQAAoLIjbAEAoBCXbpT78+7TefZZWXv4nJIzsh2vbTZpcKv8w5YrmpuXFh09l6rouGQnVQsAAABXQNgCAEAhrm5XV7n2uFVyRnaepT9LLllC1DGiumoH+OR7v9Z1A1U7wNvUtowjoAEAACoVwhYX0bp1a9OvK6+80uqSAACS6gT5qEejmqa23EuJcuyGft17xtQ/tHWdAu9ns9k04JLZLezbAgAAULkQtgAAUIRLlxL9fuCsEtOyJEnbjl9QfHKmqb+wsEWSBrQw79uy4cg5JaVnOaFSAAAAuALCFhexZ88e06/ff//d6pIAAP/vqjZh8nT/ay1RZrbdcfrQpacQNQ8NUMMQv0Lv16dpLXm5//W/4KwcQysPxjuxYgAAAFiJsAUAgCIE+Xrm2dj2u+0nlZVj1y97zEuIhhRwClFu/t4e6tHEvDTpt31nChgNAACAioawBQCAYrh0KdHaw/Ea/tYqHT+famovagnRny49rej3/WeVnWO/vCIBAADgEghbAAAohoEtQuXn5e54bTekQ2fNRzbXq15NresGFut+g1qaZ8okpmVp87ELl18oAAAALEfYAgBAMVTzci/ilCHpiWHNZct9TnQhwoKqqU09czDz216WEgEAAFQGhC0AABTTtZcsJfpTq7BAfXtvb13XoV6J7jeopXkp0a/7zsgwjFLXBwAAANdA2AIAQDH1iQxRq7C/ZqP4ebnrmatb6bspvdUhonqJ73dp2HLsXKoOxyUXMBoAAAAVhYfVBQAAUFF4uLvp01u76vMNx+Tt4abRncMVFlSt1PdrXTdQYUE+OpWY7mj7de9ZRdYOKNb1hmHoxR/3acGWWIUG+mhAi9oa2KK2OjeoUezlTAAAAHA+whYAAEqgTpCPHh3S3Cn3stlsGtQyVHPWH3O0/bbvjO65okmxrv9h5yl9vOqIJOlCapb2n07SB8sPq2fjmpp9ezd5ujOBFQAAwAp8FwYAgIUGXXIE9NbjFxR1NqlY185YcyTf9nXR57Rw24nLrg0AAAClQ9gCAICFejQOVqDPXxNNDUN69/eoIq/bfSJRW48nFNi//ECcM8oDAABAKRC2AABgIW8Pd03q1dDU9t2Ok4ouYqPc2euOFtq/OipeOXZONgIAALACYQsAABa7rXcj+Xm5O17bDem9ZYcLHJ+QmqlF20+a2sZ2q296nZiWpR2xCU6tEwAAAMVD2AIAgMVq+Hlp4iWzWxZuP6Hj51LzHf/l5hhlZNsdrz3dbXp4cFM1re1vGrfqYLzTawUAAEDRCFsAAHABd/RppGqef81uybEben953r1bcuyGPlt/3NR2VZsw1Q7wUb9mtUztKw+xbwsAAIAVCFsAAHABNf29NaFnA1Pbgi2x2n0i0dT28+7TOn7ePONl4v9f17dpiKl9e0yCEtOyyqBaAAAAFIawBQAAF3Fn38by9vjrf83ZdkOPfbVDGdk5kiTDMPTO74dM17SuG6jODWpIkro3qimvXNfn2A2tO8xSIgAAgPJG2AIAgIuoFeCtu/s1NrXtP52kt5f+EbAs3XdW+08nmfqnDIiUzWaTJFXzclf3RsGm/hXs2wIAAFDuCFsAAHAhU65sqhZ1AkxtHyw/rE1Hz+udZeY9XCJr+2to6zqmtkuXEq08yL4tAAAA5Y2wBQAAF+Ll4aZpN7WXh5vN0WY3pBs/XKcdMQmmsVMGRMot1zhJeTbJPZGQptOJ6WVWLwAAAPIibAEAwMW0rhukBwY2LXRMg5q+urpdWJ72ZrUDFODjYWrbfklIAwAAgLJF2AIAgAu654omah8eVGD/vVc0kYd73v+Nu7nZ1D68uqltR2yCk6sDAABAYQhbAABwQZ7ubvpkUlfd3DVC1X09TX1Na/trVMfwAq9tH2EOaS5dfgQAAICy5VH0EAAAYIVaAd56aXQ7/XtkG209nqDVUfGSYWh8jwamI54vdenMll2xibLbjTz7uwAAAKBsELYAAODiPNzd1K1RsLpdcqxzQTpEVDe9TsrIVnR8iiJr+5dBdQAAALgUy4gAAKhkagf6qE6gj6mNpUQAAADlh7AFAIBKKM++LWySCwAAUG4IWwAAqITaX7KUiJktAAAA5YewBQCASqjDJZvk7j11URnZOdYUAwAAUMUQtgAAUAm1CQ+SLdfhQ1k5hvadSrKuIAAAgCqEsAUAgEoo0MdTTWqZTx9iKREAAED5IGwBAKCSan/JUqLVUfHWFAIAAFDFELYAAFBJ9WpS0/R61aE4pWWybwsAAEBZI2wBAKCSurJFbbm7/bVxS3qWXasOxVlYEQAAQNVA2AIAQCVVw89LXRvWMLX9uveMRdUAAABUHYQtAABUYkNa1TG9Xrr/rHLshkXVAAAAVA2ELQAAVGKDW4WaXp9PydSWYxcsqgYAAKBqIGwBAKASiwj2VcuwQFPbkj2nLaoGAACgaiBsAQCgkrt0dsvPe04rO8duUTUAAACVH2ELAACV3JBLwpbYC2mau/G4RdUAAABUfoQtAABUcq3rBqrVJUuJpi05qAspmRZVBAAAULkRtgAAUMnZbDZNvaaVqS0xLUvTfj1gUUUAAACVG2ELAABVQI/GNTWiXZipbe6G49p36qJFFQEAAFRehC0AAFQRTw1vKR/Pv/7Xbzf+WE4EAAAA5yJsAQCgiqhXvZr+1r+Jqe23fWe07fgFiyoCAAConAhbAACoQu7o21jBfl6mNma3AAAAOBdhCwAAVYi/t4fuvcI8u2V1VLzWHT5nUUUAAACVD2ELAABVzC09Gig00NvU9sZvzG4BAABwFsIWAACqGB9Pd025sqmpbeOR8+zdAgAA4CSELQAAVEFjukTkmd3y0cpoi6oBAACoXAhbAACogrw83HR7n0amtp/3nNaR+BSLKgIAAKg8CFsAAKiixnarrwBvD8drw5D+t+KwhRUBAABUDh5FDwEAAJVRgI+nxvdooA9zBSxfbIpRUnq2ekeGKOZCqno3CVGfpiEWVgkAAFDxMLMFAIAq7LbeDeXlbv52YPGuU3rq2136YPlh3TJ9g/7xzU6lZ+VYVCEAAEDFQ9gCAEAVVjvQR08Ma17omHkbYzTq/bVKSM0sp6oAAAAqNsIWAACquDv6NtaLo9rK3c1W4Jh9py7qhR/2lmNVAAAAFRdhCwAA0Lju9TXj1q6qE+hT4Jjvd5zUueSMcqwKAACgYmKDXAAAIEnq16yWVj4xQCkZ2aru66mos8ka8c5qZWbbJUlZOYYWbInV3f2bWFwpAACAa2NmCwAAcPDycFMNPy/ZbDY1DQ3QiLZhpv55G4/Lbjcsqg4AAKBiIGwBAAAFGt+9vun10XOpWhd9zqJqAAAAKgbCFgAAUKDODWqoWai/qW3uhuMWVQMAAFAxELYAAIAC2Ww2jetmnt3y274zSsnItqgiAAAA10fYAgAACjWyYz155DoWOiPbrqX7z1pYEQAAgGsjbAEAAIWq7uul3pEhprbFO09aVA0AAIDrI2wBAABFGtHOfCrRsgNxSmYpEQAAQL4IWwAAQJGGtqojT/e/lhJlZtu1dN8ZCysCAABwXYQtAACgSEG+nnmWEv2w85RF1QAAALg2whYAAFAsI9pespRo/1mdTky3qBoAAADXRdgCAACKZWibOqrm6e54nW03NHfjcQsrAgAAcE2ELQAAoFgCfTw1smNdU9u8jceVmW23qCIAAADXRNgCAACKbUKPhqbXcUkZ+mXPaWuKAQAAcFGELQAAoNha1Q1U14Y1TG2frIqW3W5YVBEAAIDrIWwBAAAlMqFnQ9PrHbGJ+mbbCWuKAQAAcEGELQAAoESualNHDWv6mtpe+mmfLqZnWVQRAACAayFsAQAAJeLp7qZnr2ltaotPztRrvxywqCIAAADXQtgCAABKbECL2hrUMtTUNnvdMf2294xFFQEAALgOwhYAAFAqU69uJW8P87cSjy/YodgLqZIkwzB06EySVh+KV1pmjhUlAgAAWMLD6gIAAEDFVL+mr56+upWeWbjb0XYhNUt9Xl6mJrX8lJ5l14mENElS7QBvvTmmg3pFhlhVLgAAQLlhZgsAACi1W7rX17DWdfK0H45LcQQtknQ2KUPjp2/Q7HVHy7E6AAAAaxC2AACAUrPZbHp5dDs1DvErcqxhSM99t0dRZ5PKoTIAAADrELYAAIDLEuTrqa/v6ZVnw9z82I0/NtIFAACozNizBQAAXLYafl76eGJnfbk5Rj/sPKUavl7q3KCGujcO1qy1xzRv43HH2K+3xOrxoc0V4ONpYcUAAABlh7AFAAA4hc1m05iu9TWma31T+5QrIzV/03HZjT9ep2Tm6NttJzSxZ8PyLxIAAKAcsIwIAACUqXrVq+VZYjRn3TEZhmFRRQAAAGWLsAUAAJS5S2exHDqbrD0nL1pTDAAAQBkjbAEAAGWud2RNhdeoZmpbtP2ERdUAAACULcIWAABQ5mw2m65tX9fU9t2Ok8qxs5QIAABUPoQtAACgXIzsWM/0+szFDG04cs6iagAAAMoOYQsAACgXzUID1DIs0NQ2e+0xi6oBAAAoOxz9DAAAys11Hepq36m/Nsb9ec9p/b7/jLo2DNbyA3FaExWvcymZalLLX30iQ9Q7sqZsNpuFFQMAAJQcYQsAACg3Y7pE6MMVh5WQmuVou23m5jzjftUZfbjisNqHB2nqNa3UuUFweZYJAABwWVhGBAAAyk0NPy89NbxlscfviE3UmP+t17L9Z8uwKgAAAOcibAEAAOXqxs7h6tao+DNVsu2GHpi3TVFnk8qwKgAAAOchbAEAAOXKZrPprZs7qF14kKnd3c2mfs1q6eauEWpY09fUl5SRrbvnbFF6Vk55lgoAAFAq7NkCAADKXVhQNX03pY+Oxqdo09Hz8vJwU68mIaoV4C1Jysqxa8rcrfplzxnHNYfjUvT6rwdLtAwJAADACsxsAQAAlmkY4qcbu0Toug71HEGLJHm6u+nNMR3Vuq75qOiPV0VrbVR8eZcJAABQIoQtAADAJVXzctcbYzrIy/2vb1cMQ7r7sy1aQ+ACAABcGGELAABwWc1CA/Tw4GamtqT0bI3/ZIP6vPy77pq9WYt3nlJmtt2iCgEAAPJizxYAAODS7urXWNuOX9CSvWdM7bEX0hR7IU1L9p5Rs1B/TZ/UVRHBvgXcBQAAoPwwswUAALg0dzeb3rq5ozo3qFHgmINnkjX6g7UcDw0AAFwCYQsAAHB51bzc9fkd3fX40OamjXRzO5uUobvmbFFKRnY5VwcAAGBG2AIAACoEH0933TcgUuuevFI/3N9HL13fVhHB1UxjouNS9Ox3eyyqEAAA4A+ELQAAoELxcHdTm3pBurlbff1wf1+1qWc+HnrBllj9vv9MAVcDAACUPcIWAABQYQVV89R74zrJ39u85//T3+5mOREAALAMYQsAAKjQGtT007PXtDK1nUxM12tLDlhUEQAAqOoIWwAAQIV3Q+dw9WpS09Q2c+1RbY9JsKYgAABQpRG2AACACs9ms+nFUW3l7fHXtzaGIT3y5XYls5wIAACUM8IWAABQKTQM8dODg5qa2qLjUvT3BTtlGIZFVQEAgKqIsAUAAFQad/ZtrLb1gkxti3ed0qdrjlpTEAAAqJIIWwAAQKXh6e6m98d3UlA1T1P7f3/cp2UHzlpUFQAAqGoIWwAAQKUSEeyrN8d0MLVl2w3dPXuLFm0/YU1RAACgSiFsAQAAlc6AFrX1wJWRprbMHLse/GK7Br2+Qv/+Ya/2nrxoUXUAAKCyI2wBAACV0oODmun6jvXytEedTdYnq49oxDur9MmqaAsqAwAAlR1hCwAAqJTc3Wx69cb2Gte9fr79hiH9e/E+fbr6SDlXBgAAKjvCFgAAUGm5u9n04qi2mnZje4X4e+U75qWf9+vYuZRyrgwAAFRmhC0AAKDSG905XOv/MVBf39NTozuFm/oys+167rs9FlUGAAAqIw+rCwAAACgPHu5u6twgWJ0bBCuwmodmrDnq6Ft2IE5ro+LVKzLEugIBAEClwcwWAABQ5TwyuJlqB3ib2l755YAMw7CoIgAAUJkQtgAAgConwMdTDw1qZmrbHpOgb7aesKgiAABQmRC2AACAKunGLuFqUNPX1Pbcd3u09fgFiyoCAACVBWELAACokjzd3fTMiFamtqSMbF3//lqNeHuV3v39kBJTsyyqDgAAVGSELQAAoMoa1CpU17Svm6d9z8mLem3JQV3x2jL9vPuUBZUBAICKjLAFAABUaf8e2Uad6lfPt+9Capbu+Xyr5m44Xr5FAQCACo2wBQAAVGlB1Tz1xV09df+VkQqq5pmn3zCkfy7cpR93McMFAAAUD2ELAACo8rw83PTokOba8vQgzbuzh4a0CjX1G4b00Pzt2nT0vEUVAgCAioSwBQAA4P95uLupZ5Oa+t+EzpoyINLUl5lt152zNys6Ltmi6gAAQEVB2AIAAHAJm82mR4c007ju9U3tCalZun3WZl1IybSoMgAAUBEQtgAAAOTDZrPphWtba2CL2qb2I/EpuvuzLcrIzrGoMgAA4OoIWwAAAArg4e6md8Z1VJt6gab2jUfO67GvdspuNyyqDAAAuDLCFgAAgEL4ennok4ldFRrobWr/fsdJvfDDXhkGgQsAADAjbAEAAChCnSAfTZ/UVb5e7qb2mWuP6oMVhy2qCgAAuCrCFgAAgGJoUy9IH97SWR5uNlP7Kz8f0KLtJyyqCgAAuCLCFgAAgGLq16yWpt3UPk/7U9/s0pH4FAsqAgAAroiwBQAAoASu61BPz1zdytSWkpmjKXO3ckIRAACQRNgCAABQYrf3aaSbuoSb2vacvKj//rjfoooAAIArIWwBAAAoheeuba3I2v6mtplrj+qXPactqggAALgKwhYAAIBS8PXy0HvjOsnbw/zt1ONf7VDshVSLqgIAAK6AsAUAAKCUmtcJ0LPXtDa1XUzP1p2ztyg5I9uiqgAAgNUIWwAAAC7D2G4RGtEuzNS279RFTZm7Vdk5douqAgAAViJsAQAAuAw2m03/vb6tGof4mdqXH4jTc9/vkWEYFlUGAACsQtgCAABwmQJ9PDVjclcF+3mZ2j9bf1zPf7+XGS4AAFQxhC0AAABO0KCmnz6e2Flel2yYO3PtUd05e7PSs3IsqgwAAJQ3whYAAAAn6dwgWK/f1D5P+7IDcXry650sKQIAoIogbAEAAHCiq9vV1ZtjOsjL3fxt1sLtJ/XN1hMWVQUAAMoTYQsAAICTjexYT5/f2V0B3h6m9v/+tE+JaVkWVQUAAMoLYQsAAEAZ6NowWK/e2M7UFp+cqTd+PWhRRQAAoLwQtgAAAJSRYW3CNKhlqKlt9rqj+nn3KYsqAgAA5YGwBQAAoAw9e00reec6ochuSPfN3abPNxyzsCoAAFCWCFsAAADKUESwrx4Y2NTUlmM39M9vd+u1Xw5wQhEAAJUQYQsAAEAZu6d/E43tVj9P+7vLovTGb4csqAgAAJQlwhYAAIAy5uZm04uj2uj+KyPz9L299JCW7DltQVUAAKCsELYAAACUA5vNpkeHNNd/r28rm83c9+iXOxQdl2xNYQAAwOkIWwAAAMrR2G719ezVrUxtSRnZmjB9o04mpFlUFQAAcCbCFgAAgHI2qVdDXdehrqntREKaxn+yQcfOpVhUFQAAcBbCFgAAgHJms9n03+vbqk29QFP7kfgUXffeGv28+zSnFAEAUIERtgAAAFjA18tDsyZ3U5Nafqb2hNQs/e2zLXp4/nalZ+VYVB0AALgchC0AAAAWqenvrc/v6KEWdQLy9C3cflIPfbFddjszXAAAqGgIWwAAACxUJ8hHC+7ppSGtQvP0/bzntP770z4LqgIAAJeDsAUAAMBi/t4e+t+EznpjTHv5ebmb+j5edURz1h+zqDIAAFAahC0AAAAuwGazaVTHcH08sYs83GymvmcX7db3O05aVBkAACgpwhYAAAAX0isyRC+NbmdqsxvS/fO26dEvd7BpLgAAFQBhCwAAgIu5oXO4HhjYNE/711tjNWH6BqVmZltQFQAAKC7CFgAAABf08KCmurlrRJ72TUcv6P6525SdY7egKgAAUByELQAAAC7IZrPpv9e31Ws3tpe/t4epb+n+s7pj9mYlpmZZVB0AACgMYQsAAICLstlsuqFzuL76W08FVfM09S0/EKfRH65V7IVUi6oDAAAFIWwBAABwcS3DAvXJpC7y8jB/6xZ1NlnXvbtGX2w8zsa5AAC4EMIWAACACqBrw2DNnNxVIf7epvZzKZl68ptdGv7WKh2NT7GoOgAAkBthCwAAQAXRq0mIFk3praa1/fP0Rcen6IYP12pXbKIFlQEAgNwIWwAAACqQetWracHfeqlXk5p5+uKTMzX6w7V6e+khjocGAMBChC0AAAAVTJCvpz67vbs+nthFTWr5mfoys+16/deDGvLGSu0/fdGiCgEAqNoIWwAAACogNzebBrcK1cL7euc7yyX2QprG/G+9th6/YEF1AABUbYQtAAAAFViAj6dmTO6qq9uF5elLTMvSjR+u0zMLd+vgmSQLqgMAoGrysLoAAAAAXB5vD3e9M7ajRnaopzd+O6g9J/9aPpRjNzRn/THNWX9MjUP8NKR1HU3u3VChgT4WVgwAQOXGzBYAAIBKwGazaVCrUC34Wy9d0bxWvmOi41P04YrDGvH2ah3hmGgAAMoMYQsAAEAlUs3LXR9N6KJx3evLZst/THxyhh6av112u1G+xQEAUEUQtgAAAFQyXh5uenFUW616YoD+1r+J3N3ypi47YhL0/c6TFlQHAEDlR9gCAABQSYXX8NWTV7XQLw/11a29Gubpf+mn/TrKciIAAJyOsAUAAKCSi6wdoOeuba2PJnQ2tZ9KTNcVry3XfXO3Kik9y6LqAACofAhbAAAAqojBrULVuUGNPO2Ld57Sg19sl2GwhwsAAM5A2AIAAFBF2Gw2vTy6rYL9vPL0/b7/rK59d40e/XKHFmyJZfNcAAAuA2FLMZw4cUJvvvmmhgwZovr168vLy0t16tTR6NGjtWHDBqvLAwAAKLbI2gH6/v4+Gt0pPE/frhOJ+nprrB77aode/HGfBdUBAFA5ELYUwzvvvKOHH35Y0dHRGjJkiB599FH16dNHixYtUq9evTR//nyrSwQAACi2etWradpN7fXB+E4Fjvlk9RHtPpFYjlUBAFB5eFhdQEXQrVs3LV++XP379ze1r1q1SgMHDtQ999yjkSNHytvb26IKAQAASm5Ymzoa1rqOft5zOt/+T1ZF682bO5ZzVQAAVHzMbCmG66+/Pk/QIkl9+/bVgAEDdOHCBe3atcuCygAAAErPZrPpjTEddG37uvn2/7DzlKLjksu5KgAAKr4yD1vOnj2rH374QVOnTtVVV12lkJAQ2Ww22Ww23XrrrSW617Fjx/Too4+qRYsW8vPzU3BwsLp27apXX31VqampZfMARfD09JQkeXgwSQgAAFQ81bzc9fbYjlr99wGac3s3ebn/9e1htt3QNe+s1ucbjllYIQAAFU+ZJwShoaFOuc/333+vW265RRcvXnS0paamavPmzdq8ebM++eQTLV68WJGRkU55v+I4fvy4fvvtN4WFhalt27bl9r4AAADOFl7DV+E1fDW+R33NWHPU0Z6SmaN/frtb0XEpenpES9lsNuuKBACggijXZUT169fXkCFDSnzdtm3bNGbMGF28eFH+/v76z3/+o7Vr12rp0qW68847JUkHDx7UiBEjlJSU5Oyy85WVlaUJEyYoIyNDL7/8stzd3cvlfQEAAMrSo0Oaq3Etvzzt01cf0VtLD1lQEQAAFU+Zz2yZOnWqunbtqq5duyo0NFRHjx5Vo0aNSnSPBx98UGlpafLw8NCSJUvUs2dPR9+VV16ppk2b6oknntDBgwc1bdo0Pffcc3nu8eijjyojI6NE79m0adN8++x2u2699VatXLlSd955pyZMmFCi5wEAAHBV/t4emn9XT/3z211asveMqe/N3w5p3eFz+s+otoqs7W9RhQAAuD6bYRhGeb5h7rBl0qRJmjlzZqHjN27cqO7du0uS7r77bn344Yd5xtjtdrVp00b79u1T9erVdfbsWcdeKn/y9/dXSkpKsetctmyZrrjiinzf67bbbtOsWbN0yy23aNasWXJzc/4EodjYWEVEREiSYmJiFB4e7vT3AAAAKMw3W2P16Fc7lN93iw9cGalHhjQv/6IAAHCysvj87fKnES1cuNDx9eTJk/Md4+bmpokTJ0qSEhIStGzZsjxjkpOTZRhGsX8VFLRMnjxZs2bN0tixYzVz5swyCVoAAABcwfWdwvXCta3z7Xv79yh9tTmmnCsCAKBicPmkYPXq1ZIkPz8/de7cucBxuY9mXrNmjdPr+DNomT17tsaMGaM5c+awTwsAAKj0JvRsqCkD8j+A4N+L9+l8SmY5VwQAgOtz+fOK9+3bJ0mKjIws9HjlFi1a5LnGWf5cOjR79mzdeOON+uyzzy47aImNjS20/9SpU5d1fwAAAGd5dEgz1Q/21fzNMdpy7IKjPTEtS9OWHNB/RnEqIwAAubl02JKenq74+HhJKnLNVI0aNeTn56eUlBTFxDh3SusLL7ygWbNmyd/fX82aNdO///3vPGNGjhypDh06FPuef64HAwAAcHU2m003dY3QTV0jdN/crVq8868fCn2+4bi+2hKriBrV9ORVLTW4VaiFlQIA4BpcOmzJfYyzv3/RO97/GbYkJyc7tY6jR49K+mPfl//85z/5jmnYsGGJwhYAAICK6OkRLbV03xmlZ9kdbZnZdh2OS9HdczZrzu3d1TsyxMIKAQCwnkuHLenp6Y6vvby8ihzv7e0tSUpLS3NqHTNnzizy1KSSKmr2zalTp9StWzenvicAAMDlCguqptt6N9L7yw/n6bMb0hMLdurHB/sqqJpnPlcDAFA1uHTY4uPj4/g6M7PozdcyMjIkSdWqVSuzmpyFo5wBAEBF9dCgZjqZkKaF20/m6TuRkKYeLy7Vo0Oa6fY+jWSz2SyoEAAAa7n0aUQBAQGOr4uzNCglJUVS8ZYcAQAAoHS8PNz05s0dtfiBPnpnbMc8/WlZOfr34n16a+khC6oDAMB6Lh22+Pj4qGbNmpKKPr3nwoULjrCFzWcBAADKXuu6QbqmfV19e28veXnk/bby7aWHtOpQnAWVAQBgLZcOWySpVatWkqSoqChlZ2cXOG7//v2Or1u2bFnmdQEAAOAPHevX0Nw7uqtH42BTu92QJkzfqEfmb1d6Vo5F1QEAUP5cPmzp06ePpD+WCG3ZsqXAcStWrHB83bt37zKvCwAAAH/p0jBYX9zVU/dfGZmn75ttJ/TMwt0WVAUAgDVcPmwZOXKk4+sZM2bkO8Zut2v27NmSpOrVq2vAgAHlURoAAAAu8dCgZureKDhP+1dbYvXV5hjl2A0LqgIAoHy5fNjSrVs39e3bV5I0ffp0rVu3Ls+YadOmad++fZKkBx98UJ6eHDUIAABgBXc3mz69tasm9WyQp+/xBTvV8YUlmrPuaPkXBgBAOSrzo59Xr16tqKgox+v4+HjH11FRUZo5c6Zp/K233prnHm+99ZZ69+6ttLQ0DRkyRE899ZQGDBigtLQ0ffHFF/roo48kSc2aNdOjjz5aJs8BAACA4vHz9tDz17VR67pBeuLrnaa+i+nZembRHoUH+2pA89oWVQgAQNmyGYZRpnM5b731Vs2aNavY4wsq5/vvv9ctt9yiixcv5tvfrFkzLV68WJGRedcJV0SxsbGOU5ViYmIUHh5ucUUAAAAlYxiG7py9Wb/tO5unz8vdTav+PkChgT4WVAYAwF/K4vO3yy8j+tM111yjnTt36uGHH1azZs3k6+ur6tWrq0uXLnr55Ze1bdu2ShO0AAAAVAY2m02v3tBe/ZrVytOXmWNX9xeX6pmFu5WVY7egOgAAyk6Zz2xB6TCzBQAAVBaGYehIfIqunLYi3/7qvp56cVRb9W4SoiBf9t4DAJSvKj2zBQAAABWTzWZT41r+emV0u3z7E1KzdO/nWzXsrZU6fi61nKsDAMD5CFsAAABQLm7qGqFXb2in9hHV8+0/lZiuZ7/bXb5FAQBQBghbAAAAUG5u7BKhRff11gNX5r/X3rIDcVp1KK7AQxMAAKgICFsAAABQ7u4f2FTju9eXn5d7nr4J0zfqtpmblJyRbUFlAABcPsIWAAAAlDtPdzf9Z1Rb7XlhmMZ0icjTv+xAnJ77bo8FlQEAcPkIWwAAAGCp8T3qy2bL275gS6z2n75Y/gUBAHCZCFsAAABgqXbh1fXCdW3y7fts/bFyrgYAgMtH2AIAAADLTejRQLueG6LrO9YztX++4bgSU7MsqgoAgNIhbAEAAIBLCPDx1GNDm8st15Iiw5AGvbFCR+NTrCsMAIASImwBAACAy6hbvZqubBFqaotLytBtMzcpM9tuUVUAAJQMYQsAAABcyqNDmsn3kiOho+NT9Pv+MxZVBABAyRC2AAAAwKW0DAvUvDt7KMTfy9T+t8+2auaaI8qxGxZVBgBA8RC2AAAAwOW0j6iuBwY2zdP+3Pd79eTXO2UYBC4AANdF2AIAAACXNLR1Hdlsedu/2hKrrzbHln9BAAAUE2ELAAAAXFJooI9GdqiXb98/F+7SvlMXy7kiAACKh7AFAAAALuvfI9vo2vZ187Rn5Rga+d4anbmYbkFVAAAUzsPqAvCH1q1bm15nZWVZVAkAAIDr8PP20NtjO+rtsR319wU7NX9zjKMvI9uut5Ye0h19Gsnf20O1A30srBQAgL8wswUAAAAVwjPXtFLtAG9T29wNx3XltBXq+dLven95lEWVAQBgxswWF7Fnzx7T69jYWEVERFhUDQAAgOvx9/bQ7Nu7adibq/L05dgNvfbLAfVvVkut6wZZUB0AAH9hZgsAAAAqjBZ1AnV7n0b59tkN6addp8u5IgAA8iJsAQAAQIXy+NDm6lS/er597y6L0gPztunLTTHKyM4p38IAAPh/hC0AAACoUHw83fXZHd11zxVN8u3/bsdJPfH1To3533oCFwCAJQhbAAAAUOH4enno78Na6OC/r5Kfl3u+Y7bHJGj+pph8+wAAKEuELQAAAKiwvDzc1KdpSIH9Uxft0aNf7tD+0xfLsSoAQFVH2AIAAIAK7cGBzVTD17PA/q+3xmrUe2sVHZdcjlUBAKoywhYAAABUaK3qBmrZY1fo/fGd9P2UPmpRJyDPmLSsHL2//LAF1QEAqiLCFgAAAFR41X29NLxtmNqGB+neAZH5jlmwJVYbos/JMIxyrg4AUNUQtgAAAKBSuaZdmJ68qkW+fWM+Wq9G//hRKw7GlXNVAICqhLAFAAAAlYrNZtPf+jfR/n8N05BWofmOmfL5ViWmZpVzZQCAqoKwBQAAAJWSj6e7pt3UXp3qV8/Tl5SRremro8u/KABAlUDYAgAAgEorwMdTH07oLH9vjzx97yyL0ow1R5SWmWNBZQCAyoywBQAAAJVa7QAffTKpi6p5upvaDUN6/vu9ajn1Z32x8bhF1QEAKiPCFgAAAFR6PRrX1L5/DdPYbvXz7X/ym136adepcq4KAFBZEbYAAACgyvjXda01ol1Yvn33fL5VDZ9crLkbmOUCALg8hC0AAACoMjzc3fTP4S3l5V7wt8FPfbtLzyzcrYxs9nIBAJQOYQsAAACqlLrVq+nVG9sVOmbO+mMa/cFaXUjJLKeqAACVCWELAAAAqpzrOtTTkf8O171XNClwzO4TF3X7rE1KSs+SYRjlWB0AoKIjbAEAAECVZLPZ9MSwFpo+qUuBY7YeT1Db55ao+4tLtSYqvhyrAwBUZIQtAAAAqNIGtgzVyscHqGP96gWOOZuUofGfbNDkGRu1PSah3GoDAFRMhC0AAACo8urX9NU39/TSB+M7qV+zWgWOW3YgTiPfW6MJ0zfofD77uWRm28uyTABABUHYAgAAAOiPZUVXtQ3T7Nu66Yu7esjLo+BvlVcdilenf/2qYW+uVFxShlIzszVh+gY1e/onDXtzpQ6dSSrHygEArsZmsNuXS4qNjVVERIQkKSYmRuHh4RZXBAAAULUcjkvWu79H6dttJ4oc6+XhZprV0qtJTc29s0dZlgcAcJKy+PzNzBYAAAAgH01q+euNMR30w/191CcypNCxly4fWnv4nNYdPleW5QEAXBhhCwAAAFCINvWC9Nkd3bXruSFqUNO32NeN/Xi99p++WIaVAQBcFWELAAAAUAwBPp76bkofTb26VbGvGf7WKtntrNoHgKqGsAUAAAAopqBqnrqtTyMdfWmEhretU+R4uyGN/2SDDrJhLgBUKR5WFwAAAABURK/e0F51AqtpffQ5dahfXduOJ2jfqbzLhtZFn9OQN1ZKkt4Y014jO9STzWYr73IBAOWIsAUAAAAoBT9vD0295q8lRd/tOKkH5m0r9JqH5+/QyYR03TcgsqzLAwBYiGVEAAAAgBOMaBumGzoXfVzoq78c0ImEtHKoCABgFZthGOzY5QJat25tep2VlaVDhw5Jct453wAAACh7hmHo9/1ndfuszUWO9fVy1/f391GTWv7lUBkAID+xsbGKiIiQ5LzP38xsAQAAAJzIZrNpYMtQbXl6kCb3bljo2NTMHA2ctkJXv7NK55IzyqdAAECZY2aLiyqLZA0AAADlb866o3r55wNKzsgucuz74zupW6Nghfh7l0NlAACpbD5/s0EuAAAAUIYm9GyoCT0bakP0Od06Y5PSsnIKHHvv51slSZN7N9TUq1txahEAVFAsIwIAAADKQffGNfXdlN4a2aFukWNnrDmqxk/9qMNxyeVQGQDA2QhbAAAAgHLSNDRAb97cUfteGKaGNX0LHWsY0sBpKzRjzRElZ2QrMS1L7AAAABUDe7a4KPZsAQAAqNwupmdp6b4zkqTpq49o94mLRV7TLNRfc27vrtBAn7IuDwCqDE4jAgAAACqJQB9PjeoYrlEdw/XD/X314wN9i7zm4Jlkjft4vex2fl4KAK6MsAUAAABwAa3qBuqRwc2KHHc4LkWNn/pRS/acVnohm+0CAKxD2AIAAAC4iAcGNtXKxweoZVhgkWPvmrNFLZ75Wb/vP1MOlQEASoKwBQAAAHAh9Wv66qcH+2rVEwPk7+1R5PjbZm5WwycXa9qSAywvAgAXQdgCAAAAuKCIYF/teHaI3rq5Q7HGv/N7lBo/9aMe/2qHYi+klm1xAIBCEbYAAAAALsrdzabrOtTTwX9fpVduaFesa77aEqs+Ly/TJ6ui2dMFACxC2AIAAAC4OC8PN93UJUJHXxqhH+7vo4Etahd5zb8X71P3F5dq2YGzWrrvjLJy7OVQKQBAkopeBAoAAADAZbSpF6Tpt3bVmYvpmjB9gw6eSS5wbGJalibP2CRJal03UN/e21teHvy8FQDKGv/SAgAAABVQaKCPljzcX2+O6VCs8XtOXtTURbsVc579XACgrBG2AAAAABXYdR3qakS7sGKN/WJTjPq+skwfLD9cxlUBQNVG2AIAAABUYDabTe/c3FFf39NTH0/sUqxrXv55v6Yu2q2MbDbQBYCyQNgCAAAAVHBubjZ1bhCswa1CNef2bsW6Zva6Y2r+9M96e+mhMq4OAKoewhYAAACgEunbtJaeGNZczUMDijX+9V8PquGTi/Xl5hgZhlHG1QFA1UDYAgAAAFQy914RqV8e7qejL43Qbb0bFeuaJxbs1JNf7yJwAQAnIGwBAAAAKrGp17TSb4/0V4eI6kWOnb85Ro3+8aPWR58r+8IAoBIjbAEAAAAqucja/lp4X2/NmNxVd/drrKa1/Qsdf/NH6/XV5phyqg4AKh8PqwsAAAAAUD4GNK+tAc1r6x/DWyo9K0d3zt6sVYfi8x37+IKd2n0iUc9d21o2m62cKwWAio2ZLQAAAEAV5OPprjm3d9emfw4qcMysdcfU6B8/6u45m5WexTHRAFBchC0AAABAFVYrwFuHXxyuxrX8Chzzy54zajn1Zy3ddybPBrpfbo5Rm2d/Uad//aql+86UdbkAUCEQtgAAAABVnLubTUsf6a/HhzYvcIxhSLfP2qxG//hRialZkqSUjGw9990eJWdk63xKpp5euFt2O6cZAQBhCwAAAADZbDbdNyBSyx67osix7V9YovSsHO05eVGpmX8tLzqVmK7TF9PLsEoAqBgIWwAAAAA4NArxU9R/rlJkEScWtXjmZ0WdTc7Tfj4ls6xKA4AKg7AFAAAAgImHu5sW/K2nejauWei4p77dladtyZ7TZVUWAFQYhC0AAAAA8qju66W5d3bX9Z3qlei6t3+PKqOKAKDiIGwBAAAAkC+bzabXb+qgr+/paXUpAFChELYAAAAAKFTnBsE69J+rNKpj8Wa5pOXaNBcAqiLCFgAAAABF8nR30xtjOmjTPwdpYIvahY5dsCWmnKoCANdE2AIAAACg2GoFeOuTSV0KHfPMoj0yDKOcKgIA10PYAgAAAKBEbDab9r4wVM9c3Up9m4bkO+bFH/eVc1UA4DoIWwAAAACUmK+Xh27v00hzbu+uZqH+efo/XnXEgqoAwDV4WF0A/tC6dWvT66ysLIsqAQAAAErm6f9r777Do6ryP45/Jp0QWiAYkEioAhJASqQFRJoS21oWVKQpsrjYwFXAXVBWJLiuumtFkSbLKjZ+IlWq9B6alABJSAgdkgCpk8zvD3SWMEmYJDe5k8z79Tw8z8y955z7HeQ45MO550a20KAZWx2O7zx+UW1vqWFCRQBgLla2AAAAACiRiCa1FBlWx+H4Qx9vVJY114SKAMBcrGxxEfv378/zPjExUSEhISZVAwAAADjPYrHooyfaatHYRQ7nVh08o7tbBptQFQCYh5UtAAAAAAzRu8VNDsee/c8OEyoBAHMRtgAAAAAwRNRDYQ7Hcm3Sgl0nTKgGAMxD2AIAAADAEDUDfDXh3hYOx1/8OlrWHPZuAeA+CFsAAAAAGKZd/fyfPvTCV9FlWwgAmIiwBQAAAIBhWtWrpsfCb3E4vmjvSR0+fcmEigCg7BG2AAAAADCMxWLRlIfCdHP1Sg7n+rz3i177YS+3FAGo8AhbAAAAABju9ftvy/f4f7Yc1z3/WqfcXFsZVwQAZYewBQAAAIDhejWvXeC5mDOXteHouTKsBgDKFmELAAAAAMNZLBatHNO9wPNPfrFVW2MvlGFFAFB2CFsAAAAAlIpGQQGKndKvwPN/nLaJTXMBVEiELQAAAABKjcVi0dSHwwo83+e9X/TKt7uVnJZVhlUBQOkibAEAAABQqu5tVbfQ8/O3J6rNpJ+1Le7qbUU2G5vnAijfvMwuAAAAAEDFVtnXS3tf76Ow15cX2u7RTzfZX/dqXlsfPNZWlXw8S7s8ADAcK1sAAAAAlLoqft5a90oPp9uvOHBGzScs1f0frteUJQd0KiWjFKsDAGMRtgAAAAAoEyGB/vrqmY5F6rMnMUXT1h5TxykrdSI5vZQqAwBjEbYAAAAAKDMdG9bU4ucjitW3S9QqhY5dpCuZVoOrAgBjEbYAAAAAKFMt6lbVkcn3aECHkGL1v23iMh06xSOjAbguwhYAAAAAZc7L00NRD7dS7JR+eqRdvSL37/v+Lwodu0iNxy/WhStFe2x0akY2e8AAKFWELQAAAABMY7FY9PbDrbT0xQg937OJ/nD7zXq5T1On+1tzbWr79581fd0xp9r/cvisukxZpY5TVmr019E8ZhpAqbDY+L+LS0pMTFRIyNVllQkJCapXr+hpPwAAAFCeWXNy1fi1JUXq06lhTVWr5K1Bneurc6NaDuf/8PEG7TqebH//03Nd1fLmaiUtFUA5Vho/f7OyBQAAAIBL8vL00LpXeqi6v7fTfTYdO6+l+0/p8c+3KHTsIi3ddyrP+WuDFkn6z5bjRpQKAHkQtgAAAABwWSGB/oqe0EexU/rp+2c7q0YRghdJ+tPcHTp7KbOQFiz0B2A8whYAAAAALs9isajtLTW0a0IfffR42yL1nbr0oJLTsvLdn8XTw2JUiQBgR9gCAAAAoFyJbFVHcVGR2jyup1Ptv92RqDaTftZ7Px92ODd3M7cRATCel9kFAAAAAEBxBFfzU1xUpLJzcvXhqiP618qYQtv/e9WRMqoMgLtjZQsAAACAcs3b00Mv9Gyiu28LNrsUAJBE2AIAAACgAvDwsOjTJ9vp2z91KnLfhAtppVARAHdG2AIAAACgwmgfGqj5I4oWuES8vTrfzXMBoLgIWwAAAABUKOENAvX5oPZF6rMg+kQpVQPAHbFBLgAAAIAKp3eLmxQXFSlJstlsajBucaHtX/p6t35NStWgTqEKCfQvixJd1pnUDP11wT4dv5CmoV1C1b/DLWaXBJQ7rGwBAAAAUKFZLBYtf6nbDdt9vi5WEW+v1u6E5NIvyoW9veyQlv96WgdPXdKr3+3V8fPsaQMUFWELAAAAgAqv6U1VFBcVqSUvRNyw7QMfbdAzc7YrOye3DCpzPd/uSMzz/oNVhT9SG4AjwhYAAAAAbqN5nao69lY/jerRuNB2y389rSavLdGaQ2fcfvPci2nZZpcAlDuELQAAAADcioeHRS/3vVX/Hd7xhm2HzNymBuMW63KmtQwqc02e/NQIFBnTBgAAAIBb6tSopg6/eY9Tbe//cL1S3HSFx+qDZ80uASh3CFsAAAAAuC0fLw+tHNP9hu2Onb2i1pOW6+nZ2zTh//Ypupib6GZk5+jMpQzl5pafW5Oy3HTvGqAkCFsAAAAAuLWGtSqrdb1qTrVdceCM5myK14MfbVBScnqRrnPkzCX1enetwiev1JMztig9K6c45QIoBwhbAAAAALg1i8WiuU/fob9GNtc9LYOd7tc5apWsRVj18eGqI0q8eDWg2XDkvJb/eqrItZrF3TcJBoqKsAUAAACA26vi562nIxrqk4HtFBcVqUZBlZ3q1/i1Jdoae8Gptguik/K8n7zoQJHrLG0Xr2Tle7zBuMVae/isDp5KLeOKgPLJy+wCAAAAAMDVzBoaroi3VzvV9o/TNkmSDv79bvl5ezp9DS8PS7FqM5rNZtPAL7Zow5HzhbYbPGOr/fX+N/qqsi8/TgIFYWULAAAAAFwnJNBfcVGROvj3u53u0+xvS7X64Bmn23uYHLZkWnMUOnaRGoxbfMOg5Xq3TVxW6Pksa672nUjRucuZJSkRKLeIIl3Ebbfdlud9drZ7PlYOAAAAcCV+3p6Ki4rU1tgL9hUshRk6a5skad0rPRQS6F9oW0+TwpYTyel6cvoWHTt3pUTjrPj1tHq1uMnheHpWjv44bZP2nkhRVT8vzRzaQe3qB5boWkB5w8oWAAAAALiB8AaBGt27qdPtI95erbmb4wvdWDb+fJoRpRXJ2sNn1SVqVYmDFkl6es72fB9h/f2uRO09kSJJSs2w6u8/ud7eNEBpY2WLi9i/f3+e94mJiQoJCTGpGgAAAADXe6ZbQ73782Gn2/91wT59uyNR34/sbPotQzabTQ3GLTZ83GYTlurwm/fkOfbFutg876MTkg2/LuDqCFsAAAAAwAl+3p7aPK6n+v17nS4U8NSe60UnJKvh+MWq7JP/xrk2m00WS+kGMSsPnNZTs7c73f7zQe3V+7fbg9KyrJqxPlafrj2my5lWh7ZZ1lydvZSpoCq+9mO5PCYaIGwBAAAAAGcFV/PTzr/11uVMq/q+94tOJKc71e9KVk6+xw+fvqxbg6sYWWIey/af0ogvdzjVNr+nKfn7eGnUXU006q4mys7JVZPXljj06zB5RZ6++dxZBLgd9mwBAAAAgCIK8PXShrF3acPYu0o0zr9XxRhSz+VMq0bO3aGwicv0zJztupSRref+u8upoGXNy3cqLiryho+t9vb00IAO+W910OxvS+2vWdkCsLIFAAAAAIrt5uqVdGDS3Tp8+pJurlFJr/2wV8v2n3a6/6I9J7VozyL7+1lDO+jOW2sXuY4Fu05oyb5TkqTlv57Wf7ce18LdSYX2Wf9qD9WrUfgTk64X9XArfbUtId9zczfHa2DH+iJrAVjZAgAAAAAlUsnHU61DqqtWgK+mPdleO//Wu9hjDZm5Tc3+tkT3f7heR89edrrfXxfsy/P+rcUHC2w74d4WiouKLHLQ8rt5w+8osAZrTi4rWwARtgAAAACAoQIr+2jzuJ5qE1K9WP0zsnO1JzFFPf+5VnEGPKL5Wh8/0VbDujYo0RidG9Uq8Fzj15boZEqGw/GUtOwSXRMobwhbAAAAAMBgwdX8tODPXRQXFal1r/Qo9jh3vrNGoWMXaV3M2RLX9OHjt6tfWJ0SjyNJcVGRRWrfetJyRS0peLUNUNEQtgAAAABAKQoJ9FdcVKQOv3mP3vpDWLHGePKLrXp7afHDijcfbKl7W9Utdv/8HH7zniK1/3TtUZ1Mce7pTUB5R9gCAAAAAGXAx8tDj99xi+KiIlXZp/An/+Tn4zVHlWXNLXK/oV1CNbBj/SL3uxEfLw+tGN29SH2W/raJL1DREbYAAAAAQBnbOaG33v1ja1ksRet34UpWka818b7bitzHWY1rB+i7kZ2cbn/iIitb4B4IWwAAAACgjPl6eeqhtvUUOyVSI7o1dLrfzuMXi3SdkjwZyVnt6gfK18u5Hy2TuI0IboKwBQAAAABMNK5fc617pYdWjumuMb2bFtr22f/sVMzpS06PHVjZp6TlOeWQk/u3HDzlfO1AeUbYAgAAAAAmCwn0V6OgAD3Xs4nioiLtv/LT+71fnBrz9ftaGFniDR17q9+N25w19lHWgKsibAEAAACAcub/ok/csM2gTqGlX8g1PDwsOvTm3Tds99OeJJ1I5nYiVGyELQAAAADgoh4LvyXf4y98Fa2nZ29XSlp2gX09PIq4+64BfL08FRcVqXWv9Ciwzah5u9QlapX2JCY7nLPm5GrG+li9tfiA4s+zCgblF2ELAAAAALioZ+9sVOC5FQdOq/Wk5Qodu8jh3PCIBqVZ1g2FBPpr2pPtCm1z/4cbdORM3j1copYc1KSfftVnvxzTfR+sV3pWTmmWCZQawhYAAAAAcFEhgf7F6nfnrbUNrqTo+t4WrNgphe/j0uvdX/TP5Yfs76evj7W/Ts2wav72hFKrDyhNhC0AAAAA4MLeuP+2IvdpV79GKVRSdBaLRbOHhRfa5oNVR3TrX5fo1W/3OJw7evZyaZUGlCrCFgAAAABwYYM7h+q7kZ10c/VKTvfx8/YsxYqKJqJxrRu2ybTm6ut8VrF4WMp+3xnACIQtAAAAAODi2tUP1Iaxd2ntX+40u5QiK8lGvb9nLSnp2TpzKcOgioDSR9gCAAAAAOVE/ZqV9fmg9oW2+fZPncqoGufFRUUWq59FFq349bRav7Fc4ZNX6vn/7jK4MqB0ELYAAAAAQDnSu8VNmnhfi3zPeVik9qGBZVyRc4oTuHhYpKfnbLe//3F3kg6dulRID8A1eJldAAAAAACgaIZ2aaDuTYOUlpWjZsFVtObQWfn7eqpTw5pml1aoo2/1U6Pxi51uvysh2eHYyP/s0Koxd0qS3l56UJ+uPao61Srp04HtFFavmkGVAiXDyhYAAAAAKIcaBgWo5c3V5OXpoV4tblLnRrVkcfENZT09LFr3Sg+n2++Iv+hw7NjZK5KuPqno4zVHlWuTTiSn692fDzm0BcxC2AIAAAAAKDMhgf5a9mK3Yvf3/G3D3U/WHM1zfPWhsyWqCzASYQsAAAAAoEzdGlxFnw5sW6y+Vfyu7oaRm2szsiTAUIQtAAAAAIAyd3fLOlr6YkSR+9nDFhthC1wXYQsAAAAAwBTNgqtq3xt9i9Qn4UK6JCknn6zlUka2EWUBJUbYAgAAAAAwTYCvl+YNv6NIfeZujtf2uAsOx7tErXI4NmXxATUct0jd3l6t/Ukpxa4TKArCFgAAAACAqTo3qqWFo7o63f6vC/bpZEqGw/HUDKsOnkq1vz98+pKm/XJMuTbp+IU0vb8ixpB6gRshbAEAAAAAmC6sXjW93KdpicfZcux/K14+WHUkz7mffz3t0P7MpQx9tPqIvtuRKBv7wMAgXmYXAAAAAACAJI26q4neWX64RGNM/HG/BnWqr21xF7XygGO4kpGdo01Hz2tz7Hl1blRLf/lmt85cypQkxZ67opf73lqi6wOSZLER3bmkxMREhYSESJISEhJUr149kysCAAAAgNJns9nUYNxi064fFxVp2rVhjtL4+ZvbiAAAAAAALsNisSguKlKfPdnO7FKAYiNsAQAAAAC4nD63BWvn33qbXQZQLIQtAAAAAACXFFjZR3FRkWpdr1qZXTPLmltm10LFRdgCAAAAAHBp/zeqqwZ3ql8m1xrw2SaeSoQSI2wBAAAAALi8Nx5oqbioSG0e17NUr7PzeLJ2xF8s1Wug4uPRzwAAAACAciO4mp/ioiJ1JdOqE8npGvvdHu08nmzoNb7bmaj2oYGGjgn3wsoWAAAAAEC5U9nXS01vqqLvn+2iuKhIjejW0LCx/7s1QXsSkw0bD+6HsAUAAAAAUO6N69fc0PHu/3CD3l1+yNAx4T4IWwAAAAAAyMe/Vx3R8fNpmr7umFYfOmN2OTeUac3RN9sTtHB3knJz2eTXTOzZAgAAAACoEH56rqvu/WC9oWN2+8dq++spD4XpsfBbDB3fGbm5Nu1KSFZgZR81qFW5wHbDZm3ThiPnJUkbj57TlIdalVWJuA4rWwAAAAAAFULLm6uV6vjjvt+r91ccVkZ2jmFjLt13Si9/s1tfbT0um82m7JxcpWf9b3ybzaZhs7fp4U82qte7a/XdjsR8x4k5fcketEhX953Jzsk1rE4UDStbAAAAAAAVRvSE3moz6edSG//9FTGKO3dF7w+4vcRjbY29oD/N3SFJ+nZHon7YdUJbYi/Yz8dO6adtcRe15tBZSVJOrk1jvtmth9vVcxgr7nyaw7GcXJu8PUtcJoqBsAUAAAAAUGFU9/dRXFSkJCkty6ofo5P03orDOp2aadg1FkQnGRK2jP9hb5731wYtkrRs/ylFJ6SU+Dooe4QtAAAAAIAKyd/HSwPCb9GA8FuUZb16S83eE8ka//0+HTp9qcTjp2VZlW21qZq/t/1YTq5N3+1IVGpGtv7YIURV/bwL7H/kzOVCx//T3J0a0d25R1rbbGyI60oIWwAAAAAAFZ6P19UtS9vVD9Syl7pJurrxbMPxi4s13uqDZ/T8f3fpUqZVz3RrqCc71teaQ2c0b2uCDpxMlSTN356gZS92k8ViMeZDFKIkUcuO+IuKWnJA3p4emnBfCzULrmpYXe6KsMVF3HbbbXneZ2dnm1QJAAAAALgHDw+Loh4K09jv99648XUm/LhPlzKtkqTPfjmmz3455tDm8OnL2nTsvDo3qqXTqRma+H/7dTI1Q89ENFRkqzpOXWfaWsdx85PfwhZnFrvk5to0cu4Onbl09TarF7+K1tIXuzl1TRSMpxEBAAAAANzWgGI+yjnhQrpT7eLOXd24dsriA1q6/5R2JyTrz/N2aum+k8W6blH0ff8X/XP5IV24kqUrvwVD19uVcNEetEjSwVOXlJyWVeq1VXSsbHER+/fvz/M+MTFRISEhJlUDAAAAADCCx293EC2ITspz/E9zdxZ7zPSsHFXyuf4xQ47LWI5fSNMHq47og1VHJEmfPNFW94TlXVGTme34eOhctn8pMcIWAAAAAABKydjv92p7/EVDx7z978s1+cEwJadna82hM3q0fYi8PG68L8zI/+zUqB6NlZSSriGdQ9WqXnVD68L/ELYAAAAAAFCKvt2RaOh4Gdm5GvPNbvv7dTHn5OPp3C4hH66+usrlpz0nte21XsrKcVzZgpJjzxYAAAAAgFsLrelvdgklVtTQJMuaq89/OaYhM7c5nLt2jUxGdo7Ss3JKWJ37IWwBAAAAALi1H5/ranYJpvh9lcv10rKvhisLdyfp9kk/q+XryzR9XcFPRcrJtenXpFSdSc0olTrLI24jAgAAAAC4tap+3maX4FK6RK3S/BGdNP77vUr/LXh5c9EB9e8Qoiq//V5lZOdo9sY4XcnK0coDp7U/KVWVvD318RNt1aNZbTPLdwmsbAEAAAAAuL2tr/U0uwSX8rcF+3TpusdFb4u7YH89en60piw5qH+vjNH+pFRJUnp2jobO2iabjccZEbYAAAAAANxe7Sp+Wjmmu9lluIxDpy85HFu+/7Qe+2yzXv5mtxbvPVVg3wbjFutvC/a5dehC2AIAAAAAgKRGQQHa+3ofs8twWV9tS9CmY+ederrSl5vjtSshufSLclGELQAAAAAA/KaKn7eOvdVPVf3Y4rSk3l1+2OwSTMOfHgAAAAAAruHhYdGe1/va3+fk2tRo/GITKyqfrt/zxZ2wsgUAAAAAgEJ4elgUFxWpB9rUNbuUcmW3G99GxMoWAAAAAACc8K8Bt+tfA27XucuZ+nJTvPx9PDVlyUGzy4ILYmULAAAAAABFUCvAVy/1bqoR3RspLipSAb6sY0Be/IkAAAAAAKAE9r3RVynp2fLx9JBNNrWYsMzskmAywhYAAAAAAEqoWiVv++u4qEilpGVrz4lkjf1ur04kp5tYGcxA2AIAAAAAgMGq+XsrokmQNoy9Szm5NiWnZamKn7dmbYzVW4vZ56WiI2wBAAAAAKAUeXpYVDPAV5L0TLdGeqZbI529lKmvtx3XO8sPm1wdSgMb5AIAAAAAUMaCqvhq1F1NtO+NvgpvEKjuTYPULyw4T5unuzbQx0+0NalClAQrWwAAAAAAMEmAr5fmj+gkSUq4kKajZ67o0OlLuqtZbY3pc6sq+XgqLipSkpSba9OlDKuilh7Uf7cet49xR4NAbYm9YEr9yB9hCwAAAAAALiAk0F+LX4hQljVXft4eslgsec57eFhUzd9bUx4K05SHwvKcy7Lmqulfl5RluSgEYQsAAAAAAC7C08OiSj6eRe7n4+Wh2Cn9lJ6dI29PD3l7eujH3Uka/XW0rLm2UqgUhSFsAQAAAACgArBYLPL3+d+P+fe3rqv7W9dVwoU0pWZk60xqpm4NrqLe767VlawcEyut+NggFwAAAACACiwk0F+31a2mHs1qq271Slr/6l15zlf1Yx2G0fgdBQAAAADAjdSo7KNDb96tExfTdVNVP1X2vRoNnLmUoa2xF7TywBn9sOuEyVWWb6xsAQAAAADAzfh6eaphUIA9aJGk2lX8dG+runqvfxvFRUUqLipSwyMaSJJ8PD10b6s6RbrGyjHdDa25PGFlCwAAAAAAyNdrkS30ct9b5WmxyMvTQxPuy9Czc3cqKydXQ7uE6qWvd+fb718D2qhRUEAZV+s6CFsAAAAAAECBfL3+93Sk2lX89O3Izvb31Sv56LUf9io1w6q3HgpT9yZBquTjKR8v976RhrAFAAAAAAAUS49mtbVxXE+zy3A57h01AQAAAAAAGIywBQAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMRNgCAAAAAABgIMIWAAAAAAAAAxG2AAAAAAAAGIiwBQAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMRNgCAAAAAABgIMIWAAAAAAAAAxG2AAAAAAAAGIiwBQAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMRNgCAAAAAABgIMIWAAAAAAAAAxG2AAAAAAAAGIiwBQAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBvMwuAPmzWq321ydPnjSxEgAAAAAAKq5rf+a+9mfxkiBscVFnz561vw4PDzexEgAAAAAA3MPZs2cVGhpa4nG4jQgAAAAAAMBAFpvNZjO7CDjKyMjQ3r17JUlBQUHy8ip4EdJdd90lSVq1apXT4xelj7NtT548aV+Fs3XrVtWpU8fpeiqq4vy3KStm1FYa1zRqzJKMU9pz0Nn2zEFHrjwHpbKvr7Su5w7zkO/C4nPlecgcNG4cvgtdlyvPQYl5aOQ4fBcWn9Vqtd9dEhYWJj8/vxKPyW1ELsrPz08dOnRwqq23t7ckqV69ek6PX5Q+xRm/Tp06RWpfURXn966smFFbaVzTqDFLMk5pz8HitGcOXuXKc1Aq+/pK63ruMA/5Liw+V56HzEHjxuG70HW58hyUmIdGjsN3YckYcevQtbiNCAAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQG+TCMImJiQoJCZEkJSQklJt784CKgjkImI95CJiLOQiYj3l4FStbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAOxZwsAAAAAAICBWNkCAAAAAABgIMIWAAAAAAAAAxG2AAAAAAAAGIiwBQAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQtcxrZt29SvXz9Vr15dlStXVseOHTV//nyzywLcxty5czVixAi1b99evr6+slgsmjVrltllAW7jxIkTev/999WnTx/dcsst8vHxUXBwsB5++GFt2bLF7PKACi8jI0OjR49Wt27dVLduXfn5+Sk4OFhdunTRzJkzlZ2dbXaJgNuZOnWqLBaLLBaLNm/ebHY5RWKx2Ww2s4sAVq9erb59+8rPz08DBgxQlSpV9N133yk+Pl7vvPOOxowZY3aJQIUXGhqq+Ph41apVS5UrV1Z8fLxmzpypIUOGmF0a4BbGjh2rqVOnqlGjRrrzzjsVFBSkmJgYLViwQDabTfPmzVP//v3NLhOosM6dO6eQkBCFh4eradOmCgoK0sWLF7VkyRLFx8erT58+WrJkiTw8+PdqoCzs27dP7du3l5eXl65cuaJNmzapY8eOZpflNMIWmM5qtapZs2ZKTEzU5s2b1aZNG0lSSkqKwsPDFRcXp8OHD6t+/frmFgpUcCtWrFCTJk1Uv359RUVFady4cYQtQBn6/vvvVbNmTXXv3j3P8XXr1qlnz54KCAjQyZMn5evra1KFQMWWm5srq9UqHx+fPMetVqt69+6tNWvW6KefflJkZKRJFQLuIzs7Wx07dpS3t7eaNGmiuXPnlruwhVgWplu1apWOHj2qxx9/3B60SFK1atU0fvx4ZWVlafbs2eYVCLiJXr16EWoCJnrooYccghZJioiIUI8ePXTx4kXt3bvXhMoA9+Dh4eEQtEiSl5eX/vCHP0iSjhw5UtZlAW5p8uTJ2r9/v2bMmCFPT0+zyykWwhY3d+bMGf3000+aMGGC7rnnHtWqVct+T1xR/zU7Pj5eY8aMUbNmzVS5cmUFBgaqQ4cO+sc//qG0tLQC+61Zs0aS1KdPH4dzffv2lSStXbu2SLUA5YkrzEPA3bn6PPT29pZ09Yc+oCJy5TmYm5urpUuXSpJatmxZ5P5AeeBKc3Dnzp2aPHmyJk6cqBYtWhTzE5mPb2w3d9NNNxkyzsKFCzVw4EClpqbaj6WlpWn79u3avn27pk+frkWLFqlx48YOfWNiYiRJTZo0cTgXHBysgIAAexugInKFeQi4O1eeh8ePH9eKFStUp04dhYWFGVIn4GpcaQ5mZWXprbfeks1m0/nz57Vy5UodPHhQQ4cOVc+ePQ2pE3A1rjIHMzMzNWjQILVp00avvPKKITWZhZUtsLvlllvyXV1yI7t27VL//v2VmpqqgIAATZ48WRs3btTKlSs1fPhwSdLhw4cVGRmpS5cuOfRPSUmRdPW2ofxUrVrV3gao6MyahwD+x5XmYXZ2tp588kllZmZq6tSp5XYpNVAUZs/BrKwsvfHGG5o0aZI++ugjHTp0SC+//LI+++yzYn8moDwxcw5OmDBBMTExmjlzZvn/zrPBrU2YMMG2cOFC26lTp2w2m80WGxtrk2STZBs8eLBTY0RERNgk2by8vGwbN250OP/222/bx5w4caLD+d69e9sk2WJiYvIdv27duraqVas6/ZmA8sYV5uH1pkyZYpNkmzlzZhE+CVB+ueI8zMnJsT3++OM2Sbbhw4cX5eMA5Y6rzsGEhATbxx9/bKtevbqtS5cutpSUlKJ8LKDccIU5uHHjRpuHh4dt0qRJeY4PHjzYJsm2adOmIn8uMxG2II+iTqotW7bY248YMSLfNjk5ObbmzZvbJNmqV69uy8rKynP+kUcesUmybd++Pd/+AQEBtpCQkCJ/FqC8MmMeXo+wBe7O7HmYk5Nj/8vlwIEDbTk5OcX9KEC5ZPYcvN78+fNtkmyvvPKK032A8qys52B2dratSZMmtjZt2jjMzfIatnAbEUpkwYIF9tdDhw7Nt42Hh4cGDRokSUpOTtbq1avznP99r5b89mU5deqULl++nO9+LgCuMmIeAigZI+dhbm6uhg4dqtmzZ+uxxx7TrFmz5OHBX9mAwpT2d+Hvt1T8/mAHAHmVdA5evnxZMTExio6Olo+Pj31zXovFYn8ybadOnWSxWPJcy5XxzY0SWb9+vSSpcuXKateuXYHtrn2U5YYNG/I9t3z5cod+y5Ytc+gPIC8j5iGAkjFqHv4etMyZM0f9+/fXl19+Wf7vWQfKQGl/FyYlJUn635PBAORV0jno6+urp556Kt9fv//D+/3336+nnnpKoaGhpfMhDMbTiFAiBw4ckCQ1bty40MdRNmvWzKHP73r27KmGDRtq3rx5ev7559WmTRtJVzfOfeutt+Tj42NPQAE4MmIeAigZI+Zhbm6uhg0bpjlz5ujRRx/V3LlzCVoAJxkxB3/99VeFhobK398/z/G0tDSNHj1aktSvXz+jSgYqlJLOwUqVKmn69On59hkyZIhiYmI0btw4dezY0aCKSx9hC4otIyND586dkyTVq1ev0LY1atRQ5cqVdeXKFSUkJOQ55+XlpenTp6tv377q1q2bBgwYoCpVqui7775TfHy83nnnnXKTXgJlzah5KEnTp0+3/6vE3r177cd+XzLdtWtXPf300wZWD1QMRs3DSZMmafbs2QoICFDTpk315ptvOvR/8MEH7f8oAeAqo+bg/Pnz9e6776pr164KDQ1V1apVdeLECS1ZskTnz59XRESEXnrppVL7HEB5ZeTfRysSwhYU27WP6woICLhh+98n1eXLlx3O9ejRQ+vXr9fEiRP19ddfKzs7W2FhYZo6dar69+9vaN1ARWLkPFy/fr39ntjfbdiwIc8ST8IWwJFR8zAuLk7S1fvWJ0+enG/f0NBQwhbgOkbNwXvvvVdJSUnauHGjNm3apMuXL6tatWpq1aqVBgwYoGHDhhX6L/aAuzLy76MVCf+3QLFlZGTYX/v4+Nywva+vryQpPT093/Ph4eFasmSJMcUBbsLIeThr1izNmjXLsNoAd2HUPGQOAsVj1Bxs37692rdvb2xxgBsw+ufC65XX70c2yEWx+fn52V9nZWXdsH1mZqakq/fjATAG8xAwH/MQMBdzEDAXczB/hC0otipVqthfO7ME7MqVK5KcW1oGwDnMQ8B8zEPAXMxBwFzMwfwRtqDY/Pz8VLNmTUlSYmJioW0vXrxon1QhISGlXhvgLpiHgPmYh4C5mIOAuZiD+SNsQYm0aNFCknTkyBFZrdYC2x08eND+unnz5qVeF+BOmIeA+ZiHgLmYg4C5mIOOCFtQIl27dpV0dSnYjh07Cmy3du1a++suXbqUel2AO2EeAuZjHgLmYg4C5mIOOiJsQYk8+OCD9tczZ87Mt01ubq7mzJkjSapevbp69OhRFqUBboN5CJiPeQiYizkImIs56IiwBSUSHh6uiIgISdIXX3yhTZs2ObT55z//qQMHDkiSXnjhBXl7e5dpjUBFxzwEzMc8BMzFHATMxRx0ZLHZbDazi4B51q9fryNHjtjfnzt3Tn/5y18kXV3W9fTTT+dpP2TIEIcxdu3apS5duig9PV0BAQEaP368evToofT0dH311Vf67LPPJElNmzbV9u3b8+xWDYB5CLgC5iFgLuYgYC7moPEIW9zckCFDNHv2bKfbF/THZeHChRo4cKBSU1PzPd+0aVMtWrRIjRs3LladQEXGPATMxzwEzMUcBMzFHDQetxHBEPfdd5/27Nmjl156SU2bNpW/v7+qV6+u9u3ba+rUqdq1a5dbTCjATMxDwHzMQ8BczEHAXMzB/2FlCwAAAAAAgIFY2QIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQIQtAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIEIWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQIQtAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIEIWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAXFhcXJ4vFIovFolmzZpldDgAAcAJhCwAAcElr1qyxhwzO/nrxxRfNLhsAAICwBQAAAAAAwEheZhcAAABwIyNHjtSzzz57w3a1atUqg2oAAAAKR9gCAABcXu3atdWyZUuzywAAAHAKtxEBAAAAAAAYiLAFAABUWKGhobJYLBoyZIgkadu2bXrssccUEhIiPz8/hYSEaOjQoTp48KBT4y1cuFCPPPKI6tWrJ19fX9WsWVOdOnVSVFSULl++7NQY+/bt03PPPaewsDDVqFFD3t7eCg4OVq9evfT222/r5MmTNxzj559/1n333afg4GD5+vqqQYMGGjlypBITEwvtl5SUpLFjx6pt27aqVq2avL29ddNNNyksLEyPPfaYZs2apdTUVKc+BwAAKJjFZrPZzC4CAADgemvWrFGPHj0kSRMnTtTrr79e5DFCQ0MVHx+vwYMHq1u3bhoxYoSsVqtDO19fX3355Zd69NFH8x0nIyNDjz/+uH744YcCr1W3bl0tWrRIbdq0yfd8Tk6O/vKXv+j9999XYX/9Gjx4cJ5HPMfFxalBgwaSpJkzZ+rQoUOKiorKt29QUJDWrl2r5s2bO5xbt26d7r333huGKQsXLtS9995baBsAAFA49mwBAAAVXnR0tObNm6fatWtr3LhxCg8PV0ZGhhYvXqz3339fmZmZeuKJJ9SgQQO1b9/eof/gwYPtQUvr1q01ZswYNW/eXBcuXNBXX32lWbNmKSkpST179tSePXt08803O4zxzDPPaMaMGZKkOnXqaNSoUercubOqVaums2fPauvWrfr2228L/Ryff/65Nm7cqO7du2vEiBFq2rSpkpOTNWfOHM2ZM0dnz57VsGHDtGnTpjz9MjMzNWDAAKWmpqpKlSoaOXKkevToodq1aysrK0uxsbHauHFjoWESAABwHitbAACAS7p2ZYuzTyO69dZb5e3tbX//+8oWSapfv742b96s4ODgPH1Wr16tPn36yGq1qkOHDtq6dWue84sWLbKv9OjZs6cWL14sHx+fPG0+//xzPfPMM5KkP/7xj/r666/znP/xxx/1wAMPSJI6deqkxYsXq3r16vl+hoSEBIWEhNjfX7uyRZKGDx+uadOmyWKx5Ok3fPhwTZ8+XZK0c+dO3X777fZzq1atUs+ePSUVvnLFarUqLS1NVatWzfc8AABwDmELAABwSdeGLc6KjY1VaGio/f21Ycu3336rhx9+ON9+zz77rD755BNJV/d1uXZ1S79+/bRkyRJ5e3vr6NGjeYKQa/Xu3VsrVqyQl5eXjh8/rjp16tjPde7cWZs2bZK/v79iYmJUt25dpz/TtWFLnTp1FBsbK19fX4d2hw4dUrNmzSRJ//rXv/T888/bz82bN09PPPGEJCklJYUwBQCAUsYGuQAAoMKrUaOGfWVJfoYNG2Z/vWLFCvtrq9WqtWvXSpL69OlTYNAiXV1Z8nufNWvW2I+fP39emzdvliT179+/SEHL9R555JF8gxbp6qqegIAASdKxY8fynLs2+Jk5c2axrw8AAJxD2AIAAFzexIkTZbPZbvjr2lUt17r99tvl5VXwVnVt2rSx3xq0d+9e+/Fjx44pLS1NknTHHXcUWuO15/ft22d/HR0dbd8QNyIiovAPegO/r1wpSI0aNSRJly5dynO8a9euatiwoSTpxRdfVHh4uKZMmaINGzYoKyurRDUBAABHhC0AAKDCq127dqHnvby8FBgYKEm6cOGC/fi1r280xrV7wVzb79y5c/bX164wKQ5/f/9Cz3t4XP2rXU5OTp7j3t7eWrhwof0pRdu2bdP48ePVtWtXVa9eXXfffbfmzZvn0A8AABQPYQsAAKjwrt9M1qwxzNSiRQvt3btXP/zwg4YNG6bGjRtLktLT07Vs2TI98cQTuuOOO3TmzBmTKwUAoPwjbAEAABXe6dOnCz1vtVrtq1F+X+Fy/esbjXHq1Kl8+9WqVcv++uTJk84VXEo8PT314IMP6osvvlBMTIySkpI0Y8YMtWvXTpK0Y8cOjRgxwtQaAQCoCAhbAABAhRcdHS2r1Vrg+d27d9v3LmnZsqX9eMOGDe237mzZsqXQa1z7yOhrx7j99tvtq2J++eWXohdfiurUqaOhQ4dq06ZNatu2rSTpp59+Unp6usmVAQBQvhG2AACACu/ChQtauHBhgednzJhhf92rVy/7ay8vL3Xv3l2S9PPPPysxMbHAMaZPn27vc+edd9qPBwYGqnPnzpKk+fPnKykpqVifoTR5e3vbP6fValVycrK5BQEAUM4RtgAAALcwevTofG8FWrt2rT777DNJUrt27dShQ4c85//85z9LkrKysvTUU08pOzvbYYwZM2Zo+fLlkqSHHnrIYSPcV199VZKUlpamRx99VCkpKQXWWVigU1zr1q3TkSNHCjyflZVlf8R1QECAgoKCDK8BAAB3UvAzEAEAAFzEmTNn8jxOuSCVKlVSo0aNHI63bt1av/76q9q1a6dx48YpPDxcmZmZWrx4sd577z1ZrVZ5eXnpo48+cugbGRmpRx99VN98842WL1+ujh07avTo0WrWrJkuXryor776yr4yJjAwUO+++67DGPfdd5+eeuopffHFF9q4caNatGihUaNGqUuXLqpatarOnTun7du36+uvv1br1q01a9asov8mFWLlypX6+9//roiICEVGRqpVq1YKCgpSenq6Dh8+rE8//VQ7d+6UJD311FOFPiYbAADcGN+kAADA5X3yySf65JNPbtiudevWio6Odjjepk0bjRo1SiNHjtSoUaMczvv4+Gj27Nm644478h13zpw5slqt+uGHH7Rz504NHDjQoU3dunW1aNEi3XzzzfmOMW3aNFWqVEkfffSRkpKSNH78+AI/Q2nIzc3V2rVr7StY8vPAAw9oypQppXJ9AADcCWELAABwC08//bRatmyp9957T+vXr9e5c+cUFBSknj176tVXX1WLFi0K7Ovn56fvv/9eCxcu1KxZs7R582adO3dOlStXVtOmTfXggw9q1KhRCggIKHAMT09PffDBBxo6dKimTZumNWvW6MSJE8rKylLNmjXVqlUr3X333XryyScN/+wvv/yyWrVqpRUrVmjXrl1KSkqyP+I5ODhY4eHhGjRokCIjIw2/NgAA7shis9lsZhcBAABQGkJDQxUfH6/BgwcbfmsOAABAQdggFwAAAAAAwECELQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMxNOIAAAAAAAADMTKFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBA/w8owsiOHsB89QAAAABJRU5ErkJggg==",
"text/plain": [
""
]
@@ -203,12 +106,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 5\n"
+ "Time step 5\n",
+ "RMSE 0.003940328763365609, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACYLElEQVR4nOzdd3xV9f3H8fdNbvYkjCSQIHujggIOEMECjrqK1YK7/bXWqrVVa+1ydGqtVeuotVoH7qp1FGcVZMmQJYQZwsoii+xx7809vz8Cl5ybdRNucu69eT0fjzy453vPPfdzSFDum+/387UZhmEIAAAAAAAAfhFmdQEAAAAAAAChhLAFAAAAAADAjwhbAAAAAAAA/IiwBQAAAAAAwI8IWwAAAAAAAPyIsAUAAAAAAMCPCFsAAAAAAAD8iLAFAAAAAADAjwhbAAAAAAAA/IiwBQAAAAAAwI8IWwAAAAAAAPyIsAUAAAAAAMCPCFsAAAAAAAD8iLAFAAAAAADAjwhbAAAAAAAA/IiwBQAAAAAAwI8IWwAAAAAAAPyIsAUAAAAAAMCPCFsAAAAAAAD8iLAFAAA/Wrp0qWw2m2w2m84+++w2zzt6js1m89t7X3fddZ5rPv/88367rr/t27fPU+eQIUOsLqfHBMv3BwAAHD/CFgBAwLvjjjtMH84Nw+jSdcrKyhQVFcUHXiDAPf/886ZA0vsrKipKAwYM0JQpU/SjH/1Iy5Yt8/nazcO+o18DBgyQy+Xy+RqNjY1KT09vcZ19+/Z1+NqDBw/qD3/4g+bNm6fMzEzFxcUpIiJCycnJGjNmjM4//3z96le/0vvvv6/q6upO3UdnvpYuXerz/QIAOo+wBQAQ8K699lrP4/379+uLL77o0nVee+01ORwOSVJcXJwuu+wyv9TXm/XWWSqwlsPhUHFxsb766iv9/e9/18yZMzVr1iwdPHiwS9crLi7Whx9+6PP5H3/8sQoLCzv1HvX19brjjjs0dOhQ/frXv9Ynn3yi3Nxc1dbWyuVyqaKiQjt37tSHH36oP/7xj7rooouUkpKiL7/8srO3AwAIAHarCwAAoCMTJ07UpEmTtHHjRknSiy++2O4Snba8+OKLnsfz589XfHy8v0oE0E0SEhJ0zTXXmMbq6+u1f/9+rVy5UnV1dZKalvDNnj1bq1evVt++fTv9Pi+++KIuvPBCn8/tDIfDoYsvvliffPKJZywyMlKnnnqqhg8frtjYWFVWVmrfvn3atGmT556cTqdqamp8eo9rrrlGCQkJPtc0aNCgTt0DAKBzCFsAAEHh2muv9YQtb731lp544gnFxMT4/Ppdu3ZpzZo1putZqatLoULB8SwFQ++TkpKixx9/vNXnSktL9aMf/UhvvPGGJCk7O1v33nuvHnvsMZ+vP27cOG3btk3vv/++ysvLlZyc3O75FRUVevfdd02v7cj999/vCVpsNpvuvPNO3XXXXa2+l9Pp1NKlS/XGG2/o1Vdf9fk+7rvvPmaXAUAAYRkRACAoLFy4UBEREZKkyspKvfPOO516ffN/iR48eLBmzZrlz/IAWKBv37565ZVXNGXKFM/Yc889J6fT6fM1rr76aklSQ0ODXn/99Q7Pf+ONN1RfXy9JLWbctMbpdOrhhx/2HP/2t7/V/fff32aoExERoTlz5uif//yncnNzNWnSJB/uAgAQaAhbAABBoX///jrvvPM8x52Zxm8Yhl566SXP8dVXX+3XXYAAWCc8PFw333yz57impkbr16/3+fULFy6U3d402duX/64cPSciIkILFy7s8Py1a9eqvLzc85pbb73V59qSk5O7tCQKAGA9whYAQNBovvTn008/9blB5RdffKH9+/d7jr3/NbqiokKvvvqqbrjhBk2bNk39+vVTZGSkEhMTNXz4cC1YsEBvvPGG3G63f25End/6+Z133tHFF1+sQYMGKSoqShkZGZozZ44WLVrUqV1UJKmurk7vvPOOfvzjH2v69OlKTU1VZGSk4uPjNWTIEF166aV69tlnPc2EW3N0t5ihQ4d6xvbv39/mzifNdaWp7urVq3XzzTdr/Pjx6tOnj6Kjo5WRkaFzzz1Xjz/+uE99Le69917P+957772SJJfLpRdffFHf+MY3PL+36enpuuSSS/Tf//7Xp9q6S3V1tf72t79p3rx5ysjIUHR0tPr06aMJEybo5ptvNi2L68jBgwd133336ayzzlJqaqqioqIUGRmpvn376qSTTtLChQv197//vd0/U06nUy+99JK+9a1vadiwYYqPj5fdbldCQoJGjBihefPm6e6779batWv9cfudcvLJJ5uO8/PzfX7tgAEDdO6550qSVq1apT179rR57t69e7Vy5UpJ0rnnnqv+/ft3eP28vDzP45SUlE71VQEABDEDAIAg0dDQYKSkpBiSDEnGQw895NPrrr/+es9rTj/9dNNzb731lhEVFeV5vr2vk046ycjJyWn3vZYsWeI5f+bMmW2e1/y67amqqjLOP//8duuaPn26UVBQYFx77bWeseeee67V661evdqIj4/36X6HDBlibNiwodXrPPfccz5do7V73Lt3r2f8hBNOaPf+q6urjSuuuKLD66enpxsffPBBu9e65557POffc889Rm5urnHGGWe0e93rr7/eaGxsbPe6vvLl+3PU+++/b6SlpXV43wsXLjRqamravdY//vEPIyYmxqfv05lnntnqNXbu3GmMHTvW5+/37t27u/rbZBiG+eero58RwzCMXbt2md7/5ZdfbvPc5j9/koy6ujrjjTfe8Bzffffdbb723nvv9Zz373//26irqzNda+/evS1e8+9//9vzvM1mM6qrq335LeiQ93209t4AAOvQIBcAEDQiIyO1YMECPfHEE5KapvPfdttt7b6mrq5Ob775pufYuzFuUVGRGhoaJEkZGRkaN26c0tLSFBsbq+rqam3fvl0bNmyQYRjavHmzzjrrLG3atKlHpvY7nU5dcMEFWrZsmWcsLS1NZ511lhISEpSdna0VK1ZoxYoVuvTSSzVs2LAOr3n48GFVV1dLavoX/fHjxysjI0NxcXGqra1Vdna21q5dK5fLpX379mnmzJnasGGDRowYYbrO2LFjddNNN6mqqsqzrKK1XWOOR21trWbPnm2aKTFw4EDNmDFD8fHxnvtvbGxUQUGBLrroIr366qs+beldXV2tc889V1u3blVsbKxmzJihzMxMVVVVacmSJSoqKpLU1P9j9OjR+vnPf+63++rI66+/riuvvFKNjY2SmpbJTJ8+XSNGjFB1dbWWL1/umbnxyiuvaO/evfr8888VHR3d4lrvvPOObrjhBs9xYmKiTj/9dGVkZMhut6uiokK7du3S1q1b25zJVFVVpW984xuebZXDwsI0adIkjR07VvHx8aqtrVVeXp42b96skpISf/92+MR7JktqamqnXn/RRRcpOTlZ5eXleumllzyzoLwd/Vnv06ePLrzwQp8aPQ8fPtzz2DAM/fnPf9Z9993XqfoAAEHI4rAHAIBOWbt2relfc7/++ut2z3/55Zc950ZFRRmHDx82Pf/ee+8Zf/rTn9r9l/icnBxj3rx5nut873vfa/Ncf85s+e1vf2v6F/E//OEPhsvlMp2zc+dO46STTjIkGZGRkT7NbPnlL39pbNmypc33PXTokHH11Vd7rnXOOee0eW5nZql09jU33nij57zw8HDjkUceaTHLZNeuXcYpp5ziOS8xMbHNf+FvPrPl6Gyma6+91igtLTWdV1NTYyxYsMBzbnx8vF9mI/gysyU7O9s082jq1KktfjYbGxuNhx56yAgLC/Ocd8stt7R6vZNPPtlzzs0339zmLJiqqirjjTfeMH7+85+3eO6RRx7xXGPcuHHGjh07Wr2G2+021q5da9x4443GgQMH2vmd6FhnZ7b84he/8JwfERFhlJWVtXluazNbDMMwfvCDH3jGli1b1uJ1y5cv9zx/ww03GIZh+DSzxe12G0OGDDH9Wb7qqquML7/80nC73b79hvhwH8xsAYDAQtgCAAg6zZcz3HHHHe2e2zwkufzyy7v8ng6HwzjxxBMNSUZ0dHSbH+b8FbaUl5cbsbGxnnPuvffeNq9VVFRkpKenm67Z0TIVX5x33nme623btq3Vc7orbMnOzjaFCY8//nib1ysrKzN9mL3++utbPa952CLJWLBgQZvXrKurMzIzMz3nvvbaaz7dW3t8CVuuueYazzkjRowwysvL27zeX//6V8+5YWFhLZa4VVVVeZ7PzMzs8gf7+fPne67z6aefdukandWZsGXbtm1GQkKC5/yFCxe2e35bYcvKlSs9Y//3f//X4nXf//73Pc+vWrXKMAzfwhbDMIw333zTdN7Rr759+xrnn3++cffddxvvv/9+uyFRR/dxzTXXGDfddJNPX4888ojP7wMA6BrCFgBA0Ln//vs9HzAGDhzYYrbHUfn5+UZ4eLjn3MWLFx/X+z7wwAOea7333nutnuOvsOXJJ5/0PJ+RkWE0NDS0W9vTTz/t97Dl9ddf91zvb3/7W6vndFfY8vOf/9xzzsknn9xhUNC81qioqFZDiuZhS2RkpFFQUNDuNe+8807P+bfddptP99aejsKWw4cPm/oHvf322+1er7Gx0Rg/frzn/Lvuusv0fF5enun3sKvmzJnjuc6mTZu6fJ3O6Chsqa+vN3bu3Gn8+c9/NpKTkz3njhkzxigsLGz32m2FLYZhGCNGjDAkGUlJSabxuro6z/uMHDnSNO7r7JJnnnnGiI6ObjV0aT7rZerUqcZjjz1men9f7qMzX+39twkA4B/0bAEABJ2rrrpKv/zlL+V2u5Wfn6///e9/mjdvXovzXn75ZU/fi7S0tFbPaa68vFyrV69WVlaWSktLVV1dbdqBaMeOHZ7HmzZt0oUXXuinO2ppyZIlnsdXXHGFIiMj2z3/O9/5jm6++eZ2dxDyVltbq9WrV2vLli0qLi5WVVWV5/dLMu+ismnTJt+L94PPP//c8/i6667rcNemSy+9VCkpKSorK1NDQ4O+/PJLzw4zrZk+fbrS0tLaveakSZM8j/ft2+db4cdh1apVnv5B/fr16/DnKywsTN/97nd1++23SzL/zBy9RnR0tOrr67V161atXLlSZ555ZqfryszM9Dx+6qmn9Pe//73T1zgeR3e5ak9YWJguueQSPfHEE53u19Lc1VdfrXvuuUcVFRV69913dcUVV0iS3n33Xc/2zVdffXWXrv29731Pc+bM0QMPPKBXX31Vhw8fbnGOYRhau3at1q5dqwceeECLFi3S2Wef3dXbAQBYiLAFABB0Bg0apG984xv65JNPJEmLFi1qNUg52sxSkq688kqFh4e3er3c3FzdddddevPNNz0fdjvS3Y1AN27c6Hl8+umnd3h+QkKCJkyYoA0bNnR4bllZme6++269+OKLqqqq8qmenmx8ahiGKdw544wzOnxNRESEpk6dqo8++kiStGHDhnbDlokTJ3Z4zeZNkCsrKzs8/3g1/55PnTpVdnvHf01rHp5s3LhRhmF4gonIyEhdcskleu211+RyuTR79mxdccUVuuyyy3TWWWcpOTnZp7ouv/xy/etf/5LUFLasX79e1157rebNm9eicbJVLrroIj377LM+31Nbrr76at17770yDEMvvviiJ2w5+t8Sm83W5bBFkgYPHqwnnnhCDz/8sNasWaPly5dr3bp1Wr9+vacB8VG5ubmaM2eOFi9erLlz53Z47b179/q8lToAoPsRtgAAgtK1117rCVv+85//qLq6WvHx8Z7nN27cqC1btpjOb83GjRt1zjnntPqvzO3xNaToquLiYs/jwYMH+/SawYMHdxi27N+/X2eddZYOHDjQqXq6+36bq6iokNPp9ByfcMIJPr2u+QfNjsKhpKSkDq8XERHhedy8nu7S/HvelXt2OByqqqpSYmKiZ+zhhx/W+vXrtXv3bjkcDi1atEiLFi1SWFiYxo8frxkzZmjOnDk677zzFBUV1ep7zJs3T7fccosee+wxSdK6deu0bt06SU27/kyfPl1nn322LrnkEmVkZHT2tjvkvcuVy+VSfn6+Nm7cqNzcXElNuy7l5OTos88+U79+/br8XkOHDtX06dO1fPlyffLJJzp06JAkef5bM2PGDL8EGpGRkZoxY4ZmzJjhGdu3b5/efPNNPfLII55ZZS6XS9dcc41ycnIUGxt73O8LAOg5YVYXAABAV1x66aWeD5W1tbWm7Z0l86yWSZMmtTqToaGhQfPnz/cELf3799evf/1rLVmyRAcPHlRNTY3cbreMph5neu655zyvbb68qDsc3Z5Zks8fsuLi4jo8Z+HChZ6gJSEhQT/96U/10UcfKScnR9XV1WpsbPTcb/NlKd19v801v3fJt/vyPq+jcKijZSlWaH7fXblnqeV9p6Wl6auvvtKvf/1r0/Iat9utLVu26Mknn9Sll16q9PR03X///aZlZM397W9/09tvv62pU6eaxg8dOqS33npLt9xyiwYPHqzLLrus00FeR1JSUvT44497vp566im999572rt3r5599lnPltdff/21X7YePxrMulwuvfLKK3rllVfkcrlMz3WHIUOG6I477tC2bdtMS4cOHTqk119/vdveFwDQPQhbAABBKSYmRt/+9rc9x4sWLfI8drlcevXVVz3HbX1Aeuutt7R3715JTUuTNm/erN/97nc6++yzlZGRodjYWNOH8p6c3dF8lk5tba1Pr6mpqWn3+VWrVmnVqlWe669evVp//etfNW/ePA0dOlRxcXEKCzv2V4OevN/mmt+71PF9tXZeQkKCX2vqCc3vuyv3LLV+34mJifrd736nvLw8rV69Wg8++KAuueQS0wyQw4cP6xe/+IXmz58vwzBafa9LL71Ua9as0f79+/XCCy/ohhtu0Lhx4zzPG4aht956S5MnT9auXbt8qv942O12ffe739UzzzzjGfvwww/1wgsvHNd1v/3tbysmJkZSU2h79Hre/83pLomJiVq0aJFp2ePy5cu7/X0BAP5F2AIACFrNQ5SlS5d6eh58/PHHnun/ERERWrhwYauv/+yzzzyPf/KTnyg9Pb3d99u/f//xluyz/v37ex77OlPAu+eDt+b3e+2115o+KLemJ++3uaSkJNMSHl/vv3kT2+NZSmKVrnzPm99zZGRkuyFTeHi4pk2bpjvuuEP/+c9/dOjQIS1fvlwXXXSR55x3331Xb731VrvvOXjwYF1zzTV66qmnlJWVpQMHDui+++7zzMAqLS3Vbbfd5lP9/nDllVea7uE3v/mN6uvru3y9xMREXXzxxZKaGkNv3rxZknTJJZf0WIiXkZGh8ePHe44LCgp65H0BAP5D2AIACFrTp0/XsGHDJDUti3jppZckmZcQnXfeeaYPsc3l5+d7HvvSMHXZsmXHU26nNN8JZ/Xq1R2eX11dra1bt7Z7Tnfcb3csx7HZbDr55JM9x0dn47TH5XJ5+ohI0uTJk/1eV3dr/j1fu3Ztm0t6mmv+ezNp0qROfT/CwsI0ffp0vfPOO5ozZ45n/L333vP5GlLTbkV33323nn76ac/YJ5984nOzaX/485//7JkJcvDgQT311FPHdb3WliP5Y4lSZxxdHiWpzX46AIDARdgCAAhaNpvN9AFo0aJFqqioMH1YbK/HQvMlMx0t1Vm/fr3pw3x3mzVrlufx66+/3mGD1tdff73DD7edud/8/Hy9++67HdbZ/AOhP5vIzp492/P4hRdeaHNpy1HvvPOOSktLPTX5soNToDnjjDM8H6qLi4u1ePHids93u92mPkLNf886w2azmbaZPjorrLOazy5xOp0qKyvr0nW6YvTo0frOd77jOX7wwQePK+yZO3euaWvw9PR0UyDV3RoaGkxbzfvaJBsAEDgIWwAAQe2aa67x/Gv+9u3bdeedd3qWEKSkpOib3/xmm689OitGav9f82tra/WDH/zATxX7ZuHChZ5lGQcPHtQDDzzQ5rmlpaW6++67O7ymr/fb2NioH/zgB3I4HB1eMzk52RPiFBcX+y1w+f73v++57oYNG0yzJryVl5frzjvv9BwvWLDAp92GAk1ycrJnq2FJ+tnPftZu35zHH3/cs+NWWFhYi5/Rqqoqn76HknkJ2oABA0zP+brtd/NrhIWFmbbO7gm//vWvPT8z+fn5pl4unRUeHu7ZlnndunVatmxZm1vHd2TNmjX6y1/+4nPvJalppk7z7cbb28YcABCYCFsAAEFt6NChpu1Tm38oX7BggSIjI9t8bfN/zX/hhRf00EMPtVi6kZ2drblz52rDhg0+7xDjD0lJSaYA4e6779YDDzzQor7du3drzpw5ys/Pb/deJemCCy7wBFNLly7VHXfcobq6OtM5hYWFmj9/vhYvXuzT/UZFRWnkyJGSmmYzvPPOO77cXoeGDx+uG264wXN8880364knnmixK9LR78/RRseJiYk+BU+B6u677/Y0yt21a5fmzZunnJwc0zlut1uPPvqoqS/KTTfd1GJL4vXr12vIkCG69957tW3btlbfr7GxUa+//rpnW2epaeldc6effroWLlyoDz/8sM3wZteuXaZZZOecc06HP4/+NmbMGF1++eWe4wceeMDnsKk1I0aM0KmnnqpTTz1VI0aM6PJ1Dh8+rJ/97GcaMmSIbrvtNm3YsKHNmVolJSX66U9/avoZnjRpEmELAAQhu9UFAABwvK699tpW+4t0tE3r3LlzddZZZ2nZsmUyDEN33HGHnnjiCU2ePFlJSUnavXu3Vq1apcbGRg0aNEi33nqrKQDpbr/4xS/06aefauXKlTIMQ3fddZceffRRzZw5U/Hx8crOztby5cvV2NioadOmafjw4XrllVfavN6YMWN09dVXe3raPPTQQ3rllVc0ZcoUDRgwQPv27dOyZcvkcDiUkJCgBx98UD/84Q87rHP+/Pn64x//KKmpWenzzz+vESNGmJrc/uUvf+n0/f/lL3/RV199pXXr1snlcunmm2/W/fffr+nTpys+Pl579uzRsmXLPAGU3W7Xs88+2yJ0CCbDhw/XM888oyuvvFKNjY368ssvNXr0aM2YMUPDhw9XdXW1li9frry8PM9rTjvtNP35z39u9XoFBQW67777dN999yktLU0nn3yy0tLSZLfbdejQIa1fv97Uy2fGjBmm5ThSU4j26quv6tVXX1VMTIxOPPFEDRs2TImJiTp8+LBycnL01Vdfec6PiYnp0vfbH37zm9/ojTfekNvt1sGDB/X888/3+Ky0thQXF+vhhx/Www8/rKSkJJ1yyilKT09XQkKCqqurtXv3bq1fv96zzbQkpaam6uWXXzYtAWzLPffc06kGvrNmzdL8+fO7dC8AAB8YAAAEucrKSiM2NtaQ5PkaO3asT68tLCw0Jk+ebHqt99e4ceOMrKws47nnnvOMXXvtta1eb8mSJZ5zZs6c2eb7Nr9+eyoqKoxzzz233frOOOMMIz8/37j22ms9Y88991yr16upqTHmzp3b7vUyMjKMFStW+Hwv5eXlxpgxY9q9ZnN79+71jJ9wwgnt3n9VVZVx+eWXt3ttSUZ6errxwQcftHute+65x3P+Pffc0+65huH799JXvnx/jnr/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JUVTpkzRgw8+qNra2u65gQ5ERERIkux2JgkBAIDANXOUeSnRtoJKFVexBTQAAN2h2xOC1NRUv1zn/fff11VXXaXKymPTX2tra/XVV1/pq6++0jPPPKPFixdrxIgRfnk/Xxw4cED/+9//lJ6erokTJ/bY+wIAAHTWpMHJio+yq7rB5RlbvrtY35qcYWFVAACEph5dRjR48GDNnTu306/buHGjrrjiClVWVio+Pl5/+MMftGrVKn322Wf6/ve/L0natWuXLrjgAlVVVfm77FY5nU5dffXVamho0AMPPKDw8PAeeV8AAICuiAgP0xnDzT1aWEoEAED36PaZLXfffbemTJmiKVOmKDU1Vfv27dPQoUM7dY1bb71VdXV1stvt+uSTT3T66ad7nps9e7ZGjhypO++8U7t27dJDDz2ke++9t8U1br/9djU0+D5V9tZbb9XIkSNbfc7tduu6667TsmXL9P3vf19XX311p+4HAADACmeN6q9Pth3yHC/fXSK321BYmM3CqgAACD3dHrbcd999x/X6tWvXavny5ZKk733ve6ag5ajbb79dzz33nLZv365HH31Uv/rVrzy9VI76xz/+oZqaGp/f97LLLms1bHG73frud7+rV155RVdddZWeeuqpTt4RAACANWaOMjfJLa1xaFtBpSYMSrKoIgAAQlPA70b0zjvveB5ff/31rZ4TFhama665RpJUXl6uJUuWtDinurpahmH4/HX22We3uIbb7db111+vF154QQsWLNDzzz+vsLCA/y0EAACQJGWmxGpovzjT2BcsJQIAwO8CPilYsWKFJCkuLk6nnHJKm+c135p55cqVfq/jaNDy4osv6oorrtCiRYvo0wIAAILOWSP7mY7p2wIAgP8FfNiyfft2SdKIESPa3V55zJgxLV7jL0eXDr344ov69re/rZdeeomgBQAABKWzvJYSrd9/2LRDEQAAOH7d3rPleNTX16ukpESSlJHR/raEffr0UVxcnGpqanTw4EG/1vHb3/5WL7zwguLj4zVq1Cj9/ve/b3HOJZdcopNPPtnna+bm5rb7fEFBQWfLBAAA6NBpw/oqItwmZ6MhSXK5DX25p1RzxqVaXBkAAKEjoMOW5ts4x8fHd3j+0bClurrar3Xs27dPUlPflz/84Q+tnjNkyJBOhS2ZmZl+qAwAAKBz4qLsOvWEFH2ZU+oZW7ar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",
+ "image/png": "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esh77axs+dWvfmX6G/G7777b8Hg8pns2btxoHH744YYkIzk5OazKlltvvdVYvXp1yPfdv3+/ceWVV/qfdcopp4S8N5IqlUhf853vfMd/n8vlMv70pz8FVJls2rTJOOqoo/z3ZWdnh/wb/vaVLW3VTFdffbVRXl5uuq++vt649NJL/fdmZmbaUo0QTmXLli1bTJVHM2bMCPi96fV6jfvvv99wOp3++77//e8Hfd4RRxzhv+eGG24IWQVTW1trvPTSS8ZPf/rTgK/96U9/8j9j4sSJxoYNG4I+w+fzGYsXLza+853vGDt37uzgV6JzkVa2/PznP/ffn5SUZFRUVIS8N1hli2EYxre+9S3/2ieffBLwunnz5vm/fv311xuGYYRV2eLz+Yzhw4eb/l2+4oorjIULFxo+ny+8X5AwPgeVLQAQXwhbAAAJp/1xhptvvrnDe9uHJBdffHGX37OlpcU47LDDDElGampqyG/m7ApbqqqqjPT0dP89d955Z8hnHThwwCgqKjI9s7NjKuE466yz/M9bt25d0HuiFbZs2bLFFCY89NBDIZ9XUVFh+mb22muvDXpf+7BFknHppZeGfGZjY6NRXFzsv/eFF14I67N1JJyw5aqrrvLfM3r0aKOqqirk8/74xz/673U6nQFH3Gpra/1fLy4u7vI39hdeeKH/OR9++GGXnhGpSMKWdevWGVlZWf77L7vssg7vDxW2zJ8/37/2jW98I+B13/zmN/1fX7BggWEY4YUthmEYL7/8sum+th/9+vUzvvzlLxu333678dZbb3UYEnX2Oa666irje9/7Xlg//vSnP4X9PgCAriFsAQAknHvuucf/DcagQYMCqj3a7Nmzx3C5XP5733nnnW6977333ut/1ptvvhn0HrvClr/+9a/+rw8ZMsRobm7ucG+PPvqo7WHLiy++6H/en//856D3RCts+elPf+q/54gjjug0KGi/15SUlKAhRfuwJTk52di7d2+Hz7zlllv89//4xz8O67N1pLOwpbKy0tQ/6NVXX+3weV6v15g0aZL//p/97Gemr+/evdv0a9hVp512mv85K1eu7PJzItFZ2NLU1GRs3LjRuO+++4zc3Fz/vePHjzf27dvX4bNDhS2GYRijR482JBk5OTmm9cbGRv/7jBkzxrQebnXJY489ZqSmpgYNXdpXvcyYMcP4y1/+Ynr/cD5H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FB4ermHDhpXYv2bNGo0cOVLBwcE6fvy4/P393VQhULc5HA7ZbDb5+fmV2G+z2XTNNddo1apV+vbbbzVmzBg3VQjUH0VFRRowYIB8fX3Vvn17ffLJJ7UubCGWhdutWLFCR44c0R133OEMWiQpNDRUzz33nKxWq+bNm+e+AoF64uqrrybUBNzopptuKhW0SNLQoUM1YsQInT17Vrt373ZDZUD94OXlVSpokSQfHx/deOONkqTDhw/XdFlAvfTKK69o7969mj17try9vd1dTqUQttRzp06d0rfffqvnn39e119/vSIiIpxj4i73t9lJSUl64oknFBcXp6CgIDVu3Fh9+/bV3/72N+Xl5ZV53apVqyRJo0aNKnXs2muvlSStXr36smoBahNPaIdAfefp7dDX11dS8Yc+oC7y5DbocDj03XffSZK6dOly2dcDtYEntcHt27frlVde0fTp09W5c+dKviP34zt2Pde0aVNT7rNo0SJNnDhRWVlZzn15eXnaunWrtm7dqlmzZmnx4sVq165dqWvj4+MlSe3bty91LCoqSsHBwc5zgLrIE9ohUN95cjs8duyYli1bpmbNmqlr166m1Al4Gk9qg1arVa+++qoMw9CZM2e0fPlyHThwQJMnT9bIkSNNqRPwNJ7SBgsLC3X33XerR48eeuqpp0ypyV3o2QKnVq1auexdcik7duzQbbfdpqysLAUHB+uVV17R+vXrtXz5ct1///2SpEOHDmnMmDHKzs4udX1mZqak4mFDrjRs2NB5DlDXuasdAviVJ7XDoqIi3XXXXSosLNTMmTNrbVdq4HK4uw1arVa98MILevHFF/XOO+/o4MGD+uMf/6gPPvig0u8JqE3c2Qaff/55xcfHa86cObX/e56Beu355583Fi1aZJw4ccIwDMNISEgwJBmSjEmTJlXoHkOHDjUkGT4+Psb69etLHX/99ded95w+fXqp49dcc40hyYiPj3d5/+bNmxsNGzas8HsCahtPaIcXmzFjhiHJmDNnzmW8E6D28sR2aLfbjTvuuMOQZNx///2X83aAWsdT22BycrLx73//2wgLCzMGDx5sZGZmXs7bAmoNT2iD69evN7y8vIwXX3yxxP5JkyYZkowNGzZc9vtyJ8IWlHC5jWrTpk3O86dOneryHLvdbnTq1MmQZISFhRlWq7XE8VtuucWQZGzdutXl9cHB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",
"text/plain": [
""
]
@@ -221,12 +125,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 6\n"
+ "Time step 6\n",
+ "RMSE 0.0032255999621369374, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACaXElEQVR4nOzdd3gc1fn28Xu16t1Vliy5ylU2btg0GzDN9BJaMNhAeNNJSAJJSKMkvxRCSCBAQhK6aabFtJCYYuPee7dc1axi9b5l3j9kL5pVW8krza72+7kuXd45Ozv7jGWw99Y5z7EZhmEIAAAAAAAAfhFmdQEAAAAAAAC9CWELAAAAAACAHxG2AAAAAAAA+BFhCwAAAAAAgB8RtgAAAAAAAPgRYQsAAAAAAIAfEbYAAAAAAAD4EWELAAAAAACAHxG2AAAAAAAA+BFhCwAAAAAAgB8RtgAAAAAAAPgRYQsAAAAAAIAfEbYAAAAAAAD4EWELAAAAAACAHxG2AAAAAAAA+BFhCwAAAAAAgB8RtgAAAAAAAPgRYQsAAAAAAIAfEbYAAAAAAAD4EWELAAB+tHTpUtlsNtlsNp1//vltnnfyHJvN5rf3vuOOOzzXfPHFF/12XX87fPiwp85hw4ZZXU6PCZbvDwAAOHWELQCAgHffffeZPpwbhtGl65SWlioqKooPvECAe/HFF02BpPdXVFSUBg4cqOnTp+s73/mOli1b5vO1m4d9J78GDhwop9Pp8zVcLpdSU1NbXOfw4cMdvjYnJ0e//e1vNWfOHGVkZCguLk4RERFKTk7W2LFjdfnll+sXv/iFPvjgA1VXV3fqPjrztXTpUp/vFwDQeYQtAICAd/vtt3seHzlyRF988UWXrvPGG2+osbFRkhQXF6cbbrjBL/WFslCdpQJrNTY2qri4WBs2bNDf//53nXfeeZo9e7ZycnK6dL3i4mJ9/PHHPp//v//9T8eOHevUe9TX1+u+++7T8OHD9ctf/lKLFy9Wbm6uamtr5XQ6VVFRob179+rjjz/W7373O1199dXq27evVq9e3dnbAQAEgHCrCwAAoCMTJ07UlClTtHnzZknSyy+/3O4Snba8/PLLnsfXX3+94uPj/VUigG6SkJCg+fPnm8bq6+t15MgRrVy5UnV1dZKalvBdcMEFWrNmjfr169fp93n55Zd11VVX+XxuZzQ2Nuqaa67R4sWLPWORkZE6/fTTNXLkSMXGxqqyslKHDx/Wli1bPPfkcDhUU1Pj03vMnz9fCQkJPtc0ePDgTt0DAKBzCFsAAEHh9ttv94Qt77zzjp5++mnFxMT4/Pp9+/Zp7dq1putZqatLoXqDU1kKhtDTt29fPfXUU60+d/z4cX3nO9/Rm2++KUnKzs7WQw89pCeffNLn648fP167du3SBx98oPLyciUnJ7d7fkVFhd577z3Tazvyhz/8wRO02Gw2/eQnP9H999/f6ns5HA4tXbpUb775pl5//XWf7+Phhx9mdhkABBCWEQEAgsLcuXMVEREhSaqsrNSiRYs69frmP4keMmSIZs+e7c/yAFigX79+eu211zR9+nTP2AsvvCCHw+HzNebNmydJamho0MKFCzs8/80331R9fb0ktZhx0xqHw6G//OUvnuNf//rX+sMf/tBmqBMREaGLL75Y//rXv5Sbm6spU6b4cBcAgEBD2AIACAoDBgzQZZdd5jnuzDR+wzD0yiuveI7nzZvn112AAFjHbrfr7rvv9hzX1NRo48aNPr9+7ty5Cg9vmuzty/9XTp4TERGhuXPndnj+unXrVF5e7nnNPffc43NtycnJXVoSBQCwHmELACBoNF/688knn/jcoPKLL77QkSNHPMfeP42uqKjQ66+/rm9+85s644wz1L9/f0VGRioxMVEjR47ULbfcojfffFNut9s/N6LOb/28aNEiXXPNNRo8eLCioqKUnp6uiy++WAsWLOjULiqSVFdXp0WLFun73/++Zs6cqZSUFEVGRio+Pl7Dhg3Tddddp+eee87TTLg1J3eLGT58uGfsyJEjbe580lxXmuquWbNGd999t7KystSnTx9FR0crPT1dl156qZ566imf+lo89NBDnvd96KGHJElOp1Mvv/yyLrroIs/vbWpqqq699lp9+OGHPtXWXaqrq/XXv/5Vc+bMUXp6uqKjo9WnTx9NmDBBd999t2lZXEdycnL08MMP69xzz1VKSoqioqIUGRmpfv36adKkSZo7d67+/ve/t/vflMPh0CuvvKKvfOUrGjFihOLj4xUeHq6EhARlZmZqzpw5euCBB7Ru3Tp/3H6nTJ482XScn5/v82sHDhyoSy+9VJK0atUqHThwoM1zDx06pJUrV0qSLr30Ug0YMKDD6+fl5Xke9+3bt1N9VQAAQcwAACBINDQ0GH379jUkGZKMxx57zKfX3XnnnZ7XnHXWWabn3nnnHSMqKsrzfHtfkyZNMg4ePNjuey1ZssRz/nnnndfmec2v256qqirj8ssvb7eumTNnGgUFBcbtt9/uGXvhhRdavd6aNWuM+Ph4n+532LBhxqZNm1q9zgsvvODTNVq7x0OHDnnGhw4d2u79V1dXGzfffHOH109NTTX+85//tHutBx980HP+gw8+aOTm5hpnn312u9e98847DZfL1e51feXL9+ekDz74wBg0aFCH9z137lyjpqam3Wv94x//MGJiYnz6Pp1zzjmtXmPv3r3GuHHjfP5+79+/v6u/TYZhmP98dfRnxDAMY9++fab3f/XVV9s8t/mfP0lGXV2d8eabb3qOH3jggTZf+9BDD3nOe+utt4y6ujrTtQ4dOtTiNW+99ZbneZvNZlRXV/vyW9Ah7/to7b0BANahQS4AIGhERkbqlltu0dNPPy2paTr/j370o3ZfU1dXp7fffttz7N0Yt6ioSA0NDZKk9PR0jR8/XoMGDVJsbKyqq6u1e/dubdq0SYZhaOvWrTr33HO1ZcuWHpna73A4dMUVV2jZsmWesUGDBuncc89VQkKCsrOztWLFCq1YsULXXXedRowY0eE1y8rKVF1dLanpJ/pZWVlKT09XXFycamtrlZ2drXXr1snpdOrw4cM677zztGnTJmVmZpquM27cOH33u99VVVWVZ1lFa7vGnIra2lpdcMEFppkSaWlpmjVrluLj4z3373K5VFBQoKuvvlqvv/66T1t6V1dX69JLL9WOHTsUGxurWbNmKSMjQ1VVVVqyZImKiookNfX/GDNmjH7605/67b46snDhQt16661yuVySmpbJzJw5U5mZmaqurtby5cs9Mzdee+01HTp0SJ9//rmio6NbXGvRokX65je/6TlOTEzUWWedpfT0dIWHh6uiokL79u3Tjh072pzJVFVVpYsuusizrXJYWJimTJmicePGKT4+XrW1tcrLy9PWrVtVUlLi798On3jPZElJSenU66+++molJyervLxcr7zyimcWlLeTf9b79Omjq666yqdGzyNHjvQ8NgxDf/zjH/Xwww93qj4AQBCyOOwBAKBT1q1bZ/pp7rZt29o9/9VXX/WcGxUVZZSVlZmef//9943f//737f4k/uDBg8acOXM817nrrrvaPNefM1t+/etfm34i/tvf/tZwOp2mc/bu3WtMmjTJkGRERkb6NLPl5z//ubF9+/Y237ewsNCYN2+e51oXXnhhm+d2ZpZKZ1/z7W9/23Oe3W43Hn/88RazTPbt22dMmzbNc15iYmKbP+FvPrPl5Gym22+/3Th+/LjpvJqaGuOWW27xnBsfH++X2Qi+zGzJzs42zTyaMWNGiz+bLpfLeOyxx4ywsDDPed/73vdavd7kyZM959x9991tzoKpqqoy3nzzTeOnP/1pi+cef/xxzzXGjx9v7Nmzp9VruN1uY926dca3v/1t4+jRo+38TnSsszNbfvazn3nOj4iIMEpLS9s8t7WZLYZhGN/4xjc8Y8uWLWvxuuXLl3ue/+Y3v2kYhuHTzBa3220MGzbM9N/ybbfdZqxevdpwu92+/Yb4cB/MbAGAwELYAgAIOs2XM9x3333tnts8JLnpppu6/J6NjY3GaaedZkgyoqOj2/ww56+wpby83IiNjfWc89BDD7V5raKiIiM1NdV0zY6Wqfjisssu81xv165drZ7TXWFLdna2KUx46qmn2rxeaWmp6cPsnXfe2ep5zcMWScYtt9zS5jXr6uqMjIwMz7lvvPGGT/fWHl/Clvnz53vOyczMNMrLy9u83p///GfPuWFhYS2WuFVVVXmez8jI6PIH++uvv95znU8++aRL1+iszoQtu3btMhISEjznz507t93z2wpbVq5c6Rn7f//v/7V43de//nXP86tWrTIMw7ewxTAM4+233zadd/KrX79+xuWXX2488MADxgcffNBuSNTRfcyfP9/47ne/69PX448/7vP7AAC6hrAFABB0/vCHP3g+YKSlpbWY7XFSfn6+YbfbPed+9NFHp/S+jzzyiOda77//fqvn+Cts+dvf/uZ5Pj093WhoaGi3tn/+859+D1sWLlzoud5f//rXVs/prrDlpz/9qeecyZMndxgUNK81Kiqq1ZCiedgSGRlpFBQUtHvNn/zkJ57zf/SjH/l0b+3pKGwpKysz9Q969913272ey+UysrKyPOfff//9pufz8vJMv4dddfHFF3uus2XLli5fpzM6Clvq6+uNvXv3Gn/84x+N5ORkz7ljx441jh071u612wpbDMMwMjMzDUlGUlKSabyurs7zPqNGjTKN+zq75NlnnzWio6NbDV2az3qZMWOG8eSTT5re35f76MxXe/9vAgD4Bz1bAABB57bbbtPPf/5zud1u5efn69NPP9WcOXNanPfqq696+l4MGjSo1XOaKy8v15o1a7Rz504dP35c1dXVph2I9uzZ43m8ZcsWXXXVVX66o5aWLFnieXzzzTcrMjKy3fO/+tWv6u677253ByFvtbW1WrNmjbZv367i4mJVVVV5fr8k8y4qW7Zs8b14P/j88889j++4444Od2267rrr1LdvX5WWlqqhoUGrV6/27DDTmpkzZ2rQoEHtXnPKlCmex4cPH/at8FOwatUqT/+g/v37d/jnKywsTF/72td07733SjL/mTl5jejoaNXX12vHjh1auXKlzjnnnE7XlZGR4Xn8zDPP6O9//3unr3EqTu5y1Z6wsDBde+21evrppzvdr6W5efPm6cEHH1RFRYXee+893XzzzZKk9957z7N987x587p07bvuuksXX3yxHnnkEb3++usqKytrcY5hGFq3bp3WrVunRx55RAsWLND555/f1dsBAFiIsAUAEHQGDx6siy66SIsXL5YkLViwoNUg5WQzS0m69dZbZbfbW71ebm6u7r//fr399tueD7sd6e5GoJs3b/Y8Puusszo8PyEhQRMmTNCmTZs6PLe0tFQPPPCAXn75ZVVVVflUT082PjUMwxTunH322R2+JiIiQjNmzNB///tfSdKmTZvaDVsmTpzY4TWbN0GurKzs8PxT1fx7PmPGDIWHd/zPtObhyebNm2UYhieYiIyM1LXXXqs33nhDTqdTF1xwgW6++WbdcMMNOvfcc5WcnOxTXTfddJOef/55SU1hy8aNG3X77bdrzpw5LRonW+Xqq6/Wc8895/M9tWXevHl66KGHZBiGXn75ZU/YcvL/JTabrcthiyQNGTJETz/9tP7yl79o7dq1Wr58udavX6+NGzd6GhCflJubq4svvlgfffSRLrnkkg6vfejQIZ+3UgcAdD/CFgBAULr99ts9Ycu///1vVVdXKz4+3vP85s2btX37dtP5rdm8ebMuvPDCVn/K3B5fQ4quKi4u9jweMmSIT68ZMmRIh2HLkSNHdO655+ro0aOdqqe777e5iooKORwOz/HQoUN9el3zD5odhUNJSUkdXi8iIsLzuHk93aX597wr99zY2KiqqiolJiZ6xv7yl79o48aN2r9/vxobG7VgwQItWLBAYWFhysrK0qxZs3TxxRfrsssuU1RUVKvvMWfOHH3ve9/Tk08+KUlav3691q9fL6lp15+ZM2fq/PPP17XXXqv09PTO3naHvHe5cjqdys/P1+bNm5WbmyupadelgwcP6rPPPlP//v27/F7Dhw/XzJkztXz5ci1evFiFhYWS5Pl/zaxZs/wSaERGRmrWrFmaNWuWZ+zw4cN6++239fjjj3tmlTmdTs2fP18HDx5UbGzsKb8vAKDnhFldAAAAXXHdddd5PlTW1taatneWzLNapkyZ0upMhoaGBl1//fWeoGXAgAH65S9/qSVLlignJ0c1NTVyu90ymnqc6YUXXvC8tvnyou5wcntmST5/yIqLi+vwnLlz53qCloSEBP3whz/Uf//7Xx08eFDV1dVyuVye+22+LKW777e55vcu+XZf3ud1FA51tCzFCs3vuyv3LLW870GDBmnDhg365S9/aVpe43a7tX37dv3tb3/Tddddp9TUVP3hD38wLSNr7q9//aveffddzZgxwzReWFiod955R9/73vc0ZMgQ3XDDDZ0O8jrSt29fPfXUU56vZ555Ru+//74OHTqk5557zrPl9bZt2/yy9fjJYNbpdOq1117Ta6+9JqfTaXquOwwbNkz33Xefdu3aZVo6VFhYqIULF3bb+wIAugdhCwAgKMXExOjGG2/0HC9YsMDz2Ol06vXXX/cct/UB6Z133tGhQ4ckNS1N2rp1q37zm9/o/PPPV3p6umJjY00fyntydkfzWTq1tbU+vaampqbd51etWqVVq1Z5rr9mzRr9+c9/1pw5czR8+HDFxcUpLOzLfxr05P021/zepY7vq7XzEhIS/FpTT2h+3125Z6n1+05MTNRvfvMb5eXlac2aNXr00Ud17bXXmmaAlJWV6Wc/+5muv/56GYbR6ntdd911Wrt2rY4cOaKXXnpJ3/zmNzV+/HjP84Zh6J133tHUqVO1b98+n+o/FeHh4fra176mZ5991jP28ccf66WXXjql6954442KiYmR1BTanrye9/9zuktiYqIWLFhgWva4fPnybn9fAIB/EbYAAIJW8xBl6dKlnp4H//vf/zzT/yMiIjR37txWX//ZZ595Hv/gBz9Qampqu+935MiRUy3ZZwMGDPA89nWmgHfPB2/N7/f22283fVBuTU/eb3NJSUmmJTy+3n/zJranspTEKl35nje/58jIyHZDJrvdrjPOOEP33Xef/v3vf6uwsFDLly/X1Vdf7Tnnvffe0zvvvNPuew4ZMkTz58/XM888o507d+ro0aN6+OGHPTOwjh8/rh/96Ec+1e8Pt956q+kefvWrX6m+vr7L10tMTNQ111wjqakx9NatWyVJ1157bY+FeOnp6crKyvIcFxQU9Mj7AgD8h7AFABC0Zs6cqREjRkhqWhbxyiuvSDIvIbrssstMH2Kby8/P9zz2pWHqsmXLTqXcTmm+E86aNWs6PL+6ulo7duxo95zuuN/uWI5js9k0efJkz/HJ2TjtcTqdnj4ikjR16lS/19Xdmn/P161b1+aSnuaa/95MmTKlU9+PsLAwzZw5U4sWLdLFF1/sGX///fd9vobUtFvRAw88oH/+85+escWLF/vcbNof/vjHP3pmguTk5OiZZ545peu1thzJH0uUOuPk8ihJbfbTAQAELsIWAEDQstlspg9ACxYsUEVFhenDYns9Fpovmeloqc7GjRtNH+a72+zZsz2PFy5c2GGD1oULF3b44bYz95ufn6/33nuvwzqbfyD0ZxPZCy64wPP4pZdeanNpy0mLFi3S8ePHPTX5soNToDn77LM9H6qLi4v10UcftXu+2+029RFq/nvWGTabzbTN9MlZYZ3VfHaJw+FQaWlpl67TFWPGjNFXv/pVz/Gjjz56SmHPJZdcYtoaPDU11RRIdbeGhgbTVvO+NskGAAQOwhYAQFCbP3++56f5u3fv1k9+8hPPEoK+ffvqyiuvbPO1J2fFSO3/NL+2tlbf+MY3/FSxb+bOnetZlpGTk6NHHnmkzXOPHz+uBx54oMNr+nq/LpdL3/jGN9TY2NjhNZOTkz0hTnFxsd8Cl69//eue627atMk0a8JbeXm5fvKTn3iOb7nlFp92Gwo0ycnJnq2GJenHP/5xu31znnrqKc+OW2FhYS3+jFZVVfn0PZTMS9AGDhxoes7Xbb+bXyMsLMy0dXZP+OUvf+n5M5Ofn2/q5dJZdrvdsy3z+vXrtWzZsja3ju/I2rVr9ac//cnn3ktS00yd5tuNt7eNOQAgMBG2AACC2vDhw03bpzb/UH7LLbcoMjKyzdc2/2n+Sy+9pMcee6zF0o3s7Gxdcskl2rRpk887xPhDUlKSKUB44IEH9Mgjj7Sob//+/br44ouVn5/f7r1K0hVXXOEJppYuXar77rtPdXV1pnOOHTum66+/Xh999JFP9xsVFaVRo0ZJaprNsGjRIl9ur0MjR47UN7/5Tc/x3XffraeffrrFrkgnvz8nGx0nJib6FDwFqgceeMDTKHffvn2aM2eODh48aDrH7XbriSeeMPVF+e53v9tiS+KNGzdq2LBheuihh7Rr165W38/lcmnhwoWebZ2lpqV3zZ111lmaO3euPv744zbDm3379plmkV144YUd/nn0t7Fjx+qmm27yHD/yyCM+h02tyczM1Omnn67TTz9dmZmZXb5OWVmZfvzjH2vYsGH60Y9+pE2bNrU5U6ukpEQ//OEPTX+Gp0yZQtgCAEEo3OoCAAA4Vbfffnur/UU62qb1kksu0bnnnqtly5bJMAzdd999evrppzV16lQlJSVp//79WrVqlVwulwYPHqx77rnHFIB0t5/97Gf65JNPtHLlShmGofvvv19PPPGEzjvvPMXHxys7O1vLly+Xy+XSGWecoZEjR+q1115r83pjx47VvHnzPD1tHnvsMb322muaPn26Bg4cqMOHD2vZsmVqbGxUQkKCHn30UX3rW9/qsM7rr79ev/vd7yQ1NSt98cUXlZmZaWpy+6c//anT9/+nP/1JGzZs0Pr16+V0OnX33XfrD3/4g2bOnKn4+HgdOHBAy5Yt8wRQ4eHheu6551qEDsFk5MiRevbZZ3XrrbfK5XJp9erVGjNmjGbNmqWRI0equrpay5cvV15enuc1Z555pv74xz+2er2CggI9/PDDevjhhzVo0CBNnjxZgwYNUnh4uAoLC7Vx40ZTL59Zs2aZluNITSHa66+/rtdff10xMTE67bTTNGLECCUmJqqsrEwHDx7Uhg0bPOfHxMR06fvtD7/61a/05ptvyu12KycnRy+++GKPz0prS3Fxsf7yl7/oL3/5i5KSkjRt2jSlpqYqISFB1dXV2r9/vzZu3OjZZlqSUlJS9Oqrr5qWALblwQcf7FQD39mzZ+v666/v0r0AAHxgAAAQ5CorK43Y2FhDkudr3LhxPr322LFjxtSpU02v9f4aP368sXPnTuOFF17wjN1+++2tXm/JkiWec84777w237f59dtTUVFhXHrppe3Wd/bZZxv5+fnG7bff7hl74YUXWr1eTU2Ncckll7R7vfT0dGPFihU+30t5ebkxduzYdq/Z3KFDhzzjQ4cObff+q6qqjJtuuqnda0syUlNTjf/85z/tXuvBBx/0nP/ggw+2e65h+P699JUv35+TPvjg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rcw+7733np544glJ0q9//WstX768zPZ//OMfuv/++yVJffv21apVqxQSElLhORw5ckSRkZGu70vPbJGkiRMnav78+fLy8ipz3MSJE7Vw4UJJ0s6dO3Xrrbe6tq1fv14JCQmSqp654nA4lJubq+Dg4Aq3AwCA6iFsAQAAbql02FJdhw8fVlRUlOv70mHLRx99pAcffLDC45588knNmzdPUsl9XUrPbhkyZIhWr14tq9WqH3/8sUwQUtrAgQO1du1aWSwW/fTTT4qIiHBt69evn9LT0xUQEKCMjAy1bt262udUOmyJiIjQ4cOH5evrW26//fv3q2PHjpKkP//5z3r66add25YuXapHH31UknT+/HnCFAAA6hk3yAUAAI1es2bNXDNLKjJu3DjX8tq1a13LDodDmzZtkiQNGjSo0qBFKplZcuWYjRs3utafPn1aW7ZskSSNGDGiRkHL1R566KEKgxapZFZPUFCQJOnQoUNltpUOfpKTk2v9+gAAoHoIWwAAgNubOXOmnE7nNb9Kz2op7dZbb5XFUvmt6mJiYlyXBu3Zs8e1/tChQ8rNzZUk9e7du8oaS2/fu3eva3n37t2uG+LGx8dXfaLXcGXmSmWaNWsmSbp48WKZ9XFxcbrpppskSc8++6xiY2P15ptv6ptvvpHdbq9TTQAAoDzCFgAA0Oi1bNmyyu0Wi0WhoaGSpDNnzrjWl16+1hil7wVT+ricnBzXcukZJrUREBBQ5XZv75If7YqKisqst1qtSk1NdT2laPv27ZoxY4bi4uIUEhKie+65R0uXLi13HAAAqB3CFgAA0OhdfTNZs8YwU+fOnbVnzx59+umnGjdunNq3by9JysvL0xdffKFHH31UvXv31smTJ02uFACAho+wBQAANHr/+c9/qtzucDhcs1GuzHC5evlaY5w4caLC41q0aOFaPn78ePUKric+Pj4aNmyY3n//fWVkZCg7O1uLFi1Sjx49JEnffvutJk2aZGqNAAA0BoQtAACg0du9e7ccDkel2//1r3+57l3SpUsX1/qbbrrJdenO1q1bq3yN0o+MLj3Grbfe6poV89VXX9W8+HoUERGhsWPHKj09Xbfddpsk6fPPP1deXp7JlQEA0LARtgAAgEbvzJkzSk1NrXT7okWLXMt33323a9liseiOO+6QJH355Zc6evRopWMsXLjQdcydd97pWh8aGqp+/fpJklasWKHs7OxanUN9slqtrvN0OBw6d+6cuQUBANDAEbYAAACPMHXq1AovBdq0aZMWLFggSerRo4d69epVZvtvfvMbSZLdbtf48eNVWFhYboxFixZpzZo1kqQHHnig3I1wX3rpJUlSbm6uhg8frvPnz1daZ1WBTm19/fXXOnjwYKXb7Xa76xHXQUFBCgsLM7wGAAA8SeXPQAQAAHATJ0+eLPM45cr4+/vr5ptvLre+e/fu+v7779WjRw9Nnz5dsbGxKigo0KpVq/Tuu+/K4XDIYrFo7ty55Y5NTEzU8OHD9fe//11r1qxRnz59NHXqVHXs2FFnz57VsmXLXDNjQkND9c4775Qb47777tP48eP1/vvvKy0tTZ07d9aUKVPUv39/BQcHKycnRzt27NDy5cvVvXt3paSk1PwvqQrr1q3TH/7wB8XHxysxMVHdunVTWFiY8vLydODAAf3tb3/Tzp07JUnjx4+v8jHZAADg2ngnBQAAbm/evHmaN2/eNffr3r27du/eXW59TEyMpkyZosmTJ2vKlCnltttsNi1evFi9e/eucNwlS5bI4XDo008/1c6dOzVq1Khy+7Ru3VorV65UmzZtKhxj/vz58vf319y5c5Wdna0ZM2ZUeg71obi4WJs2bXLNYKnI/fffrzfffLNeXh8AAE9C2AIAADzChAkT1KVLF7377rvavHmzcnJyFBYWpoSEBL300kvq3Llzpcf6+fnpk08+UWpqqlJSUrRlyxbl5OQoMDBQ0dHRGjZsmKZMmaKgoKBKx/Dx8dFf/vIXjR07VvPnz9fGjRt17Ngx2e12NW/eXN26ddM999yjxx57zPBzf/7559WtWzetXbtWu3btUnZ2tusRz+Hh4YqNjdXjjz+uxMREw18bAABP5OV0Op1mFwEAAFAfoqKilJWVpdGjRxt+aQ4AAEBluEEuAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIpxEBAAAAAAAYiJktAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIEIWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQIQtAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIEIWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQIQtAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIH+D4RuLEGd9xMxAAAAAElFTkSuQmCC",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAAtUxJREFUeJzs3Xd4VGXexvF70ntCCCmQUEMNvSnSUYodF5VFQbCtrmXtbvPFss2yrt11XVxBbGBDEQsqIE1674RASGghlfQ25/0DGXPSEyY5k+T7ua5c15znPPPMbyiBufMUm2EYhgAAAAAAAOAUblYXAAAAAAAA0JwQtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAAAAAAADgRYQsAAAAAAIATEbYAAAAAAAA4EWELAAAAAACAExG2AAAAAAAAOBFhCwAAAAAAgBMRtgAA4GQrVqyQzWaTzWbTmDFjqux3ro/NZnPaa8+aNcsx5ty5c502rrMdOXLEUWfHjh2tLqfRNJXfHwAAcH4IWwAATcLDDz9s+nBuGEa9xklPT5e3tzcfeAEXN3fuXFMgWf7L29tb4eHhGjJkiO666y6tXLmy1mOXDfvOfYWHh6ukpKTWY5SWlioqKqrCOEeOHKnxuUlJSfrb3/6miRMnKiYmRv7+/vL09FRISIh69Oihyy67TH/+85+1ePFi5eTk1Ol91OVrxYoVtX6/AIC6IWwBADQJM2fOdDxOTEzUjz/+WK9xPvzwQxUVFUmS/P39de211zqlvpaspc5SgbWKiop0+vRpbdq0Sf/+9781evRojR07VklJSfUa7/Tp0/r6669r3f/bb7/VyZMn6/QaBQUFevjhh9WpUyc99thjWrp0qZKTk5WXl6eSkhJlZWVp//79+vrrr/X3v/9dV111lUJDQ/XTTz/V9e0AACzmYXUBAADURp8+fTRgwABt3bpVkvTOO+9Uu0SnKu+8847j8ZQpUxQQEOCsEgE0kMDAQN10002mtoKCAiUmJmrNmjXKz8+XdHYJ37hx47Ru3Tq1bt26zq/zzjvv6Morr6x137ooKirS1VdfraVLlzravLy8NHjwYHXp0kV+fn46c+aMjhw5om3btjneU3FxsXJzc2v1GjfddJMCAwNrXVO7du3q9B4AALVH2AIAaDJmzpzpCFs++eQTvfbaa/L19a318w8cOKD169ebxrNSfZdCNQfnsxQMLU9oaKheffXVSu+lpaXprrvu0sKFCyVJ8fHxeuKJJ/TKK6/UevxevXppz549Wrx4sTIzMxUSElJt/6ysLH3++eem59bk6aefdgQtNptNjz76qP7whz9U+lrFxcVasWKFFi5cqA8++KDW7+PJJ59kdhkAuAiWEQEAmowbbrhBnp6ekqQzZ85o0aJFdXp+2Z9Et2/fXmPHjnVmeQAs0Lp1a73//vsaMmSIo+3tt99WcXFxrceYMWOGJKmwsFALFiyosf/ChQtVUFAgSRVm3FSmuLhYL7zwguP6qaee0tNPP11lqOPp6anx48frv//9r5KTkzVgwIBavAsAgCshbAEANBlt2rTRpZde6riuyzR+wzD07rvvOq5nzJjh1FOAAFjH3d1d99xzj+M6NzdXmzdvrvXzb7jhBnl4nJ3wXZvvK+f6eHp66oYbbqix/4YNG5SZmel4zn333Vfr2kJCQuq1JAoAYC3CFgBAk1J26c93331X6w0qf/zxRyUmJjquy/80OisrSx988IHuuOMOXXDBBQoLC5OXl5eCgoLUpUsXTZs2TQsXLpTdbnfOG1Hdj35etGiRrr76arVr107e3t6Kjo7W+PHjNX/+/DqdoiJJ+fn5WrRokX73u99pxIgRioiIkJeXlwICAtSxY0ddc801euuttxybCVfm3GkxnTp1crQlJiZWefJJWfXZVHfdunW65557FBcXp1atWsnHx0fR0dGaNGmSXn311Vrta/HEE084XveJJ56QJJWUlOidd97RJZdc4vi1jYqK0uTJk/Xll1/WqraGkpOTo5dfflkTJ05UdHS0fHx81KpVK/Xu3Vv33HOPaVlcTZKSkvTkk09q1KhRioiIkLe3t7y8vNS6dWv169dPN9xwg/79739X+3equLhY7777rn71q1+pc+fOCggIkIeHhwIDAxUbG6uJEydq9uzZ2rBhgzPefp3079/fdH38+PFaPzc8PFyTJk2SJK1du1aHDh2qsu/hw4e1Zs0aSdKkSZPUpk2bGsc/duyY43FoaGid9lUBADRRBgAATUhhYaERGhpqSDIkGc8//3yt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fds1Kn/KVUlJiY4fP66tW7cqOTlZ0tlTlxISEvTDDz8oLCys3q/VqVMnjRgxQqtWrdLSpUt16tQpSXJ8rxk5cqRTAg0vLy+NHDlSI0eOdLQdOXJEH3/8sV588UXHrLKSkhLddNNNSkhIkJ+f33m/LgCgcbhZXQAAAPV1zTXXOD5U5uXlmY53lsyzWgYMGFDpTIbCwkJNmTLFEbS0adNGjz32mJYvX66kpCTl5ubKbrfLOLvPmd5++23Hc8suL2oI545nllTrD1n+/v419rnhhhscQUtgYKAeeOABffPNN0pISFBOTo5KS0sd77fsspSGfr9llX3vUu3eV/l+NYVDNS1LsULZ912f9yxVfN+RkZHatGmTHnvsMdPyGrvdrp07d+r111/XNddco6ioKD399NOmZWRlvfzyy/r00081dOhQU/upU6f0ySef6N5771X79u117bXX1jnIq0loaKheffVVx9cbb7yhL774QocPH9Zbb73lOPJ6x44dTjl6/FwwW1JSovfff1/vv/++SkpKTPcaQseOHfXwww9rz549pqVDp06d0oIFCxrsdQEAzkfYAgBosnx9fXXdddc5rufPn+94XFJSog8++MBxXdUHpE8++USHDx+WdHZp0vbt2/WXv/xFY8aMUXR0tPz8/EwfyhtzdkfZWTp5eXm1ek5ubm6199euXau1a9c6xl+3bp3+9a9/aeLEierUqZP8/f3l5vbLfw8a8/2WVfa9SzW/r8r6BQYGOrWmxlD2fdfnPUuVv++goCD95S9/0bFjx7Ru3To999xzmjx5smkGSEZGhv74xz9qypQpMgyj0te65pprtH79eiUmJmrevHm644471KtXL8d9wzD0ySefaODAgTpw4ECt6j8fHh4euuWWWzRnzhxH29dff6158+ad17jXXXedfH19JZ0Nbc+NV/57TkMJCgrS/PnzTcseV61a1eCvCwBwHsIWAECTVjZEWbFihWPPg2+//dYx/d/T01M33HBDpc//4YcfHI/vv/9+RUVFVft6iYmJ51tyrbVp08bxuLYzBcrv+VBe2fc7c+ZM0wflyjTm+y0rODjYtISntu+/7Ca257OUxCr1+T0v+569vLyqDZnc3d11wQUX6OGHH9Znn32mU6dOadWqVbrqqqscfT7//HN98skn1b5m+/btddNNN+mNN97Q7t27dfToUT355JOO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",
"text/plain": [
""
]
@@ -239,12 +144,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 7\n"
+ "Time step 7\n",
+ "RMSE 0.00320273843387027, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "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V2d0797dkGRIMp588km/Hnf77bd7HnPWWWeZ7nvvvfeM2NhYz/0tfYwbN844cOBAi8+1aNEiz/nTp09v9rzG121JZWWlcemll7ZY19SpU438/Hzj1ltv9Yy98sorPq+3atUqIykpya/XO2DAAGPDhg0+r/PKK6/4dQ1frzEnJ8cz3r9//xZff1VVlTF79uxWr9+nTx/jv//9b4vXeuihhzznP/TQQ0ZeXp5x9tlnt3jd22+/3XC5XC1e11/+fH1O+PDDD42MjIxWX/ecOXOM6urqFq/197//3YiPj/fr63TOOef4vMbu3buNkSNH+v313rt3b3s/TYZhmL+/WvseMQzD2LNnj+n5X3/99WbPbfz9J8mora013nnnHc/xgw8+2OxjH374Yc95//rXv4za2lrTtXJycpo85l//+pfnfpvNZlRVVfnzKWiV9+vw9dwAAOvQIBcAEDJiYmJ0ww036LnnnpPUMJ3/nnvuafExtbW1evfddz3H3o1xCwoKVFdXJ0nKysrSaaedpoyMDCUkJKiqqko7d+7Uhg0bZBiGNm/erHPPPVebNm3qlKn9DodDl112mZYsWeIZy8jI0Lnnnqvk5GTt27dPy5Yt07Jly3T11Vdr0KBBrV6ztLRUVVVVkhp+oz9q1ChlZWUpMTFRNTU12rdvn9asWSOn06mDBw9q+vTp2rBhg4YMGWK6zsiRI/WjH/1IlZWVnmUVvnaNORU1NTU6//zzTTMl+vbtq2nTpikpKcnz+l0ul/Lz83XFFVfozTff9GtL76qqKl188cXatm2bEhISNG3aNGVnZ6uyslKLFi1SQUGBpIb+H8OHD9cvfvGLgL2u1rz99tu68cYb5XK5JDUsk5k6daqGDBmiqqoqLV261DNz44033lBOTo7+97//KS4ursm1FixYoDvvvNNznJKSorPOOktZWVmKiopSeXm59uzZo23btjU7k6myslIXXnihZ1vliIgITZgwQSNHjlRSUpJqamp05MgRbd68WUVFRYH+dPjFeyZL79692/T4K664QmlpaSorK9Nrr73mmQXl7cT3erdu3XT55Zf71eh58ODBntuGYejxxx/XI4880qb6AAAhyOKwBwCANlmzZo3pt7lbtmxp8fzXX3/dc25sbKxRWlpquv+DDz4w/vjHP7b4m/gDBw4Ys2bN8lznO9/5TrPnBnJmy29/+1vTb8R///vfG06n03TO7t27jXHjxhmSjJiYGL9mtvz61782tm7d2uzzHj9+3Lj55ps917rggguaPbcts1Ta+pgf/OAHnvMiIyONp556qskskz179hhnnHGG57yUlJRmf8PfeGbLidlMt956q1FcXGw6r7q62rjhhhs85yYlJQVkNoI/M1v27dtnmnk0efLkJt+bLpfLePLJJ42IiAjPeT/+8Y99Xm/8+PGec+66665mZ8FUVlYa77zzjvGLX/yiyX1PPfWU5xqnnXaasWvXLp/XcLvdxpo1a4wf/OAHxuHDh1v4TLSurTNbfvWrX3nOj46ONkpKSpo919fMFsMwjO9973uesSVLljR53NKlSz3333nnnYZhGH7NbHG73caAAQNMf5dvuukmY+XKlYbb7fbvE+LH62BmCwAEF8IWAEDIabyc4b777mvx3MYhyfXXX9/u56yvrzfGjh1rSDLi4uKafTMXqLClrKzMSEhI8Jzz8MMPN3utgoICo0+fPqZrtrZMxR+XXHKJ53o7duzweU5HhS379u0zhQnPPvtss9crKSkxvZm9/fbbfZ7XOGyRZNxwww3NXrO2ttbIzs72nPvWW2/59dpa4k/Ycsstt3jOGTJkiFFWVtbs9f785z97zo2IiGiyxK2ystJzf3Z2drvf2F9zzTWe63zxxRftukZbtSVs2bFjh5GcnOw5f86cOS2e31zYsnz5cs/Yd7/73SaPu+OOOzz3r1ixwjAM/8IWwzCMd99913TeiY8ePXoYl156qfHggw8aH374YYshUWuv45ZbbjF+9KMf+fXx1FNP+f08AID2IWwBAIScRx991PMGo2/fvk1me5xw9OhRIzIy0nPuxx9/fErP+9hjj3mu9cEHH/g8J1Bhy9/+9jfP/VlZWUZdXV2Ltb344osBD1vefvttz/WeeeYZn+d0VNjyi1/8wnPO+PHjWw0KGtcaGxvrM6RoHLbExMQY+fn5LV7z/vvv95x/zz33+PXaWtJa2FJaWmrqH/Tvf/+7xeu5XC5j1KhRnvN/+ctfmu4/cuSI6XPYXjNnzvRcZ9OmTe2+Tlu0FrbY7XZj9+7dxuOPP26kpaV5zh0xYoRx7NixFq/dXNhiGIYxZMgQQ5KRmppqGq+trfU8z9ChQ03j/s4ueemll4y4uDifoUvjWS+TJ082/vrXv5qe35/X0ZaPlv5tAgAEBj1bAAAh56abbtKvf/1rud1uHT16VF9++aVmzZrV5LzXX3/d0/ciIyPD5zmNlZWVadWqVdq+fbuKi4tVVVVl2oFo165dntubNm3S5ZdfHqBX1NSiRYs8t2fPnq2YmJgWz//Wt76lu+66q8UdhLzV1NRo1apV2rp1qwoLC1VZWen5fEnmXVQ2bdrkf/EB8L///c9z+7bbbmt116arr75a3bt3V0lJierq6rRy5UrPDjO+TJ06VRkZGS1ec8KECZ7bBw8e9K/wU7BixQpP/6D09PRWv78iIiL07W9/W/fee68k8/fMiWvExcXJbrdr27ZtWr58uc4555w215Wdne25/cILL+j5559v8zVOxYldrloSERGhq666Ss8991yb+7U0dvPNN+uhhx5SeXm53n//fc2ePVuS9P7773u2b7755pvbde3vfOc7mjlzph577DG9+eabKi0tbXKOYRhas2aN1qxZo8cee0zz58/Xeeed196XAwCwEGELACDkZGZm6sILL9Tnn38uSZo/f77PIOVEM0tJuvHGGxUZGenzenl5efrlL3+pd9991/NmtzUd3Qh048aNnttnnXVWq+cnJydr9OjR2rBhQ6vnlpSU6MEHH9Srr76qyspKv+rpzManhmGYwp2zzz671cdER0dr8uTJ+vTTTyVJGzZsaDFsGTNmTKvXbNwEuaKiotXzT1Xjr/nkyZMVFdX6j2mNw5ONGzfKMAxPMBETE6OrrrpKb731lpxOp84//3zNnj1b1157rc4991ylpaX5Vdf111+vf/7zn5Iawpb169fr1ltv1axZs5o0TrbKFVdcoZdfftnv19Scm2++WQ8//LAMw9Crr77qCVtO/Ftis9naHbZIUr9+/fTcc8/pL3/5i1avXq2lS5dq7dq1Wr9+vacB8Ql5eXmaOXOmPv74Y1100UWtXjsnJ8fvrdQBAB2PsAUAEJJuvfVWT9jyn//8R1VVVUpKSvLcv3HjRm3dutV0vi8bN27UBRdc4PO3zC3xN6Ror8LCQs/tfv36+fWYfv36tRq2HDp0SOeee64OHz7cpno6+vU2Vl5eLofD4Tnu37+/X49r/EaztXAoNTW11etFR0d7bjeup6M0/pq35zXX19ersrJSKSkpnrG//OUvWr9+vfbu3av6+nrNnz9f8+fPV0REhEaNGqVp06Zp5syZuuSSSxQbG+vzOWbNmqUf//jH+utf/ypJWrt2rdauXSupYdefqVOn6rzzztNVV12lrKystr7sVnnvcuV0OnX06FFt3LhReXl5khp2XTpw4IAWLlyo9PT0dj/XwIEDNXXqVC1dulSff/65jh8/Lkmef2umTZsWkEAjJiZG06ZN07Rp0zxjBw8e1LvvvqunnnrKM6vM6XTqlltu0YEDB5SQkHDKzwsA6DwRVhcAAEB7XH311Z43lTU1NabtnSXzrJYJEyb4nMlQV1ena665xhO09OzZUw888IAWLVqk3NxcVVdXy+12y2jocaZXXnnF89jGy4s6wontmSX5/SYrMTGx1XPmzJnjCVqSk5P1s5/9TJ9++qkOHDigqqoquVwuz+ttvCylo19vY41fu+Tf6/I+r7VwqLVlKVZo/Lrb85qlpq87IyND69at0wMPPGBaXuN2u7V161b97W9/09VXX60+ffro0UcfNS0ja+yZZ57Rv//9b02ePNk0fvz4cb333nv68Y9/rH79+unaa69tc5DXmu7du+vZZ5/1fLzwwgv64IMPlJOTo5dfftmz5fWWLVsCsvX4iWDW6XTqjTfe0BtvvCGn02m6ryMMGDBA9913n3bs2GFaOnT8+HG9/fbbHfa8AICOQdgCAAhJ8fHxuu666zzH8+fP99x2Op168803PcfNvUF67733lJOTI6lhadLmzZv1u9/9Tuedd56ysrKUkJBgelPembM7Gs/Sqamp8esx1dXVLd6/YsUKrVixwnP9VatW6c9//rNmzZqlgQMHKjExURERJ3806MzX21jj1y61/rp8nZecnBzQmjpD49fdntcs+X7dKSkp+t3vfqcjR45o1apVeuKJJ3TVVVeZZoCUlpbqV7/6la655hoZhuHzua6++mqtXr1ahw4d0rx583TnnXfqtNNO89xvGIbee+89nX766dqzZ49f9Z+KqKgoffvb39ZLL73kGfvkk080b968U7ruddddp/j4eEkNoe2J63n/m9NRUlJSNH/+fNOyx6VLl3b48wIAAouwBQAQshqHKIsXL/b0PPjss8880/+jo6M1Z84cn49fuHCh5/ZPf/pT9enTp8XnO3To0KmW7LeePXt6bvs7U8C754O3xq/31ltvNb1R9qUzX29jqamppiU8/r7+xk1sT2UpiVXa8zVv/JpjYmJaDJkiIyM1ZcoU3XffffrPf/6j48ePa+nSpbriiis857z//vt67733WnzOfv366ZZbbtELL7yg7du36/Dhw3rkkUc8M7CKi4t1zz33+FV/INx4442m1/Cb3/xGdru93ddLSUnRlVdeKamhMfTmzZslSVdddVWnhXhZWVkaNWqU5zg/P79TnhcAEDiELQCAkDV16lQNGjRIUsOyiNdee02SeQnRJZdcYnoT29jRo0c9t/1pmLpkyZJTKbdNGu+Es2rVqlbPr6qq0rZt21o8pyNeb0csx7HZbBo/frzn+MRsnJY4nU5PHxFJOv300wNeV0dr/DVfs2ZNs0t6Gmv8uZkwYUKbvh4RERGaOnWqFixYoJkzZ3rGP/jgA7+vITXsVvTggw/qxRdf9Ix9/vnnfjebDoTHH3/cMxMkNzdXL7zwwildz9dypEAsUWqLE8ujJDXbTwcAELwIWwAAIctms5neAM2fP1/l5eWmN4st9VhovGSmtaU669evN72Z72gzZszw3H777bdbbdD69ttvt/rmti2v9+jRo3r//fdbrbPxG8JANpE9//zzPbfnzZvX7NKWExYsWKDi4mJPTf7s4BRszj77bM+b6sLCQn388cctnu92u019hBp/ztrCZrOZtpk+MSusrRrPLnE4HCopKWnXddpj+PDh+ta3vuU5fuKJJ04p7LnoootMW4P36dPHFEh1tLq6OtNW8/42yQYABA/CFgBASLvllls8v83fuXOn7r//fs8Sgu7du+sb3/hGs489MStGavm3+TU1Nfre974XoIr9M2fOHM+yjNzcXD322GPNnltcXKwHH3yw1Wv6+3pdLpe+973vqb6+vtVrpqWleUKcwsLCgAUud9xxh+e6GzZsMM2a8FZWVqb777/fc3zDDTf4tdtQsElLS/NsNSxJP//5z1vsm/Pss896dtyKiIho8j1aWVnp19dQMi9B69Wrl+k+f7f9bnyNiIgI09bZneGBBx7wfM8cPXrU1MulrSIjIz3bMq9du1ZLlixpduv41qxevVp/+tOf/O69JDXM1Gm83XhL25gDAIITYQsAIKQNHDjQtH1q4zflN9xwg2JiYpp9bOPf5s+bN09PPvlkk6Ub+/bt00UXXaQNGzb4vUNMIKSmppoChAcffFCPPfZYk/r27t2rmTNn6ujRoy2+Vkm67LLLPMHU4sWLdd9996m2ttZ0zrFjx3TNNdfo448/9uv1xsbGaujQoZIaZjMsWLDAn5fXqsGDB+vOO+/0HN9111167rnnmuyKdOLrc6LRcUpKil/BU7B68MEHPY1y9+zZo1mzZunAgQOmc9xut55++mlTX5Qf/ehHTbYkXr9+vQYMGKCHH35YO3bs8Pl8LpdLb7/9tmdbZ6lh6V1jZ511lubMmaNPPvmk2fBmz549pllkF1xwQavfj4E2YsQIXX/99Z7jxx57zO+wyZchQ4Zo4sSJmjhxooYMGdLu65SWlurnP/+5BgwYoHvuuUcbNmxodqZWUVGRfvazn5m+hydMmEDYAgAhKMrqAgAAOFW33nqrz/4irW3TetFFF+ncc8/VkiVLZBiG7rvvPj333HM6/fTTlZqaqr1792rFihVyuVzKzMzU3XffbQpAOtqvfvUrffHFF1q+fLkMw9Avf/lLPf3005o+fbqSkpK0b98+LV26VC6XS1OmTNHgwYP1xhtvNHu9ESNG6Oabb/b0tHnyySf1xhtvaNKkSerVq5cOHjyoJUuWqL6+XsnJyXriiSf0/e9/v9U6r7nmGv3hD3+Q1NCsdO7cuRoyZIipye2f/vSnNr/+P/3pT1q3bp3Wrl0rp9Opu+66S48++qimTp2qpKQk7d+/X0uWLPEEUFFRUXr55ZebhA6hZPDgwXrppZd04403yuVyaeXKlRo+fLimTZumwYMHq6qqSkuXLtWRI0c8jznzzDP1+OOP+7xefn6+HnnkET3yyCPKyMjQ+PHjlZGRoaioKB0/flzr16839fKZNm2aaTmO1BCivfnmm3rzzTcVHx+vsWPHatCgQUpJSVFpaakOHDigdevWec6Pj49v19c7EH7zm9/onXfekdvtVm5urubOndvps9KaU1hYqL/85S/6y1/+otTUVJ1xxhnq06ePkpOTVVVVpb1792r9+vWebaYlqXfv3nr99ddNSwCb89BDD7Wpge+MGTN0zTXXtOu1AAD8YAAAEOIqKiqMhIQEQ5LnY+TIkX499tixY8bpp59ueqz3x2mnnWZs377deOWVVzxjt956q8/rLVq0yHPO9OnTm33extdvSXl5uXHxxRe3WN/ZZ59tHD161Lj11ls9Y6+88orP61VXVxsXXXRRi9fLysoyli1b5vdrKSsrM0aMGNHiNRvLycnxjPfv37/F119ZWWlcf/31LV5bktGnTx/jv//9b4vXeuihhzznP/TQQy2eaxj+fy395c/X54QPP/zQ6N27d6uv+4YbbjCqq6t9XmPVqlVGVFRUq9c48XHttdcaFRUVTa4zevRov68xcOBAY/ny5af8uWr8d6217xFv1113nakeh8Nhur/x958ko7a2tt111tbWmq6Vk5PT5Jxdu3YZ06dPNyIjI/3+PEoyLrnkEuPAgQPNPrf362jrx913393u1w0AaB0zWwAAIS85OVlXX321Xn/9dc9Ya7NaTujdu7dWrFihl156SW+99Za2bdummpoa9erVS8OHD9fs2bN14403KiEhQWvWrOmol9CslJQUffLJJ/r3v/+tuXPnau3atSopKVF6erpGjhypG2+8UTfddJNpFklLEhIS9Mknn+iNN97QvHnztHHjRlVUVCg9PV2DBg3SNddco9tuu03dunXT4sWL/bpmamqq1q5dq7/97W/6+OOPtXPnTpWVlQWkf0tSUpLefvtt/fSnP9X8+fO1ePFiHT16VLW1tUpPT9fo0aP1jW98Q9/+9rc7dZlXR/vGN76hffv26Z///Kc++ugjbd++XUVFRYqPj1ffvn01Y8YM3XLLLZoyZUqz15gyZYoKCgr05ZdfatmyZdq4caP279+v4uJiuVwupaSkaPDgwTrzzDN10003afLkyT6vs2nTJq1atUqLFi3SmjVrtHv3bh09elQ1NTVKSEjwzJi54oordP3111u+c85vfvMbvfvuuzIMQzk5OZo/f75uv/12y+oZPny4Fi9erKKiIi1evFjLli3T1q1btW/fPhUXF8tutyshIUHdunXTiBEjNHnyZF1//fV+7RgGAAheNsNopb0/AAAAAAAA/EaDXAAAAAAAgAAibAEAAAAAAAggwhYAAAAAAIAAImwBAAAAAAAIIMIWAAAAAACAACJsAQAAAAAACCDCFgAAAAAAgAAibAEAAAAAAAggwhYAAAAAAIAAImwBAAAAAAAIIMIWAAAAAACAACJsAQAAAAAACCDCFgAAAAAAgACKsroA+Ga327V161ZJUs+ePRUVxZcKAAAAAIBAczqdKiwslCSNGTNGcXFxp3xN3sEHqa1bt2ry5MlWlwEAAAAAQNhYs2aNJk2adMrXYRkRAAAAAABAADGzJUj17NnTc3vNmjXq06ePhdUAAAAAANA15efne1aWNH4vfioIW4JU4x4tffr0UVZWloXVAAAAAADQ9QWqXyrLiAAAAAAAAAKIsAUA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",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAArExJREFUeJzs3Xd8VfX9x/H3zd4LsiBhhhlQNiLbhRNRHBUZWler9qet1lZrHW1ttdZWratWK8OtIIq4q8jeexNCQkJCJtk79/z+oFxysgM3OTfJ6/l48HjkfO85534OIOa+8/1+vjbDMAwBAAAAAADAKdysLgAAAAAAAKAjIWwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAMDJVqxYIZvNJpvNpilTpjR43qlzbDab0977lltucdxz/vz5TruvsyUlJTnq7NWrl9XltJn28ucDAADODmELAKBdePDBB00fzg3DOKP75Obmytvbmw+8gIubP3++KZCs/cvb21sREREaPXq07r77bq1cubLZ964Z9p36FRERoaqqqmbfo7q6WtHR0XXuk5SU1OS1KSkpeuqppzRt2jTFxsbK399fnp6eCgkJ0cCBA3X55Zfrd7/7nZYtW6aioqIWPUdLfq1YsaLZzwsAaBnCFgBAuzBv3jzH18nJyfrxxx/P6D7vv/++KioqJEn+/v667rrrnFJfZ9ZZZ6nAWhUVFcrKytLmzZv16quvavLkyZo6dapSUlLO6H5ZWVn68ssvm33+119/rePHj7foPcrKyvTggw+qd+/eevTRR/XNN98oNTVVJSUlqqqqUn5+vg4cOKAvv/xSf/7znzV9+nSFhYVp3bp1LX0cAIDFPKwuAACA5hg6dKiGDx+ubdu2SZIWLlzY6BKdhixcuNDx9cyZMxUQEOCsEgG0ksDAQM2dO9c0VlZWpuTkZK1Zs0alpaWSTi7hu+CCC7R+/Xp16dKlxe+zcOFCXXXVVc0+tyUqKip09dVX65tvvnGMeXl5adSoUerbt6/8/PxUUFCgpKQkbd++3fFMlZWVKi4ubtZ7zJ07V4GBgc2uqXv37i16BgBA8xG2AADajXnz5jnClsWLF+vll1+Wr69vs68/ePCgNmzYYLqflc50KVRHcDZLwdD5hIWF6aWXXqr3tZycHN1999368MMPJUkJCQl64okn9M9//rPZ9x88eLD27t2rZcuWKS8vTyEhIY2en5+fr08//dR0bVOefvppR9Bis9n00EMP6be//W2971VZWakVK1boww8/1Hvvvdfs53jyySeZXQYALoJlRACAdmPWrFny9PSUJBUUFGjp0qUtur7mT6J79OihqVOnOrM8ABbo0qWL3n33XY0ePdox9tZbb6mysrLZ95gzZ44kqby8XB988EGT53/44YcqKyuTpDozbupTWVmpf/zjH47jP/zhD3r66acbDHU8PT118cUX69///rdSU1M1fPjwZjwFAMCVELYAANqN8PBwXXbZZY7jlkzjNwxDb7/9tuN4zpw5Tt0FCIB13N3dde+99zqOi4uLtWXLlmZfP2vWLHl4nJzw3Zx/V06d4+npqVmzZjV5/saNG5WXl+e45r777mt2bSEhIWe0JAoAYC3CFgBAu1Jz6c+3337b7AaVP/74o5KTkx3HtX8anZ+fr/fee0933XWXxo4dq65du8rLy0tBQUHq27evbrrpJn344Yey2+3OeRC1fOvnpUuX6uqrr1b37t3l7e2tmJgYXXzxxVq0aFGLdlGRpNLSUi1dulT/93//pwkTJigyMlJeXl4KCAhQr169dM011+jNN990NBOuz6ndYnr37u0YS05ObnDnk5rOpKnu+vXrde+99yo+Pl6hoaHy8fFRTEyMLr30Ur300kvN6mvxxBNPON73iSeekCRVVVVp4cKFuuiiixy/t9HR0ZoxY4Y+//zzZtXWWoqKivTiiy9q2rRpiomJkY+Pj0JDQzVkyBDde++9pmVxTUlJSdGTTz6pSZMmKTIyUt7e3vLy8lKXLl107rnnatasWXr11Vcb/W+qsrJSb7/9tq699lr16dNHAQEB8vDwUGBgoOLi4jRt2jQ99thj2rhxozMev0WGDRtmOk5LS2v2tREREbr00kslSWvXrtXhw4cbPPfIkSNas2aNJOnSSy9VeHh4k/c/duyY4+uwsLAW9VUBALRTBgAA7Uh5ebkRFhZmSDIkGc89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JJ3c9WfChAmaMmWKZsyYoZiYmJY+dpNq73JVVVWltLQ0bdu2TampqZJO7rqUmJio//73v+ratesZv1fv3r01YcIErVq1St98840yMjIkyfFvzcSJE50SaHh5eWnixImaOHGiYywpKUkff/yxnn/+ecessqqqKs2dO1eJiYny8/M76/cFALQNN6sLAADgTF1zzTWOD5UlJSWm7Z0l86yW4cOH1zuToby8XDNnznQELeHh4Xr00Uf1ww8/KCUlRcXFxbLb7TJO9jnTW2+95bi25vKi1nBqe2ZJzf6Q5e/v3+Q5s2bNcgQtgYGB+uUvf6mvvvpKiYmJKioqUnV1teN5ay5Lae3nranms0vNe67a5zUVDjW1LMUKNZ/7TJ5ZqvvcUVFR2rx5sx599FHT8hq73a5du3bplVde0TXXXKPo6Gg9/fTTpmVkNb344otasmSJxowZYxrPyMjQ4sWL9Ytf/EI9evTQdddd1+IgrylhYWF66aWXHL9ee+01ffbZZzpy5IjefPNNx5bXO3fudMrW46eC2aqqKr377rt69913VVVVZXqtNfTq1UsPPvig9u7da1o6lJGRoQ8++KDV3hcA4HyELQCAdsvX11fXX3+943jRokWOr6uqqvTee+85jhv6gLR48WIdOXJE0smlSTt27NAf//hHTZkyRTExMfLz8zN9KG/L2R01Z+mUlJQ065ri4uJGX1+7dq3Wrl3ruP/69ev197//XdOmTVPv3r3l7+8vN7fT3x605fPWVPPZpaafq77zAgMDnVpTW6j53GfyzFL9zx0UFKQ//vGPOnbsmNavX69nn31WM2bMMM0AOXHihB5++GHNnDlThmHU+17XXHONNmzYoOTkZC1YsEB33XWXBg8e7HjdMAwtXrxYI0aM0MGDB5tV/9nw8PDQT3/6U73xxhuOsS+//FILFiw4q/tef/318vX1lXQytD11v9r/5rSWoKAgLVq0yLTscdWqVa3+vgAA5yFsAQC0azVDlBUrVjh6Hnz99deO6f+enp6aNWtWvdf/97//dXx9//33Kzo6utH3S05OPtuSmy08PNzxdXNnCtTu+VBbzeedN2+e6YNyfdryeWsKDg42LeFp7vPXbGJ7NktJrHImf+Y1n9nLy6vRkMnd3V1jx47Vgw8+qE8++UQZGRlatWqVpk+f7jjn008/1eLFixt9zx49emju3Ll6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",
"text/plain": [
""
]
@@ -257,12 +163,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 8\n"
+ "Time step 8\n",
+ "RMSE 0.0016501392716090587, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACdRUlEQVR4nOzdd3xV9f3H8fe92TtAGIGEjSBDARkOUMGKWkexbty21l9b++vQWttf62hr66hV66htHQwXrqqIW0E2YYQ9QxJICIQMsue99/z+CFxybm6Sm3CTc2/yej4eeXjP95577ueQqNx3vt/P12YYhiEAAAAAAAD4hd3qAgAAAAAAALoSwhYAAAAAAAA/ImwBAAAAAADwI8IWAAAAAAAAPyJsAQAAAAAA8CPCFgAAAAAAAD8ibAEAAAAAAPAjwhYAAAAAAAA/ImwBAAAAAADwI8IWAAAAAAAAPyJsAQAAAAAA8CPCFgAAAAAAAD8ibAEAAAAAAPAjwhYAAAAAAAA/ImwBAAAAAADwI8IWAAAAAAAAPyJsAQAAAAAA8CPCFgAAAAAAAD8ibAEAAAAAAPAjwhYAAPxo6dKlstlsstlsOv/885s97/g5NpvNb+992223ua85d+5cv13X37Kzs911Dh482OpyOk2wfH8AAMDJI2wBAAS8e++91/Th3DCMdl2nuLhYERERfOAFAtzcuXNNgaTnV0REhPr06aPJkyfrJz/5iZYtW+bztRuHfce/+vTpI4fD4fM1nE6nkpOTm1wnOzu71dfm5OTokUce0UUXXaTU1FTFxMQoLCxMiYmJGjVqlL773e/q//7v/7Ro0SJVVFS06T7a8rV06VKf7xcA0HaELQCAgHfrrbe6H+/fv1/ffvttu67z1ltvqa6uTpIUExOjq6++2i/1dWfddZYKrFVXV6eCggKtX79e//znP3XeeedpxowZysnJadf1CgoK9Omnn/p8/ueff67Dhw+36T1qamp07733asiQIfr973+vL774Qrm5uaqqqpLD4VBpaal2796tTz/9VH/5y190xRVXqGfPnlq9enVbbwcAEABCrS4AAIDWjBs3ThMmTFB6erokaf78+S0u0WnO/Pnz3Y+vuuoqxcbG+qtEAB0kLi5Ot9xyi2mspqZG+/fv18qVK1VdXS2pYQnfzJkztWbNGvXq1avN7zN//nxdfvnlPp/bFnV1dfre976nL774wj0WHh6uSZMmadiwYYqOjlZZWZmys7O1adMm9z3V19ersrLSp/e45ZZbFBcX53NNAwYMaNM9AADahrAFABAUbr31VnfY8t577+n5559XVFSUz6/fs2eP1q5da7qeldq7FKorOJmlYOh+evbsqeeee87rc0VFRfrJT36it99+W5KUkZGhhx56SM8++6zP1x89erR27NihRYsWqaSkRImJiS2eX1paqg8//ND02tY8+uij7qDFZrPpvvvu0/333+/1verr67V06VK9/fbbevPNN32+j4cffpjZZQAQQFhGBAAICnPmzFFYWJgkqaysTB988EGbXt/4N9EDBw7UjBkz/FkeAAv06tVLb7zxhiZPnuwee/XVV1VfX+/zNW6++WZJUm1trRYuXNjq+W+//bZqamokqcmMG2/q6+v11FNPuY//+Mc/6tFHH2021AkLC9OFF16o//znP8rNzdWECRN8uAsAQKAhbAEABIXevXvrkksucR+3ZRq/YRh67bXX3Mc333yzX3cBAmCdkJAQ3X333e7jyspKbdiwwefXz5kzR6GhDZO9ffnvyvFzwsLCNGfOnFbPT0tLU0lJifs1P//5z32uLTExsV1LogAA1iNsAQAEjcZLf7788kufG1R+++232r9/v/vY87fRpaWlevPNN3XXXXdp6tSpSkpKUnh4uOLj4zVs2DDdcMMNevvtt+VyufxzI2r71s8ffPCBvve972nAgAGKiIhQSkqKLrzwQi1YsKBNu6hIUnV1tT744AP97//+r6ZNm6a+ffsqPDxcsbGxGjx4sK688kq9/PLL7mbC3hzfLWbIkCHusf379ze780lj7Wmqu2bNGt19990aM2aMevToocjISKWkpOjiiy/Wc88951Nfi4ceesj9vg899JAkyeFwaP78+frOd77j/rNNTk7W7Nmz9fHHH/tUW0epqKjQP/7xD1100UVKSUlRZGSkevToobFjx+ruu+82LYtrTU5Ojh5++GGde+656tu3ryIiIhQeHq5evXrp9NNP15w5c/TPf/6zxX+n6uvr9dprr+n73/++hg4dqtjYWIWGhiouLk7Dhw/XRRddpAceeEBpaWn+uP02GT9+vOk4Ly/P59f26dNHF198sSRp1apV2rdvX7PnZmVlaeXKlZKkiy++WL179271+gcPHnQ/7tmzZ5v6qgAAgpgBAECQqK2tNXr27GlIMiQZTz75pE+vu/32292vOeuss0zPvffee0ZERIT7+Za+Tj/9dCMzM7PF91qyZIn7/PPOO6/Z8xpftyXl5eXGd7/73RbrmjZtmnHo0CHj1ltvdY+9+uqrXq+3Zs0aIzY21qf7HTx4sLFx40av13n11Vd9uoa3e8zKynKPDxo0qMX7r6ioMK677rpWr5+cnGx88sknLV7rwQcfdJ//4IMPGrm5ucbZZ5/d4nVvv/12w+l0tnhdX/ny/Tlu0aJFRr9+/Vq97zlz5hiVlZUtXutf//qXERUV5dP36ZxzzvF6jd27dxunnnqqz9/vvXv3tvePyTAM889Xaz8jhmEYe/bsMb3/66+/3uy5jX/+JBnV1dXG22+/7T5+4IEHmn3tQw895D7vnXfeMaqrq03XysrKavKad955x/28zWYzKioqfPkjaJXnfXh7bwCAdWiQCwAIGuHh4brhhhv0/PPPS2qYzv+rX/2qxddUV1fr3XffdR97NsY9cuSIamtrJUkpKSkaPXq0+vXrp+joaFVUVGjnzp3auHGjDMPQ5s2bde6552rTpk2dMrW/vr5el156qZYtW+Ye69evn84991zFxcUpIyNDK1as0IoVK3TllVdq6NChrV7z6NGjqqiokNTwG/0xY8YoJSVFMTExqqqqUkZGhtLS0uRwOJSdna3zzjtPGzdu1PDhw03XOfXUU/XTn/5U5eXl7mUV3naNORlVVVWaOXOmaaZE//79NX36dMXGxrrv3+l06tChQ7riiiv05ptv+rSld0VFhS6++GJt27ZN0dHRmj59ulJTU1VeXq4lS5boyJEjkhr6f4wcOVK/+c1v/HZfrVm4cKFuvPFGOZ1OSQ3LZKZNm6bhw4eroqJCy5cvd8/ceOONN5SVlaVvvvlGkZGRTa71wQcf6K677nIfx8fH66yzzlJKSopCQ0NVWlqqPXv2aNu2bc3OZCovL9d3vvMd97bKdrtdEyZM0KmnnqrY2FhVVVXp4MGD2rx5swoLC/39x+ETz5ksffv2bdPrr7jiCiUmJqqkpESvvfaaexaUp+M/6z169NDll1/uU6PnYcOGuR8bhqHHH39cDz/8cJvqAwAEIYvDHgAA2iQtLc3029wtW7a0eP7rr7/uPjciIsI4evSo6fmPPvrI+Otf/9rib+IzMzONiy66yH2dH/zgB82e68+ZLX/84x9NvxF/5JFHDIfDYTpn9+7dxumnn25IMsLDw32a2fK73/3O2Lp1a7Pvm5+fb9x8883ua11wwQXNntuWWSptfc2Pf/xj93khISHG008/3WSWyZ49e4wzzjjDfV58fHyzv+FvPLPl+GymW2+91SgqKjKdV1lZadxwww3uc2NjY/0yG8GXmS0ZGRmmmUdTpkxp8rPpdDqNJ5980rDb7e7zfvazn3m93vjx493n3H333c3OgikvLzfefvtt4ze/+U2T555++mn3NUaPHm3s2rXL6zVcLpeRlpZm/PjHPzYOHDjQwp9E69o6s+W3v/2t+/ywsDCjuLi42XO9zWwxDMP40Y9+5B5btmxZk9ctX77c/fxdd91lGIbh08wWl8tlDB482PTv8k033WSsXr3acLlcvv2B+HAfzGwBgMBC2AIACDqNlzPce++9LZ7bOCS59tpr2/2edXV1xmmnnWZIMiIjI5v9MOevsKWkpMSIjo52n/PQQw81e60jR44YycnJpmu2tkzFF5dccon7ejt27PB6TkeFLRkZGaYw4bnnnmv2esXFxaYPs7fffrvX8xqHLZKMG264odlrVldXG6mpqe5z33rrLZ/urSW+hC233HKL+5zhw4cbJSUlzV7v73//u/tcu93eZIlbeXm5+/nU1NR2f7C/6qqr3Nf58ssv23WNtmpL2LJjxw4jLi7Off6cOXNaPL+5sGXlypXusR/+8IdNXnfnnXe6n1+1apVhGL6FLYZhGO+++67pvONfvXr1Mr773e8aDzzwgLFo0aIWQ6LW7uOWW24xfvrTn/r09fTTT/v8PgCA9iFsAQAEnUcffdT9AaN///5NZnscl5eXZ4SEhLjPXbx48Um972OPPea+1kcffeT1HH+FLS+88IL7+ZSUFKO2trbF2v7973/7PWxZuHCh+3r/+Mc/vJ7TUWHLb37zG/c548ePbzUoaFxrRESE15CicdgSHh5uHDp0qMVr3nfffe7zf/WrX/l0by1pLWw5evSoqX/Q+++/3+L1nE6nMWbMGPf5999/v+n5gwcPmv4M2+vCCy90X2fTpk3tvk5btBa21NTUGLt37zYef/xxIzEx0X3uqFGjjMOHD7d47ebCFsMwjOHDhxuSjISEBNN4dXW1+31GjBhhGvd1dslLL71kREZGeg1dGs96mTJlivHss8+a3t+X+2jLV0v/bQIA+Ac9WwAAQeemm27S7373O7lcLuXl5emrr77SRRdd1OS8119/3d33ol+/fl7PaaykpERr1qzR9u3bVVRUpIqKCtMORLt27XI/3rRpky6//HI/3VFTS5YscT++7rrrFB4e3uL5119/ve6+++4WdxDyVFVVpTVr1mjr1q0qKChQeXm5+89LMu+ismnTJt+L94NvvvnG/fi2225rddemK6+8Uj179lRxcbFqa2u1evVq9w4z3kybNk39+vVr8ZoTJkxwP87Ozvat8JOwatUqd/+gpKSkVn++7Ha77rjjDt1zzz2SzD8zx68RGRmpmpoabdu2TStXrtQ555zT5rpSU1Pdj1988UX985//bPM1TsbxXa5aYrfbNXv2bD3//PNt7tfS2M0336wHH3xQpaWl+vDDD3XddddJkj788EP39s0333xzu679gx/8QBdeeKEee+wxvfnmmzp69GiTcwzDUFpamtLS0vTYY49pwYIFOv/889t7OwAACxG2AACCzoABA/Sd73xHX3zxhSRpwYIFXoOU480sJenGG29USEiI1+vl5ubq/vvv17vvvuv+sNuajm4Emp6e7n581llntXp+XFycxo4dq40bN7Z6bnFxsR544AHNnz9f5eXlPtXTmY1PDcMwhTtnn312q68JCwvTlClT9Nlnn0mSNm7c2GLYMm7cuFav2bgJcllZWavnn6zG3/MpU6YoNLT1v6Y1Dk/S09NlGIY7mAgPD9fs2bP11ltvyeFwaObMmbruuut09dVX69xzz1ViYqJPdV177bV65ZVXJDWELRs2bNCtt96qiy66qEnjZKtcccUVevnll32+p+bcfPPNeuihh2QYhubPn+8OW47/t8Rms7U7bJGkgQMH6vnnn9dTTz2ltWvXavny5Vq3bp02bNjgbkB8XG5uri688EItXrxYs2bNavXaWVlZPm+lDgDoeIQtAICgdOutt7rDlv/+97+qqKhQbGys+/n09HRt3brVdL436enpuuCCC7z+lrklvoYU7VVQUOB+PHDgQJ9eM3DgwFbDlv379+vcc8/VgQMH2lRPR99vY6Wlpaqvr3cfDxo0yKfXNf6g2Vo4lJCQ0Or1wsLC3I8b19NRGn/P23PPdXV1Ki8vV3x8vHvsqaee0oYNG7R3717V1dVpwYIFWrBggex2u8aMGaPp06frwgsv1CWXXKKIiAiv73HRRRfpZz/7mZ599llJ0rp167Ru3TpJDbv+TJs2Teeff75mz56tlJSUtt52qzx3uXI4HMrLy1N6erpyc3MlNey6lJmZqa+//lpJSUntfq8hQ4Zo2rRpWr58ub744gvl5+dLkvu/NdOnT/dLoBEeHq7p06dr+vTp7rHs7Gy9++67evrpp92zyhwOh2655RZlZmYqOjr6pN8XANB57FYXAABAe1x55ZXuD5VVVVWm7Z0l86yWCRMmeJ3JUFtbq6uuusodtPTu3Vu///3vtWTJEuXk5KiyslIul0tGQ48zvfrqq+7XNl5e1BGOb88syecPWTExMa2eM2fOHHfQEhcXp1/+8pf67LPPlJmZqYqKCjmdTvf9Nl6W0tH321jje5d8uy/P81oLh1pblmKFxvfdnnuWmt53v379tH79ev3+9783La9xuVzaunWrXnjhBV155ZVKTk7Wo48+alpG1tg//vEPvf/++5oyZYppPD8/X++9955+9rOfaeDAgbr66qvbHOS1pmfPnnruuefcXy+++KI++ugjZWVl6eWXX3Zveb1lyxa/bD1+PJh1OBx644039MYbb8jhcJie6wiDBw/Wvffeqx07dpiWDuXn52vhwoUd9r4AgI5B2AIACEpRUVG65ppr3McLFixwP3Y4HHrzzTfdx819QHrvvfeUlZUlqWFp0ubNm/WnP/1J559/vlJSUhQdHW36UN6Zszsaz9Kpqqry6TWVlZUtPr9q1SqtWrXKff01a9bo73//uy666CINGTJEMTExsttP/NWgM++3scb3LrV+X97Oi4uL82tNnaHxfbfnniXv9x0fH68//elPOnjwoNasWaMnnnhCs2fPNs0AOXr0qH7729/qqquukmEYXt/ryiuv1Nq1a7V//37NmzdPd911l0aPHu1+3jAMvffee5o4caL27NnjU/0nIzQ0VHfccYdeeukl99inn36qefPmndR1r7nmGkVFRUlqCG2PX8/zvzkdJT4+XgsWLDAte1y+fHmHvy8AwL8IWwAAQatxiLJ06VJ3z4PPP//cPf0/LCxMc+bM8fr6r7/+2v34F7/4hZKTk1t8v/37959syT7r3bu3+7GvMwU8ez54any/t956q+mDsjedeb+NJSQkmJbw+Hr/jZvYnsxSEqu053ve+J7Dw8NbDJlCQkI0depU3Xvvvfrvf/+r/Px8LV++XFdccYX7nA8//FDvvfdei+85cOBA3XLLLXrxxRe1fft2HThwQA8//LB7BlZRUZF+9atf+VS/P9x4442me/jDH/6gmpqadl8vPj5e3/ve9yQ1NIbevHmzJGn27NmdFuKlpKRozJgx7uNDhw51yvsCAPyHsAUAELSmTZumoUOHSmpYFvHaa69JMi8huuSSS0wfYhvLy8tzP/alYeqyZctOptw2abwTzpo1a1o9v6KiQtu2bWvxnI64345YjmOz2TR+/Hj38fHZOC1xOBzuPiKSNHHiRL/X1dEaf8/T0tKaXdLTWOM/mwkTJrTp+2G32zVt2jR98MEHuvDCC93jH330kc/XkBp2K3rggQf073//2z32xRdf+Nxs2h8ef/xx90yQnJwcvfjiiyd1PW/LkfyxRKktji+PktRsPx0AQOAibAEABC2bzWb6ALRgwQKVlpaaPiy21GOh8ZKZ1pbqbNiwwfRhvqPNmDHD/XjhwoWtNmhduHBhqx9u23K/eXl5+vDDD1uts/EHQn82kZ05c6b78bx585pd2nLcBx98oKKiIndNvuzgFGjOPvts94fqgoICLV68uMXzXS6XqY9Q4z+ztrDZbKZtpo/PCmurxrNL6uvrVVxc3K7rtMfIkSN1/fXXu4+feOKJkwp7Zs2aZdoaPDk52RRIdbTa2lrTVvO+NskGAAQOwhYAQFC75ZZb3L/N37lzp+677z73EoKePXvqsssua/a1x2fFSC3/Nr+qqko/+tGP/FSxb+bMmeNelpGTk6PHHnus2XOLior0wAMPtHpNX+/X6XTqRz/6kerq6lq9ZmJiojvEKSgo8Fvgcuedd7qvu3HjRtOsCU8lJSW677773Mc33HCDT7sNBZrExET3VsOS9Otf/7rFvjnPPfece8ctu93e5Ge0vLzcp++hZF6C1qdPH9Nzvm773fgadrvdtHV2Z/j973/v/pnJy8sz9XJpq5CQEPe2zOvWrdOyZcua3Tq+NWvXrtXf/vY3n3svSQ0zdRpvN97SNuYAgMBE2AIACGpDhgwxbZ/a+EP5DTfcoPDw8GZf2/i3+fPmzdOTTz7ZZOlGRkaGZs2apY0bN/q8Q4w/JCQkmAKEBx54QI899liT+vbu3asLL7xQeXl5Ld6rJF166aXuYGrp0qW69957VV1dbTrn8OHDuuqqq7R48WKf7jciIkIjRoyQ1DCb4YMPPvDl9lo1bNgw3XXXXe7ju+++W88//3yTXZGOf3+ONzqOj4/3KXgKVA888IC7Ue6ePXt00UUXKTMz03SOy+XSM888Y+qL8tOf/rTJlsQbNmzQ4MGD9dBDD2nHjh1e38/pdGrhwoXubZ2lhqV3jZ111lmaM2eOPv3002bDmz179phmkV1wwQWt/jz626hRo3Tttde6jx977DGfwyZvhg8frkmTJmnSpEkaPnx4u69z9OhR/frXv9bgwYP1q1/9Shs3bmx2plZhYaF++ctfmn6GJ0yYQNgCAEEo1OoCAAA4WbfeeqvX/iKtbdM6a9YsnXvuuVq2bJkMw9C9996r559/XhMnTlRCQoL27t2rVatWyel0asCAAfr5z39uCkA62m9/+1t9+eWXWrlypQzD0P33369nnnlG5513nmJjY5WRkaHly5fL6XRq6tSpGjZsmN54441mrzdq1CjdfPPN7p42Tz75pN544w1NnjxZffr0UXZ2tpYtW6a6ujrFxcXpiSee0P/8z/+0WudVV12lv/zlL5IampXOnTtXw4cPNzW5/dvf/tbm+//b3/6m9evXa926dXI4HLr77rv16KOPatq0aYqNjdW+ffu0bNkydwAVGhqql19+uUnoEEyGDRuml156STfeeKOcTqdWr16tkSNHavr06Ro2bJgqKiq0fPlyHTx40P2aM888U48//rjX6x06dEgPP/ywHn74YfXr10/jx49Xv379FBoaqvz8fG3YsMHUy2f69Omm5ThSQ4j25ptv6s0331RUVJROO+00DR06VPHx8Tp69KgyMzO1fv169/lRUVHt+n77wx/+8Ae9/fbbcrlcysnJ0dy5czt9VlpzCgoK9NRTT+mpp55SQkKCzjjjDCUnJysuLk4VFRXau3evNmzY4N5mWpL69u2r119/3bQEsDkPPvhgmxr4zpgxQ1dddVW77gUA4AMDAIAgV1ZWZkRHRxuS3F+nnnqqT689fPiwMXHiRNNrPb9Gjx5tbN++3Xj11VfdY7feeqvX6y1ZssR9znnnndfs+za+fktKS0uNiy++uMX6zj77bCMvL8+49dZb3WOvvvqq1+tVVlYas2bNavF6KSkpxooVK3y+l5KSEmPUqFEtXrOxrKws9/igQYNavP/y8nLj2muvbfHakozk5GTjk08+afFaDz74oPv8Bx98sMVzDcP376WvfPn+HLdo0SKjb9++rd73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Ez3yyU4dKauxqCIAAAA0h7AFAIAgEB0eqkeuHGcaK69x6KFF2y2qCAAAAM0hbAEAIEicd0pvXTlhgGnsk62H9fn2wxZVBAAAAG8IWwAACCJ/uGy0esaEm8Ye+HCbymrqLaoIAAAAnghbAAAIIj1jwvWHy041jeWX1erxz3ZZVBEAAAA8EbYAABBkZo8foHNP6W0ae23NAa3LLraoIgAAADRG2AIAQJCx2Wx6ZPZYRYWFmMbvf2+Lah1Oi6oCAADAcYQtAAAEodSe0bpn1immsX0FlXp+yT6LKgIAAMBxhC0AAASp288ZotNTEkxj/1yaoT355RZVBAAAAImwBQCAoBVit+mv3z9NIXabe6zeaeg3722R02VYWBkAAED3RtgCAEAQG90/XnedO9Q0ln6gRHNXZVtTEAAAAAhbfHHw4EE9/fTTmjVrlgYOHKjw8HD169dPV111ldauXWt1eQCAbu5/LxihIUkxprHHP9ulzIIKiyoCAADo3ghbfPDss8/ql7/8pTIzMzVr1izdc889mjZtmj788EOdffbZWrhwodUlAgC6sciwED36/XGmsVqHS79+l+VEAAAAVgi1uoBgMGXKFC1dulTnnXeeaXz58uW64IIL9OMf/1izZ89WRESERRUCALq7qUN76bazB5uWD23Yf1SvrMjSnR7LjAAAANCxmNnig+9///tNghZJmj59umbMmKGjR49q69atFlQGAMAJ9108UoN6RZvGnvhitzKOsJwIAACgM3V42HLkyBF9/PHHeuCBB3TJJZcoKSlJNptNNptNt912W5uutX//ft1zzz0aNWqUYmJi1LNnT02ePFlPPPGEqqqqOuYGWhEWFiZJCg1lkhAAwFrR4aF64urTZTuxOZHqHC7d+85mlhMBAAB0og5PCPr27euX6yxatEg33XSTysrK3GNVVVVav3691q9fr5deekmLFy/W8OHD/fJ+vjhw4IC++uorJScna9y4ca2/AACADjZlSE/dcc4Qvbwiyz22KadE/1meqf85b5iFlQEAAHQfnbqMaODAgZo1a1abX5eenq7rrrtOZWVlio2N1SOPPKJVq1bp66+/1p133ilJ2rNnjy699FKVl5f7u2yv6uvrdfPNN6u2tlaPPfaYQkJCOuV9AQBozb2zRjbZnejvX+xRxpHO+X8kAABAd9fhM1seeOABTZ48WZMnT1bf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",
+ "image/png": "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qaeeeso+Auvs2bN6+OGHG1S/I9x+++2mZ/jjH/+ooqKiC75fSEiIrr/+eknnFobetWuXJGnKlCnNFuLFxMQoPj7efpySktIs7wsAcAzCFgCASxs1apS6dOki6dy0iLfeekuSeQrRlVdeafoQW9mpU6fsrxuyYOrq1asvptxGqbwTzsaNG+vtn5eXp71799bZpymetymm49hsNvXv399+fH40Tl3Kysrs64hI0sCBAx1eV1Or/Hu+efPmWqf0VFb512bAgAGN+v3w8PDQqFGj9Mknn2jixIn29s8++6zB95DO7Vb0+OOP6/XXX7e3LV++vMGLTTvC3//+d/tIkMTERL366qsXdb+apiM5YopSY5yfHiWp1vV0AADOibAFAODSbDab6QPQokWLlJ2dbfqwWNcaC5WnzNQ3VWfbtm2mD/NNbfz48fbXS5YsqXeB1iVLltT74bYxz3vq1Cl9+umn9dZZ+QOhIxeRnTBhgv31ggULap3act4nn3yis2fP2mtqyA5OzmbEiBH2D9VpaWlatmxZnf0rKipM6whV/jVrDJvNZtpm+vyosMaqPLqktLRUGRkZF3SfC9GjRw/deuut9uNnn332osKeSZMmmbYGj4qKMgVSTa24uNi01XxDF8kGADgHwhYAgMubOXOm/af5Bw4c0KOPPmqfQhAREaFrrrmm1mvPj4qR6v5pfkFBgX760586qOKGmT59un1aRmJiop555pla+549e1aPP/54vfds6POWl5frpz/9qUpKSuq9Z1hYmD3ESUtLc1jgcs8999jvu337dtOoiaqysrL06KOP2o9vu+22Bu025GzCwsLsWw1L0q9//es618155ZVX7DtueXh4VPszmpub26DfQ8k8Ba1t27amcw3d9rvyPTw8PExbZzeHxx57zP5n5tSpU6a1XBrL09PTvi3zli1btHr16lq3jq/Ppk2b9NxzzzV47SXp3EidytuN17WNOQDA+RC2AABcXufOnU3bp1b+UH7bbbfJx8en1msr/zR/wYIFev7556tN3UhISNCkSZO0ffv2Bu8Q4wihoaGmAOHxxx/XM888U62+I0eOaOLEiTp16lSdzypJV199tT2YWrlypR555BEVFhaa+pw+fVpTp07VsmXLGvS8vr6+6tatm6Rzoxk++eSThjxevbp27ap7773Xfnz//fdr7ty51XZFOv/7c36h45CQkAYFT87q8ccfty+Ue/jwYU2ePFlHjx419amoqNBLL71kWhflvvvuq7Yl8bZt29SpUyc9+eST2r9/f43vV15eriVLlti3dZbOTb2rbPjw4Zo+fbq+/PLLWsObw4cPm0aRXXbZZfX+eXS0nj176pZbbrEfP/PMMw0Om2oSFxenwYMHa/DgwYqLi7vg+2RmZurXv/61OnXqpIcffljbt2+vdaRWenq6HnroIdOf4QEDBhC2AICL8bK6AAAAHGHWrFk1ri9S3zatkyZN0pgxY7R69WoZhqFHHnlEc+fO1cCBAxUaGqojR45o/fr1Ki8vV3R0tB588EFTANLUfve73+mbb77RunXrZBiGfvvb3+qll17S2LFjFRQUpISEBK1Zs0bl5eUaNmyYunbtqnfeeafW+/Xs2VMzZsywr2nz/PPP65133tGQIUPUtm1bHT9+XKtXr1ZJSYmCg4P17LPP6mc/+1m9dU6dOlV/+9vfJJ1brHT+/PmKi4szLXL73HPPNfr5n3vuOW3dulVbtmxRWVmZ7r//fj399NMaNWqUgoKC9MMPP2j16tX2AMrLy0tvvvlmtdDBlXTt2lVvvPGGbr/9dpWXl2vDhg3q0aOHRo8era5duyovL09r1qxRcnKy/ZpLL71Uf//732u8X0pKip566ik99dRTateunfr376927drJy8tLZ86c0bZt20xr+YwePdo0HUc6F6ItXrxYixcvlr+/vy655BJ16dJFISEhyszM1NGjR7V161Z7f39//wv6/XaEP/7xj3rvvfdUUVGhxMREzZ8/v9lHpdUmLS1NL7zwgl544QWFhoZq0KBBioqKUnBwsPLy8nTkyBFt27bNvs20JEVGRurtt982TQGszRNPPNGoBXzHjx+vqVOnXtCzAADqYQAA0ALk5OQYAQEBhiT7V69evRp07enTp42BAwearq361bt3b2Pfvn3GvHnz7G2zZs2q8X4rVqyw9xk7dmyt71v5/nXJzs42rrjiijrrGzFihHHq1Clj1qxZ9rZ58+bVeL/8/Hxj0qRJdd4vJibGWLt2bYOfJSsry+jZs2ed96zs2LFj9vaOHTvW+fy5ubnGLbfcUue9JRlRUVHGF198Uee9nnjiCXv/J554os6+htHw38uGasjvz3lLly41IiMj633u2267zcjPz6/xHhs3bjS8vLzqvcf5r5tuusnIycmpdp8+ffo0+B6dO3c21q1bd9G/VpX/X6vvz0hVN998s6me0tJS0/nKf/4kGYWFhRdcZ2Fhoelex44dq9bn4MGDxtixYw1PT88G/zpKMq688krj6NGjtb531edo7NeDDz54wc8NAKgbI1sAAC1CcHCwbrjhBr399tv2tvpGtZwXGRmp9evX64033tC7776rvXv3qqCgQG3btlWPHj00bdo03X777QoICNDmzZub6hFqFRISoi+//FIfffSR5s+fry1btigjI0OtW7dWr169dPvtt+uOO+4wjSKpS0BAgL788ku98847WrBggXbs2KGcnBy1bt1aXbp00dSpUzV79myFh4dr5cqVDbpnaGiotmzZon/9619atmyZDhw4oKysLIes3xIUFKQlS5boV7/6lRYtWqSVK1fq1KlTKiwsVOvWrdWnTx9dc801uuuuu5p1mldTu+aaa5SQkKD//ve/+vzzz7Vv3z6lp6fL399f7du31/jx4zVz5kwNGzas1nsMGzZMqamp+vbbb7V27Vrt2LFDP/zwg86ePavy8nKFhISoa9euuvTSS3XHHXdo6NChNd5n586d2rhxo1asWKHNmzfr0KFDOnXqlAoKChQQEGAfMXPdddfplltusXznnD/+8Y/64IMPZBiGjh07pkWLFunOO++0rJ4ePXpo5cqVSk9P18qVK7V27Vrt2bNHCQkJOnv2rIqKihQQEKDw8HD17NlTQ4cO1S233NKgHcMAAM7JZhj1LO0PAAAAAACABmOBXAAAAAAAAAcibAEAAAAAAHAgwhYAAAAAAAAHImwBAAAAAABwIMIWAAAAAAAAByJsAQAAAAAAcCDCFgAAAAAAAAcibAEAAAAAAHAgwhYAAAAAAAAHImwBAAAAAABwIMIWAAAAAAAAByJsAQAAAAAAcCDCFgAAAAAAAAfysroA1KyoqEh79uyRJLVp00ZeXvxWAQAAAADgaGVlZUpLS5Mk9e3bV35+fhd9Tz7BO6k9e/Zo6NChVpcBAAAAAIDb2Lx5s4YMGXLR92EaEQAAAAAAgAMxssVJtWnTxv568+bNioqKsrAaAAAAAABappSUFPvMksqfxS8GYYuTqrxGS1RUlGJiYiysBgAAAACAls9R66UyjQgAAAAAAMCBCFsAAAAAAAAciLAFAAAAAADAgQhbAAAAAAAAHIiwBQAAAAAAwIEIWwAA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",
"text/plain": [
""
]
@@ -275,12 +182,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 9\n"
+ "Time step 9\n",
+ "RMSE 0.002937948835042848, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACgSklEQVR4nOzdd3hb5d3/8Y/kGccre9mZzk7IABJGQggrjEKTsh42dPFrCw8dlNKWEehilFmg0AcKSdhlBNIwwsjeey8nduKRxHsvWTq/P0wUH3nJtuyj8X5dly90bh0dfWU7xvr4vr+3zTAMQwAAAAAAAPAJu9UFAAAAAAAABBPCFgAAAAAAAB8ibAEAAAAAAPAhwhYAAAAAAAAfImwBAAAAAADwIcIWAAAAAAAAHyJsAQAAAAAA8CHCFgAAAAAAAB8ibAEAAAAAAPAhwhYAAAAAAAAfImwBAAAAAADwIcIWAAAAAAAAHyJsAQAAAAAA8CHCFgAAAAAAAB8ibAEAAAAAAPAhwhYAAAAAAAAfImwBAAAAAADwIcIWAAAAAAAAHyJsAQAAAAAA8CHCFgAAfGjZsmWy2Wyy2Ww6//zzmzzv5Dk2m81nz3377be7r/nGG2/47Lq+lp6e7q5z8ODBVpfTaQLl6wMAANqPsAUA4Pfuvfde05tzwzDadJ2CggJFRUXxhhfwc2+88YYpkPT8iIqKUu/evXXmmWfq5z//uVasWOH1teuHfSc/evfurdraWq+v4XQ61a9fvwbXSU9Pb/GxGRkZ+stf/qJZs2YpOTlZXbt2VUREhBITEzVq1Chdfvnl+uMf/6hFixaprKysVa+jNR/Lli3z+vUCAFqPsAUA4Pduu+029+0jR45o+fLlbbrOu+++q5qaGklS165ddc011/ikvlAWqrNUYK2amhrl5uZq06ZN+uc//6kZM2Zo5syZysjIaNP1cnNz9fnnn3t9/pdffqnjx4+36jmqqqp07733asiQIXrggQe0ZMkSZWZmqqKiQrW1tSouLtb+/fv1+eef669//auuuuoqde/eXWvXrm3tywEA+IFwqwsAAKAl48eP16RJk7R161ZJ0vz585tdotOU+fPnu29fffXVio2N9VWJADpIXFycbr31VtNYVVWVjhw5otWrV6uyslJS3RK+Cy64QOvWrVOPHj1a/Tzz58/XlVde6fW5rVFTU6Pvf//7WrJkiXssMjJSZ5xxhoYNG6aYmBiVlJQoPT1d27Ztc78mh8Oh8vJyr57j1ltvVVxcnNc1DRgwoFWvAQDQOoQtAICAcNttt7nDlg8//FAvvviiunTp4vXjDxw4oPXr15uuZ6W2LoUKBu1ZCobQ0717d73wwguN3pefn6+f//znev/99yVJqampmjt3rv7xj394ff0xY8Zoz549WrRokYqKipSYmNjs+cXFxfrkk09Mj23JY4895g5abDab7rvvPt1///2NPpfD4dCyZcv0/vvv65133vH6dTzyyCPMLgMAP8IyIgBAQLjxxhsVEREhSSopKdHChQtb9fj6f4keOHCgZs6c6cvyAFigR48eevvtt3XmmWe6x15//XU5HA6vr3HLLbdIkqqrq/Xee++1eP7777+vqqoqSWow46YxDodDzzzzjPv40Ucf1WOPPdZkqBMREaGLL75Y//d//6fMzExNmjTJi1cBAPA3hC0AgIDQq1cvXXbZZe7j1kzjNwxDb775pvv4lltu8ekuQACsExYWprvuust9XF5ers2bN3v9+BtvvFHh4XWTvb35uXLynIiICN14440tnr9hwwYVFRW5H3PPPfd4XVtiYmKblkQBAKxH2AIACBj1l/589dVXXjeoXL58uY4cOeI+9vxrdHFxsd555x3deeedmjp1qnr27KnIyEjFx8dr2LBhuuGGG/T+++/L5XL55oWo9Vs/L1y4UN///vc1YMAARUVFKSkpSRdffLEWLFjQql1UJKmyslILFy7U//7v/2ratGnq06ePIiMjFRsbq8GDB2vOnDl67bXX3M2EG3Nyt5ghQ4a4x44cOdLkzif1taWp7rp163TXXXdp7Nix6tatm6Kjo5WUlKRLL71UL7zwgld9LebOnet+3rlz50qSamtrNX/+fF100UXuz22/fv00e/Zs/fe///Wqto5SVlam559/XrNmzVJSUpKio6PVrVs3jRs3TnfddZdpWVxLMjIy9Mgjj+i8885Tnz59FBUVpcjISPXo0UMTJkzQjTfeqH/+85/N/ptyOBx688039YMf/EBDhw5VbGyswsPDFRcXp5SUFM2aNUsPPfSQNmzY4IuX3yoTJ040HWdnZ3v92N69e+vSSy+VJK1Zs0aHDh1q8ty0tDStXr1aknTppZeqV69eLV4/KyvLfbt79+6t6qsCAAhgBgAAAaK6utro3r27IcmQZDz11FNePe6OO+5wP+bss8823ffhhx8aUVFR7vub+5gwYYJx+PDhZp9r6dKl7vNnzJjR5Hn1r9uc0tJS4/LLL2+2rmnTphnHjh0zbrvtNvfY66+/3uj11q1bZ8TGxnr1egcPHmxs2bKl0eu8/vrrXl2jsdeYlpbmHh80aFCzr7+srMy4/vrrW7x+v379jM8++6zZaz388MPu8x9++GEjMzPTOOecc5q97h133GE4nc5mr+stb74+Jy1atMjo27dvi6/7xhtvNMrLy5u91iuvvGJ06dLFq6/Tueee2+g19u/fb4wePdrrr/fBgwfb+mkyDMP8/dXS94hhGMaBAwdMz//WW281eW797z9JRmVlpfH++++7jx966KEmHzt37lz3ef/5z3+MyspK07XS0tIaPOY///mP+36bzWaUlZV58ylokefraOy5AQDWoUEuACBgREZG6oYbbtCLL74oqW46/69//etmH1NZWakPPvjAfezZGDcnJ0fV1dWSpKSkJI0ZM0Z9+/ZVTEyMysrKtHfvXm3ZskWGYWj79u0677zztG3btk6Z2u9wOHTFFVdoxYoV7rG+ffvqvPPOU1xcnFJTU7Vq1SqtWrVKc+bM0dChQ1u8ZmFhocrKyiTV/UV/7NixSkpKUteuXVVRUaHU1FRt2LBBtbW1Sk9P14wZM7RlyxalpKSYrjN69Gj94he/UGlpqXtZRWO7xrRHRUWFLrjgAtNMif79+2v69OmKjY11v36n06ljx47pqquu0jvvvOPVlt5lZWW69NJLtWvXLsXExGj69OlKTk5WaWmpli5dqpycHEl1/T9Gjhyp3/3udz57XS157733dNNNN8npdEqqWyYzbdo0paSkqKysTCtXrnTP3Hj77beVlpamb7/9VtHR0Q2utXDhQt15553u4/j4eJ199tlKSkpSeHi4iouLdeDAAe3atavJmUylpaW66KKL3Nsq2+12TZo0SaNHj1ZsbKwqKiqUlZWl7du3Ky8vz9efDq94zmTp06dPqx5/1VVXKTExUUVFRXrzzTfds6A8nfxe79atm6688kqvGj0PGzbMfdswDD3xxBN65JFHWlUfACAAWRz2AADQKhs2bDD9NXfHjh3Nnv/WW2+5z42KijIKCwtN93/66afG3/72t2b/En/48GFj1qxZ7uv86Ec/avJcX85sefTRR01/Ef/LX/5i1NbWms7Zv3+/MWHCBEOSERkZ6dXMlj/84Q/Gzp07m3zeEydOGLfccov7WhdeeGGT57ZmlkprH/Ozn/3MfV5YWJjx7LPPNphlcuDAAeP00093nxcfH9/kX/jrz2w5OZvptttuM/Lz803nlZeXGzfccIP73NjYWJ/MRvBmZktqaqpp5tGUKVMafG86nU7jqaeeMux2u/u8u+++u9HrTZw40X3OXXfd1eQsmNLSUuP99983fve73zW479lnn3VfY8yYMca+ffsavYbL5TI2bNhg/OxnPzOOHj3azGeiZa2d2fL73//efX5ERIRRUFDQ5LmNzWwxDMP46U9/6h5bsWJFg8etXLnSff+dd95pGIbh1cwWl8tlDB482PRv+eabbzbWrl1ruFwu7z4hXrwOZrYAgH8hbAEABJz6yxnuvffeZs+tH5Jcd911bX7Ompoa47TTTjMkGdHR0U2+mfNV2FJUVGTExMS4z5k7d26T18rJyTH69etnumZLy1S8cdlll7mvt2fPnkbP6aiwJTU11RQmvPDCC01er6CgwPRm9o477mj0vPphiyTjhhtuaPKalZWVRnJysvvcd99916vX1hxvwpZbb73VfU5KSopRVFTU5PWefvpp97l2u73BErfS0lL3/cnJyW1+Y3/11Ve7r/PVV1+16Rqt1ZqwZc+ePUZcXJz7/BtvvLHZ85sKW1avXu0e+/GPf9zgcT/5yU/c969Zs8YwDO/CFsMwjA8++MB03smPHj16GJdffrnx0EMPGYsWLWo2JGrpddx6663GL37xC68+nn32Wa+fBwDQNoQtAICA89hjj7nfYPTv37/BbI+TsrOzjbCwMPe5ixcvbtfzPv744+5rffrpp42e46uw5aWXXnLfn5SUZFRXVzdb27/+9S+fhy3vvfee+3rPP/98o+d0VNjyu9/9zn3OxIkTWwwK6tcaFRXVaEhRP2yJjIw0jh071uw177vvPvf5v/71r716bc1pKWwpLCw09Q/66KOPmr2e0+k0xo4d6z7//vvvN92flZVl+hy21cUXX+y+zrZt29p8ndZoKWypqqoy9u/fbzzxxBNGYmKi+9xRo0YZx48fb/baTYUthmEYKSkphiQjISHBNF5ZWel+nuHDh5vGvZ1d8uqrrxrR0dGNhi71Z71MmTLF+Mc//mF6fm9eR2s+mvvZBADwDXq2AAACzs0336w//OEPcrlcys7O1tdff61Zs2Y1OO+tt95y973o27dvo+fUV1RUpHXr1mn37t3Kz89XWVmZaQeiffv2uW9v27ZNV155pY9eUUNLly51377++usVGRnZ7Pn/8z//o7vuuqvZHYQ8VVRUaN26ddq5c6dyc3NVWlrq/nxJ5l1Utm3b5n3xPvDtt9+6b99+++0t7to0Z84cde/eXQUFBaqurtbatWvdO8w0Ztq0aerbt2+z15w0aZL7dnp6uneFt8OaNWvc/YN69uzZ4veX3W7XD3/4Q/3mN7+RZP6eOXmN6OhoVVVVadeuXVq9erXOPffcVteVnJzsvv3yyy/rn//8Z6uv0R4nd7lqjt1u1+zZs/Xiiy+2ul9LfbfccosefvhhFRcX65NPPtH1118vSfrkk0/c2zffcsstbbr2j370I1188cV6/PHH9c4776iwsLDBOYZhaMOGDdqwYYMef/xxLViwQOeff35bXw4AwEKELQCAgDNgwABddNFFWrJkiSRpwYIFjQYpJ5tZStJNN92ksLCwRq+XmZmp+++/Xx988IH7zW5LOroR6NatW923zz777BbPj4uL07hx47Rly5YWzy0oKNBDDz2k+fPnq7S01Kt6OrPxqWEYpnDnnHPOafExERERmjJlir744gtJ0pYtW5oNW8aPH9/iNes3QS4pKWnx/Paq/zWfMmWKwsNb/jWtfniydetWGYbhDiYiIyM1e/Zsvfvuu6qtrdUFF1yg66+/Xtdcc43OO+88JSYmelXXddddp3//+9+S6sKWzZs367bbbtOsWbMaNE62ylVXXaXXXnvN69fUlFtuuUVz586VYRiaP3++O2w5+bPEZrO1OWyRpIEDB+rFF1/UM888o/Xr12vlypXauHGjNm/e7G5AfFJmZqYuvvhiLV68WJdcckmL105LS/N6K3UAQMcjbAEABKTbbrvNHbZ8/PHHKisrU2xsrPv+rVu3aufOnabzG7N161ZdeOGFjf6VuTnehhRtlZub6749cOBArx4zcODAFsOWI0eO6LzzztPRo0dbVU9Hv976iouL5XA43MeDBg3y6nH132i2FA4lJCS0eL2IiAj37fr1dJT6X/O2vOaamhqVlpYqPj7ePfbMM89o8+bNOnjwoGpqarRgwQItWLBAdrtdY8eO1fTp03XxxRfrsssuU1RUVKPPMWvWLN199936xz/+IUnauHGjNm7cKKlu159p06bp/PPP1+zZs5WUlNTal90iz12uamtrlZ2dra1btyozM1NS3a5Lhw8f1jfffKOePXu2+bmGDBmiadOmaeXKlVqyZIlOnDghSe6fNdOnT/dJoBEZGanp06dr+vTp7rH09HR98MEHevbZZ92zympra3Xrrbfq8OHDiomJaffzAgA6j93qAgAAaIs5c+a431RWVFSYtneWzLNaJk2a1OhMhurqal199dXuoKVXr1564IEHtHTpUmVkZKi8vFwul0tGXY8zvf766+7H1l9e1BFObs8syes3WV27dm3xnBtvvNEdtMTFxelXv/qVvvjiCx0+fFhlZWVyOp3u11t/WUpHv9766r92ybvX5XleS+FQS8tSrFD/dbflNUsNX3ffvn21adMmPfDAA6blNS6XSzt37tRLL72kOXPmqF+/fnrsscdMy8jqe/755/XRRx9pypQppvETJ07oww8/1N13362BAwfqmmuuaXWQ15Lu3bvrhRdecH+8/PLL+vTTT5WWlqbXXnvNveX1jh07fLL1+Mlgtra2Vm+//bbefvtt1dbWmu7rCIMHD9a9996rPXv2mJYOnThxQu+9916HPS8AoGMQtgAAAlKXLl107bXXuo8XLFjgvl1bW6t33nnHfdzUG6QPP/xQaWlpkuqWJm3fvl1/+tOfdP755yspKUkxMTGmN+WdObuj/iydiooKrx5TXl7e7P1r1qzRmjVr3Ndft26dnn76ac2aNUtDhgxR165dZbef+tWgM19vffVfu9Ty62rsvLi4OJ/W1Bnqv+62vGap8dcdHx+vP/3pT8rKytK6dev05JNPavbs2aYZIIWFhfr973+vq6++WoZhNPpcc+bM0fr163XkyBHNmzdPd955p8aMGeO+3zAMffjhh5o8ebIOHDjgVf3tER4erh/+8Id69dVX3WOff/655s2b167rXnvtterSpYukutD25PU8f+Z0lPj4eC1YsMC07HHlypUd/rwAAN8ibAEABKz6IcqyZcvcPQ++/PJL9/T/iIgI3XjjjY0+/ptvvnHf/uUvf6l+/fo1+3xHjhxpb8le69Wrl/u2tzMFPHs+eKr/em+77TbTG+XGdObrrS8hIcG0hMfb11+/iW17lpJYpS1f8/qvOTIystmQKSwsTFOnTtW9996rjz/+WCdOnNDKlSt11VVXuc/55JNP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l5aWppEjR6pVq1YKCAhQ06ZN1adPHyUlJenChQsVGuPgwYP6wx/+oC5duqhx48by8/NTaGioBg0apOeee04nT5684RgbN27U3XffrdDQUAUEBKhNmzaaMWOGjh8/Xu55ubm5evrpp3XrrbeqUaNG8vPzU4sWLdSlSxfdf//9Sk1N1fnz5yt0HQAAoGw2wzAMq4sAAAC43tatWxUfHy9Jmj9/vp555plKjxEREaGcnBxNmDBBAwYM0PTp02W3252OCwgI0Ouvv65Ro0aVOs7ly5c1duxYrV27tsz3atmypdLT0xUdHV3q/sLCQj3xxBN66aWXVN63XxMmTCjxiOfs7Gy1adNGkpSSkqJvvvlGSUlJpZ4bEhKibdu2qWPHjk77tm/frrvuuuuGYUpaWpruuuuuco8BAADlY80WAADg8fbv36/Vq1erefPmmjNnjmJjY3X58mWtW7dOL730kq5cuaIHHnhAbdq0UUxMjNP5EyZMcAQt3bp102OPPaaOHTvq559/1htvvKHU1FTl5uYqISFBX3zxhW666SanMR566CEtX75ckhQWFqaZM2eqb9++atSokU6fPq1du3bp7bffLvc6XnvtNWVkZGjgwIGaPn26oqKidPbsWa1cuVIrV67U6dOnNXnyZGVmZpY478qVKxozZozOnz+vBg0aaMaMGYqPj1fz5s2Vn5+vo0ePKiMjo9wwCQAAVBwzWwAAgEsqPrOlok8juuWWW+Tn5+f4+trMFklq3bq1du7cqdDQ0BLnfPTRRxoyZIjsdrt69uypXbt2ldifnp7umOmRkJCgdevWyd/fv8Qxr732mh566CFJ0n333ac333yzxP5///vfGj58uCSpT58+WrdunYKDg0u9hmPHjik8PNzxdfGZLZI0bdo0vfLKK7LZbCXOmzZtmpKTkyVJe/fuVffu3R37tmzZooSEBEnlz1yx2+26ePGiGjZsWOp+AABQMYQtAADAJRUPWyrq6NGjioiIcHxdPGx5++23de+995Z63sMPP6yXX35Z0tV1XYrPbhk2bJjWr18vPz8/ffvttyWCkOIGDx6sTZs2ydfXV99//73CwsIc+/r27avMzEzVq1dPWVlZatmyZYWvqXjYEhYWpqNHjyogIMDpuG+++UYdOnSQJP3973/XrFmzHPtWr16tBx54QJJ07tw5whQAAGoYC+QCAACP17hx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",
+ "image/png": "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qeDJVU2bNs2xUO6ePXs0fPhw7d+/3zTGbrfr1VdfNa2Lctddd5XYknjDhg1q2bKlnnzySe3YsaPU9ysqKtL8+fMd2zpLpx+9K65fv34aO3asvv/++zLDmz179phmkV1yySUV/nl0tg4dOujGG290HD/33HOVDptKEx0drV69eqlXr16Kjo4+5+ucOnVK//jHP9SyZUvdf//92rhxY5kztU6cOKH77rvP9Ge4R48ehC0A4Ga8rG4AAABnmDRpUqnri1S0TeuwYcM0ePBgLV26VIZh6MEHH9Sbb76pCy64QCEhIdq7d69WrlypoqIiNWvWTPfcc48pAKlu//znP/Xzzz9rxYoVMgxDjzzyiF599VUNGTJEgYGBiouL07Jly1RUVKS+ffuqTZs2+vjjj8u8XocOHTRhwgTHmjYvvfSSPv74Y/Xu3VsRERE6cOCAli5dqvz8fAUFBemFF17QHXfcUWGfo0aN0n/+8x9JpxcrnTVrlqKjo02L3L744otVvv8XX3xR69ev17p161RYWKipU6fq2Wef1cCBAxUYGKh9+/Zp6dKljgDKy8tLM2bMKBE6uJM2bdpo+vTpGjdunIqKirRq1Sq1b99egwYNUps2bZSZmally5bp8OHDjtdceOGFev7550u93tGjR/XUU0/pqaeeUuPGjdW9e3c1btxYXl5eSkpK0oYNG0xr+QwaNMj0OI50OkSbN2+e5s2bp3r16qlr165q3bq1goODderUKe3fv1/r1693jK9Xr945/X47w7/+9S99+umnstvtSkhI0KxZs2p8VlpZkpOT9fLLL+vll19WSEiIevbsqSZNmigoKEiZmZnau3evNmzY4NhmWpIaNWqkjz76yPQIYFmeeOKJKi3gO3ToUI0aNeqc7gUAUAEDAIBaID093fD39zckOb46duxYqdceO3bMuOCCC0yvPfurU6dORmxsrDFz5kxHbdKkSaVeb/HixY4xQ4YMKfN9i1+/PGlpacbll19ebn/9+/c3jhw5YkyaNMlRmzlzZqnXy8rKMoYNG1bu9SIjI43ly5dX+l5SU1ONDh06lHvN4uLj4x31Fi1alHv/GRkZxo033ljutSUZTZo0Mb777rtyr/XEE084xj/xxBPljjWMyv9eVlZlfn/OWLhwodGoUaMK73vMmDFGVlZWqddYvXq14eXlVeE1znxdf/31Rnp6eonr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ZInq1q3r8j0kJiYqNDTU/nPBlS2S9Mwzz2jGjBmyWCwO5z3zzDOaOXOmJGn79u3q0qWL/dgvv/yivn37Sip65YrValV6errq1Knj8jgAAHAPYQsAAPBIBcMWdx07dkxhYWH2nwuGLd99950eeughl+c9//zz+uyzzyTl7+tScHXLoEGDtHTpUvn6+urIkSMOQUhB/fv314oVK+Tj46Pjx4+rcePG9mO33XabNmzYoJo1ayo2NlZNmjRx+z0VDFsaN26sY8eOyd/f36nfoUOH1KZNG0nSRx99pBdeeMF+bN68eXr88cclSRcvXiRMAQCgnLFBLgAAqPKuu+46+8oSV0aOHGl/vWLFCvtrq9WqmJgYSdKAAQMKDVqk/JUlV89ZtWqVvf3s2bPauHGjJGnw4MElClqu9fDDD7sMWqT8VT2BgYGSpKNHjzocKxj8zJ49u9TXBwAA7iFsAQAAHm/ixImy2WzF/im4qqWgLl26yMen8K3qwsPD7bcG7dmzx95+9OhRpaenS5JuvfXWImsseHzv3r321zt37rRviNu7d++i32gxrq5cKcx1110nSbp06ZJDe69evXTDDTdIkl588UVFRERoypQpWrdunbKzs8tUEwAAcEbYAgAAqryGDRsWedzHx0f16tWTJJ07d87eXvB1cWMU3Aum4Hmpqan21wVXmJRGzZo1izzu5ZX/V7vc3FyHdl9fXy1atMj+lKItW7bo9ddfV69evVS3bl0NHDhQ8+bNczoPAACUDmELAACo8q7dTNasMczUrl077dmzRz/88INGjhypli1bSpIyMjL0008/6fHHH9ett96qM2fOmFwpAACVH2ELAACo8k6fPl3kcavVal+NcnWFy7Wvixvj1KlTLs9r0KCB/fXJkyfdK7iceHt764EHHtBXX32l2NhYJScna9asWerataskadu2bRo9erSpNQIAUBUQtgAAgCpv586dslqthR7ftWuXfe+SDh062NtvuOEG+607mzZtKvIaBR8ZXXCMLl262FfFrF69uuTFl6PGjRtrxIgR2rBhg26++WZJ0uLFi5WRkWFyZQAAVG6ELQAAoMo7d+6cFi1aVOjxWbNm2V/369fP/trHx0d33HGHJGn58uVKSkoqdIyZM2faz7nzzjvt7fXq1dNtt90mSVq4cKGSk5NL9R7Kk6+vr/19Wq1WXbhwwdyCAACo5AhbAABAtTB27FiXtwLFxMToiy++kCR17dpVt9xyi8PxP/7xj5Kk7OxsjRo1Sjk5OU5jzJo1Sz///LMk6cEHH3TaCPcvf/mLJCk9PV2PPPKILl68WGidRQU6pbVmzRrFxcUVejw7O9v+iOvAwEAFBwcbXgMAANVJ4c9ABAAA8BBnzpxxeJxyYWrUqKEbb7zRqb1z587av3+/unbtqvHjxysiIkJZWVlasmSJPvzwQ1mtVvn4+OiTTz5xOjcyMlKPPPKI/vWvf+nnn39W9+7dNXbsWLVp00bnz5/X/Pnz7Stj6tWrpw8++MBpjPvuu0+jRo3SV199pfXr16tdu3YaM2aMevbsqTp16ig1NVVbt27VggUL1LlzZ0VFRZX8/6QirFy5Um+//bZ69+6tyMhIderUScHBwcrIyNDhw4f1+eefa/v27ZKkUaNGFfmYbAAAUDw+SQEAgMf77LPP9NlnnxXbr3Pnztq5c6dTe3h4uMaMGaPnnntOY8aMcTru5+enOXPm6NZbb3U57ty5c2W1WvXDDz9o+/bteuKJJ5z6NGnSRNHR0WratKnLMWbMmKEaNWrok08+UXJysl5//fVC30N5yMvLU0xMjH0Fiyv333+/pkyZUi7XBwCgOiFsAQAA1cLTTz+tDh066MMPP9TatWuVmpqq4OBg9e3bV3/5y1/Url27Qs8NCAjQ999/r0WLFikqKkobN25UamqqatWqpdatW+uBBx7QmDFjFBgYWOgY3t7e+vjjjzVixAjNmDFDq1at0okTJ5Sdna369eurU6dOGjhwoJ588knD3/srr7yiTp06acWKFdqxY4eSk5Ptj3gOCQlRRESEnnrqKUVGRhp+bQAAqiOLzWazmV0EAABAeQgLC1NCQoKGDRtm+K05AAAAhWGDXAAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEE8jAgAAAAAAMBArWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQIQtAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIEIWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAADEbYAAAAAAAAYiLAFAAAAAADAQIQtAAAAAAAABiJsAQAAAAAAMBBhCwAAAAAAgIEIWwAAAAAAAAxE2AIAAAAAAGAgwhYAAAAAAAAD/X8f9q8hYjOUrAAAAABJRU5ErkJggg==",
"text/plain": [
""
]
@@ -293,12 +201,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 10\n"
+ "Time step 10\n",
+ "RMSE 0.006159249938094956, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "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qT43btw4x2euu+4603vz5883vL29He8X99W+fXvj0KFDxV5rxYoVjvG9evUqclz+eYuTkpJiDBgwoNi6unfvbpw8edIYM2aMo2/GjBmFzrdhwwYjICCgVPfbqFEjY+vWrYXOM2PGjFLNUdg9Hj582NF/1VVXFXv/qampxvDhw0ucv169esb3339f7FzPPPOMY/wzzzxjxMXFGddff32x844bN87Iy8srdt7SKs2vzyWLFi0y6tatW+J9jxw50khLSyt2rv/+97+Gr69vqX6dunXrVugc+/btM1q2bFnqX+8DBw6U99tkGIb591dJv0cMwzD2799vuv7nn39e5Nj8v/8kGRkZGca8efMc7WnTphX52WeffdYx7ssvvzQyMjJMcx0+fLjAZ7788kvH+zabzUhNTS3Nt6BEl99HYdcGAFiHA64BAKggXl5eGjFihN555x1JF7eDTJo0qdjPZGRk6KuvvnK0Lz/Y+syZM8rKypIkRUZGqlWrVqpbt678/PyUmpqqPXv2aOvWrTIMQ7/99pt69uyp7du3V8jWkJycHA0cOFCrVq1y9NWtW1c9e/ZUYGCgYmNjtWbNGq1Zs0ZDhw5VkyZNSpzzwoULSk1NlXRxRUXr1q0VGRkpf39/paenKzY2Vhs3blRubq6OHDmiXr16aevWrYqOjjbN07JlSz3yyCNKSUlxbMsp7KlVVyI9PV033nijaaVK/fr11aNHDwUEBDjuPy8vTydPntStt96qL774QnfccUeJc6empuqWW27Rzp075efnpx49eqhhw4ZKSUnRihUrdObMGUkXz79p0aKF/va3vzntvkoyd+5cjRo1Snl5eZIubrPq3r27oqOjlZqaqtWrVztWzsyePVuHDx/Wzz//LB8fnwJzLVy4UA8++KCjHRQUpOuuu06RkZHy8PBQUlKS9u/fr507dxa5kiwlJUU333yz47H0bm5u6tChg1q2bKmAgAClp6frxIkT+u2333Tu3DlnfztK5fKVRBEREWX6/K233qqQkBAlJibqs88+c6xCu9yl3+u1atXS4MGDS3VQe9OmTR2vDcPQv//9bz333HNlqg8AUAVZHFYBAFCjbNy40fSv6b///nux4z///HPHWG9vb+PChQum97/99lvjxRdfLHYlxKFDh4x+/fo55rn33nuLHOvMlUXPP/+8aUXCP//5TyM3N9c0Zt++fUb79u0NSYaXl1epVhY9+eSTxo4dO4q87unTp4177rnHMddNN91U5NiyrBIq62ceeughxzh3d3fj9ddfL7DKZ//+/cY111zjGBcUFFTkCov8K4surSYbM2aMkZCQYBqXlpZmjBgxwjE2ICDAKatBSrOyKDY21rTyq0uXLgV+b+bl5Rmvvvqq4ebm5hj3l7/8pdD5rr76aseYCRMmFLkKKSUlxZg3b57xt7/9rcB7r7/+umOOVq1aGXv37i10DrvdbmzcuNF46KGHjGPHjhXznShZWVcWPfHEE47xnp6exvnz54scW9jKIsMwjAceeMDRt2rVqgKfW716teP9Bx980DAMo1Qri+x2u9GoUSPTf8t33323sX79esNut5fuG1KK+2BlEQBULoRFAABUsPzbYaZMmVLs2Pwhz7Bhw8p9zezsbKNdu3aGJMPHx6fIH0adFRYlJiYafn5+jjHPPvtskXOdOXPGqFevnmnOkrY5lUb//v0d8+3evbvQMa4Ki2JjY01hyNtvv13kfOfPnzf9MD5u3LhCx+UPiyQZI0aMKHLOjIwMo2HDho6xc+bMKdW9Fac0YdHo0aMdY6Kjo43ExMQi5/vPf/7jGOvm5lZgi2RKSorj/YYNG5Y7mLj99tsd8/z444/lmqOsyhIW7d692wgMDHSMHzlyZLHjiwqL1q5d6+i77777Cnzu/vvvd7y/bt06wzBKFxYZhmF89dVXpnGXvmrXrm0MGDDAmDZtmrFo0aJiQ66S7mP06NHGI488Uqqv119/vdTXAQCUD2ERAAAV7F//+pfjB6T69esXWG1zSXx8vOHu7u4Yu3jx4iu67ksvveSY69tvvy10jLPConfffdfxfmRkpJGVlVVsbR988IHTw6K5c+c65nvzzTcLHeOqsOhvf/ubY8zVV19dYtCRv1Zvb+9CQ5b8YZGXl5dx8uTJYuecOnWqY/ykSZNKdW/FKSksunDhgun8rAULFhQ7X15entG6dWvH+Mcff9z0/okTJ0zfw/Lq06ePY57t27eXe56yKCksyszMNPbt22f8+9//NkJCQhxjY2JijFOnThU7d1FhkWEYRnR0tCHJCA4ONvVnZGQ4rtOsWTNTf2lX90yfPt3w8fEpNDTKv+qoS5cuxltvvWW6fmnuoyxfxf3ZBABwDs4sAgCggt1999168sknZbfbFR8fr59++kn9+vUrMO7zzz93nPtSt27dQsfkl5iYqA0bNmjXrl1KSEhQamqq6Qloe/fudbzevn27Bg8e7KQ7KmjFihWO18OHD5eXl1ex4++66y5NmDCh2CeYXS49PV0bNmzQjh07dPbsWaWkpDi+X5L5KU7bt28vffFO8PPPPztejx07tsSnxg0dOlShoaE6f/68srKytH79escTrgrTvXt31a1bt9g5O3To4Hh95MiR0hV+BdatW+c4PyssLKzE319ubm4aP368Jk+eLMn8e+bSHD4+PsrMzNTOnTu1du1adevWrcx1NWzY0PH6/fff13vvvVfmOa7EpafsFcfNzU1DhgzRO++8U+bzivK755579MwzzygpKUnffPONhg8fLkn65ptvlJiY6BhTHvfee6/69Omjl156SV988YUuXLhQYIxhGNq4caM2btyol156SbNmzdINN9xQ3tsBAFiIsAgAgArWoEED3XzzzVq2bJkkadasWYUGQZcOo5WkUaNGyd3dvdD54uLi9Pjjj+urr75y/LBeElcf5Ltt2zbH6+uuu67E8YGBgWrTpo22bt1a4tjz589r2rRp+vTTT5WSklKqeiry4GLDMEzh1PXXX1/iZzw9PdWlSxctXbpUkrR169Ziw6K2bduWOGf+Q8yTk5NLHH+l8v+ad+nSRR4eJf81M3/4s23bNhmG4QhWvLy8NGTIEM2ZM0e5ubm68cYbNXz4cN1xxx3q2bOnQkJCSlXXsGHD9PHHH0u6GBZt2bJFY8aMUb9+/QocfG6VW2+9VR999FGp76ko99xzj5599lkZhqFPP/3UERZd+rPEZrOVOyySpKioKL3zzjt67bXX9Ouvv2r16tXatGmTtmzZ4jhA/JK4uDj16dNHixcvVt++fUuc+/Dhw2rUqFG5awMAOBdhEQAAFhgzZowjLPr666+VmpqqgIAAx/vbtm3Tjh07TOMLs23bNt10002F/it/cUobspTX2bNnHa+joqJK9ZmoqKgSw6KjR4+qZ8+eOnbsWJnqcfX95peUlKScnBxH+6qrrirV5/L/oFxSuBUcHFzifJ6eno7X+etxlfy/5uW55+zsbKWkpCgoKMjR99prr2nLli06cOCAsrOzNWvWLM2aNUtubm5q3bq1evTooT59+qh///7y9vYu9Br9+vXTX/7yF7311luSpE2bNmnTpk2SLj51rHv37rrhhhs0ZMgQ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LnalVUxMTIHPOMvu3buVnp5eoD89PV2TJk2SJA0YMMCp1wRQPtHhAXrxT2217vEbNfGmZgr1L/xct1PJmfrXkr0a8MZqbTpyZUE8AAAAgJrNZWGR3W7X3r17JUlhYWGaOHGiRo0apZ07d5rG7d+/X3/961914403KjExsVzXevjhh/XKK69IuhhQDRw40BSGTJo0Se+++64kaciQIfrss8/k7u5ermtdiczMTJ07d06SStxHWKtWLfn7+0u6uO/QmebNm6e6detqwIABevjhh/X444/rnnvuUVRUlJYuXaoePXrosccec+o1AVyZsABvPdanudY9fqP+ObSNmoT5FzruSEK6hv13vf7x3W5l5uRVcJUAAAAAqgPnHiKUT1JSkuz2i2do7NixQ5s2bVK9evX08ssva8CAAfLx8dGmTZv0t7/9TRs2bNC6des0fvx4LViwoFzXmzx5sjIyMvT0009r9erVGjx4sBYvXqznn39er732miSpf//+mjt3rtPPTiqt/CueAgICShzv7++vtLQ0paamOrWOQYMGKT4+XuvWrdP69euVmpqq4OBgtWvXTnfddZfGjx9fpu9R69atTe2cnByn1gvgDz6e7hrV9SqN6Byl5XvP6MPVh7TxsHklkWFI09cc1s/7zujVO9urQ1Qti6oFAAAAUBW5LDXJ/6SuzMxM+fn5acWKFWrRooWjv2fPnvr555913XXX6bffftPXX3+tX3/91fG0sLJ66qmnlJ6erhdffFE///yz2rRpo4MHD0qSbrzxRi1YsEBeXoVv4agImZmZjtelqcPb21vSxYO8nalTp07q1KmTU+cEULHc3Gzq0ypCfVpF6LfjiXpu0S5tPZZoGnPobJpuf2+dHuzVVI/e3EzeHhW/ohIAAABA1eOybWg+Pj6m9n333WcKii7x9fXVP//5T0d77ty5V3TdF154QY8++qgkOYKi7t2769tvvy1QU0XLf/3s7OwSx186x8nX19dlNTnDrl27TF8///yz1SUBNUr7hiH68s/X68kBMQUOwrYb0nsrD2rwW2u0I67wBwAAAAAAQH4uC4sCAwNN7UuPZC/MTTfd5Nj2tGnTpiu+dlRUlKkdHh5ueVAkmb8npdladml1Vmm2rAGo2dzdbHqgZ1Mt/kt3tY8MLvD+/tOpGvLuWv1n2T5l59otqBAAAABAVeGysMjb21t1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NH3CABMrAgAAtZm/7r9NXw1txIgRjsd79+716tiCggJdfPHFWrZsmUaNGqXMzEy3+9tsNk2YMEH/+9//NH78eK1bt65KNVfHN99843g8YcIEw33CwsJ02223SZKysrK0ZMkSl31yc3Nlt9s9/uNJUCRJo0ePliQtXbrUq/cFAACkPm0SnJ6v3Z+pklKbOcUAAABUkelhUfmhVGcOVatMnTp19Nxzz8lisWjz5s0aPXq0srONVx6x2+2aNGmSPvnkE0nSTTfdpH79+lW98Co6tfpbbGys2+sPHz7c8XjFihV+r+uUU/NMndmTCQAAVG5wh0ZOz/OKS7U5lVXRAABAcDE9LEpMTHQ87tatm9fHT5w4UW+//bYk6bffftMll1yikydPuux33333aerUqZKkG264QdOmTZPFYqli1VW3Y8cOSVLHjh0VEVHxlFFdu3Z1OcZXtm/frvz8fJft+fn5evjhhyVJl112mU+vCQBAKGgSH60uzZwXpli5J8OkagAAAKrG1LDIZrNp8uTJjufXX399lc5zzz336NVXX5UkrV69WmPGjHEKQx5++GH95z//kSRdeeWV+vTTT73uxeQLhYWFysgo+wdjZeMIGzRooNjYWEll4w59afbs2WrevLkuu+wy3XPPPXriiSd06623qk2bNvrhhx80bNgwPfTQQz69JgAAoeK8js69i1bsJSwCAADBxa+roVXmX//6l9auXStJuvrqq6s1LOyRRx5RQUGB/vGPf2jZsmUaO3as5s2bp+eee07/+te/JEmXXnqpPv/8c7c9evypfI+nuLi4SvePjY1VXl6ecnNzfVrH5ZdfrrS0NK1cuVKrVq1Sbm6u6tevr169emncuHGaOHGiV5/RH/7wB6fnJSUlPq0XAIBgMuTsxpq+ItnxfP2BLBUUl6pOVM3/RxUAAEBVmBYWJSYm6oknnpAkNW3aVO+++261z/n3v/9d+fn5eumll7R48WL16NHDMWn2hRdeqDlz5igqKqra16mqwsJCx2NP6oiOjpZUNpG3L/Xv31/9+/f36TkBAECZAR0aKswi2X5fb7a41KYVezI0qnszcwsDAADwkClh0bZt23TVVVfJarUqJiZGX3zxhZo2beqTc7/44osqKCjQG2+84QiKhg4dqu+++04xMTE+uUZVlb9+cXFxpfufmvy7Tp06fqvJF7Zt2+b0vPzSfQAAhJp6MZHq17aBfk0+4dj2zcZDhEUAACBo1PicRfv379fo0aN14sQJhYeH67PPPtP555/v02u0adPG6XnTpk1ND4okKT7+9ISXngwty8vLk+TZkDUAABA4/tjnLKfnP20/qpOFDNMGAADBoUbDorS0NI0aNUppaWmyWCyaNm2arrjiCp9e491333Ws6NWoUdkEk3PmzNFtt90mm83m02t5KyYmxlFTamqq231PnDjhCIvopQMAQHC5vGcLRYSdXnW1yGrTD1uPmFgRAACA52osLMrIyNBFF12kffv2SZLeeust3XbbbT69xrRp03TvvfdKks455xwlJSVp4sSJkqRZs2bpzjvvlN1u9+k1vdW9e3dJ0p49e2S1Wivcb+fOnY7H3bp183tdAADAdxrERumCLs5D7L/ZeMikagAAALxTI2FRdna2Lr74Ym3fvl2SNHnyZEeo4yuzZs3SXXfdJbvdrp49e2rhwoVq0KCBPvzwQ918882SpOnTp+vuu+/26XW9NXToUEllQ8x+++23CvdLTEx0PB4yZIjf6wIAAL51VV/noWgr9x7XkezCCvYGAAAIHH4Pi/Lz8zVmzBitX79ekvS3v/1Nf/3rX316ja+++soxzKxbt25atGiRY7hXWFiYZs6cqeuuu06S9P777+uBBx7w6fW9ceWVVzoeT58+3XAfm82mjz/+WJKUkJCgESNG1ERpAADAh0Z2a6r46NNridjt0neb6F0EAAACn1/DouLiYl111VVasWKFJOmBBx7Q888/79NrzJ07VzfeeKNKS0vVqVMn/fzzzy4rq4WHh2vWrFmO+ZHefPNNPf744z6tw1MDBgzQsGHDJEkfffSRVq1a5bLPa6+9ph07dkgq+8wiIyNrtEYAAFB9MZHhurRnc6dtX29IM6kaAAAAz1nsfpzE55prrtGcOXMkSRdeeKHeeOMNWSyWCvePiopS586dPT5/QUGB2rdvr6NHj6p9+/ZKTEx0Oxl0cXGxrrzySi1YsECStGbNGg0YMMDj6y1fvlx79uxxPM/IyNBjjz0mqWyo2J133um0//jx4w3Ps2HDBg0ZMkQFBQWKi4vTU089pREjRqigoECfffaZPvjgA0lS586dtW7dOqdV1IJBamqq4+eQkpKiVq1amVwRAADmWLk3Qzd9uMZp248Pnq8uzYPr73YAABCY/HX/7dewyF0wZKRt27ZKTk726piVK1fqjjvu0IIFC9SuXbtK9y8sLNTYsWM1ZswYPfjgg15da/z48Zo5c6bH+7v7aOfOnatbbrlFOTk5hq937txZ8+bNU8eOHb2qMRAQFgEAUMZms2vIlMU6XG6uor+P6aY7h3UwsSoAAFBb+Ov+u8ZWQ/OX8847T1u3bvUoKJLKlq//4YcfvA6KfG3s2LHavHmzHnroIXXu3Fl169ZVQkKC+vfvrylTpmjDhg1BGRQBAIDTwsIsuqBLE6dtq/dlmlQNAACAZ/zaswihiZ5FAACc9s2GQ3rw842O5/ViIrTh6dEKD/OuBzYAAMCZ6FkEAAAQhAZ2aOj0PKfQqp1HjIehAwAABALCIgAAAD9qUb+O2jaq67RtDUPRAABAACMsAgAA8LOB7Z17F63ed9ykSgAAACpHWAQAAOBnA9s3cnq+/mCW21VTAQAAzERYBAAA4GfntG3g9Dwjt0hp2YUmVQMAAOAeYREAAICftWtUV/ViIpy2bU7JMqcYAACAShAWAQAA+JnFYlHv1glO2zamZplSCwAAQGUIiwAAAGpAnzPCok30LAIAAAGKsAgAAKAG9GqV4PR866EcldqY5BoAAAQewiIAAIAa0LtVfafnuUVW7T2Wa1I1AAAAFSMsAgAAqAFN68WoZf0Yp23rkk+YVA0AAEDFCIsAAABqSP92DZ2er9l/3KRKAAAAKkZYBAAAUEMGdjgjLNqXKbudeYsAAEBgISwCAACoIQPbN3J6fiSnUAeO55tUDQAAgDHCIgAAgBpydpNYNY6LdtrGUDQguNjtdscfAKitCIsAAABqiMVicRmKtmovYREQLPKKrLpz5jq1f3K+rn53pdJzCs0uCQD8grAIAACgBg1q7xwWLd6ZrmKrzaRqAHhj/pbD+nlnuiRpw8EsfbrmoMkVAYB/EBYBAADUoJHdmjk9zym0asWeDJOqAeCNx77c7PT8zZ+TTKoEAPyLsAgAAKAGtUyoo35tGzhtm7s5zaRqAAAAXBEWAQAA1LAxPVs4Pf9p21EVlpSaVA0AAIAzwiIAAIAadlnPFrJYTj8/WWTVD1uPmFcQAABAOYRFAAAANax5/RgN7tDIadt/1xwwqRoAAABnhEUAAAAmuHlgW6fnvyaf0M4jOSZVAwAAcBphEQAAgAlG/6GZmsRHO237cl2qSdUAAACcRlgEAABggsjwMF3Xr5XTtp93pptUDRB8cgpL9MqPO/X899uVfrLQ7HIAoFYhLAIAADDJJT2aOz3fn5GnfcdyTaoGCC73zdqgd5bs1dTl+3XjB6tlt9vNLgkAag3CIgAAAJP0aFlfTc8YivbzDnoXAZUpLCnVL7uPOZ7vPZanzanZJlYEALULYREAAIBJwsIsurBrU6dtP+88alI1QPCw2lx7EWXmF5tQCQDUToRFAAAAJjozLFqXfEL5xVaTqgGCWC0ehfbbgUy9vThJ65IzzS4FQIiIMLsAAACAUDakY2OFh1lU+ntPCavNro0Hs3Rex8YmVwYELovZBdSgdcmZuv79VbLZpTCL9NmfBmtA+4ZmlwWglqNnEQAAgIlioyPUo2U9p21r9tN7AHCnFncicvG3r7fq1Kg7m1166ust5hYEICQQFgEAAJjszF4CawmLALeMVj6z19IIadfRk07P96SzYiIA/yMsAgAAMNmA9o2cnm9IOaFiq82kaoDAVztjIQAIHIRFAAAAJju3XQOn54UlNm05lGVOMUAQMOhYZLgNAFA1hEUAAAAmS6gbpa7N4522rdhz3KRqgMBnNAwNAOA7hEUAAAAB4LyznVc/S9x9zKRKAGc7Dudo77HAmieHrAi1mc1m19+/2aJ2T8zTha8u1Z70k5UfBPgYYREAAEAAOL+zc1i0MSVL2QUlJlUDlHn2u2269N/LNPK1RL2XuNfschyMsiICJNQWG1Ky9Onqg5KkfRl5emvxHpMrQigiLAIAAAgAA9s3UlTE6X+aldrsWrknw8SKEOqOnSzSjJXJjueTF+yUtTQwJl5nGFr17UnP1V0fr9NdH68LmhXWbDa75m0+rK9+S1WRtdTscvzmlR93Oj3/dmOaSZUglEWYXQAAAACkOlHhGti+oZYlnQ6IluxK16U9W5hYFULZjsM5LtvyS0pVL9z8/2+2kRVVi91u16RP1mnvsTxJ0t5jufr54eGyWCwmV+be37/dqllrynrczNmQqv/eOcjkivyDLBSBwPzf9AAAAJAkDe/cxOn5gq1HVFhSe//3HIEtzCA4sAdGxyLZDQaicX/tuYOZ+Y6gSJL2HcvTgeP5JlZUuVKb3REUSWWLAOw+enoun9wiq/675oDmbzkcND3P1h88oflbDqugmN/zCDyERQAAAAHi0p4tVP7+/GShVT/vSDevIIS0MINOJqWBchMeIGUEq8IS19Sv2Mshhmv2HdeYN5fp8reW6dfkTF+VViGrzbW+5IyywMtut+vad1fqb19v1T3/Xa/JP+x02TfQzFpzUFf/Z6Xu+e96XfHOcqchnny9EQgIiwAAAALEWQl1NKh9I6dtc9anmlQNQl2YQVpUGiDjvwKkjJBls9n14OcbtS0tR1sP5eihzzea2pvnl6QM7TxyupfR+4n7TKvFU099vcXxePfRXM3bctjjYzemZOmxLzbp7cVJKgmQecRQ+xAWAQAABJCrzznL6fmSXemO/z0HalK4QVhkC5CeRUbD0OC56k5NtOdYrg5nFzqep54oULKJw9iM5tcKNis8XNDgeG6Rrntvpb74LVWvLtyt13/a7efKEKoIiwAAAALIpT1bKDYq3PHcZpfeXRo4S5YjdBgNQ7MGSJeeAMmsvGYttWnlngzTw43qfn5GPcwCpddZreDmo3x36V6VlNqdngP+QFgEAAAQQOKiI3TL4LZO275an6pDWQUmVYRQZbQyVmlpYAQCRj2cAn1SY7vdrtunr9VNU9fosjeX6dPVB8wuKegF9k/cP/bT0xQ1hLAIAAAgwNw5tIOiI07/M81qs+u/3FiihhmthmY0ybAZAjwXMrR2f6ZW7Dkuqaz+v3+z1eSKnHkzMs14GJt5P5Rg/D64426YZS17qxVauz9TF766VOe99LPmbfZ8Pif4DmERAABAgGkSH63r+7d22vb5rykqsrK8ck3KK7Iq9UR+wPdY8RejPCBQhqEFI0/npIExo2ZYzamXglKo/D7629dbtC8jT2nZhXriq838/WcCwiIAAIAAdNsZQ9GO5xVrwZYjJlUTejamZOn8l5do6JQlGj/915Ccj8XoHVsDeBgaPGfWBOEzVyar6z8W6JI3flHS0ZNu97XZ7JqzPlUf/rJPJ/KKq3Vdu93uUciyPyNPB44zzMtshSWlSkrPdTw/WWQlbDUBYREAAEAA6tQsXoM6NHTa9u3GQyZVE3o+/GWfjv9+g5q4+5gWbgu9oM7o5jpQQjOj+/7AqMyN6i5BFkAsBn16KstiUjLz9cx321RYYtPOIyc1fvqvbvef8uNOPTx7k16Yv0N/fGe52++eu/BreVKG+j2/SJ3+tkBTl+2rcL/XF+7SiFeXavgrS/XOkj0urx/NKdSTczbr8S83MYecCQJkBGxIISwCAAAIUOPObeP0fMXe48ovtppUTWiZt8V5joxQXJ7a6N48YOYsMruAIGcU9nh1vMHhlf1Mxk9f6/S8ssDl/cTTwU5KZoF+rGJg+3/fb1dmXrGsNrsmL9iprHzXXko5hSV6c/HpgOiVH3epsMR52NNdH6/T/9amaPa6VI2ftvbMU/gUHecQCAiLAAAAAtSIrk0VUW798mKrTb/spiu+GU4Y3GDWdoHcsygoh6EFY80+tPdY9YZ37TpS8bA1dx/trnLD3aw2u743mCx5v0Ftx04WOR6nnyzU5tRsx/Ok9FztSXc/jK463H1Tgv1btCU1W2v2HXc7LDDEm0rAICwCAAAIUPXrRGrgGUPRFu04alI1oe14NedMCUbGPYsC4y7OcBhaYJQWFKo7Z5FRvyS/f/4+GsUXHub9iQqLXXvU5RX5dsLlnAKr9h7LDZhA1h/e+jlJY99erhs+WK0HP9/o1bHVHcVZUFyq9JOFITNBuC8QFgEAAASwUd2aOT1fvDO9Vt9MBKpQvL8w6r0TON89ozoCpbYK1NCcRYeyCrTjcI7XN8WBPqVSVYbOGX0GVQmLjMI1X39eP2w7opGvJeqmD1erpDQwhnv6kt1u12vlhvN+uzFNyRme9zarzu/gLanZGv7KEg144WfdOXNdrfx8/YGwCAAAIICdGRZl5hVr/cETJlWDUGIUFp05j4tZAiazCjDfbUrTBa8s0aX/Xqa7P11fq3pRVGWeJKPvSXgVUh6jj7G68z5VZM3+TKchb7XZtrQcx+OcwhI98+1W3Tdrvbal+fb9T/5hh9J/H1b48850Ld6Z7tPz11aERQAAAAGsdcO66to83mnbou0MRYP/Gd0gH88NjOF4QZmB1EDRf/nfBpWUll3nh21HtCElyy/XMQ5uAu+HYtQTrmo9i1yZ1RMrKL/7Hvjb11s1c9UBfb/5sG74YLXL69X5vFfsOe70/D9L91b9ZCGEsAgAACDAndm76CfmLTJFbeql4Qmjt3sst8h1owmMgolQ721k9P2s6gpilXO9c/d386hKVmAUFoVVISyC/83dlOZ4HDjDXUMbYREAAECAu6i7c1i071ietpfrvo+aUVgSWvNcGA1DO1loNaESV0Y3kyGW5blIPeG6FL27FcTOFOifX1V6lhh9h6uSFVUWFNvtdv13zQE99PlGp9AD7gVibzScRlgEAAAQ4HqeVV/N68U4bft0zQGTqgkNUeGu/0zOLigxoRLzGN1oB8rN3YaDWS7bjOoNKH4et2T0/r3poOHNpxcok2FXVobh8LGqTJRtsC2s3Ifw7cY0/e3rrfp6wyHd/78NWrk3w+trVKeWYFDd5hko37lQQlgEAAAQ4MLCLLrh3NZO277ZcEgnC0MrvKhJdaPDXbZd+c4KHc527b1RWxne3AXIneo3Gw65bAv4sCiA6jMqpbrl+X8Ymm/SAotFSj9ZqFlrDmrNvuOVH6AKJrguV86Zy8D/9avN1agwdHjzMw2g5hMyCIsAAACCwI0D2jhNzJpfXKrpK5LNK6iWM7oxOZJTqH8vSqr5Ykxi3FMlMO7YhnduYnYJQaGi4VOGYVGgJIFVUPH7dN2eXVCiS99Ypqe+3qIbPlitrzekKreosuGV3n02KZmBHSqX2uxauO2Ilu5KN3UuNtO+cwHyeyzQERYBAAAEgeb1YzT6jLmL3kvcq/ScQpMqqt1sFYzf+ezXlBquxDxGH0Gg3GM1rx/jsi1QgqyKbDVhnjFLBWN3DIcYltu080iOrn9/lS5/a5l+2X3M9bwG5/T3jb/xCmzem7Z8v47nnV7V76HPN2lRFRYNCOZhUff+d73+9MlvGj/9Vz373Tazy0GAIiwCAAAIEn8Z2cnpBiW/uFRvLg6dni41ycpqPIY9DgLlYzHKhWwBPv/44p3pfj1/dYdplf9M//rVFq3dn6mth3J076z1KrY6f7hGIZSZq6FVdG2jzUnpuV5fO5ByyOr2BErJzNcP5VbJm7nqgIqspdUtq1LV/Qh9Gs4Fc9JXgwiLAAAAgkS3FvV0Q3/nuYtmr0uld5EflAbS3aFJDHsWBchQJaM6AqOy4FDZMLRNKVmOxycLrVqyyznoyqt02Fb1mDk0ylNhHgYOKZn5GvfBKg17ebE+XpXs36I8kHw8z2VbYbE5Sauv5qGqrqM5hbrh/VXq+eyPeujzjTp2skhZ+cXKyi9WYYn/g7RARVgEAAAQRB4c1dlppa5iq00fLttnYkW1k9HS7KHG6IY9UO7hDXsWBUpxAaTCuXyMwjY3H9+ZPYvmbvbv8vCGza8KvUE8/UpUFloYr6rmmVd+3KXV+zKVklmgp7/dppTMfA+P9N7OIzlanpQha+npn1dGbpGm/LBT/16UpPxiq8/acE5hiY6dLKrWObwJn62ldv2y+5i2Hsqu1jWNfLR8v9bsz9TJQqu+3nBI576wSH2e+0l9nvtJn4fQ0OMzRZhdAAAAADzXvH6MrunXSv9be9Cxbfa6VD16cRdFR7iu4AXv2e12wiJVNGdRYHwuhj+ewCgtoFQ8Z5HrtlM/WsOQ8IznRSX+7YliFPy5HYbm9Qtn7uZ+x+oEkd9tcg7W/rN0j166uleVz1eRz9Ye1JNfb5HdLg1o31Cf/2mQJOnGD1Y7ht5tOZSl2wa3cz3Yyxzuh62H9dDnm1RQUqrR3Zvpycu6KSLMopTMfPVpk6C6Ub6PGf70yW+Ox8+O7a7xQ9pLknKLrDp4PF+tG9ZRfExklc79wS/8h4sRwiIAAIAg8+fhHZzCouyCEi3ZeUyX9GhuYlW1BzlRGcNJkE2ow4jRzT09izxnHAjZf3+t8v0jwnwzfOjtxUnafTRX1/ZrpfPLrXAXDD/Lqk57U1jFoO3HbUfUtlHdCl9/Ys4Wx+O1+zO1fE+G4qIjnOZoWrQjXTcNbFOl65f3+JebVfD78KyF249q4fbTE4Sf3SRW3943VHHR/osanp27XeOHtNehrAKN+2CVUjILdFZCHX32p0Fq3bDizwjeYRgaAABAkGnbKFYD2jV02vb1hlSTqql9rIE+U3INMbphD5SbeKNAL9RDPsPVwiochma0r+fX6nFWfc93duPVhbv13aY03TZtrfZnnJ5Lx6gWb8MZu93u8TCnSoehGZ6mamlRVXvnTfrkN415c7mWJWV4tP+ypAzDYWK++PWWU1jxnFV7j+Xps3L/mXGKP3ol/mfJHqVkFkiSDmUV6C1PF3wIkN9jgY6wCAAAIAhddc5ZTs8X70xXVn5xBXvDG2RFZYx7mNR8HYYMCtl1pOaXppcCZ2ieN9wNNfPk3bRMqOPTeiTplR93nq7Fy4/U3z8CX4RXp2QVlFS5Dm+Gx3oTFPraF+tq5j8v/rvGOZSaXUPXDRWERQAAAEHosp4tFBVx+p9yJaV2fb/5sIkV1R70LCpjPNTLhEIMGJUxc9WBGq9Dktbsz6zxax4wWNHKG+6Gmu047Bq65Rc7rwhlOESxmt+Nvemn35PxnEWu6YzbeYzsvguRjNpCVQfiLd11rHrF+EHIrSTvxRsOuc+mHMIiAACAIFS/TqQu6tbMaduc9fyvqi+QFZUx+hxyCqveK8KXbIGSWklasjO98p18bP6WI9U63t384Bm5rkOXis5YPtwwbPJhnxXDsMhomJ2ba/vyG+LrnktHsgt9e0IDFdW8Pc2cHngIPoRFAAAAQeqqvs5D0dYfzNKe9JMmVVN70LOojNEN+7zNhwNipbiKKjAjRAqUAM1IRauhuRti6MknaBjOVPOjLynX7nz1Y/Tnt6Giz9YTo15P9GEl3vnXot0u2zx5J8dzi5R6It+ra+UXW/XPuds0Yfpa/VxDoeqnqw/ovcS9yq7GcD+UYTU0AACAIDW8SxM1jI1SZt7puYreXrxHb4zra2JVwa80COeg8YeKQqF5Ww7rj71b1nA1zir6EVltdkX5aKUuT83ddNgvS6H7k/EwMi++94Y9i8okZ+SpoKRUXZvHexWo7DtWfoLr6g/78vdcUtX5luUWVTxBdCDYmJKlx7/cpJOFVj1xaVdZLBY9+sUmFVttunVQ20qP33X0pDalZOm7TWmaviJZkrTEYPhdfnGp9h7L1Vk+nAPr799slSR9s+GQFjwwrFqhXqgjLAIAAAhSkeFhumlAG729ZI9j23eb0nT3BR3VpXm8iZUFt0DoORMIDmYa9yL4LTnT9LCoolXZzPjZmXHjX937X+NhZG7292Bfu92ue/77m2OI3B9a1tO8vwzzWX3u3nNFuZCngZHxSnLuz//knC26oEsT3TG0vUfXqGnetISCklJ9uzFNsdHhuqL3WXr6263afTRXkvTXrzarsOR0r69PVns2N9g1766UtZL2+PiXmyVJHZvGeVGtZ3YeOam1+zM1sEMj1xe9CBJDOWoiLAIAAAhidwxtr+kr9ivv9wlobXbpoc836ut7z1N0RLjJ1QUna6n7Gwmbza6wGu69YoZDWQWG22euOqBn//iHgPwf+xKbTXUUPN97a6lNEeE1PzOI22FkHqyCZxTWldrsTnMpbUvLUUpmvlo3rOt1fcZzFnn3fbPLv8PQVu07rlX7jjt+9wazW6aucYRDvyaf0ObUbMdr5YMib1QWFJW3Jz23SteoTMqJAg30y5lDA3MWAQAABLEGsVGaeMb/bG8/nKPXF7rOSwHPVNRr5RRvboKCmbv3uWrv8RqsxFVFP6PKgr5A8+biPZXv5A9uVkPz6HCDXcsHDKf8uK1qE3F72sTc1ezNKLQiq2vgs+vo6fnf3E3e/ebPSZ5fKECdCookadYZy9EjdBEWAQAABLl7R3RU52bO3fg/WLbP9Bv6YFVZGPTc99tqqBJzubsRf/LrLTVYiauK5ywKrsnJfRk0/HbghMf7Gn3F84rLhtN5srKY0cdfUur62Vc1WPU0uDr1O66ivT0NjIqtrrUfyTm9YlkwTmMWjDXXmADsFRmICIsAAACCXExkuP49rq+iyg1nsdulyQt2+H2S19qoshW1Pl19UAePe7cqUDByN//PAZPff0WVbTyYVZNlmMboVndtcqbLtorav1Eg9NX6Qx5f3+i81f1N07XcPGtGXz2j+/uZqyqeP8ddbyCXfSvZtSrvbexbyzVnfWoVjkRACeFgibAIAACgFujWop4ev6SL07ZNqdlaSe8ir3nSG+L7LWk1UIm5DDqKBIyKhqH96ZPfargSqU/rhBq/phGjW9qK5vkx+vjmbT5c4bnPDIeMjjdeYa3CU7poEh/t9lzestu9C4zO9I9vtmrsW8u1LOlYlUL3LYey9fDsTVW+PmA2wiIAAIBaYvx57dTmjMlk/7PUpDlRgpgnK2qVWGt/jy1f3LD7SyCVFhkefD0P3K585sFn63aCbB8wOpXF3bpUfvpCbDmUrXv/u14lAT4X1rcbXXuFVScoqy0e/WKT2j0xz/WF378v7yzZoy5/X1DDVQUPwiIAAIBaIiI8TJOGd3DatmLPcW1KyTKnoCDlUVgUyN1ufCSQwyJ45pfdxwy3V/dna9izyKDdeBNYlO8FVdlQUE8czi70yXJoOYVWJe5Or/6J/OiBzzaaXUKNyyksqdbxh7IK9MqPu1RkMF8VyhAWAQAA1CLXnNPKaTiHJL29hN5F3ij14EY6FMIiT0Izs/giTPCWtZo/86gI3916VXsaFTcfn9HX/8xthvt4eK6KlH9LRse5e89Gl/liXYrH1z6RX+z29aouH28mu73iYYi1Qa9nF1br+Bkr9nu0X+39BCtHWAQAAFCLxESG646h7Z22/bT9qBZtP2pSRcHHs55FgRuk+Eog9ywyo7KK5rLKzHMfNJxydpO4yneqId4OUTpzf6PvRmWBizeMzu/tTbtdnn9PFu0I7J5DVZFTUKIZKz0LREJRAP96CxiERQAAALXMzQPbKKFupNO2J+ZsVkpm7V/ByxesHgRB9CwyVyDd6O09lufRfsdOFvnsmp727KmIu7Azu8B1eI9LzyKD4z5b674nz5COjdy+Xr4TjM8muPbR9ySQvm+emrPhkFbsYYEDQxYLMzp5gLAIAACglomPidTfx3R32paRW6yJM35VfrHVpKqChyc3qsUhMM+FLYDforuf0Q9bj/jlmtUNDDJyfRcWGY0u8qbnzdr9mRW+9snqipejP8XosygoKXV7TJ3IcLevOw1Dq7SCyusBUD2ERQAAALXQNeecpQu7NnXalpSeq398s82kioJH+snCSvcJhZ5FwToM7YHPNvjlmoH8eXhr99GTFb6WY9SzyIMtRrxZcr78/DpGx82vQgjoqxXBWFmsdtmUkqWPljNErzKERQAAALWQxWLRG+P6qEuzeKftX61P1bIk4xWSUGZPem6l+5QE8BAtX/Fkom+zzNucVuFr/lrdyF+fhjeByimf/+r55M1GRnVr5tX+Z5bo76+/0flZ1RFmqMVzhFeKsAgAAKCWqhcTqfdv7ae46Ain7c9/vyOg56Mxm0dhUUgMQwvc74in8wT5kr96FrkbElaR6r7/8DA3d8AGL53Zs8bTj6Kqq6F5+1lX1PMnlOcsAqqLsAgAAKAWa9c4Vn8b081p266jJ6vdM6E2S/dgIuIfth1RYSVztAS7ynoWJWfUfGBjJncfxwkPV0QzknqioMrHludNnuG2N5PBS9n5JWfs4uEwNC9qcprg2gdZLEPHgOohLAIAAKjlru/fWt1a1HPa9vpPu5Tlw6Wua5OCYs9CoA9/2efnSsxV2Q37Ba8urVZIEmzcBSzPfBdcc4F527Pwv2sOOj33d08bX/XiIi4Cqo6wCAAAoJYLD7PoH2f0LsrILdb9/9tQ63vHVIWnc9689tNuP1diLk9u2GesTPZ/IQHC3cfx3aaK51CqjBlzorjNigzqyS1yXkXR0xCm/Gfmqx5U/nBWQh23r1dlXinUDhav1hmsXQiLAAAAQsB5HRu7TGq7LClD4z5YTQ+jM3jas0iq3vCjQOdJ75M5G1JroBJXrRu6v7n3B3/NWeSr0x7O8jyMcfdePKnH0/Ck/FCwnUcqXoGtzOmbcp981nbP64wID91AAKgIYREAAECIeP7KHmocF+W0bWNKlm6eukYnC12Xyw5VhVbPw6IjOYW1ttdBkgcTfZv11lvUdx8W+aPHXKD/lJfsMl7l0GiicvdhUeXv1B8/d6c5i7w8f0X1+GyCa9+cBggqhEUAAAAhonn9GL1/az/FRoU7bd+WlqPHvthca0MPb3nTs+jSfy9T+yfnq90T8/Re4t5as8qcpyuhmfWVqey7unD7UZ9f0189i/L9PBT0px2un4W7H6/Fg3Fxnk4efTAz36P9pOqthlZdlfUQrOl6gEBAWAQAABBC+rVtqDn3DFGL+jFO23/YdkQfLqvdEzZ7wmazezxn0ZkmL9ips5+aryU7031cVc3bfCjb7BLcqiyUe2n+Dt9ftJK8ILugar3zZqzYX6XjPLUtLcdlm7vPr9iD77+n2cmc9Yc821HOAZ8vgmu7PK+zcVx0ta+H2smMOcUCBWERAABAiOnSPF6f/WmQEupGOm2fvGCn3lmyR0VeDMOqbaoaFJU3Ycaven3hLh9UYx5rqWefw6GsAi3e6ftePJUprSQECPPDHV5lna2SM/KqdN69x6p2nMcMEhN3YcwhD+Y+8ncHOm+zoop2X7k3o9q1SOb1oAPMRFgEAAAQgto2itW/x/V1mSfklR936dI3lmlrgPcs8ZcCHw0JenPxHo2fvtajXhqBKDLc89uEiTPWKT2n0I/VuKpsmNxRP9Rjtbn/WfpjqJK7UMfT91hiOGeR8b6eTnbv7yGrvgqj9ngw71bZ9dxfkKwIoYiwCAAAIEQN79xED43q7LJ9X0aernl3pRb5Yd6XQOersEiSlu46pgtfW6r8YmvlOweYYg97Fp3y/i81O4Sxst4vVpu9ysPCKrJwm/v24I/eNu4yjC2pngW6y5JcJ76uaBhaYYlnP3d/hye+CN7sdrvHP5PK9qNnEUIRYREAAEAIu//CjnpwVCeXeRmKrDZN+vQ3fbwqudZM2uyJ6ct9O39M6okC9fu/RX5ZncufSrzsETV/y+EanSA9s5IJiSXpg1/2+vSa6w+ecPv6TzU8qXaph5/31kOucxZV9LPy9Jz+Tou8CYtKbXbDMMdm93wi7sp/x4XO70DgFMIiAACAEGaxWPTgqM766u7z1KtVfafXSm12Pf3tNo18banmbT5sUoU1a6qPwyKprLdS13/8oPv/t0EXvLJEE2f8qk9WJQd0gLTXy/l3DmcX6q6Pf/NTNc5yizzrqfXOEt+GRZXNg/ReYtWvV1HvM3cZRnXCuYpCIXfD+1bvO+547O/ect68tZyCEv2y27X3VH5xqcfnqeyzpGdR6Arh+a0VYXYBAAAAMN85bRroyz+fp6e+3qIvf0t1ei35eL7unbVe87e00HNX/EGNgnTlILvdrtwiq7ILSpRdUKKC4lKVlNpVWFKqPem5esEfK2iVM3dTmqSyz3PxznT949ttTq8P69RY/ds21FkN6qhlQozaN45V3cgIxcVEKDysZm9ZplUhNFu046gmL9ipJy7t6oeKTvN08m1JOpJdqOZnrPxXVf5cFWnO+kO6ZVBbl+3u5klauuuYLunRokrXqygTchfEvTh/h767b6gk6Wc/r/jn7TC0BrGRLtvmbU7TVX3P8uj4SvsVERYhBBEWAQAAQJIUFRGml6/ppfp1IvWRQVgwb8th/bL7mC7t2VzDOzfV6D8082oiZF/LLbIqPadQx04WKf33P8dzixxhUHZBiXLKPy60+mxIXf06kT6fE2dZUoaWJXm2epPFIrVqUEcNY6PVNL7sT2x0hGKjIlS/ToSiIsIVExmmOpHhiokKV0xEuOpEhatOZNmfmMgwxfz+3OhnuL+KK3u9l7hX7yXu1ff3D1WPs+pXfkAVlFS2FFo501fs15OXdfPJdf0Z1x04bvx5rz+QVeExn/2aosnX9KrS9SoKY04FmpUd4+n3tKq8CWfskmKjXG9rcwqtDB4DqoGwCAAAAA5hYRb94/LuGti+od5cnOQy38nJIqtmr0vV7HWpal4vRmN7t1Cf1g3Up02CWtaPkaWa3S/s9rKJiY/mFOloTuHvIVCh0nOKfg+FyrYdO1mk/GLzhnFtfPoiTV+RrOe+327K9e12KSWzQCmZlS9zXpnwMIvqRoYrLiZCh7N9s4rY5W8tdzzu37aBJg5tr8EdGik+JkIR1QwYj3hR4/u/7NPlvVqqZ6vqB1dpWZVfd1NKlnq3TnDZXtkwpw+X7dffxnR32e6rFdbsdrtT26xouNl/llY8lK6SxeAqVFJq8zhULiwpVUxkuNfvu2FslOF2z4ehuX/9QGbVwlMgmBEWAQAAwMXoPzTXRd2bae7mw3r6263KynftRXMkp1AfLtsvqawXUtP4aHVpHq/6dSKVUDdSzevFKDY6QhZJ9etGKsxi0Ym8YmUVlCi/uFRZ+cXKKbDKarMpK79EGblFOpJT6PGKTGb5Y++WslgsunVwW21Ly9FX61MrPyiAldrsOllk1UkP5wLy1roDJ7TugPvJofu2SdDgDo3UOC5aCXUjVTcqXHWiIhQXHa7Y6AjFx0QqNipcdaMi9MSczV5df+zbyzWya1NNvb1/tcLM3yqZ4FqSrnhnhZInj3HZvvto5Uu4H80pVLN6zkPmKgpBTsktsiouuvJbuvUHs9SvbQPH86p0sNt+2HWibE/8duCEBnVo5NG+c9Yf0k0D23jVs8iistXvjHgaOrVuWEdHcioOA1fvy/S8INQq/hx+GugIiwAAAGDIYrHoj71balCHhvrHN1v1YyVLh58aChYMwixlQ1ciI8IUEWZRbpHVpafSe7ecox2HT+q9xL0q+n11sBb1Y/Tn4WdLkiLDw/Ta9b116+C2uv69VV4vN4/TNhzM0oaDWX47/88709X+yfmO53cNa6/bBrdTqwZ1PA6QPB3CuOHgCfVt08BpW4EHk5lf9HqiNj97sdO2yuaq2nDwhIZ1alLpuX/aftQpLPKmd5aRYZ0aezwUbeuhbI/DopQT+ZK861Fltdm9msfKyPmdmujX5MrDQCCUEBYBAADArabxMXr/1v7adeSklu/J0IIthyvtKVKT4qIj1DQ+Wk3io9U4PloJdSJV3+hP3dOP46IjDEOCklKbDp0oUHxMhBrFReuSHi300EWdZbfbdSy3SPViIhUTGe50TJ/WCdr9wqXKL7YqJbNAx3OLlFVQotjoCDWOi5LNJiUfz1NBcanSsgscwVN2QYkskupEhqtenUgdzSlU3ahwHc8tVliYRZHhFmXmFSsrv0RZ+SVqGBulpPSTv7/fGEVHhslmt6tZfIxyi6wqKClVVHiYcousKim1qbDEpsKSUhX8/qewpDTge23VlA+X7f+9V9xpjeOi1ad1fcVEhiuhbqTioiMVHxOhenUiVeTFynVX/WelxvRsobdv6uv4jm05lF3pcTmFVscwrFPSstwPM5y8YKdHYdF7iXudJh6ft6V6qxt2aRbvcVg0b8th3Tmsg0f7nmqR3vR8mrc5zU3PIs/OsdmDnw8QagiLAAAA4JEuzePVpXm87hjaXptTs7RoR7o2pWRpY0qWzyd7lsqG4DSNj1bTejGOMKhsMucYNa0X7dhW12By26qKDA9Tu8axLtstFouaxrtfVatuVIS6NI+XFO/ymi/mzPEFm82uIqtziFRQXKr84lLlFVl14Hienp3rPA/ThCHt1Cg2Sq8u3G1S1TUjI7dIi3b4ZpWveVsOa96T3gcyXf/xg16/vreuPqeVpLI5l9zZlla1oWHVVVE4Y8SbHmOZecWSvOtZtCEly02vL8/O89N2970mgVBEWAQAAACv9WqVoF6tEiSVTZ67PyNPG1OylPH7amQZJ4t1JKdQJaU2ldrsysovkc1uV4PYKDWoG6nYqAjFx0QooW6UIsMtio+JVOO4aDWtF60W9WPUND5GURHmrbRWW4WFWcpWRYsKV4MK9hk/pL3h9rvO76CSUrt+3Z+pOlFlq6jZ7XZ9vOqAvnOzipYnmteL+f37EKmTv/ewySsuVX6RVfklpSG1dPnDszfp4dmbPN7/kdmb9Nr1vT0470a9fn2falRWtlra2N4tfbaq4JlOrfDmzc/70IkCNajmBNdARSx+XQcxsBEWAQAAoFosFos6NIlThyZxZpcCP4qOCFd0hDSia1On7f3bNdSbN/b123VtNrtyi60qKC7VriMnddu0tX67VjD6an2qR5Osz1l/SHPWH9Lc+4ZW+Vr3/2+DxvZuqdTf5xbyl8pWjytv3YETuvCM7+QpvlpNDghFhEUAAAAAAlZYmEX1YiJVLyZSzerFuKw2ti45U1sOZatP6wTtPHJSy5MyKpyTp2PTOLVpWFfFVpusNptjlau+bRI0oktTWVQ2GXVWQYnyiqw6WWhVdkGJfgugObqqa+zby6t1/ObULC3ZdcyrY5IzvFt6PqfQu2GtFQ2LO1zNibyBUEZYBAAAACBo9W/XUP3bNZQk9W3TQDcOaKN3/HCdjNwi9X9+kR/OHFz++PYKr4+54NWlHu9rt9v1yeoDXp2/1GY8cbunk3ADcEVYBAAAAACVaBwX7ejVtPvoSb22cJck6c/Dz1bfNhXNAFWGoMlz6w9maesh7ybuLrayyh/8JHSnLCIsAgAAAABvdG4Wr/dv7e/x/o3jorXo4fM16vVf3O733X1DHBPHn1JQXKr0k4U6K6GOMvOKFREeps9+PaiXf9hVldID3jXvrvT6mF+Ta88wQSBQEBYBAAAAgJ91bBrv6JlUUmrTjsM5Wn/ghFo1qKsRXZsqPMy4C0OdqHC1bRQrSWpaL0aSdM8FHXXPBR2d9mv3xDw/Vg8g1BAWAQAAAEANigwPU69WCS69iKpj6z8vVo9nfjR8bcuzoxUfE+m0zVpq001T12jt/rJJvkd1a6o7hnbQjR+u9llNAIIXYREAAAAABLm46AinleKKrKUKs1gUGR5muH9EeJhm3TlQOw6fVJP4aDWvX9ZraebEAbp92lrDYxY/MlwdmsQ5bTtwPE/3/He9tqV5N88QgMBm/JsDAAAAABC0oiPCKwyKTokID1PPVvUdQZEkDe/cRJueHq1v7x2i2we3lSRd2ael9r14mUtQJEltG8Vq3l+GaVS3ZhVeZ+59Q6v4LgBzhfD81vQsAgAAAACcVr9upHrXTVDv1gn65xU9PDpm6u39tWRXuh6ZvUmZecWO7ftfukwWi0X/d8Uf9I9vt7kc16lpnH56eLjLdmupTVvTcnTlOyuq/kYAVBlhEQAAAACg2kZ0aar1/7jI8LVbB7fTVee0UnZBid5clKTV+4/ryz+fpybx0Yb7R4SHqU/rBMfQui2p2Rr79nLDfb/882Bd+94q37wJAJIYhgYAAAAAqAFx0RE6K6GOplzbS4mPjagwKDLSs1V9Tb66p8v2FU9cqP7tGmr6+HMV9fuwu7joCO38v0v0+CVdfFY7EGroWQQAAAAACHjjBrTRuAFtDF8b0bWpfn5kuA5lFahvmwRFR4Rr0vln6+UfdrnsO+WanoqPidTbi/fomn6t9H/fb/d36QhSFkvozlpEWAQAAAAACHqtG9ZV64Z1Hc/Dwyza88Kl2pqWo+VJx7TraK4eHd1ZbRvFSpIu69lCktS/bQNdUcncSFERYSq22vxXPBBgCIsAAAAAALXSqbmP+rROqHCf3q0T9NXdg3XNu6fnPfr+/qHqcVZ9l33bPTHPH2UCAYewCAAAAAAQ0vq1beiYTNudxMcu0PBXlvq/IMBkhEUAAAAAAHigbaNYl1CpoLhUF762VIezCyVJ9444W49d3NXx+qq9x3Xjh6trtE74RujOWERYBAAAAABAldWJCteqJ0dW+Prgsxvp+St76O/fbK3BqoDqCTO7AAAAAAAAarNbBrXVtn9erPjosv4aL1/bS8mTx2j/S5eZXBlgjLAIAAAAAAA/i42O0JZ/XqzkyWN0ff/WksqWZv/uviEu+750dc+aLg9wwjA0AAAAAABM0qtVgva/dJmKrDaFWSyKiijr03Ftv1Z68PONmrf5sMkVhi5LCE9aRM8iAAAAAABMZLFYFBMZ7giKJCkyPEzv3HSO0zZJ2vPCpbpzaPuaLhEhhp5FAAAAAAAEqN3PX+qy7cnLumnq8v0mVINQQVgEAAAAAEAQCQ+zKHnyGP2w9bC+WJeqgpJSrdx73OyyUIsQFgEAAAAAEIQu6dFCl/RoIUnanpaj93/Zq76tEzRuQBs9/e1WzV6XanKFCFaERQAAAAAABLnuLevp3+P6Op6/fG1vrd6XqYOZ+SZWFdxCeYJrwiIAAAAAAGqhXx4fobSsAiXuPqZhnRqr2GrTha8lml0WggCroQEAAAAAUEu1TKijGwe0UasGddWhSZz+eklXp9d/eWyESZUhkNGzCAAAAACAEHH3BWfr7gvOdtp2++C2mrnqgEkVIRDRswgAAAAAgBD25GXdzC4hIFkUupMW0bMIAAAAAIAQFhMZruTJY1RYUqqSUpvCwyzq/vSPZpcFE9GzCAAAAAAAKCYyXPExkaobFaEZE841uxyYiJ5FAAAAAADAyQVdmip58hhJks1mV4en5ptcEWoSPYsAAAAAAECFwsIs2v38pbrngrPVu3WCvvjzYLNLqhGW0J2yiJ5FAAAAAADAvaiIMD1+SVfH89YN6ygls8DEiuBPhEUAAAAAAMAryx6/UAeO52ld8gld9Idm6vXsQrNLgg8xDA0AAAAAAHitbaNYXdOvlerFROrla3qZXQ58iJ5FAAAAAACgWq4/t7Wu6ddKS3ama+7mNH27Mc3sklAN9CwCAAAAAADVFh5m0ajuzfTvcX01e1JoTIJdW9GzCAAAAAAA+NSA9g2V9MKlWrT9qFom1NEV76wwuyR4gZ5FAAAAAADA5yLDw3Rpzxbq3TpB79x0jtnlwAv0LAIAAAAAAH41plcLjek1Rna7XVabXXfOXKfE3cfMLgsVoGcRAAAAAACoERaLRZHhYZo5cYDZpVTKYrGYXYJpCIsAAAAAAECNS548RpOGd1CYRerftoHZ5aAcwiIAAAAAAGCKJy/tpn0vjdEndww0uxSUw5xFAAAAAADAVHWiwpU8eYw2HDyhxTvT9dbiPWaXFNIIiwAAAAAAQEDo26aB+rZpoAdGdlJWQYmy8os16vVfTKkldGcsYhgaAAAAAAAIMBHhYWocF62OTeP173F9zC4n5BAWAQAAAACAgHVFn7O0/bmLdd+IjmaXEjIIiwAAAAAAQECrGxWhRy/uou/vH2p2KSGBsAgAAAAAAASFHmfVV/LkMUqePMbv17KE8KRFTHANAAAAAACCTvnAqN0T83x+/iPZhT4/Z7CgZxEAAAAAAAhq25+72OfnnL4i2efnDBaERQAAAAAAIKjVjYpwDE+7oEsTn5wzr9jqk/MEI8IiAAAAAABQa8yYMEBf33OebujfulrniYsO3Zl7CIsAAAAAAECt0rdNA025tpf2v3RZlc9Rv06kDysKLqEbkwEAAAAAgFrNYrE4TYQ96vVE7UnP9ejYMb1a+KusgEfPIgAAAAAAEBIWPTxcf7mwoxrUrbzX0KTzz66BigITPYsAAAAAAEDIeHh0Fz08uosk6YetR/T+L3u14WCW0z5bnh2t8DCLCdUFBnoWAQAAAACAkHRJj+aac/d5Ttuu6NNS8TGhO1+RRM8iAAAAAAAQws6c1wj0LAIAAAAAAEA5hEUAAAAAAABwICwCAAAAAACAA2ERAAAAAAAAHAiLAAAAAAAA4EBYBAAAAAAAAAfCIgAAAAAAADgQFgEAAAAAAMCBsAgAAAAAAAAOhEUAAAAAAABwICwCAAAAAACAA2ERAAAAAAAAHAiLAAAAAAAA4EBYBAAAAAAAAAfCIgAAAAAAADgQFgEAAAAAAMCBsAgAAAAAAAAOhEUAAAAAAABwICwCAAAAAACAA2ERAAAAAAAAHAiLAAAAAAAA4EBYBAAAAAAAAAfCIgAAAAAAADgQFgEAAAAAAMCBsAgAAAAAAAAOhEUAAAAAAABwICwCAAAAAACAA2ERAAAAAAAAHAiLAAAAAAAA4BBhdgGofaxWq+Px4cOHTawEAAAAAIDaq/w9d/l78eoiLILPHTt2zPF4wIABJlYCAAAAAEBoOHbsmNq1a+eTczEMDQAAAAAAAA4Wu91uN7sI1C6FhYXasmWLJKlJkyaKiHDfge3CCy+UJC1evNjja3hzjKf7Hj582NETau3atWrRooXH9dRGVfm51KSars9f1/PVeatzHn+3QU/3pw26oh3WzPV8cd7qniMQ/i6kDbqiDdbM9fi78DTaoatAbodm1OaPawZrG/T2uNraBq1Wq2N0T8+ePRUTE+OT8zIMDT4XExOjc8891+P9IyMjJUmtWrXyyzFVOX+LFi282r82qsrnVpNquj5/Xc9X563OefzdBquyP22wDO2wZq7ni/NW9xyB9nchbbAMbbBmrsffhcZoh2UCuR2aUZs/rhmsbdDb42pzG/TV0LPyGIYGAAAAAAAAB8IiAAAAAAAAOBAWAQAAAAAAwIEJroHfpaamqnXr1pKklJSUoBmfCtQWtEHAXLRBwHy0Q8BctMHT6FkEAAAAAAAAB8IiAAAAAAAAOBAWAQAAAAAAwIE5iwAAAAAAAOBAzyIAAAAAAAA4EBYBAAAAAADAgbAIAAAAAAAADoRFAAAAAAAAcCAsAgAAAAAAgANhEQAAAAAAABwIiwAf+fXXX3XZZZcpISFBsbGxGjRokGbPnm12WUDI+PTTTzVp0iT1799f0dHRslgsmjFjhtllASHh0KFDeuONNzR69Gi1adNGUVFRat68ua655hqtWbPG7PKAkFBYWKiHH35Y559/vlq2bKmYmBg1b95cQ4YM0fTp01VSUmJ2iUDImTJliiwWiywWi1avXm12OV6x2O12u9lFAMFuyZIluvjiixUTE6Nx48YpPj5eX331lQ4cOKBXX31VjzzyiNklArVeu3btdODAATVu3FixsbE6cOCApk+frvHjx5tdGlDrPfHEE5oyZYrOPvtsXXDBBWrSpImSkpL0zTffyG63a9asWbrhhhvMLhOo1TIyMtS6dWsNGDBAnTt3VpMmTXTixAktWLBABw4c0OjRo7VgwQKFhdFfAKgJW7duVf/+/RUREaG8vDytWrVKgwYNMrssjxEWAdVktVrVtWtXpaamavXq1erTp48kKTs7WwMGDFBycrJ2796ttm3bmlsoUMstWrRInTp1Utu2bTV58mQ9+eSThEVADZkzZ44aNWqk4cOHO21ftmyZRo4cqbi4OB0+fFjR0dEmVQjUfjabTVarVVFRUU7brVarLrroIi1dulTff/+9xowZY1KFQOgoKSnRoEGDFBkZqU6dOunTTz8NurCIWBmopsWLF2vv3r266aabHEGRJNWvX19PPfWUiouLNXPmTPMKBELEqFGjCGUBk1x99dUuQZEkDRs2TCNGjNCJEye0ZcsWEyoDQkdYWJhLUCRJERERuuqqqyRJe/bsqemygJD0wgsvaNu2bZo2bZrCw8PNLqdKCIsQ1NLT0/X999/r6aef1qWXXqrGjRs7xoR625vgwIEDeuSRR9S1a1fFxsaqYcOGOvfcc/XKK68oPz+/wuOWLl0qSRo9erTLaxdffLEkKTEx0atagGASCO0QCGWB3gYjIyMlld2wArVVILdDm82mH374QZLUo0cPr48HgkEgtcH169frhRde0DPPPKPu3btX8R2Zj7+1EdSaNWvmk/PMnTtXt9xyi3Jychzb8vPztW7dOq1bt05Tp07VvHnz1LFjR5djk5KSJEmdOnVyea158+aKi4tz7APURoHQDoFQFsht8ODBg1q0aJFatGihnj17+qROIBAFUjssLi7Wiy++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",
+ "image/png": "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u3atpKO7/kycOFFTpkzRxRdfrPj4+OY+dqNO3OWqpqZGhw4d0saNG5Weni7p6K5L+/fv1/fff6/OnTuf8mf16NFDEydO1NKlS/XNN98oKytLklx/10yaNMktgYavr68mTZqkSZMmuWoHDhzQBx98oH/961+uUWU1NTWaM2eO9u/fr4CAgNP+XABA67Bb3QAAAKfqkksucf1QWVZWZtreWTKPahk2bFi9IxkqKyt16aWXuoKWqKgoPfjgg/rxxx+Vlpam0tJSOZ1OGUfXOdPrr7/uem/t6UUt4dj2zJKa/ENWYGBgo9fMmjXLFbQEBwfrt7/9rb766ivt379fJSUlcjgcruetPS2lpZ+3ttrPLjXtuU68rrFwqLFpKVao/dyn8sxS3eeOjY3VunXr9OCDD5qm1zidTm3ZskUvvviiLrnkEsXFxenxxx83TSOr7dlnn9VHH32k0aNHm+pZWVn68MMPdddddykxMVGXXXZZs4O8xkREROj55593fb388sv69NNPlZKSotdee8215fXPP//slq3HjwWzNTU1evvtt/X222+rpqbGdK4ldO/eXffdd5+2b99umjqUlZWlBQsWtNjnAgDcj7AFANBmderUSZdffrnreP78+a7XNTU1euedd1zHJ/sB6cMPP1RKSoqko1OTNm/erP/7v//TlClTFB8fr4CAANMP5a05uqP2KJ2ysrImvae0tLTB8ytWrNCKFStc91+1apX++c9/asaMGerRo4cCAwNltx//9qA1n7e22s8uNf5c9V0XHBzs1p5aQ+3nPpVnlup/7pCQEP3f//2fMjIytGrVKj355JO6+OKLTSNACgoK9Ic//EGXXnqpDMOo97MuueQSrV69WqmpqXrjjTd0yy23qH///q7zhmHoww8/1PDhw7V79+4m9X86vL29dcMNN+jVV1911b788ku98cYbp3Xfyy+/XJ06dZJ0NLQ9dr8T/85pKSEhIZo/f75p2uPSpUtb/HMBAO5D2AIAaNNqhyiLFy92rXnw9ddfu4b/+/j4aNasWfW+//vvv3e9/s1vfqO4uLgGPy81NfV0W26yqKgo1+umjhQ4cc2HE9V+3muvvdb0g3J9WvN5awsNDTVN4Wnq89dexPZ0ppJY5VR+z2s/s6+vb4Mhk5eXl8aMGaP77rtPH3/8sbKysrR06VJddNFFrms++eQTffjhhw1+ZmJioubMmaOXX35Z27Zt08GDB/XYY4+5RmDl5eXpnnvuaVL/7nD11VebnuGhhx5SRUXFKd8vJCREv/jFLyQdXRh68+bNkqSLL7641UK8+Ph4DRgwwHV8+PDhVvlcAIB7ELYAANq0iRMnqmfPnpKOTot48803JZmnEJ177rmmH2JrO3TokOt1UxZMXbJkyem02yy1d8JZtWpVo9eXlJRo69atDV7TEs/bEtNxbDabhg4d6jo+NhqnITU1Na51RCRp+PDhbu+rpdX+PV+zZs1Jp/TUVvvXZtiwYc36/bDb7Zo4caIWLlyoadOmueqffvppk+8hHd2t6OGHH9Yrr7ziqn3zzTdNXmzaHf7+97+7RoKkpaXp5ZdfPq371TcdyR1TlJrj2PQoSSddTwcA4JkIWwAAbZrNZjP9ADR//nwdOXLE9MNiQ2ss1J4y09hUnfXr15t+mG9pU6dOdb1esGBBowu0LliwoNEfbpvzvIcOHdInn3zSaJ+1fyB05yKyZ555puv1G2+8cdKpLccsXLhQeXl5rp6asoOTpxk/frzrh+qcnBwtWrSoweudTqdpHaHav2bNYbPZTNtMHxsV1ly1R5dUV1crPz//lO5zKvr06aMrr7zSdfzkk0+eVtgzffp009bgcXFxpkCqpVVWVpq2mm/qItkAAM9A2AIAaPPmzJnj+tf8HTt26P7773dNIYiIiNAFF1xw0vceGxUjNfyv+WVlZbr55pvd1HHTzJo1yzUtIy0tTU888cRJr83Ly9PDDz/c6D2b+rwOh0M333yzqqqqGr1nWFiYK8TJyclxW+By0003ue67YcMG06iJExUWFur+++93HV911VVN2m3I04SFhbm2Gpak3/3udw2um/P888+7dtyy2+11/owWFxc36fdQMk9Bi46ONp1r6rbfte9ht9tNW2e3hgcffND1Z+bQoUOmtVyay8vLy7Ut89q1a7VkyZKTbh3fmNWrV+sf//hHk9deko6O1Km93XhD25gDADwPYQsAoM3r0aOHafvU2j+UX3XVVfL19T3pe2v/a/4bb7yhp556qs7Ujb1792r69OnasGFDk3eIcYfQ0FBTgPDwww/riSeeqNPfnj17NG3aNB06dKjBZ5Wk888/3xVMLV68WPfdd5/Ky8tN12RmZurSSy/VokWLmvS8fn5+6tWrl6SjoxkWLlzYlMdrVFJSkm655RbX8Z133qkXXnihzq5Ix35/ji10HBIS0qTgyVM9/PDDroVyd+/erRkzZmj//v2ma5xOp5555hnTuih33HFHnS2J169fr+7du+vRRx/V9u3b6/08h8OhBQsWuLZ1lo5Ovatt3LhxmjVrlr788suThje7d+82jSI766yzGv3z6G59+/bVFVdc4Tp+4oknmhw21Sc5OVkjR47UyJEjlZycfMr3KSgo0O9+9zt1795d99xzjzZs2HDSkVq5ubn67W9/a/ozPGzYMMIWAGhjvK1uAAAAd7j22mvrXV+ksW1ap0+frjPOOENLliyRYRi677779MILL2j48OEKDQ3Vnj17tGLFCjkcDnXt2lV33323KQBpaX/4wx/07bffavny5TIMQw888ICeeeYZTZ48WUFBQdq7d6+WLl0qh8OhMWPGKCkpSW+//fZJ79e3b1/Nnj3btabNU089pbffflujRo1SdHS0Dhw4oCVLlqiqqkrBwcF68skndeuttzba56WXXqq//vWvko4uVjp37lwlJyebFrn9xz/+0ezn/8c//qF169Zp7dq1qqmp0Z133qnHH39cEydOVFBQkPbt26clS5a4Aihvb2+99tprdUKHtiQpKUmvvvqqrr76ajkcDq1cuVJ9+vTRpEmTlJSUpJKSEi1dulQZGRmu94wdO1Z///vf673f4cOH9dhjj+mxxx5TbGyshg4dqtjYWHl7eysrK0vr1683reUzadIk03Qc6WiI9s477+idd95Rp06dNHjwYPXs2VMhISEqKCjQ/v37tW7dOtf1nTp1OqXfb3d46KGH9N5778npdCotLU1z585t9VFpJ5OTk6Onn35aTz/9tEJDQzVixAjFxcUpODhYJSUl2rNnj9avX+/aZlqSYmJi9NZbb5mmAJ7MI4880qwFfKdOnapLL730lJ4FANAIAwCAdqCoqMgICAgwJLm++vXr16T3ZmZmGsOHDze998Sv/v37G9u2bTNef/11V+3aa6+t934//vij65rJkyef9HNr378hR44cMc4555wG+xs/frxx6NAh49prr3XVXn/99XrvV1paakyfPr3B+8XHxxvLli1r8rMUFhYaffv2bfCetaWkpLjq3bp1a/D5i4uLjSuuuKLBe0sy4uLijC+++KLBez3yyCOu6x955JEGrzWMpv9eNlVTfn+O+eyzz4yYmJhGn/uqq64y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3FXDlBDRyVR/Z02a3lqdalFXAAAAAKxE2AIApykswFevzB6pTj5epvqjn27TugP5FnUFAAAAwCqELQDgBv3iQvTk5YNNtWqHodve2sCCuQAAAEAHQ9gCAG5yweAuumVyT1ONBXMBAACAjoewBQDc6P4ZfetdMPeRT7bJMAyLugIAAADQmghbmujNN9/ULbfcopEjR8rPz082m01z5861ui0AHsbLbtNzVw1TYkSAqf7u2jS9tfqgRV0BAAAAaE2ELU304IMP6pVXXlFqaqri4uKsbgeABwsL8NUrc0bUWTD3sc9YMBcAAADoCAhbmujVV1/VgQMHlJOTo1tvvdXqdgB4uL6x9S+Ye+ubG5R5hAVzAQAAgPaMsKWJzj77bHXr1s3qNgC0IRcM7qJbJyeZarklLJgLAAAAtHctHrZkZ2fr888/18MPP6xzzz1XnTt3ls1mk81m03XXXdese6Wmpuree+9V3759FRgYqIiICI0aNUpPPvmkysrKWuYBAOA0/G5GH53RO8pU25RWqIcXsmAuAAAA0F55t/QHxMTEuOU+n332ma655hoVFRW5amVlZVq3bp3WrVunV199VYsWLVJycrJbPg8A3MHLbtOzVw7VRc8v18H846HwgnVpGhgfqtljGTEHAAAAtDetOo0oMTFR06dPb/b7Nm7cqJkzZ6qoqEhBQUH6y1/+ohUrVuj777/XTTfdJEnavXu3zj//fBUXF7u7bQA4LccWzA3wPWHB3E+3aS0L5gIAAADtTouPbHn44Yc1atQojRo1SjExMTpw4IB69OjRrHvcfffdKi8vl7e3t7755huNGzfOde7MM89Ur169dP/992v37t166qmn9Oijj9a5x7333qvKyspmfWavXr2a1ScAnEzf2BA9edkQ3fH2Bletxmnotjc36PO7Jio21N/C7gAAAAC4U4uHLY899thpvX/NmjVaunSpJOnGG280BS3H3HvvvXr99de1Y8cOPfPMM/rTn/4kHx8f0zX//ve/VVpa2uTPveyyywhbALjV+YPjtPVQkl5avM9Vyy2p1EOfbNV/5oy0sDMAAAAA7uTxuxEtXLjQ9fr666+v9xq73a45c+ZIkgoLC/Xjjz/WuaakpESGYTT5a8qUKS3xOAA6uPum99HkExbM/XZ7lpbuybGoIwAAAADu5vFhy7JlyyRJgYGBGjFixEmvmzx5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7dq1i93v4XH5n3Z5eXkFtnt7eys2NtbxlKKtW7dq2rRp6t27t4KCgjRkyBAtWLCg0DgAAFA+hC0AAKDa+/XNZK2aw0pt27ZVXFycvv76a40bN04tW7aUJGVmZur777/XfffdpxtvvFGnT5+2uFIAAKo+whYAAFDtnTp1qtj9drvdsRrlygqXX78uaY6TJ08WOa5hw4aO1ydOnChdwS7i6emp4cOH6+OPP1Z8fLySk5M1Z84cde3aVZL0008/aeLEiZbWCABAdUDYAgAAqr2dO3fKbrc73b9r1y7HvUvat2/v2N6iRQvHpTubN28u9hxXPzL66jm6dOniWBXzww8/lL14FwoNDdXYsWO1ceNG3XDDDZKkb7/9VpmZmRZXBgBA1UbYAgAAqr1z584pNjbW6f45c+Y4Xg8YMMDx2svLS/369ZMkLV++XElJSU7nmD17tmPMzTff7Nhev3593XTTTZKkzz77TMnJyeX6DK7k7e3t+Jx2u10XLlywtiAAAKo4whYAAFAjTJ48uchLgdauXasPP/xQktS1a1d17969wP7HHntMkpSTk6Px48crNze30Bxz5szRsmXLJEl33HFHoRvh/uEPf5AkZWRkaMSIEUpNTXVaZ3GBTnmtW7dOhw4dcro/JyfH8YjrgIAABQcHm14DAAA1ifNnIAIAALiJ06dPF3icsjO1atXSddddV2h7p06d9PPPP6tr166aOnWqIiMjlZ2drSVLlujtt9+W3W6Xl5eX3nvvvUJjo6OjNWLECH3++edatmyZevToocmTJ6t169Y6f/68Fi5c6FgZU79+fb311luF5hg2bJjGjx+vjz/+WBs2bFDbtm01adIk9erVS3Xr1lVKSoq2bdumRYsWqVOnToqJiSn7/0jFWLlypV5++WX16dNH0dHR6tixo4KDg5WZmamDBw/qn//8p7Zv3y5JGj9+fLGPyQYAACXjmxQAALi9999/X++//36Jx3Xq1Ek7d+4stL1z586aNGmSHnnkEU2aNKnQfh8fH82bN0833nhjkfPOnz9fdrtdX3/9tbZv365Ro0YVOqZJkyZavHixrrnmmiLn+OCDD1SrVi299957Sk5O1rRp05x+BlfIz8/X2rVrHStYinL77bdrxowZLjk/AAA1CWELAACoER588EG1b99eb7/9ttavX6+UlBQFBwerf//++sMf/qC2bds6Hevn56evvvpKsbGxiomJ0aZNm5SSkiJ/f39FRERo+PDhmjRpkgICApzO4enpqb/97W8aO3asPvjgA61Zs0bHjx9XTk6OGjRooI4dO2rIkCG6//77Tf/sTz/9tDp27KgVK1Zox44dSk5OdjziOSQkRJGRkXrggQcUHR1t+rkBAKiJbIZhGFYXAQAA4Arh4eFKTEzU6NGjTb80BwAAwBlukAsAAAAAAGAiwhYAAAAAAAATEbYAAAAAAACYiLAFAAAAAADARIQtAAAAAAAAJuJpRAAAAAAAACZiZQsAAAAAAICJCFsAAAAAAABMRNgCAAAAAABgIsIWAAAAAAAAExG2AAAAAAAAmIiwBQAAAAAAwESELQAAAAAAACYibAEAAAAAADARYQsAAAAAAICJCFsAAAAAAABMRNgCAAAAAABgIsIWAAAAAAAAExG2AAAAAAAAmIiwBQAAAAAAwESELQAAAAAAACYibAEAAAAAADARYQsAAAAAAICJCFsAAAAAAABMRNgCAAAAAABgov8H/wROOJG0P9IAAAAASUVORK5CYII=",
"text/plain": [
""
]
@@ -311,12 +220,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 11\n"
+ "Time step 11\n",
+ "RMSE 0.010396215010466713, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "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LHr00UdNFQl//etfjaqqKtOcn3/+2TjllFMMSUZoaKhXlUX33XefsWnTpnqfe+jQIePmm2923+v888+vd25TqoSa+p5p06a55wUFBRnPPvusR5XPtm3bjNNPP909LzY2tt4Ki9qVRTXVZJMmTTJycnJM84qLi43x48e750ZHR/ukGsSbyqKMjAxT5deQIUM8/mxWV1cbTz31lOF0Ot3zfvOb39R5v1NPPdU956677qq3CqmwsNCYO3eu8Yc//MHjtWeffdZ9jxNOOMHYunVrnfdwuVzGmjVrjGnTphl79+5t4FeicU2tLPrTn/7knh8SEmLk5ubWO7euyiLDMIzbb7/dPfbNN994vG/ZsmXu1++44w7DMAyvKotcLpfRs2dP03/LN910k7Fq1SrD5XJ59wvixeegsggAAgthEQAAraz2dph77rmnwbm1Q57rrruu2c+sqKgwTj75ZEOSER4eXu8Po74Ki/Ly8ozIyEj3nIcffrjeex0+fNhISUkx3bOxbU7euPTSS933++mnn+qc46+wKCMjwxSGvPDCC/XeLzc31/TD+JQpU+qcVzsskmSMHz++3nuWlpYaaWlp7rnvv/++V5+tId6ERRMnTnTP6du3r5GXl1fv/Z5++mn3XKfT6bFFsrCw0P16Wlpas4OJq6++2n2f//3vf826R1M1JSz66aefjJiYGPf8CRMmNDi/vrBoxYoV7rFbb73V43233Xab+/WVK1cahuFdWGQYhvHhhx+a5tV8JSQkGJdddpnx4IMPGgsXLmww5Grsc0ycONG48847vfp69tlnvX4OAKB5CIsAAGhlf/vb39w/IHXr1s2j2qZGVlaWERQU5J67aNGiFj33iSeecN/rk08+qXOOr8Kif/3rX+7XU1NTjfLy8gbX9uqrr/o8LPrggw/c93v++efrnOOvsOgPf/iDe86pp57aaNBRe61hYWF1hiy1w6LQ0FDjwIEDDd7z3nvvdc+fPn26V5+tIY2FRUePHjX1z5o/f36D96uurjZOPPFE9/w//vGPptf3799v+jVsrgsvvNB9n++++67Z92mKxsKisrIy4+effzb+/ve/G3Fxce65/fv3Nw4ePNjgvesLiwzDMPr27WtIMjp16mQaLy0tdT+nX79+pnFvq3tmzpxphIeH1xka1a46GjJkiPHPf/7T9HxvPkdTvhr6uwkA4Bv0LAIAoJXddNNNuu++++RyuZSVlaXPP/9cF198sce8d9991933pWvXrnXOqS0vL0+rV6/W5s2blZOTo6KiItMJaFu3bnV//91332nMmDE++kSevvrqK/f3119/vUJDQxucf8MNN+iuu+5q8AQzq5KSEq1evVqbNm3SkSNHVFhY6P71ksynOH333XfeL94HvvzyS/f3kydPbvTUuHHjxik+Pl65ubkqLy/XqlWr3Cdc1WXYsGHq2rVrg/ccNGiQ+/vdu3d7t/AWWLlypbt/VmJiYqN/vpxOp6ZOnaoZM2ZIMv+ZqblHeHi4ysrK9OOPP2rFihUaOnRok9eVlpbm/v7ll1/WSy+91OR7tETNKXsNcTqdGjt2rF588cUm9yuq7eabb9ZDDz2k/Px8ffzxx7r++uslSR9//LHy8vLcc5rjlltu0YUXXqgnnnhC7733no4ePeoxxzAMrVmzRmvWrNETTzyh2bNna+TIkc39OAAAGxEWAQDQyrp3764LLrhAS5YskSTNnj27ziCophmtJN14440KCgqq836ZmZn64x//qA8//ND9w3pj/N3Id+PGje7vzz777Ebnx8TEaODAgdqwYUOjc3Nzc/Xggw/q7bffVmFhoVfrac3GxYZhmMKpc845p9H3hISEaMiQIfrss88kSRs2bGgwLDrppJMavWftJuYFBQWNzm+p2r/nQ4YMUXBw4/8zs3b4s3HjRhmG4Q5WQkNDNXbsWL3//vuqqqrSeeedp+uvv17XXHONzj33XMXFxXm1ruuuu05vvPGGpGNh0fr16zVp0iRdfPHFHo3P7XLFFVfo9ddf9/oz1efmm2/Www8/LMMw9Pbbb7vDopq/SxwOR7PDIklKT0/Xiy++qGeeeUbffvutli1bprVr12r9+vXuBuI1MjMzdeGFF2rRokW66KKLGr33rl271LNnz2avDQDgW4RFAADYYNKkSe6w6KOPPlJRUZGio6Pdr2/cuFGbNm0yza/Lxo0bdf7559f5//I3xNuQpbmOHDni/j49Pd2r96SnpzcaFu3Zs0fnnnuu9u7d26T1+Pvz1pafn6/Kykr3dY8ePbx6X+0flBsLtzp16tTo/UJCQtzf116Pv9T+PW/OZ66oqFBhYaFiY2PdY88884zWr1+v7du3q6KiQrNnz9bs2bPldDp14oknavjw4brwwgt16aWXKiwsrM5nXHzxxfrNb36jf/7zn5KktWvXau3atZKOnTo2bNgwjRw5UmPHjlVqampTP3ajrKfsVVVVKSsrSxs3blRmZqakY6e+7dy5U1988YUSExOb/axevXpp2LBhWrZsmZYsWaJDhw5JkvvvmuHDh/skkAkNDdXw4cM1fPhw99ju3bv14Ycf6tlnn3VX9VVVVWnixInauXOnIiMjW/xcAEDrcdq9AAAAOqJx48a5fyguKSnRhx9+aHq9dlXRoEGD6qwkKS8v19VXX+0OipKSknT//ffrq6++0r59+1RcXCyXyyXjWI9CzZo1y/3e2tvT/KHmeHtJXv+QGBUV1eicCRMmuIOimJgY/e53v9Nnn32mnTt3qqioSNXV1e7PW3tbk78/b221P7vk3eeyzmss3GpsW5Mdan/u5nxmyfNzd+3aVevWrdP9999v2p7lcrm0adMm/etf/9K4ceOUkpKiv/3tb6ZtiLU9//zzmj9/voYMGWIaP3TokObNm6ff/OY3Sk9P1zXXXNPkILIx8fHxeuGFF9xfL7/8sj755BPt2rVLr7/+usLDwyVJP/zwgylUaq6aYLmqqkpz5szRnDlzVFVVZXrNH3r27Kl77rlHP/30k2nr2aFDh/TBBx/47bkAAP8gLAIAwAYRERG69tpr3dezZ892f19VVaX33nvPfV3fD3jz5s3Trl27JB3b2vb999/rL3/5i0aOHKnU1FRFRkaaQoXWrK6pXSVVUlLi1XuKi4sbfH3lypVauXKl+/6rV6/W008/rYsvvli9evVSVFSUnM5f/qdNa37e2mp/dqnxz1XXvJiYGJ+uqTXU/tzN+cxS3Z87NjZWf/nLX7R//36tXr1aTz75pMaOHWuqwDl69Kj+9Kc/6eqrr5ZhGHU+a9y4cfr222+1Z88evfXWW7rjjjt0wgknuF83DEPz5s3Taaedpm3btnm1/pYIDg7W1KlTNXPmTPfY4sWL9dZbb7Xovtdee60iIiIkHQuda+5n/TvHX2JjYzV79mzTttlly5b5/bkAAN8iLAIAwCa1Q6ClS5e6e37897//dW8fCQkJ0YQJE+p8/xdffOH+/re//a1SUlIafN6ePXtaumSvJSUlub/3tlLD2vPEqvbnnTRpkukH/bq05uetrVOnTqYtYN5+/tpNqFuyFckuzfk9r/2ZQ0NDGwzJgoKCdOaZZ+qee+7RRx99pEOHDmnZsmW64oor3HM+/vhjzZs3r8Fnpqena+LEiXr55Ze1efNm7d27V4888oi7Ai4nJ0fTp0/3av2+cOONN5o+wwMPPKCysrJm3y82NlZXXnmlpGON3b///ntJ0tixY1sthExNTdWJJ57ovj5w4ECrPBcA4DuERQAA2GTYsGHq3bu3pGPbat555x1J5i1ol156qemH8NqysrLc33vT8Pibb75pyXKbpPZJXKtXr250flFRkX788ccG5/jj8/pjO5fD4dCpp57qvq6phmpIVVWVu4+OJJ122mk+X5e/1f49X7NmTb1bwmqr/WszaNCgJv1+OJ1ODRs2TAsWLNCFF17oHv/kk0+8vod07LS0Bx98UK+++qp7bMmSJV43i/eFv//97+5KnH379unll19u0f3q2s7miy1uTVGzvU5Svf2kAACBi7AIAACbOBwO0w9ws2fPVn5+vumH3YZ6jNTectXYVq/169ebwgh/GzVqlPv7Dz74oNEGyx988EGjP5w35fNmZWXp448/bnSdtX+g9WUT6PPOO8/9/VtvvVXv1qgaCxYsUE5OjntN3pwgF2jOOeccdyhw5MgRLVq0qMH5LpfL1Eer9q9ZUzgcDo0ZM8Z9XVOV11S1q3sqKyuVm5vbrPs0x/HHH68bbrjBff3kk0+2KKy66KKL1LVrV/d1SkqKKVDzt/Lycm3dutV97W2TewBA4CAsAgDARhMnTnRXU2zZskX33nuvewtKfHy8Lr/88nrfW1OVJDVcTVFSUqLbb7/dRyv2zoQJE9zbevbt26cnnnii3rk5OTl68MEHG72nt5+3urpat99+uyoqKhq9Z1xcnDuEOnLkiM8Co9tuu8193w0bNpiqVqzy8vJ07733uq/Hjx/v1WlngSYuLs59VLsk/f73v2+wb9QLL7zgPvHP6XR6/BktLCz06vdQMm9hTE5ONr3W2Mlydd3D6XQqISHBq/f5yv333+/+M5OVlWXqZdRUQUFB7mPt165dq2+++cbUQ6gpvv32W/3jH//wuveYdKxSqqCgwH19ySWXNOvZAAD7EBYBAGCjXr16mY6frh0qjB8/XqGhofW+t3Y1xVtvvaWnnnrKY+tPRkaGLrroIm3YsMHrE6p8oVOnTqYA5MEHH9QTTzzhsb7t27frwgsvVFZWVoOfVZJGjx7tDtaWLl2qe+65R6WlpaY5Bw8e1NVXX61FixZ59XnDwsLUr18/SceqSRYsWODNx2tUnz59dMcdd7iv77rrLr344osep7LV/P7UNCqPjY31KjgLVA8++KC70fW2bdt08cUXa+fOnaY5LpdLzz33nKkv0J133ulxpPv69evVs2dPPfzww/rpp5/qfF51dbU++OAD/fOf/3SPXXrppaY5Z599tiZMmKDFixfXGz5t27bNVMV3/vnnN/rn0df69++v6667zn39xBNPeB2W1aVv374644wzdMYZZ6hv377Nvs/Ro0f1+9//Xj179tT06dO1YcOGeivlsrOz9bvf/c70Z3jQoEGERQDQBgXbvQAAADq6SZMm1dlfp7Fjri+66CKde+65+uabb2QYhu655x69+OKLOu2009SpUydt375dK1euVHV1tbp37667777bFOD425/+9Cf973//04oVK2QYhv74xz/queee04gRIxQdHa2MjAwtW7ZM1dXVOvPMM9WnTx/NmTOn3vv1799fN998s7un01NPPaU5c+Zo8ODBSk5O1u7du/XNN9+ooqJCMTExevLJJ/WrX/2q0XVeffXVeuyxxyQdazb85ptvqm/fvqYm1f/4xz+a/Pn/8Y9/aN26dVq7dq2qqqp011136W9/+5uGDRum6Oho7dixQ9988407QAsODtbrr7/uEZq0JX369NHMmTN14403qrq6WqtWrdLxxx+v4cOHq0+fPioqKtKyZcu0f/9+93vOOuss/f3vf6/zfgcOHNAjjzyiRx55RF27dtWpp56qrl27Kjg4WIcOHdL69etNvayGDx9u2s4lHQsB33vvPb333nuKiIjQySefrN69eys2NlZHjx7Vzp07tW7dOvf8iIiIZv1++8IDDzyguXPnyuVyad++fXrzzTdbvSqwPkeOHNEzzzyjZ555Rp06ddLpp5+ulJQUxcTEqKioSNu3b9f69etVVVXlfk+XLl307rvvmraQ1uehhx5qUgPuUaNG6eqrr27WZwEAeMEAAAC2KigoMCIjIw1J7q8BAwZ49d6DBw8ap512mum91q8TTjjB2Lx5szFr1iz32KRJk+q831dffeWeM2LEiHqfW/v+DcnPzzcuueSSBtd3zjnnGFlZWcakSZPcY7NmzarzfsXFxcZFF13U4P1SU1ON5cuXe/1Z8vLyjP79+zd4z9p27drlHu/Ro0eDn7+wsNC47rrrGry3JCMlJcX4z3/+0+C9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1q2SpMTERN199916/vnnPeZt27ZNv//97/XRRx9p0aJFiouLa/Kzfv3rX6u0tFT33HOPVq9erdGjR+uzzz5TZGSkJGn69On617/+JUkaO3as3nnnHQUFBTX/wzVTWVmZsrOzJanRfYSdO3dWVFSUiouLtW/fPp+uY+7cuXr66ac1bNgw9ezZU7Gxsdq/f78WL16snJwcDR8+XL/73e98+kwAAAAAANA2+C0sys/Pl8vlkiRt2rRJa9euVUpKip588klddtllCg8P19q1a/WHP/xBq1ev1sqVKzV16lTNnz+/Wc+bMWOGSktL9cADD2jZsmUaM2aMFi1apEcffVTPPPOMJOnSSy/VBx984PPeSd6qXfEUHR3d6PyasKioqMin67j88suVlZWllStXatWqVSoqKlKnTp108skn64YbbtDUqVOb9Gt04oknmq4rKyt9ul4AAAAAANB6/Jaa1D6pq6ysTJGRkfrqq690/PHHu8fPPfdcffnllzr77LP1/fff66OPPtK3337rPi2sqe6//36VlJTo8ccf15dffqmBAwdqx44dko4dST9//nyFhoa27IO1QFlZmft7b9YRFhYm6Vgjb18644wzdMYZZ/j0ngAAAAAAoH3wW8+i8PBw0/Wtt95qCopqRERE6K9//av7+oMPPmjRcx977DH99re/lSR3UDRs2DB98sknHmtqbbWfX1FR0ej8mj5OERERfluTL2zevNn09eWXX9q9JAAAAAAA0Ex+C4tiYmJM1zVHstfl/PPPd297Wrt2bYufnZ6ebrpOTk62PSiSzL8m3mwtq6nO8mbLGgAAAAAAgC/4LSwKCwtTUlKS+zotLa3eueHh4UpMTJQkHTlypEXPfemll9wneiUkJEiS5s+fr4kTJ7p7KNklPDzcvabMzMwG5x49etQdFjX0awcAAAAAAOBLfguLJHPj4+rq6gbn1rzekubTb7zxhu68805J0mmnnabt27dr6tSpkqQ5c+bo1ltvlWEYzb6/L5xwwgmSpIyMDFVVVdU7r+YkOUkaMGCA39cFAAAAAAAg+TksOvfcc93f79y5s955BQUF7iPlu3fv3qxnzZkzR7fddpsMw9BJJ52kJUuWqHPnznrttdd04403SpJmzZqladOmNev+vjJs2DBJx7aYrV+/vt55X3/9tfv7oUOH+n1dAAAAAAAAkp/Doquvvtr9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k5t8vz179mjGjBnq37+/oqKiFB8fr8GDB+vJJ59USUnrb2VxuVz67LPPJEkDBw5s9eejeay9ihKjQ3Xt6ak2rabjSekUoZAgcxURW9EAAAAAtGW2bEP77rvv9PTTT9vx6Bbp0qWLz+61cOFC3XTTTSooKHCPlZSUaN26dVq3bp1mzpypRYsWqW/fvj57plVFRYUee+wxGYahnJwcffHFF9q6daumTJmi888/32/Phe/syi7W4k0HTGNThvZSeEiQTSvqeIKcDqV2jtSu7F9OotubU6LT0jvbuCr/crkMLf7xoPJLK3Xlqd0UFcaOZgAAAKA9afX/he9yuXT77berqqpKycnJOnz4cGsvwSfS09PVv39/LVmypMnv3bhxo66//nqVlpYqOjpaf/rTnzRq1CiVlpbq/fff12uvvaZt27Zp9OjRWrdunWJiYvzwCY6FRY888oj72uFw6J577tHjjz/ul+fB9179Zqdcxi/X0WHBuumsHvYtqINKj7eERe24sqi8qlrT3tmgL7ce+7v7ndV79OlvhsnppEcTAAAA0F60elj0/PPPa+3aterfv7/GjRvXpoKJBx98UIMHD9bgwYPVpUsX7d69W7169Wryfe6++26VlpYqODhYS5Ys0dlnn+1+7bzzzlO/fv107733atu2bXrqqaf08MMPe9xjxowZKi8vb9Iz+/XrZxqLjo6WYRhyuVzKysrSwoULdd9992nVqlX6z3/+o9jY2CZ/NrSewwVlmrc+0zR241np6hQRYtOKOi5r36L2GhZVVLl057u/BEWS9NOBAn2XmdeuK6kAAACAjqZVw6K9e/fqgQcekCS9/PLL+uqrr1p8z82bN2vatGmaN2+ekpKSGp1fXV2tm2++WaNHj9aNN97YpGfVrsJprjVr1mjZsmWSpFtuucUUFNWYMWOGZs2apS1btui5557Tn//8Z4WEmAOAV155RcXFxR7vrc8111zjERbVcDqdSk1N1bRp05SYmKjrrrtOf/3rX/XEE0804ZOhtb2+fJcqql3u69Agp24Z2vTwEi3nERbltL+wqLLapf/33kZ9vsWzGnT7oULCIgAAAKAdadUG13feeaeKioo0adIkjRgxosX3Ky0t1cUXX6xly5bpggsuUG5uboPzXS6XpkyZovfee0+TJ0/WunXrWryGplqwYIH7+ylTptQ5x+l0auLEiZKk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vrKzs3XFFVdozZo1OuWUU/y9JJ9IT09X//79tWTJkia/d+PGjbr++utVWlqq6Oho/elPf9KoUaNUWlqq999/X6+99pq2bdum0aNHa926dYqJifHDJzgWFj3yyCPua4fDoXvuuUePP/64X54HwDecTofuHNVXg9Lj9P/e26jsol8qXkKDneqZENhhkbWyaH8TK4uyi8tVZUnJfL0NTfJscs02NAAAAHQUfg2LRo0apb1799b7+nXXXacFCxZo3Lhx7uBi/vz5/lxSizz44IMaPHiwBg8erC5dumj37t3q1atXk+9z9913q7S0VMHBwVqyZInOPvts92vnnXee+vXrp3vvvVfbtm3TU089pYcfftjjHjNmzFB5uff/L/fdd9+tfv36mcaio6NlGIZcLpeysrK0cOFC3XfffVq1apX+85//KDY2tsmfDUDrOadPohb9v+H6zXsbtWZXriRp6tBeCg8JsnllDevWwsqiQ/nmv/uCnA4lNrFBtjcSLGFRbhFhEQAAADoGv4ZFQUGN/8AyduxYHX/88fr555+1bNmyJj9j8+bNmjZtmubNm6ekpIb7eEhSdXW1br75Zo0ePVo33nhjk55VuwqnudasWeP+nLfccospKKoxY8YMzZo1S1u2bNFzzz2nP//5zwoJMZ/A88orr6i4uNjjvfW55pprPMKiGk6nU6mpqZo2bZoSExN13XXX6a9//aueeOKJJnwyAHboEhuuD24/Sxv2HlWw06lT0uLsXlKjUiyVRQeaWFl0IN88PzkmTEFOR4vXZWWtLKJnEQAAADqKgDgNrWabVVlZ0/7f5dLSUl188cVatmyZLrjgAuXm5jY43+VyacqUKXrvvfc0efJkrVu3rtlrbq4FCxa4v58yZUqdc5xOpyZOnChJysvL01dffeUxp6ioSIZheP01cuRIr9Z30UUXSZKWLl3apM8FwD4Oh0On94hvE0GRJI8T3Q4WlKmq2uX1+639ivzR3FqS4qPZhgYAAICOyfaw6Oeff9Z3330nSerfv3+T3hsREaFHH31UDodDP/zwgy666CLl5+fXOdcwDN1xxx2aPXu2JGnChAk6/fTTW7T25li+fLkkKSoqqsHnjxgxwv39ihUr/L6uGllZWZLkUckEAL5i7S/kMqTDhd5vqz1oCYv80a9IqmMbGmERAAAAOghbwqKSkhJt375dTz/9tEaM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chqKdrSUsAgAACBQMGdRCEpJSVFpaamioqIc9lssFp133nlauHChFixYoKlTpxpUIQCgo+uWGKOsomr7Nj2LAAAAAgc9i0JQWFiYU1AkSREREbr88sslSfv27fN3WQCAENJ0RbSj5cxZBAAAECh8HhZt2LBBjz/+uKZMmaLevXsrOjpaCQkJGjx4sKZPn64VK1b4ugSvyc/P15dffqlHHnlEF154obp06SKTySSTyaRp06Z5fL3MzEzdf//9GjJkiOLj45WSkqLRo0frueeeU1VVlfffQCusVqu++uorSdLw4cP9fn8AQOhIazoMjZ5FAAAAAcOnw9AmTpyo5cuXO+03m83au3ev9u7dq9mzZ+vmm2/WG2+84bK3SyDp1q2b1641d+5c3XjjjSorK7Pvq6qq0oYNG7Rhwwa9+eabmjdvngYOHOi1ezZlNpv15JNPymazqbCwUIsXL9auXbs0ffp0TZ482Wf3BQCgac+i/DJ6FgEAAAQKn4ZFOTk5kqSePXvqqquu0oQJE9SnTx/V19dr9erVev7553XkyBG98847qqur05w5c3xZjlf16dNHQ4YM0cKFCz0+d/PmzbrmmmtUXV2thIQEPfTQQ5o0aZKqq6v1wQcf6I033tCePXs0depUbdiwQYmJiT54Bw1h0V/+8hf7tslk0u9+9zs99dRTPrkfAADHdW86DI2eRQAAAAHDp2HRkCFD9OSTT+rnP/+5wsPDHY6NHTtWN910k8aNG6c9e/bo/fff1y9/+UtNnDjRlyW1yyOPPKLRo0dr9OjR6tatmw4dOqR+/fp5fJ177rlH1dXVioiI0MKFC3XGGWfYj51zzjkaNGiQHnjgAe3Zs0fPP/+8HnvsMadr3H///aqtdf+3sPfcc48GDRrksC8hIUE2m01Wq1U5OTmaO3euHn74Ya1evVrz589XUlKSx+8NAAB3NB2GlkdYBAAAEDBMNpvNZmQBX375pS655BJJ0q9//Wv94x//8Oj87du3684779Qnn3yirl27ttq+vr5eN910k6ZOnaobbrihTTUf1zgsuuWWWzR79uxWz1m3bp1OP/10SdIdd9yhf//7305trFarhg8frp07dyo5OVn5+fmKjIx0aJOQkKDKykq3a12yZInOPvvsVtv997//1dVXX60HHnhAzzzzjNvXbyw7O1vp6emSpKysLPXu3btN1wEA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bJJsq1ev9vh9GYmwCB2Kp58U1q5da29/xx13uGxTX19vGzp0qE2SLTk52WY2mx2OX3nllTZJtg0bNrg8PyEhwZaenu7xewGClRHPYVOERQhlRj+D9fX19m+Mb7zxRlt9fX1b3woQtIx+Dpv66KOPbJJsDzzwgNvnAMHM389gXV2dbdCgQbaTTz7Z6dkM1rCIYWgIaZ999pn99fTp0122CQsL08033yxJKikp0ZIlSxyOH5+ryNW8RHl5eaqoqHA5nxGABt54DgG0nTefQavVqunTp+vtt9/Wddddp9mzZyssjG83gdb4+mvh8SE5xxdmAeCovc9gRUWF9u7dq++//15RUVH2ybVNJpN9ZewzzjhDJpPJ4V6BjK/eCGkrVqyQJMXHx+u0005rtl3j5YBXrlzp8tjChQudzvv666+dzgfgyBvPIYC289YzeDwoeuedd3TNNdfo3XffDf75GgA/8fXXwpycHEk/rU4IwFF7n8Ho6GjdeuutLv8c7zjws5/9TLfeeqsyMjJ88ya8jNXQENJ27twpSRo4cGCLS/oOGTLE6ZzjJk+erP79+2vOnDn6zW9+o5NPPllSw8TXTz75pKKiouwJNABn3ngOAbSdN55Bq9WqGTNm6J133tFVV12l9957j6AI8IA3nsMdO3YoIyNDcXFxDvurqqp03333SZIuuugib5UMdCjtfQZjY2P15ptvujxn2rRp2rt3rx566CGNHTvWSxX7HmERQlZNTY0KCgokSb17926xbefOnRUfH6/KykplZWU5HIuIiNCbb76p888/XxMnTtS1116rxMREffLJJ8rMzNTf//73oEmPAX/z1nMoSW+++ab9t0Jbt2617zve5X78+PG67bbbvFg9EPy89Qw+/vjjevvtt5WQkKDBgwfrb3/7m9P5l112mf0XKgB+4q3n8KOPPtILL7yg8ePHKyMjQ0lJSTpy5IgWLFigwsJCTZgwQb/97W999j6AYOXN70c7EsIihKzGyx0mJCS02v74J4WKigqnY5MmTdKKFSv06KOP6sMPP1RdXZ1GjBihZ555Rtdcc41X6wY6Em8+hytWrLCPCT9u5cqVDl2ECYsAR956Bg8dOiSpYc6GJ554wuW5GRkZhEWAC956Di+++GLl5ORo1apVWr16tSoqKtSpUyeNHDlS1157rWbMmNFijwkgVHnz+9GOhM8WCFk1NTX211FRUa22j46OliRVV1e7PD5mzBgtWLDAO8UBIcKbz+Hs2bM1e/Zsr9UGhAJvPYM8f0Dbees5HDVqlEaNGuXd4oAQ4O2fC5sK1q+RTHCNkBUTE2N/bTabW21fW1srqWE8KgDv4DkEjMUzCBiP5xAwFs+ga4RFCFmJiYn21+50IaysrJTkXtdEAO7hOQSMxTMIGI/nEDAWz6BrhEUIWTExMUpNTZUkZWdnt9i2uLjY/kkhPT3d57UBoYLnEDAWzyBgPJ5DwFg8g64RFiGkDRs2TJK0b98+WSyWZtvt2rXL/nro0KE+rwsIJTyHgLF4BgHj8RwCxuIZdEZYhJA2fvx4SQ1dCTdu3Nhsu2XLltlfjxs3zud1AaGE5xAwFs8gYDyeQ8BYPIPOCIsQ0i677DL761mzZrlsY7Va9c4770iSkpOTNWnSJH+UBoQMnkPAWDyDgPF4DgFj8Qw6IyxCSBszZowmTJggSXrrrbe0evVqpzbPP/+8du7cKUm65557FBkZ6dcagY6O5xAwFs8gYDyeQ8BYPIPOTDabzWZ0EUBbrVixQvv27bNvFxQU6Pe//72khm6Bt912m0P7adOmOV1j8+bNGjdunKqrq5WQkKCHH35YkyZNUnV1tT744AO9/vrrkqTBgwdrw4YNDrPlA+A5BIzGMwgYj+cQMBbPoPcRFiGoTZs2TW+//bbb7Zv77z537lzdeOONKisrc3l88ODBmjdvngYOHNimOoGOjOcQMBbPIGA8nkPAWDyD3scwNEDSJZdcoi1btui3v/2tBg8erLi4OCUnJ2vUqFF65plntHnz5pD4hAAYiecQMBbPIGA8nkPAWDyDP6FnEQAAAAAAAOzoWQQAAAAAAAA7wiIAAAAAAADYERYBAAAAAADAjrAIAAAAAAAAdoRFAAAAAAAAsCMsAgAAAAAAgB1hEQAAAAAAAOwIiwAAAAAAAGBHWAQAAAAAAAA7wiIAAAAAAADYERYBAAAAAADAjrAIAAAAAAAAdoRFAAAAAAAAsCMsAgAAAAAAgB1hEQAAAAAAAOwIiwAAAAAAAGBHWAQAAAAAAAA7wiIAAAD4xKFDh2QymWQymTR79myjywEAAG4iLAIAAPCypUuX2kMSd//ce++9RpcNAAAgibAIAAAAAAAAjUQYXQAAAEBHduedd+pXv/pVq+26dOnih2oAAABaR1gEAADgQ2lpaRo+fLjRZQAAALiNYWgAAAAAAACwIywCAAAIQBkZGTKZTJo2bZokaf369bruuuuUnp6umJgYpaena/r06dq1a5db15s7d66uvPJK9e7dW9HR0UpNTdUZZ5yhp59+WhUVFW5dY9u2bfr1r3+tESNGqHPnzoqMjFT37t117rnn6tlnn1Vubm6r1/jmm290ySWXqHv37oqOjla/fv105513Kjs7u8XzcnJy9OCDD+rUU09Vp06dFBkZqW7dumnEiBG67rrrNHv2bJWVlbn1PgAAQMtMNpvNZnQRAAAAHcnSpUs1adIkSdKjjz6qxx57zONrZGRkKDMzU7fccosmTpyoO+64QxaLxalddHS03n33XV111VUur1NTU6Prr79e//vf/5q9V8+ePTVv3jydfPLJLo/X19fr97//vV566SW19K3jLbfcotmzZ9u3Dx06pH79+kmSZs2apd27d+vpp592eW7Xrl21bNkyDR061OnY8uXLdfHFF7caBs2dO1cXX3xxi20AAEDrmLMIAAAggH3//feaM2eO0tLS9NBDD2nMmDGqqanR/Pnz9dJLL6m2tlY33HCD+vXrp1GjRjmdf8stt9iDopNOOkn333+/hg4dqqKiIn3wwQeaPXu2cnJyNHnyZG3ZskW9evVyusYvfvELzZw5U5LUo0cP3X333TrzzDPVqVMnHTt2TOvWrdPHH3/c4vt44403tGrVKp111lm64447NHjwYJWUlOidd97RO++8o2PHjmnGjBlavXq1w3m1tbW69tprVVZWpsTERN15552aNGmS0tLSZDabdfDgQa1atarFMAwAAHiGnkUAAABe1rhnkburoZ1wwgmKjIy0bx/vWSRJffv21Zo1a9S9e3eHc5YsWaIpU6bIYrFo9OjRWrduncPxefPm2XvaTJ48WfPnz1dUVJRDmzfeeEO/+MUvJElXX321PvzwQ4fjX3zxhS699FJJ0hlnnKH58+crOTnZ5XvIyspSenq6fbtxzyJJuv322/Xaa6/JZDI5nHf77bfrzTfflCRt2rRJp5xyiv3Yt99+q8mTJ0tqueeQxWJRVVWVkpKSXB4HAADuIywCAADwssZhkbsOHjyojIwM+3bjsOjjjz/Wz3/+c5fn/epXv9Krr74qqWFeo8a9iy666CItWLBAkZGR2r9/v0OQ09h5552nRYsWKSIiQocPH1aPHj3sx84880ytXr1acXFx2rt3r3r27On2e2ocFvXo0UMHDx5UdHS0U7vdu3dryJAhkqSXX35Zv/nNb+zH5syZoxtuuEGSVFpaShgEAIAfMME1AABAAOvcubO9Z48rM2bMsL9etGiR/bXFYtGyZcskSVOmTGk2KJIaevYcP2fp0qX2/YWFhVqzZo0k6ZprrvEoKGrqyiuvdBkUSQ29qhISEiRJBw4ccDjWOLiaNWtWm+8PAADcR1gEAADgQ48++qhsNlurfxr3KmrslFNOUURE89NMnnzyyfahZVu3brXvP3DggKqqqiRJp59+eos1Nj6+bds2++vvv//ePqH1hAkTWn6jrTjec6g5nTt3liSVl5c77B8/frz69+8vSbr33ns1ZswYPfXUU1q5cqXMZnO7agIAAK4RFgEAAASwtLS0Fo9HREQoJSVFklRUVGTf3/h1a9doPBdS4/MKCgrsrxv38GmLuLi4Fo+HhTV8W1pfX++wPzIyUnPnzrWvkrZ+/Xo9/PDDGj9+vJKTk3XBBRdozpw5TucBAIC2IywCAAAIYE0ngzbqGkYaNmyYtm7dqv/973+aMWOGBg4cKEmqrq7W119/rRtuuEGnn3668vPzDa4UAICOgbAIAAAggB09erTF4xaLxd4b6HgPo6avW7tGXl6ey/O6dOlif52bm+tewT4SHh6uyy67TG+99Zb27t2rnJwczZw5U6eddpokaePGjbrjjjsMrREAgI6CsAgAACCAff/997JYLM0e/+GHH+xz9wwfPty+v3///vahX2vXrm3xHuvWrbO/bnyNU045xd4r6bvvvvO8eB/q0aOHpk+frtWrV+vUU0+VJH355Zeqrq42uDIAAIIfYREAAEAAKyoq0ty5c5s9PnPmTPvrc8891/46IiJCZ511liTpm2++UXZ2drPXePPNN+3nnH322fb9KSkpOvPMMyVJH330kXJyctr0HnwpMjLS/j4tFotKSkqMLQgAgA6AsAgAACDA3XfffS6Hki1btkyvv/66JOm0007T6NGjHY7fddddkiSz2axbb71VdXV1TteYOXOmFi5cKEm64oornCay/sMf/iBJqqqq0lVXXaXS0tJm62wpkGqr5cuXa9++fc0eN5vNWrZsmSQpISFBXbt29XoNAACEmubXYQUAAEC75efnOyxH35zY2FgNGDDAaf9JJ52kHTt26LTTTtNDDz2kMWPGqLa2VvPnz9eLL74oi8WiiIgIvfLKK07nTp06VVdddZX++9//auHChRo7dqzuu+8+DRkyRMXFxfrggw/sPZNSUlL0wgsvOF3jkksu0a233qq33npLq1at0rBhw3T33Xdr3LhxSkpKUkFBgTZs2KAPP/xQJ510kmbPnu35B6kFixcv1l//+ldNmDBBU6dO1ciRI9W1a1dVV1drz549+ve//61NmzZJkm699VZFRPDtLQAA7cVXUwAAAB969dVX9eqrr7ba7qSTTtL333/vtP/kk0/W3XffrTvvvFN333230/GoqCi9/fbbOv30011e95133pHFYtH//vc/bdq0STfeeKNTm549e2revHnq1auXy2u89tprio2N1SuvvKKcnBw9/PDDzb4HX7BarVq2bJm9B5Erl156qZ566imf3B8AgFBDWAQAABDgbrvtNg0fPlwvvviiVqxYoYKCAnXt2lWTJ0/WH/7wBw0bNqzZc2NiYvTpp59q7ty5mj17ttasWaOCggLFx8dr8ODBuuyyy3T33XcrISGh2WuEh4frn//8p6ZPn67XXntNS5cu1ZEjR2Q2m5WamqqRI0fqggsu0E033eT19/673/1OI0eO1KJFi7R582bl5OQoPz9fktS9e3eNGTNGN998s6ZOner1ewMAEKpMNpvNZnQRAAAAcJSRkaHMzEzdcsstXh/aBQAA0BImuAYAAAAAAIAdYREAAAAAAADsCIsAAAAAAABgR1gEAAAAAAAAO8IiAAAAAAAA2LEaGgAAAAAAAOzoWQQAAAAAAAA7wiIAAAAAAADYERYBAAAAAADAjrAIAAAAAAAAdoRFAAAAAAAAsCMsAgAAAAAAgB1hEQAAAAAAAOwIiwAAAAAAAGBHWAQAAAAAAAA7wiIAAAAAAADYERYBAAAAAADAjrAIAAAAAAAAdoRFAAAAAAAAsCMsAgAAAAAAgB1hEQAAAAAAAOwIiwAAAAAAAGBHWAQAAAAAAAA7wiIAAAAAAADYERYBAAAAAADA7v8BWh4pQ7AxJ1oAAAAASUVORK5CYII=",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAAq9xJREFUeJzs3Xd8VfX9x/H3zc3ehIQQSJhhhr0UZMvQuot7j1br+lmrbe1ydDpb22q1VouKC6vWUaviYA/ZK+wVEgIhg+x57z2/PyiXnMybcJNzb/J6Ph55mPO533vu5wIC98132AzDMAQAAAAAAACvCLC6AQAAAAAAgI6EsAUAAAAAAMCLCFsAAAAAAAC8iLAFAAAAAADAiwhbAAAAAAAAvIiwBQAAAAAAwIsIWwAAAAAAALyIsAUAAAAAAMCLCFsAAAAAAAC8iLAFAAAAAADAiwhbAAAAAAAAvIiwBQAAAAAAwIsIWwAAAAAAALyIsAUAAAAAAMCLCFsAAAAAAAC8iLAFAAAAAADAiwhbAAAAAAAAvIiwBQAAAAAAwIsIWwAAAAAAALyIsAUAAC9bsmSJbDabbDabpk+f3ui4U2NsNpvXXvvmm2923/PVV1/12n297dChQ+4++/TpY3U77cZffn4AAMCZIWwBAPiFBx980PTh3DCMVt2noKBAISEhfOAFfNyrr75qCiTrfoWEhKhbt24aP3687rrrLi1btszje9cO+059devWTQ6Hw+N7OJ1OJSUl1bvPoUOHmn1uZmamfve732nu3LlKSUlRRESEgoKCFBsbq8GDB+s73/mOfvGLX+iTTz5RaWlpi95HS76WLFni8fsFALQMYQsAwC/cdNNN7u8zMjK0dOnSVt3nnXfeUXV1tSQpIiJCl19+uVf668w66ywVWKu6ulq5ublav369XnjhBU2bNk0zZsxQZmZmq+6Xm5urzz77zOPxX3zxhY4dO9ai16isrNSDDz6ovn376pe//KUWLVqkrKwslZeXy+FwqKioSLt379Znn32m3//+97r44osVFxen1atXt/TtAAAsFmh1AwAAeGL48OEaPXq0Nm3aJEl6/fXXm1yi05jXX3/d/f28efMUGRnprRYBtJGoqCjdeOONplplZaUyMjK0cuVKVVRUSDq5hG/mzJlas2aNunbt2uLXef3113XRRRd5PLYlqqurdckll2jRokXuWnBwsMaNG6f+/fsrPDxcxcXFOnTokDZv3ux+TzU1NSorK/PoNW688UZFRUV53FPPnj1b9B4AAJ4jbAEA+I2bbrrJHba8//77ev755xUWFubx8/fs2aNvv/3WdD8rtXYpVEdwJkvB0PnExcXpueeea/Cx/Px83XXXXXr33XclSfv27dOjjz6qv/71rx7ff+jQodqxY4c++eQTFRYWKjY2tsnxRUVF+uijj0zPbc7jjz/uDlpsNpt+8pOf6KGHHmrwtWpqarRkyRK9++67evvttz1+H4899hizywDAR7CMCADgN6699loFBQVJkoqLi/Xhhx+26Pm1/yW6V69emjFjhjfbA2CBrl276q233tL48ePdtfnz56umpsbje9xwww2SpKqqKi1cuLDZ8e+++64qKyslqd6Mm4bU1NToT3/6k/v617/+tR5//PFGQ52goCDNnj1b//jHP5SVlaXRo0d78C4AAL6EsAUA4DcSEhJ0/vnnu69bMo3fMAy98cYb7usbbrjBq6cAAbCO3W7XPffc474uKyvThg0bPH7+tddeq8DAkxO+Pfl95dSYoKAgXXvttc2OX7t2rQoLC93Pue+++zzuLTY2tlVLogAA1iJsAQD4ldpLf7788kuPN6hcunSpMjIy3Nd1/zW6qKhIb7/9tu644w6dddZZio+PV3BwsKKjo9W/f39dc801evfdd+VyubzzRtTyo58//PBDXXLJJerZs6dCQkKUnJys2bNna8GCBS06RUWSKioq9OGHH+r//u//NHnyZCUmJio4OFiRkZHq06ePLrvsMr3yyivuzYQbcuq0mL59+7prGRkZjZ58UltrNtVds2aN7rnnHqWlpalLly4KDQ1VcnKyzjvvPD333HMe7Wvx6KOPul/30UcflSQ5HA69/vrrmjVrlvvHNikpSZdeeqn+85//eNRbWyktLdVf/vIXzZ07V8nJyQoNDVWXLl00bNgw3XPPPaZlcc3JzMzUY489pqlTpyoxMVEhISEKDg5W165dNXLkSF177bV64YUXmvx/qqamRm+88Ya++93vql+/foqMjFRgYKCioqKUmpqquXPn6uGHH9batWu98fZbZNSoUabr7Oxsj5/brVs3nXfeeZKkVatWaf/+/Y2OPXjwoFauXClJOu+885SQkNDs/Y8cOeL+Pi4urkX7qgAA/JQBAIAfqaqqMuLi4gxJhiTjmWee8eh5t9xyi/s5EydOND32/vvvGyEhIe7Hm/oaOXKkceDAgSZfa/Hixe7x06ZNa3Rc7fs2paSkxPjOd77TZF+TJ082jh49atx0003u2vz58xu835o1a4zIyEiP3m+fPn2MjRs3Nnif+fPne3SPht7jwYMH3fXevXs3+f5LS0uNq666qtn7JyUlGf/973+bvNcjjzziHv/II48YWVlZxqRJk5q87y233GI4nc4m7+spT35+Tvnkk0+M7t27N/u+r732WqOsrKzJe/397383wsLCPPp5Oueccxq8x+7du40hQ4Z4/PO9d+/e1v4wGYZh/vXV3K8RwzCMPXv2mF7/zTffbHRs7V9/koyKigrj3XffdV8//PDDjT730UcfdY/717/+ZVRUVJjudfDgwXrP+de//uV+3GazGaWlpZ78EDSr7vto6LUBANZgg1wAgF8JDg7WNddco+eff17Syen8P/rRj5p8TkVFhd577z33dd2NcY8fP66qqipJUnJysoYOHaru3bsrPDxcpaWl2rlzpzZu3CjDMLRlyxZNnTpVmzdvbpep/TU1Nbrgggu0bNkyd6179+6aOnWqoqKitG/fPq1YsUIrVqzQZZddpn79+jV7zxMnTqi0tFTSyX/RT0tLU3JysiIiIlReXq59+/Zp7dq1cjgcOnTokKZNm6aNGzcqNTXVdJ8hQ4bo7rvvVklJiXtZRUOnxpyJ8vJyzZw50zRTokePHpoyZYoiIyPd79/pdOro0aO6+OKL9fbbb3t0pHdpaanOO+88bd++XeHh4ZoyZYpSUlJUUlKixYsX6/jx45JO7v8xaNAg/fSnP/Xa+2rOwoULdd1118npdEo6uUxm8uTJSk1NVWlpqZYvX+6eufHWW2/p4MGD+uabbxQaGlrvXh9++KHuuOMO93V0dLQmTpyo5ORkBQYGqqioSHv27NH27dsbnclUUlKiWbNmuY9VDggI0OjRozVkyBBFRkaqvLxcR44c0ZYtW5SXl+ftHw6P1J3JkpiY2KLnX3zxxYqNjVVhYaHeeOMN9yyouk79Wu/SpYsuuugijzZ67t+/v/t7wzD05JNP6rHHHmtRfwAAP2Nx2AMAQIutXbvW9K+5W7dubXL8m2++6R4bEhJinDhxwvT4xx9/bPzhD39o8l/iDxw4YMydO9d9n9tuu63Rsd6c2fLrX//a9C/iv/vd7wyHw2Eas3v3bmPkyJGGJCM4ONijmS0///nPjW3btjX6ujk5OcYNN9zgvte5557b6NiWzFJp6XPuvPNO9zi73W48++yz9WaZ7Nmzxxg7dqx7XHR0dKP/wl97Zsup2Uw33XSTkZ+fbxpXVlZmXHPNNe6xkZGRXpmN4MnMln379plmHk2YMKHer02n02k888wzRkBAgHvcvffe2+D9Ro0a5R5zzz33NDoLpqSkxHj33XeNn/70p/Uee/bZZ933GDp0qLFr164G7+FyuYy1a9cad955p3H48OEmfiSa19KZLT/72c/c44OCgoyCgoJGxzY0s8UwDOP2229315YtW1bvecuXL3c/fscddxiGYXg0s8Xlchl9+vQx/b98/fXXG6tXrzZcLpdnPyAevA9mtgCA7yBsAQD4pdrLGR588MEmx9YOSa688spWv2Z1dbUxYsQIQ5IRGhra6Ic5b4UthYWFRnh4uHvMo48+2ui9jh8/biQlJZnu2dwyFU+cf/757vvt2LGjwTFtFbbs27fPFCY899xzjd6voKDA9GH2lltuaXBc7bBFknHNNdc0es+KigojJSXFPfadd97x6L01xZOw5cYbb3SPSU1NNQoLCxu93x//+Ef32ICAgHpL3EpKStyPp6SktPqD/bx589z3+fLLL1t1j5ZqSdiyY8cOIyoqyj3+2muvbXJ8Y2HLypUr3bXvfe979Z73/e9/3/34qlWrDMPwLGwxDMN47733TONOfXXt2tX4zne+Yzz88MPGJ5980mRI1Nz7uPHGG427777bo69nn33W49cBALQcYQsAwC89/vjj7g8YPXr0qDfb45Ts7GzDbre7x3766adn9LpPPPGE+14ff/xxg2O8Fbb87W9/cz+enJxsVFVVNdnbSy+95PWwZeHChe77/eUvf2lwTFuFLT/96U/dY0aNGtVsUFC715CQkAZDitphS3BwsHH06NEm7/mTn/zEPf5HP/qRR++tKc2FLSdOnDDtH/TBBx80eT+n02mkpaW5xz/00EOmx48cOWL6MWyt2bNnu++zefPmVt+nJZoLWyorK43du3cbTz75pBEbG+seO3jwYOPYsWNN3ruxsMUwDCM1NdWQZMTExJjqFRUV7tcZMGCAqe7p7JKXX37ZCA0NbTB0qT3rZcKECcZf//pX0+t78j5a8tXU700AgDPHni0AAL90/fXX6+c//7lcLpeys7P11Vdfae7cufXGvfnmm+59L7p3797gmNoKCwu1Zs0apaenKz8/X6WlpaYTiHbt2uX+fvPmzbrooou89I7qW7x4sfv7q666SsHBwU2Ov/rqq3XPPfc0eYJQXeXl5VqzZo22bdum3NxclZSUuH+8JPMpKps3b/a8eS/45ptv3N/ffPPNzZ7adNlllykuLk4FBQWqqqrS6tWr3SfMNGTy5Mnq3r17k/ccPXq0+/tDhw551vgZWLVqlXv/oPj4+GZ/fQUEBOjWW2/VAw88IMn8a+bUPUJDQ1VZWant27dr5cqVOuecc1rcV0pKivv7F198US+88EKL73EmTp1y1ZSAgABdeumlev7551u8X0ttN9xwgx555BEVFRXpo48+0lVXXSVJ+uijj9zHN99www2tuvdtt92m2bNn64knntDbb7+tEydO1BtjGIbWrl2rtWvX6oknntCCBQs0ffr01r4dAIBFCFsAAH6pZ8+emjVrlhYtWiRJWrBgQYNByqnNLCXpuuuuk91ub/B+WVlZeuihh/Tee++5P+w2p603At20aZP7+4kTJzY7PioqSsOGDdPGjRubHVtQUKCHH35Yr7/+ukpKSjzqpz03PjUMwxTuTJo0qdnnBAUFacKECfr8888lSRs3bmwybBk+fHiz96y9CXJxcXGz489U7Z/zCRMmKDCw+b+q1Q5PNm3aJMMw3MFEcHCwLr30Ur3zzjtyOByaOXOmrrrqKl1++eWaOnWqYmNjPerryiuv1D//+U9JJ8OWDRs26KabbtLcuXPrbZxslYsvvlivvPKKx++pMTfccIMeffRRGYah119/3R22nPq9xGaztTpskaRevXrp+eef15/+9Cd9++23Wr58udatW6cNGza4NyA+JSsrS7Nnz9ann36qOXPmNHvvgwcPenyUOgCgbRG2AAD81k033eQOW/7973+rtLRUkZGR7sc3bdqkbdu2mcY3ZNOmTTr33HMb/FfmpngaUrRWbm6u+/tevXp59JxevXo1G7ZkZGRo6tSpOnz4cIv6aev3W1tRUZFqamrc17179/boebU/aDYXDsXExDR7v6CgIPf3tftpK7V/zlvznqurq1VSUqLo6Gh37U9/+pM2bNigvXv3qrq6WgsWLNCCBQsUEBCgtLQ0TZkyRbNnz9b555+vkJCQBl9j7ty5uvfee/XXv/5VkrRu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AgAAAAAAPoaZLR765S9/qYyMDMXHxyspKUkZGRlWtwQAAAAAAHwQM1s89PLLL+vQoUPKzc3VD37wA6vbAQAAAAAAPoqZLR6aNWuW1S0AAAAAAAA/0OYzW44fP67//Oc/evjhh3X++ecrPj5eNptNNptNN998c4vulZGRoQceeECDBw9WRESE4uLiNH78eD311FMqLy9vmzcAAAAAAADQAm0+syUxMdEr9/nkk090/fXXq7i42F0rLy/X+vXrtX79er388sv69NNPlZqa6pXXAwAAAAAAaI123bOlV69emjNnTouft2nTJl111VUqLi5WZGSkfve732nVqlX6+uuv9f3vf1+StGfPHl1wwQUqKSnxdtsAAAAAAAAea/OZLQ8//LDGjx+v8ePHKzExUYcOHVLfvn1bdI/77rtPFRUVCgwM1KJFizRx4kT3YzNnztSAAQP0k5/8RHv27NEzzzyjRx99tN49HnjgAVVVVbXoNQcMGNCiPgEAAAAAANo8bHnsscfO6Plr167V8uXLJUm33XabKWg55YEHHtD8+fO1c+dO/fnPf9YvfvELBQUFmcb8/e9/V1lZmceve/nllxO2AAAAAACAFvP5o58//PBD9/e33HJLg2MCAgJ04403SpIKCwu1ePHiemNKS0tlGIbHX9OnT2+LtwMAAAAAADo4nw9bVqxYIUmKiIjQ2LFjGx03bdo09/crV65s874AAAAAAAAa4vNhy86dOyVJqampCgxsfNXT4MGD6z0HAAAAAACgvbX5ni1norKyUnl5eZKk5OTkJsd26dJFERERKisrU2Zmptd7efnll92zbLZt2+auLVmyRJI0efJkfe973/P4fllZWU0+fvTo0dY1CgAAAAAALOXTYUvtY5wjIyObHX8qbCktLfV6LytWrNBrr71mqq1cudK0ZKklYUtKSorXegMAAAAAAL7Dp8OWyspK9/fBwcHNjg8JCZEkVVRUeL2XV199Va+++qrX7wsAAAAAADoWnw5bQkND3d9XV1c3O76qqkqSFBYW1mY9eUtzS52OHj2qCRMmtFM3AAAAAADAW3w6bImKinJ/78nSoLKyMkmeLTmyWnN70AAAAAAAAP/k06cRhYaGqmvXrpKa31D2xIkT7rCF/VAAAAAAAIBVfDpskaShQ4dKkvbt2yeHw9HouF27drm/HzJkSJv3BQAAAAAA0BCf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",
"text/plain": [
""
]
@@ -329,12 +239,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 12\n"
+ "Time step 12\n",
+ "RMSE 0.01406747350062789, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "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BWel1dSpUx0bXR84cEB9+vTR4cOHTX3sdrveeecd075ADz30ULZHum/ZskV169bVc889pz179uR4vczMTM2ZM0fvvfeeo61v376mPh06dNCwYcO0ePHiXMOnAwcOmGbx3Xzzzfn+eSxu4eHhGjx4sOP4lVdeKXBYlpOwsDC1bdtWbdu2VVhYWJHHuXDhgh577DHVrVtXEydO1NatW3OdKXfu3Dk9+uijpj/DrVq1IiwCgDLIzeoCAACo6EaNGpXj/jr5Pea6d+/e6tq1q/744w8ZhqHJkyfrgw8+UOvWrRUYGKiDBw9q3bp1yszMVK1atTRhwgRTgONsTz75pH777TetXbtWhmHoiSee0DvvvKNu3brJz89PkZGRWr16tTIzM3XjjTeqQYMGmjlzZq7jhYeHa8SIEY49nd544w3NnDlT7dq1U9WqVXX06FH98ccfSktLk7+/v1577TX961//yrfOO+64Qy+++KKky5sNf/nllwoLCzNtUv36668X+v5ff/11bd68WZs2bVJGRobGjx+vl19+WZ07d5afn58OHTqkP/74wxGgubm56fPPP88WmpQlDRo00LRp0zR8+HBlZmZq/fr1aty4sbp06aIGDRooMTFRq1ev1okTJxzn3HTTTXr11VdzHO/kyZN6/vnn9fzzz6t69eq64YYbVL16dbm5uen06dPasmWLaS+rLl26mJZzSZdDwFmzZmnWrFny9vZWy5YtVb9+fQUEBOjChQs6fPiwNm/e7Ojv7e1dpJ93cXjmmWc0d+5c2e12RUVF6csvvyzxWYG5OXv2rN566y299dZbCgwMVJs2bVSjRg35+/srMTFRBw8e1JYtW5SRkeE4p1q1avr2229NS0hz8+yzzxZqA+4ePXrojjvuKNK9AAAKwAAAAJa6ePGi4ePjY0hyfDVp0qRA5546dcpo3bq16dyrv5o2bWrs3r3bmD59uqNt1KhROY63YsUKR59u3brlet2s4+clPj7euPXWW/Osr2PHjkZMTIwxatQoR9v06dNzHC8pKcno3bt3nuOFhoYaa9asKfC9xMXFGeHh4XmOmdWRI0cc7dddd12e95+QkGAMHjw4z7ElGTVq1DB++eWXPMd69tlnHf2fffbZPPsaRsF/lgVVkJ/PFQsXLjSqVauW730PHTrUSEpKynGMDRs2GG5ubvmOceXrzjvvNC5evJhtnObNmxd4jHr16hlr16695u9V1v/W8vszcrW77rrLVE96errp/ax//iQZKSkpRa4zJSXFNNaRI0ey9dm3b5/RrVs3w9XVtcDfR0lG3759jcOHD+d67avvo7BfEyZMKPJ9AwDyx8wiAAAs5u/vr0GDBunbb791tOU3q+iKatWqad26dZo2bZpmz56tXbt2KTk5WVWrVlXjxo01ZMgQDR8+XD4+Ptq4caOzbiFXAQEBWrx4sebPn68vv/xSmzZt0vnz51WlShU1adJEw4cP1z333GOaxZMXHx8fLV68WDNnztRXX32lbdu26eLFi6pSpYrq16+vO+64Q6NHj1alSpW0cuXKAo0ZGBioTZs26cMPP9SiRYu0d+9excXFFcv+RX5+fpozZ44eeeQRzZgxQytXrlRMTIxSUlJUpUoVNW/eXP3799fYsWNLdJmgs/Xv31+RkZH64osv9PPPP2v37t06d+6cvL29VbNmTfXo0UMjR47UjTfemOsYN954o86cOaPff/9da9as0bZt23To0CHFxsYqMzNTAQEBatCggW666Sbdc889at++fY7jbN++XRs2bNCKFSu0ceNG7d+/XzExMUpOTpaPj49jxtJtt92mwYMHW/7krmeeeUbff/+9DMPQkSNHNGPGDI0ZM8ayeho3bqyVK1fq3LlzWrlypdasWaOdO3cqMjJSsbGxSk1NlY+PjypVqqTw8HC1b99egwcPLtATCwEApZfNMPJ5PAcAAAAAAAAqDDa4BgAAAAAAgANhEQAAAAAAABwIiwAAAAAAAOBAWAQAAAAAAAAHwiIAAAAAAAA4EBYBAAAAAADAgbAIAAAAAAAADoRFAAAAAAAAcCAsAgAAAAAAgANhEQAAAAAAABwIiwAAAAAAAOBAWAQAAAAAAAAHwiIAAAAAAAA4uFldAMqf1NRU7dy5U5IUEhIiNzf+mAEAAAAAUNwyMjJ09uxZSVKLFi3k5eVVLOPyKR7FbufOnWrfvr3VZQAAAAAAUGFs3LhR7dq1K5axWIYGAAAAAAAAB2YWodiFhIQ4Xm/cuFE1atSwsBoAAAAAAMqnkydPOlb2ZP0sfq0Ii1Dssu5RVKNGDYWGhlpYDQAAAAAA5V9x7hfMMrQKKDU1VRMnTlTXrl1Vs2ZNeXl5qXr16urUqZOmT5+u9PR0q0sEAAAAAAAWISyqgBITE/XRRx/JZrMpIiJCEydO1KBBg3TixAmNHTtW/fv3l91ut7pMAAAAAABgAZahVUDBwcGKj4+Xh4eHqT0jI0O9evXS0qVLtXjxYkVERFhUIQAAAAAAsAoziyogFxeXbEGRdHl946BBgyRJkZGRJV0WAAAAAAAoBUo0LDp+/LieffZZtW3bViEhIfLy8lLt2rXVpUsXTZ06Vbt27SrJcgrtzJkz+vnnnzV16lT17dtXVapUkc1mk81m0+jRows93rFjxzRp0iSFh4fL19dXwcHBateunV577TUlJycX/w3kw263a8mSJZKk5s2bl/j1AQAAAACA9UpsGdp7772nJ598UklJSab26OhoRUdHa82aNbp48aLefvvtkiqp0KpVq1ZsYy1cuFD33HOPLl686GhLTk7W5s2btXnzZk2bNk2LFi1SWFhYsV3zamlpaXrxxRdlGIZiY2O1bNky7du3T2PGjNHNN9/stOsCAAAAAIDSq0TCov/7v//TM888I0lq1KiR7r//frVr106BgYGKjY3Vtm3b9MMPP8jFpeysiqtTp47Cw8O1dOnSQp+7bds2DRkyRCkpKfLz89OTTz6pHj16KCUlRbNnz9Znn32mAwcOKCIiQps3b5a/v78T7uByWPT88887jm02myZPnqyXXnrJKdcDAAAAAACln9PDomXLljmCopEjR2ratGlyd3c39bn55ps1efJkpaWlObucazJ16lS1a9dO7dq1U7Vq1XT06FHVq1ev0ONMmDBBKSkpcnNz09KlS9WhQwfHez179lTDhg01ZcoUHThwQG+88Yaee+65bGNMmjRJly5dKtQ1GzZsaGrz8/OTYRiy2+2KiYnRwoUL9dRTT2n9+vX65ZdfFBAQUOh7AwAAAAAAZZvNMAzDWYPb7XaFh4fr4MGDuv7667V582a5uRVvPrV792498MADmjdvnkJCQvLtn5mZqREjRigiIkLDhw+/pmtnDYtGjRqlL7/8Mt9zNm7cqBtvvFGSNG7cOH388cfZ+tjtdjVv3lx79+5VUFCQzpw5ky1g8/Pzy7akLy8rVqxQ9+7d8+333XffafDgwZoyZYpeeeWVAo+fVXR0tGrXri1JioqKUmhoaJHGAQAAAAAAuXPW52+nrvtaunSpDh48KEl6/PHHiz0oSklJUZ8+fbR69WrdcsstOn/+fJ797Xa7xowZo1mzZmn06NHavHlzsdZT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ICwCAABO0/KqTa5T0jMVeTbRmmIAAABQIIRFAADAaar4eSq0krepjU2uAQAASjfCIgAA4FRX71vEJtcAAAClG2ERAABwqqvDoi3HLlhTCAAAAAqEsAgAADhVqzpBpuMDpxMVdT7ZmmIAAACQL8IiAADgVNeHBinY18PU9tue0xZVAwAAgPwQFgEAAKdyc3XRzeFVTW1L95yyqBoAAADkh7AIAAA4Xe9m1U3HG4+c14WkNIuqAQAAQF4IiwAAgNN1aVhF3u6ujmO7IS3bd8bCigAAAJAbwiIAAOB0Xu6u6tqoiqlt6W6WogEAAJRGhEUAAKBE9G5qXor2x8GzSknLtKgaAAAA5IawCAAAlIie4VXl6mJzHKem27Um8pyFFQEAACAnhEUAAKBEVPL1ULu6lUxtLEUDAAAofQiLAABAibl6KdqayHMyDMOiagAAAJATwiIAAFBirt7k+mR8qo6cS7KoGgAAAOSEsAgAAJSYBiF+qurvaWpbeyjWomoAAACQE8IiAABQYmw2mzqFmWcXrWOTawAAgFKFsAgAAJSojg0qm47XH46V3c6+RQAAAKUFYREAAChRV88siktO156TFy2qBgAAAFcjLAIAACWqZpC36lXxNbWtZSkaAABAqUFYBAAAStzVS9HY5BoAAKD0ICwCAAAlrvNVS9E2HonVpYxMi6oBAABAVoRFAACgxHVoUFk229/Hqel2bTseZ1k9AAAA+BthEQAAKHFBPh5qVjPA1LaepWgAAAClAmERAACwRIf65n2Lthy7YFElAAAAyIqwCAAAWKLNdcGm423HLygj025RNQAAALiCsAgAAFiizXWVTMdJaZnadyrBomoAAABwBWERAACwRIi/p+pV8TW1bT563qJqAAAAcAVhEQAAsMzVs4s2sW8RAACA5QiLAACAZdrVNYdFm4+el2EYFlUDAAAAibAIAABY6OpNrk9fvKToCykWVQMAAACJsAgAAFioQYivKvm4m9q2sBQNAADAUoRFAADAMjabLdvsok1scg0AAGApwiIAAGCpq/ctYmYRAACAtQiLAACApdpeFRbtP52gC0lpFlUDAAAAwiIAAGCp5rUC5en29z9JDENavOuUhRUBAABUbIRFAADAUp5ururRuKqp7Ydt0RZVAwAAAMIiAABguUGta5mONx29oKjzyRZVAwAAULERFgEAAMv1aFxV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fKJXp07H5yH49NNPdeutt8putxt6LF8lJSU5a8rKymp23eLiYmdYRC8dAAACZ0TvNJfXe46Wq7rOZk4xAAAAISBoYVFBQYEuueQSHThwQJL0j3/8Q7feequhx5g6daruu+8+SdKZZ56pjIwM3XHHHZKk2bNn66677pLD4TD0mL4aOnSoJGnfvn2yWq0e19u9e7fz5yFDhgS8LgAAotWwXqmKsZx8bbM7tCOH3kUAACB6BSUsKi0t1aWXXqqdO3dKkl588UVnqGOU2bNn6+6775bD4dDw4cP1zTffqEOHDnrnnXd00003SZKmTZume++919Dj+mrcuHGSjg8x27Bhg8f1li5d6vx57NixAa8LAIBo1TYhToO6tXNZtvlIiTnFAAAAhICAh0VVVVWaPHmyNm7cKEn6wx/+oEcffdTQY3zyySfOYWZDhgzRwoULncO9YmJiNGPGDF177bWSpLfeeksPPPCAocf3xdVXX+38edq0aW7XsdvtmjlzpiQpLS1NEyZMCEZpAABErRGnpLm83pJFzyIAABC9AhoW1dXV6ac//alWrFghSXrggQf07LPPGnqMOXPm6IYbbpDNZtPAgQO1aNGiJk9Wi42N1ezZs53zI/3973/XI488Ymgd3ho9erTGjx8vSXrvvfe0atWqJuv85S9/0a5duyQd/8zi4+ODWiMAANGm8bxFW7NKTKkDAAAgFMQFcuc33HCDvvnmG0nSRRddpDvvvFPbt2/3uH5CQoIGDRrk9f6rq6t19913q76+Xv369dOiRYvUo0cPt+vGxcXpo48+0tVXX6358+frlVde0TXXXKPRo0d7fbzly5dr3759ztcFBQXOn/ft26fp06e7rD9lyhS3+3nttdc0duxYVVdXa9KkSXr88cc1YcIEVVdX64MPPtDbb78tSRo0aJAefvhhr+sDAAD+GdG7vcvrzMIqFVfWqUNygkkVAQAAmMfiCOCMzxaLpeWVGujbt68OHTrk0zYrV67UnXfeqfnz5ys9Pb3F9WtqanTllVdq8uTJevDBB3061pQpUzRjxgyv12/uo50zZ45uvvlmlZWVuX1/0KBBmjt3rgYMGOBTjaEgKyvL+QS3I0eO6JRTTjG5IgAAmldvs2v401+rpv7kk1On3362LjytazNbAQAAmCtQ998B7VkUDOedd562b9+u2NhYr9ZPSkrSggULvF4/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xeJ8Mva5554ri8XicqxQxr/eiGrLly+XJCUnJ+uss87yuF7DxwGvWLHC7XvffPNNk+2+/vrrJtsDcGVEOwTgP6Pa4ImgaObMmbruuuv0/vvvh/98DUCQBPrfwpycHEknn04IwFVr22BiYqLuvPNOt/870XHgJz/5ie68806lp6cH5iQMxtPQENV27dolSRowYECzj/QdPHhwk21OmDhxovr376/Zs2frf//3fzVy5EhJxye+fv7555WQkOBMoAE0ZUQ7BOA/I9qg3W7XHXfcoZkzZ+raa6/VrFmzCIoAHxjRDnfu3Kn09HS1bdvWZXlVVZUeeughSdLll19uVMlARGltG2zTpo3effddt9tMmTJFGRkZeuyxxzRmzBiDKg48wiJErZqaGhUUFEiSTjnllGbX7dChg5KTk1VZWakjR464vBcXF6d3331Xl156qc4//3xdf/31ateunT755BNlZmbqz3/+c9ikx0CwGdUOJendd991/lehbdu2OZed6HI/btw43XXXXQZWD4Q/o9rgM888oxkzZiglJUWDBg3Ss88+22T7q6++2vkfVACcZFQ7/Oijj/TXv/5V48aNU3p6ulJTU5Wdna358+ersLBQ48eP129+85uAnQcQroz8ezSSEBYhajV83GFKSkqL65/4pVBRUdHkvQkTJmj58uV66qmn9OGHH6q+vl7Dhw/XSy+9pOuuu87QuoFIYmQ7XL58uXNM+AkrVqxw6SJMWAS4MqoNHjp0SNLxORuee+45t9ump6cTFgFuGNUOr7jiCuXk5GjlypVatWqVKioq1L59e51++um6/vrrdccddzTbYwKIVkb+PRpJ+G2BqFVTU+P8OSEhocX1ExMTJUnV1dVu3x89erTmz59vTHFAlDCyHU6fPl3Tp083rDYgGhjVBml/gP+MaoejRo3SqFGjjC0OiAJG3xc2Fq7/RjLBNaJWUlKS8+e6uroW16+trZV0fDwqAGPQDgFz0QYB89EOAXPRBt0jLELUateunfNnb7oQVlZWSvKuayIA79AOAXPRBgHz0Q4Bc9EG3SMsQtRKSkpSp06dJElZWVnNrltcXOz8pdC7d++A1wZEC9ohYC7aIGA+2iFgLtqge4RFiGpDhw6VJO3bt09Wq9Xjert373b+PGTIkIDXBUQT2iFgLtogYD7aIWAu2mBThEWIauPGjZN0vCvhhg0bPK63dOlS589jx44NeF1ANKEdAuaiDQLmox0C5qINNkVYhKh29dVXO3+eNm2a23XsdrtmzpwpSUpLS9OECROCURoQNWiHgLlog4D5aIeAuWiDTREWIaqNHj1a48ePlyS99957WrVqVZN1/vKXv2jXrl2SpAceeEDx8fFBrRGIdLRDwFy0QcB8tEPAXLTBpiwOh8NhdhGAv5YvX659+/Y5XxcUFOh3v/udpOPdAu+66y6X9adMmdJkH5s2bdLYsWNVXV2tlJQUPf7445owYYKqq6v1wQcf6O2335YkDRo0SOvXr3eZLR8A7RAwG20QMB/tEDAXbdB4hEUIa1OmTNGMGTO8Xt/T5T5nzhzdfPPNKisrc/v+oEGDNHfuXA0YMMCvOoFIRjsEzEUbBMxHOwTMRRs0HsPQAElXXnmltm7dqt/85jcaNGiQ2rZtq7S0NI0aNUovvfSSNm3aFBW/EAAz0Q4Bc9EGAfPRDgFz0QZPomcRAAAAAAAAnOhZBAAAAAAAACfCIgAAAAAAADgRFgEAAAAAAMCJsAgAAAAAAABOhEUAAAAAAABwIiwCAAAAAACAE2ERAAAAAAAAnAiLAAAAAAAA4ERYBAAAAAAAACfCIgAAAAAAADgRFgEAAAAAAMCJsAgAAAAAAABOhEUAAAAAAABwIiwCAAAAAACAE2ERAAAAAAAAnAiLAAAAAAAA4ERYBAAAAAAAACfCIgAAAATEoUOHZLFYZLFYNH36dLPLAQAAXiIsAgAAMNiSJUucIYm3/3vwwQfNLhsAAEASYREAAAAAAAAaiDO7AAAAgEh277336te//nWL63Xu3DkI1QAAALSMsAgAACCAunbtqmHDhpldBgAAgNcYhgYAAAAAAAAnwiIAAIAQlJ6eLovFoilTpkiS1q1bpxtuuEG9e/dWUlKSevfurdtvv127d+/2an9z5szRNddco1NOOUWJiYnq1KmTzj33XL344ouqqKjwah/bt2/X//zP/2j48OHq0KGD4uPj1b17d1188cV6+eWXlZub2+I+vv32W1155ZXq3r27EhMT1a9fP917773KyspqdrucnBz9/ve/15lnnqn27dsrPj5e3bp10/Dhw3XDDTdo+vTpKisr8+o8AABA8ywOh8NhdhEAAACRZMmSJZowYYIk6amnntLTTz/t8z7S09OVmZmp2267Teeff77uueceWa3WJuslJibq/fff17XXXut2PzU1Nbrxxhv12WefeTxWz549NXfuXI0cOdLt+zabTb/73e/06quvqrk/HW+77TZNnz7d+frQoUPq16+fJGnatGnas2ePXnzxRbfbdunSRUuXLtWQIUOavLds2TJdccUVLYZBc+bM0RVXXNHsOgAAoGXMWQQAABDCNm/erNmzZ6tr16567LHHNHr0aNXU1GjevHl69dVXVVtbq5tuukn9+vXTqFGjmmx/2223OYOiESNG6OGHH9aQIUNUVFSkDz74QNOnT1dOTo4mTpyorVu3qlevXk328ctf/lJTp06VJPXo0UP333+/zjvvPLVv3175+flau3atPv7442bP45133tHKlSt1wQUX6J577tGgQYNUUlKimTNnaubMmcrPz9cdd9yhVatWuWxXW1ur66+/XmVlZWrXrp3uvfdeTZgwQV27dlVdXZ0OHjyolStXNhuGAQAA39CzCAAAwGANexZ5+zS00047TfHx8c7XJ3oWSVLfvn21evVqde/e3WWbxYsXa9KkSbJarTr77LO1du1al/fnzp3r7GkzceJEzZs3TwkJCS7rvPPOO/rlL38pSfrFL36hDz/80OX9L7/8UldddZUk6dxzz9W8efOUlpbm9hyOHDmi3r17O1837FkkSXfffbfeeustWSwWl+3uvvtuvfvuu5KkjRs36owzznC+991332nixImSmu85ZLVaVVVVpdTUVLfvAwAA7xEWAQAAGKxhWOStgwcPKj093fm6YVj08ccf6+c//7nb7X7961/rzTfflHR8XqOGvYsuv/xyzZ8/X/Hx8dq/f79LkNPQJZdcooULFyouLk6HDx9Wjx49nO+dd955WrVqldq2bauMjAz17NnT63NqGBb16NFDBw8eVGJiYpP19uzZo8GDB0uSXnvtNf3v//6v873Zs2frpptukiSVlpYSBgEAEARMcA0AABDCOnTo4OzZ484dd9zh/HnhwoXOn61Wq5YuXSpJmjRpksegSDres+fENkuWLHEuLyws1OrVqyVJ1113nU9BUWPXXHON26BIOt6rKiUlRZJ04MABl/caBlfTpk3z+/gAAMB7hEUAAAAB9NRTT8nhcLT4v4a9iho644wzFBfneZrJkSNHOoeWbdu2zbn8wIEDqqqqkiSdc845zdbY8P3t27c7f968ebNzQuvx48c3f6ItONFzyJMOHTpIksrLy12Wjxs3Tv3795ckPfjggxo9erReeOEFrVixQnV1da2qCQAAuEdYBAAAEMK6du3a7PtxcXHq2LGjJKmoqMi5vOHPLe2j4VxIDbcrKChw/tywh48/2rZt2+z7MTHH/yy12Wwuy+Pj4zVnzhznU9LWrVunxx9/XOPGjVNaWpouu+wyzZ49u8l2AADAf4RFAAAAIazxZNBm7cNMQ4cO1bZt2/TZZ5/pjjvu0IABAyRJ1dXV+vrrr3XTTTfpnHPO0bFjx0yuFACAyEBYBAAAEMKOHj3a7PtWq9XZG+hED6PGP7e0j7y8PLfbde7c2flzbm6udwUHSGxsrK6++mq99957ysjIUE5OjqZOnaqzzjpLkrRhwwbdc889ptYIAECkICwCAAAIYZs3b5bVavX4/pYtW5xz9wwbNsy5vH///s6hX2vWrGn2GGvXrnX+3HAfZ5xxhrNX0vfff+978QHUo0cP3X777Vq1apXOPPNMSdJXX32l6upqkysDACD8ERYBAACEsKKiIs2ZM8fj+1OnTnX+fPHFFzt/jouL0wUXXCBJ+vbbb5WVleVxH++++65zmwsvvNC5vGPHjjrvvPMkSR999JFycnL8OodAio+Pd56n1WpVSUmJuQUBABABCIsAAABC3EMPPeR2KNnSpUv19ttvS5LOOussnX322S7v33fffZKkuro63Xnnnaqvr2+yj6lTp+qbb76RJP3sZz9rMpH1o48+KkmqqqrStddeq9LSUo91NhdI+WvZsmXat2+fx/fr6uq0dOlSSVJKSoq6dOlieA0AAEQbz89hBQAAQKsdO3bM5XH0nrRp00annnpqk+UjRozQzp07ddZZZ+mxxx7T6NGjVVtbq3nz5ulvf/ubrFar4uLi9PrrrzfZdvLkybr22mv13//+V998843GjBmjhx56SIMHD1ZxcbE++OADZ8+kjh076q9//WuTfVx55ZW688479d5772nlypUaOnSo7r//fo0dO1apqakqKCjQ+vXr9eGHH2rEiBGaPn267x9SMxYtWqQ//elPGj9+vCZPnqzTTz9dXbp0UXV1tfbu3at//etf2rhxoyTpzjvvVFwcf94CANBa/GsKAAAQQG+++abefPPNFtcbMWKENm/e3GT5yJEjdf/99+vee+/V/fff3+T9hIQEzZgxQ+ecc47b/c6cOVNWq1WfffaZNm7cqJtvvrnJOj179tTcuXPVq1cvt/t466231KZNG73++uvKycnR448/7vEcAsFut2vp0qXOHkTuXHXVVXrhhRcCcnwAAKINYREAAECIu+uuuzRs2DD97W9/0/Lly1VQUKAuXbpo4sSJevTRRzV06FCP2yYlJenTTz/VnDlzNH36dK1evVoFBQVKTk7WoEGDdPXVV+v+++9XSkqKx33ExsbqH//4h26//Xa99dZbWrJkibKzs1VXV6dOnTrp9NNP12WXXaZbbrnF8HP/7W9/q9NPP10LFy7Upk2blJOTo2PHjkmSunfvrtGjR+vWW2/V5MmTDT82AADRyuJwOBxmFwEAAABX6enpyszM1G233Wb40C4AAIDmMME1AAAAAAAAnAiLAAAAAAAA4ERYBAAAAAAAACfCIgAAAAAAADgRFgEAAAAAAMCJp6EBAAAAAADAiZ5FAAAAAAAAcCIsAgAAAAAAgBNhEQAAAAAAAJwIiwAAAAAAAOBEWAQAAAAAAAAnwiIAAAAAAAA4ERYBAAAAAADAibAIAAAAAAAAToRFAAAAAAAAcCIsAgAAAAAAgBNhEQAAAAAAAJwIiwAAAAAAAOBEWAQAAAAAAAAnwiIAAAAAAAA4ERYBAAAAAADAibAIAAAAAAAAToRFAAAAAAAAcCIsAgAAAAAAgBNhEQAAAAAAAJz+H0NvhBjyaZo6AAAAAElFTkSuQmCC",
+ "image/png": "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wC+KioqMJk2aGJIMScZLL73k0fvuuusu53uuvvpq02uffvqpERYW5ny9qh+XXHKJsW/fviqftWzZMuf911xzTaX3lZ+3Kjk5OcYvfvGLKuvq06ePcezYMePOO+90jk2bNq3C+datW2dER0d79HmTk5ONTZs2VTjPtGnTPJqjos+4f/9+53jbtm2r/Py5ubnG6NGjq52/RYsWxn/+858q53rqqaec9z/11FNGamqq0atXryrnveuuu4yysrIq5/WUJ78+5yxYsMBo3rx5tZ977NixRl5eXpVz/eMf/zAiIiI8+nXq3bt3hXPs3LnT6NKli8e/3rt3767tT5NhGObfX9X9HjEMw9i1a5fp+R9++GGl95b//SfJKCgoMObNm+e8njp1aqXvffrpp533ffzxx0ZBQYFprv3797u95+OPP3a+brPZjNzcXE9+Cqrl+jkqejYAwBo0swYAwE9CQ0M1ZswY/f3vf5d0ZgvII488UuV7CgoK9MknnzivXZtYp6enq6ioSJKUlJSkCy+8UM2bN1dkZKRyc3O1fft2bdq0SYZh6IcfflC/fv30/fff+2U7SElJiYYNG6aVK1c6x5o3b65+/fopJiZGe/bs0erVq7V69WrdfPPNuuCCC6qd8/Tp08rNzZV0ZiVF165dlZSUpKioKOXn52vPnj1av369SktLdeDAAV1zzTXatGmTUlJSTPN06dJFDz74oHJycpxbcSo6naou8vPzde2115pWqLRs2VJ9+/ZVdHS08/OXlZXp2LFjuvHGG/XRRx/p1ltvrXbu3NxcXX/99dq6dasiIyPVt29ftW7dWjk5OVq2bJnS09Mlnel306lTJ/32t7/12ueqzty5c3XHHXeorKxM0pmtVX369FFKSopyc3O1atUq54qZ2bNna//+/Vq6dKnCw8Pd5vrss890//33O69jY2N19dVXKykpScHBwcrKytKuXbu0devWSleQ5eTkaNCgQc6j5+12uy699FJ16dJF0dHRys/P15EjR/TDDz8oIyPD2z8dHnFdQZSYmFij9994442Ki4tTZmamPvjgA+fqM1fnfq83btxYw4cP96gpe/v27Z1fG4ahv/71r3rmmWdqVB8AoJ6xOKgCAKBBWb9+velf0X/88ccq7//www+d94aFhRmnT582vf7FF18Yf/nLX6pcAbFv3z5jyJAhznnuueeeSu/15oqiZ5991rQS4bnnnjNKS0tN9+zcudO45JJLDElGaGioRyuKHn/8cWPLli2VPjctLc0YP368c66BAwdWem9NVgfV9D0PPPCA876goCDj1VdfdVvds2vXLuPyyy933hcbG1vpyoryK4rOrSK78847jZMnT5ruy8vLM8aMGeO8Nzo62iurQDxZUbRnzx7Tiq+ePXu6/d4sKyszXnrpJcNutzvv+/Wvf13hfN27d3feM2nSpEpXH+Xk5Bjz5s0zfvvb37q99uqrrzrnuPDCC40dO3ZUOIfD4TDWr19vPPDAA8ahQ4eq+JmoXk1XFP3+97933h8SEmKcOnWq0nsrWlFkGIZx3333OcdWrlzp9r5Vq1Y5X7///vsNwzA8WlHkcDiM5ORk03/L48aNM7755hvD4XB49hPiwedgRREABA6CIgAA/Kz8FphHH320ynvLBzy33XZbrZ9ZXFxsXHzxxYYkIzw8vNJvRL0VFGVmZhqRkZHOe55++ulK50pPTzdatGhhmrO6rU2eGDp0qHO+n376qcJ7fBUU7dmzxxSEvPnmm5XOd+rUKdM34nfddVeF95UPiiQZY8aMqXTOgoICo3Xr1s5758yZ49Fnq4onQdGECROc96SkpBiZmZmVzvfyyy8777Xb7W7bInNycpyvt27dutahxMiRI53z/O9//6vVHDVVk6Dop59+MmJiYpz3jx07tsr7KwuK1qxZ4xz75S9/6fa+e++91/n62rVrDcPwLCgyDMP45JNPTPed+9G0aVPjF7/4hTF16lRjwYIFVQZc1X2OCRMmGA8++KBHP1599VWPnwMAqDmCIgAA/Oz55593fnPUsmVLt1U25xw9etQICgpy3rtw4cI6PfeFF15wzvXFF19UeI+3gqK33nrL+XpSUpJRVFRUZW3//Oc/vR4UzZ071znf66+/XuE9vgqKfvvb3zrv6d69e7UhR/law8LCKgxYygdFoaGhxrFjx6qc87HHHnPe/8gjj3j02apSXVB0+vRpU7+s+fPnVzlfWVmZ0bVrV+f9v/vd70yvHzlyxPRzWFvXXXedc57vv/++1vPURHVBUWFhobFz507jr3/9qxEXF+e8t3Pnzsbx48ernLuyoMgwDCMlJcWQZDRq1Mg0XlBQ4HxOhw4dTOOerup59913jfDw8AoDo/KrjXr27Gm88cYbpud78jlq8qOqP5sAAHVHjyIAAPxs3Lhxevzxx+VwOHT06FEtXrxYQ4YMcbvvww8/dPZ5ad68eYX3lJeZmal169Zp27ZtOnnypHJzc00nne3YscP59ffff6/hw4d76RO5W7ZsmfPr0aNHKzQ0tMr7b7/9dk2aNKnKk8pc5efna926ddqyZYtOnDihnJwc58+XZD6t6fvvv/e8eC9YunSp8+uJEydWezrczTffrCZNmujUqVMqKirSN9984zzJqiJ9+vRR8+bNq5zz0ksvdX594MABzwqvg7Vr1zr7ZcXHx1f7+8tut+vuu+/WlClTJJl/z5ybIzw8XIWFhdq6davWrFmj3r1717iu1q1bO79+55139Pbbb9d4jro4d5peVex2u0aMGKG///3vNe5PVN748eP11FNPKSsrS59//rlGjx4tSfr888+dR9yPHz++VnPfc889uu666/TCCy/oo48+0unTp93uMQxD69ev1/r16/XCCy9o1qxZ6t+/f20/DgDAIgRFAAD4WatWrTRo0CAtWrRIkjRr1qwKQ6BzjWcl6Y477lBQUFCF86Wmpup3v/udPvnkE+c36tXxddPezZs3O7+++uqrq70/JiZG3bp106ZNm6q999SpU5o6dapmzpypnJwcj+rxZ5NiwzBMwVSvXr2qfU9ISIh69uypr7/+WpK0adOmKoOiiy66qNo5yzcsz87Orvb+uir/a96zZ08FB1f/fzPLBz+bN2+WYRjOUCU0NFQjRozQnDlzVFpaqmuvvVajR4/Wrbfeqn79+ikuLs6jum677Ta9//77ks4ERRs3btSdd96pIUOGuDU5t8qNN96o9957z+PPVJnx48fr6aeflmEYmjlzpjMoOvdnic1mq3VQJElt2rTR3//+d73yyiv69ttvtWrVKn333XfauHGjs1n4Oampqbruuuu0cOFCDR48uNq59+/fr+Tk5FrXBgDwHoIiAAAscOeddzqDon//+9/Kzc1VdHS08/XNmzdry5YtpvsrsnnzZg0cOLDCf92viqcBS22dOHHC+XWbNm08ek+bNm2qDYoOHjyofv366dChQzWqx9eft7ysrCyVlJQ4r9u2bevR+8p/k1xdsNWoUaNq5wsJCXF+Xb4eXyn/a16bz1xcXKycnBzFxsY6x1555RVt3LhRu3fvVnFxsWbNmqVZs2bJbrera9eu6tu3r6677joNHTpUYWFhFT5jyJAh+vWvf6033nhDkvTdd9/pu+++k3TmdLE+ffqof//+GjFihJKSkmr6savleppeaWmpjh49qs2bNys1NVXSmdPd9u3bpyVLlig+Pr7Wz2rXrp369OmjVatWadGiRUpLS5Mk5581ffv29UoYExoaqr59+6pv377OsQMHDuiTTz7Rq6++6lzNV1paqgkTJmjfvn2KjIys83MBAP5ht7oAAAAaoptvvtn5DXF+fr4++eQT0+vlVxNdeumlFa4gKSoq0siRI50hUbNmzfTEE09o2bJlOnz4sPLy8uRwOGSc6UmoadOmOd9bfkuaL5w7wl6Sx98gRkVFVXvP2LFjnSFRTEyMHn74YX399dfat2+fcnNzVVZW5vy85bcy+frzllf+s0uefS7X+6oLtqrbymSF8p+7Np9Zcv/czZs314YNG/TEE0+YtmQ5HA5t2bJFb731lm6++Wa1aNFCzz//vGnrYXmvv/665s+fr549e5rG09LS9Omnn+rXv/612rRpo1tvvbXGIWR1mjRpojfffNP545133tEXX3yh/fv367333lN4eLgk6ccffzQFSrV1LlQuLS3V7NmzNXv2bJWWlppe84Xk5GQ9+uij+umnn0zbzdLS0jR37lyfPRcA4H0ERQAAWCAiIkKjRo1yXs+aNcv5dWlpqT766CPndWXf3H366afav3+/pDPb2X744Qf98Y9/VP/+/ZWUlKTIyEhToODPVTXlV0fl5+d79J68vLwqX1+7dq3Wrl3rnH/dunV6+eWXNWTIELVr105RUVGy23/+vzb+/Lzllf/sUvWfq6L7YmJivFqTP5T/3LX5zFLFnzs2NlZ//OMfdeTIEa1bt04vvviiRowYYVp5c/r0af3+97/XyJEjZRhGhc+6+eab9e233+rgwYOaMWOG7r//fl144YXO1w3D0KeffqrLLrtMu3bt8qj+uggODtbdd9+td9991zn21VdfacaMGXWad9SoUYqIiJB0JnA+N5/rnzm+Ehsbq1mzZpm2yq5atcrnzwUAeA9BEQAAFikfAC1fvtzZ4+O///2vc8tISEiIxo4dW+H7lyxZ4vz6oYceUosWLap83sGDB+tasseaNWvm/NrTFRquPU5clf+8d955p+mb/Ir48/OW16hRI9O2L08/f/mG03XZfmSV2vyal//MoaGhVQZkQUFBuvLKK/Xoo4/q3//+t9LS0rRq1SrdeOONzns+//xzffrpp1U+s02bNpowYYLeeecdbdu2TYcOHdIzzzzjXPl28uRJPfLIIx7V7w133HGH6TM8+eSTKiwsrPV8sbGxuummmySdaeL+ww8/SJJGjBjhtwAyKSlJXbt2dV4fO3bML88FAHgHQREAABbp06ePLrjgAklnttJ88MEHkszbzoYOHWr6Bry8o0ePOr/2pLnxypUr61JujZQ/cWvdunXV3p+bm6utW7dWeY8vPq8vtnDZbDZ1797deX1uFVRVSktLnX1zJOmyyy7zel2+Vv7XfP369ZVuAyuv/M/NpZdeWqNfD7vdrj59+uizzz7Tdddd5xz/4osvPJ5DOnMq2tSpU/XPf/7TObZo0SKPG8N7w1//+lfnCpzDhw/rnXfeqdN8FW1h88a2tpo4t6VOUqX9owAAgYmgCAAAi9hsNtM3b7NmzVJWVpbpG92qeoqU32ZV3faujRs3moIIXxswYIDz67lz51bbTHnu3LnVfmNek8979OhRff7559XWWf6bWW82fL722mudX8+YMaPS7VDnfPbZZzp58qSzJk9Oigs0vXr1cgYCJ06c0MKFC6u83+FwmPpmlf85qwmbzabhw4c7r8+txqup8qt6SkpKdOrUqVrNUxudOnXS7bff7rx+8cUX6xRUDR48WM2bN3det2jRwhSm+VpRUZF27NjhvPa0oT0AIDAQFAEAYKEJEyY4V1Fs375djz32mHPbSZMmTXTDDTdU+t5zq5GkqldR5Ofn67777vNSxZ4ZO3ascyvP4cOH9cILL1R678mTJzV16tRq5/T085aVlem+++5TcXFxtXPGxcU5A6gTJ054LSy69957nfNu2rTJtFrFVWZmph577DHn9ZgxYzw61SzQxMXFOY9jl6Tf/OY3VfaJevPNN50n+9ntdrffozk5OR79GkrmbYsJCQmm16o7Qa6iOex2u5o2berR+7zliSeecP6eOXr0qKl3UU0FBQU5j67/7rvvtHLlSlPPoJr49ttv9be//c3jXmPSmRVS2dnZzuvrr7++Vs8GAFiDoAgAAAu1a9fOdMR0+UBhzJgxCg0NrfS95VdRzJgxQy+99JLbdp89e/Zo8ODB2rRpk8cnUXlDo0aNTOHH1KlT9cILL7jVt3v3bl133XU6evRolZ9VkoYNG+YM1ZYvX65HH31UBQUFpnuOHz+ukSNHauHChR593rCwMHXo0EHSmVUkn332mScfr1rt27fX/fff77yeNGmS/v73v7udvnbu1+dcU/LY2FiPQrNANXXqVGdT6127dmnIkCHat2+f6R6Hw6HXXnvN1AfowQcfdDu2fePGjUpOTtbTTz+tn376qcLnlZWVae7cuXrjjTecY0OHDjXdc/XVV2vs2LH66quvKg2edu3aZVq9N3DgwGp/P3pb586dddtttzmvX3jhBY+DsoqkpKToiiuu0BVXXKGUlJRaz3P69Gn95je/UXJysh555BFt2rSp0hVyGRkZevjhh02/hy+99FKCIgCoZ4KtLgAAgIbuzjvvrLCfTnVHWQ8ePFj9+vXTypUrZRiGHn30Uf3973/XZZddpkaNGmn37t1au3atysrK1KpVK02ePNkU3vja73//e/3vf//TmjVrZBiGfve73+m1117TNddco+joaO3Zs0erVq1SWVmZrrzySrVv316zZ8+udL7OnTtr/Pjxzh5OL730kmbPnq0ePXooISFBBw4c0MqVK1VcXKyYmBi9+OKL+n//7/9VW+fIkSP15z//WdKZxsLTp09XSkqKqSH13/72txp//r/97W/asGGDvvvuO5WWlmrSpEl6/vnn1adPH0VHR2vv3r1auXKlMzwLDg7We++95xaY1Cft27fXu+++qzvuuENlZWX65ptv1KlTJ/Xt21ft27dXbm6uVq1apSNHjjjfc9VVV+mvf/1rhfMdO3ZMzzzzjJ555hk1b95c3bt3V/PmzRUcHKy0tDRt3LjR1Luqb9++pi1c0pkA8KOPPtJHH32kiIgIXXzxxbrgggsUGxur06dPa9++fdqwYYPz/oiIiFr9envDk08+qXnz5snhcOjw4cOaPn2631cDVubEiRN65ZVX9Morr6hRo0a6/PLL1aJFC8XExCg3N1e7d+/Wxo0bVVpa6nxPYmKiPvzwQ9O20co89dRTNWq2PWDAAI0cObJWnwUAUA0DAABYKjs724iMjDQkOX906dLFo/ceP37cuOyyy0zvdf1x4YUXGtu2bTOmTZvmHLvzzjsrnG/ZsmXOe6655ppKn1t+/qpkZWUZ119/fZX19erVyzh69Khx5513OsemTZtW4Xx5eXnG4MGDq5wvKSnJWL16tcefJTMz0+jcuXOVc5a3f/9+53jbtm2r/Pw5OTnGbbfdVuXckowWLVoY//nPf6qc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Ypxfe7KdLC8vT5Jn29SAQNS+WbTaNo00jS3enmZRNQAAAACA6vhs69krr7yi4uJiXXDBBcrPz9ecOXPc7tm6davz66VLl+r48eOSpOHDh9c6WHr77bf1yCOPSJKaNm2qkydPav78+ZowYYJmzZolu90vB71VKDw83FlTampqlfeePn3aGRSxjQv1lc1m08DOiXp/zX7n2NId6XpoUEcLqwIAAAAAVMZnQdG5bVP79u3TmDFjqr3/j3/8o/Pr/fv31yooev/99/Xggw9Kki677DItXrxYjz76qN5//33Nnj1bYWFheu+99yztj3LhhRdq1apV2rNnj0pLSyttrL1jxw7n1126dPFXeYDXDeqSYAqKfkzNUlp2oRJjrV/lBwAAAAAws255jZfNnj1b9957rwzD0EUXXaRFixapcePG+te//qU77rhDkjRt2jQ98MADltbZp08fSWe2lW3cuLHS+1asWOH8unfv3j6vC/CVHu2aKCbcHIgu3ZFuUTUAAAAAgKr4LCiaPn26DMOo8kf5BtfLli1zjicnJ9foWZ9++qkmTJggh8OhLl26aPHixWratKkkyW63a8aMGRo1apQk6R//+IcmT57stc9ZUyNGjHB+PW3atArvcTgcmjlzpiQpLi5OAwYM8EdpgE+EBNl1TcdmprEl9CkCAAAAgIBU71cULViwQGPGjFFZWZk6dOigJUuWKCHBfNJSUFCQZs+erZtuukmS9Prrr+uxxx6zolz17NlTffv2lSS99957+uabb9zueemll7R9+3ZJ0uTJkxUSEuLXGgFvG+hy+tnqPRkqLCmzqBoAAAAAQGV81qPIHwoKCnTvvfeqpKRE7dq105IlS9SiRYsK7w0ODta8efM0YsQIffXVV3rxxRd16623qmfPnh4/b/Xq1dqzZ4/zOiMjw/n1nj17NH36dNP9EydOrHCe1157Tb1791ZBQYEGDx6sxx9/XAMGDFBBQYHmzJmjf/7zn5Kkjh07asqUKR7XBwSq/h0TZLdJDuPMdWGJQ2v2ZGhgl0RrCwMAAAAAmNTroCgiIkLz58/XPffco6+++qra08FCQ0M1f/58DR8+XMOGDatRSCRJ7777rmbMmFHha2vWrNGaNWtMY5UFRZdeeqnmzp2rcePGKTs7W48//rjbPR07dtTChQsVExNToxqBQNQ4KlRXtG2i9QdOOccWb08n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jiksLKxW86empqp169aSpMOHDyspKanONQMIDPnFpRrx9zXalZZrGg8Nsuul2y7RcJfT0QAAAAD4ji++/2ZFUQN0yy23uIVEktS3b18NGDBAp0+f1pYtWyyoDECgiwwN1tz7rtZlbeJM48VlDv36o816d9U+awoDAAAA4BU+DYqys7M1Z84cTZkyRddcc41SUlLUqFEjhYaGKiEhQf3799df//pXnTxZP7YspKen68svv9TUqVM1dOhQxcfHy2azyWazaeLEiTWe7+DBg5oyZYo6d+6sqKgoNWnSRD169NCLL76o/Px8738AD4SEhEiSgoODLXk+gMDXOCpUs++9SoMvTHR77U8Lt+vZBT/J4WCxKgAAAFAf+XTr2eLFi3XddddVe198fLw++OADDRkyxFeleIXNZqv0tTvvvFPTp0/3eK4FCxZo3Lhxys7OrvD1jh07auHChUpJSalpmbV26NAhdezYUU2aNNHhw4cVFBRUq3nYegY0DGUOQ88s2KaZ3xx0e23YRS300m2XKDykdn+OAAAAAKieL77/9vmykdatW2vAgAG6/PLL1bp1a7Vo0UIOh0Opqan65JNPNH/+fGVkZOjGG2/U+vXrdckll/i6JK9o06aNOnfurEWLFtX4vZs3b9bo0aNVUFCg6Oho/f73v9eAAQNUUFCgOXPm6F//+pd27dqlYcOGacOGDYqJifHBJzArKSnR+PHjVVRUpBdeeKHWIRGAhiPIbtMzN3ZVi0YReuHrHabXFm45phO5RfrX+CvUKDLEogoBAAAA1JRPg6IBAwbo0KFDlb5+22236bPPPtPNN9+s4uJiPfPMM5o/f74vS6qTqVOnqkePHurRo4cSExN14MABtWvXrsbzTJ48WQUFBQoODtaiRYt09dVXO1+79tpr1aFDBz322GPatWuXXnrpJT399NNuc0yZMkVFRUU1emaHDh0qfM3hcGjixIlauXKl7r33Xo0fP77GnwlAw2Sz2fRA//Zq3ihMj33yo0rKfl6kun7/Kd36zlpNv7unWsVFWFglAAAAAE8FxKlnnTt31s6dOxUfH68TJ07U6L3btm3TAw88oE8//VTNmjWr9v6ysjKNHz9ew4YN0x133FHbkiXJFBR5uvVs/fr1uvLKKyVJ999/v9555x23exwOh7p166bt27crLi5O6enpzt5B50RHRysvL8/jWpctW6b+/ftX+Ky7775bM2bM0Lhx4zRjxgzZ7XVrXcXWM6BhWrMnQ/fP2qjcolLTeGJsmKbf1VNdWsRaVBkAAABwfjpvTz07t7WqsLCwRu8rKCjQkCFDtGrVKg0aNEinTp2q8n6Hw6G77rpLH330kSZOnKgNGzbUuuba+uyzz5xf33XXXRXeY7fbNWHCBElSZmamli1b5nZPbm6uDMPw+EdlIdFdd92lGTNmaMyYMZo+fXqdQyIADVfvlHjNu/9qJcSEmcbTsot02zvfaO3eDIsqAwAAAOApy1OBnTt36vvvv5d0ZmVRTUREROjZZ5+VzWbTjz/+qMGDBysrK6vCew3D0P33369Zs2ZJksaOHavLL7+8TrXXxurVqyVJUVFRVT6//PH1a9as8Xod50KimTNnavTo0Zo1axZ9iQDU2YUtY/XvB3srJSHaNJ5TVKp7Z2zQqbxiiyoDAAAA4AlLgqL8/Hzt3r1bL7/8sq655hqVlp7ZpvDQQw/VeK67775bb775piRp48aNuv7665WTk+N236RJk/Tuu+9KkkaPHq3333+/ylPMfGX79u2SpJSUlCqPoC8fmp17j7ec2242c+ZMjRo1Sh988AEhEQCvaRUXoU//Xy/1TG5iGs8rLtO3+05aVBUAAAAAT/j81LNzpk+fXulWK0n63e9+p7Fjx9Zq7l/96lcqKCjQo48+qnXr1mnYsGH6+uuvFRkZKUl65JFH9NZbb0mSRowYYVkwUlhYqIyMM1svqts32LhxY0VFRSkvL0+HDx/2ah3PPvusZsyYoejoaHXs2FF/+tOf3O4ZMWKEunfv7tF8Xbt2NV2XlJR4o0wA9VijyBDNvKenbnlrrX46lu0c352eq6EW1gUAAACgan4LiirTvXt3/fOf/1SPHj3qNM+UKVNUUFCgJ598UqtWrdLw4cO1cOFCPfvss3rllVckSUOHDtXcuXOrXMnjS+VXOkVHR1dx5xnngqLc3Fyv1nHgwAFJZ/ocPffccxXek5yc7HFQBAAVCQ8JUo/kxm5BEQAAAIDA5bfEZMSIEbriiisknWlCvXfvXs2bN0///ve/NWbMGL366qu64YYb6vSMJ554Qvn5+frLX/6ipUuXqlu3btq7d6+kM8fOz58/X6GhoXX+LLVVvlm3J3WEhZ1pCFtQUODVOqZPn+7RCW2e2rZtm+m6fNd1AA1bh8QY0/XuNPetwQAAAAACh996FMXFxalbt27q1q2bevToodtvv13z58/XzJkztW/fPt10001eCS/+/Oc/O3sdnQuJ+vTpoy+++ELh4eF1nr8uyj+/uLj6hq5FRUWSzjTtBoD6qINLU+t9GXkqLXNYVA0AAACA6lh+6tn48eM1atQoORwOTZo0qdoj7j3Rpk0b03VCQoLlIZEkxcT8/C/rnmwny8vLk+TZNjUACESuK4qKSx06fNq7qyQBAAAAeI/lQZEk3XTTTZLOBCNff/11neZ6++239cgjj0iSmjZtKkmaP3++JkyYIIfD2n/FDg8Pd9aUmppa5b2nT592BkVs4wJQXzWJClXTKPNW211sPwMAAAACVkAERc2aNXN+ffDgwVrP8/777+vBBx+UJF122WXavXu37r77bknS7Nmz9ctf/lKGYdSt2Dq68MILJUl79uxRaWlppfft2LHD+XWXLl18XhcA+EqKy/azPTS0BgAAAAJWQARFR44ccX5d221Ws2fP1r333ivDMHTRRRdp0aJFaty4sf71r3/pjjvukCRNmzZNDzzwgFdqrq0+ffpIOrN6auPGjZXet2LFCufXvXv39nldAOArHWloDQAAANQbAREUffzxx86vL7roohq//9NPP3VuLevSpYsWL17s3OJlt9s1Y8YMjRo1SpL0j3/8Q5MnT/ZO4bUwYsQI59fTpk2r8B6Hw6GZM2dKOtMEfMCAAf4oDQB8okOi+R8AdrOiCAAAAAhYPg2Kpk+fbjoSviKvvPKK/vOf/0iS2rVrp759+9boGQsWLNCYMWNUVlamDh06aMmSJUpISDDdExQUpNmzZzt7Ib3++ut67LHHavQcb+nZs6fzM7733nv65ptv3O556aWXtH37dknS5MmTFRIS4tcaAcCbKtp6VuawdhswAAAAgIrZDB827UlOTlZOTo5GjhypPn36qH379oqOjlZOTo62bNmiDz/8UGvWrJEkhYaGauHChRo0aJDH8xcUFKhdu3ZKS0tTu3bttGLFiiobPxcXF2vEiBH66quvJEnffvutevbs6fHzVq9erT179jivMzIy9Jvf/EbSme1hv/zlL033T5w4scJ5Nm/erN69e6ugoEDR0dF6/PHHNWDAABUUFGjOnDn65z//KUnq2LGjNmzYYDotrT5ITU11/jocPnxYSUlJFlcEwEoncorU47nFprEVv+mv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NGw+D4o2bNigZ599VoMHD1ZSUpLCwsIUHR2tjh076q677tLq1at9XYLXpKen68svv9TUqVM1dOhQxcfHy2azyWazaeLEiTWe7+DBg5oyZYo6d+6sqKgoNWnSRD169NCLL76o/HzfNDGtTkhIiCQpOJjFZgAatpZuW89+DlAMw9DGA+ag6IrkugVFNptNrZuYw6lDXgyKMvNLlFNYahrrmBijVi69kVJZUQQAANCg+TQN6Nevn1atWuU2XlxcrN27d2v37t2aPn26JkyYoH/9618KDa39kn1/SExM9NpcCxYs0Lhx45Sd/fO/7ubn52vDhg3asGGD3n33XS1cuFApKSlee2Z1Dh06pMWLF6tFixa66KKL/PZcAAhErj2K0rKK5HAYstttOppVqOMuPYsur0N/onNaN47UrrSfm02nejEoOugyV7DdppZx4WoVZ97yxooiAACAhs2nK4qOHj0qSWrZsqUmT56sTz75ROvXr9c333yjl19+Wa1atZIkzZw5s1YrcqzUpk0bDR48uFbv3bx5s0aPHq3s7GxFR0frueee09q1a7VkyRLde++9kqRdu3Zp2LBhysnJ8WbZlSopKdH48eNVVFSkF154QUFBQdW/CQDOYy1ctp4Vlzl0Kr9Yknt/okYRIbogPrrOz3RtaH3Yi6t7Dp7MM10nNY5QcJDdbUVRTmGpsgtLvPZcAAAA1C8+XVHUuXNn/fnPf9bIkSPdgoerrrpK48ePV+/evbVr1y599NFH+n//7/+pX79+viypTqZOnaoePXqoR48eSkxM1IEDB9SuXbsazzN58mQVFBQoODhYixYt0tVXX+187dprr1WHDh302GOPadeuXXrppZf09NNPu80xZcoUFRUV1eiZHTp0qPA1h8OhiRMnauXKlbr33ns1fvz4Gn8mADjfNIsJU5DdZjp57HhWoeKjw7TxwCnTvZe3bSy7yzHztZHkEtp4s0fRgQzzXG2aRklyb9otnWloHdsixGvPBgAAQP3h06Doyy+/rPL1+Ph4vfTSSxo+fLgk6ZNPPqlxULRt2zY98MAD+vTTT9WsWbNq7y8rK9P48eM1bNgw3XHHHTV61jPPPFOj+yuyfv1653a8e+65xxQSnTNlyhRNmzZN27dv12uvvaY//OEPzt5B5/zjH/9QXl6e23src+utt1YYFDkcDt19992aPXu2xo0bp3feeaeGnwgAzk9BdpsSY8J0tNxpZ0czC9StVSP3RtZe2HYmSW3cVhR5c+uZ+e+M5KZnnhUeEqRmMWE6kfPzPz4czSxQlxaxXns2AAAA6g/LTz0bMGCA8+u9e/fW6L0FBQUaMmSIVq1apUGDBunUqVNV3u9wOHTXXXfpo48+0sSJE7Vhw4Za1VwXn332mfPru+66q8J77Ha7JkyYIEnKzMzUsmXL3O7Jzc2VYRge/+jfv7/bHOd+PmbMmKExY8Zo+vTpstst/y0BAAHDtU/R8exC5RWVavsx87ZgbwVFrlvP0rKLVFhS5pW5D540h05tz64okqSWceaVTPQpAgAAaLgsTwXKb5+qaV+ciIgIPfvss7LZbPrxxx81ePBgZWVlVXivYRi6//77NWvWLEnS2LFjdfnll9e+8Fo6d8pbVFRUlc8vf3z9mjVrvF7HuZBo5syZGj16tGbNmkVfIgBw4dqn6FhWoX44nGnajhZkt+mSpDivPM81KJK8dwqZW1BU7llJrkERJ58BAAA0WJYHRStWrHB+3aVLlxq//+6779abb74pSdq4caOuv/76ChtAT5o0Se+++64kafTo0Xr//fdls9W9n0RNbd++XZKUkpJS5RH0nTt3dnuPt5zbbjZz5kyNGjVKH3zwASERAFTAbUVRVqFbI+uuLWMVEeqdP0Ojw4LVONK81dgb289yi0qVkWvua5cc/3NQ5NrQOpUVRQAAAA2WT3sUVcfhcOj55593Xt922221mudXv/qVCgoK9Oijj2rdunUaNmyYvv76a0VGnvk/wY888ojeeustSdKIESMsC0YKCwuVkZEhSUpKSqry3saNGysqKkp5eXk6fPiwV+t49tlnNWPGDEVHR6tjx47605/+5HbPiBEj1L17d68+FwDqG9dGz0czC3T67Mln53hr29k5rZtE6nT+z6tjU73Q0PqQy2oim01KalwuKGJFEQAAAM6yNCh65ZVXtH79eknSLbfcUqetYFOmTFFBQYGefPJJrVq1SsOHD9fChQv17LPP6pVXXpEkDR06VHPnzq1yJY8vlV/pFB1d/THK54Ki3Nxcr9Zx4MABSWf6HD333HMV3pOcnOxxUNS1a1fTdUkJxyoDOD+4bj07mlWgrHzzn3G+CIp+TP05KDrshdDm4ElzI+sWseEKD/n5H0zcgiJWFAEAADRYlgVFK1as0O9+9ztJUkJCgt5+++06z/nEE08oPz9ff/nLX7R06VJ169bN2SD72muv1fz58xUaGlrn59RWYeHPJ+d4UkdYWJikM027vWn69OmaPn26V+cEgPOR69azw6fc/zz2elDU2NynyHU10DllDkMz1h7Qlz8eVcfEGD0+rItiwys+0v6Ayxxtmpqf4br17ETOmSba5cMkAAAANAyWBEXbtm3TzTffrNLSUoWHh+vjjz9WQkKCV+b+85//rIKCAr366qvOkKhPnz764osvFB4eXs27fav884uLi6u484xzjb4jIiKqudNa27ZtM12npqaqdevWFlUDAN7juvXMVau4CLdVR3XVuol5vop6FB0+la9H5n2v7w6c6Ze06VCmguw2PXfzRRXOeeiUeUVRcrkTzyT3oEg6048pOT7KbRwAAADnN783s96/f78GDx6s06dPKygoSHPmzFG/fv28+ow2bdqYrhMSEiwPiSQpJibG+bUn28ny8s78H3tPtqkBALwvISZM9irOPbjMy6uJJPcVRYddehR9tvmIfvHaKmdIdM4X3x9VSZmjwjkPZLiceOYSFMWGhygmzPxvR2w/AwAAaJj8GhQdPXpUgwYN0tGjR2Wz2fT+++/rpptu8uoz3n77bT3yyCOSpKZNm0qS5s+frwkTJsjhqPj/QPtLeHi4s6bU1NQq7z19+rQzKGJ1DgBYIzjIroSYyv+h4fI2cV5/Zusm5qAou7BU6dmFWrnrhB6cvUkPzf1eOUWlbu/LKSrV5kOZFc556JRrUBTpdo/rqiIaWgMAADRMfguKMjIydN1112nfvn2SpDfeeEMTJkzw6jPef/99Pfjgg5Kkyy67TLt379bdd98tSZo9e7Z++ctfyjAMrz6zpi688EJJ0p49e1Ra6v5/9M/ZsWOH8+suXbr4vC4AQMVc+xSVd0VyE68/r2VcuGwuq5iufn6pJry/Xgt/PFble1fsSncbKywp09Esc+hTYVDk0tA6lRVFAAAADZJfgqKsrCwNGTJEP/30kyTp+eefdwY63jJ79mzde++9MgxDF110kRYtWqTGjRvrX//6l+644w5J0rRp0/TAAw949bk11adPH0lntpVt3Lix0vtWrFjh/Lp3794+rwsAULHK+hRFhASpc/OYCl+ri7DgILWINT+zzFHxP3K4hjsrdp1wuyf1dL5c/43EdeuZxIoiAAAAnOHzoCg/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1Ose27Zt029+8xsNGDBA7dq1k8ViUWJioiZMmKDnnntO2dnZdd7jm2++0RVXXKHExEQFBwerW7duuuuuu5SRkVHrdVlZWXr44Yd19tlnKzo6WhaLRR06dNCAAQN04403as6cOSoqKqrX5wAAADUzGYZh+LoTAAAAbcmSJUs0btw4SdLjjz+uP//5zw2+R0pKitLS0jRlyhSdf/75uvPOO2W1Wt3OCw4O1ttvv63rrrvO430qKip000036bPPPqvxWZ06ddL8+fM1ePBgj8dtNpt+//vf66WXXlJtXx2nTJmiOXPmON4fOnRI3bp1kyTNnj1bu3fv1jPPPOPx2vj4eC1dulR9+/Z1O7Zs2TJdfvnldQZB8+bN0+WXX17rOQAAoHbUKAIAAGjBNm3apPfee08JCQl65JFHNGLECFVUVGjBggV66aWXVFlZqZtvvlndunXTsGHD3K6fMmWKIyQaNGiQ7r//fvXt21cFBQV6//33NWfOHGVlZWn8+PHasmWLOnfu7HaPX/ziF5o1a5YkqWPHjrr77rt17rnnKjo6Wrm5uVqzZo0+/vjjWj/HG2+8oRUrVmjs2LG688471bt3bx0/flxvvfWW3nrrLeXm5ur222/XypUrna6rrKzU5MmTVVRUpMjISN11110aN26cEhISVFVVpYMHD2rFihW1BmEAAKD+mFEEAADgZafPKKrvrmd9+vSRxWJxvD81o0iSunbtqlWrVikxMdHpmu+//14TJ06U1WrV8OHDtWbNGqfj8+fPd8ywGT9+vBYsWKCgoCCnc9544w394he/kCRdf/31+uCDD5yOf/HFF7ryyislSeecc44WLFigmJgYj58hPT1dycnJjvenzyiSpBkzZui1116TyWRyum7GjBmaOXOmJGnDhg0aMmSI49h3332n8ePHS6p9xpDValVZWZmioqI8HgcAAPVDUAQAAOBlpwdF9XXw4EGlpKQ43p8eFH388ce65pprPF73q1/9Sq+++qqkE3WMTp9VdNlll2nhwoWyWCzav3+/U4hzuosuukiLFy+W2WzW4cOH1bFjR8exc889VytXrlRYWJj27t2rTp061fsznR4UdezYUQcPHlRwcLDbebt371Zqaqok6Z///Kfuuecex7H33ntPN998sySpsLCQIAgAgCZGMWsAAIAWrF27do4ZPZ7cfvvtjteLFy92vLZarVq6dKkkaeLEiTWGRNKJGT2nrlmyZImjPT8/X6tWrZIk3XDDDQ0KiVxde+21HkMi6cRsqoiICEnSgQMHnI6dHlrNnj270c8HAAD1Q1AEAADQhB5//HEZhlHnP6fPJjrdkCFDZDbXXFZy8ODBjuVkW7dudbQfOHBAZWVlkqSRI0fW2sfTj2/bts3xetOmTY7i1WPGjKn9g9bh1IyhmrRr106SVFxc7NQ+evRode/eXZJ07733asSIEXr66af1448/qqqq6oz6BAAA3BEUAQAAtGAJCQm1HjebzYqNjZUkFRQUONpPf13XPU6vfXT6dXl5eY7Xp8/saYywsLBajwcEnPhaarPZnNotFovmzZvn2A1t7dq1evTRRzV69GjFxMTokksu0Xvvved2HQAAaByCIgAAgBbMtfCzr+7hS/369dPWrVv12Wef6fbbb1fPnj0lSeXl5fr666918803a+TIkcrJyfFxTwEAaP0IigAAAFqwo0eP1nrcarU6ZgGdmlnk+rquexw5csTjde3bt3e8zs7Orl+Hm0hgYKCuuuoqvfnmm9q7d6+ysrI0a9YsDR06VJK0fv163XnnnT7tIwAAbQFBEQAAQAu2adMmWa3WGo9v3rzZUaunf//+jvbu3bs7lnutXr261mesWbPG8fr0ewwZMsQxG+mHH35oeOebUMeOHTVt2jStXLlSZ599tiTpyy+/VHl5uY97BgBA60ZQBAAA0IIVFBRo3rx5NR6fNWuW4/WECRMcr81ms8aOHStJ+uabb5SRkVHjPWbOnOm45oILLnC0x8bG6txzz5Ukffjhh8rKymrUZ2hKFovF8TmtVquOHz/u2w4BANDKERQBAAC0cPfdd5/H5WNLly7V66+/LkkaOnSohg8f7nT817/+tSSpqqpK06dPV3V1tds9Zs2apUWLFkmSrr76arei1Q899JAkqaysTNddd50KCwtr7GdtYVRjLVu2TPv27avxeFVVlZYuXSpJioiIUHx8vNf7AACAP6l5r1UAAACcsZycHKct52sSGhqqHj16uLUPGjRIO3bs0NChQ/XII49oxIgRqqys1IIFC/Tiiy/KarXKbDbrlVdecbt20qRJuu666/TRRx9p0aJFGjVqlO677z6lpqbq2LFjev/99x0zkmJjY/XCCy+43eOKK67Q9OnT9eabb2rFihXq16+f7r77bp133nmKiopSXl6e1q1bpw8++ECDBg3SnDlzGv4vqRbffvut/vrXv2rMmDGaNGmSBg4cqPj4eJWXl2vPnj36z3/+ow0bNkiSpk+fLrOZr7cAAJwJfpICAAA0oVdffVWvvvpqnecNGjRImzZtcmsfPHiw7r77bt111126++673Y4HBQVp7ty5GjlypMf7vvXWW7Jarfrss8+0YcMG3XLLLW7ndOrUSfPnz1fnzp093uO1115TaGioXnnlFWVlZenRRx+t8TM0BbvdrqVLlzpmDnly5ZVX6umnn26S5wMA4E8IigAAAFq4O+64Q/3799eLL76o5cuXKy8vT/Hx8Ro/frweeugh9evXr8ZrQ0JC9Omnn2revHmaM2eOVq1apby8PIWHh6t379666qqrdPfddysiIqLGewQGBurll1/WtGnT9Nprr2nJkiXKzMxUVVWV4uLiNHDgQF1yySW69dZbvf7ZH3jgAQ0cOFCLFy/Wxo0blZWVpZycHElSYmKiRowYodtuu02TJk3y+rMBAPBHJsMwDF93AgAAAM5SUlKUlpamKVOmeH05FwAAQE0oZg0AAAAAAABJBEUAAAAAAAA4iaAIAAAAAAAAkgiKAAAAAAAAcBJBEQAAAAAAACSx6xkAAAAAAABOYkYRAAAAAAAAJBEUAQAAAAAA4CSCIgAAAAAAAEgiKAIAAAAAAMBJBEUAAAAAAACQRFAEAAAAAACAkwiKAAAAAAAAIImgCAAAAAAAACcRFAEAAAAAAEASQREAAAAAAABOIigCAAAAAACAJIIiAAAAAAAAnERQBAAAAAAAAEkERQAAAAAAADiJoAgAAAAAAACSCIoAAAAAAABwEkERAAAAAAAAJBEUAQAAAAAA4CSCIgAAAAAAAEiS/h/q0KHpuYk5oQAAAABJRU5ErkJggg==",
"text/plain": [
""
]
@@ -347,12 +258,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 13\n"
+ "Time step 13\n",
+ "RMSE 0.012568220136377201, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFwAAAOOCAYAAAA9KAZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACvOElEQVR4nOzdd3hb5f3+8Vve287eO4GQAUnIYCSEHVaZLZSwaSkdUEqhFPprGe23LaMUKKOUQgOEFQo07E1CFtmD7MRx7Hgk8d5T0vn9EaL4yLIt2ZKOxvt1Xbni8/jo6CPZGef283wem2EYhgAAAAAAAOA3MVYXAAAAAAAAEGkIXAAAAAAAAPyMwAUAAAAAAMDPCFwAAAAAAAD8jMAFAAAAAADAzwhcAAAAAAAA/IzABQAAAAAAwM8IXAAAAAAAAPyMwAUAAAAAAMDPCFwAAAAAAAD8jMAFAAAAAADAzwhcAAAAAAAA/IzABQAAAAAAwM8IXAAAAAAAAPyMwAUAAAAAAMDPCFwAAAAAAAD8jMAFAAAAAADAzwhcAAAAAAAA/IzABQAAAAAAwM8IXAAA8LPFixfLZrPJZrPp1FNPbfe8w+fYbDa/Pff111/vuuaLL77ot+v6W25urqvO4cOHW11O0ITL1wcAAHQfgQsAICzceeedpht0wzC6dJ3y8nIlJiZy0wuEuBdffNEUSrr/SkxMVN++fTVt2jT9/Oc/15IlS7y+duvA7/Cvvn37ym63e30Nh8OhAQMGtLlObm5up4/Nz8/Xn//8Z82ZM0dDhgxRamqq4uPjlZWVpbFjx+q8887T//t//0/vv/++amtrfXodvvxavHix168XAOA7AhcAQFi47rrrXB/n5eXp66+/7tJ13njjDTU3N0uSUlNT9f3vf98v9UWzaJ2tAms1NzerpKREa9eu1T//+U/Nnj1bp512mvLz87t0vZKSEn388cden//pp5/qwIEDPj1HY2Oj7rzzTo0YMUK///3v9dlnn6mgoED19fWy2+2qqqrSzp079fHHH+svf/mLLrzwQvXs2VPffPONry8HABAC4qwuAAAAb0ycOFGTJ0/Whg0bJEkvv/xyh8t12vPyyy+7Pr7sssuUlpbmrxIBBEh6erquvfZa01hjY6Py8vK0fPlyNTQ0SDq0nO/000/XypUr1atXL5+f5+WXX9b3vvc9r8/1RXNzsy666CJ99tlnrrGEhARNnTpVo0aNUkpKiqqrq5Wbm6uNGze6XlNLS4vq6uq8eo5rr71W6enpXtc0aNAgn14DAMA3BC4AgLBx3XXXuQKXt99+W08//bSSk5O9fvyuXbu0atUq0/Ws1NVlUZGgO8vCEH169uypp556yuPnysrK9POf/1xvvvmmJCk7O1v333+/nnzySa+vP27cOG3btk3vv/++KisrlZWV1eH5VVVVevfdd02P7cyDDz7oCltsNpvuuusu3X333R6fq6WlRYsXL9abb76p119/3evX8cADDzDLDABCCEuKAABhY+7cuYqPj5ckVVdXa+HChT49vvVPpIcOHarTTjvNn+UBsECvXr302muvadq0aa6xefPmqaWlxetrXHPNNZKkpqYmLViwoNPz33zzTTU2NkpSm5k3nrS0tOixxx5zHf/xj3/Ugw8+2G6wEx8fr7POOkv//ve/VVBQoMmTJ3vxKgAAoYbABQAQNvr06aNzzz3XdezLlH7DMPTKK6+4jq+55hq/7g4EwDqxsbG65ZZbXMd1dXVat26d14+fO3eu4uIOTfz25u+Vw+fEx8dr7ty5nZ6/evVqVVZWuh5z2223eV1bVlZWl5ZHAQCsR+ACAAgrrZcBff755143rfz666+Vl5fnOnb/qXRVVZVef/113XzzzZoxY4Z69+6thIQEZWRkaNSoUbryyiv15ptvyul0+ueFyPdtoRcuXKiLLrpIgwYNUmJiogYPHqyzzjpL8+fP92l3FUlqaGjQwoUL9ctf/lIzZ85Uv379lJCQoLS0NA0fPlyXXHKJXnjhBVeDYU8O7yIzYsQI11heXl67O6K01pVGuytXrtQtt9yi8ePHq0ePHkpKStLgwYN1zjnn6KmnnvKqz8X999/vet77779fkmS32/Xyyy/rzDPPdL23AwYM0MUXX6wPPvjAq9oCpba2Vv/4xz80Z84cDR48WElJSerRo4cmTJigW265xbRErjP5+fl64IEHdMopp6hfv35KTExUQkKCevXqpeOOO05z587VP//5zw7/TLW0tOiVV17RpZdeqpEjRyotLU1xcXFKT0/X6NGjNWfOHN17771avXq1P16+TyZNmmQ6Lioq8vqxffv21TnnnCNJWrFihfbs2dPuuXv37tXy5cslSeecc4769OnT6fULCwtdH/fs2dOnPisAgDBmAAAQRpqamoyePXsakgxJxqOPPurV42644QbXY0488UTT595++20jMTHR9fmOfh133HFGTk5Oh8+1aNEi1/mzZ89u97zW1+1ITU2Ncd5553VY18yZM439+/cb1113nWts3rx5Hq+3cuVKIy0tzavXO3z4cGP9+vUerzNv3jyvruHpNe7du9c1PmzYsA5ff21trXHFFVd0ev0BAwYYH330UYfXuu+++1zn33fffUZBQYFx0kkndXjdG264wXA4HB1e11vefH0Oe//9943+/ft3+rrnzp1r1NXVdXitf/3rX0ZycrJXX6eTTz7Z4zV27txpHHPMMV5/vXfv3t3Vt8kwDPP3V2ffI4ZhGLt27TI9/6uvvtruua2//yQZDQ0Nxptvvuk6vvfee9t97P333+8677///a/R0NBgutbevXvbPOa///2v6/M2m82ora315i3olPvr8PTcAADr0DQXABBWEhISdOWVV+rpp5+WdGhq/69//esOH9PQ0KC33nrLdezeLLe4uFhNTU2SpMGDB2vcuHHq37+/UlJSVFtbq+3bt2v9+vUyDEObNm3SKaecoo0bNwZlmn9LS4vOP/98LVmyxDXWv39/nXLKKUpPT1d2draWLVumZcuW6ZJLLtHIkSM7vWZFRYVqa2slHfrJ/vjx4zV48GClpqaqvr5e2dnZWr16tex2u3JzczV79mytX79eo0ePNl3nmGOO0S9+8QvV1NS4llh42k2mO+rr63X66aebZkwMHDhQs2bNUlpamuv1OxwO7d+/XxdeeKFef/11r7b7rq2t1TnnnKMtW7YoJSVFs2bN0pAhQ1RTU6NFixapuLhY0qF+IEcffbR++9vf+u11dWbBggW66qqr5HA4JB1aMjNz5kyNHj1atbW1Wrp0qWsGx2uvvaa9e/fqq6++UlJSUptrLVy4UDfffLPrOCMjQyeeeKIGDx6suLg4VVVVadeuXdqyZUu7M5pqamp05plnurZcjomJ0eTJk3XMMccoLS1N9fX1Kiws1KZNm1RaWurvt8Mr7jNa+vXr59PjL7zwQmVlZamyslKvvPKKazaUu8Pf6z169ND3vvc9r5o/jxo1yvWxYRh6+OGH9cADD/hUHwAgDFkc+AAA4LPVq1ebfqr77bffdnj+q6++6jo3MTHRqKioMH3+vffeM/761792+BP5nJwcY86cOa7r/OhHP2r3XH/OcPnjH/9o+sn4n//8Z8Nut5vO2blzp3HccccZkoyEhASvZrj87ne/MzZv3tzu8x48eNC45pprXNc644wz2j3Xl9kqvj7mZz/7meu82NhY4/HHH28z22TXrl3G8ccf7zovIyOj3Z/0t57hcnhW03XXXWeUlZWZzqurqzOuvPJK17lpaWl+mZXgzQyX7Oxs0wyk6dOnt/nedDgcxqOPPmrExMS4zrv11ls9Xm/SpEmuc2655ZZ2Z8PU1NQYb775pvHb3/62zecef/xx1zXGjRtn7Nixw+M1nE6nsXr1auNnP/uZsW/fvg7eic75OsPlnnvucZ0fHx9vlJeXt3uupxkuhmEYP/nJT1xjS5YsafO4pUuXuj5/8803G4ZheDXDxel0GsOHDzf9Wb766quNb775xnA6nd69IV68Dma4AEBoIXABAISl1ksb7rzzzg7PbR2UXH755V1+zubmZuPYY481JBlJSUnt3tD5K3CprKw0UlJSXOfcf//97V6ruLjYGDBggOmanS1Z8ca5557rut62bds8nhOowCU7O9sUKDz11FPtXq+8vNx0Q3vDDTd4PK914CLJuPLKK9u9ZkNDgzFkyBDXuW+88YZXr60j3gQu1157reuc0aNHG5WVle1e7+9//7vr3JiYmDbL3WpqalyfHzJkSJdv7i+77DLXdT7//PMuXcNXvgQu27ZtM9LT013nz507t8Pz2wtcli9f7hr78Y9/3OZxN910k+vzK1asMAzDu8DFMAzjrbfeMp13+FevXr2M8847z7j33nuN999/v8OgqLPXce211xq/+MUvvPr1+OOPe/08AICuIXABAISlBx980HWTMXDgwDazPg4rKioyYmNjXed++OGH3Xrehx56yHWt9957z+M5/gpcnnnmGdfnBw8ebDQ1NXVY23PPPef3wGXBggWu6/3jH//weE6gApff/va3rnMmTZrUaVjQutbExESPQUXrwCUhIcHYv39/h9e86667XOf/+te/9uq1daSzwKWiosLUT+idd97p8HoOh8MYP3686/y7777b9PnCwkLTe9hVZ511lus6Gzdu7PJ1fNFZ4NLY2Gjs3LnTePjhh42srCzXuWPHjjUOHDjQ4bXbC1wMwzBGjx5tSDIyMzNN4w0NDa7nGTNmjGnc21kmzz//vJGUlOQxeGk9+2X69OnGk08+aXp+b16HL786+rsJAOAf9HABAISlq6++Wr/73e/kdDpVVFSkL774QnPmzGlz3quvvurqg9G/f3+P57RWWVmplStXauvWrSorK1Ntba1pZ6IdO3a4Pt64caO+973v+ekVtbVo0SLXx1dccYUSEhI6PP+HP/yhbrnllg53FnJXX1+vlStXavPmzSopKVFNTY3r/ZLMu6ts3LjR++L94KuvvnJ9fP3113e6m9Mll1yinj17qry8XE1NTfrmm29cO894MnPmTPXv37/Da06ePNn1cW5urneFd8OKFStc/YR69+7d6fdXTEyMbrzxRt1xxx2SzN8zh6+RlJSkxsZGbdmyRcuXL9fJJ5/sc11Dhgxxffzss8/qn//8p8/X6I7Du191JCYmRhdffLGefvppn/u3tHbNNdfovvvuU1VVld59911dccUVkqR3333XtbXzNddc06Vr/+hHP9JZZ52lhx56SK+//roqKiranGMYhlavXq3Vq1froYce0vz583Xqqad29eUAACxE4AIACEuDBg3SmWeeqc8++0ySNH/+fI9hyuEGl5J01VVXKTY21uP1CgoKdPfdd+utt95y3fB2JtDNQTds2OD6+MQTT+z0/PT0dE2YMEHr16/v9Nzy8nLde++9evnll1VTU+NVPcFshmoYhingOemkkzp9THx8vKZPn65PPvlEkrR+/foOA5eJEyd2es3WjZGrq6s7Pb+7Wn/Np0+frri4zv+r1jpA2bBhgwzDcIUTCQkJuvjii/XGG2/Ibrfr9NNP1xVXXKHvf//7OuWUU5SVleVVXZdffrn+85//SDoUuKxbt07XXXed5syZ06aZslUuvPBCvfDCC16/pvZcc801uv/++2UYhl5++WVX4HL47xKbzdblwEWShg4dqqefflqPPfaYVq1apaVLl2rNmjVat26dqynxYQUFBTrrrLP04Ycf6uyzz+702nv37vV6m3UAQOARuAAAwtZ1113nClz+97//qba2Vmlpaa7Pb9iwQZs3bzad78mGDRt0xhlnePxpc0e8DSq6qqSkxPXx0KFDvXrM0KFDOw1c8vLydMopp2jfvn0+1RPo19taVVWVWlpaXMfDhg3z6nGtbzY7C4gyMzM7vV58fLzr49b1BErrr3lXXnNzc7NqamqUkZHhGnvssce0bt067d69W83NzZo/f77mz5+vmJgYjR8/XrNmzdJZZ52lc889V4mJiR6fY86cObr11lv15JNPSpLWrFmjNWvWSDq0G9DMmTN16qmn6uKLL9bgwYN9fdmdct/9ym63q6ioSBs2bFBBQYGkQ7sx5eTk6Msvv1Tv3r27/FwjRozQzJkztXTpUn322Wc6ePCgJLn+rpk1a5ZfQo2EhATNmjVLs2bNco3l5ubqrbfe0uOPP+6aXWa323XttdcqJydHKSkp3X5eAEDwxFhdAAAAXXXJJZe4bizr6+tNWz9L5tktkydP9jijoampSZdddpkrbOnTp49+//vfa9GiRcrPz1ddXZ2cTqeMQ33PNG/ePNdjWy81CoTDWzdL8vpGKzU1tdNz5s6d6wpb0tPTdfvtt+uTTz5RTk6Oamtr5XA4XK+39RKVQL/e1lq/dsm71+V+XmcBUWdLVKzQ+nV35TVLbV93//79tXbtWv3+9783LbVxOp3avHmznnnmGV1yySUaMGCAHnzwQdOSstb+8Y9/6J133tH06dNN4wcPHtTbb7+tW2+9VUOHDtX3v/99n8O8zvTs2VNPPfWU69ezzz6r9957T3v37tULL7zg2g7722+/9cu25IfDWbvdrtdee02vvfaa7Ha76XOBMHz4cN15553atm2baRnRwYMHtWDBgoA9LwAgMAhcAABhKzk5WT/4wQ9cx/Pnz3d9bLfb9frrr7uO27tJevvtt7V3715Jh5Ypbdq0SX/605906qmnavDgwUpJSTHdmAdzlkfr2Tr19fVePaaurq7Dz69YsUIrVqxwXX/lypX6+9//rjlz5mjEiBFKTU1VTMyR/x4E8/W21vq1S52/Lk/npaen+7WmYGj9urvymiXPrzsjI0N/+tOfVFhYqJUrV+qRRx7RxRdfbJoJUlFRoXvuuUeXXXaZDMPw+FyXXHKJVq1apby8PL300ku6+eabNW7cONfnDcPQ22+/rSlTpmjXrl1e1d8dcXFxuvHGG/X888+7xj7++GO99NJL3bruD37wAyUnJ0s6FNwevp773zmBkpGRofnz55uWQC5dujTgzwsA8C8CFwBAWGsdpCxevNjVA+HTTz91LQWIj4/X3LlzPT7+yy+/dH38q1/9SgMGDOjw+fLy8rpbstf69Onj+tjbGQPuPSDctX691113nelm2ZNgvt7WMjMzTct5vH39rRvbdmdZiVW68jVv/ZoTEhI6DJpiY2M1Y8YM3Xnnnfrf//6ngwcPaunSpbrwwgtd57z77rt6++23O3zOoUOH6tprr9Wzzz6rrVu3at++fXrggQdcM7HKysr061//2qv6/eGqq64yvYY//OEPamxs7PL1MjIydNFFF0k61Cx606ZNkqSLL744aEHe4MGDNX78eNfx/v37g/K8AAD/IXABAIS1mTNnauTIkZIOLZF45ZVXJJmXE5177rmmG9nWioqKXB9700R1yZIl3SnXJ613yFm5cmWn59fW1mrLli0dnhOI1xuIpTk2m02TJk1yHR+eldMRu93u6isiSVOmTPF7XYHW+mu+evXqdpf3tNb6vZk8ebJPX4+YmBjNnDlTCxcu1FlnneUaf++997y+hnRoF6N7771Xzz33nGvss88+87oBtT88/PDDrhkh+fn5evbZZ7t1PU9Lk/yxXMkXh5dKSWq3vw4AIHQRuAAAwprNZjPdBM2fP19VVVWmG8aOei60Xj7T2bKddevWmW7oA+20005zfbxgwYJOm7YuWLCg0xtcX15vUVGR3n333U7rbH1T6M/Gsqeffrrr45deeqndZS6HLVy4UGVlZa6avNnZKdScdNJJrhvrkpISffjhhx2e73Q6TX2FWr9nvrDZbKYtqA/PDvNV61kmLS0tKi8v79J1uuLoo4/WD3/4Q9fxI4880q3A5+yzzzZtGz5gwABTKBVoTU1Npm3ovW2cDQAIHQQuAICwd+2117p+qr99+3bdddddruUEPXv21AUXXNDuYw/PjpE6/ql+fX29fvKTn/ipYu/MnTvXtUQjPz9fDz30ULvnlpWV6d577+30mt6+XofDoZ/85Cdqbm7u9JpZWVmuIKekpMRvoctNN93kuu769etNsyfcVVZW6q677nIdX3nllV7tQhRqsrKyXNsQS9JvfvObDvvoPPXUU66duGJiYtp8j9bU1Hj1NZTMy9H69u1r+py3W4K3vkZMTIxpW+1g+P3vf+/6nikqKjL1dvFVbGysa8vmNWvWaMmSJe1uK9+ZVatW6W9/+5vXvZikQzN2Wm9F3tEW5wCA0ETgAgAIeyNGjDBtrdr6xvzKK69UQkJCu49t/VP9l156SY8++mibZRzZ2dk6++yztX79eq93jvGHzMxMU4hw77336qGHHmpT3+7du3XWWWepqKiow9cqSeeff74rnFq8eLHuvPNONTQ0mM45cOCALrvsMn344Ydevd7ExESNGTNG0qFZDQsXLvTm5XVq1KhRuvnmm13Ht9xyi55++uk2uyUd/vocbn6ckZHhVfgUqu69915X89xdu3Zpzpw5ysnJMZ3jdDr1xBNPmPqk/OIXv2izXfG6des0fPhw3X///dq2bZvH53M4HFqwYIFry2fp0DK81k488UTNnTtXH3/8cbsBzq5du0yzyc4444xOvx/9bezYsbr88stdxw899JDXgZMno0eP1tSpUzV16lSNHj26y9epqKjQb37zGw0fPly//vWvtX79+nZnbJWWlur22283fQ9PnjyZwAUAwlCc1QUAAOAP1113ncd+I51t4Xr22WfrlFNO0ZIlS2QYhu688049/fTTmjJlijIzM7V7926tWLFCDodDgwYN0m233WYKQQLtnnvu0eeff67ly5fLMAzdfffdeuKJJzR79mylpaUpOztbS5culcPh0IwZMzRq1Ci99tpr7V5v7Nixuuaaa1w9bh599FG99tprmjZtmvr27avc3FwtWbJEzc3NSk9P1yOPPKKf/vSnndZ52WWX6S9/+YukQw1MX3zxRY0ePdrU+PZvf/ubz6//b3/7m9auXas1a9bIbrfrlltu0YMPPqiZM2cqLS1Ne/bs0ZIlS1whVFxcnF544YU2wUM4GTVqlJ5//nldddVVcjgc+uabb3T00Udr1qxZGjVqlGpra7V06VIVFha6HnPCCSfo4Ycf9ni9/fv364EHHtADDzyg/v37a9KkSerfv7/i4uJ08OBBrVu3ztTbZ9asWaalOdKhIO3111/X66+/ruTkZB177LEaOXKkMjIyVFFRoZycHK1du9Z1fnJycpe+3v7whz/8QW+++aacTqfy8/P14osvBn12WntKSkr02GOP6bHHHlNmZqaOP/54DRgwQOnp6aqtrdXu3bu1bt061xbUktSvXz+9+uqrpuWA7bnvvvt8aup72mmn6bLLLuvSawEAeMEAACACVFdXGykpKYYk169jjjnGq8ceOHDAmDJliumx7r/GjRtnbN261Zg3b55r7LrrrvN4vUWLFrnOmT17drvP2/r6HamqqjLOOeecDus76aSTjKKiIuO6665zjc2bN8/j9erq6oyzzz67w+sNHjzYWLZsmdevpbKy0hg7dmyH12xt7969rvFhw4Z1+PpramqMyy+/vMNrSzIGDBhgfPTRRx1e67777nOdf99993V4rmF4/7X0ljdf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",
+ "image/png": "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Tz5pWonw1FNPGUVFRaY5P//8s9G9e3dDkhESEuLRiqK//OUvxpYtW8p87tGjR42JEye67nX11VeXObcyq4Mq+5q7777bNS8wMNB46aWX3Fb37Ny50+jdu7drXkxMTJkrK0quKDq/iuzWW281Tp48aZqXnZ1tjBs3zjU3KirKK6tAPFlRtHv3btOKr379+rn92SwuLjaef/55IyAgwDXv97//fan369Gjh2vOfffdV+bqo8zMTOPjjz82/vjHP7p976WXXnLd46KLLjJ27NhR6j2cTqexZs0a4+677zb2799fzk+iYpVdUfTnP//ZNT84ONg4depUmXNLW1FkGIbxu9/9zjW2fPlyt9etWLHC9f277rrLMAzDoxVFTqfTSE5ONv2zPGHCBGPVqlWG0+n07AfiwftgRREA1B4ERQAA1LCSW2AefPDBcueWDHhuvvnmKj+zoKDAuPjiiw1JRlhYWJkfRL0VFKWnpxsRERGuOY8//niZ9zp27JiRkJBgumdFW5s8MWzYMNf9fvrpp1Ln+Coo2r17tykIee2118q836lTp0wfxG+77bZS55UMiiQZ48aNK/Oeubm5RlJSkmvuRx995NF7K48nQdGkSZNcc9q1a2ekp6eXeb8XXnjBNTcgIMBtW2RmZqbr+0lJSVUOJUaPHu26z3//+98q3aOyKhMU/fTTT0Z0dLRr/vjx48udX1ZQtHLlStfYb3/7W7fX3Xnnna7v//DDD4ZheBYUGYZhfPrpp6Z55381atTI+NWvfmU8+uijxhdffFFuwFXR+5g0aZJx7733evTrpZde8vg5AIDKIygCAKCGPf30064PR82bN3dbZXPeoUOHjMDAQNfcRYsWVeu5zzzzjOten3/+ealzvBUUvfHGG67vJyYmGvn5+eXW9s4773g9KJo3b57rfq+88kqpc3wVFP3xj390zenRo0eFIUfJWkNDQ0sNWEoGRSEhIcbhw4fLvedDDz3kmv/AAw949N7KU1FQdPr0aVO/rAULFpR7v+LiYqNLly6u+X/6059M3z948KDpZ1hV1157res+GzdurPJ9KqOioCgvL8/4+eefjWeffdaIjY11ze3UqZNx5MiRcu9dVlBkGIbRrl07Q5LRoEED03hubq7rOe3btzeNe7qqZ9q0aUZYWFipgVHJ1Ub9+vUzXn31VdPzPXkflflV3t9NAIDqo0cRAAA1bMKECfrLX/4ip9OpQ4cO6euvv9bQoUPd5n344YeuPi/NmjUrdU5J6enpWr16tbZt26aTJ08qKyvLdNLZjh07XF9v3LhRI0aM8NI7crd06VLX12PHjlVISEi583/zm9/ovvvuK/ekMqucnBytXr1aW7Zs0fHjx5WZmen6eUnm05o2btzoefFe8O2337q+njx5coWnw40aNUpxcXE6deqU8vPztWrVKtdJVqUZMGCAmjVrVu49e/bs6fp63759nhVeDT/88IOrX1bjxo0r/PMVEBCg22+/XVOnTpVk/jNz/h5hYWHKy8vT1q1btXLlSl1++eWVrispKcn19VtvvaU333yz0veojvOn6ZUnICBAI0eO1Ouvv17p/kQlTZw4UY899pjOnDmjzz77TGPHjpUkffbZZ64j7idOnFile99xxx269tpr9cwzz2ju3Lk6ffq02xzDMLRmzRqtWbNGzzzzjGbPnq0rr7yyqm8HAGATgiIAAGpYixYtdM0112jJkiWSpNmzZ5caAp1vPCtJt9xyiwIDA0u934EDB/SnP/1Jn376qeuDekV83bR3w4YNrq/79+9f4fzo6Gh17dpV69evr3DuqVOn9Oijj2rWrFnKzMz0qJ6abFJsGIYpmLrssssqfE1wcLD69eunr776SpK0fv36coOibt26VXjPkg3LMzIyKpxfXSV/z/v166egoIr/M7Nk8LNhwwYZhuEKVUJCQjRy5Eh99NFHKioq0lVXXaWxY8dqzJgxuuKKKxQbG+tRXTfffLPef/99SWeDopSUFN16660aOnSoW5Nzu1x//fV67733PH5PZZk4caIef/xxGYahWbNmuYKi83+XOByOKgdFktSyZUu9/vrrevHFF/Xjjz9qxYoVWrt2rVJSUlzNws87cOCArr32Wi1atEhDhgyp8N579+5VcnJylWsDAHgPQREAADa49dZbXUHRv/71L2VlZSkqKsr1/Q0bNmjLli2m+aXZsGGDrr766lL/7355PA1Yqur48eOur1u2bOnRa1q2bFlhUJSamqorrrhC+/fvr1Q9vn6/JZ05c0aFhYWu61atWnn0upIfkisKtho0aFDh/YKDg11fl6zHV0r+nlflPRcUFCgzM1MxMTGusRdffFEpKSnatWuXCgoKNHv2bM2ePVsBAQHq0qWLBg4cqGuvvVbDhg1TaGhoqc8YOnSofv/73+vVV1+VJK1du1Zr166VdPZ0sQEDBujKK6/UyJEjlZiYWNm3XSHraXpFRUU6dOiQNmzYoAMHDkg6e7rbnj179M0336hx48ZVflbr1q01YMAArVixQkuWLNHRo0clyfV3zcCBA70SxoSEhGjgwIEaOHCga2zfvn369NNP9dJLL7lW8xUVFWnSpEnas2ePIiIiqv1cAEDNCLC7AAAA/NGoUaNcH4hzcnL06aefmr5fcjVRz549S11Bkp+fr9GjR7tCoiZNmujhhx/W0qVLlZaWpuzsbDmdThlnexJq+vTprteW3JLmC+ePsJfk8QfEyMjICueMHz/eFRJFR0fr/vvv11dffaU9e/YoKytLxcXFrvdbciuTr99vSSXfu+TZ+7LOqyjYqmgrkx1Kvu+qvGfJ/X03a9ZM69at08MPP2zakuV0OrVlyxa98cYbGjVqlBISEvT000+bth6W9Morr2jBggXq16+fafzo0aOaP3++fv/736tly5YaM2ZMpUPIisTFxem1115z/Xrrrbf0+eefa+/evXrvvfcUFhYmSdq8ebMpUKqq86FyUVGR5syZozlz5qioqMj0PV9ITk7Wgw8+qJ9++sm03ezo0aOaN2+ez54LAPA+giIAAGwQHh6um266yXU9e/Zs19dFRUWaO3eu67qsD3fz58/X3r17JZ3dzrZp0yb93//9n6688kolJiYqIiLCFCjU5KqakqujcnJyPHpNdnZ2ud//4Ycf9MMPP7juv3r1ar3wwgsaOnSoWrdurcjISAUEXPhPm5p8vyWVfO9Sxe+rtHnR0dFerakmlHzfVXnPUunvOyYmRv/3f/+ngwcPavXq1Xruuec0cuRI08qb06dP689//rNGjx4twzBKfdaoUaP0448/KjU1VTNnztRdd92liy66yPV9wzA0f/589erVSzt37vSo/uoICgrS7bffrmnTprnGFi9erJkzZ1brvjfddJPCw8MlnQ2cz9/P+neOr8TExGj27NmmrbIrVqzw+XMBAN5DUAQAgE1KBkDLli1z9fj4z3/+49oyEhwcrPHjx5f6+m+++cb19R/+8AclJCSU+7zU1NTqluyxJk2auL72dIWGtceJVcn3e+utt5o+5JemJt9vSQ0aNDBt+/L0/ZdsOF2d7Ud2qcrvecn3HBISUm5AFhgYqEsuuUQPPvig/vWvf+no0aNasWKF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4/vvv5ckRUZGlvv8ksfXr1y50ut1lAyJxo4dq9mzZ/t1X6LAAIcmXNrKNPbvLUd0Isvz7X0AAAAAANR1NRIUpaena8qUKZKkZ555Ro0bN/bavW+//Xa99tprkqSUlBRdd911pTaAvu+++zRt2jRJ0tixY/X+++/b0n9m+/btkqR27dqVewR9p06d3F7jLee3m82aNUs33XSTPvjgA78Oic67uU+SQoIu/CNRUOzUvLVpNlYEAAAAAEDNqpGtZw899JCOHDmiyy+/XHfccYfX73/PPfcoNzdXDz74oFavXq3hw4frq6++UkREhCTpgQce0BtvvCFJGjlypG3BSF5enk6cOCFJFW7HatiwoSIjI5Wdna20NO+GFU8++aRmzpypqKgodejQQX/729/c5owcOVI9evTw6nNru7jIEP364gQtWH/QNfbh6lT9z6C2CgygqTUAAAAAoP7zeVC0YsUKTZs2TUFBQXrrrbd8topn6tSpys3N1SOPPKIVK1ZoxIgRWrRokZ588km9+OKLkqRhw4Zp3rx55a7k8aWSK52ioqIqnH8+KPJGP6KS9u3bJ+lsn6Onnnqq1DnJyckeB0VdunQxXRcWFlanPFtN6p9sCooOncnTN9uPakiXZjZWBQAAAABAzfBpYlJQUKDf/e53MgxD999/v7p27erLx+nhhx9WTk6O/vGPf+jbb79V165d9csvZ0+yuuqqq7RgwQKFhIT4tIby5OXlub72pI7Q0FBJZ5t2e9OMGTM0Y8YMr96zvuiRFKuLExto84ELva5mr04lKAIAAAAA+AWfBkV///vftWPHDrVs2VKPPfaYLx9lemZubq5eeuklV0g0YMAAff755woLC6uRGspS8vkFBQUVzs/PP9tIOTw83Gc1ecO2bdtM1wcOHFBSUpJN1VTfxEtb6X8/3ey6XrHrhPYcz1KbJhWvAgMAAAAAoC7zWTPrHTt26B//+Ick6dVXX1VkZKSvHuWmZcuWpuv4+HjbQyJJio6Odn3tyXay7OxsSZ5tU4P3jOjeXLERwaaxD1bvt6kaAAAAAABqjs9WFL344osqKChQmzZtlJOTo48++shtztatW11ff/vttzpy5IgkacSIEVUOlt5880098MADkqRGjRrp5MmTWrBggSZNmqTZs2crIKBGDnorVVhYmKumAwcOlDv39OnTrqCoLq/OqYvCggN1c58kvbN8j2vsk5Q0PTi0gyJC7OlvBQAAAABATfDZp97z26b27NmjcePGVTj///7v/1xf7927t0pB0fvvv697771XktSrVy99/fXXevDBB/X+++9rzpw5Cg0N1XvvveezhtqeuOiii7RixQrt3r1bRUVFZTbW3rFjh+vrzp0711R5OGfCJa307oo9Moyz15l5Rfps4yGN69ey/BcCAAAAAFCH2be8xsvmzJmjO++8U4ZhqFu3blqyZIkaNmyod999V7fccoskafr06br77rttrXPAgAGSzm4rS0lJKXPed9995/r68ssv93ldMGvZKEJXdmhiGpu1KlXG+eQIAAAAAIB6yGdB0YwZM2QYRrm/Sja4Xrp0qWs8OTm5Us+aP3++Jk2aJKfTqc6dO+vrr79Wo0aNJEkBAQGaOXOmbrrpJknS22+/rSlTpnjtfVbWyJEjXV9Pnz691DlOp1OzZs2SJMXGxmrw4ME1URosJvVPNl1vP5yh9ftP21MMAAAAAAA1oM6vKPriiy80btw4FRcXq3379vrmm28UHx9vmhMYGKg5c+bohhtukCS98soreuihh+woV/369dPAgQMlSe+9955WrVrlNuf555/X9u3bJUlTpkxRcHCw2xz43hUdmigpznzi3KxVqTZVAwAAAACA79Xpzry5ubm68847VVhYqNatW+ubb75RQkJCqXODgoL08ccfa+TIkVq8eLGee+45jRkzRv369fP4ed9//712797tuj5x4oTr6927d2vGjBmm+ZMnTy71Pi+//LIuv/xy5ebmasiQIfrLX/6iwYMHKzc3Vx999JHeeecdSVKHDh00depUj+uDdwUGODThklb6x+IL/aL+veWwHh5+kZpEh9pYGQAAAAAAvlGng6Lw8HAtWLBAd9xxhxYvXlzh6WAhISFasGCBRowYoeHDh1cqJJKkadOmaebMmaV+b+XKlVq5cqVprKygqGfPnpo3b54mTJigjIwM/eUvf3Gb06FDBy1atEjR0dGVqhHedXOfJL3w353KL3JKkgqLDc1bu1/3XdXe5soAAAAAAPC+Or/17LLLLtPWrVs97msUFhamr776Sn/4wx98WldFRowYoc2bN+v+++9Xhw4dFBERodjYWPXp00fPPPOMNmzYoHbt2tlaI6SGkSEa0b25aWzOj/tVVOy0qSIAAAAAAHzHYXCME7zswIED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fd5xxx2mkOi8qVOnavr06dq+fbtefvll/fWvf3X1Djrv7bffVnZ2tsfPHTNmTKlBkdPp1O233645c+ZowoQJeuuttyr5jlDXXdO5qRIahOnwmTzX2KxV+/TsmO42VlX35RUW69sdx0xjbDurHawNrbPoUQQAAAC41IpTz6KjoyVJeXl5Fcw0y83N1dChQ7VixQpdc801OnXqVLnznU6nbrvtNs2dO1eTJ0/WunXrqlxzVS1cuND19W233VbqnICAAE2aNEmSlJ6erqVLl7rNycrKkmEYHv+68sor3e5x/ucxc+ZMjRs3TjNmzFBAQK34I4EaFBQYoPH9WprGPtt4SOk5BTZVVD8s33nc1AcnwCENuYigqDZgRREAAABQNttTgZ9//lkbN26UJHXq1KlSrw0PD9eTTz4ph8OhzZs3a8iQITpz5kypcw3D0F133aXZs2dLksaPH6/evXtXq/aq+P777yVJkZGR5T6/5PH1K1eu9Hod50OiWbNmaezYsZo9ezZ9ifzY2H5JCg50uK7zi5z6NOWAjRXVfV9tNZ921jc5Tk2iQ22qBiVZexTRzBoAAAC4wJagKCcnR7t27dILL7ygQYMGqajo7H+k/+EPf6j0vW6//Xa99tprkqSUlBRdd911pTaAvu+++zRt2jRJ0tixY/X+++/L4XC4zfO17du3S5LatWtX7hH0JUOz86/xlvPbzWbNmqWbbrpJH3zwASGRn4uPDtN1XRNMY7NXp8rpNGyqqG4rKHLqv9uPmsaGse2s1rAGRZkERQAAAICLT3sUlTRjxowyt1pJ0p/+9CeNHz++Sve+5557lJubqwcffFCrV6/W8OHD9dVXXykiIkKS9MADD+iNN96QdLYnkl3BSF5enk6cOCFJSkws//jxhg0bKjIyUtnZ2UpLS/NqHU8++aRmzpypqKgodejQQX/729/c5owcOVI9evTw6nNRu03q30pfbDrkuk49maPlu47ryo7xNlZVN/3wywllWvreWIM42Me69YwVRQAAAMAFNRYUlaVHjx5655131Ldv32rdZ+rUqcrNzdUjjzyiFStWaMSIEVq0aJGefPJJvfjii5KkYcOGad68eeWu5PGlkiudoqKiKpx/PijKysryah379u2TdLbP0VNPPVXqnOTkZI+Doi5dupiuCwsLq1MebNKnVUN1ahatHUcu/DmdvSqVoKgK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q6++0kUXXdRqELR48WJddNFFLZ4DAABaRo8iAACATmzbtm168803lZycrIcfflgTJ05UbW2tli5dqmeeeUZ1dXW64YYb1LdvX40fP97j+ptvvtkZEo0aNUr333+/hg4dquLiYr311ltatGiR8vLyNHv2bH377bfq1auXxz3uuusuvfLKK5KktLQ03XvvvZo6dapiYmJUUFCgjRs36r333mvxc7z44otau3atzjnnHC1YsECDBg1SaWmpXnvtNb322msqKCjQbbfdpnXr1rlcV1dXp2uvvVbl5eWKjo7W3XffrVmzZik5OVlWq1XZ2dlau3Zti0EYAABoOyqKAAAAfKxpRVFbVz0bPHiwLBaLc7uxokiS+vTpo/Xr1ys1NdXlmi+++EJz586VzWbThAkTtHHjRpfjS5YscVbYzJ49W0uXLlVISIjLOS+++KLuuusuSdLVV1+tt99+2+X4f/7zH11yySWSpClTpmjp0qWKjY31+hkOHz6sjIwM53bTiiJJuvPOO/X888/LYDC4XHfnnXfqpZdekiRt2bJFY8aMcR77/PPPNXv2bEktVwzZbDZVV1erR48eXo8DAIC2ISgCAADwsaZBUVtlZ2crMzPTud00KHrvvfd0xRVXeL3unnvu0XPPPSfpRB+jplVF8+bN07Jly2SxWLR//36XEKep8847T8uXL5fZbNahQ4eUlpbmPDZ16lStW7dOERERysrKUs+ePdv8mZoGRWlpacrOzlZoaKjHeXv27NGQIUMkSX/961/14x//2HnszTff1A033CBJKisrIwgCAMDPaGYNAADQicXFxTkrery57bbbnF8vX77c+bXNZtOqVaskSXPnzm02JJJOVPQ0XrNy5Urn/qKiIq1fv16SdM0117QrJHJ35ZVXeg2JpBPVVFFRUZKkAwcOuBxrGlotXLjwtJ8PAADahqAIAADAjx599FE5HI5W/2laTdTUmDFjZDY331Zy9OjRzulk27dvd+4/cOCAqqurJUmTJk1qcYxNj+/YscP59bZt25zNq6dPn97yB21FY8VQc+Li4iRJFRUVLvunTZumfv36SZJ++tOfauLEiXryySe1Zs0aWa3WMxoTAADwRFAEAADQiSUnJ7d43Gw2Kz4+XpJUXFzs3N/069bu0bT3UdPrCgsLnV83rew5HRERES0eNxpP/Fja0NDgst9isWjx4sXO1dC+/vprPfLII5o2bZpiY2N1wQUX6M033/S4DgAAnB6CIgAAgE7MvfFzoO4RSMOGDdP27dv14Ycf6rbbbtOAAQMkSTU1Nfrkk090ww03aNKkSTp+/HiARwoAQNdHUAQAANCJ5efnt3jcZrM5q4AaK4vcv27tHseOHfN6XWJiovPro0ePtm3AfmIymXTppZfq5ZdfVlZWlvLy8vTKK69o3LhxkqTNmzdrwYIFAR0jAADdAUERAABAJ7Zt2zbZbLZmj3/zzTfOXj3Dhw937u/Xr59zuteGDRtafMbGjRudXze9x5gxY5zVSF9++WX7B+9HaWlpuvXWW7Vu3TqNHTtWkvTxxx+rpqYmwCMDAKBrIygCAADoxIqLi7V48eJmj7/yyivOr+fMmeP82mw265xzzpEkffbZZ8rNzW32Hi+99JLzmpkzZzr3x8fHa+rUqZKkd955R3l5eaf1GfzJYrE4P6fNZlNpaWlgBwQAQBdHUAQAANDJ3XfffV6nj61atUovvPCCJGncuHGaMGGCy/Ef/vCHkiSr1arbb79d9fX1Hvd45ZVX9Omnn0qSLr/8co+m1b/4xS8kSdXV1brqqqtUVlbW7DhbCqNO11dffaV9+/Y1e9xqtWrVqlWSpKioKCUlJfl8DAAABJPm11oFAADAGTt+/LjLkvPNCQ8PV//+/T32jxo1Sjt37tS4ceP08MMPa+LEiaqrq9PSpUv1l7/8RTabTWazWc8++6zHtfPnz9dVV12ld999V59++qkmT56s++67T0OGDFFJSYneeustZ0VSfHy8/vznP3vc4+KLL9btt9+ul19+WWvXrtWwYcN077336uyzz1aPHj1UWFioTZs26e2339aoUaO0aNGi9v9LasGKFSv02GOPafr06Zo/f75GjhyppKQk1dTUaO/evfrnP/+pLVu2SJJuv/12mc38eAsAwJngOykAAIAfPffcc3ruuedaPW/UqFHatm2bx/7Ro0fr3nvv1d133617773X43hISIheffVVTZo0yet9X3vtNdlsNn344YfasmWLbrzxRo9zevbsqSVLlqhXr15e7/H8888rPDxczz77rPLy8vTII480+xn8wW63a9WqVc7KIW8uueQSPfnkk355PgAAwYSgCAAAoJO74447NHz4cP3lL3/R6tWrVVhYqKSkJM2ePVu/+MUvNGzYsGavDQsL0wcffKDFixdr0aJFWr9+vQoLCxUZGalBgwbp0ksv1b333quoqKhm72EymfT3v/9dt956q55//nmtXLlSR44ckdVqVUJCgkaOHKkLLrhA3//+933+2R944AGNHDlSy5cv19atW5WXl6fjx49LklJTUzVx4kTddNNNmj9/vs+fDQBAMDI4HA5HoAcBAAAAV5mZmcrJydHNN9/s8+lcAAAAzaGZNQAAAAAAACQRFAEAAAAAAOAkgiIAAAAAAABIIigCAAAAAADASQRFAAAAAAAAkMSqZwAAAAAAADiJiiIAAAAAAABIIigCAAAAAADASQRFAAAAAAAAkERQBAAAAAAAgJMIigAAAAAAACCJoAgAAAAAAAAnERQBAAAAAABAEkERAAAAAAAATiIoAgAAAAAAgCSCIgAAAAAAAJxEUAQAAAAAAABJBEUAAAAAAAA4iaAIAAAAAAAAkgiKAAAAAAAAcBJBEQAAAAAAACQRFAEAAAAAAOAkgiIAAAAAAABIIigCAAAAAADASQRFAAAAAAAAkCT9f8JGi3HWTbzgAAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -365,12 +277,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 14\n"
+ "Time step 14\n",
+ "RMSE 0.0059840655165866, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFwAAAOOCAYAAAA9KAZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACxIUlEQVR4nOzdd3yV5f3/8ffJTshir4S9QRkyHKCigto6S9WKCmprrdV+bau141dXW1uttVp3WweIW7Eu3Aqy9w6bEMiAELJ3zsm5f38gh9wnJ8lJck7uM17Px4OHua9zn/t87uSAnDfX9blshmEYAgAAAAAAgM9EWF0AAAAAAABAqCFwAQAAAAAA8DECFwAAAAAAAB8jcAEAAAAAAPAxAhcAAAAAAAAfI3ABAAAAAADwMQIXAAAAAAAAHyNwAQAAAAAA8DECFwAAAAAAAB8jcAEAAAAAAPAxAhcAAAAAAAAfI3ABAAAAAADwMQIXAAAAAAAAHyNwAQAAAAAA8DECFwAAAAAAAB8jcAEAAAAAAPAxAhcAAAAAAAAfI3ABAAAAAADwMQIXAAAAAAAAHyNwAQDAx5YsWSKbzSabzaZzzz23yfNOnGOz2Xz22jfeeKPrmvPmzfPZdX0tKyvLVeeAAQOsLqfDBMvPBwAAtB+BCwAgKNx9992mD+iGYbTpOkVFRYqNjeVDLxDg5s2bZwol3X/FxsaqR48emjRpkn7+859r6dKlXl+7YeB34lePHj3kcDi8vkZ9fb169+7d6DpZWVktPjc7O1sPPfSQLrzwQqWnp6tTp06Kjo5WamqqRowYoe9973v6f//v/+mjjz5SRUVFq+6jNb+WLFni9f0CAFqPwAUAEBTmzp3r+vrgwYP69ttv23SdN998U3V1dZKkTp066Yc//KFP6gtn4TpbBdaqq6tTQUGB1q9fr+eee07nnHOOpk+fruzs7DZdr6CgQJ9++qnX53/++ec6cuRIq16jpqZGd999twYOHKg//vGP+uKLL5STk6Oqqio5HA6VlpZq9+7d+vTTT/XXv/5Vl112mbp06aJVq1a19nYAAAEgyuoCAADwximnnKLx48dr06ZNkqRXXnml2eU6TXnllVdcX8+aNUuJiYm+KhGAnyQlJWnOnDmmsZqaGh08eFArVqxQdXW1pOPL+c477zytXr1aXbt2bfXrvPLKK7r00ku9Prc16urqdPnll+uLL75wjcXExGjixIkaPHiwEhISVFZWpqysLG3evNl1T3a7XZWVlV69xpw5c5SUlOR1TX379m3VPQAAWofABQAQNObOnesKXBYuXKhnnnlG8fHxXj9/z549WrNmjel6VmrrsqhQ0J5lYQg/Xbp00dNPP+3xscLCQv385z/X22+/LUnat2+fHnjgAT311FNeX3/UqFHasWOHPvroI5WUlCg1NbXZ80tLS/XBBx+YntuShx9+2BW22Gw23XPPPfrd737n8bXsdruWLFmit99+W2+88YbX9/Hggw8yywwAAghLigAAQWP27NmKjo6WJJWVlen9999v1fMb/ot0v379NH36dF+WB8ACXbt21euvv65Jkya5xl5++WXZ7Xavr3HDDTdIkmpra/XWW2+1eP7bb7+tmpoaSWo088YTu92uxx9/3HX8pz/9SQ8//HCTwU50dLRmzJih//73v8rJydH48eO9uAsAQKAhcAEABI3u3bvr4osvdh23Zkq/YRh69dVXXcc33HCDT3cHAmCdyMhI3XHHHa7jyspKbdiwwevnz549W1FRxyd+e/PnyolzoqOjNXv27BbPX7t2rUpKSlzPufPOO72uLTU1tU3LowAA1iNwAQAElYbLgL788kuvm1Z+++23OnjwoOvY/V+lS0tL9cYbb+jWW2/VlClT1K1bN8XExCg5OVmDBw/Wtddeq7fffltOp9M3N6LWbwv9/vvv6/LLL1ffvn0VGxurtLQ0zZgxQwsWLGjV7iqSVF1drffff1//93//p6lTp6pnz56KiYlRYmKiBgwYoCuvvFIvvviiq8GwJyd2kRk4cKBr7ODBg03uiNJQWxrtrl69WnfccYdGjx6tzp07Ky4uTmlpabrooov09NNPe9Xn4oEHHnC97gMPPCBJcjgceuWVV3TBBRe4vre9e/fWFVdcoY8//tir2vyloqJCTz75pC688EKlpaUpLi5OnTt31pgxY3THHXeYlsi1JDs7Ww8++KDOPvts9ezZU7GxsYqJiVHXrl01duxYzZ49W88991yzv6fsdrteffVV/eAHP9CgQYOUmJioqKgoJSUlaciQIbrwwgt13333ae3atb64/VYZN26c6TgvL8/r5/bo0UMXXXSRJGnlypXav39/k+ceOHBAK1askCRddNFF6t69e4vXz83NdX3dpUuXVvVZAQAEMQMAgCBSW1trdOnSxZBkSDIee+wxr5530003uZ5zxhlnmB5buHChERsb63q8uV9jx441MjMzm32txYsXu84/55xzmjyv4XWbU15ebnzve99rtq6pU6cahw8fNubOnesae/nllz1eb/Xq1UZiYqJX9ztgwABj48aNHq/z8ssve3UNT/d44MAB13j//v2bvf+KigrjmmuuafH6vXv3Nj755JNmr3X//fe7zr///vuNnJwc48wzz2z2ujfddJNRX1/f7HW95c3P54SPPvrI6NWrV4v3PXv2bKOysrLZa/373/824uPjvfo5nXXWWR6vsXv3bmPkyJFe/7z37t3b1m+TYRjm91dL7xHDMIw9e/aYXv+1115r8tyG7z9JRnV1tfH222+7ju+7774mn/vAAw+4znvnnXeM6upq07UOHDjQ6DnvvPOO63GbzWZUVFR48y1okft9eHptAIB1aJoLAAgqMTExuvbaa/XMM89IOj61/9e//nWzz6murta7777rOnZvlnv06FHV1tZKktLS0jRq1Cj16tVLCQkJqqio0M6dO7Vx40YZhqEtW7bo7LPP1ubNmztkmr/dbtf3v/99LV261DXWq1cvnX322UpKStK+ffu0fPlyLV++XFdeeaUGDRrU4jWLi4tVUVEh6fi/7I8ePVppaWnq1KmTqqqqtG/fPq1du1YOh0NZWVk655xztHHjRg0ZMsR0nZEjR+r2229XeXm5a4mFp91k2qOqqkrnnXeeacZEnz59NG3aNCUmJrruv76+XocPH9Zll12mN954w6vtvisqKnTRRRdp+/btSkhI0LRp05Senq7y8nItXrxYR48elXS8H8jw4cP129/+1mf31ZK33npL1113nerr6yUdXzIzdepUDRkyRBUVFVq2bJlrBsfrr7+uAwcO6JtvvlFcXFyja73//vu69dZbXcfJyck644wzlJaWpqioKJWWlmrPnj3avn17kzOaysvLdcEFF7i2XI6IiND48eM1cuRIJSYmqqqqSrm5udqyZYuOHTvm62+HV9xntPTs2bNVz7/sssuUmpqqkpISvfrqq67ZUO5OvNc7d+6sSy+91Kvmz4MHD3Z9bRiG/v73v+vBBx9sVX0AgCBkceADAECrrV271vSvulu3bm32/Ndee811bmxsrFFcXGx6/MMPPzT+9re/Nfsv8pmZmcaFF17ous6Pf/zjJs/15QyXP/3pT6Z/GX/ooYcMh8NhOmf37t3G2LFjDUlGTEyMVzNc/vCHPxjbtm1r8nXz8/ONG264wXWt888/v8lzWzNbpbXPue2221znRUZGGk888USj2SZ79uwxTjvtNNd5ycnJTf5Lf8MZLidmNc2dO9coLCw0nVdZWWlce+21rnMTExN9MivBmxku+/btM81Amjx5cqP3Zn19vfHYY48ZERERrvN+8YtfeLzeuHHjXOfccccdTc6GKS8vN95++23jt7/9baPHnnjiCdc1Ro0aZezatcvjNZxOp7F27VrjtttuMw4dOtTMd6JlrZ3h8vvf/951fnR0tFFUVNTkuZ5muBiGYfz0pz91jS1durTR85YtW+Z6/NZbbzUMw/BqhovT6TQGDBhg+r18/fXXG6tWrTKcTqd33xAv7oMZLgAQWAhcAABBqeHShrvvvrvZcxsGJVdffXWbX7Ours449dRTDUlGXFxckx/ofBW4lJSUGAkJCa5zHnjggSavdfToUaN3796ma7a0ZMUbF198set6O3bs8HiOvwKXffv2mQKFp59+usnrFRUVmT7Q3nTTTR7Paxi4SDKuvfbaJq9ZXV1tpKenu8598803vbq35ngTuMyZM8d1zpAhQ4ySkpImr/fPf/7TdW5ERESj5W7l5eWux9PT09v84X7WrFmu63z55ZdtukZrtSZw2bFjh5GUlOQ6f/bs2c2e31TgsmLFCtfYT37yk0bPu+WWW1yPr1y50jAM7wIXwzCMd99913TeiV9du3Y1vve97xn33Xef8dFHHzUbFLV0H3PmzDFuv/12r3498cQTXr8OAKBtCFwAAEHp4Ycfdn3I6NOnT6NZHyfk5eUZkZGRrnMXLVrUrtd95JFHXNf68MMPPZ7jq8Dl2WefdT2elpZm1NbWNlvbf/7zH58HLm+99Zbrek8++aTHc/wVuPz2t791nTNu3LgWw4KGtcbGxnoMKhoGLjExMcbhw4ebveY999zjOv/Xv/61V/fWnJYCl+LiYlM/offee6/Z69XX1xujR492nf+73/3O9Hhubq7pe9hWM2bMcF1n8+bNbb5Oa7QUuNTU1Bi7d+82/v73vxupqamuc0eMGGEcOXKk2Ws3FbgYhmEMGTLEkGSkpKSYxqurq12vM3ToUNO4t7NMXnjhBSMuLs5j8NJw9svkyZONp556yvT63txHa34192cTAMA36OECAAhK119/vf7whz/I6XQqLy9PX331lS688MJG57322muuPhi9evXyeE5DJSUlWr16tTIyMlRYWKiKigrTzkS7du1yfb1582ZdeumlPrqjxhYvXuz6+pprrlFMTEyz5//oRz/SHXfc0ezOQu6qqqq0evVqbdu2TQUFBSovL3d9vyTz7iqbN2/2vngf+Oabb1xf33jjjS3u5nTllVeqS5cuKioqUm1trVatWuXaecaTqVOnqlevXs1ec/z48a6vs7KyvCu8HVauXOnqJ9StW7cW318RERG6+eabddddd0kyv2dOXCMuLk41NTXavn27VqxYobPOOqvVdaWnp7u+fv755/Xcc8+1+hrtcWL3q+ZEREToiiuu0DPPPNPq/i0N3XDDDbr//vtVWlqqDz74QNdcc40k6YMPPnBt7XzDDTe06do//vGPNWPGDD3yyCN64403VFxc3OgcwzC0du1arV27Vo888ogWLFigc889t623AwCwEIELACAo9e3bVxdccIG++OILSdKCBQs8hiknGlxK0nXXXafIyEiP18vJydHvfvc7vfvuu64PvC3xd3PQTZs2ub4+44wzWjw/KSlJY8aM0caNG1s8t6ioSPfdd59eeeUVlZeXe1VPRzZDNQzDFPCceeaZLT4nOjpakydP1meffSZJ2rhxY7OByymnnNLiNRs2Ri4rK2vx/PZq+DOfPHmyoqJa/qtawwBl06ZNMgzDFU7ExMToiiuu0JtvvimHw6HzzjtP11xzjX74wx/q7LPPVmpqqld1XX311XrppZckHQ9cNmzYoLlz5+rCCy9s1EzZKpdddplefPFFr++pKTfccIMeeOABGYahV155xRW4nPizxGaztTlwkaR+/frpmWee0eOPP641a9Zo2bJlWrdunTZs2OBqSnxCTk6OZsyYoUWLFmnmzJktXvvAgQNeb7MOAPA/AhcAQNCaO3euK3D53//+p4qKCiUmJroe37Rpk7Zt22Y635NNmzbp/PPP9/ivzc3xNqhoq4KCAtfX/fr18+o5/fr1azFwOXjwoM4++2wdOnSoVfX4+34bKi0tld1udx3379/fq+c1/LDZUkCUkpLS4vWio6NdXzesx18a/szbcs91dXUqLy9XcnKya+zxxx/Xhg0btHfvXtXV1WnBggVasGCBIiIiNHr0aE2bNk0zZszQxRdfrNjYWI+vceGFF+oXv/iFnnrqKUnSunXrtG7dOknHdwOaOnWqzj33XF1xxRVKS0tr7W23yH33K4fDoby8PG3atEk5OTmSju/GlJmZqa+//lrdunVr82sNHDhQU6dO1bJly/TFF18oPz9fklx/1kybNs0noUZMTIymTZumadOmucaysrL07rvv6oknnnDNLnM4HJozZ44yMzOVkJDQ7tcFAHScCKsLAACgra688krXB8uqqirT1s+SeXbL+PHjPc5oqK2t1axZs1xhS/fu3fXHP/5RixcvVnZ2tiorK+V0OmUc73uml19+2fXchkuN/OHE1s2SvP6g1alTpxbPmT17titsSUpK0q9+9St99tlnyszMVEVFherr613323CJir/vt6GG9y55d1/u57UUELW0RMUKDe+7LfcsNb7vXr16af369frjH/9oWmrjdDq1bds2Pfvss7ryyivVu3dvPfzww6YlZQ09+eSTeu+99zR58mTTeH5+vhYuXKhf/OIX6tevn374wx+2OsxrSZcuXfT000+7fj3//PP68MMPdeDAAb344ouu7bC3bt3qk23JT4SzDodDr7/+ul5//XU5HA7TY/4wYMAA3X333dqxY4dpGVF+fr7eeustv70uAMA/CFwAAEErPj5eV111let4wYIFrq8dDofeeOMN13FTH5IWLlyoAwcOSDq+TGnLli3685//rHPPPVdpaWlKSEgwfTDvyFkeDWfrVFVVefWcysrKZh9fuXKlVq5c6br+6tWr9c9//lMXXnihBg4cqE6dOiki4uRfDzryfhtqeO9Sy/fl6bykpCSf1tQRGt53W+5Z8nzfycnJ+vOf/6zc3FytXr1ajz76qK644grTTJDi4mL9/ve/16xZs2QYhsfXuvLKK7VmzRodPHhQ8+fP16233qpRo0a5HjcMQwsXLtSECRO0Z88er+pvj6ioKN1888164YUXXGOffvqp5s+f367rXnXVVYqPj5d0PLg9cT33P3P8JTk5WQsWLDAtgVy2bJnfXxcA4FsELgCAoNYwSFmyZImrB8Lnn3/uWgoQHR2t2bNne3z+119/7fr6l7/8pXr37t3s6x08eLC9JXute/furq+9nTHg3gPCXcP7nTt3runDsicdeb8NpaSkmJbzeHv/DRvbtmdZiVXa8jNveM8xMTHNBk2RkZGaMmWK7r77bv3vf/9Tfn6+li1bpssuu8x1zgcffKCFCxc2+5r9+vXTnDlz9PzzzysjI0OHDh3Sgw8+6JqJVVhYqF//+tde1e8L1113neke7r33XtXU1LT5esnJybr88sslHW8WvWXLFknSFVdc0WFBXlpamkaPHu06Pnz4cIe8LgDAdwhcAABBberUqRo0aJCk40skXn31VUnm5UQXX3yx6YNsQ3l5ea6vvWmiunTp0vaU2yoNd8hZvXp1i+dXVFRo+/btzZ7jj/v1x9Icm82mcePGuY5PzMppjsPhcPUVkaQJEyb4vC5/a/gzX7t2bZPLexpq+L0ZP358q34eERERmjp1qt5//33NmDHDNf7hhx96fQ3p+C5G9913n/7zn/+4xr744guvG1D7wt///nfXjJDs7Gw9//zz7bqep6VJvliu1BonlkpJarK/DgAgcBG4AACCms1mM30IWrBggUpLS00fGJvrudBw+UxLy3Y2bNhg+kDvb9OnT3d9/dZbb7XYtPWtt95q8QNua+43Ly9PH3zwQYt1NvxQ6MvGsuedd57r6/nz5ze5zOWE999/X4WFha6avNnZKdCceeaZrg/WBQUFWrRoUbPnO51OU1+hht+z1rDZbKYtqE/MDmuthrNM7Ha7ioqK2nSdthg+fLh+9KMfuY4fffTRdgU+M2fONG0b3rt3b1Mo5W+1tbWmbei9bZwNAAgcBC4AgKA3Z84c17/q79y5U/fcc49rOUGXLl10ySWXNPncE7NjpOb/Vb+qqko//elPfVSxd2bPnu1aopGdna1HHnmkyXMLCwt13333tXhNb++3vr5eP/3pT1VXV9fiNVNTU11BTkFBgc9Cl1tuucV13Y0bN5pmT7grKSnRPffc4zq+9tprvdqFKNCkpqa6tiGWpN/85jfN9tF5+umnXTtxRURENHqPlpeXe/UzlMzL0Xr06GF6zNstwRteIyIiwrStdkf44x//6HrP5OXlmXq7tFZkZKRry+Z169Zp6dKlTW4r35I1a9boH//4h9e9mKTjM3YabkXe3BbnAIDAROACAAh6AwcONG2t2vCD+bXXXquYmJgmn9vwX/Xnz5+vxx57rNEyjn379mnmzJnauHGj1zvH+EJKSoopRLjvvvv0yCOPNKpv7969mjFjhvLy8pq9V0n6/ve/7wqnlixZorvvvlvV1dWmc44cOaJZs2Zp0aJFXt1vbGyshg4dKun4rIb333/fm9tr0eDBg3Xrrbe6ju+44w4988wzjXZLOvHzOdH8ODk52avwKVDdd999rua5e/bs0YUXXqjMzEzTOU6nU//6179MfVJuv/32RtsVb9iwQQMGDNADDzygHTt2eHy9+vp6vfXWW64tn6Xjy/AaOuOMMzR79mx9+umnTQY4e/bsMc0mO//881t8P/raiBEjdPXVV7uOH3nkEa8DJ0+GDBmiiRMnauLEiRoyZEibr1NcXKzf/OY3GjBggH79619r48aNTc7YOnbsmH71q1+Z3sPjx48ncAGAIBRldQEAAPjC3LlzPfYbaWkL15kzZ+rss8/W0qVLZRiG7r77bj3zzDOaMGGCUlJStHfvXq1cuVL19fXq27ev7rzzTlMI4m+///3v9eWXX2rFihUyDEO/+93v9K9//UvnnHOOEhMTtW/fPi1btkz19fWaMmWKBg8erNdff73J640YMUI33HCDq8fNY489ptdff12TJk1Sjx49lJWVpaVLl6qurk5JSUl69NFH9bOf/azFOmfNmqW//vWvko43MJ03b56GDBlianz7j3/8o9X3/49//EPr16/XunXr5HA4dMcdd+jhhx/W1KlTlZiYqP3792vp0qWuECoqKkovvvhio+AhmAwePFgvvPCCrrvuOtXX12vVqlUaPny4pk2bpsGDB6uiokLLli1Tbm6u6zmnn366/v73v3u83uHDh/Xggw/qwQcfVK9evTRu3Dj16tVLUVFRys/P14YNG0y9faZNm2ZamiMdD9LeeOMNvfHGG4qPj9epp56qQYMGKTk5WcXFxcrMzNT69etd58fHx7fp5+0L9957r95++205nU5lZ2dr3rx5HT47rSkFBQV6/PHH9fjjjyslJUWnnXaaevfuraSkJFVUVGjv3r3asGGDawtqSerZs6dee+0103LAptx///2tauo7ffp0zZo1q033AgDwggEAQAgoKyszEhISDEmuXyNHjvTquUeOHDEmTJhgeq77r1GjRhkZGRnGyy+/7BqbO3eux+stXrzYdc4555zT5Os2vH5zSktLjYsuuqjZ+s4880wjLy/PmDt3rmvs5Zdf9ni9yspKY+bMmc1eLy0tzVi+fLnX91JSUmKMGDGi2Ws2dODAAdd4//79m73/8vJy4+qrr2722pKM3r17G5988kmz17r//vtd599///3NnmsY3v8sveXNz+eEjz76yOjZs2eL933ttdcalZWVHq+xevVqIyoqqsVrnPj1wx/+0CgrK2t0nTFjxnh9jYEDBxorVqxo9/eq4e+1lt4j7q666ipTPXa73fR4w/efJKO6urrNdVZXV5uudeDAgUbn7Nq1yzjnnHOMyMhIr7+PkoyLL77YyMzMbPK13e+jtb/uvPPONt83AKBlzHABAISEpKQkXXnllXrttddcYy3NbjmhZ8+eWrlypV544QW9+eab2r59u6qqqtSjRw8NHz5c11xzja677jolJCRo7dq1/rqFJiUnJ+vTTz/Ve++9p3nz5mndunUqKipSt27dNHLkSF133XW6/vrrTbNJmpOQkKBPP/1Ur7/+uubPn69NmzaprKxM3bp106BBgzRr1izdeOON6ty5s5YsWeLVNVNSUrRu3To9++yzWrRokXbu3KmSkhKf9HNJTEzUW2+9pV/+8pdasGCBlixZory8PFVXV6tbt24aM2aMLrnkEt18880duuTL3y655BLt27dPL730kj7++GNlZGTo2LFjio+PV58+fTR9+nTNmTNHU6ZMafIaU6ZM0dGjR/XVV19p+fLl2rRpk/bv36/CwkLV19crOTlZgwcP1umnn67rr79ekydP9nidzZs3a/Xq1Vq8eLHWrl2r3bt3Ky8vT1VVVUpISHDNnLnssst09dVXW76jzr333qt3331XhmHowIEDWrBggW666SbL6hk+fLiWLFmiY8eOacmSJVq+fLm2bdumffv2qbCwUDU1NUpISFDnzp01YsQITZ48WVdffbVXO4kBAAKXzTBaaPkPAAAAAACAVqFpLgAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAAAAAgI9FWV0APKupqdG2bdskSd27d1dUFD8qAAAAAAB8zeFwqKCgQJJ0yimnKC4uzifX5VN8gNq2bZsmT55sdRkAAAAAAISNtWvXatKkST65FkuKAAAAAAAAfIwZLgGqe/furq/Xrl2r3r17W1gNAAAAAACh6fDhw64VJg0/i7cXgUuAatizpXfv3kpLS7OwGgAAAAAAQp8v+6eypAgAAAAAAMDHCFwAAAAAAAB8jMAFAAAAAADAxwhcAAAAAAAAfIzABQAAAAAAwMcIXAAAAAAAAHyMwAUAAAAAAMDHCFwAAAAAAAB8jMAFAAAAAADAxwhcAAAAAAAAfIzABQAAAAAAwMcIXAAAAAAAAHyMwAUAAAAAAMDHCFwAAAAAAAB8jMAFAAAAAADAxwhcAAAAAAAAfIzABQAAAAAAwMcIXAAAAAAAAHyMwAUAAAAAAMDHCFwAAAAAAAB8jMAFAAAAAADAxwhcAAAAAAAAfIzABQAAAAAAwMcIXAAAAAAAAHyMwAUAAAAAAMDHCFwAAAAAAAB8jMAFAAAAAADAxwhcAAAAAAAAfIzABQAAAAAAwMcIXAAAAAAAAHyMwAUAAAAAAMDHCFwAAAAAAAB8jMAFAAAAAADAxwhcAAAAAAAAfIzABQAAAAAAwMcIXAAAAAAAAHyMwAUAAAAAAMDHCFwAAAAAAAB8jMAFAAAAAADAxwhcAAAAAAAAfIzABQAAAAAAwMeirC4ALaux16vGXm91GV6LirApKpIsDwAAAAAQvghcgsC5jy5RVHI3q8tola6dYtQrJU69kuPU87v/9kqOOz6WEqeeyXFKjouSzWazulQAAAAAAHyOwAV+UVhZp8LKOmXklTV5Tnx0pCuUORHC9EqOVa+UeNd496RYRUYQygAAAAAAgguBCyxTba/XgWOVOnCssslzImxS96TvQpjkWPOMmQb/TYjhrQwAAAAACBx8SkVAcxpSflmt8stqtaWZ85LiotTbNUvm5IwZ11hKnLokxCiC2TIAAAAAgA5A4BIEFt52pnr36Wt1GV6rttfrSFmN8ktrdKSsRodLa5RfVqMj3/23sLLO569ZXuNQeU2F9uRXNHlOdKRNPZK+C2E89JXplRynHsmxio2K9Hl9AAAAAIDwQuASBPp2jlda1wSry2iV4b2Smnys1lGvo2W1OvJdCHPku2CmYUiTX1Yje73h05rs9YZyS6qVW1Ld7HldOsW49ZVpHNIkx9PwFwAAAADQNAIXdLjYqEild0lQepemQySn01BRVZ1rVkzDWTInApnDpTUqr3H4vL6iyjoVVdZpx+GmG/7GRUeod0q8err1lWm4hKl7YizbYwMAAABAmCJwQUCKiLCpW2KsuiXGakzflCbPq6pznJwhU2qeJXPiuKC8Vk7fTpZRjd3pVcPfbomx6pEcq9T4GKUkRCsl/viv1BP/TYhWsuvrGKXER6tTTCSzZwAAAAAgyBG4IKglxERpUPdEDeqe2OQ5jnqnjlXU6XBpdYNZMrXfzZKpVn5ZrY6U1qjaXu/T2pyGdLS8VkfLa1v1vKgImyuYORHSnAhojo/FnBxr8HhyfLTiouk/AwAAAACBgMAFIS8qMsLVGLcphmGorMbRaJZMRzT8dedwGiqsrGvTa8VFRzSYRROj5O9m0aQ0mFGTEm/+FRcdqQibTRE2yfbdf48f22SLkOuxCJtNtu/+G/nd18zEAQAAAADPCFwAHQ8OTgQQrWn4e6KXjL8b/nqrxu5Ujf34NtodwWZT02GNzT2sOf51dGSE4mMiFR8defK/330d5/o6QvHRx48TYqJMxw2fd/zxk8cEQAAAAAACBYEL0AptafhbWFGn0mq7SqvtKqmuU2m1QyVVdSpzjdlVVm33eZ+ZjmAYUr1h6PhiLGtvICYyQt0SY9Q9Kfbkr8QTX8epe1KseiQd7wsUH8PSKwAAAAD+ReAC+Ji3DX8bcjoNldc6ToYwVXa3kMau0oZjDb6uqPX9Tk3BqK7eqbzSGuWV1rR4blJslLonxapbo2AmVmmd4zW4e6J6JMUyYwYAAABAmxG4AAEgokGj3PRWPtdR71RZzfFZMydCGE/BTEnV8Zk0rgCn2q4au9Mv9xPoymsdKq91KLOZXaYSY6M0qHsnDerWSYO/a8w8qHsnDezWiebEAAAAAFpE4AIEuajICHXpFKMunWJa/dwae70cTkNOw5DhlJyGoXrju2Pj+LHTOD4D5+Tx8THjxLnfPc/T486GY87jy48c9U5V2+tVVVevGnu9quvqVW0//qvG9bXzu3HHd/91Njq3zuHfsKii1qGtOaXamlNqGrfZpL6p8ccDmG6dNLhHogZ366RB3RPVM5lZMQAAAACOI3ABwlgwz9SodxrHQxh7vapq61VUVaeC8tqTvypqGnxdq6Nltar1QUhjGFJOcbVyiqu1dE+B6bHUhGiNT0/Vaf07a0K/zhqbnqpOsfwxCwAAAIQjPgkACEqRETZ1io06HmgkSv26Nt3IWDo+46ai1mEKYcwBTa2OlNYoq7CyzUutSqrsWry7QIt3Hw9iImzS8F7JmtAvVRP6ddZp/Turf9cEZsEAAAAAYYDABUBYsNlsSoqLVlJctAZ1T2zyPKfT0OGyGu0/WqHMggplHqtUZkGl9hdU6LAXDXlN1zKknYfLtPNwmV5bc0iS1KVTjCb0S9X4fidmwaQoIYY/igEAAIBQw9/yAaCBiAib+qbGq29qvM4e1t30WFWdwxW+ZBZUfhfGHP+62l7v1fWLKuv01c6j+mrnUUlSdKRNE/t30dnDuuvsYd00qncyM2AAAACAEEDgAgBeSoiJ0pi+KY22+3Y6DeWWVGtTdok2HizWpkPFysgrk8NptHhNe72hVZmFWpVZqEc+k7olxursYd10zrDumjqkm7omxvrrdgAAAAD4EYELALRTRIRN6V0SlN4lQZeN7SPp+A5QW3NKtfFQsTYeLNbGQyU6VlHb4rWOVdTqvY25em9jrmw2aUyfFJ09rJvOHtpdE/p3VnRkhL9vBwAAAIAPELgAgB/ERUdq8sAumjywi6TjTXtziqtdAcyGQ8Xaebhc9c3MgjEMaVtuqbblluqZxfuVGBul6SN66LKxfXT2sG6KjQreXaYAAACAUEfgAgAdwGY7OQvm8nF9JUnlNXat2l+opXsLtHTPMR0qqmr2GhW1Dn20JU8fbclTclyULhrTS5eN7aszBndVZAR9XwAAAIBAQuACABZJiovWzNG9NHN0L0lS1rFKLd1boG93F2hVZqGq6ppuxFtW49Db63P09vocdUuM1SWn9talY/toQr9Umu4CAAAAAcBmGEbLXR3R4XJycpSeni5Jys7OVlpamsUVAehItY56bThYrKV7jmnpngLtOFzm1fP6psbr0rF9dOX4vhreK8nPVQIAAADBz1+fvwlcAhSBC4CGjpbX6PPtR/Thljytyyr26jlnDOqqm6cO1HkjerDkCAAAAGiCvz5/s6QIAIJAj6Q43XDGAN1wxgDlllRr0dY8fbglT9tzm575cmK76X5dEnTjmQN01cQ0JcVFd2DVAAAAQPhihkuAYoYLAG9kFlTooy2H9eGWXO0vqGz23MTYKF09MV03njlA/bomdFCFAAAAQGBjSVGYIXAB0BqGYWjH4TJ9uCVPCzfk6lhFbZPn2mzSjJE9dfPUgZoysAtNdgEAABDWWFIEAGiSzWbT6D4pGt0nRb+eMUwfbzmsl1YcUEZe4yVHhiF9sSNfX+zI19j0VN1+7mBdMLKnIujzAgAAAPgMgQsAhJjYqEjNOi1NP5jQV+uyivXS8gP6YscROT3MZ9ySXaKfLtig4T2T9PPpg3XJqX1osAsAAAD4AEuKAhRLigD4UnZRleavzNJb67JVXuto8rwBXRN027mDdeX4NMVERXRghQAAAIA16OESZghcAPhDRa1DCzfk6MXlB3SoqKrJ83qnxOmnZw/Sjyb1U3xMZAdWCAAAAHQsApcwQ+ACwJ8c9U59vPWwnlm8T3uPVjR5XpdOMbpuSj/dcHp/9UiO68AKAQAAgI5B4BJmCFwAdASn09AXO/L1zOJ92pZb2uR50ZE2XXpqH908daDG9E3pwAoBAAAA/2KXIgCAz0VE2HTRmF66cHRPfbunQM8s3qd1WcWNzrPXG3pvU67e25SryQO76OazBmrGqJ402AUAAACaQOACAJDNZtO5w3vo3OE9tPZAkZ5evE9L9xR4PHftgSKtPVCk9C7xunZyP116ah+ld0no4IoBAACAwMaSogDFkiIAVtt9pFwvrzig9zblqs7hbPbcif0767JxffS9U3qrW2JsB1UIAAAAtB89XMIMgQuAQFFYUas31h7SK6sO6mh5bbPnRkbYdNaQbrp8bB/NGN1TyXHRHVQlAAAA0DYELmGGwAVAoKlzOLVoW55eXH5A23PLWjw/MsKmcempmjqkm6YO7aZx6amKjozogEoBAAAA7xG4hBkCFwCByjAMbThYrIUbc/XJtsMqrbZ79bzE2CidPqiLzhrSTdOGdtPg7omy2Wi6CwAAAGsRuIQZAhcAwaDO4dSyvQX6YHOevtyRr2p7vdfP7ZUc5wpfzhzSVT2S4vxYKQAAAOAZ20IDAAJOTFSEzh/ZU+eP7KmqOoe+3JGvDzfnadneY6qrb77R7pGyGi3cmKOFG3MkSSN6JWn6iB76wfi+GtozqSPKBwAAAPyGwAUA4BMJMVG6fFxfXT6ur6rqHFqXVazlewu0bO8x7TpS3uLzdx0p164j5XpuyX6NTU/VD09L02Wn9lFKAo13AQAAEHwIXAAAPpcQE6VzhnXXOcO6S5IKymu1cv8xLdt7TMv3HtORsppmn78lu0Rbskv05493aMaonvrRpHRNHdKNni8AAAAIGgQuAAC/654U65r9YhiG9hdUavneAi3fV6jVmYWqqHV4fF6dw6lFWw9r0dbDmtAvVXfPHK4zh3Tr4OoBAACA1iNwAQB0KJvNpiE9EjWkR6JuPGug7PVObcku0Rc78vW/TbkqKK/1+LyNh0o0+4U1OmNQV901c5gmDujSwZUDAAAA3mOXogDFLkUAwpGj3qmlewv07oYcfbXjaLONd88Z1l2/uXC4xvRN6cAKAQAAEGrYpQgAEPKiIiN03oieOm9ETxVX1unDLXn677JM5RRXNzr32z0FWra3QNef3l93zRyulHia6wIAACBwRFhdAAAAnnTuFKO5Zw7QN3edq4euHKNeyXGNznEa0iurDur8x5Zo4YYcMWkTAAAAgYLABQAQ0GKiInTdlP5a8ptzdf+lo9QtMbbROccq6nTXO1t09b9XadeRMguqBAAAAMwIXAAAQSEuOlI3nTVQS+85V3fNGKbYqMb/C1uXVaxLnlyuf365R3WOpvu/AAAAAP5G4AIACCoJMVH6xflD9dWvz9EFI3s2etzhNPTk13t12dPLtT231IIKAQAAAAIXAECQSu+SoBfmTtSLcycqvUt8o8d3HSnXFc+sYLYLAAAALEHgAgAIaueP7Kkvf3WOfnHeEEVF2EyPNZztsie/3KIKAQAAEI4IXAAAQS8uOlJ3zRyu928/SyN6JTV6fNeRcl361HK9tuYgOxkBAACgQxC4AABCxpi+Kfrwjqn6v/OHNprtUutw6v/9b7tue3WjSqrqLKoQAAAA4YLABQAQUmKiIvTrGcOanO3yWcYRfe9fy7Quq8iC6gAAABAuCFwAACFpTN8UvX/7WbrxzAGNHssrrdGP/rNa81dmscQIAAAAfkHgAgAIWXHRkXrgstF6Yc5EdU6INj1W7zR0/4cZ+t3Cbap11FtUIQAAAEIVgQsAIORdMKqnPr3zbJ0+qEujx95an61r/7NaR8trLKgMAAAAoYrABQAQFnqlxOm1n5yuO6YPafTYxkMluuypFdqeW2pBZQAAAAhFBC4AgLARGWHT3RcO1zOzJyg+OtL02JGy431d1mQWWlQdAAAAQgmBCwAg7Hz/1N5aeNuZ6psabxqvqHVozktrtXj3UYsqAwAAQKggcAEAhKVRfZL14R1nacpAc1+XWodTt8xfr4+35llUGQAAAEIBgQsAIGx1TYzV/Jsna8aonqZxh9PQ/72xSW+tO2RRZQAAAAh2BC4AgLAWFx2pZ6+boCvH9zWNOw3ptwu36e312RZVBgAAgGBG4AIACHvRkRF67KqxuuH0/o0e++3Crfpgc64FVQEAACCYEbgAACApIsKmP10+Wj8/d7Bp3DCkX7+9RZ9tP2xRZQAAAAhGBC4AAHzHZrPpNxcO121uoUu909Av3tikxbvYvQgAAADeIXABAKABm82mey4crpvOGmAat9cbuvXVDVqx75g1hQEAACCoELgAAODGZrPpvktG6drJ/UzjdQ6nfjJ/vdYeKLKoMgAAAAQLAhcAADyw2Wx66Iox+sEE8+5F1fZ63TxvnTZnl1hTGAAAAIICgQsAAE2IiLDp77NO1fdP7W0ar6h1aM6La7Q9t9SiygAAABDoCFwAAGhGVGSEnrhmnGaM6mkaL6tx6IYX1ygjj9AFAAAAjRG4AADQgujICD09e7zOGdbdNF5cZdfs/67RFpYXAQAAwA2BCwAAXoiNitS/bzhNZwzqahovrbbr+hfWaH0WjXQBAABwEoELAABeiouO1AtzJ+r0QV1M4+W1Ds15aa1W7mfLaAAAABxH4AIAQCt0io3SyzdO1rSh3UzjVXX1uunldfpyR75FlQEAACCQELgAANBK8TGR+u+cibpgZA/TeK3DqVsXrNfb67ItqgwAAACBgsAFAIA2iIuO1LPXnaaLx/QyjTsN6Z6FW/Xskn0yDMOi6gAAAGA1AhcAANooJipCT107XldPTGv02N8/260/f7xTTiehCwAAQDgicAEAoB2iIiP0yKxTddu5gxs99tKKA/r125tV53BaUBkAAACsROACAEA72Ww2/faiEbr3klGNHnt/c55+8sp6VdY6LKgMAAAAViFwAQDAR348daCeuGacoiJspvGlewo0+4U1Kq2yW1QZAAAAOhqBCwAAPnTF+L56Ye5ExUdHmsa3ZJdozktrVFZD6AIAABAOCFwAAPCxc4f30Ou3TFHnhGjT+JacUs19aa3KCV0AAABCHoELAAB+ML5fZ73zszPVMznWNL7pUIluenkdPV0AAABCHIGLF3Jzc/XEE09o5syZ6tevn2JiYtSrVy/NmjVLa9assbo8AECAGtIjUW/ccrq6J5lDl/UHi/XTBevZvQgAACCEEbh44amnntKvfvUrZWZmaubMmbrrrrs0depUffDBBzrzzDP11ltvWV0iACBADep+PHTplhhjGl+xr1C/f2+bDMOwqDIAAAD4k83gb3oteu+999S1a1edc845pvFly5bp/PPPV2Jiog4fPqzY2NgmrtB6OTk5Sk9PlyRlZ2crLS3NZ9cGAHS8Pfnl+tF/Vquoss40/qsLhunOC4ZaVBUAAAD89fmbGS5e+MEPftAobJGkadOmafr06SouLta2bdssqAwAECyG9UzSvJsmNdq96PGv9mjhhhyLqgIAAIC/+D1wOXr0qD7++GPdd999uvjii9WtWzfZbDbZbDbdeOONrbrWwYMHddddd2nEiBHq1KmTunTpokmTJunRRx9VVVWVf26gBdHRx3egiIqKsuT1AQDB49S0VD157XhF2Mzjv124VSv3HbOmKAAAAPiF31OCnj17+uQ6H330ka6//nqVlZW5xqqqqrR+/XqtX79eL7zwghYtWqQhQ4b45PW8cejQIX311Vfq3bu3TjnllA57XQBA8Joxqqfuv3S07v8wwzXmcBq69dUNWnjbmRrWM8nC6gAAAOArHbqkqF+/fpo5c2arn7dp0yZdc801KisrU2Jioh566CGtXLlSX3/9tW655RZJ0p49e/T9739f5eXlvi7bI7vdrhtuuEG1tbV65JFHFBkZ2fKTAACQNPfMAfrx1IGmsfIah256eZ2OltdYVBUAAAB8ye8zXO677z5NmjRJkyZNUs+ePZWVlaWBAwe2/MQG7rzzTlVXVysqKkpffPGFzjjjDNdj5513noYOHap77rlHe/bs0WOPPaYHHnig0TXuuusu1dbWtuo1hw713MTQ6XTqxhtv1NKlS3XLLbfohhtuaNX9AADwh++NVE5xlT7PyHeN5ZZU68fz1uutW09XQgxLVQEAAIJZh+9S1DBwmTt3rubNm9fs+WvXrtWUKVMkSbfeequef/75Ruc4nU6NGTNGO3fuVGpqqo4ePerqrXJCYmKiKisrva5z8eLFOvfccz2+1s0336z58+fr+uuv1/z58xUR4fuJQuxSBAChr7quXtf+d7U2Z5eYxmeO6qnnrz9NEe7NXgAAAOBzYbtL0fvvv+/6+qabbvJ4TkREhObMmSNJKikp0eLFixudU1FRIcMwvP7VVNhy0003af78+br22ms1b948v4QtAIDwEB8TqRfmTlS/Lgmm8S925OuRz3dZVBUAAAB8IeDTguXLl0uSOnXqpNNOO63J8xpu27xixQqf13EibHnllVd0zTXXaMGCBfRtAQC0W7fEWL180ySlxJtnZv7720y9te6QRVUBAACgvQI+cNm5c6ckaciQIc1uvTxixIhGz/GVE8uIXnnlFV111VV69dVXCVsAAD4zuHuinrt+gqLclhD9v/9t16r9hRZVBQAAgPYI6I58NTU1OnbsmCS1uIaqc+fO6tSpkyorK5Wdne3TOv70pz9p/vz5SkxM1LBhw/SXv/yl0TlXXHGFxo0b5/U1c3Jymn388OHDrS0TABDEzhzcTX+5Yox+994215jDaehnr27Q/35+pgZ1T7SwOgAAALRWQAcuDbd4Tkxs+S+aJwKXiooKn9aRlZUl6XgfmIceesjjOQMGDGhV4HKiIQ8AACf8aHI/ZR6r1H+WZrrGSqvt+vH89frfz89UakKMhdUBAACgNQJ6SVFNTY3r65iYlv+SGRsbK0mqrq72aR3z5s1rscnujTfe6NPXBACEp99eNEIzRvU0jR04VqmfvbpBdQ6nRVUBAACgtQJ6hktcXJzr67q6uhbPr62tlSTFx8f7rSZfaWnZ0+HDhzV58uQOqgYAECgiI2z614/G6arnVykjr8w1vjqzSH98f5semXWqbDa2iwYAAAh0AR24JCUlub72ZplQZWWlJO+WH1nNV/t6AwBCT0JMlF6YO1FXPLNC+WW1rvG31+docPdE3XrOYAurAwAAgDcCeklRXFycunbtKqnlJrPFxcWuwIX+KACAYNc7JV4vzJmk+GjzrngPf7ZLn2ccsagqAAAAeCugAxdJGjVqlCRp3759cjgcTZ63a9cu19cjR470e10AAPjbKWkpevyacWq4gsgwpF++uVkZeaXWFQYAAIAWBXzgMnXqVEnHlwtt2LChyfO+/fZb19dnnXWW3+sCAKAjXDSml3570QjTWLW9Xre9ulGl1XaLqgIAAEBLAj5wueKKK1xfv/zyyx7PcTqdeuWVVyRJqampmj59ekeUBgBAh7j17EG6eqK599ehoird/c4WGYZhUVUAAABoTsAHLpMnT9a0adMkSS+++KJWrVrV6JzHHntMO3fulCTdeeedio6O7tAaAQDwJ5vNpr9ccYrG90s1jX+5I1//XpppTVEAAABolt93KVq+fLn27dvnOj527Jjr63379mnevHmm82+88cZG1/jXv/6ls846S9XV1Zo5c6b+8Ic/aPr06aqurtabb76p//znP5KkYcOG6a677vLLfQAAYKWYqAg9M3uCLnlquYoq61zjf/9sl8alp+r0QV0trA4AAADubIaf5yLfeOONmj9/vtfnN1XORx99pOuvv15lZWUeHx82bJgWLVqkIUOGtKnOQJOTk+PabSk7O5tt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npKk3/zmN4qNjdWyZcu0c+dOlZWVNagmAABgG4ELAABo8Tp16uTwvJeXl9q3by9JunTpkvV49c/O2qi+Nkz1+7Kysqyfq480qY+2bds6PO/hUfVXu4qKihrHvb29FRcXZ9296JtvvtGiRYs0atQohYSE6Pbbb9d7771X6z4AAFB/BC4AAKDF++kCs+5qw5369OmjAwcO6OOPP9bs2bMVFRUlSSouLtZnn32mhx56SMOGDdPFixfdXCkAAC0DgQsAAGjxLly44PC82Wy2jkq5MtLlp5+dtXH+/Hmb93Xs2NH6+dy5c64V3Eg8PT119913a9WqVUpJSVFGRoZWr16twYMHS5K+/fZbPf74426tEQCAloLABQAAtHj79++X2Wy2e/7f//63dS2Tvn37Wo/37NnTOo3n66+/dviM6ttJV29j0KBB1tExX331Vd2Lb0RhYWGaNWuWkpKSdMMNN0iSPv30UxUXF7u5MgAAmj8CFwAA0OJdunRJcXFxds+vXr3a+vnWW2+1fvby8tKYMWMkSZ9//rnS09PttrFy5UrrPTfffLP1ePv27XXjjTdKkj744ANlZGTU6x0ak7e3t/U9zWazLl++7N6CAABoAQhcAABAqzBv3jyb04K2bdumt956S5I0ePBgDR06tMb5X/3qV5KksrIyzZkzR+Xl5bXaWL16tTZv3ixJuvfee2stjvvss89KkoqKinTfffcpNzfXbp2OQp362r59u1JTU+2eLysrs25/HRAQoNDQUMNrAACgtbG/PyIAAEATcfHixRpbLdvTpk0bXXvttbWODxgwQN9//70GDx6shQsXKjY2VqWlpdq4caNeffVVmc1meXl56Y033qh176RJk3Tffffp//7v/7R582YNHz5c8+bNU0xMjHJycrRhwwbrCJn27dvrlVdeqdXGXXfdpTlz5mjVqlXatWuX+vTpo7lz52rkyJEKCgpSVlaWkpOT9f7772vAgAFau3Zt3f8hObB161b94Q9/0OjRozVp0iT1799foaGhKi4u1rFjx/S3v/1Ne/fulSTNmTPH4RbaAADANXw3BQAATd6KFSu0YsUKp9cNGDBA+/fvr3V84MCBmjt3rp544gnNnTu31nkfHx+tW7dOw4YNs9nu+vXrZTab9fHHH2vv3r2aNm1arWvCw8MVHx+va665xmYbb775ptq0aaM33nhDGRkZWrRokd13aAyVlZXatm2bdSSLLT//+c+1bNmyRnk+AACtDYELAABoFR555BH17dtXr776qnbs2KGsrCyFhoZq3LhxevbZZ9WnTx+79/r5+emjjz5SXFyc1q5dq927dysrK0v+/v6Kjo7W3Xffrblz5yogIMBuG56envrf//1fzZo1S2+++aYSExN19uxZlZWVqUOHDurfv79uv/12Pfzww4a/+9NPP63+/ftry5Yt2rdvnzIyMqzbP3fp0kWxsbGaPn26Jk2aZPizAQBorUwWi8Xi7iIAAAAaQ2RkpNLS0jRjxgzDp+kAAAA4wqK5AAAAAAAABiNwAQAAAAAAMBiBCwAAAAAAgMEIXAAAAAAAAAxG4AIAAAAAAGAwdikCAAAAAAAwGCNcAAAAAAAADEbgAgAAAAAAYDACFwAAAAAAAIMRuAAAAAAAABiMwAUAAAAAAMBgBC4AAAAAAAAGI3ABAAAAAAAwGIELAAAAAACAwQhcAAAAAAAADEbgAgAAAAAAYDACFwAAAAAAAIMRuAAAAAAAABiMwAUAAAAAAMBgBC4AAAAAAAAGI3ABAAAAAAAwGIELAAAAAACAwQhcAAAAAAAADEbgAgAAAAAAYDACFwAAAAAAAIP9f3tS4K3YNIKVAAAAAElFTkSuQmCC",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAAr5lJREFUeJzs3Xd8VfX9x/H3TW72JGQvVtgbGbIERBA3iqPirrW21U6tHT/r6NS2trbOtloHKop74B7Ikr03AQJZZO+d3PP7g3LJuVk3yU3uTfJ6Ph55mPM933Pu5xAMue98h8UwDEMAAAAAAABwCS93FwAAAAAAANCbELYAAAAAAAC4EGELAAAAAACACxG2AAAAAAAAuBBhCwAAAAAAgAsRtgAAAAAAALgQYQsAAAAAAIALEbYAAAAAAAC4EGELAAAAAACACxG2AAAAAAAAuBBhCwAAAAAAgAsRtgAAAAAAALgQYQsAAAAAAIALEbYAAAAAAAC4EGELAAAAAACACxG2AAAAAAAAuBBhCwAAAAAAgAsRtgAAAAAAALgQYQsAAAAAAIALEbYAAOBiq1atksVikcVi0dy5c1vsd7qPxWJx2WvffPPN9ns+//zzLruvq6WlpdnrHDhwoLvL6TY95esDAAA6h7AFANAj3H333aY354ZhdOg+hYWF8vPz4w0v4OGef/55UyDp+OHn56fo6GhNmTJFP/jBD7R69Wqn79047Dv9ER0drfr6eqfv0dDQoLi4uCb3SUtLa/Pa9PR0/eEPf9D555+vpKQkBQUFycfHR+Hh4RoxYoQuvPBC/d///Z/ef/99lZeXt+s52vOxatUqp58XANA+hC0AgB7hpptusn9+/Phxff311x26z6uvvqra2lpJUlBQkK688kqX1NeX9dVRKnCv2tpa5eXlacuWLXrqqac0Z84czZs3T+np6R26X15enj766COn+3/yySc6efJku16jurpad999twYNGqR7771Xn376qTIyMlRZWan6+nqVlJTo4MGD+uijj/THP/5Rl156qSIiIvTNN9+093EAAG5mdXcBAAA4Y+zYsZo4caK2b98uSXrxxRdbnaLTkhdffNH++ZIlSxQcHOyqEgF0kZCQEN14442mturqah0/flzr1q1TVVWVpFNT+M4991xt2LBB/fv3b/frvPjii7rkkkuc7tsetbW1uuyyy/Tpp5/a23x9fTV58mQNGTJEgYGBKi0tVVpamnbs2GF/prq6OlVUVDj1GjfeeKNCQkKcrikhIaFdzwAAcB5hCwCgx7jpppvsYcubb76pJ554QgEBAU5ff+jQIW3cuNF0P3fq6FSo3qAzU8HQ90REROjxxx9v9lxBQYF+8IMfaMWKFZKk1NRUPfDAA3rsscecvv+oUaO0b98+vf/++youLlZ4eHir/UtKSvTuu++arm3LQw89ZA9aLBaL7rnnHv3yl79s9rXq6uq0atUqrVixQsuXL3f6OR588EFGlwGAh2AaEQCgx1i6dKl8fHwkSaWlpXrnnXfadX3j30QnJydr3rx5riwPgBv0799fr7zyiqZMmWJve+6551RXV+f0PW644QZJUk1NjV577bU2+69YsULV1dWS1GTETXPq6ur097//3X7829/+Vg899FCLoY6Pj48WLFig//znP8rIyNDEiROdeAoAgCchbAEA9BhRUVG64IIL7MftGcZvGIZeeukl+/ENN9zg0l2AALiPt7e37rzzTvtxRUWFtm7d6vT1S5culdV6asC3M99XTvfx8fHR0qVL2+y/adMmFRcX26/58Y9/7HRt4eHhHZoSBQBwL8IWAECP0njqz2effeb0ApVff/21jh8/bj92/G10SUmJli9frttvv13Tpk1TZGSkfH19FRoaqiFDhujaa6/VihUrZLPZXPMgav/Wz++8844uu+wyJSQkyM/PT4mJiVqwYIGWLVvWrl1UJKmqqkrvvPOOfvSjH2nWrFmKiYmRr6+vgoODNXDgQF1++eV69tln7YsJN+f0bjGDBg2ytx0/frzFnU8a68iiuhs2bNCdd96p0aNHq1+/fvL391diYqIWLVqkxx9/3Kl1LR544AH76z7wwAOSpPr6er344os677zz7H+2cXFxWrx4sT744AOnausq5eXl+uc//6nzzz9fiYmJ8vf3V79+/TRmzBjdeeedpmlxbUlPT9eDDz6oc845RzExMfLz85Ovr6/69++v8ePHa+nSpXrqqada/X+qrq5OL730kq644goNHjxYwcHBslqtCgkJUUpKis4//3zdd9992rRpkysev10mTJhgOs7KynL62ujoaC1atEiStH79eh05cqTFvseOHdO6deskSYsWLVJUVFSb98/MzLR/HhER0a51VQAAPZQBAEAPUlNTY0RERBiSDEnGI488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3LlztXjxYiUmJrb3sdvkuMtVfX29srKytH37dmVkZEg6tevS0aNH9cUXXygyMrLDrzVo0CDNmjVLa9as0aeffqqcnBxJsn+vmT17tksCDV9fX82ePVuzZ8+2t6WlpemNN97Qo48+ah9VVl9frxtvvFFHjx5VYGBgp18XANA9vNxdAAAAHXX55Zfb31RWVlaatneWzKNaJk6c2OxIhpqaGi1ZssQetERFRenee+/VV199pfT0dFVUVMhms8k4tc6ZnnvuOfu1jacXdYXT2zNLcvpNVlBQUJt9li5dag9aQkJC9NOf/lQff/yxjh49qvLycjU0NNift/G0lK5+3sYaP7vk3HM59msrHGprWoo7NH7ujjyz1PS5Y2NjtWXLFt17772m6TU2m027d+/Wk08+qcsvv1xxcXF66KGHTNPIGvvnP/+pt956S1OnTjW15+Tk6M0339QPf/hDJScn68orr2x3kNeWiIgIPf744/aPp59+Wu+9956OHTumZ5991r7l9a5du1yy9fjpYLa+vl6vvPKKXnnlFdXX15vOdYWBAwfq7rvv1r59+0xTh3JycvTaa6912esCAFyPsAUA0GMFBAToqquush8vW7bM/nl9fb2WL19uP27pDdKbb76pY8eOSTo1NWnnzp363e9+p7lz5yoxMVGBgYGmN+XdObqj8SidyspKp66pqKho9fz69eu1fv16+/03bNigv/3tbzr//PM1aNAgBQUFycvrzI8H3fm8jTV+dqnt52quX0hIiEtr6g6Nn7sjzyw1/9yhoaH63e9+p8zMTG3YsEF/+ctftHjxYtMIkKKiIv3qV7/SkiVLZBhGs691+eWXa+PGjTp+/LheeOEF3X777Ro1apT9vGEYevPNNzVp0iQdOnTIqfo7w2q16tvf/raeeeYZe9tHH32kF154oVP3veqqqxQQECDpVGh7+n6O33O6SmhoqJYtW2aa9rhmzZouf10AgOsQtgAAerTGIcqqVavsax588skn9uH/Pj4+Wrp0abPXf/HFF/bPf/KTnyguLq7V1zt+/HhnS3ZaVFSU/XNnRwo4rvngqPHz3nTTTaY3ys3pzudtLCwszDSFx9nnb7yIbWemkrhLR77mjZ/Z19e31ZDJ29tb06ZN09133623335bOTk5WrNmjS699FJ7n3fffVdvvvlmq6+ZnJysG2+8UU8//bT27t2rEydO6MEHH7SPwCooKNDPfvYzp+p3heuuu870DL/5zW9UXV3d4fuFhobqsssuk3RqYeidO3dKkhYvXtxtIV5iYqJGjx5tP87Ozu6W1wUAuAZhCwCgR5s1a5YGDx4s6dS0iJdeekmSeQrRBRdcYHoT21hWVpb9c2cWTF29enVnym2XxjvhbNiwoc3+5eXl2rNnT6t9uuJ5u2I6jsVi0YQJE+zHp0fjtKa+vt6+jogkTZo0yeV1dbXGX/NNmza1OKWnscZ/NhMnTmzX18PLy0uzZs3SO++8owULFtjb33vvPafvIZ3arei+++7Tv//9b3vbp59+6vRi067w5z//2T4SJD09XU8//XSn7tfcdCRXTFFqj9PToyS1uJ4OAMAzEbYAAHo0i8ViegO0bNkylZSUmN4strbGQuMpM21N1dm6davpzXxXmzdvnv3z1157rc0FWl977bU239y253mzsrL07rvvtlln4zeErlxE9txzz7V//sILL7Q4teW0d955RwUFBfaanNnBydPMmDHD/qY6Ly9PK1eubLW/zWYzrSPU+M+sPSwWi2mb6dOjwtqr8eiSuro6FRYWdug+HTF8+HB961vfsh//5S9/6VTYs3DhQtPW4HFxcaZAqqvV1NSYtpp3dpFsAIBnIGwBAPR4N954o/23+fv379c999xjn0IQERGhiy++uMVrT4+KkVr/bX5lZaW++93vuqhi5yxdutQ+LSM9PV0PP/xwi30LCgp03333tXlPZ5+3oaFB3/3ud1VbW9vmPcPDw+0hTl5enssCl9tuu81+323btplGTTgqLi7WPffcYz++9tprndptyNOEh4fbtxqWpJ///Oetrpvz+OOP23fc8vLyavJ3tKyszKmvoWSeghYdHW065+y2343v4eXlZdo6uzvce++99r8zWVlZprVc2svb29u+LfPmzZu1evXqFreOb8vGjRv117/+1em1l6RTI3Uabzfe2jbmAADPQ9gCAOjxBg0aZNo+tfGb8muvvVa+vr4tXtv4t/kvvPCCHnnkkSZTN1JTU7Vw4UJt27bN6R1iXCEsLMwUINx33316+OGHm9R3+PBhLViwQFlZWa0+qyRddNFF9mBq1apVuvvuu1VVVWXqc/LkSS1ZskQrV6506nn9/Pw0dOhQSadGM7zzzjvOPF6bhgwZottvv91+fOedd+qJJ55osivS6a/P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3759tWnTJpfzy5cvd670GDp0qFasWKF69eq59PnnP/+pxx57TJJ033336eOPP3Y5/+WXX+quu+6SJPXv318rVqxQaGio28+QkpKi8PBw53HRlS2SNHnyZL3//vuy2Wwu102ePFnz5s2TJG3btk3XXnut89z333+voUOHSip95YrD4VB2drYaNmzo9jwAACgfwhYAAOCVioYt5XXkyBFFREQ4j4uGLZ9++qnuuecet9c98cQTevfddyVdeq5L0dUtd9xxh1auXCl/f38dOnTIJQgpatiwYVq1apX8/Px09OhRhYWFOc/dcMMNSkhIUIMGDZSYmKjWrVuX+zMVDVvCwsJ05MgRBQQEFOv3888/q3PnzpKkt99+W7/73e+c5xYvXqyHHnpIkpSRkUGYAgBANeMBuQAAoNZr3Lixc2WJOxMnTnS+XrVqlfO1w+FQXFycJGn48OElBi3SpZUll69Zu3ats/3MmTPasGGDJGnMmDEVClqudO+997oNWqRLq3qCg4MlSYcPH3Y5VzT4WbhwYaXfHwAAlA9hCwAA8HqzZs2SYRhl/im6qqWoa6+9Vn5+JT+qLioqynlr0K5du5zthw8fVnZ2tiTp+uuvL7XGoud3797tfL1jxw7nA3EHDRpU+gctw+WVKyVp3LixJOnChQsu7QMHDlSHDh0kSU899ZSio6P1yiuv6Mcff1R+fn6VagIAAMURtgAAgFqvRYsWpZ738/NTkyZNJElnz551thd9XdYYRZ8FU/S69PR05+uiK0wqo0GDBqWe9/G59E+7goICl3Z/f38tW7bMuUvR5s2bNXPmTA0cOFChoaG67bbbtHjx4mLXAQCAyiFsAQAAtd6VD5O1agwrde3aVbt27dLnn3+uiRMnqmPHjpKknJwcffPNN3rooYd0/fXX69SpUxZXCgBAzUfYAgAAar2TJ0+Wet7hcDhXo1xe4XLl67LGOHHihNvrmjVr5nydlpZWvoKria+vr0aNGqX58+crMTFRx48f14IFC9S7d29J0tatWzVlyhRLawQAoDYgbAEAALXejh075HA4Sjz/008/OZ9d0r17d2d7hw4dnLfubNy4sdT3KLpldNExrr32WueqmB9++KHixVejsLAwTZgwQQkJCbruuuskSV999ZVycnIsrgwAgJqNsAUAANR6Z8+e1bJly0o8v2DBAufrW265xfnaz89PN910kyTpu+++U2pqaoljzJs3z3nN4MGDne1NmjTRDTfcIElaunSpjh8/XqnPUJ38/f2dn9PhcOj8+fPWFgQAQA1H2AIAAOqEp59+2u2tQHFxcfrggw8kSb1791bfvn1dzv/mN7+RJOXn52vSpEmy2+3FxliwYIG+/fZbSdLdd99d7EG4f/jDHyRJ2dnZGj16tDIyMkqss7RAp7LWrVungwcPlng+Pz/fucV1cHCwmjdvbnoNAADUJSXvgQgAAOAlTp065bKdcknq16+vq6++ulh7r169tHfvXvXu3VszZsxQdHS08vLytGLFCr355ptyOBzy8/PTO++8U+zaESNGaPTo0frkk0/07bffql+/fnr66afVuXNnnTt3TkuWLHGujGnSpIneeOONYmOMHDlSkyZN0vz58xUfH6+uXbtq6tSpGjBggBo2bKj09HRt2bJFH3/8sXr16qWYmJiK/0cqxerVq/WXv/xFgwYN0ogRI9SzZ081b95cOTk5OnDggN577z1t27ZNkjRp0qRSt8kGAABl45sUAAB4vXfffVfvvvtumf169eqlHTt2FGuPiorS1KlT9fjjj2vq1KnFzterV0+LFi3S9ddf73bc2NhYORwOff7559q2bZvGjh1brE/r1q21fPlytWnTxu0Y77//vurXr6933nlHx48f18yZM0v8DNWhsLBQcXFxzhUs7tx111165ZVXquX9AQCoSwhbAABAnfDoo4+qe/fuevPNN7V+/Xqlp6erefPmGjp0qP7whz+oa9euJV4bGBio//znP1q2bJliYmK0YcMGpaenKygoSJGRkRo1apSmTp2q4ODgEsfw9fXV3//+d02YMEHvv/++1q5dq2PHjik/P19NmzZVz549ddttt+nhhx82/bM/88wz6tmzp1atWqXt27fr+PHjzi2eW7VqpejoaD3yyCMaMWKE6e8NAEBdZDMMw7C6CAAAgOoQERGh5ORkjRs3zvRbcwAAAErCA3IBAAAAAABMRNgCAAAAAABgIsIWAAAAAAAAExG2AAAAAAAAmIiwBQAAAAAAwETsRgQAAAAAAGAiVrYAAAAAAACYiLAFAAAAAADARIQtAAAAAAAAJiJsAQAAAAAAMBFhCwAAAAAAgIkIWwAAAAAAAExE2AIAAAAAAGAiwhYAAAAAAAATEbYAAAAAAACYiLAFAAAAAADARIQtAAAAAAAAJiJsAQAAAAAAMBFhCwAAAAAAgIkIWwAAAAAAAExE2AIAAAAAAGAiwhYAAAAAAAATEbYAAAAAAACYiLAFAAAAAADARIQtAAAAAAAAJvp/0R7aH+GCLp4AAAAASUVORK5CYII=",
"text/plain": [
""
]
@@ -383,12 +296,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 15\n"
+ "Time step 15\n",
+ "RMSE 0.002279931234061807, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFwAAAOOCAYAAAA9KAZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACth0lEQVR4nOzdd3gc1dn+8XvVu2S525J7t8E2uFBswIAxJYAJLVQDCeElkBBKSHkJNeQHIQRCSXgJBIzpvZkO7r33XmTJcpFk9bplfn8IrzXSSlpJuztbvp/r8mXN2dnZZyRhtLfOeY7NMAxDAAAAAAAA8JkoqwsAAAAAAAAINwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAD42Ny5c2Wz2WSz2XTGGWc0e97Rc2w2m89e+4YbbnBf89VXX/XZdX1t79697jr79etndTkBEypfHwAA0HEELgCAkHDPPfeY3qAbhtGu6xw5ckTx8fG86QWC3KuvvmoKJRv/iY+PV7du3TR+/Hj96le/0vz5872+dsPA7+ifbt26yeFweH0Np9Opnj17NrnO3r17W31ubm6uHn30UU2bNk3Z2dlKTk5WbGysMjIyNGzYMJ1//vn63//9X3322WeqqKho03205c/cuXO9vl8AQNsRuAAAQsKMGTPcH+fk5GjevHntus7bb7+turo6SVJycrIuu+wyn9QXySJ1tgqsVVdXp4KCAq1cuVL//ve/dfrpp2vKlCnKzc1t1/UKCgr05Zdfen3+119/rYMHD7bpNWpqanTPPfeof//+uu+++/TNN98oLy9PVVVVcjgcKi0t1bZt2/Tll1/qr3/9qy666CJlZmZqyZIlbb0dAEAQiLG6AAAAvHHcccdp7NixWrNmjSTptddea3G5TnNee+0198eXXnqpUlJSfFUiAD9JTU3V9ddfbxqrqalRTk6OFi1apOrqakn1y/nOPPNMLV26VJ07d27z67z22mu68MILvT63Lerq6nTxxRfrm2++cY/FxcVp3LhxGjhwoJKSklRWVqa9e/dq7dq17nuy2+2qrKz06jWuv/56paamel1T796923QPAIC2IXABAISMGTNmuAOXDz74QM8//7wSExO9fv727du1bNky0/Ws1N5lUeGgI8vCEHkyMzP13HPPeXysqKhIv/rVr/Tuu+9Kknbu3KkHH3xQzz77rNfXHzFihDZv3qzPPvtMJSUlysjIaPH80tJSffLJJ6bntuaxxx5zhy02m0333nuv/vCHP3h8Lbvdrrlz5+rdd9/VW2+95fV9PPTQQ8wyA4AgwpIiAEDIuPrqqxUbGytJKisr08cff9ym5zf8jXSfPn00ZcoUX5YHwAKdO3fWm2++qfHjx7vHXnnlFdntdq+vcd1110mSamtr9c4777R6/rvvvquamhpJajLzxhO73a6nnnrKffzwww/rscceazbYiY2N1dSpU/Wf//xHeXl5Gjt2rBd3AQAINgQuAICQ0bVrV5133nnu47ZM6TcMQ6+//rr7+LrrrvPp7kAArBMdHa3bb7/dfVxZWalVq1Z5/fyrr75aMTH1E7+9+Xfl6DmxsbG6+uqrWz1/+fLlKikpcT/njjvu8Lq2jIyMdi2PAgBYj8AFABBSGi4D+vbbb71uWjlv3jzl5OS4jxv/Vrq0tFRvvfWWbrnlFk2cOFFdunRRXFyc0tLSNHDgQF111VV699135XK5fHMjavu20B9//LEuvvhi9e7dW/Hx8crKytLUqVM1a9asNu2uIknV1dX6+OOP9Zvf/EaTJk1S9+7dFRcXp5SUFPXr10+XXHKJXn75ZXeDYU+O7iLTv39/91hOTk6zO6I01J5Gu0uXLtXtt9+ukSNHqlOnTkpISFBWVpbOPfdcPffcc171uXjwwQfdr/vggw9KkhwOh1577TWdffbZ7s9tz549NX36dH3++ede1eYvFRUVeuaZZzRt2jRlZWUpISFBnTp10qhRo3T77beblsi1Jjc3Vw899JBOO+00de/eXfHx8YqLi1Pnzp01evRoXX311fr3v//d4n9Tdrtdr7/+un76059qwIABSklJUUxMjFJTUzVo0CBNmzZN999/v5YvX+6L22+TMWPGmI7z8/O9fm63bt107rnnSpIWL16sXbt2NXvunj17tGjRIknSueeeq65du7Z6/f3797s/zszMbFOfFQBACDMAAAghtbW1RmZm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JF177bX605/+JJfLpfz8fH333XeaNm1ak/PeeOMNdx+MHj16eDynoZKSEi1dulSbNm1SUVGRKioqTDsTbd261f3x2rVrdeGFF/rojpqaM2eO++Mrr7xScXFxLZ7/s5/9TLfffnuLOws1VlVVpaVLl2rDhg0qKChQeXm5+/MlmXdXWbt2rffF+8APP/zg/viGG25odTenSy65RJmZmTpy5Ihqa2u1ZMkS984znkyaNEk9evRo8Zpjx451f7x3717vCu+AxYsXu/sJdenSpdXvr6ioKN100026++67JZm/Z45eIyEhQTU1Ndq4caMWLVqkU089tc11ZWdnuz9+4YUX9O9//7vN1+iIo7tftSQqKkrTp0/X888/3+b+LQ1dd911euCBB1RaWqpPPvlEV155pSTpk08+cW/tfN1117Xr2j//+c81depUPf7443rrrbdUXFzc5BzDMLR8+XItX75cjz/+uGbNmqUzzjijvbcDALAQgQsAICT17t1bZ599tr755htJ0qxZszyGKUcbXErSNddco+joaI/Xy8vL0x/+8Ae9//777je8rfF3c9A1a9a4Pz755JNbPT81NVWjRo3S6tWrWz33yJEjuv/++/Xaa6+pvLzcq3oC2QzVMAxTwHPKKae0+pzY2FhNmDBBX331lSRp9erVLQYuxx13XKvXbNgYuaysrNXzO6rh13zChAmKiWn9R7WGAcqaNWtkGIY7nIiLi9P06dP19ttvy+Fw6Mwzz9SVV16pyy67TKeddpoyMjK8quuKK67Qf//7X0n1gcuqVas0Y8YMTZs2rUkzZatcdNFFevnll72+p+Zcd911evDBB2UYhl577TV34HL03xKbzdbuwEWS+vTpo+eff15PPfWUli1bpgULFmjFihVatWqVuynxUXl5eZo6dapmz56tc845p9Vr79mzx+tt1gEA/kfgAgAIWTNmzHAHLh999JEqKiqUkpLifnzNmjXasGGD6XxP1qxZo7POOsvjb5tb4m1Q0V4FBQXuj/v06ePVc/r06dNq4JKTk6PTTjtN+/bta1M9/r7fhkpLS2W3293Hffv29ep5Dd9sthYQpaent3q92NhY98cN6/GXhl/z9txzXV2dysvLlZaW5h576qmntGrVKu3YsUN1dXWaNWuWZs2apaioKI0cOVKTJ0/W1KlTdd555yk+Pt7ja0ybNk2//vWv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brnlFvfx7bffrueff77JbklHvz5Hmx+npaV5FT4Fq/vvv9/dPHf79u2aNm2adu/ebTrH5XLpn//8p6lPym233dZku+JVq1apX79+evDBB7V582aPr+d0OvXOO++4t3yW6pfhNXTyySfr6quv1pdfftlsgLN9+3bTbLKzzjqr1e9HXxs2bJiuuOIK9/Hjjz/udeDkyaBBgzRu3DiNGzdOgwYNavd1iouL9bvf/U79+vXTXXfdpdWrVzc7Y6uwsFB33nmn6Xt47NixBC4AEIJirC4AAABfmDFjhsd+I61t4XrOOefotNNO0/z582UYhu655x49//zzOuGEE5Senq4dO3Zo8eLFcjqd6t27t+644w5TCOJvf/zjH/Xtt99q0aJFMgxDf/jDH/TPf/5Tp59+ulJSUrRz504tWLBATqdTEydO1MCBA/Xmm282e71hw4bpuuuuc/e4efLJJ/Xmm29q/Pjx6tatm/bu3av58+errq5OqampeuKJJ/Q///M/rdZ56aWX6q9//auk+gamr776qgYNGmRqfPv3v/+9zff/97//XStXrtSKFSvkcDh0++2367HHHtOkSZOUkpKiXbt2af78+e4QKiYmRi+//HKT4CGUDBw4UC+99JKuueYaOZ1OLVmyREOHDtXkyZM1cOBAVVRUaMGCBdq/f7/7OSeddJL+9re/ebzegQMH9NBDD+mhhx5Sjx49NGbMGPXo0UMxMTE6dOiQVq1aZertM3nyZNPSHKk+SHvrrbf01ltvKTExUccff7wGDBigtLQ0FRcXa/fu3Vq5cqX7/MTExHZ9vX3hz3/+s9599125XC7l5ubq1VdfDfjstOYUFBToqaee0lNPPaX09HSdeOKJ6tmzp1JTU1VRUaEdO3Zo1apV7i2oJal79+564403TMsBm/PAAw+0qanvlClTdOmll7brXgAAXjAAAAgDZWVlRlJSkiHJ/Wf48OFePffgwYPGCSecYHpu4z8jRowwNm3aZLzyyivusRkzZni83pw5c9znnH766c2+bsPrt6S0tNQ499xzW6zvlFNOMfLz840ZM2a4x1555RWP16usrDTOOeecFq+XlZVlLFy40Ot7KSkpMYYNG9biNRvas2ePe7xv374t3n95eblxxRVXtHhtSUbPnj2NL774osVrPfDAA+7zH3jggRbPNQzvv5be8ubrc9Rnn31mdO/e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XnpvZZ4W7ix0j72yeK8uOaG3RvZKt7AyAACAjgnokqI+ffronHPOafPz1qxZoyuvvFJlZWVKSUnRo48+qsWLF+v777/XzTffLEnavn27LrjgApWXl/u6bI/sdruuu+461dbW6vHHH1d0dHRAXhcAgHBis9n0yPRRios59iOJ02XoTx9tlNNFA10AABC6/D7D5f7779f48eM1fvx4de/eXXv37lX//v3bdI077rhD1dXViomJ0TfffKOTTz7Z/diZZ56pwYMH695779X27dv15JNP6sEHH2xyjbvvvlu1tbVtes3Bgwd7fMzlcumGG27Q/PnzdfPNN+u6665r0/0AAIBj+ndJ1m1nDNJT3x1bSrQut0RvLd+na0/qa2FlAAAA7WczArz/YsPAZcaMGXr11VdbPH/58uWaOHGiJOmWW27RCy+80OQcl8ulUaNGacuWLcrIyNDhw4fdvVWOSklJUWVlpdd1zpkzR2eccYbH17rppps0c+ZMXXvttZo5c6aionw/USgvL0/Z2dmSpNzcXGVlZfn8NQAACBa1DqfOe3qBdhce+391RlKs5t5zhjKS4iysDAAAhDt/vf8O+l2KPv74Y/fHN954o8dzoqKidP3110uSSkpKNGfOnCbnVFRUyDAMr/80F7bceOONmjlzpq666iq9+uqrfglbAACINPEx0Xpk+ijTWEmVXU9/t8OiigAAADom6NOChQsXSpKSk5N14oknNntew22bFy1a5PM6joYtr732mq688krNmjWLvi0AAPjQqYO66ILjeprGZi3N0fZDgenPBgAA4EtBH7hs2bJFkjRo0KAWt14eNmxYk+f4ytFlRK+99pouv/xyvf7664QtAAD4wR/OG6b4Rg10H/l8swK8AhoAAKDD/N40tyNqampUWFi/TWRra6g6deqk5ORkVVZWKjc316d1PPzww5o5c6ZSUlI0ZMgQ/eUvf2lyzvTp0zVmzBivr5mXl9fi4wcOHGhrmQAAhLzszCT98rQBevaHne6xBTsK9f2Wwzp7RHcLKwMAAGiboA5cGm7xnJKS0ur5RwOXiooKn9axd+9eSfV9YB599FGP5/Tr169NgcvRhjwAAMDs1jMG6r2VeTpYVuMe+8vszZo8pIviY5hhCgAAQkNQLymqqTn2g1ZcXOs7FMTHx0uSqqurfVrHq6++2mqT3RtuuMGnrwkAQKRK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PnP4rBYtWigpKUmxsbF2zxcWFup3v/ud3n77bTn749e4cePKbP988uRJtWnTRpKUkJCgQ4cOae7cuXavbdy4sTZt2qROnTrZnNu8ebPuuecel4HKypUrdc899zhtAwAAXGMNFwAAUOPt2bNHS5cuVZMmTTR9+nTFxcUpNzdXq1at0ttvv628vDw9+uijatOmjXr16mVz/bhx46xhS/fu3TVt2jR16tRJly5d0rJly5SYmKi0tDQNGjRIP/zwg2666Sabe/z2t7/VokWLJEnNmzfXM888o379+qlBgwa6ePGitm/frn//+99O3+PDDz9UcnKy7rjjDj311FOKiYnRlStXtGTJEi1ZskQXL17UxIkTlZKSUua6vLw8jRkzRteuXVO9evU0efJkxcfHq0mTJsrPz9eJEyeUnJzsNFACAACeYYQLAADwSaVHuLi7S9HNN9+sgIAA688lI1wkqXXr1tq2bZuaNWtW5poNGzZo6NChMpvN6t27t7Zv317mfFJSknXEx6BBg7Rq1SoFBgaWafPhhx/qt7/9rSTpoYce0vLly8uc/89//qN7771XktS3b1+tWrVK4eHhdt/h9OnTioqKsv5ceoSLJD355JN6//33ZTKZylz35JNPasGCBZKkXbt2qUePHtZz69ev16BBgyQ5H8FiNpuVnZ2t+vXr2z0PAADcR+ACAAB8UunAxV0nTpxQdHS09efSgcu///1v3X///Xave/rpp/Xee+9JKl7npfQol+HDh2v16tUKCAjQsWPHyoQhpQ0ZMkRr166Vv7+/Tp06pebNm1vP9evXTykpKQoJCdGRI0fUokULt9+pdODSvHlznThxQkFBQTbtDh06pI4dO0qS3nnnHT377LPWc0uXLtWjjz4qSbp69SqBCgAAVYBFcwEAQI3XsGFD6wgTeyZOnGj9vHbtWutns9msTZs2SZKGDh3qMGyRikeYlFyzceNG6/GMjAxt27ZNkjR69GiPwpYbPfDAA3bDFql4dE9YWJgk6fjx42XOlQ5/EhISyv18AADgPgIXAADg82bNmiWLxeLyn9KjW0rr0aOH/P0dL10XGxtrnSa0d+9e6/Hjx48rOztbknTbbbc5rbH0+R9//NH6ec+ePdZFcgcOHOj8RV0oGcHiSMOGDSVJ169fL3N8wIABatu2rSTp+eefV1xcnObMmaOtW7cqPz+/QjUBAAD7CFwAAECN16RJE6fn/f391ahRI0nSpUuXrMdLf3Z1j9Jrw5S+Lj093fq59EiT8ggJCXF63s+v+I92hYWFZY4HBARo5cqV1t2LduzYoRkzZmjAgAEKDw/XsGHDtHTpUpvrAABA+RG4AACAGu/GBWa9dQ9v6ty5s/bu3avPPvtMEydOVPv27SVJOTk5+vrrr/Xoo4/qtttu04ULF7xcKQAANQOBCwAAqPF++uknp+fNZrN1VErJSJcbP7u6x/nz5+1eFxkZaf187tw59wquJHXq1NGoUaO0cOFCHTlyRGlpaVq0aJF69uwpSfr+++/11FNPebVGAABqCgIXAABQ4+3Zs0dms9nh+f/+97/WtUy6dOliPd62bVvrNJ7vvvvO6TNKbydd+h49evSwjo759ttvPS++EjVv3lwTJkxQSkqKbr31VknSl19+qZycHC9XBgBA9UfgAgAAarxLly5p5cqVDs8vWrTI+nnw4MHWz/7+/rrjjjskSd98843OnDnj8B4LFiywXnPnnXdajzdq1Ej9+vWTJK1YsUJpaWnleofKFBAQYH1Ps9msK1eueLcgAABqAAIXAABQK0ydOtXutKBNmzbpgw8+kCT17NlTvXv3LnP+f/7nfyRJ+fn5mjRpkgoKCmzusWjRIq1Zs0aSdN9999ksjvvSSy9JkrKzs/Xggw/q6tWrDut0FuqU1+bNm3X06FGH5/Pz863bX4eFhalx48aG1wAAQG3jeH9EAAAAH3HhwoUyWy07UrduXbVr187mePfu3bV//3717NlT06dPV1xcnPLy8rRq1Sr95S9/kdlslr+/v959912ba0eMGKEHH3xQ//rXv7RmzRr16dNHU6dOVceOHXX58mUtW7bMOkKmUaNGmj9/vs09Ro4cqUmTJmnhwoVKTk5W586d9cwzz6h///6qX7++0tPTtXPnTi1fvlzdu3dXYmKi5/+SnFi3bp3++Mc/auDAgRoxYoS6deumxo0bKycnR4cPH9Y//vEP7dq1S5I0adIkp1toAwAA9/DbFAAA+Lz33ntP7733nst23bt31549e2yOx8bG6plnntHkyZP1zDPP2JwPDAzU4sWLddttt9m975IlS2Q2m/XZZ59p165dGjt2rE2bFi1aKCkpSTfddJPde7z//vuqW7eu3n33XaWlpWnGjBkO36EyFBUVadOmTdaRLPbce++9mjNnTqU8HwCA2obABQAA1ApPPPGEunTpor/85S/asmWL0tPT1bhxYw0aNEgvvfSSOnfu7PDa4OBgffrpp1q5cqUSExO1bds2paenKzQ0VDExMRo1apSeeeYZhYWFObxHnTp19Le//U0TJkzQ+++/r40bN+rs2bPKz89XRESEunXrpmHDhumxxx4z/N1feOEFdevWTWvXrtXu3buVlpZm3f65WbNmiouL0+OPP64RI0YY/mwAAGork8VisXi7CAAAgMoQHR2t1NRUjRs3zvBpOgAAAM6waC4AAAAAAIDBCFwAAAAAAAAMRuACAAAAAABgMAIXAAAAAAAAgxG4AAAAAAAAGIxdigAAAAAAAAzGCBcAAAAAAACDEbgAAAAAAAAYjMAFAAAAAADAYAQuAAAAAAAABiNwAQAAAAAAMBiBCwAAAAAAgMEIXAAAAAAAAAxG4AIAAAAAAGAwAhcAAAAAAACDEbgAAAAAAAAYjMAFAAAAAADAYAQuAAAAAAAABiNwAQAAAAAAMBiBCwAAAAAAgMEIXAAAAAAAAAxG4AIAAAAAAGAwAhcAAAAAAACDEbgAAAAAAAAYjMAFAAAAAADAYP8f6oDFrmE6HOcAAAAASUVORK5CYII=",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAAqdJJREFUeJzs3Xd4VGXexvF70kkhIQkJgYTeQ29KLwrYRVERVMDuqruudV3XRd1ddy3rWlbU9cWlKSqKoohdQXrvnUACCQGSEEJ6nfP+wTJySIdJzkzm+7muXM55zjNnfieJIXPnKTbDMAwBAAAAAADAKbysLgAAAAAAAKAhIWwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAAAAAABwIsIWAAAAAAAAJyJsAQAAAAAAcCLCFgAAAAAAACcibAEAAAAAAHAiwhYAAAAAAAAnImwBAMDJli5dKpvNJpvNphEjRlTa70wfm83mtNeeOnWq45qzZs1y2nWdLSkpyVFn69atrS6n3rjL1wcAAFwYwhYAgFt47LHHTG/ODcM4r+tkZmbK39+fN7yAi5s1a5YpkDz3w9/fX1FRUerfv7/uv/9+LVu2rMbXPjvsO/MRFRWl0tLSGl+jrKxMMTEx5a6TlJRU7XOTk5P1/PPPa+zYsYqLi1NQUJB8fX0VFhamzp0764orrtCf/vQnLVq0SLm5ubW6j9p8LF26tMb3CwCoHcIWAIBbmDJliuPxoUOH9Msvv5zXdT766CMVFxdLkoKCgnTDDTc4pT5P5qmjVGCt4uJipaena8OGDXr77bc1fPhwjRw5UsnJyed1vfT0dH3zzTc17v/dd9/p2LFjtXqNwsJCPfbYY2rTpo2efvppff/990pJSVF+fr5KS0t16tQp7d27V998843+/ve/65prrlF4eLhWr15d29sBAFjMx+oCAACoie7du6t3797avHmzJGnOnDlVTtGpzJw5cxyPx48fr+DgYGeVCKCOhISEaPLkyaa2wsJCHTp0SCtXrlRBQYGk01P4Ro0apTVr1igiIqLWrzNnzhxdffXVNe5bG8XFxbr22mv1/fffO9r8/PzUr18/tWvXToGBgcrOzlZSUpK2bNniuKeSkhLl5eXV6DUmT56skJCQGtfUokWLWt0DAKDmCFsAAG5jypQpjrBlwYIFmj59uho1alTj5+/bt09r1641Xc9K5zsVqiG4kKlg8Dzh4eF68803Kzx34sQJ3X///Zo/f74kKSEhQc8++6z+/e9/1/j6Xbt21a5du7Ro0SJlZWUpLCysyv6nTp3SF198YXpudV544QVH0GKz2fTEE0/oySefrPC1SkpKtHTpUs2fP18ffvhhje/jueeeY3QZALgIphEBANzGpEmT5OvrK0nKzs7WwoULa/X8s/8S3bJlS40cOdKZ5QGwQEREhObNm6f+/fs72mbOnKmSkpIaX+O2226TJBUVFenjjz+utv/8+fNVWFgoSeVG3FSkpKREr776quP4L3/5i1544YVKQx1fX1+NHj1a//d//6eUlBT17t27BncBAHAlhC0AALfRtGlTXX755Y7j2gzjNwxD77//vuP4tttuc+ouQACs4+3trQcffNBxnJeXp40bN9b4+ZMmTZKPz+kB3zX5uXKmj6+vryZNmlRt/3Xr1ikrK8vxnIceeqjGtYWFhZ3XlCgAgLUIWwAAbuXsqT8//PBDjReo/OWXX3To0CHH8bl/jT516pQ+/PBD3XvvvbrooosUGRkpPz8/NW7cWO3atdPEiRM1f/582e1259yIar/188KFC3XttdeqRYsW8vf3V2xsrEaPHq25c+fWahcVSSooKNDChQv1u9/9TkOGDFF0dLT8/PwUHBys1q1b67rrrtN7773nWEy4Imd2i2nTpo2j7dChQ5XufHK281lUd82aNXrwwQcVHx+vJk2aKCAgQLGxsbrsssv05ptv1mhdi2effdbxus8++6wkqbS0VHPmzNGll17q+NzGxMRo3Lhx+uqrr2pUW13Jzc3VG2+8obFjxyo2NlYBAQFq0qSJunXrpgcffNA0La46ycnJeu655zRs2DBFR0fL399ffn5+ioiIUM+ePTVp0iS9/fbbVf4/VVJSovfff1/XX3+92rZtq+DgYPn4+CgkJETt27fX2LFjNW3aNK1bt84Zt18rvXr1Mh2npqbW+LlRUVG67LLLJEmrVq3SgQMHKu2bmJiolStXSpIuu+wyNW3atNrrHzlyxPE4PDy8VuuqAADclAEAgBspKioywsPDDUmGJOOVV16p0fNuv/12x3MGDhxoOrdgwQLD39/fcb6qj549exoHDx6s8rWWLFni6D98+PBK+5193ark5OQYV1xxRZV1DRkyxDh69KgxZcoUR9vMmTMrvN6aNWuM4ODgGt1v69atjU2bNlV4nZkzZ9boGhXdY2JioqO9VatWVd5/bm6uMWHChGqvHxMTY3z99ddVXuuZZ55x9H/mmWeMlJQUY9CgQVVe9/bbbzfKysqqvG5N1eTrc8aiRYuMZs2aVXvfkyZNMvLy8qq81n/+8x+jUaNGNfo6DR48uMJr7N271+jSpUuNv9779+8/30+TYRjm76/qvkcMwzD27dtnev0PPvig0r5nf/9JMgoKCoz58+c7jqdNm1bpc5999llHv08++cQoKCgwXSsxMbHccz755BPHeZvNZuTm5tbkU1Ctc++jotcGAFiDBXIBAG7Fz89PEydO1PTp0yWdHs7/yCOPVPmcgoICffrpp47jcxfGTUtLU1FRkSQpNjZWXbt2VbNmzRQYGKjc3Fzt3r1bmzZtkmEY2rp1q4YNG6YtW7bUy9D+kpISXXnllVq2bJmjrVmzZho2bJhCQkKUkJCgFStWaMWKFbruuuvUtm3baq958uRJ5ebmSjr9F/34+HjFxsYqKChI+fn5SkhI0Lp161RaWqqkpCQNHz5cmzZtUvv27U3X6dKlix544AHl5OQ4plVUtGvMhcjPz9eoUaNMIyWaN2+uoUOHKjg42HH/ZWVlOnr0qK655hp9+OGHNdrSOzc3V5dddpl27NihwMBADR06VHFxccrJydGSJUuUlpYm6fT6H506ddIf/vAHp91XdT7++GPdcsstKisrk3R6msyQIUPUvn175ebmavny5Y6RG/PmzVNiYqJ+/vlnBQQElLvWwoULde+99zqOGzdurIEDByo2NlY+Pj46deqU9u3bpx07dlQ6kiknJ0eXXnqpY1tlLy8v9e7dW126dFFwcLDy8/N15MgRbd26VRkZGc7+dNTIuSNZoqOja/X8a665RmFhYcrKytL777/vGAV1rjPf602aNNHVV19do4We27Vr53hsGIZeeuklPffcc7WqDwDgZiwOewAAqLV169aZ/pq7bdu2Kvt/8MEHjr7+/v7GyZMnTee//PJL4x//+EeVf4k/ePCgMXbsWMd17rzzzkr7OnNky1/+8hfTX8Sff/55o7S01NRn7969Rs+ePQ1Jhp+fX41Gtjz11FPG9u3bK33d48ePG7fddpvjWpdcckmlfWszSqW2z/nNb37j6Oft7W289tpr5UaZ7Nu3z+jbt6+jX+PGjSv9C//ZI1vOjGaaMmWKceLECVO/vLw8Y+LEiY6+wcHBThmNUJORLQkJCaaRRwMGDCj3vVlWVma88sorhpeXl6Pfb3/72wqv16tXL0efBx98sNJRMDk5Ocb8+fONP/zhD+XOvfbaa45rdO3a1dizZ0+F17Db7ca6deuM3/zmN8bhw4er+ExUr7YjW/74xz86+vv6+hqZmZmV9q1oZIthGMY999zjaFu2bFm55y1fvtxx/t577zUMw6jRyBa73W60bt3a9P/yrbfeaqxevdqw2+01+4TU4D4Y2QIAroOwBQDgls6ezvDYY49V2ffskOSmm24679csLi42evToYUgyAgICKn0z56ywJSsrywgMDHT0efbZZyu9VlpamhETE2O6ZnXTVGri8ssvd1xv165dFfapq7AlISHBFCa8+eablV4vMzPT9Gb29ttvr7Df2WGLJGPixImVXrOgoMCIi4tz9P3oo49qdG9VqUnYMnnyZEef9u3bG1lZWZVe71//+pejr5eXV7kpbjk5OY7zcXFx5/3Gfvz48Y7r/PDDD+d1jdqqTdiya9cuIyQkxNF/0qRJVfavLGxZuXKlo+2uu+4q97y7777bcX7VqlWGYdQsbDEMw/j0009N/c58REREGFdccYUxbdo0Y9GiRVWGRNXdx+TJk40HHnigRh+vvfZajV8HAFB7hC0AALf0wgsvON5gNG/evNxojzNSU1MNb29vR9/Fixdf0Ou++OKLjmt9+eWXFfZxVtjy1ltvOc7HxsYaRUVFVdb27rvvOj1s+fjjjx3Xe+ONNyrsU1dhyx/+8AdHn169elUbFJxdq7+/f4Uhxdlhi5+fn3H06NEqr/nEE084+j/yyCM1ureqVBe2nDx50rR+0GeffVbl9crKyoz4+HhH/yeffNJ0/siRI6bP4fkaPXq04zpbtmw57+vURnVhS2FhobF3717jpZdeMsLCwhx9O3fubBw7dqzKa1cWthiGYbRv396QZISGhpraCwoKHK/ToUMHU3tNR5fMmDHDCAgIqDB0OXvUy4ABA4x///vfptevyX3U5qOqn00AgAvHmi0AALd066236qmnnpLdbldqaqp+/PFHjR07tly/Dz74wLHuRbNmzSrsc7asrCytWbNGO3fu1IkTJ5Sbm2vagWjPnj2Ox1u2bNHVV1/tpDsqb8mSJY7HEyZMkJ+fX5X9b775Zj344INV7iB0rvz8fK1Zs0bbt29Xenq6cnJyHJ8vybyLypYtW2pevBP8/PPPjsdTp06tdtem6667TuHh4crMzFRRUZFWr17t2GGmIkOGDFGzZs2qvGbv3r0dj5OSkmpW+AVYtWqVY/2gyMjIar+/vLy8dMcdd+jRRx+VZP6eOXONgIAAFRYWaseOHVq5cqUGDx5c67ri4uIcj9955x29/fbbtb7GhTizy1VVvLy8NG7cOE2fPr3W67Wc7bbbbtMzzzyjU6dO6YsvvtCECRMkSV988YVj++bbbrvtvK595513avTo0XrxxRf14Ycf6uTJk+X6GIahdevWad26dXrxxRc1d+5cjRgx4nxvBwBgEcIWAIBbatGihS699FJ9//33kqS5c+dWGKScWcxSkm655RZ5e3tXeL2UlBQ9+eST+vTTTx1vdqtT1wuBbt682fF44MCB1fYPCQlRt27dtGnTpmr7ZmZmatq0aZozZ45ycnJqVE99LnxqGIYp3Bk0aFC1z/H19dWAAQP07bffSpI2bdpUZdjSvXv3aq959iLI2dnZ1fa/UGd/zQcMGCAfn+p/VTs7PNm8ebMMw3AEE35+fho3bpw++ugjlZaWatSoUZowYYJuuOEGDRs2TGFhYTWq66abbtJ///tfSafDlo0bN2rKlCkaO3ZsuYWTrXLNNdfovffeq/E9Vea2227Ts88+K8MwNGfOHEfYcuZnic1mO++wRZJatmyp6dOn69VXX9XatWu1fPlyrV+/Xhs3bnQsQHxGSkqKRo8ercWLF2vMmDHVXjsxMbHGW6kDAOoWYQsAwG1NmTLFEbZ8/vnnys3NVXBwsOP85s2btX37dlP/imzevFmXXHJJhX9lrkpNQ4rzlZ6e7njcsmXLGj2nZcuW1YYthw4d0rBhw3T48OFa1VPX93u2U6dOqaSkxHHcqlWrGj3v7Dea1YVDoaGh1V7P19fX8fjseurK2V/z87nn4uJi5eTkqHHjxo62V199VRs3btT+/ftVXFysuXPnau7cufLy8lJ8fLyGDh2q0aNH6/LLL5e/v3+FrzF27Fj99re/1b///W9J0vr167V+/XpJp3f9GTJkiEaMGKFx48YpNja2trddrXN3uSotLVVqaqo2b96slJQUSad3XTp48KB++uknRUZGnvdrtWnTRkOGDNHy5cv1/fff6/jx45Lk+FkzdOhQpwQafn5+Gjp0qIYOHepoS0pK0qeffqrXXnvNMaqstLRUkydP1sGDBxUYGHjBrwsAqB9eVhcAAMD5uu666xxvKvPz803bO0vmUS29e/eucCRDUVGRxo8f7whamjZtqqefflpLlixRcnKy8vLyZLfbZZxe50wzZ850PPfs6UV14cz2zJJq/CYrKCio2j6TJk1yBC0hISF6+OGH9e233+rgwYPKzc1VWVmZ437PnpZS1/d7trPvXarZfZ3br7pwqLppKVY4+77P556l8vfdrFkzbdiwQU8//bRpeo3dbtf27dv11ltv6brrrlNMTIxeeOEF0zSys73xxhv67LPPNGDAAFP78ePHtWDBAv32t79Vy5YtdcMNN9Q6yKtOeHi43nzzTcfHO++8oy+//FKJiYl67733HFteb9u2zSlbj58JZktLSzVv3jzNmzdPpaWlpnN1oXXr1nrssce0a9cu09Sh48eP6+OPP66z1wUAOB9hCwDAbTVq1Eg33nij43ju3LmOx6Wlpfrwww8dx5W9QVqwYIESExMlnZ6atHXrVv31r3/ViBEjFBsbq8DAQNOb8voc3XH2KJ38/PwaPScvL6/K86tWrdKqVasc11+zZo3+9a9/aezYsWrTpo2CgoLk5fXrrwf1eb9nO/vepervq6J+ISEhTq2pPpx93+dzz1LF9924cWP99a9/1ZEjR7RmzRq9/PLLGjdunGkEyMmTJ/XHP/5R48ePl2EYFb7Wddddp7Vr1+rQoUOaPXu27r33XnXt2tVx3jAMLViwQH369NG+fftqVP+F8PHx0R133KEZM2Y42r755hvNnj37gq574403qlGjRpJOh7Znrnfuz5y60rhxY82dO9c07XH58uV1/roAAOchbAEAuLWzQ5SlS5c61jz47rvvHMP/fX19NWnSpAqf/9NPPzke//73v1dMTEyVr3fo0KELLbnGmjZt6nhc05EC5675cK6z73fKlCmmN8oVqc/7PVtoaKhpCk9N7//sRWwvZCqJVc7na372Pfv5+VUZMnl7e+uiiy7SY489ps8//1zHjx/X8uXLdc011zj6fPHFF1qwYEGVr9myZUtNnjxZ77zzjnbu3KnDhw/rueeec4zAOnHihB555JEa1e8Mt9xyi+ke/vznP6uwsPC8r9e4cWNde+21kk4vDL1161ZJ0rhx4+otxIuNjVV8fLzj+OjRo/XyugAA5yBsAQC4tSFDhqht27aSTk+LeP/99yWZpxBdfvnlpjexZ0tNTXU8rsmCqcuWLbuQcmvl7J1w1qxZU23/3Nxc7dixo8o+dXG/dTEdx2azqVevXo7jM6NxqlJaWupYR0SS+vTp4/S66trZX/N169ZVOqXnbGd/bnr37l2rr4eXl5eGDBmihQsXavTo0Y72L7/8ssbXkE7vVjRt2jS9++67jrbvv/++xotNO8NLL73kGAmSnJysd95554KuV9F0JGdMUaqNM9OjJFW6ng4AwDURtgAA3JrNZjO9AZo7d65OnTplerNY1RoLZ0+ZqW6qzsaNG01v5uvayJEjHY8//vjjahdo/fjjj6t9c1ub+01NTdUXX3xRbZ1nvyF05iKyo0aNcjyePXt2pVNbzli4cKFOnDjhqKkmOzi5mkGDBjneVKenp2vx4sVV9rfb7aZ1hM7+nNWGzWYzbTN9ZlRYbZ09uqSkpESZmZnndZ3z0alTJ918882O45dffvmCwp4xY8aYtgaPiYkxBVJ1raioyLTVfE0XyQYAuAbCFgCA25s8ebLjr/m7d+/WE0884ZhCEB4erquuuqrS554ZFSNV/df8/Px83XPPPU6quGYmTZrkmJaRnJysF198sdK+J06c0LRp06q9Zk3vt6ysTPfcc4+Ki4urvWZYWJgjxElPT3da4HL33Xc7rrtp0ybTqIlzZWVl6YknnnAcT5w4sUa7DbmasLAwx1bDkvT4449XuW7Om2++6dhxy8vLq9z3aE5OTo2+hpJ5ClpUVJTpXE23/T77Gl5eXqats+vD008/7fieSU1NNa3lUlve3t6ObZnXr1+vZcuWVbp1fHXWrl2rf/7znzVee0k6PVLn7O3Gq9rGHADgeghbAABur02bNqbtU89+Uz5x4kT5+flV+tyz/5o/e/ZsvfLKK+WmbiQkJGjMmDHatGlTjXeIcYbQ0FBTgDBt2jS9+OKL5erbv3+/Ro8erdTU1CrvVZKuvPJKRzC1dOlSPfbYYyooKDD1OXbsmMaPH6/FixfX6H79/f3VoUMHSadHMyxcuLAmt1etdu3a6d5773UcP/jgg5o+fXq5XZHOfH3OLHTcuHHjGgVPrmratGmOhXL37dunsWPH6uDBg6Y+drtdr7/+umldlAceeKDclsQbN25U69at9eyzz2rXrl0Vvl5ZWZk+/vhjx7bO0umpd2cbOHCgJk2apG+++abS8Gbfvn2mUWSXXHJJtd+Pzta5c2fddNNNjuMXX3yxxmFTRdq3b69+/fqpX79+at++/Xlf5+TJk3r88cfVunVrPfLII9q0aVOlI7UyMjL08MMPm76He/fuTdgCAG7Gx+oCAABwhilTplS4vkh127SOGTNGw4YN07Jly2QYhh577DFNnz5dffr0UWhoqPbv369Vq1aprKxMLVq00EMPPWQKQOraH//4R/3www9auXKlDMPQk08+qddff13Dhw9XcHCwEhIStHz5cpWVlemiiy5Su3btNG/evEqv17lzZ912222ONW1eeeUVzZs3T/3791dUVJSSkpK0bNkyFRcXKyQkRC+//LLuu+++auscP368/v73v0s6vVjprFmz1L59e9Mit//85z9rff///Oc/tWHDBq1fv16lpaV68MEH9cILL2jIkCEKDg7WgQMHtGzZMkcA5ePjo/fee69c6OBO2rVrpxkzZuiWW25RWVmZVq9erU6dOmno0KFq166dcnNztXz5ch05csTxnIsvvlgvvfRShdc7evSonnvuOT333HNq1qyZevXqpWbNmsnHx0fHjx/Xxo0bTWv5DB061DQdRzodon344Yf68MMP1ahRI/Xo0UNt27ZV48aNdfLkSR08eFAbNmxw9G/UqNF5fb2d4c9//rPmz58vu92u5ORkzZo1q95HpVUmPT1dr776ql599VWFhoaqb9++iomJUUhIiHJzc7V//35t3LjRsc20JEVHR+uDDz4wTQGszDPPPFOrBXxHjhyp8ePHn9e9AACqYQAA0ABkZ2cbgYGBhiTHR5cuXWr03GPHjhl9+vQxPffcj65duxo7d+40Zs6c6WibMmVKhddbsmSJo8/w4cMrfd2zr1+VU6dOGZdddlmV9Q0aNMhITU01pkyZ4mibOXNmhdfLy8szxowZU+X1YmNjjRUrVtT4XrKysozOnTtXec2zJSYmOtpbtWpV5f3n5OQYN910U5XXlmTExMQYX3/9dZXXeuaZZxz9n3nmmSr7GkbNv5Y1VZOvzxmLFi0yoqOjq73viRMnGnl5eRVeY82aNYaPj0+11zjzccMNNxjZ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",
"text/plain": [
""
]
@@ -401,12 +315,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 16\n"
+ "Time step 16\n",
+ "RMSE 0.0020819416880965944, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFwAAAOOCAYAAAA9KAZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACrE0lEQVR4nOzdd3hb5f3+8VvynnEcx1l29g4jOwQyCHsXGkbZq5QfLZQWKC0dAdovLaOMMgq0tAlhzwZC2JCQTZazp5M4sWMn3ntKOr8/TBQfT9mRfCT5/bouX9F5dHT0OY5prTvP83lshmEYAgAAAAAAgNfYrS4AAAAAAAAg2BC4AAAAAAAAeBmBCwAAAAAAgJcRuAAAAAAAAHgZgQsAAAAAAICXEbgAAAAAAAB4GYELAAAAAACAlxG4AAAAAAAAeBmBCwAAAAAAgJcRuAAAAAAAAHgZgQsAAAAAAICXEbgAAAAAAAB4GYELAAAAAACAlxG4AAAAAAAAeBmBCwAAAAAAgJcRuAAAAAAAAHgZgQsAAAAAAICXEbgAAAAAAAB4GYELAAAAAACAlxG4AADgZUuWLJHNZpPNZtPpp5/e4nlHz7HZbF5775tuusl9zXnz5nntut6WkZHhrnPgwIFWl9NpAuXvBwAAHD8CFwBAQLjvvvtMH9ANw+jQdQoLCxUREcGHXsDPzZs3zxRKNv6KiIhQcnKyJk2apJ///OdaunSpx9duGPgd/UpOTpbD4fD4Gk6nU3369GlynYyMjDZfm5mZqUceeUTnnnuuUlNTFRMTo7CwMCUkJGjkyJG64IIL9Ic//EELFy5UeXl5u+6jPV9Llizx+H4BAO1H4AIACAg33nij+/GBAwf03Xffdeg6b7/9tmprayVJMTExuvzyy71SX1fWVWerwFq1tbXKy8vTunXr9OKLL2rmzJmaNWuWMjMzO3S9vLw8ffbZZx6f/8UXX+jw4cPteo/q6mrdd999GjRokP74xz/qyy+/VFZWliorK+VwOFRSUqJdu3bps88+01//+lddcsklSkxM1KpVq9p7OwAAPxBqdQEAAHjixBNP1Lhx45SWliZJmj9/fqvLdVoyf/589+PZs2crNjbWWyUC8JG4uDjdcMMNprHq6modOHBAK1asUFVVlaT65XxnnHGGVq9erR49erT7febPn6+LL77Y43Pbo7a2Vj/60Y/05ZdfusfCw8M1ceJEDRkyRNHR0SotLVVGRoY2btzovqe6ujpVVFR49B433HCD4uLiPK6pX79+7boHAED7ELgAAALGjTfe6A5cPvjgA73wwguKiory+PW7d+/W999/b7qelTq6LCoYHM+yMHQ9iYmJev7555t9rqCgQD//+c/17rvvSpLS09P10EMP6bnnnvP4+qNHj9b27du1cOFCFRcXKyEhodXzS0pK9NFHH5le25ZHH33UHbbYbDbdf//9+t3vftfse9XV1WnJkiV699139dZbb3l8Hw8//DCzzADAj7CkCAAQMK655hqFhYVJkkpLS7VgwYJ2vb7hv0j3799fs2bN8mZ5ACzQo0cPvfnmm5o0aZJ7bO7cuaqrq/P4Gtdff70kqaamRu+8806b57/77ruqrq6WpCYzb5pTV1enp59+2n385z//WY8++miLwU5YWJjOPvts/fvf/1ZWVpbGjRvnwV0AAPwNgQsAIGD07NlT559/vvu4PVP6DcPQ66+/7j6+/vrrvbo7EADrhISE6M4773QfV1RUaP369R6//pprrlFoaP3Eb0/+d+XoOWFhYbrmmmvaPH/NmjUqLi52v+buu+/2uLaEhIQOLY8CAFiPwAUAEFAaLgP66quvPG5a+d133+nAgQPu48b/Kl1SUqK33npLt99+u6ZMmaKkpCSFh4crPj5eQ4YM0dVXX613331XLpfLOzei9m8LvWDBAv3oRz9Sv379FBERoZSUFJ199tl67bXX2rW7iiRVVVVpwYIF+uUvf6lp06apV69eCg8PV2xsrAYOHKjLLrtM//nPf9wNhptzdBeZQYMGuccOHDjQ4o4oDXWk0e7q1at15513asyYMerevbsiIyOVkpKi8847T88//7xHfS4eeugh9/s+9NBDkiSHw6H58+frrLPOcn9v+/Tpo0svvVSffPKJR7X5Snl5uZ599lmde+65SklJUWRkpLp3764TTjhBd955p2mJXFsyMzP18MMPa8aMGerVq5ciIiIUHh6uHj166OSTT9Y111yjF198sdX/purq6vT666/rxz/+sQYPHqzY2FiFhoYqLi5OQ4cO1bnnnqs5c+ZozZo13rj9dhk7dqzpODs72+PXJicn67zzzpMkrVy5Unv37m3x3P3792vFihWSpPPOO089e/Zs8/qHDh1yP05MTGxXnxUAQAAzAAAIIDU1NUZiYqIhyZBkPPnkkx697uabb3a/ZurUqabnPvjgAyMiIsL9fGtfJ598srFv375W32vx4sXu82fOnNnieQ2v25qysjLjggsuaLWuadOmGTk5OcaNN97oHps7d26z11u9erURGxvr0f0OHDjQ2LBhQ7PXmTt3rkfXaO4e9+/f7x4fMGBAq/dfXl5uXHXVVW1ev0+fPsann37a6rUefPBB9/kPPvigkZWVZZx66qmtXvfmm282nE5nq9f1lCd/P0ctXLjQ6N27d5v3fc011xgVFRWtXuvll182oqKiPPp7Ou2005q9xq5du4xRo0Z5/Pe9Z8+ejn6bDMMw/3y19TNiGIaxe/du0/u/8cYbLZ7b8OdPklFVVWW8++677uM5c+a0+NqHHnrIfd57771nVFVVma61f//+Jq9577333M/bbDajvLzck29BmxrfR3PvDQCwDk1zAQABJTw8XFdffbVeeOEFSfVT+++5555WX1NVVaX333/ffdy4WW5ubq5qamokSSkpKRo9erR69+6t6OholZeXa8eOHdqwYYMMw9CmTZs0Y8YMbdy4sVOm+dfV1enCCy/U0qVL3WO9e/fWjBkzFBcXp/T0dC1fvlzLly/XZZddpsGDB7d5zaKiIpWXl0uq/5f9MWPGKCUlRTExMaqsrFR6errWrFkjh8OhjIwMzZw5Uxs2bNDQoUNN1xk1apR+8YtfqKyszL3EorndZI5HZWWlzjjjDNOMib59+2r69OmKjY1137/T6VROTo4uueQSvfXWWx5t911eXq7zzjtPW7duVXR0tKZPn67U1FSVlZVp8eLFys3NlVTfD2TEiBH67W9/67X7ass777yja6+9Vk6nU1L9kplp06Zp6NChKi8v17Jly9wzON58803t379f3377rSIjI5tca8GCBbr99tvdx/Hx8Zo6dapSUlIUGhqqkpIS7d69W1u3bm1xRlNZWZnOOuss95bLdrtd48aN06hRoxQbG6vKykodOnRImzZtUn5+vre/HR5pPKOlV69e7Xr9JZdcooSEBBUXF+v11193z4Zq7OjPevfu3XXxxRd71Px5yJAh7seGYejxxx/Xww8/3K76AAAByOLABwCAdluzZo3pX3U3b97c6vlvvPGG+9yIiAijqKjI9PzHH39s/O1vf2v1X+T37dtnnHvuue7r3HrrrS2e680ZLn/+859N/zL+yCOPGA6Hw3TOrl27jJNPPtmQZISHh3s0w+X3v/+9sWXLlhbf98iRI8b111/vvtaZZ57Z4rntma3S3tfccccd7vNCQkKMZ555pslsk927dxsTJkxwnxcfH9/iv/Q3nOFydFbTjTfeaBQUFJjOq6ioMK6++mr3ubGxsV6ZleDJDJf09HTTDKTJkyc3+dl0Op3Gk08+adjtdvd5d911V7PXGzt2rPucO++8s8XZMGVlZca7775r/Pa3v23y3DPPPOO+xujRo42dO3c2ew2Xy2WsWbPGuOOOO4yDBw+28p1oW3tnuDzwwAPu88PCwozCwsIWz21uhothGMbPfvYz99jSpUubvG7ZsmXu52+//XbDMAyPZri4XC5j4MCBpv+Wr7vuOmPVqlWGy+Xy7BviwX0wwwUA/AuBCwAgIDVc2nDfffe1em7DoOTKK6/s8HvW1tYaJ510kiHJiIyMbPEDnbcCl+LiYiM6Otp9zkMPPdTitXJzc40+ffqYrtnWkhVPnH/++e7rbd++vdlzfBW4pKenmwKF559/vsXrFRYWmj7Q3nzzzc2e1zBwkWRcffXVLV6zqqrKSE1NdZ/79ttve3RvrfEkcLnhhhvc5wwdOtQoLi5u8XpPPfWU+1y73d5kuVtZWZn7+dTU1A5/uJ89e7b7Ol999VWHrtFe7Qlctm/fbsTFxbnPv+aaa1o9v6XAZcWKFe6xn/70p01ed9ttt7mfX7lypWEYngUuhmEY77//vum8o189evQwLrjgAmPOnDnGwoULWw2K2rqPG264wfjFL37h0dczzzzj8fsAADqGwAUAEJAeffRR94eMvn37Npn1cVR2drYREhLiPnfRokXH9b6PPfaY+1off/xxs+d4K3D55z//6X4+JSXFqKmpabW2f/3rX14PXN555x339Z599tlmz/FV4PLb3/7Wfc7YsWPbDAsa1hoREdFsUNEwcAkPDzdycnJaveb999/vPv+ee+7x6N5a01bgUlRUZOon9OGHH7Z6PafTaYwZM8Z9/u9+9zvT84cOHTJ9Dzvq7LPPdl9n48aNHb5Oe7QVuFRXVxu7du0yHn/8cSMhIcF97siRI43Dhw+3eu2WAhfDMIyhQ4cakoxu3bqZxquqqtzvM2zYMNO4p7NMXnnlFSMyMrLZ4KXh7JfJkycbzz33nOn9PbmP9ny19r9NAADvoIcLACAgXXfddfr9738vl8ul7Oxsff311zr33HObnPfGG2+4+2D07t272XMaKi4u1urVq7Vt2zYVFBSovLzctDPRzp073Y83btyoiy++2Et31NTixYvdj6+66iqFh4e3ev5PfvIT3Xnnna3uLNRYZWWlVq9erS1btigvL09lZWXu75dk3l1l48aNnhfvBd9++6378U033dTmbk6XXXaZEhMTVVhYqJqaGq1atcq980xzpk2bpt69e7d6zXHjxrkfZ2RkeFb4cVi5cqW7n1BSUlKbP192u1233HKL7r33Xknmn5mj14iMjFR1dbW2bt2qFStW6LTTTmt3Xampqe7HL730kl588cV2X+N4HN39qjV2u12XXnqpXnjhhXb3b2no+uuv14MPPqiSkhJ99NFHuuqqqyRJH330kXtr5+uvv75D17711lt19tln67HHHtNbb72loqKiJucYhqE1a9ZozZo1euyxx/Taa6/p9NNP7+jtAAAsROACAAhI/fr101lnnaUvv/xSkvTaa681G6YcbXApSddee61CQkKavV5WVpZ+97vf6f3333d/4G2Lr5uDpqWluR9PnTq1zfPj4uJ0wgknaMOGDW2eW1hYqDlz5mj+/PkqKyvzqJ7ObIZqGIYp4Dn11FPbfE1YWJgmT56szz//XJK0YcOGVgOXE088sc1rNmyMXFpa2ub5x6vh3/nkyZMVGtr2r2oNA5S0tDQZhuEOJ8LDw3XppZfq7bfflsPh0BlnnKGrrrpKl19+uWbMmKGEhASP6rryyiv13//+V1J94LJ+/XrdeOONOvfcc5s0U7bKJZdcov/85z8e31NLrr/+ej300EMyDEPz5893By5H/7fEZrN1OHCRpP79++uFF17Q008/re+//17Lli3T2rVrtX79endT4qOysrJ09tlna9GiRTrnnHPavPb+/fs93mYdAOB7BC4AgIB14403ugOX//3vfyovL1dsbKz7+bS0NG3ZssV0fnPS0tJ05plnNvuvza3xNKjoqLy8PPfj/v37e/Sa/v37txm4HDhwQDNmzNDBgwfbVY+v77ehkpIS1dXVuY8HDBjg0esafthsKyDq1q1bm9cLCwtzP25Yj680/DvvyD3X1taqrKxM8fHx7rGnn35a69ev1549e1RbW6vXXntNr732mux2u8aMGaPp06fr7LPP1vnnn6+IiIhm3+Pcc8/VXXfdpeeee06S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3367+/jOO+/UCy+80GS3pKN/P0ebH8fHx3sUPvmrOXPmuJvn7t69W+eee6727dtnOsflcukf//iHqU/KL37xiybbFa9fv14DBw7UQw89pO3btzf7fk6nU++88457y2epfhleQ1OnTtU111yjzz77rMUAZ/fu3abZZGeeeWabP4/eNnLkSF155ZXu48cee8zjwKk5Q4cO1cSJEzVx4kQNHTq0w9cpKirSb37zGw0cOFD33HOPNmzY0OKMrfz8fP361782/QyPGzeOwAUAAlCo1QUAAOANN954Y7P9RtrawvWcc87RjBkztHTpUhmGofvuu08vvPCCxo8fr27dumnPnj1auXKlnE6n+vXrp7vvvtsUgvjaAw88oK+++korVqyQYRj63e9+p3/84x+aOXOmYmNjlZ6ermXLlsnpdGrKlCkaMmSI3nzzzRavN3LkSF1//fXuHjdPPvmk3nzzTU2aNEnJycnKyMjQ0qVLVVtbq7i4OD3xxBP6f//v/7VZ5+zZs/XXv/5VUn0D03nz5mno0KGmxrd///vf233/f//737Vu3TqtXbtWDodDd955px599FFNmzZNsbGx2rt3r5YuXeoOoUJDQ/Wf//ynSfAQSIYMGaJXXnlF1157rZxOp1atWqURI0Zo+vTpGjJkiMrLy7Vs2TIdOnTI/ZpTTjlFjz/+eLPXy8nJ0cMPP6yHH35YvXv31tixY9W7d2+FhobqyJEjWr9+vam3z/Tp001Lc6T6IO2tt97SW2+9paioKJ100kkaPHiw4uPjVVRUpH379mndunXu86Oiojr09+0Nf/rTn/Tuu+/K5XIpMzNT8+bN6/TZaS3Jy8vT008/raefflrdunXThAkT1KdPH8XFxam8vFx79uzR+vXr3VtQS1KvXr30xhtvmJYDtuTBBx9sV1PfWbNmafbs2R26FwCABwwAAIJAaWmpER0dbUhyf40aNcqj1x4+fNgYP3686bWNv0aPHm1s27bNmDt3rnvsxhtvbPZ6ixcvdp8zc+bMFt+34fVbU1JSYpx33nmt1nfqqaca2dnZxo033ugemzt3brPXq6ioMM4555xWr5eSkmIsX77c43spLi42Ro4c2eo1G9q/f797fMCAAa3ef1lZmXHllVe2em1JRp8+fYxPP/201Ws9+OCD7vMffPDBVs81DM//Lj3lyd/PUQsXLjR69erV5n1fffXVRkVFRbPXWL16tREaGtrmNY5+XX755UZpaWmT65xwwgkeX2PQoEHGihUrjvt71fC/tbZ+Rhq74oorTPXU1dWZnm/48yfJqKqq6nCdVVVVpmvt37+/yTk7d+40Zs6caYSEhHj8fZRknH/++ca+fftafO/G99Her7vvvrvD9w0AaBszXAAAQSEuLk6XXXaZ3njjDfdYW7NbjurVq5dWrlypV155RW+//ba2bt2qyspKJScna8SIEbrqqqt07bXXKjo6WmvWrPHVLbQoPj5en332mT788EPNmzdPa9euVWFhoZKSkjRq1Chde+21uu6660yzSVoTHR2tzz77TG+++aZeffVVpaWlqbS0VElJSRo8eLBmz56tm266Sd27d9eSJUs8uma3bt20du1a/fOf/9SiRYu0Y8cOFRcXe6WfS2xsrN555x396le/0muvvaYlS5YoOztbVVVVSkpK0gknnKCLLrpIt9xyS6cu+fK1iy66SOnp6frvf/+rTz75RNu2bVN+fr6ioqLUt29fzZo1SzfccIOmTJnS4jWmTJmi3Nxcff3111q+fLnS0tK0d+9eFRQUyOl0Kj4+XkOGDNEpp5yi6667TpMnT272Ohs3btTq1au1ePFirVmzRrt27VJ2drYqKysVHR3tnjlzySWX6Morr7R8R50//elPev/992UYhvbv36/XXntNN998s2X1jBgxQkuWLFF+fr6WLFmi5cuXa8uWLUpPT1dBQYGqq6sVHR2t7t27a+TIkZo8ebKuvPJKj3YSAwD4L5thtNHyHwAAAAAAAO1C01wAAAAAAAAvI3ABAAAAAADwMgIXAAAAAAAALyNwAQAAAAAA8DICFwAAAAAAAC8jcAEAAAAAAPAyAhcAAAAAAAAvI3ABAAAAAADwMgIXAAAAAAAALyNwAQAAAAAA8DICFwAAAAAAAC8jcAEAAAAAAPAyAhcAAAAAAAAvC7W6ADSvurpaW7ZskST17NlToaH8VQEAAAAA4G0Oh0N5eXmSpBNPPFGRkZFeuS6f4v3Uli1bNHnyZKvLAAAAAACgy1izZo0mTZrklWuxpAgAAAAAAMDLmOHip3r27Ol+vGbNGvXp08fCagAAAAAACE45OTnuFSYNP4sfLwIXP9WwZ0ufPn2UkpJiYTUAAAAAAAQ/b/ZPZUkRAAAAAACAlxG4AAAAAAAAeBlLivzEmDFjTMd1dXUWVQIAAAAAAI4XM1wAAAAAAAC8jBkufmLbtm2m46ysLKWmplpUDQAAAAAAOB7McAEAAAAAAPAyAhcAAAAAAAAvI3ABAAAAAADwMgIXAAAAAAAALyNwAQAAAAAA8DICFwAAAAAAAC8jcAEAAAAAAPAyAhcAAAAAAAAvI3ABAAAAAADwMgIXAAAAAAAALyNwAQAAAAAA8DICFwAAAAAAAC8jcAEAAAAAAPAyAhcAAAAAAAAvI3ABAAAAAADwMgIXAAAAAAAALyNwAQAAAAAA8DICFwAAAAAAAC8jcAEAAAAAAPAyAhcAAAAAAAAvI3ABAAAAAADwMgIXAAAAAAAALyNwAQAAAAAA8DICFwAAAAAAAC8jcAEAAAAAAPAyAhcAAAAAAAAvI3ABAAAAAADwMgIXAAAAAAAALyNwAQAAAAAA8DICFwAAAAAAAC8LtboAtO2WuWsU1T3D6jI8FmK3qXt0uBJjwpUYG64eMeFKjIn44c9jX9HhIbLZbFaXCwAAAACA1xG4BIDtOWUKrYiwugyviwi114cwsc0HMokx4e6xHjERio8KJaABAAAAAAQEAhdYpsbhUnZJtbJLqj06P9RuU0L0sRDm2OyZ+j+7NwhnEmPC1T06TKEhrJoDAAAAAHQ+AhcEDIfLUH55jfLLazw632aTukWFHQtkosPVI/bo7JnmZ9REhoX4+C4AAAAAAF0BgUsA+MOFo9SjVx+ry/BYjcOloopaFVbUqqCiVkU//FlYUaPCilrVOY1OqcMwpOLKOhVX1mlfXoVHr4kJD/F4iVNibLhi6EMDAAAAAGgGgUsAuPjkvkpJSbG6DK8wDENlNQ4Vlh8LYwobBDIFPxwfC2lqVVnr7LT6KmqdqiisUmZhlUfnh4falfhDg+Bjs2eOLXHqEROuHrER6hUXqeT4CGbQAAAAAEAXQeCCTmWz2RQfGab4yDANTIrx6DXVdc768KW8VgUVNSqqrFVBeX0YU9ggmDn6VVJV5+O7OKbW4dLh0modLvWsD018ZKiS4yPVKz5CyT+EMMlxx46P/hkVTjADAAAAAIGMwAV+LzIsRP0SotQvIcqj8+ucLhVV/hDAlDcNZOpDmhr346LKOjldnbPMqbTaodLqcqXnlrd6XlxkqJLjItQrPvLYnw0fx0UoOT5C0eH8JwwAAAAA/ohPawg6YSH2+tkjcZEene9yGSqtrnMHM8dmz9SosKLOtNTp6IyaWofLp/dQVu1QWbVDe9voPRMXEWqeJeMOYyLV6+ifBDMAAAAA0On4FIYuz/7DdtMJ0eEa0rPt8w3DUEWt09QMuOESp8ZLnfLKalRV55s+NGU1DpXltR3MxLqDGfOsmZ5xEfVfsRFKio1QQnQYTYABAAAAwAsIXIB2stlsio0IVWxEqFITo9s83zAMldc4dKS0Rrll1cr94c/64xodKa1W3g9/+qpBcHmNQ+V5jjZ3awq129QjNlxJPwQwPeMifngc3uBx/XH36HDZ7YQzAAAAANAcAhfAx2w2m+IiwxQXGaahybGtnlsfzBwLZXJL64OYxsFMhY+CGYfL0JHSGh0prWnz3BC7TYkx4ccCmdgIJcXVPz4WzEQoKa5+G+0QwhkAAAAAXQiBC+BHYiNCFdszVkN6th3M5DYTxOQ2+DO3tEblNQ6f1ep0Gcorq1FeWdvhjM0mJUbXBzGJMeHqFhWmhOgwdYsKU3xU/Z8Nx45+xUWGEdQAAAAACEgELkAAOhrMDG4jmKmocTQKYRqEMqU1OlJWrfyyGpVW+y6YkSTDkAp+6GvTHjZb/b02DmLqv8JNx/FRoYqJCFVcRKhiI+sfx4SHEtgAAAAAsASBCxDEYiJCNSgiVIOSYlo9r8bhVEF5rfLLa+q/ymqVd/Rxea3yy2rczxVV1nVS9fVBzdEdmzJV1aFrxISHKOaHECYuoj6Iif3h+GgvnpiIUMVFNnjcILQ5+jgqLISGwgAAAAA8RuACQBGhIeqbEKW+CVFtnlvndLl3XzoayOQ1CGSOBjb55TUqrKyVYXTCDbSiotapilqncj1Y+tQau03uACamUWDTbGjT4HHsD8dHH0eE2glvAAAAgCBH4AKgXcJC7OoVH6le8ZFtnutwulRYWesOYI7OkCmpqlNpVf2fxZW1KvnhcUmVQ6VVdap1ujrhTtrH1WC2zfEKC7E1CGLCFB8Z2mBplHmZVLeoMMVHNuxzE67wULsX7ggAAACALxG4APCZ0BC7kuMilRzXdjhzlGEYqqpzHgthKutUXGUOaeqDmmOPS6vqVFrtUEWNQ1V1vtnByZvqnIaKK+vvQR1YKhUXGaoeMeFKjAlXYkyEesSEq0ds/XH9nxFKjotQn26R6hYVxmwaAAAAwAIELgD8is1mU3R4qKLDQ9WnW9tLnBpzOF2qqHWqvMah8mpH/Z8/PK6ocajs6OPa+tkq5TX146Zzf/iqdfjfTBvp2EybjILKNs+NCLWrT7f6GUl9ukWqV7dI9YmPVO9ukeqbEKUBPWLULSqsE6oGAAAAuhYCFwBBJTTErm5Rdq+ECDUOpypqnPVBTYNwpqy5AKdRWNM4wHG6rGlmU+NwKaOgstVwJjEmXAN7RGtgUowG9ojRwKQYDeoRo4FJ0YqLJIwBAAAAOoLABQBaEBEaoojQECXGhB/XdQzDUI3DZQ5tfnhcvxzq6NIox7FlUtU/LJX64bii1ndLpQoralVYUasNB4ubPNenW6TG9I3X6L7dNLpPvMb0jVdK9yiWKQEAAABtIHABAB+z2WyKDAtRZFiIesZFdOgadU6XSqrqVFhRq4Ly2h9CkhoV/BCWFFTUqrD86OP6cW/sEJVTUq2ckmp9vSPXPRYfGarRfeM1pm83TRjQXZMGJnb4vgAAAIBgReACAAEgLMSupNgIJcVGSL3aPr/W4VJuWbWOlNYHJod/+MoprdaRH0KUnJIqdWSlU2m1Q6v3FWr1vkL9Z/l+SdLgnjGaPDBRkwfVf6V0j27/hQEAAIAgQuACAEEoPNSulO7RrQYftQ6XMosqlZFfof35FTpQUKmMgvrHh4qr2jVDZl9ehfblVejttZmSpH4JUTplcA/NHNFT04cmqftxLssCAAAAAg2BCwB0UeGhdg3pGashPWObPFfjcGp/foW2Z5dqe3aptmWXalt2iUqrHR5d+1BxlT7YkKUPNmTJbpNOTk3QzOE9NXN4T52UkqAQOz1gAAAAENxshuGNVf7wtqysLKWmpkqSMjMzlZKSYnFFALo6wzB0qLjqh/ClVBszi7U+o7DdDX27R4dpxvCeOnNUL80c3pNtqQEAAGApX33+ZoYLAMAjNpvNvUzp3DG9JUkOp0vbc0q1Zn+h1uwv1NqMQhVV1rV6naLKOn20MVsfbcxWqN2mSQMTdeaoZJ01qpcGJsV0xq0AAAAAPscMFz/FDBcAgcjlMpSeV66V6flauidfK/fmq7rO5fHrh/SM0VmjeumMkcmaMKC7QkPsPqwWAAAA8N3nbwIXP0XgAiAYVNc5tTajUN/tytN3u/O0J7fc49cmRIfp9B+WHs1g6REAAAB8hMCliyFwARCMsooqtXhXnr7ZcUQr9xao1uHZ7JejjXenD03StGE9Na5/gsKY/QIAAAAvIHDpYghcAAS7ihqHlqfn65sdR/Ttzjzll9d4/NqY8BCdMriHpg1L0vRhSRrSM1Y2GzsfAQAAoP1omgsACCoxEaE6d0xvnTumt1wuQ5uyivXtzlx9vSNXO3JKW31tRa1T3+zM1Tc7cyVJveMjNW1YkqYNTdKpQ3soOS6yM24BAAAAaBEzXPwUM1wAdGWHiqv07Y4j+npHrlbt83zp0VFDesZo6pAeOmVw/VdSbISPKgUAAECgY0lRF0PgAgD1jjbeXb4nX8v25Gt7G7NfmjMsOdYdwEwZlKgeBDAAAAD4AYFLF0PgAgDNyy+v0Yr0fC3fk6/l6fnKKalu9zVG9IrTaUOTNGN4kk4Z3EORYSE+qBQAAACBgB4uAABISoqN0I/G9tOPxvaTYRjam1eh5XvytDw9X6v3Faq8xtHmNXYdKdOuI2X674r9Cg+1a8qgRM0Y1lMzhvfU8F404AUAAMDxY4aLn2KGCwC0n8Pp0rbsUq3aV6DV+wq0dn+hKmqd7bpG7/hITR+WpBnD6wOYblFhPqoWAAAA/oAlRV0MgQsAHL86p0tbD5X8EMAUal1GoSrbEcCE2m2aNDBRZ45K1tmje2lAjxgfVgsAAAArELh0MQQuAOB9dU6XNmcVa9mefC3dnaeNmcVyteP/BYcmx+qsUb101qhkjevfXSF2lh4BAAAEOgKXLobABQB8r6SyTiv21ocvS3fnKbsdDXgTY8J19qheuvCkPpo6pIfCQuw+rBQAAAC+QuDSxRC4AEDnqm/AW67vdtcHMKv2FajW4fLotd2jw3TeCb31o7H9NGVQIk13AQAAAgiBSxdD4AIA1qqocWh5er6+3n5Ei3flKr+81qPX9U+M1uUTUvTj8f2U0j3ax1UCAADgeBG4dDEELgDgP1wuQxuzivX19iP6Zkeudh0pa/M1Npt05sheuuW0gZo6pAezXgAAAPwUgUuQGzNmjOm4rq5Oe/bskUTgAgD+5mBBpT7flqNFm3O0KaukzfNH9IrTrdMG6dJx/RQeSq8XAAAAf0LgEuQIXAAgMGUWVuqTzTn6YEOW0nPLWz23X0KUfj5riC6fkKKI0JBOqhAAAACtIXDpYlhSBACBxTAMbcoq0XvrMvXxxmyV1ThaPLdPt0j96qxhunxCKltLAwAAWIzApYshcAGAwFVR49AHG7I0b0WG9uVXtHje8F6x+t35IzVrRDI9XgAAACziq8/fLCQHAMDLYiJCdcPUgfr6npmae9MkTRjQvdnzdh8p1y3z1unqf6/W5qzizi0SAAAAPkXgAgCAj9jtNs0amaz3/99UvfnTKZoyKLHZ81bvK9Qlz6/QXW+l6WBBZSdXCQAAAF8gcAEAwMdsNptOHZqkd26fqvm3TNaoPvHNnrdwU7bOeuo7Pfb5TpW30gMGAAAA/o/ABQCATjRjeE8tumuanrryZPXtFtnk+VqnSy8u2atZf1+i99ZlyuWi1RoAAEAgInABAKCT2e02/Xh8ir6973Q9cP5IxUWGNjknr6xGv3l/sy795wqtP1BoQZUAAAA4HgQuAABYJDIsRLfPHKKlv5mlW04bpNBmtojenFWi2S+u0t1vpymnpMqCKgEAANARBC4AAFise0y45lw8Wl/8eoZmjejZ7DkfbczWGX//Ts9+s0fVdc5OrhAAAADtReACAICfGNIzVnNvnqy5N0/S4J4xTZ6vqnPqqa9268wnv9Mnm7NlGPR3AQAA8FcELgAA+JlZI5L1xa9m6E8XjW62v8uh4ird+Waarnp5tbYeKrGgQgAAALSFwAUAAD8UFmLXrdMGacl9p+vaKf3VTHsXrcko1CXPL9f/fbJdFWwjDQAA4FcIXAAA8GM9YiP0yGUn6pO7puuUwYlNnncZ0ivL9+ucp5fq251HLKgQAAAAzSFwAQAgAIzuG6+3bjtFL103Xindo5o8f6i4SrfMW6dfvLFBuaXVFlQIAACAhghcAAAIEDabTeed0Edf3zNT95w9XOGhTf9vfNGWHJ351Hd6ffUBuVw01QUAALAKgQsAAAEmMixEvzxzmD6/e7qmDu7R5Pmyaof+uGCrrnh5lXYdLrOgQgAAABC4AAAQoAb3jNWbt03RE5efpITosCbPrz9QpAufXaYnvtip6jqnBRUCAAB0XQQuAAAEMJvNpismpuqbe2bqx+P6NXne4TL0wuK9Ou+ZpVq5N9+CCgEAALomAhcAAIJAj9gIPXXVWL1+6xQN6BHd5PmMgkpd8+/v9cCHW1RaXWdBhQAAAF0LgQsAAEFk2rAkffGrGfrFrCEKtduaPP/WmoM65ym2kAYAAPA1AhcAAIJMZFiIfnPuSC365XRNGNC9yfOHS6t1y7x1+tXbaSqurLWgQgAAgOBH4AIAQJAa0TtO790+VQ9fMkbR4SFNnl+wMVvnPbOM3i4AAAA+QOACAEAQs9ttuvHUgfriVzM0fVhSk+cPl1br2le+16Of7VStw2VBhQAAAMGJwAUAgC4gNTFa82+ZrMcvP0nxkaGm5wxDeum7vZr94krtzSu3qEIAAIDgQuACAEAXYbPZdOXEVH11z0xNG9p0tsuWQyW66Nnl+nBDlgXVAQAABBcCFwAAuphe8ZGaf8tk/eGCUQoLMe9kVFXn1D3vbtLvPtis6jqnRRUCAAAEPgIXAAC6ILvdpttmDNb/fn6ahvSMafL822szdekLK7SPJUYAAAAdQuACAEAXdkK/bvrkrum6enJqk+d2Hi7Txc8t18JN2RZUBgAAENgIXAAA6OKiwkP0tx+fpGeuGttk++iKWqfueitNf1ywhSVGAAAA7UDgAgAAJEmXjuunj++cpuG9Yps89/rqg7r8pZU6WFBpQWUAAACBh8AFAAC4DU2O1Ue/mKbLJ6Q0eW7roVJd+Nwyfb71sAWVAQAABBYCFwAAYBIVHqK/X3GyHr/8JEWGmX9VKKt26P+9vl4PL9ymWofLogoBAAD8H4ELAABo1pUTU/XRL6ZpcDO7GM1dkaGr/rVKuaXVFlQGAADg/whcAABAi0b0jtPCO6fpR2P7Nnku7WCxLnl+hbZklVhQGQAAgH8jcAEAAK2KiQjVM1eN1V8vO1HhoeZfHQ6XVuuKl1fqk81sHQ0AANAQgQsAAGiTzWbTNVP6638/P1Up3aNMz1XXuXTnm2l66qvdcrkMiyoEAADwLwQuAADAY2P6dtPHd07T5EGJTZ579ps9+sWbG1RZ67CgMgAAAP9C4AIAANolMSZcr986RVdPTm3y3GdbD+uKl1bpCM10AQBAF0fgAgAA2i081K6/XnaiHrp4tELsNtNz27JLddkLK7TrcJlF1QEAAFiPwAUAAHSIzWbTTacN0rybJyk+MtT0XHZJtS5/caVWpOdbVB0AAIC1CFwAAMBxmT6spxb84jQN7BFtGi+rcejG/67RhxuyLKoMAADAOgQuAADguA3uGasPf36axvdPMI07XIbueXeT5q/KsKQuAAAAqxC4AAAAr0iMCdebt52iC0/s0+S5OR9t0wuL0y2oCgAAwBoELgAAwGsiw0L03NXjdNv0QU2ee+KLXXrs850yDMOCygAAADoXgQsAAPAqu92m318wSr85d0ST515csld/+4zQBQAABD8CFwAA4HU2m02/mDVUD148uslz/1q6T09/vceCqgAAADoPgQsAAPCZm08bpMcvP0l2m3n82W/26J9L6OkCAACCF4ELAADwqSsnpuqJy0+WrVHo8vjnu/Tf5futKQoAAMDHCFwAAIDPzZ6QokcuPbHJ+J8/2a43vz9oQUUAAAC+ReACAAA6xTVT+mvORU17uvxhwRYtSDtkQUUAAAC+Q+ACAAA6zS3TBun+88y7FxmGdN97m7RkV65FVQEAAHgfgQsAAOhUPz99qH55xlDTmMNl6OdvbNCmzGJrigIAAPAyAhcAANDpfn32cN1y2iDTWGWtUzfPW6v9+RUWVQUAAOA9BC4AAKDT2Ww2/fHCUbrk5L6m8cKKWt3w3++VW1ZtUWUAAADeQeACAAAsYbfb9PcrTta0oUmm8czCKt3037Uqq66zqDIAAIDjR+ACAAAsEx5q10vXT9AJ/eJN49tzSvXzNzbI4XRZVBkAAMDxIXABAACWio0I1dybJmtAj2jT+LI9+Xpo4TYZhmFRZQAAAB1H4AIAACzXMy5C82+ZrKTYcNP466sPat7KDGuKAgAAOA4ELgAAwC8M6BGjl6+fqPBQ868nf/lkuxbvzLWoKgAAgI4hcAEAAH5jwoDu+vsVJ5vGXIZ011tp2nm41KKqAAAA2o/ABQAA+JVLTu6rX5813DRWXuPQrfPWKa+sxqKqAAAA2ofABQAA+J1fnjlUPxrb1zR2qLhKt81fp+o6p0VVAQAAeI7ABQAA+B2bzabHZp+kCQO6m8Y3ZhbrN+9vZuciAADg9whcAACAX4oMC9HL109QSvco0/jCTdl6eek+i6oCAADwDIELAADwW0mxEfrvTZMUFxFqGn/s851asoudiwAAgP8icAEAAH5teK84PXv1ONlsx8YMQ/rlW2nKyK+wrjAAAIBWELgAAAC/N2tksu47Z4RprLTaodvmr1N5jcOiqgAAAFpG4AIAAALCz08fogtP7GMa25Nbrnve2SiXiya6AADAvxC4AACAgGCz2fTEFSdpZO840/iX24/oxe/2WlQVAABA8whcAABAwIgOD9W/rp+ohOgw0/iTX+7Syr35FlUFAADQFIELAAAIKP17ROv5q8fL3qCJruuHJrqHS6qtKwwAAKABAhcAABBwpg1L0j1nDzeN5ZfX6s43N6jO6bKoKgAAgGMIXAAAQED6+elDdcbIZNPYugNFeuyznRZVBAAAcAyBCwAACEh2u01PXXmy+iVEmcZfWb5fn2/NsagqAACAegQuAAAgYCVEh+vF68YrPMT8K81v3tus/fkVFlUFAABA4AIAAALcSSkJmnPxaNNYWY1Dd7y+XtV1TouqAgAAXR2BCwAACHjXTumvy8b1M43tPFymxz6nnwsAALAGgQsAAAh4NptNj1x2gob3ijWNz12RocU7cy2qCgAAdGUELgAAIChEh4fquavHKyK0UT+X9zcpr6zGoqoAAEBXReACAACCxojecfrjhaNMY/nltbr3vU1yuQyLqgIAAF0RgQsAAAgq150yQGeN6mUaW7o7T/9dsd+iigAAQFdE4AIAAIKKzWbT45efpOS4CNP4Y5/v1NZDJRZVBQAAuhoCFwAAEHQSY8L19FVjZbMdG6tzGvrl22mqqmWraAAA4HsELgAAICidNjRJP5sx2DS2L69Cj3/BVtEAAMD3CFwAAEDQuvfsEToppZtpbO6KDK3eV2BRRQAAoKsgcAEAAEErPNSup68a2+xW0RU1DouqAgAAXQGBCwAACGpDesbqN+eOMI1lFlbpb5/tsKgiAADQFRC4AACAoHfLaYM0eWCiaez11Qe1fE++RRUBAIBgR+ACAACCnt1u0xNXnKSosBDT+P3vb1I5S4sAAIAPELgAAIAuYUCPGD1wwUjTWHZJtZ76crdFFQEAgGBG4AIAALqM66YM0NTBPUxj81bu15asEosqAgAAwYrABQAAdBl2u01//fGJCm+wa5HLkB7432Y5nC4LKwMAAMGGwAUAAHQpg5Ji9MszhprGth4q1byVGdYUBAAAghKBCwAA6HJ+NmOIhiXHmsae+mq3DhVXWVQRAAAINgQuAACgywkPteuvPz7RNFZZ69ScBVtlGIZFVQEAgGBC4AIAALqkSQMTdfXk/qaxb3bm6vOthy2qCAAABBMCFwAA0GX97ryRSoqNMI09tHCbKmocFlUEAACCBYELAADosrpFh+nBi0ebxo6U1uifS9ItqggAAAQLAhcAANClXXRSH00flmQa+/fS/TpQUGFRRQAAIBgQuAAAgC7NZrPpwYtHK9Ruc4/VOl36yyc7LKwKAAAEOgIXAADQ5Q1NjtNNpw40jX2944iW7Mq1piAAABDwCFwAAAAk/fKsYUqKDTeN/fmT7ap1uCyqCAAABDICFwAAAEnxkWG6/7yRprF9eRV6dWWGNQUBAICARuACAADwg8vHp+jklG6msX98s0e5ZdUWVQQAAAIVgQsAAMAP7HabHrpkjGmsvMahp77cbVFFAAAgUBG4AAAANDCuf3fNHp9iGnt3XaZ2Hi61qCIAABCICFwAAAAa+e15IxQVFuI+dhnSXz/daWFFAAAg0BC4AAAANJIcH6nbZw42jS3dnafvdudZVBEAAAg0BC4AAADN+NmMwUqOizCN/e3THXK6DIsqAgAAgYTABQAAoBnR4aG675wRprGdh8v0/vpMiyoCAACBhMAFAACgBbMnpGhk7zjT2N+/3K2KGodFFQEAgEBB4AIAANCCELtNf7hwlGksr6xGLy/dZ1FFAAAgUBC4AAAAtGL6sJ6aObynaeyVZfuUV1ZjUUUAACAQELgAAAC04Q8XjpLdduy4stapFxanW1cQAADwewQuHjh06JCeeeYZnXPOOerfv7/Cw8PVu3dvzZ49W99//73V5QEAAB8b3itOs8enmMbe/P6gsooqLaoIAAD4OwIXDzz33HP69a9/rX379umcc87Rvffeq2nTpumjjz7SqaeeqnfeecfqEgEAgI/96uzhCg859qtTrdOlZ77eY2FFAADAn4VaXUAgmDx5spYsWaKZM2eaxpctW6YzzzxTd9xxhy699FJFRERYVCEAAPC1fglRuvaU/pq7IsM99uGGLN0+Y7CG9Ypr+YUAAKBLYoaLB3784x83CVskafr06Zo1a5aKioq0ZcsWCyoDAACd6Rezhio6PMR97DKkJ7/cbWFFAADAX/k8cMnNzdUnn3yiOXPm6Pzzz1dSUpJsNptsNptuuummdl3rwIEDuvfeezVy5EjFxMQoMTFRkyZN0hNPPKHKSmvWUIeFhUmSQkOZLAQAQLBLio3QT6cNMo19vu2wNmUWW1MQAADwWz5PCXr16uWV6yxcuFDXXXedSktL3WOVlZVat26d1q1bp1deeUWLFi3S0KFDvfJ+njh48KC+/vpr9enTRyeeeGKnvS8AALDOT2cM1vzVB1RcWecee+KLXXr9p1MsrAoAAPibTl1S1L9/f51zzjntfl1aWpquuuoqlZaWKjY2Vo888ohWrlypb775Rrfddpskaffu3brwwgtVVlbm7bKbVVdXp+uvv141NTV67LHHFBIS0vaLAABAwIuPDNMdM4eYxpan52tler5FFQEAAH/k8xkuc+bM0aRJkzRp0iT16tVLGRkZGjRoUNsvbODuu+9WVVWVQkND9eWXX2rq1Knu58444wwNGzZM999/v3bv3q0nn3xSDz30UJNr3HvvvaqpqWnXew4bNqzZ51wul2666SYtXbpUt912m66//vp23Q8AAAhsN546UP9dsV9HSo/9bvHYF7u0YEgP2Ww2CysDAAD+wmYYhtGZb9gwcLnxxhs1b968Vs9fs2aNpkypn6J7++2366WXXmpyjsvl0gknnKAdO3YoISFBubm57t4qR8XGxqqiosLjOhcvXqzTTz+92fe65ZZb9Oqrr+q6667Tq6++Krvd+xOFsrKylJqaKknKzMxUSkqK198DAAB03BvfH9Af/rfVNPbfmybqjJHeWU4NAAA6h68+f/v9LkULFixwP7755pubPcdut+uGG26QJBUXF2vx4sVNzikvL5dhGB5/tRS23HzzzXr11Vd19dVXa968eT4JWwAAgP+7cmKqBvaINo394+s96uR/ywIAAH7K79OC5cuXS5JiYmI0YcKEFs9ruG3zihUrvF7H0bBl/vz5uuqqq/Taa6/RtwUAgC4sLMSuu84wLz/elFWiJbvyLKoIAAD4E7/fy3jHjh2SpKFDh7a69fLIkSObvMZbji4jmj9/vq644gq9/vrrxx22ZGVltfp8Tk7OcV0fAAD43o/G9tVz3+5RRkGle+yZb/bo9BE96eUCAEAX59eBS3V1tfLz6zv+t7WGqnv37oqJiVFFRYUyMzO9Wsef//xnvfrqq4qNjdXw4cP1f//3f03OufTSSzV27FiPr3l0fRgAAAhcoSF23XnGMN333ib32KbMYn23O0+nj0i2sDIAAGA1vw5cGm7xHBsb2+b5RwOX8vJyr9aRkZEhqb4PzCOPPNLsOQMHDmxX4AIAAILDpT/McjnQcJbL13s0czizXAAA6Mr8OnCprq52Pw4PD2/z/IiICElSVVWVV+uYN29em7sptVdbs3BycnI0efJkr74nAADwvtAQu34xa6juf3+ze2xjZrGW7snXzOE9LawMAABYya8Dl8jISPfj2traNs+vqamRJEVFRfmsJm9hm2cAAILHZeP66flv03Ww8Ngsl398vVszhiUxywUAgC7Kr3cpiouLcz/2ZJlQRUWFJM+WHwEAAHhLWIhdd84aahrbcLBYK/cW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SREAAAAAAIDJCFwAAECNFR0dLZvNpgkTJkiSdu3apQcffFBRUVEKDg5WVFSUJk6cqCNHjrjV36pVq/TAAw+oVatWCgoKUuPGjdW/f3/NmTNHmZmZbvVx8OBB/cd//Ie6du2qhg0bKiAgQM2bN9fQoUP11ltv6fz58+X28e2332rkyJFq3ry5goKC1KZNGz3xxBNKTk4u876UlBS9/PLLuuWWW9SgQQMFBASoWbNm6tq1qx588EHFx8crIyPDrc8BAADKZjMMw7C6CAAAgBtt3LhRcXFxkqRZs2bp1Vdf9biP6OhoJSUlafz48brttts0depU2e32Uu2CgoL097//XaNHj3baT25urh566CF9/vnnLt8rMjJSq1evVo8ePZxeLyws1Isvvqh3331XZf3za/z48SWOfz59+rTatGkjSVq8eLGOHj2qOXPmOL03IiJCCQkJ6tixY6lrmzZt0j333FNuoLJq1Srdc889ZbYBAADlYw8XAABQ4+3bt0/Lly9X06ZNNWPGDMXGxio3N1dr1qzRu+++q7y8PD388MNq06aNevfuXer+8ePHO8KW7t276/nnn1fHjh116dIlrVixQvHx8UpJSdGQIUO0f/9+tWzZslQfjz/+uBYtWiRJatGihaZNm6Zbb71VDRo0UGpqqnbu3KlPPvmkzM/x0UcfaevWrRo8eLCmTp2qmJgYXblyRUuXLtXSpUuVmpqqSZMmadu2bSXuy8vL09ixY5WRkaF69erpiSeeUFxcnJo2bar8/HydOnVKW7duLTNQAgAAnmGGCwAA8EnFZ7i4e0rRr371KwUEBDieX5/hIkmtW7fW9u3b1bx58xL3bNiwQcOGDZPdblefPn20c+fOEtdXr17tmPExZMgQrVmzRoGBgSXafPTRR3r88cclSb/73e/08ccfl7j+r3/9S/fdd58kqX///lqzZo3Cw8OdfoazZ88qKirK8bz4DBdJmjJlij788EPZbLYS902ZMkULFiyQJO3Zs0c9e/Z0XPvuu+80ZMgQSWXPYLHb7crOzlb9+vWdXgcAAO4jcAEAAD6peODirlOnTik6OtrxvHjg8sknn+j+++93et+TTz6pDz74QNK1fV6Kz3IZPny41q5dq4CAAJ04caJEGFLcnXfeqXXr1snf319nzpxRixYtHNduvfVWbdu2TSEhIUpMTFRkZKTbn6l44NKiRQudOnVKQUFBpdodPXpUHTp0kCS99957evrppx3Xli9frocffliSlJ6eTqACAEAVYNNcAABQ4zVs2NAxw8SZSZMmOR6vW7fO8dhutyshIUGSNGzYMJdhi3Rthsn1ezZu3Oh4/ZdfftH27dslSWPGjPEobLnRAw884DRska7N7gkLC5MknTx5ssS14uHP4sWLK/z+AADAfQQuAADA582aNUuGYZT7p/jsluJ69uwpf3/XW9f16NHDsUzowIEDjtdPnjyp7OxsSVLfvn3LrLH49YMHDzoe79u3z7FJ7qBBg8r+oOW4PoPFlYYNG0qSrl69WuL1gQMHqm3btpKkZ555RrGxsXrzzTe1ZcsW5efnV6omAADgHIELAACo8Zo2bVrmdX9/fzVq1EiSdOnSJcfrxR+X10fxvWGK35eWluZ4XHymSUWEhISUed3P79o/7QoLC0u8HhAQoFWrVjlOL9q1a5dmzpypgQMHKjw8XHfffbeWL19e6j4AAFBxBC4AAKDGu3GDWav6sFKnTp104MABff7555o0aZLatWsnScrJydHXX3+thx9+WH379tXFixctrhQAgJqBwAUAANR4P//8c5nX7Xa7Y1bK9ZkuNz4ur48LFy44va9JkyaOx+fPn3evYC+pU6eORo0apYULFyoxMVEpKSlatGiRevXqJUn64YcfNHXqVEtrBACgpiBwAQAANd6+fftkt9tdXv/xxx8de5l06dLF8Xrbtm0dy3h27NhR5nsUP066eB89e/Z0zI75/vvvPS/ei1q0aKGJEydq27ZtuuWWWyRJX375pXJyciyuDACA6o/ABQAA1HiXLl3SqlWrXF5ftGiR4/HQoUMdj/39/TV48GBJ0rfffqvk5GSXfSxYsMBxz+233+54vVGjRrr11lslSStXrlRKSkqFPoM3BQQEOD6n3W7XlStXrC0IAIAagMAFAADUCs8995zTZUEJCQmaP3++JKlXr17q06dPietPPfWUJCk/P1+TJ09WQUFBqT4WLVqkb775RpL029/+ttTmuC+99JIkKTs7W6NHj1Z6errLOssKdSpq06ZNOn78uMvr+fn5juOvw8LCFBERYXoNAADUNq7PRwQAAPARFy9eLHHUsit169bVzTffXOr17t2766efflKvXr00Y8YMxcbGKi8vT2vWrNE777wju90uf39/vf/++6XuHTFihEaPHq1//vOf+uabb9SvXz8999xz6tChgy5fvqwVK1Y4Zsg0atRI8+bNK9XHyJEjNXnyZC1cuFBbt25Vp06dNG3aNA0YMED169dXWlqadu/erY8//ljdu3dXfHy8539JZVi/fr1ef/11DRo0SCNGjFC3bt0UERGhnJwcHTt2TH/729+0Z88eSdLkyZPLPEIbAAC4h5+mAADA533wwQf64IMPym3XvXt37du3r9TrPXr00LRp0/TEE09o2rRppa4HBgZqyZIl6tu3r9N+ly5dKrvdrs8//1x79uzRuHHjSrWJjIzU6tWr1bJlS6d9fPjhh6pbt67ef/99paSkaObMmS4/gzcUFRUpISHBMZPFmfvuu09vvvmmV94fAIDahsAFAADUCo899pi6dOmid955R5s3b1ZaWpoiIiI0ZMgQvfTSS+rUqZPLe4ODg/XZZ59p1apVio+P1/bt25WWlqbQ0FDFxMRo1KhRmjZtmsLCwlz2UadOHf33f/+3Jk6cqA8//FAbN27UuXPnlJ+fr8aNG6tbt266++679cgjj5j+2V944QV169ZN69at0969e5WSkuI4/rl58+aKjY3Vo48+qhEjRpj+3gAA1FY2wzAMq4sAAADwhujoaCUlJWn8+PGmL9MBAAAoC5vmAgAAAAAAmIzABQAAAAAAwGQELgAAAAAAACYjcAEAAAAAADAZgQsAAAAAAIDJOKUIAAAAAADAZMxwAQAAAAAAMBmBCwAAAAAAgMkIXAAAAAAAAExG4AIAAAAAAGAyAhcAAAAAAACTEbgAAAAAAACYjMAFAAAAAADAZAQuAAAAAAAAJiNwAQAAAAAAMBmBCwAAAAAAgMkIXAAAAAAAAExG4AIAAAAAAGAyAhcAAAAAAACTEbgAAAAAAACYjMAFAAAAAADAZAQuAAAAAAAAJiNwAQAAAAAAMBmBCwAAAAAAgMkIXAAAAAAAAEz2/wCyprqXToD6mgAAAABJRU5ErkJggg==",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAApXlJREFUeJzs3Xd4VGXexvF70nsjkABJCBA60gm9qYC9LJYFEdS1rrp213Vd2+76Wtbe20qx98aqWEB6750AgYSW3nty3j+QkUPaJExyZpLv57pyOec5Z575nSSGzJ2n2AzDMAQAAAAAAACn8LC6AAAAAAAAgJaEsAUAAAAAAMCJCFsAAAAAAACciLAFAAAAAADAiQhbAAAAAAAAnIiwBQAAAAAAwIkIWwAAAAAAAJyIsAUAAAAAAMCJCFsAAAAAAACciLAFAAAAAADAiQhbAAAAAAAAnIiwBQAAAAAAwIkIWwAAAAAAAJyIsAUAAAAAAMCJCFsAAAAAAACciLAFAAAAAADAiQhbAAAAAAAAnIiwBQAAAAAAwIkIWwAAAAAAAJyIsAUAACdbuHChbDabbDabxo8fX+t1x6+x2WxOe+2rrrrK3uesWbOc1q+zJScn2+uMj4+3upxm4y5fHwAAcGoIWwAAbuHuu+82vTk3DKNR/WRlZcnX15c3vICLmzVrlimQPPnD19dX7dq109ChQ/XnP/9ZixYtcrjvE8O+4x/t2rVTRUWFw31UVlaqffv21fpJTk6u97kpKSn697//rcmTJys2NlaBgYHy9vZWWFiYevbsqXPOOUd///vf9c0336igoKBB99GQj4ULFzp8vwCAhiFsAQC4hZkzZ9of79+/X7/++muj+vnwww9VVlYmSQoMDNQll1zilPpas9Y6SgXWKisrU3p6utasWaNXX31V48aN04QJE5SSktKo/tLT0/Xdd985fP0PP/ygI0eONOg1SkpKdPfdd6tz58564IEHNH/+fKWmpqqoqEgVFRXKzc3Vzp079d133+mxxx7TBRdcoIiICC1fvryhtwMAsJiX1QUAAOCI0047TQMHDtT69eslSXPmzKlzik5t5syZY388ZcoUBQUFOatEAE0kODhYM2bMMLWVlJRo//79Wrp0qYqLiyUdm8J3+umna8WKFWrTpk2DX2fOnDk6//zzHb62IcrKynThhRdq/vz59jYfHx8NGTJEXbt2VUBAgPLy8pScnKwNGzbY76m8vFyFhYUOvcaMGTMUHBzscE0dO3Zs0D0AABxH2AIAcBszZ860hy2fffaZXn75Zfn7+zv8/F27dmnlypWm/qzU2KlQLcGpTAVD6xMREaGXXnqpxnOZmZn685//rI8//liSlJSUpIcfflgvvviiw/337t1b27Zt0zfffKOcnByFhYXVeX1ubq6++uor03Pr8/jjj9uDFpvNpnvvvVf33Xdfja9VXl6uhQsX6uOPP9YHH3zg8H088sgjjC4DABfBNCIAgNuYNm2avL29JUl5eXn68ssvG/T8E/8SHRcXpwkTJjizPAAWaNOmjd5//30NHTrU3vbOO++ovLzc4T6uvPJKSVJpaak++uijeq//+OOPVVJSIknVRtzUpLy8XM8++6z9+NFHH9Xjjz9ea6jj7e2tiRMn6s0331RqaqoGDhzowF0AAFwJYQsAwG20bdtWZ599tv24IcP4DcPQu+++az++8sornboLEADreHp66pZbbrEfFxYWau3atQ4/f9q0afLyOjbg25GfK8ev8fb21rRp0+q9ftWqVcrJybE/57bbbnO4trCwsEZNiQIAWIuwBQDgVk6c+vPjjz86vEDlr7/+qv3799uPT/5rdG5urj744APdcMMNGjZsmCIjI+Xj46OQkBB17dpVU6dO1ccff6yqqirn3IgavvXzl19+qQsvvFAdO3aUr6+vYmJiNHHiRM2dO7dBu6hIUnFxsb788kv95S9/0ejRoxUVFSUfHx8FBQUpPj5eF198sd5++237YsI1Ob5bTOfOne1t+/fvr3XnkxM1ZlHdFStW6JZbblGfPn0UHh4uPz8/xcTE6KyzztJLL73k0LoWDz/8sP11H374YUlSRUWF5syZozPPPNP+uW3fvr0uuugiffvttw7V1lQKCgr0wgsvaPLkyYqJiZGfn5/Cw8PVt29f3XLLLaZpcfVJSUnRI488orFjxyoqKkq+vr7y8fFRmzZt1L9/f02bNk2vvvpqnf9PlZeX691339Uf/vAHdenSRUFBQfLy8lJwcLASEhI0efJkPfjgg1q1apUzbr9BBgwYYDo+dOiQw89t166dzjrrLEnSsmXLtGfPnlqv3bdvn5YuXSpJOuuss9S2bdt6+z948KD9cURERIPWVQEAuCkDAAA3UlpaakRERBiSDEnG008/7dDzrr76avtzRowYYTr32WefGb6+vvbzdX3079/f2Lt3b52vtWDBAvv148aNq/W6E/utS35+vnHOOefUWdfo0aONw4cPGzNnzrS3vfPOOzX2t2LFCiMoKMih+42PjzfWrVtXYz/vvPOOQ33UdI/79u2zt3fq1KnO+y8oKDAuv/zyevtv37698b///a/Ovh566CH79Q899JCRmppqjBw5ss5+r776aqOysrLOfh3lyNfnuG+++caIjo6u976nTZtmFBYW1tnX66+/bvj7+zv0dRo1alSNfezcudPo1auXw1/v3bt3N/bTZBiG+furvu8RwzCMXbt2mV7/vffeq/XaE7//JBnFxcXGxx9/bD9+8MEHa33uww8/bL/uk08+MYqLi0197du3r9pzPvnkE/t5m81mFBQUOPIpqNfJ91HTawMArMECuQAAt+Lj46OpU6fq5ZdflnRsOP+dd95Z53OKi4v16aef2o9PXhg3LS1NpaWlkqSYmBj17t1b0dHRCggIUEFBgbZv365169bJMAxt3LhRY8eO1YYNG5plaH95ebnOPfdcLVq0yN4WHR2tsWPHKjg4WElJSVqyZImWLFmiiy++WF26dKm3z+zsbBUUFEg69hf9Pn36KCYmRoGBgSoqKlJSUpJWrVqliooKJScna9y4cVq3bp0SEhJM/fTq1Us333yz8vPz7dMqato15lQUFRXp9NNPN42U6NChg8aMGaOgoCD7/VdWVurw4cO64IIL9MEHHzi0pXdBQYHOOussbdmyRQEBARozZoxiY2OVn5+vBQsWKC0tTdKx9T969Oihv/71r067r/p89NFHuuKKK1RZWSnp2DSZ0aNHKyEhQQUFBVq8eLF95Mb777+vffv26ZdffpGfn1+1vr788kvdcMMN9uOQkBCNGDFCMTEx8vLyUm5urnbt2qUtW7bUOpIpPz9fZ555pn1bZQ8PDw0cOFC9evVSUFCQioqKdPDgQW3cuFEZGRnO/nQ45OSRLFFRUQ16/gUXXKCwsDDl5OTo3XfftY+COtnx7/Xw8HCdf/75Di303LVrV/tjwzD05JNP6pFHHmlQfQAAN2Nx2AMAQIOtWrXK9NfcTZs21Xn9e++9Z7/W19fXyM7ONp3/+uuvjf/7v/+r8y/xe/fuNSZPnmzv509/+lOt1zpzZMujjz5q+ov4v//9b6OiosJ0zc6dO43+/fsbkgwfHx+HRrbcf//9xubNm2t93aNHjxpXXnmlva8zzjij1msbMkqloc+56aab7Nd5enoazz33XLVRJrt27TIGDx5svy4kJKTWv/CfOLLl+GimmTNnGpmZmabrCgsLjalTp9qvDQoKcspoBEdGtiQlJZlGHiUmJlb73qysrDSefvppw8PDw37drbfeWmN/AwYMsF9zyy231DoKJj8/3/j444+Nv/71r9XOPffcc/Y+evfubezYsaPGPqqqqoxVq1YZN910k3HgwIE6PhP1a+jIlr/97W/26729vY2srKxar61pZIthGMb1119vb1u0aFG15y1evNh+/oYbbjAMw3BoZEtVVZURHx9v+n95+vTpxvLly42qqirHPiEO3AcjWwDAdRC2AADc0onTGe6+++46rz0xJLnssssa/ZplZWVGv379DEmGn59frW/mnBW25OTkGAEBAfZrHn744Vr7SktLM9q3b2/qs75pKo44++yz7f1t27atxmuaKmxJSkoyhQkvvfRSrf1lZWWZ3sxeffXVNV53YtgiyZg6dWqtfRYXFxuxsbH2az/88EOH7q0ujoQtM2bMsF+TkJBg5OTk1NrfM888Y7/Ww8Oj2hS3/Px8+/nY2NhGv7GfMmWKvZ8ff/yxUX00VEPClm3bthnBwcH266dNm1bn9bWFLUuXLrW3XXvttdWed91119nPL1u2zDAMx8IWwzCMTz/91HTd8Y82bdoY55xzjvHggw8a33zzTZ0hUX33MWPGDOPmm2926OO5555z+HUAAA1H2AIAcEuPP/64/Q1Ghw4dqo32OO7QoUOGp6en/dp58+ad0us+8cQT9r6+/vrrGq9xVtjyyiuv2M/HxMQYpaWlddb2xhtvOD1s+eijj+z9vfDCCzVe01Rhy1//+lf7NQMGDKg3KDixVl9f3xpDihPDFh8fH+Pw4cN19nnvvffar7/zzjsdure61Be2ZGdnm9YP+vzzz+vsr7Ky0ujTp4/9+vvuu890/uDBg6bPYWNNnDjR3s+GDRsa3U9D1Be2lJSUGDt37jSefPJJIywszH5tz549jSNHjtTZd21hi2EYRkJCgiHJCA0NNbUXFxfbX6dbt26mdkdHl7z11luGn59fjaHLiaNeEhMTjRdffNH0+o7cR0M+6vrZBAA4dazZAgBwS9OnT9f999+vqqoqHTp0SD/99JMmT55c7br33nvPvu5FdHR0jdecKCcnRytWrNDWrVuVmZmpgoIC0w5EO3bssD/esGGDzj//fCfdUXULFiywP7788svl4+NT5/V//OMfdcstt9S5g9DJioqKtGLFCm3evFnp6enKz8+3f74k8y4qGzZscLx4J/jll1/sj6+66qp6d226+OKLFRERoaysLJWWlmr58uX2HWZqMnr0aEVHR9fZ58CBA+2Pk5OTHSv8FCxbtsy+flBkZGS9318eHh665pprdNddd0kyf88c78PPz08lJSXasmWLli5dqlGjRjW4rtjYWPvj1157Ta+++mqD+zgVx3e5qouHh4cuuugivfzyyw1er+VEV155pR566CHl5ubqq6++0uWXXy5J+uqrr+zbN1955ZWN6vtPf/qTJk6cqCeeeEIffPCBsrOzq11jGIZWrVqlVatW6YknntDcuXM1fvz4xt4OAMAihC0AALfUsWNHnXnmmZo/f74kae7cuTUGKccXs5SkK664Qp6enjX2l5qaqvvuu0+ffvqp/c1ufZp6IdD169fbH48YMaLe64ODg9W3b1+tW7eu3muzsrL04IMPas6cOcrPz3eonuZc+NQwDFO4M3LkyHqf4+3trcTERH3//feSpHXr1tUZtpx22mn19nniIsh5eXn1Xn+qTvyaJyYmysur/l/VTgxP1q9fL8Mw7MGEj4+PLrroIn344YeqqKjQ6aefrssvv1yXXHKJxo4dq7CwMIfquuyyy/Tf//5X0rGwZe3atZo5c6YmT55cbeFkq1xwwQV6++23Hb6n2lx55ZV6+OGHZRiG5syZYw9bjv8ssdlsjQ5bJCkuLk4vv/yynn32Wa1cuVKLFy/W6tWrtXbtWvsCxMelpqZq4sSJmjdvniZNmlRv3/v27XN4K3UAQNMibAEAuK2ZM2faw5YvvvhCBQUFCgoKsp9fv369Nm/ebLq+JuvXr9cZZ5xR41+Z6+JoSNFY6enp9sdxcXEOPScuLq7esGX//v0aO3asDhw40KB6mvp+T5Sbm6vy8nL7cadOnRx63olvNOsLh0JDQ+vtz9vb2/74xHqayolf88bcc1lZmfLz8xUSEmJve/bZZ7V27Vrt3r1bZWVlmjt3rubOnSsPDw/16dNHY8aM0cSJE3X22WfL19e3xteYPHmybr31Vr344ouSpNWrV2v16tWSju36M3r0aI0fP14XXXSRYmJiGnrb9Tp5l6uKigodOnRI69evV2pqqqRjuy7t3btXP//8syIjIxv9Wp07d9bo0aO1ePFizZ8/X0ePHpUk+8+aMWPGOCXQ8PHx0ZgxYzRmzBh7W3Jysj799FM999xz9lFlFRUVmjFjhvbu3auAgIBTfl0AQPPwsLoAAAAa6+KLL7a/qSwqKjJt7yyZR7UMHDiwxpEMpaWlmjJlij1oadu2rR544AEtWLBAKSkpKiwsVFVVlYxj65zpnXfesT/3xOlFTeH49sySHH6TFRgYWO8106ZNswctwcHBuuOOO/T9999r7969KigoUGVlpf1+T5yW0tT3e6IT711y7L5Ovq6+cKi+aSlWOPG+G3PPUvX7jo6O1po1a/TAAw+YptdUVVVp8+bNeuWVV3TxxRerffv2evzxx03TyE70wgsv6PPPP1diYqKp/ejRo/rss8906623Ki4uTpdcckmDg7z6RERE6KWXXrJ/vPbaa/r666+1b98+vf322/Ytrzdt2uSUrcePB7MVFRV6//339f7776uiosJ0rinEx8fr7rvv1rZt20xTh44ePaqPPvqoyV4XAOB8hC0AALfl7++vSy+91H48d+5c++OKigp98MEH9uPa3iB99tln2rdvn6RjU5M2btyof/7znxo/frxiYmIUEBBgelPenKM7ThylU1RU5NBzCgsL6zy/bNkyLVu2zN7/ihUr9Mwzz2jy5Mnq3LmzAgMD5eHx+68HzXm/Jzrx3qX676um64KDg51aU3M48b4bc89SzfcdEhKif/7znzp48KBWrFihp556ShdddJFpBEh2drb+9re/acqUKTIMo8bXuvjii7Vy5Urt379fs2fP1g033KDevXvbzxuGoc8++0yDBg3Srl27HKr/VHh5eemaa67RW2+9ZW/77rvvNHv27FPq99JLL5W/v7+kY6Ht8f5O/pnTVEJCQjR37lzTtMfFixc3+esCAJyHsAUA4NZODFEWLlxoX/Pghx9+sA//9/b21rRp02p8/s8//2x/fPvtt6t9+/Z1vt7+/ftPtWSHtW3b1v7Y0ZECJ6/5cLIT73fmzJmmN8o1ac77PVFoaKhpCo+j93/iIranMpXEKo35mp94zz4+PnWGTJ6enho2bJjuvvtuffHFFzp69KgWL16sCy64wH7NV199pc8++6zO14yLi9OMGTP02muvaevWrTpw4IAeeeQR+wiszMxM3XnnnQ7V7wxXXHGF6R7+8Y9/qKSkpNH9hYSE6MILL5R0bGHojRs3SpIuuuiiZgvxYmJi1KdPH/vx4cOHm+V1AQDOQdgCAHBro0ePVpcuXSQdmxbx7rvvSjJPITr77LNNb2JPdOjQIftjRxZMXbRo0amU2yAn7oSzYsWKeq8vKCjQli1b6rymKe63Kabj2Gw2DRgwwH58fDROXSoqKuzriEjSoEGDnF5XUzvxa75q1apap/Sc6MTPzcCBAxv09fDw8NDo0aP15ZdfauLEifb2r7/+2uE+pGO7FT344IN644037G3z5893eLFpZ3jyySftI0FSUlL02muvnVJ/NU1HcsYUpYY4Pj1KUq3r6QAAXBNhCwDArdlsNtMboLlz5yo3N9f0ZrGuNRZOnDJT31SdtWvXmt7MN7UJEybYH3/00Uf1LtD60Ucf1fvmtiH3e+jQIX311Vf11nniG0JnLiJ7+umn2x/Pnj271qktx3355ZfKzMy01+TIDk6uZuTIkfY31enp6Zo3b16d11dVVZnWETrxc9YQNpvNtM308VFhDXXi6JLy8nJlZWU1qp/G6NGjh/74xz/aj5966qlTCnsmTZpk2hq8ffv2pkCqqZWWlpq2mnd0kWwAgGsgbAEAuL0ZM2bY/5q/fft23XvvvfYpBBERETrvvPNqfe7xUTFS3X/NLyoq0vXXX++kih0zbdo0+7SMlJQUPfHEE7Vem5mZqQcffLDePh2938rKSl1//fUqKyurt8+wsDB7iJOenu60wOW6666z97tu3TrTqImT5eTk6N5777UfT5061aHdhlxNWFiYfathSbrnnnvqXDfnpZdesu+45eHhUe17ND8/36GvoWSegtauXTvTOUe3/T6xDw8PD9PW2c3hgQcesH/PHDp0yLSWS0N5enrat2VevXq1Fi1aVOvW8fVZuXKl/vOf/zi89pJ0bKTOiduN17WNOQDA9RC2AADcXufOnU3bp574pnzq1Kny8fGp9bkn/jV/9uzZevrpp6tN3UhKStKkSZO0bt06h3eIcYbQ0FBTgPDggw/qiSeeqFbf7t27NXHiRB06dKjOe5Wkc8891x5MLVy4UHfffbeKi4tN1xw5ckRTpkzRvHnzHLpfX19fdevWTdKx0QxffvmlI7dXr65du+qGG26wH99yyy16+eWXq+2KdPzrc3yh45CQEIeCJ1f14IMP2hfK3bVrlyZPnqy9e/earqmqqtLzzz9vWhfl5ptvrrYl8dq1axUfH6+HH35Y27Ztq/H1Kisr9dFHH9m3dZaOTb070YgRIzRt2jR99913tYY3u3btMo0iO+OMM+r9fnS2nj176rLLLrMfP/HEEw6HTTVJSEjQkCFDNGTIECUkJDS6n+zsbN1zzz2Kj4/XnXfeqXXr1tU6UisjI0N33HGH6Xt44MCBhC0A4Ga8rC4AAABnmDlzZo3ri9S3TeukSZM0duxYLVq0SIZh6O6779bLL7+sQYMGKTQ0VLt379ayZctUWVmpjh076rbbbjMFIE3tb3/7m3788UctXbpUhmHovvvu0/PPP69x48YpKChISUlJWrx4sSorKzVs2DB17dpV77//fq399ezZU1deeaV9TZunn35a77//voYOHap27dopOTlZixYtUllZmYKDg/XUU0/pxhtvrLfOKVOm6LHHHpN0bLHSWbNmKSEhwbTI7X/+858G3/9//vMfrVmzRqtXr1ZFRYVuueUWPf744xo9erSCgoK0Z88eLVq0yB5AeXl56e23364WOriTrl276q233tIVV1yhyspKLV++XD169NCYMWPUtWtXFRQUaPHixTp48KD9OcOHD9eTTz5ZY3+HDx/WI488okceeUTR0dEaMGCAoqOj5eXlpaNHj2rt2rWmtXzGjBljmo4jHQvRPvjgA33wwQfy9/dXv3791KVLF4WEhCg7O1t79+7VmjVr7Nf7+/s36uvtDP/4xz/08ccfq6qqSikpKZo1a1azj0qrTXp6up599lk9++yzCg0N1eDBg9W+fXsFBweroKBAu3fv1tq1a+3bTEtSVFSU3nvvPdMUwNo89NBDDVrAd8KECZoyZUqj7gUAUA8DAIAWIC8vzwgICDAk2T969erl0HOPHDliDBo0yPTckz969+5tbN261XjnnXfsbTNnzqyxvwULFtivGTduXK2ve2L/dcnNzTXOOuusOusbOXKkcejQIWPmzJn2tnfeeafG/goLC41JkybV2V9MTIyxZMkSh+8lJyfH6NmzZ519nmjfvn329k6dOtV5//n5+cZll11WZ9+SjPbt2xv/+9//6uzroYcesl//0EMP1XmtYTj+tXSUI1+f47755hsjKiqq3vueOnWqUVhYWGMfK1asMLy8vOrt4/jHJZdcYuTl5VXrp2/fvg73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qKOie/fuUVhYGF27do2hQ4fGhAkTorS0NOkSodm5+eabI5VKRSqVijlz5iRdzk5JpdPpdNJFQETEM888E8cff3wUFhbGmWeeGW3atIk///nPsXjx4vjlL38ZV1xxRdIlQk7r0aNHLF68ODp37hytW7eOxYsXx4QJE+L8889PujRoFq688sq4+eab44ADDohjjjkmunTpEvPnz4+//vWvkU6nY/LkyXHGGWckXSbkrFWrVkVxcXEMHjw4evXqFV26dIlPPvkkpk2bFosXL45Ro0bFtGnTokULv6+GhvD666/HoEGDIi8vLz777LOYPXt2DBkyJOmyak3YQqNQVlYWvXv3jqVLl8acOXNiwIABERGxdu3aGDx4cCxatCjefffd2HfffZMtFHLYk08+GT179ox99903brrpprjqqquELdCA/vKXv0SnTp3i6KOPrrD92WefjZEjR0ZRUVEsX748CgoKEqoQclt5eXmUlZVFq1atKmwvKyuL4447LqZPnx6PPPJIjB49OqEKofkoLS2NIUOGRH5+fvTs2TPuv//+Jhe2iGVpFJ5++ul477334uyzz84ELRER7dq1i6uvvjpKSkri3nvvTa5AaAaOPfZYgSYk6Ktf/WqloCUiYvjw4TFixIj45JNPYt68eQlUBs1DixYtKgUtERF5eXnxla98JSIiFixY0NBlQbN0/fXXxxtvvBH33HNPtGzZMulydomwhfjoo4/ikUceiWuuuSZOPPHE6Ny5c+a8uJ39jfbixYvjiiuuiN69e0fr1q2jY8eOcdhhh8UvfvGL2LBhQ7X7TZ8+PSIiRo0aVWns+OOPj4iIGTNm7FQt0FQ0hh6E5q6x92F+fn5EbP2hD3JRY+7B8vLy+O///u+IiOjXr99O7w9NQWPqwVdeeSWuv/76uPbaa6Nv3767+I6S5xOb2HPPPbNynClTpsS5554b69aty2zbsGFDvPTSS/HSSy/F+PHjY+rUqXHggQdW2nf+/PkREdGzZ89KY127do2ioqLMHMg1jaEHoblrzH34z3/+M5588sno1q1b9O/fPyt1QmPTmHqwpKQkbrjhhkin07F69ep46qmn4u23346xY8fGyJEjs1InNDaNpQc3b94c5513XgwYMCB+9KMfZaWmpFjZQgX77LNPlatLduTVV1+NM844I9atWxdFRUVx/fXXx6xZs+Kpp56Kiy66KCIi3n333Rg9enR8+umnlfZfu3ZtRGw9bagqbdu2zcyBXJZUDwL/0pj6sLS0NL7xjW/E5s2b4+abb26yS6lhZyTdgyUlJfHTn/40rrvuurjtttvinXfeiR/84Adx55137vJ7gqYkyR685pprYv78+TFhwoSm/5mXptm75ppr0lOmTEmvWLEinU6n0wsXLkxHRDoi0mPGjKnVMYYPH56OiHReXl561qxZlcZvueWWzDGvvfbaSuPHHXdcOiLS8+fPr/L43bt3T7dt27bW7wmaksbQg5934403piMiPWHChJ14J9B0NcY+3LJlS/rss89OR0T6oosu2pm3A01OY+3BJUuWpP/whz+k27dvnx46dGh67dq1O/O2oMloDD04a9asdIsWLdLXXXddhe1jxoxJR0R69uzZO/2+kiRsoZKdbaznn38+M//iiy+ucs6WLVvSffr0SUdEun379umSkpIK46eddlo6ItIvvfRSlfsXFRWli4uLd/q9QFOURA9+nrCF5i7pPtyyZUvmm8tzzz03vWXLll19K9AkJd2Dn/fQQw+lIyL9ox/9qNb7QFPW0D1YWlqa7tmzZ3rAgAGVerOphi1OI6LO/vrXv2Yejx07tso5LVq0iPPOOy8iItasWRPPPPNMhfFt12qp6rosK1asiPXr11d5PRcgOz0I1E02+7C8vDzGjh0b9957b5x11lkxceLEaNHCt2xQk/r+LNx2SsW2mzoAFdW1B9evXx/z58+PuXPnRqtWrTIX502lUpm70h5xxBGRSqUqvFZj5pObOps5c2ZERLRu3ToGDhxY7bztb2f53HPPVTn2+OOPV9rvscceq7Q/8C/Z6EGgbrLVh9uClkmTJsUZZ5wR9913X9M/Zx0aQH1/Fi5btiwi/nVnMKCiuvZgQUFBjBs3rso/237p/m//9m8xbty46NGjR/28iSxzNyLq7K233oqIiAMPPLDGW1L27t270j7bjBw5Mvbff/+YPHlyfPe7340BAwZExNYL595www3RqlWrTAoKVJSNHgTqJht9WF5eHhdccEFMmjQpTj/99Lj//vsFLVBL2ejBN998M3r06BG77757he0bNmyIyy+/PCIiTjrppGyVDDmlrj242267xfjx46vc5/zzz4/58+fHVVddFUOGDMlSxfVP2EKdbNq0KVatWhUREXvvvXeNczt06BCtW7eOzz77LJYsWVJhLC8vL8aPHx/HH398HHXUUXHmmWdGmzZt4s9//nMsXrw4fvnLXzaZBBMaUrZ6MCJi/Pjxmd9KzJs3L7Nt25LpYcOGxYUXXpjF6iE3ZKsPr7vuurj33nujqKgoevXqFT//+c8r7X/qqadmfiEBbJWtHnzooYfi17/+dQwbNix69OgRbdu2jQ8++CCmTZsWq1evjuHDh8dll11Wb+8Dmqpsfj+aS4Qt1Mn2t+wqKira4fxtjbV+/fpKYyNGjIiZM2fGtddeGw8++GCUlpZG//794+abb44zzjgjq3VDrshmD86cOTNzTuw2zz33XIUlnsIWqCxbfbho0aKI2Hre+vXXX1/lvj169BC2wOdkqwdPPvnkWLZsWcyaNStmz54d69evj3bt2sXBBx8cZ555ZlxwwQU1/sYemqtsfj+aS/zfgjrZtGlT5nGrVq12OL+goCAiIjZu3Fjl+ODBg2PatGnZKQ6agWz24MSJE2PixIlZqw2ai2z1oR6EXZOtHhw0aFAMGjQou8VBM5Dtnwk/r6l+PrpALnVSWFiYeVxSUrLD+Zs3b46IrefkAXWnByF5+hCSpQchWXqwasIW6qRNmzaZx7VZBvbZZ59FRO2WlwE7pgchefoQkqUHIVl6sGrCFuqksLAwOnXqFBERS5curXHuJ598kmms4uLieq8NmgM9CMnTh5AsPQjJ0oNVE7ZQZ3379o2IiAULFkRZWVm1895+++3M4z59+tR7XdBc6EFInj6EZOlBSJYerEzYQp0NGzYsIrYuB3v55ZernTdjxozM46FDh9Z7XdBc6EFInj6EZOlBSJYerEzYQp2deuqpmccTJkyock55eXlMmjQpIiLat28fI0aMaIjSoFnQg5A8fQjJ0oOQLD1YmbCFOhs8eHAMHz48IiLuvvvumD17dqU5v/rVr+Ktt96KiIjvfe97kZ+f36A1Qi7Tg5A8fQjJ0oOQLD1YWSqdTqeTLoJkzZw5MxYsWJB5vmrVqvjhD38YEVuXdl144YUV5p9//vmVjvHqq6/G0KFDY+PGjVFUVBRXX311jBgxIjZu3BgPPPBA3HnnnRER0atXr3jppZcqXLEamjs9CMnTh5AsPQjJ0oPZJ2whzj///Lj33ntrPb+6/2SmTJkS5557bqxbt67K8V69esXUqVPjwAMP3KU6IVfpQUiePoRk6UFIlh7MPqcRkTWnnHJKvPbaa3HZZZdFr169Yvfdd4/27dvHoEGD4uabb45XX321WTQVJEUPQvL0ISRLD0Ky9OC/WNkCAAAAkEVWtgAAAABkkbAFAAAAIIuELQAAAABZJGwBAAAAyCJhCwAAAEAWCVsAAAAAskjYAgAAAJBFwhYAAACALBK2AAAAAGSRsAUAAAAgi4QtAAAAAFkkbAEAAADIImELAAAAQBYJWwAAAACySNgCAAAAkEXCFgAAAIAsErYAAAAAZJGwBQCgEVu0aFGkUqlIpVIxceLEpMsBAGpB2AIANErTp0/PhAy1/fP9738/6bIBAIQtAAAAANmUl3QBAAA7cskll8S3vvWtHc7r3LlzA1QDAFAzYQsA0Ojtscce0a9fv6TLAACoFacRAQAAAGSRsAUAyFk9evSIVCoV559/fkREvPjii3HWWWdFcXFxFBYWRnFxcYwdOzbefvvtWh1vypQpcdppp8Xee+8dBQUF0alTpzjiiCPipptuivXr19fqGK+//np85zvfif79+0eHDh0iPz8/unbtGscee2zccsstsXz58h0e44knnohTTjklunbtGgUFBbHffvvFJZdcEkuXLq1xv2XLlsWVV14ZX/ziF6Ndu3aRn58fe+65Z/Tv3z/OOuusmDhxYqxbt65W7wMAqF4qnU6nky4CAODzpk+fHiNGjIiIiGuvvTZ+8pOf7PQxevToEYsXL44xY8bEUUcdFRdffHGUlZVVmldQUBD33XdfnH766VUeZ9OmTXH22WfHww8/XO1rde/ePaZOnRoDBgyocnzLli3xwx/+MH7zm99ETd9+jRkzpsItnhctWhT77bdfRERMmDAh3nnnnbjpppuq3LdLly4xY8aM6NOnT6WxZ599Nk4++eQdhilTpkyJk08+ucY5AEDNXLMFAMh5c+fOjcmTJ8cee+wRV111VQwePDg2bdoUjz76aPzmN7+JzZs3xznnnBP77bdfDBo0qNL+Y8aMyQQthxxySFxxxRXRp0+f+Pjjj+OBBx6IiRMnxrJly2LkyJHx2muvxV577VXpGN/85jfjnnvuiYiIbt26xaWXXhpHHnlktGvXLlauXBkvvPBC/OlPf6rxfdx1110xa9asOProo+Piiy+OXr16xZo1a2LSpEkxadKkWLlyZVxwwQUxe/bsCvtt3rw5zjzzzFi3bl20adMmLrnkkhgxYkTsscceUVJSEgsXLoxZs2bVGCYBALVnZQsA0Chtv7Kltncj+sIXvhD5+fmZ59tWtkRE7LvvvjFnzpzo2rVrhX2eeeaZGDVqVJSVlcVhhx0WL7zwQoXxqVOnZlZ6jBw5Mh599NFo1apVhTl33XVXfPOb34yIiK9//evx4IMPVhj/29/+Fl/+8pcjIuKII46IRx99NNq3b1/le1iyZEkUFxdnnm+/siUi4qKLLoo77rgjUqlUhf0uuuiiGD9+fEREvPLKK3HooYdmxp5++ukYOXJkRNS8cqWsrCw2bNgQbdu2rXIcAKgdYQsA0ChtH7bU1sKFC6NHjx6Z59uHLX/605/ia1/7WpX7fetb34rbb789IrZe12X71S0nnXRSTJs2LfLz8+O9996rEIRs77jjjosnn3wy8vLy4p///Gd069YtM3bkkUfG7NmzY/fdd4/58+dH9+7da/2etg9bunXrFgsXLoyCgoJK8955553o3bt3RET89re/je9+97uZscmTJ8c555wTERFr164VpgBAPXOBXAAg53Xo0CGzsqQqF1xwQebxk08+mXlcVlYWM2bMiIiIUaNGVRu0RGxdWbJtn+nTp2e2r169OubMmRMREWecccZOBS2fd9ppp1UZtERsXdVTVFQUERHvv/9+hbHtg58JEybs8usDALUjbAEAGr1rr7020un0Dv9sv6ple4ceemjk5VV/qboBAwZkTg2aN29eZvv7778fGzZsiIiIww8/vMYatx9//fXXM4/nzp2buSDu8OHDa36jO7Bt5Up1OnToEBERn376aYXtw4YNi/333z8iIr7//e/H4MGD48Ybb4znnnsuSkpK6lQTAFCZsAUAyHl77LFHjeN5eXnRsWPHiIj4+OOPM9u3f7yjY2x/LZjt91u1alXm8fYrTHbF7rvvXuN4ixZbv7XbsmVLhe35+fkxZcqUzF2KXnzxxbj66qtj2LBh0b59+zjhhBNi8uTJlfYDAHaNsAUAyHmfv5hsUsdIUt++fWPevHnx8MMPxwUXXBAHHnhgRERs3LgxHnvssTjnnHPi8MMPj48++ijhSgGg6RO2AAA578MPP6xxvKysLLMaZdsKl88/3tExVqxYUeV+nTt3zjxevnx57QquJy1btoxTTz017r777pg/f34sW7Ys7rnnnhg4cGBERLz88stx8cUXJ1ojAOQCYQsAkPPmzp0bZWVl1Y7/4x//yFy7pF+/fpnt+++/f+bUneeff77G19j+ltHbH+PQQw/NrIr5+9//vvPF16Nu3brF2LFjY/bs2fHFL34xIiIeeeSR2LhxY8KVAUDTJmwBAHLexx9/HFOmTKl2/J577sk8PvbYYzOP8/Ly4uijj46IiCeeeCKWLl1a7THGjx+f2eeYY47JbO/YsWMceeSRERHx0EMPxbJly3bpPdSn/Pz8zPssKyuLNWvWJFsQADRxwhYAoFm4/PLLqzwVaMaMGXHnnXdGRMTAgQPjsMMOqzD+7W9/OyIiSkpKYty4cVFaWlrpGPfcc088/vjjERHx1a9+tdKFcH/84x9HRMSGDRvi9NNPj7Vr11ZbZ02Bzq569tlnY8GCBdWOl5SUZG5xXVRUFF26dMl6DQDQnFR/D0QAgEbio48+qnA75erstttuccABB1Tafsghh8Sbb74ZAwcOjKuuuioGDx4cmzdvjkcffTRuvfXWKCsri7y8vLjtttsq7Tt69Og4/fTT47/+67/i8ccfjyFDhsTll18evXv3jk8++SQeeOCBzMqYjh07xq9//etKxzjllFNi3Lhxcffdd8esWbOib9++cemll8bQoUOjbdu2sWrVqnjppZfiwQcfjEMOOSQmTpy481+kGjz11FPxs5/9LIYPHx6jR4+Ogw8+OLp06RIbN26Md999N/74xz/GK6+8EhER48aNq/E22QDAjvkkBQAavdtvvz1uv/32Hc475JBDYu7cuZW2DxgwIC699NK45JJL4tJLL6003qpVq7j33nvj8MMPr/K4kyZNirKysnj44YfjlVdeiXPPPbfSnO7du8fUqVNjr732qvIYd9xxR+y2225x2223xbJly+Lqq6+u9j3Uh/Ly8pgxY0ZmBUtVvvzlL8eNN95YL68PAM2JsAUAaBYuvPDC6NevX9x6660xc+bMWLVqVXTp0iVGjhwZP/7xj6Nv377V7ltYWBh/+ctfYsqUKTFx4sSYM2dOrFq1Klq3bh29evWKU089NS699NIoKiqq9hgtW7aM3//+9zF27Ni44447Yvr06fHBBx9ESUlJdOrUKQ4++OA44YQT4hvf+EbW3/sPfvCDOPjgg+PJJ5+MV199NZYtW5a5xXPXrl1j8ODBcd5558Xo0aOz/toA0Byl0ul0OukiAADqQ48ePWLx4sUxZsyYrJ+aAwBQHRfIBQAAAMgiYQsAAABAFglbAAAAALJI2AIAAACQRcIWAAAAgCxyNyIAAACALLKyBQAAACCLhC0AAAAAWSRsAQAAAMgiYQsAAABAFglbAAAAALJI2AIAAACQRcIWAAAAgCwStgAAAABkkbAFAAAAIIuELQAAAABZJGwBAAAAyCJhCwAAAEAWCVsAAAAAskjYAgAAAJBFwhYAAACALBK2AAAAAGSRsAUAAAAgi4QtAAAAAFkkbAEAAADIov8PujHJsSTQdAsAAAAASUVORK5CYII=",
"text/plain": [
""
]
@@ -419,12 +334,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 17\n"
+ "Time step 17\n",
+ "RMSE 0.002156111210460188, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFwAAAOOCAYAAAA9KAZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACpDElEQVR4nOzdd3yV9d3/8fc5OdkTCDthhi3IdgAiDtyKdS9Ae1t/rXpbR21rraN3baVWW1ut1moBcaHVohQHVtl7C2GTQUKY2Tvn5Fy/P5BDrsyTcE6uc5LX8/HIw3N9z/dc1+c6SWnOO99hMwzDEAAAAAAAAHzGbnUBAAAAAAAAbQ2BCwAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAPrZ06VLZbDbZbDZdeOGFDfY71cdms/ns2jNnzvScc86cOT47r69lZGR46uzTp4/V5bSaYPn+AACAM0fgAgAICo899pjpA7phGC06T15ensLDw/nQCwS4OXPmmELJ2l/h4eHq0qWLxo0bp5/85Cdavny51+euGfid+urSpYtcLpfX56iurlb37t3rnCcjI6PJ12ZlZem5557TZZddpuTkZEVHRys0NFQJCQkaPHiwrrzySv3qV7/SwoULVVJS0qz7aM7X0qVLvb5fAEDzEbgAAILCjBkzPI8zMzO1bNmyFp3ngw8+UFVVlSQpOjpaN954o0/qa8/a62gVWKuqqkrHjx/Xxo0b9dprr2ny5MmaMmWKsrKyWnS+48eP64svvvC6/1dffaUjR4406xoVFRV67LHH1LdvXz355JNavHixsrOzVVZWJpfLpcLCQu3Zs0dffPGFfve73+naa69Vx44dtWbNmubeDgAgADisLgAAAG8MHz5co0aN0pYtWyRJb7/9dqPTdRry9ttvex7fcMMNiomJ8VWJAPwkNjZW06dPN7VVVFQoMzNTq1atUnl5uaST0/kuuugirV27Vp06dWr2dd5++21dc801XvdtjqqqKl133XVavHixpy0sLExjx45V//79FRUVpaKiImVkZGjr1q2ee3I6nSotLfXqGtOnT1dsbKzXNfXs2bNZ9wAAaB4CFwBA0JgxY4YncPn444/16quvKjIy0uvX7927V+vWrTOdz0otnRbVFpzJtDC0Px07dtQrr7xS73O5ubn6yU9+og8//FCStH//fj3zzDP661//6vX5hw4dqp07d2rhwoUqKChQQkJCo/0LCwv16aefml7blOeff94TtthsNj3++OP6xS9+Ue+1nE6nli5dqg8//FDvv/++1/fx7LPPMsoMAAIIU4oAAEHj9ttvV2hoqCSpqKhICxYsaNbra/5FulevXpoyZYovywNggU6dOum9997TuHHjPG2zZ8+W0+n0+hx33XWXJKmyslLz589vsv+HH36oiooKSaoz8qY+TqdTf/rTnzzHv/nNb/T88883GOyEhobq0ksv1T/+8Q9lZ2dr1KhRXtwFACDQELgAAIJG586ddcUVV3iOmzOk3zAMvfPOO57ju+66y6e7AwGwTkhIiB544AHPcWlpqTZt2uT162+//XY5HCcHfnvz78qpPqGhobr99tub7L9+/XoVFBR4XvPQQw95XVtCQkKLpkcBAKxH4AIACCo1pwF9/fXXXi9auWzZMmVmZnqOa/9VurCwUO+//77uu+8+nXPOOUpMTFRYWJji4uLUv39/3Xbbbfrwww/ldrt9cyNq/rbQCxYs0HXXXaeePXsqPDxcSUlJuvTSSzVv3rxm7a4iSeXl5VqwYIH+93//VxMnTlTXrl0VFhammJgY9enTR9dff73eeustzwLD9Tm1i0zfvn09bZmZmQ3uiFJTSxbaXbt2rR544AENGzZMHTp0UEREhJKSknT55ZfrlVde8Wqdi2eeecZz3WeeeUaS5HK59Pbbb+uSSy7xvLfdu3fXtGnT9J///Mer2vylpKREf/nLX3TZZZcpKSlJERER6tChg8466yw98MADpilyTcnKytKzzz6rCy64QF27dlV4eLjCwsLUqVMnnX322br99tv12muvNfq/KafTqXfeeUc/+MEP1K9fP8XExMjhcCg2NlYpKSm67LLL9NRTT2n9+vW+uP1mGTlypOk4JyfH69d26dJFl19+uSRp9erVOnDgQIN909PTtWrVKknS5Zdfrs6dOzd5/kOHDnked+zYsVnrrAAAgpgBAEAQqaysNDp27GhIMiQZL774olevu/vuuz2vOe+880zPffzxx0Z4eLjn+ca+zj77bCMtLa3Ray1ZssTTf/LkyQ32q3nexhQXFxtXXnllo3VNnDjROHz4sDFjxgxP2+zZs+s939q1a42YmBiv7rdPnz7G5s2b6z3P7NmzvTpHffeYnp7uae/du3ej919SUmLccsstTZ6/e/fuxueff97ouZ5++mlP/6efftrIzs42zj///EbPe/fddxvV1dWNntdb3nx/Tlm4cKHRrVu3Ju/79ttvN0pLSxs919///ncjMjLSq+/ThAkT6j3Hnj17jCFDhnj9/d63b19L3ybDMMw/X039jBiGYezdu9d0/XfffbfBvjV//iQZ5eXlxocffug5fuqppxp87TPPPOPp99FHHxnl5eWmc6Wnp9d5zUcffeR53mazGSUlJd68BU2qfR/1XRsAYB0WzQUABJWwsDDddtttevXVVyWdHNr/yCOPNPqa8vJy/etf//Ic114s99ixY6qsrJQkJSUlaejQoerWrZuioqJUUlKiXbt2afPmzTIMQ9u2bdMFF1ygrVu3tsowf6fTqauuukrLly/3tHXr1k0XXHCBYmNjtX//fq1cuVIrV67U9ddfr379+jV5zvz8fJWUlEg6+Zf9YcOGKSkpSdHR0SorK9P+/fu1fv16uVwuZWRkaPLkydq8ebNSUlJM5xkyZIjuv/9+FRcXe6ZY1LebzJkoKyvTRRddZBox0aNHD02aNEkxMTGe+6+urtbhw4d17bXX6v333/dqu++SkhJdfvnl2rFjh6KiojRp0iQlJyeruLhYS5Ys0bFjxySdXA9k0KBB+vnPf+6z+2rK/Pnzdccdd6i6ulrSySkzEydOVEpKikpKSrRixQrPCI733ntP6enp+vbbbxUREVHnXAsWLNB9993nOY6Li9N5552npKQkORwOFRYWau/evdqxY0eDI5qKi4t1ySWXeLZcttvtGjVqlIYMGaKYmBiVlZXp0KFD2rZtm06cOOHrt8MrtUe0dO3atVmvv/baa5WQkKCCggK98847ntFQtZ36We/QoYOuueYarxZ/7t+/v+exYRj6wx/+oGeffbZZ9QEAgpDFgQ8AAM22fv160191v/vuu0b7v/vuu56+4eHhRn5+vun5zz77zPj973/f6F/k09LSjMsuu8xznh/+8IcN9vXlCJff/OY3pr+MP/fcc4bL5TL12bNnj3H22WcbkoywsDCvRrg88cQTxvbt2xu87tGjR4277rrLc66LL764wb7NGa3S3Nf8+Mc/9vQLCQkx/vznP9cZbbJ3715jzJgxnn5xcXEN/qW/5giXU6OaZsyYYeTm5pr6lZaWGrfddpunb0xMjE9GJXgzwmX//v2mEUjjx4+v87NZXV1tvPjii4bdbvf0e/DBB+s938iRIz19HnjggQZHwxQXFxsffvih8fOf/7zOc3/+85895xg6dKixe/fues/hdruN9evXGz/+8Y+NgwcPNvJONK25I1x++ctfevqHhoYaeXl5Dfatb4SLYRjGj370I0/b8uXL67xuxYoVnufvu+8+wzAMr0a4uN1uo0+fPqb/Ld95553GmjVrDLfb7d0b4sV9MMIFAAILgQsAICjVnNrw2GOPNdq3ZlBy8803t/iaVVVVxogRIwxJRkRERIMf6HwVuBQUFBhRUVGePs8880yD5zp27JjRvXt30zmbmrLijSuuuMJzvp07d9bbx1+By/79+02BwiuvvNLg+fLy8kwfaO++++56+9UMXCQZt912W4PnLC8vN5KTkz19P/jgA6/urTHeBC7Tp0/39ElJSTEKCgoaPN9LL73k6Wu32+tMdysuLvY8n5yc3OIP9zfccIPnPF9//XWLztFczQlcdu7cacTGxnr633777Y32byhwWbVqlaftf/7nf+q87t577/U8v3r1asMwvAtcDMMw/vWvf5n6nfrq1KmTceWVVxpPPfWUsXDhwkaDoqbuY/r06cb999/v1def//xnr68DAGgZAhcAQFB6/vnnPR8yevToUWfUxyk5OTlGSEiIp++iRYvO6LqzZs3ynOuzzz6rt4+vApe//e1vnueTkpKMysrKRmt74403fB64zJ8/33O+v/zlL/X28Vfg8vOf/9zTZ+TIkU2GBTVrDQ8PrzeoqBm4hIWFGYcPH270nI8//rin/yOPPOLVvTWmqcAlPz/ftJ7QJ5980uj5qqurjWHDhnn6/+IXvzA9f+jQIdN72FKXXnqp5zxbt25t8Xmao6nApaKiwtizZ4/xhz/8wUhISPD0HTx4sHHkyJFGz91Q4GIYhpGSkmJIMuLj403t5eXlnusMGDDA1O7tKJM333zTiIiIqDd4qTn6Zfz48cZf//pX0/W9uY/mfDX2bxMAwDdYwwUAEJTuvPNOPfHEE3K73crJydF///tfXXbZZXX6vfvuu551MLp161Zvn5oKCgq0du1apaamKjc3VyUlJaadiXbv3u15vHXrVl1zzTU+uqO6lixZ4nl8yy23KCwsrNH+t956qx544IFGdxaqraysTGvXrtX27dt1/PhxFRcXe94vyby7ytatW70v3ge+/fZbz+OZM2c2uZvT9ddfr44dOyovL0+VlZVas2aNZ+eZ+kycOFHdunVr9JyjRo3yPM7IyPCu8DOwevVqz3pCiYmJTf582e123XPPPXr00UclmX9mTp0jIiJCFRUV2rFjh1atWqUJEyY0u67k5GTP49dff12vvfZas89xJk7tftUYu92uadOm6dVXX232+i013XXXXXr66adVWFioTz/9VLfccosk6dNPP/Vs7XzXXXe16Nw//OEPdemll2rWrFl6//33lZ+fX6ePYRhav3691q9fr1mzZmnevHm68MILW3o7AAALEbgAAIJSz549dckll2jx4sWSpHnz5tUbppxa4FKS7rjjDoWEhNR7vuzsbP3iF7/Qv/71L88H3qb4e3HQLVu2eB6fd955TfaPjY3VWWedpc2bNzfZNy8vT0899ZTefvttFRcXe1VPay6GahiGKeA5//zzm3xNaGioxo8fry+//FKStHnz5kYDl+HDhzd5zpoLIxcVFTXZ/0zV/J6PHz9eDkfTv6rVDFC2bNkiwzA84URYWJimTZumDz74QC6XSxdddJFuueUW3XjjjbrggguUkJDgVV0333yz/vnPf0o6Gbhs2rRJM2bM0GWXXVZnMWWrXHvttXrrrbe8vqeG3HXXXXrmmWdkGIbefvttT+By6t8Sm83W4sBFknr16qVXX31Vf/rTn7Ru3TqtWLFCGzZs0KZNmzyLEp+SnZ2tSy+9VIsWLdLUqVObPHd6errX26wDAPyPwAUAELRmzJjhCVz+/e9/q6SkRDExMZ7nt2zZou3bt5v612fLli26+OKL6/1rc2O8DSpa6vjx457HvXr18uo1vXr1ajJwyczM1AUXXKCDBw82qx5/329NhYWFcjqdnuPevXt79bqaHzabCoji4+ObPF9oaKjncc16/KXm97wl91xVVaXi4mLFxcV52v70pz9p06ZN2rdvn6qqqjRv3jzNmzdPdrtdw4YN06RJk3TppZfqiiuuUHh4eL3XuOyyy/Tggw/qr3/9qyRpw4YN2rBhg6STuwFNnDhRF154oaZNm6akpKTm3naTau9+5XK5lJOToy1btig7O1vSyd2Y0tLS9M033ygxMbHF1+rbt68mTpyoFStWaPHixTp69Kgkef6tmTRpkk9CjbCwME2aNEmTJk3ytGVkZOhf//qX/vznP3tGl7lcLk2fPl1paWmKioo64+sCAFqP3eoCAABoqeuvv97zwbKsrMy09bNkHt0yatSoekc0VFZW6oYbbvCELZ07d9aTTz6pJUuWKCsrS6WlpXK73TJOrnum2bNne15bc6qRP5zaulmS1x+0oqOjm+xz++23e8KW2NhYPfzww/ryyy+VlpamkpISVVdXe+635hQVf99vTTXvXfLuvmr3ayogamqKihVq3ndL7lmqe9/dunXTxo0b9eSTT5qm2rjdbm3fvl1/+9vfdP3116t79+56/vnnTVPKavrLX/6iTz75ROPHjze1Hz16VB9//LEefPBB9erVSzfeeGOzw7ymdOzYUa+88orn6/XXX9dnn32m9PR0vfXWW57tsL/77jufbEt+Kpx1uVx677339N5778nlcpme84c+ffroscce086dO03TiI4ePar58+f77boAAP8gcAEABK3IyEjddNNNnuN58+Z5HrtcLr3//vue44Y+JH388cdKT0+XdHKa0rZt2/R///d/uvDCC5WUlKSoqCjTB/PWHOVRc7ROWVmZV68pLS1t9PnVq1dr9erVnvOvXbtWL730ki677DL17dtX0dHRsttP/3rQmvdbU817l5q+r/r6xcbG+rSm1lDzvltyz1L99x0XF6f/+7//06FDh7R27Vq98MILmjZtmmkkSH5+vn75y1/qhhtukGEY9V7r+uuv17p165SZmam5c+fqvvvu09ChQz3PG4ahjz/+WKNHj9bevXu9qv9MOBwO3XPPPXrzzTc9bV988YXmzp17Rue96aabFBkZKelkcHvqfLX/zfGXuLg4zZs3zzQFcsWKFX6/LgDAtwhcAABBrWaQsnTpUs8aCF999ZVnKkBoaKhuv/32el//zTffeB7/9Kc/Vffu3Ru9XmZm5pmW7LXOnTt7Hns7YqD2GhC11bzfGTNmmD4s16c177em+Ph403Qeb++/5sK2ZzKtxCot+Z7XvOewsLBGg6aQkBCdc845euyxx/Tvf/9bR48e1YoVK3Tttdd6+nz66af6+OOPG71mr169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DoejyXOc+rrxxhuNoqKiOuc566yzvD5H3759jVWrVp3xe1Xzf2tN/YzUdtNNN5nqcTqdpudr/vxJMsrLy1tcZ3l5uelc6enpdfrs3r3bmDx5shESEuL1+yjJuOKKK4y0tLQGr137Ppr79dBDD7X4vgEATWOECwCgTYiNjdX111+vd99919PW1OiWU7p27arVq1frzTff1AcffKAdO3aorKxMXbp00aBBg3TLLbfojjvuUFRUlNavX++vW2hQXFycvvjiC33yySeaM2eONmzYoLy8PCUmJmrIkCG64447dOedd5pGkzQmKipKX3zxhd577z3NnTtXW7ZsUVFRkRITE9WvXz/dcMMNmjlzpjp06KClS5d6dc74+Hht2LBBf/vb37Ro0SLt2rVLBQUFPlnPJSYmRvPnz9dPf/pTzZs3T0uXLlVOTo7Ky8uVmJios846S1dffbXuueeeVp3y5W9XX3219u/fr3/+85/6z3/+o9TUVJ04cUKRkZHq0aOHpkyZounTp+ucc85p8BznnHOOjh07pv/+979auXKltmzZogMHDig3N1fV1dWKi4tT//79de655+rOO+/U+PHj6z3P1q1btXbtWi1ZskTr16/Xnj17lJOTo7KyMkVFRXlGzlx77bW6+eabLd9R59e//rX+9a9/yTAMpaena968ebr77rstq2fQoEFaunSpTpw4oaVLl2rlypXavn279u/fr9zcXFVUVCgqKkodOnTQ4MGDNX78eN18881e7SQGAAhcNsNoYsl/AAAAAAAANAuL5gIAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAAAAAgI8RuAAAAAAAAPiYw+oCUL+Kigpt375dktS5c2c5HHyrAAAAAADwNZfLpePHj0uShg8froiICJ+cl0/xAWr79u0aP3681WUAAAAAANBurF+/XuPGjfPJuZhSBAAAAAAA4GOMcAlQnTt39jxev369unfvbmE1AAAAAAC0TYcPH/bMMKn5WfxMEbgEqJprtnTv3l1JSUkWVgMAAAAAQNvny/VTmVIEAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G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ALDIw5cOVLe4CFPbbxftVGmly6KKAACArxC4AAAAWCQm3KGnrxlqajtaVKnXlh6wqCIAAOArBC4AAAAWuvysbpo0INHU9saKNB3MLbOoIgAA4AsELgAAABay2Wx66uqhCqmxgm6Vy63ffb7LwqoAAMCZInABAACw2ICusZp+Xm9T25epR7R6/wmLKgIAAGeKwAUAACAA/PTigeoQFWpqe3bhTrmq3RZVBAAAzgSBCwAAQACIjwrVY5cNMrXtOVqs99YftKgiAABwJghcAAAAAsSt43ppSPc4U9tLX+9VYZnToooAAEBLEbgAAAAEiBC7rc420QVlTv1t2X6LKgIAAC1F4AIAABBAzu3XSVec1c3UNntVhg4VlFtUEQAAaAkCFwAAgADz+OWD5ai1TfSLi/dYWBEAAGguAhcAAIAA0zcxWnec08vU9u8th5SaU2hRRQAAoLkIXAAAAALQgxcPUEy4w3NsGNLzX+y2sCIAANAcBC4AAAABKDEmXP9vcj9T24p9J7R873GLKgIAAM1B4AIAABCgfjixn7rGhZvafv/FbrndhkUVAQAAbxG4AAAABKjIsBA9culAU9uuw0X695ZDFlUEAAC8ReACAAAQwG4YnaSBXWNMbS99vVdVLrdFFQEAAG8QuAAAAAQwR4hdv7hisKntUEG55m/MsqgiAADgDQIXAACAADdlUBeN69PB1PbKt/tU4ay2qCIAANAUAhcAAIAAZ7PZ9OjUQaa2o0WVemdtpkUVAQCAphC4AAAABIFz+3XSxJREU9trSw+otNJlUUUAAKAxBC4AAABB4pGp5h2LckurNGd1hjXFAACARhG4eOHQoUP685//rKlTp6pXr14KCwtTt27ddMMNN2jdunVWlwcAANqJ0b066OLBXUxtf192QIXlTosqAgAADSFw8cJf//pXPfzww0pLS9PUqVP16KOPauLEifr00091/vnna/78+VaXCAAA2omHLzWPcimqcOmtFWkWVQMAABrisLqAYDB+/HgtXbpUkydPNrWvWLFCF198sX784x9r2rRpCg8Pt6hCAADQXpzVM15XDu+mz7cf8bS9tTJdMyf0VcfoMAsrAwAANTHCxQs/+MEP6oQtkjRp0iRNmTJF+fn52r59uwWVAQCA9ujhSwbKZjt9XFpVrbdWMsoFAIBA4vfA5dixY/rPf/6jp556SldccYUSExNls9lks9k0c+bMZp0rMzNTjz76qAYPHqzo6Gh17NhR48aN0wsvvKCysjL/3EATQkNDJUkOB4OFAABA6xjQNVbTRvY0tc1dnanCMtZyAQAgUPg9JejatatPzrNw4ULdeeedKioq8rSVlZVp48aN2rhxo958800tWrRIKSkpPrmeNw4ePKj//ve/6t69u4YPH95q1wUAALh/SooWbD0kwzh5XFLp0pzVGXrokgHWFgYAACS18pSiXr16aerUqc1+3ZYtW3TLLbeoqKhIMTExeu6557R69Wp98803uvfeeyVJe/fu1VVXXaXi4mJfl10vp9Opu+66S5WVlZo1a5ZCQkJa5boAAACSlNIlRlcN725q++eqdBVXMMoFAIBA4PcRLk899ZTGjRuncePGqWvXrsrIyFDfvn2bdY6HHnpI5eXlcjgcWrx4sc477zzPcxdddJEGDBigxx9/XHv37tWLL76oZ555ps45Hn30UVVWVjbrmgMG1P8XIrfbrZkzZ2r58uW69957dddddzXrfgAAAHzhgYtS9J/vDnuOC8udemftQf34wv4WVgUAACTJZhinBqK2jpqBy4wZMzRnzpxG+69fv17nnHOOJOm+++7T66+/XqeP2+3WWWedpV27dikhIUHHjh3zrK1ySkxMjEpLS72uc8mSJbrwwgvrvdY999yjuXPn6s4779TcuXNlt/t+oFB2draSk5MlSVlZWUpKSvL5NQAAQPD70dsbtXjnUc9xp+gwrfj5FEWFsb4cAADe8Nfn74DfpWjBggWex3fffXe9fex2u6ZPny5JKigo0JIlS+r0KSkpkWEYXn81FLbcfffdmjt3rm677TbNmTPHL2ELAACAtx68yDwiN7e0Su+vz7KoGgAAcErApwUrV66UJEVHR2vMmDEN9qu5bfOqVat8XsepsOXtt9/WLbfconnz5rFuCwAAsNzwpHhdOKizqe3vyw6owlltUUUAAEAKgsBl165dkqSUlJRGt14ePHhwndf4yqlpRG+//bZuuukmvfPOO4QtAAAgYDx4kXmXxmPFlfpoI6NcAACwUkBP7q2oqNCJEyckqck5VB06dFB0dLRKS0uVleXbXzB+85vfaO7cuYqJidHAgQP129/+tk6fadOmaeTIkV6fMzs7u9HnDx8+3OjzAAAAp4zp3VHn9++k1QdyPW1vrEjTbeN7yRES8H9f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hyIiItStWzdNmDBBs2fPltPptLpEAAAAtAEdosP019tGKcR+egyGYUj3v7dZ6SdKLays7WOXIgC+RuDihZKSEr322muy2Wy66qqr9Mgjj+j666/XoUOHdM899+jqq6+W2+22ukwAAAC0AWP7dNSjUwea2grLnfrhnA0qLAvuP/QF8rSdQK4NQHByNN0FHTt2VGFhocLCwkztLpdLl156qRYvXqwvvvhCV111lUUVAgAAoC35fxf017asAn2VetTTlnaiVPe/t1mz7x6n0JDg/LvpnqPFVpcQNNal5arS5dbElETZ7fWtOgMg0AXnv9StzG631wlbJMnhcOj666+XJO3fv7+1ywIAAEAbZbfb9NLNIzW0e5ypfeX+E3rso21yB/HOReVV1VaXUK9Aekef/2K3bnljrab/c73+94MtVpcDoIX8HrgcO3ZM//nPf/TUU0/piiuuUGJiomw2m2w2m2bOnNmsc2VmZurRRx/V4MGDFR0drY4dO2rcuHF64YUXVFZW5p8baITb7daXX34pSTrrrLNa/foAAABou6LDHXpzxlglxoSb2j/dmqOnPtshI0jnwBRXBua0qEB5P13Vbr2+7IDn+D/fHVZWXut/1gFw5vw+pahr165Nd/LCwoULdeedd6qoqMjTVlZWpo0bN2rjxo168803tWjRIqWkpPjkevWpqqrS7373OxmGodzcXH3zzTfavXu37r77bl188cV+uy4AAADapx4JkfrH9DG67R9rVeE8vWbgO2sPKjYiVI9fNkg2W3BNN7EHaL2BEbdIVdV114bce7RYyR2j6u1vGIY2ZuYrKixEw3rE+7s8AM3Qqmu49OrVS4MHD9bixYub9botW7bolltuUXl5uWJiYvTLX/5SU6ZMUXl5uT744AP94x//0N69e3XVVVdp48aNio2N9Uv9VVVVevbZZz3HNptNjz32mH7/+9/75XoAAADAqF4d9Pe7xup/5m6Qs/p0LPDa0gNyG4Z+cfngoApdAjVwCRQ21X1/Ght8878fbNXCbTmSpJ9fPlg/vrC/v0oD0Ex+D1yeeuopjRs3TuPGjVPXrl2VkZGhvn37NuscDz30kMrLy+VwOLR48WKdd955nucuuugiDRgwQI8//rj27t2rF198Uc8880ydczz66KOqrKxs1jUHDBhgaouJiZFhGHK73crJydHChQv1xBNPaM2a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fzBcnWLCz/CsjXPWM3LKp3w8JKUtDHB56eu9+nLHEV03sofundRP9vpWyz5DbeF9OlOMcAEAAADgtfioUN0/JUUrfj5FL986Umcnxbf4XNf/bbUPK/OeVTsoeTelyPvX+WPx3y1ZBXrx673KyC3T4p1H9cbyNJ9fw1tN3d/x4krNnL1e45/7r55btLPBqWJ+yBLahJ2Hi/T7L3Zr08F8q0tpswhcAkRqaqrp69tvv7W6JAAAAKBBoSF2XTeypxbcP0Ef//g8XTm8W4s+2K7af6LpTj7W0JQify8468356+vzze6j3l/DixCmsQEfz3yWajr+eysFLi15599ama6le47rWHGl/rEiXWvTcuvt15xFh71h9S5PvvbrBTu86lfhrNYLX+3WK0v2e9X/v7u8/7ltqwhcAAAAALSYzWbTmN4d9bc7xmj54yfXeYmN8H7lgjveXKcXvtrtxwrramiEi9vPM1taOsLlk82HvL9GM+qpT2F56y9t0FB80dT79fqyA6bjhrZw9kc+4usQx0q5DWyVXdsLX+3Rq0sONN3xe++sPaj5G3y7y1OwIXABAAAA4BNJHaL0xJVDtPaXFzfrda8uOaA+v1ik4lZatLbBKTr+vq6P+nj6tpFFcxvS3FupcFbX217fyCt/TMdq695amd7s1/z84/pDsPaCwAUAAACAT0WHO5Tx/FW645xezXrd8GcWq88vFinPy7+4t1RDI1wC4UN4c2rwZi2aps7ndhvacahQhwrKT/a3YLNpm83m0/d+95EivfDVbn269ZAMw6h3NMr767P0zGep2tKC9UvaztiWk9ra/QQSdikCAAAA4BfPXT9cz10/XFUutwY++YXXrxv9f19Lkpb97EL17hTt87oaWlzV37wJFc64slonqHeb6e8/YhuGoZlzNmj53uMKC7HrT7eMDKgRMiffr9NxQIWzWoYhRTawNblNNh0uLNe1r6xS1ffbkn+6NUdbswrq9D01/Wje2kwtfexCX5ceVI4VV+rm19foyauHaERSgtXltCmMcAEAAADgV2EOuzKev0orHp/SrNdNfmGpHnx/izZl5vt0BIRVU4q8CXqac5v1bwttNNnnlNUHcrV873FJUtX/b+++46Oq8/2PvyedECD0gARDXXoRCChNBMElYldEULpcXK5rR9j9ibqLBtdV173KqggB/bGKdTcCorQIhCpF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",
+ "image/png": "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",
"text/plain": [
""
]
@@ -437,12 +353,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 18\n"
+ "Time step 18\n",
+ "RMSE 0.00437233817003242, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFwAAAOOCAYAAAA9KAZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACneElEQVR4nOzdd3hUZf7+8XvSSSOEDgkdBIIiKiAddMWuWNYuoLvqWnb9WtZ1/e1adtddy9p1LasrRUVddVFE7CCd0HsLBEgILb0nU87vj8iQkzoJMzkzk/frunIx55kzZz6HoGRunufz2AzDMAQAAAAAAACvCbG6AAAAAAAAgGBD4AIAAAAAAOBlBC4AAAAAAABeRuACAAAAAADgZQQuAAAAAAAAXkbgAgAAAAAA4GUELgAAAAAAAF5G4AIAAAAAAOBlBC4AAAAAAABeRuACAAAAAADgZQQuAAAAAAAAXkbgAgAAAAAA4GUELgAAAAAAAF5G4AIAAAAAAOBlBC4AAAAAAABeRuACAAAAAADgZQQuAAAAAAAAXkbgAgAAAAAA4GUELgAAAAAAAF5G4AIAgJctWrRINptNNptNEydOrPe84+fYbDavvff06dPd15wxY4bXrutt+/btc9fZq1cvq8tpMYHy/QEAACePwAUAEBAefPBB0wd0wzCadZ3c3FxFRkbyoRfwczNmzDCFkjW/IiMj1alTJw0fPlx33XWXFi9e7PG1qwd+x786deokh8Ph8TWcTqe6du1a6zr79u1r9LUZGRl68skndf755ys5OVkxMTEKDw9XQkKCBg4cqIsuukj/7//9P82bN0/FxcVNuo+mfC1atMjj+wUANB2BCwAgIEybNs39eP/+/frpp5+adZ0PP/xQlZWVkqSYmBhdffXVXqmvNWuts1VgrcrKSh07dkxr1qzR66+/rgkTJmjSpEnKyMho1vWOHTumBQsWeHz+N998o8OHDzfpPcrLy/Xggw+qd+/e+tOf/qRvv/1WmZmZKi0tlcPhUEFBgXbu3KkFCxbo73//uy677DIlJiZqxYoVTb0dAIAfCLO6AAAAPHHqqadq2LBhWr9+vSRp1qxZDS7Xqc+sWbPcj6+66irFxsZ6q0QAPhIXF6epU6eaxsrLy7V//34tW7ZMZWVlkqqW851zzjlauXKl2rdv3+T3mTVrli699FKPz22KyspKXX755fr222/dYxERETrrrLPUt29fRUdHq7CwUPv27dOGDRvc92S321VSUuLRe0ydOlVxcXEe19S9e/cm3QMAoGkIXAAAAWPatGnuwOXTTz/Va6+9pjZt2nj8+l27dmnVqlWm61mpucuigsHJLAtD65OYmKhXX321zudycnJ011136eOPP5YkpaWl6fHHH9crr7zi8fUHDx6sbdu2ad68ecrPz1dCQkKD5xcUFOjzzz83vbYxTz31lDtssdlseuihh/Twww/X+V52u12LFi3Sxx9/rDlz5nh8H0888QSzzADAj7CkCAAQMG644QaFh4dLkgoLCzV37twmvb76v0j36NFDkyZN8mZ5ACzQvn17ffDBBxo+fLh77N1335Xdbvf4GjfffLMkqaKiQh999FGj53/88ccqLy+XpFozb+pit9v1wgsvuI//8pe/6Kmnnqo32AkPD9d5552nf//738rMzNSwYcM8uAsAgL8hcAEABIyOHTvqwgsvdB83ZUq/YRh677333Mc333yzV3cHAmCd0NBQ3XPPPe7jkpISrV271uPX33DDDQoLq5r47cn/V46fEx4erhtuuKHR81NTU5Wfn+9+zb333utxbQkJCc1aHgUAsB6BCwAgoFRfBvTdd9953LTyp59+0v79+93HNf9VuqCgQHPmzNEdd9yhkSNHqkOHDoqIiFB8fLz69u2r66+/Xh9//LFcLpd3bkRN3xZ67ty5uvzyy9W9e3dFRkYqKSlJ5513nmbPnt2k3VUkqaysTHPnztXvfvc7jR07Vp07d1ZERIRiY2PVq1cvXXHFFXrnnXfcDYbrcnwXmd69e7vH9u/fX++OKNU1p9HuypUrdc899yglJUXt2rVTVFSUkpKSdMEFF+jVV1/1qM/F448/7n7fxx9/XJLkcDg0a9Ys/eIXv3D/3nbt2lVTpkzRl19+6VFtvlJcXKyXX35Z559/vpKSkhQVFaV27dppyJAhuueee0xL5BqTkZGhJ554QuPHj1fnzp0VGRmpiIgItW/fXkOHDtUNN9yg119/vcH/pux2u9577z1deeWV6tOnj2JjYxUWFqa4uDj169dP559/vh599FGlpqZ64/ab5PTTTzcdZ2VlefzaTp066YILLpAkLV++XHv27Kn33PT0dC1btkySdMEFF6hjx46NXv/gwYPux4mJiU3qswIACGAGAAABpKKiwkhMTDQkGZKM5557zqPX3XLLLe7XjBo1yvTcp59+akRGRrqfb+hr6NChxt69ext8r4ULF7rPnzBhQr3nVb9uQ4qKioyLLrqowbrGjh1rHDp0yJg2bZp77N13363zeitXrjRiY2M9ut9evXoZ69atq/M67777rkfXqOse09PT3eM9e/Zs8P6Li4uNa6+9ttHrd+3a1fjqq68avNZjjz3mPv+xxx4zMjMzjdGjRzd43VtuucVwOp0NXtdTnnx/jps3b57RpUuXRu/7hhtuMEpKShq81ptvvmm0adPGo+/TmDFj6rzGzp07jUGDBnn8/d69e3dzf5sMwzD/+Wrsz4hhGMauXbtM7//+++/Xe271P3+SjLKyMuPjjz92Hz/66KP1vvbxxx93n/ff//7XKCsrM10rPT291mv++9//up+32WxGcXGxJ78Fjap5H3W9NwDAOjTNBQAElIiICF1//fV67bXXJFVN7b///vsbfE1ZWZk++eQT93HNZrlHjx5VRUWFJCkpKUmDBw9Wly5dFB0dreLiYm3fvl3r1q2TYRjauHGjxo8frw0bNrTINH+73a6LL75Yixcvdo916dJF48ePV1xcnNLS0rR06VItXbpUV1xxhfr06dPoNfPy8lRcXCyp6l/2U1JSlJSUpJiYGJWWliotLU2pqalyOBzat2+fJkyYoHXr1qlfv36m6wwaNEh33323ioqK3Ess6tpN5mSUlpbqnHPOMc2Y6Natm8aNG6fY2Fj3/TudTh06dEiXXXaZ5syZ49F238XFxbrgggu0ZcsWRUdHa9y4cUpOTlZRUZEWLlyoo0ePSqrqB3LKKafoD3/4g9fuqzEfffSRbrzxRjmdTklVS2bGjh2rfv36qbi4WEuWLHHP4Pjggw+Unp6uH3/8UVFRUbWuNXfuXN1xxx3u4/j4eI0aNUpJSUkKCwtTQUGBdu3apS1bttQ7o6moqEi/+MUv3Fsuh4SEaNiwYRo0aJBiY2NVWlqqgwcPauPGjcrOzvb2b4dHas5o6dy5c5Nef9lllykhIUH5+fl677333LOhajr+Z71du3a69NJLPWr+3LdvX/djwzD0zDPP6IknnmhSfQCAAGRx4AMAQJOlpqaa/lV306ZNDZ7//vvvu8+NjIw08vLyTM9/8cUXxj/+8Y8G/0V+7969xvnnn+++zq9+9at6z/XmDJe//OUvpn8Zf/LJJw2Hw2E6Z+fOncbQoUMNSUZERIRHM1weeeQRY/PmzfW+75EjR4ybb77Zfa1zzz233nObMlulqa+588473eeFhoYaL774Yq3ZJrt27TLOPPNM93nx8fH1/kt/9Rkux2c1TZs2zcjJyTGdV1JSYlx//fXuc2NjY70yK8GTGS5paWmmGUgjRoyo9WfT6XQazz33nBESEuI+77e//W2d1zv99NPd59xzzz31zoYpKioyPv74Y+MPf/hDredefPFF9zUGDx5s7Nixo85ruFwuIzU11bjzzjuNAwcONPA70bimznD54x//6D4/PDzcyM3Nrffcuma4GIZh3H777e6xxYsX13rdkiVL3M/fcccdhmEYHs1wcblcRq9evUz/Ld90003GihUrDJfL5dlviAf3wQwXAPAvBC4AgIBUfWnDgw8+2OC51YOSa665ptnvWVlZaZx22mmGJCMqKqreD3TeClzy8/ON6Oho9zmPP/54vdc6evSo0bVrV9M1G1uy4okLL7zQfb1t27bVeY6vApe0tDRToPDqq6/We73c3FzTB9pbbrmlzvOqBy6SjOuvv77ea5aVlRnJycnucz/88EOP7q0hngQuU6dOdZ/Tr18/Iz8/v97rPf/88+5zQ0JCai13Kyoqcj+fnJzc7A/3V111lfs63333XbOu0VRNCVy2bdtmxMXFuc+/4YYbGjy/vsBl2bJl7rFf//rXtV532223uZ9fvny5YRieBS6GYRiffPKJ6bzjX+3btzcuuugi49FHHzXmzZvXYFDU2H1MnTrVuPvuuz36evHFFz1+HwBA8xC4AAAC0lNPPeX+kNGtW7dasz6Oy8rKMkJDQ93nzp8//6Te9+mnn3Zf64svvqjzHG8FLv/617/czyclJRkVFRUN1vbWW295PXD56KOP3Nd7+eWX6zzHV4HLH/7wB/c5p59+eqNhQfVaIyMj6wwqqgcuERERxqFDhxq85kMPPeQ+//777/fo3hrSWOCSl5dn6if02WefNXg9p9NppKSkuM9/+OGHTc8fPHjQ9HvYXOedd577Ohs2bGj2dZqiscClvLzc2Llzp/HMM88YCQkJ7nMHDhxoHD58uMFr1xe4GIZh9OvXz5BktG3b1jReVlbmfp/+/fubxj2dZfL2228bUVFRdQYv1We/jBgxwnjllVdM7+/JfTTlq6H/NwEAvIMeLgCAgHTTTTfpkUcekcvlUlZWlr7//nudf/75tc57//333X0wunTpUuc51eXn52vlypXaunWrcnJyVFxcbNqZaMeOHe7HGzZs0KWXXuqlO6pt4cKF7sfXXnutIiIiGjz/uuuu0z333NPgzkI1lZaWauXKldq8ebOOHTumoqIi9++XZN5dZcOGDZ4X7wU//vij+/H06dMb3c3piiuuUGJionJzc1VRUaEVK1a4d56py9ixY9WlS5cGrzls2DD343379nlW+ElYvny5u59Qhw4dGv3zFRISoltvvVUPPPCAJPOfmePXiIqKUnl5ubZs2aJly5ZpzJgxTa4rOTnZ/fiNN97Q66+/3uRrnIzju181JCQkRFOmTNFrr73W5P4t1d1888167LHHVFBQoM8//1zXXnutJOnzzz93b+188803N+vav/rVr3Teeefp6aef1pw5c5SXl1frHMMwlJqaqtTUVD399NOaPXu2Jk6c2NzbAQBYiMAFABCQunfvrl/84hf69ttvJUmzZ8+uM0w53uBSkm688UaFhobWeb3MzEw9/PDD+uSTT9wfeBvj6+ag69evdz8eNWpUo+fHxcVpyJAhWrduXaPn5ubm6tFHH9WsWbNUVFTkUT0t2QzVMAxTwDN69OhGXxMeHq4RI0bo66+/liStW7euwcDl1FNPbfSa1RsjFxYWNnr+yar+PR8xYoTCwhr/Ua16gLJ+/XoZhuEOJyIiIjRlyhR9+OGHcjgcOuecc3Tttdfq6quv1vjx45WQkOBRXddcc43+85//SKoKXNauXatp06bp/PPPr9VM2SqXXXaZ3nnnHY/vqT4333yzHn/8cRmGoVmzZrkDl+P/L7HZbM0OXCSpR48eeu211/TCCy9o1apVWrJkiVavXq21a9e6mxIfl5mZqfPOO0/z58/X5MmTG712enq6x9usAwB8j8AFABCwpk2b5g5c/ve//6m4uFixsbHu59evX6/Nmzebzq/L+vXrde6559b5r80N8TSoaK5jx465H/fo0cOj1/To0aPRwGX//v0aP368Dhw40KR6fH2/1RUUFMhut7uPe/bs6dHrqn/YbCwgatu2baPXCw8Pdz+uXo+vVP+eN+eeKysrVVRUpPj4ePfYCy+8oLVr12r37t2qrKzU7NmzNXv2bIWEhCglJUXjxo3TeeedpwsvvFCRkZF1vsf555+v3/72t3rllVckSatXr9bq1aslVe0GNHbsWE2cOFFTpkxRUlJSU2+7UTV3v3I4HMrKytL69euVmZkpqWo3pr179+qHH35Qhw4dmv1evXv31tixY7VkyRJ9++23OnLkiCS5/18zbtw4r4QaERERGjdunMaNG+ce27dvnz755BO9+OKL7tllDodDU6dO1d69exUdHX3S7wsAaDkhVhcAAEBzXXHFFe4PlqWlpaatnyXz7JZhw4bVOaOhoqJCV111lTts6dixo/70pz9p4cKFysjIUElJiVwul4yqvmd699133a+tvtTIF45v3SzJ4w9aMTExjZ5zww03uMOWuLg43Xffffr666+1d+9eFRcXy+l0uu+3+hIVX99vddXvXfLsvmqe11hA1NgSFStUv+/m3LNU+767dOmiNWvW6E9/+pNpqY3L5dLmzZv1r3/9S1dccYW6du2qp556yrSkrLqXX35Zn332mUaMGGEaP3LkiD799FP99re/VY8ePXT11Vc3OcxrTGJiol599VX31xtvvKEvvvhC6enpeuedd9zbYW/atMkr25IfD2cdDoc++OADffDBB3I4HKbnfKFXr1568MEHtW3bNtMyoiNHjuijjz7y2fsCAHyDwAUAELDatGmjX/7yl+7j2bNnux87HA7NmTPHfVzfh6RPP/1U6enpkqqWKW3cuFF//etfNXHiRCUlJSk6Otr0wbwlZ3lUn61TWlrq0WtKSkoafH758uVavny5+/orV67U888/r/PPP1+9e/dWTEyMQkJO/HjQkvdbXfV7lxq/r7rOi4uL82pNLaH6fTfnnqW67zs+Pl5//etfdfDgQa1cuVLPPvuspkyZYpoJkpeXpz/+8Y+66qqrZBhGne91xRVXaNWqVdq/f79mzpypO+64Q4MHD3Y/bxiGPv30U51xxhnatWuXR/WfjLCwMN166616++233WMLFizQzJkzT+q6v/zlL9WmTRtJVcHt8evV/H+Or8THx2v27NmmJZBLlizx+fsCALyLwAUAENCqBymLFi1y90D45ptv3EsBwsPDdcMNN9T5+h9++MH9+P/+7//UtWvXBt9v//79J1uyxzp27Oh+7OmMgZo9IGqqfr/Tpk0zfViuS0veb3Vt27Y1Lefx9P6rN7Y9mWUlVmnO97z6PUdERDQYNIWGhmrkyJF68MEH9b///U9HjhzRkiVLdNlll7nP+fzzz/Xpp582+J49evTQ1KlT9cYbb2jr1q06cOCAnnjiCfdMrJycHN1///0e1e8NN954o+ke/vznP6u8vLzZ14uPj9fll18uqapZ9MaNGyVJU6ZMabEgLykpSSkpKe7jQ4cOtcj7AgC8h8AFABDQxo4dqz59+kiqWiLx3nvvSTIvJ7rwwgtNH2Sry8rKcj/2pInq4sWLT6bcJqm+Q87KlSsbPb+4uFhbtmxp8Bxf3K8vlubYbDadfvrp7uPjs3Ia4nA43H1FJOmMM87wel2+Vv17npqaWu/ynuqq/94MGzasSd+PkJAQjR07VnPnztV5553nHv/iiy88voZUtYvRo48+qrfeess99u2333rcgNobnnnmGfeMkIyMDL3xxhsndb26liZ5Y7lSUxxfKiWp3v46AAD/ReACAAhoNpvN9CFo9uzZKigoMH1gbKjnQvXlM40t21m7dq3pA72vTZo0yf34o48+arRp60cffdToB9ym3G9WVpY+//zzRuus/qHQm41lzznnHPfjmTNn1rvM5bi5c+cqJyfHXZMnOzv5m9GjR7s/WB87dkzz589v8HyXy2XqK1T996wpbDabaQvq47PDmqr6LBO73a7c3NxmXac5TjnlFF133XXu42efffakAp/Jkyebtg3v2rWrKZTytYqKCtM29J42zgYA+A8CFwBAwJs6dar7X/W3b9+uhx56yL2cIDExUZdcckm9rz0+O0Zq+F/1S0tLdfvtt3upYs/ccMMN7iUaGRkZevrpp+s9NycnR48++mij1/T0fp1Op26//XZVVlY2es2EhAR3kHPs2DGvhS633Xab+7rr1q0zzZ6oKT8/Xw899JD7+Prrr/doFyJ/k5CQ4N6GWJJ+//vfN9hH59VXX3XvxBUSElLrz2hRUZFH30PJvBytU6dOpuc83RK8+jVCQkJM22q3hD/96U/uPzNZWVmm3i5NFRoa6t6yefXq1Vq8eHG928o3ZtWqVfrnP//pcS8mqWrGTvWtyBva4hwA4J8IXAAAAa93796mrVWrfzC//vrrFRERUe9rq/+r/syZM/Xcc8/VWsaRlpamyZMna926dR7vHOMNbdu2NYUIjz76qJ5++ula9e3evVvnnXeesrKyGrxXSbr44ovd4dSiRYv04IMPqqyszHTO4cOHddVVV2n+/Pke3W9kZKT69+8vqWpWw9y5cz25vUb17dtXd9xxh/v4nnvu0WuvvVZrt6Tj35/jzY/j4+M9Cp/81aOPPupunrtr1y6df/752rt3r+kcl8ull156ydQn5e677661XfHatWvVq1cvPf7449q2bVud7+d0OvXRRx+5t3yWqpbhVTdq1CjdcMMNWrBgQb0Bzq5du0yzyc4999xG/zx628CBA3XNNde4j59++mmPA6e69OvXT2eddZbOOuss9evXr9nXycvL0+9//3v16tVL999/v9atW1fvjK3s7Gzdd999pj/Dw4YNI3ABgAAUZnUBAAB4w7Rp0+rsN9LYFq6TJ0/W+PHjtXjxYhmGoQcffFCvvfaazjjjDLVt21a7d+/W8uXL5XQ61b17d917772mEMTX/vjHP+q7777TsmXLZBiGHn74Yb300kuaMGGCYmNjlZaWpiVLlsjpdGrkyJHq27evPvjgg3qvN3DgQN18883uHjfPPfecPvjgAw0fPlydOnXSvn37tHjxYlVWViouLk7PPvusfvOb3zRa51VXXaW///3vkqoamM6YMUP9+vUzNb795z//2eT7/+c//6k1a9Zo9erVcjgcuueee/TUU09p7Nixio2N1Z49e7R48WJ3CBUWFqZ33nmnVvAQSPr27au3335bN954o5xOp1asWKFTTjlF48aNU9++fVVcXKwlS5bo4MGD7tecffbZeuaZZ+q83qFDh/TEE0/oiSeeUJcuXXT66aerS5cuCgsL05EjR7R27VpTb59x48aZluZIVUHanDlzNGfOHLVp00annXaa+vTpo/j4eOXl5Wnv3r1as2aN+/w2bdo06/vtDX/+85/18ccfy+VyKSMjQzNmzGjx2Wn1OXbsmF544QW98MILatu2rc4880x17dpVcXFxKi4u1u7du7V27Vr3FtSS1LlzZ73//vum5YD1eeyxx5rU1HfSpEm66qqrmnUvAAAPGAAABIHCwkIjOjrakOT+GjRokEevPXz4sHHGGWeYXlvza/DgwcbWrVuNd9991z02bdq0Oq+3cOFC9zkTJkyo932rX78hBQUFxgUXXNBgfaNHjzaysrKMadOmucfefffdOq9XUlJiTJ48ucHrJSUlGUuXLvX4XvLz842BAwc2eM3q0tPT3eM9e/Zs8P6LioqMa665psFrSzK6du1qfPXVVw1e67HHHnOf/9hjjzV4rmF4/r30lCffn+PmzZtndO7cudH7vv76642SkpI6r7Fy5UojLCys0Wsc/7r66quNwsLCWtcZMmSIx9fo3bu3sWzZspP+var+31pjf0Zq+uUvf2mqx263m56v/udPklFWVtbsOsvKykzXSk9Pr3XOjh07jAkTJhihoaEe/z5KMi688EJj79699b53zfto6te9997b7PsGADSOGS4AgKAQFxenK664Qu+//757rLHZLcd17txZy5cv19tvv60PP/xQW7ZsUWlpqTp16qRTTjlF1157rW688UZFR0crNTXVV7dQr/j4eC1YsECfffaZZsyYodWrVys3N1cdOnTQoEGDdOONN+qmm24yzSZpSHR0tBYsWKAPPvhAM2fO1Pr161VYWKgOHTqoT58+uuqqqzR9+nS1a9dOixYt8uiabdu21erVq/Wvf/1L8+fP1/bt25Wfn++Vfi6xsbH66KOP9H//93+aPXu2Fi1apKysLJWVlalDhw4aMmSILrnkEt16660tuuTL1y655BKlpaXpP//5j7788ktt3bpV2dnZatOmjbp166ZJkyZp6tSpGjlyZL3XGDlypI4eParvv/9eS5cu1fr167Vnzx7l5OTI6XQqPj5effv21dlnn62bbrpJI0aMqPM6GzZs0MqVK7Vw4UKlpqZq586dysrKUmlpqaKjo90zZy677DJdc801lu+o8+c//1mffPKJDMNQenq6Zs+erVtuucWyek455RQtWrRI2dnZWrRokZYuXarNmzcrLS1NOTk5Ki8vV3R0tNq1a6eBAwdqxIgRuuaaazzaSQwA4L9shtFIy38AAAAAAAA0CU1zAQAAAAAAvIzABQAAAAAAwMsIXAAAAAAAALyMwAUAAAAAAMDLCFwAAAAAAAC8jMAFAAAAAADAywhcAAAAAAAAvIzABQAAAAAAwMsIXAAAAAAAALyMwAUAAAAAAMDLCFwAAAAAAAC8jMAFAAAAAADAywhcAAAAAAAAvCzM6gJQt/Lycm3evFmS1LFjR4WF8a0CAAAAAMDbHA6Hjh07Jkk69dRTFRUV5ZXr8ineT23evFkjRoywugwAAAAAAFqN1NRUDR8+3CvXYkkRAAAAAACAlzHDxU917NjR/Tg1NVVdu3a1sBoAAAAAAILToUOH3CtMqn8WP1kELn6qes+Wrl27KikpycJqAAAAAAAIft7sn8qSIgAAAAAAAC8jcAEAAAAAAPAylhT5iZSUFNOx3W63qBIA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slgsGj9+vCTphx9+0N13363IyEiFhoYqMjJSEyZM0L59+1zqLykpSXfeeadat26tkJAQNW3aVNddd50SEhKUm5vrUh979uzRo48+qu7du6tx48YKCgpSRESEBg8erNdee03Hjx+vtI+vv/5aI0aMUEREhEJCQtS2bVtNmTJFGRkZFV6XmZmp559/Xtdcc40aNWqkoKAg/eEPf1D37t119913KzExUTk5OS59DgAAUDGLzWazmV0EAADA7yUnJysuLk6SNHPmTL344otV7iMqKkrp6ekaN26cbrjhBk2ePFlWq9WhXUhIiN5//32NGjXKaT8XL17UPffco+XLl5d7r1atWmnFihWKjo52er64uFjPPPOM3nzzTVX0169x48aVefxzWlqa2rZtK0latGiR9u/fr4SEBKfXNm/eXOvWrVPnzp0dzq1fv1633HJLpYFKUlKSbrnllgrbAACAyrGHCwAA8Hk7duzQ0qVL1aJFC02fPl0xMTG6ePGiVq5cqTfffFMFBQW699571bZtW/Xp08fh+nHjxtnDlp49e+qpp55S586ddebMGX344YdKTExUZmamBg0apF27dumKK65w6OOhhx7SwoULJUktW7bU1KlTdf3116tRo0Y6deqUtmzZoo8//rjCz/Huu+9q06ZNGjhwoCZPnqyOHTvq3LlzWrJkiZYsWaJTp05p4sSJSklJKXNdQUGBxowZo5ycHDVo0EBTpkxRXFycWrRoocLCQh05ckSbNm2qMFACAABVwwwXAADglUrPcHH1KUVXX321goKC7O8vz3CRpDZt2mjz5s2KiIgoc823336rIUOGyGq1qm/fvtqyZUuZ8ytWrLDP+Bg0aJBWrlyp4ODgMm3effddPfTQQ5Kku+66Sx999FGZ859//rluvfVWSdJ1112nlStXKjw83OlnOHr0qCIjI+3vS89wkaQHH3xQ77zzjiwWS5nrHnzwQS1YsECStG3bNvXq1ct+bu3atRo0aJCkimewWK1W5eXlqWHDhk7PAwAA1xG4AAAAr1Q6cHHVkSNHFBUVZX9fOnD5+OOPdccddzi97uGHH9a8efMkXdrnpfQsl+HDh2vVqlUKCgrSoUOHyoQhpd10001as2aNAgMD9csvv6hly5b2c9dff71SUlJUr149paamqlWrVi5/ptKBS8uWLXXkyBGFhIQ4tNu/f786deokSXrrrbf02GOP2c8tXbpU9957ryQpOzubQAUAgBrAprkAAMDnNW7c2D7DxJmJEyfaX69Zs8b+2mq1at26dZKkIUOGlBu2SJdmmFy+Jjk52X789OnT2rx5syRp9OjRVQpbfu/OO+90GrZIl2b3hIWFSZIOHz5c5lzp8GfRokVu3x8AALiOwAUAAHi9mTNnymazVfpP6dktpfXq1UuBgeVvXRcdHW1fJrR792778cOHDysvL0+SdO2111ZYY+nze/bssb/esWOHfZPcAQMGVPxBK3F5Bkt5GjduLEk6f/58meP9+/fXVVddJUl64oknFBMTo1dffVUbN25UYWFhtWoCAADOEbgAAACf16JFiwrPBwYGqkmTJpKkM2fO2I+Xfl1ZH6X3hil9XVZWlv116Zkm7qhXr16F5wMCLv3Vrri4uMzxoKAgJSUl2Z9e9MMPP2jGjBnq37+/wsPDNWzYMC1dutThOgAA4D4CFwAA4PN+v8GsWX2YqUuXLtq9e7eWL1+uiRMnqn379pKk/Px8ffXVV7r33nt17bXX6uTJkyZXCgCAbyBwAQAAPu/XX3+t8LzVarXPSrk80+X3ryvr48SJE06va9asmf318ePHXSvYQ+rUqaORI0fqvffeU2pqqjIzM7Vw4UL17t1bkvTjjz9q8uTJptYIAICvIHABAAA+b8eOHbJareWe37lzp30vk27dutmPX3XVVfZlPN9//32F9yj9OOnSffTq1cs+O+a7776revEe1LJlS02YMEEpKSm65pprJElffPGF8vPzTa4MAIDaj8AFAAD4vDNnzigpKanc8wsXLrS/Hjx4sP11YGCgBg4cKEn6+uuvlZGRUW4fCxYssF9z44032o83adJE119/vSRp2bJlyszMdOszeFJQUJD9c1qtVp07d87cggAA8AEELgAAwC9MmzbN6bKgdevWaf78+ZKk3r17q2/fvmXOP/LII5KkwsJCTZo0SUVFRQ59LFy4UKtXr5Yk3X777Q6b4z733HOSpLy8PI0aNUrZ2dnl1llRqOOu9evX6+DBg+WeLywstD/+OiwsTM2bNze8BgAA/E35z0cEAADwEidPnizzqOXy1K1bV+3atXM43rNnT/3000/q3bu3pk+frpiYGBUUFGjlypV64403ZLVaFRgYqLlz5zpcGx8fr1GjRunf//63Vq9erX79+mnatGnq1KmTzp49qw8//NA+Q6ZJkyaaM2eOQx8jRozQpEmT9N5772nTpk3q0qWLpk6dqtjYWDVs2FBZWVnaunWrPvroI/Xs2VOJiYlV/0OqwDfffKO//e1vGjBggOLj49WjRw81b95c+fn5OnDggN5++21t27ZNkjRp0qQKH6ENAABcw09TAADg9ebNm6d58+ZV2q5nz57asWOHw/Ho6GhNnTpVU6ZM0dSpUx3OBwcHa/Hixbr22mud9rtkyRJZrVYtX75c27Zt09ixYx3atGrVSitWrNAVV1zhtI933nlHdevW1dy5c5WZmakZM2aU+xk8oaSkROvWrbPPZHHm1ltv1auvvuqR+wMA4G8IXAAAgF944IEH1K1bN73xxhvasGGDsrKy1Lx5cw0aNEjPPfecunTpUu61oaGh+vTTT5WUlKTExERt3rxZWVlZql+/vjp27KiRI0dq6tSpCgsLK7ePOnXq6J///KcmTJigd955R8nJyTp27JgKCwvVtGlT9ejRQ8OGDdN9991n+Gd/+umn1aNHD61Zs0bbt29XZmam/fHPERERiomJ0f3336/4+HjD7w0AgL+y2Gw2m9lFAAAAeEJUVJTS09M1btw4w5fpAAAAVIRNcwEAAAAAAAxG4AIAAAAAAGAwAhcAAAAAAACDEbgAAAAAAAAYjMAFAAAAAADAYDylCAAAAAAAwGDMcAEAAAAAADAYgQsAAAAAAIDBCFwAAAAAAAAMRuACAAAAAABgMAIXAAAAAAAAgxG4AAAAAAAAGIzABQAAAAAAwGAELgAAAAAAAAYjcAEAAAAAADAYgQsAAAAAAIDBCFwAAAAAAAAMRuACAAAAAABgMAIXAAAAAAAAgxG4AAAAAAAAGIzABQAAAAAAwGAELgAAAAAAAAYjcAEAAAAAADAYgQsAAAAAAIDBCFwAAAAAAAAM9v8B10KVV2Ih3u4AAAAASUVORK5CYII=",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAApgFJREFUeJzs3Xd4lFXexvF7Jr2HJJAEEggQOkjvXQXErqgsKILdXXVdV9d1XRd1d33XuuraXZVmw7ZYsGAB6b3XECCQkJAQ0nuZ5/0DGXlIm8AkM0m+n+vK5cx5zpz5PQSBuXOKxTAMQwAAAAAAAHAKq6sLAAAAAAAAaE4IWwAAAAAAAJyIsAUAAAAAAMCJCFsAAAAAAACciLAFAAAAAADAiQhbAAAAAAAAnIiwBQAAAAAAwIkIWwAAAAAAAJyIsAUAAAAAAMCJCFsAAAAAAACciLAFAAAAAADAiQhbAAAAAAAAnIiwBQAAAAAAwIkIWwAAAAAAAJyIsAUAAAAAAMCJCFsAAAAAAACciLAFAAAAAADAiQhbAAAAAAAAnIiwBQAAAAAAwIkIWwAAcLJly5bJYrHIYrFo3LhxNfY71cdisTjtvWfNmmUfc+7cuU4b19mSkpLsdcbFxbm6nEbTVL4/AADg3BC2AACahAceeMD04dwwjLMaJysrSz4+PnzgBdzc3LlzTYHkmV8+Pj5q06aNBg8erN/97ndavny5w2OfHvad+mrTpo0qKiocHqOyslLR0dFVxklKSqrztcnJyXriiSc0adIkxcbGKiAgQF5eXgoNDVX37t118cUX669//au+/PJLFRQU1Os+6vO1bNkyh+8XAFA/hC0AgCZh5syZ9seHDx/Wzz//fFbjfPjhhyorK5MkBQQE6JprrnFKfS1ZS52lAtcqKyvT8ePHtXHjRr322msaO3asxo8fr+Tk5LMa7/jx4/rmm28c7v/dd9/p2LFj9XqPkpISPfDAA+rYsaMeeeQRLVmyRCkpKSoqKlJFRYVyc3O1b98+ffPNN/q///s/XX755QoLC9OaNWvqezsAABfzdHUBAAA4ok+fPurfv7+2bNkiSZo/f36tS3RqMn/+fPvjKVOmKDAw0FklAmggQUFBuvHGG01tJSUlOnz4sFatWqXi4mJJJ5fwnX/++Vq7dq3Cw8Pr/T7z58/XZZdd5nDf+igrK9MVV1yhJUuW2Nu8vb01aNAgde7cWf7+/srLy1NSUpK2bt1qv6fy8nIVFhY69B433nijgoKCHK6pXbt29boHAIDjCFsAAE3GzJkz7WHLp59+qldeeUV+fn4Ovz4hIUHr1q0zjedKZ7sUqjk4l6VgaHnCwsL08ssvV3vtxIkT+t3vfqePPvpIkpSYmKjHHntML730ksPj9+zZU7t379aXX36pnJwchYaG1to/NzdXn3/+uem1dXnyySftQYvFYtGDDz6ohx56qNr3Ki8v17Jly/TRRx/pgw8+cPg+Hn/8cWaXAYCbYBkRAKDJmD59ury8vCRJeXl5WrRoUb1ef/pPotu3b6/x48c7szwALhAeHq73339fgwcPtrfNmTNH5eXlDo8xY8YMSVJpaakWLlxYZ/+PPvpIJSUlklRlxk11ysvL9fzzz9uf//3vf9eTTz5ZY6jj5eWlCRMm6L///a9SUlLUv39/B+4CAOBOCFsAAE1G69atNXnyZPvz+kzjNwxD7777rv35jBkznHoKEADX8fDw0N13321/XlhYqE2bNjn8+unTp8vT8+SEb0f+XDnVx8vLS9OnT6+z//r165WTk2N/zb333utwbaGhoWe1JAoA4FqELQCAJuX0pT/ff/+9wxtU/vzzzzp8+LD9+Zk/jc7NzdUHH3ygO+64Q0OHDlVERIS8vb0VHByszp07a9q0afroo49ks9mccyOq/9HPixYt0hVXXKF27drJx8dHMTExmjBhghYsWFCvU1Qkqbi4WIsWLdLvf/97jRo1SpGRkfL29lZgYKDi4uJ01VVX6e2337ZvJlydU6fFdOzY0d52+PDhGk8+Od3ZbKq7du1a3X333erVq5datWolX19fxcTE6KKLLtLLL7/s0L4Wjz32mP19H3vsMUlSRUWF5s+frwsvvND+axsdHa0rr7xSX331lUO1NZSCggL95z//0aRJkxQTEyNfX1+1atVKvXv31t13321aFleX5ORkPf744xozZowiIyPl4+Mjb29vhYeHq2/fvpo+fbpee+21Wv+fKi8v17vvvqurr75anTp1UmBgoDw9PRUUFKT4+HhNmjRJs2fP1vr1651x+/XSr18/0/PU1FSHX9umTRtddNFFkqTVq1frwIEDNfY9dOiQVq1aJUm66KKL1Lp16zrHP3r0qP1xWFhYvfZVAQA0UQYAAE1IaWmpERYWZkgyJBnPPfec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Iioqqto+p8vJydHatWu1a9cunThxQgUFBaYTiPbu3Wt/vHXrVl122WVOuqOqli5dan88depUeXt719r/N7/5je6+++5aTxA6U1FRkdauXasdO3bo+PHjys/Pt/96SeZTVLZu3ep48U7w008/2R/PmjWrzlObrrrqKoWFhSkrK0ulpaVas2aN/YSZ6owaNUpRUVG1jtm/f3/746SkJMcKPwerV6+27x8UERFR5+8vq9Wqm2++Wffff78k8++ZU2P4+vqqpKREO3fu1KpVqzRy5Mh61xUbG2t//Prrr+u1116r9xjn4tQpV7WxWq268sor9corr9R7v5bTzZgxQ48++qhyc3P1+eefa+rUqZKkzz//3H5884wZM85q7FtuuUUTJkzQU089pQ8++EDZ2dlV+hiGofXr12v9+vV66qmntGDBAo0bN+5sbwcA4CKELQCAJqldu3a68MILtWTJEknSggULqg1STm1mKUnXX3+9PDw8qh0vJSVFDz30kD755BP7h926NPRGoFu2bLE/Hj58eJ39g4KC1Lt3b23evLnOvllZWZo9e7bmz5+v/Px8h+ppzI1PDcMwhTsjRoyo8zVeXl4aMmSIvv32W0nS5s2baw1b+vTpU+eYp2+CnJeXV2f/c3X693zIkCHy9Kz7n2qnhydbtmyRYRj2YMLb21tXXnmlPvzwQ1VUVOj888/X1KlTdc0112jMmDEKDQ11qK7rrrtO77zzjqSTYcumTZs0c+ZMTZo0qcrGya5y+eWX6+2333b4nmoyY8YMPfbYYzIMQ/Pnz7eHLaf+LLFYLGcdtkhS+/bt9corr+j555/XunXrtGLFCm3YsEGbNm2yb0B8SkpKiiZMmKDFixdr4sSJdY596NAhh49SBwA0LMIWAECTNXPmTHvY8r///U8FBQUKDAy0X9+yZYt27Nhh6l+dLVu26IILLqj2p8y1cTSkOFvHjx+3P27fvr1Dr2nfvn2dYcvhw4c1ZswYHTlypF71NPT9ni43N1fl5eX25x06dHDodad/0KwrHAoJCalzPC8vL/vj0+tpKKd/z8/mnsvKypSfn6/g4GB72/PPP69NmzZp//79Kisr04IFC7RgwQJZrVb16tVLo0eP1oQJEzR58mT5+PhU+x6TJk3SPffco5deekmStGHDBm3YsEHSyVN/Ro0apXHjxunKK69UTExMfW+7TmeeclVRUaHU1FRt2bJFKSkpkk6eunTw4EH9+OOPioiIOOv36tixo0aNGqUVK1ZoyZIlSk9PlyT7nzWjR492SqDh7e2t0aNHa/To0fa2pKQkffLJJ3rhhRfss8oqKip044036uDBg/L39z/n9wUANA6rqwsAAOBsXXXVVfYPlUVFRabjnSXzrJb+/ftXO5OhtLRUU6ZMsQctrVu31iOPPKKlS5cqOTlZhYWFstlsMk7uc6Y5c+bYX3v68qKGcOp4ZkkOf8gKCAios8/06dPtQUtQUJDuu+8+ffvttzp48KAKCgpUWVlpv9/Tl6U09P2e7vR7lxy7rzP71RUO1bUsxRVOv++zuWep6n1HRUVp48aNeuSRR0zLa2w2m3bs2KFXX31VV111laKjo/Xkk0+alpGd7j//+Y8+++wzDRkyxNSenp6uTz/9VPfcc4/at2+va665pt5BXl3CwsL08ssv279ef/11ffHFFzp06JDefvtt+5HX27dvd8rR46eC2YqKCr3//vt6//33VVFRYbrWEOLi4vTAAw9o9+7dpqVD6enpWrhwYYO9LwDA+QhbAABNlp+fn6699lr78wULFtgfV1RU6IMPPrA/r+kD0qeffqpDhw5JOrk0adu2bfrHP/6hcePGKSYmRv7+/qYP5Y05u+P0WTpFRUUOvaawsLDW66tXr9bq1avt469du1b//ve/NWnSJHXs2FEBAQGyWn/950Fj3u/pTr93qe77qq5fUFCQU2tqDKff99ncs1T9fQcHB+sf//iHjh49qrVr1+qZZ57RlVdeaZoBkp2drb/85S+aMmWKDMOo9r2uuuoqrVu3TocPH9a8efN0xx13qGfPnvbrhmHo008/1YABA5SQkOBQ/efC09NTN998s9566y172zfffKN58+ad07jXXnut/Pz8JJ0MbU+Nd+afOQ0lODhYCxYsMC17XLFiRYO/LwDAeQhbAABN2ukhyrJly+x7Hnz33Xf26f9eXl6aPn16ta//8ccf7Y//8Ic/KDo6utb3O3z48LmW7LDWrVvbHzs6U+DMPR/OdPr9zpw50/RBuTqNeb+nCwkJMS3hcfT+T9/E9lyWkrjK2XzPT79nb2/vWkMmDw8PDR06VA888ID+97//KT09XStWrNDll19u7/P555/r008/rfU927dvrxtvvFGvv/66du3apSNHjujxxx+3z8A6ceKE/vjHPzpUvzNcf/31pnv429/+ppKSkrMeLzg4WFdccYWkkxtDb9u2TZJ05ZVXNlqIFxMTo169etmfp6WlNcr7AgCcg7AFANCkjRo1Sp06dZJ0clnEu+++K8m8hGjy5MmmD7GnS01NtT92ZMPU5cuXn0u59XL6SThr166ts39BQYF27txZa5+GuN+GWI5jsVjUr18/+/NTs3FqU1FRYd9HRJIGDBjg9Loa2unf8/Xr19e4pOd0p//a9O/fv17fD6vVqlGjRmnRokWaMGGCvf2LL75weAzp5GlFs2fP1ptvvmlvW7JkicObTTvD008/bZ8JkpycrNdff/2cxqtuOZIzlijVx6nlUZJq3E8HAOCeCFsAAE2axWIxfQBasGCBcnNzTR8Wa9tj4fQlM3Ut1dm0aZPpw3xDGz9+vP3xwoUL69ygdeHChXV+uK3P/aampurzzz+vs87TPxA6cxPZ888/3/543rx5NS5tOWXRokU6ceKEvSZHTnByNyNGjLB/qD5+/LgWL15ca3+bzWbaR+j0X7P6sFgspmOmT80Kq6/TZ5eUl5crKyvrrMY5G926ddNvfvMb+/NnnnnmnMKeiRMnmo4Gj46ONgVSDa20tNR01Lyjm2QDANwDYQsAoMm78cYb7T/N37Nnjx588EH7EoKwsDBdeumlNb721KwYqfaf5hcVFen22293UsWOmT59un1ZRnJysp566qka+544cUKzZ8+uc0xH77eyslK33367ysrK6hwzNDTUHuIcP37caYHLbbfdZh938+bNplkTZ8rJydGDDz5ofz5t2jSHThtyN6GhofajhiXpT3/6U6375rz88sv2E7esVmuV36P5+fkOfQ8l8xK0Nm3amK45euz36WNYrVbT0dmN4ZFHHrH/nklNTTXt5VJfHh4e9mOZN2zYoOXLl9d4dHxd1q1bp2effdbhvZekkzN1Tj9uvLZjzAEA7oewBQDQ5HXs2NF0fOrpH8qnTZsmb2/vGl97+k/z582bp+eee67K0o3ExERNnDhRmzdvdviEGGcICQkxBQizZ8/WU089VaW+/fv3a8KECUpNTa31XiXpkksusQdTy5Yt0wMPPKDi4mJTn2PHjmnKlClavHixQ/fr4+OjLl26SDo5m2HRokWO3F6dOnfurDvuuMP+/O6779Yrr7xS5VSkU9+fUxsdBwcHOxQ8uavZs2fbN8pNSEjQpEmTdPDgQVMfm82mF1980bQvyl133VXlSOJNmzYpLi5Ojz32mHbv3l3t+1VWVmrhwoX2Y52lk0vvTjd8+HBNnz5d33zzTY3hTUJCgmkW2QUXXFDn70dn6969u6677jr786eeesrhsKk68fHxGjRokAYNGqT4+PizHic7O1t/+tOfFBcXpz/+8Y/avHlzjTO1MjMzdd9995l+D/fv35+wBQCaGE9XFwAAgDPMnDmz2v1F6jqmdeLEiRozZoyWL18uwzD0wAMP6JVXXtGAAQMUEhKi/fv3a/Xq1aqsrFS7du107733mgKQhvaXv/xF33//vVatWiXDMPTQQw/pxRdf1NixYxUYGKjExEStWLFClZWVGjp0qDp37qz333+/xvG6d++uGTNm2Pe0ee655/T+++9r8ODBatOmjZKSkrR8+XKVlZUpKChIzzzzjO68884665wyZYr+7//+T9LJzUrnzp2r+Ph40ya3zz77bL3v/9lnn9XGjRu1YcMGVVRU6O6779aTTz6pUaNGKTAwUAcOHNDy5cvtAZSnp6fefvvtKqFDU9K5c2e99dZbuv7661VZWak1a9aoW7duGj16tDp37qyCggKtWLFCR48etb9m2LBhevrpp6sdLy0tTY8//rgef/xxRUVFqV+/foqKipKnp6fS09O1adMm014+o0ePNi3HkU6GaB988IE++OAD+fn56bzzzlOnTp0UHBys7OxsHTx4UBs3brT39/PzO6vvtzP87W9/00cffSSbzabk5GTNnTu30Wel1eT48eN6/vnn9fzzzyskJEQDBw5UdHS0goKCVFBQoP3792vTpk32Y6YlKTIyUu+9955pCWBNHn300Xpt4Dt+/HhNmTLlrO4FAFAHAwCAZiAvL8/w9/c3JNm/evTo4dBrjx07ZgwYMMD02jO/evbsaezatcuYM2eOvW3mzJnVjrd06VJ7n7Fjx9b4vqePX5vc3FzjoosuqrW+ESNGGKmpqcbMmTPtbXPmzKl2vMLCQmPixIm1jhcTE2OsXLnS4XvJyckxunfvXuuYpzt06JC9vUOHDrXef35+vnHdddfVOrYkIzo62vj6669rHevRRx+193/00Udr7WsYjn8vHeXI9+eUL7/80oiMjKzzvqdNm2YUFhZWO8batWsNT0/POsc49XXNNdcYeXl5Vcbp3bu3w2N07NjRWLVq1Tn/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tgAAAACkkbAFAAAAII2ELWSV1157LYYMGRKtWrWKZs2aRb9+/eLBBx9MuiyoF+6999644IILok+fPpGXlxc5OTkxZsyYpMuCeuPjjz+Om2++OY4++ujYddddo3HjxtGhQ4c46aST4tVXX026PKjz1q1bF5dcckkcfvjh0alTp2jSpEl06NAhDjvssBg9enQUFxcnXSLUOzfccEPk5ORETk5OvPLKK0mXUy05qVQqlXQREBHx/PPPxzHHHBNNmjSJU089NZo3bx4PP/xwLFiwIG688ca49NJLky4R6rTOnTvHggULom3bttGsWbNYsGBBjB49Os4666ykS4N64Yorrogbbrgh9txzzzjyyCOjXbt2MXfu3HjssccilUrFfffdF8OGDUu6TKizli1bFgUFBdG3b9/o0qVLtGvXLpYvXx4TJkyIBQsWxNFHHx0TJkyIBg38ezVkwptvvhl9+vSJ3NzcWL16dUydOjX69euXdFlVJmwhK5SUlMS+++4bhYWF8corr0SvXr0iImLFihXRt2/fmD9/frz33nux2267JVso1GETJ06MvffeO3bbbbcYOXJkXHnllcIWyKBHHnkk2rRpE0cccUSZ7S+++GIMGjQo8vPzY/HixZGXl5dQhVC3bdy4MUpKSqJx48ZltpeUlMTgwYNj0qRJ8fjjj8fQoUMTqhDqj+Li4ujXr180atQo9t5777j33ntrXdgiliUrPPfcc/H+++/H9773vdKgJSKiZcuWMWLEiCgqKoq77747uQKhHjjqqKMEmpCg73znO+WCloiIAQMGxMCBA2P58uUxe/bsBCqD+qFBgwblgpaIiNzc3Pj2t78dERHz5s3LdFlQL1177bUxZ86cuOuuu6Jhw4ZJl7NNhC3EkiVL4vHHH4+rrroqvvnNb0bbtm1Lr4ur7r9oL1iwIC699NLYd999o1mzZtG6des46KCD4o9//GOsWbOm0v0mTZoUERFHH310ubFjjjkmIiImT55crVqgtsiGHoT6Ltv7sFGjRhGx6Zc+qIuyuQc3btwYTz75ZERE9OjRo9r7Q22QTT04Y8aMuPbaa+Pqq6+Obt26beMnSp5vbGKnnXZKy3HGjRsXZ5xxRqxcubJ025o1a2L69Okxffr0GDVqVIwfPz722muvcvvOnTs3IiL23nvvcmMdOnSI/Pz80jlQ12RDD0J9l819+NFHH8XEiROjY8eOsd9++6WlTsg22dSDRUVFcd1110UqlYrPPvssnn322XjnnXfi7LPPjkGDBqWlTsg22dKD69evjzPPPDN69eoVl19+eVpqSoqVLZSx6667Vri6ZGtmzpwZw4YNi5UrV0Z+fn5ce+21MWXKlHj22Wfj/PPPj4iI9957L4YOHRpffvlluf1XrFgREZsuG6pIixYtSudAXZZUDwL/lU19WFxcHN///vdj/fr1ccMNN9TapdRQHUn3YFFRUfz2t7+Na665Jm655ZZ499134xe/+EXccccd2/yZoDZJsgevuuqqmDt3bowePbr2f+elqPeuuuqq1Lhx41KffPJJKpVKpT788MNURKQiIjV8+PAqHWPAgAGpiEjl5uampkyZUm78D3/4Q+kxr7766nLjgwcPTkVEau7cuRUev1OnTqkWLVpU+TNBbZINPfh1119/fSoiUqNHj67GJ4HaKxv7cMOGDanvfe97qYhInX/++dX5OFDrZGsPLly4MPX3v/891apVq9Rhhx2WWrFiRXU+FtQa2dCDU6ZMSTVo0CB1zTXXlNk+fPjwVESkpk6dWu3PlSRhC+VUt7FeffXV0vkXXHBBhXM2bNiQ6tq1ayoiUq1atUoVFRWVGT/55JNTEZGaPn16hfvn5+enCgoKqv1ZoDZKoge/TthCfZd0H27YsKH0h8szzjgjtWHDhm39KFArJd2DX/fggw+mIiJ1+eWXV3kfqM0y3YPFxcWpvffeO9WrV69yvVlbwxaXEbHdHnvssdLXZ599doVzGjRoEGeeeWZERHzxxRfx/PPPlxn/6l4tFd2X5ZNPPolVq1ZVeD8XID09CGyfdPbhxo0b4+yzz4677747TjvttBgzZkw0aOBHNtiSmv4u/OqSiq8e6gCUtb09uGrVqpg7d27MmjUrGjduXHpz3pycnNKn0h5yyCGRk5NT5lzZzDc32+2ll16KiIhmzZpF7969K523+eMsX3755QrHnn766XL7PfXUU+X2B/4rHT0IbJ909eFXQcvYsWNj2LBhcc8999T+a9YhA2r6u3DRokUR8d8ngwFlbW8P5uXlxbnnnlvhn6/+0f1b3/pWnHvuudG5c+ea+RBp5mlEbLe33347IiL22muvLT6Sct999y23z1cGDRoUe+yxR9x3333x05/+NHr16hURm26ce91110Xjxo1LU1CgrHT0ILB90tGHGzdujHPOOSfGjh0bp5xyStx7772CFqiidPTgW2+9FZ07d46mTZuW2b5mzZq45JJLIiJiyJAh6SoZ6pTt7cEddtghRo0aVeE+Z511VsydOzeuvPLK6NevX5oqrnnCFrbLunXrYtmyZRERscsuu2xx7o477hjNmjWL1atXx8KFC8uM5ebmxqhRo+KYY46Jww8/PE499dRo3rx5PPzww7FgwYK48cYba02CCZmUrh6MiBg1alTpv0rMnj27dNtXS6b79+8f5513Xhqrh7ohXX14zTXXxN133x35+fnRpUuX+P3vf19u/xNPPLH0HySATdLVgw8++GDcdNNN0b9//+jcuXO0aNEiPv7445gwYUJ89tlnMWDAgLj44otr7HNAbZXOn0frEmEL22XzR3bl5+dvdf5XjbVq1apyYwMHDoyXXnoprr766njggQeiuLg49ttvv7jhhhti2LBhaa0b6op09uBLL71Uek3sV15++eUySzyFLVBeuvpw/vz5EbHpuvVrr722wn07d+4sbIGvSVcPHnfccbFo0aKYMmVKTJ06NVatWhUtW7aM/fffP0499dQ455xztvgv9lBfpfPn0brE/1uwXdatW1f6unHjxludn5eXFxERa9eurXC8b9++MWHChPQUB/VAOntwzJgxMWbMmLTVBvVFuvpQD8K2SVcP9unTJ/r06ZPe4qAeSPfvhF9XW78f3SCX7dKkSZPS10VFRVudv379+ojYdE0esP30ICRPH0Ky9CAkSw9WTNjCdmnevHnp66osA1u9enVEVG15GbB1ehCSpw8hWXoQkqUHKyZsYbs0adIk2rRpExERhYWFW5y7fPny0sYqKCio8dqgPtCDkDx9CMnSg5AsPVgxYQvbrVu3bhERMW/evCgpKal03jvvvFP6umvXrjVeF9QXehCSpw8hWXoQkqUHyxO2sN369+8fEZuWg73++uuVzps8eXLp68MOO6zG64L6Qg9C8vQhJEsPQrL0YHnCFrbbiSeeWPp69OjRFc7ZuHFjjB07NiIiWrVqFQMHDsxEaVAv6EFInj6EZOlBSJYeLE/Ywnbr27dvDBgwICIi7rzzzpg6dWq5OX/605/i7bffjoiIn/3sZ9GoUaOM1gh1mR6E5OlDSJYehGTpwfJyUqlUKukiSNZLL70U8+bNK32/bNmyuOyyyyJi09Ku8847r8z8s846q9wxZs6cGYcddlisXbs28vPzY8SIETFw4MBYu3Zt3H///XHHHXdERESXLl1i+vTpZe5YDfWdHoTk6UNIlh6EZOnB9BO2EGeddVbcfffdVZ5f2X8y48aNizPOOCNWrlxZ4XiXLl1i/Pjxsddee21TnVBX6UFInj6EZOlBSJYeTD+XEZE2xx9/fLzxxhtx8cUXR5cuXaJp06bRqlWr6NOnT9xwww0xc+bMetFUkBQ9CMnTh5AsPQjJ0oP/ZWULAAAAQBpZ2QIAAACQRsIWAAAAgDQStgAAAACkkbAFAAAAII2ELQAAAABpJGwBAAAASCNhCwAAAEAaCVsAAAAA0kjYAgAAAJBGwhYAAACANBK2AAAAAKSRsAUAAAAgjYQtAAAAAGkkbAEAAABII2ELAAAAQBoJWwAAAADSSNgCAAAAkEbCFgCALDZ//vzIycmJnJycGDNmTNLlAABVIGwBALLSpEmTSkOGqv75+c9/nnTZAADCFgAAAIB0yk26AACArbnwwgvjRz/60VbntW3bNgPVAABsmbAFAMh67du3jx49eiRdBgBAlbiMCAAAACCNhC0AQJ3VuXPnyMnJibPOOisiIl577bU47bTToqCgIJo0aRIFBQVx9tlnxzvvvFOl440bNy5OPvnk2GWXXSIvLy/atGkThxxySIwcOTJWrVpVpWO8+eab8ZOf/CT222+/2HHHHaNRo0bRoUOHOOqoo+IPf/hDLF68eKvHeOaZZ+L444+PDh06RF5eXuy+++5x4YUXRmFh4Rb3W7RoUVxxxRVx4IEHRsuWLaNRo0ax0047xX777RennXZajBkzJlauXFmlzwEAVC4nlUqlki4CAODrJk2aFAMHDoyIiKuvvjp+85vfVPsYnTt3jgULFsTw4cPj8MMPjwsuuCBKSkrKzcvLy4t77rknTjnllAqPs27duvje974Xjz76aKXn6tSpU4wfPz569epV4fiGDRvisssui5tvvjm29OPX8OHDyzzief78+bH77rtHRMTo0aPj3XffjZEjR1a4b7t27WLy5MnRtWvXcmMvvvhiHHfccVsNU8aNGxfHHXfcFucAAFvmni0AQJ03a9asuO+++6J9+/Zx5ZVXRt++fWPdunXxxBNPxM033xzr16+P008/PXbffffo06dPuf2HDx9eGrT07NkzLr300ujatWt8/vnncf/998eYMWNi0aJFMWjQoHjjjTdi5513LneMH/zgB3HXXXdFRETHjh3joosuikMPPTRatmwZS5cujWnTpsVDDz20xc/xj3/8I6ZMmRJHHHFEXHDBBdGlS5f44osvYuzYsTF27NhYunRpnHPOOTF16tQy+61fvz5OPfXUWLlyZTRv3jwuvPDCGDhwYLRv3z6Kioriww8/jClTpmwxTAIAqs7KFgAgK22+sqWqTyPaZ599olGjRqXvv1rZEhGx2267xSuvvBIdOnQos8/zzz8fRx99dJSUlMRBBx0U06ZNKzM+fvz40pUegwYNiieeeCIaN25cZs4//vGP+MEPfhAREd/97nfjgQceKDP+73//O0444YSIiDjkkEPiiSeeiFatWlX4GRYuXBgFBQWl7zdf2RIRcf7558ftt98eOTk5ZfY7//zzY9SoURERMWPGjDjggANKx5577rkYNGhQRGx55UpJSUmsWbMmWrRoUeE4AFA1whYAICttHrZU1YcffhidO3cufb952PLQQw/FSSedVOF+P/rRj+LWW2+NiE33ddl8dcuQIUNiwoQJ0ahRo3j//ffLBCGbGzx4cEycODFyc3Pjo48+io4dO5aOHXrooTF16tRo2rRpzJ07Nzp16lTlz7R52NKxY8f48MMPIy8vr9y8d999N/bdd9+IiPjLX/4SP/3pT0vH7rvvvjj99NMjImLFihXCFACoYW6QCwDUeTvuuGPpypKKnHPOOaWvJ06cWPq6pKQkJk+eHBERRx99dKVBS8SmlSVf7TNp0qTS7Z999lm88sorERExbNiwagUtX3fyySdXGLREbFrVk5+fHxERH3zwQZmxzYOf0aNHb/P5AYCqEbYAAFnv6quvjlQqtdU/m69q2dwBBxwQubmV36quV69epZcGzZ49u3T7Bx98EGvWrImIiIMPPniLNW4+/uabb5a+njVrVukNcQcMGLDlD7oVX61cqcyOO+4YERFffvllme39+/ePPfbYIyIifv7zn0ffvn3j+uuvj5dffjmKioq2qyYAoDxhCwBQ57Vv336L47m5udG6deuIiPj8889Lt2/+emvH2PxeMJvvt2zZstLXm68w2RZNmzbd4niDBpt+tNuwYUOZ7Y0aNYpx48aVPqXotddeixEjRkT//v2jVatWceyxx8Z9991Xbj8AYNsIWwCAOu/rN5NN6hhJ6tatW8yePTseffTROOecc2KvvfaKiIi1a9fGU089FaeffnocfPDBsWTJkoQrBYDaT9gCANR5n3766RbHS0pKSlejfLXC5euvt3aMTz75pML92rZtW/p68eLFVSu4hjRs2DBOPPHEuPPOO2Pu3LmxaNGiuOuuu6J3794REfH666/HBRdckGiNAFAXCFsAgDpv1qxZUVJSUun4f/7zn9J7l/To0aN0+x577FF66c6rr766xXNs/sjozY9xwAEHlK6KeeGFF6pffA3q2LFjnH322TF16tQ48MADIyLi8ccfj7Vr1yZcGQDUbsIWAKDO+/zzz2PcuHGVjt91112lr4866qjS17m5uXHEEUdERMQzzzwThYWFlR5j1KhRpfsceeSRpdtbt24dhx56aEREPPjgg7Fo0aJt+gw1qVGjRqWfs6SkJL744otkCwKAWk7YAgDUC5dcckmFlwJNnjw57rjjjoiI6N27dxx00EFlxn/84x9HRERRUVGce+65UVxcXO4Yd911Vzz99NMREfGd73yn3I1wf/nLX0ZExJo1a+KUU06JFStWVFrnlgKdbfXiiy/GvHnzKh0vKioqfcR1fn5+tGvXLu01AEB9UvkzEAEAssSSJUvKPE65MjvssEPsueee5bb37Nkz3nrrrejdu3dceeWV0bdv31i/fn088cQT8ec//zlKSkoiNzc3brnllnL7Dh06NE455ZT417/+FU8//XT069cvLrnkkth3331j+fLlcf/995eujGndunXcdNNN5Y5x/PHHx7nnnht33nlnTJkyJbp16xYXXXRRHHbYYdGiRYtYtmxZTJ8+PR544IHo2bNnjBkzpvr/I23Bs88+G7/73e9iwIABMXTo0Nh///2jXbt2sXbt2njvvffitttuixkzZkRExLnnnrvFx2QDAFvnmxQAyHq33npr3HrrrVud17Nnz5g1a1a57b169YqLLrooLrzwwrjooovKjTdu3DjuvvvuOPjggys87tixY6OkpCQeffTRmDFjRpxxxhnl5nTq1CnGjx8fO++8c4XHuP3222OHHXaIW265JRYtWhQjRoyo9DPUhI0bN8bkyZNLV7BU5IQTTojrr7++Rs4PAPWJsAUAqBfOO++86NGjR/z5z3+Ol156KZYtWxbt2rWLQYMGxS9/+cvo1q1bpfs2adIkHnnkkRg3blyMGTMmXnnllVi2bFk0a9YsunTpEieeeGJcdNFFkZ+fX+kxGjZsGH/729/i7LPPjttvvz0mTZoUH3/8cRQVFUWbNm1i//33j2OPPTa+//3vp/2z/+IXv4j9998/Jk6cGDNnzoxFixaVPuK5Q4cO0bdv3zjzzDNj6NChaT83ANRHOalUKpV0EQAANaFz586xYMGCGD58eNovzQEAqIwb5AIAAACkkbAFAAAAII2ELQAAAABpJGwBAAAASCNhCwAAAEAaeRoRAAAAQBpZ2QIAAACQRsIWAAAAgDQStgAAAACkkbAFAAAAII2ELQAAAABpJGwBAAAASCNhCwAAAEAaCVsAAAAA0kjYAgAAAJBGwhYAAACANBK2AAAAAKSRsAUAAAAgjYQtAAAAAGkkbAEAAABII2ELAAAAQBoJWwAAAADSSNgCAAAAkEbCFgAAAIA0ErYAAAAApNH/A3/DXEoQYcCFAAAAAElFTkSuQmCC",
"text/plain": [
""
]
@@ -455,12 +372,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 19\n"
+ "Time step 19\n",
+ "RMSE 0.010018707658267175, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "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3XTTTZ5zBg0aZHrvs88+M8LDwz3vV/d15plnGrt37672XvPmzfP0HzFiRJX9yl63Orm5ucZFF11UbV1Dhw41Dh8+bEyePNnTNnXq1Eqvt2zZMiMmJsar523fvr2xZs2aSq8zdepUr65R2TPu2bPH096uXbtqnz8vL8+4+uqra7x+q1atjG+++abaaz388MOe/g8//LCRkpJiDB48uNrr3nTTTUZpaWm11/WWN38/J8yePdto2bJljc89adIkIz8/v9pr/e9//zMiIyO9+nsaMmRIpdfYvn270aNHD6//vnfu3Hmq3ybDMMz/vmr6N2IYhrFjxw7T/d9///0q+5b99yfJKCwsND7++GPP8UMPPVTluY888oin3yeffGIUFhaarrVnz54K53zyySee9202m5GXl+fNt6BG5Z+jsnsDAKzDorkAgIASFhama6+9Vq+88oqk40P777777mrPKSws1Keffuo5Lr9YbmpqqoqLiyVJiYmJ6tmzp1q2bKmoqCjl5eVp69atWrNmjQzD0Pr16zV8+HCtW7euXob5O51OXXzxxVqwYIGnrWXLlho+fLhiY2OVnJysRYsWadGiRZowYYI6duxY4zUzMzOVl5cn6fhv9nv16qXExERFR0eroKBAycnJWrFihVwul/bu3asRI0ZozZo16ty5s+k6PXr00J/+9Cfl5uZ6plhUtpvM6SgoKNDo0aNNIyZat26tYcOGKSYmxvP8paWlOnz4sC677DJ9+OGHXm33nZeXpwsuuECbNm1SVFSUhg0bpqSkJOXm5mrevHlKTU2VdHw9kG7duulvf/ubz56rJjNnztR1112n0tJSScenzAwdOlSdO3dWXl6eFi5c6BnB8cEHH2jPnj36+eefFRERUeFas2bN0q233uo5jouL06BBg5SYmCiHw6Hs7Gzt2LFDmzZtqnJEU25urs4//3zPlst2u119+/ZVjx49FBMTo4KCAh08eFDr169Xenq6r78dXik/oqVFixa1Ov+yyy5TfHy8srKy9N5773lGQ5V34t9648aNdemll3q1+HOnTp08rw3D0JNPPqlHH320VvUBAAKQxYEPAAC1tmLFCtNvdTds2FBt//fff9/TNzw83MjMzDS9/9VXXxn/93//V+1v5Hfv3m2MGzfOc53f/va3Vfb15QiXf/3rX6bfjD/22GOGy+Uy9dm+fbtx5plnGpKMsLAwr0a4PPjgg8bGjRurvO/Ro0eNG264wXOt8847r8q+tRmtUttzbrvtNk+/kJAQ4/nnn68w2mTHjh3GOeec4+kXFxdX5W/6y45wOTGqafLkyUZGRoapX35+vnHttdd6+sbExPhkVII3I1ySk5NNI5AGDBhQ4d9maWmp8cwzzxh2u93T74477qj0emeddZanz+23317laJjc3Fzj448/Nv72t79VeO/555/3XKNnz57Gtm3bKr2G2+02VqxYYdx2223G/v37q/lO1Ky2I1weeOABT//Q0FDj2LFjVfatbISLYRjG73//e0/bggULKpy3cOFCz/u33nqrYRiGVyNc3G630b59e9P/lq+//npj6dKlhtvt9u4b4sVzMMIFAPwLgQsAICCVndpw7733Vtu3bFBy1VVXnfI9S0pKjDPOOMOQZERERFT5gc5XgUtWVpYRFRXl6fPII49Uea3U1FSjVatWpmvWNGXFGxdeeKHnelu2bKm0T10FLsnJyaZA4eWXX67yeseOHTN9oL3pppsq7Vc2cJFkXHvttVVes7Cw0EhKSvL0/eijj7x6tup4E7jceOONnj6dO3c2srKyqrzes88+6+lrt9srTHfLzc31vJ+UlHTKH+4nTpzouc4PP/xwSteordoELlu2bDFiY2M9/SdNmlRt/6oCl8WLF3vafve731U475ZbbvG8v2TJEsMwvAtcDMMwPv30U1O/E19NmjQxLrroIuOhhx4yZs+eXW1QVNNz3Hjjjcaf/vQnr76ef/55r+8DADg1BC4AgID0+OOPez5ktG7dusKojxMOHTpkhISEePrOmTPntO77xBNPeK711VdfVdrHV4HLq6++6nk/MTHRKC4urra2N954w+eBy8yZMz3Xe/HFFyvtU1eBy9/+9jdPn7POOqvGsKBsreHh4ZUGFWUDl7CwMOPw4cPVXvO+++7z9L/77ru9erbq1BS4ZGZmmtYT+vzzz6u9XmlpqdGrVy9P//vvv9/0/sGDB03fw1M1ZswYz3XWrVt3ytepjZoCl6KiImP79u3Gk08+acTHx3v6du/e3Thy5Ei1164qcDEMw+jcubMhyWjUqJGpvbCw0HOfLl26mNq9HWXy1ltvGREREZUGL2VHvwwYMMB46aWXTPf35jlq81Xdf5sAAL7BGi4AgIB0/fXX68EHH5Tb7dahQ4f0448/aty4cRX6vf/++551MFq2bFlpn7KysrK0bNkybd68WRkZGcrLyzPtTLRt2zbP63Xr1unSSy/10RNVNG/ePM/rq6++WmFhYdX2v+aaa3T77bdXu7NQeQUFBVq2bJk2btyotLQ05ebmer5fknl3lXXr1nlfvA/8/PPPntdTpkypcTenCRMmKCEhQceOHVNxcbGWLl3q2XmmMkOHDlXLli2rvWbfvn09r/fu3etd4adhyZIlnvWEmjZtWuO/L7vdrptvvln33HOPJPO/mRPXiIiIUFFRkTZt2qTFixdryJAhta4rKSnJ8/r111/Xa6+9VutrnI4Tu19Vx263a/z48XrllVdqvX5LWTfccIMefvhhZWdn68svv9TVV18tSfryyy89WzvfcMMNp3Tt3/72txozZoyeeOIJffjhh8rMzKzQxzAMrVixQitWrNATTzyhGTNmaOTIkaf6OAAACxG4AAACUps2bXT++efr+++/lyTNmDGj0jDlxAKXknTdddcpJCSk0uulpKTo/vvv16effur5wFuTul4cdO3atZ7XgwYNqrF/bGysevfurTVr1tTY99ixY3rooYf07rvvKjc316t66nMxVMMwTAHP4MGDazwnNDRUAwYM0LfffitJWrNmTbWBS58+fWq8ZtmFkXNycmrsf7rK/p0PGDBADkfNP6qVDVDWrl0rwzA84URYWJjGjx+vjz76SC6XS6NHj9bVV1+tK664QsOHD1d8fLxXdV111VV65513JB0PXFavXq3Jkydr3LhxFRZTtspll12mt99+2+tnqsoNN9ygRx55RIZh6N133/UELif+W2Kz2U45cJGktm3b6pVXXtFzzz2n5cuXa+HChVq5cqVWr17tWZT4hJSUFI0ZM0Zz5szR2LFja7z2nj17vN5mHQBQ9whcAAABa/LkyZ7A5YsvvlBeXp5iYmI8769du1YbN2409a/M2rVrdd5551X62+bqeBtUnKq0tDTP67Zt23p1Ttu2bWsMXPbt26fhw4dr//79taqnrp+3rOzsbDmdTs9xu3btvDqv7IfNmgKiRo0a1Xi90NBQz+uy9dSVsn/np/LMJSUlys3NVVxcnKftueee0+rVq7Vz506VlJRoxowZmjFjhux2u3r16qVhw4ZpzJgxuvDCCxUeHl7pPcaNG6c77rhDL730kiRp5cqVWrlypaTjuwENHTpUI0eO1Pjx45WYmFjbx65R+d2vXC6XDh06pLVr1yolJUXS8d2Ydu/erZ9++klNmzY95Xt16NBBQ4cO1cKFC/X999/r6NGjkuT5b82wYcN8EmqEhYVp2LBhGjZsmKdt7969+vTTT/X88897Rpe5XC7deOON2r17t6Kiok77vgCA+mO3ugAAAE7VhAkTPB8sCwoKTFs/S+bRLX379q10RENxcbEmTpzoCVuaNWumf/zjH5o3b54OHDig/Px8ud1uGcfXPdPUqVM955adalQXTmzdLMnrD1rR0dE19pk0aZInbImNjdVdd92lb7/9Vrt371ZeXp5KS0s9z1t2ikpdP29ZZZ9d8u65yverKSCqaYqKFco+96k8s1TxuVu2bKlVq1bpH//4h2mqjdvt1saNG/Xqq69qwoQJatWqlR5//HHTlLKyXnzxRX3++ecaMGCAqf3o0aP67LPPdMcdd6ht27a64oorah3m1SQhIUEvv/yy5+v111/XV199pT179ujtt9/2bIe9YcMGn2xLfiKcdblc+uCDD/TBBx/I5XKZ3qsL7du317333qstW7aYphEdPXpUM2fOrLP7AgDqBoELACBgRUZG6sorr/Qcz5gxw/Pa5XLpww8/9BxX9SHps88+0549eyQdn6a0fv16/fvf/9bIkSOVmJioqKgo0wfz+hzlUXa0TkFBgVfn5OfnV/v+kiVLtGTJEs/1ly1bpmeffVbjxo1Thw4dFB0dLbv95I8H9fm8ZZV9dqnm56qsX2xsrE9rqg9ln/tUnlmq/Lnj4uL073//WwcPHtSyZcv01FNPafz48aaRIJmZmXrggQc0ceJEGYZR6b0mTJig5cuXa9++fZo+fbpuvfVW9ezZ0/O+YRj67LPPdPbZZ2vHjh1e1X86HA6Hbr75Zr311luetrlz52r69Omndd0rr7xSkZGRko4HtyeuV/6/OXUlLi5OM2bMME2BXLhwYZ3fFwDgWwQuAICAVjZImT9/vmcNhO+++84zFSA0NFSTJk2q9PyffvrJ8/ovf/mLWrVqVe399u3bd7ole61Zs2ae196OGCi/BkR5ZZ938uTJpg/LlanP5y2rUaNGpuk83j5/2YVtT2daiVVO5e+87DOHhYVVGzSFhIRo4MCBuvfee/XFF1/o6NGjWrhwoS677DJPny+//FKfffZZtfds27atbrzxRr3++uvavHmz9u/fr0cffdQzEisjI0N33323V/X7wnXXXWd6hn/+858qKio65evFxcXp8ssvl3R8sej169dLksaPH19vQV5iYqJ69erlOT58+HC93BcA4DsELgCAgDZ06FB17NhR0vEpEu+9954k83SiCy+80PRBtqxDhw55XnuziOqCBQtOp9xaKbtDzrJly2rsn5eXp02bNlXbpy6ety6m5thsNp111lme4xOjcqrjcrk864pI0tlnn+3zuupa2b/zFStWVDm9p6yy35u+ffvW6u/Dbrdr6NChmjVrlsaMGeNp/+qrr7y+hnR8F6OHHnpIb7zxhqft+++/93oBal948sknPSNCDhw4oNdff/20rlfZ1CRfTFeqjRNTpSRVub4OAMB/EbgAAAKazWYzfQiaMWOGsrOzTR8Yq1tzoez0mZqm7axevdr0gb6ujRo1yvN65syZNS7aOnPmzBo/4NbmeQ8dOqQvv/yyxjrLfij05cKyo0eP9ryePn16ldNcTpg1a5YyMjI8NXmzs5O/GTx4sOeDdVpamubMmVNtf7fbbVpXqOz3rDZsNptpC+oTo8Nqq+woE6fTqWPHjp3SdU5Ft27ddM0113iOn3rqqdMKfMaOHWvaNrxVq1amUKquFRcXm7ah93bhbACA/yBwAQAEvBtvvNHzW/2tW7fqvvvu80wnSEhI0CWXXFLluSdGx0jV/1a/oKBAv//9731UsXcmTZrkmaJx4MABPfHEE1X2zcjI0EMPPVTjNb193tLSUv3+979XSUlJjdeMj4/3BDlpaWk+C11uueUWz3XXrFljGj1RXlZWlu677z7P8bXXXuvVLkT+Jj4+3rMNsST99a9/rXYdnZdfftmzE5fdbq/wbzQ3N9erv0PJPB2tefPmpve83RK87DXsdrtpW+368I9//MPzb+bQoUOmtV1qKyQkxLNl88qVK7VgwYIqt5WvyfLly/X00097vRaTdHzETtmtyKvb4hwA4J8IXAAAAa9Dhw6mrVXLfjC/9tprFRYWVuW5ZX+rP336dD3zzDMVpnEkJydr7NixWrNmjdc7x/hCo0aNTCHCQw89pCeeeKJCfTt37tSYMWN06NChap9Vki6++GJPODV//nzde++9KiwsNPU5cuSIJk6cqDlz5nj1vOHh4erSpYuk46MaZs2a5c3j1ahTp0669dZbPce33367XnnllQq7JZ34+zmx+HFcXJxX4ZO/euihhzyL5+7YsUPjxo3T7t27TX3cbrdeeOEF0zopf/rTnypsV7x69Wq1b99ejzzyiLZs2VLp/UpLSzVz5kzPls/S8Wl4ZQ0aNEiTJk3S3LlzqwxwduzYYRpNdt5559X479HXunfvrquuuspz/MQTT3gdOFWmc+fO6tevn/r166fOnTuf8nUyMzP117/+Ve3bt9fdd9+tNWvWVDliKz09XXfddZfp33Dfvn0JXAAgADmsLgAAAF+YPHlypeuN1LSF69ixYzV8+HAtWLBAhmHo3nvv1SuvvKKzzz5bjRo10s6dO7VkyRKVlpaqTZs2uvPOO00hSF174IEH9MMPP2jx4sUyDEP333+/XnjhBY0YMUIxMTFKTk7WwoULVVpaqoEDB6pTp0764IMPqrxe9+7ddcMNN3jWuHnmmWf0wQcfqH///mrevLn27t2rBQsWqKSkRLGxsXrqqaf0hz/8ocY6J06cqP/+97+Sji9gOm3aNHXu3Nm08O3TTz9d6+d/+umntWrVKq1cuVIul0u33367Hn/8cQ0dOlQxMTHatWuXFixY4AmhHA6H3n777QrBQyDp1KmT3nrrLV133XUqLS3V0qVL1a1bNw0bNkydOnVSXl6eFi5cqIMHD3rOOffcc/Xkk09Wer3Dhw/r0Ucf1aOPPqqWLVvqrLPOUsuWLeVwOHT06FGtXr3atLbPsGHDTFNzpONB2ocffqgPP/xQkZGROuOMM9SxY0fFxcUpMzNTu3fv1qpVqzz9IyMjT+nv2xf++c9/6uOPP5bb7daBAwc0bdq0eh+dVpW0tDQ999xzeu6559SoUSOdc845atWqlWJjY5WXl6edO3dq9erVni2oJalFixZ6//33TdMBq/Lwww/XalHfUaNGaeLEiaf0LAAALxgAAASBnJwcIyoqypDk+erRo4dX5x45csQ4++yzTeeW/+rZs6exefNmY+rUqZ62yZMnV3q9efPmefqMGDGiyvuWvX51srOzjQsuuKDa+gYPHmwcOnTImDx5sqdt6tSplV4vPz/fGDt2bLXXS0xMNBYtWuT1s2RlZRndu3ev9ppl7dmzx9Perl27ap8/NzfXuOqqq6q9tiSjVatWxjfffFPttR5++GFP/4cffrjavobh/d+lt7z5+zlh9uzZRosWLWp87muvvdbIz8+v9BrLli0zHA5Hjdc48XXFFVcYOTk5Fa7Tu3dvr6/RoUMHY/Hixaf9vSr7v7Wa/o2Ud+WVV5rqcTqdpvfL/vuTZBQWFp5ynYWFhaZr7dmzp0Kfbdu2GSNGjDBCQkK8/j5KMi688EJj9+7dVd67/HPU9uvOO+885ecGANSMES4AgKAQGxurCRMm6P333/e01TS65YQWLVpoyZIleuutt/TRRx9p06ZNKigoUPPmzdWtWzddffXVuu666xQVFaUVK1bU1SNUKS4uTnPnztXnn3+uadOmaeXKlTp27JiaNm2qHj166LrrrtP1119vGk1SnaioKM2dO1cffPCBpk+frrVr1yonJ0dNmzZVx44dNXHiRE2ZMkWNGzfW/Pnzvbpmo0aNtHLlSr366quaM2eOtm7dqqysLJ+s5xITE6OZM2fqL3/5i2bMmKH58+fr0KFDKiwsVNOmTdW7d29dcskluvnmm+t1ylddu+SSS5ScnKx33nlHX3/9tTZv3qz09HRFRkaqdevWGjVqlG688UYNHDiwymsMHDhQqamp+vHHH7Vo0SKtXbtWu3btUkZGhkpLSxUXF6dOnTrp3HPP1fXXX68BAwZUep1169Zp2bJlmjdvnlasWKHt27fr0KFDKigoUFRUlGfkzGWXXaarrrrK8h11/vnPf+rTTz+VYRjas2ePZsyYoZtuusmyerp166b58+crPT1d8+fP16JFi7Rx40YlJycrIyNDRUVFioqKUuPGjdW9e3cNGDBAV111lVc7iQEA/JfNMGpY8h8AAAAAAAC1wqK5AAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPuawugBUrqioSBs3bpQkNWvWTA4Hf1UAAAAAAPiay+VSWlqaJKlPnz6KiIjwyXX5FO+nNm7cqAEDBlhdBgAAAAAADcaKFSvUv39/n1yLKUUAAAAAAAA+xggXP9WsWTPP6xUrVqhVq1YWVgMAAAAAQHA6fPiwZ4ZJ2c/ip4vAxU+VXbOlVatWSkxMtLAaAAAAAACCny/XT2VKEQAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPEbgAAAAAAAD4GIELAAAAAACAjxG4AAAAAAAA+BiBCwAAAAAAgI8RuAAAAAAAAPgYgQsAAAAAAICPOawuAMf16tXLdOx0Oi2qBAAAAAAAnC5GuAAAAAAAAPgYI1z8xObNm03HKSkpSkpKsqgaAAAAAABwOhjhAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMOqwtAzb5ef0hNjhhWl+E1u82myLAQRYaFKCr01z/DQhQZ5lBk6PHX4Q67bDab1aUCAAAAAFAnCFwCwH/mbJUjLs3qMnzKbpMifw1jjgczDkX8GtBE/doWGVoxqPGEN54gx1Hm9fGviFACHQAAAACAtQhcYAm3IeWXlCq/pLROrm+3SVFhDkWEngxiKoY49uOBTZmROOZAx1Eu3DkRDNkVFkKgAwAAAACoGoELgpLbkPKKXcordtXJ9UPsNlNIE2kameMwjbaJCXcoLtKhRpGhiosIPf5nZKjnODbCIbud8AYAAAAAggmBSwDo0SpWkY0bWV2G11ylhoqcpSp0lqqgpFSFJaUqKXVbXZZPlboN5Ra7lOuDQMdmk2LCywcyVQQ0lbRHhIb44IkAAAAAAL5E4BIApt40QImJiVaXcVpcpW4VOo+HLwUl5jCmoMRV4T3za1cV7SfPdZYGzqLC5RmGlFvkUm6RS1Jhrc8Pc9h/DWEcFUbPVBveMLoGAAAAAOoMgQvqhSPErtgQu2IjQuvk+s7ygU5JqQqdx4OagpJSFf0a8Jx87SrTr7SS1y5Tu8vtv4FOicuttNxipeUW1/pcm02KDXeocXSY4qPClBAVqsZRx183jgpVfPTxP4+3Hf+zcVSYIsMYVQMAAAAA1SFwQVAIDbErNMSuuDoKdEpc7gqjak6EO+ZAx1Uh3Mktdimn0KmcQqeyC53KKXIpu9CpUj8IcQxDyilyKafIpX0ZBV6fF+6wHw9fKglkPMFMdOivwc3xPnERoYymAQAAANBgELgAXghz2D1Td3zBMAwVlJT+GsA4lV1wMog5Gcz8+mfhr4GN59hZZ7s7eavY5daRnCIdySny+hy7TYo3jZQJPTmSpkwwE/9rWHMivAl3MJoGAAAAQOAhcAEsYLPZFB3uUHS4Q60VWevznaVu5VYT0GSXC2hyyoyssWp0jduQjuWX6Fh+iaR8r8+LDgspF8KYw5ry050aR4cqJtzBtt0AAAAALEXgAgSg0BC7EqLDlBAdVutzT4yuORHIZOY7lVVQoswCpzILSjyvy7Zl5pcou9ApK2ZB5ZeUKr+kUAezvF9Q2GG3VRrIxEeXH13za5/oMMVHhsoRYq/DJwEAAADQkBC4AA1M2dE1rRp5P7rG7TaUU+Q0BzP5J16b/8wscCozv0SZBSUqdtX/luAut6H0vGKl59VuIeHYCEfV052izaNqTqxfExkawmgaAAAAABUQuADwiv3XUSPxUWHqoGivzyssKf01hDEHMln5ZUfSlOjYidf5JcopctXhk1TtxPbc+495f06Yw+4JYRr9uuW26SvKvB132a9QRtQAAAAAQYvABUCdigwLUWRYpFrHez+axlXqPj7dqaDq6U7H8s1Tn7IKSuQsrf85TyUut47mFOtoTu235Y4KC/GELycCmfgawprYcIdiIhyMrAEAAAD8HIELAL/jCLGrSUy4msSEe32OYRjKLylVZn7ZkTRlXueXDW5O/plXbM1oGkme7cMPZ3u/29MJdpsUE+5QbESoosNDFBPuUEzEr4HMr6FMTPnXEQ5PYBMT7lB0mEORYSEKd9gJbwAAAAAfI3ABEBRsNpsnYEhK8P68EpdbWYW/hjBlRs0cK6jYdiKkybJop6ey3IaUU+TyyfQrm02KDA1RZGiIIkJDFBkWoqiwX1//+hUVFqKIsJPHkWHmP8ueZzr+9U9CHQAAADQ0BC4AGrQwh13NYyPUPDbC63PcbkO5xa4K052yCpyerbfLbtld9qvIWf+LCNfEME6OtqlLlQU1kaHHg5wTwUxshOP4WkGRoZ7dpRpFhapZTLiax4Ur3BFSpzUCAAAAvkLgAgC1ZLfbPGuqtGtSu3OLXaWmMKZ8SBNoYU1tFDpLVeg8vVAnPipULWIj1DwuXC3iItQiLlzNY3/9My7ieFtsOFt8AwAAwHIELgBQj8IdIWoeG1KrETUnFLtKlV9cqrwil/KKT3w5lfvrcX6xS3lFLuX++ufJPmWOi1zKK3HJsHZG1CnLKjgeUm0/mltlnxC7TW3iI5WUEKm2CVFKbByltglRSko4/mfjqFCmNwEAAKDOEbgAQIAId4Qo3BGihOiw07qO222owFmqghKXCkuOjzqp7M+iX0ekFPzaVlRy8vjEe8f7u1VY4ipznlslpdaNxil1G9p/rED7jxVosTIqvB8dFqKkhCh1aBqtjs2i1aFpjDo0jVanZtGKjzq97y0AAABwAoELADQwdvvJBYbrirPU7QllikrcKnCeDHeKnKUqLHGroMRVJrg5fpxT5FRmvtOzkHFWgVPHCkpU4vJdgJNfUqptR3K17UjFUTKNo0LVsdnxAOZECNOhaYzaNYlSRCjrxwAAAMB7BC4AAJ8LDbErNMSu2IjQ076WYRjKKXIpNadIR3OKdTSnSKm5J/4s05ZTfNojazILnFq9L1Or92Wa2m02qU18pDo3j1HXFrHq0jxG3VrGqnPzGEWF8X+lAAAAqIifEgEAfs1mO7lIcZcWsVX2MwxDx/JLdCCzUAd+nVKUknn8zwPHCnUwq/CUt/M2DCkls1ApmYWavz3N9F5SQqS6No9Vlxax6trieCDTuXkMI2IAAAAaOAIXAEBQsNlsahITriYx4TorKb7C+65Stw5nF+nAsQLtzSjQnvQ87UnP1+70fO3PKJDrFMOYA8cKdeBYoX7allqmFqltQpS6ND8ZwnRrGatOzWIU5mAHJQAAgIaAwAUA0CA4QuxK+nW3osGdze85S91KySzUnvQ87U47HsLsScvXnvR8HckpqvW9DEPal1GgfRkF+nHr0ZM12G3q1Oz4dKRuLWPVo1WsurWMU+tGEeycBAAAEGQIXPxEr169TMdOp9OiSgCg4QkNsXsWyh3d3fxefrFLe9LztSstTzuP5mn70VztPJqrfccKar29tsttaPvR3OPbWq8/2R4b4VD3X0OYbi3j1KNlrLq2jFWcD9bAAQAAgDUIXAAAqEZ0uEO92zRS7zaNTO1FzlIlp+ZpZ2qudhzN044judqRmqsDxwprfY/cIpdW7s3Uyr3mxXrbxEd6gpjureLUvWWsOjSNVmgI05IAAAD8nc0wavv7OdSHlJQUJSUlSZIOHDigxMREiysCAHijoMSl5NQ87Tiap51Hc7XjaK62H8nVoezaT02qTFiIXZ2ax6h7y9iTYUzLOLWIC2daEgAAwCmoq8/fjHABAMCHosIcOiMxXmckxpvaswud2nE0V9uO5Grb4RxtP3I8iMktdtXq+iWlbm09nKOth3NM7Y2jQtW3bWOd3TZeZ7dtrDOT4hUdzv/NAwAAWIWfxAAAqAeNIkPVv32C+rdP8LQZhqFD2UXadjjneBBzJFfbj+Rod1p+rXdNyixw6udtqfr5192S7Dape8s4nd3ueADTr12CkhIiGQUDAABQTwhcAACwiM1mU5v4SLWJj9R5PVp42otdpdqVmq/tR38NYg4fHw1Tmx2T3Ia05XCOthzO0XvL9kuSWjWK0Lkdm2hghwSd27GJ2jWJIoABAACoIwQuAAD4mXBHiHq2jlPP1nGm9qyCkl9HwZwcDbP9SK7yS0q9uu7h7CJ9sfagvlh7UJLUMi5CAzseD1+GdWmqxMZRPn8WAACAhorABQCAABEfFaZzOzbRuR2beNrcbkMpmYVal5KlNfsytXZ/pjYfyvFqStKRnCJ9ue6Qvlx3SJLUuXmMRnRtppHdmql/+wRFhIbU2bMAAAAEOwIXAAACmN1uU9smUWrbJEqXndlaklRYUqqNB7O1Zn+m1uzL1Op9mcrIL6nxWsmpeUpOzdPbi/YoItSuQR2baGS35jqvR3NGvwAAANQS20L7KbaFBgD4imEY2pWWr2W7M379Oqb0vOJaXaNnqzid37OFxvZsoV6t41j7BQAABI26+vxN4OKnCFwAAHXFMAztTj8ewCzdlaHFyenKLHB6fX6rRhE6v0cLnd+zhc7tmKBwB1OPAABA4CJwaWAIXAAA9aXUbWhDSpZ+2ZGm+dvTtD4lS97+dBAT7tCIrs00pmcLjezWTPFRYXVbLAAAgI8RuDQwBC4AAKtk5pdowc7j4cu87anK8nL0S4jdpv7tG+uiPq10Ye9WahYbXseVAgAAnD4ClwaGwAUA4A9cpW6t2pepH7cc1Q9bj2pfRoFX59lt0rkdm+jiM1rpgl4t1SSG8AUAAPgnApcGhsAFAOBvDMNQcmqefth6VD9sOap1B7ybehRit2lwpya65IxWGterJdOOAACAXyFwaWAIXAAA/i41t0g/b03Vj1uPauHOdBW73DWe47DbNLRLU11+VmuN69VSUWGOeqgUAACganX1+ZufcgAAwClpHhuhawa01TUD2qqwpFQLdqbpm42H9eOWo8ovKa30HJfb0Pztx9eHiQrbpAt7t9LEs9vo3I5NZLez1TQAAAgeBC4AAOC0RYaFaFyvlhrXq6WKnKWavz1Vszcc1s9bU1XorDx8KSgp1WdrUvTZmhS1bhShCWe30YS+iercPKaeqwcAAPA9phT5KaYUAQCCQUGJSz9vS9XX6w9r3vZUr6Yd9WvXWJMGttVFfVopIjSkHqoEAAANGWu4NDAELgCAYJNX7NKPW47qi7UHtXBnmtw1/AQSF+HQb85O1KSBbdW1RWz9FAkAABocApcGhsAFABDMUnOK9OW6Q/psTYq2HcmtsT+jXgAAQF0hcGlgCFwAAA3FlkM5+nxNimatO6j0vJJq+zaKDNU1/ZN04+D2ahMfWU8VAgCAYEbg0sAQuAAAGpoSl1s/bT2qD1bs18Kd6dX2DbHbNK5XC908pIPOaddYNhs7HAEAgFPDttAAACCohTnsurBPK13Yp5X2ZxTow5X79cmqA5WOeil1G/pm4xF9s/GIzkhspJuGtNfFfVorzGG3oHIAAICKGOHipxjhAgBA7Ua9NIsN15TB7XXDoHaKiwitpwoBAECgY0pRA0PgAgCA2e60PE1fslefrE5RQUlplf1iwx26YVA73Ty0g5rGhNdjhQAAIBARuDQwBC4AAFQuu9CpT1Yd0LQle5WSWVhlv3CHXdf0T9ItwzsqsXFUPVYIAAACCYFLA0PgAgBA9Urdhn7YclRTF+/R8j3HquznsNt02VmtdcfoLurQNLoeKwQAAIGARXMBAADKCLHbdEHvlrqgd0ttOpit1+bv0jebDqv8r5JcbkOfrzmoL9cd0sSz2+iO0V2UlMCIFwAAULdYyh8AAAS83m0a6ZXrztaPd4/QVf0S5bBX3Ca61G3o41UpGv3MfP1z1iYdzSmyoFIAANBQELgAAICg0alZjJ684kwtuG+UbhrSXhGhFX/UcZYamrFsn4Y/OU//+XqLMvKKLagUAAAEOwIXAAAQdFrHR+rhS3tpyf3n6Q8jOikyNKRCn2KXW28t2qMRT83Xq/OTVeSseucjAACA2iJwAQAAQSshOkz3X9jdM+IlLKTijz55xS49+e12nffML5q19qDcbvYTAAAAp4/ABQAABL1mseF6+NJemv/XkZo0sG2la7wczCrUX2au04RXF2v57gwLqgQAAMGEwAUAADQYreMj9d8JffTzPSM1oW+bSvusT8nW1W8s0x9mrFZKZkE9VwgAAIIFgQsAAGhw2jaJ0nNXn6XZtw/VwA4Jlfb5dvMRnf/sL3rxp52s7wIAAGqNwAUAADRYfRIb6aPfn6s3b+ynjk2jK7xf5HTr2R92aOxzC/TDlqMyDNZ3AQAA3iFwAQAADZrNZtOYni303V3D9a/Le6lxVGiFPvuPFeiWd1fppmkrtS8j34IqAQBAoCFwAQAAkBQaYteNg9pr3r0jdeOgdqpkXV3N356mcc8v0Ou/7JKz1F3/RQIAgIBB4AIAAFBGfFSY/nV5b82+Y6j6tWtc4f0ip1uPz92my15erPUHsuq/QAAAEBAIXAAAACrRq3UjffKHQXru6jPVLDa8wvtbD+dowquL9a/ZW5Rf7LKgQgAA4M8IXAAAAKpgs9k0oW+ifr5nhCYPaidbuWlGbkN6Z/EejX1ugeZtT7WmSAAA4JcIXAAAAGoQGxGqRy/vrc9uG6xuLWIrvH8wq1A3TV2pBz7foDxGuwAAABG4AAAAeO3sto319Z+H6q/juinMUfHHqA9XHNAFzy/Q0l0ZFlQHAAD8CYELAABALYSG2PWnUZ313V+Ga3CnJhXeT8ks1LVvLtOjszeryFlqQYUAAMAfELgAAACcgg5No/X+7wbqvxP6KCospML7Uxfv1UUvLmQnIwAAGigCFwAAgFNks9k0aWBbfXvncA3okFDh/d1p+Zr42hK9/ssuud2GBRUCAACrELgAAACcprZNovTRLefqn5f0VHi5tV1cbkOPz92myVNXKDW3yKIKAQBAfSNwAQAA8AG73abfDu2gOX8epjOT4iu8v3Bnui56YaF+2ZFW/8UBAIB6R+ACAADgQ52bx+izPwzSn0d3ls1mfi89r0ST31mh/36zVSUutzUFAgCAekHgAgAA4GOOELvuHttNH/zuXLWIC6/w/hsLduvaN5fpaA5TjAAACFYELgAAAHVkUKcmmnvncJ3fo3mF91bvy9TFLy7Sst0ZFlQGAADqGoELAABAHUqIDtObN/bTI5f2VFiI+Uev9LxiXffWcr25YLcMg12MAAAIJgQuAAAAdcxms2nKkA76/I+DlZQQaXqv1G3osW+26k8frFFescuiCgEAgK8RuAAAANST3m0aafbtQzWyW7MK732z8Yh+8+pi7c8osKAyAADgawQuAAAA9Sg+KkzvTO6vv5zfpcIuRjuO5unyVxZpOeu6AAAQ8AhcAAAA6pndbtNfzu+qd6b0V6PIUNN7mQVOXf/2cs1cud+i6gAAgC8QuAAAAFhkVLfmmn37UHVtEWNqd5Ya+ttnG/Wv2VvkKnVbVB0AADgdDqsLwHG9evUyHTudTosqAQAA9altkyh9dttg/eWjdfppW6rpvXcW79HejHy9dG1fRYfzYxsAAIGEES4AAAAWi40I1Rs39tOtwztWeO/nbam69s1lSssttqAyAABwqmyGYRhWF4GKUlJSlJSUJEk6cOCAEhMTLa4IAADUh09WHdDfv9ikknJTidomRGnaTf3VsVlMFWcCAIBTUVefvxnhAgAA4Eeu7Jek928ZqPgo82K6+48VaOJrS7R6X6ZFlQEAgNogcAEAAPAz/dsn6LPbBiuxcaSpPbPAqUlvLtN3m49YVBkAAPAWgQsAAIAf6tQsRp//cbD6tGlkai92ufWH91broxVsGw0AgD8jcAEAAPBTzWMj9NHvz9XIbs1M7YYh3f/5Rr21cLdFlQEAgJoQuAAAAPix6HCH3ryxn67ul1Thvf/M2apnf9gh9kAAAMD/ELgAAAD4udAQux6f2Ee3j+pc4b0Xf9qpf3+9ldAFAAA/Q+ACAAAQAGw2m+4d100PXNi9wnvvLN6jv322QaVuQhcAAPwFgQsAAEAAuXVEJz02obdsNnP7x6tSdNfMdXKVuq0pDAAAmBC4AAAABJjrBrbT81efpRC7OXX5av0h3fPJekIXAAD8AIELAABAALr8rDZ6/fpzFOYw/zj35brjoQvTiwAAsBaBCwAAQIAa07OF3rqxX+Why8frCF0AALAQgQsAAEAAG961WaWhy6x1h3QvI10AALAMgQsAAECAG961md6sJHT5Yu1B3f/ZBrkJXQAAqHcELgAAAEFgRNdmeuOGimu6fLI6Rf+Zs1WGQegCAEB9InABAAAIEiO7Na80dHln8R69+FOyRVUBANAwEbgAAAAEkZHdmuu1686Wo9yW0c/9uEPvLNpjUVUAADQ8BC4AAABB5rweLfTMVWfKZs5c9K+vt+jjVQesKQoAgAaGwAUAACAIXX5WG/378t4V2u//bIO+33zEgooAAGhYCFwAAACC1PXnttPfLuhuanMb0h0frtXqfZkWVQUAQMNA4AIAABDEbhvZSbeN7GRqK3a59bvpK7U7Lc+iqgAACH4ELgAAAEHuvnHddFW/RFNbZoFTU6auVHpesUVVAQAQ3AhcAAAAgpzNZtNjE/poRNdmpvb9xwr022krVVDisqgyAACCF4ELAABAAxAaYter152t3m3iTO3rU7J1+wdr5Sp1W1QZAADBicAFAACggYgOd+idKf2V2DjS1P7ztlQ9OnuLRVUBABCcCFwAAAAakOaxEZp20wA1igw1tc9Ytk8zlu2zqCoAAIIPgQsAAEAD07l5jN6a3E9hDvOPgo98tVlLktMtqgoAgOBC4AIAANAA9W+foKeuOMPUVuo2dNv7a7QnPd+iqgAACB4ELgAAAA3U5We10Z9GdTK1ZRc69dvpK5Vd6LSoKgAAggOBCwAAQAN2z5huGtuzhaltd1q+7viQnYsAADgdBC4AAAANmN1u03NXn6UerczbRS/YkaanvttuUVUAAAQ+AhcAAIAGLjrcobcm91PTmDBT+/8W7NbcjYctqgoAgMBG4AIAAAC1iY/U/244R2Eh5h8P7/1kvZJTcy2qCgCAwEXgAgAAAEnSOe0S9PBlPU1t+SWlunXGauUVuyyqCgCAwETgAgAAAI9JA9rqinMSTW270vJ136frZRiGRVUBABB4CFwAAADgYbPZ9J/xvdWrtXkR3W82HtGbC3dbVBUAAIGHwAUAAAAmEaEhev36c9QoMtTU/sS327Vy7zGLqgIAILAQuAAAAKCCpIQoPX/NWbLZTraVug39+cO1yswvsa4wAAACBIELAAAAKjWqW3PdeV4XU9vh7CL9lfVcAACoEYELAAAAqnTH6C4a3KmJqe3Hral6Z/FeawoCACBAELgAAACgSiF2m56/+iw1iQ4ztT8+d6s2pGRZUxQAAAGAwAUAAADVah4XoWevPsvU5iw1dMeHa5Vb5LSmKAAA/ByBCwAAAGo0omsz/WFEJ1PbvowC/XPWJosqAgDAvxG4AAAAwCv3jO2qs9vGm9pmrTuk2esPWVMQAAB+jMAFAAAAXgkNsevFa/sqNsJhav/HrE06kl1kUVUAAPgnAhcAAAB4LbFxlP4zvrepLbvQqXs/WS+3m62iAQA4gcAFAAAAtXL5WW106ZmtTW2LktM1feleawoCAMAPEbgAAACg1v5zeW+1jIswtT0+d5t2Hs21qCIAAPwLgQsAAABqrVFUqJ656kxTW7HLrTs/WqcSl9uiqgAA8B8ELgAAADglQzo31c1DOpjathzO0cs/77SoIgAA/AeBCwAAAE7ZfRd0U9cWMaa2V+fv0uZD2RZVBACAfyBwAQAAwCmLCA3Rc1efJYfd5mlzuQ399ZMNcpYytQgA0HARuAAAAOC09GrdSH8c2cnUtuVwjl6fv8uiigAAsB6BCwAAAE7b7aO7qFuLWFPbiz/v1A52LQIANFAELgAAADhtYQ67nrziDJWZWSRnqaG/frJeLqYWAQAaIAIXAAAA+MSZSfG6ZXhHU9v6lGy9vWiPRRUBAGAdAhcAAAD4zF3nd1XHZtGmtmd/2KF9GfkWVQQAgDUIXAAAAOAzEaEheuqKM2QrM7Wo2OXWP2ZtkmEY1hUGAEA9I3ABAACAT53TLkGTB7U3tS3cma7ZGw5bUxAAABYgcAEAAIDP3TO2q1rEhZva/jV7i7ILnRZVBABA/SJwAQAAgM/FRoTqkUt7mdrS84r15LfbLKoIAID6ReACAACAOnFB75Y6r3tzU9sHK/Zrzf5MiyoCAKD+ELgAAACgTthsNj16eS9FhoZ42gxDevDzjXKWui2sDACAukfgAgAAgDqT2DhKfzm/i6lt25FcTV+y15qCAACoJwQuAAAAqFM3D+2g7i1jTW0v/LhTabnFFlUEAEDdI3ABAABAnQoNseuxCb1NbbnFLhbQBQAENQIXAAAA1Llz2iXoN33bmNo+WZ2itSygCwAIUgQuAAAAqBf3X9hdMeEOU9sjX22W221YVBEAAHWHwAUAAAD1onlchP58XmdT2/qUbH26OsWiigAAqDsELgAAAKg3UwZ3UMdm0aa2J77dpuxCp0UVAQBQNwhcAAAAUG/CHHY9dElPU1tGfome/3GHRRUBAFA3CFwAAABQr0Z2a67ze7Qwtc1Yuk+70vIsqggAAN8jcAEAAEC9e+iSngpznPxR1OU29MRctokGAAQPAhcAAADUu7ZNovTboR1Mbd9vOapluzMsqggAAN8icAEAAIAlbhvZSQnRYaa2/36zlW2iAQBBgcAFAAAAloiLCNVfzu9iatuQkq3ZGw5ZVBEAAL5D4AIAAADLXDugbYVtop/8druKnKUWVQQAgG8QuAAAAMAyoSF2PXBhD1PbwaxCTV2815qCAADwEQIXAAAAWOr8Hs01sEOCqe3VecnKyCu2qCIAAE4fgQsAAAAsZbPZ9I+Le5racotdemXeLosqAgDg9BG4AAAAwHJ9EhtpQt82prb3lu3TwaxCiyoCAOD0ELgAAADAL9w9pqtCQ2ye45JSt178caeFFQEAcOoIXAAAAOAXkhKiNGlAW1Pbp2tStCstz6KKAAA4dQQuAAAA8Bt/Gt1ZkaEhnuNSt6Fnf9hhYUUAAJwaAhcvHDx4UM8//7zGjh2rtm3bKiwsTC1bttTEiRO1fPlyq8sDAAAIGs1jI3TTkPamtjkbDmvTwWxrCgIA4BQRuHjhpZde0l133aXdu3dr7NixuueeezR06FB9+eWXGjx4sGbOnGl1iQAAAEHj1uGdFBfhMLU9/f12i6oBAODUOGruggEDBmj+/PkaMWKEqX3hwoU677zzdNttt2n8+PEKDw+3qEIAAIDg0SgqVLeO6KSnvjsZsszfnqYVe45pQIcECysDAMB7jHDxwm9+85sKYYskDRs2TKNGjVJmZqY2btxoQWUAAADB6aYh7dU0xvzLrKe+2ybDMCyqCACA2qnzwCU1NVVff/21HnroIV144YVq2rSpbDabbDabpkyZUqtr7du3T/fcc4+6d++u6OhoJSQkqH///nrqqadUUFBQNw9Qg9DQUEmSw8FgIQAAAF+JCnPojtGdTW0r92ZqcXKGRRUBAFA7dZ4StGjRwifXmT17tq6//nrl5OR42goKCrRq1SqtWrVKb731lubMmaPOnTtXcxXf2r9/v3788Ue1atVKffr0qbf7AgAANATXDEjSGwt262BWoafthZ92aEjnJrLZbBZWBgBAzep1SlHbtm01duzYWp+3du1aXX311crJyVFMTIwee+wxLVmyRD/99JNuueUWSdKOHTt08cUXKzc319dlV8rpdOqGG25QcXGxnnjiCYWEhNR8EgAAALwW7gjRn0ZVHOWydDejXAAA/q/OR7g89NBD6t+/v/r3768WLVpo79696tChQ62uceedd6qwsFAOh0Pff/+9Bg0a5Hlv9OjR6tKli+677z7t2LFDzzzzjB555JEK17jnnntUXFxcq3t26dKl0vfcbremTJmiBQsW6JZbbtENN9xQq+cBAACAd644J1GvzEs2j3L5cacGd2pqYVUAANTMZtTzymNlA5fJkydr2rRp1fZfsWKFBg4cKEm69dZb9frrr1fo43a71bt3b23dulXx8fFKTU31rK1yQkxMjPLz872uc968eRo5cmSl97r55ps1ffp0XX/99Zo+fbrsdt8PFEpJSVFSUpIk6cCBA0pMTPT5PQAAAALBe8v26R+zNpnaPvr9uTq3YxOLKgIABJO6+vzt97sU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",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAABFsAAAOOCAYAAADf9B0aAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAewgAAHsIBbtB1PgAApwpJREFUeJzs3Xd8VfX9x/H3zSabBDIgYYa9kSkgooIDB45qQRG31lFbtcNWUdufVmvdo61VQXFPFBHrAmXK3jPMhJAQsve65/cH5ZqTeZPc5Nyb+3o+Hjya8z3f872fC1Ry3/kOm2EYhgAAAAAAAOASPlYXAAAAAAAA0J4QtgAAAAAAALgQYQsAAAAAAIALEbYAAAAAAAC4EGELAAAAAACACxG2AAAAAAAAuBBhCwAAAAAAgAsRtgAAAAAAALgQYQsAAAAAAIALEbYAAAAAAAC4EGELAAAAAACACxG2AAAAAAAAuBBhCwAAAAAAgAsRtgAAAAAAALgQYQsAAAAAAIALEbYAAAAAAAC4EGELAAAAAACACxG2AAAAAAAAuBBhCwAAAAAAgAsRtgAA4GLLli2TzWaTzWbTmWeeWW+/U31sNpvLXvu6665zjDl//nyXjetqhw4dctTZo0cPq8tpM57y5wMAAFqGsAUA4BHuu+8+04dzwzCaNU52drYCAwP5wAu4ufnz55sCyZq/AgMDFRMTo9GjR+v222/Xjz/+6PTY1cO+U79iYmJUWVnp9BhVVVWKj4+vNc6hQ4cafTYlJUWPPvqozj33XCUmJiokJET+/v6KjIxU//79dcEFF+jPf/6zFi1apMLCwia9j6b8WrZsmdPvFwDQNIQtAACPMGfOHMfXhw8f1g8//NCscd577z2Vl5dLkkJCQnTFFVe4pD5v5q2zVGCt8vJyZWZmav369frnP/+pyZMna8qUKUpJSWnWeJmZmVqyZInT/f/73/8qPT29Sa9RWlqq++67Tz179tQDDzygr7/+WqmpqSouLlZlZaXy8vK0Z88eLVmyRI899pguvvhiRUVFafXq1U19OwAAi/lZXQAAAM4YMmSIRowYoU2bNkmS3nzzzQaX6NTnzTffdHx9+eWXKzQ01FUlAmglYWFhuvbaa01tpaWlOnz4sFauXKmSkhJJJ5fwnXXWWVqzZo2io6Ob/DpvvvmmLrroIqf7NkV5ebkuueQSff311462gIAAjRo1Sr1791ZwcLDy8/N16NAhbd682fGeKioqVFRU5NRrXHvttQoLC3O6pq5duzbpPQAAnEfYAgDwGHPmzHGELR9//LFeeukldejQwenn9+7dq59++sk0npWauxSqPWjJUjB4n6ioKL344ot13svKytLtt9+uDz74QJKUnJyshx9+WC+88ILT4w8cOFA7d+7UokWLlJubq8jIyAb75+Xl6bPPPjM925jHH3/cEbTYbDb9/ve/1x//+Mc6X6uiokLLli3TBx98oHfffdfp9/HII48wuwwA3ATLiAAAHmPWrFny9/eXJOXn52vhwoVNer76T6K7deumKVOmuLI8ABaIjo7WO++8o9GjRzva5s2bp4qKCqfHmD17tiSprKxM77//fqP9P/jgA5WWlkpSrRk3damoqNAzzzzjuP7LX/6ixx9/vN5Qx9/fX1OnTtV//vMfpaamasSIEU68CwCAOyFsAQB4jM6dO+v88893XDdlGr9hGHrrrbcc17Nnz3bpKUAArOPr66s777zTcV1UVKQNGzY4/fysWbPk53dywrcz/1051cff31+zZs1qtP/atWuVm5vreObuu+92urbIyMhmLYkCAFiLsAUA4FGqL/355ptvnN6g8ocfftDhw4cd1zV/Gp2Xl6d3331Xt956q8aOHatOnTopICBA4eHh6t27t2bOnKkPPvhAdrvdNW9ETT/6eeHChbrkkkvUtWtXBQYGKiEhQVOnTtWCBQuadIqKJJWUlGjhwoX69a9/rYkTJyo2NlYBAQEKDQ1Vjx49dOmll+q1115zbCZcl1OnxfTs2dPRdvjw4XpPPqmuOZvqrlmzRnfeeacGDRqkjh07KigoSAkJCTrvvPP04osvOrWvxcMPP+x43YcffliSVFlZqTfffFPnnHOO4/c2Pj5eM2bM0BdffOFUba2lsLBQzz//vM4991wlJCQoKChIHTt21ODBg3XnnXealsU1JiUlRY888ojOOOMMxcbGKjAwUAEBAYqOjtawYcM0a9Ys/fOf/2zw/1MVFRV66623dNlll6lXr14KDQ2Vn5+fwsLClJSUpHPPPVdz587V2rVrXfH2m2T48OGm67S0NKefjYmJ0XnnnSdJWrVqlfbv319v34MHD2rlypWSpPPOO0+dO3dudPyjR486vo6KimrSvioAAA9lAADgQcrKyoyoqChDkiHJeOqpp5x67vrrr3c8M378eNO9jz/+2AgMDHTcb+jXsGHDjAMHDjT4WkuXLnX0nzx5cr39qo/bkIKCAuOCCy5osK6JEycax44dM+bMmeNomzdvXp3jrVmzxggNDXXq/fbo0cPYuHFjnePMmzfPqTHqeo8HDx50tHfv3r3B919YWGhcddVVjY4fHx9vfPnllw2O9dBDDzn6P/TQQ0Zqaqpx+umnNzju9ddfb1RVVTU4rrOc+fM5ZdGiRUZcXFyj73vWrFlGUVFRg2P9+9//Njp06ODUn9OECRPqHGPPnj3GgAEDnP7z3rdvX3N/mwzDMP/9auzviGEYxt69e02v//bbb9fbt/rfP0lGSUmJ8cEHHziu586dW++zDz/8sKPfhx9+aJSUlJjGOnjwYK1nPvzwQ8d9m81mFBYWOvNb0Kia76Ou1wYAWIMNcgEAHiUgIEAzZ87USy+9JOnkdP577rmnwWdKSkr00UcfOa5rbox7/PhxlZWVSZISEhI0cOBAxcXFKTg4WIWFhdq1a5c2btwowzC0ZcsWnXHGGdq8eXObTO2vqKjQ9OnT9eOPPzra4uLidMYZZygsLEzJyclasWKFVqxYoUsvvVS9evVqdMycnBwVFhZKOvkT/UGDBikhIUEhISEqLi5WcnKy1q5dq8rKSh06dEiTJ0/Wxo0blZSUZBpnwIABuuOOO1RQUOBYVlHXqTEtUVxcrLPOOss0U6JLly6aNGmSQkNDHe+/qqpKx44d08UXX6x3333XqSO9CwsLdd5552n79u0KDg7WpEmTlJiYqIKCAi1dulTHjx+XdHL/j379+ukPf/iDy95XY95//31dffXVqqqqknRymczEiROVlJSkwsJCLV++3DFz45133tHBgwf1/fffKygoqNZYCxcu1K233uq4Dg8P1/jx45WQkCA/Pz/l5eVp79692r59e70zmQoKCnTOOec4jlX28fHRiBEjNGDAAIWGhqq4uFhHjx7Vli1bdOLECVf/djil5kyW2NjYJj1/8cUXKzIyUrm5uXrrrbccs6BqOvV3vWPHjrrooouc2ui5d+/ejq8Nw9Df//53PfLII02qDwDgYSwOewAAaLK1a9eafpq7devWBvu//fbbjr6BgYFGTk6O6f7nn39u/O1vf2vwJ/EHDhwwzj33XMc4N954Y719XTmz5S9/+YvpJ+KPPvqoUVlZaeqzZ88eY9iwYYYkIyAgwKmZLX/605+Mbdu21fu6GRkZxuzZsx1jnX322fX2bcoslaY+86tf/crRz9fX13j22WdrzTLZu3evcdpppzn6hYeH1/sT/uozW07NZpozZ46RlZVl6ldUVGTMnDnT0Tc0NNQlsxGcmdmSnJxsmnk0ZsyYWn83q6qqjKeeesrw8fFx9LvrrrvqHG/48OGOPnfeeWe9s2AKCgqMDz74wPjDH/5Q696zzz7rGGPgwIHG7t276xzDbrcba9euNX71q18ZR44caeB3onFNndly//33O/r7+/sb2dnZ9fata2aLYRjGLbfc4mj78ccfaz23fPlyx/1bb73VMAzDqZktdrvd6NGjh+n/y9dcc42xevVqw263O/cb4sT7YGYLALgPwhYAgEeqvpzhvvvua7Bv9ZDkyiuvbPZrlpeXG0OHDjUkGUFBQfV+mHNV2JKbm2sEBwc7+jz88MP1jnX8+HEjPj7eNGZjy1Sccf755zvG27lzZ519WitsSU5ONoUJL774Yr3jZWdnmz7MXn/99XX2qx62SDJmzpxZ75glJSVGYmKio+97773n1HtriDNhy7XXXuvok5SUZOTm5tY73tNPP+3o6+PjU2uJW0FBgeN+YmJisz/YX3755Y5xvvnmm2aN0VRNCVt27txphIWFOfrPmjWrwf71hS0rV650tN100021nrv55psd91etWmUYhnNhi2EYxkcffWTqd+pXdHS0ccEFFxhz5841Fi1a1GBI1Nj7uPbaa4077rjDqV/PPvus068DAGg6whYAgEd6/PHHHR8wunTpUmu2xylpaWmGr6+vo+/ixYtb9LpPPPGEY6zPP/+8zj6uCltefvllx/2EhASjrKyswdpeeeUVl4ct77//vmO8559/vs4+rRW2/OEPf3D0GT58eKNBQfVaAwMD6wwpqoctAQEBxrFjxxoc8/e//72j/z333OPUe2tIY2FLTk6Oaf+gTz75pMHxqqqqjEGDBjn6//GPfzTdP3r0qOn3sLmmTp3qGGfz5s3NHqcpGgtbSktLjT179hh///vfjcjISEff/v37G+np6Q2OXV/YYhiGkZSUZEgyIiIiTO0lJSWO1+nTp4+p3dnZJa+++qoRFBRUZ+hSfdbLmDFjjBdeeMH0+s68j6b8aui/TQCAlmPPFgCAR7rmmmv0pz/9SXa7XWlpafr222917rnn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n1MbHYeHhzsVPLmruXPnOjbK3bt3r84991wdOHDA1Mdut+u5554z7Ytyxx131DqSeMOGDerRo4cefvhh7dy5s87Xq6qq0vvvv+841lk6ufSuuvHjx2vWrFlasmRJveHN3r17TbPIzj777Eb/Prpa//79deWVVzqun3jiCafDprokJSVp1KhRGjVqlJKSkpo9Tk5Ojn73u9+pR48euueee7Rx48Z6Z2qdOHFCv/3tb01/h0eMGEHYAgAexs/qAgAAcIU5c+bUub9IY8e0Tps2TWeccYZ+/PFHGYah++67Ty+99JJGjhypiIgI7du3T6tWrVJVVZW6du2qu+++2xSAtLb7779f33zzjVauXCnDMPTHP/5Rzz33nCZPnqzQ0FAlJydr+fLlqqqq0tixY9W7d2+988479Y7Xv39/zZ4927GnzVNPPaV33nlHo0ePVkxMjA4dOqQff/xR5eXlCgsL05NPPqnbbrut0Tovv/xyPfbYY5JOblY6f/58JSUlmTa5/cc//tHk9/+Pf/xD69ev17p161RZWak777xTjz/+uCZOnKjQ0FDt379fP/74oyOA8vPz02uvvVYrdPAkvXv31quvvqqrr75aVVVVWr16tfr166dJkyapd+/eKiws1PLly3X06FHHM+PGjdPf//73Osc7duyYHnnkET3yyCOKi4vT8OHDFRcXJz8/P2VkZGjDhg2mvXwmTZpkWo4jnQzR3n33Xb377rvq0KGDhg4dql69eik8PFw5OTk6cOCA1q9f7+jfoUOHZv15u8KDDz6oDz74QHa7XSkpKZo/f36bz0qrT2Zmpp555hk988wzioiI0Gmnnab4+HiFhYWpsLBQ+/bt04YNGxzHTEtSbGys3n77bdMSwPo89NBDTdrAd8qUKbr88sub9V4AAI0wAABoB/Lz843g4GBDkuPXgAEDnHo2PT3dGDlypOnZmr8GDhxo7Nixw5g3b56jbc6cOXWOt3TpUkefyZMn1/u61cdvSF5ennHeeec1WN/pp59upKWlGXPmzHG0zZs3r87xioqKjGnTpjU4XkJCgrFixQqn30tubq7Rv3//Bses7uDBg4727t27N/j+CwoKjCuvvLLBsSUZ8fHxxpdfftngWA899JCj/0MPPdRgX8Nw/s/SWc78+ZyyaNEiIzY2ttH3PXPmTKOoqKjOMdasWWP4+fk1OsapX1dc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1ePn5ydJ+vXXX4scKxz8LF++vNLXBwAA5UPYAgAAary5c+fKYrGU+afwrJbCunfvLnf3kpeq69atm/XRoAMHDlj3//rrr8rMzJQk9e7du9QaCx//8ccfrdv79u2zLog7YMCA0m+0DNdnrpSkQYMGkqTLly8X2d+/f3+1bt1akvTkk08qIiJCCxYs0NatW5Wbm1ulmgAAgC3CFgAA4PSaNGlS6nF3d3c1bNhQknT+/Hnr/sLbZfVReC2Ywuelp6dbtwvPMKkMHx+fUo+7uV37p11+fn6R/R4eHoqPj7e+pej777/X7Nmz1b9/fwUEBOjOO+/UihUrbM4DAACVQ9gCAACc3o2LyTqqD0fq2LGjDhw4oM8//1wTJ05U27ZtJUlZWVn65ptv9PDDD6t37946c+aMgysFAKD2I2wBAABO77fffiv1uNlsts5GuT7D5cbtsvo4ffp0sec1btzYun3q1KnyFWwnderU0ciRI7V06VIlJSUpLS1Ny5YtU48ePSRJu3fv1pQpUxxaIwAAzoCwBQAAOL19+/bJbDaXePyHH36wrl3SqVMn6/7WrVtbH93ZsWNHqdco/Mrown10797dOivmu+++q3jxdhQcHKwJEyYoMTFRt9xyiyTpq6++UlZWloMrAwCgdiNsAQAATu/8+fOKj48v8fiyZcus20OGDLFuu7u7a+DAgZKkb7/9VqmpqSX2sWTJEus5gwYNsu5v2LChbr31VknSxx9/rLS0tErdgz15eHhY79NsNuvixYuOLQgAgFqOsAUAALiE6dOnF/so0KZNm7R48WJJUo8ePdSrV68ix//85z9LknJzczVp0iTl5eXZ9LFs2TKtWbNGknTffffZLIT73HPPSZIyMzM1atQoXbp0qcQ6Swt0Kmvz5s06evRoicdzc3Otr7j28/NTYGCg4TUAAOBKSn4HIgAAQA1x5syZIq9TLkndunXVpk0bm/1du3bVTz/9pB49emjWrFmKiIhQTk6OVq1apTfeeENms1nu7u56++23bc6NiorSqFGj9N///ldr1qxRnz59NH36dIWHh+vChQtauXKldWZMw4YN9frrr9v0MWLECE2aNElLly7Vtm3b1LFjR02bNk39+vVTvXr1lJ6erl27dumjjz5S165dFRMTU/H/kUqxbt06vfjiixowYICioqLUpUsXBQYGKisrS0eOHNG7776rPXv2SJImTZpU6muyAQBA2fgmBQAANd4777yjd955p8x2Xbt21b59+2z2d+vWTdOmTdPUqVM1bdo0m+Oenp6KjY1V7969i+03Li5OZrNZn3/+ufbs2aOxY8fatGnWrJkSEhJ00003FdvHe++9p7p16+rtt99WWlqaZs+eXeI92ENBQYE2bdpkncFSnHvvvVcLFiywy/UBAHAlhC0AAMAlPProo+rUqZPeeOMNbdmyRenp6QoMDNTgwYP13HPPqWPHjiWe6+3trc8++0zx8fGKiYnR9u3blZ6eLl9fX4WFhWnkyJGaNm2a/Pz8SuyjTp06euuttzRhwgS999572rhxo06ePKnc3Fw1atRIXbp00Z133qlHHnnE8Ht/+umn1aVLF61du1Z79+5VWlqa9RXPQUFBioiI0Lhx4xQVFWX4tQEAcEUmi8VicXQRAAAA9hAaGqqUlBSNHz/e8EdzAAAASsICuQAAAAAAAAYibAEAAAAAADAQYQsAAAAAAICBCFsAAAAAAAAMRNgCAAAAAABgIN5GBAAAAAAAYCBmtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAGImwBAAAAAAAwEGELAAAAAACAgQhbAAAAAAAADETYAgAAAAAAYCDCFgAAAAAAAAMRtgAAAAAAABiIsAUAAAAAAMBAhC0AAAAAAAAG+v9ByTH2IOc9xwAAAABJRU5ErkJggg==",
"text/plain": [
""
]
@@ -473,12 +391,13 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "Time step 20\n"
+ "Time step 20\n",
+ "RMSE 0.008787811905747846, number of epochs 10000\n"
]
},
{
"data": {
- "image/png": "iVBORw0KGgoAAAANSUhEUgAABFwAAAOOCAYAAAA9KAZjAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAB7CAAAewgFu0HU+AACiSklEQVR4nOzdd3hUZd7G8XuSSa+EGkiooYOAFEWaWEDFxtobqLuuW9y1ruv67lq26rrW1V3X1RXEhhULFiz0Ih3pEGkJLY30NuW8fwSGnNRJmMmZSb6f68rlnOc888zvAO++zM1TbIZhGAIAAAAAAIDPhFhdAAAAAAAAQGtD4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAAAAAAOBjBC4AAAAAAAA+RuACAAAAAADgYwQuAAAAAAAAPkbgAgAAAAAA4GMELgAAAAAAAD5G4AIAgI8tWrRINptNNptNZ599dr39TvSx2Ww+++ybb77ZM+asWbN8Nq6v7du3z1Nnz549rS6nxQTL7w8AADh1BC4AgKBw3333mb6gG4bRrHHy8vIUERHBl14gwM2aNcsUStb8iYiIUKdOnTR69Gj94he/0JIlS7weu3rgd+KnU6dOcjqdXo/hcrmUnJxca5x9+/Y1+t6MjAz95S9/0dSpU5WamqqYmBiFhYUpMTFRAwYM0EUXXaT/+7//0yeffKLi4uImPUdTfhYtWuT18wIAmo7ABQAQFGbOnOl5vX//fi1evLhZ47z99tuqrKyUJMXExOjKK6/0SX1tWVudrQJrVVZWKjs7W2vXrtW///1vTZo0SZMnT1ZGRkazxsvOztbnn3/udf8vv/xSR44cadJnlJeX67777lOvXr30+9//XgsWLFBmZqZKS0vldDpVUFCgnTt36vPPP9df//pXXXrppUpKStLKlSub+jgAgABgt7oAAAC8MXToUI0YMUIbNmyQJL322msNLtepz2uvveZ5fcUVVyg2NtZXJQLwk7i4OM2YMcPUVl5erv3792v58uUqKyuTVLWc75xzztGqVavUvn37Jn/Oa6+9pksuucTrvk1RWVmpyy67TAsWLPC0hYeHa9SoUerTp4+io6NVWFioffv2aePGjZ5ncjgcKikp8eozZsyYobi4OK9r6tatW5OeAQDQNAQuAICgMXPmTE/g8v777+uFF15QVFSU1+/ftWuXvvvuO9N4VmrusqjW4FSWhaHtSUpK0vPPP1/nvdzcXP3iF7/QO++8I0lKT0/XI488on/+859ejz9o0CBt27ZNn3zyifLz85WYmNhg/4KCAn300Uem9zbmscce84QtNptN999/vx544IE6P8vhcGjRokV655139NZbb3n9HI8++iizzAAggLCkCAAQNK6//nqFhYVJkgoLCzVv3rwmvb/6v0h3795dkydP9mV5ACzQvn17vfnmmxo9erSn7dVXX5XD4fB6jJtuukmSVFFRoblz5zba/5133lF5ebkk1Zp5UxeHw6Gnn37ac/3HP/5Rjz32WL3BTlhYmM4//3z997//VWZmpkaMGOHFUwAAAg2BCwAgaHTs2FEXXnih57opU/oNw9Drr7/uub7pppt8ejoQAOuEhobqjjvu8FyXlJRo3bp1Xr//+uuvl91eNfHbm/9dOdEnLCxM119/faP9V69erfz8fM977rzzTq9rS0xMbNbyKACA9QhcAABBpfoyoK+++srrTSsXL16s/fv3e65r/qt0QUGB3nrrLd1+++0644wz1KFDB4WHhys+Pl59+vTRddddp3feeUdut9s3D6KmHws9b948XXbZZerWrZsiIiKUkpKi888/X3PmzGnS6SqSVFZWpnnz5unXv/61xo8fr86dOys8PFyxsbHq2bOnpk+frldeecWzwXBdTpwi06tXL0/b/v376z0RpbrmbLS7atUq3XHHHRo8eLDatWunyMhIpaSk6IILLtDzzz/v1T4XjzzyiOdzH3nkEUmS0+nUa6+9pvPOO8/za5ucnKzLL79cn376qVe1+UtxcbGee+45TZ06VSkpKYqMjFS7du00ZMgQ3XHHHaYlco3JyMjQo48+qokTJ6pz586KiIhQeHi42rdvr2HDhun666/Xv//97wb/b8rhcOj111/Xj370I/Xu3VuxsbGy2+2Ki4tTWlqapk6dqoceekirV6/2xeM3yfDhw03Xhw4d8vq9nTp10gUXXCBJWrFihX744Yd6++7du1fLly+XJF1wwQXq2LFjo+MfPHjQ8zopKalJ+6wAAIKYAQBAEKmoqDCSkpIMSYYk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/bWmTp1aq98bb7zh2QejS5cudfapLj8/X6tWrdLWrVuVm5ur4uJi08lEO3bs8LzeuHGjLrnkEh89UW0LFy70vL7mmmsUHh7eYP9rr71Wd9xxR4MnC9VUWlqqVatWafPmzcrOzlZRUZHn10syn66yceNG74v3gW+//dbz+uabb270NKfp06crKSlJeXl5qqio0MqVKz0nz9Rl/Pjx6tKlS4NjjhgxwvN637593hV+ClasWOHZT6hDhw6N/vkKCQnRrbfeqnvvvVeS+c/MiTEiIyNVXl6uLVu2aPny5Ro3blyT60pNTfW8fvHFF/Xvf/+7yWOcihOnXzUkJCREl19+uV544YUm799S3U033aSHH35YBQUF+uijj3TNNddIkj766CPP0c433XRTs8b+8Y9/rPPPP1+PP/643nrrLR07dqxWH8MwtHr1aq1evVqPP/645syZo7PPPru5jwMAsBCBCwAgKHXr1k3nnXeeFixYIEmaM2dOnWHKiQ0uJemGG25QaGhoneNlZmbqgQce0Hvvvef5wtsYf28OumHDBs/rsWPHNto/Li5OQ4YM0fr16xvtm5eXp4ceekivvfaaioqKvKqnJTdDNQzDFPCcddZZjb4nLCxMY8aM0RdffCFJWr9+fYOBy9ChQxsds/rGyIWFhY32P1XVf8/HjBkju73xv6pVD1A2bNggwzA84UR4eLguv/xyvf3223I6nTrnnHN0zTXX6Morr9TEiROVmJjoVV1XX321/ve//0mqClzWrVunmTNnaurUqbU2U7bKpZdeqldeecXrZ6rPTTfdpEceeUSGYei1117zBC4n/rfEZrM1O3CRpO7du+uFF17Q008/re+++05Lly7VmjVrtG7dOs+mxCdkZmbq/PPP1/z58zVlypRGx967d6/Xx6wDAPyPwAUAELRmzpzpCVw+/PBDFRcXKzY21nN/w4YN2rx5s6l/XTZs2KBzzz23zn9tboi3QUVzZWdne153797dq/d079690cBl//79mjhxog4cONCkevz9vNUVFBTI4XB4rnv06OHV+6p/2WwsIEpISGh0vLCwMM/r6vX4S/Xf8+Y8c2VlpYqKihQfH+9pe/rpp7Vu3Trt3r1blZWVmjNnjubMmaOQkBANHjxYEyZM0Pnnn68LL7xQERERdX7G1KlT9atf/Ur//Oc/JUlr1qzRmjVrJFWdBjR+/HidffbZuvzyy5WSktLUx25UzdOvnE6nDh06pA0bNigzM1NS1WlMe/bs0TfffKMOHTo0+7N69eql8ePHa+nSpVqwYIGOHj0qSZ7/rZkwYYJPQo3w8HBNmDBBEyZM8LTt27dP7733np555hnP7DKn06kZM2Zoz549io6OPuXPBQC0nBCrCwAAoLmmT5/u+WJZWlpqOvpZMs9uGTFiRJ0zGioqKnTFFVd4wpaOHTvq97//vRYuXKiMjAyVlJTI7XbLqNr3TK+++qrnvdWXGvnDiaObJXn9RSsmJqbRPtdff70nbImLi9Pdd9+tL774Qnv27FFxcbFcLpfneasvUfH381ZX/dkl756rZr/GAqLGlqhYofpzN+eZpdrP3aVLF61du1a///3vTUtt3G63Nm/erH/961+aPn26kpOT9dhjj5mWlFX33HPP6YMPPtCYMWNM7UePHtX777+vX/3qV+revbuuvPLKJod5jUlKStLzzz/v+XnxxRf18ccfa+/evXrllVc8x2F///33PjmW/EQ463Q69eabb+rNN9+U0+k03fOHnj176r777tO2bdtMy4iOHj2quXPn+u1zAQD+QeACAAhaUVFRuuqqqzzXc+bM8bx2Op166623PNf1fUl6//33tXfvXklVy5Q2bdqkP/3pTzr77LOVkpKi6Oho0xfzlpzlUX22TmlpqVfvKSkpafD+ihUrtGLFCs/4q1at0lNPPaWpU6eqV69eiomJUUjIyb8etOTzVlf92aXGn6uufnFxcT6tqSVUf+7mPLNU93PHx8frT3/6kw4ePKhVq1bpiSee0OWXX26aCXLs2DH97ne/0xVXXCHDMOr8rOnTp+u7777T/v37NXv2bN1+++0aNGiQ575hGHr//fd1+umna9euXV7VfyrsdrtuvfVWvfzyy562zz//XLNnzz6lca+66ipFRUVJqgpuT4xX839z/CU+Pl5z5swxLYFcunSp3z8XAOBbBC4AgKBWPUhZtGiRZw+EL7/80rMUICwsTNdff32d7//mm288r++66y4lJyc3+Hn79+8/1ZK91rFjR89rb2cM1NwDoqbqzztz5kzTl+W6tOTzVpeQkGBazuPt81ff2PZUlpVYpTm/59WfOTw8vMGgKTQ0VGeccYbuu+8+ffjhhzp69KiWLl2qSy+91NPno48+0vvvv9/gZ3bv3l0zZszQiy++qK1bt+rAgQN69NFHPTOxcnNzdc8993hVvy/ccMMNpmf4wx/+oPLy8maPFx8fr8suu0xS1WbRmzZtkiRdfvnlLRbkpaSkaPDgwZ7rw4cPt8jnAgB8h8AFABDUxo8fr969e0uqWiLx+uuvSzIvJ7rwwgtNX2SrO3TokOe1N5uoLlmy5FTKbZLqJ+SsWrWq0f7FxcXasmVLg3388bz+WJpjs9k0fPhwz/WJWTkNcTqdnn1FJOn000/3eV3+Vv33fPXq1fUu76mu+q/NiBEjmvT7ERISovHjx2vevHk6//zzPe0ff/yx12NIVacYPfTQQ3rppZc8bQsWLPB6A2pf+Pvf/+6ZEZKRkaEXX3zxlMara2mSL5YrNcWJpVKS6t1fBwAQuAhcAABBzWazmb4EzZkzRwUFBaYvjA3tuVB9+Uxjy3bWrVtn+kLvb5MnT/a8njt3bqObts6dO7fRL7hNed5Dhw7po48+arTO6l8Kfbmx7DnnnON5PXv27HqXuZwwb9485ebmemry5mSnQHPWWWd5vlhnZ2dr/vz5DfZ3u92mfYWq/5o1hc1mMx1BfWJ2WFNVn2XicDiUl5fXrHGao3///rr22ms910888cQpBT5TpkwxHRuenJxsCqX8raKiwnQMvbcbZwMAAgeBCwAg6M2YMcPzr/rbt2/X/fff71lOkJSUpIsvvrje956YHSM1/K/6paWl+ulPf+qjir1z/fXXe5ZoZGRk6PHHH6+3b25urh566KFGx/T2eV0ul37605+qsrKy0TETExM9QU52drbPQpfbbrvNM+769etNsydqys/P1/333++5vu6667w6hSjQJCYmeo4hlqTf/OY3De6j8/zzz3tO4goJCan1Z7SoqMir30PJvBytU6dOpnveHglefYyQkBDTsdot4fe//73nz8yhQ4dMe7s0VWhoqOfI5jVr1mjJkiX1HivfmO+++07/+Mc/vN6LSaqasVP9KPKGjjgHAAQmAhcAQNDr1auX6WjV6l/Mr7vuOoWHh9f73ur/qj979mw9+eSTtZZxpKena8qUKVq/fr3XJ8f4QkJCgilEeOihh/T444/Xqm/37t06//zzdejQoQafVZKmTZvmCacWLVqk++67T2VlZaY+R44c0RVXXKH58+d79bwRERHq27evpKpZDfPmzfPm8RrVp08f3X777Z7rO+64Qy+88EKt05JO/P6c2Pw4Pj7eq/ApUD300EOezXN37dqlqVOnas+ePaY+brdbzz77rGmflF/+8pe1jitet26devbsqUceeUTbtm2r8/NcLpfmzp3rOfJZqlqGV93YsWN1/fXX6/PPP683wNm1a5dpNtm5557b6J9HXxswYICuvvpqz/Xjjz/udeBUl7S0NI0aNUqjRo1SWlpas8c5duyYfvOb36hnz5665557tH79+npnbOXk5Ojuu+82/RkeMWIEgQsABCG71QUAAOALM2fOrHO/kcaOcJ0yZYomTpyoJUuWyDAM3XfffXrhhRd0+umnKyEhQbt379aKFSvkcrnUrVs33XnnnaYQxN9+97vf6auvvtLy5ctlGIYeeOABPfvss5o0aZJiY2OVnp6upUuXyuVy6YwzzlCfPn305ptv1jvegAEDdNNNN3n2uHnyySf15ptvavTo0erUqZP27dunJUuWqLKyUnFxcXriiSf0s5/9rNE6r7jiCv31r3+VVLWB6axZs5SWlmba+PYf//hHk5//H//4h9auXas1a9bI6XTqjjvu0GOPPabx48crNjZWP/zwg5YsWeIJoex2u1555ZVawUMw6dOnj15++WXdcMMNcrlcWrlypfr3768JEyaoT58+Ki4u1tKlS3Xw4EHPe84880z9/e9/r3O8w4cP69FHH9Wjjz6qLl26aPjw4erSpYvsdruOHj2qdevWmfb2mTBhgmlpjlQVpL311lt66623FBUVpdNOO029e/dWfHy8jh07pj179mjt2rWe/lFRUc36/faFP/zhD3rnnXfkdruVkZGhWbNmtfjstPpkZ2fr6aef1tNPP62EhASNHDlSycnJiouLU3FxsXbv3q1169Z5jqCWpM6dO+uNN94wLQesz8MPP9ykTX0nT56sK664olnPAgDwggEAQCtQWFhoREdHG5I8PwMHDvTqvUeOHDFOP/1003tr/gwaNMjYunWr8eqrr3raZs6cWed4Cxcu9PSZNGlSvZ9bffyGFBQUGBdccEGD9Z111lnGoUOHjJkzZ3raXn311TrHKykpMaZMmdLgeCkpKcayZcu8fpb8/HxjwIABDY5Z3d69ez3tPXr0aPD5i4qKjKuvvrrBsSUZycnJxmeffdbgWA8//LCn/8MPP9xgX8Pw/vfSW978/pzwySefGJ07d270ua+77jqjpKSkzjFWrVpl2O32Rsc4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t/+YRRUBaMsIXAAAAAC0Gnee21cJUWGmtj/P3ybDMCyqCEBbReACAAAAoNVIjA7Xr85JM7VtOJCvT78/bFFFANoqAhcAAAAArcqMsT3Vs320qe2vn21XSYXToooAtEUELgAAAABalXB7iB64cKCp7XBBuZ75epdFFQFoiwhcvFBeXq577rlHEydOVNeuXRUZGakuXbpo3LhxevXVV+VwOKwuEQAAAEA1Uwd31vi0Dqa2/y3fp22HCi2qCEBbQ+DiheLiYv373/+WzWbTtGnTdM8992j69Ok6ePCgbr31Vl188cVyu91WlwkAAADgOJvNpj9dPkTh9pNfeVxuQ/83b7PcbjbQBeB/dqsLCAZJSUkqKChQeHi4qd3pdOr888/XggUL9Pnnn2vatGkWVQgAAACgpl4dYvSLs/voma93e9o2HMjXG6sP6KYax0cDgK8xw8ULISEhtcIWSbLb7Zo+fbokKT09vaXLAgAAANCIn03qo14dYkxtf/tsuw7kllpUEYC2wu+BS1ZWlj799FM99NBDuvDCC9WhQwfZbDbZbDbdfPPNTRpr//79uvfeezVgwADFxMQoKSlJo0eP1hNPPKHS0pb/H0y3260vvvhCkjRkyJAW/3wAAAAADYsMC9WfLzf/Xb200qX73t3E0iIAfuX3JUWdO3f2yTiffPKJbrzxRhUWntzkqrS0VGvXrtXatWv18ssva/78+UpLS/PJ59WlsrJSf/3rX2UYhnJzc/XNN99ox44duuWWW3Tuuef67XMBAAAANN+4tA66/ozuevO7A5621fvy9L/le/WTCb0trAxAa9aie7h0795dAwYM0IIFC5r0vg0bNuiaa65RWVmZYmNj9bvf/U6TJ09WWVmZ3n77bf33v//Vrl27NG3aNK1du1ZxcXF+qb+yslKPPvqo59pms+m+++7T3/72N798HgAAAADfePCigVqyK1uZx8o8bU98uVNn9++otE7ef38ornDq1WV75TakW8b3VHxkmD/KBdAK+D1weeihhzR69GiNHj1anTt31r59+9SrV68mjXHnnXeqrKxMdrtdCxYs0NixYz33zjnnHPXt21f333+/du3apSeffFKPPPJIrTHuvfdeVVRUNOkz+/bta2qLjY2VYRhyu906dOiQPvnkEz344INauXKlPvvsM8XHxzfpuQAAAAC0jNgIu/5x1TBd+9Iq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b19uqa56caV+P29znafJuAJkhktOcYXVJfhNU/OWIwXlmvbcUj32+Q7d8uoafbA+0y91ecPhcuvnr6/XsD8u0Dn/WKxthwotqwV1I3ABAAAAAD+KjwzTM9eO0NPXDFNshL3W/ddXHdD5Ty3RV9uOmtodTndLldignOJKq0vwG1sTp7g89+1ulVaenE1yzzubfF2S1xbvzNYXW49Ikg7ml+nJBTstqwV1I3ABAAAAgBYwfUSKPvv1BI3onljr3pHCct322lr98o31yioqlyRVuuoOXHYeKfJnmV5pzRvpNmTZbu9OdpIkf/8SPfPNLtP1NzusX+IEMwIXAAAAAGgh3dtH693bx+r30wYqKiy01v35mw/rvCcXa86q/Sp31B24HCks93eZjWot28twShH8icAFAAAAAFqQPTREP5nQWwvunqgJfTvUul9Y7tQf5m3RJf9cVuf7Nxw45u8SG9VqNvRtYuLSnE120XYRuAAAAACABVKTovXarWP09DXD1C46rNb94nqOjX7m693+Lq1RreXIalsTExdfPLavQhtva9lysED3vrNJf/9ih8oqOc2oJdXesQkAAAAA0CJsNpumj0jRxL4d9ef52/XhhoNWl+SVVpK3tHolFU5d9eJKlTmqgpZjpZX6249Os7iqtoPAJUAMHjzYdO1w1D4WDgAAAEDr1D42Qk9fM1xXjUrRH+Zt0Q/ZJQ32/z4zX6elJHo9vq83uW0tM1wMNe05fDE7pSV/6QrLzbOk3lqdYQpcDMPQ51uO6FhppS4b3q3OU7TQfPxqAgAAAECAOKtPB31+50S9vGyP/v5F/cf8Xvr8cr144+m6YEiyV+P6essVVwsHLi63oa+2HZE9JETnDuzU5OOcreDvX6Lmjv/b977X51sOa1hqopITIvXO2kxJ0msr9uuLuyYExa9tsCBwCRBbt241XWdmZio1NdWiagAAAABYJdweol+cnaZLTuuqCX9fWG+/n72+XtNOS9b9U/urR/uYBsf09YyU3UeLNLJH0imNYRiGPv3+sHZnFeuy4V3Vp2NsvX1/+cZ6fbH1iCTp+jO666/Th57SZ58swjfDNIXVecbctRmSpKU1jrjeebRIi3Zla3L/TlaU1SqxaS4AAAAABKDUpGjt+etFunJkSr195n9/WOc9tViPfLxVucUV9far71ShckfzNlFdvffUT0p6fdV+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8HTv3j1dunTJiBEjcuutt5ZdFrQZN954Y84888wMGzYsnTp1Sk1NTSZOnFh2WdAmvPLKK7niiityyCGHZJtttknHjh3Tu3fvfOYzn8nvf//7ssuDVm/RokU599xzs99++6Vv377p3LlzevfunZEjR2bChAlZsmRJ2SVCm3T55ZenpqYmNTU1eeihh8ouZ63UVCqVStlFQJLce++9OfTQQ9O5c+cce+yx2WSTTfKzn/0ss2fPzne+852cd955ZZcIrV7//v0ze/bs9OzZM126dMns2bMzYcKEnHzyyWWXBq3e+eefn8svvzwf+9jHcsABB6RXr16ZOXNmfvGLX6RSqeSmm27KMcccU3aZ0GrNmzcv/fr1y/DhwzNw4MD06tUrb7/9du68887Mnj07hxxySO688860a+d31rChPPnkkxk2bFhqa2vz/vvvZ/r06RkxYkTZZTWZwIWqUFdXl0GDBmXOnDl56KGHMnTo0CTJ/PnzM3z48MyaNSvPPvtstt1223ILhVZuypQp2WGHHbLttttm/PjxueCCCwQusIH8/Oc/z+abb57999+/wfv3339/xowZk65du+bVV19Np06dSqoQWrdly5alrq4uHTt2bPB+XV1dDj744EydOjW/+tWvMnbs2JIqhLZlyZIlGTFiRDp06JAddtghN954Y4sLXMSzVIV77rknzz//fI4//vj6sCVJNt1001x44YVZvHhxbrjhhvIKhDbioIMOEmxCST796U83CluSZNSoURk9enTefvvtPPHEEyVUBm1Du3btGoUtSVJbW5t//Md/TJI899xzG7osaLMuvfTSPPXUU7n++uvTvn37sstZJwIX8vrrr+dXv/pVLrroonziE59Iz54965+RW9vfas+ePTvnnXdeBg0alC5duqRHjx7Zc8898x//8R9ZsGDBKs+bOnVqkuSQQw5ptO/QQw9Nktx3331rVQu0JNXQh9CWVXsPdujQIcnyH/ygNarmHly2bFl+/etfJ0l23nnntT4fWopq6sNHH300l156aS6++OIMHjx4He+ofL61yZZbblnIdSZPnpwTTzwx7777bv17CxYsyIwZMzJjxoxce+21uf322zNgwIBG586cOTNJssMOOzTa17t373Tt2rX+GGiNqqEPoS2r5h586aWXMmXKlPTp0ye77LJLIXVCtammHly8eHG+9a1vpVKp5M0338zdd9+dZ555JqecckrGjBlTSJ1QjaqlDz/44IOcdNJJGTp0aL7xjW8UUlNZjHChgW222Walo0zW5LHHHssxxxyTd999N127ds2ll16aadOm5e67784ZZ5yRJHn22WczduzY/O1vf2t0/vz585Msf4RoZbp161Z/DLR2ZfUhsFw19eCSJUvyuc99Lh988EEuv/zyFjukGtZG2T24ePHi/Ou//msuueSSXHnllfnLX/6Sr33ta7nmmmvW+Z6gpSmzDy+66KLMnDkzEyZMaPnfexXavIsuuqgyefLkymuvvVapVCqVF198sZKkkqQybty4Jl1j1KhRlSSV2trayrRp0xrt//a3v11/zYsvvrjR/oMPPriSpDJz5syVXr9v376Vbt26NfmeoKWphj78qMsuu6ySpDJhwoS1uBNomaqxB5cuXVo5/vjjK0kqZ5xxxtrcDrQ41dqDL7/8cuW//uu/Kt27d6+MHDmyMn/+/LW5LWhRqqEPp02bVmnXrl3lkksuafD+uHHjKkkq06dPX+v7KpPAhUbWtrF+//vf1x9/5plnrvSYpUuXVnbcccdKkkr37t0rixcvbrD/qKOOqiSpzJgxY6Xnd+3atdKvX7+1vhdoqcrow48SuNCWld2DS5curf/H5YknnlhZunTput4KtEhl9+BH3XrrrZUklW984xtNPgdaug3dh0uWLKnssMMOlaFDhzbqz5YauHikiPX2i1/8on77lFNOWekx7dq1y0knnZQkeeedd3Lvvfc22P/h3C0rm6fltddey3vvvbfS+V2A5YroQ2DdFdmDy5YtyymnnJIbbrghxx13XCZOnJh27fyTDVanub8HP3y04sOFHoDG1rcP33vvvcycOTOPP/54OnbsWD9hb01NTf2KtXvvvXdqamoafFY18+3NenvggQeSJF26dMkee+yxyuNWXOrywQcfXOm+u+66q9F5v/nNbxqdDzRURB8C666oHvwwbJk0aVKOOeaY/PjHP275z6/DBtDc34Nz585N8j8rhgGNrW8fdurUKaeddtpK/3z4y/d/+Id/yGmnnZb+/fs3z00UzCpFrLenn346STJgwIDVLlc5aNCgRud8aMyYMdl+++1z00035ctf/nKGDh2aZPlkut/61rfSsWPH+iQUaKyIPgTWXRE9uGzZspx66qmZNGlSjj766Nx4443CFmiiInrwz3/+c/r375+NN964wfsLFizIueeemyQ5/PDDiyoZWp317cONNtoo11577UrPOfnkkzNz5sxccMEFGTFiREEVNz+BC+tl0aJFmTdvXpJk6623Xu2xm222Wbp06ZL3338/L7/8coN9tbW1ufbaa3PooYdmv/32y7HHHptNNtkkP/vZzzJ79ux85zvfaTEpJmxoRfVhklx77bX1v5144okn6t/7cAj1vvvum9NPP73A6qHlK6oHL7nkktxwww3p2rVrBg4cmH//939vdP6RRx5Z/0sJYLmievDWW2/Nd7/73ey7777p379/unXrlldeeSV33nln3nzzzYwaNSpf/epXm+0+oCUr8t+jrYnAhfWy4lJeXbt2XePxHzbWe++912jf6NGj88ADD+Tiiy/OLbfckiVLlmSXXXbJ5ZdfnmOOOabQuqE1KbIPH3jggfpnZD/04IMPNhjuKXCBhorqwVmzZiVZ/gz7pZdeutJz+/fvL3CBjyiqB4844ojMnTs306ZNy/Tp0/Pee+9l0003za677ppjjz02p5566mp/aw9tWZH/Hm1N/D8G62XRokX12x07dlzj8Z06dUqSLFy4cKX7hw8fnjvvvLOY4qCNKLIPJ06cmIkTJxZWG7QFRfWg/oN1U1QPDhs2LMOGDSu2OGgjiv658KNa6nekSXNZL507d67fXrx48RqP/+CDD5Isfz4PKIY+hHLpQSiXHoTy6cOVE7iwXjbZZJP67aYMB3v//feTNG2YGdA0+hDKpQehXHoQyqcPV07gwnrp3LlzNt988yTJnDlzVnvs22+/Xd9Y/fr1a/baoK3Qh1AuPQjl0oNQPn24cgIX1tvgwYOTJM8991zq6upWedwzzzxTv73jjjs2e13QluhDKJcehHLpQSifPmxM4MJ623fffZMsHxb2hz/8YZXH3XffffXbI0eObPa6oC3Rh1AuPQjl0oNQPn3YmMCF9XbkkUfWb0+YMGGlxyxbtiyTJk1KknTv3j2jR4/eEKVBm6EPoVx6EMqlB6F8+rAxgQvrbfjw4Rk1alSS5Lrrrsv06dMbHfOf//mfefrpp5MkX/nKV9KhQ4cNWiO0dvoQyqUHoVx6EMqnDxurqVQqlbKLoFwPPPBAnnvuufrX8+bNy9e//vUky4d4nX766Q2OP/nkkxtd47HHHsvIkSOzcOHCdO3aNRdeeGFGjx6dhQsX5uabb84111yTJBk4cGBmzJjRYBZrQB9C2fQglEsPQvn0YfEELuTkk0/ODTfc0OTjV/WfzOTJk3PiiSfm3XffXen+gQMH5vbbb8+AAQPWqU5ozfQhlEsPQrn0IJRPHxbPI0UU5pOf/GT+9Kc/5atf/WoGDhyYjTfeON27d8+wYcNy+eWX57HHHmsTTQVl0odQLj0I5dKDUD59+D+McAEAAAAomBEuAAAAAAUTuAAAAAAUTOACAAAAUDCBCwAAAEDBBC4AAAAABRO4AAAAABRM4AIAAABQMIELAAAAQMEELgAAAAAFE7gAAAAAFEzgAgAAAFAwgQsAAABAwQQuAAAAAAUTuAAAAAAUTOACAAAAUDCBCwAAAEDBBC4AAAAABRO4AABUsVmzZqWmpiY1NTWZOHFi2eUAAE0kcAEAqtLUqVPrg4am/jnnnHPKLhsAIInABQAAAKBwtWUXAACwJmeddVa+8IUvrPG4nj17boBqAADWTOACAFS9LbbYIjvvvHPZZQAANJlHigAAAAAKJnABAFqt/v37p6amJieffHKS5JFHHslxxx2Xfv36pXPnzunXr19OOeWUPPPMM0263uTJk3PUUUdl6623TqdOnbL55ptn7733zvjx4/Pee+816RpPPvlkvvSlL2WXXXbJZpttlg4dOqR379456KCD8u1vfzuvvvrqGq/x29/+Np/85CfTu3fvdOrUKdttt13OOuuszJkzZ7XnzZ07N+eff3523333bLrppunQoUO23HLL7LLLLjnuuOMyceLEvPvuu026DwBg9WoqlUql7CIAAD5q6tSpGT16dJLk4osvzr/8y7+s9TX69++f2bNnZ9y4cdlvv/1y5plnpq6urtFxnTp1yo9//OMcffTRK73OokWLcvzxx+e2225b5Wf17ds3t99+e4YOHbrS/UuXLs3Xv/71XHHFFVndP7/GjRvXYPnnWbNmZbvttkuSTJgwIX/5y18yfvz4lZ7bq1ev3Hfffdlxxx0b7bv//vtzxBFHrDFQmTx5co444ojVHgMArJk5XACAVu/xxx/PTTfdlC222CIXXHBBhg8fnkWLFuWOO+7IFVdckQ8++CAnnHBCtttuuwwbNqzR+ePGjasPW4YMGZLzzjsvO+64Y956663cfPPNmThxYubOnZsxY8bkT3/6U7baaqtG1/j85z+f66+/PknSp0+fnH322dlnn32y6aab5o033sjDDz+cn/70p6u9jx/96EeZNm1a9t9//5x55pkZOHBg3nnnnUyaNCmTJk3KG2+8kVNPPTXTp09vcN4HH3yQY489Nu+++2422WSTnHXWWRk9enS22GKLLF68OC+++GKmTZu22kAJAFg7RrgAAFVpxREuTV2l6OMf/3g6dOhQ//rDES5Jsu222+ahhx5K7969G5xz77335pBDDkldXV323HPPPPzwww3233777fUjPsaMGZM77rgjHTt2bHDMj370o3z+859Pknz2s5/NLbfc0mD/L3/5y3zqU59Kkuy9996544470r1795Xew8svv5x+/frVv15xhEuSnHHGGbn66qtTU1PT4Lwzzjgj1157bZLk0UcfzW677Va/75577smYMWOSrH4ES11dXRYsWJBu3bqtdD8A0HQCFwCgKq0YuDTViy++mP79+9e/XjFw+elPf5rPfOYzKz3vC1/4Qq666qoky+d5WXGUy+GHH54777wzHTp0yPPPP98gDFnRwQcfnClTpqS2tjYvvfRS+vTpU79vn332yfTp07Pxxhtn5syZ6du3b5PvacXApU+fPnnxxRfTqVOnRsf95S9/yaBBg5Ik3//+9/PlL3+5ft9NN92UE044IUkyf/58gQoAbAAmzQUAWr3NNtusfoTJypx66qn121OmTKnfrqury3333ZckOeSQQ1YZtiTLR5h8eM7UqVPr33/zzTfz0EMPJUmOOeaYtQpbPuqoo45aadiSLB/d07Vr1yTJCy+80GDfiuHPhAkT1vnzAYCmE7gAAFXv4osvTqVSWeOfFUe3rGi33XZLbe2qp64bOnRo/WNCTzzxRP37L7zwQhYsWJAk2WuvvVZb44r7n3zyyfrtxx9/vH6S3FGjRq3+RtfgwxEsq7LZZpslSf72t781eH/ffffN9ttvnyQ555xzMnz48Fx22WV58MEHs3jx4vWqCQBYOYELANDqbbHFFqvdX1tbmx49eiRJ3nrrrfr3V9xe0zVWnBtmxfPmzZtXv73iSJN1sfHGG692f7t2y/9pt3Tp0gbvd+jQIZMnT65fveiRRx7JhRdemH333Tfdu3fPYYcdlptuuqnReQDAuhO4AACt3kcnmC3rGmUaPHhwnnjiidx222059dRTM2DAgCTJwoUL85vf/CYnnHBC9tprr7z++uslVwoArYPABQBo9f7617+udn9dXV39qJQPR7p8dHtN13jttddWel7Pnj3rt1999dWmFdxM2rdvnyOPPDLXXXddZs6cmblz5+b666/PHnvskST5wx/+kDPPPLPUGgGgtRC4AACt3uOPP566urpV7v/jH/9YP5fJzjvvXP/+9ttvX/8Yz+9///vVfsaKy0mveI3ddtutfnTM7373u7Uvvhn16dMnp5xySqZPn57dd989SfKrX/0qCxcuLLkyAGj5BC4AQKv31ltvZfLkyavcf/3119dvH3TQQfXbtbW12X///ZMkv/3tbzNnzpxVXuPaa6+tP+eAAw6of79Hjx7ZZ599kiS33npr5s6du0730Jw6dOhQf591dXV55513yi0IAFoBgQsA0Cace+65K30s6L777ss111yTJNljjz2y5557Ntj/xS9+MUmyePHinHbaaVmyZEmja1x//fW56667kiSf/vSnG02O+81vfjNJsmDBghx99NGZP3/+KutcXaizru6///4899xzq9y/ePHi+uWvu3btml69ehVeAwC0NateHxEAoEq8/vrrDZZaXpWNNtooH/vYxxq9P2TIkPz5z3/OHnvskQsuuCDDhw/PBx98kDvuuCPf+973UldXl9ra2lx55ZWNzh07dmyOPvro/OQnP8ldd92VESNG5Nxzz82gQYPy9ttv5+abb64fIdOjR49897vfbXSNT37ykznttNNy3XXXZdq0aRk8eHDOPvvsjBw5Mt26dcu8efMyY8aM3HLLLRkyZEgmTpy49v8jrcbdd9+df/u3f8uoUaMyduzY7LrrrunVq1cWLlyYZ599Nj/84Q/z6KOPJklOO+201S6hDQA0jW9TAKDqXXXVVbnqqqvWeNyQIUPy+OOPN3p/6NChOfvss3PWWWfl7LPPbrS/Y8eOueGGG7LXXnut9LqTJk1KXV1dbrvttjz66KM58cQTGx3Tt2/f3H777dlqq61Weo2rr746G220Ua688srMnTs3F1544SrvoTksW7Ys9913X/1IlpX51Kc+lcsuu6xZPh8A2hqBCwDQJpx++unZeeed873vfS8PPPBA5s2bl169emXMmDH55je/mcGDB6/y3M6dO+fnP/95Jk+enIkTJ+ahhx7KvHnz0qVLlwwcODBHHnlkzj777HTt2nWV12jfvn1+8IMf5JRTTsnVV1+dqVOn5pVXXsnixYuz+eabZ9ddd81hhx2Wz33uc4Xf+9e+9rXsuuuumTJlSh577LHMnTu3fvnn3r17Z/jw4TnppJMyduzYwj8bANqqmkqlUim7CACA5tC/f//Mnj0748aNK/wxHQCA1TFpLgAAAEDBBC4AAAAABRO4AAAAABRM4AIAAABQMIELAAAAQMGsUgQAAABQMCNcAAAAAAomcAEAAAAomMAFAAAAoGACFwAAAICCCVwAAAAACiZwAQAAACiYwAUAAACgYAIXAAAAgIIJXAAAAAAKJnABAAAAKJjABQAAAKBgAhcAAACAgglcAAAAAAomcAEAAAAomMAFAAAAoGACFwAAAICCCVwAAAAACiZwAQAAACiYwAUAAACgYP8fvkbqNtxpNwAAAAAASUVORK5CYII=",
+ "image/png": "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JGP27NlOvW/atGmO99xwww2m17744gvD19fX8XpZP6655hrj2LFjZd5r1apVjvkDBw4sdV7hdcuSlpZm/PrXvy6zrn79+hmnT582pkyZ4hibM2dOiett3LjRCAoKcurzRkdHG9u3by9xnTlz5ji1Rkmf8fjx447xVq1alfn509PTjXHjxpW7frNmzYz//Oc/Za711FNPOeY/9dRTRnx8vNGnT58y1502bZpRUFBQ5rrOcubX57Jly5YZTZs2LfdzT5gwwcjIyChzrXfffdfw9/d36tepb9++Ja5x8OBBo2PHjk7/eh8+fLiyP02GYZh/f5X3e8QwDOPQoUOm+3/88celzi38+0+SkZWVZSxevNhxPWvWrFLf+/TTTzvmffbZZ0ZWVpZprePHjxd7z2effeZ43WazGenp6c78FJSr6Oco6d4AAGvQzBoAgBri4+Oj8ePH61//+pekS0dAHn744TLfk5WVpc8//9xxXbSJ9blz55STkyNJioyMVKdOndS0aVMFBAQoPT1d+/fv1/bt22UYhn7++WcNGDBAO3furJHjIHl5eRo+fLjWrFnjGGvatKkGDBig4OBgHTlyRD/99JN++uknjRo1Sq1bty53zaSkJKWnp0u6tJOic+fOioyMVGBgoDIzM3XkyBFt3rxZ+fn5io2N1cCBA7V9+3a1bdvWtE7Hjh314IMPKi0tzXEUp6SnU1VFZmambrrpJtMOlebNm6t///4KCgpyfP6CggKdPn1at912mz755BPdeeed5a6dnp6uYcOGac+ePQoICFD//v0VFRWltLQ0rVq1SufOnZN0qd/NVVddpT/96U8u+1zlWbRokSZOnKiCggJJl45W9evXT23btlV6errWrl3r2DGzcOFCHT9+XD/88IP8/PyKrbV06VLdf//9juuQkBDdcMMNioyMlJeXl1JSUnTo0CHt2bOn1B1kaWlpuvnmmx2Pnvfw8FD37t3VsWNHBQUFKTMzU6dOndLPP/+sCxcuuPqnwylFdxA1adKkQu+/7bbbFBYWpuTkZH300UeO3WdFXf693qBBA40YMcKppuxt2rRxfG0Yhv7xj3/omWeeqVB9AIBaxuKgCgCAemXz5s2m/xd9165dZc7/+OOPHXN9fX2NpKQk0+tff/218fzzz5e5A+LYsWPG0KFDHevcc889pc515Y6iZ5991rQT4bnnnjPy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VzWWCixevFjffPONwsPD9c9//tMla/r7++vZZ5+VzWbTrl27NGTIEKWkpJQ41zAM3X///VqwYIEkacKECbr22mtdUkdF/PTTT5KkwMDAMu9fOEhbt26dy+u4HBLNnz9f48aN04IFC+hLBAAAAABAPVcjQVFycrJmzJghSXrxxRcVERHhsrXvvvtuvfnmm5Kkbdu2adiwYSU2gJ4+fbref/99SdK4ceP04YcfymazuawOZ+3fv1+S1LZt2zIfQd+hQ4di73GVy8fN5s+frzFjxuijjz4iJAIAAAAAADXTo+jRRx/VmTNn1LdvX91zzz0uX/93v/udsrKy9Mgjj2jjxo0aPny4vvvuOwUEBEiSHn74Yb311luSpJEjR1oWjGRnZ+vChQuSpMjIyDLnNmjQQIGBgcrIyFBcXJxL63j22Wc1b948BQUFqX379vrb3/5WbM7IkSPVrVs3p9br3Lmz6TovL88VZQIAAAAAgBpW7UHR2rVr9f7778vLy0vvvPNOte3imTlzprKysvTkk09q7dq1GjFihJYvX65nn31Wr7zyiiTplltu0aJFi8rcyVOdCu90CgoKKnf+5aAoPT3dpXXExsZKutTn6LnnnitxTnR0tNNBEQAAAAAAqBuqNTHJzc3VfffdJ8Mw9NBDD6lLly7VeTs98cQTyszM1PPPP68ffvhBXbp00dGjRyVdeuz8kiVL5OPjU601lCU7O9vxtTN1+Pr6SrrUtNuV5s6dq7lz57psvb1795qu4+PjFRUV5bL1AQAAAABAzajWHkV///vfdeDAAbVs2VJPPfVUdd7KdM8//OEPkuQIifr166evv/5afn5+NVJDaQrfPzc3t9z5OTk5ki417QYAAAAAAKhu1RYUHThwQM8//7wk6Y033lBgYGB13aqYli1bmq4bN25seUgkScHBwY6vnTlOlpGRIcm5Y2oAAAAAAABVVW1Hz1555RXl5uaqdevWyszM1Kefflpszp49exxf//DDDzpz5owkacSIEZUOlt5++209/PDDkqSGDRvq4sWLWrJkiSZPnqwFCxbIw6NGHvRWIj8/P0dN8fHxZc5NSkpyBEUc4wIAAAAAADWh2oKiy8emjh07pvHjx5c7/69//avj6+PHj1cqKPrwww/14IMPSpJ69OihlStX6pFHHtGHH36ohQsXytfXVx988EG1NdR2RqdOnbR27VodOXJE+fn5pTbWPnDggOPrjh071lR5AAAAAACgHrNue42LLVy4UPfee68Mw1DXrl21YsUKNWjQQP/+9781ceJESdKcOXP0wAMPWFpnv379JF06VrZt27ZS5/3444+Or/v27VvtdQEAAAAAAFRbUDR37lwZhlHmj8INrletWuUYj46OrtC9vvjiC02ePFl2u10dO3bUypUr1bBhQ0mSh4eH5s2bpzFjxkiS3n33Xc2YMcNln7OiRo4c6fh6zpw5Jc6x2+2aP3++JCksLEyDBg2qidIAAAAAAEA9V+t3FC1btkzjx49XQUGB2rVrp++//16NGzc2zfH09NTChQt1++23S5Jef/11Pfroo1aUq969e6t///6SpA8++EAbNmwoNmf27Nnav3+/JGnGjBny9vau0RoBAAAAAED9VG09impCVlaW7r33XuXl5SkmJkbff/+9mjVrVuJcLy8vLV68WCNHjtS3336rl156SXfeead69+7t9P1++uknHTlyxHF94cIFx9dHjhzR3LlzTfOnTp1a4jqvvfaa+vbtq6ysLA0ZMkSPP/64Bg0apKysLH366ad67733JEnt27fXzJkzna4PAAAAAACgKmp1UOTv768lS5bonnvu0bffflvu08F8fHy0ZMkSjRgxQsOHD69QSCRJ77//vubNm1fia+vWrdO6detMY6UFRd27d9eiRYt01113KTU1VY8//nixOe3bt9fy5csVHBxcoRoBAAAAAAAqq1YHRZLUp08f7dmzR56enk7N9/Pz03fffef0/OoyYsQI7dq1S6+99pqWL1+u+Ph4+fj4qG3bthozZoymT5+ugIAAS2sEAAAAAAD1i80wDMPqIlC3xMfHO3Z3xcXFKTIy0uKKAAAAAACoe6rj++9a38waAAAAAAAArkFQBAAAAAAAAEkERQAAAAAAAPgFQREAAAAAAAAkERQBAAAAAADgFwRFAAAAAAAAkERQBAAAAAAAgF8QFAEAAAAAAEASQREAAAAAAAB+QVAEAAAAAAAASQRFAAAAAAAA+AVBEQAAAAAAACRJXlYXgLrt+/1nFZHoaXUZTosI8lGPVg3k7UmGCgAAAACofwiKUK3+8uUeeYWcsbqMCmkU7Ks7erTQ2J5RatMoyOpyAAAAAACoMQRFQBHn03L07o/H9O6Px9SzVQON7RWl4V2bKdCX/1wAAAAAAHUb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HnlEDz74oB555JFi+z08PDRnzhx1797dZr9z585Vfn6+vv32W23ZskWjR48u1iYsLEyLFi1So0aNbPbx4Ycfqk6dOvrf//6n5ORkPfvssyW+BkcoLCzUihUrLDOHbLnxxhs1depUh5wfAIDahKAIAACgirvvvvvUrl07/fvf/9bq1auVkpKiBg0aaODAgfr73/+uNm3alHisl5eXFixYoIULF2r27Nn6448/lJKSIh8fH0VFRWnkyJF65JFH5OvrW2Ifrq6uevfddzVu3Dh9+OGHWr58uZKSkpSbm6ugoCB16NBB119/ve655x67v/annnpKHTp00NKlS7V161YlJyfr5MmTkqSGDRsqJiZG9957r4YNG2b3cwMAUBuZzGaz2egiAAAAYC0yMlLx8fEaM2aM3S/nAgAAKAmLWQMAAAAAAEASQREAAAAAAACKEBQBAAAAAABAEkERAAAAAAAAihAUAQAAAAAAQBJ3PQMAAAAAAEARZhQBAAAAAABAEkERAAAAAAAAihAUAQAAAAAAQBJBEQAAAAAAAIoQFAEAAAAAAEASQREAAAAAAACKEBQBAAAAAABAEkERAAAAAAAAihAUAQAAAAAAQBJBEQAAAAAAAIoQFAEAAAAAAEASQREAAAAAAACKEBQBAAAAAABAEkERAAAAAAAAihAUAQAAAAAAQBJBEQAAAAAAAIoQFAEAAAAAAEASQREAAAAAAACKEBQBAAAAAABAkvT/N8byz+taHPoAAAAASUVORK5CYII=",
"text/plain": [
""
]
@@ -491,11 +410,91 @@
"output_type": "stream",
"text": [
"Saving model MLP\n",
- "End time reached.\n"
+ "End time reached.\n",
+ "12:19:16 mma120347 SmartSim[424529:JobManager] INFO of_model(424752): SmartSimStatus.STATUS_COMPLETED\n"
]
}
],
"source": [
+ "#!/usr/bin/python3\n",
+ "\n",
+ "# Parsing OpenFOAM configuration files\n",
+ "from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile\n",
+ "import os\n",
+ "import sys\n",
+ "import pandas as pd\n",
+ "\n",
+ "# SmartSim\n",
+ "from smartsim import Experiment\n",
+ "from smartredis import Client\n",
+ "\n",
+ "from matplotlib import pyplot as plt\n",
+ "from matplotlib import rcParams\n",
+ "rcParams[\"figure.dpi\"] = 200\n",
+ "\n",
+ "import torch\n",
+ "import torch.nn as nn\n",
+ "import numpy as np\n",
+ "import io\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "import torch.optim as optim \n",
+ "\n",
+ "from sklearn.metrics import mean_squared_error\n",
+ "\n",
+ "# For calling pre-processing scripts\n",
+ "import subprocess\n",
+ "\n",
+ "class MLP(nn.Module):\n",
+ " def __init__(self, num_layers, layer_width, input_size, output_size, activation_fn):\n",
+ " super(MLP, self).__init__()\n",
+ "\n",
+ " layers = []\n",
+ " layers.append(nn.Linear(input_size, layer_width))\n",
+ " layers.append(activation_fn)\n",
+ "\n",
+ " for _ in range(num_layers - 2):\n",
+ " layers.append(nn.Linear(layer_width, layer_width))\n",
+ " layers.append(activation_fn)\n",
+ "\n",
+ " layers.append(nn.Linear(layer_width, output_size))\n",
+ " self.layers = nn.Sequential(*layers)\n",
+ "\n",
+ " def forward(self, x):\n",
+ " return self.layers(x)\n",
+ " \n",
+ "def sort_tensors_by_names(tensors, tensor_names):\n",
+ " # Pair each tensor with its name and sort by the name\n",
+ " pairs = sorted(zip(tensor_names, tensors))\n",
+ "\n",
+ " # Extract the sorted tensors\n",
+ " tensor_names_sorted, tensors_sorted = zip(*pairs)\n",
+ "\n",
+ " # Convert back to list if needed\n",
+ " tensor_names_sorted = list(tensor_names_sorted)\n",
+ " tensors_sorted = list(tensors_sorted)\n",
+ "\n",
+ " return tensors_sorted, tensor_names_sorted\n",
+ "\n",
+ "exp = Experiment(\"mesh-motion\", launcher=\"local\")\n",
+ "\n",
+ "db = exp.create_database(port=8000, # database port\n",
+ " interface=\"lo\") # network interface to use\n",
+ "exp.start(db)\n",
+ "\n",
+ "# Connect the python client to the smartredis database\n",
+ "client = Client(address=db.get_address()[0], cluster=False)\n",
+ "\n",
+ "# Read the number of mpi ranks from system/decomposePar dictionary\n",
+ "decompose_par = ParsedParameterFile(\"spinningDisk/system/decomposeParDict\")\n",
+ "num_mpi_ranks = decompose_par['numberOfSubdomains']\n",
+ "\n",
+ "of_rs = exp.create_run_settings(exe=\"moveDynamicMesh\", exe_args=\"-parallel\", \n",
+ " run_command=\"mpirun\", \n",
+ " run_args={\"np\": f\"{num_mpi_ranks}\"})\n",
+ "\n",
+ "of_model = exp.create_model(name=\"of_model\", run_settings=of_rs)\n",
+ "of_model.attach_generator_files(to_copy=\"spinningDisk\")\n",
+ "\n",
"try:\n",
" # Pre-process: clean existing data in spinningDisk.\n",
" res_allrun_clean = subprocess.call(['bash', 'spinningDisk/Allclean'])\n",
@@ -506,14 +505,19 @@
" print(f'Allrun.pre in spinningDisk executed with return code: {res_allrun_pre}')\n",
" \n",
" # Run the experiment\n",
+ " exp.generate(of_model, overwrite=True)\n",
" exp.start(of_model, block=False)\n",
"\n",
" torch.set_default_dtype(torch.float64)\n",
"\n",
" # Initialize the model\n",
- " model = MLP(num_layers=3, layer_width=50, input_size=2, output_size=2, activation_fn=torch.nn.Sigmoid())\n",
- " \n",
- " \n",
+ " model = MLP(num_layers=2, layer_width=20, input_size=2, \n",
+ " output_size=2, activation_fn=torch.nn.ReLU())\n",
+ "\n",
+ " # Initialize the optimizer\n",
+ " learning_rate = 1e-03\n",
+ " optimizer = optim.Adam(model.parameters(), lr=learning_rate)\n",
+ "\n",
" # Make sure all datasets are avaialble in the smartredis database.\n",
" local_time_index = 1\n",
" while True:\n",
@@ -582,13 +586,15 @@
" test_size=0.2, random_state=42)\n",
"\n",
" # PYTORCH Training Loop\n",
- " optimizer = optim.Adam(model.parameters(), lr=1e-04)\n",
" loss_func = nn.MSELoss()\n",
" epochs = 10000\n",
" mean_mag_displ = torch.mean(torch.norm(displ_train, dim=1))\n",
" validation_rmse = []\n",
" model.train()\n",
- " for epoch in range(epochs): \n",
+ " n_epochs = 0\n",
+ " for epoch in range(epochs): \n",
+ " \n",
+ " \n",
" # Zero the gradients\n",
" optimizer.zero_grad()\n",
"\n",
@@ -608,7 +614,13 @@
" mse_loss_val = loss_func(displ_pred_val, displ_val)\n",
" rmse_loss_val = torch.sqrt(mse_loss_val)\n",
" validation_rmse.append(rmse_loss_val)\n",
+ " if (rmse_loss_val < 1e-03):\n",
+ " break\n",
+ "\n",
+ " n_epochs = n_epochs + 1\n",
"\n",
+ " print (f\"RMSE {validation_rmse[-1]}, number of epochs {n_epochs}\")\n",
+ " \n",
" # Visualize validation RMSE\n",
" plt.loglog()\n",
" plt.title(\"Validation loss RMSE\")\n",
@@ -616,26 +628,6 @@
" plt.plot(validation_rmse)\n",
" plt.show()\n",
"\n",
- " # Visualize boundary points and displacements \n",
- " # points_np = points.detach().numpy()\n",
- " # displ_np = displacements.detach().numpy()\n",
- "\n",
- " # plt.axis('equal')\n",
- " # plt.title(f\"Boundary points and displacements at time step {local_time_index}\")\n",
- " # plt.scatter(points_np[:, 0], points_np[:, 1], color='blue', s=5)\n",
- " # plt.quiver(points_np[:, 0], points_np[:, 1], \n",
- " # displ_np[:, 0], displ_np[:, 1], color='green') \n",
- "\n",
- " # Visualize predicted boundary displacements \n",
- " # plt.axis('equal')\n",
- " # displ_pred = model.forward(points)\n",
- " # # Inverse transform the predictions\n",
- " # #displ_pred_np = torch.from_numpy(target_scaler.inverse_transform(displ_pred.detach().numpy()))\n",
- " # displ_pred_np = torch.from_numpy(displ_pred.detach().numpy())\n",
- " # plt.quiver(points_np[:, 0], points_np[:, 1], \n",
- " # displ_pred_np[:, 0], displ_pred_np[:, 1], color='red', width=0.002) \n",
- " # plt.figure()\n",
- "\n",
" # Store the model into SmartRedis\n",
" model.eval() # TEST\n",
" # Prepare a sample input\n",
@@ -673,7 +665,7 @@
{
"cell_type": "code",
"execution_count": null,
- "id": "fc6c5697-b188-4ea9-b996-d413579b7d7b",
+ "id": "f5fb1b46-0027-4f23-be8e-fc9c5f2220b7",
"metadata": {},
"outputs": [],
"source": []
diff --git a/tutorials/meshMotion/spinningDisk/0.orig/pointDisplacement b/tutorials/meshMotion/spinningDisk/0.orig/pointDisplacement
index b4927a7..ab67e67 100644
--- a/tutorials/meshMotion/spinningDisk/0.orig/pointDisplacement
+++ b/tutorials/meshMotion/spinningDisk/0.orig/pointDisplacement
@@ -24,7 +24,16 @@ boundaryField
cylinder
{
type solidBodyMotionDisplacement;
- solidBodyMotionFunction oscillatingRotatingMotion;
+
+ solidBodyMotionFunction oscillatingLinearMotion;
+
+ oscillatingLinearMotionCoeffs
+ {
+ amplitude (0 1 0); // Amplitude of oscillation in x direction
+ omega 4; // Angular frequency in rad/s
+ phase 0; // Phase shift in radians (optional)
+ }
+
multiMotionCoeffs
{
translation
@@ -42,10 +51,11 @@ boundaryField
{
origin (0 0 0);
axis (0 0 1);
- omega 1; // rad/s, 1rad/s=9.5rpm
+ //omega 1; // rad/s, 1rad/s=9.5rpm
}
}
}
+
oscillatingRotatingMotionCoeffs
{
origin (0 0 0);
diff --git a/tutorials/meshMotion/spinningDisk/Allrun.post b/tutorials/meshMotion/spinningDisk/Allrun.post
index fa7de27..a55743b 100755
--- a/tutorials/meshMotion/spinningDisk/Allrun.post
+++ b/tutorials/meshMotion/spinningDisk/Allrun.post
@@ -3,6 +3,6 @@ cd "${0%/*}" || exit # Run from this directory
. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
#------------------------------------------------------------------------------
-runApplication checkMesh -constant -writeAllFields
+runApplication mpirun -np 4 checkMesh -constant -writeAllFields -parallel
#------------------------------------------------------------------------------