waLBerla 7.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
walberla::stencil Namespace Reference

Namespaces

namespace  internal
 

Classes

class  Iterator
 Iterator over all directions contained in a stencil. More...
 

Typedefs

using $name = internal::$name<>
 

Enumerations

enum  Direction {
  C = 0 , N = 1 , S = 2 , W = 3 ,
  E = 4 , T = 5 , B = 6 , NW = 7 ,
  NE = 8 , SW = 9 , SE = 10 , TN = 11 ,
  TS = 12 , TW = 13 , TE = 14 , BN = 15 ,
  BS = 16 , BW = 17 , BE = 18 , TNE = 19 ,
  TNW = 20 , TSE = 21 , TSW = 22 , BNE = 23 ,
  BNW = 24 , BSE = 25 , BSW = 26 , INVALID_DIR = 27
}
 
enum  BinaryDirection {
  Bin_C = 1<<0 , Bin_N = 1<<1 , Bin_S = 1<<2 , Bin_W = 1<<3 ,
  Bin_E = 1<<4 , Bin_T = 1<<5 , Bin_B = 1<<6 , Bin_NW = 1<<7 ,
  Bin_NE = 1<<8 , Bin_SW = 1<<9 , Bin_SE = 1<<10 , Bin_TN = 1<<11 ,
  Bin_TS = 1<<12 , Bin_TW = 1<<13 , Bin_TE = 1<<14 , Bin_BN = 1<<15 ,
  Bin_BS = 1<<16 , Bin_BW = 1<<17 , Bin_BE = 1<<18 , Bin_TNE = 1<<19 ,
  Bin_TNW = 1<<20 , Bin_TSE = 1<<21 , Bin_TSW = 1<<22 , Bin_BNE = 1<<23 ,
  Bin_BNW = 1<<24 , Bin_BSE = 1<<25 , Bin_BSW = 1<<26
}
 

Functions

template<typename U >
Direction getQuadrant (const math::GenericAABB< U > &aabb, const typename math::GenericAABB< U >::vector_type &p)
 Determine sin which neighboring section of an AABB a point lies.
 
Direction vectorToDirection (cell_idx_t x, cell_idx_t y, cell_idx_t z)
 Maps a (x,y,z) direction vector to its direction.
 
Direction vectorToDirection (Vector3< cell_idx_t > vec)
 
bool isFaceDirection (Direction dir)
 
bool isEdgeDirection (Direction dir)
 
bool isCornerDirection (Direction dir)
 
Direction directionFromAxis (int axis, bool minOrMax)
 Maps (direction,axis) pair to direction.
 
Direction directionFromAxis (uint_t axis, bool minOrMax)
 Maps (direction,axis) pair to direction.
 
Cell operator+ (const Cell &cell, const Direction d)
 Computes neighbor from cell in direction d.
 
Cell operator- (const Cell &cell, const Direction d)
 Computes neighbor from cell in direction inverseDir[d].
 
Celloperator+= (Cell &cell, const Direction d)
 Shifts cell to its neighbor in direction d.
 
Celloperator-= (Cell &cell, const Direction d)
 Shifts cell to its neighbor in direction inverseDir[d].
 

Variables

const uint_t NR_OF_DIRECTIONS = 27
 
const std::array< int, NR_OF_DIRECTIONScx
 The x component for each direction.
 
const std::array< int, NR_OF_DIRECTIONScy
 The y component for each direction.
 
const std::array< int, NR_OF_DIRECTIONScz
 The z component for each direction.
 
const std::array< std::array< int, NR_OF_DIRECTIONS >, 3 > c
 The x,y,z component for each direction.
 
const std::array< std::array< real_t, NR_OF_DIRECTIONS >, 3 > cNorm
 The x,y,z component for each normalized direction.
 
const std::array< std::string, NR_OF_DIRECTIONSdirToString
 String representation for each direction.
 
const std::array< BinaryDirection, NR_OF_DIRECTIONSdirToBinary
 Binary encoded direction for each direction.
 
const std::array< Direction, NR_OF_DIRECTIONSinverseDir
 Inverse directions.
 
const std::array< real_t, NR_OF_DIRECTIONSdirLength
 Length for each direction.
 
const std::array< real_t, NR_OF_DIRECTIONSgaussianWeights
 
const std::array< uint_t, NR_OF_DIRECTIONSgaussianMultipliers
 
const std::array< Direction, NR_OF_DIRECTIONSmirrorX
 The mirrored directions (flip W-E)
 
const std::array< Direction, NR_OF_DIRECTIONSmirrorY
 The mirrored directions (flip N-S)
 
const std::array< Direction, NR_OF_DIRECTIONSmirrorZ
 The mirrored directions (flip T-B)
 
const std::array< std::array< Direction, NR_OF_DIRECTIONS >, 3 > map2Dto3D
 Maps from 2D directions (C, N, S, W, E, NW, NE, SW, SE) to 3D directions, by slicing through x,y or z coordinate The first array index represents the slice dimension ( 0 for x, 1 for y, 2 for z) Example: printing a slice through x coordinate (keeping x fixed) of a D3Q19 field:
 

Typedef Documentation

◆ $name

Enumeration Type Documentation

◆ BinaryDirection

Enumerator
Bin_C 

Center.

Bin_N 

North.

Bin_S 

South.

Bin_W 

West.

Bin_E 

East.

Bin_T 

Top.

Bin_B 

Bottom.

Bin_NW 

North-West.

Bin_NE 

North-East.

Bin_SW 

South-West.

Bin_SE 

South-East.

Bin_TN 

Top-North.

Bin_TS 

Top-South.

Bin_TW 

Top-West.

Bin_TE 

Top-East.

Bin_BN 

Bottom-North.

Bin_BS 

Bottom-South.

Bin_BW 

Bottom-West.

Bin_BE 

Bottom-East.

Bin_TNE 

Top-North-East.

Bin_TNW 

Top-North-West.

Bin_TSE 

Top-South-East.

Bin_TSW 

Top-South-West.

Bin_BNE 

Bottom-North-East.

Bin_BNW 

Bottom-North-West.

Bin_BSE 

Bottom-South-East.

Bin_BSW 

Bottom-South-West.

◆ Direction

Enumerator

Center.

North.

South.

West.

East.

Top.

Bottom.

NW 

North-West.

NE 

North-East.

SW 

South-West.

SE 

South-East.

TN 

Top-North.

TS 

Top-South.

TW 

Top-West.

TE 

Top-East.

BN 

Bottom-North.

BS 

Bottom-South.

BW 

Bottom-West.

BE 

Bottom-East.

TNE 

Top-North-East.

TNW 

Top-North-West.

TSE 

Top-South-East.

TSW 

Top-South-West.

BNE 

Bottom-North-East.

BNW 

Bottom-North-West.

BSE 

Bottom-South-East.

BSW 

Bottom-South-West.

INVALID_DIR 

Invalid direction.

Function Documentation

◆ directionFromAxis() [1/2]

Direction walberla::stencil::directionFromAxis ( int axis,
bool minOrMax )
inline

Maps (direction,axis) pair to direction.

Parameters
axis0,1 or 2 standing for x,y,z
minOrMaxif true, the direction pointing in the negative axis direction is returned, if false, the positive axis direction

◆ directionFromAxis() [2/2]

Direction walberla::stencil::directionFromAxis ( uint_t axis,
bool minOrMax )
inline

Maps (direction,axis) pair to direction.

Parameters
axis0,1 or 2 standing for x,y,z
minOrMaxif true, the direction pointing in the negative axis direction is returned, if false, the positive axis direction

◆ getQuadrant()

template<typename U >
Direction walberla::stencil::getQuadrant ( const math::GenericAABB< U > & aabb,
const typename math::GenericAABB< U >::vector_type & p )

Determine sin which neighboring section of an AABB a point lies.

If p lies within aabb returns C. Other it is determined in which of the 26 imaginary neighboring AABBs p is located. The direction of the from aabb to the determined neighboring aabb is returned

2D Example:

----------------------— Let aabb be the AABB marked with asterisks. The boxes surrounding aabb are the eight (in 2D) imaginary | | | | neighboring boxes. Let p be marked with x. The result of the function would be NE. | | | x |
| | | | -----—*********-----— | * * | | * * | | * * | -----—*********-----—


Template Parameters
TThe scalar data type used for the AABB and the tested point
Parameters
aabbThe AABB
pThe tested point

◆ isCornerDirection()

bool walberla::stencil::isCornerDirection ( Direction dir)
inline

◆ isEdgeDirection()

bool walberla::stencil::isEdgeDirection ( Direction dir)
inline

◆ isFaceDirection()

bool walberla::stencil::isFaceDirection ( Direction dir)
inline

◆ operator+()

Cell walberla::stencil::operator+ ( const Cell & cell,
const Direction d )
inline

Computes neighbor from cell in direction d.

Parameters
cellorigin cell
ddirection pointing towards the computed neighbor

◆ operator+=()

Cell & walberla::stencil::operator+= ( Cell & cell,
const Direction d )
inline

Shifts cell to its neighbor in direction d.

Parameters
cellshifted cell
ddirection in which to shift the cell

◆ operator-()

Cell walberla::stencil::operator- ( const Cell & cell,
const Direction d )
inline

Computes neighbor from cell in direction inverseDir[d].

Parameters
cellorigin cell
ddirection pointing away from the computed neighbor

◆ operator-=()

Cell & walberla::stencil::operator-= ( Cell & cell,
const Direction d )
inline

Shifts cell to its neighbor in direction inverseDir[d].

Parameters
cellshifted cell
ddirection opposite to which the cell gets shifted

◆ vectorToDirection() [1/2]

Direction walberla::stencil::vectorToDirection ( cell_idx_t x,
cell_idx_t y,
cell_idx_t z )
inline

Maps a (x,y,z) direction vector to its direction.

◆ vectorToDirection() [2/2]

Direction walberla::stencil::vectorToDirection ( Vector3< cell_idx_t > vec)
inline

Variable Documentation

◆ c

const std::array< std::array< int, NR_OF_DIRECTIONS >, 3 > walberla::stencil::c
Initial value:
{ {
{
0, 0, 0, -1, 1, 0, 0, -1, 1, -1, 1, 0, 0, -1, 1, 0, 0, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1
}, {
0, 1, -1, 0, 0, 0, 0, 1, 1, -1, -1, 1, -1, 0, 0, 1, -1, 0, 0, 1, 1, -1, -1, 1, 1, -1, -1
}, {
0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1
}
} }

The x,y,z component for each direction.

◆ cNorm

const std::array< std::array< real_t, NR_OF_DIRECTIONS >, 3 > walberla::stencil::cNorm
Initial value:
{ {
{
real_t(0), real_t(0), real_t(0), real_t(-1), real_t(1), real_t(0), real_t(0), real_t(-1) / std::sqrt( real_t(2) ),
real_t(1) / std::sqrt( real_t(2) ), real_t(-1) / std::sqrt( real_t(2) ), real_t(1) / std::sqrt( real_t(2) ), real_t(0), real_t(0),
real_t(-1) / std::sqrt( real_t(2) ), real_t(1) / std::sqrt( real_t(2) ), real_t(0), real_t(0), real_t(-1) / std::sqrt( real_t(2) ),
real_t(1) / std::sqrt( real_t(2) ), real_t(1) / std::sqrt( real_t(3) ), real_t(-1) / std::sqrt( real_t(3) ),
real_t(1) / std::sqrt( real_t(3) ), real_t(-1) / std::sqrt( real_t(3) ), real_t(1) / std::sqrt( real_t(3) ),
real_t(-1) / std::sqrt( real_t(3) ), real_t(1) / std::sqrt( real_t(3) ), real_t(-1) / std::sqrt( real_t(3) )
}, {
real_t(0), real_t(1), real_t(-1), real_t(0), real_t(0), real_t(0), real_t(0), real_t(1) / std::sqrt( real_t(2) ),
real_t(1) / std::sqrt( real_t(2) ), real_t(-1) / std::sqrt( real_t(2) ), real_t(-1) / std::sqrt( real_t(2) ),
real_t(1) / std::sqrt( real_t(2) ), real_t(-1) / std::sqrt( real_t(2) ), real_t(0), real_t(0), real_t(1) / std::sqrt( real_t(2) ),
real_t(-1) / std::sqrt( real_t(2) ), real_t(0), real_t(0), real_t(1) / std::sqrt( real_t(3) ), real_t(1) / std::sqrt( real_t(3) ),
real_t(-1) / std::sqrt( real_t(3) ), real_t(-1) / std::sqrt( real_t(3) ), real_t(1) / std::sqrt( real_t(3) ),
real_t(1) / std::sqrt( real_t(3) ), real_t(-1) / std::sqrt( real_t(3) ), real_t(-1) / std::sqrt( real_t(3) )
}, {
real_t(0), real_t(0), real_t(0), real_t(0), real_t(0), real_t(1), real_t(-1), real_t(0), real_t(0), real_t(0), real_t(0),
real_t(1) / std::sqrt( real_t(2) ), real_t(1) / std::sqrt( real_t(2) ), real_t(1) / std::sqrt( real_t(2) ),
real_t(1) / std::sqrt( real_t(2) ), real_t(-1) / std::sqrt( real_t(2) ), real_t(-1) / std::sqrt( real_t(2) ),
real_t(-1) / std::sqrt( real_t(2) ), real_t(-1) / std::sqrt( real_t(2) ), real_t(1) / std::sqrt( real_t(3) ),
real_t(1) / std::sqrt( real_t(3) ), real_t(1) / std::sqrt( real_t(3) ), real_t(1) / std::sqrt( real_t(3) ),
real_t(-1) / std::sqrt( real_t(3) ), real_t(-1) / std::sqrt( real_t(3) ), real_t(-1) / std::sqrt( real_t(3) ),
real_t(-1) / std::sqrt( real_t(3) )
}
} }
float real_t
Definition DataTypes.h:167

The x,y,z component for each normalized direction.

◆ cx

const std::array< int, NR_OF_DIRECTIONS > walberla::stencil::cx
Initial value:
{
0, 0, 0, -1, 1, 0, 0, -1, 1, -1, 1, 0, 0, -1, 1, 0, 0, -1, 1, 1, -1, 1, -1, 1, -1, 1, -1
}

The x component for each direction.

◆ cy

const std::array< int, NR_OF_DIRECTIONS > walberla::stencil::cy
Initial value:
{
0, 1, -1, 0, 0, 0, 0, 1, 1, -1, -1, 1, -1, 0, 0, 1, -1, 0, 0, 1, 1, -1, -1, 1, 1, -1, -1
}

The y component for each direction.

◆ cz

const std::array< int, NR_OF_DIRECTIONS > walberla::stencil::cz
Initial value:
{
0, 0, 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, 1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1, -1, -1, -1, -1
}

The z component for each direction.

◆ dirLength

const std::array< real_t, NR_OF_DIRECTIONS > walberla::stencil::dirLength
Initial value:
{
real_t(0), real_t(1), real_t(1), real_t(1), real_t(1), real_t(1), real_t(1),
std::sqrt( real_t(2) ), std::sqrt( real_t(2) ), std::sqrt( real_t(2) ), std::sqrt( real_t(2) ),
std::sqrt( real_t(2) ), std::sqrt( real_t(2) ), std::sqrt( real_t(2) ), std::sqrt( real_t(2) ),
std::sqrt( real_t(2) ), std::sqrt( real_t(2) ), std::sqrt( real_t(2) ), std::sqrt( real_t(2) ),
std::sqrt( real_t(3) ), std::sqrt( real_t(3) ), std::sqrt( real_t(3) ), std::sqrt( real_t(3) ),
std::sqrt( real_t(3) ), std::sqrt( real_t(3) ), std::sqrt( real_t(3) ), std::sqrt( real_t(3) )
}

Length for each direction.

◆ dirToBinary

