- Timestamp:
- 10/10/18 18:12:01 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/devel/Python/test/py/write_Cartesian_mesh.py
r751 r758 1 1 from dynamico.meshes import zeros 2 from dynamico import meshes 2 3 import numpy as np 3 4 import netCDF4 as cdf 4 5 import argparse 5 6 6 #----------------------- Cartesian mesh -----------------------7 8 def concat(x,y):9 z = np.asarray([x,y])10 return z.transpose()11 12 # arrays is a list of arrays13 # vals is a list of tuples14 # each tuple is stored in each array15 def put(ij, deg, arrays, vals):16 k=017 for vv in vals: # vv is a tuple of values to be stored in arrays18 for array,v in zip(arrays,vv):19 array[ij,k]=v20 k=k+121 deg[ij]=k22 23 class Cartesian_mesh:24 def __init__(self,nx,ny,llm,nqdyn,Lx,Ly):25 dx,dy = Lx/nx, Ly/ny26 self.dx, self.dy = dx,dy27 self.nx, self.ny, self.llm, self.nqdyn = nx,ny,llm,nqdyn28 self.field_z = self.field_mass29 # 1D coordinate arrays30 x=(np.arange(nx)-nx/2.)*Lx/nx31 y=(np.arange(ny)-ny/2.)*Ly/ny32 lev=np.arange(llm)33 levp1=np.arange(llm+1)34 self.x, self.y, self.lev, self.levp1 = x,y,lev,levp135 # 3D coordinate arrays36 self.xx,self.yy,self.ll = np.meshgrid(x,y,lev, indexing='ij')37 self.xxp1,self.yyp1,self.llp1 = np.meshgrid(x,y,levp1, indexing='ij')38 # beware conventions for indexing39 # Fortran order : llm,nx*ny,nqdyn / indices start at 140 # Python order : nqdyn,ny,nx,llm / indices start at 041 # indices below follow Fortran while x,y follow Python/C42 index=lambda x,y : ((x+(nx*(y+2*ny)))%(nx*ny))+143 indexu=lambda x,y : 2*index(x,y)-144 indexv=lambda x,y : 2*index(x,y)45 indices = lambda shape : np.zeros(shape,np.int32)46 47 primal_deg = indices(nx*ny)48 primal_edge = indices((nx*ny,4))49 primal_ne = indices((nx*ny,4))50 51 dual_deg = indices(nx*ny)52 dual_edge = indices((nx*ny,4))53 dual_ne = indices((nx*ny,4))54 primal_vertex = indices((nx*ny,4))55 dual_vertex = indices((nx*ny,4))56 Riv2 = np.zeros((nx*ny,4))57 58 left = indices(2*nx*ny)59 right = indices(2*nx*ny)60 up = indices(2*nx*ny)61 down = indices(2*nx*ny)62 le_de = np.zeros(2*nx*ny)63 le = np.zeros(2*nx*ny)64 de = np.zeros(2*nx*ny)65 angle_e = np.zeros(2*nx*ny)66 67 trisk_deg = indices(2*nx*ny)68 trisk = indices((2*nx*ny,4)) # 4 TRiSK coefs per edge69 wee = np.zeros((2*nx*ny,4))70 71 lon_i = indices(nx*ny)72 lon_v = indices(nx*ny)73 lon_e = indices(2*nx*ny)74 lat_i = indices(nx*ny)75 lat_v = indices(nx*ny)76 lat_e = indices(2*nx*ny)77 78 for x in range(nx):79 for y in range(ny):80 # NB : Fortran indices start at 181 # primal cells82 put(index(x,y)-1, primal_deg,(primal_edge,primal_vertex,primal_ne),83 ((indexu(x,y),index(x,y),1),84 (indexv(x,y),index(x-1,y),1),85 (indexu(x-1,y),index(x-1,y-1),-1),86 (indexv(x,y-1),index(x,y-1),-1) ))87 # dual cells88 put(index(x,y)-1,dual_deg,(dual_edge,dual_vertex,dual_ne,Riv2),89 ((indexv(x+1,y),index(x,y),1,.25),90 (indexu(x,y+1),index(x+1,y),-1,.25),91 (indexv(x,y),index(x+1,y+1),-1,.25),92 (indexu(x,y),index(x,y+1),1,.25) ))93 # edges :94 # left and right are adjacent primal cells95 # flux is positive when going from left to right96 # up and down are adjacent dual cells (vertices)97 # circulation is positive when going from down to up98 # u-points99 ij =indexu(x,y)-1100 left[ij]=index(x,y)101 left[ij]=index(x,y)102 right[ij]=index(x+1,y)103 down[ij]=index(x,y-1)104 up[ij]=index(x,y)105 #le_de[ij]=dy/dx106 le[ij]=dy107 de[ij]=dx108 le_de[ij]=le[ij]/de[ij]109 angle_e[ij]=0.110 put(ij,trisk_deg,(trisk,wee),(111 (indexv(x,y),.25),112 (indexv(x+1,y),.25),113 (indexv(x,y-1),.25),114 (indexv(x+1,y-1),.25)))115 # v-points116 ij = indexv(x,y)-1117 left[ij]=index(x,y)118 right[ij]=index(x,y+1)119 down[ij]=index(x,y)120 up[ij]=index(x-1,y)121 #le_de[ij]=dx/dy122 le[ij]=dx123 de[ij]=dy124 le_de[ij]=le[ij]/de[ij]125 angle_e[ij]=.5*np.pi126 put(ij,trisk_deg,(trisk,wee),(127 (indexu(x,y),-.25),128 (indexu(x-1,y),-.25),129 (indexu(x,y+1),-.25),130 (indexu(x-1,y+1),-.25)))131 ij = index(x,y)-1132 lon_i[ij], lat_i[ij] = x, y133 ij = index(x,y)-1134 lon_v[ij], lat_v[ij] = x+.5, y+.5135 ij = indexu(x,y)-1136 lon_e[ij], lat_e[ij] = x+.5, y137 ij = indexv(x,y)-1138 lon_e[ij], lat_e[ij] = x, y+.5139 140 Aiv=np.zeros(nx*ny)+dx*dy141 Ai=Av=np.zeros(nx*ny)+dx*dy142 143 self.llm=llm144 self.nqdyn=nqdyn145 self.nx=nx146 self.ny=ny147 self.primal_deg=primal_deg148 self.primal_edge=primal_edge149 self.primal_ne=primal_ne150 self.dual_deg=dual_deg151 self.dual_edge=dual_edge152 self.dual_ne=dual_ne153 self.dual_vertex=dual_vertex154 self.primal_vertex=primal_vertex155 self.left=left156 self.right=right157 self.down=down158 self.up=up159 self.trisk_deg=trisk_deg160 self.trisk=trisk161 self.Aiv=Aiv162 self.Ai=Ai163 self.Av=Av164 self.le=le165 self.de=de166 self.angle_e=angle_e167 self.Riv2=Riv2168 self.wee=wee169 self.lon_i = lon_i170 self.lon_v = lon_v171 self.lon_e = lon_e172 #self.lon_ev = indices(2*nx*ny)173 self.lat_i = lat_i174 self.lat_v = lat_v175 self.lat_e = lat_e176 #self.lat_ev = indices(2*nx*ny)177 178 179 def field_theta(self,n=1): return zeros((n,self.nqdyn,self.ny,self.nx,self.llm))180 def field_mass(self,n=1): return zeros((n,self.ny,self.nx,self.llm))181 def field_z(self,n=1): return zeros((n,self.ny,self.nx,self.llm))182 def field_w(self,n=1): return zeros((n,self.ny,self.nx,self.llm+1))183 def field_u(self,n=1):184 if n==1:185 return np.zeros((self.ny,2*self.nx,self.llm))186 else:187 return np.zeros((n,self.ny,2*self.nx,self.llm))188 def field_ps(self,n=1): return zeros((n,self.ny,self.nx))189 def ucomp(self,u): return u[:,range(0,2*self.nx,2),:]190 def set_ucomp(self,uv,u): uv[:,range(0,2*self.nx,2),:]=u191 def vcomp(self,u): return u[:,range(1,2*self.nx,2),:]192 193 194 #----------------------------WRITING MESH----------------------195 def ncwrite(self, name):196 """The method writes Cartesian mesh on the disc.197 Args: Mesh parameters"""198 199 #----------------OPENING NETCDF OUTPUT FILE------------200 201 try:202 f = cdf.Dataset(name, 'w', format='NETCDF4')203 except:204 print("CartesianMesh.ncwrite : Error occurred while opening new netCDF mesh file")205 raise206 207 #----------------DEFINING DIMENSIONS--------------------208 209 for dimname, dimsize in [("primal_cell", self.primal_deg.size),210 ("dual_cell", self.dual_deg.size),211 ("edge", self.left.size),212 ("primal_edge_or_vertex", self.primal_edge.shape[1]),213 ("dual_edge_or_vertex", self.dual_edge.shape[1]),214 ("TWO", 2),215 ("trisk_edge", 4)]:216 f.createDimension(dimname,dimsize)217 218 #----------------DEFINING VARIABLES---------------------219 220 f.description = "Cartesian_mesh"221 f.nx, f.ny = self.nx, self.ny222 223 def create_vars(dimname, info):224 for vname, vtype, vdata in info:225 # print('create_vars', dimname, vname, vdata.shape)226 var = f.createVariable(vname,vtype,dimname)227 var[:] = vdata228 229 create_vars("primal_cell",230 [("primal_deg","i4",self.primal_deg),231 ("Ai","f8",self.Aiv),232 ("lon_i","f8",self.lon_i),233 ("lat_i","f8",self.lat_i)] )234 create_vars("dual_cell",235 [("dual_deg","i4",self.dual_deg),236 ("Av","f8",self.Aiv),237 ("lon_v","f8",self.lon_v),238 ("lat_v","f8",self.lat_v),239 ] )240 241 create_vars( ("primal_cell","primal_edge_or_vertex"),242 [("primal_edge", "i4", self.primal_edge),243 ("primal_ne", "i4", self.primal_ne),244 ("primal_vertex", "i4", self.primal_vertex)] )245 246 create_vars( ("dual_cell","dual_edge_or_vertex"),247 [("dual_edge", "i4", self.dual_edge),248 ("dual_vertex","i4",self.dual_vertex),249 ("dual_ne","i4",self.dual_ne),250 ("Riv2","f8",self.Riv2)] )251 252 create_vars("edge",253 [("trisk_deg","i4",self.trisk_deg),254 ("le","f8",self.le),255 ("de","f8",self.de),256 ("lon_e","f8", self.lon_e),257 ("lat_e","f8", self.lat_e),258 ("angle_e","f8", self.angle_e)] )259 260 create_vars( ("edge","TWO"),261 [("edge_left_right","i4", concat(self.left,self.right)),262 ("edge_down_up","i4", concat(self.down,self.up))] )263 264 265 create_vars( ("edge","trisk_edge"),266 [("trisk","i4",self.trisk),267 ("wee","f8",self.wee)] )268 269 f.close()270 271 272 #--------------------------------- Main program -------------------------------------273 274 7 parser = argparse.ArgumentParser() 275 8 276 9 parser.add_argument("-nx", type=int, 277 default= 128, choices=None,10 default=64, choices=None, 278 11 help="number of x points") 279 12 parser.add_argument("-ny", type=int, 280 default= 128, choices=None,13 default=64, choices=None, 281 14 help="number of y points") 282 15 parser.add_argument("-Lx", type=float, … … 293 26 294 27 dx,dy=Lx/nx,Ly/ny 295 mesh = Cartesian_mesh(nx,ny,llm,nqdyn,Lx,Ly)28 mesh = meshes.Cartesian_mesh(nx,ny,llm,nqdyn,Lx,Ly,0.) 296 29 print('Successfully initialized Cartesian mesh') 297 mesh.ncwrite('cart_ '+str(nx)+'.nc')30 mesh.ncwrite('cart_%03d_%03d.nc'%(nx,ny)) 298 31 print('Successfully written Cartesian mesh to NetCDF File')
Note: See TracChangeset
for help on using the changeset viewer.