source: CPL/oasis3-mct/branches/OASIS3-MCT_5.0_branch/pyoasis/examples/10-grid/python/writer.py @ 6331

Last change on this file since 6331 was 6331, checked in by aclsce, 17 months ago

Moved oasis-mct_5.0 in oasis3-mct/branches directory.

File size: 5.8 KB
Line 
1#!/usr/bin/env python3
2
3import pyoasis
4from pyoasis import OASIS
5import numpy as np
6import math
7import netCDF4
8
9
10comp = pyoasis.Component("writer")
11
12comm_rank = comp.localcomm.rank
13comm_size = comp.localcomm.size
14
15
16nx_loc = 18
17ny_loc = 18
18nx_global = comm_size*nx_loc
19ny_global = ny_loc
20
21dp_conv = math.pi/180.
22
23partition = pyoasis.BoxPartition(comm_rank*nx_loc, nx_loc, ny_loc, nx_global)
24
25dx = 360.0/nx_global
26dy = 180.0/ny_global
27
28lon = np.array([-180. + comm_rank*nx_loc*dx + float(i)*dx +
29               dx/2.0 for i in range(nx_loc)], dtype=np.float64)
30lon = np.tile(lon, (ny_loc, 1)).T
31
32lat = np.array([-90.0 + float(j)*dy + dy/2.0 for j in range(ny_loc)],
33               dtype=np.float64)
34lat = np.tile(lat, (nx_loc, 1))
35
36grid = pyoasis.Grid('pyoa', nx_global, ny_global, lon, lat, partition)
37
38ncrn = 4
39clo = pyoasis.asarray(np.zeros((nx_loc, ny_loc, ncrn), dtype=np.float64))
40clo[:, :, 0] = lon[:, :] - dx/2.0
41clo[:, :, 1] = lon[:, :] + dx/2.0
42clo[:, :, 2] = clo[:, :, 1]
43clo[:, :, 3] = clo[:, :, 0]
44cla = pyoasis.asarray(np.zeros((nx_loc, ny_loc, ncrn), dtype=np.float64))
45cla[:, :, 0] = lat[:, :] - dy/2.0
46cla[:, :, 1] = cla[:, :, 0]
47cla[:, :, 2] = lat[:, :] + dy/2.0
48cla[:, :, 3] = cla[:, :, 2]
49
50grid.set_corners(clo, cla)
51
52msk = np.zeros((nx_loc, ny_loc), dtype=np.int32)
53if comm_rank == 0:
54    msk[4:6, 2:16] = 1
55    msk[6:11, (8, 9, 14, 15)] = 1
56    msk[11, (8, 9, 10, 13, 14, 15)] = 1
57    msk[12, 9:15] = 1
58    msk[13, 10:14] = 1
59elif comm_rank == 1:
60    msk[(3, 14), 14:16] = 1
61    msk[(4, 13), 12:16] = 1
62    msk[(5, 12), 11:15] = 1
63    msk[(6, 11), 10:13] = 1
64    msk[(7, 10), 9:12] = 1
65    msk[8:10, 2:11] = 1
66elif comm_rank == 2:
67    msk[(4, 13), 4:14] = 1
68    msk[(5, 12), 3:15] = 1
69    msk[(6, 11), 2:5] = 1
70    msk[(6, 11), 13:16] = 1
71    msk[7:11, 2:4] = 1
72    msk[7:11, 14:16] = 1
73
74grid.set_mask(msk, companion="STFC")
75
76frc = np.ones((nx_loc, ny_loc), dtype=np.float64)
77frc = np.where(msk == 1, 0.0, 1.0)
78
79grid.set_frac(frc, companion="STFC")
80
81area = np.zeros((nx_loc, ny_loc), dtype=np.float64)
82area[:, :] = dp_conv * \
83             np.abs(np.sin(cla[:, :, 2] * dp_conv) -
84                    np.sin(cla[:, :, 0] * dp_conv)) * \
85             np.abs(clo[:, :, 1] - clo[:, :, 0])
86
87grid.set_area(area)
88
89angle = np.zeros((nx_loc, ny_loc), dtype=np.float64)
90
91grid.set_angle(angle)
92
93if comm_rank == 0:
94    nx_mono = 180
95    ny_mono = 90
96    dxm = 360.0 / nx_mono
97    dym = 180.0 / ny_mono
98
99    lonm = np.array([float(i)*dxm + dxm/2.0 for i in range(nx_mono)],
100                    dtype=np.float64)
101    lonm = np.tile(lonm, (ny_mono, 1)).T
102
103    latm = np.array([-90.0 + float(j)*dym + dym/2.0 for j in range(ny_mono)],
104                    dtype=np.float64)
105    latm = np.tile(latm, (nx_mono, 1))
106
107    grid2 = pyoasis.Grid('mono', nx_mono, ny_mono, lonm, latm)
108
109    ncrnm = 4
110    clom = pyoasis.asarray(np.zeros((nx_mono, ny_mono, ncrnm),
111                                    dtype=np.float64))
112    clom[:, :, 0] = lonm[:, :] - dxm / 2.0
113    clom[:, :, 1] = lonm[:, :] + dxm / 2.0
114    clom[:, :, 2] = clom[:, :, 1]
115    clom[:, :, 3] = clom[:, :, 0]
116    clam = pyoasis.asarray(np.zeros((nx_mono, ny_mono, ncrnm),
117                                    dtype=np.float64))
118    clam[:, :, 0] = latm[:, :] - dym / 2.0
119    clam[:, :, 1] = clam[:, :, 0]
120    clam[:, :, 2] = latm[:, :] + dym / 2.0
121    clam[:, :, 3] = clam[:, :, 2]
122    grid2.set_corners(clom, clam)
123
124    mskm = np.zeros((nx_mono, ny_mono), dtype=np.int32)
125    mskm = np.where(np.power(lonm[:, :] - 180., 2) +
126                    np.power(latm[:, :], 2) < 30 * 30, 1, 0)
127    grid2.set_mask(mskm)
128
129    frcm = np.ones((nx_mono, ny_mono), dtype=np.float64)
130    frcm = np.where(mskm == 1, 0.0, 1.0)
131
132    grid2.set_frac(frcm)
133
134    aream = np.zeros((nx_mono, ny_mono), dtype=np.float64)
135    aream[:, :] = dp_conv * np.abs(np.sin(clam[:, :, 2] * dp_conv) -
136                                   np.sin(clam[:, :, 0] * dp_conv)
137                                  ) * np.abs(clom[:, :, 1]-clom[:, :, 0])
138
139    grid2.set_area(aream)
140
141    anglem = np.zeros((nx_mono, ny_mono), dtype=np.float64)
142
143    grid2.set_angle(anglem)
144
145    grid2.write()
146
147grid.write()
148
149var_out = pyoasis.Var("FSENDOCN", partition, OASIS.OUT)
150var_in = pyoasis.Var("FRECVATM", partition, OASIS.IN)
151
152comp.enddef()
153
154date = int(0)
155field = pyoasis.asarray(msk)
156var_out.put(date, field)
157var_in.get(date, field)
158
159
160if comm_rank == 0:
161    gf = netCDF4.Dataset('grids.nc', 'r')
162    if not np.amax(gf.variables["pyoa.lat"]) <= 90:
163        exit(-1)
164    if not np.amin(gf.variables["pyoa.lat"]) >= -90:
165        exit(-1)
166    if not np.amax(gf.variables["pyoa.lon"]) <= 180:
167        exit(-1)
168    if not np.amin(gf.variables["pyoa.lon"]) >= -180:
169        exit(-1)
170    if not np.amax(gf.variables["mono.lat"]) <= 90:
171        exit(-1)
172    if not np.amin(gf.variables["mono.lat"]) >= -90:
173        exit(-1)
174    if not np.amax(gf.variables["mono.lon"]) <= 360:
175        exit(-1)
176    if not np.amin(gf.variables["mono.lon"]) >= 0:
177        exit(-1)
178
179    mf = netCDF4.Dataset('masks.nc', 'r')
180    mf_msk = mf.variables["mono.msk"]
181    epsilon = 1e-4
182    for i in range(mf_msk.shape[0]):
183        for j in range(mf_msk.shape[1]):
184            d = math.sqrt((i - mf_msk.shape[0] / 2) ** 2
185                + (j - mf_msk.shape[1] / 2) ** 2)
186            if d < 14:
187                if abs(mf_msk[i][j] - 1) > epsilon:
188                    exit(-1)
189            elif d > 16:
190                if abs(mf_msk[i][j]) > epsilon:
191                    exit(-1)
192 
193    af = netCDF4.Dataset('areas.nc', 'r')
194    af_msk = af.variables["pyoa.srf"]
195    for i in range(af_msk.shape[0]):
196        for j in range(af_msk.shape[1]):
197            if abs(af_msk[i][j] -
198                   0.020205 * math.sin((i+0.5) *
199                   math.pi / af_msk.shape[0])) > epsilon:
200                exit(-1)
201 
202    af.close()
203    mf.close()
204    gf.close()
205
206if comm_rank == 0:
207    print("Writer: successfully ended writing grids")
208
209del comp
Note: See TracBrowser for help on using the repository browser.