(git:374b731)
Loading...
Searching...
No Matches
pexsi_interface.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Interface to the PEXSI library, providing wrappers for all PEXSI
10!> routines that are called inside CP2K. Requires PEXSI version 0.10.x.
11!> \par History
12!> 2014.12 created [Patrick Seewald]
13!> \author Patrick Seewald
14! **************************************************************************************************
16
17#if defined(__LIBPEXSI)
18 USE f_ppexsi_interface, ONLY: f_ppexsi_dft_driver, &
19 f_ppexsi_load_real_hs_matrix, &
20 f_ppexsi_options, &
21 f_ppexsi_plan_finalize, &
22 f_ppexsi_plan_initialize, &
23 f_ppexsi_retrieve_real_dft_matrix, &
24 f_ppexsi_set_default_options
25#endif
26#if defined(__HAS_IEEE_EXCEPTIONS)
27 USE ieee_exceptions, ONLY: ieee_get_halting_mode, &
28 ieee_set_halting_mode, &
29 ieee_all
30#endif
31 USE kinds, ONLY: int_8, &
32 real_8
33 USE iso_c_binding, ONLY: c_intptr_t
35#include "./base/base_uses.f90"
36
37 IMPLICIT NONE
38
39 PRIVATE
40
41 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pexsi_interface'
42
47
49 PRIVATE
50#if defined(__LIBPEXSI)
51 TYPE(f_ppexsi_options) :: options
52#else
53 INTEGER :: unused = -1
54#endif
55 END TYPE cp_pexsi_options
56
57CONTAINS
58
59! **************************************************************************************************
60!> \brief Set PEXSI internal options
61!> \param pexsi_options ...
62!> \param temperature ...
63!> \param gap ...
64!> \param deltaE ...
65!> \param numPole ...
66!> \param isInertiaCount ...
67!> \param maxPEXSIIter ...
68!> \param muMin0 ...
69!> \param muMax0 ...
70!> \param mu0 ...
71!> \param muInertiaTolerance ...
72!> \param muInertiaExpansion ...
73!> \param muPEXSISafeGuard ...
74!> \param numElectronPEXSITolerance ...
75!> \param matrixType ...
76!> \param isSymbolicFactorize ...
77!> \param ordering ...
78!> \param rowOrdering ...
79!> \param npSymbFact ...
80!> \param verbosity ...
81! **************************************************************************************************
82 SUBROUTINE cp_pexsi_set_options(pexsi_options, temperature, gap, deltaE, numPole, &
83 isInertiaCount, maxPEXSIIter, muMin0, muMax0, mu0, &
84 muInertiaTolerance, muInertiaExpansion, &
85 muPEXSISafeGuard, numElectronPEXSITolerance, &
86 matrixType, isSymbolicFactorize, ordering, rowOrdering, &
87 npSymbFact, verbosity)
88
89 TYPE(cp_pexsi_options), INTENT(INOUT) :: pexsi_options
90 REAL(kind=real_8), INTENT(IN), OPTIONAL :: temperature, gap, deltae
91 INTEGER, INTENT(IN), OPTIONAL :: numpole, isinertiacount, &
92 maxpexsiiter
93 REAL(kind=real_8), INTENT(IN), OPTIONAL :: mumin0, mumax0, mu0, &
94 muinertiatolerance, muinertiaexpansion, mupexsisafeguard, &
95 numelectronpexsitolerance
96 INTEGER, INTENT(IN), OPTIONAL :: matrixtype, &
97 issymbolicfactorize, &
98 ordering, rowordering, npsymbfact, &
99 verbosity
100
101#if defined(__LIBPEXSI)
102 IF (PRESENT(temperature)) pexsi_options%options%temperature = temperature
103 IF (PRESENT(gap)) pexsi_options%options%gap = gap
104 IF (PRESENT(deltae)) pexsi_options%options%deltaE = deltae
105 IF (PRESENT(numpole)) pexsi_options%options%numPole = numpole
106 IF (PRESENT(isinertiacount)) pexsi_options%options%isInertiaCount = isinertiacount
107 IF (PRESENT(maxpexsiiter)) pexsi_options%options%maxPEXSIIter = maxpexsiiter
108 IF (PRESENT(mumin0)) pexsi_options%options%muMin0 = mumin0
109 IF (PRESENT(mumax0)) pexsi_options%options%muMax0 = mumax0
110 IF (PRESENT(mu0)) pexsi_options%options%mu0 = mu0
111 IF (PRESENT(muinertiatolerance)) &
112 pexsi_options%options%muInertiaTolerance = muinertiatolerance
113 IF (PRESENT(muinertiaexpansion)) &
114 pexsi_options%options%muInertiaExpansion = muinertiaexpansion
115 IF (PRESENT(mupexsisafeguard)) &
116 pexsi_options%options%muPEXSISafeGuard = mupexsisafeguard
117 IF (PRESENT(numelectronpexsitolerance)) &
118 pexsi_options%options%numElectronPEXSITolerance = numelectronpexsitolerance
119 IF (PRESENT(matrixtype)) pexsi_options%options%matrixType = matrixtype
120 IF (PRESENT(issymbolicfactorize)) &
121 pexsi_options%options%isSymbolicFactorize = issymbolicfactorize
122 IF (PRESENT(ordering)) pexsi_options%options%ordering = ordering
123 IF (PRESENT(rowordering)) pexsi_options%options%rowOrdering = rowordering
124 IF (PRESENT(npsymbfact)) pexsi_options%options%npSymbFact = npsymbfact
125 IF (PRESENT(verbosity)) pexsi_options%options%verbosity = verbosity
126#else
127 mark_used(pexsi_options)
128 mark_used(temperature)
129 mark_used(gap)
130 mark_used(deltae)
131 mark_used(numpole)
132 mark_used(isinertiacount)
133 mark_used(maxpexsiiter)
134 mark_used(mumin0)
135 mark_used(mumax0)
136 mark_used(mu0)
137 mark_used(muinertiatolerance)
138 mark_used(muinertiaexpansion)
139 mark_used(mupexsisafeguard)
140 mark_used(numelectronpexsitolerance)
141 mark_used(matrixtype)
142 mark_used(issymbolicfactorize)
143 mark_used(ordering)
144 mark_used(rowordering)
145 mark_used(npsymbfact)
146 mark_used(verbosity)
147 cpabort("Requires linking to the PEXSI library.")
148#endif
149
150 ! Additional PEXSI parameters and their defaults not made available here
151 ! because CP2K should always use PEXSI's defaults:
152 ! isConstructCommPattern (=?, pexsi does not even use it)
153 ! symmetric (=1)
154 ! transpose (=0)
155 END SUBROUTINE cp_pexsi_set_options
156
157! **************************************************************************************************
158!> \brief Access PEXSI internal options
159!> \param pexsi_options ...
160!> \param temperature ...
161!> \param gap ...
162!> \param deltaE ...
163!> \param numPole ...
164!> \param isInertiaCount ...
165!> \param maxPEXSIIter ...
166!> \param muMin0 ...
167!> \param muMax0 ...
168!> \param mu0 ...
169!> \param muInertiaTolerance ...
170!> \param muInertiaExpansion ...
171!> \param muPEXSISafeGuard ...
172!> \param numElectronPEXSITolerance ...
173!> \param matrixType ...
174!> \param isSymbolicFactorize ...
175!> \param ordering ...
176!> \param rowOrdering ...
177!> \param npSymbFact ...
178!> \param verbosity ...
179! **************************************************************************************************
180 SUBROUTINE cp_pexsi_get_options(pexsi_options, temperature, gap, deltaE, numPole, &
181 isInertiaCount, maxPEXSIIter, muMin0, muMax0, mu0, &
182 muInertiaTolerance, muInertiaExpansion, &
183 muPEXSISafeGuard, numElectronPEXSITolerance, &
184 matrixType, isSymbolicFactorize, ordering, rowOrdering, &
185 npSymbFact, verbosity)
186 TYPE(cp_pexsi_options), INTENT(IN) :: pexsi_options
187 REAL(kind=real_8), INTENT(OUT), OPTIONAL :: temperature, gap, deltae
188 INTEGER, INTENT(OUT), OPTIONAL :: numpole, isinertiacount, &
189 maxpexsiiter
190 REAL(kind=real_8), INTENT(OUT), OPTIONAL :: mumin0, mumax0, mu0, &
191 muinertiatolerance, muinertiaexpansion, mupexsisafeguard, &
192 numelectronpexsitolerance
193 INTEGER, INTENT(OUT), OPTIONAL :: matrixtype, &
194 issymbolicfactorize, &
195 ordering, rowordering, npsymbfact, &
196 verbosity
197
198#if defined(__LIBPEXSI)
199 IF (PRESENT(temperature)) temperature = pexsi_options%options%temperature
200 IF (PRESENT(gap)) gap = pexsi_options%options%gap
201 IF (PRESENT(deltae)) deltae = pexsi_options%options%deltaE
202 IF (PRESENT(numpole)) numpole = pexsi_options%options%numPole
203 IF (PRESENT(isinertiacount)) isinertiacount = pexsi_options%options%isInertiaCount
204 IF (PRESENT(maxpexsiiter)) maxpexsiiter = pexsi_options%options%maxPEXSIIter
205 IF (PRESENT(mumin0)) mumin0 = pexsi_options%options%muMin0
206 IF (PRESENT(mumax0)) mumax0 = pexsi_options%options%muMax0
207 IF (PRESENT(mu0)) mu0 = pexsi_options%options%mu0
208 IF (PRESENT(muinertiatolerance)) &
209 muinertiatolerance = pexsi_options%options%muInertiaTolerance
210 IF (PRESENT(muinertiaexpansion)) &
211 muinertiaexpansion = pexsi_options%options%muInertiaExpansion
212 IF (PRESENT(mupexsisafeguard)) &
213 mupexsisafeguard = pexsi_options%options%muPEXSISafeGuard
214 IF (PRESENT(numelectronpexsitolerance)) &
215 numelectronpexsitolerance = pexsi_options%options%numElectronPEXSITolerance
216 IF (PRESENT(matrixtype)) matrixtype = pexsi_options%options%matrixType
217 IF (PRESENT(issymbolicfactorize)) &
218 issymbolicfactorize = pexsi_options%options%isSymbolicFactorize
219 IF (PRESENT(ordering)) ordering = pexsi_options%options%ordering
220 IF (PRESENT(rowordering)) rowordering = pexsi_options%options%rowOrdering
221 IF (PRESENT(npsymbfact)) npsymbfact = pexsi_options%options%npSymbFact
222 IF (PRESENT(verbosity)) verbosity = pexsi_options%options%verbosity
223#else
224 mark_used(pexsi_options)
225 ! assign intent-out arguments to silence compiler warnings
226 IF (PRESENT(temperature)) temperature = 0.0_real_8
227 IF (PRESENT(gap)) gap = 0.0_real_8
228 IF (PRESENT(deltae)) deltae = 0.0_real_8
229 IF (PRESENT(numpole)) numpole = -1
230 IF (PRESENT(isinertiacount)) isinertiacount = -1
231 IF (PRESENT(maxpexsiiter)) maxpexsiiter = -1
232 IF (PRESENT(mumin0)) mumin0 = 0.0_real_8
233 IF (PRESENT(mumax0)) mumax0 = 0.0_real_8
234 IF (PRESENT(mu0)) mu0 = 0.0_real_8
235 IF (PRESENT(muinertiatolerance)) muinertiatolerance = 0.0_real_8
236 IF (PRESENT(muinertiaexpansion)) muinertiaexpansion = 0.0_real_8
237 IF (PRESENT(mupexsisafeguard)) mupexsisafeguard = 0.0_real_8
238 IF (PRESENT(numelectronpexsitolerance)) numelectronpexsitolerance = 0.0_real_8
239 IF (PRESENT(matrixtype)) matrixtype = -1
240 IF (PRESENT(issymbolicfactorize)) issymbolicfactorize = -1
241 IF (PRESENT(ordering)) ordering = -1
242 IF (PRESENT(rowordering)) rowordering = -1
243 IF (PRESENT(npsymbfact)) npsymbfact = -1
244 IF (PRESENT(verbosity)) verbosity = -1
245 cpabort("Requires linking to the PEXSI library.")
246#endif
247 END SUBROUTINE cp_pexsi_get_options
248
249! **************************************************************************************************
250!> \brief ...
251!> \param pexsi_options ...
252! **************************************************************************************************
253 SUBROUTINE cp_pexsi_set_default_options(pexsi_options)
254 TYPE(cp_pexsi_options), INTENT(OUT) :: pexsi_options
255
256#if defined(__LIBPEXSI)
257 CALL f_ppexsi_set_default_options(pexsi_options%options)
258#else
259 cpabort("Requires linking to the PEXSI library.")
260#endif
261 END SUBROUTINE cp_pexsi_set_default_options
262
263! **************************************************************************************************
264!> \brief ...
265!> \param comm ...
266!> \param numProcRow ...
267!> \param numProcCol ...
268!> \param outputFileIndex ...
269!> \return ...
270! **************************************************************************************************
271 FUNCTION cp_pexsi_plan_initialize(comm, numProcRow, numProcCol, outputFileIndex)
272 TYPE(mp_comm_type), INTENT(IN) :: comm
273 INTEGER, INTENT(IN) :: numprocrow, numproccol, &
274 outputfileindex
275 INTEGER(KIND=C_INTPTR_T) :: cp_pexsi_plan_initialize
276
277#if defined(__LIBPEXSI)
278 CHARACTER(LEN=*), PARAMETER :: routinen = 'cp_pexsi_plan_initialize'
279 INTEGER :: info, handle
280
281 CALL timeset(routinen, handle)
282 cp_pexsi_plan_initialize = f_ppexsi_plan_initialize(comm%get_handle(), numprocrow, &
283 numproccol, outputfileindex, info)
284 IF (info .NE. 0) &
285 cpabort("Pexsi returned an error. Consider logPEXSI0 for details.")
286 CALL timestop(handle)
287#else
288 mark_used(comm)
289 mark_used(numprocrow)
290 mark_used(numproccol)
291 mark_used(outputfileindex)
293 cpabort("Requires linking to the PEXSI library.")
294#endif
295 END FUNCTION cp_pexsi_plan_initialize
296
297! **************************************************************************************************
298!> \brief ...
299!> \param plan ...
300!> \param pexsi_options ...
301!> \param nrows ...
302!> \param nnz ...
303!> \param nnzLocal ...
304!> \param numColLocal ...
305!> \param colptrLocal ...
306!> \param rowindLocal ...
307!> \param HnzvalLocal ...
308!> \param isSIdentity ...
309!> \param SnzvalLocal ...
310! **************************************************************************************************
311 SUBROUTINE cp_pexsi_load_real_hs_matrix(plan, pexsi_options, nrows, nnz, &
312 nnzLocal, numColLocal, colptrLocal, &
313 rowindLocal, HnzvalLocal, isSIdentity, &
314 SnzvalLocal)
315 INTEGER(KIND=C_INTPTR_T), INTENT(IN) :: plan
316 TYPE(cp_pexsi_options), INTENT(IN) :: pexsi_options
317 INTEGER, INTENT(IN) :: nrows, nnz, nnzlocal, &
318 numcollocal, colptrlocal(*), &
319 rowindlocal(*)
320 REAL(kind=real_8), INTENT(IN) :: hnzvallocal(*)
321 INTEGER, INTENT(IN) :: issidentity
322 REAL(kind=real_8), INTENT(IN) :: snzvallocal(*)
323
324#if defined(__LIBPEXSI)
325 CHARACTER(LEN=*), PARAMETER :: routinen = 'cp_pexsi_load_real_symmetric_hs_matrix'
326 INTEGER :: handle, info
327
328 CALL timeset(routinen, handle)
329 CALL f_ppexsi_load_real_hs_matrix(plan, pexsi_options%options, nrows, nnz, nnzlocal, &
330 numcollocal, colptrlocal, rowindlocal, &
331 hnzvallocal, issidentity, snzvallocal, info)
332 IF (info .NE. 0) &
333 cpabort("Pexsi returned an error. Consider logPEXSI0 for details.")
334 CALL timestop(handle)
335#else
336 mark_used(plan)
337 mark_used(pexsi_options)
338 mark_used(nrows)
339 mark_used(nnz)
340 mark_used(nnzlocal)
341 mark_used(numcollocal)
342 mark_used(issidentity)
343 cpabort("Requires linking to the PEXSI library.")
344
345 ! MARK_USED macro does not work on assumed shape variables
346 IF (.false.) then; DO
347 IF (colptrlocal(1) > rowindlocal(1) .OR. hnzvallocal(1) > snzvallocal(1)) EXIT
348 END do; END IF
349#endif
350 END SUBROUTINE cp_pexsi_load_real_hs_matrix
351
352! **************************************************************************************************
353!> \brief ...
354!> \param plan ...
355!> \param pexsi_options ...
356!> \param numElectronExact ...
357!> \param muPEXSI ...
358!> \param numElectronPEXSI ...
359!> \param muMinInertia ...
360!> \param muMaxInertia ...
361!> \param numTotalInertiaIter ...
362!> \param numTotalPEXSIIter ...
363! **************************************************************************************************
364 SUBROUTINE cp_pexsi_dft_driver(plan, pexsi_options, numElectronExact, muPEXSI, &
365 numElectronPEXSI, muMinInertia, muMaxInertia, &
366 numTotalInertiaIter, numTotalPEXSIIter)
367 INTEGER(KIND=C_INTPTR_T), INTENT(IN) :: plan
368 TYPE(cp_pexsi_options), INTENT(IN) :: pexsi_options
369 REAL(kind=real_8), INTENT(IN) :: numelectronexact
370 REAL(kind=real_8), INTENT(out) :: mupexsi, numelectronpexsi, &
371 mumininertia, mumaxinertia
372 INTEGER, INTENT(out) :: numtotalinertiaiter, &
373 numtotalpexsiiter
374
375#if defined(__LIBPEXSI)
376 CHARACTER(LEN=*), PARAMETER :: routinen = 'cp_pexsi_dft_driver'
377 INTEGER :: handle, info
378#if defined(__HAS_IEEE_EXCEPTIONS)
379 LOGICAL, DIMENSION(5) :: halt
380#endif
381
382 CALL timeset(routinen, handle)
383
384 ! Unfortuntatelly, some PEXSI kernels raise IEEE754 exceptions.
385 ! Therefore, we disable floating point traps temporarily.
386#if defined(__HAS_IEEE_EXCEPTIONS)
387 CALL ieee_get_halting_mode(ieee_all, halt)
388 CALL ieee_set_halting_mode(ieee_all, .false.)
389#endif
390
391 CALL f_ppexsi_dft_driver(plan, pexsi_options%options, numelectronexact, mupexsi, &
392 numelectronpexsi, mumininertia, mumaxinertia, &
393 numtotalinertiaiter, numtotalpexsiiter, info)
394
395#if defined(__HAS_IEEE_EXCEPTIONS)
396 CALL ieee_set_halting_mode(ieee_all, halt)
397#endif
398
399 IF (info .NE. 0) &
400 cpabort("Pexsi returned an error. Consider logPEXSI0 for details.")
401 CALL timestop(handle)
402#else
403 mark_used(plan)
404 mark_used(numelectronexact)
405 mark_used(pexsi_options)
406 ! assign intent-out arguments to silence compiler warnings
407 mupexsi = 0.0_real_8
408 numelectronpexsi = 0.0_real_8
409 mumininertia = 0.0_real_8
410 mumaxinertia = 0.0_real_8
411 numtotalinertiaiter = -1
412 numtotalpexsiiter = -1
413 cpabort("Requires linking to the PEXSI library.")
414#endif
415 END SUBROUTINE cp_pexsi_dft_driver
416
417! **************************************************************************************************
418!> \brief ...
419!> \param plan ...
420!> \param DMnzvalLocal ...
421!> \param EDMnzvalLocal ...
422!> \param FDMnzvalLocal ...
423!> \param totalEnergyH ...
424!> \param totalEnergyS ...
425!> \param totalFreeEnergy ...
426! **************************************************************************************************
427 SUBROUTINE cp_pexsi_retrieve_real_dft_matrix(plan, DMnzvalLocal, EDMnzvalLocal, &
428 FDMnzvalLocal, totalEnergyH, &
429 totalEnergyS, totalFreeEnergy)
430 INTEGER(KIND=C_INTPTR_T), INTENT(IN) :: plan
431 REAL(kind=real_8), INTENT(out) :: dmnzvallocal(*), edmnzvallocal(*), &
432 fdmnzvallocal(*), totalenergyh, totalenergys, &
433 totalfreeenergy
434
435#if defined(__LIBPEXSI)
436 CHARACTER(LEN=*), PARAMETER :: routinen = 'cp_pexsi_retrieve_real_symmetric_dft_matrix'
437 INTEGER :: handle, info
438
439 CALL timeset(routinen, handle)
440 CALL f_ppexsi_retrieve_real_dft_matrix(plan, dmnzvallocal, edmnzvallocal, &
441 fdmnzvallocal, totalenergyh, &
442 totalenergys, totalfreeenergy, info)
443 IF (info .NE. 0) &
444 cpabort("Pexsi returned an error. Consider logPEXSI0 for details.")
445 CALL timestop(handle)
446#else
447 mark_used(plan)
448 ! assign intent-out arguments to silence compiler warnings
449 dmnzvallocal(1) = 0.0_real_8
450 edmnzvallocal(1) = 0.0_real_8
451 fdmnzvallocal(1) = 0.0_real_8
452 totalenergyh = 0.0_real_8
453 totalenergys = 0.0_real_8
454 totalfreeenergy = 0.0_real_8
455
456 cpabort("Requires linking to the PEXSI library.")
457#endif
459
460! **************************************************************************************************
461!> \brief ...
462!> \param plan ...
463! **************************************************************************************************
464 SUBROUTINE cp_pexsi_plan_finalize(plan)
465 INTEGER(KIND=C_INTPTR_T), INTENT(IN) :: plan
466
467#if defined(__LIBPEXSI)
468 CHARACTER(LEN=*), PARAMETER :: routinen = 'cp_pexsi_plan_finalize'
469 INTEGER :: info, handle
470
471 CALL timeset(routinen, handle)
472 CALL f_ppexsi_plan_finalize(plan, info)
473 IF (info .NE. 0) &
474 cpabort("Pexsi returned an error. Consider logPEXSI0 for details.")
475 CALL timestop(handle)
476#else
477 mark_used(plan)
478 cpabort("Requires linking to the PEXSI library.")
479#endif
480 END SUBROUTINE
481
482END MODULE pexsi_interface
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public int_8
Definition kinds.F:54
integer, parameter, public real_8
Definition kinds.F:41
Interface to the message passing library MPI.
Interface to the PEXSI library, providing wrappers for all PEXSI routines that are called inside CP2K...
subroutine, public cp_pexsi_set_options(pexsi_options, temperature, gap, deltae, numpole, isinertiacount, maxpexsiiter, mumin0, mumax0, mu0, muinertiatolerance, muinertiaexpansion, mupexsisafeguard, numelectronpexsitolerance, matrixtype, issymbolicfactorize, ordering, rowordering, npsymbfact, verbosity)
Set PEXSI internal options.
subroutine, public cp_pexsi_retrieve_real_dft_matrix(plan, dmnzvallocal, edmnzvallocal, fdmnzvallocal, totalenergyh, totalenergys, totalfreeenergy)
...
subroutine, public cp_pexsi_get_options(pexsi_options, temperature, gap, deltae, numpole, isinertiacount, maxpexsiiter, mumin0, mumax0, mu0, muinertiatolerance, muinertiaexpansion, mupexsisafeguard, numelectronpexsitolerance, matrixtype, issymbolicfactorize, ordering, rowordering, npsymbfact, verbosity)
Access PEXSI internal options.
subroutine, public cp_pexsi_plan_finalize(plan)
...
subroutine, public cp_pexsi_load_real_hs_matrix(plan, pexsi_options, nrows, nnz, nnzlocal, numcollocal, colptrlocal, rowindlocal, hnzvallocal, issidentity, snzvallocal)
...
subroutine, public cp_pexsi_set_default_options(pexsi_options)
...
integer(kind=c_intptr_t) function, public cp_pexsi_plan_initialize(comm, numprocrow, numproccol, outputfileindex)
...
subroutine, public cp_pexsi_dft_driver(plan, pexsi_options, numelectronexact, mupexsi, numelectronpexsi, mumininertia, mumaxinertia, numtotalinertiaiter, numtotalpexsiiter)
...