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)
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}""")
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
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)
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()
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()
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
def grid(filename): gr = Grid() gr.setFlags(1, 1) gr.loadFromUgrid2DFile(f'{filename}$Mesh2d') return gr