Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Loop: Check for symmetry boundaries in outermost interior loops #300

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
1 change: 1 addition & 0 deletions CarpetX/interface.ccl
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ USES INCLUDE HEADER: vect.hxx
USES INCLUDE HEADER: loop.hxx
USES INCLUDE HEADER: loop_device.hxx

INCLUDES HEADER: driver.hxx IN driver.hxx
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change should be in a commit CarpetX:  and not Loop.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You cannot include CarpetX files from Loop because Carpetx depends on Loop, and this would create a circular dependency.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@eschnett In the patch here, driver.hxx from CarpetX is only used in the thorns that want to use loop_outermost_int, such as TestLoopX and NewRadX. The Loop thorn itself does not depend on driver.hxx directly, but it receives the symmetry information as an argument in loop_outermost_int from the thorns that call it. Would this be sufficient to bypass the circular dependency? I'm able to compile the code with the patch and pass all test cases.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

huh. I am speaking out of turn, I guess, yet: Uh, if Loop does not use the functionality from driver.hxx the I think I should not say uses include header: driver.hxx. By the same reasoning if the client thorns (say NewRadX ) directly use the information then they should contain the uses include header: driver.hxx statement.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My take is that circularity is an issue for the REQUIRE: statements (they affect compilation order so circles are not allowed) but not the USES INCLUDE HEADER statements I would say (handled before dependency is even known to Cactus).

I agree with Erik's concern wrt CarpetX / Loop depending on each other in #300 (comment)  (since we'd want a REQUIRE to go along with the uses include header).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need this include in Loop? Since if there is the include I'd normally add a REQUIRE (otherwise Cactus may silently give you an empty include file). But the REQUIRE will introduce a circular dependency between Loop and CarpetX

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, what I'm proposing here would not need the include (and hence the REQUIRE) in Loop. By itself, the loop_outermost_int routine does not use any information from the driver. On the other hand, the client thorns that intend to take the symmetry information from the driver and pass it to loop_outermost_int, do need the include.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change still shows up in files changed as adding INCLUDE HEADER "...". So if it is not used by Loop I'd suggest to remove the change.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, from what I'm seeing the USES INCLUDE HEADER is only in TestLoopX, but not Loop. Can you point me to where it is?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oha, sorry yes you are correct. I was looking at the very wrong file. In fact not even had I confused the thorn but also INCLUDE HEADER and USES INCLUDE HEADER.

INCLUDES HEADER: reduction.hxx IN reduction.hxx


