* [gentoo-commits] repo/proj/guru:dev commit in: sci-physics/SU2/files/, sci-physics/SU2/
@ 2020-07-13 18:59 Sergey Torokhov
0 siblings, 0 replies; 7+ messages in thread
From: Sergey Torokhov @ 2020-07-13 18:59 UTC (permalink / raw
To: gentoo-commits
commit: cf1b13bcfb31ad502dce94232ef5200c54131194
Author: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
AuthorDate: Mon Jul 13 18:58:12 2020 +0000
Commit: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
CommitDate: Mon Jul 13 18:58:12 2020 +0000
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=cf1b13bc
sci-physics/SU2: 7.0.6 version bump
Signed-off-by: Sergey Torokhov <torokhov-s-a <AT> yandex.ru>
sci-physics/SU2/Manifest | 3 +
sci-physics/SU2/SU2-7.0.6.ebuild | 115 ++++++++++++++++++++++++++
sci-physics/SU2/files/SU2-7.0.6-fix-env.patch | 12 +++
3 files changed, 130 insertions(+)
diff --git a/sci-physics/SU2/Manifest b/sci-physics/SU2/Manifest
index 87318f5..a448103 100644
--- a/sci-physics/SU2/Manifest
+++ b/sci-physics/SU2/Manifest
@@ -4,3 +4,6 @@ DIST SU2-7.0.4.tar.gz 20516147 BLAKE2B 21f45e4918bbc6a72bf47ad61d3301abed50a7cf5
DIST SU2-7.0.5-TestCases.tar.gz 444209661 BLAKE2B a7b14a3ee679a28a3a4530ddca45f39fdc2c0bc5f29fe20e6c9f04d03dee6ca08f98648989b0160ee8742621b539e2f4af9e8bdfb802c3e460a9f3b7e1be3dda SHA512 f21acbaccce66685323566a3f856ceb5fbd36764a8dea875af839520b46be8f7e26491ccb855243f93e4ae948534574080e986faafc2a84c86754fe39f74e240
DIST SU2-7.0.5-Tutorials.tar.gz 64282246 BLAKE2B 9c8823df5bbda1be80f03dfa6d9de4b4263904acbee15f6928d3758a9b25c84ace59bf02847798838cbf3236961f51589e851e342f288961b2f2a62e28de216c SHA512 2b7c98cc4d060c850572e45418d4ddf38843ced3349a3fb807c1d32f0e5aabf578f8944918e3fc63a32161385eaf69b4742d24ef41d21b43006d5b881a89953b
DIST SU2-7.0.5.tar.gz 20526328 BLAKE2B 0c3b16269f9d8356eaecde991853fe184188b98df62186c56780ee34b26995763adbac0acca53db1625ac9b0dfadc3348eac792e700e66be00a174ff056e017d SHA512 283da35aa4f6bac4d7451506c6b84d98a18dfe7630adfc17764511fba8171b15c36ee80807bbfc1c55e39e196f8ed304fff3eb1182dfac15aa6a86a9613e51ad
+DIST SU2-7.0.6-TestCases.tar.gz 447944839 BLAKE2B 5212ef7bf69bb40120ca2af99a02f2a89ae6cc0a1e048e57409ee1d2911f930452f4a5ef668126d6b7144c3f81d50bdadd0bcc810f0472740ccbbb6605e5a07d SHA512 c976450e7e17df58b47cbf14d18c4435f977a70dc086d5b74ea584ae14b3204632ef87b2dce6a456396179f1b72ef8eba83065a42d978b8d6966d5446decbd3c
+DIST SU2-7.0.6-Tutorials.tar.gz 64282244 BLAKE2B 3b0ce136c9fa5c3e0ffc585e28b1a60470eeaf2518cbef539fccc185f79cd41a889e3c3c8a0ada3f488cfe1d2d0115e2768267c6ef4502b882b07f909f6f382c SHA512 4aaf39b98cbbe4c9e12d78027b0ee2b3d30fd614d1e48092d8bfd25c312a06a1621b2192653a7d8ac767762b06ae339ab6fb77e81f833efdb419ce09f92dec2f
+DIST SU2-7.0.6.tar.gz 20531872 BLAKE2B 30e59bc6876223d87429b79f101a5705f989096a1b81725aa20012567d15b08b6a8a24140cc76b35c6c3657a1d6afa85d56da699ab38dac85714e296d7ad8531 SHA512 a4619dd969c6d9cb20de1d373c8e0af9d56654f9f96d919662897db4c3c8bf52b45fb1239065d480ba1b4f05ba7a17c9540ff3fe47fb0d96864736200cda8bcc
diff --git a/sci-physics/SU2/SU2-7.0.6.ebuild b/sci-physics/SU2/SU2-7.0.6.ebuild
new file mode 100644
index 0000000..d8a4c42
--- /dev/null
+++ b/sci-physics/SU2/SU2-7.0.6.ebuild
@@ -0,0 +1,115 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6,7,8} )
+
+inherit meson python-single-r1
+
+DESCRIPTION="SU2: An Open-Source Suite for Multiphysics Simulation and Design"
+HOMEPAGE="https://su2code.github.io/"
+SRC_URI="
+ https://github.com/su2code/SU2/archive/v${PV}.tar.gz -> ${P}.tar.gz
+ test? ( https://github.com/su2code/TestCases/archive/v${PV}.tar.gz -> ${P}-TestCases.tar.gz )
+ tutorials? ( https://github.com/su2code/Tutorials/archive/v${PV}.tar.gz -> ${P}-Tutorials.tar.gz )
+"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="~amd64"
+
+# cgns, metis, parmetis are bundled;
+# omp is disable as it's experimental;
+# pastix is disabled as it's try to find bundled libs;
+IUSE="cgns -mkl +mpi openblas tecio test tutorials"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="
+ ${PYTHON_REQUIRED_USE}
+ mkl? ( !openblas )
+"
+
+RDEPEND="
+ ${PYTHON_DEPS}
+ mpi? ( virtual/mpi[cxx] )
+ mkl? ( sci-libs/mkl )
+ openblas? ( sci-libs/openblas )
+"
+DEPEND="
+ ${RDEPEND}
+ tecio? ( dev-libs/boost:= )
+"
+BDEPEND="virtual/pkgconfig"
+
+PATCHES=(
+ "${FILESDIR}/${P}-fix-env.patch"
+ "${FILESDIR}/${PN}-7.0.4-unbundle_boost.patch"
+ "${FILESDIR}/${PN}-7.0.4-fix-python-optimize.patch"
+)
+
+DOCS=( "LICENSE.md" "README.md" "SU2_PY/documentation.txt" )
+
+src_unpack() {
+ unpack "${P}.tar.gz"
+ if use test ; then
+ einfo "Unpacking ${P}-TestCases.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}/TestCases"
+ tar -C "${P}"/TestCases --strip-components=1 -xzf "${DISTDIR}/${P}-TestCases.tar.gz" || die
+ fi
+ if use tutorials ; then
+ einfo "Unpacking ${P}-Tutorials.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}"
+ mkdir "${P}"/Tutorials
+ tar -C "${P}"/Tutorials --strip-components=1 -xzf "${DISTDIR}/${P}-Tutorials.tar.gz" || die
+ fi
+}
+
+src_configure() {
+ local emesonargs=(
+ -Denable-autodiff=false
+ -Denable-directdiff=false
+ -Denable-pastix=false
+ -Denable-pywrapper=false
+ -Dwith-omp=false
+ $(meson_feature mpi with-mpi)
+ $(meson_use cgns enable-cgns)
+ $(meson_use mkl enable-mkl)
+ $(meson_use openblas enable-openblas)
+ $(meson_use tecio enable-tecio)
+ $(meson_use test enable-tests)
+ )
+ meson_src_configure
+}
+
+src_test() {
+ ln -s ../../${P}-build/SU2_CFD/src/SU2_CFD SU2_PY/SU2_CFD
+ ln -s ../../${P}-build/SU2_DEF/src/SU2_DEF SU2_PY/SU2_DEF
+ ln -s ../../${P}-build/SU2_DOT/src/SU2_DOT SU2_PY/SU2_DOT
+ ln -s ../../${P}-build/SU2_GEO/src/SU2_GEO SU2_PY/SU2_GEO
+ ln -s ../../${P}-build/SU2_MSH/src/SU2_MSH SU2_PY/SU2_MSH
+ ln -s ../../${P}-build/SU2_SOL/src/SU2_SOL SU2_PY/SU2_SOL
+
+ export SU2_RUN="${S}/SU2_PY"
+ export SU2_HOME="${S}"
+ export PATH=$PATH:$SU2_RUN
+ export PYTHONPATH=$PYTHONPATH:$SU2_RUN
+
+ einfo "Running UnitTests ..."
+ ../${P}-build/UnitTests/test_driver
+
+ pushd TestCases/
+ use mpi && python parallel_regression.py
+ use mpi || python serial_regression.py
+ use tutorials && use mpi && python tutorials.py
+ popd
+}
+
+src_install() {
+ meson_src_install
+ mkdir -p "${ED}$(python_get_sitedir)"
+ mv "${ED}"/usr/bin/{FSI,SU2,*.py} -t "${ED}$(python_get_sitedir)"
+ python_optimize "${D}/$(python_get_sitedir)"
+
+ if use tutorials ; then
+ insinto "/usr/share/${P}"
+ doins -r Tutorials
+ fi
+}
diff --git a/sci-physics/SU2/files/SU2-7.0.6-fix-env.patch b/sci-physics/SU2/files/SU2-7.0.6-fix-env.patch
new file mode 100644
index 0000000..baf7955
--- /dev/null
+++ b/sci-physics/SU2/files/SU2-7.0.6-fix-env.patch
@@ -0,0 +1,12 @@
+diff -Naur old_env/UnitTests/meson.build new_env/UnitTests/meson.build
+--- old_env/UnitTests/meson.build 2020-06-15 17:03:43.000000000 +0300
++++ new_env/UnitTests/meson.build 2020-06-15 17:04:35.000000000 +0300
+@@ -26,7 +26,7 @@
+ test_driver = executable(
+ 'test_driver',
+ unit_test_files,
+- install : true,
++ install : false,
+ dependencies : [su2_cfd_dep, common_dep, su2_deps, catch2_dep],
+ cpp_args: ['-fPIC', default_warning_flags, su2_cpp_args]
+ )
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [gentoo-commits] repo/proj/guru:dev commit in: sci-physics/SU2/files/, sci-physics/SU2/
@ 2020-10-21 21:32 Sergey Torokhov
0 siblings, 0 replies; 7+ messages in thread
From: Sergey Torokhov @ 2020-10-21 21:32 UTC (permalink / raw
To: gentoo-commits
commit: 4cd820043758ecf6082d0a3b3ddfa5373fccac13
Author: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
AuthorDate: Wed Oct 21 21:06:06 2020 +0000
Commit: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
CommitDate: Wed Oct 21 21:23:27 2020 +0000
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=4cd82004
sci-physics/SU2: 7.0.7 version bump
Signed-off-by: Sergey Torokhov <torokhov-s-a <AT> yandex.ru>
sci-physics/SU2/Manifest | 3 +
sci-physics/SU2/SU2-7.0.7.ebuild | 114 +
sci-physics/SU2/files/SU2-7.0.7-fix-env.patch | 12 +
.../SU2/files/SU2-7.0.7-fix-python-optimize.patch | 2212 ++++++++++++++++++++
4 files changed, 2341 insertions(+)
diff --git a/sci-physics/SU2/Manifest b/sci-physics/SU2/Manifest
index b68e4c98..876649be 100644
--- a/sci-physics/SU2/Manifest
+++ b/sci-physics/SU2/Manifest
@@ -1,3 +1,6 @@
DIST SU2-7.0.6-TestCases.tar.gz 447944839 BLAKE2B 5212ef7bf69bb40120ca2af99a02f2a89ae6cc0a1e048e57409ee1d2911f930452f4a5ef668126d6b7144c3f81d50bdadd0bcc810f0472740ccbbb6605e5a07d SHA512 c976450e7e17df58b47cbf14d18c4435f977a70dc086d5b74ea584ae14b3204632ef87b2dce6a456396179f1b72ef8eba83065a42d978b8d6966d5446decbd3c
DIST SU2-7.0.6-Tutorials.tar.gz 64282244 BLAKE2B 3b0ce136c9fa5c3e0ffc585e28b1a60470eeaf2518cbef539fccc185f79cd41a889e3c3c8a0ada3f488cfe1d2d0115e2768267c6ef4502b882b07f909f6f382c SHA512 4aaf39b98cbbe4c9e12d78027b0ee2b3d30fd614d1e48092d8bfd25c312a06a1621b2192653a7d8ac767762b06ae339ab6fb77e81f833efdb419ce09f92dec2f
DIST SU2-7.0.6.tar.gz 20531872 BLAKE2B 30e59bc6876223d87429b79f101a5705f989096a1b81725aa20012567d15b08b6a8a24140cc76b35c6c3657a1d6afa85d56da699ab38dac85714e296d7ad8531 SHA512 a4619dd969c6d9cb20de1d373c8e0af9d56654f9f96d919662897db4c3c8bf52b45fb1239065d480ba1b4f05ba7a17c9540ff3fe47fb0d96864736200cda8bcc
+DIST SU2-7.0.7-TestCases.tar.gz 448969006 BLAKE2B 6c886824b55d7f8516d2ea69e2f7bef36a40986f4f715da46d91f851eb59390329433c6941a280eca34ad675633b2f1b01a897d1db8d177a5c4f770b286d0625 SHA512 0884b4f750dbcfd3f2cb0e71d6005932e4edd90a50fa84eb484f6c0c523930ddebfb3ed4315161b8fdeff911a52fa72b6d79739c8e19cd634b9823e007520213
+DIST SU2-7.0.7-Tutorials.tar.gz 64282235 BLAKE2B 7a6b780ee6f01d26a7a7d4751ca39798af56cfd7b99ca3e13fdff61aecd631a3aa4c98a487f48a8b2593c711ee25bd1ddc90a316bde2c287e95a383321f1d5e9 SHA512 189b5da96f08689b62ba3c42ee349edd2e145f371112895587e53497f16de3d6fdbf17308af39961775d76e3169c40872ced8e267146b6da5ae12d31a4c70fa9
+DIST SU2-7.0.7.tar.gz 20618138 BLAKE2B c823ea59fd28547b78c4694d45995e83c5f2c16229c40d20b951cdd62a98e13c77c07cffa87a1ec105b29a597878c7a2342c6ac90c7c9751ed20f876194a55e1 SHA512 c5dacc8b2f4ab7eb72852d8e6ae59c0800e8126faf20641135fa31ec42915b8e3553082e328b2b158e3e337f7aab0a932b6b1f875d3c0191db538bb923affcf3
diff --git a/sci-physics/SU2/SU2-7.0.7.ebuild b/sci-physics/SU2/SU2-7.0.7.ebuild
new file mode 100644
index 00000000..9e7077f6
--- /dev/null
+++ b/sci-physics/SU2/SU2-7.0.7.ebuild
@@ -0,0 +1,114 @@
+# Copyright 1999-2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{6,7,8} )
+
+inherit meson python-single-r1
+
+DESCRIPTION="SU2: An Open-Source Suite for Multiphysics Simulation and Design"
+HOMEPAGE="https://su2code.github.io/"
+SRC_URI="
+ https://github.com/su2code/SU2/archive/v${PV}.tar.gz -> ${P}.tar.gz
+ test? ( https://github.com/su2code/TestCases/archive/v${PV}.tar.gz -> ${P}-TestCases.tar.gz )
+ tutorials? ( https://github.com/su2code/Tutorials/archive/v${PV}.tar.gz -> ${P}-Tutorials.tar.gz )
+"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="~amd64"
+
+# cgns, metis, parmetis are bundled;
+# omp is disable as it's experimental;
+# pastix is disabled as it's try to find bundled libs;
+IUSE="cgns -mkl +mpi openblas tecio test tutorials"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="
+ ${PYTHON_REQUIRED_USE}
+ mkl? ( !openblas )
+"
+
+RDEPEND="
+ ${PYTHON_DEPS}
+ mpi? ( virtual/mpi[cxx] )
+ mkl? ( sci-libs/mkl )
+ openblas? ( sci-libs/openblas )
+"
+DEPEND="
+ ${RDEPEND}
+ tecio? ( dev-libs/boost:= )
+"
+BDEPEND="virtual/pkgconfig"
+
+PATCHES=(
+ "${FILESDIR}/${P}-fix-env.patch"
+ "${FILESDIR}/${PN}-7.0.4-unbundle_boost.patch"
+ "${FILESDIR}/${P}-fix-python-optimize.patch"
+)
+
+DOCS=( "LICENSE.md" "README.md" "SU2_PY/documentation.txt" )
+
+src_unpack() {
+ unpack "${P}.tar.gz"
+ if use test ; then
+ einfo "Unpacking ${P}-TestCases.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}/TestCases"
+ tar -C "${P}"/TestCases --strip-components=1 -xzf "${DISTDIR}/${P}-TestCases.tar.gz" || die
+ fi
+ if use tutorials ; then
+ einfo "Unpacking ${P}-Tutorials.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}"
+ mkdir "${P}"/Tutorials
+ tar -C "${P}"/Tutorials --strip-components=1 -xzf "${DISTDIR}/${P}-Tutorials.tar.gz" || die
+ fi
+}
+
+src_configure() {
+ local emesonargs=(
+ -Denable-autodiff=false
+ -Denable-directdiff=false
+ -Denable-pastix=false
+ -Denable-pywrapper=false
+ -Dwith-omp=false
+ $(meson_feature mpi with-mpi)
+ $(meson_use cgns enable-cgns)
+ $(meson_use mkl enable-mkl)
+ $(meson_use openblas enable-openblas)
+ $(meson_use tecio enable-tecio)
+ $(meson_use test enable-tests)
+ )
+ meson_src_configure
+}
+
+src_test() {
+ ln -s ../../${P}-build/SU2_CFD/src/SU2_CFD SU2_PY/SU2_CFD
+ ln -s ../../${P}-build/SU2_DEF/src/SU2_DEF SU2_PY/SU2_DEF
+ ln -s ../../${P}-build/SU2_DOT/src/SU2_DOT SU2_PY/SU2_DOT
+ ln -s ../../${P}-build/SU2_GEO/src/SU2_GEO SU2_PY/SU2_GEO
+ ln -s ../../${P}-build/SU2_SOL/src/SU2_SOL SU2_PY/SU2_SOL
+
+ export SU2_RUN="${S}/SU2_PY"
+ export SU2_HOME="${S}"
+ export PATH=$PATH:$SU2_RUN
+ export PYTHONPATH=$PYTHONPATH:$SU2_RUN
+
+ einfo "Running UnitTests ..."
+ ../${P}-build/UnitTests/test_driver
+
+ pushd TestCases/
+ use mpi && python parallel_regression.py
+ use mpi || python serial_regression.py
+ use tutorials && use mpi && python tutorials.py
+ popd
+}
+
+src_install() {
+ meson_src_install
+ mkdir -p "${ED}$(python_get_sitedir)"
+ mv "${ED}"/usr/bin/{FSI,SU2,*.py} -t "${ED}$(python_get_sitedir)"
+ python_optimize "${D}/$(python_get_sitedir)"
+
+ if use tutorials ; then
+ insinto "/usr/share/${P}"
+ doins -r Tutorials
+ fi
+}
diff --git a/sci-physics/SU2/files/SU2-7.0.7-fix-env.patch b/sci-physics/SU2/files/SU2-7.0.7-fix-env.patch
new file mode 100644
index 00000000..baf7955d
--- /dev/null
+++ b/sci-physics/SU2/files/SU2-7.0.7-fix-env.patch
@@ -0,0 +1,12 @@
+diff -Naur old_env/UnitTests/meson.build new_env/UnitTests/meson.build
+--- old_env/UnitTests/meson.build 2020-06-15 17:03:43.000000000 +0300
++++ new_env/UnitTests/meson.build 2020-06-15 17:04:35.000000000 +0300
+@@ -26,7 +26,7 @@
+ test_driver = executable(
+ 'test_driver',
+ unit_test_files,
+- install : true,
++ install : false,
+ dependencies : [su2_cfd_dep, common_dep, su2_deps, catch2_dep],
+ cpp_args: ['-fPIC', default_warning_flags, su2_cpp_args]
+ )
diff --git a/sci-physics/SU2/files/SU2-7.0.7-fix-python-optimize.patch b/sci-physics/SU2/files/SU2-7.0.7-fix-python-optimize.patch
new file mode 100644
index 00000000..0b35037c
--- /dev/null
+++ b/sci-physics/SU2/files/SU2-7.0.7-fix-python-optimize.patch
@@ -0,0 +1,2212 @@
+diff -Naur old/SU2_PY/FSI/FSIInterface.py new/SU2_PY/FSI/FSIInterface.py
+--- old/SU2_PY/FSI/FSIInterface.py 2020-05-01 19:09:18.000000000 +0300
++++ new/SU2_PY/FSI/FSIInterface.py 2020-05-10 16:17:07.000000000 +0300
+@@ -6,8 +6,8 @@
+ # \version 7.0.7 "Blackbird"
+ #
+ # SU2 Project Website: https://su2code.github.io
+-#
+-# The SU2 Project is maintained by the SU2 Foundation
++#
++# The SU2 Project is maintained by the SU2 Foundation
+ # (http://su2foundation.org)
+ #
+ # Copyright 2012-2020, SU2 Contributors (cf. AUTHORS.md)
+@@ -16,7 +16,7 @@
+ # modify it under the terms of the GNU Lesser General Public
+ # License as published by the Free Software Foundation; either
+ # version 2.1 of the License, or (at your option) any later version.
+-#
++#
+ # SU2 is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+@@ -42,19 +42,19 @@
+ # ----------------------------------------------------------------------
+
+ class Interface:
+- """
++ """
+ FSI interface class that handles fluid/solid solvers synchronisation and communication
+ """
+-
++
+ def __init__(self, FSI_config, FluidSolver, SolidSolver, have_MPI):
+- """
+- Class constructor. Declare some variables and do some screen outputs.
+- """
+-
++ """
++ Class constructor. Declare some variables and do some screen outputs.
++ """
++
+ if have_MPI == True:
+ from mpi4py import MPI
+ self.MPI = MPI
+- self.comm = MPI.COMM_WORLD #MPI World communicator
++ self.comm = MPI.COMM_WORLD #MPI World communicator
+ self.have_MPI = True
+ myid = self.comm.Get_rank()
+ else:
+@@ -62,42 +62,42 @@
+ self.have_MPI = False
+ myid = 0
+
+- self.rootProcess = 0 #the root process is chosen to be MPI rank = 0
++ self.rootProcess = 0 #the root process is chosen to be MPI rank = 0
+
+- self.nDim = FSI_config['NDIM'] #problem dimension
++ self.nDim = FSI_config['NDIM'] #problem dimension
+
+- self.haveFluidSolver = False #True if the fluid solver is initialized on the current rank
+- self.haveSolidSolver = False #True if the solid solver is initialized on the current rank
+- self.haveFluidInterface = False #True if the current rank owns at least one fluid interface node
+- self.haveSolidInterface = False #True if the current rank owns at least one solid interface node
++ self.haveFluidSolver = False #True if the fluid solver is initialized on the current rank
++ self.haveSolidSolver = False #True if the solid solver is initialized on the current rank
++ self.haveFluidInterface = False #True if the current rank owns at least one fluid interface node
++ self.haveSolidInterface = False #True if the current rank owns at least one solid interface node
+
+- self.fluidSolverProcessors = list() #list of partitions where the fluid solver is initialized
+- self.solidSolverProcessors = list() #list of partitions where the solid solver is initialized
++ self.fluidSolverProcessors = list() #list of partitions where the fluid solver is initialized
++ self.solidSolverProcessors = list() #list of partitions where the solid solver is initialized
+ self.fluidInterfaceProcessors = list() #list of partitions where there are fluid interface nodes
+- self.solidInterfaceProcessors = list() #list of partitions where there are solid interface nodes
++ self.solidInterfaceProcessors = list() #list of partitions where there are solid interface nodes
+
+- self.fluidInterfaceIdentifier = None #object that can identify the f/s interface within the fluid solver
+- self.solidInterfaceIdentifier = None #object that can identify the f/s interface within the solid solver
++ self.fluidInterfaceIdentifier = None #object that can identify the f/s interface within the fluid solver
++ self.solidInterfaceIdentifier = None #object that can identify the f/s interface within the solid solver
+
+- self.fluidGlobalIndexRange = {} #contains the global FSI indexing of each fluid interface node for all partitions
+- self.solidGlobalIndexRange = {} #contains the global FSI indexing of each solid interface node for all partitions
++ self.fluidGlobalIndexRange = {} #contains the global FSI indexing of each fluid interface node for all partitions
++ self.solidGlobalIndexRange = {} #contains the global FSI indexing of each solid interface node for all partitions
+
+- self.FluidHaloNodeList = {} #contains the the indices (fluid solver indexing) of the halo nodes for each partition
+- self.fluidIndexing = {} #links between the fluid solver indexing and the FSI indexing for the interface nodes
+- self.SolidHaloNodeList = {} #contains the the indices (solid solver indexing) of the halo nodes for each partition
+- self.solidIndexing = {} #links between the solid solver indexing and the FSI indexing for the interface nodes
+-
+- self.nLocalFluidInterfaceNodes = 0 #number of nodes (halo nodes included) on the fluid interface, on each partition
+- self.nLocalFluidInterfaceHaloNode = 0 #number of halo nodes on the fluid intrface, on each partition
+- self.nLocalFluidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the fluid interface, on each partition
+- self.nFluidInterfaceNodes = 0 #number of nodes on the fluid interface, sum over all the partitions
+- self.nFluidInterfacePhysicalNodes = 0 #number of physical nodes on the fluid interface, sum over all partitions
+-
+- self.nLocalSolidInterfaceNodes = 0 #number of physical nodes on the solid interface, on each partition
+- self.nLocalSolidInterfaceHaloNode = 0 #number of halo nodes on the solid intrface, on each partition
+- self.nLocalSolidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the solid interface, on each partition
+- self.nSolidInterfaceNodes = 0 #number of nodes on the solid interface, sum over all partitions
+- self.nSolidInterfacePhysicalNodes = 0 #number of physical nodes on the solid interface, sum over all partitions
++ self.FluidHaloNodeList = {} #contains the the indices (fluid solver indexing) of the halo nodes for each partition
++ self.fluidIndexing = {} #links between the fluid solver indexing and the FSI indexing for the interface nodes
++ self.SolidHaloNodeList = {} #contains the the indices (solid solver indexing) of the halo nodes for each partition
++ self.solidIndexing = {} #links between the solid solver indexing and the FSI indexing for the interface nodes
++
++ self.nLocalFluidInterfaceNodes = 0 #number of nodes (halo nodes included) on the fluid interface, on each partition
++ self.nLocalFluidInterfaceHaloNode = 0 #number of halo nodes on the fluid intrface, on each partition
++ self.nLocalFluidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the fluid interface, on each partition
++ self.nFluidInterfaceNodes = 0 #number of nodes on the fluid interface, sum over all the partitions
++ self.nFluidInterfacePhysicalNodes = 0 #number of physical nodes on the fluid interface, sum over all partitions
++
++ self.nLocalSolidInterfaceNodes = 0 #number of physical nodes on the solid interface, on each partition
++ self.nLocalSolidInterfaceHaloNode = 0 #number of halo nodes on the solid intrface, on each partition
++ self.nLocalSolidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the solid interface, on each partition
++ self.nSolidInterfaceNodes = 0 #number of nodes on the solid interface, sum over all partitions
++ self.nSolidInterfacePhysicalNodes = 0 #number of physical nodes on the solid interface, sum over all partitions
+
+ if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
+ self.MappingMatrixA = None
+@@ -106,83 +106,83 @@
+ self.MappingMatrixB_T = None
+ self.d_RBF = self.nDim+1
+ else:
+- self.MappingMatrix = None #interpolation/mapping matrix for meshes interpolation/mapping
+- self.MappingMatrix_T = None #transposed interpolation/mapping matrix for meshes interpolation/mapping
++ self.MappingMatrix = None #interpolation/mapping matrix for meshes interpolation/mapping
++ self.MappingMatrix_T = None #transposed interpolation/mapping matrix for meshes interpolation/mapping
+ self.d_RBF = 0
+
+- self.localFluidInterface_array_X_init = None #initial fluid interface position on each partition (used for the meshes mapping)
++ self.localFluidInterface_array_X_init = None #initial fluid interface position on each partition (used for the meshes mapping)
+ self.localFluidInterface_array_Y_init = None
+ self.localFluidInterface_array_Z_init = None
+
+- self.haloNodesPositionsInit = {} #initial position of the halo nodes (fluid side only)
++ self.haloNodesPositionsInit = {} #initial position of the halo nodes (fluid side only)
+
+- self.solidInterface_array_DispX = None #solid interface displacement
++ self.solidInterface_array_DispX = None #solid interface displacement
+ self.solidInterface_array_DispY = None
+ self.solidInterface_array_DispZ = None
+
+- self.solidInterfaceResidual_array_X = None #solid interface position residual
++ self.solidInterfaceResidual_array_X = None #solid interface position residual
+ self.solidInterfaceResidual_array_Y = None
+ self.solidInterfaceResidual_array_Z = None
+
+- self.solidInterfaceResidualnM1_array_X = None #solid interface position residual at the previous BGS iteration
++ self.solidInterfaceResidualnM1_array_X = None #solid interface position residual at the previous BGS iteration
+ self.solidInterfaceResidualnM1_array_Y = None
+ self.solidInterfaceResidualnM1_array_Z = None
+-
+- self.fluidInterface_array_DispX = None #fluid interface displacement
++
++ self.fluidInterface_array_DispX = None #fluid interface displacement
+ self.fluidInterface_array_DispY = None
+ self.fluidInterface_array_DispZ = None
+
+- self.fluidLoads_array_X = None #loads on the fluid side of the f/s interface
++ self.fluidLoads_array_X = None #loads on the fluid side of the f/s interface
+ self.fluidLoads_array_Y = None
+ self.fluidLoads_array_Z = None
+
+- self.solidLoads_array_X = None #loads on the solid side of the f/s interface
++ self.solidLoads_array_X = None #loads on the solid side of the f/s interface
+ self.solidLoads_array_Y = None
+ self.solidLoads_array_Z = None
+
+- self.aitkenParam = FSI_config['AITKEN_PARAM'] #relaxation parameter for the BGS method
+- self.FSIIter = 0 #current FSI iteration
+- self.unsteady = False #flag for steady or unsteady simulation (default is steady)
+-
+- # ---Some screen output ---
+- self.MPIPrint('Fluid solver : SU2_CFD')
+- self.MPIPrint('Solid solver : {}'.format(FSI_config['CSD_SOLVER']))
++ self.aitkenParam = FSI_config['AITKEN_PARAM'] #relaxation parameter for the BGS method
++ self.FSIIter = 0 #current FSI iteration
++ self.unsteady = False #flag for steady or unsteady simulation (default is steady)
++
++ # ---Some screen output ---
++ self.MPIPrint('Fluid solver : SU2_CFD')
++ self.MPIPrint('Solid solver : {}'.format(FSI_config['CSD_SOLVER']))
+
+- if FSI_config['TIME_MARCHING'] == 'YES':
++ if FSI_config['TIME_MARCHING'] == 'YES':
+ self.MPIPrint('Unsteady coupled simulation with physical time step : {} s'.format(FSI_config['UNST_TIMESTEP']))
+ self.unsteady = True
+- else:
+- self.MPIPrint('Steady coupled simulation')
++ else:
++ self.MPIPrint('Steady coupled simulation')
+
+- if FSI_config['MATCHING_MESH'] == 'YES':
+- self.MPIPrint('Matching fluid-solid interface')
+- else:
++ if FSI_config['MATCHING_MESH'] == 'YES':
++ self.MPIPrint('Matching fluid-solid interface')
++ else:
+ if FSI_config['MESH_INTERP_METHOD'] == 'TPS':
+- self.MPIPrint('Non matching fluid-solid interface with Thin Plate Spline interpolation')
++ self.MPIPrint('Non matching fluid-solid interface with Thin Plate Spline interpolation')
+ elif FSI_config['MESH_INTERP_METHOD'] == 'RBF':
+ self.MPIPrint('Non matching fluid-solid interface with Radial Basis Function interpolation')
+ self.RBF_rad = FSI_config['RBF_RADIUS']
+- self.MPIPrint('Radius value : {}'.format(self.RBF_rad))
++ self.MPIPrint('Radius value : {}'.format(self.RBF_rad))
+ else:
+- self.MPIPrint('Non matching fluid-solid interface with Nearest Neighboor interpolation')
++ self.MPIPrint('Non matching fluid-solid interface with Nearest Neighboor interpolation')
+
+- self.MPIPrint('Solid predictor : {}'.format(FSI_config['DISP_PRED']))
++ self.MPIPrint('Solid predictor : {}'.format(FSI_config['DISP_PRED']))
+
+- self.MPIPrint('Maximum number of FSI iterations : {}'.format(FSI_config['NB_FSI_ITER']))
++ self.MPIPrint('Maximum number of FSI iterations : {}'.format(FSI_config['NB_FSI_ITER']))
+
+- self.MPIPrint('FSI tolerance : {}'.format(FSI_config['FSI_TOLERANCE']))
++ self.MPIPrint('FSI tolerance : {}'.format(FSI_config['FSI_TOLERANCE']))
+
+- if FSI_config['AITKEN_RELAX'] == 'STATIC':
+- self.MPIPrint('Static Aitken under-relaxation with constant parameter {}'.format(FSI_config['AITKEN_PARAM']))
+- elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
+- self.MPIPrint('Dynamic Aitken under-relaxation with initial parameter {}'.format(FSI_config['AITKEN_PARAM']))
+- else:
+- self.MPIPrint('No Aitken under-relaxation')
++ if FSI_config['AITKEN_RELAX'] == 'STATIC':
++ self.MPIPrint('Static Aitken under-relaxation with constant parameter {}'.format(FSI_config['AITKEN_PARAM']))
++ elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
++ self.MPIPrint('Dynamic Aitken under-relaxation with initial parameter {}'.format(FSI_config['AITKEN_PARAM']))
++ else:
++ self.MPIPrint('No Aitken under-relaxation')
+
+ self.MPIPrint('FSI interface is set')
+
+ def MPIPrint(self, message):
+- """
++ """
+ Print a message on screen only from the master process.
+ """
+
+@@ -198,28 +198,28 @@
+ """
+ Perform a synchronization barrier in case of parallel run with MPI.
+ """
+-
++
+ if self.have_MPI == True:
+ self.comm.barrier()
+
+ def connect(self, FSI_config, FluidSolver, SolidSolver):
+- """
+- Connection between solvers.
+- Creates the communication support between the two solvers.
+- Gets information about f/s interfaces from the two solvers.
+- """
++ """
++ Connection between solvers.
++ Creates the communication support between the two solvers.
++ Gets information about f/s interfaces from the two solvers.
++ """
+ if self.have_MPI == True:
+ myid = self.comm.Get_rank()
+- MPIsize = self.comm.Get_size()
++ MPIsize = self.comm.Get_size()
+ else:
+ myid = 0
+ MPIsize = 1
+-
+- # --- Identify the fluid and solid interfaces and store the number of nodes on both sides (and for each partition) ---
++
++ # --- Identify the fluid and solid interfaces and store the number of nodes on both sides (and for each partition) ---
+ self.fluidInterfaceIdentifier = None
+ self.nLocalFluidInterfaceNodes = 0
+ if FluidSolver != None:
+- print('Fluid solver is initialized on process {}'.format(myid))
++ print('Fluid solver is initialized on process {}'.format(myid))
+ self.haveFluidSolver = True
+ allMovingMarkersTags = FluidSolver.GetAllMovingMarkersTag()
+ allMarkersID = FluidSolver.GetAllBoundaryMarkers()
+@@ -229,23 +229,23 @@
+ if allMovingMarkersTags[0] in allMarkersID.keys():
+ self.fluidInterfaceIdentifier = allMarkersID[allMovingMarkersTags[0]]
+ if self.fluidInterfaceIdentifier != None:
+- self.nLocalFluidInterfaceNodes = FluidSolver.GetNumberVertices(self.fluidInterfaceIdentifier)
+- if self.nLocalFluidInterfaceNodes != 0:
++ self.nLocalFluidInterfaceNodes = FluidSolver.GetNumberVertices(self.fluidInterfaceIdentifier)
++ if self.nLocalFluidInterfaceNodes != 0:
+ self.haveFluidInterface = True
+- print('Number of interface fluid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalFluidInterfaceNodes))
+- else:
+- pass
++ print('Number of interface fluid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalFluidInterfaceNodes))
++ else:
++ pass
+
+- if SolidSolver != None:
+- print('Solid solver is initialized on process {}'.format(myid))
++ if SolidSolver != None:
++ print('Solid solver is initialized on process {}'.format(myid))
+ self.haveSolidSolver = True
+- self.solidInterfaceIdentifier = SolidSolver.getFSIMarkerID()
+- self.nLocalSolidInterfaceNodes = SolidSolver.getNumberOfSolidInterfaceNodes(self.solidInterfaceIdentifier)
+- if self.nLocalSolidInterfaceNodes != 0:
++ self.solidInterfaceIdentifier = SolidSolver.getFSIMarkerID()
++ self.nLocalSolidInterfaceNodes = SolidSolver.getNumberOfSolidInterfaceNodes(self.solidInterfaceIdentifier)
++ if self.nLocalSolidInterfaceNodes != 0:
+ self.haveSolidInterface = True
+ print('Number of interface solid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalSolidInterfaceNodes))
+- else:
+- pass
++ else:
++ pass
+
+ # --- Exchange information about processors on which the solvers are defined and where the interface nodes are lying ---
+ if self.have_MPI == True:
+@@ -266,18 +266,18 @@
+ else:
+ sendBufSolidInterface = np.array(int(0))
+ rcvBufFluid = np.zeros(MPIsize, dtype = int)
+- rcvBufSolid = np.zeros(MPIsize, dtype = int)
++ rcvBufSolid = np.zeros(MPIsize, dtype = int)
+ rcvBufFluidInterface = np.zeros(MPIsize, dtype = int)
+- rcvBufSolidInterface = np.zeros(MPIsize, dtype = int)
++ rcvBufSolidInterface = np.zeros(MPIsize, dtype = int)
+ self.comm.Allgather(sendBufFluid, rcvBufFluid)
+ self.comm.Allgather(sendBufSolid, rcvBufSolid)
+ self.comm.Allgather(sendBufFluidInterface, rcvBufFluidInterface)
+ self.comm.Allgather(sendBufSolidInterface, rcvBufSolidInterface)
+ for iProc in range(MPIsize):
+- if rcvBufFluid[iProc] == 1:
++ if rcvBufFluid[iProc] == 1:
+ self.fluidSolverProcessors.append(iProc)
+ if rcvBufSolid[iProc] == 1:
+- self.solidSolverProcessors.append(iProc)
++ self.solidSolverProcessors.append(iProc)
+ if rcvBufFluidInterface[iProc] == 1:
+ self.fluidInterfaceProcessors.append(iProc)
+ if rcvBufSolidInterface[iProc] == 1:
+@@ -285,19 +285,19 @@
+ del sendBufFluid, sendBufSolid, rcvBufFluid, rcvBufSolid, sendBufFluidInterface, sendBufSolidInterface, rcvBufFluidInterface, rcvBufSolidInterface
+ else:
+ self.fluidSolverProcessors.append(0)
+- self.solidSolverProcessors.append(0)
++ self.solidSolverProcessors.append(0)
+ self.fluidInterfaceProcessors.append(0)
+ self.solidInterfaceProcessors.append(0)
+
+- self.MPIBarrier()
+-
+- # --- Calculate the total number of nodes at the fluid interface (sum over all the partitions) ---
++ self.MPIBarrier()
++
++ # --- Calculate the total number of nodes at the fluid interface (sum over all the partitions) ---
+ # Calculate the number of halo nodes on each partition
+ self.nLocalFluidInterfaceHaloNode = 0
+- for iVertex in range(self.nLocalFluidInterfaceNodes):
++ for iVertex in range(self.nLocalFluidInterfaceNodes):
+ if FluidSolver.IsAHaloNode(self.fluidInterfaceIdentifier, iVertex) == True:
+ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
+- self.FluidHaloNodeList[GlobalIndex] = iVertex
++ self.FluidHaloNodeList[GlobalIndex] = iVertex
+ self.nLocalFluidInterfaceHaloNode += 1
+ # Calculate the number of physical (= not halo) nodes on each partition
+ self.nLocalFluidInterfacePhysicalNodes = self.nLocalFluidInterfaceNodes - self.nLocalFluidInterfaceHaloNode
+@@ -308,10 +308,10 @@
+
+ # Same thing for the solid part
+ self.nLocalSolidInterfaceHaloNode = 0
+- #for iVertex in range(self.nLocalSolidInterfaceNodes):
++ #for iVertex in range(self.nLocalSolidInterfaceNodes):
+ #if SoliddSolver.IsAHaloNode(self.fluidInterfaceIdentifier, iVertex) == True:
+ #GlobalIndex = SolidSolver.GetVertexGlobalIndex(self.solidInterfaceIdentifier, iVertex)
+- #self.SolidHaloNodeList[GlobalIndex] = iVertex
++ #self.SolidHaloNodeList[GlobalIndex] = iVertex
+ #self.nLocalSolidInterfaceHaloNode += 1
+ self.nLocalSolidInterfacePhysicalNodes = self.nLocalSolidInterfaceNodes - self.nLocalSolidInterfaceHaloNode
+ if self.have_MPI == True:
+@@ -323,11 +323,11 @@
+ # --- Calculate the total number of nodes (with and without halo) at the fluid interface (sum over all the partitions) and broadcast the number accross all processors ---
+ sendBuffHalo = np.array(int(self.nLocalFluidInterfaceNodes))
+ sendBuffPhysical = np.array(int(self.nLocalFluidInterfacePhysicalNodes))
+- rcvBuffHalo = np.zeros(1, dtype=int)
++ rcvBuffHalo = np.zeros(1, dtype=int)
+ rcvBuffPhysical = np.zeros(1, dtype=int)
+- if self.have_MPI == True:
++ if self.have_MPI == True:
+ self.comm.barrier()
+- self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
++ self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
+ self.comm.Allreduce(sendBuffPhysical,rcvBuffPhysical,op=self.MPI.SUM)
+ self.nFluidInterfaceNodes = rcvBuffHalo[0]
+ self.nFluidInterfacePhysicalNodes = rcvBuffPhysical[0]
+@@ -339,11 +339,11 @@
+ # Same thing for the solid part
+ sendBuffHalo = np.array(int(self.nLocalSolidInterfaceNodes))
+ sendBuffPhysical = np.array(int(self.nLocalSolidInterfacePhysicalNodes))
+- rcvBuffHalo = np.zeros(1, dtype=int)
++ rcvBuffHalo = np.zeros(1, dtype=int)
+ rcvBuffPhysical = np.zeros(1, dtype=int)
+ if self.have_MPI == True:
+- self.comm.barrier()
+- self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
++ self.comm.barrier()
++ self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
+ self.comm.Allreduce(sendBuffPhysical,rcvBuffPhysical,op=self.MPI.SUM)
+ self.nSolidInterfaceNodes = rcvBuffHalo[0]
+ self.nSolidInterfacePhysicalNodes = rcvBuffPhysical[0]
+@@ -375,7 +375,7 @@
+ if myid in self.fluidInterfaceProcessors:
+ globalIndexStart = 0
+ for iProc in range(myid):
+- globalIndexStart += self.fluidPhysicalInterfaceNodesDistribution[iProc]
++ globalIndexStart += self.fluidPhysicalInterfaceNodesDistribution[iProc]
+ globalIndexStop = globalIndexStart + self.nLocalFluidInterfacePhysicalNodes-1
+ else:
+ globalIndexStart = 0
+@@ -387,8 +387,8 @@
+ temp[0] = [0,self.nLocalFluidInterfacePhysicalNodes-1]
+ self.fluidGlobalIndexRange = list()
+ self.fluidGlobalIndexRange.append(temp)
+-
+- # Same thing for the solid part
++
++ # Same thing for the solid part
+ if self.have_MPI == True:
+ if myid in self.solidInterfaceProcessors:
+ globalIndexStart = 0
+@@ -404,14 +404,14 @@
+ temp = {}
+ temp[0] = [0,self.nSolidInterfacePhysicalNodes-1]
+ self.solidGlobalIndexRange = list()
+- self.solidGlobalIndexRange.append(temp)
++ self.solidGlobalIndexRange.append(temp)
+
+- self.MPIPrint('Total number of fluid interface nodes (halo nodes included) : {}'.format(self.nFluidInterfaceNodes))
+- self.MPIPrint('Total number of solid interface nodes (halo nodes included) : {}'.format(self.nSolidInterfaceNodes))
++ self.MPIPrint('Total number of fluid interface nodes (halo nodes included) : {}'.format(self.nFluidInterfaceNodes))
++ self.MPIPrint('Total number of solid interface nodes (halo nodes included) : {}'.format(self.nSolidInterfaceNodes))
+ self.MPIPrint('Total number of fluid interface nodes : {}'.format(self.nFluidInterfacePhysicalNodes))
+ self.MPIPrint('Total number of solid interface nodes : {}'.format(self.nSolidInterfacePhysicalNodes))
+
+- self.MPIBarrier()
++ self.MPIBarrier()
+
+ # --- Create all the PETSc vectors required for parallel communication and parallel mesh mapping/interpolation (working for serial too) ---
+ if self.have_MPI == True:
+@@ -432,8 +432,8 @@
+ self.solidInterface_array_DispY.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
+ self.solidInterface_array_DispZ.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
+ self.solidInterface_array_DispX.set(0.0)
+- self.solidInterface_array_DispY.set(0.0)
+- self.solidInterface_array_DispZ.set(0.0)
++ self.solidInterface_array_DispY.set(0.0)
++ self.solidInterface_array_DispZ.set(0.0)
+
+ if self.have_MPI == True:
+ self.fluidInterface_array_DispX = PETSc.Vec().create(self.comm)
+@@ -536,30 +536,30 @@
+ self.solidInterfaceResidualnM1_array_Z.set(0.0)
+
+ def interfaceMapping(self,FluidSolver, SolidSolver, FSI_config):
+- """
+- Creates the one-to-one mapping between interfaces in case of matching meshes.
+- Creates the interpolation rules between interfaces in case of non-matching meshes.
+- """
+- if self.have_MPI == True:
++ """
++ Creates the one-to-one mapping between interfaces in case of matching meshes.
++ Creates the interpolation rules between interfaces in case of non-matching meshes.
++ """
++ if self.have_MPI == True:
+ myid = self.comm.Get_rank()
+- MPIsize = self.comm.Get_size()
++ MPIsize = self.comm.Get_size()
+ else:
+ myid = 0
+ MPIsize = 1
+
+- # --- Get the fluid interface from fluid solver on each partition ---
+- GlobalIndex = int()
++ # --- Get the fluid interface from fluid solver on each partition ---
++ GlobalIndex = int()
+ localIndex = 0
+ fluidIndexing_temp = {}
+ self.localFluidInterface_array_X_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
+ self.localFluidInterface_array_Y_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
+ self.localFluidInterface_array_Z_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
+ for iVertex in range(self.nLocalFluidInterfaceNodes):
+- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
+- posx = FluidSolver.GetVertexCoordX(self.fluidInterfaceIdentifier, iVertex)
+- posy = FluidSolver.GetVertexCoordY(self.fluidInterfaceIdentifier, iVertex)
+- posz = FluidSolver.GetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex)
+- if GlobalIndex in self.FluidHaloNodeList[myid].keys():
++ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
++ posx = FluidSolver.GetVertexCoordX(self.fluidInterfaceIdentifier, iVertex)
++ posy = FluidSolver.GetVertexCoordY(self.fluidInterfaceIdentifier, iVertex)
++ posz = FluidSolver.GetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex)
++ if GlobalIndex in self.FluidHaloNodeList[myid].keys():
+ self.haloNodesPositionsInit[GlobalIndex] = (posx, posy, posz)
+ else:
+ fluidIndexing_temp[GlobalIndex] = self.__getGlobalIndex('fluid', myid, localIndex)
+@@ -576,17 +576,17 @@
+ self.fluidIndexing = fluidIndexing_temp.copy()
+ del fluidIndexing_temp
+
+- # --- Get the solid interface from solid solver on each partition ---
++ # --- Get the solid interface from solid solver on each partition ---
+ localIndex = 0
+ solidIndexing_temp = {}
+- self.localSolidInterface_array_X = np.zeros(self.nLocalSolidInterfaceNodes)
++ self.localSolidInterface_array_X = np.zeros(self.nLocalSolidInterfaceNodes)
+ self.localSolidInterface_array_Y = np.zeros(self.nLocalSolidInterfaceNodes)
+ self.localSolidInterface_array_Z = np.zeros(self.nLocalSolidInterfaceNodes)
+ for iVertex in range(self.nLocalSolidInterfaceNodes):
+ GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
+- posx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
+- posy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
+- posz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
++ posx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
++ posy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
++ posz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
+ if GlobalIndex in self.SolidHaloNodeList[myid].keys():
+ pass
+ else:
+@@ -605,14 +605,14 @@
+ del solidIndexing_temp
+
+
+- # --- Create the PETSc parallel interpolation matrix ---
++ # --- Create the PETSc parallel interpolation matrix ---
+ if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
+ if self.have_MPI == True:
+ self.MappingMatrixA = PETSc.Mat().create(self.comm)
+ self.MappingMatrixB = PETSc.Mat().create(self.comm)
+ self.MappingMatrixA_T = PETSc.Mat().create(self.comm)
+ self.MappingMatrixB_T = PETSc.Mat().create(self.comm)
+- if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
++ if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
+ self.MappingMatrixA.setType('mpiaij')
+ self.MappingMatrixB.setType('mpiaij')
+ self.MappingMatrixA_T.setType('mpiaij')
+@@ -627,7 +627,7 @@
+ self.MappingMatrixB = PETSc.Mat().create()
+ self.MappingMatrixA_T = PETSc.Mat().create()
+ self.MappingMatrixB_T = PETSc.Mat().create()
+- if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
++ if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
+ self.MappingMatrixA.setType('aij')
+ self.MappingMatrixB.setType('aij')
+ self.MappingMatrixA_T.setType('aij')
+@@ -637,16 +637,16 @@
+ self.MappingMatrixB.setType('aij')
+ self.MappingMatrixA_T.setType('aij')
+ self.MappingMatrixB_T.setType('aij')
+- self.MappingMatrixA.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
++ self.MappingMatrixA.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
+ self.MappingMatrixA.setUp()
+ self.MappingMatrixA.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
+- self.MappingMatrixB.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes+self.d_RBF))
++ self.MappingMatrixB.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes+self.d_RBF))
+ self.MappingMatrixB.setUp()
+ self.MappingMatrixB.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
+- self.MappingMatrixA_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
++ self.MappingMatrixA_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
+ self.MappingMatrixA_T.setUp()
+ self.MappingMatrixA_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
+- self.MappingMatrixB_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nFluidInterfacePhysicalNodes))
++ self.MappingMatrixB_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nFluidInterfacePhysicalNodes))
+ self.MappingMatrixB_T.setUp()
+ self.MappingMatrixB_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
+ else:
+@@ -660,21 +660,21 @@
+ self.MappingMatrix_T = PETSc.Mat().create()
+ self.MappingMatrix.setType('aij')
+ self.MappingMatrix_T.setType('aij')
+- self.MappingMatrix.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes))
++ self.MappingMatrix.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes))
+ self.MappingMatrix.setUp()
+ self.MappingMatrix.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
+- self.MappingMatrix_T.setSizes((self.nSolidInterfacePhysicalNodes, self.nFluidInterfacePhysicalNodes))
++ self.MappingMatrix_T.setSizes((self.nSolidInterfacePhysicalNodes, self.nFluidInterfacePhysicalNodes))
+ self.MappingMatrix_T.setUp()
+ self.MappingMatrix_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
+-
+-
++
++
+ # --- Fill the interpolation matrix in parallel (working in serial too) ---
+ if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
+ self.MPIPrint('Building interpolation matrices...')
+ if self.have_MPI == True:
+ for iProc in self.solidInterfaceProcessors:
+ if myid == iProc:
+- for jProc in self.solidInterfaceProcessors:
++ for jProc in self.solidInterfaceProcessors:
+ self.comm.Send(self.localSolidInterface_array_X, dest=jProc, tag=1)
+ self.comm.Send(self.localSolidInterface_array_Y, dest=jProc, tag=2)
+ self.comm.Send(self.localSolidInterface_array_Z, dest=jProc, tag=3)
+@@ -726,7 +726,7 @@
+ self.TPSMeshMapping_B(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
+ else:
+ self.NearestNeighboorMeshMapping(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
+- else:
++ else:
+ self.matchingMeshMapping(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
+ else:
+ if FSI_config['MATCHING_MESH'] == 'NO':
+@@ -735,10 +735,10 @@
+ elif FSI_config['MESH_INTERP_METHOD'] == 'TPS' :
+ self.TPSMeshMapping_B(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
+ else:
+- self.NearestNeighboorMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
+- else:
++ self.NearestNeighboorMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
++ else:
+ self.matchingMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
+-
++
+ if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
+ self.MappingMatrixB.assemblyBegin()
+ self.MappingMatrixB.assemblyEnd()
+@@ -751,9 +751,9 @@
+ self.MappingMatrix_T.assemblyBegin()
+ self.MappingMatrix_T.assemblyEnd()
+ self.MPIPrint("Interpolation matrix is built.")
+-
++
+ self.MPIBarrier()
+-
++
+ del self.localSolidInterface_array_X
+ del self.localSolidInterface_array_Y
+ del self.localSolidInterface_array_Z
+@@ -768,20 +768,20 @@
+ myid = 0
+
+ # --- Instantiate the spatial indexing ---
+- prop_index = index.Property()
+- prop_index.dimension = self.nDim
+- SolidSpatialTree = index.Index(properties=prop_index)
+-
++ prop_index = index.Property()
++ prop_index.dimension = self.nDim
++ SolidSpatialTree = index.Index(properties=prop_index)
++
+ nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
+
+ for jVertex in range(nSolidNodes):
+ posX = solidInterfaceBuffRcv_X[jVertex]
+ posY = solidInterfaceBuffRcv_Y[jVertex]
+ posZ = solidInterfaceBuffRcv_Z[jVertex]
+- if self.nDim == 2 :
+- SolidSpatialTree.add(jVertex, (posX, posY))
+- else :
+- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
++ if self.nDim == 2 :
++ SolidSpatialTree.add(jVertex, (posX, posY))
++ else :
++ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
+
+ if self.nFluidInterfacePhysicalNodes != self.nSolidInterfacePhysicalNodes:
+ raise Exception("Fluid and solid interface must have the same number of nodes for matching meshes ! ")
+@@ -822,20 +822,20 @@
+ myid = 0
+
+ # --- Instantiate the spatial indexing ---
+- prop_index = index.Property()
+- prop_index.dimension = self.nDim
+- SolidSpatialTree = index.Index(properties=prop_index)
+-
++ prop_index = index.Property()
++ prop_index.dimension = self.nDim
++ SolidSpatialTree = index.Index(properties=prop_index)
++
+ nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
+
+ for jVertex in range(nSolidNodes):
+ posX = solidInterfaceBuffRcv_X[jVertex]
+ posY = solidInterfaceBuffRcv_Y[jVertex]
+ posZ = solidInterfaceBuffRcv_Z[jVertex]
+- if self.nDim == 2 :
+- SolidSpatialTree.add(jVertex, (posX, posY))
+- else :
+- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
++ if self.nDim == 2 :
++ SolidSpatialTree.add(jVertex, (posX, posY))
++ else :
++ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
+
+ # --- For each fluid interface node, find the nearest solid interface node and fill the boolean mapping matrix ---
+ for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
+@@ -863,20 +863,20 @@
+ myid = 0
+
+ # --- Instantiate the spatial indexing ---
+- prop_index = index.Property()
+- prop_index.dimension = self.nDim
+- SolidSpatialTree = index.Index(properties=prop_index)
+-
++ prop_index = index.Property()
++ prop_index.dimension = self.nDim
++ SolidSpatialTree = index.Index(properties=prop_index)
++
+ nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
+
+ for jVertex in range(nSolidNodes):
+ posX = solidInterfaceBuffRcv_X[jVertex]
+ posY = solidInterfaceBuffRcv_Y[jVertex]
+ posZ = solidInterfaceBuffRcv_Z[jVertex]
+- if self.nDim == 2 :
+- SolidSpatialTree.add(jVertex, (posX, posY))
+- else :
+- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
++ if self.nDim == 2 :
++ SolidSpatialTree.add(jVertex, (posX, posY))
++ else :
++ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
+
+ for iVertexSolid in range(self.nLocalSolidInterfaceNodes):
+ posX = self.localSolidInterface_array_X[iVertexSolid]
+@@ -915,20 +915,20 @@
+ myid = 0
+
+ # --- Instantiate the spatial indexing ---
+- prop_index = index.Property()
+- prop_index.dimension = self.nDim
+- SolidSpatialTree = index.Index(properties=prop_index)
+-
++ prop_index = index.Property()
++ prop_index.dimension = self.nDim
++ SolidSpatialTree = index.Index(properties=prop_index)
++
+ nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
+
+ for jVertex in range(nSolidNodes):
+ posX = solidInterfaceBuffRcv_X[jVertex]
+ posY = solidInterfaceBuffRcv_Y[jVertex]
+ posZ = solidInterfaceBuffRcv_Z[jVertex]
+- if self.nDim == 2 :
+- SolidSpatialTree.add(jVertex, (posX, posY))
+- else :
+- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
++ if self.nDim == 2 :
++ SolidSpatialTree.add(jVertex, (posX, posY))
++ else :
++ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
+
+ for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
+ posX = self.localFluidInterface_array_X_init[iVertexFluid]
+@@ -965,7 +965,7 @@
+ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+-
++
+ nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
+
+ for iVertexSolid in range(self.nLocalSolidInterfaceNodes):
+@@ -999,7 +999,7 @@
+ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+-
++
+ nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
+
+ for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
+@@ -1031,7 +1031,7 @@
+ """
+ phi = 0.0
+ eps = distance/rad
+-
++
+ if eps < 1:
+ phi = ((1.0-eps)**4)*(4.0*eps+1.0)
+ else:
+@@ -1044,20 +1044,20 @@
+ Description
+ """
+ phi = 0.0
+-
++
+ if distance > 0.0:
+ phi = (distance**2)*np.log10(distance)
+ else:
+ phi = 0.0
+
+- return phi
++ return phi
+
+
+ def interpolateSolidPositionOnFluidMesh(self, FSI_config):
+- """
+- Applies the one-to-one mapping or the interpolaiton rules from solid to fluid mesh.
+- """
+- if self.have_MPI == True:
++ """
++ Applies the one-to-one mapping or the interpolaiton rules from solid to fluid mesh.
++ """
++ if self.have_MPI == True:
+ myid = self.comm.Get_rank()
+ MPIsize = self.comm.Get_size()
+ else:
+@@ -1110,12 +1110,12 @@
+ del gamma_array_DispY
+ del gamma_array_DispZ
+ del KSP_solver
+- else:
++ else:
+ self.MappingMatrix.mult(self.solidInterface_array_DispX, self.fluidInterface_array_DispX)
+ self.MappingMatrix.mult(self.solidInterface_array_DispY, self.fluidInterface_array_DispY)
+ self.MappingMatrix.mult(self.solidInterface_array_DispZ, self.fluidInterface_array_DispZ)
+
+- # --- Checking conservation ---
++ # --- Checking conservation ---
+ WSX = self.solidLoads_array_X.dot(self.solidInterface_array_DispX)
+ WSY = self.solidLoads_array_Y.dot(self.solidInterface_array_DispY)
+ WSZ = self.solidLoads_array_Z.dot(self.solidInterface_array_DispZ)
+@@ -1124,11 +1124,11 @@
+ WFY = self.fluidLoads_array_Y.dot(self.fluidInterface_array_DispY)
+ WFZ = self.fluidLoads_array_Z.dot(self.fluidInterface_array_DispZ)
+
+- self.MPIPrint("Checking f/s interface conservation...")
+- self.MPIPrint('Solid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WSX, WSY, WSZ))
+- self.MPIPrint('Fluid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WFX, WFY, WFZ))
++ self.MPIPrint("Checking f/s interface conservation...")
++ self.MPIPrint('Solid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WSX, WSY, WSZ))
++ self.MPIPrint('Fluid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WFX, WFY, WFZ))
++
+
+-
+ # --- Redistribute the interpolated fluid interface according to the partitions that own the fluid interface ---
+ # Gather the fluid interface on the master process
+ if self.have_MPI == True:
+@@ -1156,7 +1156,7 @@
+ displ = tuple(displ)
+
+ del sendBuffNumber, rcvBuffNumber
+-
++
+ #print("DEBUG MESSAGE From proc {}, counts = {}".format(myid, counts))
+ #print("DEBUG MESSAGE From proc {}, displ = {}".format(myid, displ))
+
+@@ -1213,18 +1213,18 @@
+ del sendBuff
+
+ def interpolateFluidLoadsOnSolidMesh(self, FSI_config):
+- """
+- Applies the one-to-one mapping or the interpolaiton rules from fluid to solid mesh.
+- """
+- if self.have_MPI == True:
++ """
++ Applies the one-to-one mapping or the interpolaiton rules from fluid to solid mesh.
++ """
++ if self.have_MPI == True:
+ myid = self.comm.Get_rank()
+ MPIsize = self.comm.Get_size()
+ else:
+ myid = 0
+ MPIsize = 1
+-
++
+ # --- Interpolate (or map) in parallel the fluid interface loads on the solid interface ---
+- #self.MappingMatrix.transpose()
++ #self.MappingMatrix.transpose()
+ if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
+ if self.have_MPI == True:
+ gamma_array_LoadX = PETSc.Vec().create(self.comm)
+@@ -1280,10 +1280,10 @@
+ self.solidLoads_array_X_recon = None
+ self.solidLoads_array_Y_recon = None
+ self.solidLoads_array_Z_recon = None
+- if myid == self.rootProcess:
+- self.solidLoads_array_X_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
+- self.solidLoads_array_Y_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
+- self.solidLoads_array_Z_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
++ if myid == self.rootProcess:
++ self.solidLoads_array_X_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
++ self.solidLoads_array_Y_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
++ self.solidLoads_array_Z_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
+ myNumberOfNodes = self.solidLoads_array_X.getArray().shape[0]
+ sendBuffNumber = np.array([myNumberOfNodes], dtype=int)
+ rcvBuffNumber = np.zeros(MPIsize, dtype=int)
+@@ -1293,9 +1293,9 @@
+ displ = np.zeros(MPIsize, dtype=int)
+ for ii in range(rcvBuffNumber.shape[0]):
+ displ[ii] = rcvBuffNumber[0:ii].sum()
+- displ = tuple(displ)
++ displ = tuple(displ)
+
+- del sendBuffNumber, rcvBuffNumber
++ del sendBuffNumber, rcvBuffNumber
+
+ self.comm.Gatherv(self.solidLoads_array_X.getArray(), [self.solidLoads_array_X_recon, counts, displ, self.MPI.DOUBLE], root=self.rootProcess)
+ self.comm.Gatherv(self.solidLoads_array_Y.getArray(), [self.solidLoads_array_Y_recon, counts, displ, self.MPI.DOUBLE], root=self.rootProcess)
+@@ -1336,25 +1336,25 @@
+
+
+ '''def getSolidInterfacePosition(self, SolidSolver):
+- """
+- Gets the current solid interface position from the solid solver.
+- """
++ """
++ Gets the current solid interface position from the solid solver.
++ """
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
++ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+-
++
+ # --- Get the solid interface position from the solid solver and directly fill the corresponding PETSc vector ---
+ GlobalIndex = int()
+ localIndex = 0
+- for iVertex in range(self.nLocalSolidInterfaceNodes):
++ for iVertex in range(self.nLocalSolidInterfaceNodes):
+ GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
+ if GlobalIndex in self.SolidHaloNodeList[myid].keys():
+ pass
+ else:
+- newPosx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
+- newPosy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
+- newPosz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
++ newPosx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
++ newPosy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
++ newPosz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
+ iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
+ self.solidInterface_array_X.setValues([iGlobalVertex],newPosx)
+ self.solidInterface_array_Y.setValues([iGlobalVertex],newPosy)
+@@ -1375,25 +1375,25 @@
+ #print("DEBUG MESSAGE From PROC {} : array_X = {}".format(myid, self.solidInterface_array_X.getArray()))'''
+
+ def getSolidInterfaceDisplacement(self, SolidSolver):
+- """
+- Gets the current solid interface position from the solid solver.
+- """
++ """
++ Gets the current solid interface position from the solid solver.
++ """
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
++ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+-
++
+ # --- Get the solid interface position from the solid solver and directly fill the corresponding PETSc vector ---
+ GlobalIndex = int()
+ localIndex = 0
+- for iVertex in range(self.nLocalSolidInterfaceNodes):
++ for iVertex in range(self.nLocalSolidInterfaceNodes):
+ GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
+ if GlobalIndex in self.SolidHaloNodeList[myid].keys():
+ pass
+ else:
+- newDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
+- newDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
+- newDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
++ newDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
++ newDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
++ newDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
+ iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
+ self.solidInterface_array_DispX.setValues([iGlobalVertex],newDispx)
+ self.solidInterface_array_DispY.setValues([iGlobalVertex],newDispy)
+@@ -1408,9 +1408,9 @@
+ self.solidInterface_array_DispZ.assemblyEnd()
+
+ def getFluidInterfaceNodalForce(self, FSI_config, FluidSolver):
+- """
+- Gets the fluid interface loads from the fluid solver.
+- """
++ """
++ Gets the fluid interface loads from the fluid solver.
++ """
+ if self.have_MPI == True:
+ myid = self.comm.Get_rank()
+ else:
+@@ -1422,17 +1422,17 @@
+ FZ = 0.0
+
+ # --- Get the fluid interface loads from the fluid solver and directly fill the corresponding PETSc vector ---
+- for iVertex in range(self.nLocalFluidInterfaceNodes):
+- halo = FluidSolver.ComputeVertexForces(self.fluidInterfaceIdentifier, iVertex) # !!we have to ignore halo node coming from mesh partitioning because they introduice non-physical forces
+- if halo==False:
+- if FSI_config['CSD_SOLVER'] == 'GETDP':
+- newFx = FluidSolver.GetVertexForceDensityX(self.fluidInterfaceIdentifier, iVertex)
+- newFy = FluidSolver.GetVertexForceDensityY(self.fluidInterfaceIdentifier, iVertex)
+- newFz = FluidSolver.GetVertexForceDensityZ(self.fluidInterfaceIdentifier, iVertex)
+- else:
+- newFx = FluidSolver.GetVertexForceX(self.fluidInterfaceIdentifier, iVertex)
+- newFy = FluidSolver.GetVertexForceY(self.fluidInterfaceIdentifier, iVertex)
+- newFz = FluidSolver.GetVertexForceZ(self.fluidInterfaceIdentifier, iVertex)
++ for iVertex in range(self.nLocalFluidInterfaceNodes):
++ halo = FluidSolver.ComputeVertexForces(self.fluidInterfaceIdentifier, iVertex) # !!we have to ignore halo node coming from mesh partitioning because they introduice non-physical forces
++ if halo==False:
++ if FSI_config['CSD_SOLVER'] == 'GETDP':
++ newFx = FluidSolver.GetVertexForceDensityX(self.fluidInterfaceIdentifier, iVertex)
++ newFy = FluidSolver.GetVertexForceDensityY(self.fluidInterfaceIdentifier, iVertex)
++ newFz = FluidSolver.GetVertexForceDensityZ(self.fluidInterfaceIdentifier, iVertex)
++ else:
++ newFx = FluidSolver.GetVertexForceX(self.fluidInterfaceIdentifier, iVertex)
++ newFy = FluidSolver.GetVertexForceY(self.fluidInterfaceIdentifier, iVertex)
++ newFz = FluidSolver.GetVertexForceZ(self.fluidInterfaceIdentifier, iVertex)
+ iGlobalVertex = self.__getGlobalIndex('fluid', myid, localIndex)
+ self.fluidLoads_array_X.setValues([iGlobalVertex], newFx)
+ self.fluidLoads_array_Y.setValues([iGlobalVertex], newFy)
+@@ -1457,22 +1457,22 @@
+ FX_b = self.fluidLoads_array_X.sum()
+ FY_b = self.fluidLoads_array_Y.sum()
+ FZ_b = self.fluidLoads_array_Z.sum()
+-
++
+
+ def setFluidInterfaceVarCoord(self, FluidSolver):
+- """
+- Communicate the change of coordinates of the fluid interface to the fluid solver.
+- Prepare the fluid solver for mesh deformation.
+- """
++ """
++ Communicate the change of coordinates of the fluid interface to the fluid solver.
++ Prepare the fluid solver for mesh deformation.
++ """
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
++ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+-
++
+ # --- Send the new fluid interface position to the fluid solver (on each partition, halo nodes included) ---
+ localIndex = 0
+- for iVertex in range(self.nLocalFluidInterfaceNodes):
+- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
++ for iVertex in range(self.nLocalFluidInterfaceNodes):
++ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
+ if GlobalIndex in self.FluidHaloNodeList[myid].keys():
+ posX0, posY0, posZ0 = self.haloNodesPositionsInit[GlobalIndex]
+ DispX, DispY, DispZ = self.haloNodesDisplacements[GlobalIndex]
+@@ -1491,32 +1491,32 @@
+ FluidSolver.SetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex, posZ)
+ localIndex += 1
+ # Prepares the mesh deformation in the fluid solver
+- nodalVarCoordNorm = FluidSolver.SetVertexVarCoord(self.fluidInterfaceIdentifier, iVertex)
++ nodalVarCoordNorm = FluidSolver.SetVertexVarCoord(self.fluidInterfaceIdentifier, iVertex)
++
+
+-
+ def setSolidInterfaceLoads(self, SolidSolver, FSI_config, time):
+- """
+- Communicates the new solid interface loads to the solid solver.
+- In case of rigid body motion, calculates the new resultant forces (lift, drag, ...).
+- """
++ """
++ Communicates the new solid interface loads to the solid solver.
++ In case of rigid body motion, calculates the new resultant forces (lift, drag, ...).
++ """
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
++ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+
+- FY = 0.0 # solid-side resultant forces
++ FY = 0.0 # solid-side resultant forces
+ FX = 0.0
+ FZ = 0.0
+- FFX = 0.0 # fluid-side resultant forces
+- FFY = 0.0
+- FFZ = 0.0
++ FFX = 0.0 # fluid-side resultant forces
++ FFY = 0.0
++ FFZ = 0.0
+
+ # --- Check for total force conservation after interpolation
+ FFX = self.fluidLoads_array_X.sum()
+ FFY = self.fluidLoads_array_Y.sum()
+ FFZ = self.fluidLoads_array_Z.sum()
+
+-
++
+ for iVertex in range(self.nLocalSolidInterfaceNodes):
+ FX += self.localSolidLoads_array_X[iVertex]
+ FY += self.localSolidLoads_array_Y[iVertex]
+@@ -1527,9 +1527,9 @@
+ FY = self.comm.allreduce(FY)
+ FZ = self.comm.allreduce(FZ)
+
+- self.MPIPrint("Checking f/s interface total force...")
+- self.MPIPrint('Solid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FX, FY, FZ))
+- self.MPIPrint('Fluid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FFX, FFY, FFZ))
++ self.MPIPrint("Checking f/s interface total force...")
++ self.MPIPrint('Solid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FX, FY, FZ))
++ self.MPIPrint('Fluid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FFX, FFY, FFZ))
+
+ # --- Send the new solid interface loads to the solid solver (on each partition, halo nodes included) ---
+ GlobalIndex = int()
+@@ -1541,25 +1541,25 @@
+ pass
+ else:
+ Fx = self.localSolidLoads_array_X[localIndex]
+- Fy = self.localSolidLoads_array_Y[localIndex]
+- Fz = self.localSolidLoads_array_Z[localIndex]
++ Fy = self.localSolidLoads_array_Y[localIndex]
++ Fz = self.localSolidLoads_array_Z[localIndex]
+ SolidSolver.applyload(iVertex, Fx, Fy, Fz, time)
+ localIndex += 1
+- if FSI_config['CSD_SOLVER'] == 'NATIVE':
++ if FSI_config['CSD_SOLVER'] == 'NATIVE':
+ SolidSolver.setGeneralisedForce()
+- SolidSolver.setGeneralisedMoment()
++ SolidSolver.setGeneralisedMoment()
+
+ def computeSolidInterfaceResidual(self, SolidSolver):
+- """
+- Computes the solid interface FSI displacement residual.
+- """
++ """
++ Computes the solid interface FSI displacement residual.
++ """
+
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
++ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+
+- normInterfaceResidualSquare = 0.0
++ normInterfaceResidualSquare = 0.0
+
+ # --- Create and fill the PETSc vector for the predicted solid interface position (predicted by the solid computation) ---
+ if self.have_MPI == True:
+@@ -1575,27 +1575,27 @@
+ predDisp_array_Y = PETSc.Vec().create()
+ predDisp_array_Y.setType('seq')
+ predDisp_array_Z = PETSc.Vec().create()
+- predDisp_array_Z.setType('seq')
++ predDisp_array_Z.setType('seq')
+ predDisp_array_X.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
+ predDisp_array_Y.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
+ predDisp_array_Z.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
+-
+- if myid in self.solidSolverProcessors:
+- for iVertex in range(self.nLocalSolidInterfaceNodes):
+- predDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
+- predDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
+- predDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
++
++ if myid in self.solidSolverProcessors:
++ for iVertex in range(self.nLocalSolidInterfaceNodes):
++ predDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
++ predDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
++ predDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
+ iGlobalVertex = self.__getGlobalIndex('solid', myid, iVertex)
+ predDisp_array_X.setValues([iGlobalVertex], predDispx)
+ predDisp_array_Y.setValues([iGlobalVertex], predDispy)
+ predDisp_array_Z.setValues([iGlobalVertex], predDispz)
+-
+- predDisp_array_X.assemblyBegin()
+- predDisp_array_X.assemblyEnd()
+- predDisp_array_Y.assemblyBegin()
+- predDisp_array_Y.assemblyEnd()
+- predDisp_array_Z.assemblyBegin()
+- predDisp_array_Z.assemblyEnd()
++
++ predDisp_array_X.assemblyBegin()
++ predDisp_array_X.assemblyEnd()
++ predDisp_array_Y.assemblyBegin()
++ predDisp_array_Y.assemblyEnd()
++ predDisp_array_Z.assemblyBegin()
++ predDisp_array_Z.assemblyEnd()
+
+ # --- Calculate the residual (vector and norm) ---
+ self.solidInterfaceResidual_array_X = predDisp_array_X - self.solidInterface_array_DispX
+@@ -1615,45 +1615,45 @@
+ del predDisp_array_Y
+ del predDisp_array_Z
+
+- return sqrt(normInterfaceResidualSquare)
++ return sqrt(normInterfaceResidualSquare)
+
+ def relaxSolidPosition(self,FSI_config):
+- """
+- Apply solid displacement under-relaxation.
+- """
++ """
++ Apply solid displacement under-relaxation.
++ """
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
++ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+
+ # --- Set the Aitken coefficient for the relaxation ---
+- if FSI_config['AITKEN_RELAX'] == 'STATIC':
+- self.aitkenParam = FSI_config['AITKEN_PARAM']
+- elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
+- self.setAitkenCoefficient(FSI_config)
+- else:
+- self.aitkenParam = 1.0
++ if FSI_config['AITKEN_RELAX'] == 'STATIC':
++ self.aitkenParam = FSI_config['AITKEN_PARAM']
++ elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
++ self.setAitkenCoefficient(FSI_config)
++ else:
++ self.aitkenParam = 1.0
+
+- self.MPIPrint('Aitken under-relaxation step with parameter {}'.format(self.aitkenParam))
++ self.MPIPrint('Aitken under-relaxation step with parameter {}'.format(self.aitkenParam))
+
+ # --- Relax the solid interface position ---
+ self.solidInterface_array_DispX += self.aitkenParam*self.solidInterfaceResidual_array_X
+ self.solidInterface_array_DispY += self.aitkenParam*self.solidInterfaceResidual_array_Y
+ self.solidInterface_array_DispZ += self.aitkenParam*self.solidInterfaceResidual_array_Z
+-
++
+
+ def setAitkenCoefficient(self, FSI_config):
+- """
+- Computes the Aitken coefficients for solid displacement under-relaxation.
+- """
+-
+- deltaResNormSquare = 0.0
+- prodScalRes = 0.0
+-
++ """
++ Computes the Aitken coefficients for solid displacement under-relaxation.
++ """
++
++ deltaResNormSquare = 0.0
++ prodScalRes = 0.0
++
+ # --- Create the PETSc vector for the difference between the residuals (current and previous FSI iter) ---
+- if self.FSIIter == 0:
+- self.aitkenParam = max(FSI_config['AITKEN_PARAM'], self.aitkenParam)
+- else:
++ if self.FSIIter == 0:
++ self.aitkenParam = max(FSI_config['AITKEN_PARAM'], self.aitkenParam)
++ else:
+ if self.have_MPI:
+ deltaResx_array_X = PETSc.Vec().create(self.comm)
+ deltaResx_array_X.setType('mpi')
+@@ -1688,9 +1688,9 @@
+ deltaResNormSquare_X = (deltaResx_array_X.norm())**2
+ deltaResNormSquare_Y = (deltaResx_array_Y.norm())**2
+ deltaResNormSquare_Z = (deltaResx_array_Z.norm())**2
+- deltaResNormSquare = deltaResNormSquare_X + deltaResNormSquare_Y + deltaResNormSquare_Z
++ deltaResNormSquare = deltaResNormSquare_X + deltaResNormSquare_Y + deltaResNormSquare_Z
+
+- self.aitkenParam *= -prodScalRes/deltaResNormSquare
++ self.aitkenParam *= -prodScalRes/deltaResNormSquare
+
+ deltaResx_array_X.destroy()
+ deltaResx_array_Y.destroy()
+@@ -1708,27 +1708,27 @@
+ self.solidInterfaceResidual_array_Z.copy(self.solidInterfaceResidualnM1_array_Z)
+
+ def displacementPredictor(self, FSI_config , SolidSolver, deltaT):
+- """
+- Calculates a prediciton for the solid interface position for the next time step.
+- """
++ """
++ Calculates a prediciton for the solid interface position for the next time step.
++ """
+
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
++ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+
+- if FSI_config['DISP_PRED'] == 'FIRST_ORDER':
+- self.MPIPrint("First order predictor")
+- alpha_0 = 1.0
+- alpha_1 = 0.0
+- elif FSI_config['DISP_PRED'] == 'SECOND_ORDER':
+- self.MPIPrint("Second order predictor")
+- alpha_0 = 1.0
+- alpha_1 = 0.5
+- else:
+- self.MPIPrint("No predictor")
+- alpha_0 = 0.0
+- alpha_1 = 0.0
++ if FSI_config['DISP_PRED'] == 'FIRST_ORDER':
++ self.MPIPrint("First order predictor")
++ alpha_0 = 1.0
++ alpha_1 = 0.0
++ elif FSI_config['DISP_PRED'] == 'SECOND_ORDER':
++ self.MPIPrint("Second order predictor")
++ alpha_0 = 1.0
++ alpha_1 = 0.5
++ else:
++ self.MPIPrint("No predictor")
++ alpha_0 = 0.0
++ alpha_1 = 0.0
+
+ # --- Create the PETSc vectors to store the solid interface velocity ---
+ if self.have_MPI == True:
+@@ -1774,18 +1774,18 @@
+ # --- Fill the PETSc vectors ---
+ GlobalIndex = int()
+ localIndex = 0
+- for iVertex in range(self.nLocalSolidInterfaceNodes):
+- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
++ for iVertex in range(self.nLocalSolidInterfaceNodes):
++ GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
+ if GlobalIndex in self.SolidHaloNodeList[myid].keys():
+ pass
+ else:
+ iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
+- velx = SolidSolver.getInterfaceNodeVelX(self.solidInterfaceIdentifier, iVertex)
+- vely = SolidSolver.getInterfaceNodeVelY(self.solidInterfaceIdentifier, iVertex)
+- velz = SolidSolver.getInterfaceNodeVelZ(self.solidInterfaceIdentifier, iVertex)
+- velxNm1 = SolidSolver.getInterfaceNodeVelXNm1(self.solidInterfaceIdentifier, iVertex)
+- velyNm1 = SolidSolver.getInterfaceNodeVelYNm1(self.solidInterfaceIdentifier, iVertex)
+- velzNm1 = SolidSolver.getInterfaceNodeVelZNm1(self.solidInterfaceIdentifier, iVertex)
++ velx = SolidSolver.getInterfaceNodeVelX(self.solidInterfaceIdentifier, iVertex)
++ vely = SolidSolver.getInterfaceNodeVelY(self.solidInterfaceIdentifier, iVertex)
++ velz = SolidSolver.getInterfaceNodeVelZ(self.solidInterfaceIdentifier, iVertex)
++ velxNm1 = SolidSolver.getInterfaceNodeVelXNm1(self.solidInterfaceIdentifier, iVertex)
++ velyNm1 = SolidSolver.getInterfaceNodeVelYNm1(self.solidInterfaceIdentifier, iVertex)
++ velzNm1 = SolidSolver.getInterfaceNodeVelZNm1(self.solidInterfaceIdentifier, iVertex)
+ Vel_array_X.setValues([iGlobalVertex],velx)
+ Vel_array_Y.setValues([iGlobalVertex],vely)
+ Vel_array_Z.setValues([iGlobalVertex],velz)
+@@ -1822,27 +1822,27 @@
+ del VelnM1_array_X, VelnM1_array_Y, VelnM1_array_Z
+
+ def writeFSIHistory(self, TimeIter, time, varCoordNorm, FSIConv):
+- """
+- Write the FSI history file of the computaion.
+- """
++ """
++ Write the FSI history file of the computaion.
++ """
+
+ if self.have_MPI == True:
+ myid = self.comm.Get_rank()
+ else:
+ myid = 0
+-
++
+ if myid == self.rootProcess:
+- if self.unsteady:
+- if TimeIter == 0:
+- histFile = open('FSIhistory.dat', "w")
++ if self.unsteady:
++ if TimeIter == 0:
++ histFile = open('FSIhistory.dat', "w")
+ histFile.write("TimeIter\tTime\tFSIRes\tFSINbIter\n")
+- else:
+- histFile = open('FSIhistory.dat', "a")
+- if FSIConv:
+- histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter+1) + '\n')
+- else:
+- histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter) + '\n')
+- histFile.close()
++ else:
++ histFile = open('FSIhistory.dat', "a")
++ if FSIConv:
++ histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter+1) + '\n')
++ else:
++ histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter) + '\n')
++ histFile.close()
+ else:
+ if self.FSIIter == 0:
+ histFile = open('FSIhistory.dat', "w")
+@@ -1851,7 +1851,7 @@
+ histFile = open('FSIhistory.dat', "a")
+ histFile.write(str(self.FSIIter) + '\t' + str(varCoordNorm) + '\n')
+ histFile.close()
+-
++
+
+ self.MPIBarrier()
+
+@@ -1868,254 +1868,254 @@
+ globalIndex = globalStartIndex + iLocalVertex
+
+ return globalIndex
+-
++
+
+ def UnsteadyFSI(self,FSI_config, FluidSolver, SolidSolver):
+- """
+- Run the unsteady FSI computation by synchronizing the fluid and solid solvers.
+- F/s interface data are exchanged through interface mapping and interpolation (if non mathcing meshes).
+- """
++ """
++ Run the unsteady FSI computation by synchronizing the fluid and solid solvers.
++ F/s interface data are exchanged through interface mapping and interpolation (if non mathcing meshes).
++ """
+
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
+- numberPart = self.comm.Get_size()
++ myid = self.comm.Get_rank()
++ numberPart = self.comm.Get_size()
+ else:
+ myid = 0
+ numberPart = 1
+
+- # --- Set some general variables for the unsteady computation --- #
+- deltaT = FSI_config['UNST_TIMESTEP'] # physical time step
+- totTime = FSI_config['UNST_TIME'] # physical simulation time
+- NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
+- FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
+- TimeIterTreshold = 0 # time iteration from which we allow the solid to deform
+-
+- if FSI_config['RESTART_SOL'] == 'YES':
+- startTime = FSI_config['START_TIME']
+- NbTimeIter = ((totTime)/deltaT)-1
+- time = startTime
+- TimeIter = FSI_config['RESTART_ITER']
+- else:
+- NbTimeIter = (totTime/deltaT)-1 # number of time iterations
+- time = 0.0 # initial time
+- TimeIter = 0 # initial time iteration
+-
+- NbTimeIter = int(NbTimeIter) # be sure that NbTimeIter is an integer
+-
+- varCoordNorm = 0.0 # FSI residual
+- FSIConv = False # FSI convergence flag
+-
+- self.MPIPrint('\n**********************************')
+- self.MPIPrint('* Begin unsteady FSI computation *')
+- self.MPIPrint('**********************************\n')
+-
+- # --- Initialize the coupled solution --- #
+- #If restart (DOES NOT WORK YET)
+- if FSI_config['RESTART_SOL'] == 'YES':
+- TimeIterTreshold = -1
+- FluidSolver.setTemporalIteration(TimeIter)
+- if myid == self.rootProcess:
+- SolidSolver.outputDisplacements(FluidSolver.getInterRigidDispArray(), True)
++ # --- Set some general variables for the unsteady computation --- #
++ deltaT = FSI_config['UNST_TIMESTEP'] # physical time step
++ totTime = FSI_config['UNST_TIME'] # physical simulation time
++ NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
++ FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
++ TimeIterTreshold = 0 # time iteration from which we allow the solid to deform
++
++ if FSI_config['RESTART_SOL'] == 'YES':
++ startTime = FSI_config['START_TIME']
++ NbTimeIter = ((totTime)/deltaT)-1
++ time = startTime
++ TimeIter = FSI_config['RESTART_ITER']
++ else:
++ NbTimeIter = (totTime/deltaT)-1 # number of time iterations
++ time = 0.0 # initial time
++ TimeIter = 0 # initial time iteration
++
++ NbTimeIter = int(NbTimeIter) # be sure that NbTimeIter is an integer
++
++ varCoordNorm = 0.0 # FSI residual
++ FSIConv = False # FSI convergence flag
++
++ self.MPIPrint('\n**********************************')
++ self.MPIPrint('* Begin unsteady FSI computation *')
++ self.MPIPrint('**********************************\n')
++
++ # --- Initialize the coupled solution --- #
++ #If restart (DOES NOT WORK YET)
++ if FSI_config['RESTART_SOL'] == 'YES':
++ TimeIterTreshold = -1
++ FluidSolver.setTemporalIteration(TimeIter)
++ if myid == self.rootProcess:
++ SolidSolver.outputDisplacements(FluidSolver.getInterRigidDispArray(), True)
++ if self.have_MPI == True:
++ self.comm.barrier()
++ FluidSolver.setInitialMesh(True)
++ if myid == self.rootProcess:
++ SolidSolver.displacementPredictor(FluidSolver.getInterRigidDispArray())
+ if self.have_MPI == True:
+- self.comm.barrier()
+- FluidSolver.setInitialMesh(True)
+- if myid == self.rootProcess:
+- SolidSolver.displacementPredictor(FluidSolver.getInterRigidDispArray())
+- if self.have_MPI == True:
+- self.comm.barrier()
+- if myid == self.rootProcess:
+- SolidSolver.updateSolution()
+- #If no restart
+- else:
+- self.MPIPrint('Setting FSI initial conditions')
++ self.comm.barrier()
++ if myid == self.rootProcess:
++ SolidSolver.updateSolution()
++ #If no restart
++ else:
++ self.MPIPrint('Setting FSI initial conditions')
+ if myid in self.solidSolverProcessors:
+- SolidSolver.setInitialDisplacements()
++ SolidSolver.setInitialDisplacements()
+ self.getSolidInterfaceDisplacement(SolidSolver)
+- self.interpolateSolidPositionOnFluidMesh(FSI_config)
+- self.setFluidInterfaceVarCoord(FluidSolver)
+- FluidSolver.SetInitialMesh() # if there is an initial deformation in the solid, it has to be communicated to the fluid solver
+- self.MPIPrint('\nFSI initial conditions are set')
+- self.MPIPrint('Beginning time integration\n')
+-
+- # --- External temporal loop --- #
+- while TimeIter <= NbTimeIter:
+-
+- if TimeIter > TimeIterTreshold:
+- NbFSIIter = NbFSIIterMax
+- self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI on time iteration {} ***************'.format(TimeIter))
+- else:
+- NbFSIIter = 1
+-
+- self.FSIIter = 0
+- FSIConv = False
+- FluidSolver.PreprocessExtIter(TimeIter) # set some parameters before temporal fluid iteration
+-
+- # --- Internal FSI loop --- #
+- while self.FSIIter <= (NbFSIIter-1):
++ self.interpolateSolidPositionOnFluidMesh(FSI_config)
++ self.setFluidInterfaceVarCoord(FluidSolver)
++ FluidSolver.SetInitialMesh() # if there is an initial deformation in the solid, it has to be communicated to the fluid solver
++ self.MPIPrint('\nFSI initial conditions are set')
++ self.MPIPrint('Beginning time integration\n')
++
++ # --- External temporal loop --- #
++ while TimeIter <= NbTimeIter:
++
++ if TimeIter > TimeIterTreshold:
++ NbFSIIter = NbFSIIterMax
++ self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI on time iteration {} ***************'.format(TimeIter))
++ else:
++ NbFSIIter = 1
++
++ self.FSIIter = 0
++ FSIConv = False
++ FluidSolver.PreprocessExtIter(TimeIter) # set some parameters before temporal fluid iteration
+
+- self.MPIPrint("\n>>>> Time iteration {} / FSI iteration {} <<<<".format(TimeIter,self.FSIIter))
++ # --- Internal FSI loop --- #
++ while self.FSIIter <= (NbFSIIter-1):
+
+- # --- Mesh morphing step (displacements interpolation, displacements communication, and mesh morpher call) --- #
+- self.interpolateSolidPositionOnFluidMesh(FSI_config)
++ self.MPIPrint("\n>>>> Time iteration {} / FSI iteration {} <<<<".format(TimeIter,self.FSIIter))
++
++ # --- Mesh morphing step (displacements interpolation, displacements communication, and mesh morpher call) --- #
++ self.interpolateSolidPositionOnFluidMesh(FSI_config)
+ self.MPIPrint('\nPerforming dynamic mesh deformation (ALE)...\n')
+ self.setFluidInterfaceVarCoord(FluidSolver)
+ FluidSolver.DynamicMeshUpdate(TimeIter)
+-
+- # --- Fluid solver call for FSI subiteration --- #
+- self.MPIPrint('\nLaunching fluid solver for one single dual-time iteration...')
++
++ # --- Fluid solver call for FSI subiteration --- #
++ self.MPIPrint('\nLaunching fluid solver for one single dual-time iteration...')
+ self.MPIBarrier()
+- FluidSolver.ResetConvergence()
+- FluidSolver.Run()
++ FluidSolver.ResetConvergence()
++ FluidSolver.Run()
+ self.MPIBarrier()
+
+- # --- Surface fluid loads interpolation and communication --- #
+- self.MPIPrint('\nProcessing interface fluid loads...\n')
++ # --- Surface fluid loads interpolation and communication --- #
++ self.MPIPrint('\nProcessing interface fluid loads...\n')
+ self.MPIBarrier()
+- self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
++ self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
+ self.MPIBarrier()
+- if TimeIter > TimeIterTreshold:
+- self.interpolateFluidLoadsOnSolidMesh(FSI_config)
+- self.setSolidInterfaceLoads(SolidSolver, FSI_config, time)
++ if TimeIter > TimeIterTreshold:
++ self.interpolateFluidLoadsOnSolidMesh(FSI_config)
++ self.setSolidInterfaceLoads(SolidSolver, FSI_config, time)
+
+- # --- Solid solver call for FSI subiteration --- #
+- self.MPIPrint('\nLaunching solid solver for a single time iteration...\n')
++ # --- Solid solver call for FSI subiteration --- #
++ self.MPIPrint('\nLaunching solid solver for a single time iteration...\n')
+ if myid in self.solidSolverProcessors:
+- if FSI_config['CSD_SOLVER'] == 'NATIVE':
+- SolidSolver.timeIteration(time)
+- elif FSI_config['CSD_SOLVER'] == 'METAFOR' or FSI_config['CSD_SOLVER'] == 'GETDP' or FSI_config['CSD_SOLVER'] == 'TESTER':
+- SolidSolver.run(time-deltaT, time)
+-
+- # --- Compute and monitor the FSI residual --- #
+- varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
+- self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
+- if varCoordNorm < FSITolerance:
+- FSIConv = True
+- break
++ if FSI_config['CSD_SOLVER'] == 'NATIVE':
++ SolidSolver.timeIteration(time)
++ elif FSI_config['CSD_SOLVER'] == 'METAFOR' or FSI_config['CSD_SOLVER'] == 'GETDP' or FSI_config['CSD_SOLVER'] == 'TESTER':
++ SolidSolver.run(time-deltaT, time)
++
++ # --- Compute and monitor the FSI residual --- #
++ varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
++ self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
++ if varCoordNorm < FSITolerance:
++ FSIConv = True
++ break
+
+- # --- Relaxe the solid position --- #
++ # --- Relaxe the solid position --- #
+ self.MPIPrint('\nProcessing interface displacements...\n')
+- self.relaxSolidPosition(FSI_config)
+-
+- self.FSIIter += 1
+- # --- End OF FSI loop --- #
++ self.relaxSolidPosition(FSI_config)
++
++ self.FSIIter += 1
++ # --- End OF FSI loop --- #
+
+ self.MPIBarrier()
+
+- # --- Update the FSI history file --- #
+- if TimeIter > TimeIterTreshold:
+- self.MPIPrint('\nBGS is converged (strong coupling)')
+- self.writeFSIHistory(TimeIter, time, varCoordNorm, FSIConv)
+-
+- # --- Update, monitor and output the fluid solution before the next time step ---#
+- FluidSolver.Update()
+- FluidSolver.Monitor(TimeIter)
+- FluidSolver.Output(TimeIter)
+-
+- if TimeIter >= TimeIterTreshold:
+- if myid in self.solidSolverProcessors:
+- # --- Output the solid solution before thr next time step --- #
+- SolidSolver.writeSolution(time, self.FSIIter, TimeIter, NbTimeIter)
+-
+- # --- Displacement predictor for the next time step and update of the solid solution --- #
+- self.MPIPrint('\nSolid displacement prediction for next time step')
+- self.displacementPredictor(FSI_config, SolidSolver, deltaT)
++ # --- Update the FSI history file --- #
++ if TimeIter > TimeIterTreshold:
++ self.MPIPrint('\nBGS is converged (strong coupling)')
++ self.writeFSIHistory(TimeIter, time, varCoordNorm, FSIConv)
++
++ # --- Update, monitor and output the fluid solution before the next time step ---#
++ FluidSolver.Update()
++ FluidSolver.Monitor(TimeIter)
++ FluidSolver.Output(TimeIter)
++
++ if TimeIter >= TimeIterTreshold:
++ if myid in self.solidSolverProcessors:
++ # --- Output the solid solution before thr next time step --- #
++ SolidSolver.writeSolution(time, self.FSIIter, TimeIter, NbTimeIter)
++
++ # --- Displacement predictor for the next time step and update of the solid solution --- #
++ self.MPIPrint('\nSolid displacement prediction for next time step')
++ self.displacementPredictor(FSI_config, SolidSolver, deltaT)
+ if myid in self.solidSolverProcessors:
+- SolidSolver.updateSolution()
+-
+- TimeIter += 1
+- time += deltaT
+- #--- End of the temporal loop --- #
++ SolidSolver.updateSolution()
++
++ TimeIter += 1
++ time += deltaT
++ #--- End of the temporal loop --- #
+
+ self.MPIBarrier()
+
+- self.MPIPrint('\n*************************')
+- self.MPIPrint('* End FSI computation *')
+- self.MPIPrint('*************************\n')
++ self.MPIPrint('\n*************************')
++ self.MPIPrint('* End FSI computation *')
++ self.MPIPrint('*************************\n')
+
+ def SteadyFSI(self, FSI_config,FluidSolver, SolidSolver):
+- """
+- Runs the steady FSI computation by synchronizing the fluid and solid solver with data exchange at the f/s interface.
+- """
++ """
++ Runs the steady FSI computation by synchronizing the fluid and solid solver with data exchange at the f/s interface.
++ """
+
+ if self.have_MPI == True:
+- myid = self.comm.Get_rank()
+- numberPart = self.comm.Get_size()
++ myid = self.comm.Get_rank()
++ numberPart = self.comm.Get_size()
+ else:
+ myid = 0
+ numberPart = 1
+
+- # --- Set some general variables for the steady computation --- #
+- NbIter = FSI_config['NB_EXT_ITER'] # number of fluid iteration at each FSI step
+- NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
+- FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
+- varCoordNorm = 0.0
+-
+- self.MPIPrint('\n********************************')
+- self.MPIPrint('* Begin steady FSI computation *')
+- self.MPIPrint('********************************\n')
+- self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI ***************')
++ # --- Set some general variables for the steady computation --- #
++ NbIter = FSI_config['NB_EXT_ITER'] # number of fluid iteration at each FSI step
++ NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
++ FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
++ varCoordNorm = 0.0
++
++ self.MPIPrint('\n********************************')
++ self.MPIPrint('* Begin steady FSI computation *')
++ self.MPIPrint('********************************\n')
++ self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI ***************')
+
+ self.getSolidInterfaceDisplacement(SolidSolver)
+
+- # --- External FSI loop --- #
+- self.FSIIter = 0
+- while self.FSIIter < NbFSIIterMax:
+- self.MPIPrint("\n>>>> FSI iteration {} <<<<".format(self.FSIIter))
+- self.MPIPrint('\nLaunching fluid solver for a steady computation...')
+- # --- Fluid solver call for FSI subiteration ---#
+- Iter = 0
+- FluidSolver.ResetConvergence()
+- while Iter < NbIter:
+- FluidSolver.PreprocessExtIter(Iter)
+- FluidSolver.Run()
+- StopIntegration = FluidSolver.Monitor(Iter)
+- FluidSolver.Output(Iter)
+- if StopIntegration:
+- break;
+- Iter += 1
+-
+- # --- Surface fluid loads interpolation and communication ---#
+- self.MPIPrint('\nProcessing interface fluid loads...\n')
++ # --- External FSI loop --- #
++ self.FSIIter = 0
++ while self.FSIIter < NbFSIIterMax:
++ self.MPIPrint("\n>>>> FSI iteration {} <<<<".format(self.FSIIter))
++ self.MPIPrint('\nLaunching fluid solver for a steady computation...')
++ # --- Fluid solver call for FSI subiteration ---#
++ Iter = 0
++ FluidSolver.ResetConvergence()
++ while Iter < NbIter:
++ FluidSolver.PreprocessExtIter(Iter)
++ FluidSolver.Run()
++ StopIntegration = FluidSolver.Monitor(Iter)
++ FluidSolver.Output(Iter)
++ if StopIntegration:
++ break;
++ Iter += 1
++
++ # --- Surface fluid loads interpolation and communication ---#
++ self.MPIPrint('\nProcessing interface fluid loads...\n')
+ self.MPIBarrier()
+- self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
++ self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
+ self.MPIBarrier()
+- self.interpolateFluidLoadsOnSolidMesh(FSI_config)
+- self.setSolidInterfaceLoads(SolidSolver, FSI_config, 0.05)
+-
+- # --- Solid solver call for FSI subiteration --- #
+- self.MPIPrint('\nLaunching solid solver for a static computation...\n')
++ self.interpolateFluidLoadsOnSolidMesh(FSI_config)
++ self.setSolidInterfaceLoads(SolidSolver, FSI_config, 0.05)
++
++ # --- Solid solver call for FSI subiteration --- #
++ self.MPIPrint('\nLaunching solid solver for a static computation...\n')
+ if myid in self.solidSolverProcessors:
+- if FSI_config['CSD_SOLVER'] == 'NATIVE':
+- SolidSolver.staticComputation()
++ if FSI_config['CSD_SOLVER'] == 'NATIVE':
++ SolidSolver.staticComputation()
+ else:
+ SolidSolver.run(0.0, 0.05)
+- SolidSolver.writeSolution(0.0, self.FSIIter, Iter, NbIter)
++ SolidSolver.writeSolution(0.0, self.FSIIter, Iter, NbIter)
+
+- # --- Compute and monitor the FSI residual --- #
+- varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
+- self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
++ # --- Compute and monitor the FSI residual --- #
++ varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
++ self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
+ self.writeFSIHistory(0, 0.0, varCoordNorm, False)
+- if varCoordNorm < FSITolerance:
+- break
++ if varCoordNorm < FSITolerance:
++ break
+
+ # --- Relaxe the solid displacement and update the solid solution --- #
+ self.MPIPrint('\nProcessing interface displacements...\n')
+- self.relaxSolidPosition(FSI_config)
++ self.relaxSolidPosition(FSI_config)
+ if myid in self.solidSolverProcessors:
+ SolidSolver.updateSolution()
+-
+- # --- Mesh morphing step (displacement interpolation, displacements communication, and mesh morpher call) --- #
+- self.interpolateSolidPositionOnFluidMesh(FSI_config)
+- self.MPIPrint('\nPerforming static mesh deformation...\n')
+- self.setFluidInterfaceVarCoord(FluidSolver)
+- FluidSolver.StaticMeshUpdate()
+- self.FSIIter += 1
++
++ # --- Mesh morphing step (displacement interpolation, displacements communication, and mesh morpher call) --- #
++ self.interpolateSolidPositionOnFluidMesh(FSI_config)
++ self.MPIPrint('\nPerforming static mesh deformation...\n')
++ self.setFluidInterfaceVarCoord(FluidSolver)
++ FluidSolver.StaticMeshUpdate()
++ self.FSIIter += 1
+
+ self.MPIBarrier()
+
+- self.MPIPrint('\nBGS is converged (strong coupling)')
+- self.MPIPrint(' ')
+- self.MPIPrint('*************************')
+- self.MPIPrint('* End FSI computation *')
+- self.MPIPrint('*************************')
+- self.MPIPrint(' ')
++ self.MPIPrint('\nBGS is converged (strong coupling)')
++ self.MPIPrint(' ')
++ self.MPIPrint('*************************')
++ self.MPIPrint('* End FSI computation *')
++ self.MPIPrint('*************************')
++ self.MPIPrint(' ')
+diff -Naur old/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py new/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py
+--- old/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py 2020-05-01 19:09:18.000000000 +0300
++++ new/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py 2020-05-10 16:17:07.000000000 +0300
+@@ -174,9 +174,9 @@
+
+ with open(self.Config_file) as configfile:
+ while 1:
+- line = configfile.readline()
+- if not line:
+- break
++ line = configfile.readline()
++ if not line:
++ break
+
+ # remove line returns
+ line = line.strip('\r\n')
+@@ -189,41 +189,41 @@
+ this_value = line[1].strip()
+
+ for case in switch(this_param):
+- #integer values
+- #if case("NB_FSI_ITER") :
+- #self.Config[this_param] = int(this_value)
+- #break
+-
+- #float values
+- if case("DELTA_T") : pass
+- if case("START_TIME") : pass
+- if case("STOP_TIME") : pass
+- if case("SPRING_MASS") : pass
+- if case("INERTIA_FLEXURAL") : pass
+- if case("SPRING_STIFFNESS") : pass
+- if case("SPRING_DAMPING") : pass
+- if case("TORSIONAL_STIFFNESS") : pass
+- if case("TORSIONAL_DAMPING") : pass
+- if case("CORD") : pass
+- if case("FLEXURAL_AXIS") : pass
+- if case("GRAVITY_CENTER") : pass
+- if case("INITIAL_DISP") : pass
+- if case("INITIAL_ANGLE") : pass
+- if case("RHO") :
+- self.Config[this_param] = float(this_value)
+- break
+-
+- #string values
+- if case("TIME_MARCHING") : pass
+- if case("MESH_FILE") : pass
+- if case("CSD_SOLVER") : pass
+- if case("MOVING_MARKER") : pass
+- if case("STRUCT_TYPE") :
+- self.Config[this_param] = this_value
+- break
++ #integer values
++ #if case("NB_FSI_ITER") :
++ #self.Config[this_param] = int(this_value)
++ #break
++
++ #float values
++ if case("DELTA_T") : pass
++ if case("START_TIME") : pass
++ if case("STOP_TIME") : pass
++ if case("SPRING_MASS") : pass
++ if case("INERTIA_FLEXURAL") : pass
++ if case("SPRING_STIFFNESS") : pass
++ if case("SPRING_DAMPING") : pass
++ if case("TORSIONAL_STIFFNESS") : pass
++ if case("TORSIONAL_DAMPING") : pass
++ if case("CORD") : pass
++ if case("FLEXURAL_AXIS") : pass
++ if case("GRAVITY_CENTER") : pass
++ if case("INITIAL_DISP") : pass
++ if case("INITIAL_ANGLE") : pass
++ if case("RHO") :
++ self.Config[this_param] = float(this_value)
++ break
++
++ #string values
++ if case("TIME_MARCHING") : pass
++ if case("MESH_FILE") : pass
++ if case("CSD_SOLVER") : pass
++ if case("MOVING_MARKER") : pass
++ if case("STRUCT_TYPE") :
++ self.Config[this_param] = this_value
++ break
+
+- if case():
+- print(this_param + " is an invalid option !")
++ if case():
++ print(this_param + " is an invalid option !")
+ break
+
+ def __readSU2Mesh(self):
+@@ -233,78 +233,78 @@
+ print('Opened mesh file ' + self.Mesh_file + '.')
+ while 1:
+ line = meshfile.readline()
+- if not line:
+- break
++ if not line:
++ break
+
+- pos = line.find('NDIM')
+- if pos != -1:
+- line = line.strip('\r\n')
++ pos = line.find('NDIM')
++ if pos != -1:
++ line = line.strip('\r\n')
+ line = line.split("=",1)
+- self.nDim = int(line[1])
+- continue
+-
+- pos = line.find('NELEM')
+- if pos != -1:
+- line = line.strip('\r\n')
++ self.nDim = int(line[1])
++ continue
++
++ pos = line.find('NELEM')
++ if pos != -1:
++ line = line.strip('\r\n')
+ line = line.split("=",1)
+- self.nElem = int(line[1])
+- continue
++ self.nElem = int(line[1])
++ continue
+
+- pos = line.find('NPOIN')
+- if pos != -1:
+- line = line.strip('\r\n')
++ pos = line.find('NPOIN')
++ if pos != -1:
++ line = line.strip('\r\n')
+ line = line.split("=",1)
+- self.nPoint = int(line[1])
++ self.nPoint = int(line[1])
+ for iPoint in range(self.nPoint):
+- self.node.append(Point())
+- line = meshfile.readline()
+- line = line.strip('\r\n')
+- line = line.split(' ',self.nDim)
+- x = float(line[0])
+- y = float(line[1])
++ self.node.append(Point())
++ line = meshfile.readline()
++ line = line.strip('\r\n')
++ line = line.split(' ',self.nDim)
++ x = float(line[0])
++ y = float(line[1])
+ z = 0.0
+- if self.nDim == 3:
+- z = float(line[2])
+- self.node[iPoint].SetCoord((x,y,z))
++ if self.nDim == 3:
++ z = float(line[2])
++ self.node[iPoint].SetCoord((x,y,z))
+ self.node[iPoint].SetCoord0((x,y,z))
+- self.node[iPoint].SetCoord_n((x,y,z))
+- continue
++ self.node[iPoint].SetCoord_n((x,y,z))
++ continue
+
+- pos = line.find('NMARK')
+- if pos != -1:
+- line = line.strip('\r\n')
++ pos = line.find('NMARK')
++ if pos != -1:
++ line = line.strip('\r\n')
+ line = line.split("=",1)
+- self.nMarker = int(line[1])
+- continue
++ self.nMarker = int(line[1])
++ continue
+
+- pos = line.find('MARKER_TAG')
+- if pos != -1:
+- line = line.strip('\r\n')
+- line = line.replace(" ", "")
++ pos = line.find('MARKER_TAG')
++ if pos != -1:
++ line = line.strip('\r\n')
++ line = line.replace(" ", "")
+ line = line.split("=",1)
+- markerTag = line[1]
+- if markerTag == self.FSI_marker:
+- self.markers[markerTag] = []
+- line = meshfile.readline()
+- line = line.strip('\r\n')
+- line = line.split("=",1)
+- nElem = int(line[1])
+- for iElem in range(nElem):
+- line = meshfile.readline()
+- line = line.strip('\r\n')
+- line = line.split(' ',1)
+- elemType = int(line[0])
+- if elemType == 3:
+- nodes = line[1].split(' ', 1)
+- if not int(nodes[0]) in self.markers[markerTag]:
+- self.markers[markerTag].append(int(nodes[0]))
+- if not int(nodes[1]) in self.markers[markerTag]:
+- self.markers[markerTag].append(int(nodes[1]))
+- else:
+- print("Element type {} is not recognized !!".format(elemType))
+- continue
+- else:
+- continue
++ markerTag = line[1]
++ if markerTag == self.FSI_marker:
++ self.markers[markerTag] = []
++ line = meshfile.readline()
++ line = line.strip('\r\n')
++ line = line.split("=",1)
++ nElem = int(line[1])
++ for iElem in range(nElem):
++ line = meshfile.readline()
++ line = line.strip('\r\n')
++ line = line.split(' ',1)
++ elemType = int(line[0])
++ if elemType == 3:
++ nodes = line[1].split(' ', 1)
++ if not int(nodes[0]) in self.markers[markerTag]:
++ self.markers[markerTag].append(int(nodes[0]))
++ if not int(nodes[1]) in self.markers[markerTag]:
++ self.markers[markerTag].append(int(nodes[1]))
++ else:
++ print("Element type {} is not recognized !!".format(elemType))
++ continue
++ else:
++ continue
+
+ print("Number of dimensions: {}".format(self.nDim))
+ print("Number of elements: {}".format(self.nElem))
+@@ -441,23 +441,23 @@
+ Coord_n = self.node[iPoint].GetCoord_n()
+
+ if self.Unsteady:
+- r = Coord_n - self.centerOfRotation_n
+- else:
+- r = Coord - self.centerOfRotation
++ r = Coord_n - self.centerOfRotation_n
++ else:
++ r = Coord - self.centerOfRotation
+
+- rotCoord = rotMatrix.dot(r)
++ rotCoord = rotMatrix.dot(r)
+
+ newCoord = newCenter + rotCoord
+ newVel[0] = Centerdot[0]+psidot*(newCoord[1]-newCenter[1])
+- newVel[1] = Centerdot[1]-psidot*(newCoord[0]-newCenter[0])
+- newVel[2] = Centerdot[2]+0.0
++ newVel[1] = Centerdot[1]-psidot*(newCoord[0]-newCenter[0])
++ newVel[2] = Centerdot[2]+0.0
+
+ self.node[iPoint].SetCoord((newCoord[0], newCoord[1], newCoord[2]))
+ self.node[iPoint].SetVel((newVel[0], newVel[1], newVel[2]))
+
+- if initialize:
+- self.node[iPoint].SetCoord_n((newCoord[0], newCoord[1], newCoord[2]))
+- self.node[iPoint].SetVel_n((newVel[0], newVel[1], newVel[2]))
++ if initialize:
++ self.node[iPoint].SetCoord_n((newCoord[0], newCoord[1], newCoord[2]))
++ self.node[iPoint].SetVel_n((newVel[0], newVel[1], newVel[2]))
+
+ self.centerOfRotation = np.copy(newCenter)
+
+diff -Naur old/SU2_PY/FSI/io/FSI_config.py new/SU2_PY/FSI/io/FSI_config.py
+--- old/SU2_PY/FSI/io/FSI_config.py 2020-05-01 19:09:18.000000000 +0300
++++ new/SU2_PY/FSI/io/FSI_config.py 2020-05-10 16:17:07.000000000 +0300
+@@ -58,23 +58,23 @@
+ self.readConfig()
+
+ def __str__(self):
+- tempString = str()
+- for key, value in self._ConfigContent.items():
+- tempString += "{} = {}\n".format(key,value)
+- return tempString
++ tempString = str()
++ for key, value in self._ConfigContent.items():
++ tempString += "{} = {}\n".format(key,value)
++ return tempString
+
+ def __getitem__(self,key):
+- return self._ConfigContent[key]
++ return self._ConfigContent[key]
+
+ def __setitem__(self, key, value):
+- self._ConfigContent[key] = value
++ self._ConfigContent[key] = value
+
+ def readConfig(self):
+ input_file = open(self.ConfigFileName)
+ while 1:
+- line = input_file.readline()
+- if not line:
+- break
++ line = input_file.readline()
++ if not line:
++ break
+ # remove line returns
+ line = line.strip('\r\n')
+ # make sure it has useful data
+@@ -86,46 +86,46 @@
+ this_value = line[1].strip()
+
+ for case in switch(this_param):
+- #integer values
+- if case("NDIM") : pass
+- #if case("MESH_DEF_LIN_ITER") : pass
+- #if case("MESH_DEF_NONLIN_ITER") : pass
+- if case("RESTART_ITER") : pass
+- if case("NB_EXT_ITER") : pass
+- if case("NB_FSI_ITER") :
+- self._ConfigContent[this_param] = int(this_value)
+- break
++ #integer values
++ if case("NDIM") : pass
++ #if case("MESH_DEF_LIN_ITER") : pass
++ #if case("MESH_DEF_NONLIN_ITER") : pass
++ if case("RESTART_ITER") : pass
++ if case("NB_EXT_ITER") : pass
++ if case("NB_FSI_ITER") :
++ self._ConfigContent[this_param] = int(this_value)
++ break
+
+- #float values
++ #float values
+ if case("RBF_RADIUS") : pass
+- if case("AITKEN_PARAM") : pass
+- if case("START_TIME") : pass
+- if case("UNST_TIMESTEP") : pass
+- if case("UNST_TIME") : pass
+- if case("FSI_TOLERANCE") :
+- self._ConfigContent[this_param] = float(this_value)
+- break
+-
+- #string values
+- if case("CFD_CONFIG_FILE_NAME") : pass
+- if case("CSD_SOLVER") : pass
+- if case("CSD_CONFIG_FILE_NAME") : pass
+- if case("RESTART_SOL") : pass
+- if case("MATCHING_MESH") : pass
++ if case("AITKEN_PARAM") : pass
++ if case("START_TIME") : pass
++ if case("UNST_TIMESTEP") : pass
++ if case("UNST_TIME") : pass
++ if case("FSI_TOLERANCE") :
++ self._ConfigContent[this_param] = float(this_value)
++ break
++
++ #string values
++ if case("CFD_CONFIG_FILE_NAME") : pass
++ if case("CSD_SOLVER") : pass
++ if case("CSD_CONFIG_FILE_NAME") : pass
++ if case("RESTART_SOL") : pass
++ if case("MATCHING_MESH") : pass
+ if case("MESH_INTERP_METHOD") : pass
+- if case("DISP_PRED") : pass
+- if case("AITKEN_RELAX") : pass
+- if case("TIME_MARCHING") : pass
+- if case("INTERNAL_FLOW") :
+- #if case("MESH_DEF_METHOD") : pass
+- self._ConfigContent[this_param] = this_value
+- break
+-
+- if case():
+- print(this_param + " is an invalid option !")
+- break
+- #end for
+-
++ if case("DISP_PRED") : pass
++ if case("AITKEN_RELAX") : pass
++ if case("TIME_MARCHING") : pass
++ if case("INTERNAL_FLOW") :
++ #if case("MESH_DEF_METHOD") : pass
++ self._ConfigContent[this_param] = this_value
++ break
++
++ if case():
++ print(this_param + " is an invalid option !")
++ break
++ #end for
++
+
+
+ #def dump()
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [gentoo-commits] repo/proj/guru:dev commit in: sci-physics/SU2/files/, sci-physics/SU2/
@ 2021-01-05 13:54 Sergey Torokhov
0 siblings, 0 replies; 7+ messages in thread
From: Sergey Torokhov @ 2021-01-05 13:54 UTC (permalink / raw
To: gentoo-commits
commit: e1fd2891cb156ed9644f31cdcdefbe269ba24cd2
Author: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
AuthorDate: Tue Jan 5 13:43:30 2021 +0000
Commit: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
CommitDate: Tue Jan 5 13:43:30 2021 +0000
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=e1fd2891
sci-physics/SU2: drop old 7.0.6, 7.0.7
Signed-off-by: Sergey Torokhov <torokhov-s-a <AT> yandex.ru>
sci-physics/SU2/Manifest | 4 -
sci-physics/SU2/SU2-7.0.6.ebuild | 115 -
sci-physics/SU2/SU2-7.0.7.ebuild | 114 -
.../SU2/files/SU2-7.0.4-fix-python-optimize.patch | 2302 --------------------
sci-physics/SU2/files/SU2-7.0.6-fix-env.patch | 12 -
sci-physics/SU2/files/SU2-7.0.7-fix-env.patch | 12 -
.../SU2/files/SU2-7.0.7-fix-python-optimize.patch | 2212 -------------------
7 files changed, 4771 deletions(-)
diff --git a/sci-physics/SU2/Manifest b/sci-physics/SU2/Manifest
index 7b30d7cd..2fa24c27 100644
--- a/sci-physics/SU2/Manifest
+++ b/sci-physics/SU2/Manifest
@@ -1,7 +1,3 @@
-DIST SU2-7.0.6-TestCases.tar.gz 447944839 BLAKE2B 5212ef7bf69bb40120ca2af99a02f2a89ae6cc0a1e048e57409ee1d2911f930452f4a5ef668126d6b7144c3f81d50bdadd0bcc810f0472740ccbbb6605e5a07d SHA512 c976450e7e17df58b47cbf14d18c4435f977a70dc086d5b74ea584ae14b3204632ef87b2dce6a456396179f1b72ef8eba83065a42d978b8d6966d5446decbd3c
-DIST SU2-7.0.6-Tutorials.tar.gz 64282244 BLAKE2B 3b0ce136c9fa5c3e0ffc585e28b1a60470eeaf2518cbef539fccc185f79cd41a889e3c3c8a0ada3f488cfe1d2d0115e2768267c6ef4502b882b07f909f6f382c SHA512 4aaf39b98cbbe4c9e12d78027b0ee2b3d30fd614d1e48092d8bfd25c312a06a1621b2192653a7d8ac767762b06ae339ab6fb77e81f833efdb419ce09f92dec2f
-DIST SU2-7.0.6.tar.gz 20531872 BLAKE2B 30e59bc6876223d87429b79f101a5705f989096a1b81725aa20012567d15b08b6a8a24140cc76b35c6c3657a1d6afa85d56da699ab38dac85714e296d7ad8531 SHA512 a4619dd969c6d9cb20de1d373c8e0af9d56654f9f96d919662897db4c3c8bf52b45fb1239065d480ba1b4f05ba7a17c9540ff3fe47fb0d96864736200cda8bcc
DIST SU2-7.0.7-TestCases.tar.gz 448969006 BLAKE2B 6c886824b55d7f8516d2ea69e2f7bef36a40986f4f715da46d91f851eb59390329433c6941a280eca34ad675633b2f1b01a897d1db8d177a5c4f770b286d0625 SHA512 0884b4f750dbcfd3f2cb0e71d6005932e4edd90a50fa84eb484f6c0c523930ddebfb3ed4315161b8fdeff911a52fa72b6d79739c8e19cd634b9823e007520213
DIST SU2-7.0.7-Tutorials.tar.gz 64282235 BLAKE2B 7a6b780ee6f01d26a7a7d4751ca39798af56cfd7b99ca3e13fdff61aecd631a3aa4c98a487f48a8b2593c711ee25bd1ddc90a316bde2c287e95a383321f1d5e9 SHA512 189b5da96f08689b62ba3c42ee349edd2e145f371112895587e53497f16de3d6fdbf17308af39961775d76e3169c40872ced8e267146b6da5ae12d31a4c70fa9
-DIST SU2-7.0.7.tar.gz 20618138 BLAKE2B c823ea59fd28547b78c4694d45995e83c5f2c16229c40d20b951cdd62a98e13c77c07cffa87a1ec105b29a597878c7a2342c6ac90c7c9751ed20f876194a55e1 SHA512 c5dacc8b2f4ab7eb72852d8e6ae59c0800e8126faf20641135fa31ec42915b8e3553082e328b2b158e3e337f7aab0a932b6b1f875d3c0191db538bb923affcf3
DIST SU2-7.0.8.tar.gz 20554206 BLAKE2B ac291eeae696197f5875839defa98bde550c5250b5a5cff8049e0d1c8184c5ec6d225b77618d079a8fb3d5a7f4d0531a0b2931fd15e045299fa55c7dd03d9fd1 SHA512 26ed8c39d2dfcdb3fc4e1c986c64f683f44cd4123ce5f7a482c4557a82b04b4bd8ef1f04332ab36ad0f987cfb98053fb8b30ef81faf51c7c56aebc1a30467df9
diff --git a/sci-physics/SU2/SU2-7.0.6.ebuild b/sci-physics/SU2/SU2-7.0.6.ebuild
deleted file mode 100644
index bc5b90fe..00000000
--- a/sci-physics/SU2/SU2-7.0.6.ebuild
+++ /dev/null
@@ -1,115 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-PYTHON_COMPAT=( python3_{7,8} )
-
-inherit meson python-single-r1
-
-DESCRIPTION="SU2: An Open-Source Suite for Multiphysics Simulation and Design"
-HOMEPAGE="https://su2code.github.io/"
-SRC_URI="
- https://github.com/su2code/SU2/archive/v${PV}.tar.gz -> ${P}.tar.gz
- test? ( https://github.com/su2code/TestCases/archive/v${PV}.tar.gz -> ${P}-TestCases.tar.gz )
- tutorials? ( https://github.com/su2code/Tutorials/archive/v${PV}.tar.gz -> ${P}-Tutorials.tar.gz )
-"
-
-LICENSE="LGPL-2.1"
-SLOT="0"
-KEYWORDS="~amd64"
-
-# cgns, metis, parmetis are bundled;
-# omp is disable as it's experimental;
-# pastix is disabled as it's try to find bundled libs;
-IUSE="cgns -mkl +mpi openblas tecio test tutorials"
-RESTRICT="!test? ( test )"
-REQUIRED_USE="
- ${PYTHON_REQUIRED_USE}
- mkl? ( !openblas )
-"
-
-RDEPEND="
- ${PYTHON_DEPS}
- mpi? ( virtual/mpi[cxx] )
- mkl? ( sci-libs/mkl )
- openblas? ( sci-libs/openblas )
-"
-DEPEND="
- ${RDEPEND}
- tecio? ( dev-libs/boost:= )
-"
-BDEPEND="virtual/pkgconfig"
-
-PATCHES=(
- "${FILESDIR}/${P}-fix-env.patch"
- "${FILESDIR}/${PN}-7.0.4-unbundle_boost.patch"
- "${FILESDIR}/${PN}-7.0.4-fix-python-optimize.patch"
-)
-
-DOCS=( "LICENSE.md" "README.md" "SU2_PY/documentation.txt" )
-
-src_unpack() {
- unpack "${P}.tar.gz"
- if use test ; then
- einfo "Unpacking ${P}-TestCases.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}/TestCases"
- tar -C "${P}"/TestCases --strip-components=1 -xzf "${DISTDIR}/${P}-TestCases.tar.gz" || die
- fi
- if use tutorials ; then
- einfo "Unpacking ${P}-Tutorials.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}"
- mkdir "${P}"/Tutorials
- tar -C "${P}"/Tutorials --strip-components=1 -xzf "${DISTDIR}/${P}-Tutorials.tar.gz" || die
- fi
-}
-
-src_configure() {
- local emesonargs=(
- -Denable-autodiff=false
- -Denable-directdiff=false
- -Denable-pastix=false
- -Denable-pywrapper=false
- -Dwith-omp=false
- $(meson_feature mpi with-mpi)
- $(meson_use cgns enable-cgns)
- $(meson_use mkl enable-mkl)
- $(meson_use openblas enable-openblas)
- $(meson_use tecio enable-tecio)
- $(meson_use test enable-tests)
- )
- meson_src_configure
-}
-
-src_test() {
- ln -s ../../${P}-build/SU2_CFD/src/SU2_CFD SU2_PY/SU2_CFD
- ln -s ../../${P}-build/SU2_DEF/src/SU2_DEF SU2_PY/SU2_DEF
- ln -s ../../${P}-build/SU2_DOT/src/SU2_DOT SU2_PY/SU2_DOT
- ln -s ../../${P}-build/SU2_GEO/src/SU2_GEO SU2_PY/SU2_GEO
- ln -s ../../${P}-build/SU2_MSH/src/SU2_MSH SU2_PY/SU2_MSH
- ln -s ../../${P}-build/SU2_SOL/src/SU2_SOL SU2_PY/SU2_SOL
-
- export SU2_RUN="${S}/SU2_PY"
- export SU2_HOME="${S}"
- export PATH=$PATH:$SU2_RUN
- export PYTHONPATH=$PYTHONPATH:$SU2_RUN
-
- einfo "Running UnitTests ..."
- ../${P}-build/UnitTests/test_driver
-
- pushd TestCases/
- use mpi && python parallel_regression.py
- use mpi || python serial_regression.py
- use tutorials && use mpi && python tutorials.py
- popd
-}
-
-src_install() {
- meson_src_install
- mkdir -p "${ED}$(python_get_sitedir)"
- mv "${ED}"/usr/bin/{FSI,SU2,*.py} -t "${ED}$(python_get_sitedir)"
- python_optimize "${D}/$(python_get_sitedir)"
-
- if use tutorials ; then
- insinto "/usr/share/${P}"
- doins -r Tutorials
- fi
-}
diff --git a/sci-physics/SU2/SU2-7.0.7.ebuild b/sci-physics/SU2/SU2-7.0.7.ebuild
deleted file mode 100644
index 1da4b45d..00000000
--- a/sci-physics/SU2/SU2-7.0.7.ebuild
+++ /dev/null
@@ -1,114 +0,0 @@
-# Copyright 1999-2020 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=7
-
-PYTHON_COMPAT=( python3_{7,8} )
-
-inherit meson python-single-r1
-
-DESCRIPTION="SU2: An Open-Source Suite for Multiphysics Simulation and Design"
-HOMEPAGE="https://su2code.github.io/"
-SRC_URI="
- https://github.com/su2code/SU2/archive/v${PV}.tar.gz -> ${P}.tar.gz
- test? ( https://github.com/su2code/TestCases/archive/v${PV}.tar.gz -> ${P}-TestCases.tar.gz )
- tutorials? ( https://github.com/su2code/Tutorials/archive/v${PV}.tar.gz -> ${P}-Tutorials.tar.gz )
-"
-
-LICENSE="LGPL-2.1"
-SLOT="0"
-KEYWORDS="~amd64"
-
-# cgns, metis, parmetis are bundled;
-# omp is disable as it's experimental;
-# pastix is disabled as it's try to find bundled libs;
-IUSE="cgns -mkl +mpi openblas tecio test tutorials"
-RESTRICT="!test? ( test )"
-REQUIRED_USE="
- ${PYTHON_REQUIRED_USE}
- mkl? ( !openblas )
-"
-
-RDEPEND="
- ${PYTHON_DEPS}
- mpi? ( virtual/mpi[cxx] )
- mkl? ( sci-libs/mkl )
- openblas? ( sci-libs/openblas )
-"
-DEPEND="
- ${RDEPEND}
- tecio? ( dev-libs/boost:= )
-"
-BDEPEND="virtual/pkgconfig"
-
-PATCHES=(
- "${FILESDIR}/${P}-fix-env.patch"
- "${FILESDIR}/${PN}-7.0.4-unbundle_boost.patch"
- "${FILESDIR}/${P}-fix-python-optimize.patch"
-)
-
-DOCS=( "LICENSE.md" "README.md" "SU2_PY/documentation.txt" )
-
-src_unpack() {
- unpack "${P}.tar.gz"
- if use test ; then
- einfo "Unpacking ${P}-TestCases.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}/TestCases"
- tar -C "${P}"/TestCases --strip-components=1 -xzf "${DISTDIR}/${P}-TestCases.tar.gz" || die
- fi
- if use tutorials ; then
- einfo "Unpacking ${P}-Tutorials.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}"
- mkdir "${P}"/Tutorials
- tar -C "${P}"/Tutorials --strip-components=1 -xzf "${DISTDIR}/${P}-Tutorials.tar.gz" || die
- fi
-}
-
-src_configure() {
- local emesonargs=(
- -Denable-autodiff=false
- -Denable-directdiff=false
- -Denable-pastix=false
- -Denable-pywrapper=false
- -Dwith-omp=false
- $(meson_feature mpi with-mpi)
- $(meson_use cgns enable-cgns)
- $(meson_use mkl enable-mkl)
- $(meson_use openblas enable-openblas)
- $(meson_use tecio enable-tecio)
- $(meson_use test enable-tests)
- )
- meson_src_configure
-}
-
-src_test() {
- ln -s ../../${P}-build/SU2_CFD/src/SU2_CFD SU2_PY/SU2_CFD
- ln -s ../../${P}-build/SU2_DEF/src/SU2_DEF SU2_PY/SU2_DEF
- ln -s ../../${P}-build/SU2_DOT/src/SU2_DOT SU2_PY/SU2_DOT
- ln -s ../../${P}-build/SU2_GEO/src/SU2_GEO SU2_PY/SU2_GEO
- ln -s ../../${P}-build/SU2_SOL/src/SU2_SOL SU2_PY/SU2_SOL
-
- export SU2_RUN="${S}/SU2_PY"
- export SU2_HOME="${S}"
- export PATH=$PATH:$SU2_RUN
- export PYTHONPATH=$PYTHONPATH:$SU2_RUN
-
- einfo "Running UnitTests ..."
- ../${P}-build/UnitTests/test_driver
-
- pushd TestCases/
- use mpi && python parallel_regression.py
- use mpi || python serial_regression.py
- use tutorials && use mpi && python tutorials.py
- popd
-}
-
-src_install() {
- meson_src_install
- mkdir -p "${ED}$(python_get_sitedir)"
- mv "${ED}"/usr/bin/{FSI,SU2,*.py} -t "${ED}$(python_get_sitedir)"
- python_optimize "${D}/$(python_get_sitedir)"
-
- if use tutorials ; then
- insinto "/usr/share/${P}"
- doins -r Tutorials
- fi
-}
diff --git a/sci-physics/SU2/files/SU2-7.0.4-fix-python-optimize.patch b/sci-physics/SU2/files/SU2-7.0.4-fix-python-optimize.patch
deleted file mode 100644
index 6ad7387e..00000000
--- a/sci-physics/SU2/files/SU2-7.0.4-fix-python-optimize.patch
+++ /dev/null
@@ -1,2302 +0,0 @@
-diff -Naur old/SU2_PY/FSI/FSIInterface.py new/SU2_PY/FSI/FSIInterface.py
---- old/SU2_PY/FSI/FSIInterface.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/FSI/FSIInterface.py 2020-05-10 16:17:07.000000000 +0300
-@@ -6,8 +6,8 @@
- # \version 7.0.4 "Blackbird"
- #
- # SU2 Project Website: https://su2code.github.io
--#
--# The SU2 Project is maintained by the SU2 Foundation
-+#
-+# The SU2 Project is maintained by the SU2 Foundation
- # (http://su2foundation.org)
- #
- # Copyright 2012-2020, SU2 Contributors (cf. AUTHORS.md)
-@@ -16,7 +16,7 @@
- # modify it under the terms of the GNU Lesser General Public
- # License as published by the Free Software Foundation; either
- # version 2.1 of the License, or (at your option) any later version.
--#
-+#
- # SU2 is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-@@ -42,19 +42,19 @@
- # ----------------------------------------------------------------------
-
- class Interface:
-- """
-+ """
- FSI interface class that handles fluid/solid solvers synchronisation and communication
- """
--
-+
- def __init__(self, FSI_config, FluidSolver, SolidSolver, have_MPI):
-- """
-- Class constructor. Declare some variables and do some screen outputs.
-- """
--
-+ """
-+ Class constructor. Declare some variables and do some screen outputs.
-+ """
-+
- if have_MPI == True:
- from mpi4py import MPI
- self.MPI = MPI
-- self.comm = MPI.COMM_WORLD #MPI World communicator
-+ self.comm = MPI.COMM_WORLD #MPI World communicator
- self.have_MPI = True
- myid = self.comm.Get_rank()
- else:
-@@ -62,42 +62,42 @@
- self.have_MPI = False
- myid = 0
-
-- self.rootProcess = 0 #the root process is chosen to be MPI rank = 0
-+ self.rootProcess = 0 #the root process is chosen to be MPI rank = 0
-
-- self.nDim = FSI_config['NDIM'] #problem dimension
-+ self.nDim = FSI_config['NDIM'] #problem dimension
-
-- self.haveFluidSolver = False #True if the fluid solver is initialized on the current rank
-- self.haveSolidSolver = False #True if the solid solver is initialized on the current rank
-- self.haveFluidInterface = False #True if the current rank owns at least one fluid interface node
-- self.haveSolidInterface = False #True if the current rank owns at least one solid interface node
-+ self.haveFluidSolver = False #True if the fluid solver is initialized on the current rank
-+ self.haveSolidSolver = False #True if the solid solver is initialized on the current rank
-+ self.haveFluidInterface = False #True if the current rank owns at least one fluid interface node
-+ self.haveSolidInterface = False #True if the current rank owns at least one solid interface node
-
-- self.fluidSolverProcessors = list() #list of partitions where the fluid solver is initialized
-- self.solidSolverProcessors = list() #list of partitions where the solid solver is initialized
-+ self.fluidSolverProcessors = list() #list of partitions where the fluid solver is initialized
-+ self.solidSolverProcessors = list() #list of partitions where the solid solver is initialized
- self.fluidInterfaceProcessors = list() #list of partitions where there are fluid interface nodes
-- self.solidInterfaceProcessors = list() #list of partitions where there are solid interface nodes
-+ self.solidInterfaceProcessors = list() #list of partitions where there are solid interface nodes
-
-- self.fluidInterfaceIdentifier = None #object that can identify the f/s interface within the fluid solver
-- self.solidInterfaceIdentifier = None #object that can identify the f/s interface within the solid solver
-+ self.fluidInterfaceIdentifier = None #object that can identify the f/s interface within the fluid solver
-+ self.solidInterfaceIdentifier = None #object that can identify the f/s interface within the solid solver
-
-- self.fluidGlobalIndexRange = {} #contains the global FSI indexing of each fluid interface node for all partitions
-- self.solidGlobalIndexRange = {} #contains the global FSI indexing of each solid interface node for all partitions
-+ self.fluidGlobalIndexRange = {} #contains the global FSI indexing of each fluid interface node for all partitions
-+ self.solidGlobalIndexRange = {} #contains the global FSI indexing of each solid interface node for all partitions
-
-- self.FluidHaloNodeList = {} #contains the the indices (fluid solver indexing) of the halo nodes for each partition
-- self.fluidIndexing = {} #links between the fluid solver indexing and the FSI indexing for the interface nodes
-- self.SolidHaloNodeList = {} #contains the the indices (solid solver indexing) of the halo nodes for each partition
-- self.solidIndexing = {} #links between the solid solver indexing and the FSI indexing for the interface nodes
--
-- self.nLocalFluidInterfaceNodes = 0 #number of nodes (halo nodes included) on the fluid interface, on each partition
-- self.nLocalFluidInterfaceHaloNode = 0 #number of halo nodes on the fluid intrface, on each partition
-- self.nLocalFluidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the fluid interface, on each partition
-- self.nFluidInterfaceNodes = 0 #number of nodes on the fluid interface, sum over all the partitions
-- self.nFluidInterfacePhysicalNodes = 0 #number of physical nodes on the fluid interface, sum over all partitions
--
-- self.nLocalSolidInterfaceNodes = 0 #number of physical nodes on the solid interface, on each partition
-- self.nLocalSolidInterfaceHaloNode = 0 #number of halo nodes on the solid intrface, on each partition
-- self.nLocalSolidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the solid interface, on each partition
-- self.nSolidInterfaceNodes = 0 #number of nodes on the solid interface, sum over all partitions
-- self.nSolidInterfacePhysicalNodes = 0 #number of physical nodes on the solid interface, sum over all partitions
-+ self.FluidHaloNodeList = {} #contains the the indices (fluid solver indexing) of the halo nodes for each partition
-+ self.fluidIndexing = {} #links between the fluid solver indexing and the FSI indexing for the interface nodes
-+ self.SolidHaloNodeList = {} #contains the the indices (solid solver indexing) of the halo nodes for each partition
-+ self.solidIndexing = {} #links between the solid solver indexing and the FSI indexing for the interface nodes
-+
-+ self.nLocalFluidInterfaceNodes = 0 #number of nodes (halo nodes included) on the fluid interface, on each partition
-+ self.nLocalFluidInterfaceHaloNode = 0 #number of halo nodes on the fluid intrface, on each partition
-+ self.nLocalFluidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the fluid interface, on each partition
-+ self.nFluidInterfaceNodes = 0 #number of nodes on the fluid interface, sum over all the partitions
-+ self.nFluidInterfacePhysicalNodes = 0 #number of physical nodes on the fluid interface, sum over all partitions
-+
-+ self.nLocalSolidInterfaceNodes = 0 #number of physical nodes on the solid interface, on each partition
-+ self.nLocalSolidInterfaceHaloNode = 0 #number of halo nodes on the solid intrface, on each partition
-+ self.nLocalSolidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the solid interface, on each partition
-+ self.nSolidInterfaceNodes = 0 #number of nodes on the solid interface, sum over all partitions
-+ self.nSolidInterfacePhysicalNodes = 0 #number of physical nodes on the solid interface, sum over all partitions
-
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- self.MappingMatrixA = None
-@@ -106,83 +106,83 @@
- self.MappingMatrixB_T = None
- self.d_RBF = self.nDim+1
- else:
-- self.MappingMatrix = None #interpolation/mapping matrix for meshes interpolation/mapping
-- self.MappingMatrix_T = None #transposed interpolation/mapping matrix for meshes interpolation/mapping
-+ self.MappingMatrix = None #interpolation/mapping matrix for meshes interpolation/mapping
-+ self.MappingMatrix_T = None #transposed interpolation/mapping matrix for meshes interpolation/mapping
- self.d_RBF = 0
-
-- self.localFluidInterface_array_X_init = None #initial fluid interface position on each partition (used for the meshes mapping)
-+ self.localFluidInterface_array_X_init = None #initial fluid interface position on each partition (used for the meshes mapping)
- self.localFluidInterface_array_Y_init = None
- self.localFluidInterface_array_Z_init = None
-
-- self.haloNodesPositionsInit = {} #initial position of the halo nodes (fluid side only)
-+ self.haloNodesPositionsInit = {} #initial position of the halo nodes (fluid side only)
-
-- self.solidInterface_array_DispX = None #solid interface displacement
-+ self.solidInterface_array_DispX = None #solid interface displacement
- self.solidInterface_array_DispY = None
- self.solidInterface_array_DispZ = None
-
-- self.solidInterfaceResidual_array_X = None #solid interface position residual
-+ self.solidInterfaceResidual_array_X = None #solid interface position residual
- self.solidInterfaceResidual_array_Y = None
- self.solidInterfaceResidual_array_Z = None
-
-- self.solidInterfaceResidualnM1_array_X = None #solid interface position residual at the previous BGS iteration
-+ self.solidInterfaceResidualnM1_array_X = None #solid interface position residual at the previous BGS iteration
- self.solidInterfaceResidualnM1_array_Y = None
- self.solidInterfaceResidualnM1_array_Z = None
--
-- self.fluidInterface_array_DispX = None #fluid interface displacement
-+
-+ self.fluidInterface_array_DispX = None #fluid interface displacement
- self.fluidInterface_array_DispY = None
- self.fluidInterface_array_DispZ = None
-
-- self.fluidLoads_array_X = None #loads on the fluid side of the f/s interface
-+ self.fluidLoads_array_X = None #loads on the fluid side of the f/s interface
- self.fluidLoads_array_Y = None
- self.fluidLoads_array_Z = None
-
-- self.solidLoads_array_X = None #loads on the solid side of the f/s interface
-+ self.solidLoads_array_X = None #loads on the solid side of the f/s interface
- self.solidLoads_array_Y = None
- self.solidLoads_array_Z = None
-
-- self.aitkenParam = FSI_config['AITKEN_PARAM'] #relaxation parameter for the BGS method
-- self.FSIIter = 0 #current FSI iteration
-- self.unsteady = False #flag for steady or unsteady simulation (default is steady)
--
-- # ---Some screen output ---
-- self.MPIPrint('Fluid solver : SU2_CFD')
-- self.MPIPrint('Solid solver : {}'.format(FSI_config['CSD_SOLVER']))
-+ self.aitkenParam = FSI_config['AITKEN_PARAM'] #relaxation parameter for the BGS method
-+ self.FSIIter = 0 #current FSI iteration
-+ self.unsteady = False #flag for steady or unsteady simulation (default is steady)
-+
-+ # ---Some screen output ---
-+ self.MPIPrint('Fluid solver : SU2_CFD')
-+ self.MPIPrint('Solid solver : {}'.format(FSI_config['CSD_SOLVER']))
-
-- if FSI_config['TIME_MARCHING'] == 'YES':
-+ if FSI_config['TIME_MARCHING'] == 'YES':
- self.MPIPrint('Unsteady coupled simulation with physical time step : {} s'.format(FSI_config['UNST_TIMESTEP']))
- self.unsteady = True
-- else:
-- self.MPIPrint('Steady coupled simulation')
-+ else:
-+ self.MPIPrint('Steady coupled simulation')
-
-- if FSI_config['MATCHING_MESH'] == 'YES':
-- self.MPIPrint('Matching fluid-solid interface')
-- else:
-+ if FSI_config['MATCHING_MESH'] == 'YES':
-+ self.MPIPrint('Matching fluid-solid interface')
-+ else:
- if FSI_config['MESH_INTERP_METHOD'] == 'TPS':
-- self.MPIPrint('Non matching fluid-solid interface with Thin Plate Spline interpolation')
-+ self.MPIPrint('Non matching fluid-solid interface with Thin Plate Spline interpolation')
- elif FSI_config['MESH_INTERP_METHOD'] == 'RBF':
- self.MPIPrint('Non matching fluid-solid interface with Radial Basis Function interpolation')
- self.RBF_rad = FSI_config['RBF_RADIUS']
-- self.MPIPrint('Radius value : {}'.format(self.RBF_rad))
-+ self.MPIPrint('Radius value : {}'.format(self.RBF_rad))
- else:
-- self.MPIPrint('Non matching fluid-solid interface with Nearest Neighboor interpolation')
-+ self.MPIPrint('Non matching fluid-solid interface with Nearest Neighboor interpolation')
-
-- self.MPIPrint('Solid predictor : {}'.format(FSI_config['DISP_PRED']))
-+ self.MPIPrint('Solid predictor : {}'.format(FSI_config['DISP_PRED']))
-
-- self.MPIPrint('Maximum number of FSI iterations : {}'.format(FSI_config['NB_FSI_ITER']))
-+ self.MPIPrint('Maximum number of FSI iterations : {}'.format(FSI_config['NB_FSI_ITER']))
-
-- self.MPIPrint('FSI tolerance : {}'.format(FSI_config['FSI_TOLERANCE']))
-+ self.MPIPrint('FSI tolerance : {}'.format(FSI_config['FSI_TOLERANCE']))
-
-- if FSI_config['AITKEN_RELAX'] == 'STATIC':
-- self.MPIPrint('Static Aitken under-relaxation with constant parameter {}'.format(FSI_config['AITKEN_PARAM']))
-- elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
-- self.MPIPrint('Dynamic Aitken under-relaxation with initial parameter {}'.format(FSI_config['AITKEN_PARAM']))
-- else:
-- self.MPIPrint('No Aitken under-relaxation')
-+ if FSI_config['AITKEN_RELAX'] == 'STATIC':
-+ self.MPIPrint('Static Aitken under-relaxation with constant parameter {}'.format(FSI_config['AITKEN_PARAM']))
-+ elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
-+ self.MPIPrint('Dynamic Aitken under-relaxation with initial parameter {}'.format(FSI_config['AITKEN_PARAM']))
-+ else:
-+ self.MPIPrint('No Aitken under-relaxation')
-
- self.MPIPrint('FSI interface is set')
-
- def MPIPrint(self, message):
-- """
-+ """
- Print a message on screen only from the master process.
- """
-
-@@ -198,28 +198,28 @@
- """
- Perform a synchronization barrier in case of parallel run with MPI.
- """
--
-+
- if self.have_MPI == True:
- self.comm.barrier()
-
- def connect(self, FSI_config, FluidSolver, SolidSolver):
-- """
-- Connection between solvers.
-- Creates the communication support between the two solvers.
-- Gets information about f/s interfaces from the two solvers.
-- """
-+ """
-+ Connection between solvers.
-+ Creates the communication support between the two solvers.
-+ Gets information about f/s interfaces from the two solvers.
-+ """
- if self.have_MPI == True:
- myid = self.comm.Get_rank()
-- MPIsize = self.comm.Get_size()
-+ MPIsize = self.comm.Get_size()
- else:
- myid = 0
- MPIsize = 1
--
-- # --- Identify the fluid and solid interfaces and store the number of nodes on both sides (and for each partition) ---
-+
-+ # --- Identify the fluid and solid interfaces and store the number of nodes on both sides (and for each partition) ---
- self.fluidInterfaceIdentifier = None
- self.nLocalFluidInterfaceNodes = 0
- if FluidSolver != None:
-- print('Fluid solver is initialized on process {}'.format(myid))
-+ print('Fluid solver is initialized on process {}'.format(myid))
- self.haveFluidSolver = True
- allMovingMarkersTags = FluidSolver.GetAllMovingMarkersTag()
- allMarkersID = FluidSolver.GetAllBoundaryMarkers()
-@@ -229,23 +229,23 @@
- if allMovingMarkersTags[0] in allMarkersID.keys():
- self.fluidInterfaceIdentifier = allMarkersID[allMovingMarkersTags[0]]
- if self.fluidInterfaceIdentifier != None:
-- self.nLocalFluidInterfaceNodes = FluidSolver.GetNumberVertices(self.fluidInterfaceIdentifier)
-- if self.nLocalFluidInterfaceNodes != 0:
-+ self.nLocalFluidInterfaceNodes = FluidSolver.GetNumberVertices(self.fluidInterfaceIdentifier)
-+ if self.nLocalFluidInterfaceNodes != 0:
- self.haveFluidInterface = True
-- print('Number of interface fluid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalFluidInterfaceNodes))
-- else:
-- pass
-+ print('Number of interface fluid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalFluidInterfaceNodes))
-+ else:
-+ pass
-
-- if SolidSolver != None:
-- print('Solid solver is initialized on process {}'.format(myid))
-+ if SolidSolver != None:
-+ print('Solid solver is initialized on process {}'.format(myid))
- self.haveSolidSolver = True
-- self.solidInterfaceIdentifier = SolidSolver.getFSIMarkerID()
-- self.nLocalSolidInterfaceNodes = SolidSolver.getNumberOfSolidInterfaceNodes(self.solidInterfaceIdentifier)
-- if self.nLocalSolidInterfaceNodes != 0:
-+ self.solidInterfaceIdentifier = SolidSolver.getFSIMarkerID()
-+ self.nLocalSolidInterfaceNodes = SolidSolver.getNumberOfSolidInterfaceNodes(self.solidInterfaceIdentifier)
-+ if self.nLocalSolidInterfaceNodes != 0:
- self.haveSolidInterface = True
- print('Number of interface solid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalSolidInterfaceNodes))
-- else:
-- pass
-+ else:
-+ pass
-
- # --- Exchange information about processors on which the solvers are defined and where the interface nodes are lying ---
- if self.have_MPI == True:
-@@ -266,18 +266,18 @@
- else:
- sendBufSolidInterface = np.array(int(0))
- rcvBufFluid = np.zeros(MPIsize, dtype = int)
-- rcvBufSolid = np.zeros(MPIsize, dtype = int)
-+ rcvBufSolid = np.zeros(MPIsize, dtype = int)
- rcvBufFluidInterface = np.zeros(MPIsize, dtype = int)
-- rcvBufSolidInterface = np.zeros(MPIsize, dtype = int)
-+ rcvBufSolidInterface = np.zeros(MPIsize, dtype = int)
- self.comm.Allgather(sendBufFluid, rcvBufFluid)
- self.comm.Allgather(sendBufSolid, rcvBufSolid)
- self.comm.Allgather(sendBufFluidInterface, rcvBufFluidInterface)
- self.comm.Allgather(sendBufSolidInterface, rcvBufSolidInterface)
- for iProc in range(MPIsize):
-- if rcvBufFluid[iProc] == 1:
-+ if rcvBufFluid[iProc] == 1:
- self.fluidSolverProcessors.append(iProc)
- if rcvBufSolid[iProc] == 1:
-- self.solidSolverProcessors.append(iProc)
-+ self.solidSolverProcessors.append(iProc)
- if rcvBufFluidInterface[iProc] == 1:
- self.fluidInterfaceProcessors.append(iProc)
- if rcvBufSolidInterface[iProc] == 1:
-@@ -285,19 +285,19 @@
- del sendBufFluid, sendBufSolid, rcvBufFluid, rcvBufSolid, sendBufFluidInterface, sendBufSolidInterface, rcvBufFluidInterface, rcvBufSolidInterface
- else:
- self.fluidSolverProcessors.append(0)
-- self.solidSolverProcessors.append(0)
-+ self.solidSolverProcessors.append(0)
- self.fluidInterfaceProcessors.append(0)
- self.solidInterfaceProcessors.append(0)
-
-- self.MPIBarrier()
--
-- # --- Calculate the total number of nodes at the fluid interface (sum over all the partitions) ---
-+ self.MPIBarrier()
-+
-+ # --- Calculate the total number of nodes at the fluid interface (sum over all the partitions) ---
- # Calculate the number of halo nodes on each partition
- self.nLocalFluidInterfaceHaloNode = 0
-- for iVertex in range(self.nLocalFluidInterfaceNodes):
-+ for iVertex in range(self.nLocalFluidInterfaceNodes):
- if FluidSolver.IsAHaloNode(self.fluidInterfaceIdentifier, iVertex) == True:
- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
-- self.FluidHaloNodeList[GlobalIndex] = iVertex
-+ self.FluidHaloNodeList[GlobalIndex] = iVertex
- self.nLocalFluidInterfaceHaloNode += 1
- # Calculate the number of physical (= not halo) nodes on each partition
- self.nLocalFluidInterfacePhysicalNodes = self.nLocalFluidInterfaceNodes - self.nLocalFluidInterfaceHaloNode
-@@ -308,10 +308,10 @@
-
- # Same thing for the solid part
- self.nLocalSolidInterfaceHaloNode = 0
-- #for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ #for iVertex in range(self.nLocalSolidInterfaceNodes):
- #if SoliddSolver.IsAHaloNode(self.fluidInterfaceIdentifier, iVertex) == True:
- #GlobalIndex = SolidSolver.GetVertexGlobalIndex(self.solidInterfaceIdentifier, iVertex)
-- #self.SolidHaloNodeList[GlobalIndex] = iVertex
-+ #self.SolidHaloNodeList[GlobalIndex] = iVertex
- #self.nLocalSolidInterfaceHaloNode += 1
- self.nLocalSolidInterfacePhysicalNodes = self.nLocalSolidInterfaceNodes - self.nLocalSolidInterfaceHaloNode
- if self.have_MPI == True:
-@@ -323,11 +323,11 @@
- # --- Calculate the total number of nodes (with and without halo) at the fluid interface (sum over all the partitions) and broadcast the number accross all processors ---
- sendBuffHalo = np.array(int(self.nLocalFluidInterfaceNodes))
- sendBuffPhysical = np.array(int(self.nLocalFluidInterfacePhysicalNodes))
-- rcvBuffHalo = np.zeros(1, dtype=int)
-+ rcvBuffHalo = np.zeros(1, dtype=int)
- rcvBuffPhysical = np.zeros(1, dtype=int)
-- if self.have_MPI == True:
-+ if self.have_MPI == True:
- self.comm.barrier()
-- self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
-+ self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
- self.comm.Allreduce(sendBuffPhysical,rcvBuffPhysical,op=self.MPI.SUM)
- self.nFluidInterfaceNodes = rcvBuffHalo[0]
- self.nFluidInterfacePhysicalNodes = rcvBuffPhysical[0]
-@@ -339,11 +339,11 @@
- # Same thing for the solid part
- sendBuffHalo = np.array(int(self.nLocalSolidInterfaceNodes))
- sendBuffPhysical = np.array(int(self.nLocalSolidInterfacePhysicalNodes))
-- rcvBuffHalo = np.zeros(1, dtype=int)
-+ rcvBuffHalo = np.zeros(1, dtype=int)
- rcvBuffPhysical = np.zeros(1, dtype=int)
- if self.have_MPI == True:
-- self.comm.barrier()
-- self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
-+ self.comm.barrier()
-+ self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
- self.comm.Allreduce(sendBuffPhysical,rcvBuffPhysical,op=self.MPI.SUM)
- self.nSolidInterfaceNodes = rcvBuffHalo[0]
- self.nSolidInterfacePhysicalNodes = rcvBuffPhysical[0]
-@@ -375,7 +375,7 @@
- if myid in self.fluidInterfaceProcessors:
- globalIndexStart = 0
- for iProc in range(myid):
-- globalIndexStart += self.fluidPhysicalInterfaceNodesDistribution[iProc]
-+ globalIndexStart += self.fluidPhysicalInterfaceNodesDistribution[iProc]
- globalIndexStop = globalIndexStart + self.nLocalFluidInterfacePhysicalNodes-1
- else:
- globalIndexStart = 0
-@@ -387,8 +387,8 @@
- temp[0] = [0,self.nLocalFluidInterfacePhysicalNodes-1]
- self.fluidGlobalIndexRange = list()
- self.fluidGlobalIndexRange.append(temp)
--
-- # Same thing for the solid part
-+
-+ # Same thing for the solid part
- if self.have_MPI == True:
- if myid in self.solidInterfaceProcessors:
- globalIndexStart = 0
-@@ -404,14 +404,14 @@
- temp = {}
- temp[0] = [0,self.nSolidInterfacePhysicalNodes-1]
- self.solidGlobalIndexRange = list()
-- self.solidGlobalIndexRange.append(temp)
-+ self.solidGlobalIndexRange.append(temp)
-
-- self.MPIPrint('Total number of fluid interface nodes (halo nodes included) : {}'.format(self.nFluidInterfaceNodes))
-- self.MPIPrint('Total number of solid interface nodes (halo nodes included) : {}'.format(self.nSolidInterfaceNodes))
-+ self.MPIPrint('Total number of fluid interface nodes (halo nodes included) : {}'.format(self.nFluidInterfaceNodes))
-+ self.MPIPrint('Total number of solid interface nodes (halo nodes included) : {}'.format(self.nSolidInterfaceNodes))
- self.MPIPrint('Total number of fluid interface nodes : {}'.format(self.nFluidInterfacePhysicalNodes))
- self.MPIPrint('Total number of solid interface nodes : {}'.format(self.nSolidInterfacePhysicalNodes))
-
-- self.MPIBarrier()
-+ self.MPIBarrier()
-
- # --- Create all the PETSc vectors required for parallel communication and parallel mesh mapping/interpolation (working for serial too) ---
- if self.have_MPI == True:
-@@ -432,8 +432,8 @@
- self.solidInterface_array_DispY.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- self.solidInterface_array_DispZ.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- self.solidInterface_array_DispX.set(0.0)
-- self.solidInterface_array_DispY.set(0.0)
-- self.solidInterface_array_DispZ.set(0.0)
-+ self.solidInterface_array_DispY.set(0.0)
-+ self.solidInterface_array_DispZ.set(0.0)
-
- if self.have_MPI == True:
- self.fluidInterface_array_DispX = PETSc.Vec().create(self.comm)
-@@ -536,30 +536,30 @@
- self.solidInterfaceResidualnM1_array_Z.set(0.0)
-
- def interfaceMapping(self,FluidSolver, SolidSolver, FSI_config):
-- """
-- Creates the one-to-one mapping between interfaces in case of matching meshes.
-- Creates the interpolation rules between interfaces in case of non-matching meshes.
-- """
-- if self.have_MPI == True:
-+ """
-+ Creates the one-to-one mapping between interfaces in case of matching meshes.
-+ Creates the interpolation rules between interfaces in case of non-matching meshes.
-+ """
-+ if self.have_MPI == True:
- myid = self.comm.Get_rank()
-- MPIsize = self.comm.Get_size()
-+ MPIsize = self.comm.Get_size()
- else:
- myid = 0
- MPIsize = 1
-
-- # --- Get the fluid interface from fluid solver on each partition ---
-- GlobalIndex = int()
-+ # --- Get the fluid interface from fluid solver on each partition ---
-+ GlobalIndex = int()
- localIndex = 0
- fluidIndexing_temp = {}
- self.localFluidInterface_array_X_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
- self.localFluidInterface_array_Y_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
- self.localFluidInterface_array_Z_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
- for iVertex in range(self.nLocalFluidInterfaceNodes):
-- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
-- posx = FluidSolver.GetVertexCoordX(self.fluidInterfaceIdentifier, iVertex)
-- posy = FluidSolver.GetVertexCoordY(self.fluidInterfaceIdentifier, iVertex)
-- posz = FluidSolver.GetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex)
-- if GlobalIndex in self.FluidHaloNodeList[myid].keys():
-+ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
-+ posx = FluidSolver.GetVertexCoordX(self.fluidInterfaceIdentifier, iVertex)
-+ posy = FluidSolver.GetVertexCoordY(self.fluidInterfaceIdentifier, iVertex)
-+ posz = FluidSolver.GetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex)
-+ if GlobalIndex in self.FluidHaloNodeList[myid].keys():
- self.haloNodesPositionsInit[GlobalIndex] = (posx, posy, posz)
- else:
- fluidIndexing_temp[GlobalIndex] = self.__getGlobalIndex('fluid', myid, localIndex)
-@@ -576,17 +576,17 @@
- self.fluidIndexing = fluidIndexing_temp.copy()
- del fluidIndexing_temp
-
-- # --- Get the solid interface from solid solver on each partition ---
-+ # --- Get the solid interface from solid solver on each partition ---
- localIndex = 0
- solidIndexing_temp = {}
-- self.localSolidInterface_array_X = np.zeros(self.nLocalSolidInterfaceNodes)
-+ self.localSolidInterface_array_X = np.zeros(self.nLocalSolidInterfaceNodes)
- self.localSolidInterface_array_Y = np.zeros(self.nLocalSolidInterfaceNodes)
- self.localSolidInterface_array_Z = np.zeros(self.nLocalSolidInterfaceNodes)
- for iVertex in range(self.nLocalSolidInterfaceNodes):
- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
-- posx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
-- posy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
-- posz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
-+ posx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
-+ posy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
-+ posz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.SolidHaloNodeList[myid].keys():
- pass
- else:
-@@ -605,14 +605,14 @@
- del solidIndexing_temp
-
-
-- # --- Create the PETSc parallel interpolation matrix ---
-+ # --- Create the PETSc parallel interpolation matrix ---
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- if self.have_MPI == True:
- self.MappingMatrixA = PETSc.Mat().create(self.comm)
- self.MappingMatrixB = PETSc.Mat().create(self.comm)
- self.MappingMatrixA_T = PETSc.Mat().create(self.comm)
- self.MappingMatrixB_T = PETSc.Mat().create(self.comm)
-- if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
-+ if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
- self.MappingMatrixA.setType('mpiaij')
- self.MappingMatrixB.setType('mpiaij')
- self.MappingMatrixA_T.setType('mpiaij')
-@@ -627,7 +627,7 @@
- self.MappingMatrixB = PETSc.Mat().create()
- self.MappingMatrixA_T = PETSc.Mat().create()
- self.MappingMatrixB_T = PETSc.Mat().create()
-- if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
-+ if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
- self.MappingMatrixA.setType('aij')
- self.MappingMatrixB.setType('aij')
- self.MappingMatrixA_T.setType('aij')
-@@ -637,16 +637,16 @@
- self.MappingMatrixB.setType('aij')
- self.MappingMatrixA_T.setType('aij')
- self.MappingMatrixB_T.setType('aij')
-- self.MappingMatrixA.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
-+ self.MappingMatrixA.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
- self.MappingMatrixA.setUp()
- self.MappingMatrixA.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
-- self.MappingMatrixB.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes+self.d_RBF))
-+ self.MappingMatrixB.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes+self.d_RBF))
- self.MappingMatrixB.setUp()
- self.MappingMatrixB.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
-- self.MappingMatrixA_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
-+ self.MappingMatrixA_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
- self.MappingMatrixA_T.setUp()
- self.MappingMatrixA_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
-- self.MappingMatrixB_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nFluidInterfacePhysicalNodes))
-+ self.MappingMatrixB_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nFluidInterfacePhysicalNodes))
- self.MappingMatrixB_T.setUp()
- self.MappingMatrixB_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
- else:
-@@ -660,21 +660,21 @@
- self.MappingMatrix_T = PETSc.Mat().create()
- self.MappingMatrix.setType('aij')
- self.MappingMatrix_T.setType('aij')
-- self.MappingMatrix.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes))
-+ self.MappingMatrix.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes))
- self.MappingMatrix.setUp()
- self.MappingMatrix.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
-- self.MappingMatrix_T.setSizes((self.nSolidInterfacePhysicalNodes, self.nFluidInterfacePhysicalNodes))
-+ self.MappingMatrix_T.setSizes((self.nSolidInterfacePhysicalNodes, self.nFluidInterfacePhysicalNodes))
- self.MappingMatrix_T.setUp()
- self.MappingMatrix_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
--
--
-+
-+
- # --- Fill the interpolation matrix in parallel (working in serial too) ---
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- self.MPIPrint('Building interpolation matrices...')
- if self.have_MPI == True:
- for iProc in self.solidInterfaceProcessors:
- if myid == iProc:
-- for jProc in self.solidInterfaceProcessors:
-+ for jProc in self.solidInterfaceProcessors:
- self.comm.Send(self.localSolidInterface_array_X, dest=jProc, tag=1)
- self.comm.Send(self.localSolidInterface_array_Y, dest=jProc, tag=2)
- self.comm.Send(self.localSolidInterface_array_Z, dest=jProc, tag=3)
-@@ -726,7 +726,7 @@
- self.TPSMeshMapping_B(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
- else:
- self.NearestNeighboorMeshMapping(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
-- else:
-+ else:
- self.matchingMeshMapping(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
- else:
- if FSI_config['MATCHING_MESH'] == 'NO':
-@@ -735,10 +735,10 @@
- elif FSI_config['MESH_INTERP_METHOD'] == 'TPS' :
- self.TPSMeshMapping_B(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
- else:
-- self.NearestNeighboorMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
-- else:
-+ self.NearestNeighboorMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
-+ else:
- self.matchingMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
--
-+
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- self.MappingMatrixB.assemblyBegin()
- self.MappingMatrixB.assemblyEnd()
-@@ -751,9 +751,9 @@
- self.MappingMatrix_T.assemblyBegin()
- self.MappingMatrix_T.assemblyEnd()
- self.MPIPrint("Interpolation matrix is built.")
--
-+
- self.MPIBarrier()
--
-+
- del self.localSolidInterface_array_X
- del self.localSolidInterface_array_Y
- del self.localSolidInterface_array_Z
-@@ -768,20 +768,20 @@
- myid = 0
-
- # --- Instantiate the spatial indexing ---
-- prop_index = index.Property()
-- prop_index.dimension = self.nDim
-- SolidSpatialTree = index.Index(properties=prop_index)
--
-+ prop_index = index.Property()
-+ prop_index.dimension = self.nDim
-+ SolidSpatialTree = index.Index(properties=prop_index)
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for jVertex in range(nSolidNodes):
- posX = solidInterfaceBuffRcv_X[jVertex]
- posY = solidInterfaceBuffRcv_Y[jVertex]
- posZ = solidInterfaceBuffRcv_Z[jVertex]
-- if self.nDim == 2 :
-- SolidSpatialTree.add(jVertex, (posX, posY))
-- else :
-- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-+ if self.nDim == 2 :
-+ SolidSpatialTree.add(jVertex, (posX, posY))
-+ else :
-+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-
- if self.nFluidInterfacePhysicalNodes != self.nSolidInterfacePhysicalNodes:
- raise Exception("Fluid and solid interface must have the same number of nodes for matching meshes ! ")
-@@ -822,20 +822,20 @@
- myid = 0
-
- # --- Instantiate the spatial indexing ---
-- prop_index = index.Property()
-- prop_index.dimension = self.nDim
-- SolidSpatialTree = index.Index(properties=prop_index)
--
-+ prop_index = index.Property()
-+ prop_index.dimension = self.nDim
-+ SolidSpatialTree = index.Index(properties=prop_index)
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for jVertex in range(nSolidNodes):
- posX = solidInterfaceBuffRcv_X[jVertex]
- posY = solidInterfaceBuffRcv_Y[jVertex]
- posZ = solidInterfaceBuffRcv_Z[jVertex]
-- if self.nDim == 2 :
-- SolidSpatialTree.add(jVertex, (posX, posY))
-- else :
-- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-+ if self.nDim == 2 :
-+ SolidSpatialTree.add(jVertex, (posX, posY))
-+ else :
-+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-
- # --- For each fluid interface node, find the nearest solid interface node and fill the boolean mapping matrix ---
- for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
-@@ -863,20 +863,20 @@
- myid = 0
-
- # --- Instantiate the spatial indexing ---
-- prop_index = index.Property()
-- prop_index.dimension = self.nDim
-- SolidSpatialTree = index.Index(properties=prop_index)
--
-+ prop_index = index.Property()
-+ prop_index.dimension = self.nDim
-+ SolidSpatialTree = index.Index(properties=prop_index)
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for jVertex in range(nSolidNodes):
- posX = solidInterfaceBuffRcv_X[jVertex]
- posY = solidInterfaceBuffRcv_Y[jVertex]
- posZ = solidInterfaceBuffRcv_Z[jVertex]
-- if self.nDim == 2 :
-- SolidSpatialTree.add(jVertex, (posX, posY))
-- else :
-- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-+ if self.nDim == 2 :
-+ SolidSpatialTree.add(jVertex, (posX, posY))
-+ else :
-+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-
- for iVertexSolid in range(self.nLocalSolidInterfaceNodes):
- posX = self.localSolidInterface_array_X[iVertexSolid]
-@@ -915,20 +915,20 @@
- myid = 0
-
- # --- Instantiate the spatial indexing ---
-- prop_index = index.Property()
-- prop_index.dimension = self.nDim
-- SolidSpatialTree = index.Index(properties=prop_index)
--
-+ prop_index = index.Property()
-+ prop_index.dimension = self.nDim
-+ SolidSpatialTree = index.Index(properties=prop_index)
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for jVertex in range(nSolidNodes):
- posX = solidInterfaceBuffRcv_X[jVertex]
- posY = solidInterfaceBuffRcv_Y[jVertex]
- posZ = solidInterfaceBuffRcv_Z[jVertex]
-- if self.nDim == 2 :
-- SolidSpatialTree.add(jVertex, (posX, posY))
-- else :
-- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-+ if self.nDim == 2 :
-+ SolidSpatialTree.add(jVertex, (posX, posY))
-+ else :
-+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-
- for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
- posX = self.localFluidInterface_array_X_init[iVertexFluid]
-@@ -965,7 +965,7 @@
- myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for iVertexSolid in range(self.nLocalSolidInterfaceNodes):
-@@ -999,7 +999,7 @@
- myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
-@@ -1031,7 +1031,7 @@
- """
- phi = 0.0
- eps = distance/rad
--
-+
- if eps < 1:
- phi = ((1.0-eps)**4)*(4.0*eps+1.0)
- else:
-@@ -1044,20 +1044,20 @@
- Description
- """
- phi = 0.0
--
-+
- if distance > 0.0:
- phi = (distance**2)*np.log10(distance)
- else:
- phi = 0.0
-
-- return phi
-+ return phi
-
-
- def interpolateSolidPositionOnFluidMesh(self, FSI_config):
-- """
-- Applies the one-to-one mapping or the interpolaiton rules from solid to fluid mesh.
-- """
-- if self.have_MPI == True:
-+ """
-+ Applies the one-to-one mapping or the interpolaiton rules from solid to fluid mesh.
-+ """
-+ if self.have_MPI == True:
- myid = self.comm.Get_rank()
- MPIsize = self.comm.Get_size()
- else:
-@@ -1110,12 +1110,12 @@
- del gamma_array_DispY
- del gamma_array_DispZ
- del KSP_solver
-- else:
-+ else:
- self.MappingMatrix.mult(self.solidInterface_array_DispX, self.fluidInterface_array_DispX)
- self.MappingMatrix.mult(self.solidInterface_array_DispY, self.fluidInterface_array_DispY)
- self.MappingMatrix.mult(self.solidInterface_array_DispZ, self.fluidInterface_array_DispZ)
-
-- # --- Checking conservation ---
-+ # --- Checking conservation ---
- WSX = self.solidLoads_array_X.dot(self.solidInterface_array_DispX)
- WSY = self.solidLoads_array_Y.dot(self.solidInterface_array_DispY)
- WSZ = self.solidLoads_array_Z.dot(self.solidInterface_array_DispZ)
-@@ -1124,11 +1124,11 @@
- WFY = self.fluidLoads_array_Y.dot(self.fluidInterface_array_DispY)
- WFZ = self.fluidLoads_array_Z.dot(self.fluidInterface_array_DispZ)
-
-- self.MPIPrint("Checking f/s interface conservation...")
-- self.MPIPrint('Solid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WSX, WSY, WSZ))
-- self.MPIPrint('Fluid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WFX, WFY, WFZ))
-+ self.MPIPrint("Checking f/s interface conservation...")
-+ self.MPIPrint('Solid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WSX, WSY, WSZ))
-+ self.MPIPrint('Fluid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WFX, WFY, WFZ))
-+
-
--
- # --- Redistribute the interpolated fluid interface according to the partitions that own the fluid interface ---
- # Gather the fluid interface on the master process
- if self.have_MPI == True:
-@@ -1156,7 +1156,7 @@
- displ = tuple(displ)
-
- del sendBuffNumber, rcvBuffNumber
--
-+
- #print("DEBUG MESSAGE From proc {}, counts = {}".format(myid, counts))
- #print("DEBUG MESSAGE From proc {}, displ = {}".format(myid, displ))
-
-@@ -1213,18 +1213,18 @@
- del sendBuff
-
- def interpolateFluidLoadsOnSolidMesh(self, FSI_config):
-- """
-- Applies the one-to-one mapping or the interpolaiton rules from fluid to solid mesh.
-- """
-- if self.have_MPI == True:
-+ """
-+ Applies the one-to-one mapping or the interpolaiton rules from fluid to solid mesh.
-+ """
-+ if self.have_MPI == True:
- myid = self.comm.Get_rank()
- MPIsize = self.comm.Get_size()
- else:
- myid = 0
- MPIsize = 1
--
-+
- # --- Interpolate (or map) in parallel the fluid interface loads on the solid interface ---
-- #self.MappingMatrix.transpose()
-+ #self.MappingMatrix.transpose()
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- if self.have_MPI == True:
- gamma_array_LoadX = PETSc.Vec().create(self.comm)
-@@ -1280,10 +1280,10 @@
- self.solidLoads_array_X_recon = None
- self.solidLoads_array_Y_recon = None
- self.solidLoads_array_Z_recon = None
-- if myid == self.rootProcess:
-- self.solidLoads_array_X_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-- self.solidLoads_array_Y_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-- self.solidLoads_array_Z_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-+ if myid == self.rootProcess:
-+ self.solidLoads_array_X_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-+ self.solidLoads_array_Y_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-+ self.solidLoads_array_Z_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- myNumberOfNodes = self.solidLoads_array_X.getArray().shape[0]
- sendBuffNumber = np.array([myNumberOfNodes], dtype=int)
- rcvBuffNumber = np.zeros(MPIsize, dtype=int)
-@@ -1293,9 +1293,9 @@
- displ = np.zeros(MPIsize, dtype=int)
- for ii in range(rcvBuffNumber.shape[0]):
- displ[ii] = rcvBuffNumber[0:ii].sum()
-- displ = tuple(displ)
-+ displ = tuple(displ)
-
-- del sendBuffNumber, rcvBuffNumber
-+ del sendBuffNumber, rcvBuffNumber
-
- self.comm.Gatherv(self.solidLoads_array_X.getArray(), [self.solidLoads_array_X_recon, counts, displ, self.MPI.DOUBLE], root=self.rootProcess)
- self.comm.Gatherv(self.solidLoads_array_Y.getArray(), [self.solidLoads_array_Y_recon, counts, displ, self.MPI.DOUBLE], root=self.rootProcess)
-@@ -1336,25 +1336,25 @@
-
-
- '''def getSolidInterfacePosition(self, SolidSolver):
-- """
-- Gets the current solid interface position from the solid solver.
-- """
-+ """
-+ Gets the current solid interface position from the solid solver.
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- # --- Get the solid interface position from the solid solver and directly fill the corresponding PETSc vector ---
- GlobalIndex = int()
- localIndex = 0
-- for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ for iVertex in range(self.nLocalSolidInterfaceNodes):
- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.SolidHaloNodeList[myid].keys():
- pass
- else:
-- newPosx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
-- newPosy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
-- newPosz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
-+ newPosx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
-+ newPosy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
-+ newPosz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
- iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
- self.solidInterface_array_X.setValues([iGlobalVertex],newPosx)
- self.solidInterface_array_Y.setValues([iGlobalVertex],newPosy)
-@@ -1375,25 +1375,25 @@
- #print("DEBUG MESSAGE From PROC {} : array_X = {}".format(myid, self.solidInterface_array_X.getArray()))'''
-
- def getSolidInterfaceDisplacement(self, SolidSolver):
-- """
-- Gets the current solid interface position from the solid solver.
-- """
-+ """
-+ Gets the current solid interface position from the solid solver.
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- # --- Get the solid interface position from the solid solver and directly fill the corresponding PETSc vector ---
- GlobalIndex = int()
- localIndex = 0
-- for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ for iVertex in range(self.nLocalSolidInterfaceNodes):
- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.SolidHaloNodeList[myid].keys():
- pass
- else:
-- newDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
-- newDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
-- newDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
-+ newDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
-+ newDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
-+ newDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
- iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
- self.solidInterface_array_DispX.setValues([iGlobalVertex],newDispx)
- self.solidInterface_array_DispY.setValues([iGlobalVertex],newDispy)
-@@ -1408,9 +1408,9 @@
- self.solidInterface_array_DispZ.assemblyEnd()
-
- def getFluidInterfaceNodalForce(self, FSI_config, FluidSolver):
-- """
-- Gets the fluid interface loads from the fluid solver.
-- """
-+ """
-+ Gets the fluid interface loads from the fluid solver.
-+ """
- if self.have_MPI == True:
- myid = self.comm.Get_rank()
- else:
-@@ -1422,17 +1422,17 @@
- FZ = 0.0
-
- # --- Get the fluid interface loads from the fluid solver and directly fill the corresponding PETSc vector ---
-- for iVertex in range(self.nLocalFluidInterfaceNodes):
-- halo = FluidSolver.ComputeVertexForces(self.fluidInterfaceIdentifier, iVertex) # !!we have to ignore halo node coming from mesh partitioning because they introduice non-physical forces
-- if halo==False:
-- if FSI_config['CSD_SOLVER'] == 'GETDP':
-- newFx = FluidSolver.GetVertexForceDensityX(self.fluidInterfaceIdentifier, iVertex)
-- newFy = FluidSolver.GetVertexForceDensityY(self.fluidInterfaceIdentifier, iVertex)
-- newFz = FluidSolver.GetVertexForceDensityZ(self.fluidInterfaceIdentifier, iVertex)
-- else:
-- newFx = FluidSolver.GetVertexForceX(self.fluidInterfaceIdentifier, iVertex)
-- newFy = FluidSolver.GetVertexForceY(self.fluidInterfaceIdentifier, iVertex)
-- newFz = FluidSolver.GetVertexForceZ(self.fluidInterfaceIdentifier, iVertex)
-+ for iVertex in range(self.nLocalFluidInterfaceNodes):
-+ halo = FluidSolver.ComputeVertexForces(self.fluidInterfaceIdentifier, iVertex) # !!we have to ignore halo node coming from mesh partitioning because they introduice non-physical forces
-+ if halo==False:
-+ if FSI_config['CSD_SOLVER'] == 'GETDP':
-+ newFx = FluidSolver.GetVertexForceDensityX(self.fluidInterfaceIdentifier, iVertex)
-+ newFy = FluidSolver.GetVertexForceDensityY(self.fluidInterfaceIdentifier, iVertex)
-+ newFz = FluidSolver.GetVertexForceDensityZ(self.fluidInterfaceIdentifier, iVertex)
-+ else:
-+ newFx = FluidSolver.GetVertexForceX(self.fluidInterfaceIdentifier, iVertex)
-+ newFy = FluidSolver.GetVertexForceY(self.fluidInterfaceIdentifier, iVertex)
-+ newFz = FluidSolver.GetVertexForceZ(self.fluidInterfaceIdentifier, iVertex)
- iGlobalVertex = self.__getGlobalIndex('fluid', myid, localIndex)
- self.fluidLoads_array_X.setValues([iGlobalVertex], newFx)
- self.fluidLoads_array_Y.setValues([iGlobalVertex], newFy)
-@@ -1457,22 +1457,22 @@
- FX_b = self.fluidLoads_array_X.sum()
- FY_b = self.fluidLoads_array_Y.sum()
- FZ_b = self.fluidLoads_array_Z.sum()
--
-+
-
- def setFluidInterfaceVarCoord(self, FluidSolver):
-- """
-- Communicate the change of coordinates of the fluid interface to the fluid solver.
-- Prepare the fluid solver for mesh deformation.
-- """
-+ """
-+ Communicate the change of coordinates of the fluid interface to the fluid solver.
-+ Prepare the fluid solver for mesh deformation.
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- # --- Send the new fluid interface position to the fluid solver (on each partition, halo nodes included) ---
- localIndex = 0
-- for iVertex in range(self.nLocalFluidInterfaceNodes):
-- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
-+ for iVertex in range(self.nLocalFluidInterfaceNodes):
-+ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.FluidHaloNodeList[myid].keys():
- posX0, posY0, posZ0 = self.haloNodesPositionsInit[GlobalIndex]
- DispX, DispY, DispZ = self.haloNodesDisplacements[GlobalIndex]
-@@ -1491,32 +1491,32 @@
- FluidSolver.SetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex, posZ)
- localIndex += 1
- # Prepares the mesh deformation in the fluid solver
-- nodalVarCoordNorm = FluidSolver.SetVertexVarCoord(self.fluidInterfaceIdentifier, iVertex)
-+ nodalVarCoordNorm = FluidSolver.SetVertexVarCoord(self.fluidInterfaceIdentifier, iVertex)
-+
-
--
- def setSolidInterfaceLoads(self, SolidSolver, FSI_config, time):
-- """
-- Communicates the new solid interface loads to the solid solver.
-- In case of rigid body motion, calculates the new resultant forces (lift, drag, ...).
-- """
-+ """
-+ Communicates the new solid interface loads to the solid solver.
-+ In case of rigid body motion, calculates the new resultant forces (lift, drag, ...).
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
-
-- FY = 0.0 # solid-side resultant forces
-+ FY = 0.0 # solid-side resultant forces
- FX = 0.0
- FZ = 0.0
-- FFX = 0.0 # fluid-side resultant forces
-- FFY = 0.0
-- FFZ = 0.0
-+ FFX = 0.0 # fluid-side resultant forces
-+ FFY = 0.0
-+ FFZ = 0.0
-
- # --- Check for total force conservation after interpolation
- FFX = self.fluidLoads_array_X.sum()
- FFY = self.fluidLoads_array_Y.sum()
- FFZ = self.fluidLoads_array_Z.sum()
-
--
-+
- for iVertex in range(self.nLocalSolidInterfaceNodes):
- FX += self.localSolidLoads_array_X[iVertex]
- FY += self.localSolidLoads_array_Y[iVertex]
-@@ -1527,9 +1527,9 @@
- FY = self.comm.allreduce(FY)
- FZ = self.comm.allreduce(FZ)
-
-- self.MPIPrint("Checking f/s interface total force...")
-- self.MPIPrint('Solid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FX, FY, FZ))
-- self.MPIPrint('Fluid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FFX, FFY, FFZ))
-+ self.MPIPrint("Checking f/s interface total force...")
-+ self.MPIPrint('Solid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FX, FY, FZ))
-+ self.MPIPrint('Fluid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FFX, FFY, FFZ))
-
- # --- Send the new solid interface loads to the solid solver (on each partition, halo nodes included) ---
- GlobalIndex = int()
-@@ -1541,25 +1541,25 @@
- pass
- else:
- Fx = self.localSolidLoads_array_X[localIndex]
-- Fy = self.localSolidLoads_array_Y[localIndex]
-- Fz = self.localSolidLoads_array_Z[localIndex]
-+ Fy = self.localSolidLoads_array_Y[localIndex]
-+ Fz = self.localSolidLoads_array_Z[localIndex]
- SolidSolver.applyload(iVertex, Fx, Fy, Fz, time)
- localIndex += 1
-- if FSI_config['CSD_SOLVER'] == 'NATIVE':
-+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
- SolidSolver.setGeneralisedForce()
-- SolidSolver.setGeneralisedMoment()
-+ SolidSolver.setGeneralisedMoment()
-
- def computeSolidInterfaceResidual(self, SolidSolver):
-- """
-- Computes the solid interface FSI displacement residual.
-- """
-+ """
-+ Computes the solid interface FSI displacement residual.
-+ """
-
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
-
-- normInterfaceResidualSquare = 0.0
-+ normInterfaceResidualSquare = 0.0
-
- # --- Create and fill the PETSc vector for the predicted solid interface position (predicted by the solid computation) ---
- if self.have_MPI == True:
-@@ -1575,27 +1575,27 @@
- predDisp_array_Y = PETSc.Vec().create()
- predDisp_array_Y.setType('seq')
- predDisp_array_Z = PETSc.Vec().create()
-- predDisp_array_Z.setType('seq')
-+ predDisp_array_Z.setType('seq')
- predDisp_array_X.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- predDisp_array_Y.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- predDisp_array_Z.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
--
-- if myid in self.solidSolverProcessors:
-- for iVertex in range(self.nLocalSolidInterfaceNodes):
-- predDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
-- predDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
-- predDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
-+
-+ if myid in self.solidSolverProcessors:
-+ for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ predDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
-+ predDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
-+ predDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
- iGlobalVertex = self.__getGlobalIndex('solid', myid, iVertex)
- predDisp_array_X.setValues([iGlobalVertex], predDispx)
- predDisp_array_Y.setValues([iGlobalVertex], predDispy)
- predDisp_array_Z.setValues([iGlobalVertex], predDispz)
--
-- predDisp_array_X.assemblyBegin()
-- predDisp_array_X.assemblyEnd()
-- predDisp_array_Y.assemblyBegin()
-- predDisp_array_Y.assemblyEnd()
-- predDisp_array_Z.assemblyBegin()
-- predDisp_array_Z.assemblyEnd()
-+
-+ predDisp_array_X.assemblyBegin()
-+ predDisp_array_X.assemblyEnd()
-+ predDisp_array_Y.assemblyBegin()
-+ predDisp_array_Y.assemblyEnd()
-+ predDisp_array_Z.assemblyBegin()
-+ predDisp_array_Z.assemblyEnd()
-
- # --- Calculate the residual (vector and norm) ---
- self.solidInterfaceResidual_array_X = predDisp_array_X - self.solidInterface_array_DispX
-@@ -1615,45 +1615,45 @@
- del predDisp_array_Y
- del predDisp_array_Z
-
-- return sqrt(normInterfaceResidualSquare)
-+ return sqrt(normInterfaceResidualSquare)
-
- def relaxSolidPosition(self,FSI_config):
-- """
-- Apply solid displacement under-relaxation.
-- """
-+ """
-+ Apply solid displacement under-relaxation.
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
-
- # --- Set the Aitken coefficient for the relaxation ---
-- if FSI_config['AITKEN_RELAX'] == 'STATIC':
-- self.aitkenParam = FSI_config['AITKEN_PARAM']
-- elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
-- self.setAitkenCoefficient(FSI_config)
-- else:
-- self.aitkenParam = 1.0
-+ if FSI_config['AITKEN_RELAX'] == 'STATIC':
-+ self.aitkenParam = FSI_config['AITKEN_PARAM']
-+ elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
-+ self.setAitkenCoefficient(FSI_config)
-+ else:
-+ self.aitkenParam = 1.0
-
-- self.MPIPrint('Aitken under-relaxation step with parameter {}'.format(self.aitkenParam))
-+ self.MPIPrint('Aitken under-relaxation step with parameter {}'.format(self.aitkenParam))
-
- # --- Relax the solid interface position ---
- self.solidInterface_array_DispX += self.aitkenParam*self.solidInterfaceResidual_array_X
- self.solidInterface_array_DispY += self.aitkenParam*self.solidInterfaceResidual_array_Y
- self.solidInterface_array_DispZ += self.aitkenParam*self.solidInterfaceResidual_array_Z
--
-+
-
- def setAitkenCoefficient(self, FSI_config):
-- """
-- Computes the Aitken coefficients for solid displacement under-relaxation.
-- """
--
-- deltaResNormSquare = 0.0
-- prodScalRes = 0.0
--
-+ """
-+ Computes the Aitken coefficients for solid displacement under-relaxation.
-+ """
-+
-+ deltaResNormSquare = 0.0
-+ prodScalRes = 0.0
-+
- # --- Create the PETSc vector for the difference between the residuals (current and previous FSI iter) ---
-- if self.FSIIter == 0:
-- self.aitkenParam = max(FSI_config['AITKEN_PARAM'], self.aitkenParam)
-- else:
-+ if self.FSIIter == 0:
-+ self.aitkenParam = max(FSI_config['AITKEN_PARAM'], self.aitkenParam)
-+ else:
- if self.have_MPI:
- deltaResx_array_X = PETSc.Vec().create(self.comm)
- deltaResx_array_X.setType('mpi')
-@@ -1688,9 +1688,9 @@
- deltaResNormSquare_X = (deltaResx_array_X.norm())**2
- deltaResNormSquare_Y = (deltaResx_array_Y.norm())**2
- deltaResNormSquare_Z = (deltaResx_array_Z.norm())**2
-- deltaResNormSquare = deltaResNormSquare_X + deltaResNormSquare_Y + deltaResNormSquare_Z
-+ deltaResNormSquare = deltaResNormSquare_X + deltaResNormSquare_Y + deltaResNormSquare_Z
-
-- self.aitkenParam *= -prodScalRes/deltaResNormSquare
-+ self.aitkenParam *= -prodScalRes/deltaResNormSquare
-
- deltaResx_array_X.destroy()
- deltaResx_array_Y.destroy()
-@@ -1708,27 +1708,27 @@
- self.solidInterfaceResidual_array_Z.copy(self.solidInterfaceResidualnM1_array_Z)
-
- def displacementPredictor(self, FSI_config , SolidSolver, deltaT):
-- """
-- Calculates a prediciton for the solid interface position for the next time step.
-- """
-+ """
-+ Calculates a prediciton for the solid interface position for the next time step.
-+ """
-
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
-
-- if FSI_config['DISP_PRED'] == 'FIRST_ORDER':
-- self.MPIPrint("First order predictor")
-- alpha_0 = 1.0
-- alpha_1 = 0.0
-- elif FSI_config['DISP_PRED'] == 'SECOND_ORDER':
-- self.MPIPrint("Second order predictor")
-- alpha_0 = 1.0
-- alpha_1 = 0.5
-- else:
-- self.MPIPrint("No predictor")
-- alpha_0 = 0.0
-- alpha_1 = 0.0
-+ if FSI_config['DISP_PRED'] == 'FIRST_ORDER':
-+ self.MPIPrint("First order predictor")
-+ alpha_0 = 1.0
-+ alpha_1 = 0.0
-+ elif FSI_config['DISP_PRED'] == 'SECOND_ORDER':
-+ self.MPIPrint("Second order predictor")
-+ alpha_0 = 1.0
-+ alpha_1 = 0.5
-+ else:
-+ self.MPIPrint("No predictor")
-+ alpha_0 = 0.0
-+ alpha_1 = 0.0
-
- # --- Create the PETSc vectors to store the solid interface velocity ---
- if self.have_MPI == True:
-@@ -1774,18 +1774,18 @@
- # --- Fill the PETSc vectors ---
- GlobalIndex = int()
- localIndex = 0
-- for iVertex in range(self.nLocalSolidInterfaceNodes):
-- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
-+ for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.SolidHaloNodeList[myid].keys():
- pass
- else:
- iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
-- velx = SolidSolver.getInterfaceNodeVelX(self.solidInterfaceIdentifier, iVertex)
-- vely = SolidSolver.getInterfaceNodeVelY(self.solidInterfaceIdentifier, iVertex)
-- velz = SolidSolver.getInterfaceNodeVelZ(self.solidInterfaceIdentifier, iVertex)
-- velxNm1 = SolidSolver.getInterfaceNodeVelXNm1(self.solidInterfaceIdentifier, iVertex)
-- velyNm1 = SolidSolver.getInterfaceNodeVelYNm1(self.solidInterfaceIdentifier, iVertex)
-- velzNm1 = SolidSolver.getInterfaceNodeVelZNm1(self.solidInterfaceIdentifier, iVertex)
-+ velx = SolidSolver.getInterfaceNodeVelX(self.solidInterfaceIdentifier, iVertex)
-+ vely = SolidSolver.getInterfaceNodeVelY(self.solidInterfaceIdentifier, iVertex)
-+ velz = SolidSolver.getInterfaceNodeVelZ(self.solidInterfaceIdentifier, iVertex)
-+ velxNm1 = SolidSolver.getInterfaceNodeVelXNm1(self.solidInterfaceIdentifier, iVertex)
-+ velyNm1 = SolidSolver.getInterfaceNodeVelYNm1(self.solidInterfaceIdentifier, iVertex)
-+ velzNm1 = SolidSolver.getInterfaceNodeVelZNm1(self.solidInterfaceIdentifier, iVertex)
- Vel_array_X.setValues([iGlobalVertex],velx)
- Vel_array_Y.setValues([iGlobalVertex],vely)
- Vel_array_Z.setValues([iGlobalVertex],velz)
-@@ -1822,27 +1822,27 @@
- del VelnM1_array_X, VelnM1_array_Y, VelnM1_array_Z
-
- def writeFSIHistory(self, TimeIter, time, varCoordNorm, FSIConv):
-- """
-- Write the FSI history file of the computaion.
-- """
-+ """
-+ Write the FSI history file of the computaion.
-+ """
-
- if self.have_MPI == True:
- myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- if myid == self.rootProcess:
-- if self.unsteady:
-- if TimeIter == 0:
-- histFile = open('FSIhistory.dat', "w")
-+ if self.unsteady:
-+ if TimeIter == 0:
-+ histFile = open('FSIhistory.dat', "w")
- histFile.write("TimeIter\tTime\tFSIRes\tFSINbIter\n")
-- else:
-- histFile = open('FSIhistory.dat', "a")
-- if FSIConv:
-- histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter+1) + '\n')
-- else:
-- histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter) + '\n')
-- histFile.close()
-+ else:
-+ histFile = open('FSIhistory.dat', "a")
-+ if FSIConv:
-+ histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter+1) + '\n')
-+ else:
-+ histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter) + '\n')
-+ histFile.close()
- else:
- if self.FSIIter == 0:
- histFile = open('FSIhistory.dat', "w")
-@@ -1851,7 +1851,7 @@
- histFile = open('FSIhistory.dat', "a")
- histFile.write(str(self.FSIIter) + '\t' + str(varCoordNorm) + '\n')
- histFile.close()
--
-+
-
- self.MPIBarrier()
-
-@@ -1868,254 +1868,254 @@
- globalIndex = globalStartIndex + iLocalVertex
-
- return globalIndex
--
-+
-
- def UnsteadyFSI(self,FSI_config, FluidSolver, SolidSolver):
-- """
-- Run the unsteady FSI computation by synchronizing the fluid and solid solvers.
-- F/s interface data are exchanged through interface mapping and interpolation (if non mathcing meshes).
-- """
-+ """
-+ Run the unsteady FSI computation by synchronizing the fluid and solid solvers.
-+ F/s interface data are exchanged through interface mapping and interpolation (if non mathcing meshes).
-+ """
-
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-- numberPart = self.comm.Get_size()
-+ myid = self.comm.Get_rank()
-+ numberPart = self.comm.Get_size()
- else:
- myid = 0
- numberPart = 1
-
-- # --- Set some general variables for the unsteady computation --- #
-- deltaT = FSI_config['UNST_TIMESTEP'] # physical time step
-- totTime = FSI_config['UNST_TIME'] # physical simulation time
-- NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
-- FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
-- TimeIterTreshold = 0 # time iteration from which we allow the solid to deform
--
-- if FSI_config['RESTART_SOL'] == 'YES':
-- startTime = FSI_config['START_TIME']
-- NbTimeIter = ((totTime)/deltaT)-1
-- time = startTime
-- TimeIter = FSI_config['RESTART_ITER']
-- else:
-- NbTimeIter = (totTime/deltaT)-1 # number of time iterations
-- time = 0.0 # initial time
-- TimeIter = 0 # initial time iteration
--
-- NbTimeIter = int(NbTimeIter) # be sure that NbTimeIter is an integer
--
-- varCoordNorm = 0.0 # FSI residual
-- FSIConv = False # FSI convergence flag
--
-- self.MPIPrint('\n**********************************')
-- self.MPIPrint('* Begin unsteady FSI computation *')
-- self.MPIPrint('**********************************\n')
--
-- # --- Initialize the coupled solution --- #
-- #If restart (DOES NOT WORK YET)
-- if FSI_config['RESTART_SOL'] == 'YES':
-- TimeIterTreshold = -1
-- FluidSolver.setTemporalIteration(TimeIter)
-- if myid == self.rootProcess:
-- SolidSolver.outputDisplacements(FluidSolver.getInterRigidDispArray(), True)
-+ # --- Set some general variables for the unsteady computation --- #
-+ deltaT = FSI_config['UNST_TIMESTEP'] # physical time step
-+ totTime = FSI_config['UNST_TIME'] # physical simulation time
-+ NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
-+ FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
-+ TimeIterTreshold = 0 # time iteration from which we allow the solid to deform
-+
-+ if FSI_config['RESTART_SOL'] == 'YES':
-+ startTime = FSI_config['START_TIME']
-+ NbTimeIter = ((totTime)/deltaT)-1
-+ time = startTime
-+ TimeIter = FSI_config['RESTART_ITER']
-+ else:
-+ NbTimeIter = (totTime/deltaT)-1 # number of time iterations
-+ time = 0.0 # initial time
-+ TimeIter = 0 # initial time iteration
-+
-+ NbTimeIter = int(NbTimeIter) # be sure that NbTimeIter is an integer
-+
-+ varCoordNorm = 0.0 # FSI residual
-+ FSIConv = False # FSI convergence flag
-+
-+ self.MPIPrint('\n**********************************')
-+ self.MPIPrint('* Begin unsteady FSI computation *')
-+ self.MPIPrint('**********************************\n')
-+
-+ # --- Initialize the coupled solution --- #
-+ #If restart (DOES NOT WORK YET)
-+ if FSI_config['RESTART_SOL'] == 'YES':
-+ TimeIterTreshold = -1
-+ FluidSolver.setTemporalIteration(TimeIter)
-+ if myid == self.rootProcess:
-+ SolidSolver.outputDisplacements(FluidSolver.getInterRigidDispArray(), True)
-+ if self.have_MPI == True:
-+ self.comm.barrier()
-+ FluidSolver.setInitialMesh(True)
-+ if myid == self.rootProcess:
-+ SolidSolver.displacementPredictor(FluidSolver.getInterRigidDispArray())
- if self.have_MPI == True:
-- self.comm.barrier()
-- FluidSolver.setInitialMesh(True)
-- if myid == self.rootProcess:
-- SolidSolver.displacementPredictor(FluidSolver.getInterRigidDispArray())
-- if self.have_MPI == True:
-- self.comm.barrier()
-- if myid == self.rootProcess:
-- SolidSolver.updateSolution()
-- #If no restart
-- else:
-- self.MPIPrint('Setting FSI initial conditions')
-+ self.comm.barrier()
-+ if myid == self.rootProcess:
-+ SolidSolver.updateSolution()
-+ #If no restart
-+ else:
-+ self.MPIPrint('Setting FSI initial conditions')
- if myid in self.solidSolverProcessors:
-- SolidSolver.setInitialDisplacements()
-+ SolidSolver.setInitialDisplacements()
- self.getSolidInterfaceDisplacement(SolidSolver)
-- self.interpolateSolidPositionOnFluidMesh(FSI_config)
-- self.setFluidInterfaceVarCoord(FluidSolver)
-- FluidSolver.SetInitialMesh() # if there is an initial deformation in the solid, it has to be communicated to the fluid solver
-- self.MPIPrint('\nFSI initial conditions are set')
-- self.MPIPrint('Beginning time integration\n')
--
-- # --- External temporal loop --- #
-- while TimeIter <= NbTimeIter:
--
-- if TimeIter > TimeIterTreshold:
-- NbFSIIter = NbFSIIterMax
-- self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI on time iteration {} ***************'.format(TimeIter))
-- else:
-- NbFSIIter = 1
--
-- self.FSIIter = 0
-- FSIConv = False
-- FluidSolver.PreprocessExtIter(TimeIter) # set some parameters before temporal fluid iteration
--
-- # --- Internal FSI loop --- #
-- while self.FSIIter <= (NbFSIIter-1):
-+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
-+ self.setFluidInterfaceVarCoord(FluidSolver)
-+ FluidSolver.SetInitialMesh() # if there is an initial deformation in the solid, it has to be communicated to the fluid solver
-+ self.MPIPrint('\nFSI initial conditions are set')
-+ self.MPIPrint('Beginning time integration\n')
-+
-+ # --- External temporal loop --- #
-+ while TimeIter <= NbTimeIter:
-+
-+ if TimeIter > TimeIterTreshold:
-+ NbFSIIter = NbFSIIterMax
-+ self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI on time iteration {} ***************'.format(TimeIter))
-+ else:
-+ NbFSIIter = 1
-+
-+ self.FSIIter = 0
-+ FSIConv = False
-+ FluidSolver.PreprocessExtIter(TimeIter) # set some parameters before temporal fluid iteration
-
-- self.MPIPrint("\n>>>> Time iteration {} / FSI iteration {} <<<<".format(TimeIter,self.FSIIter))
-+ # --- Internal FSI loop --- #
-+ while self.FSIIter <= (NbFSIIter-1):
-
-- # --- Mesh morphing step (displacements interpolation, displacements communication, and mesh morpher call) --- #
-- self.interpolateSolidPositionOnFluidMesh(FSI_config)
-+ self.MPIPrint("\n>>>> Time iteration {} / FSI iteration {} <<<<".format(TimeIter,self.FSIIter))
-+
-+ # --- Mesh morphing step (displacements interpolation, displacements communication, and mesh morpher call) --- #
-+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
- self.MPIPrint('\nPerforming dynamic mesh deformation (ALE)...\n')
- self.setFluidInterfaceVarCoord(FluidSolver)
- FluidSolver.DynamicMeshUpdate(TimeIter)
--
-- # --- Fluid solver call for FSI subiteration --- #
-- self.MPIPrint('\nLaunching fluid solver for one single dual-time iteration...')
-+
-+ # --- Fluid solver call for FSI subiteration --- #
-+ self.MPIPrint('\nLaunching fluid solver for one single dual-time iteration...')
- self.MPIBarrier()
-- FluidSolver.ResetConvergence()
-- FluidSolver.Run()
-+ FluidSolver.ResetConvergence()
-+ FluidSolver.Run()
- self.MPIBarrier()
-
-- # --- Surface fluid loads interpolation and communication --- #
-- self.MPIPrint('\nProcessing interface fluid loads...\n')
-+ # --- Surface fluid loads interpolation and communication --- #
-+ self.MPIPrint('\nProcessing interface fluid loads...\n')
- self.MPIBarrier()
-- self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
-+ self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
- self.MPIBarrier()
-- if TimeIter > TimeIterTreshold:
-- self.interpolateFluidLoadsOnSolidMesh(FSI_config)
-- self.setSolidInterfaceLoads(SolidSolver, FSI_config, time)
-+ if TimeIter > TimeIterTreshold:
-+ self.interpolateFluidLoadsOnSolidMesh(FSI_config)
-+ self.setSolidInterfaceLoads(SolidSolver, FSI_config, time)
-
-- # --- Solid solver call for FSI subiteration --- #
-- self.MPIPrint('\nLaunching solid solver for a single time iteration...\n')
-+ # --- Solid solver call for FSI subiteration --- #
-+ self.MPIPrint('\nLaunching solid solver for a single time iteration...\n')
- if myid in self.solidSolverProcessors:
-- if FSI_config['CSD_SOLVER'] == 'NATIVE':
-- SolidSolver.timeIteration(time)
-- elif FSI_config['CSD_SOLVER'] == 'METAFOR' or FSI_config['CSD_SOLVER'] == 'GETDP' or FSI_config['CSD_SOLVER'] == 'TESTER':
-- SolidSolver.run(time-deltaT, time)
--
-- # --- Compute and monitor the FSI residual --- #
-- varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
-- self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
-- if varCoordNorm < FSITolerance:
-- FSIConv = True
-- break
-+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
-+ SolidSolver.timeIteration(time)
-+ elif FSI_config['CSD_SOLVER'] == 'METAFOR' or FSI_config['CSD_SOLVER'] == 'GETDP' or FSI_config['CSD_SOLVER'] == 'TESTER':
-+ SolidSolver.run(time-deltaT, time)
-+
-+ # --- Compute and monitor the FSI residual --- #
-+ varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
-+ self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
-+ if varCoordNorm < FSITolerance:
-+ FSIConv = True
-+ break
-
-- # --- Relaxe the solid position --- #
-+ # --- Relaxe the solid position --- #
- self.MPIPrint('\nProcessing interface displacements...\n')
-- self.relaxSolidPosition(FSI_config)
--
-- self.FSIIter += 1
-- # --- End OF FSI loop --- #
-+ self.relaxSolidPosition(FSI_config)
-+
-+ self.FSIIter += 1
-+ # --- End OF FSI loop --- #
-
- self.MPIBarrier()
-
-- # --- Update the FSI history file --- #
-- if TimeIter > TimeIterTreshold:
-- self.MPIPrint('\nBGS is converged (strong coupling)')
-- self.writeFSIHistory(TimeIter, time, varCoordNorm, FSIConv)
--
-- # --- Update, monitor and output the fluid solution before the next time step ---#
-- FluidSolver.Update()
-- FluidSolver.Monitor(TimeIter)
-- FluidSolver.Output(TimeIter)
--
-- if TimeIter >= TimeIterTreshold:
-- if myid in self.solidSolverProcessors:
-- # --- Output the solid solution before thr next time step --- #
-- SolidSolver.writeSolution(time, self.FSIIter, TimeIter, NbTimeIter)
--
-- # --- Displacement predictor for the next time step and update of the solid solution --- #
-- self.MPIPrint('\nSolid displacement prediction for next time step')
-- self.displacementPredictor(FSI_config, SolidSolver, deltaT)
-+ # --- Update the FSI history file --- #
-+ if TimeIter > TimeIterTreshold:
-+ self.MPIPrint('\nBGS is converged (strong coupling)')
-+ self.writeFSIHistory(TimeIter, time, varCoordNorm, FSIConv)
-+
-+ # --- Update, monitor and output the fluid solution before the next time step ---#
-+ FluidSolver.Update()
-+ FluidSolver.Monitor(TimeIter)
-+ FluidSolver.Output(TimeIter)
-+
-+ if TimeIter >= TimeIterTreshold:
-+ if myid in self.solidSolverProcessors:
-+ # --- Output the solid solution before thr next time step --- #
-+ SolidSolver.writeSolution(time, self.FSIIter, TimeIter, NbTimeIter)
-+
-+ # --- Displacement predictor for the next time step and update of the solid solution --- #
-+ self.MPIPrint('\nSolid displacement prediction for next time step')
-+ self.displacementPredictor(FSI_config, SolidSolver, deltaT)
- if myid in self.solidSolverProcessors:
-- SolidSolver.updateSolution()
--
-- TimeIter += 1
-- time += deltaT
-- #--- End of the temporal loop --- #
-+ SolidSolver.updateSolution()
-+
-+ TimeIter += 1
-+ time += deltaT
-+ #--- End of the temporal loop --- #
-
- self.MPIBarrier()
-
-- self.MPIPrint('\n*************************')
-- self.MPIPrint('* End FSI computation *')
-- self.MPIPrint('*************************\n')
-+ self.MPIPrint('\n*************************')
-+ self.MPIPrint('* End FSI computation *')
-+ self.MPIPrint('*************************\n')
-
- def SteadyFSI(self, FSI_config,FluidSolver, SolidSolver):
-- """
-- Runs the steady FSI computation by synchronizing the fluid and solid solver with data exchange at the f/s interface.
-- """
-+ """
-+ Runs the steady FSI computation by synchronizing the fluid and solid solver with data exchange at the f/s interface.
-+ """
-
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-- numberPart = self.comm.Get_size()
-+ myid = self.comm.Get_rank()
-+ numberPart = self.comm.Get_size()
- else:
- myid = 0
- numberPart = 1
-
-- # --- Set some general variables for the steady computation --- #
-- NbIter = FSI_config['NB_EXT_ITER'] # number of fluid iteration at each FSI step
-- NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
-- FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
-- varCoordNorm = 0.0
--
-- self.MPIPrint('\n********************************')
-- self.MPIPrint('* Begin steady FSI computation *')
-- self.MPIPrint('********************************\n')
-- self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI ***************')
-+ # --- Set some general variables for the steady computation --- #
-+ NbIter = FSI_config['NB_EXT_ITER'] # number of fluid iteration at each FSI step
-+ NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
-+ FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
-+ varCoordNorm = 0.0
-+
-+ self.MPIPrint('\n********************************')
-+ self.MPIPrint('* Begin steady FSI computation *')
-+ self.MPIPrint('********************************\n')
-+ self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI ***************')
-
- self.getSolidInterfaceDisplacement(SolidSolver)
-
-- # --- External FSI loop --- #
-- self.FSIIter = 0
-- while self.FSIIter < NbFSIIterMax:
-- self.MPIPrint("\n>>>> FSI iteration {} <<<<".format(self.FSIIter))
-- self.MPIPrint('\nLaunching fluid solver for a steady computation...')
-- # --- Fluid solver call for FSI subiteration ---#
-- Iter = 0
-- FluidSolver.ResetConvergence()
-- while Iter < NbIter:
-- FluidSolver.PreprocessExtIter(Iter)
-- FluidSolver.Run()
-- StopIntegration = FluidSolver.Monitor(Iter)
-- FluidSolver.Output(Iter)
-- if StopIntegration:
-- break;
-- Iter += 1
--
-- # --- Surface fluid loads interpolation and communication ---#
-- self.MPIPrint('\nProcessing interface fluid loads...\n')
-+ # --- External FSI loop --- #
-+ self.FSIIter = 0
-+ while self.FSIIter < NbFSIIterMax:
-+ self.MPIPrint("\n>>>> FSI iteration {} <<<<".format(self.FSIIter))
-+ self.MPIPrint('\nLaunching fluid solver for a steady computation...')
-+ # --- Fluid solver call for FSI subiteration ---#
-+ Iter = 0
-+ FluidSolver.ResetConvergence()
-+ while Iter < NbIter:
-+ FluidSolver.PreprocessExtIter(Iter)
-+ FluidSolver.Run()
-+ StopIntegration = FluidSolver.Monitor(Iter)
-+ FluidSolver.Output(Iter)
-+ if StopIntegration:
-+ break;
-+ Iter += 1
-+
-+ # --- Surface fluid loads interpolation and communication ---#
-+ self.MPIPrint('\nProcessing interface fluid loads...\n')
- self.MPIBarrier()
-- self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
-+ self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
- self.MPIBarrier()
-- self.interpolateFluidLoadsOnSolidMesh(FSI_config)
-- self.setSolidInterfaceLoads(SolidSolver, FSI_config, 0.05)
--
-- # --- Solid solver call for FSI subiteration --- #
-- self.MPIPrint('\nLaunching solid solver for a static computation...\n')
-+ self.interpolateFluidLoadsOnSolidMesh(FSI_config)
-+ self.setSolidInterfaceLoads(SolidSolver, FSI_config, 0.05)
-+
-+ # --- Solid solver call for FSI subiteration --- #
-+ self.MPIPrint('\nLaunching solid solver for a static computation...\n')
- if myid in self.solidSolverProcessors:
-- if FSI_config['CSD_SOLVER'] == 'NATIVE':
-- SolidSolver.staticComputation()
-+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
-+ SolidSolver.staticComputation()
- else:
- SolidSolver.run(0.0, 0.05)
-- SolidSolver.writeSolution(0.0, self.FSIIter, Iter, NbIter)
-+ SolidSolver.writeSolution(0.0, self.FSIIter, Iter, NbIter)
-
-- # --- Compute and monitor the FSI residual --- #
-- varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
-- self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
-+ # --- Compute and monitor the FSI residual --- #
-+ varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
-+ self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
- self.writeFSIHistory(0, 0.0, varCoordNorm, False)
-- if varCoordNorm < FSITolerance:
-- break
-+ if varCoordNorm < FSITolerance:
-+ break
-
- # --- Relaxe the solid displacement and update the solid solution --- #
- self.MPIPrint('\nProcessing interface displacements...\n')
-- self.relaxSolidPosition(FSI_config)
-+ self.relaxSolidPosition(FSI_config)
- if myid in self.solidSolverProcessors:
- SolidSolver.updateSolution()
--
-- # --- Mesh morphing step (displacement interpolation, displacements communication, and mesh morpher call) --- #
-- self.interpolateSolidPositionOnFluidMesh(FSI_config)
-- self.MPIPrint('\nPerforming static mesh deformation...\n')
-- self.setFluidInterfaceVarCoord(FluidSolver)
-- FluidSolver.StaticMeshUpdate()
-- self.FSIIter += 1
-+
-+ # --- Mesh morphing step (displacement interpolation, displacements communication, and mesh morpher call) --- #
-+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
-+ self.MPIPrint('\nPerforming static mesh deformation...\n')
-+ self.setFluidInterfaceVarCoord(FluidSolver)
-+ FluidSolver.StaticMeshUpdate()
-+ self.FSIIter += 1
-
- self.MPIBarrier()
-
-- self.MPIPrint('\nBGS is converged (strong coupling)')
-- self.MPIPrint(' ')
-- self.MPIPrint('*************************')
-- self.MPIPrint('* End FSI computation *')
-- self.MPIPrint('*************************')
-- self.MPIPrint(' ')
-+ self.MPIPrint('\nBGS is converged (strong coupling)')
-+ self.MPIPrint(' ')
-+ self.MPIPrint('*************************')
-+ self.MPIPrint('* End FSI computation *')
-+ self.MPIPrint('*************************')
-+ self.MPIPrint(' ')
-diff -Naur old/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py new/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py
---- old/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py 2020-05-10 16:17:07.000000000 +0300
-@@ -174,9 +174,9 @@
-
- with open(self.Config_file) as configfile:
- while 1:
-- line = configfile.readline()
-- if not line:
-- break
-+ line = configfile.readline()
-+ if not line:
-+ break
-
- # remove line returns
- line = line.strip('\r\n')
-@@ -189,41 +189,41 @@
- this_value = line[1].strip()
-
- for case in switch(this_param):
-- #integer values
-- #if case("NB_FSI_ITER") :
-- #self.Config[this_param] = int(this_value)
-- #break
--
-- #float values
-- if case("DELTA_T") : pass
-- if case("START_TIME") : pass
-- if case("STOP_TIME") : pass
-- if case("SPRING_MASS") : pass
-- if case("INERTIA_FLEXURAL") : pass
-- if case("SPRING_STIFFNESS") : pass
-- if case("SPRING_DAMPING") : pass
-- if case("TORSIONAL_STIFFNESS") : pass
-- if case("TORSIONAL_DAMPING") : pass
-- if case("CORD") : pass
-- if case("FLEXURAL_AXIS") : pass
-- if case("GRAVITY_CENTER") : pass
-- if case("INITIAL_DISP") : pass
-- if case("INITIAL_ANGLE") : pass
-- if case("RHO") :
-- self.Config[this_param] = float(this_value)
-- break
--
-- #string values
-- if case("TIME_MARCHING") : pass
-- if case("MESH_FILE") : pass
-- if case("CSD_SOLVER") : pass
-- if case("MOVING_MARKER") : pass
-- if case("STRUCT_TYPE") :
-- self.Config[this_param] = this_value
-- break
-+ #integer values
-+ #if case("NB_FSI_ITER") :
-+ #self.Config[this_param] = int(this_value)
-+ #break
-+
-+ #float values
-+ if case("DELTA_T") : pass
-+ if case("START_TIME") : pass
-+ if case("STOP_TIME") : pass
-+ if case("SPRING_MASS") : pass
-+ if case("INERTIA_FLEXURAL") : pass
-+ if case("SPRING_STIFFNESS") : pass
-+ if case("SPRING_DAMPING") : pass
-+ if case("TORSIONAL_STIFFNESS") : pass
-+ if case("TORSIONAL_DAMPING") : pass
-+ if case("CORD") : pass
-+ if case("FLEXURAL_AXIS") : pass
-+ if case("GRAVITY_CENTER") : pass
-+ if case("INITIAL_DISP") : pass
-+ if case("INITIAL_ANGLE") : pass
-+ if case("RHO") :
-+ self.Config[this_param] = float(this_value)
-+ break
-+
-+ #string values
-+ if case("TIME_MARCHING") : pass
-+ if case("MESH_FILE") : pass
-+ if case("CSD_SOLVER") : pass
-+ if case("MOVING_MARKER") : pass
-+ if case("STRUCT_TYPE") :
-+ self.Config[this_param] = this_value
-+ break
-
-- if case():
-- print(this_param + " is an invalid option !")
-+ if case():
-+ print(this_param + " is an invalid option !")
- break
-
- def __readSU2Mesh(self):
-@@ -233,78 +233,78 @@
- print('Opened mesh file ' + self.Mesh_file + '.')
- while 1:
- line = meshfile.readline()
-- if not line:
-- break
-+ if not line:
-+ break
-
-- pos = line.find('NDIM')
-- if pos != -1:
-- line = line.strip('\r\n')
-+ pos = line.find('NDIM')
-+ if pos != -1:
-+ line = line.strip('\r\n')
- line = line.split("=",1)
-- self.nDim = int(line[1])
-- continue
--
-- pos = line.find('NELEM')
-- if pos != -1:
-- line = line.strip('\r\n')
-+ self.nDim = int(line[1])
-+ continue
-+
-+ pos = line.find('NELEM')
-+ if pos != -1:
-+ line = line.strip('\r\n')
- line = line.split("=",1)
-- self.nElem = int(line[1])
-- continue
-+ self.nElem = int(line[1])
-+ continue
-
-- pos = line.find('NPOIN')
-- if pos != -1:
-- line = line.strip('\r\n')
-+ pos = line.find('NPOIN')
-+ if pos != -1:
-+ line = line.strip('\r\n')
- line = line.split("=",1)
-- self.nPoint = int(line[1])
-+ self.nPoint = int(line[1])
- for iPoint in range(self.nPoint):
-- self.node.append(Point())
-- line = meshfile.readline()
-- line = line.strip('\r\n')
-- line = line.split(' ',self.nDim)
-- x = float(line[0])
-- y = float(line[1])
-+ self.node.append(Point())
-+ line = meshfile.readline()
-+ line = line.strip('\r\n')
-+ line = line.split(' ',self.nDim)
-+ x = float(line[0])
-+ y = float(line[1])
- z = 0.0
-- if self.nDim == 3:
-- z = float(line[2])
-- self.node[iPoint].SetCoord((x,y,z))
-+ if self.nDim == 3:
-+ z = float(line[2])
-+ self.node[iPoint].SetCoord((x,y,z))
- self.node[iPoint].SetCoord0((x,y,z))
-- self.node[iPoint].SetCoord_n((x,y,z))
-- continue
-+ self.node[iPoint].SetCoord_n((x,y,z))
-+ continue
-
-- pos = line.find('NMARK')
-- if pos != -1:
-- line = line.strip('\r\n')
-+ pos = line.find('NMARK')
-+ if pos != -1:
-+ line = line.strip('\r\n')
- line = line.split("=",1)
-- self.nMarker = int(line[1])
-- continue
-+ self.nMarker = int(line[1])
-+ continue
-
-- pos = line.find('MARKER_TAG')
-- if pos != -1:
-- line = line.strip('\r\n')
-- line = line.replace(" ", "")
-+ pos = line.find('MARKER_TAG')
-+ if pos != -1:
-+ line = line.strip('\r\n')
-+ line = line.replace(" ", "")
- line = line.split("=",1)
-- markerTag = line[1]
-- if markerTag == self.FSI_marker:
-- self.markers[markerTag] = []
-- line = meshfile.readline()
-- line = line.strip('\r\n')
-- line = line.split("=",1)
-- nElem = int(line[1])
-- for iElem in range(nElem):
-- line = meshfile.readline()
-- line = line.strip('\r\n')
-- line = line.split(' ',1)
-- elemType = int(line[0])
-- if elemType == 3:
-- nodes = line[1].split(' ', 1)
-- if not int(nodes[0]) in self.markers[markerTag]:
-- self.markers[markerTag].append(int(nodes[0]))
-- if not int(nodes[1]) in self.markers[markerTag]:
-- self.markers[markerTag].append(int(nodes[1]))
-- else:
-- print("Element type {} is not recognized !!".format(elemType))
-- continue
-- else:
-- continue
-+ markerTag = line[1]
-+ if markerTag == self.FSI_marker:
-+ self.markers[markerTag] = []
-+ line = meshfile.readline()
-+ line = line.strip('\r\n')
-+ line = line.split("=",1)
-+ nElem = int(line[1])
-+ for iElem in range(nElem):
-+ line = meshfile.readline()
-+ line = line.strip('\r\n')
-+ line = line.split(' ',1)
-+ elemType = int(line[0])
-+ if elemType == 3:
-+ nodes = line[1].split(' ', 1)
-+ if not int(nodes[0]) in self.markers[markerTag]:
-+ self.markers[markerTag].append(int(nodes[0]))
-+ if not int(nodes[1]) in self.markers[markerTag]:
-+ self.markers[markerTag].append(int(nodes[1]))
-+ else:
-+ print("Element type {} is not recognized !!".format(elemType))
-+ continue
-+ else:
-+ continue
-
- print("Number of dimensions: {}".format(self.nDim))
- print("Number of elements: {}".format(self.nElem))
-@@ -441,23 +441,23 @@
- Coord_n = self.node[iPoint].GetCoord_n()
-
- if self.Unsteady:
-- r = Coord_n - self.centerOfRotation_n
-- else:
-- r = Coord - self.centerOfRotation
-+ r = Coord_n - self.centerOfRotation_n
-+ else:
-+ r = Coord - self.centerOfRotation
-
-- rotCoord = rotMatrix.dot(r)
-+ rotCoord = rotMatrix.dot(r)
-
- newCoord = newCenter + rotCoord
- newVel[0] = Centerdot[0]+psidot*(newCoord[1]-newCenter[1])
-- newVel[1] = Centerdot[1]-psidot*(newCoord[0]-newCenter[0])
-- newVel[2] = Centerdot[2]+0.0
-+ newVel[1] = Centerdot[1]-psidot*(newCoord[0]-newCenter[0])
-+ newVel[2] = Centerdot[2]+0.0
-
- self.node[iPoint].SetCoord((newCoord[0], newCoord[1], newCoord[2]))
- self.node[iPoint].SetVel((newVel[0], newVel[1], newVel[2]))
-
-- if initialize:
-- self.node[iPoint].SetCoord_n((newCoord[0], newCoord[1], newCoord[2]))
-- self.node[iPoint].SetVel_n((newVel[0], newVel[1], newVel[2]))
-+ if initialize:
-+ self.node[iPoint].SetCoord_n((newCoord[0], newCoord[1], newCoord[2]))
-+ self.node[iPoint].SetVel_n((newVel[0], newVel[1], newVel[2]))
-
- self.centerOfRotation = np.copy(newCenter)
-
-diff -Naur old/SU2_PY/FSI/io/FSI_config.py new/SU2_PY/FSI/io/FSI_config.py
---- old/SU2_PY/FSI/io/FSI_config.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/FSI/io/FSI_config.py 2020-05-10 16:17:07.000000000 +0300
-@@ -58,23 +58,23 @@
- self.readConfig()
-
- def __str__(self):
-- tempString = str()
-- for key, value in self._ConfigContent.items():
-- tempString += "{} = {}\n".format(key,value)
-- return tempString
-+ tempString = str()
-+ for key, value in self._ConfigContent.items():
-+ tempString += "{} = {}\n".format(key,value)
-+ return tempString
-
- def __getitem__(self,key):
-- return self._ConfigContent[key]
-+ return self._ConfigContent[key]
-
- def __setitem__(self, key, value):
-- self._ConfigContent[key] = value
-+ self._ConfigContent[key] = value
-
- def readConfig(self):
- input_file = open(self.ConfigFileName)
- while 1:
-- line = input_file.readline()
-- if not line:
-- break
-+ line = input_file.readline()
-+ if not line:
-+ break
- # remove line returns
- line = line.strip('\r\n')
- # make sure it has useful data
-@@ -86,46 +86,46 @@
- this_value = line[1].strip()
-
- for case in switch(this_param):
-- #integer values
-- if case("NDIM") : pass
-- #if case("MESH_DEF_LIN_ITER") : pass
-- #if case("MESH_DEF_NONLIN_ITER") : pass
-- if case("RESTART_ITER") : pass
-- if case("NB_EXT_ITER") : pass
-- if case("NB_FSI_ITER") :
-- self._ConfigContent[this_param] = int(this_value)
-- break
-+ #integer values
-+ if case("NDIM") : pass
-+ #if case("MESH_DEF_LIN_ITER") : pass
-+ #if case("MESH_DEF_NONLIN_ITER") : pass
-+ if case("RESTART_ITER") : pass
-+ if case("NB_EXT_ITER") : pass
-+ if case("NB_FSI_ITER") :
-+ self._ConfigContent[this_param] = int(this_value)
-+ break
-
-- #float values
-+ #float values
- if case("RBF_RADIUS") : pass
-- if case("AITKEN_PARAM") : pass
-- if case("START_TIME") : pass
-- if case("UNST_TIMESTEP") : pass
-- if case("UNST_TIME") : pass
-- if case("FSI_TOLERANCE") :
-- self._ConfigContent[this_param] = float(this_value)
-- break
--
-- #string values
-- if case("CFD_CONFIG_FILE_NAME") : pass
-- if case("CSD_SOLVER") : pass
-- if case("CSD_CONFIG_FILE_NAME") : pass
-- if case("RESTART_SOL") : pass
-- if case("MATCHING_MESH") : pass
-+ if case("AITKEN_PARAM") : pass
-+ if case("START_TIME") : pass
-+ if case("UNST_TIMESTEP") : pass
-+ if case("UNST_TIME") : pass
-+ if case("FSI_TOLERANCE") :
-+ self._ConfigContent[this_param] = float(this_value)
-+ break
-+
-+ #string values
-+ if case("CFD_CONFIG_FILE_NAME") : pass
-+ if case("CSD_SOLVER") : pass
-+ if case("CSD_CONFIG_FILE_NAME") : pass
-+ if case("RESTART_SOL") : pass
-+ if case("MATCHING_MESH") : pass
- if case("MESH_INTERP_METHOD") : pass
-- if case("DISP_PRED") : pass
-- if case("AITKEN_RELAX") : pass
-- if case("TIME_MARCHING") : pass
-- if case("INTERNAL_FLOW") :
-- #if case("MESH_DEF_METHOD") : pass
-- self._ConfigContent[this_param] = this_value
-- break
--
-- if case():
-- print(this_param + " is an invalid option !")
-- break
-- #end for
--
-+ if case("DISP_PRED") : pass
-+ if case("AITKEN_RELAX") : pass
-+ if case("TIME_MARCHING") : pass
-+ if case("INTERNAL_FLOW") :
-+ #if case("MESH_DEF_METHOD") : pass
-+ self._ConfigContent[this_param] = this_value
-+ break
-+
-+ if case():
-+ print(this_param + " is an invalid option !")
-+ break
-+ #end for
-+
-
-
- #def dump()
-diff -Naur old/SU2_PY/SU2/util/filter_adjoint.py new/SU2_PY/SU2/util/filter_adjoint.py
---- old/SU2_PY/SU2/util/filter_adjoint.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/SU2/util/filter_adjoint.py 2020-05-10 16:17:07.000000000 +0300
-@@ -179,7 +179,7 @@
- Sens_smoother = smooth( S_clip, Sens_smooth, smth_len , 'blackman' )
- Sens_filter = Sens_smooth + (Sens_smooth - Sens_smoother) # sharpener
- else:
-- raise Exception, 'unknown filter type'
-+ raise Exception('unknown filter type')
-
- # --------------------------------------------
- # PLOTTING
-@@ -472,10 +472,10 @@
- """
-
- if x.ndim != 1:
-- raise ValueError, "smooth only accepts 1 dimension arrays."
-+ raise ValueError("smooth only accepts 1 dimension arrays.")
-
- if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']:
-- raise ValueError, "Window is not of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'"
-+ raise ValueError("Window is not of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'")
-
- # interpolate to constant time sample width
- min_dt = np.min( np.diff(t) )
-diff -Naur old/SU2_PY/compute_uncertainty.py new/SU2_PY/compute_uncertainty.py
---- old/SU2_PY/compute_uncertainty.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/compute_uncertainty.py 2020-05-10 16:17:07.000000000 +0300
-@@ -66,13 +66,13 @@
-
- # perform eigenvalue perturbations
- for comp in range(1,4):
-- print "\n\n =================== Performing " + str(comp) + " Component Perturbation =================== \n\n"
-+ print('\n\n =================== Performing ' + str(comp) + ' Component Perturbation =================== \n\n')
-
- # make copies
- konfig = copy.deepcopy(config)
- ztate = copy.deepcopy(state)
-
-- # set componentality
-+ # set componentality
- konfig.UQ_COMPONENT = comp
-
- # send output to a folder
-@@ -85,14 +85,14 @@
- # run su2
- info = SU2.run.CFD(konfig)
- ztate.update(info)
--
-- # Solution merging
-- konfig.SOLUTION_FILENAME = konfig.RESTART_FILENAME
-- info = SU2.run.merge(konfig)
-- ztate.update(info)
-+
-+ # Solution merging
-+ konfig.SOLUTION_FILENAME = konfig.RESTART_FILENAME
-+ info = SU2.run.merge(konfig)
-+ ztate.update(info)
-
-
-- print "\n\n =================== Performing p1c1 Component Perturbation =================== \n\n"
-+ print('\n\n =================== Performing p1c1 Component Perturbation =================== \n\n')
-
- # make copies
- konfig = copy.deepcopy(config)
-@@ -118,7 +118,7 @@
- info = SU2.run.merge(konfig)
- state.update(info)
-
-- print "\n\n =================== Performing p1c2 Component Perturbation =================== \n\n"
-+ print('\n\n =================== Performing p1c2 Component Perturbation =================== \n\n')
-
- # make copies
- konfig = copy.deepcopy(config)
-diff -Naur old/SU2_PY/fsi_computation.py new/SU2_PY/fsi_computation.py
---- old/SU2_PY/fsi_computation.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/fsi_computation.py 2020-05-10 16:17:07.000000000 +0300
-@@ -74,9 +74,9 @@
- if myid == rootProcess:
- if os.getcwd() not in sys.path:
- sys.path.append(os.getcwd())
-- print("Setting working directory : {}".format(os.getcwd()))
-- else:
-- print("Working directory is set to {}".format(os.getcwd()))
-+ print("Setting working directory : {}".format(os.getcwd()))
-+ else:
-+ print("Working directory is set to {}".format(os.getcwd()))
-
- # starts timer
- start = timer.time()
diff --git a/sci-physics/SU2/files/SU2-7.0.6-fix-env.patch b/sci-physics/SU2/files/SU2-7.0.6-fix-env.patch
deleted file mode 100644
index baf7955d..00000000
--- a/sci-physics/SU2/files/SU2-7.0.6-fix-env.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Naur old_env/UnitTests/meson.build new_env/UnitTests/meson.build
---- old_env/UnitTests/meson.build 2020-06-15 17:03:43.000000000 +0300
-+++ new_env/UnitTests/meson.build 2020-06-15 17:04:35.000000000 +0300
-@@ -26,7 +26,7 @@
- test_driver = executable(
- 'test_driver',
- unit_test_files,
-- install : true,
-+ install : false,
- dependencies : [su2_cfd_dep, common_dep, su2_deps, catch2_dep],
- cpp_args: ['-fPIC', default_warning_flags, su2_cpp_args]
- )
diff --git a/sci-physics/SU2/files/SU2-7.0.7-fix-env.patch b/sci-physics/SU2/files/SU2-7.0.7-fix-env.patch
deleted file mode 100644
index baf7955d..00000000
--- a/sci-physics/SU2/files/SU2-7.0.7-fix-env.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -Naur old_env/UnitTests/meson.build new_env/UnitTests/meson.build
---- old_env/UnitTests/meson.build 2020-06-15 17:03:43.000000000 +0300
-+++ new_env/UnitTests/meson.build 2020-06-15 17:04:35.000000000 +0300
-@@ -26,7 +26,7 @@
- test_driver = executable(
- 'test_driver',
- unit_test_files,
-- install : true,
-+ install : false,
- dependencies : [su2_cfd_dep, common_dep, su2_deps, catch2_dep],
- cpp_args: ['-fPIC', default_warning_flags, su2_cpp_args]
- )
diff --git a/sci-physics/SU2/files/SU2-7.0.7-fix-python-optimize.patch b/sci-physics/SU2/files/SU2-7.0.7-fix-python-optimize.patch
deleted file mode 100644
index 0b35037c..00000000
--- a/sci-physics/SU2/files/SU2-7.0.7-fix-python-optimize.patch
+++ /dev/null
@@ -1,2212 +0,0 @@
-diff -Naur old/SU2_PY/FSI/FSIInterface.py new/SU2_PY/FSI/FSIInterface.py
---- old/SU2_PY/FSI/FSIInterface.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/FSI/FSIInterface.py 2020-05-10 16:17:07.000000000 +0300
-@@ -6,8 +6,8 @@
- # \version 7.0.7 "Blackbird"
- #
- # SU2 Project Website: https://su2code.github.io
--#
--# The SU2 Project is maintained by the SU2 Foundation
-+#
-+# The SU2 Project is maintained by the SU2 Foundation
- # (http://su2foundation.org)
- #
- # Copyright 2012-2020, SU2 Contributors (cf. AUTHORS.md)
-@@ -16,7 +16,7 @@
- # modify it under the terms of the GNU Lesser General Public
- # License as published by the Free Software Foundation; either
- # version 2.1 of the License, or (at your option) any later version.
--#
-+#
- # SU2 is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-@@ -42,19 +42,19 @@
- # ----------------------------------------------------------------------
-
- class Interface:
-- """
-+ """
- FSI interface class that handles fluid/solid solvers synchronisation and communication
- """
--
-+
- def __init__(self, FSI_config, FluidSolver, SolidSolver, have_MPI):
-- """
-- Class constructor. Declare some variables and do some screen outputs.
-- """
--
-+ """
-+ Class constructor. Declare some variables and do some screen outputs.
-+ """
-+
- if have_MPI == True:
- from mpi4py import MPI
- self.MPI = MPI
-- self.comm = MPI.COMM_WORLD #MPI World communicator
-+ self.comm = MPI.COMM_WORLD #MPI World communicator
- self.have_MPI = True
- myid = self.comm.Get_rank()
- else:
-@@ -62,42 +62,42 @@
- self.have_MPI = False
- myid = 0
-
-- self.rootProcess = 0 #the root process is chosen to be MPI rank = 0
-+ self.rootProcess = 0 #the root process is chosen to be MPI rank = 0
-
-- self.nDim = FSI_config['NDIM'] #problem dimension
-+ self.nDim = FSI_config['NDIM'] #problem dimension
-
-- self.haveFluidSolver = False #True if the fluid solver is initialized on the current rank
-- self.haveSolidSolver = False #True if the solid solver is initialized on the current rank
-- self.haveFluidInterface = False #True if the current rank owns at least one fluid interface node
-- self.haveSolidInterface = False #True if the current rank owns at least one solid interface node
-+ self.haveFluidSolver = False #True if the fluid solver is initialized on the current rank
-+ self.haveSolidSolver = False #True if the solid solver is initialized on the current rank
-+ self.haveFluidInterface = False #True if the current rank owns at least one fluid interface node
-+ self.haveSolidInterface = False #True if the current rank owns at least one solid interface node
-
-- self.fluidSolverProcessors = list() #list of partitions where the fluid solver is initialized
-- self.solidSolverProcessors = list() #list of partitions where the solid solver is initialized
-+ self.fluidSolverProcessors = list() #list of partitions where the fluid solver is initialized
-+ self.solidSolverProcessors = list() #list of partitions where the solid solver is initialized
- self.fluidInterfaceProcessors = list() #list of partitions where there are fluid interface nodes
-- self.solidInterfaceProcessors = list() #list of partitions where there are solid interface nodes
-+ self.solidInterfaceProcessors = list() #list of partitions where there are solid interface nodes
-
-- self.fluidInterfaceIdentifier = None #object that can identify the f/s interface within the fluid solver
-- self.solidInterfaceIdentifier = None #object that can identify the f/s interface within the solid solver
-+ self.fluidInterfaceIdentifier = None #object that can identify the f/s interface within the fluid solver
-+ self.solidInterfaceIdentifier = None #object that can identify the f/s interface within the solid solver
-
-- self.fluidGlobalIndexRange = {} #contains the global FSI indexing of each fluid interface node for all partitions
-- self.solidGlobalIndexRange = {} #contains the global FSI indexing of each solid interface node for all partitions
-+ self.fluidGlobalIndexRange = {} #contains the global FSI indexing of each fluid interface node for all partitions
-+ self.solidGlobalIndexRange = {} #contains the global FSI indexing of each solid interface node for all partitions
-
-- self.FluidHaloNodeList = {} #contains the the indices (fluid solver indexing) of the halo nodes for each partition
-- self.fluidIndexing = {} #links between the fluid solver indexing and the FSI indexing for the interface nodes
-- self.SolidHaloNodeList = {} #contains the the indices (solid solver indexing) of the halo nodes for each partition
-- self.solidIndexing = {} #links between the solid solver indexing and the FSI indexing for the interface nodes
--
-- self.nLocalFluidInterfaceNodes = 0 #number of nodes (halo nodes included) on the fluid interface, on each partition
-- self.nLocalFluidInterfaceHaloNode = 0 #number of halo nodes on the fluid intrface, on each partition
-- self.nLocalFluidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the fluid interface, on each partition
-- self.nFluidInterfaceNodes = 0 #number of nodes on the fluid interface, sum over all the partitions
-- self.nFluidInterfacePhysicalNodes = 0 #number of physical nodes on the fluid interface, sum over all partitions
--
-- self.nLocalSolidInterfaceNodes = 0 #number of physical nodes on the solid interface, on each partition
-- self.nLocalSolidInterfaceHaloNode = 0 #number of halo nodes on the solid intrface, on each partition
-- self.nLocalSolidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the solid interface, on each partition
-- self.nSolidInterfaceNodes = 0 #number of nodes on the solid interface, sum over all partitions
-- self.nSolidInterfacePhysicalNodes = 0 #number of physical nodes on the solid interface, sum over all partitions
-+ self.FluidHaloNodeList = {} #contains the the indices (fluid solver indexing) of the halo nodes for each partition
-+ self.fluidIndexing = {} #links between the fluid solver indexing and the FSI indexing for the interface nodes
-+ self.SolidHaloNodeList = {} #contains the the indices (solid solver indexing) of the halo nodes for each partition
-+ self.solidIndexing = {} #links between the solid solver indexing and the FSI indexing for the interface nodes
-+
-+ self.nLocalFluidInterfaceNodes = 0 #number of nodes (halo nodes included) on the fluid interface, on each partition
-+ self.nLocalFluidInterfaceHaloNode = 0 #number of halo nodes on the fluid intrface, on each partition
-+ self.nLocalFluidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the fluid interface, on each partition
-+ self.nFluidInterfaceNodes = 0 #number of nodes on the fluid interface, sum over all the partitions
-+ self.nFluidInterfacePhysicalNodes = 0 #number of physical nodes on the fluid interface, sum over all partitions
-+
-+ self.nLocalSolidInterfaceNodes = 0 #number of physical nodes on the solid interface, on each partition
-+ self.nLocalSolidInterfaceHaloNode = 0 #number of halo nodes on the solid intrface, on each partition
-+ self.nLocalSolidInterfacePhysicalNodes = 0 #number of physical (= non halo) nodes on the solid interface, on each partition
-+ self.nSolidInterfaceNodes = 0 #number of nodes on the solid interface, sum over all partitions
-+ self.nSolidInterfacePhysicalNodes = 0 #number of physical nodes on the solid interface, sum over all partitions
-
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- self.MappingMatrixA = None
-@@ -106,83 +106,83 @@
- self.MappingMatrixB_T = None
- self.d_RBF = self.nDim+1
- else:
-- self.MappingMatrix = None #interpolation/mapping matrix for meshes interpolation/mapping
-- self.MappingMatrix_T = None #transposed interpolation/mapping matrix for meshes interpolation/mapping
-+ self.MappingMatrix = None #interpolation/mapping matrix for meshes interpolation/mapping
-+ self.MappingMatrix_T = None #transposed interpolation/mapping matrix for meshes interpolation/mapping
- self.d_RBF = 0
-
-- self.localFluidInterface_array_X_init = None #initial fluid interface position on each partition (used for the meshes mapping)
-+ self.localFluidInterface_array_X_init = None #initial fluid interface position on each partition (used for the meshes mapping)
- self.localFluidInterface_array_Y_init = None
- self.localFluidInterface_array_Z_init = None
-
-- self.haloNodesPositionsInit = {} #initial position of the halo nodes (fluid side only)
-+ self.haloNodesPositionsInit = {} #initial position of the halo nodes (fluid side only)
-
-- self.solidInterface_array_DispX = None #solid interface displacement
-+ self.solidInterface_array_DispX = None #solid interface displacement
- self.solidInterface_array_DispY = None
- self.solidInterface_array_DispZ = None
-
-- self.solidInterfaceResidual_array_X = None #solid interface position residual
-+ self.solidInterfaceResidual_array_X = None #solid interface position residual
- self.solidInterfaceResidual_array_Y = None
- self.solidInterfaceResidual_array_Z = None
-
-- self.solidInterfaceResidualnM1_array_X = None #solid interface position residual at the previous BGS iteration
-+ self.solidInterfaceResidualnM1_array_X = None #solid interface position residual at the previous BGS iteration
- self.solidInterfaceResidualnM1_array_Y = None
- self.solidInterfaceResidualnM1_array_Z = None
--
-- self.fluidInterface_array_DispX = None #fluid interface displacement
-+
-+ self.fluidInterface_array_DispX = None #fluid interface displacement
- self.fluidInterface_array_DispY = None
- self.fluidInterface_array_DispZ = None
-
-- self.fluidLoads_array_X = None #loads on the fluid side of the f/s interface
-+ self.fluidLoads_array_X = None #loads on the fluid side of the f/s interface
- self.fluidLoads_array_Y = None
- self.fluidLoads_array_Z = None
-
-- self.solidLoads_array_X = None #loads on the solid side of the f/s interface
-+ self.solidLoads_array_X = None #loads on the solid side of the f/s interface
- self.solidLoads_array_Y = None
- self.solidLoads_array_Z = None
-
-- self.aitkenParam = FSI_config['AITKEN_PARAM'] #relaxation parameter for the BGS method
-- self.FSIIter = 0 #current FSI iteration
-- self.unsteady = False #flag for steady or unsteady simulation (default is steady)
--
-- # ---Some screen output ---
-- self.MPIPrint('Fluid solver : SU2_CFD')
-- self.MPIPrint('Solid solver : {}'.format(FSI_config['CSD_SOLVER']))
-+ self.aitkenParam = FSI_config['AITKEN_PARAM'] #relaxation parameter for the BGS method
-+ self.FSIIter = 0 #current FSI iteration
-+ self.unsteady = False #flag for steady or unsteady simulation (default is steady)
-+
-+ # ---Some screen output ---
-+ self.MPIPrint('Fluid solver : SU2_CFD')
-+ self.MPIPrint('Solid solver : {}'.format(FSI_config['CSD_SOLVER']))
-
-- if FSI_config['TIME_MARCHING'] == 'YES':
-+ if FSI_config['TIME_MARCHING'] == 'YES':
- self.MPIPrint('Unsteady coupled simulation with physical time step : {} s'.format(FSI_config['UNST_TIMESTEP']))
- self.unsteady = True
-- else:
-- self.MPIPrint('Steady coupled simulation')
-+ else:
-+ self.MPIPrint('Steady coupled simulation')
-
-- if FSI_config['MATCHING_MESH'] == 'YES':
-- self.MPIPrint('Matching fluid-solid interface')
-- else:
-+ if FSI_config['MATCHING_MESH'] == 'YES':
-+ self.MPIPrint('Matching fluid-solid interface')
-+ else:
- if FSI_config['MESH_INTERP_METHOD'] == 'TPS':
-- self.MPIPrint('Non matching fluid-solid interface with Thin Plate Spline interpolation')
-+ self.MPIPrint('Non matching fluid-solid interface with Thin Plate Spline interpolation')
- elif FSI_config['MESH_INTERP_METHOD'] == 'RBF':
- self.MPIPrint('Non matching fluid-solid interface with Radial Basis Function interpolation')
- self.RBF_rad = FSI_config['RBF_RADIUS']
-- self.MPIPrint('Radius value : {}'.format(self.RBF_rad))
-+ self.MPIPrint('Radius value : {}'.format(self.RBF_rad))
- else:
-- self.MPIPrint('Non matching fluid-solid interface with Nearest Neighboor interpolation')
-+ self.MPIPrint('Non matching fluid-solid interface with Nearest Neighboor interpolation')
-
-- self.MPIPrint('Solid predictor : {}'.format(FSI_config['DISP_PRED']))
-+ self.MPIPrint('Solid predictor : {}'.format(FSI_config['DISP_PRED']))
-
-- self.MPIPrint('Maximum number of FSI iterations : {}'.format(FSI_config['NB_FSI_ITER']))
-+ self.MPIPrint('Maximum number of FSI iterations : {}'.format(FSI_config['NB_FSI_ITER']))
-
-- self.MPIPrint('FSI tolerance : {}'.format(FSI_config['FSI_TOLERANCE']))
-+ self.MPIPrint('FSI tolerance : {}'.format(FSI_config['FSI_TOLERANCE']))
-
-- if FSI_config['AITKEN_RELAX'] == 'STATIC':
-- self.MPIPrint('Static Aitken under-relaxation with constant parameter {}'.format(FSI_config['AITKEN_PARAM']))
-- elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
-- self.MPIPrint('Dynamic Aitken under-relaxation with initial parameter {}'.format(FSI_config['AITKEN_PARAM']))
-- else:
-- self.MPIPrint('No Aitken under-relaxation')
-+ if FSI_config['AITKEN_RELAX'] == 'STATIC':
-+ self.MPIPrint('Static Aitken under-relaxation with constant parameter {}'.format(FSI_config['AITKEN_PARAM']))
-+ elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
-+ self.MPIPrint('Dynamic Aitken under-relaxation with initial parameter {}'.format(FSI_config['AITKEN_PARAM']))
-+ else:
-+ self.MPIPrint('No Aitken under-relaxation')
-
- self.MPIPrint('FSI interface is set')
-
- def MPIPrint(self, message):
-- """
-+ """
- Print a message on screen only from the master process.
- """
-
-@@ -198,28 +198,28 @@
- """
- Perform a synchronization barrier in case of parallel run with MPI.
- """
--
-+
- if self.have_MPI == True:
- self.comm.barrier()
-
- def connect(self, FSI_config, FluidSolver, SolidSolver):
-- """
-- Connection between solvers.
-- Creates the communication support between the two solvers.
-- Gets information about f/s interfaces from the two solvers.
-- """
-+ """
-+ Connection between solvers.
-+ Creates the communication support between the two solvers.
-+ Gets information about f/s interfaces from the two solvers.
-+ """
- if self.have_MPI == True:
- myid = self.comm.Get_rank()
-- MPIsize = self.comm.Get_size()
-+ MPIsize = self.comm.Get_size()
- else:
- myid = 0
- MPIsize = 1
--
-- # --- Identify the fluid and solid interfaces and store the number of nodes on both sides (and for each partition) ---
-+
-+ # --- Identify the fluid and solid interfaces and store the number of nodes on both sides (and for each partition) ---
- self.fluidInterfaceIdentifier = None
- self.nLocalFluidInterfaceNodes = 0
- if FluidSolver != None:
-- print('Fluid solver is initialized on process {}'.format(myid))
-+ print('Fluid solver is initialized on process {}'.format(myid))
- self.haveFluidSolver = True
- allMovingMarkersTags = FluidSolver.GetAllMovingMarkersTag()
- allMarkersID = FluidSolver.GetAllBoundaryMarkers()
-@@ -229,23 +229,23 @@
- if allMovingMarkersTags[0] in allMarkersID.keys():
- self.fluidInterfaceIdentifier = allMarkersID[allMovingMarkersTags[0]]
- if self.fluidInterfaceIdentifier != None:
-- self.nLocalFluidInterfaceNodes = FluidSolver.GetNumberVertices(self.fluidInterfaceIdentifier)
-- if self.nLocalFluidInterfaceNodes != 0:
-+ self.nLocalFluidInterfaceNodes = FluidSolver.GetNumberVertices(self.fluidInterfaceIdentifier)
-+ if self.nLocalFluidInterfaceNodes != 0:
- self.haveFluidInterface = True
-- print('Number of interface fluid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalFluidInterfaceNodes))
-- else:
-- pass
-+ print('Number of interface fluid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalFluidInterfaceNodes))
-+ else:
-+ pass
-
-- if SolidSolver != None:
-- print('Solid solver is initialized on process {}'.format(myid))
-+ if SolidSolver != None:
-+ print('Solid solver is initialized on process {}'.format(myid))
- self.haveSolidSolver = True
-- self.solidInterfaceIdentifier = SolidSolver.getFSIMarkerID()
-- self.nLocalSolidInterfaceNodes = SolidSolver.getNumberOfSolidInterfaceNodes(self.solidInterfaceIdentifier)
-- if self.nLocalSolidInterfaceNodes != 0:
-+ self.solidInterfaceIdentifier = SolidSolver.getFSIMarkerID()
-+ self.nLocalSolidInterfaceNodes = SolidSolver.getNumberOfSolidInterfaceNodes(self.solidInterfaceIdentifier)
-+ if self.nLocalSolidInterfaceNodes != 0:
- self.haveSolidInterface = True
- print('Number of interface solid nodes (halo nodes included) on proccess {} : {}'.format(myid,self.nLocalSolidInterfaceNodes))
-- else:
-- pass
-+ else:
-+ pass
-
- # --- Exchange information about processors on which the solvers are defined and where the interface nodes are lying ---
- if self.have_MPI == True:
-@@ -266,18 +266,18 @@
- else:
- sendBufSolidInterface = np.array(int(0))
- rcvBufFluid = np.zeros(MPIsize, dtype = int)
-- rcvBufSolid = np.zeros(MPIsize, dtype = int)
-+ rcvBufSolid = np.zeros(MPIsize, dtype = int)
- rcvBufFluidInterface = np.zeros(MPIsize, dtype = int)
-- rcvBufSolidInterface = np.zeros(MPIsize, dtype = int)
-+ rcvBufSolidInterface = np.zeros(MPIsize, dtype = int)
- self.comm.Allgather(sendBufFluid, rcvBufFluid)
- self.comm.Allgather(sendBufSolid, rcvBufSolid)
- self.comm.Allgather(sendBufFluidInterface, rcvBufFluidInterface)
- self.comm.Allgather(sendBufSolidInterface, rcvBufSolidInterface)
- for iProc in range(MPIsize):
-- if rcvBufFluid[iProc] == 1:
-+ if rcvBufFluid[iProc] == 1:
- self.fluidSolverProcessors.append(iProc)
- if rcvBufSolid[iProc] == 1:
-- self.solidSolverProcessors.append(iProc)
-+ self.solidSolverProcessors.append(iProc)
- if rcvBufFluidInterface[iProc] == 1:
- self.fluidInterfaceProcessors.append(iProc)
- if rcvBufSolidInterface[iProc] == 1:
-@@ -285,19 +285,19 @@
- del sendBufFluid, sendBufSolid, rcvBufFluid, rcvBufSolid, sendBufFluidInterface, sendBufSolidInterface, rcvBufFluidInterface, rcvBufSolidInterface
- else:
- self.fluidSolverProcessors.append(0)
-- self.solidSolverProcessors.append(0)
-+ self.solidSolverProcessors.append(0)
- self.fluidInterfaceProcessors.append(0)
- self.solidInterfaceProcessors.append(0)
-
-- self.MPIBarrier()
--
-- # --- Calculate the total number of nodes at the fluid interface (sum over all the partitions) ---
-+ self.MPIBarrier()
-+
-+ # --- Calculate the total number of nodes at the fluid interface (sum over all the partitions) ---
- # Calculate the number of halo nodes on each partition
- self.nLocalFluidInterfaceHaloNode = 0
-- for iVertex in range(self.nLocalFluidInterfaceNodes):
-+ for iVertex in range(self.nLocalFluidInterfaceNodes):
- if FluidSolver.IsAHaloNode(self.fluidInterfaceIdentifier, iVertex) == True:
- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
-- self.FluidHaloNodeList[GlobalIndex] = iVertex
-+ self.FluidHaloNodeList[GlobalIndex] = iVertex
- self.nLocalFluidInterfaceHaloNode += 1
- # Calculate the number of physical (= not halo) nodes on each partition
- self.nLocalFluidInterfacePhysicalNodes = self.nLocalFluidInterfaceNodes - self.nLocalFluidInterfaceHaloNode
-@@ -308,10 +308,10 @@
-
- # Same thing for the solid part
- self.nLocalSolidInterfaceHaloNode = 0
-- #for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ #for iVertex in range(self.nLocalSolidInterfaceNodes):
- #if SoliddSolver.IsAHaloNode(self.fluidInterfaceIdentifier, iVertex) == True:
- #GlobalIndex = SolidSolver.GetVertexGlobalIndex(self.solidInterfaceIdentifier, iVertex)
-- #self.SolidHaloNodeList[GlobalIndex] = iVertex
-+ #self.SolidHaloNodeList[GlobalIndex] = iVertex
- #self.nLocalSolidInterfaceHaloNode += 1
- self.nLocalSolidInterfacePhysicalNodes = self.nLocalSolidInterfaceNodes - self.nLocalSolidInterfaceHaloNode
- if self.have_MPI == True:
-@@ -323,11 +323,11 @@
- # --- Calculate the total number of nodes (with and without halo) at the fluid interface (sum over all the partitions) and broadcast the number accross all processors ---
- sendBuffHalo = np.array(int(self.nLocalFluidInterfaceNodes))
- sendBuffPhysical = np.array(int(self.nLocalFluidInterfacePhysicalNodes))
-- rcvBuffHalo = np.zeros(1, dtype=int)
-+ rcvBuffHalo = np.zeros(1, dtype=int)
- rcvBuffPhysical = np.zeros(1, dtype=int)
-- if self.have_MPI == True:
-+ if self.have_MPI == True:
- self.comm.barrier()
-- self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
-+ self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
- self.comm.Allreduce(sendBuffPhysical,rcvBuffPhysical,op=self.MPI.SUM)
- self.nFluidInterfaceNodes = rcvBuffHalo[0]
- self.nFluidInterfacePhysicalNodes = rcvBuffPhysical[0]
-@@ -339,11 +339,11 @@
- # Same thing for the solid part
- sendBuffHalo = np.array(int(self.nLocalSolidInterfaceNodes))
- sendBuffPhysical = np.array(int(self.nLocalSolidInterfacePhysicalNodes))
-- rcvBuffHalo = np.zeros(1, dtype=int)
-+ rcvBuffHalo = np.zeros(1, dtype=int)
- rcvBuffPhysical = np.zeros(1, dtype=int)
- if self.have_MPI == True:
-- self.comm.barrier()
-- self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
-+ self.comm.barrier()
-+ self.comm.Allreduce(sendBuffHalo,rcvBuffHalo,op=self.MPI.SUM)
- self.comm.Allreduce(sendBuffPhysical,rcvBuffPhysical,op=self.MPI.SUM)
- self.nSolidInterfaceNodes = rcvBuffHalo[0]
- self.nSolidInterfacePhysicalNodes = rcvBuffPhysical[0]
-@@ -375,7 +375,7 @@
- if myid in self.fluidInterfaceProcessors:
- globalIndexStart = 0
- for iProc in range(myid):
-- globalIndexStart += self.fluidPhysicalInterfaceNodesDistribution[iProc]
-+ globalIndexStart += self.fluidPhysicalInterfaceNodesDistribution[iProc]
- globalIndexStop = globalIndexStart + self.nLocalFluidInterfacePhysicalNodes-1
- else:
- globalIndexStart = 0
-@@ -387,8 +387,8 @@
- temp[0] = [0,self.nLocalFluidInterfacePhysicalNodes-1]
- self.fluidGlobalIndexRange = list()
- self.fluidGlobalIndexRange.append(temp)
--
-- # Same thing for the solid part
-+
-+ # Same thing for the solid part
- if self.have_MPI == True:
- if myid in self.solidInterfaceProcessors:
- globalIndexStart = 0
-@@ -404,14 +404,14 @@
- temp = {}
- temp[0] = [0,self.nSolidInterfacePhysicalNodes-1]
- self.solidGlobalIndexRange = list()
-- self.solidGlobalIndexRange.append(temp)
-+ self.solidGlobalIndexRange.append(temp)
-
-- self.MPIPrint('Total number of fluid interface nodes (halo nodes included) : {}'.format(self.nFluidInterfaceNodes))
-- self.MPIPrint('Total number of solid interface nodes (halo nodes included) : {}'.format(self.nSolidInterfaceNodes))
-+ self.MPIPrint('Total number of fluid interface nodes (halo nodes included) : {}'.format(self.nFluidInterfaceNodes))
-+ self.MPIPrint('Total number of solid interface nodes (halo nodes included) : {}'.format(self.nSolidInterfaceNodes))
- self.MPIPrint('Total number of fluid interface nodes : {}'.format(self.nFluidInterfacePhysicalNodes))
- self.MPIPrint('Total number of solid interface nodes : {}'.format(self.nSolidInterfacePhysicalNodes))
-
-- self.MPIBarrier()
-+ self.MPIBarrier()
-
- # --- Create all the PETSc vectors required for parallel communication and parallel mesh mapping/interpolation (working for serial too) ---
- if self.have_MPI == True:
-@@ -432,8 +432,8 @@
- self.solidInterface_array_DispY.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- self.solidInterface_array_DispZ.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- self.solidInterface_array_DispX.set(0.0)
-- self.solidInterface_array_DispY.set(0.0)
-- self.solidInterface_array_DispZ.set(0.0)
-+ self.solidInterface_array_DispY.set(0.0)
-+ self.solidInterface_array_DispZ.set(0.0)
-
- if self.have_MPI == True:
- self.fluidInterface_array_DispX = PETSc.Vec().create(self.comm)
-@@ -536,30 +536,30 @@
- self.solidInterfaceResidualnM1_array_Z.set(0.0)
-
- def interfaceMapping(self,FluidSolver, SolidSolver, FSI_config):
-- """
-- Creates the one-to-one mapping between interfaces in case of matching meshes.
-- Creates the interpolation rules between interfaces in case of non-matching meshes.
-- """
-- if self.have_MPI == True:
-+ """
-+ Creates the one-to-one mapping between interfaces in case of matching meshes.
-+ Creates the interpolation rules between interfaces in case of non-matching meshes.
-+ """
-+ if self.have_MPI == True:
- myid = self.comm.Get_rank()
-- MPIsize = self.comm.Get_size()
-+ MPIsize = self.comm.Get_size()
- else:
- myid = 0
- MPIsize = 1
-
-- # --- Get the fluid interface from fluid solver on each partition ---
-- GlobalIndex = int()
-+ # --- Get the fluid interface from fluid solver on each partition ---
-+ GlobalIndex = int()
- localIndex = 0
- fluidIndexing_temp = {}
- self.localFluidInterface_array_X_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
- self.localFluidInterface_array_Y_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
- self.localFluidInterface_array_Z_init = np.zeros((self.nLocalFluidInterfacePhysicalNodes))
- for iVertex in range(self.nLocalFluidInterfaceNodes):
-- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
-- posx = FluidSolver.GetVertexCoordX(self.fluidInterfaceIdentifier, iVertex)
-- posy = FluidSolver.GetVertexCoordY(self.fluidInterfaceIdentifier, iVertex)
-- posz = FluidSolver.GetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex)
-- if GlobalIndex in self.FluidHaloNodeList[myid].keys():
-+ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
-+ posx = FluidSolver.GetVertexCoordX(self.fluidInterfaceIdentifier, iVertex)
-+ posy = FluidSolver.GetVertexCoordY(self.fluidInterfaceIdentifier, iVertex)
-+ posz = FluidSolver.GetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex)
-+ if GlobalIndex in self.FluidHaloNodeList[myid].keys():
- self.haloNodesPositionsInit[GlobalIndex] = (posx, posy, posz)
- else:
- fluidIndexing_temp[GlobalIndex] = self.__getGlobalIndex('fluid', myid, localIndex)
-@@ -576,17 +576,17 @@
- self.fluidIndexing = fluidIndexing_temp.copy()
- del fluidIndexing_temp
-
-- # --- Get the solid interface from solid solver on each partition ---
-+ # --- Get the solid interface from solid solver on each partition ---
- localIndex = 0
- solidIndexing_temp = {}
-- self.localSolidInterface_array_X = np.zeros(self.nLocalSolidInterfaceNodes)
-+ self.localSolidInterface_array_X = np.zeros(self.nLocalSolidInterfaceNodes)
- self.localSolidInterface_array_Y = np.zeros(self.nLocalSolidInterfaceNodes)
- self.localSolidInterface_array_Z = np.zeros(self.nLocalSolidInterfaceNodes)
- for iVertex in range(self.nLocalSolidInterfaceNodes):
- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
-- posx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
-- posy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
-- posz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
-+ posx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
-+ posy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
-+ posz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.SolidHaloNodeList[myid].keys():
- pass
- else:
-@@ -605,14 +605,14 @@
- del solidIndexing_temp
-
-
-- # --- Create the PETSc parallel interpolation matrix ---
-+ # --- Create the PETSc parallel interpolation matrix ---
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- if self.have_MPI == True:
- self.MappingMatrixA = PETSc.Mat().create(self.comm)
- self.MappingMatrixB = PETSc.Mat().create(self.comm)
- self.MappingMatrixA_T = PETSc.Mat().create(self.comm)
- self.MappingMatrixB_T = PETSc.Mat().create(self.comm)
-- if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
-+ if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
- self.MappingMatrixA.setType('mpiaij')
- self.MappingMatrixB.setType('mpiaij')
- self.MappingMatrixA_T.setType('mpiaij')
-@@ -627,7 +627,7 @@
- self.MappingMatrixB = PETSc.Mat().create()
- self.MappingMatrixA_T = PETSc.Mat().create()
- self.MappingMatrixB_T = PETSc.Mat().create()
-- if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
-+ if FSI_config['MESH_INTERP_METHOD'] == 'RBF' :
- self.MappingMatrixA.setType('aij')
- self.MappingMatrixB.setType('aij')
- self.MappingMatrixA_T.setType('aij')
-@@ -637,16 +637,16 @@
- self.MappingMatrixB.setType('aij')
- self.MappingMatrixA_T.setType('aij')
- self.MappingMatrixB_T.setType('aij')
-- self.MappingMatrixA.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
-+ self.MappingMatrixA.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
- self.MappingMatrixA.setUp()
- self.MappingMatrixA.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
-- self.MappingMatrixB.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes+self.d_RBF))
-+ self.MappingMatrixB.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes+self.d_RBF))
- self.MappingMatrixB.setUp()
- self.MappingMatrixB.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
-- self.MappingMatrixA_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
-+ self.MappingMatrixA_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nSolidInterfacePhysicalNodes+self.d_RBF))
- self.MappingMatrixA_T.setUp()
- self.MappingMatrixA_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
-- self.MappingMatrixB_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nFluidInterfacePhysicalNodes))
-+ self.MappingMatrixB_T.setSizes((self.nSolidInterfacePhysicalNodes+self.d_RBF, self.nFluidInterfacePhysicalNodes))
- self.MappingMatrixB_T.setUp()
- self.MappingMatrixB_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
- else:
-@@ -660,21 +660,21 @@
- self.MappingMatrix_T = PETSc.Mat().create()
- self.MappingMatrix.setType('aij')
- self.MappingMatrix_T.setType('aij')
-- self.MappingMatrix.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes))
-+ self.MappingMatrix.setSizes((self.nFluidInterfacePhysicalNodes, self.nSolidInterfacePhysicalNodes))
- self.MappingMatrix.setUp()
- self.MappingMatrix.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
-- self.MappingMatrix_T.setSizes((self.nSolidInterfacePhysicalNodes, self.nFluidInterfacePhysicalNodes))
-+ self.MappingMatrix_T.setSizes((self.nSolidInterfacePhysicalNodes, self.nFluidInterfacePhysicalNodes))
- self.MappingMatrix_T.setUp()
- self.MappingMatrix_T.setOption(PETSc.Mat().Option.NEW_NONZERO_ALLOCATION_ERR, False)
--
--
-+
-+
- # --- Fill the interpolation matrix in parallel (working in serial too) ---
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- self.MPIPrint('Building interpolation matrices...')
- if self.have_MPI == True:
- for iProc in self.solidInterfaceProcessors:
- if myid == iProc:
-- for jProc in self.solidInterfaceProcessors:
-+ for jProc in self.solidInterfaceProcessors:
- self.comm.Send(self.localSolidInterface_array_X, dest=jProc, tag=1)
- self.comm.Send(self.localSolidInterface_array_Y, dest=jProc, tag=2)
- self.comm.Send(self.localSolidInterface_array_Z, dest=jProc, tag=3)
-@@ -726,7 +726,7 @@
- self.TPSMeshMapping_B(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
- else:
- self.NearestNeighboorMeshMapping(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
-- else:
-+ else:
- self.matchingMeshMapping(solidInterfaceBuffRcv_X, solidInterfaceBuffRcv_Y, solidInterfaceBuffRcv_Z, iProc)
- else:
- if FSI_config['MATCHING_MESH'] == 'NO':
-@@ -735,10 +735,10 @@
- elif FSI_config['MESH_INTERP_METHOD'] == 'TPS' :
- self.TPSMeshMapping_B(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
- else:
-- self.NearestNeighboorMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
-- else:
-+ self.NearestNeighboorMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
-+ else:
- self.matchingMeshMapping(self.localSolidInterface_array_X, self.localSolidInterface_array_Y, self.localSolidInterface_array_Z, 0)
--
-+
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- self.MappingMatrixB.assemblyBegin()
- self.MappingMatrixB.assemblyEnd()
-@@ -751,9 +751,9 @@
- self.MappingMatrix_T.assemblyBegin()
- self.MappingMatrix_T.assemblyEnd()
- self.MPIPrint("Interpolation matrix is built.")
--
-+
- self.MPIBarrier()
--
-+
- del self.localSolidInterface_array_X
- del self.localSolidInterface_array_Y
- del self.localSolidInterface_array_Z
-@@ -768,20 +768,20 @@
- myid = 0
-
- # --- Instantiate the spatial indexing ---
-- prop_index = index.Property()
-- prop_index.dimension = self.nDim
-- SolidSpatialTree = index.Index(properties=prop_index)
--
-+ prop_index = index.Property()
-+ prop_index.dimension = self.nDim
-+ SolidSpatialTree = index.Index(properties=prop_index)
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for jVertex in range(nSolidNodes):
- posX = solidInterfaceBuffRcv_X[jVertex]
- posY = solidInterfaceBuffRcv_Y[jVertex]
- posZ = solidInterfaceBuffRcv_Z[jVertex]
-- if self.nDim == 2 :
-- SolidSpatialTree.add(jVertex, (posX, posY))
-- else :
-- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-+ if self.nDim == 2 :
-+ SolidSpatialTree.add(jVertex, (posX, posY))
-+ else :
-+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-
- if self.nFluidInterfacePhysicalNodes != self.nSolidInterfacePhysicalNodes:
- raise Exception("Fluid and solid interface must have the same number of nodes for matching meshes ! ")
-@@ -822,20 +822,20 @@
- myid = 0
-
- # --- Instantiate the spatial indexing ---
-- prop_index = index.Property()
-- prop_index.dimension = self.nDim
-- SolidSpatialTree = index.Index(properties=prop_index)
--
-+ prop_index = index.Property()
-+ prop_index.dimension = self.nDim
-+ SolidSpatialTree = index.Index(properties=prop_index)
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for jVertex in range(nSolidNodes):
- posX = solidInterfaceBuffRcv_X[jVertex]
- posY = solidInterfaceBuffRcv_Y[jVertex]
- posZ = solidInterfaceBuffRcv_Z[jVertex]
-- if self.nDim == 2 :
-- SolidSpatialTree.add(jVertex, (posX, posY))
-- else :
-- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-+ if self.nDim == 2 :
-+ SolidSpatialTree.add(jVertex, (posX, posY))
-+ else :
-+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-
- # --- For each fluid interface node, find the nearest solid interface node and fill the boolean mapping matrix ---
- for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
-@@ -863,20 +863,20 @@
- myid = 0
-
- # --- Instantiate the spatial indexing ---
-- prop_index = index.Property()
-- prop_index.dimension = self.nDim
-- SolidSpatialTree = index.Index(properties=prop_index)
--
-+ prop_index = index.Property()
-+ prop_index.dimension = self.nDim
-+ SolidSpatialTree = index.Index(properties=prop_index)
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for jVertex in range(nSolidNodes):
- posX = solidInterfaceBuffRcv_X[jVertex]
- posY = solidInterfaceBuffRcv_Y[jVertex]
- posZ = solidInterfaceBuffRcv_Z[jVertex]
-- if self.nDim == 2 :
-- SolidSpatialTree.add(jVertex, (posX, posY))
-- else :
-- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-+ if self.nDim == 2 :
-+ SolidSpatialTree.add(jVertex, (posX, posY))
-+ else :
-+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-
- for iVertexSolid in range(self.nLocalSolidInterfaceNodes):
- posX = self.localSolidInterface_array_X[iVertexSolid]
-@@ -915,20 +915,20 @@
- myid = 0
-
- # --- Instantiate the spatial indexing ---
-- prop_index = index.Property()
-- prop_index.dimension = self.nDim
-- SolidSpatialTree = index.Index(properties=prop_index)
--
-+ prop_index = index.Property()
-+ prop_index.dimension = self.nDim
-+ SolidSpatialTree = index.Index(properties=prop_index)
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for jVertex in range(nSolidNodes):
- posX = solidInterfaceBuffRcv_X[jVertex]
- posY = solidInterfaceBuffRcv_Y[jVertex]
- posZ = solidInterfaceBuffRcv_Z[jVertex]
-- if self.nDim == 2 :
-- SolidSpatialTree.add(jVertex, (posX, posY))
-- else :
-- SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-+ if self.nDim == 2 :
-+ SolidSpatialTree.add(jVertex, (posX, posY))
-+ else :
-+ SolidSpatialTree.add(jVertex, (posX, posY, posZ))
-
- for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
- posX = self.localFluidInterface_array_X_init[iVertexFluid]
-@@ -965,7 +965,7 @@
- myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for iVertexSolid in range(self.nLocalSolidInterfaceNodes):
-@@ -999,7 +999,7 @@
- myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- nSolidNodes = solidInterfaceBuffRcv_X.shape[0]
-
- for iVertexFluid in range(self.nLocalFluidInterfacePhysicalNodes):
-@@ -1031,7 +1031,7 @@
- """
- phi = 0.0
- eps = distance/rad
--
-+
- if eps < 1:
- phi = ((1.0-eps)**4)*(4.0*eps+1.0)
- else:
-@@ -1044,20 +1044,20 @@
- Description
- """
- phi = 0.0
--
-+
- if distance > 0.0:
- phi = (distance**2)*np.log10(distance)
- else:
- phi = 0.0
-
-- return phi
-+ return phi
-
-
- def interpolateSolidPositionOnFluidMesh(self, FSI_config):
-- """
-- Applies the one-to-one mapping or the interpolaiton rules from solid to fluid mesh.
-- """
-- if self.have_MPI == True:
-+ """
-+ Applies the one-to-one mapping or the interpolaiton rules from solid to fluid mesh.
-+ """
-+ if self.have_MPI == True:
- myid = self.comm.Get_rank()
- MPIsize = self.comm.Get_size()
- else:
-@@ -1110,12 +1110,12 @@
- del gamma_array_DispY
- del gamma_array_DispZ
- del KSP_solver
-- else:
-+ else:
- self.MappingMatrix.mult(self.solidInterface_array_DispX, self.fluidInterface_array_DispX)
- self.MappingMatrix.mult(self.solidInterface_array_DispY, self.fluidInterface_array_DispY)
- self.MappingMatrix.mult(self.solidInterface_array_DispZ, self.fluidInterface_array_DispZ)
-
-- # --- Checking conservation ---
-+ # --- Checking conservation ---
- WSX = self.solidLoads_array_X.dot(self.solidInterface_array_DispX)
- WSY = self.solidLoads_array_Y.dot(self.solidInterface_array_DispY)
- WSZ = self.solidLoads_array_Z.dot(self.solidInterface_array_DispZ)
-@@ -1124,11 +1124,11 @@
- WFY = self.fluidLoads_array_Y.dot(self.fluidInterface_array_DispY)
- WFZ = self.fluidLoads_array_Z.dot(self.fluidInterface_array_DispZ)
-
-- self.MPIPrint("Checking f/s interface conservation...")
-- self.MPIPrint('Solid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WSX, WSY, WSZ))
-- self.MPIPrint('Fluid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WFX, WFY, WFZ))
-+ self.MPIPrint("Checking f/s interface conservation...")
-+ self.MPIPrint('Solid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WSX, WSY, WSZ))
-+ self.MPIPrint('Fluid side (Wx, Wy, Wz) = ({}, {}, {})'.format(WFX, WFY, WFZ))
-+
-
--
- # --- Redistribute the interpolated fluid interface according to the partitions that own the fluid interface ---
- # Gather the fluid interface on the master process
- if self.have_MPI == True:
-@@ -1156,7 +1156,7 @@
- displ = tuple(displ)
-
- del sendBuffNumber, rcvBuffNumber
--
-+
- #print("DEBUG MESSAGE From proc {}, counts = {}".format(myid, counts))
- #print("DEBUG MESSAGE From proc {}, displ = {}".format(myid, displ))
-
-@@ -1213,18 +1213,18 @@
- del sendBuff
-
- def interpolateFluidLoadsOnSolidMesh(self, FSI_config):
-- """
-- Applies the one-to-one mapping or the interpolaiton rules from fluid to solid mesh.
-- """
-- if self.have_MPI == True:
-+ """
-+ Applies the one-to-one mapping or the interpolaiton rules from fluid to solid mesh.
-+ """
-+ if self.have_MPI == True:
- myid = self.comm.Get_rank()
- MPIsize = self.comm.Get_size()
- else:
- myid = 0
- MPIsize = 1
--
-+
- # --- Interpolate (or map) in parallel the fluid interface loads on the solid interface ---
-- #self.MappingMatrix.transpose()
-+ #self.MappingMatrix.transpose()
- if FSI_config['MATCHING_MESH'] == 'NO' and (FSI_config['MESH_INTERP_METHOD'] == 'RBF' or FSI_config['MESH_INTERP_METHOD'] == 'TPS'):
- if self.have_MPI == True:
- gamma_array_LoadX = PETSc.Vec().create(self.comm)
-@@ -1280,10 +1280,10 @@
- self.solidLoads_array_X_recon = None
- self.solidLoads_array_Y_recon = None
- self.solidLoads_array_Z_recon = None
-- if myid == self.rootProcess:
-- self.solidLoads_array_X_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-- self.solidLoads_array_Y_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-- self.solidLoads_array_Z_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-+ if myid == self.rootProcess:
-+ self.solidLoads_array_X_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-+ self.solidLoads_array_Y_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
-+ self.solidLoads_array_Z_recon = np.zeros(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- myNumberOfNodes = self.solidLoads_array_X.getArray().shape[0]
- sendBuffNumber = np.array([myNumberOfNodes], dtype=int)
- rcvBuffNumber = np.zeros(MPIsize, dtype=int)
-@@ -1293,9 +1293,9 @@
- displ = np.zeros(MPIsize, dtype=int)
- for ii in range(rcvBuffNumber.shape[0]):
- displ[ii] = rcvBuffNumber[0:ii].sum()
-- displ = tuple(displ)
-+ displ = tuple(displ)
-
-- del sendBuffNumber, rcvBuffNumber
-+ del sendBuffNumber, rcvBuffNumber
-
- self.comm.Gatherv(self.solidLoads_array_X.getArray(), [self.solidLoads_array_X_recon, counts, displ, self.MPI.DOUBLE], root=self.rootProcess)
- self.comm.Gatherv(self.solidLoads_array_Y.getArray(), [self.solidLoads_array_Y_recon, counts, displ, self.MPI.DOUBLE], root=self.rootProcess)
-@@ -1336,25 +1336,25 @@
-
-
- '''def getSolidInterfacePosition(self, SolidSolver):
-- """
-- Gets the current solid interface position from the solid solver.
-- """
-+ """
-+ Gets the current solid interface position from the solid solver.
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- # --- Get the solid interface position from the solid solver and directly fill the corresponding PETSc vector ---
- GlobalIndex = int()
- localIndex = 0
-- for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ for iVertex in range(self.nLocalSolidInterfaceNodes):
- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.SolidHaloNodeList[myid].keys():
- pass
- else:
-- newPosx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
-- newPosy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
-- newPosz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
-+ newPosx = SolidSolver.getInterfaceNodePosX(self.solidInterfaceIdentifier, iVertex)
-+ newPosy = SolidSolver.getInterfaceNodePosY(self.solidInterfaceIdentifier, iVertex)
-+ newPosz = SolidSolver.getInterfaceNodePosZ(self.solidInterfaceIdentifier, iVertex)
- iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
- self.solidInterface_array_X.setValues([iGlobalVertex],newPosx)
- self.solidInterface_array_Y.setValues([iGlobalVertex],newPosy)
-@@ -1375,25 +1375,25 @@
- #print("DEBUG MESSAGE From PROC {} : array_X = {}".format(myid, self.solidInterface_array_X.getArray()))'''
-
- def getSolidInterfaceDisplacement(self, SolidSolver):
-- """
-- Gets the current solid interface position from the solid solver.
-- """
-+ """
-+ Gets the current solid interface position from the solid solver.
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- # --- Get the solid interface position from the solid solver and directly fill the corresponding PETSc vector ---
- GlobalIndex = int()
- localIndex = 0
-- for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ for iVertex in range(self.nLocalSolidInterfaceNodes):
- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.SolidHaloNodeList[myid].keys():
- pass
- else:
-- newDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
-- newDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
-- newDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
-+ newDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
-+ newDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
-+ newDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
- iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
- self.solidInterface_array_DispX.setValues([iGlobalVertex],newDispx)
- self.solidInterface_array_DispY.setValues([iGlobalVertex],newDispy)
-@@ -1408,9 +1408,9 @@
- self.solidInterface_array_DispZ.assemblyEnd()
-
- def getFluidInterfaceNodalForce(self, FSI_config, FluidSolver):
-- """
-- Gets the fluid interface loads from the fluid solver.
-- """
-+ """
-+ Gets the fluid interface loads from the fluid solver.
-+ """
- if self.have_MPI == True:
- myid = self.comm.Get_rank()
- else:
-@@ -1422,17 +1422,17 @@
- FZ = 0.0
-
- # --- Get the fluid interface loads from the fluid solver and directly fill the corresponding PETSc vector ---
-- for iVertex in range(self.nLocalFluidInterfaceNodes):
-- halo = FluidSolver.ComputeVertexForces(self.fluidInterfaceIdentifier, iVertex) # !!we have to ignore halo node coming from mesh partitioning because they introduice non-physical forces
-- if halo==False:
-- if FSI_config['CSD_SOLVER'] == 'GETDP':
-- newFx = FluidSolver.GetVertexForceDensityX(self.fluidInterfaceIdentifier, iVertex)
-- newFy = FluidSolver.GetVertexForceDensityY(self.fluidInterfaceIdentifier, iVertex)
-- newFz = FluidSolver.GetVertexForceDensityZ(self.fluidInterfaceIdentifier, iVertex)
-- else:
-- newFx = FluidSolver.GetVertexForceX(self.fluidInterfaceIdentifier, iVertex)
-- newFy = FluidSolver.GetVertexForceY(self.fluidInterfaceIdentifier, iVertex)
-- newFz = FluidSolver.GetVertexForceZ(self.fluidInterfaceIdentifier, iVertex)
-+ for iVertex in range(self.nLocalFluidInterfaceNodes):
-+ halo = FluidSolver.ComputeVertexForces(self.fluidInterfaceIdentifier, iVertex) # !!we have to ignore halo node coming from mesh partitioning because they introduice non-physical forces
-+ if halo==False:
-+ if FSI_config['CSD_SOLVER'] == 'GETDP':
-+ newFx = FluidSolver.GetVertexForceDensityX(self.fluidInterfaceIdentifier, iVertex)
-+ newFy = FluidSolver.GetVertexForceDensityY(self.fluidInterfaceIdentifier, iVertex)
-+ newFz = FluidSolver.GetVertexForceDensityZ(self.fluidInterfaceIdentifier, iVertex)
-+ else:
-+ newFx = FluidSolver.GetVertexForceX(self.fluidInterfaceIdentifier, iVertex)
-+ newFy = FluidSolver.GetVertexForceY(self.fluidInterfaceIdentifier, iVertex)
-+ newFz = FluidSolver.GetVertexForceZ(self.fluidInterfaceIdentifier, iVertex)
- iGlobalVertex = self.__getGlobalIndex('fluid', myid, localIndex)
- self.fluidLoads_array_X.setValues([iGlobalVertex], newFx)
- self.fluidLoads_array_Y.setValues([iGlobalVertex], newFy)
-@@ -1457,22 +1457,22 @@
- FX_b = self.fluidLoads_array_X.sum()
- FY_b = self.fluidLoads_array_Y.sum()
- FZ_b = self.fluidLoads_array_Z.sum()
--
-+
-
- def setFluidInterfaceVarCoord(self, FluidSolver):
-- """
-- Communicate the change of coordinates of the fluid interface to the fluid solver.
-- Prepare the fluid solver for mesh deformation.
-- """
-+ """
-+ Communicate the change of coordinates of the fluid interface to the fluid solver.
-+ Prepare the fluid solver for mesh deformation.
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- # --- Send the new fluid interface position to the fluid solver (on each partition, halo nodes included) ---
- localIndex = 0
-- for iVertex in range(self.nLocalFluidInterfaceNodes):
-- GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
-+ for iVertex in range(self.nLocalFluidInterfaceNodes):
-+ GlobalIndex = FluidSolver.GetVertexGlobalIndex(self.fluidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.FluidHaloNodeList[myid].keys():
- posX0, posY0, posZ0 = self.haloNodesPositionsInit[GlobalIndex]
- DispX, DispY, DispZ = self.haloNodesDisplacements[GlobalIndex]
-@@ -1491,32 +1491,32 @@
- FluidSolver.SetVertexCoordZ(self.fluidInterfaceIdentifier, iVertex, posZ)
- localIndex += 1
- # Prepares the mesh deformation in the fluid solver
-- nodalVarCoordNorm = FluidSolver.SetVertexVarCoord(self.fluidInterfaceIdentifier, iVertex)
-+ nodalVarCoordNorm = FluidSolver.SetVertexVarCoord(self.fluidInterfaceIdentifier, iVertex)
-+
-
--
- def setSolidInterfaceLoads(self, SolidSolver, FSI_config, time):
-- """
-- Communicates the new solid interface loads to the solid solver.
-- In case of rigid body motion, calculates the new resultant forces (lift, drag, ...).
-- """
-+ """
-+ Communicates the new solid interface loads to the solid solver.
-+ In case of rigid body motion, calculates the new resultant forces (lift, drag, ...).
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
-
-- FY = 0.0 # solid-side resultant forces
-+ FY = 0.0 # solid-side resultant forces
- FX = 0.0
- FZ = 0.0
-- FFX = 0.0 # fluid-side resultant forces
-- FFY = 0.0
-- FFZ = 0.0
-+ FFX = 0.0 # fluid-side resultant forces
-+ FFY = 0.0
-+ FFZ = 0.0
-
- # --- Check for total force conservation after interpolation
- FFX = self.fluidLoads_array_X.sum()
- FFY = self.fluidLoads_array_Y.sum()
- FFZ = self.fluidLoads_array_Z.sum()
-
--
-+
- for iVertex in range(self.nLocalSolidInterfaceNodes):
- FX += self.localSolidLoads_array_X[iVertex]
- FY += self.localSolidLoads_array_Y[iVertex]
-@@ -1527,9 +1527,9 @@
- FY = self.comm.allreduce(FY)
- FZ = self.comm.allreduce(FZ)
-
-- self.MPIPrint("Checking f/s interface total force...")
-- self.MPIPrint('Solid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FX, FY, FZ))
-- self.MPIPrint('Fluid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FFX, FFY, FFZ))
-+ self.MPIPrint("Checking f/s interface total force...")
-+ self.MPIPrint('Solid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FX, FY, FZ))
-+ self.MPIPrint('Fluid side (Fx, Fy, Fz) = ({}, {}, {})'.format(FFX, FFY, FFZ))
-
- # --- Send the new solid interface loads to the solid solver (on each partition, halo nodes included) ---
- GlobalIndex = int()
-@@ -1541,25 +1541,25 @@
- pass
- else:
- Fx = self.localSolidLoads_array_X[localIndex]
-- Fy = self.localSolidLoads_array_Y[localIndex]
-- Fz = self.localSolidLoads_array_Z[localIndex]
-+ Fy = self.localSolidLoads_array_Y[localIndex]
-+ Fz = self.localSolidLoads_array_Z[localIndex]
- SolidSolver.applyload(iVertex, Fx, Fy, Fz, time)
- localIndex += 1
-- if FSI_config['CSD_SOLVER'] == 'NATIVE':
-+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
- SolidSolver.setGeneralisedForce()
-- SolidSolver.setGeneralisedMoment()
-+ SolidSolver.setGeneralisedMoment()
-
- def computeSolidInterfaceResidual(self, SolidSolver):
-- """
-- Computes the solid interface FSI displacement residual.
-- """
-+ """
-+ Computes the solid interface FSI displacement residual.
-+ """
-
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
-
-- normInterfaceResidualSquare = 0.0
-+ normInterfaceResidualSquare = 0.0
-
- # --- Create and fill the PETSc vector for the predicted solid interface position (predicted by the solid computation) ---
- if self.have_MPI == True:
-@@ -1575,27 +1575,27 @@
- predDisp_array_Y = PETSc.Vec().create()
- predDisp_array_Y.setType('seq')
- predDisp_array_Z = PETSc.Vec().create()
-- predDisp_array_Z.setType('seq')
-+ predDisp_array_Z.setType('seq')
- predDisp_array_X.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- predDisp_array_Y.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
- predDisp_array_Z.setSizes(self.nSolidInterfacePhysicalNodes+self.d_RBF)
--
-- if myid in self.solidSolverProcessors:
-- for iVertex in range(self.nLocalSolidInterfaceNodes):
-- predDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
-- predDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
-- predDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
-+
-+ if myid in self.solidSolverProcessors:
-+ for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ predDispx = SolidSolver.getInterfaceNodeDispX(self.solidInterfaceIdentifier, iVertex)
-+ predDispy = SolidSolver.getInterfaceNodeDispY(self.solidInterfaceIdentifier, iVertex)
-+ predDispz = SolidSolver.getInterfaceNodeDispZ(self.solidInterfaceIdentifier, iVertex)
- iGlobalVertex = self.__getGlobalIndex('solid', myid, iVertex)
- predDisp_array_X.setValues([iGlobalVertex], predDispx)
- predDisp_array_Y.setValues([iGlobalVertex], predDispy)
- predDisp_array_Z.setValues([iGlobalVertex], predDispz)
--
-- predDisp_array_X.assemblyBegin()
-- predDisp_array_X.assemblyEnd()
-- predDisp_array_Y.assemblyBegin()
-- predDisp_array_Y.assemblyEnd()
-- predDisp_array_Z.assemblyBegin()
-- predDisp_array_Z.assemblyEnd()
-+
-+ predDisp_array_X.assemblyBegin()
-+ predDisp_array_X.assemblyEnd()
-+ predDisp_array_Y.assemblyBegin()
-+ predDisp_array_Y.assemblyEnd()
-+ predDisp_array_Z.assemblyBegin()
-+ predDisp_array_Z.assemblyEnd()
-
- # --- Calculate the residual (vector and norm) ---
- self.solidInterfaceResidual_array_X = predDisp_array_X - self.solidInterface_array_DispX
-@@ -1615,45 +1615,45 @@
- del predDisp_array_Y
- del predDisp_array_Z
-
-- return sqrt(normInterfaceResidualSquare)
-+ return sqrt(normInterfaceResidualSquare)
-
- def relaxSolidPosition(self,FSI_config):
-- """
-- Apply solid displacement under-relaxation.
-- """
-+ """
-+ Apply solid displacement under-relaxation.
-+ """
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
-
- # --- Set the Aitken coefficient for the relaxation ---
-- if FSI_config['AITKEN_RELAX'] == 'STATIC':
-- self.aitkenParam = FSI_config['AITKEN_PARAM']
-- elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
-- self.setAitkenCoefficient(FSI_config)
-- else:
-- self.aitkenParam = 1.0
-+ if FSI_config['AITKEN_RELAX'] == 'STATIC':
-+ self.aitkenParam = FSI_config['AITKEN_PARAM']
-+ elif FSI_config['AITKEN_RELAX'] == 'DYNAMIC':
-+ self.setAitkenCoefficient(FSI_config)
-+ else:
-+ self.aitkenParam = 1.0
-
-- self.MPIPrint('Aitken under-relaxation step with parameter {}'.format(self.aitkenParam))
-+ self.MPIPrint('Aitken under-relaxation step with parameter {}'.format(self.aitkenParam))
-
- # --- Relax the solid interface position ---
- self.solidInterface_array_DispX += self.aitkenParam*self.solidInterfaceResidual_array_X
- self.solidInterface_array_DispY += self.aitkenParam*self.solidInterfaceResidual_array_Y
- self.solidInterface_array_DispZ += self.aitkenParam*self.solidInterfaceResidual_array_Z
--
-+
-
- def setAitkenCoefficient(self, FSI_config):
-- """
-- Computes the Aitken coefficients for solid displacement under-relaxation.
-- """
--
-- deltaResNormSquare = 0.0
-- prodScalRes = 0.0
--
-+ """
-+ Computes the Aitken coefficients for solid displacement under-relaxation.
-+ """
-+
-+ deltaResNormSquare = 0.0
-+ prodScalRes = 0.0
-+
- # --- Create the PETSc vector for the difference between the residuals (current and previous FSI iter) ---
-- if self.FSIIter == 0:
-- self.aitkenParam = max(FSI_config['AITKEN_PARAM'], self.aitkenParam)
-- else:
-+ if self.FSIIter == 0:
-+ self.aitkenParam = max(FSI_config['AITKEN_PARAM'], self.aitkenParam)
-+ else:
- if self.have_MPI:
- deltaResx_array_X = PETSc.Vec().create(self.comm)
- deltaResx_array_X.setType('mpi')
-@@ -1688,9 +1688,9 @@
- deltaResNormSquare_X = (deltaResx_array_X.norm())**2
- deltaResNormSquare_Y = (deltaResx_array_Y.norm())**2
- deltaResNormSquare_Z = (deltaResx_array_Z.norm())**2
-- deltaResNormSquare = deltaResNormSquare_X + deltaResNormSquare_Y + deltaResNormSquare_Z
-+ deltaResNormSquare = deltaResNormSquare_X + deltaResNormSquare_Y + deltaResNormSquare_Z
-
-- self.aitkenParam *= -prodScalRes/deltaResNormSquare
-+ self.aitkenParam *= -prodScalRes/deltaResNormSquare
-
- deltaResx_array_X.destroy()
- deltaResx_array_Y.destroy()
-@@ -1708,27 +1708,27 @@
- self.solidInterfaceResidual_array_Z.copy(self.solidInterfaceResidualnM1_array_Z)
-
- def displacementPredictor(self, FSI_config , SolidSolver, deltaT):
-- """
-- Calculates a prediciton for the solid interface position for the next time step.
-- """
-+ """
-+ Calculates a prediciton for the solid interface position for the next time step.
-+ """
-
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-+ myid = self.comm.Get_rank()
- else:
- myid = 0
-
-- if FSI_config['DISP_PRED'] == 'FIRST_ORDER':
-- self.MPIPrint("First order predictor")
-- alpha_0 = 1.0
-- alpha_1 = 0.0
-- elif FSI_config['DISP_PRED'] == 'SECOND_ORDER':
-- self.MPIPrint("Second order predictor")
-- alpha_0 = 1.0
-- alpha_1 = 0.5
-- else:
-- self.MPIPrint("No predictor")
-- alpha_0 = 0.0
-- alpha_1 = 0.0
-+ if FSI_config['DISP_PRED'] == 'FIRST_ORDER':
-+ self.MPIPrint("First order predictor")
-+ alpha_0 = 1.0
-+ alpha_1 = 0.0
-+ elif FSI_config['DISP_PRED'] == 'SECOND_ORDER':
-+ self.MPIPrint("Second order predictor")
-+ alpha_0 = 1.0
-+ alpha_1 = 0.5
-+ else:
-+ self.MPIPrint("No predictor")
-+ alpha_0 = 0.0
-+ alpha_1 = 0.0
-
- # --- Create the PETSc vectors to store the solid interface velocity ---
- if self.have_MPI == True:
-@@ -1774,18 +1774,18 @@
- # --- Fill the PETSc vectors ---
- GlobalIndex = int()
- localIndex = 0
-- for iVertex in range(self.nLocalSolidInterfaceNodes):
-- GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
-+ for iVertex in range(self.nLocalSolidInterfaceNodes):
-+ GlobalIndex = SolidSolver.getInterfaceNodeGlobalIndex(self.solidInterfaceIdentifier, iVertex)
- if GlobalIndex in self.SolidHaloNodeList[myid].keys():
- pass
- else:
- iGlobalVertex = self.__getGlobalIndex('solid', myid, localIndex)
-- velx = SolidSolver.getInterfaceNodeVelX(self.solidInterfaceIdentifier, iVertex)
-- vely = SolidSolver.getInterfaceNodeVelY(self.solidInterfaceIdentifier, iVertex)
-- velz = SolidSolver.getInterfaceNodeVelZ(self.solidInterfaceIdentifier, iVertex)
-- velxNm1 = SolidSolver.getInterfaceNodeVelXNm1(self.solidInterfaceIdentifier, iVertex)
-- velyNm1 = SolidSolver.getInterfaceNodeVelYNm1(self.solidInterfaceIdentifier, iVertex)
-- velzNm1 = SolidSolver.getInterfaceNodeVelZNm1(self.solidInterfaceIdentifier, iVertex)
-+ velx = SolidSolver.getInterfaceNodeVelX(self.solidInterfaceIdentifier, iVertex)
-+ vely = SolidSolver.getInterfaceNodeVelY(self.solidInterfaceIdentifier, iVertex)
-+ velz = SolidSolver.getInterfaceNodeVelZ(self.solidInterfaceIdentifier, iVertex)
-+ velxNm1 = SolidSolver.getInterfaceNodeVelXNm1(self.solidInterfaceIdentifier, iVertex)
-+ velyNm1 = SolidSolver.getInterfaceNodeVelYNm1(self.solidInterfaceIdentifier, iVertex)
-+ velzNm1 = SolidSolver.getInterfaceNodeVelZNm1(self.solidInterfaceIdentifier, iVertex)
- Vel_array_X.setValues([iGlobalVertex],velx)
- Vel_array_Y.setValues([iGlobalVertex],vely)
- Vel_array_Z.setValues([iGlobalVertex],velz)
-@@ -1822,27 +1822,27 @@
- del VelnM1_array_X, VelnM1_array_Y, VelnM1_array_Z
-
- def writeFSIHistory(self, TimeIter, time, varCoordNorm, FSIConv):
-- """
-- Write the FSI history file of the computaion.
-- """
-+ """
-+ Write the FSI history file of the computaion.
-+ """
-
- if self.have_MPI == True:
- myid = self.comm.Get_rank()
- else:
- myid = 0
--
-+
- if myid == self.rootProcess:
-- if self.unsteady:
-- if TimeIter == 0:
-- histFile = open('FSIhistory.dat', "w")
-+ if self.unsteady:
-+ if TimeIter == 0:
-+ histFile = open('FSIhistory.dat', "w")
- histFile.write("TimeIter\tTime\tFSIRes\tFSINbIter\n")
-- else:
-- histFile = open('FSIhistory.dat', "a")
-- if FSIConv:
-- histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter+1) + '\n')
-- else:
-- histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter) + '\n')
-- histFile.close()
-+ else:
-+ histFile = open('FSIhistory.dat', "a")
-+ if FSIConv:
-+ histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter+1) + '\n')
-+ else:
-+ histFile.write(str(TimeIter) + '\t' + str(time) + '\t' + str(varCoordNorm) + '\t' + str(self.FSIIter) + '\n')
-+ histFile.close()
- else:
- if self.FSIIter == 0:
- histFile = open('FSIhistory.dat', "w")
-@@ -1851,7 +1851,7 @@
- histFile = open('FSIhistory.dat', "a")
- histFile.write(str(self.FSIIter) + '\t' + str(varCoordNorm) + '\n')
- histFile.close()
--
-+
-
- self.MPIBarrier()
-
-@@ -1868,254 +1868,254 @@
- globalIndex = globalStartIndex + iLocalVertex
-
- return globalIndex
--
-+
-
- def UnsteadyFSI(self,FSI_config, FluidSolver, SolidSolver):
-- """
-- Run the unsteady FSI computation by synchronizing the fluid and solid solvers.
-- F/s interface data are exchanged through interface mapping and interpolation (if non mathcing meshes).
-- """
-+ """
-+ Run the unsteady FSI computation by synchronizing the fluid and solid solvers.
-+ F/s interface data are exchanged through interface mapping and interpolation (if non mathcing meshes).
-+ """
-
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-- numberPart = self.comm.Get_size()
-+ myid = self.comm.Get_rank()
-+ numberPart = self.comm.Get_size()
- else:
- myid = 0
- numberPart = 1
-
-- # --- Set some general variables for the unsteady computation --- #
-- deltaT = FSI_config['UNST_TIMESTEP'] # physical time step
-- totTime = FSI_config['UNST_TIME'] # physical simulation time
-- NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
-- FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
-- TimeIterTreshold = 0 # time iteration from which we allow the solid to deform
--
-- if FSI_config['RESTART_SOL'] == 'YES':
-- startTime = FSI_config['START_TIME']
-- NbTimeIter = ((totTime)/deltaT)-1
-- time = startTime
-- TimeIter = FSI_config['RESTART_ITER']
-- else:
-- NbTimeIter = (totTime/deltaT)-1 # number of time iterations
-- time = 0.0 # initial time
-- TimeIter = 0 # initial time iteration
--
-- NbTimeIter = int(NbTimeIter) # be sure that NbTimeIter is an integer
--
-- varCoordNorm = 0.0 # FSI residual
-- FSIConv = False # FSI convergence flag
--
-- self.MPIPrint('\n**********************************')
-- self.MPIPrint('* Begin unsteady FSI computation *')
-- self.MPIPrint('**********************************\n')
--
-- # --- Initialize the coupled solution --- #
-- #If restart (DOES NOT WORK YET)
-- if FSI_config['RESTART_SOL'] == 'YES':
-- TimeIterTreshold = -1
-- FluidSolver.setTemporalIteration(TimeIter)
-- if myid == self.rootProcess:
-- SolidSolver.outputDisplacements(FluidSolver.getInterRigidDispArray(), True)
-+ # --- Set some general variables for the unsteady computation --- #
-+ deltaT = FSI_config['UNST_TIMESTEP'] # physical time step
-+ totTime = FSI_config['UNST_TIME'] # physical simulation time
-+ NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
-+ FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
-+ TimeIterTreshold = 0 # time iteration from which we allow the solid to deform
-+
-+ if FSI_config['RESTART_SOL'] == 'YES':
-+ startTime = FSI_config['START_TIME']
-+ NbTimeIter = ((totTime)/deltaT)-1
-+ time = startTime
-+ TimeIter = FSI_config['RESTART_ITER']
-+ else:
-+ NbTimeIter = (totTime/deltaT)-1 # number of time iterations
-+ time = 0.0 # initial time
-+ TimeIter = 0 # initial time iteration
-+
-+ NbTimeIter = int(NbTimeIter) # be sure that NbTimeIter is an integer
-+
-+ varCoordNorm = 0.0 # FSI residual
-+ FSIConv = False # FSI convergence flag
-+
-+ self.MPIPrint('\n**********************************')
-+ self.MPIPrint('* Begin unsteady FSI computation *')
-+ self.MPIPrint('**********************************\n')
-+
-+ # --- Initialize the coupled solution --- #
-+ #If restart (DOES NOT WORK YET)
-+ if FSI_config['RESTART_SOL'] == 'YES':
-+ TimeIterTreshold = -1
-+ FluidSolver.setTemporalIteration(TimeIter)
-+ if myid == self.rootProcess:
-+ SolidSolver.outputDisplacements(FluidSolver.getInterRigidDispArray(), True)
-+ if self.have_MPI == True:
-+ self.comm.barrier()
-+ FluidSolver.setInitialMesh(True)
-+ if myid == self.rootProcess:
-+ SolidSolver.displacementPredictor(FluidSolver.getInterRigidDispArray())
- if self.have_MPI == True:
-- self.comm.barrier()
-- FluidSolver.setInitialMesh(True)
-- if myid == self.rootProcess:
-- SolidSolver.displacementPredictor(FluidSolver.getInterRigidDispArray())
-- if self.have_MPI == True:
-- self.comm.barrier()
-- if myid == self.rootProcess:
-- SolidSolver.updateSolution()
-- #If no restart
-- else:
-- self.MPIPrint('Setting FSI initial conditions')
-+ self.comm.barrier()
-+ if myid == self.rootProcess:
-+ SolidSolver.updateSolution()
-+ #If no restart
-+ else:
-+ self.MPIPrint('Setting FSI initial conditions')
- if myid in self.solidSolverProcessors:
-- SolidSolver.setInitialDisplacements()
-+ SolidSolver.setInitialDisplacements()
- self.getSolidInterfaceDisplacement(SolidSolver)
-- self.interpolateSolidPositionOnFluidMesh(FSI_config)
-- self.setFluidInterfaceVarCoord(FluidSolver)
-- FluidSolver.SetInitialMesh() # if there is an initial deformation in the solid, it has to be communicated to the fluid solver
-- self.MPIPrint('\nFSI initial conditions are set')
-- self.MPIPrint('Beginning time integration\n')
--
-- # --- External temporal loop --- #
-- while TimeIter <= NbTimeIter:
--
-- if TimeIter > TimeIterTreshold:
-- NbFSIIter = NbFSIIterMax
-- self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI on time iteration {} ***************'.format(TimeIter))
-- else:
-- NbFSIIter = 1
--
-- self.FSIIter = 0
-- FSIConv = False
-- FluidSolver.PreprocessExtIter(TimeIter) # set some parameters before temporal fluid iteration
--
-- # --- Internal FSI loop --- #
-- while self.FSIIter <= (NbFSIIter-1):
-+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
-+ self.setFluidInterfaceVarCoord(FluidSolver)
-+ FluidSolver.SetInitialMesh() # if there is an initial deformation in the solid, it has to be communicated to the fluid solver
-+ self.MPIPrint('\nFSI initial conditions are set')
-+ self.MPIPrint('Beginning time integration\n')
-+
-+ # --- External temporal loop --- #
-+ while TimeIter <= NbTimeIter:
-+
-+ if TimeIter > TimeIterTreshold:
-+ NbFSIIter = NbFSIIterMax
-+ self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI on time iteration {} ***************'.format(TimeIter))
-+ else:
-+ NbFSIIter = 1
-+
-+ self.FSIIter = 0
-+ FSIConv = False
-+ FluidSolver.PreprocessExtIter(TimeIter) # set some parameters before temporal fluid iteration
-
-- self.MPIPrint("\n>>>> Time iteration {} / FSI iteration {} <<<<".format(TimeIter,self.FSIIter))
-+ # --- Internal FSI loop --- #
-+ while self.FSIIter <= (NbFSIIter-1):
-
-- # --- Mesh morphing step (displacements interpolation, displacements communication, and mesh morpher call) --- #
-- self.interpolateSolidPositionOnFluidMesh(FSI_config)
-+ self.MPIPrint("\n>>>> Time iteration {} / FSI iteration {} <<<<".format(TimeIter,self.FSIIter))
-+
-+ # --- Mesh morphing step (displacements interpolation, displacements communication, and mesh morpher call) --- #
-+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
- self.MPIPrint('\nPerforming dynamic mesh deformation (ALE)...\n')
- self.setFluidInterfaceVarCoord(FluidSolver)
- FluidSolver.DynamicMeshUpdate(TimeIter)
--
-- # --- Fluid solver call for FSI subiteration --- #
-- self.MPIPrint('\nLaunching fluid solver for one single dual-time iteration...')
-+
-+ # --- Fluid solver call for FSI subiteration --- #
-+ self.MPIPrint('\nLaunching fluid solver for one single dual-time iteration...')
- self.MPIBarrier()
-- FluidSolver.ResetConvergence()
-- FluidSolver.Run()
-+ FluidSolver.ResetConvergence()
-+ FluidSolver.Run()
- self.MPIBarrier()
-
-- # --- Surface fluid loads interpolation and communication --- #
-- self.MPIPrint('\nProcessing interface fluid loads...\n')
-+ # --- Surface fluid loads interpolation and communication --- #
-+ self.MPIPrint('\nProcessing interface fluid loads...\n')
- self.MPIBarrier()
-- self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
-+ self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
- self.MPIBarrier()
-- if TimeIter > TimeIterTreshold:
-- self.interpolateFluidLoadsOnSolidMesh(FSI_config)
-- self.setSolidInterfaceLoads(SolidSolver, FSI_config, time)
-+ if TimeIter > TimeIterTreshold:
-+ self.interpolateFluidLoadsOnSolidMesh(FSI_config)
-+ self.setSolidInterfaceLoads(SolidSolver, FSI_config, time)
-
-- # --- Solid solver call for FSI subiteration --- #
-- self.MPIPrint('\nLaunching solid solver for a single time iteration...\n')
-+ # --- Solid solver call for FSI subiteration --- #
-+ self.MPIPrint('\nLaunching solid solver for a single time iteration...\n')
- if myid in self.solidSolverProcessors:
-- if FSI_config['CSD_SOLVER'] == 'NATIVE':
-- SolidSolver.timeIteration(time)
-- elif FSI_config['CSD_SOLVER'] == 'METAFOR' or FSI_config['CSD_SOLVER'] == 'GETDP' or FSI_config['CSD_SOLVER'] == 'TESTER':
-- SolidSolver.run(time-deltaT, time)
--
-- # --- Compute and monitor the FSI residual --- #
-- varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
-- self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
-- if varCoordNorm < FSITolerance:
-- FSIConv = True
-- break
-+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
-+ SolidSolver.timeIteration(time)
-+ elif FSI_config['CSD_SOLVER'] == 'METAFOR' or FSI_config['CSD_SOLVER'] == 'GETDP' or FSI_config['CSD_SOLVER'] == 'TESTER':
-+ SolidSolver.run(time-deltaT, time)
-+
-+ # --- Compute and monitor the FSI residual --- #
-+ varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
-+ self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
-+ if varCoordNorm < FSITolerance:
-+ FSIConv = True
-+ break
-
-- # --- Relaxe the solid position --- #
-+ # --- Relaxe the solid position --- #
- self.MPIPrint('\nProcessing interface displacements...\n')
-- self.relaxSolidPosition(FSI_config)
--
-- self.FSIIter += 1
-- # --- End OF FSI loop --- #
-+ self.relaxSolidPosition(FSI_config)
-+
-+ self.FSIIter += 1
-+ # --- End OF FSI loop --- #
-
- self.MPIBarrier()
-
-- # --- Update the FSI history file --- #
-- if TimeIter > TimeIterTreshold:
-- self.MPIPrint('\nBGS is converged (strong coupling)')
-- self.writeFSIHistory(TimeIter, time, varCoordNorm, FSIConv)
--
-- # --- Update, monitor and output the fluid solution before the next time step ---#
-- FluidSolver.Update()
-- FluidSolver.Monitor(TimeIter)
-- FluidSolver.Output(TimeIter)
--
-- if TimeIter >= TimeIterTreshold:
-- if myid in self.solidSolverProcessors:
-- # --- Output the solid solution before thr next time step --- #
-- SolidSolver.writeSolution(time, self.FSIIter, TimeIter, NbTimeIter)
--
-- # --- Displacement predictor for the next time step and update of the solid solution --- #
-- self.MPIPrint('\nSolid displacement prediction for next time step')
-- self.displacementPredictor(FSI_config, SolidSolver, deltaT)
-+ # --- Update the FSI history file --- #
-+ if TimeIter > TimeIterTreshold:
-+ self.MPIPrint('\nBGS is converged (strong coupling)')
-+ self.writeFSIHistory(TimeIter, time, varCoordNorm, FSIConv)
-+
-+ # --- Update, monitor and output the fluid solution before the next time step ---#
-+ FluidSolver.Update()
-+ FluidSolver.Monitor(TimeIter)
-+ FluidSolver.Output(TimeIter)
-+
-+ if TimeIter >= TimeIterTreshold:
-+ if myid in self.solidSolverProcessors:
-+ # --- Output the solid solution before thr next time step --- #
-+ SolidSolver.writeSolution(time, self.FSIIter, TimeIter, NbTimeIter)
-+
-+ # --- Displacement predictor for the next time step and update of the solid solution --- #
-+ self.MPIPrint('\nSolid displacement prediction for next time step')
-+ self.displacementPredictor(FSI_config, SolidSolver, deltaT)
- if myid in self.solidSolverProcessors:
-- SolidSolver.updateSolution()
--
-- TimeIter += 1
-- time += deltaT
-- #--- End of the temporal loop --- #
-+ SolidSolver.updateSolution()
-+
-+ TimeIter += 1
-+ time += deltaT
-+ #--- End of the temporal loop --- #
-
- self.MPIBarrier()
-
-- self.MPIPrint('\n*************************')
-- self.MPIPrint('* End FSI computation *')
-- self.MPIPrint('*************************\n')
-+ self.MPIPrint('\n*************************')
-+ self.MPIPrint('* End FSI computation *')
-+ self.MPIPrint('*************************\n')
-
- def SteadyFSI(self, FSI_config,FluidSolver, SolidSolver):
-- """
-- Runs the steady FSI computation by synchronizing the fluid and solid solver with data exchange at the f/s interface.
-- """
-+ """
-+ Runs the steady FSI computation by synchronizing the fluid and solid solver with data exchange at the f/s interface.
-+ """
-
- if self.have_MPI == True:
-- myid = self.comm.Get_rank()
-- numberPart = self.comm.Get_size()
-+ myid = self.comm.Get_rank()
-+ numberPart = self.comm.Get_size()
- else:
- myid = 0
- numberPart = 1
-
-- # --- Set some general variables for the steady computation --- #
-- NbIter = FSI_config['NB_EXT_ITER'] # number of fluid iteration at each FSI step
-- NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
-- FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
-- varCoordNorm = 0.0
--
-- self.MPIPrint('\n********************************')
-- self.MPIPrint('* Begin steady FSI computation *')
-- self.MPIPrint('********************************\n')
-- self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI ***************')
-+ # --- Set some general variables for the steady computation --- #
-+ NbIter = FSI_config['NB_EXT_ITER'] # number of fluid iteration at each FSI step
-+ NbFSIIterMax = FSI_config['NB_FSI_ITER'] # maximum number of FSI iteration (for each time step)
-+ FSITolerance = FSI_config['FSI_TOLERANCE'] # f/s interface tolerance
-+ varCoordNorm = 0.0
-+
-+ self.MPIPrint('\n********************************')
-+ self.MPIPrint('* Begin steady FSI computation *')
-+ self.MPIPrint('********************************\n')
-+ self.MPIPrint('\n*************** Enter Block Gauss Seidel (BGS) method for strong coupling FSI ***************')
-
- self.getSolidInterfaceDisplacement(SolidSolver)
-
-- # --- External FSI loop --- #
-- self.FSIIter = 0
-- while self.FSIIter < NbFSIIterMax:
-- self.MPIPrint("\n>>>> FSI iteration {} <<<<".format(self.FSIIter))
-- self.MPIPrint('\nLaunching fluid solver for a steady computation...')
-- # --- Fluid solver call for FSI subiteration ---#
-- Iter = 0
-- FluidSolver.ResetConvergence()
-- while Iter < NbIter:
-- FluidSolver.PreprocessExtIter(Iter)
-- FluidSolver.Run()
-- StopIntegration = FluidSolver.Monitor(Iter)
-- FluidSolver.Output(Iter)
-- if StopIntegration:
-- break;
-- Iter += 1
--
-- # --- Surface fluid loads interpolation and communication ---#
-- self.MPIPrint('\nProcessing interface fluid loads...\n')
-+ # --- External FSI loop --- #
-+ self.FSIIter = 0
-+ while self.FSIIter < NbFSIIterMax:
-+ self.MPIPrint("\n>>>> FSI iteration {} <<<<".format(self.FSIIter))
-+ self.MPIPrint('\nLaunching fluid solver for a steady computation...')
-+ # --- Fluid solver call for FSI subiteration ---#
-+ Iter = 0
-+ FluidSolver.ResetConvergence()
-+ while Iter < NbIter:
-+ FluidSolver.PreprocessExtIter(Iter)
-+ FluidSolver.Run()
-+ StopIntegration = FluidSolver.Monitor(Iter)
-+ FluidSolver.Output(Iter)
-+ if StopIntegration:
-+ break;
-+ Iter += 1
-+
-+ # --- Surface fluid loads interpolation and communication ---#
-+ self.MPIPrint('\nProcessing interface fluid loads...\n')
- self.MPIBarrier()
-- self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
-+ self.getFluidInterfaceNodalForce(FSI_config, FluidSolver)
- self.MPIBarrier()
-- self.interpolateFluidLoadsOnSolidMesh(FSI_config)
-- self.setSolidInterfaceLoads(SolidSolver, FSI_config, 0.05)
--
-- # --- Solid solver call for FSI subiteration --- #
-- self.MPIPrint('\nLaunching solid solver for a static computation...\n')
-+ self.interpolateFluidLoadsOnSolidMesh(FSI_config)
-+ self.setSolidInterfaceLoads(SolidSolver, FSI_config, 0.05)
-+
-+ # --- Solid solver call for FSI subiteration --- #
-+ self.MPIPrint('\nLaunching solid solver for a static computation...\n')
- if myid in self.solidSolverProcessors:
-- if FSI_config['CSD_SOLVER'] == 'NATIVE':
-- SolidSolver.staticComputation()
-+ if FSI_config['CSD_SOLVER'] == 'NATIVE':
-+ SolidSolver.staticComputation()
- else:
- SolidSolver.run(0.0, 0.05)
-- SolidSolver.writeSolution(0.0, self.FSIIter, Iter, NbIter)
-+ SolidSolver.writeSolution(0.0, self.FSIIter, Iter, NbIter)
-
-- # --- Compute and monitor the FSI residual --- #
-- varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
-- self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
-+ # --- Compute and monitor the FSI residual --- #
-+ varCoordNorm = self.computeSolidInterfaceResidual(SolidSolver)
-+ self.MPIPrint('\nFSI displacement norm : {}\n'.format(varCoordNorm))
- self.writeFSIHistory(0, 0.0, varCoordNorm, False)
-- if varCoordNorm < FSITolerance:
-- break
-+ if varCoordNorm < FSITolerance:
-+ break
-
- # --- Relaxe the solid displacement and update the solid solution --- #
- self.MPIPrint('\nProcessing interface displacements...\n')
-- self.relaxSolidPosition(FSI_config)
-+ self.relaxSolidPosition(FSI_config)
- if myid in self.solidSolverProcessors:
- SolidSolver.updateSolution()
--
-- # --- Mesh morphing step (displacement interpolation, displacements communication, and mesh morpher call) --- #
-- self.interpolateSolidPositionOnFluidMesh(FSI_config)
-- self.MPIPrint('\nPerforming static mesh deformation...\n')
-- self.setFluidInterfaceVarCoord(FluidSolver)
-- FluidSolver.StaticMeshUpdate()
-- self.FSIIter += 1
-+
-+ # --- Mesh morphing step (displacement interpolation, displacements communication, and mesh morpher call) --- #
-+ self.interpolateSolidPositionOnFluidMesh(FSI_config)
-+ self.MPIPrint('\nPerforming static mesh deformation...\n')
-+ self.setFluidInterfaceVarCoord(FluidSolver)
-+ FluidSolver.StaticMeshUpdate()
-+ self.FSIIter += 1
-
- self.MPIBarrier()
-
-- self.MPIPrint('\nBGS is converged (strong coupling)')
-- self.MPIPrint(' ')
-- self.MPIPrint('*************************')
-- self.MPIPrint('* End FSI computation *')
-- self.MPIPrint('*************************')
-- self.MPIPrint(' ')
-+ self.MPIPrint('\nBGS is converged (strong coupling)')
-+ self.MPIPrint(' ')
-+ self.MPIPrint('*************************')
-+ self.MPIPrint('* End FSI computation *')
-+ self.MPIPrint('*************************')
-+ self.MPIPrint(' ')
-diff -Naur old/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py new/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py
---- old/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/FSI/PitchPlungeAirfoilStructuralTester.py 2020-05-10 16:17:07.000000000 +0300
-@@ -174,9 +174,9 @@
-
- with open(self.Config_file) as configfile:
- while 1:
-- line = configfile.readline()
-- if not line:
-- break
-+ line = configfile.readline()
-+ if not line:
-+ break
-
- # remove line returns
- line = line.strip('\r\n')
-@@ -189,41 +189,41 @@
- this_value = line[1].strip()
-
- for case in switch(this_param):
-- #integer values
-- #if case("NB_FSI_ITER") :
-- #self.Config[this_param] = int(this_value)
-- #break
--
-- #float values
-- if case("DELTA_T") : pass
-- if case("START_TIME") : pass
-- if case("STOP_TIME") : pass
-- if case("SPRING_MASS") : pass
-- if case("INERTIA_FLEXURAL") : pass
-- if case("SPRING_STIFFNESS") : pass
-- if case("SPRING_DAMPING") : pass
-- if case("TORSIONAL_STIFFNESS") : pass
-- if case("TORSIONAL_DAMPING") : pass
-- if case("CORD") : pass
-- if case("FLEXURAL_AXIS") : pass
-- if case("GRAVITY_CENTER") : pass
-- if case("INITIAL_DISP") : pass
-- if case("INITIAL_ANGLE") : pass
-- if case("RHO") :
-- self.Config[this_param] = float(this_value)
-- break
--
-- #string values
-- if case("TIME_MARCHING") : pass
-- if case("MESH_FILE") : pass
-- if case("CSD_SOLVER") : pass
-- if case("MOVING_MARKER") : pass
-- if case("STRUCT_TYPE") :
-- self.Config[this_param] = this_value
-- break
-+ #integer values
-+ #if case("NB_FSI_ITER") :
-+ #self.Config[this_param] = int(this_value)
-+ #break
-+
-+ #float values
-+ if case("DELTA_T") : pass
-+ if case("START_TIME") : pass
-+ if case("STOP_TIME") : pass
-+ if case("SPRING_MASS") : pass
-+ if case("INERTIA_FLEXURAL") : pass
-+ if case("SPRING_STIFFNESS") : pass
-+ if case("SPRING_DAMPING") : pass
-+ if case("TORSIONAL_STIFFNESS") : pass
-+ if case("TORSIONAL_DAMPING") : pass
-+ if case("CORD") : pass
-+ if case("FLEXURAL_AXIS") : pass
-+ if case("GRAVITY_CENTER") : pass
-+ if case("INITIAL_DISP") : pass
-+ if case("INITIAL_ANGLE") : pass
-+ if case("RHO") :
-+ self.Config[this_param] = float(this_value)
-+ break
-+
-+ #string values
-+ if case("TIME_MARCHING") : pass
-+ if case("MESH_FILE") : pass
-+ if case("CSD_SOLVER") : pass
-+ if case("MOVING_MARKER") : pass
-+ if case("STRUCT_TYPE") :
-+ self.Config[this_param] = this_value
-+ break
-
-- if case():
-- print(this_param + " is an invalid option !")
-+ if case():
-+ print(this_param + " is an invalid option !")
- break
-
- def __readSU2Mesh(self):
-@@ -233,78 +233,78 @@
- print('Opened mesh file ' + self.Mesh_file + '.')
- while 1:
- line = meshfile.readline()
-- if not line:
-- break
-+ if not line:
-+ break
-
-- pos = line.find('NDIM')
-- if pos != -1:
-- line = line.strip('\r\n')
-+ pos = line.find('NDIM')
-+ if pos != -1:
-+ line = line.strip('\r\n')
- line = line.split("=",1)
-- self.nDim = int(line[1])
-- continue
--
-- pos = line.find('NELEM')
-- if pos != -1:
-- line = line.strip('\r\n')
-+ self.nDim = int(line[1])
-+ continue
-+
-+ pos = line.find('NELEM')
-+ if pos != -1:
-+ line = line.strip('\r\n')
- line = line.split("=",1)
-- self.nElem = int(line[1])
-- continue
-+ self.nElem = int(line[1])
-+ continue
-
-- pos = line.find('NPOIN')
-- if pos != -1:
-- line = line.strip('\r\n')
-+ pos = line.find('NPOIN')
-+ if pos != -1:
-+ line = line.strip('\r\n')
- line = line.split("=",1)
-- self.nPoint = int(line[1])
-+ self.nPoint = int(line[1])
- for iPoint in range(self.nPoint):
-- self.node.append(Point())
-- line = meshfile.readline()
-- line = line.strip('\r\n')
-- line = line.split(' ',self.nDim)
-- x = float(line[0])
-- y = float(line[1])
-+ self.node.append(Point())
-+ line = meshfile.readline()
-+ line = line.strip('\r\n')
-+ line = line.split(' ',self.nDim)
-+ x = float(line[0])
-+ y = float(line[1])
- z = 0.0
-- if self.nDim == 3:
-- z = float(line[2])
-- self.node[iPoint].SetCoord((x,y,z))
-+ if self.nDim == 3:
-+ z = float(line[2])
-+ self.node[iPoint].SetCoord((x,y,z))
- self.node[iPoint].SetCoord0((x,y,z))
-- self.node[iPoint].SetCoord_n((x,y,z))
-- continue
-+ self.node[iPoint].SetCoord_n((x,y,z))
-+ continue
-
-- pos = line.find('NMARK')
-- if pos != -1:
-- line = line.strip('\r\n')
-+ pos = line.find('NMARK')
-+ if pos != -1:
-+ line = line.strip('\r\n')
- line = line.split("=",1)
-- self.nMarker = int(line[1])
-- continue
-+ self.nMarker = int(line[1])
-+ continue
-
-- pos = line.find('MARKER_TAG')
-- if pos != -1:
-- line = line.strip('\r\n')
-- line = line.replace(" ", "")
-+ pos = line.find('MARKER_TAG')
-+ if pos != -1:
-+ line = line.strip('\r\n')
-+ line = line.replace(" ", "")
- line = line.split("=",1)
-- markerTag = line[1]
-- if markerTag == self.FSI_marker:
-- self.markers[markerTag] = []
-- line = meshfile.readline()
-- line = line.strip('\r\n')
-- line = line.split("=",1)
-- nElem = int(line[1])
-- for iElem in range(nElem):
-- line = meshfile.readline()
-- line = line.strip('\r\n')
-- line = line.split(' ',1)
-- elemType = int(line[0])
-- if elemType == 3:
-- nodes = line[1].split(' ', 1)
-- if not int(nodes[0]) in self.markers[markerTag]:
-- self.markers[markerTag].append(int(nodes[0]))
-- if not int(nodes[1]) in self.markers[markerTag]:
-- self.markers[markerTag].append(int(nodes[1]))
-- else:
-- print("Element type {} is not recognized !!".format(elemType))
-- continue
-- else:
-- continue
-+ markerTag = line[1]
-+ if markerTag == self.FSI_marker:
-+ self.markers[markerTag] = []
-+ line = meshfile.readline()
-+ line = line.strip('\r\n')
-+ line = line.split("=",1)
-+ nElem = int(line[1])
-+ for iElem in range(nElem):
-+ line = meshfile.readline()
-+ line = line.strip('\r\n')
-+ line = line.split(' ',1)
-+ elemType = int(line[0])
-+ if elemType == 3:
-+ nodes = line[1].split(' ', 1)
-+ if not int(nodes[0]) in self.markers[markerTag]:
-+ self.markers[markerTag].append(int(nodes[0]))
-+ if not int(nodes[1]) in self.markers[markerTag]:
-+ self.markers[markerTag].append(int(nodes[1]))
-+ else:
-+ print("Element type {} is not recognized !!".format(elemType))
-+ continue
-+ else:
-+ continue
-
- print("Number of dimensions: {}".format(self.nDim))
- print("Number of elements: {}".format(self.nElem))
-@@ -441,23 +441,23 @@
- Coord_n = self.node[iPoint].GetCoord_n()
-
- if self.Unsteady:
-- r = Coord_n - self.centerOfRotation_n
-- else:
-- r = Coord - self.centerOfRotation
-+ r = Coord_n - self.centerOfRotation_n
-+ else:
-+ r = Coord - self.centerOfRotation
-
-- rotCoord = rotMatrix.dot(r)
-+ rotCoord = rotMatrix.dot(r)
-
- newCoord = newCenter + rotCoord
- newVel[0] = Centerdot[0]+psidot*(newCoord[1]-newCenter[1])
-- newVel[1] = Centerdot[1]-psidot*(newCoord[0]-newCenter[0])
-- newVel[2] = Centerdot[2]+0.0
-+ newVel[1] = Centerdot[1]-psidot*(newCoord[0]-newCenter[0])
-+ newVel[2] = Centerdot[2]+0.0
-
- self.node[iPoint].SetCoord((newCoord[0], newCoord[1], newCoord[2]))
- self.node[iPoint].SetVel((newVel[0], newVel[1], newVel[2]))
-
-- if initialize:
-- self.node[iPoint].SetCoord_n((newCoord[0], newCoord[1], newCoord[2]))
-- self.node[iPoint].SetVel_n((newVel[0], newVel[1], newVel[2]))
-+ if initialize:
-+ self.node[iPoint].SetCoord_n((newCoord[0], newCoord[1], newCoord[2]))
-+ self.node[iPoint].SetVel_n((newVel[0], newVel[1], newVel[2]))
-
- self.centerOfRotation = np.copy(newCenter)
-
-diff -Naur old/SU2_PY/FSI/io/FSI_config.py new/SU2_PY/FSI/io/FSI_config.py
---- old/SU2_PY/FSI/io/FSI_config.py 2020-05-01 19:09:18.000000000 +0300
-+++ new/SU2_PY/FSI/io/FSI_config.py 2020-05-10 16:17:07.000000000 +0300
-@@ -58,23 +58,23 @@
- self.readConfig()
-
- def __str__(self):
-- tempString = str()
-- for key, value in self._ConfigContent.items():
-- tempString += "{} = {}\n".format(key,value)
-- return tempString
-+ tempString = str()
-+ for key, value in self._ConfigContent.items():
-+ tempString += "{} = {}\n".format(key,value)
-+ return tempString
-
- def __getitem__(self,key):
-- return self._ConfigContent[key]
-+ return self._ConfigContent[key]
-
- def __setitem__(self, key, value):
-- self._ConfigContent[key] = value
-+ self._ConfigContent[key] = value
-
- def readConfig(self):
- input_file = open(self.ConfigFileName)
- while 1:
-- line = input_file.readline()
-- if not line:
-- break
-+ line = input_file.readline()
-+ if not line:
-+ break
- # remove line returns
- line = line.strip('\r\n')
- # make sure it has useful data
-@@ -86,46 +86,46 @@
- this_value = line[1].strip()
-
- for case in switch(this_param):
-- #integer values
-- if case("NDIM") : pass
-- #if case("MESH_DEF_LIN_ITER") : pass
-- #if case("MESH_DEF_NONLIN_ITER") : pass
-- if case("RESTART_ITER") : pass
-- if case("NB_EXT_ITER") : pass
-- if case("NB_FSI_ITER") :
-- self._ConfigContent[this_param] = int(this_value)
-- break
-+ #integer values
-+ if case("NDIM") : pass
-+ #if case("MESH_DEF_LIN_ITER") : pass
-+ #if case("MESH_DEF_NONLIN_ITER") : pass
-+ if case("RESTART_ITER") : pass
-+ if case("NB_EXT_ITER") : pass
-+ if case("NB_FSI_ITER") :
-+ self._ConfigContent[this_param] = int(this_value)
-+ break
-
-- #float values
-+ #float values
- if case("RBF_RADIUS") : pass
-- if case("AITKEN_PARAM") : pass
-- if case("START_TIME") : pass
-- if case("UNST_TIMESTEP") : pass
-- if case("UNST_TIME") : pass
-- if case("FSI_TOLERANCE") :
-- self._ConfigContent[this_param] = float(this_value)
-- break
--
-- #string values
-- if case("CFD_CONFIG_FILE_NAME") : pass
-- if case("CSD_SOLVER") : pass
-- if case("CSD_CONFIG_FILE_NAME") : pass
-- if case("RESTART_SOL") : pass
-- if case("MATCHING_MESH") : pass
-+ if case("AITKEN_PARAM") : pass
-+ if case("START_TIME") : pass
-+ if case("UNST_TIMESTEP") : pass
-+ if case("UNST_TIME") : pass
-+ if case("FSI_TOLERANCE") :
-+ self._ConfigContent[this_param] = float(this_value)
-+ break
-+
-+ #string values
-+ if case("CFD_CONFIG_FILE_NAME") : pass
-+ if case("CSD_SOLVER") : pass
-+ if case("CSD_CONFIG_FILE_NAME") : pass
-+ if case("RESTART_SOL") : pass
-+ if case("MATCHING_MESH") : pass
- if case("MESH_INTERP_METHOD") : pass
-- if case("DISP_PRED") : pass
-- if case("AITKEN_RELAX") : pass
-- if case("TIME_MARCHING") : pass
-- if case("INTERNAL_FLOW") :
-- #if case("MESH_DEF_METHOD") : pass
-- self._ConfigContent[this_param] = this_value
-- break
--
-- if case():
-- print(this_param + " is an invalid option !")
-- break
-- #end for
--
-+ if case("DISP_PRED") : pass
-+ if case("AITKEN_RELAX") : pass
-+ if case("TIME_MARCHING") : pass
-+ if case("INTERNAL_FLOW") :
-+ #if case("MESH_DEF_METHOD") : pass
-+ self._ConfigContent[this_param] = this_value
-+ break
-+
-+ if case():
-+ print(this_param + " is an invalid option !")
-+ break
-+ #end for
-+
-
-
- #def dump()
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [gentoo-commits] repo/proj/guru:dev commit in: sci-physics/SU2/files/, sci-physics/SU2/
@ 2021-02-13 12:30 Sergey Torokhov
0 siblings, 0 replies; 7+ messages in thread
From: Sergey Torokhov @ 2021-02-13 12:30 UTC (permalink / raw
To: gentoo-commits
commit: b1b0e1abfa3b87eb3c603a33d3cbf984f5e2274a
Author: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
AuthorDate: Sat Feb 13 12:26:26 2021 +0000
Commit: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
CommitDate: Sat Feb 13 12:29:42 2021 +0000
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=b1b0e1ab
sci-physics/SU2: 7.1.0 version bump
Fix python optimized patch isn't required now.
Add optional bundled Mutation++ library support via USE="mpp"
(Mutation++: MUlticomponent Thermodynamic
And Transport properties for IONized gases in C++).
This library could be packaged later to unbundle it.
Signed-off-by: Sergey Torokhov <torokhov-s-a <AT> yandex.ru>
sci-physics/SU2/Manifest | 4 +
sci-physics/SU2/SU2-7.1.0.ebuild | 119 ++++++++++++++++++++++++++
sci-physics/SU2/files/SU2-7.1.0-fix-env.patch | 12 +++
sci-physics/SU2/metadata.xml | 1 +
4 files changed, 136 insertions(+)
diff --git a/sci-physics/SU2/Manifest b/sci-physics/SU2/Manifest
index 7a4bd55d..dbfba89b 100644
--- a/sci-physics/SU2/Manifest
+++ b/sci-physics/SU2/Manifest
@@ -2,3 +2,7 @@ DIST SU2-7.0.7-TestCases.tar.gz 448969006 BLAKE2B 6c886824b55d7f8516d2ea69e2f7be
DIST SU2-7.0.7-Tutorials.tar.gz 64282235 BLAKE2B 7a6b780ee6f01d26a7a7d4751ca39798af56cfd7b99ca3e13fdff61aecd631a3aa4c98a487f48a8b2593c711ee25bd1ddc90a316bde2c287e95a383321f1d5e9 SHA512 189b5da96f08689b62ba3c42ee349edd2e145f371112895587e53497f16de3d6fdbf17308af39961775d76e3169c40872ced8e267146b6da5ae12d31a4c70fa9
DIST SU2-7.0.8-fix-python-optimize.patch 104379 BLAKE2B e2cb9f58af5f600f25d01a082b55a344d3b05c455d44cfcb3370fc77546b6821d616e80f577b7af4b19ad519f086495eb6f6bde1f1712451ac477d6dd538fa0e SHA512 f21ed5fc1e61b78f3858a162a899c552777143118f05db009247c6224b06b922b6280de5725726afe21a3283a18ad9c38fc1c65dadb709d440e10cf3fe754d8c
DIST SU2-7.0.8.tar.gz 20554206 BLAKE2B ac291eeae696197f5875839defa98bde550c5250b5a5cff8049e0d1c8184c5ec6d225b77618d079a8fb3d5a7f4d0531a0b2931fd15e045299fa55c7dd03d9fd1 SHA512 26ed8c39d2dfcdb3fc4e1c986c64f683f44cd4123ce5f7a482c4557a82b04b4bd8ef1f04332ab36ad0f987cfb98053fb8b30ef81faf51c7c56aebc1a30467df9
+DIST SU2-7.1.0-TestCases.tar.gz 449701778 BLAKE2B 8a7cb400d330b4bbf62023525e6009a8c05af5a375b7479087b3b579d7f3162a11091f09294381fcd11d7bc358e77f10f69efc0999a304135f8850e3fe005000 SHA512 a0e354b073b4cfaeb47a9bd33ac66a636b12a065ca7caff4bd50c54e2b191809fd463f980568e0b7d4d559714d2dca99fe9a3e5854aa345be24010cd1239e772
+DIST SU2-7.1.0-Tutorials.tar.gz 66570840 BLAKE2B fdbc23503abd7a250464ca8da52ab87f67069d2a3fca130038c1ea83c3b18aa476fed3a21f725b142a97923b101d7906a720f6dff28341a13915ed6216660d7f SHA512 7843a7ed5b3c606ea9821745390c70bbfd3cb66a17494360b4139e8735a8e83546acd0912462b7fc3b63ff9f2097610294c1c9af25d104962f727f599cdb8ae9
+DIST SU2-7.1.0.tar.gz 20542933 BLAKE2B e6e6d82a990bf4043d1c6c58a5fe7a100a923b2c6ae6a29f7bb969e02279eeb5587f7930b2372cf67e26f451c598cf81e2515eeb7e516d6ab060ac7e986a0110 SHA512 309b4e06c5fc084ea2a06797ae400392b924c3654d354170c3159327c9e022081745bee28b1537ed3ad4e7c1333afb8c38a1ca033ff28662b8d5f5badfdc8465
+DIST mutationpp-1.0.1.tar.gz 4021945 BLAKE2B caae3ca155541a36822a950047efb867aab098bc9db311d675acca272d7f317ff35524086a0ea5eda524bbe125e4874f41dc1dbad92bfee4387e3a0c649bbd0a SHA512 ba8beeb7cdaf1b526571e27f745d8d53c1e20a96bd194a5949acb8b6d5f75553867158a63bfc7198502177a9e8a91bf82a67d450a3ba72b21f8490539f45ef01
diff --git a/sci-physics/SU2/SU2-7.1.0.ebuild b/sci-physics/SU2/SU2-7.1.0.ebuild
new file mode 100644
index 00000000..0357fd63
--- /dev/null
+++ b/sci-physics/SU2/SU2-7.1.0.ebuild
@@ -0,0 +1,119 @@
+# Copyright 1999-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{7,8,9} )
+
+inherit meson python-single-r1
+
+DESCRIPTION="SU2: An Open-Source Suite for Multiphysics Simulation and Design"
+HOMEPAGE="https://su2code.github.io/"
+SRC_URI="
+ https://github.com/su2code/SU2/archive/v${PV}.tar.gz -> ${P}.tar.gz
+ mpp? ( https://github.com/mutationpp/Mutationpp/archive/v1.0.1.tar.gz -> mutationpp-1.0.1.tar.gz )
+ test? ( https://github.com/su2code/TestCases/archive/v${PV}.tar.gz -> ${P}-TestCases.tar.gz )
+ tutorials? ( https://github.com/su2code/Tutorials/archive/v${PV}.tar.gz -> ${P}-Tutorials.tar.gz )
+"
+
+LICENSE="LGPL-2.1"
+SLOT="0"
+KEYWORDS="~amd64"
+
+# cgns, metis, parmetis are bundled;
+# omp is disable as it's experimental;
+# pastix is disabled as it's try to find bundled libs;
+IUSE="cgns -mkl +mpi mpp openblas tecio test tutorials"
+RESTRICT="!test? ( test )"
+REQUIRED_USE="
+ ${PYTHON_REQUIRED_USE}
+ mkl? ( !openblas )
+"
+
+RDEPEND="
+ ${PYTHON_DEPS}
+ mpi? ( virtual/mpi[cxx] )
+ mkl? ( sci-libs/mkl )
+ openblas? ( sci-libs/openblas )
+"
+DEPEND="
+ ${RDEPEND}
+ tecio? ( dev-libs/boost:= )
+"
+BDEPEND="virtual/pkgconfig"
+
+PATCHES=(
+ "${FILESDIR}/${PN}-7.0.4-unbundle_boost.patch"
+ "${FILESDIR}/${P}-fix-env.patch"
+)
+
+DOCS=( "README.md" "SU2_PY/documentation.txt" )
+
+src_unpack() {
+ unpack "${P}.tar.gz"
+ if use mpp ; then
+ einfo "Unpacking mutationpp-1.0.1.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}/subprojects/Mutationpp"
+ tar -C "${P}"/subprojects/Mutationpp --strip-components=1 -xzf "${DISTDIR}/mutationpp-1.0.1.tar.gz" || die
+ fi
+ if use test ; then
+ einfo "Unpacking ${P}-TestCases.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}/TestCases"
+ tar -C "${P}"/TestCases --strip-components=1 -xzf "${DISTDIR}/${P}-TestCases.tar.gz" || die
+ fi
+ if use tutorials ; then
+ einfo "Unpacking ${P}-Tutorials.tar.gz to /var/tmp/portage/sci-physics/${P}/work/${P}"
+ mkdir "${P}"/Tutorials || die
+ tar -C "${P}"/Tutorials --strip-components=1 -xzf "${DISTDIR}/${P}-Tutorials.tar.gz" || die
+ fi
+}
+
+src_configure() {
+ local emesonargs=(
+ -Denable-autodiff=false
+ -Denable-directdiff=false
+ -Denable-pastix=false
+ -Denable-pywrapper=false
+ -Dwith-omp=false
+ $(meson_feature mpi with-mpi)
+ $(meson_use cgns enable-cgns)
+ $(meson_use mkl enable-mkl)
+ $(meson_use mpp enable-mpp)
+ $(meson_use openblas enable-openblas)
+ $(meson_use tecio enable-tecio)
+ $(meson_use test enable-tests)
+ )
+ meson_src_configure
+}
+
+src_test() {
+ ln -s ../../${P}-build/SU2_CFD/src/SU2_CFD SU2_PY/SU2_CFD
+ ln -s ../../${P}-build/SU2_DEF/src/SU2_DEF SU2_PY/SU2_DEF
+ ln -s ../../${P}-build/SU2_DOT/src/SU2_DOT SU2_PY/SU2_DOT
+ ln -s ../../${P}-build/SU2_GEO/src/SU2_GEO SU2_PY/SU2_GEO
+ ln -s ../../${P}-build/SU2_SOL/src/SU2_SOL SU2_PY/SU2_SOL
+
+ export SU2_RUN="${S}/SU2_PY"
+ export SU2_HOME="${S}"
+ export PATH=$PATH:$SU2_RUN
+ export PYTHONPATH=$PYTHONPATH:$SU2_RUN
+
+ einfo "Running UnitTests ..."
+ ../${P}-build/UnitTests/test_driver
+
+ pushd TestCases/
+ use mpi && python parallel_regression.py
+ use mpi || python serial_regression.py
+ use tutorials && use mpi && python tutorials.py
+ popd
+}
+
+src_install() {
+ meson_src_install
+ mkdir -p "${ED}$(python_get_sitedir)" || die
+ mv "${ED}"/usr/bin/{FSI_tools,SU2,SU2_Nastran,*.py} -t "${ED}$(python_get_sitedir)" || die
+ python_optimize "${D}/$(python_get_sitedir)"
+
+ if use tutorials ; then
+ insinto "/usr/share/${P}"
+ doins -r Tutorials
+ fi
+}
diff --git a/sci-physics/SU2/files/SU2-7.1.0-fix-env.patch b/sci-physics/SU2/files/SU2-7.1.0-fix-env.patch
new file mode 100644
index 00000000..baf7955d
--- /dev/null
+++ b/sci-physics/SU2/files/SU2-7.1.0-fix-env.patch
@@ -0,0 +1,12 @@
+diff -Naur old_env/UnitTests/meson.build new_env/UnitTests/meson.build
+--- old_env/UnitTests/meson.build 2020-06-15 17:03:43.000000000 +0300
++++ new_env/UnitTests/meson.build 2020-06-15 17:04:35.000000000 +0300
+@@ -26,7 +26,7 @@
+ test_driver = executable(
+ 'test_driver',
+ unit_test_files,
+- install : true,
++ install : false,
+ dependencies : [su2_cfd_dep, common_dep, su2_deps, catch2_dep],
+ cpp_args: ['-fPIC', default_warning_flags, su2_cpp_args]
+ )
diff --git a/sci-physics/SU2/metadata.xml b/sci-physics/SU2/metadata.xml
index 636aded5..8317735e 100644
--- a/sci-physics/SU2/metadata.xml
+++ b/sci-physics/SU2/metadata.xml
@@ -8,6 +8,7 @@
<use>
<flag name="cgns">Build with CGNS support (bundled)</flag>
<flag name="mkl">Enable Intel MKL support</flag>
+ <flag name="mpp">Enable Mutation++ library support</flag>
<flag name="openblas">Enable OpenBLAS support</flag>
<flag name="tecio">Enable TECIO support</flag>
<flag name="tutorials">Install Tutorials files</flag>
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [gentoo-commits] repo/proj/guru:dev commit in: sci-physics/SU2/files/, sci-physics/SU2/
@ 2022-05-27 22:47 Sergey Torokhov
0 siblings, 0 replies; 7+ messages in thread
From: Sergey Torokhov @ 2022-05-27 22:47 UTC (permalink / raw
To: gentoo-commits
commit: ba236ca85175d75bad6565c607e1f9c8b96fb0a7
Author: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
AuthorDate: Fri May 27 22:45:16 2022 +0000
Commit: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
CommitDate: Fri May 27 22:46:28 2022 +0000
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=ba236ca8
sci-physics/SU2: fix meson.build patch
Closes: https://bugs.gentoo.org/847346
Signed-off-by: Sergey Torokhov <torokhov-s-a <AT> yandex.ru>
sci-physics/SU2/SU2-7.2.0-r1.ebuild | 1 +
sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch | 7 ++++---
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/sci-physics/SU2/SU2-7.2.0-r1.ebuild b/sci-physics/SU2/SU2-7.2.0-r1.ebuild
index ac28d7d53..2d2ce7361 100644
--- a/sci-physics/SU2/SU2-7.2.0-r1.ebuild
+++ b/sci-physics/SU2/SU2-7.2.0-r1.ebuild
@@ -44,6 +44,7 @@ RDEPEND="
"
DEPEND="
${RDEPEND}
+ dev-cpp/catch:0
dev-cpp/cli11
autodiff? (
diff --git a/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch b/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
index 927ee3734..3e96c4dd4 100644
--- a/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
+++ b/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
@@ -104,10 +104,10 @@
if p.returncode() != 0
error(p.stdout())
endif
-@@ -280,20 +271,4 @@
+@@ -280,21 +271,3 @@
get_option('enable-autodiff'), get_option('enable-directdiff'), get_option('enable-pywrapper'), get_option('enable-mkl'),
get_option('enable-openblas'), get_option('enable-pastix'), get_option('enable-mixedprec'), get_option('enable-librom'), meson.build_root().split('/')[-1]))
-
+-
-if get_option('enable-mpp')
- message(''' To run SU2 with Mutation++ library, add these lines to your .bashrc file:
-
@@ -124,7 +124,8 @@
-
- '''.format(get_option('librom_root')))
-
- endif
+-endif
+
--- a/SU2_CFD/include/solvers/CSolver.hpp
+++ b/SU2_CFD/include/solvers/CSolver.hpp
@@ -57,9 +57,9 @@
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [gentoo-commits] repo/proj/guru:dev commit in: sci-physics/SU2/files/, sci-physics/SU2/
@ 2022-05-29 15:31 Alessandro Barbieri
0 siblings, 0 replies; 7+ messages in thread
From: Alessandro Barbieri @ 2022-05-29 15:31 UTC (permalink / raw
To: gentoo-commits
commit: ef90a22aafeff5cdb5ca28897fa3ad77b8333e15
Author: Alessandro Barbieri <lssndrbarbieri <AT> gmail <DOT> com>
AuthorDate: Sun May 29 15:29:49 2022 +0000
Commit: Alessandro Barbieri <lssndrbarbieri <AT> gmail <DOT> com>
CommitDate: Sun May 29 15:29:49 2022 +0000
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=ef90a22a
sci-physics/SU2: fixes for tests
Closes: https://bugs.gentoo.org/848033
Signed-off-by: Alessandro Barbieri <lssndrbarbieri <AT> gmail.com>
sci-physics/SU2/SU2-7.2.0-r1.ebuild | 10 +++--
sci-physics/SU2/files/SU2-7.2.0-fix-headers.patch | 51 ++++++++++++++++++++++
.../SU2/files/SU2-7.2.0-system-libraries.patch | 12 -----
3 files changed, 57 insertions(+), 16 deletions(-)
diff --git a/sci-physics/SU2/SU2-7.2.0-r1.ebuild b/sci-physics/SU2/SU2-7.2.0-r1.ebuild
index b0c8a21e9..29413cf3e 100644
--- a/sci-physics/SU2/SU2-7.2.0-r1.ebuild
+++ b/sci-physics/SU2/SU2-7.2.0-r1.ebuild
@@ -33,7 +33,7 @@ RDEPEND="
sci-libs/metis
virtual/mpi[cxx]
)
- mpp? ( sci-libs/Mutationpp )
+ mpp? ( sci-libs/Mutationpp:= )
openblas? ( sci-libs/openblas )
parmetis? ( sci-libs/parmetis )
pastix? (
@@ -85,6 +85,7 @@ REQUIRED_USE="
mpi
|| ( openblas mkl )
)
+ test? ( mpi python )
?? ( openblas mkl )
?? ( directdiff pastix )
"
@@ -93,6 +94,7 @@ PATCHES=(
"${FILESDIR}/${PN}-7.1.0-fix-env.patch"
"${FILESDIR}/${PN}-7.2.0-system-libraries.patch"
"${FILESDIR}/${PN}-7.2.0-DESTDIR.patch"
+ "${FILESDIR}/${PN}-7.2.0-fix-headers.patch"
)
src_unpack() {
@@ -170,9 +172,9 @@ src_test() {
pushd TestCases/ || die
if use mpi ; then
- if use tutorials ; then
- ${EPYTHON} tutorials.py || die
- fi
+# if use tutorials ; then
+# ${EPYTHON} tutorials.py || die
+# fi
${EPYTHON} parallel_regression.py || die
else
${EPYTHON} serial_regression.py || die
diff --git a/sci-physics/SU2/files/SU2-7.2.0-fix-headers.patch b/sci-physics/SU2/files/SU2-7.2.0-fix-headers.patch
new file mode 100644
index 000000000..39f26e733
--- /dev/null
+++ b/sci-physics/SU2/files/SU2-7.2.0-fix-headers.patch
@@ -0,0 +1,51 @@
+--- a/UnitTests/Common/geometry/dual_grid/CDualGrid_tests.cpp
++++ b/UnitTests/Common/geometry/dual_grid/CDualGrid_tests.cpp
+@@ -28,8 +28,8 @@
+ #include "catch.hpp"
+ #include <sstream>
+ #include <iomanip>
+-#include "../../../Common/include/geometry/dual_grid/CEdge.hpp"
+-#include "../../../Common/include/geometry/dual_grid/CVertex.hpp"
++#include "../../../../Common/include/geometry/dual_grid/CEdge.hpp"
++#include "../../../../Common/include/geometry/dual_grid/CVertex.hpp"
+
+ TEST_CASE("Volume Computation", "[Dual Grid]") {
+
+--- a/UnitTests/Common/geometry/primal_grid/CPrimalGrid_tests.cpp
++++ b/UnitTests/Common/geometry/primal_grid/CPrimalGrid_tests.cpp
+@@ -27,8 +27,8 @@
+
+ #include "catch.hpp"
+ #include <sstream>
+-#include "../../../Common/include/geometry/primal_grid/CPrimalGrid.hpp"
+-#include "../../../Common/include/geometry/primal_grid/CHexahedron.hpp"
++#include "../../../../Common/include/geometry/primal_grid/CPrimalGrid.hpp"
++#include "../../../../Common/include/geometry/primal_grid/CHexahedron.hpp"
+
+ TEST_CASE("Center of gravity computation", "[Primal Grid]") {
+
+--- a/UnitTests/test_driver.cpp
++++ b/UnitTests/test_driver.cpp
+@@ -31,8 +31,8 @@
+ #define CATCH_CONFIG_RUNNER
+ #include "catch.hpp"
+
+-#include "../../../Common/include/parallelization/mpi_structure.hpp"
+-#include "../../../Common/include/option_structure.hpp"
++#include "../Common/include/parallelization/mpi_structure.hpp"
++#include "../Common/include/option_structure.hpp"
+
+ int main(int argc, char *argv[]) {
+
+--- a/SU2_GEO/include/SU2_GEO.hpp
++++ b/SU2_GEO/include/SU2_GEO.hpp
+@@ -38,7 +38,7 @@
+
+ #include "../../Common/include/geometry/CPhysicalGeometry.hpp"
+ #include "../../Common/include/CConfig.hpp"
+-#include "../../../Common/include/grid_movement/CSurfaceMovement.hpp"
+-#include "../../../Common/include/grid_movement/CFreeFormDefBox.hpp"
++#include "../../Common/include/grid_movement/CSurfaceMovement.hpp"
++#include "../../Common/include/grid_movement/CFreeFormDefBox.hpp"
+
+ using namespace std;
diff --git a/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch b/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
index 3e96c4dd4..176caee93 100644
--- a/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
+++ b/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
@@ -152,15 +152,3 @@
#include "drivers/CDriver.hpp"
#include "drivers/CSinglezoneDriver.hpp"
---- a/SU2_GEO/include/SU2_GEO.hpp
-+++ b/SU2_GEO/include/SU2_GEO.hpp
-@@ -38,7 +38,7 @@
-
- #include "../../Common/include/geometry/CPhysicalGeometry.hpp"
- #include "../../Common/include/CConfig.hpp"
--#include "../../../Common/include/grid_movement/CSurfaceMovement.hpp"
--#include "../../../Common/include/grid_movement/CFreeFormDefBox.hpp"
-+#include "../../Common/include/grid_movement/CSurfaceMovement.hpp"
-+#include "../../Common/include/grid_movement/CFreeFormDefBox.hpp"
-
- using namespace std;
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [gentoo-commits] repo/proj/guru:dev commit in: sci-physics/SU2/files/, sci-physics/SU2/
@ 2022-12-08 22:44 Sergey Torokhov
0 siblings, 0 replies; 7+ messages in thread
From: Sergey Torokhov @ 2022-12-08 22:44 UTC (permalink / raw
To: gentoo-commits
commit: 46785f14e0680f12b6d03b8c738b1e9fc1ea30b8
Author: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
AuthorDate: Thu Dec 8 22:02:31 2022 +0000
Commit: Sergey Torokhov <torokhov-s-a <AT> yandex <DOT> ru>
CommitDate: Thu Dec 8 22:02:31 2022 +0000
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=46785f14
sci-physics/SU2: revert unbundling metis/parmetis (as fail tests)
The unbundling of metis/[armetis results in numerous failures
of tests, especially the Tutorial tests that are preferred
to be checked.
The revision with additional USE-flags is now '-r1xx'.
The changes also enable python tests;
add restriction '<dev-cpp/catch-3:0' with catch to be required
only with USE="test";
The USE="openmp" results in inf. run of Tutorial and TestCases tests
and USE="mixed-precision" results in test failures.
Assumed that this USE-flags should be maske, especcialy USE="openmp".
Signed-off-by: Sergey Torokhov <torokhov-s-a <AT> yandex.ru>
.../{SU2-7.2.0-r1.ebuild => SU2-7.2.0-r100.ebuild} | 54 ++++++++++++++--------
.../SU2/files/SU2-7.2.0-system-libraries.patch | 30 +++---------
2 files changed, 43 insertions(+), 41 deletions(-)
diff --git a/sci-physics/SU2/SU2-7.2.0-r1.ebuild b/sci-physics/SU2/SU2-7.2.0-r100.ebuild
similarity index 78%
rename from sci-physics/SU2/SU2-7.2.0-r1.ebuild
rename to sci-physics/SU2/SU2-7.2.0-r100.ebuild
index 29413cf3e..97dceb66e 100644
--- a/sci-physics/SU2/SU2-7.2.0-r1.ebuild
+++ b/sci-physics/SU2/SU2-7.2.0-r100.ebuild
@@ -29,20 +29,15 @@ RDEPEND="
cgns? ( >=sci-libs/cgnslib-4 )
librom? ( sci-libs/libROM )
mkl? ( sci-libs/mkl )
- mpi? (
- sci-libs/metis
- virtual/mpi[cxx]
- )
+ mpi? ( virtual/mpi[cxx] )
mpp? ( sci-libs/Mutationpp:= )
openblas? ( sci-libs/openblas )
- parmetis? ( sci-libs/parmetis )
pastix? (
<sci-libs/pastix-6[mpi?]
sci-libs/scotch
)
python? ( $(python_gen_cond_dep '
dev-python/mpi4py[${PYTHON_USEDEP}]
- dev-python/wxpython[${PYTHON_USEDEP}]
dev-python/xlwt[${PYTHON_USEDEP}]
dev-python/matplotlib[${PYTHON_USEDEP}]
dev-python/scipy[${PYTHON_USEDEP}]
@@ -52,9 +47,7 @@ RDEPEND="
"
DEPEND="
${RDEPEND}
- dev-cpp/catch:0
dev-cpp/cli11:=
-
autodiff? (
sci-libs/CoDiPack:=
mpi? ( >sci-libs/MeDiPack-1.2:= )
@@ -65,7 +58,7 @@ DEPEND="
mpi? ( >sci-libs/MeDiPack-1.2:= )
)
tecio? ( >=dev-libs/boost-1.76.0:= )
- test? ( dev-cpp/catch:0 )
+ test? ( <dev-cpp/catch-3:0 )
"
BDEPEND="
python? ( dev-lang/swig )
@@ -85,7 +78,7 @@ REQUIRED_USE="
mpi
|| ( openblas mkl )
)
- test? ( mpi python )
+ test? ( mpi python tutorials )
?? ( openblas mkl )
?? ( directdiff pastix )
"
@@ -111,7 +104,7 @@ src_unpack() {
}
src_prepare(){
- rm -rf externals/{CLI11,autotools,catch2,cgns,codi,medi,meson,metis,ninja,parmetis} || die
+ rm -rf externals/{CLI11,autotools,catch2,cgns,codi,medi,meson,ninja,opdi} || die
default
# boost Geometry requires c++14 since >=boost-1.75
@@ -120,8 +113,14 @@ src_prepare(){
# Force Disable parmetis support in meson.build (configure.ac has optional switch)
use !parmetis && { sed -i -e "/parmetis/Id" meson.build || die ; }
- # Disable python-wrapper tests
- sed -i "/append(pywrapper_/s/./#&/" TestCases/parallel_regression.py || die
+ # Disable failed tests
+ sed -i "/append(dyn_fsi/s/./#&/" TestCases/parallel_regression.py || die
+ sed -i "/append(fd_sp_pinArray_cht_2d_dp_hf/s/./#&/" TestCases/parallel_regression.py || die
+ if ! use directdiff ; then
+ # Disable TestCase('unsteady_cylinder_windowed_average')
+ sed -i "217s/./#&/" TestCases/parallel_regression_AD.py || die
+ fi
+ sed -i "/append(dyn_discadj_fsi/s/./#&/" TestCases/parallel_regression_AD.py || die
# Copy absence mesh file
if use test ; then
@@ -161,6 +160,16 @@ src_test() {
ln -s ../../${P}-build/SU2_DOT/src/SU2_DOT SU2_PY/SU2_DOT || die
ln -s ../../${P}-build/SU2_GEO/src/SU2_GEO SU2_PY/SU2_GEO || die
ln -s ../../${P}-build/SU2_SOL/src/SU2_SOL SU2_PY/SU2_SOL || die
+ ln -s ../../${P}-build/SU2_PY/pySU2/pysu2.py SU2_PY/pysu2.py || die
+ ln -s ../../${P}-build/SU2_PY/pySU2/_pysu2.so SU2_PY/_pysu2.so || die
+ if use autodiff ; then
+ ln -s ../../${P}-build/SU2_CFD/src/SU2_CFD_AD SU2_PY/SU2_CFD_AD || die
+ ln -s ../../${P}-build/SU2_DOT/src/SU2_DOT_AD SU2_PY/SU2_DOT_AD || die
+ ln -s ../../${P}-build/SU2_PY/pySU2/_pysu2ad.so SU2_PY/_pysu2ad.so || die
+ if use directdiff ; then
+ ln -s ../../${P}-build/SU2_CFD/src/SU2_CFD_DIRECTDIFF SU2_PY/SU2_CFD_DIRECTDIFF || die
+ fi
+ fi
export SU2_RUN="${S}/SU2_PY"
export SU2_HOME="${S}"
@@ -171,13 +180,22 @@ src_test() {
../${P}-build/UnitTests/test_driver || die
pushd TestCases/ || die
+ # Currently Tests always use mpi
if use mpi ; then
-# if use tutorials ; then
-# ${EPYTHON} tutorials.py || die
-# fi
- ${EPYTHON} parallel_regression.py || die
+ if use tutorials ; then
+ ${EPYTHON} tutorials.py || die
+ fi
+ if use autodiff ; then
+ ${EPYTHON} parallel_regression_AD.py || die
+ else
+ ${EPYTHON} parallel_regression.py || die
+ fi
else
- ${EPYTHON} serial_regression.py || die
+ if use autodiff ; then
+ ${EPYTHON} serial_regression_AD.py || die
+ else
+ ${EPYTHON} serial_regression.py || die
+ fi
fi
popd || die
}
diff --git a/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch b/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
index 176caee93..21bfdde56 100644
--- a/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
+++ b/sci-physics/SU2/files/SU2-7.2.0-system-libraries.patch
@@ -28,26 +28,7 @@
su2_deps += cgns_dep
su2_cpp_args += '-DHAVE_CGNS'
endif
-@@ -91,23 +92,19 @@
- su2_deps += mpi_dep
- su2_cpp_args += '-DHAVE_MPI'
-
-- # compile metis
-- subdir('externals/metis')
--
- # add metis dependency
-+ metis_dep = dependency('metis')
- su2_deps += metis_dep
- su2_cpp_args += '-DHAVE_METIS'
-
-- # compile parmetis
-- subdir('externals/parmetis')
--
- # add parmetis dependency
-+ parmetis_dep = dependency('parmetis')
- su2_deps += parmetis_dep
- su2_cpp_args += '-DHAVE_PARMETIS'
-
+@@ -108,6 +108,6 @@
# add medi dependency
if get_option('enable-autodiff') or get_option('enable-directdiff')
- codi_dep += declare_dependency(include_directories: ['externals/medi/include', 'externals/medi/src'])
@@ -81,12 +62,14 @@
su2_deps += librom_dep
-@@ -205,19 +198,17 @@
+@@ -205,19 +202,19 @@
endif
endforeach
-catch2_dep = declare_dependency(include_directories: 'externals/catch2/')
-+catch2_dep = declare_dependency(include_directories: '/usr/include/catch2/')
++if get_option('enable-tests')
++ catch2_dep = declare_dependency(include_directories: '/usr/include/catch2/')
++endif
if get_option('enable-mpp')
- cmake = import('cmake')
@@ -104,7 +87,8 @@
if p.returncode() != 0
error(p.stdout())
endif
-@@ -280,21 +271,3 @@
+@@ -279,21 +274,3 @@
+ '''.format(get_option('prefix')+'/bin', meson.source_root(), get_option('enable-tecio'), get_option('enable-cgns'),
get_option('enable-autodiff'), get_option('enable-directdiff'), get_option('enable-pywrapper'), get_option('enable-mkl'),
get_option('enable-openblas'), get_option('enable-pastix'), get_option('enable-mixedprec'), get_option('enable-librom'), meson.build_root().split('/')[-1]))
-
^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-12-08 22:44 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-05-27 22:47 [gentoo-commits] repo/proj/guru:dev commit in: sci-physics/SU2/files/, sci-physics/SU2/ Sergey Torokhov
-- strict thread matches above, loose matches on Subject: below --
2022-12-08 22:44 Sergey Torokhov
2022-05-29 15:31 Alessandro Barbieri
2021-02-13 12:30 Sergey Torokhov
2021-01-05 13:54 Sergey Torokhov
2020-10-21 21:32 Sergey Torokhov
2020-07-13 18:59 Sergey Torokhov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox