SCALE-RM
scale_gridtrans.F90
Go to the documentation of this file.
1 !-------------------------------------------------------------------------------
14 !-------------------------------------------------------------------------------
16  !-----------------------------------------------------------------------------
17  !
18  !++ used modules
19  !
20  use scale_precision
21  use scale_stdio
22  use scale_prof
24  !-----------------------------------------------------------------------------
25  implicit none
26  private
27  !-----------------------------------------------------------------------------
28  !
29  !++ Public procedure
30  !
31  public :: gtrans_setup
32 
33  !-----------------------------------------------------------------------------
34  !
35  !++ Public parameters & variables
36  !
37  real(RP), public, allocatable :: gtrans_mapf (:,:,:,:)
38  real(RP), public, allocatable :: gtrans_rotc (:,:,:)
39 
40  real(RP), public, allocatable :: gtrans_gsqrt(:,:,:,:)
41  real(RP), public, allocatable :: gtrans_j13g (:,:,:,:)
42  real(RP), public, allocatable :: gtrans_j23g (:,:,:,:)
43  real(RP), public :: gtrans_j33g
44 
45  real(RP), public, allocatable :: gtrans_limyz(:,:,:,:)
46  real(RP), public, allocatable :: gtrans_limxz(:,:,:,:)
47  real(RP), public, allocatable :: gtrans_limxy(:,:,:,:)
48 
49  integer, public :: i_xyz = 1 ! at (x,y,z)
50  integer, public :: i_xyw = 2 ! at (x,y,w)
51  integer, public :: i_uyw = 3 ! at (u,y,w)
52  integer, public :: i_xvw = 4 ! at (x,v,w)
53  integer, public :: i_uyz = 5 ! at (u,y,z)
54  integer, public :: i_xvz = 6 ! at (x,v,z)
55  integer, public :: i_uvz = 7 ! at (u,v,z)
56 
57  integer, public :: i_xy = 1 ! at (x,y)
58  integer, public :: i_uy = 2 ! at (u,y)
59  integer, public :: i_xv = 3 ! at (x,v)
60  integer, public :: i_uv = 4 ! at (u,v)
61 
62  integer, public :: i_fyz = 1 ! y-z face limiting x-flux
63  integer, public :: i_fxz = 2 ! x-z face limiting y-flux
64  integer, public :: i_fxy = 3 ! x-y face limiting z-flux
65 
66  !-----------------------------------------------------------------------------
67  !
68  !++ Private procedure
69  !
70  private :: gtrans_mapfactor
71  private :: gtrans_terrainfollowing
72  private :: gtrans_thin_wall
73  private :: gtrans_step_mountain
74  private :: gtrans_write
75 
76  !-----------------------------------------------------------------------------
77  !
78  !++ Private parameters & variables
79  !
80  character(len=H_LONG), private :: gtrans_out_basename = ''
81  character(len=H_MID), private :: gtrans_out_title = 'SCALE-RM GEOMETRICS'
82  character(len=H_SHORT), private :: gtrans_out_dtype = 'DEFAULT'
83 
84  character(len=H_SHORT), private :: gtrans_topo_type = 'TERRAINFOLLOWING'
85  integer, private :: gtrans_thinwall_xdiv = 50
86  integer, private :: gtrans_thinwall_ydiv = 50
87  logical, private :: debug = .false.
88  !-----------------------------------------------------------------------------
89 contains
90  !-----------------------------------------------------------------------------
92  subroutine gtrans_setup
93  use scale_process, only: &
95  implicit none
96 
97  namelist / param_gtrans / &
98  gtrans_out_basename, &
99  gtrans_out_dtype, &
100  gtrans_topo_type, &
101  gtrans_thinwall_xdiv, &
102  gtrans_thinwall_ydiv, &
103  debug
104 
105  integer :: ierr
106  !---------------------------------------------------------------------------
107 
108  if( io_l ) write(io_fid_log,*)
109  if( io_l ) write(io_fid_log,*) '++++++ Module[GRIDTRANS] / Categ[ATMOS-RM GRID] / Origin[SCALElib]'
110 
111  !--- read namelist
112  rewind(io_fid_conf)
113  read(io_fid_conf,nml=param_gtrans,iostat=ierr)
114  if( ierr < 0 ) then !--- missing
115  if( io_l ) write(io_fid_log,*) '*** Not found namelist. Default used.'
116  elseif( ierr > 0 ) then !--- fatal error
117  write(*,*) 'xxx Not appropriate names in namelist PARAM_GTRANS. Check!'
118  call prc_mpistop
119  endif
120  if( io_nml ) write(io_fid_nml,nml=param_gtrans)
121 
122  allocate( gtrans_mapf(ia,ja,2,4) )
123 
124  allocate( gtrans_rotc(ia,ja,2) )
125 
126  allocate( gtrans_gsqrt(ka,ia,ja,7) )
127  allocate( gtrans_j13g(ka,ia,ja,7) )
128  allocate( gtrans_j23g(ka,ia,ja,7) )
129 
130  gtrans_gsqrt(:,:,:,:) = 1.0_rp
131  gtrans_j13g(:,:,:,:) = 0.0_rp
132  gtrans_j23g(:,:,:,:) = 0.0_rp
133  gtrans_j33g = 1.0_rp
134 
135  allocate( gtrans_limyz(ka,ia,ja,7) )
136  allocate( gtrans_limxz(ka,ia,ja,7) )
137  allocate( gtrans_limxy(ka,ia,ja,7) )
138  gtrans_limyz(:,:,:,:) = 1.0_rp
139  gtrans_limxz(:,:,:,:) = 1.0_rp
140  gtrans_limxy(:,:,:,:) = 1.0_rp
141 
142  ! calc metrics for orthogonal curvelinear coordinate
143  call gtrans_mapfactor
144 
145  ! calc coeficient for rotaion of velocity vector
146  call gtrans_rotcoef
147 
148  ! calc metrics for terrain-following,step-mountain,thin-wall coordinate
149  if( io_l ) write(io_fid_log,*)
150  if( io_l ) write(io_fid_log,*) '*** Terrain coordinate type : ', trim(gtrans_topo_type)
151  select case(gtrans_topo_type)
152  case('TERRAINFOLLOWING')
153  if( io_l ) write(io_fid_log,*) '*** => Terrain-following method'
154  call gtrans_terrainfollowing
155  case('STEPMOUNTAIN')
156  if( io_l ) write(io_fid_log,*) '*** => Step-mountain method'
157  call gtrans_thin_wall
158  call gtrans_step_mountain
159  case('THINWALL')
160  if( io_l ) write(io_fid_log,*) '*** => Thin-wall approximation method'
161  call gtrans_thin_wall
162  case default
163  write(*,*) 'xxx Unsupported GTRANS_TOPO_type. STOP'
164  call prc_mpistop
165  end select
166 
167  ! output metrics (for debug)
168  call gtrans_write
169 
170  return
171  end subroutine gtrans_setup
172 
173  !-----------------------------------------------------------------------------
175  subroutine gtrans_mapfactor
176  use scale_mapproj, only: &
178  use scale_grid_real, only: &
180  real_lat, &
181  real_latx, &
182  real_laty, &
183  real_latxy
184  implicit none
185  !---------------------------------------------------------------------------
186 
187  call mprj_mapfactor( real_lat(1:ia,1:ja), gtrans_mapf(:,:,1,i_xy), gtrans_mapf(:,:,2,i_xy))
188  call mprj_mapfactor( real_latx(1:ia,1:ja), gtrans_mapf(:,:,1,i_uy), gtrans_mapf(:,:,2,i_uy))
189  call mprj_mapfactor( real_laty(1:ia,1:ja), gtrans_mapf(:,:,1,i_xv), gtrans_mapf(:,:,2,i_xv))
190  call mprj_mapfactor( real_latxy(1:ia,1:ja), gtrans_mapf(:,:,1,i_uv), gtrans_mapf(:,:,2,i_uv))
191 
192  call real_calc_areavol( gtrans_mapf(:,:,:,i_xy) )
193 
194  return
195  end subroutine gtrans_mapfactor
196 
197  !-----------------------------------------------------------------------------
199  subroutine gtrans_rotcoef
200  use scale_mapproj, only: &
201  mprj_rotcoef
202  use scale_grid_real, only: &
203  real_lon, &
204  real_lat
205  implicit none
206  !---------------------------------------------------------------------------
207 
208  call mprj_rotcoef( gtrans_rotc(:,:,:), & ! [OUT]
209  real_lon(:,:), & ! [IN]
210  real_lat(:,:) ) ! [IN]
211 
212  return
213  end subroutine gtrans_rotcoef
214 
215  !-----------------------------------------------------------------------------
217  subroutine gtrans_terrainfollowing
218  use scale_grid, only: &
219  grid_rcdz, &
220  grid_rcdx, &
221  grid_rcdy, &
222  grid_rfdz, &
223  grid_rfdx, &
224  grid_rfdy
225  use scale_grid_real, only: &
226  real_cz, &
227  real_fz
228  use scale_comm, only: &
229  comm_vars8, &
230  comm_wait
231  implicit none
232 
233  real(RP) :: REAL_CZ_U ( KA,IA,JA)
234  real(RP) :: REAL_CZ_V ( KA,IA,JA)
235  real(RP) :: REAL_CZ_UV( KA,IA,JA)
236  real(RP) :: REAL_FZ_U (0:KA,IA,JA)
237  real(RP) :: REAL_FZ_V (0:KA,IA,JA)
238  real(RP) :: REAL_FZ_UV(0:KA,IA,JA)
239 
240  integer :: k, i, j
241  !---------------------------------------------------------------------------
242 
243  ! calc Z-coordinate height at staggered position
244  do j = 1, ja
245  do i = 1, ia-1
246  do k = 1, ka
247  real_cz_u(k,i,j) = 0.5_rp * ( real_cz(k,i+1,j) + real_cz(k,i,j) )
248  enddo
249  enddo
250  enddo
251 
252  do j = 1, ja
253  do i = 1, ia-1
254  do k = 0, ka
255  real_fz_u(k,i,j) = 0.5_rp * ( real_fz(k,i+1,j) + real_fz(k,i,j) )
256  enddo
257  enddo
258  enddo
259 
260  do j = 1, ja-1
261  do i = 1, ia
262  do k = 1, ka
263  real_cz_v(k,i,j) = 0.5_rp * ( real_cz(k,i,j+1) + real_cz(k,i,j) )
264  enddo
265  enddo
266  enddo
267 
268  do j = 1, ja-1
269  do i = 1, ia
270  do k = 0, ka
271  real_fz_v(k,i,j) = 0.5_rp * ( real_fz(k,i,j+1) + real_fz(k,i,j) )
272  enddo
273  enddo
274  enddo
275 
276  do j = 1, ja-1
277  do i = 1, ia-1
278  do k = 1, ka
279  real_cz_uv(k,i,j) = 0.25_rp * ( real_cz(k,i+1,j+1) + real_cz(k,i+1,j) &
280  + real_cz(k,i ,j+1) + real_cz(k,i ,j) )
281  enddo
282  enddo
283  enddo
284 
285  do j = 1, ja-1
286  do i = 1, ia-1
287  do k = 0, ka
288  real_fz_uv(k,i,j) = 0.25_rp * ( real_fz(k,i+1,j+1) + real_fz(k,i+1,j) &
289  + real_fz(k,i ,j+1) + real_fz(k,i ,j) )
290  enddo
291  enddo
292  enddo
293 
294  ! G^1/2
295  do j = js, je
296  do i = is, ie
297  ! at (x,y,z)
298  do k = 1, ka
299  gtrans_gsqrt(k,i,j,i_xyz) = ( real_fz(k,i,j) - real_fz(k-1,i,j) ) * grid_rcdz(k)
300  enddo
301 
302  ! at (x,y,w)
303  do k = 1, ka-1
304  gtrans_gsqrt(k,i,j,i_xyw) = ( real_cz(k+1,i,j) - real_cz(k,i,j) ) * grid_rfdz(k)
305  enddo
306  gtrans_gsqrt(ka,i,j,i_xyw) = gtrans_gsqrt(ka-1,i,j,i_xyw)
307 
308  ! at (u,y,w)
309  do k = 1, ka-1
310  gtrans_gsqrt(k,i,j,i_uyw) = ( real_cz_u(k+1,i,j) - real_cz_u(k,i,j) ) * grid_rfdz(k)
311  enddo
312  gtrans_gsqrt(ka,i,j,i_uyw) = gtrans_gsqrt(ka-1,i,j,i_uyw)
313 
314  ! at (x,v,w)
315  do k = 1, ka-1
316  gtrans_gsqrt(k,i,j,i_xvw) = ( real_cz_v(k+1,i,j) - real_cz_v(k,i,j) ) * grid_rfdz(k)
317  enddo
318  gtrans_gsqrt(ka,i,j,i_xvw) = gtrans_gsqrt(ka-1,i,j,i_xvw)
319 
320  ! at (u,y,z)
321  do k = 1, ka
322  gtrans_gsqrt(k,i,j,i_uyz) = ( real_fz_u(k,i,j) - real_fz_u(k-1,i,j) ) * grid_rcdz(k)
323  enddo
324 
325  ! at (x,v,z)
326  do k = 1, ka
327  gtrans_gsqrt(k,i,j,i_xvz) = ( real_fz_v(k,i,j) - real_fz_v(k-1,i,j) ) * grid_rcdz(k)
328  enddo
329 
330  ! at (u,v,z)
331  do k = 1, ka
332  gtrans_gsqrt(k,i,j,i_uvz) = ( real_fz_uv(k,i,j) - real_fz_uv(k-1,i,j) ) * grid_rcdz(k)
333  enddo
334  enddo
335  enddo
336 
337  call comm_vars8( gtrans_gsqrt(:,:,:,1), 1 )
338  call comm_vars8( gtrans_gsqrt(:,:,:,2), 2 )
339  call comm_vars8( gtrans_gsqrt(:,:,:,3), 3 )
340  call comm_vars8( gtrans_gsqrt(:,:,:,4), 4 )
341  call comm_vars8( gtrans_gsqrt(:,:,:,5), 5 )
342  call comm_vars8( gtrans_gsqrt(:,:,:,6), 6 )
343  call comm_vars8( gtrans_gsqrt(:,:,:,7), 7 )
344  call comm_wait ( gtrans_gsqrt(:,:,:,1), 1 )
345  call comm_wait ( gtrans_gsqrt(:,:,:,2), 2 )
346  call comm_wait ( gtrans_gsqrt(:,:,:,3), 3 )
347  call comm_wait ( gtrans_gsqrt(:,:,:,4), 4 )
348  call comm_wait ( gtrans_gsqrt(:,:,:,5), 5 )
349  call comm_wait ( gtrans_gsqrt(:,:,:,6), 6 )
350  call comm_wait ( gtrans_gsqrt(:,:,:,7), 7 )
351 
352  ! Jacobian * G^1/2
353  do j = js, je
354  do i = is, ie
355  do k = 1, ka
356  gtrans_j13g(k,i,j,i_xyz) = -( real_cz_u(k,i ,j) - real_cz_u(k,i-1,j) ) * grid_rcdx(i)
357  gtrans_j13g(k,i,j,i_xyw) = -( real_fz_u(k,i ,j) - real_fz_u(k,i-1,j) ) * grid_rcdx(i)
358  gtrans_j13g(k,i,j,i_uyw) = -( real_fz(k,i+1,j) - real_fz(k,i ,j) ) * grid_rfdx(i)
359  gtrans_j13g(k,i,j,i_xvw) = -( real_fz_uv(k,i ,j) - real_fz_uv(k,i-1,j) ) * grid_rcdx(i)
360  gtrans_j13g(k,i,j,i_uyz) = -( real_cz(k,i+1,j) - real_cz(k,i ,j) ) * grid_rfdx(i)
361  gtrans_j13g(k,i,j,i_xvz) = -( real_cz_uv(k,i ,j) - real_cz_uv(k,i-1,j) ) * grid_rcdx(i)
362  gtrans_j13g(k,i,j,i_uvz) = -( real_cz_v(k,i+1,j) - real_cz_v(k,i ,j) ) * grid_rfdx(i)
363  enddo
364  enddo
365  enddo
366 
367  do j = js, je
368  do i = is, ie
369  do k = 1, ka
370  gtrans_j23g(k,i,j,i_xyz) = -( real_cz_v(k,i,j ) - real_cz_v(k,i,j-1) ) * grid_rcdy(j)
371  gtrans_j23g(k,i,j,i_xyw) = -( real_fz_v(k,i,j ) - real_fz_v(k,i,j-1) ) * grid_rcdy(j)
372  gtrans_j23g(k,i,j,i_xvw) = -( real_fz(k,i,j+1) - real_fz(k,i,j ) ) * grid_rfdy(j)
373  gtrans_j23g(k,i,j,i_uyw) = -( real_fz_uv(k,i,j ) - real_fz_uv(k,i,j-1) ) * grid_rcdy(j)
374  gtrans_j23g(k,i,j,i_xvz) = -( real_cz(k,i,j+1) - real_cz(k,i,j ) ) * grid_rfdy(j)
375  gtrans_j23g(k,i,j,i_uyz) = -( real_cz_uv(k,i,j ) - real_cz_uv(k,i,j-1) ) * grid_rcdy(j)
376  gtrans_j23g(k,i,j,i_uvz) = -( real_cz_u(k,i,j+1) - real_cz_u(k,i,j ) ) * grid_rfdy(j)
377  enddo
378  enddo
379  enddo
380 
381  gtrans_j33g = 1.0_rp ! - 1 / G^1/2 * G^1/2
382 
383  call comm_vars8( gtrans_j13g(:,:,:,i_xyz), 8 )
384  call comm_vars8( gtrans_j13g(:,:,:,i_xyw), 9 )
385  call comm_vars8( gtrans_j13g(:,:,:,i_uyw), 10 )
386  call comm_vars8( gtrans_j13g(:,:,:,i_xvw), 11 )
387  call comm_vars8( gtrans_j13g(:,:,:,i_uyz), 12 )
388  call comm_vars8( gtrans_j13g(:,:,:,i_xvz), 13 )
389  call comm_vars8( gtrans_j13g(:,:,:,i_uvz), 14 )
390  call comm_wait ( gtrans_j13g(:,:,:,i_xyz), 8 )
391  call comm_wait ( gtrans_j13g(:,:,:,i_xyw), 9 )
392  call comm_wait ( gtrans_j13g(:,:,:,i_uyw), 10 )
393  call comm_wait ( gtrans_j13g(:,:,:,i_xvw), 11 )
394  call comm_wait ( gtrans_j13g(:,:,:,i_uyz), 12 )
395  call comm_wait ( gtrans_j13g(:,:,:,i_xvz), 13 )
396  call comm_wait ( gtrans_j13g(:,:,:,i_uvz), 14 )
397 
398  call comm_vars8( gtrans_j23g(:,:,:,i_xyz), 15 )
399  call comm_vars8( gtrans_j23g(:,:,:,i_xyw), 16 )
400  call comm_vars8( gtrans_j23g(:,:,:,i_uyw), 17 )
401  call comm_vars8( gtrans_j23g(:,:,:,i_xvw), 18 )
402  call comm_vars8( gtrans_j23g(:,:,:,i_uyz), 19 )
403  call comm_vars8( gtrans_j23g(:,:,:,i_xvz), 20 )
404  call comm_vars8( gtrans_j23g(:,:,:,i_uvz), 21 )
405  call comm_wait ( gtrans_j23g(:,:,:,i_xyz), 15 )
406  call comm_wait ( gtrans_j23g(:,:,:,i_xyw), 16 )
407  call comm_wait ( gtrans_j23g(:,:,:,i_uyw), 17 )
408  call comm_wait ( gtrans_j23g(:,:,:,i_xvw), 18 )
409  call comm_wait ( gtrans_j23g(:,:,:,i_uyz), 19 )
410  call comm_wait ( gtrans_j23g(:,:,:,i_xvz), 20 )
411  call comm_wait ( gtrans_j23g(:,:,:,i_uvz), 21 )
412 
413  return
414  end subroutine gtrans_terrainfollowing
415 
416  !-----------------------------------------------------------------------------
417  subroutine gtrans_thin_wall
418  use scale_process, only: &
420  use scale_grid, only: &
421  grid_cz, &
422  grid_cx, &
423  grid_cy, &
424  grid_fz, &
425  grid_fx, &
426  grid_fy
427  use scale_topography, only : &
428  topo_zsfc
429  use scale_comm, only : &
430  comm_vars8, &
431  comm_wait
432  implicit none
433 
434  real(RP) :: TOPO_ZsfcALL(2*IA,2*JA)
435  real(RP) :: TOPO_ZsfcXY (IA,JA)
436  real(RP) :: TOPO_ZsfcUY (IA,JA)
437  real(RP) :: TOPO_ZsfcXV (IA,JA)
438  real(RP) :: TOPO_ZsfcUV (IA,JA)
439 
440  real(RP) :: GTRANS_QLIM (2*KA,2*IA,2*JA,3)
441  real(RP) :: QDZ(2*KA)
442  real(RP) :: QDX(2*IA)
443  real(RP) :: QDY(2*JA)
444  real(RP) :: AQAF (3)
445  real(RP) :: XSLOPE, YSLOPE
446  real(RP) :: Ztop
447  real(RP) :: DX_piece, DY_piece
448  real(RP) :: DX, DY, DZ
449 
450  integer :: I_QLIMtoLIM(3,7)
451 
452  integer :: iii, jjj, n
453  integer :: k, i, j, kk, ii, jj
454  !---------------------------------------------------------------------------
455 
456  ! calc absolute height at staggered position
457  ! at (x,y)
458  do j = 1, ja
459  do i = 1, ia
460  topo_zsfcxy(i,j) = topo_zsfc(i,j)
461  enddo
462  enddo
463  ! at (u,y)
464  do j = 1, ja
465  do i = 1, ia-1
466  topo_zsfcuy(i,j) = 0.5_rp * ( topo_zsfc(i,j) + topo_zsfc(i+1,j) )
467  enddo
468  enddo
469  ! at (x,v)
470  do j = 1, ja-1
471  do i = 1, ia
472  topo_zsfcxv(i,j) = 0.5_rp * ( topo_zsfc(i,j) + topo_zsfc(i,j+1) )
473  enddo
474  enddo
475  ! at (u,v)
476  do j = 1, ja-1
477  do i = 1, ia-1
478  topo_zsfcuv(i,j) = 0.25_rp * ( topo_zsfc(i ,j ) + topo_zsfc(i ,j+1) &
479  + topo_zsfc(i ,j+1) + topo_zsfc(i+1,j+1) )
480  enddo
481  enddo
482 
483  ! reset topography
484  topo_zsfc(:,:) = 0.d0
485 
486  call comm_vars8( topo_zsfcxy(:,:), 1 )
487  call comm_vars8( topo_zsfcuy(:,:), 2 )
488  call comm_vars8( topo_zsfcxv(:,:), 3 )
489  call comm_vars8( topo_zsfcuv(:,:), 4 )
490  call comm_wait ( topo_zsfcxy(:,:), 1 )
491  call comm_wait ( topo_zsfcuy(:,:), 2 )
492  call comm_wait ( topo_zsfcxv(:,:), 3 )
493  call comm_wait ( topo_zsfcuv(:,:), 4 )
494 
495  ! all height
496  do j = 1, ja
497  do i = 1, ia
498  ii = (i-1) * 2 + 1
499  jj = (j-1) * 2 + 1
500 
501  topo_zsfcall(ii ,jj ) = topo_zsfcxy(i,j)
502  topo_zsfcall(ii+1,jj ) = topo_zsfcuy(i,j)
503  topo_zsfcall(ii ,jj+1) = topo_zsfcxv(i,j)
504  topo_zsfcall(ii+1,jj+1) = topo_zsfcuv(i,j)
505  enddo
506  enddo
507 
508  ! length of control volume of quarter cell
509  do k = 1, ka
510  kk = (k-1) * 2 + 1
511 
512  qdz(kk ) = grid_cz(k) - grid_fz(k-1)
513  qdz(kk+1) = grid_fz(k) - grid_cz(k )
514  enddo
515 
516  do i = 1, ia-1
517  ii = (i-1) * 2 + 1
518 
519  qdx(ii ) = grid_fx(i ) - grid_cx(i)
520  qdx(ii+1) = grid_cx(i+1) - grid_fx(i)
521  enddo
522 
523  do j = 1, ja-1
524  jj = (j-1) * 2 + 1
525 
526  qdy(jj ) = grid_fy(j ) - grid_cy(j)
527  qdy(jj+1) = grid_cy(j+1) - grid_fy(j)
528  enddo
529 
530  ! quarter flux limiter
531  do jj = 1, 2*(ja-1)
532  do ii = 1, 2*(ia-1)
533  do kk = ks, 2*ke
534  dx_piece = qdx(ii) / real(GTRANS_ThinWall_XDIV,kind=rp)
535  dy_piece = qdy(jj) / real(GTRANS_ThinWall_YDIV,kind=rp)
536 
537  aqaf(1:3) = 0.0_rp
538  ztop = sum(qdz(ks:kk))
539 
540  !--- y-z face ---
541  yslope = ( topo_zsfcall(ii,jj+1) - topo_zsfcall(ii,jj) ) / qdy(jj)
542 
543  do jjj = 1, gtrans_thinwall_ydiv
544  dy = ( real(jjj,kind=RP) - 0.5_RP ) * DY_piece
545  dz = ztop - topo_zsfcall(ii,jj) - yslope * dy
546 
547  if ( dz > 0.0_rp ) then
548  if ( dz < qdz(kk) ) then
549  aqaf(i_fyz) = aqaf(i_fyz) + dz * dy_piece
550  else
551  aqaf(i_fyz) = aqaf(i_fyz) + qdz(kk) * dy_piece
552  endif
553  endif
554  enddo
555 
556  !--- x-z face ---
557  xslope = ( topo_zsfcall(ii+1,jj) - topo_zsfcall(ii,jj) ) / qdx(ii)
558 
559  do iii = 1, gtrans_thinwall_xdiv
560  dx = ( real(iii,kind=RP) - 0.5_RP ) * DX_piece
561  dz = ztop - topo_zsfcall(ii,jj) + xslope * dx
562 
563  if ( dz > 0.0_rp ) then
564  if ( dz < qdz(kk) ) then
565  aqaf(i_fxz) = aqaf(i_fxz) + dz * dx_piece
566  else
567  aqaf(i_fxz) = aqaf(i_fxz) + qdz(kk) * dx_piece
568  endif
569  endif
570  enddo
571 
572  !--- x-y face ---
573  do jjj = 1, gtrans_thinwall_ydiv
574  do iii = 1, gtrans_thinwall_xdiv
575  dx = ( real(iii,kind=RP) - 0.5_RP ) * DX_piece
576  dy = ( real(jjj,kind=RP) - 0.5_RP ) * DY_piece
577  dz = ztop - topo_zsfcall(ii,jj) - xslope * dx - yslope * dy
578 
579  if ( dz > 0.0_rp ) then
580  aqaf(i_fxy) = aqaf(i_fxy) + dx_piece * dy_piece
581  endif
582  enddo
583  enddo
584 
585  gtrans_qlim(kk,ii,jj,i_fyz) = aqaf(i_fyz) / ( qdy(jj) * qdz(kk) )
586  gtrans_qlim(kk,ii,jj,i_fxz) = aqaf(i_fxz) / ( qdx(ii) * qdz(kk) )
587  gtrans_qlim(kk,ii,jj,i_fxy) = aqaf(i_fxy) / ( qdy(jj) * qdx(ii) )
588  enddo
589  enddo
590  enddo
591 
592  ! index i,j,k
593  i_qlimtolim(1:3,i_xyz) = (/ 1, 1, 1 /)
594  i_qlimtolim(1:3,i_xyw) = (/ 1, 1, 0 /)
595  i_qlimtolim(1:3,i_uyw) = (/ 0, 1, 0 /)
596  i_qlimtolim(1:3,i_xvw) = (/ 1, 0, 0 /)
597  i_qlimtolim(1:3,i_uyz) = (/ 0, 1, 1 /)
598  i_qlimtolim(1:3,i_xvz) = (/ 1, 0, 1 /)
599  i_qlimtolim(1:3,i_uvz) = (/ 0, 0, 1 /)
600 
601  do n = 1, 7
602  do j = js, je
603  do i = is, ie
604  do k = ks, ke
605  ii = (i-1) * 2 + 1 - i_qlimtolim(1,n)
606  jj = (j-1) * 2 + 1 - i_qlimtolim(2,n)
607  kk = (k-1) * 2 + 1 - i_qlimtolim(3,n)
608 
609  gtrans_limyz(k,i,j,n) = 0.25_rp * ( gtrans_qlim(kk ,ii,jj,i_fyz) + gtrans_qlim(kk ,ii ,jj+1,i_fyz) &
610  + gtrans_qlim(kk+1,ii,jj,i_fyz) + gtrans_qlim(kk+1,ii ,jj+1,i_fyz) )
611  gtrans_limxz(k,i,j,n) = 0.25_rp * ( gtrans_qlim(kk ,ii,jj,i_fxz) + gtrans_qlim(kk ,ii+1,jj ,i_fxz) &
612  + gtrans_qlim(kk+1,ii,jj,i_fxz) + gtrans_qlim(kk+1,ii+1,jj ,i_fxz) )
613  gtrans_limxy(k,i,j,n) = 0.25_rp * ( gtrans_qlim(kk ,ii,jj,i_fxy) + gtrans_qlim(kk ,ii+1,jj+1,i_fxy) &
614  + gtrans_qlim(kk ,ii,jj,i_fxy) + gtrans_qlim(kk ,ii+1,jj ,i_fxy) )
615 
616  if ( gtrans_limyz(k,i,j,n) > 1.d0 ) then
617  write(*,*) 'xxx Facter miss! Check!'
618  write(*,*) k,i,j,n,gtrans_limyz(k,i,j,n)
619  call prc_mpistop
620  endif
621  enddo
622  enddo
623  enddo
624  enddo
625 
626  call comm_vars8( gtrans_limyz(:,:,:,i_xyz), 1 )
627  call comm_vars8( gtrans_limyz(:,:,:,i_xyw), 2 )
628  call comm_vars8( gtrans_limyz(:,:,:,i_uyw), 3 )
629  call comm_vars8( gtrans_limyz(:,:,:,i_xvw), 4 )
630  call comm_vars8( gtrans_limyz(:,:,:,i_uyz), 5 )
631  call comm_vars8( gtrans_limyz(:,:,:,i_xvz), 6 )
632  call comm_vars8( gtrans_limyz(:,:,:,i_uvz), 7 )
633  call comm_wait ( gtrans_limyz(:,:,:,i_xyz), 1 )
634  call comm_wait ( gtrans_limyz(:,:,:,i_xyw), 2 )
635  call comm_wait ( gtrans_limyz(:,:,:,i_uyw), 3 )
636  call comm_wait ( gtrans_limyz(:,:,:,i_xvw), 4 )
637  call comm_wait ( gtrans_limyz(:,:,:,i_uyz), 5 )
638  call comm_wait ( gtrans_limyz(:,:,:,i_xvz), 6 )
639  call comm_wait ( gtrans_limyz(:,:,:,i_uvz), 7 )
640 
641  call comm_vars8( gtrans_limxz(:,:,:,i_xyz), 8 )
642  call comm_vars8( gtrans_limxz(:,:,:,i_xyw), 9 )
643  call comm_vars8( gtrans_limxz(:,:,:,i_uyw), 10 )
644  call comm_vars8( gtrans_limxz(:,:,:,i_xvw), 11 )
645  call comm_vars8( gtrans_limxz(:,:,:,i_uyz), 12 )
646  call comm_vars8( gtrans_limxz(:,:,:,i_xvz), 13 )
647  call comm_vars8( gtrans_limxz(:,:,:,i_uvz), 14 )
648  call comm_wait ( gtrans_limxz(:,:,:,i_xyz), 8 )
649  call comm_wait ( gtrans_limxz(:,:,:,i_xyw), 9 )
650  call comm_wait ( gtrans_limxz(:,:,:,i_uyw), 10 )
651  call comm_wait ( gtrans_limxz(:,:,:,i_xvw), 11 )
652  call comm_wait ( gtrans_limxz(:,:,:,i_uyz), 12 )
653  call comm_wait ( gtrans_limxz(:,:,:,i_xvz), 13 )
654  call comm_wait ( gtrans_limxz(:,:,:,i_uvz), 14 )
655 
656  call comm_vars8( gtrans_limxy(:,:,:,i_xyz), 15 )
657  call comm_vars8( gtrans_limxy(:,:,:,i_xyw), 16 )
658  call comm_vars8( gtrans_limxy(:,:,:,i_uyw), 17 )
659  call comm_vars8( gtrans_limxy(:,:,:,i_xvw), 18 )
660  call comm_vars8( gtrans_limxy(:,:,:,i_uyz), 19 )
661  call comm_vars8( gtrans_limxy(:,:,:,i_xvz), 20 )
662  call comm_vars8( gtrans_limxy(:,:,:,i_uvz), 21 )
663  call comm_wait ( gtrans_limxy(:,:,:,i_xyz), 15 )
664  call comm_wait ( gtrans_limxy(:,:,:,i_xyw), 16 )
665  call comm_wait ( gtrans_limxy(:,:,:,i_uyw), 17 )
666  call comm_wait ( gtrans_limxy(:,:,:,i_xvw), 18 )
667  call comm_wait ( gtrans_limxy(:,:,:,i_uyz), 19 )
668  call comm_wait ( gtrans_limxy(:,:,:,i_xvz), 20 )
669  call comm_wait ( gtrans_limxy(:,:,:,i_uvz), 21 )
670 
671  return
672  end subroutine gtrans_thin_wall
673 
674  !-----------------------------------------------------------------------------
675  subroutine gtrans_step_mountain
676  use scale_comm, only: &
677  comm_vars8, &
678  comm_wait
679  implicit none
680 
681  integer :: i,j,k,n
682  !---------------------------------------------------------------------------
683 
684  do n = 1, 7
685  do j = js, je
686  do i = is, ie
687  do k = ks, ke
688 
689  if ( gtrans_limyz(k,i,j,n) > 0.0_rp ) then
690  gtrans_limyz(k,i,j,n) = 1.0_rp
691  endif
692 
693  if ( gtrans_limxz(k,i,j,n) > 0.0_rp ) then
694  gtrans_limxz(k,i,j,n) = 1.0_rp
695  endif
696 
697  if ( gtrans_limxy(k,i,j,n) > 0.0_rp ) then
698  gtrans_limxy(k,i,j,n) = 1.0_rp
699  endif
700  enddo
701  enddo
702  enddo
703  enddo
704 
705  call comm_vars8( gtrans_limyz(:,:,:,i_xyz), 1 )
706  call comm_vars8( gtrans_limyz(:,:,:,i_xyw), 2 )
707  call comm_vars8( gtrans_limyz(:,:,:,i_uyw), 3 )
708  call comm_vars8( gtrans_limyz(:,:,:,i_xvw), 4 )
709  call comm_vars8( gtrans_limyz(:,:,:,i_uyz), 5 )
710  call comm_vars8( gtrans_limyz(:,:,:,i_xvz), 6 )
711  call comm_vars8( gtrans_limyz(:,:,:,i_uvz), 7 )
712  call comm_wait ( gtrans_limyz(:,:,:,i_xyz), 1 )
713  call comm_wait ( gtrans_limyz(:,:,:,i_xyw), 2 )
714  call comm_wait ( gtrans_limyz(:,:,:,i_uyw), 3 )
715  call comm_wait ( gtrans_limyz(:,:,:,i_xvw), 4 )
716  call comm_wait ( gtrans_limyz(:,:,:,i_uyz), 5 )
717  call comm_wait ( gtrans_limyz(:,:,:,i_xvz), 6 )
718  call comm_wait ( gtrans_limyz(:,:,:,i_uvz), 7 )
719 
720  call comm_vars8( gtrans_limxz(:,:,:,i_xyz), 8 )
721  call comm_vars8( gtrans_limxz(:,:,:,i_xyw), 9 )
722  call comm_vars8( gtrans_limxz(:,:,:,i_uyw), 10 )
723  call comm_vars8( gtrans_limxz(:,:,:,i_xvw), 11 )
724  call comm_vars8( gtrans_limxz(:,:,:,i_uyz), 12 )
725  call comm_vars8( gtrans_limxz(:,:,:,i_xvz), 13 )
726  call comm_vars8( gtrans_limxz(:,:,:,i_uvz), 14 )
727  call comm_wait ( gtrans_limxz(:,:,:,i_xyz), 8 )
728  call comm_wait ( gtrans_limxz(:,:,:,i_xyw), 9 )
729  call comm_wait ( gtrans_limxz(:,:,:,i_uyw), 10 )
730  call comm_wait ( gtrans_limxz(:,:,:,i_xvw), 11 )
731  call comm_wait ( gtrans_limxz(:,:,:,i_uyz), 12 )
732  call comm_wait ( gtrans_limxz(:,:,:,i_xvz), 13 )
733  call comm_wait ( gtrans_limxz(:,:,:,i_uvz), 14 )
734 
735  call comm_vars8( gtrans_limxy(:,:,:,i_xyz), 15 )
736  call comm_vars8( gtrans_limxy(:,:,:,i_xyw), 16 )
737  call comm_vars8( gtrans_limxy(:,:,:,i_uyw), 17 )
738  call comm_vars8( gtrans_limxy(:,:,:,i_xvw), 18 )
739  call comm_vars8( gtrans_limxy(:,:,:,i_uyz), 19 )
740  call comm_vars8( gtrans_limxy(:,:,:,i_xvz), 20 )
741  call comm_vars8( gtrans_limxy(:,:,:,i_uvz), 21 )
742  call comm_wait ( gtrans_limxy(:,:,:,i_xyz), 15 )
743  call comm_wait ( gtrans_limxy(:,:,:,i_xyw), 16 )
744  call comm_wait ( gtrans_limxy(:,:,:,i_uyw), 17 )
745  call comm_wait ( gtrans_limxy(:,:,:,i_xvw), 18 )
746  call comm_wait ( gtrans_limxy(:,:,:,i_uyz), 19 )
747  call comm_wait ( gtrans_limxy(:,:,:,i_xvz), 20 )
748  call comm_wait ( gtrans_limxy(:,:,:,i_uvz), 21 )
749 
750  return
751  end subroutine gtrans_step_mountain
752 
753  !-----------------------------------------------------------------------------
755  subroutine gtrans_write
756  use scale_const, only: &
758  use scale_vector, only: &
760  use scale_fileio, only: &
761  fileio_write
762  use scale_grid_real, only: &
765  real_lon, &
766  real_lat
767  use scale_mapproj, only: &
769  implicit none
770 
771  real(RP) :: check_X_XY(IA,JA)
772  real(RP) :: check_Y_XY(IA,JA)
773  real(RP) :: distance (IA,JA)
774 
775  integer :: i, j
776  !---------------------------------------------------------------------------
777 
778  if ( gtrans_out_basename /= '' ) then
779 
780  if( io_l ) write(io_fid_log,*)
781  if( io_l ) write(io_fid_log,*) '*** Output metrics file ***'
782 
783  call fileio_write( gtrans_mapf(:,:,1,i_xy), gtrans_out_basename, gtrans_out_title, & ! [IN]
784  'MAPF_X_XY', 'Map factor x-dir at XY', 'NIL', 'XY', gtrans_out_dtype ) ! [IN]
785  call fileio_write( gtrans_mapf(:,:,2,i_xy), gtrans_out_basename, gtrans_out_title, & ! [IN]
786  'MAPF_Y_XY', 'Map factor y-dir at XY', 'NIL', 'XY', gtrans_out_dtype ) ! [IN]
787  call fileio_write( gtrans_mapf(:,:,1,i_uy), gtrans_out_basename, gtrans_out_title, & ! [IN]
788  'MAPF_X_UY', 'Map factor x-dir at UY', 'NIL', 'UY', gtrans_out_dtype ) ! [IN]
789  call fileio_write( gtrans_mapf(:,:,2,i_uy), gtrans_out_basename, gtrans_out_title, & ! [IN]
790  'MAPF_Y_UY', 'Map factor y-dir at UY', 'NIL', 'UY', gtrans_out_dtype ) ! [IN]
791  call fileio_write( gtrans_mapf(:,:,1,i_xv), gtrans_out_basename, gtrans_out_title, & ! [IN]
792  'MAPF_X_XV', 'Map factor x-dir at XV', 'NIL', 'XV', gtrans_out_dtype ) ! [IN]
793  call fileio_write( gtrans_mapf(:,:,2,i_xv), gtrans_out_basename, gtrans_out_title, & ! [IN]
794  'MAPF_Y_XV', 'Map factor y-dir at XV', 'NIL', 'XV', gtrans_out_dtype ) ! [IN]
795  call fileio_write( gtrans_mapf(:,:,1,i_uv), gtrans_out_basename, gtrans_out_title, & ! [IN]
796  'MAPF_X_UV', 'Map factor x-dir at UV', 'NIL', 'UV', gtrans_out_dtype ) ! [IN]
797  call fileio_write( gtrans_mapf(:,:,2,i_uv), gtrans_out_basename, gtrans_out_title, & ! [IN]
798  'MAPF_Y_UV', 'Map factor y-dir at UV', 'NIL', 'UV', gtrans_out_dtype ) ! [IN]
799 
800  call fileio_write( gtrans_rotc(:,:,1), gtrans_out_basename, gtrans_out_title, & ! [IN]
801  'ROTC_COS', 'Rotation factor (cos)', 'NIL', 'XY', gtrans_out_dtype ) ! [IN]
802  call fileio_write( gtrans_rotc(:,:,2), gtrans_out_basename, gtrans_out_title, & ! [IN]
803  'ROTC_SIN', 'Rotation factor (sin)', 'NIL', 'XY', gtrans_out_dtype ) ! [IN]
804 
805  call fileio_write( gtrans_rotc(:,:,1), gtrans_out_basename, gtrans_out_title, & ! [IN]
806  'ROTC_COS', 'Rotation factor (cos)', 'NIL', 'XY', gtrans_out_dtype ) ! [IN]
807 
808  do j = 1, ja
809  do i = 1, ia
810  call mprj_lonlat2xy( real_lon(i,j), real_lat(i,j), check_x_xy(i,j), check_y_xy(i,j) )
811  enddo
812  enddo
813 
814  call fileio_write( check_x_xy(:,:), gtrans_out_basename, gtrans_out_title, & ! [IN]
815  'X_XY', 'x at XY for check', 'NIL', 'XY', gtrans_out_dtype ) ! [IN]
816  call fileio_write( check_y_xy(:,:), gtrans_out_basename, gtrans_out_title, & ! [IN]
817  'Y_XY', 'y at XY for check', 'NIL', 'XY', gtrans_out_dtype ) ! [IN]
818 
819  do j = 1, ja
820  do i = 1, ia
821  call vectr_distance( const_radius, & ! [IN]
822  real_basepoint_lon, & ! [IN]
823  real_basepoint_lat, & ! [IN]
824  real_lon(i,j), & ! [IN]
825  real_lat(i,j), & ! [IN]
826  distance(i,j) ) ! [OUT]
827  enddo
828  enddo
829 
830  call fileio_write( distance(:,:), gtrans_out_basename, gtrans_out_title, & ! [IN]
831  'distance', 'distance from basepoint', 'm', 'XY', gtrans_out_dtype ) ! [IN]
832 
833  endif
834 
835  return
836  end subroutine gtrans_write
837 
838 end module scale_gridtrans
integer, public is
start point of inner domain: x, local
integer, public i_xvz
integer, public je
end point of inner domain: y, local
real(rp), dimension(:), allocatable, public grid_rcdy
reciprocal of center-dy
subroutine, public prc_mpistop
Abort MPI.
real(rp), dimension(:,:,:,:), allocatable, public gtrans_limxy
flux limiter x-y face
real(rp), public real_basepoint_lat
position of base point in real world [rad,-pi,pi]
real(rp), dimension(:,:,:,:), allocatable, public gtrans_j23g
(2,3) element of Jacobian matrix * {G}^1/2
logical, public io_l
output log or not? (this process)
Definition: scale_stdio.F90:61
real(rp), dimension(:), allocatable, public grid_rcdx
reciprocal of center-dx
real(rp), dimension(:), allocatable, public grid_cz
center coordinate [m]: z, local=global
module vector
real(rp), public const_radius
radius of the planet [m]
Definition: scale_const.F90:46
module STDIO
Definition: scale_stdio.F90:12
integer, public ke
end point of inner domain: z, local
real(rp), public gtrans_j33g
(3,3) element of Jacobian matrix * {G}^1/2
real(rp), dimension(:,:,:), allocatable, public real_fz
geopotential height [m] (cell face )
real(rp), dimension(:,:,:), allocatable, public real_cz
geopotential height [m] (cell center)
integer, public i_xy
integer, public i_fyz
real(rp), dimension(:), allocatable, public grid_rfdy
reciprocal of face-dy
real(rp), dimension(:), allocatable, public grid_rcdz
reciprocal of center-dz
real(rp), dimension(:,:,:,:), allocatable, public gtrans_limyz
flux limiter y-z face
real(rp), dimension(:,:,:,:), allocatable, public gtrans_limxz
flux limiter x-z face
module FILE I/O (netcdf)
integer, public i_xvw
real(rp), dimension(:), allocatable, public grid_fx
face coordinate [m]: x, local
module grid index
logical, public io_nml
output log or not? (for namelist, this process)
Definition: scale_stdio.F90:62
real(rp), dimension(:,:,:,:), allocatable, public gtrans_mapf
map factor
integer, public ia
of whole cells: x, local, with HALO
real(rp), dimension(:,:), allocatable, public real_latx
latitude at staggered point (uy) [rad,-pi,pi]
module GRIDTRANS
subroutine, public vectr_distance(r, lon1, lat1, lon2, lat2, dist)
Get horizontal distance on the sphere.
module GRID (real space)
integer, public ka
of whole cells: z, local, with HALO
integer, public i_uy
integer, public i_xyw
real(rp), dimension(:), allocatable, public grid_fz
face coordinate [m]: z, local=global
module COMMUNICATION
Definition: scale_comm.F90:23
integer, public js
start point of inner domain: y, local
module PROCESS
integer, public i_uyw
real(rp), dimension(:,:,:), allocatable, public gtrans_rotc
rotation coefficient
subroutine, public mprj_lonlat2xy(lon, lat, x, y)
(lon,lat) -> (x,y)
integer, public i_fxy
real(rp), dimension(:,:,:,:), allocatable, public gtrans_j13g
(1,3) element of Jacobian matrix * {G}^1/2
module CONSTANT
Definition: scale_const.F90:14
subroutine, public gtrans_setup
Setup.
subroutine, public mprj_mapfactor(lat, m1, m2)
(x,y) -> (lon,lat)
integer, public ks
start point of inner domain: z, local
real(rp), dimension(:), allocatable, public grid_cx
center coordinate [m]: x, local
module GRID (cartesian)
integer, public i_xv
module profiler
Definition: scale_prof.F90:10
integer, public ie
end point of inner domain: x, local
real(rp), dimension(:,:,:,:), allocatable, public gtrans_gsqrt
transformation metrics from Z to Xi, {G}^1/2
subroutine, public real_calc_areavol(MAPF)
Calc control area/volume.
real(rp), dimension(:,:), allocatable, public real_lon
longitude [rad,0-2pi]
integer, public i_uyz
module PRECISION
real(rp), dimension(:,:), allocatable, public topo_zsfc
absolute ground height [m]
real(rp), dimension(:), allocatable, public grid_rfdx
reciprocal of face-dx
module TOPOGRAPHY
real(rp), dimension(:), allocatable, public grid_rfdz
reciprocal of face-dz
integer, public io_fid_conf
Config file ID.
Definition: scale_stdio.F90:55
integer, public i_uvz
integer, public i_xyz
real(rp), dimension(:,:), allocatable, public real_lat
latitude [rad,-pi,pi]
integer, public io_fid_log
Log file ID.
Definition: scale_stdio.F90:56
integer, public i_fxz
integer, public i_uv
integer, parameter, public rp
real(rp), dimension(:,:), allocatable, public real_latxy
latitude at staggered point (uv) [rad,-pi,pi]
integer, public io_fid_nml
Log file ID (only for output namelist)
Definition: scale_stdio.F90:57
real(rp), dimension(:), allocatable, public grid_cy
center coordinate [m]: y, local
subroutine gtrans_rotcoef
Calculate rotation coeffient.
real(rp), public real_basepoint_lon
position of base point in real world [rad,0-2pi]
module Map projection
real(rp), dimension(:,:), allocatable, public real_laty
latitude at staggered point (xv) [rad,-pi,pi]
integer, public ja
of whole cells: y, local, with HALO
real(rp), dimension(:), allocatable, public grid_fy
face coordinate [m]: y, local