示例#1
0
def test_load_from_ugrid_file():

    data_dir = Path(__file__).absolute().parent / '../../data'

    gr = Grid()

    gr.setFlags(1, 1)

    filename = str(data_dir / Path('cs_4.nc'))
    gr.loadFrom2DUgrid(f'{filename}:physics')

    nedges = gr.getNumberOfEdges()
    print(f'nedges = {nedges}')
    assert nedges == 192

    ncells = gr.getNumberOfCells()
    for icell in range(ncells):
        for iedge in range(4):
            edgeId, edgeSign = gr.getEdgeId(icell, iedge)
            nodeIds = gr.getNodeIds(icell, iedge)
            print(
                f'cell {icell} edge {iedge}: edgeId = {edgeId}, {edgeSign} nodeIds = {nodeIds}'
            )

    # attaching a 3 components field to the grid
    data = numpy.array(range(ncells * 4 * 3), numpy.float64)
    gr.attach('myData', data)
示例#2
0
文件: test_grid.py 项目: pletzer/mint
def test_load_from_ugrid_file2():
    gr = Grid()
    gr.setFlags(1, 1)
    filename = str(DATA_DIR / Path('lfric_diag_wind.nc'))
    gr.loadFromUgrid2DFile(f'{filename}$Mesh2d')
    nedges = gr.getNumberOfEdges()
    print(f'nedges = {nedges}')
    assert (nedges == 3072)
示例#3
0
文件: test_grid.py 项目: pletzer/mint
def test_edge_arc_lengths():
    gr = Grid()
    gr.setFlags(1, 1)
    filename = str(DATA_DIR / Path('cs_4.nc'))
    gr.loadFromUgrid2DFile(f'{filename}$physics')
    gr.computeEdgeArcLengths()
    ncells = gr.getNumberOfCells()
    for icell in range(ncells):
        for edgeIndex in range(4):
            arcLength = gr.getEdgeArcLength(icell, edgeIndex)
            print(f""""
cell {icell} edge {edgeIndex} edge arc length/radius: {arcLength}""")
示例#4
0
def test_identity():

    srcGrid = Grid()
    srcGrid.setFlags(fixLonAcrossDateline=0, averageLonAtPole=0,
                     degrees=True)  # uniform lat-lon
    filename = str(DATA_DIR / Path('latlon4x2.nc'))
    meshname = 'latlon'
    srcGrid.loadFromUgrid2DFile(f'{filename}${meshname}')

    # destination and source grids are the same
    dstGrid = Grid()
    dstGrid.setFlags(fixLonAcrossDateline=0, averageLonAtPole=0,
                     degrees=True)  # uniform lat-lon
    filename = str(DATA_DIR / Path('latlon4x2.nc'))
    meshname = 'latlon'
    dstGrid.loadFromUgrid2DFile(f'{filename}${meshname}')

    regridder = RegridEdges()

    # even though the grids are the same, we still need to create two
    # grid instances
    regridder.setSrcGrid(srcGrid)
    regridder.setDstGrid(dstGrid)

    # compute the weights
    regridder.buildLocator(numCellsPerBucket=128,
                           periodX=360.,
                           enableFolding=False)
    regridder.computeWeights(debug=2)

    # create a mock field
    num_edges = srcGrid.getNumberOfEdges()
    src_data = numpy.array(range(0, num_edges), numpy.float64)

    # allocate space to receive the interpolated data
    dst_data = numpy.empty((num_edges, ), numpy.float64)

    # apply the interpolation weights
    regridder.apply(src_data, dst_data, placement=UNIQUE_EDGE_DATA)

    diff = src_data - dst_data
    for i in range(num_edges):
        print(f'{i} {diff[i]}')
    print(f'src data = {src_data}')
    print(f'dst data = {dst_data}')

    # check that we recover the original field
    error = numpy.fabs(diff).sum()
    print(f'error = {error}')
    assert error < 1.e-6
示例#5
0
文件: test_grid.py 项目: pletzer/mint
def test_load_ugrid_data():
    # a single cell
    # 3....>2....2
    # :          :
    # v          ^
    # 1          0
    # :          :
    # 0....<3....1
    xyz = numpy.array([(0., 0., 0.), (1., 0., 0.), (1., 1., 0.), (0., 1., 0.)],
                      dtype=numpy.float64)
    face2nodes = numpy.array([
        (0, 1, 2, 3),
    ], dtype=numpy.uintp)
    edge2nodes = numpy.array(
        [
            (1, 2),  # edge 0
            (3, 0),  # edge 1
            (3, 2),  # edge 2
            (1, 0)
        ],  # edge 3
        dtype=numpy.uintp)

    gr = Grid()
    gr.setFlags(0, 0)
    gr.loadFromUgrid2DData(xyz, face2nodes, edge2nodes)

    n0, n1 = gr.getNodeIds(cellId=0, edgeIndex=0)
    assert (n0 == 0)
    assert (n1 == 1)

    n0, n1 = gr.getNodeIds(cellId=0, edgeIndex=1)
    assert (n0 == 1)
    assert (n1 == 2)

    n0, n1 = gr.getNodeIds(cellId=0, edgeIndex=2)
    assert (n0 == 3)
    assert (n1 == 2)

    n0, n1 = gr.getNodeIds(cellId=0, edgeIndex=3)
    assert (n0 == 0)
    assert (n1 == 3)

    gr.dump('singleCell.vtk')
示例#6
0
文件: test_grid.py 项目: pletzer/mint
def test_load_from_ugrid_file():
    gr = Grid()
    gr.setFlags(1, 1)
    filename = str(DATA_DIR / Path('cs_4.nc'))
    gr.loadFromUgrid2DFile(f'{filename}$physics')
    nedges = gr.getNumberOfEdges()
    print(f'nedges = {nedges}')
    assert (nedges == 192)
    ncells = gr.getNumberOfCells()
    for icell in range(ncells):
        for iedge in range(4):
            edgeId, edgeSign = gr.getEdgeId(icell, iedge)
            nodeIds = gr.getNodeIds(icell, iedge)
            print(f"cell {icell} edge {iedge}: " +
                  f"edgeId = {edgeId}, {edgeSign} nodeIds = {nodeIds}")
    # attaching a 3 components field to the grid
    data = numpy.array(range(ncells * 4 * 3), numpy.float64)
    gr.attach('myData', data)
    num_bad_cells = gr.check()
    assert (num_bad_cells == 0)
示例#7
0
def test_set_grids():

    # create and load src grid
    sg = Grid()
    sg.setFlags(0, 0)  # lon-lat
    filename = str(DATA_DIR / Path('lonlatzt_100x50x3x2.nc'))
    sg.loadFromUgrid2DFile(f'{filename}$mesh2d')

    # create and load dst grid
    dg = Grid()
    dg.setFlags(1, 1)  # cubed-sphere
    filename = str(DATA_DIR / Path('lfric_diag_wind.nc'))
    dg.loadFromUgrid2DFile(f'{filename}$Mesh2d')

    # create a regridder
    rg = RegridEdges()
    rg.setSrcGrid(sg)
    rg.setDstGrid(dg)
    rg.buildLocator(numCellsPerBucket=128, periodX=360., enableFolding=True)
    rg.computeWeights()
示例#8
0
def test_loadFromUgrid2DData():

    # src grid
    sg = Grid()
    sg.setFlags(0, 0)  # lon-lat
    filename = str(DATA_DIR / Path('lonlatzt_100x50x3x2.nc'))
    sg.loadFromUgrid2DFile(f'{filename}$mesh2d')

    # dst grid
    dg = Grid()
    dg.setFlags(0, 0)

    # 2 cells/faces
    #
    # 3..1<...2...>5..5
    # :       :       :
    # v       v       ^
    # 6   0   3   1   4
    # :       :       :
    # 0..>2...1...>0..4
    xyz = numpy.array([
        (0., 0., 0.),
        (1., 0., 0.),
        (1., 1., 0.),
        (0., 1., 0.),
        (2., 0., 0.),
        (2., 1., 0.),
    ])
    face2nodes = numpy.array([(0, 1, 2, 3), (2, 1, 4, 5)], numpy.uint64)
    edge2nodes = numpy.array([(1, 4), (2, 3), (0, 1), (2, 1), (4, 5), (2, 5),
                              (3, 0)], numpy.uint64)
    dg.loadFromUgrid2DData(xyz, face2nodes, edge2nodes)

    # create a regridder
    rg = RegridEdges()
    rg.setSrcGrid(sg)
    rg.setDstGrid(dg)
    rg.buildLocator(numCellsPerBucket=128, periodX=0., enableFolding=False)
    rg.computeWeights()
示例#9
0
def test_identity():

    grid = Grid()
    grid.setFlags(fixLonAcrossDateline=0, averageLonAtPole=0,
                  degrees=True)  # uniform lat-lon
    filename = str(DATA_DIR / Path('latlon4x2.nc'))
    meshname = 'latlon'
    grid.loadFromUgrid2DFile(f'{filename}${meshname}')
    num_edges = grid.getNumberOfEdges()
    data = numpy.array(range(0, num_edges), numpy.float64)

    pli = PolylineIntegral()
    pli.setGrid(grid)
    pli.buildLocator(numCellsPerBucket=100, periodX=0., enableFolding=False)

    xyz = numpy.array([
        (0., 90., 0.),
        (360., 90., 0.),
    ])
    pli.computeWeights(xyz, counterclock=False)
    flux = pli.getIntegral(data=data, placement=UNIQUE_EDGE_DATA)

    print(f'flux = {flux}')
    assert abs(flux - 38.) < 1.e-10
示例#10
0
def grid(filename):
    gr = Grid()
    gr.setFlags(1, 1)
    gr.loadFromUgrid2DFile(f'{filename}$Mesh2d')
    return gr