TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
MD_Vector_std_tools.tpp
1/****************************************************************************
2* Copyright (c) 2023, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef MD_Vector_std_tools_TPP_included
17#define MD_Vector_std_tools_TPP_included
18
19enum class VECT_ITEMS_TYPE { READ , WRITE , ADD , MAX };
20enum class VECT_BLOCS_TYPE { READ , WRITE , ADD };
21
22
23template<typename _TYPE_, VECT_ITEMS_TYPE _ITEM_TYPE_>
24extern void vect_items_generic(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers);
25
26template<typename _TYPE_>
27inline void read_from_vect_items(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers)
28{
29 vect_items_generic<_TYPE_,VECT_ITEMS_TYPE::READ>(line_size,voisins,list,vect,buffers);
30}
31
32template<typename _TYPE_>
33inline void write_to_vect_items(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers)
34{
35 vect_items_generic<_TYPE_,VECT_ITEMS_TYPE::WRITE>(line_size,voisins,list,vect,buffers);
36}
37
38template<typename _TYPE_>
39inline void add_to_vect_items(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers)
40{
41 vect_items_generic<_TYPE_,VECT_ITEMS_TYPE::ADD>(line_size,voisins,list,vect,buffers);
42}
43
44template<typename _TYPE_>
45inline void max_to_vect_items(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers)
46{
47 vect_items_generic<_TYPE_,VECT_ITEMS_TYPE::MAX>(line_size,voisins,list,vect,buffers);
48}
49
50template<typename _TYPE_>
51inline void mincol1_to_vect_items(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers)
52{
53 assert(line_size > 0);
54 _TYPE_ *data = vect.addr();
55 const int *items_to_process = list.get_data().addr();
56 int idx = 0; // Index in list.get_data()
57 const ArrOfInt& index = list.get_index();
58 const int nb_voisins = list.get_nb_lists();
59 for (int i_voisin = 0; i_voisin < nb_voisins; i_voisin++)
60 {
61 // Indice dans list.get_data() de la fin de la liste d'items/blocs pour ce voisin:
62 const int idx_end_of_list = index[i_voisin + 1];
63 // Nombre d'elements de tableau a envoyer/recevoir de ce voisin
64 const int nb_elems = (idx_end_of_list - idx) * line_size;
65 TRUSTArray<_TYPE_>& buffer = buffers.get_next_area_template < _TYPE_ >(voisins[i_voisin], nb_elems);
66 _TYPE_ *bufptr = buffer.addr();
67 assert(idx_end_of_list <= list.get_data().size_array());
68 while (idx < idx_end_of_list)
69 {
70 // Indice de l'item geometrique a copier (ou du premier item du bloc)
71 int premier_item_bloc = items_to_process[idx++];
72 const int bloc_size = 1;
73 // Adresse des elements a copier dans le vecteur
74 assert(premier_item_bloc >= 0 && bloc_size > 0 && (premier_item_bloc + bloc_size) * line_size <= vect.size_array());
75 _TYPE_ *vectptr = data + premier_item_bloc * line_size;
76 // Copy whole line if first line is greater than destination
77 assert(bufptr + line_size * bloc_size - buffer.addr() <= buffer.size_array());
78 for (int j = 0; j < bloc_size; j++)
79 {
80 _TYPE_ dest = *vectptr;
81 _TYPE_ src = *bufptr;
82 if (src < dest)
83 {
84 for (int k = line_size; k; k--)
85 *(vectptr++) = *(bufptr++);
86 }
87 else
88 {
89 vectptr += line_size;
90 bufptr += line_size;
91 }
92 }
93 }
94 }
95}
96
97template<typename _TYPE_, VECT_BLOCS_TYPE _ITEM_TYPE_>
98extern void vect_blocs_generic(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, const ArrOfInt& nb_items_par_voisin, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers);
99
100template<typename _TYPE_>
101inline void read_from_vect_blocs(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, const ArrOfInt& nb_items_par_voisin, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers)
102{
103 vect_blocs_generic<_TYPE_,VECT_BLOCS_TYPE::READ>(line_size,voisins,list,nb_items_par_voisin,vect,buffers);
104}
105
106template<typename _TYPE_>
107inline void write_to_vect_blocs(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, const ArrOfInt& nb_items_par_voisin, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers)
108{
109 vect_blocs_generic<_TYPE_,VECT_BLOCS_TYPE::WRITE>(line_size,voisins,list,nb_items_par_voisin,vect,buffers);
110}
111
112template<typename _TYPE_>
113inline void add_to_vect_blocs(const int line_size, const ArrOfInt& voisins, const Static_Int_Lists& list, const ArrOfInt& nb_items_par_voisin, TRUSTArray<_TYPE_>& vect, Schema_Comm_Vecteurs& buffers)
114{
115 vect_blocs_generic<_TYPE_,VECT_BLOCS_TYPE::ADD>(line_size,voisins,list,nb_items_par_voisin,vect,buffers);
116}
117
118#endif /* MD_Vector_std_tools_TPP_included */
TRUSTArray< _TYPE_ > & get_next_area_template(int pe, int array_size)
const ArrOfInt_t & get_index() const
int_t get_nb_lists() const
renvoie le nombre de listes stockees
const ArrOfInt_t & get_data() const
Represents a an array of int/int64/double/... values.
Definition TRUSTArray.h:81
_SIZE_ size_array() const
_TYPE_ * addr()