Changeset 805
- Timestamp:
- 02/08/19 08:10:04 (5 years ago)
- Location:
- codes/icosagcm/devel/Python
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/Python/dynamico/dev/meshes.py
r804 r805 2 2 3 3 from dynamico import meshes 4 from dynamico.meshes import MPAS_Format 5 from dynamico.dev.numba import int32, float64, store_data 4 from dynamico.meshes import MPAS_Format, Unstructured_PMesh, compute_hybrid_coefs 5 from dynamico import unstructured as unst 6 from dynamico.dev import numba 7 from dynamico.dev.numba import int32, float64 6 8 7 class Unstructured_Mesh(meshes.Unstructured_Mesh): 8 def get_data(self): 9 return store_data(self, 10 int32, 'primal_num dual_num edge_num', 11 int32[:], 'primal_deg left right', 12 int32[:,:], 'primal_edge primal_ne', 13 float64[:], 'le_de Ai') 9 class MeshData(numba.NumbaData): 10 signature=(int32, 'primal_num dual_num edge_num', 11 int32[:], 'primal_deg left right', 12 int32[:,:], 'primal_edge primal_ne', 13 float64[:], 'le_de le de lon_e lat_e Ai') 14 def to_dynamico(self): 15 max_primal_deg, max_dual_deg, max_trisk_deg = [x.shape[1] for x in self.primal_edge, self.dual_edge, self.trisk] 16 unst.init_mesh(self.llm, self.nqdyn, self.edge_num, self.primal_num, self.dual_num, 17 max_trisk_deg, max_primal_deg, max_dual_deg, 18 self.primal_deg, self.primal_edge, self.primal_ne, 19 self.dual_deg, self.dual_edge, self.dual_ne, self.dual_vertex, 20 self.left, self.right, self.down, self.up, self.trisk_deg, self.trisk, 21 self.Ai, self.Av, self.fv, self.le_de, self.Riv2, self.wee) 22 23 # note inheritance order : inherit first from DevMesh to override empty to_dynamico() from AbstractMesh 24 class Cartesian_Mesh(MeshData, meshes.Cartesian_Mesh): pass 25 class Unstructured_Mesh(MeshData, meshes.Unstructured_Mesh): pass 26 class Local_Mesh(MeshData, meshes.Local_Mesh): pass -
codes/icosagcm/devel/Python/dynamico/dev/numba.py
r804 r805 6 6 import numba 7 7 8 def store_data(obj,*args): 9 """Returns a jitclass instance containing attributes copied from obj. *args is of the form type,names,type,names ... where names is a string 'attr1 attr2 attr3' containing space-separated names of attributes of obj. Those attributes are declared to numba with the type preceding them. The result of store_data can be used as argument to a @jit function.""" 10 spec = [] 11 for item in args: 12 if isinstance(item,str): 13 spec = spec + [(name,thetype) for name in item.split(' ')] 14 else: 15 thetype=item 16 @numba.jitclass(spec) 17 class JitClass(object): 18 def __init__(self): pass 19 data=JitClass() 20 for name,thetype in spec: setattr(data, name, getattr(obj,name)) 21 return data 8 class NumbaData(object): 9 """A base class to extract data from derived class instances and use it as argument to @jit functions. Derived classes must set the 'signature' attribute.""" 10 def data(self): 11 """Returns a jitclass instance containing attributes copied from self, using self.signature which is of the form type,names,type,names ... where names is a string 'attr1 attr2 attr3' containing space-separated names of attributes of self. Those attributes are declared to numba with the type preceding them. The result of data() can be used as argument to a @jit function.""" 12 spec = [] 13 for item in self.signature: 14 if isinstance(item,str): 15 spec = spec + [(name,thetype) for name in item.split(' ')] 16 else: 17 thetype=item 18 @numba.jitclass(spec) 19 class JitClass(object): 20 def __init__(self): pass 21 data=JitClass() 22 for name,thetype in spec: setattr(data, name, getattr(self,name)) 23 return data 22 24 23 25 jit=numba.jit(nopython=True, nogil=True, error_model='numpy', fastmath=True) -
codes/icosagcm/devel/Python/dynamico/meshes.py
r804 r805 90 90 return z.transpose() 91 91 92 class Cartesian_ mesh(Base_class):92 class Cartesian_Mesh(Base_class): 93 93 def __init__(self,nx,ny,llm,nqdyn,Lx,Ly,f): 94 94 dx,dy = Lx/nx, Ly/ny … … 115 115 def zeros(shape,n=1): return [np.zeros(shape) for i in range(n)] if n>1 else np.zeros(shape) 116 116 def indices(shape,n=1): return [np.zeros(shape,np.int32) for i in range(n)] if n>1 else np.zeros(shape,np.int32) 117 118 primal_num, dual_num, edge_num = nx*ny, nx*ny, 2*nx*ny 117 119 118 120 Aiv, lon_i,lon_v,lat_i,lat_v = zeros( nx*ny, 5) … … 178 180 179 181 Aiv[:]=dx*dy # Ai=Av=dx*dy 180 le_de=le/de 181 unst.init_mesh(llm,nqdyn,2*nx*ny,nx*ny,nx*ny,4,4,4, 182 primal_deg,primal_edge,primal_ne, 183 dual_deg,dual_edge,dual_ne,dual_vertex, 184 left,right,down,up,trisk_deg,trisk, 185 Aiv,Aiv,f+0.*Aiv,le_de,Riv2,wee) 186 self.set_members(locals(), 'primal_deg', 'primal_edge', 'primal_ne', 'primal_vertex', 182 le_de, fv = le/de, f+0.*Aiv 183 184 self.set_members(locals(), 'primal_num', 'dual_num', 'edge_num', 185 'primal_deg', 'primal_edge', 'primal_ne', 'primal_vertex', 187 186 'dual_deg', 'dual_edge', 'dual_ne', 'dual_vertex', 188 187 'left','right','down','up', 189 188 'trisk_deg','trisk','Riv2','wee', 190 'lon_i','lat_i','lon_v','lat_v', 189 'lon_i','lat_i','lon_v','lat_v', 'fv', 191 190 'le_de','le','de','lon_e','lat_e','angle_e', 192 191 'primal_i','primal_j','edge_i','edge_j') 193 192 self.Ai, self.Av = Aiv, Aiv 193 self.to_dynamico() 194 def to_dynamico(self): pass 194 195 def ncwrite(self, name): 195 196 """The method writes Cartesian mesh on the disc. … … 399 400 400 401 class Abstract_Mesh(Base_class): 402 def to_dynamico(self): pass 401 403 def field_theta(self,n=1): return zeros((n,self.nqdyn,self.primal_num,self.llm)) 402 404 def field_mass(self,n=1): return zeros((n,self.primal_num,self.llm)) … … 436 438 self.lon_v, self.lat_v = mapping.map(self.lon_v, self.lat_v) 437 439 self.lon_e, self.lat_e = mapping.map(self.lon_e, self.lat_e) 438 440 439 441 class Unstructured_Mesh(Abstract_Mesh): 440 442 def __init__(self, gridfile, llm, nqdyn, radius, f): … … 466 468 'primal_num', 'dual_num', 'edge_num', 'primal_deg', 'primal_vertex', 'primal_ne', 467 469 'lat_i', 'lon_i', 'lat_v', 'lon_v', 'lat_e', 'lon_e', 'angle_e', 468 'Ai', 'Av', 'fv', 'le', 'de', ' le_de',470 'Ai', 'Av', 'fv', 'le', 'de', 'down', 'up', 'le_de', 469 471 'trisk_deg', 'trisk', 'wee', 'Riv2', 'dual_ne', 470 472 'left', 'right', 471 473 'primal_edge') 472 474 gridfile.normalize(self) 473 max_primal_deg, max_dual_deg, max_trisk_deg = [ x.shape[1] for x in primal_edge, dual_edge, trisk] 474 unst.init_mesh(llm, nqdyn, edge_num, primal_num,dual_num, 475 max_trisk_deg, max_primal_deg, max_dual_deg, 476 primal_deg,primal_edge,primal_ne, 477 dual_deg,dual_edge,dual_ne,dual_vertex, 478 left,right,down,up,trisk_deg,trisk, 479 self.Ai,self.Av,self.fv,le_de,Riv2,wee) 475 self.to_dynamico() 480 476 self.primal = tri.Triangulation(lon_i*radian, lat_i*radian) 481 477 self.dual = tri.Triangulation(lon_v*radian, lat_v*radian) … … 604 600 for edge in range(edge_num): 605 601 if edge_deg[edge]<2: up[edge]=down[edge] 606 max_primal_deg, max_dual_deg, max_trisk_deg = [x.shape[1] for x in primal_edge, dual_edge, trisk]607 602 608 603 # construct own primal mesh for XIOS output … … 638 633 'trisk_deg', 'trisk', 'wee', 639 634 'dual_deg', 'dual_edge', 'dual_ne', 'dual_vertex', 'Riv2', 640 'left','right','primal_deg','primal_edge','primal_ne', 635 'left', 'right', 'down', 'up', 636 'primal_deg', 'primal_edge', 'primal_ne', 641 637 'vertices_V1', 'edges_E2', 642 638 'lon_i', 'lat_i', 'Ai', … … 651 647 self.fv = mapping.coriolis(self.lon_v,self.lat_v) # Coriolis parameter 652 648 # propagate info to Fortran side 653 unst.init_mesh(llm, nqdyn, self.edge_num, self.primal_num, self.dual_num, 654 max_trisk_deg, max_primal_deg, max_dual_deg, 655 primal_deg,primal_edge,primal_ne, 656 dual_deg,dual_edge,dual_ne,dual_vertex, 657 left,right,down,up,trisk_deg,trisk, 658 self.Ai,self.Av,self.fv,self.le_de,self.Riv2,self.wee) 659 649 self.to_dynamico() 660 650 # setup halo transfers - NB : llm must be set before we call set_dynamico_transfer 661 651 self.com_primal = parallel.Halo_Xchange( … … 767 757 return bounds 768 758 769 class Stencil_glob :759 class Stencil_glob(object): 770 760 def __init__(self, degree, neigh, weight=None): 771 761 self.degree, self.neigh, self.weight = degree, neigh, weight … … 773 763 return Stencil(cells, self.degree, self.neigh, neigh_dict, self.weight) 774 764 775 class Stencil :765 class Stencil(object): 776 766 def __init__(self, cells, degree, neigh, neigh_dict, weight=None): 777 767 get = degree.dim.getter(cells) -
codes/icosagcm/devel/Python/test/py/Godunov.py
r804 r805 72 72 flux = mesh.field_u() 73 73 74 mesh_data = mesh. get_data()74 mesh_data = mesh.data() 75 75 76 76 for i in range(N): -
codes/icosagcm/devel/Python/test/py/NH_3D_bubble.py
r753 r805 3 3 from dynamico import time_step 4 4 from dynamico import DCMIP 5 from dynamico import meshes5 from dynamico.dev import meshes 6 6 from dynamico import precision as prec 7 from dynamico. meshes import Cartesian_mesh as Mesh7 from dynamico.dev.meshes import Cartesian_Mesh as Mesh 8 8 import math as math 9 9 import matplotlib.pyplot as plt -
codes/icosagcm/devel/Python/test/py/RSW2_MPAS_W02.py
r802 r805 13 13 INFO('Loading DYNAMICO modules ...') 14 14 from dynamico import unstructured as unst 15 from dynamico. meshes import MPAS_Format, Unstructured_PMesh as PMesh, Local_Mesh as Mesh15 from dynamico.dev.meshes import MPAS_Format, Unstructured_PMesh as PMesh, Local_Mesh as Mesh 16 16 from dynamico import time_step 17 17 from dynamico import maps
Note: See TracChangeset
for help on using the changeset viewer.