File: C:\NOAA\NEMS_11731\src\atmos\gfs\phys\gfs_physics_grid_create_mod.f
1 module gfs_physics_grid_create_mod
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 use esmf_mod, ONLY: esmf_grid, esmf_vm, &
17 ESMF_DistGrid, esmf_success, &
18 ESMF_LogWrite, ESMF_LOG_INFO, &
19 ESMF_DistGridCreate, &
20 ESMF_LogMsgFoundError, &
21 ESMF_FAILURE, ESMF_GridCreate, &
22 ESMF_GridCreateShapeTile, &
23 ESMF_INDEX_DELOCAL, &
24 ESMF_GridAddCoord, &
25 ESMF_GridGetCoord, &
26 ESMF_STAGGERLOC_CENTER, &
27 ESMF_GridValidate,ESMF_MAXSTR, &
28 ESMF_DELayout,ESMF_GridGet, &
29 ESMF_DistGridGet,ESMF_DELayoutGet
30 use gfs_physics_internal_state_mod, ONLY: gfs_physics_internal_state
31 use machine, ONLY: kind_rad
32
33 implicit none
34
35 type(esmf_grid), save :: grid0
36
37 type(esmf_grid), save :: grid3
38
39 type(esmf_grid), save :: grid4
40
41 type(ESMF_Grid), save :: mGrid
42
43
44 contains
45
46
47 subroutine gfs_physics_grid_create_gauss(vm, int_state, &
48 DistGrid0, DistGrid3, DistGrid4, rc)
49
50
51
52
53 type(esmf_vm), intent(inout) :: vm
54 type(gfs_physics_internal_state), intent(inout) :: int_state
55 integer, intent(out) :: rc
56
57 TYPE(ESMF_DistGrid), INTENT(inout) :: DistGrid0
58 TYPE(ESMF_DistGrid), INTENT(inout) :: DistGrid3
59 TYPE(ESMF_DistGrid), INTENT(inout) :: DistGrid4
60
61 integer :: rc1
62 integer :: rcfinal
63
64 integer, dimension(2) :: counts
65 integer, dimension(2) :: arraystr, arrayend
66
67 rc1 = esmf_success
68 rcfinal = esmf_success
69
70
71
72
73
74
75
76 (1) = int_state%lonr*int_state%lats_node_r_max
77 counts(1) = counts(1) * int_state%nodes
78 counts(2) = 1
79 arraystr(1) = 1
80 arraystr(2) = 1
81 arrayend(1) = counts(1)
82 arrayend(2) = counts(2)
83
84
85
86 CALL ESMF_LogWrite("Create DistGrid3", ESMF_LOG_INFO, rc = rc1)
87
88 DistGrid3 = ESMF_DistGridCreate(arraystr, arrayend, rc = rc1)
89
90 IF(ESMF_LogMsgFoundError(rc1, "Create DistGrid3")) THEN
91 rcfinal = ESMF_FAILURE
92 PRINT*, 'Error Happened When Creating DistGrid3, rc = ', rc1
93 rc1 = ESMF_SUCCESS
94 END IF
95
96
97
98
99 CALL ESMF_LogWrite("create gfs_phy grid3", ESMF_LOG_INFO, rc = rc1)
100
101 grid3 = ESMF_GridCreate(name = "gfs_phy grid3", distgrid = DistGrid3, rc = rc1)
102
103 IF(ESMF_LogMsgFoundError(rc1, "Create Grid3")) THEN
104 rcfinal = ESMF_FAILURE
105 PRINT*, 'Error Happened When Creating Grid3, rc = ', rc1
106 rc1 = ESMF_SUCCESS
107 END IF
108
109
110
111
112
113
114 (1) = int_state%lonr*int_state%lats_node_r_max
115 counts(1) = counts(1) * int_state%nodes
116 counts(2) = int_state%levs
117 arraystr(1) = 1
118 arraystr(2) = 1
119 arrayend(1) = counts(1)
120 arrayend(2) = counts(2)
121
122
123
124 CALL ESMF_LogWrite("Create DistGrid4", ESMF_LOG_INFO, rc = rc1)
125
126 DistGrid4 = ESMF_DistGridCreate(arraystr, arrayend, rc = rc1)
127
128 IF(ESMF_LogMsgFoundError(rc1, "Create DistGrid4")) THEN
129 rcfinal = ESMF_FAILURE
130 PRINT*, 'Error Happened When Creating DistGrid4, rc = ', rc1
131 rc1 = ESMF_SUCCESS
132 END IF
133
134
135
136
137 CALL ESMF_LogWrite("create gfs_phy grid4", ESMF_LOG_INFO, rc = rc1)
138
139 grid4 = ESMF_GridCreate(name = "gfs_phy grid4", distgrid = DistGrid4, rc = rc1)
140
141 IF(ESMF_LogMsgFoundError(rc1, "Create Grid4")) THEN
142 rcfinal = ESMF_FAILURE
143 PRINT*, 'Error Happened When Creating Grid4, rc = ', rc1
144 rc1 = ESMF_SUCCESS
145 END IF
146
147
148
149
150
151 (1) = int_state%nodes
152 counts(2) = 5
153 arraystr(1) = 1
154 arraystr(2) = 1
155 arrayend(1) = counts(1)
156 arrayend(2) = counts(2)
157
158
159
160 CALL ESMF_LogWrite("Create DistGrid0", ESMF_LOG_INFO, rc = rc1)
161
162 DistGrid0 = ESMF_DistGridCreate(arraystr, arrayend, rc = rc1)
163
164 IF(ESMF_LogMsgFoundError(rc1, "Create DistGrid0")) THEN
165 rcfinal = ESMF_FAILURE
166 PRINT*, 'Error Happened When Creating DistGrid0, rc = ', rc1
167 rc1 = ESMF_SUCCESS
168 END IF
169
170
171
172 CALL ESMF_LogWrite("create create gfs_phy grid0", ESMF_LOG_INFO, rc = rc1)
173
174 grid0 = ESMF_GridCreate(name = "gfs_phy grid0", distgrid = DistGrid0, rc = rc1)
175
176 IF(ESMF_LogMsgFoundError(rc1, "Create Grid0")) THEN
177 rcfinal = ESMF_FAILURE
178 PRINT*, 'Error Happened When Creating Grid0, rc = ', rc1
179 rc1 = ESMF_SUCCESS
180 END IF
181
182 if(rcfinal == esmf_success) then
183 print*, "pass: gfs_physics_grid_create_gauss."
184 else
185 print*, "fail: gfs_physics_grid_create_gauss."
186 end if
187
188 rc = rcfinal
189
190 end subroutine gfs_physics_grid_create_gauss
191
192
193
194
195
196
197
198
199
200 subroutine gfs_physics_grid_create_Gauss3D(vm, iState, distGrid, rc )
201
202
203
204 type(ESMF_VM), intent(in) :: vm
205 type(gfs_physics_internal_state), intent(in) :: iState
206 TYPE(ESMF_DistGrid), intent(out) :: distGrid
207
208 integer, intent(out) :: rc
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227 integer :: I1, IN, J1, JN
228 integer :: rc1, i, j
229
230
231
232 real(kind=kind_rad), pointer :: centerX(:,:)
233 real(kind=kind_rad), pointer :: centerY(:,:)
234
235
236
237 = esmf_success
238
239 CALL ESMF_LogWrite('CreateGauss3D', ESMF_LOG_INFO, rc = rc1)
240
241
242
243 = ESMF_GridCreateShapeTile ( name='mGrid', &
244 countsPerDEDim1=(/iState%lonr/), &
245 countsPerDEDim2=iState%lats_nodes_r_fix, &
246 countsPerDEDim3=(/iState%levs/), &
247 coordDep1 = (/1,2/), &
248 coordDep2 = (/1,2/), &
249 coordDep3 = (/3/), &
250 gridEdgeLWidth = (/0,0,0/), &
251 gridEdgeUWidth = (/0,0,0/), &
252 indexflag = ESMF_INDEX_DELOCAL, &
253 rc = rc1 )
254
255
256
257 call ESMF_GridAddCoord(mGrid, rc = rc1 )
258
259
260
261 call ESMF_GridGetCoord (mGrid, coordDim=1, localDE=0, &
262 staggerloc=ESMF_STAGGERLOC_CENTER, &
263 fptr=centerX, rc = rc1 )
264
265 call ESMF_GridGetCoord (mGrid, coordDim=2, localDE=0, &
266 staggerloc=ESMF_STAGGERLOC_CENTER, &
267 fptr=centerY, rc = rc1 )
268
269 call GridGetInterior_ (mGrid,i1,in,j1,jn)
270
271 do i = 1, iState%lonr
272 do j = 1, iState%lats_node_r
273 centerX(i,j) = 57.29578* iState%xlon(i,j)
274 centerY(i,j) = 57.29578* iState%xlat(i,j)
275 enddo
276 enddo
277
278
279
280 call ESMF_GridValidate(mGrid, rc=rc1 )
281
282 return
283 end subroutine gfs_physics_grid_create_Gauss3D
284
285
286
287
288 subroutine GridGetInterior_(GRID,I1,IN,J1,JN)
289 type (ESMF_Grid), intent(IN) :: grid
290 integer, intent(OUT) :: I1, IN, J1, JN
291
292
293 integer :: status
294 character(len=ESMF_MAXSTR) :: IAm='MAPL_GridGetInterior'
295
296 type (ESMF_DistGrid) :: distGrid
297 type(ESMF_DELayout) :: LAYOUT
298 integer, allocatable :: AL(:,:)
299 integer, allocatable :: AU(:,:)
300 integer :: nDEs
301 integer :: deId
302 integer :: gridRank
303 integer :: deList(1)
304
305 integer :: ierr, rc1
306
307
308 CALL ESMF_LogWrite("GridGetInterior_", ESMF_LOG_INFO, rc=rc1)
309
310 call ESMF_GridGet (GRID, dimCount=gridRank, distGrid=distGrid, rc=rc1)
311 call ESMF_DistGridGet(distGRID, delayout=layout, rc=STATUS)
312 call ESMF_DELayoutGet(layout, deCount =nDEs, localDeList=deList, rc=rc1)
313 deId = deList(1)
314
315 allocate (AL(gridRank,0:nDEs-1), stat = ierr )
316 allocate (AU(gridRank,0:nDEs-1), stat = ierr )
317
318 call ESMF_DistGridGet(distgrid, &
319 minIndexPDimPDe=AL, maxIndexPDimPDe=AU, rc=rc1 )
320
321 I1 = AL(1, deId)
322 IN = AU(1, deId)
323 J1 = AL(2, deId)
324 JN = AU(2, deId)
325 deallocate(AU, AL)
326
327 end subroutine GridGetInterior_
328
329 end module gfs_physics_grid_create_mod
330