1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
# Copyright 1999-2023 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
PYTHON_COMPAT=( python3_{9..11} )
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
tecio? ( tecio_license_agreement )
parmetis? ( all-rights-reserved free-noncomm )
"
SLOT="0"
KEYWORDS="~amd64"
IUSE="autodiff cgns directdiff librom mixed-precision mkl +mpi mpp openblas openmp parmetis pastix python tecio test tutorials"
# TODO: do not force openblas
REQUIRED_USE="
${PYTHON_REQUIRED_USE}
parmetis? ( mpi )
pastix? (
mpi
|| ( openblas mkl )
)
test? ( mpi python tutorials )
?? ( openblas mkl )
?? ( directdiff pastix )
"
# Tests fail with FEATURES="network-sandbox" for most versions of openmpi and mpich it with error:
# "No network interfaces were found for out-of-band communications.
# We require at least one available network for out-of-band messaging."
PROPERTIES="test_network"
RESTRICT="!test? ( test )"
RDEPEND="
${PYTHON_DEPS}
cgns? ( >=sci-libs/cgnslib-4 )
librom? ( sci-libs/libROM )
mkl? ( sci-libs/mkl )
mpi? ( virtual/mpi[cxx] )
mpp? ( sci-libs/Mutationpp:= )
openblas? ( sci-libs/openblas )
pastix? (
<sci-libs/pastix-6[mpi?]
sci-libs/scotch
)
python? ( $(python_gen_cond_dep '
dev-python/mpi4py[${PYTHON_USEDEP}]
dev-python/xlwt[${PYTHON_USEDEP}]
dev-python/matplotlib[${PYTHON_USEDEP}]
dev-python/scipy[${PYTHON_USEDEP}]
dev-python/numpy[${PYTHON_USEDEP}]
')
)
"
DEPEND="
${RDEPEND}
dev-cpp/cli11:=
dev-cpp/MEL:=
autodiff? (
sci-libs/CoDiPack:=
mpi? ( >sci-libs/MeDiPack-1.2:= )
openmp? ( sci-libs/OpDiLib:= )
)
directdiff? (
sci-libs/CoDiPack:=
mpi? ( >sci-libs/MeDiPack-1.2:= )
)
tecio? ( >=dev-libs/boost-1.76.0:= )
test? ( <dev-cpp/catch-3:0 )
"
BDEPEND="
python? ( dev-lang/swig )
virtual/pkgconfig
"
DOCS=( "README.md" "SU2_PY/documentation.txt" )
PATCHES=(
"${FILESDIR}/${PN}-7.0.4-unbundle_boost.patch"
"${FILESDIR}/${PN}-7.1.0-fix-env.patch"
"${FILESDIR}/${P}-system-libraries.patch"
"${FILESDIR}/${PN}-7.2.0-DESTDIR.patch"
"${FILESDIR}/${PN}-7.2.0-fix-headers.patch"
)
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 || die
tar -C "${P}"/Tutorials --strip-components=1 -xzf "${DISTDIR}/${P}-Tutorials.tar.gz" || die
fi
}
src_prepare(){
rm -rf externals/{CLI11,autotools,catch2,cgns,codi,medi,mel,meson,ninja,opdi} || die
default
# boost Geometry requires c++14 since >=boost-1.75
sed -i -e 's:cpp_std=c++11:cpp_std=c++14:' meson.build || die
# Force Disable parmetis support in meson.build (configure.ac has optional switch)
use !parmetis && { sed -i -e "/parmetis/Id" meson.build || die ; }
# Replace platform.processor() with platform.machine()
# to get 'x86_64' in common case instead of full CPU name
sed -i "s/processor()/machine()/" TestCases/TestCase.py || die
# Fix python3.11 test compatibility (drop universal newline parameter - it's used by default)
sed -i "s/'U'//g" TestCases/TestCase.py || die
# Disable failed tests
sed -i "/append(tutorial_unst_naca0012)/s/./#&/" TestCases/tutorials.py || die # reasults sligtly differs
sed -i "/append(turbmod_sa_neg_rae2822/s/./#&/" TestCases/parallel_regression.py || die
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
sed -i "/append(fd_sp_pinArray_cht_2d_dp_hf/s/./#&/" TestCases/parallel_regression.py || die
sed -i "/append(coolprop_fluidModel/s/./#&/" TestCases/parallel_regression.py || die
sed -i "/append(coolprop_transportModel/s/./#&/" TestCases/parallel_regression.py || die
sed -i "/append(uniform_flow/s/./#&/" TestCases/parallel_regression.py || die
sed -i "/append(pywrapper_square_cylinder/s/./#&/" TestCases/parallel_regression.py || die
sed -i "/append(discadj_fsi2/s/./#&/" TestCases/parallel_regression_AD.py || die
sed -i "/append(dyn_discadj_fsi/s/./#&/" TestCases/parallel_regression_AD.py || die
}
src_configure() {
if use mpi ; then
export CC=mpicc
export CXX=mpicxx
fi
local emesonargs=(
$(meson_feature mpi with-mpi)
$(meson_use autodiff enable-autodiff)
$(meson_use cgns enable-cgns)
$(meson_use directdiff enable-directdiff)
$(meson_use librom enable-librom)
$(meson_use mixed-precision enable-mixedprec)
$(meson_use mkl enable-mkl)
$(meson_use mpi custom-mpi)
$(meson_use mpp enable-mpp)
$(meson_use openblas enable-openblas)
$(meson_use openmp with-omp)
$(meson_use pastix enable-pastix)
$(meson_use python enable-pywrapper)
$(meson_use tecio enable-tecio)
$(meson_use test enable-tests)
)
meson_src_configure
}
src_test() {
ln -sf ../../${P}-build/SU2_CFD/src/SU2_CFD SU2_PY/SU2_CFD || die
ln -sf ../../${P}-build/SU2_DEF/src/SU2_DEF SU2_PY/SU2_DEF || die
ln -sf ../../${P}-build/SU2_DOT/src/SU2_DOT SU2_PY/SU2_DOT || die
ln -sf ../../${P}-build/SU2_GEO/src/SU2_GEO SU2_PY/SU2_GEO || die
ln -sf ../../${P}-build/SU2_SOL/src/SU2_SOL SU2_PY/SU2_SOL || die
ln -sf ../../${P}-build/SU2_PY/pySU2/pysu2.py SU2_PY/pysu2.py || die
ln -sf ../../${P}-build/SU2_PY/pySU2/_pysu2.so SU2_PY/_pysu2.so || die
if use autodiff ; then
ln -sf ../../${P}-build/SU2_CFD/src/SU2_CFD_AD SU2_PY/SU2_CFD_AD || die
ln -sf ../../${P}-build/SU2_DOT/src/SU2_DOT_AD SU2_PY/SU2_DOT_AD || die
ln -sf ../../${P}-build/SU2_PY/pySU2/pysu2ad.py SU2_PY/pysu2ad.py || die
ln -sf ../../${P}-build/SU2_PY/pySU2/_pysu2ad.so SU2_PY/_pysu2ad.so || die
if use directdiff ; then
ln -sf ../../${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}"
export PATH="${PATH}:${SU2_RUN}"
export PYTHONPATH="${PYTHONPATH}:${SU2_RUN}"
if use autodiff ; then
einfo "Running UnitTests ..."
../${P}-build/UnitTests/test_driver_AD || die
../${P}-build/UnitTests/test_driver_DD || die
# else
## Failed for SU2-7.5.1 with error:
## application called MPI_Abort(MPI_COMM_WORLD, 1) - process 0
## [unset]: write_line error; fd=-1 buf=:cmd=abort exitcode=1
## system msg for write_line failure : Bad file descriptor
# ../${P}-build/UnitTests/test_driver || die
fi
pushd TestCases/ || die
# Currently Tests always use mpi.
# Description on the page https://su2code.github.io/docs/Test-Cases/ states:
# "Note: While many of the cases are used for regression testing, the test case suite
# is provided without any guarantees on performance or expected results.
# Tutorials (which are more thoroughly checked for convergence and results) can be found here."
# Therefore bundled parmetis/metis are used otherwise it results in numerous Tutorials tests failures.
if use mpi ; then
# Running Tutorials tests is preferred than TestCases
if use tutorials ; then
${EPYTHON} tutorials.py || die
fi
if use autodiff ; then
${EPYTHON} parallel_regression_AD.py || die
fi
${EPYTHON} parallel_regression.py || die
else
if use autodiff ; then
${EPYTHON} serial_regression_AD.py || die
fi
${EPYTHON} serial_regression.py || die
fi
popd || die
}
src_install() {
DESTDIR="${D}" meson_src_install
mkdir -p "${D}$(python_get_sitedir)/SU2_PY" || die
if use python; then
mv "${ED}"/usr/bin/*.so -t "${D}$(python_get_sitedir)/SU2_PY" || die
fi
mv "${ED}"/usr/bin/{FSI_tools,SU2,SU2_Nastran} -t "${D}$(python_get_sitedir)" || die
mv "${ED}"/usr/bin/*.py -t "${D}$(python_get_sitedir)/SU2_PY" || die
python_optimize "${D}/$(python_get_sitedir)"
if use tutorials ; then
insinto "/usr/share/${PN}"
doins -r Tutorials
fi
local SU2_RUN="$(python_get_sitedir)/SU2_PY"
echo SU2_RUN="${SU2_RUN}" > 99SU2
echo PATH="${SU2_RUN}" >> 99SU2
echo PYTHONPATH="${SU2_RUN}" >> 99SU2
doenvd 99SU2
}
|