Changeset 779


Ignore:
Timestamp:
11/16/18 14:03:09 (5 years ago)
Author:
dubos
Message:

devel/unstructured : read dual_ne from mesh file when parallel

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

Legend:

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

    r773 r779  
    104104        # Python order : nqdyn,ny,nx,llm   / indices start at 0 
    105105        # indices below follow Fortran while x,y follow Python/C 
    106         def periodize(x,nx): return (x+2*nx)%nx 
     106        def periodize(z,nz): return (z+2*nz)%nz 
    107107        def index(x,y):      return 1+periodize(x,nx)+nx*periodize(y,ny) 
    108108        def indexu(x,y):     return 2*index(x,y)-1 
     
    183183                         'left','right','down','up', 
    184184                         'trisk_deg','trisk','Riv2','wee', 
    185                          'Aiv','lon_i','lat_i','lon_v','lat_v', 
     185                         'lon_i','lat_i','lon_v','lat_v', 
    186186                         'le_de','le','de','lon_e','lat_e','angle_e', 
    187187                         'primal_i','primal_j','edge_i','edge_j') 
     188        self.Ai, self.Av = Aiv, Aiv 
    188189    def ncwrite(self, name): 
    189190        """The method writes Cartesian mesh on the disc. 
     
    223224                     ("primal_i","i4",self.primal_i), 
    224225                     ("primal_j","i4",self.primal_j), 
    225                      ("Ai","f8",self.Aiv), 
     226                     ("Ai","f8",self.Ai), 
    226227                     ("lon_i","f8",self.lon_i), 
    227228                     ("lat_i","f8",self.lat_i)] ) 
     
    229230        create_vars("dual_cell",  
    230231                    [("dual_deg","i4",self.dual_deg),  
    231                      ("Av","f8",self.Aiv), 
     232                     ("Av","f8",self.Av), 
    232233                     ("lon_v","f8",self.lon_v), 
    233234                     ("lat_v","f8",self.lat_v), 
     
    331332        'lat_i':'latCell','lon_i':'lonCell','lat_v':'latVertex','lon_v':'lonVertex', 
    332333        'lat_e':'latEdge','lon_e':'lonEdge','angle_e':'angleEdge', 
    333         'wee':'weightsOnEdge','Riv2':'kiteAreasOnVertex'} 
     334        'wee':'weightsOnEdge','Riv2':'kiteAreasOnVertex', 
     335        'primal_ne':'signOnCell', 'dual_ne':'signOnVertex'} 
    334336    def __init__(self,gridfilename): 
    335337        try: 
     
    446448        trisk,wee,primal_edge = [np.ascontiguousarray(x) for x in (trisk,wee,primal_edge)] 
    447449        self.set_members(locals(), 'gridfile','llm','nqdyn','radius','f', 
    448                          'primal_num', 'dual_num', 'edge_num', 'primal_deg', 'primal_vertex', 
     450                         'primal_num', 'dual_num', 'edge_num', 'primal_deg', 'primal_vertex', 'primal_ne', 
    449451                         'lat_i', 'lon_i', 'lat_v', 'lon_v', 'lat_e', 'lon_e', 'angle_e', 
    450452                         'Ai', 'Av', 'fv', 'le', 'de', 
    451                          'trisk_deg', 'trisk', 'wee', 'Riv2') 
     453                         'trisk_deg', 'trisk', 'wee', 'Riv2', 'dual_ne') 
    452454        gridfile.normalize(self, radius) 
    453         self.le_de = self.le/self.de 
    454455        max_primal_deg, max_dual_deg, max_trisk_deg = [ x.shape[1] for x in primal_edge, dual_edge, trisk] 
    455456        unst.init_mesh(llm, nqdyn, edge_num, primal_num,dual_num, 
     
    468469        dim_primal, dim_edge, dim_dual = gridfile.get_pdims(comm, 
    469470            'primal_cell','edge','dual_cell') 
    470         primal_deg, primal_vertex, primal_edge, lon_i, lat_i, Ai = get_pvars( 
    471             dim_primal, 'primal_deg', 'primal_vertex', 'primal_edge', 'lon_i', 'lat_i', 'Ai' ) 
     471        primal_deg, primal_vertex, primal_edge, primal_ne, lon_i, lat_i, Ai = get_pvars( 
     472            dim_primal, 'primal_deg', 'primal_vertex', 'primal_edge', 'primal_ne', 'lon_i', 'lat_i', 'Ai' ) 
    472473        edge_deg, trisk_deg, left_right, down_up, trisk, le, de, wee, lon_e, lat_e, angle_e = get_pvars( 
    473474             dim_edge, 'edge_deg', 'trisk_deg', 'edge_left_right', 'edge_down_up',  
    474475             'trisk', 'le', 'de', 'wee', 'lon_e', 'lat_e', 'angle_e') 
    475         dual_deg, dual_vertex, dual_edge, Riv2, lon_v, lat_v, Av = get_pvars( 
    476             dim_dual, 'dual_deg', 'dual_vertex', 'dual_edge', 'Riv2', 'lon_v', 'lat_v', 'Av') 
     476        dual_deg, dual_vertex, dual_edge, dual_ne, Riv2, lon_v, lat_v, Av = get_pvars( 
     477            dim_dual, 'dual_deg', 'dual_vertex', 'dual_edge', 'dual_ne', 'Riv2', 'lon_v', 'lat_v', 'Av') 
    477478        if gridfile.meshtype == 'curvilinear': 
    478479            self.primal_i, self.primal_j = get_pvars(dim_primal, 'primal_i','primal_j') 
     
    483484            left_right, down_up, trisk ) : x.data = x.data-gridfile.start_index 
    484485        self.edge2cell   = Stencil_glob(edge_deg, left_right) 
    485         self.cell2edge   = Stencil_glob(primal_deg, primal_edge) 
     486        self.cell2edge   = Stencil_glob(primal_deg, primal_edge, primal_ne) 
    486487        self.cell2vertex = Stencil_glob(primal_deg, primal_vertex) 
    487488        self.edge2vertex = Stencil_glob(edge_deg, down_up) 
    488         self.vertex2edge = Stencil_glob(dual_deg, dual_edge) 
     489        self.vertex2edge = Stencil_glob(dual_deg, dual_edge, dual_ne) 
    489490        self.vertex2cell = Stencil_glob(dual_deg, dual_vertex, Riv2) 
    490491        self.edge2edge   = Stencil_glob(trisk_deg, trisk, wee) 
     
    579580        print 'TRiSK degree min/max : %d %d'%(trisk.degree.min(), trisk.degree.max() ) 
    580581        print 'Riv2 degree min/max : %d %d'%(Riv2.degree.min(), Riv2.degree.max() ) 
    581         primal_deg, primal_edge     = primal_edge.degree,   primal_edge.neigh_loc 
    582         dual_deg,   dual_edge       = dual_edge.degree,     dual_edge.neigh_loc 
     582        primal_deg, primal_edge, primal_ne = primal_edge.degree,   primal_edge.neigh_loc, primal_edge.weight 
     583        dual_deg,   dual_edge, dual_ne  = dual_edge.degree, dual_edge.neigh_loc, dual_edge.weight 
    583584        trisk_deg,  trisk, wee      = trisk.degree,         trisk.neigh_loc, trisk.weight 
    584585        dual_deg, dual_vertex, Riv2 = Riv2.degree,          Riv2.neigh_loc,  Riv2.weight 
     
    604605        trisk, dual_vertex, primal_edge, dual_edge =  trisk+1, dual_vertex+1, primal_edge+1, dual_edge+1 
    605606        left, right, down, up = left+1, right+1, down+1, up+1 
    606         primal_ne = compute_ne(primal_num,primal_deg,primal_edge,left,right) 
    607         dual_ne = compute_ne(dual_num,dual_deg,dual_edge,up,down) 
    608607 
    609608        # store what we have computed 
     609        le_de = self.le/self.de 
    610610        self.set_members(locals(), 'nqdyn', 'llm', 'primal_num', 'dual_num', 'edge_num', 
    611611                         'primal_own_glo', 'primal_own_loc', 'primal_own_deg', 
    612612                         'primal_deg', 'primal_vertex', 'displ', 
    613                         'trisk_deg', 'trisk', 'wee', 'dual_deg', 'dual_vertex', 'Riv2') 
     613                         'trisk_deg', 'trisk', 'wee',  
     614                         'dual_deg', 'dual_edge', 'dual_ne', 'dual_vertex', 'Riv2', 
     615                         'left','right','primal_deg','primal_edge','primal_ne','le_de', 
     616                         'vertices_V1', 'edges_E2') 
    614617 
    615618        # normalize and propagate info to Fortran side 
     
    620623                  dual_deg,dual_edge,dual_ne,dual_vertex, 
    621624                  left,right,down,up,trisk_deg,trisk, 
    622                   self.Ai,self.Av,self.fv,self.le/self.de,Riv2,wee) 
     625                  self.Ai,self.Av,self.fv,le_de,Riv2,wee) 
    623626 
    624627        # setup halo transfers - NB : llm must be set before we call set_dynamico_transfer 
  • codes/icosagcm/devel/Python/test/py/reorder.py

    r674 r779  
    11print 'Loading DYNAMICO modules ...' 
    2 from dynamico.meshes import morton_index, key_to_perm, reorder_indices, reorder_values 
     2from dynamico.meshes import morton_index, key_to_perm, reorder_indices, reorder_values, MPAS_Format, Unstructured_Mesh 
    33print '...Done' 
    44import numpy as np 
     
    77import time 
    88 
    9 grid = 10242 # 2562, 10242, 40962 
     9#------------ Read command-line arguments ----------# 
     10 
     11import argparse 
     12parser = argparse.ArgumentParser() 
     13parser.add_argument("-n", type=int, default=2562, 
     14                    help="number of primal cells in MPAS mesh") 
     15args = parser.parse_args() 
     16grid = args.n 
    1017 
    1118#-------------- read MPAS mesh ----------------# 
    1219 
    13 print 'Reading MPAS mesh ...' 
    14 mesh=cdf.Dataset('grids_MPAS/x1.%d.grid.nc'%grid, "r") 
     20meshfile='grids_MPAS/x1.%d.grid.nc'%grid 
     21print 'Reading MPAS mesh %s ...'%meshfile 
     22 
     23def f(lon,lat): return 0.*lon 
     24mesh=MPAS_Format(meshfile) 
     25mesh=Unstructured_Mesh(mesh, 1, 1, 1., f) 
     26primal_ne, dual_ne = mesh.primal_ne, mesh.dual_ne 
     27 
     28mesh=cdf.Dataset(meshfile, "r") 
    1529 
    1630def getdims(*names): return [len(mesh.dimensions[name]) for name in names] 
     
    5367for idx in primal_edge, left_right, dual_edge, down_up, primal_vertex, dual_vertex, trisk : idx[:]=idx[:]-1 
    5468 
    55 reorder_indices(perm_i, primal_deg, primal_vertex, primal_edge, lon_i, lat_i, Ai) 
    56 reorder_indices(perm_v, dual_vertex, dual_edge, lon_v, lat_v, Av, Riv2) 
     69reorder_indices(perm_i, primal_deg, primal_vertex, primal_edge, primal_ne, lon_i, lat_i, Ai) 
     70reorder_indices(perm_v, dual_vertex, dual_edge, dual_ne, lon_v, lat_v, Av, Riv2) 
    5771reorder_indices(perm_e, trisk_deg, left_right, down_up, trisk, lon_e, lat_e, angle_e, le, de, wee) 
    5872reorder_values(perm_i, dual_vertex, left_right) 
     
    6680 
    6781mesh=cdf.Dataset('grids/x1.%d.grid.nc'%grid, "r+") 
     82 
     83# create new variables dual_ne, primal_ne 
     84mesh.createVariable('signOnCell','i4',('nCells','maxEdges')) 
     85mesh.createVariable('signOnVertex','i4',('nVertices','vertexDegree')) 
    6886 
    6987def putvars(datas,names):  
     
    83101putvars( (lat_e,lon_e,angle_e), ('latEdge','lonEdge','angleEdge') ) 
    84102putvars( (wee,Riv2), ('weightsOnEdge','kiteAreasOnVertex') ) 
     103putvars( (primal_ne,dual_ne), ('signOnCell','signOnVertex') ) 
    85104 
    86105mesh.close() 
Note: See TracChangeset for help on using the changeset viewer.