SCALE-RM
Data Types | Functions/Subroutines
scale_matrix Module Reference

module MATRIX More...

Functions/Subroutines

subroutine, public matrix_setup
 Setup. More...
 
subroutine, public matrix_finalize
 Finalize. More...
 
subroutine, public matrix_solver_tridiagonal_1d_ta ( KA, KS, KE, ifdef _OPENACC
 solve tridiagonal matrix with Thomas's algorithm More...
 
subroutine, public matrix_solver_tridiagonal_1d_cr ( KA, KS, KE, ifdef _OPENACC
 solve tridiagonal matrix with Cyclic Reduction method More...
 
subroutine, public matrix_solver_tridiagonal_1d_pcr ( KA, KS, KE, ifdef _OPENACC
 solve tridiagonal matrix with Parallel Cyclic Reduction method More...
 
subroutine matrix_solver_tridiagonal_2d_block (KA, KS, KE, ud, md, ld, iv, ov)
 
subroutine, public matrix_solver_eigenvalue_decomposition (n, a, eival, eivec, simdlen)
 

Detailed Description

module MATRIX

Description
solve matrix module
Author
Team SCALE

Function/Subroutine Documentation

◆ matrix_setup()

subroutine, public scale_matrix::matrix_setup

Setup.

Definition at line 80 of file scale_matrix.F90.

80  use scale_prc, only: &
81  prc_abort
82  implicit none
83 
84 ! namelist /PARAM_MATRIX/ &
85 
86  integer :: ierr
87  !---------------------------------------------------------------------------
88 
89  log_newline
90  log_info("MATRIX_setup",*) 'Setup'
91 
92  !--- read namelist
93 !!$ rewind(IO_FID_CONF)
94 !!$ read(IO_FID_CONF,nml=PARAM_MATRIX,iostat=ierr)
95 !!$ if( ierr < 0 ) then !--- missing
96 !!$ LOG_INFO("MATRIX_setup",*) 'Not found namelist. Default used.'
97 !!$ elseif( ierr > 0 ) then !--- fatal error
98 !!$ LOG_ERROR("MATRIX_setup",*) 'Not appropriate names in namelist PARAM_MATRIX. Check!'
99 !!$ call PRC_abort
100 !!$ endif
101 !!$ LOG_NML(PARAM_MATRIX)
102 
103 #ifdef USE_CUDALIB
104  status = cusparsecreate(handle)
105  if ( status /= cusparse_status_success ) then
106  log_error("MATRIX_setup",*) "cusparseCreate failed: ", status
107  call prc_abort
108  end if
109  bufsize = -1
110 #endif
111  return

References scale_prc::prc_abort().

Referenced by mod_rm_driver::rm_driver().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ matrix_finalize()

subroutine, public scale_matrix::matrix_finalize

Finalize.

Definition at line 117 of file scale_matrix.F90.

117 
118 #ifdef USE_CUDALIB
119  status = cusparsedestroy(handle)
120  if ( allocated(pbuffer) ) deallocate(pbuffer)
121  bufsize = -1
122 #endif
123 
124  return

Referenced by mod_rm_driver::rm_driver().

Here is the caller graph for this function:

◆ matrix_solver_tridiagonal_1d_ta()

subroutine, public scale_matrix::matrix_solver_tridiagonal_1d_ta ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
  ifdef,
  _OPENACC 
)

solve tridiagonal matrix with Thomas's algorithm

Definition at line 133 of file scale_matrix.F90.

133  work, &
134 #endif
135  ud, md, ld, &
136  iv, &
137  ov )
138  !$acc routine seq
139  implicit none
140  integer, intent(in) :: KA, KS, KE
141 
142  real(RP), intent(in) :: ud(KA) ! upper diagonal
143  real(RP), intent(in) :: md(KA) ! middle diagonal
144  real(RP), intent(in) :: ld(KA) ! lower diagonal
145  real(RP), intent(in) :: iv(KA) ! input vector
146 
147  real(RP), intent(out) :: ov(KA) ! output vector
148 
149 #ifdef _OPENACC
150  real(RP), intent(out) :: work(KS:KE,2)
151 #define c_ta(k) work(k,1)
152 #define d_ta(k) work(k,2)
153 #else
154  real(RP) :: c_ta(KS:KE)
155  real(RP) :: d_ta(KS:KE)
156 #endif
157  real(RP) :: rdenom
158 
159  integer :: k
160  !---------------------------------------------------------------------------
161 
162  ! foward reduction
163  c_ta(ks) = ud(ks) / md(ks)
164  d_ta(ks) = iv(ks) / md(ks)
165  do k = ks+1, ke-1
166  rdenom = 1.0_rp / ( md(k) - ld(k) * c_ta(k-1) )
167  c_ta(k) = ud(k) * rdenom
168  d_ta(k) = ( iv(k) - ld(k) * d_ta(k-1) ) * rdenom
169  enddo
170 
171  ! backward substitution
172  ov(ke) = ( iv(ke) - ld(ke) * d_ta(ke-1) ) / ( md(ke) - ld(ke) * c_ta(ke-1) )
173  do k = ke-1, ks, -1
174  ov(k) = d_ta(k) - c_ta(k) * ov(k+1)
175  enddo
176 
177  return

Referenced by scale_interp::cross().

Here is the caller graph for this function:

◆ matrix_solver_tridiagonal_1d_cr()

subroutine, public scale_matrix::matrix_solver_tridiagonal_1d_cr ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
  ifdef,
  _OPENACC 
)

