Skip to content
Open
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 60 additions & 0 deletions src/shammodels/sph/src/BasicSPHGhosts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,8 @@ inline void for_each_patch_shift(

using namespace shammodels::sph;

#define NEW_GZ_INTERACT_CRIT

template<class vec>
auto BasicSPHGhostHandler<vec>::find_interfaces(
SerialPatchTree<vec> &sptree,
Expand Down Expand Up @@ -306,21 +308,42 @@ auto BasicSPHGhostHandler<vec>::find_interfaces(

sptree.host_for_each_leafs(
[&](u64 tree_id, PtNode n) {
#ifdef NEW_GZ_INTERACT_CRIT
// The ghost interaction was not symmetric before
// now it is since we check for the max of the two h_max
flt receiv_h_max = acc_tf[tree_id];
shammath::AABB<vec> tree_cell{n.box_min, n.box_max};
tree_cell
= tree_cell.expand_all(sham::max(sender_h_max, receiv_h_max));

return tree_cell
.get_intersect(
shammath::AABB<vec>{
sender_bsize_off.lower, sender_bsize_off.upper})
.is_not_empty();
#else
flt receiv_h_max = acc_tf[tree_id];
CoordRange<vec> receiv_exp{
n.box_min - receiv_h_max, n.box_max + receiv_h_max};

return receiv_exp.get_intersect(sender_bsize_off).is_not_empty();
#endif
},
[&](u64 id_found, PtNode n) {
if ((id_found == psender.id_patch) && (xoff == 0) && (yoff == 0)
&& (zoff == 0)) {
return;
}

#ifdef NEW_GZ_INTERACT_CRIT
CoordRange<vec> receiv_exp
= CoordRange<vec>{n.box_min, n.box_max}.expand_all(
sham::max(sender_h_max, int_range_max.get(id_found)));
#else
CoordRange<vec> receiv_exp
= CoordRange<vec>{n.box_min, n.box_max}.expand_all(
int_range_max.get(id_found));
#endif

CoordRange<vec> interf_volume = sender_bsize.get_intersect(
receiv_exp.add_offset(-periodic_offset));
Expand Down Expand Up @@ -361,21 +384,40 @@ auto BasicSPHGhostHandler<vec>::find_interfaces(

sptree.host_for_each_leafs(
[&](u64 tree_id, PtNode n) {
#ifdef NEW_GZ_INTERACT_CRIT
// The ghost interaction was not symmetric before
// now it is since we check for the max of the two h_max
flt receiv_h_max = acc_tf[tree_id];
shammath::AABB<vec> tree_cell{n.box_min, n.box_max};
tree_cell = tree_cell.expand_all(sham::max(sender_h_max, receiv_h_max));

return tree_cell
.get_intersect(
shammath::AABB<vec>{sender_bsize_off.lower, sender_bsize_off.upper})
.is_not_empty();
#else
flt receiv_h_max = acc_tf[tree_id];
CoordRange<vec> receiv_exp{
n.box_min - receiv_h_max, n.box_max + receiv_h_max};

return receiv_exp.get_intersect(sender_bsize_off).is_not_empty();
#endif
},
[&](u64 id_found, PtNode n) {
if ((id_found == psender.id_patch) && (xoff == 0) && (yoff == 0)
&& (zoff == 0)) {
return;
}

#ifdef NEW_GZ_INTERACT_CRIT
CoordRange<vec> receiv_exp
= CoordRange<vec>{n.box_min, n.box_max}.expand_all(
sham::max(sender_h_max, int_range_max.get(id_found)));
#else
CoordRange<vec> receiv_exp
= CoordRange<vec>{n.box_min, n.box_max}.expand_all(
int_range_max.get(id_found));
#endif

CoordRange<vec> interf_volume
= sender_bsize.get_intersect(receiv_exp.add_offset(-offset));
Expand Down Expand Up @@ -413,18 +455,36 @@ auto BasicSPHGhostHandler<vec>::find_interfaces(

sptree.host_for_each_leafs(
[&](u64 tree_id, PtNode n) {
#ifdef NEW_GZ_INTERACT_CRIT
// The ghost interaction was not symmetric before
// now it is since we check for the max of the two h_max
flt receiv_h_max = acc_tf[tree_id];
shammath::AABB<vec> tree_cell{n.box_min, n.box_max};
tree_cell = tree_cell.expand_all(sham::max(sender_h_max, receiv_h_max));

return tree_cell
.get_intersect(
shammath::AABB<vec>{sender_bsize_off.lower, sender_bsize_off.upper})
.is_not_empty();
#else
flt receiv_h_max = acc_tf[tree_id];
CoordRange<vec> receiv_exp{n.box_min - receiv_h_max, n.box_max + receiv_h_max};

return receiv_exp.get_intersect(sender_bsize_off).is_not_empty();
#endif
},
[&](u64 id_found, PtNode n) {
if (id_found == psender.id_patch) {
return;
}

#ifdef NEW_GZ_INTERACT_CRIT
CoordRange<vec> receiv_exp = CoordRange<vec>{n.box_min, n.box_max}.expand_all(
sham::max(sender_h_max, int_range_max.get(id_found)));
#else
CoordRange<vec> receiv_exp = CoordRange<vec>{n.box_min, n.box_max}.expand_all(
int_range_max.get(id_found));
#endif

CoordRange<vec> interf_volume
= sender_bsize.get_intersect(receiv_exp.add_offset(-periodic_offset));
Expand Down
Loading