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)
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_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_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