solve tridiagonal matrix with Cyclic Reduction method

Definition at line 186 of file scale_matrix.F90.

186  work, &
187 #endif
188  ud, md, ld, &
189  iv, &
190  ov )
191  !$acc routine vector
192  implicit none
193  integer, intent(in) :: KA, KS, KE
194 
195  real(RP), intent(in) :: ud(KA) ! upper diagonal
196  real(RP), intent(in) :: md(KA) ! middle diagonal
197  real(RP), intent(in) :: ld(KA) ! lower diagonal
198  real(RP), intent(in) :: iv(KA) ! input vector
199 
200  real(RP), intent(out) :: ov(KA) ! output vector
201 
202 #ifdef _OPENACC
203  real(RP), intent(out) :: work(KE-KS+1,4)
204 #define a1_cr(k) work(k,1)
205 #define b1_cr(k) work(k,2)
206 #define c1_cr(k) work(k,3)
207 #define x1_cr(k) work(k,4)
208 #else
209  real(RP) :: a1_cr(KE-KS+1)
210  real(RP) :: b1_cr(KE-KS+1)
211  real(RP) :: c1_cr(KE-KS+1)
212  real(RP) :: x1_cr(KE-KS+1)
213 #endif
214  real(RP) :: f1, f2
215  integer :: st
216  integer :: lmax, kmax
217  integer :: k, k1, k2, l
218 
219  kmax = ke - ks + 1
220  lmax = floor( log(real(kmax,rp)) / log(2.0_rp) ) - 1
221 
222  a1_cr(:) = ld(ks:ke)
223  b1_cr(:) = md(ks:ke)
224  c1_cr(:) = ud(ks:ke)
225  x1_cr(:) = iv(ks:ke)
226 
227  st = 1
228  do l = 1, lmax
229  !$omp parallel do private(k1,k2,f1,f2)
230  !$acc loop private(k1,k2,f1,f2)
231  do k = st*2, kmax, st*2
232  k1 = k - st
233  k2 = k + st
234  f1 = a1_cr(k) / b1_cr(k1)
235  if ( k2 > kmax ) then
236  k2 = k1 ! dummy
237  f2 = 0.0_rp
238  else
239  f2 = c1_cr(k) / b1_cr(k2)
240  end if
241  a1_cr(k) = - a1_cr(k1) * f1
242  c1_cr(k) = - c1_cr(k2) * f2
243  b1_cr(k) = b1_cr(k) - c1_cr(k1) * f1 - a1_cr(k2) * f2
244  x1_cr(k) = x1_cr(k) - x1_cr(k1) * f1 - x1_cr(k2) * f2
245  end do
246  st = st * 2
247  end do
248  if ( kmax / st == 2 ) then
249  ov(ks+st*2-1) = ( a1_cr(st*2) * x1_cr(st) - b1_cr(st) * x1_cr(st*2) ) &
250  / ( a1_cr(st*2) * c1_cr(st) - b1_cr(st) * b1_cr(st*2) )
251  ov(ks+st-1) = ( x1_cr(st) - c1_cr(st) * ov(ks+st*2-1) ) / b1_cr(st)
252  else if ( kmax / st == 3 ) then
253  k = st * 2
254  k1 = st * 2 - st
255  k2 = st * 2 + st
256  f2 = c1_cr(k1) / b1_cr(k)
257  c1_cr(k1) = - c1_cr(k) * f2
258  b1_cr(k1) = b1_cr(k1) - a1_cr(k) * f2
259  x1_cr(k1) = x1_cr(k1) - x1_cr(k) * f2
260 
261  f1 = a1_cr(k2) / b1_cr(k)
262  a1_cr(k2) = - a1_cr(k) * f1
263  b1_cr(k2) = b1_cr(k2) - c1_cr(k) * f1
264  x1_cr(k2) = x1_cr(k2) - x1_cr(k) * f1
265 
266  ov(ks+k2-1) = ( a1_cr(k2) * x1_cr(k1) - b1_cr(k1) * x1_cr(k2) ) &
267  / ( a1_cr(k2) * c1_cr(k1) - b1_cr(k1) * b1_cr(k2) )
268  ov(ks+k1-1) = ( x1_cr(k1) - c1_cr(k1) * ov(ks+k2-1) ) / b1_cr(k1)
269  ov(ks+k-1) = ( x1_cr(k) - a1_cr(k) * ov(ks+k1-1) - c1_cr(k) * ov(ks+k2-1) ) / b1_cr(k)
270  end if
271 
272  do l = 1, lmax
273  st = st / 2
274  !$omp parallel do
275  !$acc loop independent
276  do k = st, kmax, st*2
277  if ( k-st < 1 ) then
278  ov(ks+k-1) = ( x1_cr(k) - c1_cr(k) * ov(ks+k+st-1) ) / b1_cr(k)
279  elseif ( k+st <= kmax ) then
280  ov(ks+k-1) = ( x1_cr(k) - a1_cr(k) * ov(ks+k-st-1) - c1_cr(k) * ov(ks+k+st-1) ) / b1_cr(k)
281  else
282  ov(ks+k-1) = ( x1_cr(k) - a1_cr(k) * ov(ks+k-st-1) ) / b1_cr(k)
283  end if
284  end do
285  end do
286 
287  return

