Changeset 801 for codes


Ignore:
Timestamp:
01/17/19 10:42:38 (5 years ago)
Author:
dubos
Message:

devel/unstructured : implement reference vs physical mesh for spherical meshes

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

Legend:

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

    r800 r801  
    2222        radius : planetary radius 
    2323        Omega : rotation rate => f = 2*Omega*sin(lat)""" 
     24        self.radius, self.Omega = radius, Omega 
    2425    def coriolis(self, lon,lat): 
    2526       return 2.*self.Omega*np.sin(lat) 
  • codes/icosagcm/devel/Python/dynamico/meshes.py

    r800 r801  
    381381            if abs(r-1.)>1e-6 : print 'error with Riv2 at vertex ', ivertex 
    382382        # scale lengths and areas 
    383         # this is now done by apply_map_factor 
     383        # this is now done by apply_map 
    384384        # mesh.le, mesh.de, mesh.Av, mesh.Ai = radius*le, radius*de, r2*Av, r2*Ai 
    385385         
     
    422422    def plot_e(self,data, **kwargs): 
    423423        self.plot(self.triedge,data, **kwargs) 
    424     def apply_map(self, mapping, le, de, Ai, Av): 
     424    def apply_map(self, mapping): 
    425425        """Before calling apply_map, lat and lon are coordinates in the reference domain. 
    426426        After calling apply_map, lat and lon are coordinates in the physical domain.""" 
    427427        factor_e = mapping.map_factor(self.lon_e, self.lat_e) 
    428         factor_i = mapping.map_factor(self.lon_i, self.lat_i)**2 
    429         factor_v = mapping.map_factor(self.lon_v, self.lat_v)**2 
    430         self.le, self.de, self.Av, self.Ai = factor_e*le, factor_e*de, Av*factor_v, Ai*factor_i 
     428        factor2_i = mapping.map_factor(self.lon_i, self.lat_i)**2 
     429        factor2_v = mapping.map_factor(self.lon_v, self.lat_v)**2 
     430        self.le, self.de, self.Av, self.Ai = self.le*factor_e, self.de*factor_e, self.Av*factor2_v, self.Ai*factor2_i 
    431431        self.lon_i, self.lat_i = mapping.map(self.lon_i, self.lat_i) 
    432432        self.lon_v, self.lat_v = mapping.map(self.lon_v, self.lat_v) 
     
    503503        self.edge2edge   = Stencil_glob(trisk_deg, trisk, wee) 
    504504        self.set_members(locals(), 'dim_primal', 'dim_dual', 'dim_edge', 
    505                          'primal_deg', 'primal_vertex', 'primal_edge', 'trisk_deg', 'trisk', 
     505                         'primal_deg', 'primal_vertex', 'primal_edge',  
     506                         'trisk_deg', 'trisk', 'dual_deg', 'dual_edge', 
    506507                         'lon_v', 'lat_v', 'Av', 'lon_i', 'lat_i', 'Ai',  
    507508                         'le', 'de', 'lon_e', 'lat_e', 'angle_e') 
     
    566567        get_all_duals, get_all_edges = dim_dual.getter(vertices_V1), dim_edge.getter(edges_E2) 
    567568 
    568         # read from mesh file coordinates in reference domain 
    569         self.lon_i, self.lat_i, Ai = pmesh.get(get_all_cells, 'lon_i', 'lat_i', 'Ai') 
    570         self.lon_v, self.lat_v, Av = pmesh.get(get_all_duals, 'lon_v', 'lat_v', 'Av') 
    571         le, de, self.lon_e, self.lat_e, self.angle_e = pmesh.get( 
    572             get_all_edges, 'le', 'de', 'lon_e', 'lat_e', 'angle_e') 
    573         # map from reference domain to physical domain 
    574         self.apply_map(mapping, le, de, Ai, Av) 
    575         # now latitudes and longitudes refer to the physical domain 
    576         self.fv = mapping.coriolis(self.lon_v,self.lat_v) # Coriolis parameter 
    577569        primal_num, dual_num, edge_num = map(len, (cells_C1, vertices_V1, edges_E2)) 
    578570 
     
    627619        left, right, down, up = left+1, right+1, down+1, up+1 
    628620 
    629         # store what we have computed 
    630         le_de = self.le/self.de 
     621        # read from mesh file : coordinates, lengths and areas in reference domain 
     622        lon_i, lat_i, Ai = pmesh.get(get_all_cells, 'lon_i', 'lat_i', 'Ai') 
     623        lon_v, lat_v, Av = pmesh.get(get_all_duals, 'lon_v', 'lat_v', 'Av') 
     624        le, de, lon_e, lat_e, angle_e = pmesh.get(get_all_edges, 'le', 'de', 'lon_e', 'lat_e', 'angle_e') 
     625        le_de = le/de 
     626 
     627        # store what we have read/computed 
    631628        self.set_members(locals(), 'nqdyn', 'llm', 'primal_num', 'dual_num', 'edge_num', 
    632629                         'primal_own_glo', 'primal_own_loc', 'primal_own_deg', 
    633630                         'primal_deg', 'primal_vertex', 'displ', 'dual_own_loc',  
    634                          'trisk_deg', 'trisk', 'wee',  
     631                         'trisk_deg', 'trisk', 'wee', 
    635632                         'dual_deg', 'dual_edge', 'dual_ne', 'dual_vertex', 'Riv2', 
    636                          'left','right','primal_deg','primal_edge','primal_ne','le_de', 
    637                          'vertices_V1', 'edges_E2') 
    638  
    639         # normalize and propagate info to Fortran side 
     633                         'left','right','primal_deg','primal_edge','primal_ne', 
     634                         'vertices_V1', 'edges_E2', 
     635                         'lon_i', 'lat_i', 'Ai', 
     636                         'lon_v', 'lat_v', 'Av', 
     637                         'le', 'de', 'le_de', 'lon_e', 'lat_e', 'angle_e') 
     638 
     639        # normalize data read from file depending on file format 
    640640        pmesh.gridfile.normalize(self) 
     641        # map from reference domain to physical domain 
     642        self.apply_map(mapping) 
     643        # now latitudes and longitudes refer to the physical domain 
     644        self.fv = mapping.coriolis(self.lon_v,self.lat_v) # Coriolis parameter 
     645        # propagate info to Fortran side 
    641646        unst.init_mesh(llm, nqdyn, self.edge_num, self.primal_num, self.dual_num, 
    642647                  max_trisk_deg, max_primal_deg, max_dual_deg, 
     
    644649                  dual_deg,dual_edge,dual_ne,dual_vertex, 
    645650                  left,right,down,up,trisk_deg,trisk, 
    646                   self.Ai,self.Av,self.fv,le_de,Riv2,wee) 
     651                  self.Ai,self.Av,self.fv,self.le_de,self.Riv2,self.wee) 
    647652 
    648653        # setup halo transfers - NB : llm must be set before we call set_dynamico_transfer 
  • codes/icosagcm/devel/Python/test/py/RSW2_MPAS_W02.py

    r760 r801  
    1111from dynamico.meshes import MPAS_Format, Unstructured_PMesh as PMesh, Local_Mesh as Mesh 
    1212from dynamico import time_step 
     13from dynamico import maps 
    1314print '...Done' 
    1415 
     
    2425 
    2526print 'Omega, planetary PV', Omega, 2*Omega/gh0 
     27planet = maps.SphereMap(radius, Omega) 
    2628 
    27 def f(lon,lat): return 2*Omega*np.sin(lat) # Coriolis parameter 
    2829print 'Reading MPAS mesh ...' 
    2930meshfile = MPAS_Format('grids/x1.%d.grid.nc'%grid) 
    3031pmesh = PMesh(comm,meshfile) 
    3132pmesh.partition_metis() 
    32 mesh = Mesh(pmesh, llm, nqdyn, radius, f) 
     33mesh = Mesh(pmesh, llm, nqdyn, planet) 
    3334print '...Done' 
    3435lon, lat = mesh.lon_i, mesh.lat_i 
Note: See TracChangeset for help on using the changeset viewer.