Skip to content
Snippets Groups Projects
envelope.fut 8.08 KiB
Newer Older
type envelope_1d_t [n] = {
baptiste.coudray's avatar
baptiste.coudray committed
    east: [n]u8,  -- 0
    west: [n]u8   -- 1
}

type envelope_2d_t [n][m][ty][tx] = {
baptiste.coudray's avatar
baptiste.coudray committed
    east: [n][tx]u8,         -- 0
    north: [ty][m]u8,        -- 1
    north_east: [ty][tx]u8,  -- 2
    north_west: [ty][tx]u8,  -- 3
    south: [ty][m]u8,        -- 4
    south_east: [ty][tx]u8,  -- 5
baptiste.coudray's avatar
baptiste.coudray committed
    south_west: [ty][tx]u8,  -- 6
    west: [n][tx]u8          -- 7
}

type~ side_envelope_3d_t = {
    east: [][][]u8,       -- edge
    north: [][][]u8,      -- edge
    north_east: [][][]u8, -- vertice
    north_west: [][][]u8, -- vertice
    south: [][][]u8,      -- edge
    south_east: [][][]u8, -- vertice
    south_west: [][][]u8, -- vertice
    surface: [][][]u8,
    west: [][][]u8        -- edge
}

type~ envelope_3d_t = {
    back: side_envelope_3d_t,   -- 0
    bottom: side_envelope_3d_t, -- 1
    front: side_envelope_3d_t,  -- 2
    left: side_envelope_3d_t,   -- 3
    right: side_envelope_3d_t,  -- 4
    top: side_envelope_3d_t     -- 5
}

entry get_envelope_1d [n] (xs: [n]u8) (thickness: i64) : envelope_1d_t [thickness] =
baptiste.coudray's avatar
baptiste.coudray committed
    let west = xs[0:thickness] :> [thickness]u8
    let east = xs[n - thickness:] :> [thickness]u8
baptiste.coudray's avatar
baptiste.coudray committed
    in {east, west}
entry get_envelope_2d [n][m] (matrix: [n][m]u8) (thickness_y: i64) (thickness_x: i64): envelope_2d_t [n][m][thickness_y][thickness_x] =
baptiste.coudray's avatar
baptiste.coudray committed
    let north = matrix[0:thickness_y] :> [thickness_y][m]u8
baptiste.coudray's avatar
baptiste.coudray committed
    let north_west = matrix[0:thickness_y,0:thickness_x] :> [thickness_y][thickness_x]u8
    let north_east = matrix[0:thickness_y,m - thickness_x:m] :> [thickness_y][thickness_x]u8
baptiste.coudray's avatar
baptiste.coudray committed
    let south = matrix[n - thickness_y:] :> [thickness_y][m]u8
baptiste.coudray's avatar
baptiste.coudray committed
    let south_east = matrix[n - thickness_y:n,m - thickness_x:m] :> [thickness_y][thickness_x]u8
    let south_west = matrix[n - thickness_y:n,0:thickness_x] :> [thickness_y][thickness_x]u8
baptiste.coudray's avatar
baptiste.coudray committed
    let east = matrix[:,m - (thickness_x):] :> [n][thickness_x]u8
    let west = matrix[:,0:thickness_x] :> [n][thickness_x]u8
baptiste.coudray's avatar
baptiste.coudray committed
    in {east, north, north_east, north_west, south, south_east, south_west, west}

entry get_envelope_3d [n][m][l] (cube:[n][m][l]u8) (thickness_y: i64) (thickness_x: i64) (thickness_z: i64): envelope_3d_t =
    let front = {
        north_west = cube[0:thickness_y, 0:thickness_x, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        west = cube[:, 0:thickness_x, 0:thickness_z] :> [n][thickness_x][thickness_z]u8,
        south_west = cube[n - thickness_y:, 0:thickness_x, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        south = cube[n - thickness_y: ,:, 0:thickness_z] :>  [thickness_y][m][thickness_z]u8,
        south_east = cube[n - thickness_y:n, m - thickness_x:, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        east = cube[:, m - thickness_x:, 0:thickness_z] :> [n][thickness_x][thickness_z]u8,
        north_east = cube[0:thickness_y, m - thickness_x:, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        north = cube[0:thickness_y   ,:, 0:thickness_z] :>  [thickness_y][m][thickness_z]u8,
        surface = cube[:, :, 0:thickness_z] :> [n][m][thickness_z]u8
    }
    let back = {
        north_west = cube[0:thickness_y, 0:thickness_x, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        west = cube[:, 0:thickness_x, l-thickness_z:] :> [n][thickness_x][thickness_z]u8,
        south_west = cube[n - thickness_y:, 0:thickness_x, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        south = cube[n - thickness_y: ,:, l-thickness_z:] :>  [thickness_y][m][thickness_z]u8,
        south_east = cube[n - thickness_y:n, m - thickness_x:, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        east = cube[:, m - thickness_x:, l-thickness_z:] :> [n][thickness_x][thickness_z]u8,
        north_east = cube[0:thickness_y, m - thickness_x:, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        north = cube[0:thickness_y   ,:, l-thickness_z:] :>  [thickness_y][m][thickness_z]u8,
        surface = cube[:, :, l-thickness_z:] :> [n][m][thickness_z]u8
    }

    let top = {
        north_west = cube[0:thickness_y, 0:thickness_x, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        west = cube[0:thickness_y, 0:thickness_x, :] :> [thickness_y][thickness_x][l]u8,
        south_west = cube[0:thickness_y, 0:thickness_x, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
baptiste.coudray's avatar
baptiste.coudray committed
        south = cube[0:thickness_y, :, 0:thickness_z] :> [thickness_y][m][thickness_z]u8,
        south_east = cube[0:thickness_y, m - thickness_x:, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
baptiste.coudray's avatar
baptiste.coudray committed
        east = cube[0:thickness_y, m-thickness_x:, :] :> [thickness_y][thickness_x][l]u8,
        north_east = cube[0:thickness_y, m - thickness_x:, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        north = cube[0:thickness_y, :, l-thickness_z:] :> [thickness_y][m][thickness_z]u8,
        surface = cube[0:thickness_y, :, :] :> [thickness_y][m][l]u8
    }
    let bottom = {
        north_west = cube[n - thickness_y:, 0:thickness_x, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        west = cube[n-thickness_y:, 0:thickness_x, :] :> [thickness_y][thickness_x][l]u8,
        south_west = cube[n - thickness_y:, 0:thickness_x, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        south = cube[n-thickness_y:, :, 0:thickness_z] :> [thickness_y][m][thickness_z]u8,
        south_east = cube[n - thickness_y:n, m - thickness_x:, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        east = cube[n-thickness_y:, m-thickness_x:, :] :> [thickness_y][thickness_x][l]u8,
        north_east = cube[n - thickness_y:, m - thickness_x:, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
baptiste.coudray's avatar
baptiste.coudray committed
        north = cube[n-thickness_y:, :, l-thickness_z:] :> [thickness_y][m][thickness_z]u8,
        surface = cube[n-thickness_y:, :, :] :> [thickness_y][m][l]u8
    }

    let left = {
        north_west = cube[0:thickness_y, 0:thickness_x, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        west = cube[:, 0:thickness_x, l-thickness_z:] :> [n][thickness_x][thickness_z]u8,
        south_west = cube[n - thickness_y:, 0:thickness_x, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        south = cube[:, 0:thickness_x, l-thickness_z:] :> [n][thickness_x][thickness_z]u8,
        south_east = cube[n - thickness_y:, 0:thickness_x, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        east = cube[:, 0:thickness_x, 0:thickness_z] :> [n][thickness_x][thickness_z]u8,
        north_east = cube[0:thickness_y, 0:thickness_x, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        north =  cube[0:thickness_y, 0:thickness_x, :] :> [thickness_y][thickness_x][l]u8,
        surface = cube[:,0:thickness_x, :] :> [n][thickness_x][l]u8
    }

    let right = {
        north_west = cube[0:thickness_y, m - thickness_x:, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        west = cube[:, m - thickness_x:, 0:thickness_z] :> [n][thickness_x][thickness_z]u8,
        south_west = cube[n - thickness_y:n, m - thickness_x:, 0:thickness_z] :> [thickness_y][thickness_x][thickness_z]u8,
        south = cube[n-thickness_y:, m-thickness_x:, :] :> [thickness_y][thickness_x][l]u8,
        south_east = cube[n - thickness_y:n, m - thickness_x:, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        east = cube[:, m - thickness_x:, l-thickness_z:] :> [n][thickness_x][thickness_z]u8,
        north_east = cube[0:thickness_y, m - thickness_x:, l-thickness_z:] :> [thickness_y][thickness_x][thickness_z]u8,
        north = cube[0:thickness_y, m-thickness_x:, :] :> [thickness_y][thickness_x][l]u8,
        surface = cube[:,m-thickness_x:, :] :> [n][thickness_x][l]u8
    }

    in { back, bottom, front, left, right, top }

entry get_subdomain_1d [n] (xs: [n]u8) (x:i64) (dimensions: [1]i64) : []u8 =
    xs[x:x+dimensions[0]]

entry get_subdomain_2d [n][m] (matrix: [n][m]u8) (y:i64) (x:i64) (dimensions: [2]i64) : [][]u8 =
    matrix[y:y+dimensions[0],x:x+dimensions[1]]

entry get_subdomain_3d [n][m][l] (cube:[n][m][l]u8) (y:i64) (x:i64) (z:i64) (dimensions: [3]i64) : [][][]u8 =
    cube[y:y+dimensions[0],x:x+dimensions[1],z:z+dimensions[2]]