Referenced by scale_atmos_dyn_tstep_short_fvm_hevi::atmos_dyn_tstep_short_fvm_hevi(), scale_land_dyn_bucket::land_dyn_bucket(), matrix_solver_tridiagonal_1d_pcr(), and matrix_solver_tridiagonal_2d_block().

Here is the caller graph for this function:

◆ matrix_solver_tridiagonal_1d_pcr()

subroutine, public scale_matrix::matrix_solver_tridiagonal_1d_pcr ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
  ifdef,
  _OPENACC 
)

solve tridiagonal matrix with Parallel Cyclic Reduction method

Definition at line 296 of file scale_matrix.F90.

296  work, &
297 #endif
298  ud, md, ld, &
299  iv, &
300  ov )
301  !$acc routine vector
302  implicit none
303  integer, intent(in) :: KA, KS, KE
304 
305  real(RP), intent(in) :: ud(KA) ! upper diagonal
306  real(RP), intent(in) :: md(KA) ! middle diagonal
307  real(RP), intent(in) :: ld(KA) ! lower diagonal
308  real(RP), intent(in) :: iv(KA) ! input vector
309 
310  real(RP), intent(out) :: ov(KA) ! output vector
311 
312 #ifdef _OPENACC
313  real(RP), intent(out) :: work(KE-KS+1,2,4)
314 #define a1_pcr(k,n) work(k,n,1)
315 #define b1_pcr(k,n) work(k,n,2)
316 #define c1_pcr(k,n) work(k,n,3)
317 #define x1_pcr(k,n) work(k,n,4)
318 #else
319  real(RP) :: a1_pcr(KE-KS+1,2)
320  real(RP) :: b1_pcr(KE-KS+1,2)
321  real(RP) :: c1_pcr(KE-KS+1,2)
322  real(RP) :: x1_pcr(KE-KS+1,2)
323 #endif
324  real(RP) :: f1, f2
325  integer :: st
326  integer :: lmax, kmax
327  integer :: iw1, iw2, iws
328  integer :: k, k1, k2, l
329 
330  kmax = ke - ks + 1
331  lmax = ceiling( log(real(kmax,rp)) / log(2.0_rp) )
332 
333  a1_pcr(:,1) = ld(ks:ke)
334  b1_pcr(:,1) = md(ks:ke)
335  c1_pcr(:,1) = ud(ks:ke)
336  x1_pcr(:,1) = iv(ks:ke)
337 
338  st = 1
339  iw1 = 1
340  iw2 = 2
341  do l = 1, lmax
342  !$omp parallel do private(k1,k2,f1,f2)
343  !$acc loop private(k1,k2,f1,f2)
344  do k = 1, kmax
345  k1 = k - st
346  k2 = k + st
347  if ( k1 < 1 ) then
348  k1 = k ! dummy
349  f1 = 0.0_rp
350  else
351  f1 = a1_pcr(k,iw1) / b1_pcr(k1,iw1)
352  end if
353  if ( k2 > kmax ) then
354  k2 = k ! dummy
355  f2 = 0.0_rp
356  else
357  f2 = c1_pcr(k,iw1) / b1_pcr(k2,iw1)
358  end if
359  a1_pcr(k,iw2) = - a1_pcr(k1,iw1) * f1
360  c1_pcr(k,iw2) = - c1_pcr(k2,iw1) * f2
361  b1_pcr(k,iw2) = b1_pcr(k,iw1) - c1_pcr(k1,iw1) * f1 - a1_pcr(k2,iw1) * f2
362  x1_pcr(k,iw2) = x1_pcr(k,iw1) - x1_pcr(k1,iw1) * f1 - x1_pcr(k2,iw1) * f2
363  end do
364  st = st * 2
365  iws = iw2
366  iw2 = iw1
367  iw1 = iws
368  end do
369 
370  !$omp parallel do
371  do k = 1, kmax
372  ov(ks+k-1) = x1_pcr(k,iw1) / b1_pcr(k,iw1)
373  end do
374 
375  return