const std::array< BinaryDirection, NR_OF_DIRECTIONS > walberla::stencil::dirToBinary
Initial value:
{
}
@ Bin_BE
Bottom-East.
Definition Directions.h:96
@ Bin_BS
Bottom-South.
Definition Directions.h:94
@ Bin_BNW
Bottom-North-West.
Definition Directions.h:102
@ Bin_BW
Bottom-West.
Definition Directions.h:95
@ Bin_TE
Top-East.
Definition Directions.h:92
@ Bin_E
East.
Definition Directions.h:82
@ Bin_SE
South-East.
Definition Directions.h:88
@ Bin_TNW
Top-North-West.
Definition Directions.h:98
@ Bin_SW
South-West.
Definition Directions.h:87
@ Bin_BSW
Bottom-South-West.
Definition Directions.h:104
@ Bin_NE
North-East.
Definition Directions.h:86
@ Bin_TW
Top-West.
Definition Directions.h:91
@ Bin_TN
Top-North.
Definition Directions.h:89
@ Bin_TSE
Top-South-East.
Definition Directions.h:99
@ Bin_TSW
Top-South-West.
Definition Directions.h:100
@ Bin_TS
Top-South.
Definition Directions.h:90
@ Bin_N
North.
Definition Directions.h:79
@ Bin_NW
North-West.
Definition Directions.h:85
@ Bin_B
Bottom.
Definition Directions.h:84
@ Bin_BNE
Bottom-North-East.
Definition Directions.h:101
@ Bin_W
West.
Definition Directions.h:81
@ Bin_BN
Bottom-North.
Definition Directions.h:93
@ Bin_BSE
Bottom-South-East.
Definition Directions.h:103
@ Bin_TNE
Top-North-East.
Definition Directions.h:97
@ Bin_S
South.
Definition Directions.h:80
@ Bin_T
Top.
Definition Directions.h:83
@ Bin_C
Center.
Definition Directions.h:78

Binary encoded direction for each direction.

◆ dirToString

const std::array< std::string, NR_OF_DIRECTIONS > walberla::stencil::dirToString
Initial value:
{
"C", "N", "S", "W", "E", "T", "B",
"NW", "NE", "SW", "SE", "TN", "TS", "TW", "TE", "BN", "BS", "BW","BE",
"TNE", "TNW", "TSE", "TSW", "BNE", "BNW", "BSE", "BSW",
}

String representation for each direction.

◆ gaussianMultipliers

const std::array< uint_t, NR_OF_DIRECTIONS > walberla::stencil::gaussianMultipliers
Initial value:
{
uint_t(8u),
uint_t(4u), uint_t(4u), uint_t(4u), uint_t(4u) ,
uint_t(4u), uint_t(4u),
uint_t(2u), uint_t(2u), uint_t(2u), uint_t(2u) ,
uint_t(2u), uint_t(2u), uint_t(2u), uint_t(2u) ,
uint_t(2u), uint_t(2u), uint_t(2u), uint_t(2u) ,
uint_t(1u), uint_t(1u), uint_t(1u), uint_t(1u) ,
uint_t(1u), uint_t(1u), uint_t(1u), uint_t(1u)
}
std::size_t uint_t
Definition DataTypes.h:133

◆ gaussianWeights

const std::array< real_t, NR_OF_DIRECTIONS > walberla::stencil::gaussianWeights
Initial value:
{
real_t(8) / real_t(64),
real_t(4) / real_t(64), real_t(4) / real_t(64), real_t(4) / real_t(64), real_t(4) / real_t(64),
real_t(4) / real_t(64), real_t(4) / real_t(64),
real_t(2) / real_t(64), real_t(2) / real_t(64), real_t(2) / real_t(64), real_t(2) / real_t(64),
real_t(2) / real_t(64), real_t(2) / real_t(64), real_t(2) / real_t(64), real_t(2) / real_t(64),
real_t(2) / real_t(64), real_t(2) / real_t(64), real_t(2) / real_t(64), real_t(2) / real_t(64),
real_t(1) / real_t(64), real_t(1) / real_t(64), real_t(1) / real_t(64), real_t(1) / real_t(64),
real_t(1) / real_t(64), real_t(1) / real_t(64), real_t(1) / real_t(64), real_t(1) / real_t(64)
}

◆ inverseDir

