Changeset 682
- Timestamp:
- 02/16/18 18:06:01 (6 years ago)
- Location:
- codes/icosagcm/devel/Python
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/Python/dynamico/meshes.py
r681 r682 367 367 self.edge2cell = Stencil_glob(edge_deg, left_right) 368 368 self.cell2edge = Stencil_glob(primal_deg, primal_edge) 369 self.cell2vertex = Stencil_glob(primal_deg, primal_vertex) 369 370 self.edge2vertex = Stencil_glob(edge_deg, down_up) 370 371 self.vertex2edge = Stencil_glob(dual_deg, dual_edge) … … 406 407 class Local_Mesh(Abstract_Mesh): 407 408 def __init__(self, pmesh, llm, nqdyn, radius, f): 408 dim_primal, primal_owner, dim_edge, edge_owner, dim_dual = pmesh.members(409 ' dim_primal', 'primal_owner', 'dim_edge', 'edge_owner', 'dim_dual')409 comm, dim_primal, primal_owner, dim_edge, edge_owner, dim_dual = pmesh.members( 410 'comm', 'dim_primal', 'primal_owner', 'dim_edge', 'edge_owner', 'dim_dual') 410 411 print 'Constructing halos ...' 411 412 edges_E0 = find_my_cells(edge_owner) … … 417 418 get_own_cells, get_all_cells = dim_primal.getter(cells_C0), dim_primal.getter(cells_C1) 418 419 get_all_duals, get_all_edges = dim_dual.getter(vertices_V1), dim_edge.getter(edges_E2) 419 self.com_primal = parallel.Halo_Xchange(420 42, dim_primal, cells_C1, get_all_cells(primal_owner))421 self.com_edges = parallel.Halo_Xchange(422 73, dim_edge, edges_E2, get_all_edges(edge_owner))423 420 424 421 self.lon_i, self.lat_i, self.Ai = pmesh.get(get_all_cells, 'lon_i', 'lat_i', 'Ai') … … 428 425 get_all_edges, 'le', 'de', 'lon_e', 'lat_e', 'angle_e') 429 426 primal_num, dual_num, edge_num = map(len, (cells_C1, vertices_V1, edges_E2)) 430 427 428 # construct local stencils from global stencils 431 429 dict_E2, dict_C1, dict_V1 = map(inverse_list, (edges_E2, cells_C1, vertices_V1)) 432 down_up = pmesh.edge2vertex(edges_E2,dict_V1)433 left_right = pmesh.edge2cell(edges_E2,dict_C1)434 primal_edge = pmesh.cell2edge(cells_C1,dict_E2)435 dual_edge = pmesh.vertex2edge(vertices_V1, dict_E2)436 trisk = pmesh.edge2edge(edges_E2,dict_E2)437 Riv2 = pmesh.vertex2cell(vertices_V1, dict_C1)430 down_up = pmesh.edge2vertex( edges_E2, dict_V1) 431 left_right = pmesh.edge2cell( edges_E2, dict_C1) 432 primal_edge = pmesh.cell2edge( cells_C1, dict_E2) 433 dual_edge = pmesh.vertex2edge( vertices_V1, dict_E2) 434 trisk = pmesh.edge2edge( edges_E2, dict_E2) 435 Riv2 = pmesh.vertex2cell( vertices_V1, dict_C1) 438 436 print 'Edge-vertex degree min/max %d %d'%(down_up.degree.min(), down_up.degree.max() ) 439 437 print 'Edge-cell degree min/max %d %d'%(left_right.degree.min(), left_right.degree.max() ) … … 442 440 print 'TRiSK degree min/max : %d %d'%(trisk.degree.min(), trisk.degree.max() ) 443 441 print 'Riv2 degree min/max : %d %d'%(Riv2.degree.min(), Riv2.degree.max() ) 444 primal_deg, primal_edge = primal_edge.degree,primal_edge.neigh_loc445 dual_deg, dual_edge = dual_edge.degree,dual_edge.neigh_loc446 trisk_deg, trisk, wee = trisk.degree,trisk.neigh_loc, trisk.weight447 dual_deg, dual_vertex, Riv2 = Riv2.degree, Riv2.neigh_loc,Riv2.weight442 primal_deg, primal_edge = primal_edge.degree, primal_edge.neigh_loc 443 dual_deg, dual_edge = dual_edge.degree, dual_edge.neigh_loc 444 trisk_deg, trisk, wee = trisk.degree, trisk.neigh_loc, trisk.weight 445 dual_deg, dual_vertex, Riv2 = Riv2.degree, Riv2.neigh_loc, Riv2.weight 448 446 edge_deg, left, right = left_right.degree, left_right.neigh_loc[:,0], left_right.neigh_loc[:,1] 449 edge_deg, down, up = down_up.degree, down_up.neigh_loc[:,0],down_up.neigh_loc[:,1]447 edge_deg, down, up = down_up.degree, down_up.neigh_loc[:,0], down_up.neigh_loc[:,1] 450 448 for edge in range(edge_num): 451 449 if edge_deg[edge]<2: up[edge]=down[edge] 452 450 max_primal_deg, max_dual_deg, max_trisk_deg = [x.shape[1] for x in primal_edge, dual_edge, trisk] 451 452 # construct own primal mesh for XIOS output 453 primal_own_glo = find_my_cells(primal_owner) 454 primal_vertex = pmesh.cell2vertex(primal_own_glo, dict_V1) 455 primal_own_deg, primal_vertex = primal_vertex.degree, primal_vertex.neigh_loc 456 primal_own_glo = np.asarray(primal_own_glo, dtype=np.int32) 457 primal_own_loc = [dict_C1[i] for i in primal_own_glo] 458 primal_own_num = len(primal_own_glo) 459 primal_own_all = comm.allgather(primal_own_num) 460 displ = sum(primal_own_all[0:comm.Get_rank()]) # required by XIOS 461 print 'local primal mesh :', primal_vertex.min(), primal_vertex.max(), primal_own_all, displ 462 453 463 # compute_ne(...) and normalize(...) expect indices starting at 1 454 464 trisk, dual_vertex, primal_edge, dual_edge = trisk+1, dual_vertex+1, primal_edge+1, dual_edge+1 … … 456 466 primal_ne = compute_ne(primal_num,primal_deg,primal_edge,left,right) 457 467 dual_ne = compute_ne(dual_num,dual_deg,dual_edge,up,down) 468 469 # store what we have computed 458 470 self.set_members(locals(), 'nqdyn', 'llm', 'primal_num', 'dual_num', 'edge_num', 459 'trisk_deg', 'trisk', 'wee', 'dual_deg', 'dual_vertex', 'Riv2') 460 471 'primal_own_glo', 'primal_own_loc', 'primal_own_deg', 472 'primal_deg', 'primal_vertex', 'displ', 473 'trisk_deg', 'trisk', 'wee', 'dual_deg', 'dual_vertex', 'Riv2') 474 475 # normalize and propagate info to Fortran side 461 476 pmesh.gridfile.normalize(self,radius) 462 477 unst.init_mesh(llm, nqdyn, self.edge_num, self.primal_num, self.dual_num, … … 466 481 left,right,down,up,trisk_deg,trisk, 467 482 self.Ai,self.Av,self.fv,self.le/self.de,Riv2,wee) 468 # llm must be set before we call set_dynamico_transfer 483 484 # setup halo transfers - NB : llm must be set before we call set_dynamico_transfer 485 self.com_primal = parallel.Halo_Xchange( 486 42, dim_primal, cells_C1, get_all_cells(primal_owner)) 487 self.com_edges = parallel.Halo_Xchange( 488 73, dim_edge, edges_E2, get_all_edges(edge_owner)) 469 489 self.com_primal.set_dynamico_transfer('primal') 470 490 self.com_edges.set_dynamico_transfer('edge') -
codes/icosagcm/devel/Python/dynamico/parallel.py
r681 r682 148 148 def set_dynamico_transfer(self,name): 149 149 def list_to_args(lst): 150 ranks, lst = zip(*lst) # list of tuples => tuple of lists150 ranks, lst = ([], []) if lst == [] else zip(*lst) # list of tuples => tuple of lists 151 151 lens = map(len, lst) 152 152 return len(ranks), ranks, lens, sum(lens), sum(lst,[]) -
codes/icosagcm/devel/Python/test/fig_DCMIP2008c5
-
Property
svn:ignore
set to
*.png
-
Property
svn:ignore
set to
-
codes/icosagcm/devel/Python/test/fig_morton
-
Property
svn:ignore
set to
*.png
-
Property
svn:ignore
set to
-
codes/icosagcm/devel/Python/test/py/test_xios.py
r680 r682 3 3 import dynamico.unstructured as unst 4 4 import dynamico.xios as xios 5 from dynamico.meshes import MPAS_Format, Unstructured_Mesh, radian 5 #from dynamico.meshes import MPAS_Format, Unstructured_Mesh, radian 6 from dynamico.meshes import radian, MPAS_Format, Unstructured_Mesh, Unstructured_PMesh as PMesh, Local_Mesh as Mesh 6 7 7 8 from mpi4py import MPI … … 11 12 12 13 import numpy as np 14 import cProfile 15 import re 13 16 14 17 def boundaries(degree,points,lon,lat): … … 28 31 #----------------------------- read MPAS mesh -------------------------------- 29 32 30 grid, llm, nqdyn, nqtot = 10242, 1,1,1 # 2562, 10242, 4096233 grid, llm, nqdyn, nqtot = 2562, 4,1,1 # 2562, 10242, 40962 31 34 Omega, radius, g, gh0 = 2.*np.pi/86400., 6.4e6, 1., 2.94e4 32 35 N, T, courant = 40, 10800., 1.2 # simulation length = N*T … … 36 39 print 'Reading MPAS mesh ...' 37 40 meshfile = MPAS_Format('grids/x1.%d.grid.nc'%grid) 38 mesh = Unstructured_Mesh(meshfile, llm, nqdyn, radius, f) 41 #mesh = Unstructured_Mesh(meshfile, llm, nqdyn, radius, f) 42 pmesh = PMesh(comm,meshfile) 43 mesh = Mesh(pmesh, llm, nqdyn, radius, f) 44 ni_glo = pmesh.dim_primal.n 45 ni_loc = len(mesh.primal_own_glo) 39 46 print '...Done' 40 47 … … 43 50 #--------------------------------- initialize XIOS -------------------------- 44 51 45 def setup_domain(cat,id, degree,vertex,lon,lat,lon_v,lat_v ): # cat in 'domain','domaingroup'52 def setup_domain(cat,id, degree,vertex,lon,lat,lon_v,lat_v, ncell_glo=None, index_glo=None, displ=None): # cat in 'domain','domaingroup' 46 53 bnd_lon, bnd_lat = boundaries(degree, vertex, lon_v, lat_v) 47 ncell_tot, nvertex = bnd_lon.shape 54 ncell, nvertex = bnd_lon.shape 55 if ncell_glo is None : 56 ncell_glo = ncell 57 index_glo = np.arange(ncell, dtype=np.int32) 58 displ = 0 48 59 mesh = xios.Handle(cat,id) 49 60 mesh.set_attr(type='unstructured') 50 mesh.set_attr(ni_glo=ncell_tot, ibegin=0, ni=ncell_tot) 51 mesh.set_attr(i_index=np.arange(ncell_tot,dtype=np.int32)) 61 mesh.set_attr(ni_glo=ncell_glo, ni=ncell, ibegin=displ, i_index=index_glo) 52 62 mesh.set_attr(lonvalue_1d=lon, latvalue_1d=lat) 53 63 mesh.set_attr(nvertex=nvertex,bounds_lon_1d=bnd_lon, bounds_lat_1d=bnd_lat) … … 60 70 levp1.set_attr(n_glo=llm+1, value=np.arange(llm+1)) 61 71 nq.set_attr(n_glo=nqtot, value=np.arange(nqtot)) 62 mesh_i=setup_domain('domaingroup','i', mesh.primal_deg, mesh.primal_vertex-1, lon_i, lat_i, lon_v, lat_v) # primal mesh 72 # primal mesh 73 mesh_i=setup_domain('domaingroup','i', mesh.primal_own_deg, mesh.primal_vertex, 74 lon_i[mesh.primal_own_loc], lat_i[mesh.primal_own_loc], 75 lon_v, lat_v, 76 pmesh.dim_primal.n, mesh.primal_own_glo, mesh.displ) 77 # mesh_i=setup_domain('domaingroup','i', mesh.primal_deg, mesh.primal_vertex-1, lon_i, lat_i, lon_v, lat_v) # primal mesh 63 78 # mesh_v=setup_domain('domain','v', mesh.dual_deg, mesh.dual_vertex-1, lon_v, lat_v, lon_i, lat_i) # dual mesh 64 79 … … 92 107 xios.context_close_definition() 93 108 109 lat_ik, junk = np.meshgrid(lat_i, np.arange(llm), indexing='xy') 110 111 def send_field1_primal(name, data): 112 # print 'send_field1_primal :', data.shape 113 data = data[mesh.primal_own_loc] 114 data = np.ascontiguousarray(data) 115 print 'send_field1_primal :', data.shape 116 xios.send_field(name, data) 117 def send_field2_primal(name, data): 118 # print 'send_field2_primal :', data.shape 119 data = data[:,mesh.primal_own_loc] 120 data = np.ascontiguousarray(data) 121 print 'send_field2_primal :', data.shape 122 xios.send_field(name, data) 123 94 124 no_error=True 95 125 try: … … 100 130 xios.update_calendar(i) 101 131 print 'send_field', i 102 xios.send_field('ps', lat_i) 132 send_field1_primal('ps', lat_i) 133 send_field2_primal('theta', lat_ik) 103 134 except: 104 135 print 'An error has occured, trying to close XIOS properly' -
codes/icosagcm/devel/Python/test/xml/field_def_simple.xml
r622 r682 16 16 <field id="phis" /> 17 17 <field id="phi" /> 18 19 <field_group axis_ref="lev"> 20 <field id="theta" /> 21 </field_group> 22 18 23 </field_group> 19 24 -
codes/icosagcm/devel/Python/test/xml/filedef_simple.xml
r622 r682 15 15 <field_group id="dcmip2016_output_field" ts_enabled="false"> 16 16 <field field_ref="ps" name="PS" standard_name="surface_pressure" long_name="Surface pressure" unit="Pa" /> 17 <field field_ref="theta" /> 17 18 <field field_ref="phis" operation="once" freq_offset="0ts" name="PHIS" standard_name="surface_geopotential" long_name="Surface geopotential" unit="m2/m2"/> 18 19 </field_group>
Note: See TracChangeset
for help on using the changeset viewer.