References matrix_solver_tridiagonal_1d_cr(), and scale_prc::prc_abort().

Here is the call graph for this function:

◆ matrix_solver_tridiagonal_2d_block()

subroutine scale_matrix::matrix_solver_tridiagonal_2d_block ( integer, intent(in)  KA,
integer, intent(in)  KS,
integer, intent(in)  KE,
real(rp), dimension(ka,lsize), intent(in)  ud,
real(rp), dimension(ka,lsize), intent(in)  md,
real(rp), dimension(ka,lsize), intent(in)  ld,
real(rp), dimension(ka,lsize), intent(in)  iv,
real(rp), dimension(ka,lsize), intent(out)  ov 
)

Definition at line 536 of file scale_matrix.F90.

536  !$acc routine vector
537  implicit none
538  integer, intent(in) :: KA, KS, KE
539 
540  real(RP), intent(in) :: ud(KA,LSIZE) ! upper diagonal
541  real(RP), intent(in) :: md(KA,LSIZE) ! middle diagonal
542  real(RP), intent(in) :: ld(KA,LSIZE) ! lower diagonal
543  real(RP), intent(in) :: iv(KA,LSIZE) ! input vector
544 
545  real(RP), intent(out) :: ov(KA,LSIZE) ! output vector
546 
547  real(RP) :: c(LSIZE,KS:KE)
548  real(RP) :: d(LSIZE,KS:KE)
549  real(RP) :: work(LSIZE,KS:KE)
550  real(RP) :: rdenom
551 
552  integer :: k, l
553  !---------------------------------------------------------------------------
554 
555  ! foward reduction
556  do l = 1, lsize
557  c(l,ks) = ud(ks,l) / md(ks,l)
558  d(l,ks) = iv(ks,l) / md(ks,l)
559  end do
560  do k = ks+1, ke-1
561 !OCL NOFULLUNROLL_PRE_SIMD
562  do l = 1, lsize
563  rdenom = 1.0_rp / ( md(k,l) - ld(k,l) * c(l,k-1) )
564  c(l,k) = ud(k,l) * rdenom
565  d(l,k) = ( iv(k,l) - ld(k,l) * d(l,k-1) ) * rdenom
566  end do
567  end do
568 
569  ! backward substitution
570  do l = 1, lsize
571  work(l,ke) = ( iv(ke,l) - ld(ke,l) * d(l,ke-1) ) / ( md(ke,l) - ld(ke,l) * c(l,ke-1) )
572  end do
573  do k = ke-1, ks, -1
574 !OCL NOFULLUNROLL_PRE_SIMD
575  do l = 1, lsize
576  work(l,k) = d(l,k) - c(l,k) * work(l,k+1)
577  end do
578  end do
579 
580  do l = 1, lsize
581  do k = ks, ke
582  ov(k,l) = work(l,k)
583  end do
584  end do
585 
586  return

