14#include "arcane/utils/ScopedPtr.h"
15#include "arcane/utils/PlatformUtils.h"
16#include "arcane/utils/OStringStream.h"
17#include "arcane/utils/ArithmeticException.h"
18#include "arcane/utils/ValueChecker.h"
21#include "arcane/utils/SimdOperation.h"
23#include "arcane/core/BasicUnitTest.h"
24#include "arcane/core/ServiceBuilder.h"
25#include "arcane/core/FactoryService.h"
27#include "arcane/core/materials/internal/IMeshComponentInternal.h"
30#include "arcane/materials/IMeshMaterialMng.h"
31#include "arcane/materials/IMeshMaterial.h"
32#include "arcane/materials/IMeshEnvironment.h"
33#include "arcane/materials/MeshEnvironmentBuildInfo.h"
34#include "arcane/materials/MeshMaterialModifier.h"
35#include "arcane/materials/MatCellVector.h"
36#include "arcane/materials/EnvCellVector.h"
37#include "arcane/materials/MatItemEnumerator.h"
38#include "arcane/materials/MeshMaterialVariableRef.h"
39#include "arcane/materials/MeshEnvironmentVariableRef.h"
40#include "arcane/materials/EnvItemVector.h"
42#include "arcane/tests/ArcaneTestGlobal.h"
51# define PRAGMA_IVDEP_VALUE "clang loop vectorize(enable)"
53# ifdef __INTEL_COMPILER
54# define PRAGMA_IVDEP_VALUE "ivdep"
59# pragma GCC optimize ("-ftree-vectorize")
60# define PRAGMA_IVDEP_VALUE "GCC ivdep"
67#ifdef PRAGMA_IVDEP_VALUE
68#define PRAGMA_IVDEP _Pragma(PRAGMA_IVDEP_VALUE)
71#define PRAGMA_IVDEP_VALUE ""
78MATERIALS_BEGIN_NAMESPACE
96#ifdef __INTEL_COMPILER
121#define USE_SQRT_IN_EOS 1
123#if USE_SQRT_IN_EOS == 1
124#define DO_SQRT(v) math::sqrt( v )
126#define DO_SQRT(v) (v)
141 : m_index(0), m_component(component)
156 bool hasNext()
const {
return m_index<2; }
159 return m_items_view[m_index];
171#define ENUMERATE_ENVCELL2(iname,env) \
172 for( FullComponentPartCellEnumerator iname##_part(Arcane::Materials::FullComponentPartCellEnumerator::create(env)); iname##_part . hasNext(); ++ iname##_part ) \
174 A_ENUMERATE_COMPONENTCELL(ComponentPartCellEnumerator,iname,*(iname##_part))
179MATERIALS_END_NAMESPACE
201 PerfTimer(
const char*
msg)
202 : m_begin_time(0.0), m_msg(
msg), m_has_error(
false)
204 m_begin_time = platform::getRealTime();
208 Real
end_time = platform::getRealTime();
211 std::cout <<
" -- -- Time: ";
213 std::cout << m_msg <<
" = ";
215 std::cout <<
"ERROR";
221 void setError(
bool v) { m_has_error = v; }
273 void _initializeVariables();
286 void _initForEquationOfState();
287 void _compareValues();
288 void _computeEquationOfStateReference();
289 void _computeEquationOfStateDirect1();
290 void _computeEquationOfStateIndirect1();
291 void _computeEquationOfStateV1();
292 void _computeEquationOfStateV1_bis();
293 void _computeEquationOfStateV2();
294 void _computeEquationOfStateV3();
295 void _computeEquationOfStateV4();
296 void _computeEquationOfStateV4_noview();
298 template<
typename Lambda>
303 PerfTimer
pf(message);
310 info() <<
"ArithmeticException for '" << message <<
"'";
316 template<
typename Lambda>
319 _initForEquationOfState();
335MeshMaterialSimdUnitTest::
361MeshMaterialSimdUnitTest::
362~MeshMaterialSimdUnitTest()
364 delete m_env1_as_vector;
378 mm->registerMaterialInfo(v);
394 mm->endCreate(
false);
457 info() <<
"** ** ENV name=" <<
env->name() <<
" nb_item=" <<
env->view().nbItem();
460 if ( (*ienvcell).allEnvCell().nbEnvironment()==1 )
473 m_env1_pure_value_index.
clear();
474 m_env1_partial_value_index.
clear();
482 m_env1_pure_value_index.
add(
mvi.valueIndex());
484 m_env1_partial_value_index.
add(
mvi.valueIndex());
497 info() <<
"Using vectorisation name=" << SimdInfo::name()
498 <<
" vector_size=" << SimdReal::Length <<
" index_size=" << SimdInfo::Int32IndexSize;
499 info() <<
"Compiler=\"" << getCompilerInfo() <<
"\""
500 <<
" machine=" << platform::getHostName();
501 info() <<
"use_sqrt_in_eos?=" << USE_SQRT_IN_EOS
502 <<
" PRAGMA_IVDEP=" << PRAGMA_IVDEP_VALUE;
504 <<
" nb_pure=" << m_env1_pure_value_index.
size()
505 <<
" nb_partial=" << m_env1_partial_value_index.
size()
507 <<
" nb_z=" <<
nb_z <<
" nb_z2=" <<
nb_z2;
509 _initializeVariables();
511 PerfTimer
pf(
"executeDirect1");
512 _executeDirect1(
nb_z);
515 PerfTimer
pf(
"executeTest1 (ENVCELL)");
519 PerfTimer
pf(
"executeTest1_bis (ENVCELL2)");
520 _executeTest1_bis(
nb_z);
523 PerfTimer
pf(
"executeTest2 (ENVCELL,IVDEP,view)");
527 PerfTimer
pf(
"executeTest2_bis (ENVCELL2,view)");
528 _executeTest2_bis(
nb_z);
531 PerfTimer
pf(
"executeTest3 (2 loops)");
535 PerfTimer
pf(
"executeTest4 (2 loops, ivdep)");
539 PerfTimer
pf(
"executeTest5 (2 loops, functor)");
543 PerfTimer
pf(
"executeTest6 (2 loops, functor)");
547 PerfTimer
pf(
"executeTest7 (2 loops, loop functor)");
551 PerfTimer
pf(
"executeTest8 (simple_env_loop)");
555 PerfTimer
pf(
"executeTest9 (SIMD_ENVCELL)");
559 PerfTimer
pf(
"executeTest10 (SIMD_ENVCELL, functor)");
560 _executeTest10(
nb_z);
563 _initForEquationOfState();
564 _computeEquationOfStateReference();
565 _apply(
"_computeEquationOfStateDirect1",
566 [&](){_computeEquationOfStateDirect1();});
567 _apply(
"_computeEquationOfStateIndirect1",
568 [&](){_computeEquationOfStateIndirect1();});
569 _applyCompare(
"_computeEquationOfStateV1 (ENVCELL)",
570 [&](){_computeEquationOfStateV1();});
571 _applyCompare(
"_computeEquationOfStateV1_bis (ENVCELL2)",
572 [&](){_computeEquationOfStateV1_bis();});
574 _applyCompare(
"_computeEquationOfStateV2 (simple_simd_env_loop)",
575 [&](){_computeEquationOfStateV2();});
576 _applyCompare(
"_computeEquationOfStateV3 (simple_env_loop)",
577 [&](){_computeEquationOfStateV3();});
579 _applyCompare(
"_computeEquationOfStateV4 (lambda simple_env_loop2)",
580 [&](){_computeEquationOfStateV4();});
581 _applyCompare(
"_computeEquationOfStateV4_noview (lambda simple_env_loop2)",
582 [&](){_computeEquationOfStateV4_noview();});
589void MeshMaterialSimdUnitTest::
590_initializeVariables()
599 Real z = (Real)i.index();
611Real MeshMaterialSimdUnitTest::
612_executeDirect1(Integer
nb_z)
615 Real ARCANE_RESTRICT *a =
new Real[
TRUE_SIZE];
620#pragma omp parallel for
621 for( Integer i=0, is=
TRUE_SIZE; i<is; ++i ){
623 a[i] =
b[i] =
c[i] = d[i] = e[i] = z;
626 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
627 for( Integer i=0, is=
TRUE_SIZE; i<is; ++i ){
628 a[i] =
b[i] +
c[i] * d[i] + e[i];
643void MeshMaterialSimdUnitTest::
644_executeTest1(Integer
nb_z)
652 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
654 a[i] =
b[i] +
c[i] * d[i] + e[i];
662void MeshMaterialSimdUnitTest::
663_executeTest1_bis(Integer
nb_z)
671 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
672 ENUMERATE_ENVCELL2(i,m_env1){
673 a[i] =
b[i] +
c[i] * d[i] + e[i];
681void MeshMaterialSimdUnitTest::
682_executeTest2(Integer
nb_z)
690 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
697#ifndef __INTEL_COMPILER
701 a[i] =
b[i] +
c[i] * d[i] + e[i];
709void MeshMaterialSimdUnitTest::
710_executeTest2_bis(Integer
nb_z)
718 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
719 ENUMERATE_ENVCELL2(i,m_env1){
720 a[i] =
b[i] +
c[i] * d[i] + e[i];
728void MeshMaterialSimdUnitTest::
729_executeTest3(Integer
nb_z)
737 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
741 for( Integer i=0, n=indexes.
size(); i<n; ++i ){
751 for( Integer i=0, n=indexes.
size(); i<n; ++i ){
763void MeshMaterialSimdUnitTest::
764_executeTest5(Integer
nb_z)
774 for( Integer i=0, n=indexes.size(); i<n; ++i ){
781 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
783 func(0,m_env1_pure_value_index);
791void MeshMaterialSimdUnitTest::
792_executeTest6(Integer
nb_z)
802 for( Integer i=0, n=indexes.size(); i<n; ++i ){
809 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
812 func(
pv.componentPartIndex(),
pv.valueIndexes());
816 func(
pv.componentPartIndex(),
pv.valueIndexes());
824template<
typename Lambda>
void
831void MeshMaterialSimdUnitTest::
832_executeTest7(Integer
nb_z)
840 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
851template<
typename Lambda>
void
867 for( Integer i=0; i<
nb_item; ++i ){
875template<
typename ContainerType,
typename Lambda>
void
878 simple_env_loop(
ct.pureItems(),
ct.impureItems(),
lambda);
881template<
typename Lambda>
void
891 auto view = views[0];
895 for( Integer i=0; i<
nb_item; ++i ){
902 auto view = views[1];
903 Int32 cpi = view.componentPartIndex();
907 for( Integer i=0; i<
nb_item; ++i ){
917template<
typename ContainerType,
typename Lambda>
void
920 simple_env_loop2(
ct.pureItems(),
ct.impureItems(),
lambda);
923void MeshMaterialSimdUnitTest::
924_executeTest8(Integer
nb_z)
932 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
942void MeshMaterialSimdUnitTest::
943_executeTest9(Integer
nb_z)
951 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
953 ENUMERATE_SIMD_COMPONENTCELL(
mvi,view){
963#define A_ENUMERATE_LAMBDA(iter_type,iter,container,...) \
964 Arcane::Materials:: LoopFunctor ## iter_type ( (container) ) << __VA_ARGS__ ( Arcane::Materials:: LoopFunctor ## iter_type :: IterType iter)
966#define A_CAPTURE(a) a
967#define A_ENUMERATE_LAMBDA2(iter_type,iter,container,lambda_capture) \
968 Arcane::Materials:: LoopFunctor ## iter_type ( (container) ) << A_CAPTURE(lambda_capture) ( Arcane::Materials:: LoopFunctor ## iter_type :: IterType iter)
970#define A_ENUMERATE_LAMBDA3(iter_type,iter,container) \
971 Arcane::Materials:: LoopFunctor ## iter_type ( (container) ) <<
976template<
typename Lambda>
void
979 simple_simd_env_loop(
env.pureItems(),
env.impureItems(),
lambda);
985void MeshMaterialSimdUnitTest::
986_executeTest10(Integer
nb_z)
994 for( Integer z=0,
iz=
nb_z; z<
iz; ++z ){
1004void MeshMaterialSimdUnitTest::
1005_initForEquationOfState()
1009 m_mat_adiabatic_cst[
vi] = 1.4;
1010 m_mat_volume[
vi] = 1.2;
1011 m_mat_old_volume[
vi] = 1.1;
1013 m_mat_density[
vi] = 2.0;
1014 m_mat_pressure[
vi] = 1.1;
1016 m_mat_internal_energy[
vi] = m_mat_pressure[
icell] / ((m_mat_adiabatic_cst[
icell]-1.0) * m_mat_density[
icell]);
1023void MeshMaterialSimdUnitTest::
1024_computeEquationOfStateDirect1()
1039 for( Integer i=0, is=
TRUE_SIZE; i<is; ++i ){
1053 for( Integer i=0, n=
TRUE_SIZE; i<n; ++i ){
1082void MeshMaterialSimdUnitTest::
1083_computeEquationOfStateIndirect1()
1100 for( Integer i=0, is=
TRUE_SIZE; i<is; ++i ){
1116 for( Integer i=0, n=
TRUE_SIZE; i<n; ++i ){
1146void MeshMaterialSimdUnitTest::
1147_computeEquationOfStateReference()
1176 m_mat_ref_internal_energy[
vi] = m_mat_internal_energy[
vi];
1177 m_mat_ref_pressure[
vi] = m_mat_pressure[
vi];
1178 m_mat_ref_sound_speed[
vi] = m_mat_sound_speed[
vi];
1185void MeshMaterialSimdUnitTest::
1190 vc.areEqual(m_mat_internal_energy[
icell],m_mat_ref_internal_energy[
icell],
"Energy");
1191 vc.areEqual(m_mat_pressure[
icell],m_mat_ref_pressure[
icell],
"Pressure");
1192 vc.areEqual(m_mat_sound_speed[
icell],m_mat_ref_sound_speed[
icell],
"SoundSpeed");
1199void MeshMaterialSimdUnitTest::
1200_computeEquationOfStateV1()
1238void MeshMaterialSimdUnitTest::
1239_computeEquationOfStateV1_bis()
1254 ENUMERATE_ENVCELL2(
icell,m_env1){
1276void MeshMaterialSimdUnitTest::
1277_computeEquationOfStateV3()
1307 simple_env_loop(*m_env1,
func);
1314void MeshMaterialSimdUnitTest::
1315_computeEquationOfStateV2()
1352void MeshMaterialSimdUnitTest::
1353_computeEquationOfStateV4()
1368 auto func = [=](
auto vi){
1383 simple_env_loop2(*m_env1_as_vector,
func);
1390void MeshMaterialSimdUnitTest::
1391_computeEquationOfStateV4_noview()
1397 auto func = [&](
auto vi){
1412 simple_env_loop2(*m_env1_as_vector,
func);
#define ENUMERATE_COMPONENTITEM_LAMBDA(iter_type, iter, container)
Macro pour itérer sur les entités d'un composant via une fonction lambda du C++11.
#define ARCANE_REGISTER_CASE_OPTIONS_NOAXL_FACTORY(aclass, ainterface, aname)
Enregistre un service de fabrique pour la classe aclass.
Exception lorsqu'une erreur arithmétique survient.
Service basique de test unitaire.
Vectorisation des réels par émulation.
Enumérateur sur une sous-partie (pure ou partielle) d'un sous-ensemble des mailles d'un composant (ma...
Interface d'un service de test unitaire.
Integer size() const
Nombre d'éléments du groupe.
ItemUniqueId uniqueId() const
Identifiant unique sur tous les domaines.
Lecteur des fichiers de maillage via la bibliothèque LIMA.
Index d'un Item matériaux dans une variable.
ComponentPurePartItemVectorView pureItems() const
Liste des entités pures (associées à la maille globale) du composant.
ComponentImpurePartItemVectorView impureItems() const
Liste des entités impures (partielles) du composant.
Vue sur une partie pure ou partielles des entités d'un composant.
Enumérateur sur les mailles d'un milieu.
Vecteur sur les entités d'un milieu.
Maille arcane d'un milieu.
Interface d'un composant (matériau ou milieu) d'un maillage.
virtual CellGroup cells() const =0
Groupe des mailles de ce matériau.
virtual IMeshComponentInternal * _internalApi()=0
API interne.
Interface d'un milieu d'un maillage.
Interface du gestionnaire des matériaux et des milieux d'un maillage.
static IMeshMaterialMng * getReference(const MeshHandleOrMesh &mesh_handle, bool create=true)
Récupère ou créé la référence associée à mesh.
Interface d'un matériau d'un maillage.
Représente un index sur les variables matériaux et milieux.
Informations pour la création d'un milieu.
Objet permettant de modifier les matériaux ou les milieux.
void addCells(IMeshMaterial *mat, SmallSpan< const Int32 > ids)
Ajoute les mailles d'indices locaux ids au matériau mat.
Index d'un Item matériaux pure dans une variable.
CellGroup allCells() const
Retourne le groupe contenant toutes les mailles.
CellGroup ownCells() const
Retourne le groupe contenant toutes les mailles propres à ce domaine.
Flot de sortie lié à une String.
Structure contenant les informations pour créer un service.
Indexeur SIMD sur un composant.
Vérification de la validité de certaines valeurs.
Paramètres nécessaires à la construction d'une variable.
Integer size() const
Nombre d'éléments du vecteur.
void add(ConstReferenceType val)
Ajoute l'élément val à la fin du tableau.
void clear()
Supprime les éléments du tableau.
Vue constante d'un tableau de type T.
constexpr Integer size() const noexcept
Nombre d'éléments du tableau.
Chaîne de caractères unicode.
TraceMessage info() const
Flot pour un message d'information.
Vecteur 1D de données avec sémantique par valeur (style STL).
Service de test unitaire de la vectorisation des matériaux/milieux.
void initializeTest() override
Méthode appelée après lecture du jeu de données pour initialiser le test.
void executeTest() override
Méthode appelée pour exécuter le test.
auto viewIn(RunCommand &cmd, const CellMaterialVariableScalarRef< DataType > &var)
Vue en lecture pour les variables materiaux scalaire.
auto viewOut(RunCommand &cmd, CellMaterialVariableScalarRef< DataType > &var)
Vue en écriture pour les variables materiaux scalaire.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
bool arcaneIsDebug()
Vrai si la macro ARCANE_DEBUG est définie.
Int32 Integer
Type représentant un entier.
Ensemble des classes assurant la gestion des matériaux et des milieux.