Changeset 682


Ignore:
Timestamp:
02/16/18 18:06:01 (6 years ago)
Author:
dubos
Message:

devel/unstructured : XIOS output with MPI

Location:
codes/icosagcm/devel/Python
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/Python/dynamico/meshes.py

    r681 r682  
    367367        self.edge2cell   = Stencil_glob(edge_deg, left_right) 
    368368        self.cell2edge   = Stencil_glob(primal_deg, primal_edge) 
     369        self.cell2vertex = Stencil_glob(primal_deg, primal_vertex) 
    369370        self.edge2vertex = Stencil_glob(edge_deg, down_up) 
    370371        self.vertex2edge = Stencil_glob(dual_deg, dual_edge) 
     
    406407class Local_Mesh(Abstract_Mesh): 
    407408    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') 
    410411        print 'Constructing halos ...' 
    411412        edges_E0 = find_my_cells(edge_owner) 
     
    417418        get_own_cells, get_all_cells = dim_primal.getter(cells_C0), dim_primal.getter(cells_C1) 
    418419        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)) 
    423420         
    424421        self.lon_i, self.lat_i, self.Ai = pmesh.get(get_all_cells, 'lon_i', 'lat_i', 'Ai') 
     
    428425            get_all_edges, 'le', 'de', 'lon_e', 'lat_e', 'angle_e') 
    429426        primal_num, dual_num, edge_num = map(len, (cells_C1, vertices_V1, edges_E2)) 
    430          
     427 
     428        # construct local stencils from global stencils 
    431429        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) 
    438436        print 'Edge-vertex degree min/max %d %d'%(down_up.degree.min(), down_up.degree.max() ) 
    439437        print 'Edge-cell degree min/max %d %d'%(left_right.degree.min(), left_right.degree.max() ) 
     
    442440        print 'TRiSK degree min/max : %d %d'%(trisk.degree.min(), trisk.degree.max() ) 
    443441        print 'Riv2 degree min/max : %d %d'%(Riv2.degree.min(), Riv2.degree.max() ) 
    444         primal_deg, primal_edge = primal_edge.degree, primal_edge.neigh_loc 
    445         dual_deg, dual_edge = dual_edge.degree, dual_edge.neigh_loc 
    446         trisk_deg, trisk, wee = trisk.degree, trisk.neigh_loc, trisk.weight 
    447         dual_deg, dual_vertex, Riv2 = Riv2.degree, Riv2.neigh_loc, Riv2.weight 
     442        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 
    448446        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] 
    450448        for edge in range(edge_num):  
    451449            if edge_deg[edge]<2: up[edge]=down[edge] 
    452450        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         
    453463        # compute_ne(...) and normalize(...) expect indices starting at 1 
    454464        trisk, dual_vertex, primal_edge, dual_edge =  trisk+1, dual_vertex+1, primal_edge+1, dual_edge+1 
     
    456466        primal_ne = compute_ne(primal_num,primal_deg,primal_edge,left,right) 
    457467        dual_ne = compute_ne(dual_num,dual_deg,dual_edge,up,down) 
     468 
     469        # store what we have computed 
    458470        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 
    461476        pmesh.gridfile.normalize(self,radius) 
    462477        unst.init_mesh(llm, nqdyn, self.edge_num, self.primal_num, self.dual_num, 
     
    466481                  left,right,down,up,trisk_deg,trisk, 
    467482                  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)) 
    469489        self.com_primal.set_dynamico_transfer('primal') 
    470490        self.com_edges.set_dynamico_transfer('edge') 
  • codes/icosagcm/devel/Python/dynamico/parallel.py

    r681 r682  
    148148    def set_dynamico_transfer(self,name): 
    149149        def list_to_args(lst): 
    150             ranks, lst = zip(*lst) # list of tuples => tuple of lists 
     150            ranks, lst = ([], []) if lst == [] else zip(*lst) # list of tuples => tuple of lists 
    151151            lens = map(len, lst) 
    152152            return len(ranks), ranks, lens, sum(lens), sum(lst,[]) 
  • codes/icosagcm/devel/Python/test/fig_DCMIP2008c5

    • Property svn:ignore set to
      *.png
  • codes/icosagcm/devel/Python/test/fig_morton

    • Property svn:ignore set to
      *.png
  • codes/icosagcm/devel/Python/test/py/test_xios.py

    r680 r682  
    33import dynamico.unstructured as unst 
    44import dynamico.xios as xios 
    5 from dynamico.meshes import MPAS_Format, Unstructured_Mesh, radian 
     5#from dynamico.meshes import MPAS_Format, Unstructured_Mesh, radian 
     6from dynamico.meshes import radian, MPAS_Format, Unstructured_Mesh, Unstructured_PMesh as PMesh, Local_Mesh as Mesh 
    67 
    78from mpi4py import MPI 
     
    1112 
    1213import numpy as np 
     14import cProfile 
     15import re 
    1316 
    1417def boundaries(degree,points,lon,lat): 
     
    2831#----------------------------- read MPAS mesh -------------------------------- 
    2932 
    30 grid, llm, nqdyn, nqtot = 10242, 1,1,1 # 2562, 10242, 40962   
     33grid, llm, nqdyn, nqtot = 2562, 4,1,1 # 2562, 10242, 40962   
    3134Omega, radius, g, gh0 = 2.*np.pi/86400., 6.4e6, 1., 2.94e4 
    3235N, T, courant = 40, 10800., 1.2 # simulation length = N*T 
     
    3639print 'Reading MPAS mesh ...' 
    3740meshfile = 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) 
     42pmesh = PMesh(comm,meshfile) 
     43mesh = Mesh(pmesh, llm, nqdyn, radius, f) 
     44ni_glo = pmesh.dim_primal.n 
     45ni_loc = len(mesh.primal_own_glo) 
    3946print '...Done' 
    4047 
     
    4350#--------------------------------- initialize XIOS -------------------------- 
    4451 
    45 def setup_domain(cat,id, degree,vertex,lon,lat,lon_v,lat_v): # cat in 'domain','domaingroup' 
     52def setup_domain(cat,id, degree,vertex,lon,lat,lon_v,lat_v, ncell_glo=None, index_glo=None, displ=None): # cat in 'domain','domaingroup' 
    4653    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 
    4859    mesh = xios.Handle(cat,id) 
    4960    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) 
    5262    mesh.set_attr(lonvalue_1d=lon, latvalue_1d=lat) 
    5363    mesh.set_attr(nvertex=nvertex,bounds_lon_1d=bnd_lon, bounds_lat_1d=bnd_lat) 
     
    6070    levp1.set_attr(n_glo=llm+1, value=np.arange(llm+1)) 
    6171    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 
    6378#    mesh_v=setup_domain('domain','v', mesh.dual_deg, mesh.dual_vertex-1, lon_v, lat_v, lon_i, lat_i) # dual mesh 
    6479 
     
    92107    xios.context_close_definition() 
    93108 
     109lat_ik, junk  = np.meshgrid(lat_i, np.arange(llm), indexing='xy') 
     110 
     111def 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) 
     117def 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     
    94124no_error=True 
    95125try: 
     
    100130            xios.update_calendar(i) 
    101131        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) 
    103134except: 
    104135    print 'An error has occured, trying to close XIOS properly' 
  • codes/icosagcm/devel/Python/test/xml/field_def_simple.xml

    r622 r682  
    1616      <field id="phis" /> 
    1717      <field id="phi" /> 
     18 
     19      <field_group axis_ref="lev">  
     20        <field id="theta" /> 
     21      </field_group> 
     22      
    1823    </field_group>  
    1924     
  • codes/icosagcm/devel/Python/test/xml/filedef_simple.xml

    r622 r682  
    1515    <field_group id="dcmip2016_output_field" ts_enabled="false"> 
    1616      <field field_ref="ps" name="PS"       standard_name="surface_pressure" long_name="Surface pressure"         unit="Pa" /> 
     17      <field field_ref="theta" /> 
    1718      <field field_ref="phis" operation="once" freq_offset="0ts" name="PHIS"   standard_name="surface_geopotential" long_name="Surface geopotential" unit="m2/m2"/>       
    1819    </field_group> 
Note: See TracChangeset for help on using the changeset viewer.