Expand Down
10 changes: 7 additions & 3 deletions Loop/src/loop.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,7 @@ public:
template <int CI, int CJ, int CK, int VS = 1, int N = 1, typename F>
inline CCTK_ATTRIBUTE_ALWAYS_INLINE void
loop_outermost_int(const vect<int, dim> &group_nghostzones,
const vect<vect<bool, dim>, 2> &is_sym_bnd,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd document what is_sym_bnd[f][d] stands for. Does this order (f then d) match what is used eg in cctk_bbox (see https://www.einsteintoolkit.org/usersguide/UsersGuide.html#x1-98000C1.6.2). Looking at the Cactus example it does seem to be different since the Cactus code uses:

An array of 2cctk_dim integers (in the order [dim_0^{min}, dim_0^{max}, dim_1^{min}, dim_1^{max}, ... ]), ...

Copy link
Contributor Author

@chcheng3 chcheng3 Oct 31, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The is_sym_bnd array follows the layout of the symmetry array from driver.hxx, which seems to be arranged in a different order from what Cactus does:

std::array<std::array<symmetry_t, dim>, 2> symmetries;

So the patch here is consistent with CarpetX, but not Cactus, which might be confusing.

const F &f) const {
// boundary_box sets bnd_min and bnd_max
vect<int, dim> bnd_min, bnd_max;
Expand Down Expand Up @@ -595,9 +596,12 @@ public:
// True when point is on left/right boundary,
// and vector is not parallel to a {face,corner,edge}
// In either of the 3 directions
if ((ni != 0 && bbox[ni < 0 ? 0 : 1][0]) ||
(nj != 0 && bbox[nj < 0 ? 0 : 1][1]) ||
(nk != 0 && bbox[nk < 0 ? 0 : 1][2])) {
if ((ni != 0 && bbox[ni < 0 ? 0 : 1][0] &&
!is_sym_bnd[ni < 0 ? 0 : 1][0]) ||
(nj != 0 && bbox[nj < 0 ? 0 : 1][1] &&
!is_sym_bnd[nj < 0 ? 0 : 1][1]) ||
(nk != 0 && bbox[nk < 0 ? 0 : 1][2] &&
!is_sym_bnd[nk < 0 ? 0 : 1][2])) {

const vect<int, dim> inormal{ni, nj, nk}; // normal vector

Expand Down
10 changes: 7 additions & 3 deletions Loop/src/loop_device.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,7 @@ public:
int NT = AMREX_GPU_MAX_THREADS, typename F>
inline CCTK_ATTRIBUTE_ALWAYS_INLINE void
loop_outermost_int_device(const vect<int, dim> &group_nghostzones,
const vect<vect<bool, dim>, 2> &is_sym_bnd,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same comment as above.

const F &f) const {
// boundary_box sets bnd_min and bnd_max
vect<int, dim> bnd_min, bnd_max;
Expand Down Expand Up @@ -329,9 +330,12 @@ public:
// True when point is on left/right boundary,
// and vector is not parallel to a {face,corner,edge}
// In either of the 3 directions
if ((ni != 0 && bbox[ni < 0 ? 0 : 1][0]) ||
(nj != 0 && bbox[nj < 0 ? 0 : 1][1]) ||
(nk != 0 && bbox[nk < 0 ? 0 : 1][2])) {
if ((ni != 0 && bbox[ni < 0 ? 0 : 1][0] &&
!is_sym_bnd[ni < 0 ? 0 : 1][0]) ||
(nj != 0 && bbox[nj < 0 ? 0 : 1][1] &&
!is_sym_bnd[nj < 0 ? 0 : 1][1]) ||
(nk != 0 && bbox[nk < 0 ? 0 : 1][2] &&
!is_sym_bnd[nk < 0 ? 0 : 1][2])) {

const vect<int, dim> inormal{ni, nj, nk}; // normal vector

Expand Down
2 changes: 1 addition & 1 deletion TestLoopX/configuration.ccl
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
# Configuration definitions for thorn TestLoopX

REQUIRES Loop
REQUIRES CarpetX Loop
1 change: 1 addition & 0 deletions TestLoopX/interface.ccl
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Interface definition for thorn TestLoopX
IMPLEMENTS: TestLoopX

USES INCLUDE HEADER: driver.hxx
USES INCLUDE HEADER: loop.hxx
USES INCLUDE HEADER: loop_device.hxx

Expand Down
18 changes: 16 additions & 2 deletions TestLoopX/src/testloop.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <cctk_Parameters.h>
#include <loop.hxx>
#include <loop_device.hxx>
#include <driver.hxx>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd use the double quote form of include using " instead of hte <> form since none of these files are system include files.

See

https://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

for the details (there won't be a difference in Cactus using gcc since we use -I to add the extra paths).

The C99 standard say (in https://en.cppreference.com/w/cpp/preprocessor/include) that the double quote variant

The intent of syntax (2) is to search for the files that are not controlled by the implementation.

ie include files not provided by the compiler.

Exactly where you put that cut-off between " and <> is a matter of some choice it seems.


namespace TestLoopX {
using namespace Loop;
Expand All @@ -27,15 +28,28 @@ extern "C" void TestLoopX_OutermostInterior(CCTK_ARGUMENTS) {
DECLARE_CCTK_ARGUMENTSX_TestLoopX_OutermostInterior;
DECLARE_CCTK_PARAMETERS;

const auto symmetries = CarpetX::ghext->patchdata.at(cctk_patch).symmetries;
const vect<vect<bool, Loop::dim>, 2> is_sym_bnd {
{
symmetries[0][0] != CarpetX::symmetry_t::none,
symmetries[0][1] != CarpetX::symmetry_t::none,
symmetries[0][2] != CarpetX::symmetry_t::none
},
{
symmetries[1][0] != CarpetX::symmetry_t::none,
symmetries[1][1] != CarpetX::symmetry_t::none,
symmetries[1][2] != CarpetX::symmetry_t::none
}
};
grid.loop_outermost_int<0, 0, 0>(
grid.nghostzones,
grid.nghostzones, is_sym_bnd,
[=] CCTK_DEVICE CCTK_HOST(const PointDesc &p)
CCTK_ATTRIBUTE_ALWAYS_INLINE {
testloop_gf(p.I) += 10.0;
});

grid.loop_outermost_int_device<0, 0, 0>(
grid.nghostzones,
grid.nghostzones, is_sym_bnd,
[=] CCTK_DEVICE CCTK_HOST(const PointDesc &p)
CCTK_ATTRIBUTE_ALWAYS_INLINE {
testloop_gf(p.I) += 1.0;
Expand Down
38 changes: 27 additions & 11 deletions TestLoopX/test/testloopx_outermost_interior.par
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,37 @@ Cactus::cctk_itlast = 0
CarpetX::verbose = "no"
CarpetX::poison_undefined_values = "yes"

CarpetX::xmin = -10
CarpetX::ymin = -10
CarpetX::zmin = -10
CarpetX::xmax = +10
CarpetX::ymax = +10
CarpetX::zmax = +10
CarpetX::xmin = -8
CarpetX::ymin = -8
CarpetX::zmin = 0
CarpetX::xmax = +8
CarpetX::ymax = +8
CarpetX::zmax = +8

CarpetX::boundary_x = "none"
CarpetX::boundary_y = "dirichlet"
CarpetX::boundary_z = "none"

CarpetX::boundary_upper_x = "none"
CarpetX::boundary_upper_y = "dirichlet"
CarpetX::boundary_upper_z = "dirichlet"

CarpetX::reflection_x = "no"
CarpetX::reflection_y = "no"
CarpetX::reflection_z = "yes"

CarpetX::reflection_upper_x = "no"
CarpetX::reflection_upper_y = "no"
CarpetX::reflection_upper_z = "no"

Driver::periodic = "yes"
Driver::periodic_x = "yes"
Driver::periodic_y = "yes"
Driver::periodic_z = "yes"
Driver::periodic_y = "no"
Driver::periodic_z = "no"

CarpetX::ncells_x = 40
CarpetX::ncells_y = 40
CarpetX::ncells_z = 40
CarpetX::ncells_x = 32
CarpetX::ncells_y = 32
CarpetX::ncells_z = 16

CarpetX::max_num_levels = 1
CarpetX::regrid_every = 1
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,40 @@
# 1:iteration 2:time 3:patch 4:level 5:i 6:j 7:k 8:x 9:y 10:z 11:testloop_gf
0 0.0000000000000000e+00 0 0 -3 20 20 -1.1500000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 -2 20 20 -1.1000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 -1 20 20 -1.0500000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 0 20 20 -1.0000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 1 20 20 -9.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 2 20 20 -9.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 3 20 20 -8.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 4 20 20 -8.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 5 20 20 -7.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 6 20 20 -7.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 7 20 20 -6.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 8 20 20 -6.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 9 20 20 -5.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 10 20 20 -5.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 11 20 20 -4.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 12 20 20 -4.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 13 20 20 -3.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 14 20 20 -3.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 15 20 20 -2.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 16 20 20 -2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 17 20 20 -1.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 18 20 20 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 19 20 20 -5.0000000000000000e-01 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 20 20 20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 21 20 20 5.0000000000000000e-01 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 22 20 20 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 23 20 20 1.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 24 20 20 2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 25 20 20 2.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 26 20 20 3.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 27 20 20 3.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 28 20 20 4.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 29 20 20 4.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 30 20 20 5.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 31 20 20 5.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 32 20 20 6.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 33 20 20 6.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 34 20 20 7.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 35 20 20 7.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 36 20 20 8.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 37 20 20 8.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 38 20 20 9.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 39 20 20 9.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 40 20 20 1.0000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 41 20 20 1.0500000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 42 20 20 1.1000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.1000000000000000e+01
0 0.0000000000000000e+00 0 0 43 20 20 1.1500000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 -3 16 0 -9.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 -2 16 0 -9.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 -1 16 0 -8.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 0 16 0 -8.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 1 16 0 -7.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 2 16 0 -7.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 3 16 0 -6.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 4 16 0 -6.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 5 16 0 -5.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 6 16 0 -5.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 7 16 0 -4.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 8 16 0 -4.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 9 16 0 -3.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 10 16 0 -3.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 11 16 0 -2.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 12 16 0 -2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 13 16 0 -1.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 14 16 0 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 15 16 0 -5.0000000000000000e-01 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 16 16 0 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 17 16 0 5.0000000000000000e-01 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 18 16 0 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 19 16 0 1.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 20 16 0 2.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 21 16 0 2.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 22 16 0 3.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 23 16 0 3.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 24 16 0 4.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 25 16 0 4.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 26 16 0 5.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 27 16 0 5.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 28 16 0 6.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 29 16 0 6.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 30 16 0 7.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 31 16 0 7.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 32 16 0 8.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 33 16 0 8.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 34 16 0 9.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
0 0.0000000000000000e+00 0 0 35 16 0 9.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
Loading