16#include <Parallel_io_parameters.h>
18#include <IJK_Lata_writer.h>
19#include <Interprete_bloc.h>
20#include <Perf_counters.h>
52 Nom ijk_name_write, ijk_name_read;
55 param.
ajouter(
"block_size_bytes", &bs_bytes);
58 param.
ajouter(
"block_size_megabytes", &bs);
61 param.
ajouter(
"writing_processes", &n);
65 param.
ajouter(
"bench_ijk_splitting_write", &ijk_name_write);
67 param.
ajouter(
"bench_ijk_splitting_read", &ijk_name_read);
73 Cerr <<
"Error in Parallel_io_parameters::interpreter: block_size is negative" << finl;
85 Cerr <<
"Parallel_io_parameters: blocksize= " << bs <<
" MB, nb writing processes= "
88 if (ijk_name_write !=
"??")
92 if (ijk_name_read !=
"??")
121 IJK_Field_double vx, vy, vz;
126 set_field_data(vx,
Nom(
"x*0.9+y*0.09*0.001+z*0.009"));
127 set_field_data(vy,
Nom(
"1.+x*0.9+y*0.09+z*0.009"));
128 set_field_data(vz,
Nom(
"-1.+x*0.9+y*0.09+z*0.009"));
130 dumplata_header(
"test.lata", vx);
131 dumplata_newtime(
"test.lata", 0.);
133 statistics().set_nb_time_steps_elapsed(0);
134 statistics().create_custom_counter(
"Parallel_io benchmark",1,
"IJK");
135 statistics().begin_count(
"Parallel_io benchmark",statistics().get_last_opened_counter_level()+1);
136 dumplata_vector(
"test.lata",
"VELOCITY", vx, vy, vz, 1);
137 double t = statistics().get_time_since_last_open(
"Parallel_io benchmark");
138 statistics().end_count(
"Parallel_io benchmark");
143 Nom bw = (t==0)?
Nom(
"infty") :
Nom(sz/1024/1024/1024/t);
144 Cerr <<
"Parallel_io_parameters benchmark write: data_size= " << sz/1024/1024/1024
145 <<
" GB. Time= " << t <<
" s. Bandwidth= "
146 << bw <<
" GB/s.(x3)" << finl;
149double max_val_abs_ijk(
const IJK_Field_double& residu,
const IJK_Field_double& x)
151 const int ni = residu.
ni();
152 const int nj = residu.
nj();
153 const int nk = residu.
nk();
155 for (
int k = 0; k < nk; k++)
157 for (
int j = 0; j < nj; j++)
159 for (
int i = 0; i < ni; i++)
161 m = std::fmax(fabs(residu(i,j,k)-x(i,j,k)), m);
175 IJK_Field_double vx, vy, vz;
184 statistics().set_nb_time_steps_elapsed(0);
185 statistics().create_custom_counter(
"Parallel_io benchmark_read",1,
"IJK");
186 statistics().begin_count(
"Parallel_io benchmark_read",statistics().get_last_opened_counter_level()+1);
187 lire_dans_lata(
"test.lata", 1 ,
189 "VELOCITY", vx, vy, vz);
190 double t = statistics().get_time_since_last_open(
"Parallel_io benchmark_read");
191 statistics().end_count(
"Parallel_io benchmark_read");
197 Nom bw = (t==0)?
Nom(
"infty") :
Nom(sz/1024/1024/1024/t);
198 Cerr <<
"Parallel_io_parameters benchmark read: data_size= " << sz/1024/1024/1024
199 <<
" GB. Time= " << t <<
" s. Bandwidth= " << bw <<
" GB/s.(x3)" << finl;
202 IJK_Field_double vx2, vy2, vz2;
207 set_field_data(vx2,
Nom(
"x*0.9+y*0.09*0.001+z*0.009"));
208 set_field_data(vy2,
Nom(
"1.+x*0.9+y*0.09+z*0.009"));
209 set_field_data(vz2,
Nom(
"-1.+x*0.9+y*0.09+z*0.009"));
213 delta = max_val_abs_ijk(vx,vx2);
214 Cerr <<
"L2 Norm of difference on vx: " << delta << finl;
215 delta = max_val_abs_ijk(vy,vy2);
216 Cerr <<
"L2 Norm of difference on vy: " << delta << finl;
217 delta = max_val_abs_ijk(vz,vz2);
218 Cerr <<
"L2 Norm of difference on vz: " << delta << finl;
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
int get_nb_elem_tot(int direction) const
Returns the total (global) number of mesh cells in requested direction.
const Nom & le_nom() const override
Donne le nom de l'Objet_U Methode a surcharger : renvoie "neant" dans cette implementation.
Class defining operators and methods for all reading operation in an input flow (file,...
void allocate(const Domaine_IJK &d, Domaine_IJK::Localisation l, int ghost_size, int additional_k_layers=0, int nb_compo=1, const Nom &name=Nom(), bool external_storage=false, int monofluide=0, double rov=0., double rol=0., int use_inv_rho_in_pressure_solver=0)
static Objet_U & objet_global(const Nom &nom)
cherche l'objet demande dans l'Interprete_bloc courant (Interprete_bloc::interprete_courant()) et dan...
Classe de base des objets "interprete".
class Nom Une chaine de caractere pour nommer les objets de TRUST
const Nom & que_suis_je() const
renvoie la chaine identifiant la classe.
virtual Entree & readOn(Entree &)
Lecture d'un Objet_U sur un flot d'entree Methode a surcharger.
virtual Sortie & printOn(Sortie &) const
Ecriture de l'objet sur un flot de sortie Methode a surcharger.
static int get_nb_writing_processes()
static void run_bench_write(const Nom &ijk_splitting)
static void run_bench_read(const Nom &ijk_splitting)
Entree & interpreter(Entree &) override
static int nb_writing_processes_
static Size_t max_block_size_
Helper class to factorize the readOn method of Objet_U classes.
void ajouter(const char *keyword, const int *value, Param::Nature nat=Param::OPTIONAL)
Register an integer parameter.
int lire_avec_accolades(Entree &is)
Alias of lire_avec_accolades_depuis.
static double mp_max(double)
static int nproc()
renvoie le nombre de processeurs dans le groupe courant Voir Comm_Group::nproc() et PE_Groups::curren...
static void exit(int exit_code=-1)
Routine de sortie de TRUST dans une region Kokkos.
Classe de base des flux de sortie.