Peano
Loading...
Searching...
No Matches
LoopBodies.h
Go to the documentation of this file.
1// This file is part of the ExaHyPE2 project. For conditions of distribution and
2// use, please see the copyright notice at www.peano-framework.org
3#pragma once
4
7#include "exahype2/Solver.h"
8#include "Functors.h"
12
74 template <class QInEnumeratorType, class QOutEnumeratorType>
76 const double* __restrict__ QIn,
77 const QInEnumeratorType& QInEnumerator,
78 int patchIndex,
79 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
80 int unknown,
81 double* __restrict__ QOut,
82 const QOutEnumeratorType& QOutEnumerator
83 ) InlineMethod {
84 QOut[QOutEnumerator(patchIndex, volumeIndex, unknown)] = QIn[QInEnumerator(patchIndex, volumeIndex, unknown)];
85 };
86
87
113 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables, class QInEnumeratorType, class QOutEnumeratorType>
115 const double* __restrict__ QIn,
116 const QInEnumeratorType& QInEnumerator,
117 const SourceFunctor& sourceFunctor,
118 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
119 const ::tarch::la::Vector<Dimensions, double>& patchSize,
120 int patchIndex,
121 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
122 double t,
123 double dt,
124 double* __restrict__ QOut,
125 const QOutEnumeratorType& QOutEnumerator
126 ) InlineMethod;
127
128
141 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables>
143 const double* __restrict__ QIn,
144 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
145 const SourceFunctor& sourceFunctor,
146 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
147 const ::tarch::la::Vector<Dimensions, double>& patchSize,
148 int patchIndex,
149 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
150 double t,
151 double dt,
152 double* __restrict__ QOut,
153 const enumerator::AoSLexicographicEnumerator& QOutEnumerator
154 ) InlineMethod;
155
156
160#pragma omp declare simd
161 template <class SolverType, class QInEnumeratorType, class QOutEnumeratorType>
163 const double* __restrict__ QIn,
164 const QInEnumeratorType& QInEnumerator,
165 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
166 const ::tarch::la::Vector<Dimensions, double>& patchSize,
167 int patchIndex,
168 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
169 double t,
170 double dt,
171 double* __restrict__ QOut,
172 const QOutEnumeratorType& QOutEnumerator
173 ) InlineMethod;
174
175
179#pragma omp declare simd
180 template <class SolverType>
182 const double* __restrict__ QIn,
183 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
184 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
185 const ::tarch::la::Vector<Dimensions, double>& patchSize,
186 int patchIndex,
187 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
188 double t,
189 double dt,
190 double* __restrict__ QOut,
191 const enumerator::AoSLexicographicEnumerator& QOutEnumerator
192 ) InlineMethod;
193
194
212 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables, class QInEnumeratorType, class MaxEigenvalueEnumeratorType>
214 const double* __restrict__ QIn,
215 const QInEnumeratorType& QInEnumerator,
216 const MaxEigenvalueFunctor& maxEigenvalueFunctor,
217 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
218 const ::tarch::la::Vector<Dimensions, double>& patchSize,
219 int patchIndex,
220 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
221 double t,
222 double dt,
223 int normal,
224 double* __restrict__ maxEigenvalue,
225 const MaxEigenvalueEnumeratorType& maxEigenvalueEnumerator
226 ) InlineMethod;
227
228
233 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables>
235 const double* __restrict__ QIn,
236 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
237 const MaxEigenvalueFunctor& maxEigenvalueFunctor,
238 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
239 const ::tarch::la::Vector<Dimensions, double>& patchSize,
240 int patchIndex,
241 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
242 double t,
243 double dt,
244 int normal,
245 double* __restrict__ maxEigenvalue,
246 const enumerator::AoSLexicographicEnumerator& maxEigenvalueEnumerator
247 ) InlineMethod;
248
249
253#pragma omp declare simd
254 template <class SolverType, class QInEnumeratorType, class MaxEigenvalueEnumeratorType>
256 const double* __restrict__ QIn,
257 const QInEnumeratorType& QInEnumerator,
258 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
259 const ::tarch::la::Vector<Dimensions, double>& patchSize,
260 int patchIndex,
261 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
262 double t,
263 double dt,
264 int normal,
265 double* __restrict__ maxEigenvalue,
266 const MaxEigenvalueEnumeratorType& maxEigenvalueEnumerator
267 ) InlineMethod;
268
269
273#pragma omp declare simd
274 template <class SolverType, class MaxEigenvalueEnumeratorType>
276 const double* __restrict__ QIn,
277 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
278 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
279 const ::tarch::la::Vector<Dimensions, double>& patchSize,
280 int patchIndex,
281 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
282 double t,
283 double dt,
284 int normal,
285 double* __restrict__ maxEigenvalue,
286 const MaxEigenvalueEnumeratorType& maxEigenvalueEnumerator
287 ) InlineMethod;
288
289
301 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables, class QOutEnumeratorType>
303 const double* __restrict__ QOut,
304 const QOutEnumeratorType& QOutEnumerator,
305 const MaxEigenvalueFunctor& maxEigenvalueFunctor,
306 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
307 const ::tarch::la::Vector<Dimensions, double>& patchSize,
308 int patchIndex,
309 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
310 double t,
311 double dt
312 ) InlineMethod;
313
314
320 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables>
322 const double* __restrict__ QOut,
323 const enumerator::AoSLexicographicEnumerator& QOutEnumerator,
324 const MaxEigenvalueFunctor& maxEigenvalueFunctor,
325 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
326 const ::tarch::la::Vector<Dimensions, double>& patchSize,
327 int patchIndex,
328 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
329 double t,
330 double dt
331 ) InlineMethod;
332
333
337#pragma omp declare simd
338 template <class SolverType, class QOutEnumeratorType>
340 const double* __restrict__ QOut,
341 const QOutEnumeratorType& QOutEnumerator,
342 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
343 const ::tarch::la::Vector<Dimensions, double>& patchSize,
344 int patchIndex,
345 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
346 double t,
347 double dt
348 ) InlineMethod;
349
350
357#pragma omp declare simd
358 template <class SolverType>
360 const double* __restrict__ QOut,
361 const enumerator::AoSLexicographicEnumerator& QOutEnumerator,
362 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
363 const ::tarch::la::Vector<Dimensions, double>& patchSize,
364 int patchIndex,
365 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
366 double t,
367 double dt
368 ) InlineMethod;
369
370
378#pragma omp declare simd
379 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables, class QInEnumeratorType, class FluxEnumeratorType>
381 const double* __restrict__ QIn,
382 const QInEnumeratorType& QInEnumerator,
383 const FluxFunctor& fluxFunctor,
384 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
385 const ::tarch::la::Vector<Dimensions, double>& patchSize,
386 int patchIndex,
387 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
388 double t,
389 double dt,
390 int normal,
391 double* __restrict__ flux,
392 const FluxEnumeratorType& fluxEnumerator
393 ) InlineMethod;
394
395
396#pragma omp declare simd
397 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables>
399 const double* __restrict__ QIn,
400 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
401 const FluxFunctor& fluxFunctor,
402 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
403 const ::tarch::la::Vector<Dimensions, double>& patchSize,
404 int patchIndex,
405 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
406 double t,
407 double dt,
408 int normal,
409 double* __restrict__ flux,
410 const enumerator::AoSLexicographicEnumerator& fluxEnumerator
411 ) InlineMethod;
412
413
417#pragma omp declare simd
418 template <class SolverType, class QInEnumeratorType, class FluxEnumeratorType>
420 const double* __restrict__ QIn,
421 const QInEnumeratorType& QInEnumerator,
422 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
423 const ::tarch::la::Vector<Dimensions, double>& patchSize,
424 int patchIndex,
425 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
426 double t,
427 double dt,
428 int normal,
429 double* __restrict__ flux,
430 const FluxEnumeratorType& fluxEnumerator
431 ) InlineMethod;
432
433
434#pragma omp declare simd
435 template <class SolverType, class FluxEnumeratorType>
437 const double* __restrict__ QIn,
438 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
439 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
440 const ::tarch::la::Vector<Dimensions, double>& patchSize,
441 int patchIndex,
442 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
443 double t,
444 double dt,
445 int normal,
446 double* __restrict__ flux,
447 const FluxEnumeratorType& fluxEnumerator
448 ) InlineMethod;
449
450
451#pragma omp declare simd
452 template <class SolverType>
454 const double* __restrict__ QIn,
455 const enumerator::AoSLexicographicEnumerator& QInEnumerator,
456 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
457 const ::tarch::la::Vector<Dimensions, double>& patchSize,
458 int patchIndex,
459 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
460 double t,
461 double dt,
462 int normal,
463 double* __restrict__ flux,
464 const enumerator::AoSLexicographicEnumerator& fluxEnumerator
465 ) InlineMethod;
466
467
476#pragma omp declare simd
477 template <class FluxEnumeratorType, class QOutEnumeratorType>
479 const double* __restrict__ tempFluxX,
480 const double* __restrict__ tempFluxY,
481 const double* __restrict__ tempFluxZ,
482 const FluxEnumeratorType& fluxEnumerator,
483 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
484 const ::tarch::la::Vector<Dimensions, double>& patchSize,
485 int patchIndex,
486 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
487 int unknown,
488 double dt,
489 double* __restrict__ QOut,
490 const QOutEnumeratorType& QOutEnumerator
491 ) InlineMethod;
492
493
504#pragma omp declare simd
505 template <class FluxEnumeratorType, class QOutEnumeratorType>
507 const double* __restrict__ fluxL,
508 const double* __restrict__ fluxR,
509 const FluxEnumeratorType& fluxEnumerator,
510 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
511 const ::tarch::la::Vector<Dimensions, double>& patchSize,
512 int patchIndex,
513 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
514 int unknown,
515 double dt,
516 int normal,
517 double* __restrict__ QOut,
518 const QOutEnumeratorType& QOutEnumerator
519 ) InlineMethod;
520
521
552#pragma omp declare simd
553 template <class QInEnumeratorType, class MaxEigenvalueEnumeratorType, class QOutEnumeratorType>
555 const double* __restrict__ QIn,
556 const QInEnumeratorType& QInEnumerator,
557 const double* __restrict__ tempMaxEigenvalueX,
558 const double* __restrict__ tempMaxEigenvalueY,
559 const double* __restrict__ tempMaxEigenvalueZ,
560 const MaxEigenvalueEnumeratorType& eigenvalueEnumerator,
561 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
562 const ::tarch::la::Vector<Dimensions, double>& patchSize,
563 int patchIndex,
564 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
565 int unknown,
566 double dt,
567 double* __restrict__ QOut,
568 const QOutEnumeratorType& QOutEnumerator
569 ) InlineMethod;
570
571
576#pragma omp declare simd
577 template <class QInEnumeratorType, class QOutEnumeratorType>
579 const double* __restrict__ QIn,
580 const QInEnumeratorType& QInEnumerator,
581 double maxEigenvalueL,
582 double maxEigenvalueR,
583 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
584 const ::tarch::la::Vector<Dimensions, double>& patchSize,
585 int patchIndex,
586 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
587 int unknown,
588 double dt,
589 int normal,
590 double* __restrict__ QOut,
591 const QOutEnumeratorType& QOutEnumerator
592 ) InlineMethod;
593
594
617 template <int NumberOfUnknowns, int NumberOfAuxiliaryVariables, class QInEnumeratorType, class NCPFaceEnumeratorType>
619 const double* __restrict__ QIn,
620 const QInEnumeratorType& QInEnumerator,
621 const NonconservativeProductFunctor& ncpFunctor,
622 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
623 const ::tarch::la::Vector<Dimensions, double>& patchSize,
624 int patchIndex,
625 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
626 double t,
627 double dt,
628 int normal,
629 double* __restrict__ ncp,
630 const NCPFaceEnumeratorType& ncpEnumerator
631 ) InlineMethod;
632
633
637#pragma omp declare simd
638 template <class SolverType, class QInEnumeratorType, class NCPFaceEnumeratorType>
640 const double* __restrict__ QIn,
641 const QInEnumeratorType& QInEnumerator,
642 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
643 const ::tarch::la::Vector<Dimensions, double>& patchSize,
644 int patchIndex,
645 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
646 double t,
647 double dt,
648 int normal,
649 double* __restrict__ ncp,
650 const NCPFaceEnumeratorType& ncpEnumerator
651 ) InlineMethod;
652
653
716#pragma omp declare simd
717 template <class NCPFaceEnumeratorType, class QOutEnumeratorType>
719 const double* __restrict__ ncpX,
720 const double* __restrict__ ncpY,
721 const double* __restrict__ ncpZ,
722 const NCPFaceEnumeratorType& ncpEnumerator,
723 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
724 const ::tarch::la::Vector<Dimensions, double>& patchSize,
725 int patchIndex,
726 const ::tarch::la::Vector<Dimensions, int>& volumeIndex,
727 int unknown,
728 double dt,
729 double* __restrict__ QOut,
730 const QOutEnumeratorType& QOutEnumerator
731 ) InlineMethod;
732
733
742#pragma omp declare simd
743 template <class NCPFaceEnumeratorType, class QOutEnumeratorType>
745 const double* __restrict__ ncp,
746 const NCPFaceEnumeratorType& ncpEnumerator,
747 const ::tarch::la::Vector<Dimensions, double>& patchCentre,
748 const ::tarch::la::Vector<Dimensions, double>& patchSize,
749 int patchIndex,
750 const ::tarch::la::Vector<Dimensions, int>& faceIndex,
751 int unknown,
752 double dt,
753 int normal,
754 double* __restrict__ QOut,
755 const QOutEnumeratorType& QOutEnumerator
756 ) InlineMethod;
757} // namespace exahype2::fv::rusanov::loopbodies
758
759#include "LoopBodies.cpph"
#define KeywordToAvoidDuplicateSymbolsForInlinedFunctions
Definition LinuxAMD.h:31
#define GPUCallableInlineMethod
Definition accelerator.h:37
KeywordToAvoidDuplicateSymbolsForInlinedFunctions GPUCallableInlineMethod void updateSolutionWithNonconservativeFlux(const double *__restrict__ ncpX, const double *__restrict__ ncpY, const double *__restrict__ ncpZ, const NCPFaceEnumeratorType &ncpEnumerator, const ::tarch::la::Vector< Dimensions, double > &patchCentre, const ::tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, int unknown, double dt, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
Add the non-conservative flux contributions to one volume.
KeywordToAvoidDuplicateSymbolsForInlinedFunctions GPUCallableInlineMethod void copySolution(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, int unknown, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
Copy solution from QIn to QOut.
Definition LoopBodies.h:75
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void computeFlux(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const FluxFunctor &fluxFunctor, const ::tarch::la::Vector< Dimensions, double > &patchCentre, const ::tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, int normal, double *__restrict__ flux, const FluxEnumeratorType &fluxEnumerator) InlineMethod
Compute the flux in one direction for a volume and store it.
KeywordToAvoidDuplicateSymbolsForInlinedFunctions GPUCallableInlineMethod void updateSolutionWithFlux(const double *__restrict__ tempFluxX, const double *__restrict__ tempFluxY, const double *__restrict__ tempFluxZ, const FluxEnumeratorType &fluxEnumerator, const ::tarch::la::Vector< Dimensions, double > &patchCentre, const ::tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, int unknown, double dt, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
Update one volume with the flux contribution.
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void copySolutionAndAddSourceTerm(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const SourceFunctor &sourceFunctor, const ::tarch::la::Vector< Dimensions, double > &patchCentre, const ::tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
Copy previous solution over into new time step and add source term.
KeywordToAvoidDuplicateSymbolsForInlinedFunctions GPUCallableInlineMethod void updateSolutionWithEigenvalueDamping(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const double *__restrict__ tempMaxEigenvalueX, const double *__restrict__ tempMaxEigenvalueY, const double *__restrict__ tempMaxEigenvalueZ, const MaxEigenvalueEnumeratorType &eigenvalueEnumerator, const ::tarch::la::Vector< Dimensions, double > &patchCentre, const ::tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, int unknown, double dt, double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator) InlineMethod
Uses the eigenvalues to damp the solution update.
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void computeNonconservativeFlux(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const NonconservativeProductFunctor &ncpFunctor, const ::tarch::la::Vector< Dimensions, double > &patchCentre, const ::tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, int normal, double *__restrict__ ncp, const NCPFaceEnumeratorType &ncpEnumerator) InlineMethod
Compute non-conservative flux over one face along normal normal.
KeywordToAvoidDuplicateSymbolsForInlinedFunctions void computeMaxEigenvalue(const double *__restrict__ QIn, const QInEnumeratorType &QInEnumerator, const MaxEigenvalueFunctor &maxEigenvalueFunctor, const ::tarch::la::Vector< Dimensions, double > &patchCentre, const ::tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt, int normal, double *__restrict__ maxEigenvalue, const MaxEigenvalueEnumeratorType &maxEigenvalueEnumerator) InlineMethod
Compute maximum eigenvalue for one voxel in one direction.
KeywordToAvoidDuplicateSymbolsForInlinedFunctions double reduceMaxEigenvalue(const double *__restrict__ QOut, const QOutEnumeratorType &QOutEnumerator, const MaxEigenvalueFunctor &maxEigenvalueFunctor, const ::tarch::la::Vector< Dimensions, double > &patchCentre, const ::tarch::la::Vector< Dimensions, double > &patchSize, int patchIndex, const ::tarch::la::Vector< Dimensions, int > &volumeIndex, double t, double dt) InlineMethod
This is the actual eigenvalue loop which reduces the directional eigenvalues.
std::function< void(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, const tarch::la::Vector< Dimensions, double > &h, double t, double dt, double *__restrict__ S) SourceFunctor)
Definition Functors.h:14
std::function< double(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, const tarch::la::Vector< Dimensions, double > &h, double t, double dt, int normal) MaxEigenvalueFunctor)
Definition Functors.h:44
std::function< void(const double *__restrict__ Q, const double *__restrict__ deltaQ, const tarch::la::Vector< Dimensions, double > &x, const tarch::la::Vector< Dimensions, double > &h, double t, double dt, int normal, double *__restrict__ BTimesDeltaQ) NonconservativeProductFunctor)
Definition Functors.h:39
std::function< void(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, const tarch::la::Vector< Dimensions, double > &h, double t, double dt, int normal, double *__restrict__ F) FluxFunctor)
Definition Functors.h:26
auto volumeIndex(Args... args)
Definition VolumeIndex.h:54
#define InlineMethod
This is the marker that is to be used after the argument list of a function declaration.
Definition tarch.h:58