References matrix_solver_tridiagonal_1d_cr(), and scale_prc::prc_abort().

Here is the call graph for this function:

◆ matrix_solver_eigenvalue_decomposition()

subroutine, public scale_matrix::matrix_solver_eigenvalue_decomposition ( integer, intent(in)  n,
real(rp), dimension (n,n), intent(in)  a,
real(rp), dimension(n), intent(out)  eival,
real(rp), dimension(n,n), intent(out)  eivec,
integer, intent(in), optional  simdlen 
)

Definition at line 879 of file scale_matrix.F90.

879  use scale_prc, only: &
880  prc_abort
881  implicit none
882 
883  integer, intent(in) :: n ! dimension of matrix
884  real(RP), intent(in) :: a (n,n) ! input matrix
885  real(RP), intent(out) :: eival(n) ! eiven values in decending order. i.e. eival(1) is the largest
886  real(RP), intent(out) :: eivec(n,n) ! eiven vectors
887 
888  integer, intent(in), optional :: simdlen
889 
890  real(RP) :: eival_inc
891 
892  real(RP), allocatable :: b (:,:)
893  real(RP), allocatable :: w (:)
894  real(RP), allocatable :: work (:) ! working array, size is lwork = 2*n*n + 6*n + 1
895  integer, allocatable :: iwork(:) ! working array, size is liwork = 5*n + 3
896 
897  integer :: simdlen_
898  integer :: nrank_eff
899  integer :: lda
900  integer :: lwork
901  integer :: liwork
902 
903  integer :: iblk, jblk
904  integer :: imax, jmax
905  integer :: ivec, jvec
906 
907  integer :: i, j, ierr
908  !---------------------------------------------------------------------------
909 
910 #ifdef DA
911  if( present(simdlen) ) then
912  simdlen_ = simdlen
913  else
914  simdlen_ = 64
915  end if
916 
917  lda = n
918 
919  lwork = 2*n*n + 6*n + 1
920  liwork = 5*n + 3
921 
922  allocate( b(lda,n) )
923  allocate( w(lda) )
924  allocate( work(lwork) )
925  allocate( iwork(liwork) )
926 
927  do jblk = 1, n, simdlen_
928  jmax = min( n-jblk+1, simdlen_ )
929  do iblk = 1, n, simdlen_
930  imax = min( n-iblk+1, simdlen_ )
931 
932  do jvec = 1, jmax
933  j = jblk + jvec - 1
934  do ivec = 1, imax
935  i = iblk + ivec - 1
936 
937  b(i,j) = 0.5_rp * ( a(i,j) + a(j,i) )
938  end do
939  end do
940  end do
941  end do
942 
943  ! use the SSYEVD/DSYEVD subroutine in LAPACK
944  if( rp == sp ) then
945  call ssyevd("V","L",n,b,lda,w,work,lwork,iwork,liwork,ierr)
946  else
947  call dsyevd("V","L",n,b,lda,w,work,lwork,iwork,liwork,ierr)
948  end if
949 
950  if( ierr /= 0 ) then
951  log_info('MATRIX_SOLVER_eigenvalue_decomposition',*) 'LAPACK/SYEVD error code is ', ierr
952  log_info('MATRIX_SOLVER_eigenvalue_decomposition',*) 'input a'
953  do j = 1, n
954  log_info('MATRIX_SOLVER_eigenvalue_decomposition',*) j ,a(:,j)
955  enddo
956  log_info('MATRIX_SOLVER_eigenvalue_decomposition',*) 'output eival'
957  log_info('MATRIX_SOLVER_eigenvalue_decomposition',*) w(:)
958  log_info('MATRIX_SOLVER_eigenvalue_decomposition',*) 'output eivec'
959  do j = 1, n
960  log_info('MATRIX_SOLVER_eigenvalue_decomposition',*) j, b(:,j)
961  enddo
962  log_info('MATRIX_SOLVER_eigenvalue_decomposition',*) 'Try to use LAPACK/SYEV ...'
963 
964  ! Temporary treatment because of the instability of SYEVD
965  do jblk = 1, n, simdlen_
966  jmax = min( n-jblk+1, simdlen_ )
967  do iblk = 1, n, simdlen_
968  imax = min( n-iblk+1, simdlen_ )
969 
970  do jvec = 1, jmax
971  j = jblk + jvec - 1
972  do ivec = 1, imax
973  i = iblk + ivec - 1
974 
975  b(i,j) = 0.5_rp * ( a(i,j) + a(j,i) )
976  end do
977  end do
978  end do
979  end do
980 
981  ! use SSYEV/DSYEV subroutine in LAPACK
982  if( rp == sp ) then
983  call ssyev("V","L",n,b,lda,w,work,lwork,ierr)
984  else
985  call dsyev("V","L",n,b,lda,w,work,lwork,ierr)
986  end if
987 
988  if ( ierr /= 0 ) then
989  log_error('MATRIX_SOLVER_eigenvalue_decomposition',*) 'LAPACK/SYEV error code is ', ierr, '! STOP.'
990  call prc_abort
991  endif
992  endif
993 
994  if( w(1) < 0.0_rp ) then
995  eival_inc = w(n) / ( 1.e+5_rp - 1.0_rp )
996  do i = 1, n
997  w(i) = w(i) + eival_inc
998  enddo
999  else if( w(n)/1.e+5_rp > w(1) ) then
1000  eival_inc = ( w(n) - w(1)*1.e+5_rp ) / ( 1.e+5_rp - 1.0_rp )
1001  do i = 1, n
1002  w(i) = w(i) + eival_inc
1003  end do
1004  end if
1005 
1006  ! reverse order
1007  do i = 1, n
1008  eival(i) = w(i)
1009  enddo
1010  do j = 1, n
1011  do i = 1, n
1012  eivec(i,j) = b(i,j)
1013  enddo
1014  enddo
1015 
1016  nrank_eff = n
1017 
1018  if( eival(n) > 0.0_rp ) then
1019  do i = 1, n
1020  if( eival(i) < abs(eival(n))*sqrt(epsilon(eival)) ) then
1021  nrank_eff = nrank_eff - 1
1022  eival(i) = 0.0_rp
1023  eivec(:,i) = 0.0_rp
1024  end if
1025  end do
1026  else
1027  ! check zero
1028  log_error('MATRIX_SOLVER_eigenvalue_decomposition',*) 'All eigenvalues are below 0! STOP.'
1029  call prc_abort
1030  endif
1031 
1032  deallocate( b )
1033  deallocate( w )
1034  deallocate( work )
1035  deallocate( iwork )
1036 #else
1037  log_error('MATRIX_SOLVER_eigenvalue_decomposition',*) 'Binary not compiled for DA! STOP.'
1038  call prc_abort
1039 #endif
1040 
1041  return