const std::array< Direction, NR_OF_DIRECTIONS > walberla::stencil::inverseDir
Initial value:
{
C, S, N, E, W, B, T,
SE, SW, NE, NW, BS, BN, BE, BW, TS, TN, TE, TW,
}
@ BSW
Bottom-South-West.
Definition Directions.h:64
@ W
West.
Definition Directions.h:41
@ TE
Top-East.
Definition Directions.h:52
@ TN
Top-North.
Definition Directions.h:49
@ TNE
Top-North-East.
Definition Directions.h:57
@ BNE
Bottom-North-East.
Definition Directions.h:61
@ E
East.
Definition Directions.h:42
@ BSE
Bottom-South-East.
Definition Directions.h:63
@ TSE
Top-South-East.
Definition Directions.h:59
@ C
Center.
Definition Directions.h:38
@ TS
Top-South.
Definition Directions.h:50
@ BS
Bottom-South.
Definition Directions.h:54
@ NW
North-West.
Definition Directions.h:45
@ SW
South-West.
Definition Directions.h:47
@ TSW
Top-South-West.
Definition Directions.h:60
@ TW
Top-West.
Definition Directions.h:51
@ BN
Bottom-North.
Definition Directions.h:53
@ B
Bottom.
Definition Directions.h:44
@ N
North.
Definition Directions.h:39
@ BNW
Bottom-North-West.
Definition Directions.h:62
@ SE
South-East.
Definition Directions.h:48
@ BW
Bottom-West.
Definition Directions.h:55
@ BE
Bottom-East.
Definition Directions.h:56
@ S
South.
Definition Directions.h:40
@ NE
North-East.
Definition Directions.h:46
@ TNW
Top-North-West.
Definition Directions.h:58

Inverse directions.

◆ map2Dto3D

const std::array< std::array< Direction, NR_OF_DIRECTIONS >, 3 > walberla::stencil::map2Dto3D
Initial value:
{
{
{ C, T, B, S, N, INVALID_DIR, INVALID_DIR, TS, TN, BS, BN,
{ C, T, B, W, E, INVALID_DIR, INVALID_DIR, TW, TE, BW, BE,
{ C, N, S, W, E, INVALID_DIR, INVALID_DIR, NW, NE, SW, SE,
INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR,
INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR, INVALID_DIR }
} }
@ INVALID_DIR
Invalid direction.
Definition Directions.h:65

Maps from 2D directions (C, N, S, W, E, NW, NE, SW, SE) to 3D directions, by slicing through x,y or z coordinate The first array index represents the slice dimension ( 0 for x, 1 for y, 2 for z) Example: printing a slice through x coordinate (keeping x fixed) of a D3Q19 field:

for(auto i = D2Q9::begin(); i != D2Q9::end(); ++i)
cout << pdfField.get(x,y,z, D3Q19::idx[ map2Dto3D[0][*i] ] ) << endl;
T & get(cell_idx_t x, cell_idx_t y, cell_idx_t z)
get function with only (x,y,z) coordinates, assumes fSize=1
Definition Field.impl.h:758
Extends the Field with ghost-layer information.
Definition GhostLayerField.h:51
const std::array< std::array< Direction, NR_OF_DIRECTIONS >, 3 > map2Dto3D
Maps from 2D directions (C, N, S, W, E, NW, NE, SW, SE) to 3D directions, by slicing through x,...
Definition Directions.h:287

◆ mirrorX

const std::array< Direction, NR_OF_DIRECTIONS > walberla::stencil::mirrorX
Initial value:
{
C, N, S, E, W, T, B,
NE, NW, SE, SW, TN, TS, TE, TW, BN, BS, BE, BW,
}

The mirrored directions (flip W-E)

◆ mirrorY

const std::array< Direction, NR_OF_DIRECTIONS > walberla::stencil::mirrorY
Initial value:
{
C, S, N, W, E, T, B,
SW, SE, NW, NE, TS, TN, TW, TE, BS, BN, BW, BE,
}

The mirrored directions (flip N-S)

◆ mirrorZ

const std::array< Direction, NR_OF_DIRECTIONS > walberla::stencil::mirrorZ
Initial value:
{
C, N, S, W, E, B, T,
NW, NE, SW, SE, BN, BS, BW, BE, TN, TS, TW, TE,
}

The mirrored directions (flip T-B)

◆ NR_OF_DIRECTIONS

const uint_t walberla::stencil::NR_OF_DIRECTIONS = 27