Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
O
openfpm_pdata
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Environments
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
openfpm
openfpm_pdata
Commits
f85f8e31
Commit
f85f8e31
authored
Nov 12, 2017
by
incardon
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding layout aware function
parent
a3750c9b
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
61 additions
and
29 deletions
+61
-29
src/Vector/vector_dist_comm.hpp
src/Vector/vector_dist_comm.hpp
+45
-18
src/Vector/vector_dist_unit_test.hpp
src/Vector/vector_dist_unit_test.hpp
+16
-11
No files found.
src/Vector/vector_dist_comm.hpp
View file @
f85f8e31
...
...
@@ -268,7 +268,8 @@ class vector_dist_comm
* \param v_prp vector of particles properties
*
*/
void
local_ghost_from_opart
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
>
&
v_prp
)
void
local_ghost_from_opart
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
)
{
// get the shift vectors
const
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
shifts
=
dec
.
getShiftVectors
();
...
...
@@ -295,7 +296,9 @@ class vector_dist_comm
* \param g_m ghost marker
*
*/
void
local_ghost_from_dec
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
>
&
v_prp
,
size_t
g_m
)
void
local_ghost_from_dec
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
,
size_t
g_m
)
{
o_part_loc
.
clear
();
...
...
@@ -396,7 +399,10 @@ class vector_dist_comm
* \param opt options
*
*/
void
add_loc_particles_bc
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
>
&
v_prp
,
size_t
&
g_m
,
size_t
opt
)
void
add_loc_particles_bc
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
,
size_t
&
g_m
,
size_t
opt
)
{
// Create the shift boxes
createShiftBox
();
...
...
@@ -409,9 +415,9 @@ class vector_dist_comm
else
{
if
(
opt
&
SKIP_LABELLING
)
local_ghost_from_opart
(
v_pos
,
v_prp
);
{
local_ghost_from_opart
(
v_pos
,
v_prp
);}
else
local_ghost_from_dec
(
v_pos
,
v_prp
,
g_m
);
{
local_ghost_from_dec
(
v_pos
,
v_prp
,
g_m
);}
}
}
...
...
@@ -538,7 +544,9 @@ class vector_dist_comm
* \param g_send_prp Send buffer to fill
*
*/
template
<
typename
send_vector
,
typename
prp_object
,
int
...
prp
>
void
fill_send_ghost_prp_buf
(
openfpm
::
vector
<
prop
>
&
v_prp
,
openfpm
::
vector
<
send_vector
>
&
g_send_prp
)
template
<
typename
send_vector
,
typename
prp_object
,
int
...
prp
>
void
fill_send_ghost_prp_buf
(
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
,
openfpm
::
vector
<
send_vector
>
&
g_send_prp
)
{
// create a number of send buffers equal to the near processors
g_send_prp
.
resize
(
g_opart
.
size
());
...
...
@@ -565,7 +573,7 @@ class vector_dist_comm
for
(
size_t
j
=
0
;
j
<
g_opart
.
get
(
i
).
size
();
j
++
)
{
// source object type
typedef
encapc
<
1
,
prop
,
typename
openfpm
::
vector
<
prop
>::
layout_type
>
encap_src
;
typedef
encapc
<
1
,
prop
,
typename
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>::
layout_type
>
encap_src
;
// destination object type
typedef
encapc
<
1
,
prp_object
,
typename
openfpm
::
vector
<
prp_object
>::
layout_type
>
encap_dst
;
...
...
@@ -584,7 +592,11 @@ class vector_dist_comm
* \param m_prp sending buffer for properties
*
*/
void
fill_send_map_buf
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
>
&
v_prp
,
openfpm
::
vector
<
size_t
>
&
prc_sz_r
,
openfpm
::
vector
<
openfpm
::
vector
<
Point
<
dim
,
St
>>>
&
m_pos
,
openfpm
::
vector
<
openfpm
::
vector
<
prop
>>
&
m_prp
)
void
fill_send_map_buf
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
,
openfpm
::
vector
<
size_t
>
&
prc_sz_r
,
openfpm
::
vector
<
openfpm
::
vector
<
Point
<
dim
,
St
>>>
&
m_pos
,
openfpm
::
vector
<
openfpm
::
vector
<
prop
>>
&
m_prp
)
{
m_prp
.
resize
(
prc_sz_r
.
size
());
m_pos
.
resize
(
prc_sz_r
.
size
());
...
...
@@ -627,7 +639,12 @@ class vector_dist_comm
* \param m_prp sending buffer for properties
*
*/
template
<
typename
prp_object
,
int
...
prp
>
void
fill_send_map_buf_list
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
>
&
v_prp
,
openfpm
::
vector
<
size_t
>
&
prc_sz_r
,
openfpm
::
vector
<
openfpm
::
vector
<
Point
<
dim
,
St
>>>
&
m_pos
,
openfpm
::
vector
<
openfpm
::
vector
<
prp_object
>>
&
m_prp
)
template
<
typename
prp_object
,
int
...
prp
>
void
fill_send_map_buf_list
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
,
openfpm
::
vector
<
size_t
>
&
prc_sz_r
,
openfpm
::
vector
<
openfpm
::
vector
<
Point
<
dim
,
St
>>>
&
m_pos
,
openfpm
::
vector
<
openfpm
::
vector
<
prp_object
>>
&
m_prp
)
{
m_prp
.
resize
(
prc_sz_r
.
size
());
m_pos
.
resize
(
prc_sz_r
.
size
());
...
...
@@ -726,7 +743,10 @@ class vector_dist_comm
* \param g_m ghost marker
*
*/
void
labelParticlesGhost
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
>
&
v_prp
,
openfpm
::
vector
<
size_t
>
&
prc
,
size_t
&
g_m
)
void
labelParticlesGhost
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
,
openfpm
::
vector
<
size_t
>
&
prc
,
size_t
&
g_m
)
{
// Buffer that contain for each processor the id of the particle to send
g_opart
.
clear
();
...
...
@@ -941,7 +961,11 @@ public:
* \param g_m marker between real and ghost particles
*
*/
template
<
int
...
prp
>
inline
void
ghost_get_
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
>
&
v_prp
,
size_t
&
g_m
,
size_t
opt
=
WITH_POSITION
)
template
<
int
...
prp
>
inline
void
ghost_get_
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
,
size_t
&
g_m
,
size_t
opt
=
WITH_POSITION
)
{
// Sending property object
typedef
object
<
typename
object_creator
<
typename
prop
::
type
,
prp
...
>::
type
>
prp_object
;
...
...
@@ -959,7 +983,7 @@ public:
// Label all the particles
if
((
opt
&
SKIP_LABELLING
)
==
false
)
labelParticlesGhost
(
v_pos
,
v_prp
,
prc_g_opart
,
g_m
);
{
labelParticlesGhost
(
v_pos
,
v_prp
,
prc_g_opart
,
g_m
);}
// Send and receive ghost particle information
{
...
...
@@ -975,10 +999,10 @@ public:
{
size_t
opt_
=
compute_options
(
opt
);
op_ssend_gg_recv_merge
opm
(
g_m
);
v_cl
.
SSendRecvP_op
<
op_ssend_gg_recv_merge
,
send_vector
,
decltype
(
v_prp
),
prp
...
>
(
g_send_prp
,
v_prp
,
prc_g_opart
,
opm
,
prc_recv_get
,
recv_sz_get
,
opt_
);
v_cl
.
SSendRecvP_op
<
op_ssend_gg_recv_merge
,
send_vector
,
decltype
(
v_prp
),
layout_base
,
prp
...
>
(
g_send_prp
,
v_prp
,
prc_g_opart
,
opm
,
prc_recv_get
,
recv_sz_get
,
opt_
);
}
else
v_cl
.
SSendRecvP
<
send_vector
,
decltype
(
v_prp
),
prp
...
>
(
g_send_prp
,
v_prp
,
prc_g_opart
,
prc_recv_get
,
recv_sz_get
,
recv_sz_get_byte
);
{
v_cl
.
SSendRecvP
<
send_vector
,
decltype
(
v_prp
),
layout_base
,
prp
...
>
(
g_send_prp
,
v_prp
,
prc_g_opart
,
prc_recv_get
,
recv_sz_get
,
recv_sz_get_byte
);}
// fill g_opart_sz
g_opart_sz
.
resize
(
prc_g_opart
.
size
());
...
...
@@ -1082,7 +1106,7 @@ public:
fill_send_map_buf_list
<
prp_object
,
prp
...
>
(
v_pos
,
v_prp
,
prc_sz_r
,
m_pos
,
m_prp
);
v_cl
.
SSendRecv
(
m_pos
,
v_pos
,
prc_r
,
prc_recv_map
,
recv_sz_map
);
v_cl
.
SSendRecvP
<
openfpm
::
vector
<
prp_object
>
,
decltype
(
v_prp
),
prp
...
>
(
m_prp
,
v_prp
,
prc_r
,
prc_recv_map
,
recv_sz_map
);
v_cl
.
SSendRecvP
<
openfpm
::
vector
<
prp_object
>
,
decltype
(
v_prp
),
layout_base
,
prp
...
>
(
m_prp
,
v_prp
,
prc_r
,
prc_recv_map
,
recv_sz_map
);
// mark the ghost part
...
...
@@ -1102,7 +1126,10 @@ public:
* \param g_m ghost marker
*
*/
template
<
typename
obp
=
KillParticle
>
void
map_
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
>
&
v_prp
,
size_t
&
g_m
)
template
<
typename
obp
=
KillParticle
>
void
map_
(
openfpm
::
vector
<
Point
<
dim
,
St
>>
&
v_pos
,
openfpm
::
vector
<
prop
,
Memory
,
typename
layout_base
<
prop
>::
type
,
layout_base
>
&
v_prp
,
size_t
&
g_m
)
{
// Processor communication size
openfpm
::
vector
<
size_t
>
prc_sz
(
v_cl
.
getProcessingUnits
());
...
...
@@ -1221,12 +1248,12 @@ public:
size_t
opt_
=
compute_options
(
opt
);
op_ssend_recv_merge
<
op
>
opm
(
g_opart
);
v_cl
.
SSendRecvP_op
<
op_ssend_recv_merge
<
op
>
,
send_vector
,
decltype
(
v_prp
),
prp
...
>
(
g_send_prp
,
v_prp
,
prc_recv_get
,
opm
,
prc_g_opart
,
g_opart_sz
,
opt_
);
v_cl
.
SSendRecvP_op
<
op_ssend_recv_merge
<
op
>
,
send_vector
,
decltype
(
v_prp
),
layout_base
,
prp
...
>
(
g_send_prp
,
v_prp
,
prc_recv_get
,
opm
,
prc_g_opart
,
g_opart_sz
,
opt_
);
}
else
{
op_ssend_recv_merge
<
op
>
opm
(
g_opart
);
v_cl
.
SSendRecvP_op
<
op_ssend_recv_merge
<
op
>
,
send_vector
,
decltype
(
v_prp
),
prp
...
>
(
g_send_prp
,
v_prp
,
prc_recv_get
,
opm
,
prc_recv_put
,
recv_sz_put
);
v_cl
.
SSendRecvP_op
<
op_ssend_recv_merge
<
op
>
,
send_vector
,
decltype
(
v_prp
),
layout_base
,
prp
...
>
(
g_send_prp
,
v_prp
,
prc_recv_get
,
opm
,
prc_recv_put
,
recv_sz_put
);
}
// process also the local replicated particles
...
...
src/Vector/vector_dist_unit_test.hpp
View file @
f85f8e31
...
...
@@ -101,6 +101,7 @@ void print_test(std::string test, size_t sz)
std
::
cout
<<
test
<<
" "
<<
sz
<<
"
\n
"
;
}
template
<
typename
vector
>
void
Test2D_ghost
(
Box
<
2
,
float
>
&
box
)
{
// Communication object
...
...
@@ -150,7 +151,7 @@ void Test2D_ghost(Box<2,float> & box)
size_t
bc
[
2
]
=
{
NON_PERIODIC
,
NON_PERIODIC
};
// Vector of particles
vector
_dist
<
2
,
float
,
Point_test
<
float
>
>
vd
(
g_info
.
size
(),
box
,
bc
,
g
);
vector
vd
(
g_info
.
size
(),
box
,
bc
,
g
);
// size_t
size_t
cobj
=
0
;
...
...
@@ -194,16 +195,16 @@ void Test2D_ghost(Box<2,float> & box)
auto
key
=
v_it2
.
get
();
// fill with the processor ID where these particle live
vd
.
getProp
<
p
::
s
>
(
key
)
=
vd
.
getPos
(
key
)[
0
]
+
vd
.
getPos
(
key
)[
1
]
*
16.0
f
;
vd
.
getProp
<
p
::
v
>
(
key
)[
0
]
=
v_cl
.
getProcessUnitID
();
vd
.
getProp
<
p
::
v
>
(
key
)[
1
]
=
v_cl
.
getProcessUnitID
();
vd
.
getProp
<
p
::
v
>
(
key
)[
2
]
=
v_cl
.
getProcessUnitID
();
vd
.
template
getProp
<
p
::
s
>(
key
)
=
vd
.
getPos
(
key
)[
0
]
+
vd
.
getPos
(
key
)[
1
]
*
16.0
f
;
vd
.
template
getProp
<
p
::
v
>(
key
)[
0
]
=
v_cl
.
getProcessUnitID
();
vd
.
template
getProp
<
p
::
v
>(
key
)[
1
]
=
v_cl
.
getProcessUnitID
();
vd
.
template
getProp
<
p
::
v
>(
key
)[
2
]
=
v_cl
.
getProcessUnitID
();
++
v_it2
;
}
// do a ghost get
vd
.
ghost_get
<
p
::
s
,
p
::
v
>
();
vd
.
template
ghost_get
<
p
::
s
,
p
::
v
>();
//! [Redistribute the particles and sync the ghost properties]
...
...
@@ -224,7 +225,7 @@ void Test2D_ghost(Box<2,float> & box)
auto
key
=
g_it
.
get
();
// Check the received data
BOOST_REQUIRE_EQUAL
(
vd
.
getPos
(
key
)[
0
]
+
vd
.
getPos
(
key
)[
1
]
*
16.0
f
,
vd
.
getProp
<
p
::
s
>
(
key
));
BOOST_REQUIRE_EQUAL
(
vd
.
getPos
(
key
)[
0
]
+
vd
.
getPos
(
key
)[
1
]
*
16.0
f
,
vd
.
template
getProp
<
p
::
s
>(
key
));
bool
is_in
=
false
;
size_t
b
=
0
;
...
...
@@ -247,7 +248,7 @@ void Test2D_ghost(Box<2,float> & box)
BOOST_REQUIRE_EQUAL
(
is_in
,
true
);
// Check that the particle come from the correct processor
BOOST_REQUIRE_EQUAL
(
vd
.
getProp
<
p
::
v
>
(
key
)[
0
],
dec
.
getEGhostBoxProcessor
(
lb
));
BOOST_REQUIRE_EQUAL
(
vd
.
template
getProp
<
p
::
v
>(
key
)[
0
],
dec
.
getEGhostBoxProcessor
(
lb
));
n_part
++
;
++
g_it
;
...
...
@@ -269,13 +270,17 @@ void Test2D_ghost(Box<2,float> & box)
}
}
BOOST_AUTO_TEST_CASE
(
vector_dist_ghost
)
//! types to use in the tests each element in the list is tested
typedef
boost
::
mpl
::
list
<
vector_dist
<
2
,
float
,
Point_test
<
float
>
>
,
vector_dist
<
2
,
float
,
Point_test
<
float
>
,
memory_traits_inte
<
Point_test
<
float
>>::
type
,
memory_traits_inte
>
>
test_types
;
BOOST_AUTO_TEST_CASE_TEMPLATE
(
vector_dist_ghost
,
vector
,
test_types
)
{
Box
<
2
,
float
>
box
({
0.0
,
0.0
},{
1.0
,
1.0
});
Test2D_ghost
(
box
);
Test2D_ghost
<
vector
>
(
box
);
Box
<
2
,
float
>
box2
({
-
1.0
,
-
1.0
},{
2.5
,
2.5
});
Test2D_ghost
(
box2
);
Test2D_ghost
<
vector
>
(
box2
);
}
void
print_test_v
(
std
::
string
test
,
size_t
sz
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment