source: codes/icosagcm/devel/Python/test/py/reorder.py @ 1037

Last change on this file since 1037 was 986, checked in by dubos, 5 years ago

devel/Python : update reorder.py and fix C syntax of partition.h

File size: 4.2 KB
Line 
1#------------ Read command-line arguments ----------#
2from dynamico import getargs
3getargs.add("--grid", type=int, default=2562,
4                    help="number of primal cells in MPAS mesh")
5args = getargs.parse()
6grid = args.grid
7
8#------------- Start --------------#
9print 'Loading DYNAMICO modules ...'
10from dynamico.meshes import key_to_perm, reorder_indices, reorder_values, MPAS_Format, Unstructured_Mesh
11from dynamico.partition import morton_index
12print '...Done'
13import numpy as np
14import netCDF4 as cdf
15import matplotlib.pyplot as plt
16import time
17
18
19#-------------- read MPAS mesh ----------------#
20
21meshfile='grids_MPAS/x1.%d.grid.nc'%grid
22print 'Reading MPAS mesh %s ...'%meshfile
23
24def f(lon,lat): return 0.*lon
25mesh=MPAS_Format(meshfile)
26mesh=Unstructured_Mesh(mesh, 1, 1, 1., f)
27primal_ne, dual_ne = mesh.primal_ne, mesh.dual_ne
28
29mesh=cdf.Dataset(meshfile, "r")
30
31def getdims(*names): return [len(mesh.dimensions[name]) for name in names]
32def getvars(*names): 
33    for name in names : 
34        print "getvar %s ..."%name
35        time1=time.time()
36        ret=[mesh.variables[name][:] for name in names]
37        print "... Done in %f seconds"%(time.time()-time1)
38    return ret
39
40primal_num, edge_num, dual_num = getdims('nCells','nEdges','nVertices')                                   
41print 'Number of primal cells, dual cells and edges : %d, %d, %d '%(primal_num,dual_num,edge_num)
42# get degree of primal, dual cells
43primal_deg, trisk_deg = getvars('nEdgesOnCell','nEdgesOnEdge')
44# get indices for stencils
45primal_edge, left_right = getvars('edgesOnCell','cellsOnEdge')
46dual_edge, down_up = getvars('edgesOnVertex','verticesOnEdge')
47primal_vertex, dual_vertex, trisk = getvars('verticesOnCell','cellsOnVertex','edgesOnEdge')
48# get positions, lengths, surfaces and weights
49le,de,Ai,Av = getvars('dvEdge','dcEdge','areaCell','areaTriangle')
50lat_i,lon_i = getvars('latCell','lonCell')
51lat_v,lon_v = getvars('latVertex','lonVertex')
52lat_e,lon_e,angle_e = getvars('latEdge','lonEdge','angleEdge')
53wee,Riv2 = getvars('weightsOnEdge','kiteAreasOnVertex')
54mesh.close()
55
56#------------ reorder mesh according to Morton index --------------#
57
58def morton_order(lon,lat):
59    x,y,z = np.cos(lat)*np.cos(lon), np.cos(lat)*np.sin(lon), np.sin(lat)
60    keys = morton_index(x,y,z)
61    return key_to_perm(keys)
62
63perm_i = morton_order(lon_i,lat_i)
64perm_v = morton_order(lon_v,lat_v)
65perm_e = morton_order(lon_e,lat_e)
66
67# MPAS => Python
68for idx in primal_edge, left_right, dual_edge, down_up, primal_vertex, dual_vertex, trisk : idx[:]=idx[:]-1
69
70reorder_indices(perm_i, primal_deg, primal_vertex, primal_edge, primal_ne, lon_i, lat_i, Ai)
71reorder_indices(perm_v, dual_vertex, dual_edge, dual_ne, lon_v, lat_v, Av, Riv2)
72reorder_indices(perm_e, trisk_deg, left_right, down_up, trisk, lon_e, lat_e, angle_e, le, de, wee)
73reorder_values(perm_i, dual_vertex, left_right)
74reorder_values(perm_v, primal_vertex, down_up)
75reorder_values(perm_e, primal_edge, dual_edge, trisk)
76
77# Python => MPAS
78for idx in primal_edge, left_right, dual_edge, down_up, primal_vertex, dual_vertex, trisk : idx[:]=idx[:]+1
79
80#--- Open copy of MPAS mesh file ; keep file structure but replace contents of variables ---#
81
82mesh=cdf.Dataset('grids/x1.%d.grid.nc'%grid, "r+")
83
84# create new variables dual_ne, primal_ne
85mesh.createVariable('signOnCell','i4',('nCells','maxEdges'))
86mesh.createVariable('signOnVertex','i4',('nVertices','vertexDegree'))
87
88def putvars(datas,names): 
89    for name,data in zip(names,datas) :
90        print "putvar %s ..."%name
91        time1=time.time()
92        mesh.variables[name][:] = data[:]
93        print "... Done in %f seconds"%(time.time()-time1)
94   
95putvars( (primal_deg, trisk_deg), ('nEdgesOnCell','nEdgesOnEdge') )
96putvars( (primal_edge, left_right), ('edgesOnCell','cellsOnEdge') )
97putvars( (dual_edge, down_up), ('edgesOnVertex','verticesOnEdge') )
98putvars( (primal_vertex, dual_vertex, trisk), ('verticesOnCell','cellsOnVertex','edgesOnEdge') )
99putvars( (le,de,Ai,Av), ('dvEdge','dcEdge','areaCell','areaTriangle') )
100putvars( (lat_i,lon_i), ('latCell','lonCell') )
101putvars( (lat_v,lon_v), ('latVertex','lonVertex') )
102putvars( (lat_e,lon_e,angle_e), ('latEdge','lonEdge','angleEdge') )
103putvars( (wee,Riv2), ('weightsOnEdge','kiteAreasOnVertex') )
104putvars( (primal_ne,dual_ne), ('signOnCell','signOnVertex') )
105
106mesh.close()
Note: See TracBrowser for help on using the repository browser.