References scale_prc::prc_abort(), and scale_precision::sp.

Referenced by scale_letkf::letkf_add_inflation_setup(), and scale_letkf::letkf_system().

Here is the call graph for this function:
Here is the caller graph for this function:
scale_precision::sp
integer, parameter, public sp
Definition: scale_precision.F90:31
scale_atmos_grid_cartesc_index::ke
integer, public ke
end point of inner domain: z, local
Definition: scale_atmos_grid_cartesC_index.F90:52
scale_prc::prc_abort
subroutine, public prc_abort
Abort Process.
Definition: scale_prc.F90:350
scale_atmos_grid_cartesc_index::imax
integer, public imax
Definition: scale_atmos_grid_cartesC_index.F90:37
scale_prc
module PROCESS
Definition: scale_prc.F90:11
scale_precision::rp
integer, parameter, public rp
Definition: scale_precision.F90:41
scale_atmos_grid_cartesc_index::kmax
integer, public kmax
Definition: scale_atmos_grid_cartesC_index.F90:36
scale_atmos_grid_cartesc_index::ks
integer, public ks
start point of inner domain: z, local
Definition: scale_atmos_grid_cartesC_index.F90:51
scale_atmos_grid_cartesc_index::jmax
integer, public jmax
Definition: scale_atmos_grid_cartesC_index.F90:38